aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRodrigo Vivi <rodrigo.vivi@intel.com>2018-01-29 18:22:21 -0500
committerRodrigo Vivi <rodrigo.vivi@intel.com>2018-01-30 13:24:20 -0500
commitcf53902f48c3c7a34c6955f79c8800d1746de52c (patch)
tree5155e2ca146271dc0534849cb2357acbbecfbbcf
parent7533eb4f89f70f9efb81171bcfa528f51d3d2618 (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.h6
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c35
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c4
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c2
-rw-r--r--drivers/gpu/drm/i915/intel_hotplug.c19
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,
2958void intel_hpd_init(struct drm_i915_private *dev_priv); 2958void intel_hpd_init(struct drm_i915_private *dev_priv);
2959void intel_hpd_init_work(struct drm_i915_private *dev_priv); 2959void intel_hpd_init_work(struct drm_i915_private *dev_priv);
2960void intel_hpd_cancel_work(struct drm_i915_private *dev_priv); 2960void intel_hpd_cancel_work(struct drm_i915_private *dev_priv);
2961enum port intel_hpd_pin_to_port(enum hpd_pin pin); 2961enum port intel_hpd_pin_to_port(struct drm_i915_private *dev_priv,
2962enum hpd_pin intel_hpd_pin(enum port port); 2962 enum hpd_pin pin);
2963enum hpd_pin intel_hpd_pin_default(struct drm_i915_private *dev_priv,
2964 enum port port);
2963bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin); 2965bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin);
2964void intel_hpd_enable(struct drm_i915_private *dev_priv, enum hpd_pin pin); 2966void 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 */
1577static void intel_get_hpd_pins(u32 *pin_mask, u32 *long_mask, 1577static 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 */
86enum port intel_hpd_pin_to_port(enum hpd_pin pin) 87enum 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 */
111enum hpd_pin intel_hpd_pin(enum port port) 118enum 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