diff options
author | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2018-01-29 18:22:21 -0500 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2018-01-30 13:24:20 -0500 |
commit | cf53902f48c3c7a34c6955f79c8800d1746de52c (patch) | |
tree | 5155e2ca146271dc0534849cb2357acbbecfbbcf | |
parent | 7533eb4f89f70f9efb81171bcfa528f51d3d2618 (diff) |
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
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 35 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_hotplug.c | 19 |
5 files changed, 42 insertions, 24 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index d29f95d8999a..2d855faac708 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -2958,8 +2958,10 @@ void intel_hpd_irq_handler(struct drm_i915_private *dev_priv, | |||
2958 | void intel_hpd_init(struct drm_i915_private *dev_priv); | 2958 | void intel_hpd_init(struct drm_i915_private *dev_priv); |
2959 | void intel_hpd_init_work(struct drm_i915_private *dev_priv); | 2959 | void intel_hpd_init_work(struct drm_i915_private *dev_priv); |
2960 | void intel_hpd_cancel_work(struct drm_i915_private *dev_priv); | 2960 | void intel_hpd_cancel_work(struct drm_i915_private *dev_priv); |
2961 | enum port intel_hpd_pin_to_port(enum hpd_pin pin); | 2961 | enum port intel_hpd_pin_to_port(struct drm_i915_private *dev_priv, |
2962 | enum hpd_pin intel_hpd_pin(enum port port); | 2962 | enum hpd_pin pin); |
2963 | enum hpd_pin intel_hpd_pin_default(struct drm_i915_private *dev_priv, | ||
2964 | enum port port); | ||
2963 | bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin); | 2965 | bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin); |
2964 | void intel_hpd_enable(struct drm_i915_private *dev_priv, enum hpd_pin pin); | 2966 | void intel_hpd_enable(struct drm_i915_private *dev_priv, enum hpd_pin pin); |
2965 | 2967 | ||
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 79fadb50ab69..252feff2892d 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -1574,10 +1574,11 @@ static bool i9xx_port_hotplug_long_detect(enum port port, u32 val) | |||
1574 | * | 1574 | * |
1575 | * Note that the caller is expected to zero out the masks initially. | 1575 | * Note that the caller is expected to zero out the masks initially. |
1576 | */ | 1576 | */ |
1577 | static void intel_get_hpd_pins(u32 *pin_mask, u32 *long_mask, | 1577 | static void intel_get_hpd_pins(struct drm_i915_private *dev_priv, |
1578 | u32 hotplug_trigger, u32 dig_hotplug_reg, | 1578 | u32 *pin_mask, u32 *long_mask, |
1579 | const u32 hpd[HPD_NUM_PINS], | 1579 | u32 hotplug_trigger, u32 dig_hotplug_reg, |
1580 | bool long_pulse_detect(enum port port, u32 val)) | 1580 | const u32 hpd[HPD_NUM_PINS], |
1581 | bool long_pulse_detect(enum port port, u32 val)) | ||
1581 | { | 1582 | { |
1582 | enum port port; | 1583 | enum port port; |
1583 | int i; | 1584 | int i; |
@@ -1588,7 +1589,7 @@ static void intel_get_hpd_pins(u32 *pin_mask, u32 *long_mask, | |||
1588 | 1589 | ||
1589 | *pin_mask |= BIT(i); | 1590 | *pin_mask |= BIT(i); |
1590 | 1591 | ||
1591 | port = intel_hpd_pin_to_port(i); | 1592 | port = intel_hpd_pin_to_port(dev_priv, i); |
1592 | if (port == PORT_NONE) | 1593 | if (port == PORT_NONE) |
1593 | continue; | 1594 | continue; |
1594 | 1595 | ||
@@ -1976,8 +1977,9 @@ static void i9xx_hpd_irq_handler(struct drm_i915_private *dev_priv, | |||
1976 | u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X; | 1977 | u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X; |
1977 | 1978 | ||
1978 | if (hotplug_trigger) { | 1979 | if (hotplug_trigger) { |
1979 | intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger, | 1980 | intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, |
1980 | hotplug_trigger, hpd_status_g4x, | 1981 | hotplug_trigger, hotplug_trigger, |
1982 | hpd_status_g4x, | ||
1981 | i9xx_port_hotplug_long_detect); | 1983 | i9xx_port_hotplug_long_detect); |
1982 | 1984 | ||
1983 | intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); | 1985 | 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 | u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915; | 1991 | u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915; |
1990 | 1992 | ||
1991 | if (hotplug_trigger) { | 1993 | if (hotplug_trigger) { |
1992 | intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger, | 1994 | intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, |
1993 | hotplug_trigger, hpd_status_i915, | 1995 | hotplug_trigger, hotplug_trigger, |
1996 | hpd_status_i915, | ||
1994 | i9xx_port_hotplug_long_detect); | 1997 | i9xx_port_hotplug_long_detect); |
1995 | intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); | 1998 | intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); |
1996 | } | 1999 | } |
@@ -2191,7 +2194,7 @@ static void ibx_hpd_irq_handler(struct drm_i915_private *dev_priv, | |||
2191 | if (!hotplug_trigger) | 2194 | if (!hotplug_trigger) |
2192 | return; | 2195 | return; |
2193 | 2196 | ||
2194 | intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger, | 2197 | intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, hotplug_trigger, |
2195 | dig_hotplug_reg, hpd, | 2198 | dig_hotplug_reg, hpd, |
2196 | pch_port_hotplug_long_detect); | 2199 | pch_port_hotplug_long_detect); |
2197 | 2200 | ||
@@ -2333,8 +2336,8 @@ static void spt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir) | |||
2333 | dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG); | 2336 | dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG); |
2334 | I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg); | 2337 | I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg); |
2335 | 2338 | ||
2336 | intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger, | 2339 | intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, |
2337 | dig_hotplug_reg, hpd_spt, | 2340 | hotplug_trigger, dig_hotplug_reg, hpd_spt, |
2338 | spt_port_hotplug_long_detect); | 2341 | spt_port_hotplug_long_detect); |
2339 | } | 2342 | } |
2340 | 2343 | ||
@@ -2344,8 +2347,8 @@ static void spt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir) | |||
2344 | dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG2); | 2347 | dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG2); |
2345 | I915_WRITE(PCH_PORT_HOTPLUG2, dig_hotplug_reg); | 2348 | I915_WRITE(PCH_PORT_HOTPLUG2, dig_hotplug_reg); |
2346 | 2349 | ||
2347 | intel_get_hpd_pins(&pin_mask, &long_mask, hotplug2_trigger, | 2350 | intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, |
2348 | dig_hotplug_reg, hpd_spt, | 2351 | hotplug2_trigger, dig_hotplug_reg, hpd_spt, |
2349 | spt_port_hotplug2_long_detect); | 2352 | spt_port_hotplug2_long_detect); |
2350 | } | 2353 | } |
2351 | 2354 | ||
@@ -2365,7 +2368,7 @@ static void ilk_hpd_irq_handler(struct drm_i915_private *dev_priv, | |||
2365 | dig_hotplug_reg = I915_READ(DIGITAL_PORT_HOTPLUG_CNTRL); | 2368 | dig_hotplug_reg = I915_READ(DIGITAL_PORT_HOTPLUG_CNTRL); |
2366 | I915_WRITE(DIGITAL_PORT_HOTPLUG_CNTRL, dig_hotplug_reg); | 2369 | I915_WRITE(DIGITAL_PORT_HOTPLUG_CNTRL, dig_hotplug_reg); |
2367 | 2370 | ||
2368 | intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger, | 2371 | intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, hotplug_trigger, |
2369 | dig_hotplug_reg, hpd, | 2372 | dig_hotplug_reg, hpd, |
2370 | ilk_port_hotplug_long_detect); | 2373 | ilk_port_hotplug_long_detect); |
2371 | 2374 | ||
@@ -2542,7 +2545,7 @@ static void bxt_hpd_irq_handler(struct drm_i915_private *dev_priv, | |||
2542 | dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG); | 2545 | dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG); |
2543 | I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg); | 2546 | I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg); |
2544 | 2547 | ||
2545 | intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger, | 2548 | intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, hotplug_trigger, |
2546 | dig_hotplug_reg, hpd, | 2549 | dig_hotplug_reg, hpd, |
2547 | bxt_port_hotplug_long_detect); | 2550 | bxt_port_hotplug_long_detect); |
2548 | 2551 | ||
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index f00a00a703e5..1b37a40d2686 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -5981,8 +5981,10 @@ intel_dp_init_connector_port_info(struct intel_digital_port *intel_dig_port) | |||
5981 | { | 5981 | { |
5982 | struct intel_encoder *encoder = &intel_dig_port->base; | 5982 | struct intel_encoder *encoder = &intel_dig_port->base; |
5983 | struct intel_dp *intel_dp = &intel_dig_port->dp; | 5983 | struct intel_dp *intel_dp = &intel_dig_port->dp; |
5984 | struct intel_encoder *intel_encoder = &intel_dig_port->base; | ||
5985 | struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev); | ||
5984 | 5986 | ||
5985 | encoder->hpd_pin = intel_hpd_pin(encoder->port); | 5987 | encoder->hpd_pin = intel_hpd_pin_default(dev_priv, encoder->port); |
5986 | 5988 | ||
5987 | switch (encoder->port) { | 5989 | switch (encoder->port) { |
5988 | case PORT_A: | 5990 | case PORT_A: |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index a8f05f7d9226..2df18a85c3b4 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
@@ -2091,7 +2091,7 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port, | |||
2091 | 2091 | ||
2092 | if (WARN_ON(port == PORT_A)) | 2092 | if (WARN_ON(port == PORT_A)) |
2093 | return; | 2093 | return; |
2094 | intel_encoder->hpd_pin = intel_hpd_pin(port); | 2094 | intel_encoder->hpd_pin = intel_hpd_pin_default(dev_priv, port); |
2095 | 2095 | ||
2096 | if (HAS_DDI(dev_priv)) | 2096 | if (HAS_DDI(dev_priv)) |
2097 | intel_connector->get_hw_state = intel_ddi_connector_get_hw_state; | 2097 | intel_connector->get_hw_state = intel_ddi_connector_get_hw_state; |
diff --git a/drivers/gpu/drm/i915/intel_hotplug.c b/drivers/gpu/drm/i915/intel_hotplug.c index 875d5d218d5c..fe28c1ea84a5 100644 --- a/drivers/gpu/drm/i915/intel_hotplug.c +++ b/drivers/gpu/drm/i915/intel_hotplug.c | |||
@@ -78,12 +78,14 @@ | |||
78 | 78 | ||
79 | /** | 79 | /** |
80 | * intel_hpd_port - return port hard associated with certain pin. | 80 | * intel_hpd_port - return port hard associated with certain pin. |
81 | * @dev_priv: private driver data pointer | ||
81 | * @pin: the hpd pin to get associated port | 82 | * @pin: the hpd pin to get associated port |
82 | * | 83 | * |
83 | * Return port that is associatade with @pin and PORT_NONE if no port is | 84 | * Return port that is associatade with @pin and PORT_NONE if no port is |
84 | * hard associated with that @pin. | 85 | * hard associated with that @pin. |
85 | */ | 86 | */ |
86 | enum port intel_hpd_pin_to_port(enum hpd_pin pin) | 87 | enum port intel_hpd_pin_to_port(struct drm_i915_private *dev_priv, |
88 | enum hpd_pin pin) | ||
87 | { | 89 | { |
88 | switch (pin) { | 90 | switch (pin) { |
89 | case HPD_PORT_A: | 91 | case HPD_PORT_A: |
@@ -95,6 +97,8 @@ enum port intel_hpd_pin_to_port(enum hpd_pin pin) | |||
95 | case HPD_PORT_D: | 97 | case HPD_PORT_D: |
96 | return PORT_D; | 98 | return PORT_D; |
97 | case HPD_PORT_E: | 99 | case HPD_PORT_E: |
100 | if (IS_CNL_WITH_PORT_F(dev_priv)) | ||
101 | return PORT_F; | ||
98 | return PORT_E; | 102 | return PORT_E; |
99 | default: | 103 | default: |
100 | return PORT_NONE; /* no port for this pin */ | 104 | return PORT_NONE; /* no port for this pin */ |
@@ -102,13 +106,17 @@ enum port intel_hpd_pin_to_port(enum hpd_pin pin) | |||
102 | } | 106 | } |
103 | 107 | ||
104 | /** | 108 | /** |
105 | * intel_hpd_pin - return pin hard associated with certain port. | 109 | * intel_hpd_pin_default - return default pin associated with certain port. |
110 | * @dev_priv: private driver data pointer | ||
106 | * @port: the hpd port to get associated pin | 111 | * @port: the hpd port to get associated pin |
107 | * | 112 | * |
113 | * It is only valid and used by digital port encoder. | ||
114 | * | ||
108 | * Return pin that is associatade with @port and HDP_NONE if no pin is | 115 | * Return pin that is associatade with @port and HDP_NONE if no pin is |
109 | * hard associated with that @port. | 116 | * hard associated with that @port. |
110 | */ | 117 | */ |
111 | enum hpd_pin intel_hpd_pin(enum port port) | 118 | enum hpd_pin intel_hpd_pin_default(struct drm_i915_private *dev_priv, |
119 | enum port port) | ||
112 | { | 120 | { |
113 | switch (port) { | 121 | switch (port) { |
114 | case PORT_A: | 122 | case PORT_A: |
@@ -121,6 +129,9 @@ enum hpd_pin intel_hpd_pin(enum port port) | |||
121 | return HPD_PORT_D; | 129 | return HPD_PORT_D; |
122 | case PORT_E: | 130 | case PORT_E: |
123 | return HPD_PORT_E; | 131 | return HPD_PORT_E; |
132 | case PORT_F: | ||
133 | if (IS_CNL_WITH_PORT_F(dev_priv)) | ||
134 | return HPD_PORT_E; | ||
124 | default: | 135 | default: |
125 | MISSING_CASE(port); | 136 | MISSING_CASE(port); |
126 | return HPD_NONE; | 137 | return HPD_NONE; |
@@ -417,7 +428,7 @@ void intel_hpd_irq_handler(struct drm_i915_private *dev_priv, | |||
417 | if (!(BIT(i) & pin_mask)) | 428 | if (!(BIT(i) & pin_mask)) |
418 | continue; | 429 | continue; |
419 | 430 | ||
420 | port = intel_hpd_pin_to_port(i); | 431 | port = intel_hpd_pin_to_port(dev_priv, i); |
421 | is_dig_port = port != PORT_NONE && | 432 | is_dig_port = port != PORT_NONE && |
422 | dev_priv->hotplug.irq_port[port]; | 433 | dev_priv->hotplug.irq_port[port]; |
423 | 434 | ||