drm/i915/cnl: Add HPD support for Port F.
On CNP boards that are using DDI F, bit 25 (SDE_PORTE_HOTPLUG_SPT) is representing the Digital Port F hotplug line when the Digital Port F hotplug detect input is enabled. v2: Reuse all existent structure instead of adding a new HPD_PORT_F pointing to pin of port E. v3: Use IS_CNL_WITH_PORT_F so we can start upstreaming this right now. If that SKU ever get a proper name we come back and update it. v4: Rebase on top of digital connected port using encoder instead of port. v5: Moved IS_CNL_WITH_PORT_F definition to the PCI IDs patch. Cc: Lucas De Marchi <lucas.demarchi@intel.com> Cc: Manasi Navare <manasi.d.navare@intel.com> Cc: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180129232223.766-8-rodrigo.vivi@intel.com
This commit is contained in:
parent
7533eb4f89
commit
cf53902f48
@ -2958,8 +2958,10 @@ void intel_hpd_irq_handler(struct drm_i915_private *dev_priv,
|
|||||||
void intel_hpd_init(struct drm_i915_private *dev_priv);
|
void intel_hpd_init(struct drm_i915_private *dev_priv);
|
||||||
void intel_hpd_init_work(struct drm_i915_private *dev_priv);
|
void intel_hpd_init_work(struct drm_i915_private *dev_priv);
|
||||||
void intel_hpd_cancel_work(struct drm_i915_private *dev_priv);
|
void intel_hpd_cancel_work(struct drm_i915_private *dev_priv);
|
||||||
enum port intel_hpd_pin_to_port(enum hpd_pin pin);
|
enum port intel_hpd_pin_to_port(struct drm_i915_private *dev_priv,
|
||||||
enum hpd_pin intel_hpd_pin(enum port port);
|
enum hpd_pin pin);
|
||||||
|
enum hpd_pin intel_hpd_pin_default(struct drm_i915_private *dev_priv,
|
||||||
|
enum port port);
|
||||||
bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin);
|
bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin);
|
||||||
void intel_hpd_enable(struct drm_i915_private *dev_priv, enum hpd_pin pin);
|
void intel_hpd_enable(struct drm_i915_private *dev_priv, enum hpd_pin pin);
|
||||||
|
|
||||||
|
@ -1574,7 +1574,8 @@ static bool i9xx_port_hotplug_long_detect(enum port port, u32 val)
|
|||||||
*
|
*
|
||||||
* Note that the caller is expected to zero out the masks initially.
|
* Note that the caller is expected to zero out the masks initially.
|
||||||
*/
|
*/
|
||||||
static void intel_get_hpd_pins(u32 *pin_mask, u32 *long_mask,
|
static void intel_get_hpd_pins(struct drm_i915_private *dev_priv,
|
||||||
|
u32 *pin_mask, u32 *long_mask,
|
||||||
u32 hotplug_trigger, u32 dig_hotplug_reg,
|
u32 hotplug_trigger, u32 dig_hotplug_reg,
|
||||||
const u32 hpd[HPD_NUM_PINS],
|
const u32 hpd[HPD_NUM_PINS],
|
||||||
bool long_pulse_detect(enum port port, u32 val))
|
bool long_pulse_detect(enum port port, u32 val))
|
||||||
@ -1588,7 +1589,7 @@ static void intel_get_hpd_pins(u32 *pin_mask, u32 *long_mask,
|
|||||||
|
|
||||||
*pin_mask |= BIT(i);
|
*pin_mask |= BIT(i);
|
||||||
|
|
||||||
port = intel_hpd_pin_to_port(i);
|
port = intel_hpd_pin_to_port(dev_priv, i);
|
||||||
if (port == PORT_NONE)
|
if (port == PORT_NONE)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -1976,8 +1977,9 @@ static void i9xx_hpd_irq_handler(struct drm_i915_private *dev_priv,
|
|||||||
u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X;
|
u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X;
|
||||||
|
|
||||||
if (hotplug_trigger) {
|
if (hotplug_trigger) {
|
||||||
intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
|
intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
|
||||||
hotplug_trigger, hpd_status_g4x,
|
hotplug_trigger, hotplug_trigger,
|
||||||
|
hpd_status_g4x,
|
||||||
i9xx_port_hotplug_long_detect);
|
i9xx_port_hotplug_long_detect);
|
||||||
|
|
||||||
intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
|
intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
|
||||||
@ -1989,8 +1991,9 @@ static void i9xx_hpd_irq_handler(struct drm_i915_private *dev_priv,
|
|||||||
u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915;
|
u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915;
|
||||||
|
|
||||||
if (hotplug_trigger) {
|
if (hotplug_trigger) {
|
||||||
intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
|
intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
|
||||||
hotplug_trigger, hpd_status_i915,
|
hotplug_trigger, hotplug_trigger,
|
||||||
|
hpd_status_i915,
|
||||||
i9xx_port_hotplug_long_detect);
|
i9xx_port_hotplug_long_detect);
|
||||||
intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
|
intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
|
||||||
}
|
}
|
||||||
@ -2191,7 +2194,7 @@ static void ibx_hpd_irq_handler(struct drm_i915_private *dev_priv,
|
|||||||
if (!hotplug_trigger)
|
if (!hotplug_trigger)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
|
intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, hotplug_trigger,
|
||||||
dig_hotplug_reg, hpd,
|
dig_hotplug_reg, hpd,
|
||||||
pch_port_hotplug_long_detect);
|
pch_port_hotplug_long_detect);
|
||||||
|
|
||||||
@ -2333,8 +2336,8 @@ static void spt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
|
|||||||
dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
|
dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
|
||||||
I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
|
I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
|
||||||
|
|
||||||
intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
|
intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
|
||||||
dig_hotplug_reg, hpd_spt,
|
hotplug_trigger, dig_hotplug_reg, hpd_spt,
|
||||||
spt_port_hotplug_long_detect);
|
spt_port_hotplug_long_detect);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2344,8 +2347,8 @@ static void spt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
|
|||||||
dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG2);
|
dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG2);
|
||||||
I915_WRITE(PCH_PORT_HOTPLUG2, dig_hotplug_reg);
|
I915_WRITE(PCH_PORT_HOTPLUG2, dig_hotplug_reg);
|
||||||
|
|
||||||
intel_get_hpd_pins(&pin_mask, &long_mask, hotplug2_trigger,
|
intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
|
||||||
dig_hotplug_reg, hpd_spt,
|
hotplug2_trigger, dig_hotplug_reg, hpd_spt,
|
||||||
spt_port_hotplug2_long_detect);
|
spt_port_hotplug2_long_detect);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2365,7 +2368,7 @@ static void ilk_hpd_irq_handler(struct drm_i915_private *dev_priv,
|
|||||||
dig_hotplug_reg = I915_READ(DIGITAL_PORT_HOTPLUG_CNTRL);
|
dig_hotplug_reg = I915_READ(DIGITAL_PORT_HOTPLUG_CNTRL);
|
||||||
I915_WRITE(DIGITAL_PORT_HOTPLUG_CNTRL, dig_hotplug_reg);
|
I915_WRITE(DIGITAL_PORT_HOTPLUG_CNTRL, dig_hotplug_reg);
|
||||||
|
|
||||||
intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
|
intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, hotplug_trigger,
|
||||||
dig_hotplug_reg, hpd,
|
dig_hotplug_reg, hpd,
|
||||||
ilk_port_hotplug_long_detect);
|
ilk_port_hotplug_long_detect);
|
||||||
|
|
||||||
@ -2542,7 +2545,7 @@ static void bxt_hpd_irq_handler(struct drm_i915_private *dev_priv,
|
|||||||
dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
|
dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
|
||||||
I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
|
I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
|
||||||
|
|
||||||
intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
|
intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, hotplug_trigger,
|
||||||
dig_hotplug_reg, hpd,
|
dig_hotplug_reg, hpd,
|
||||||
bxt_port_hotplug_long_detect);
|
bxt_port_hotplug_long_detect);
|
||||||
|
|
||||||
|
@ -5981,8 +5981,10 @@ intel_dp_init_connector_port_info(struct intel_digital_port *intel_dig_port)
|
|||||||
{
|
{
|
||||||
struct intel_encoder *encoder = &intel_dig_port->base;
|
struct intel_encoder *encoder = &intel_dig_port->base;
|
||||||
struct intel_dp *intel_dp = &intel_dig_port->dp;
|
struct intel_dp *intel_dp = &intel_dig_port->dp;
|
||||||
|
struct intel_encoder *intel_encoder = &intel_dig_port->base;
|
||||||
|
struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
|
||||||
|
|
||||||
encoder->hpd_pin = intel_hpd_pin(encoder->port);
|
encoder->hpd_pin = intel_hpd_pin_default(dev_priv, encoder->port);
|
||||||
|
|
||||||
switch (encoder->port) {
|
switch (encoder->port) {
|
||||||
case PORT_A:
|
case PORT_A:
|
||||||
|
@ -2091,7 +2091,7 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
|
|||||||
|
|
||||||
if (WARN_ON(port == PORT_A))
|
if (WARN_ON(port == PORT_A))
|
||||||
return;
|
return;
|
||||||
intel_encoder->hpd_pin = intel_hpd_pin(port);
|
intel_encoder->hpd_pin = intel_hpd_pin_default(dev_priv, port);
|
||||||
|
|
||||||
if (HAS_DDI(dev_priv))
|
if (HAS_DDI(dev_priv))
|
||||||
intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
|
intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
|
||||||
|
@ -78,12 +78,14 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* intel_hpd_port - return port hard associated with certain pin.
|
* intel_hpd_port - return port hard associated with certain pin.
|
||||||
|
* @dev_priv: private driver data pointer
|
||||||
* @pin: the hpd pin to get associated port
|
* @pin: the hpd pin to get associated port
|
||||||
*
|
*
|
||||||
* Return port that is associatade with @pin and PORT_NONE if no port is
|
* Return port that is associatade with @pin and PORT_NONE if no port is
|
||||||
* hard associated with that @pin.
|
* hard associated with that @pin.
|
||||||
*/
|
*/
|
||||||
enum port intel_hpd_pin_to_port(enum hpd_pin pin)
|
enum port intel_hpd_pin_to_port(struct drm_i915_private *dev_priv,
|
||||||
|
enum hpd_pin pin)
|
||||||
{
|
{
|
||||||
switch (pin) {
|
switch (pin) {
|
||||||
case HPD_PORT_A:
|
case HPD_PORT_A:
|
||||||
@ -95,6 +97,8 @@ enum port intel_hpd_pin_to_port(enum hpd_pin pin)
|
|||||||
case HPD_PORT_D:
|
case HPD_PORT_D:
|
||||||
return PORT_D;
|
return PORT_D;
|
||||||
case HPD_PORT_E:
|
case HPD_PORT_E:
|
||||||
|
if (IS_CNL_WITH_PORT_F(dev_priv))
|
||||||
|
return PORT_F;
|
||||||
return PORT_E;
|
return PORT_E;
|
||||||
default:
|
default:
|
||||||
return PORT_NONE; /* no port for this pin */
|
return PORT_NONE; /* no port for this pin */
|
||||||
@ -102,13 +106,17 @@ enum port intel_hpd_pin_to_port(enum hpd_pin pin)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* intel_hpd_pin - return pin hard associated with certain port.
|
* intel_hpd_pin_default - return default pin associated with certain port.
|
||||||
|
* @dev_priv: private driver data pointer
|
||||||
* @port: the hpd port to get associated pin
|
* @port: the hpd port to get associated pin
|
||||||
*
|
*
|
||||||
|
* It is only valid and used by digital port encoder.
|
||||||
|
*
|
||||||
* Return pin that is associatade with @port and HDP_NONE if no pin is
|
* Return pin that is associatade with @port and HDP_NONE if no pin is
|
||||||
* hard associated with that @port.
|
* hard associated with that @port.
|
||||||
*/
|
*/
|
||||||
enum hpd_pin intel_hpd_pin(enum port port)
|
enum hpd_pin intel_hpd_pin_default(struct drm_i915_private *dev_priv,
|
||||||
|
enum port port)
|
||||||
{
|
{
|
||||||
switch (port) {
|
switch (port) {
|
||||||
case PORT_A:
|
case PORT_A:
|
||||||
@ -121,6 +129,9 @@ enum hpd_pin intel_hpd_pin(enum port port)
|
|||||||
return HPD_PORT_D;
|
return HPD_PORT_D;
|
||||||
case PORT_E:
|
case PORT_E:
|
||||||
return HPD_PORT_E;
|
return HPD_PORT_E;
|
||||||
|
case PORT_F:
|
||||||
|
if (IS_CNL_WITH_PORT_F(dev_priv))
|
||||||
|
return HPD_PORT_E;
|
||||||
default:
|
default:
|
||||||
MISSING_CASE(port);
|
MISSING_CASE(port);
|
||||||
return HPD_NONE;
|
return HPD_NONE;
|
||||||
@ -417,7 +428,7 @@ void intel_hpd_irq_handler(struct drm_i915_private *dev_priv,
|
|||||||
if (!(BIT(i) & pin_mask))
|
if (!(BIT(i) & pin_mask))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
port = intel_hpd_pin_to_port(i);
|
port = intel_hpd_pin_to_port(dev_priv, i);
|
||||||
is_dig_port = port != PORT_NONE &&
|
is_dig_port = port != PORT_NONE &&
|
||||||
dev_priv->hotplug.irq_port[port];
|
dev_priv->hotplug.irq_port[port];
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user