Commit cf53902f authored by Rodrigo Vivi's avatar Rodrigo Vivi

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: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180129232223.766-8-rodrigo.vivi@intel.com
parent 7533eb4f
...@@ -2958,8 +2958,10 @@ void intel_hpd_irq_handler(struct drm_i915_private *dev_priv, ...@@ -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,10 +1574,11 @@ static bool i9xx_port_hotplug_long_detect(enum port port, u32 val) ...@@ -1574,10 +1574,11 @@ 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 hotplug_trigger, u32 dig_hotplug_reg, u32 *pin_mask, u32 *long_mask,
const u32 hpd[HPD_NUM_PINS], u32 hotplug_trigger, u32 dig_hotplug_reg,
bool long_pulse_detect(enum port port, u32 val)) const u32 hpd[HPD_NUM_PINS],
bool long_pulse_detect(enum port port, u32 val))
{ {
enum port port; enum port port;
int i; int i;
...@@ -1588,7 +1589,7 @@ static void intel_get_hpd_pins(u32 *pin_mask, u32 *long_mask, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment