aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2016-02-10 12:59:05 -0500
committerJani Nikula <jani.nikula@intel.com>2016-02-17 04:52:54 -0500
commit8d409cb3e8a24196be7271defafd4638f3e0b514 (patch)
treed8be4b0390991171cd83b840066a54dda074be57
parent631c0e84d941a43c9477afbea6374a18b816f68e (diff)
drm/i915: Fix hpd live status bits for g4x
Looks like g4x hpd live status bits actually agree with the spec. At least they do on the machine I have, and apparently on Nick Bowler's g4x as well. So gm45 may be the only platform where they don't agree. At least that seems to be the case based on the (somewhat incomplete) logs/dumps in [1], and Daniel has also tested this on his gm45 sometime in the past. So let's change the bits to match the spec on g4x. That actually makes the g4x bits identical to vlv/chv so we can just share the code between those platforms, leaving gm45 as the special case. [1] https://bugzilla.kernel.org/show_bug.cgi?id=52361 Cc: Shashank Sharma <shashank.sharma@intel.com> Cc: Sonika Jindal <sonika.jindal@intel.com> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: Jani Nikula <jani.nikula@linux.intel.com> Cc: Nick Bowler <nbowler@draconx.ca> References: https://lists.freedesktop.org/archives/dri-devel/2016-February/100382.html Reported-by: Nick Bowler <nbowler@draconx.ca> Cc: stable@vger.kernel.org Fixes: 237ed86c693d ("drm/i915: Check live status before reading edid") Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1455127145-20087-1-git-send-email-ville.syrjala@linux.intel.com Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> (cherry picked from commit 0780cd36c7af70c55981ee624084f0f48cae9b95) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h15
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c14
2 files changed, 15 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index b9a564b76528..4897728713f6 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -3287,19 +3287,20 @@ enum skl_disp_power_wells {
3287 3287
3288#define PORT_HOTPLUG_STAT _MMIO(dev_priv->info.display_mmio_offset + 0x61114) 3288#define PORT_HOTPLUG_STAT _MMIO(dev_priv->info.display_mmio_offset + 0x61114)
3289/* 3289/*
3290 * HDMI/DP bits are gen4+ 3290 * HDMI/DP bits are g4x+
3291 * 3291 *
3292 * WARNING: Bspec for hpd status bits on gen4 seems to be completely confused. 3292 * WARNING: Bspec for hpd status bits on gen4 seems to be completely confused.
3293 * Please check the detailed lore in the commit message for for experimental 3293 * Please check the detailed lore in the commit message for for experimental
3294 * evidence. 3294 * evidence.
3295 */ 3295 */
3296#define PORTD_HOTPLUG_LIVE_STATUS_G4X (1 << 29) 3296/* Bspec says GM45 should match G4X/VLV/CHV, but reality disagrees */
3297#define PORTD_HOTPLUG_LIVE_STATUS_GM45 (1 << 29)
3298#define PORTC_HOTPLUG_LIVE_STATUS_GM45 (1 << 28)
3299#define PORTB_HOTPLUG_LIVE_STATUS_GM45 (1 << 27)
3300/* G4X/VLV/CHV DP/HDMI bits again match Bspec */
3301#define PORTD_HOTPLUG_LIVE_STATUS_G4X (1 << 27)
3297#define PORTC_HOTPLUG_LIVE_STATUS_G4X (1 << 28) 3302#define PORTC_HOTPLUG_LIVE_STATUS_G4X (1 << 28)
3298#define PORTB_HOTPLUG_LIVE_STATUS_G4X (1 << 27) 3303#define PORTB_HOTPLUG_LIVE_STATUS_G4X (1 << 29)
3299/* VLV DP/HDMI bits again match Bspec */
3300#define PORTD_HOTPLUG_LIVE_STATUS_VLV (1 << 27)
3301#define PORTC_HOTPLUG_LIVE_STATUS_VLV (1 << 28)
3302#define PORTB_HOTPLUG_LIVE_STATUS_VLV (1 << 29)
3303#define PORTD_HOTPLUG_INT_STATUS (3 << 21) 3304#define PORTD_HOTPLUG_INT_STATUS (3 << 21)
3304#define PORTD_HOTPLUG_INT_LONG_PULSE (2 << 21) 3305#define PORTD_HOTPLUG_INT_LONG_PULSE (2 << 21)
3305#define PORTD_HOTPLUG_INT_SHORT_PULSE (1 << 21) 3306#define PORTD_HOTPLUG_INT_SHORT_PULSE (1 << 21)
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 796e3d313cb9..1bbd67b046da 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -4493,20 +4493,20 @@ static bool g4x_digital_port_connected(struct drm_i915_private *dev_priv,
4493 return I915_READ(PORT_HOTPLUG_STAT) & bit; 4493 return I915_READ(PORT_HOTPLUG_STAT) & bit;
4494} 4494}
4495 4495
4496static bool vlv_digital_port_connected(struct drm_i915_private *dev_priv, 4496static bool gm45_digital_port_connected(struct drm_i915_private *dev_priv,
4497 struct intel_digital_port *port) 4497 struct intel_digital_port *port)
4498{ 4498{
4499 u32 bit; 4499 u32 bit;
4500 4500
4501 switch (port->port) { 4501 switch (port->port) {
4502 case PORT_B: 4502 case PORT_B:
4503 bit = PORTB_HOTPLUG_LIVE_STATUS_VLV; 4503 bit = PORTB_HOTPLUG_LIVE_STATUS_GM45;
4504 break; 4504 break;
4505 case PORT_C: 4505 case PORT_C:
4506 bit = PORTC_HOTPLUG_LIVE_STATUS_VLV; 4506 bit = PORTC_HOTPLUG_LIVE_STATUS_GM45;
4507 break; 4507 break;
4508 case PORT_D: 4508 case PORT_D:
4509 bit = PORTD_HOTPLUG_LIVE_STATUS_VLV; 4509 bit = PORTD_HOTPLUG_LIVE_STATUS_GM45;
4510 break; 4510 break;
4511 default: 4511 default:
4512 MISSING_CASE(port->port); 4512 MISSING_CASE(port->port);
@@ -4558,8 +4558,8 @@ bool intel_digital_port_connected(struct drm_i915_private *dev_priv,
4558 return cpt_digital_port_connected(dev_priv, port); 4558 return cpt_digital_port_connected(dev_priv, port);
4559 else if (IS_BROXTON(dev_priv)) 4559 else if (IS_BROXTON(dev_priv))
4560 return bxt_digital_port_connected(dev_priv, port); 4560 return bxt_digital_port_connected(dev_priv, port);
4561 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) 4561 else if (IS_GM45(dev_priv))
4562 return vlv_digital_port_connected(dev_priv, port); 4562 return gm45_digital_port_connected(dev_priv, port);
4563 else 4563 else
4564 return g4x_digital_port_connected(dev_priv, port); 4564 return g4x_digital_port_connected(dev_priv, port);
4565} 4565}