On Wed, 22 Feb 2023, Ville Syrjala <ville.syrjala@xxxxxxxxxxxxxxx> wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > The idea that ctg uses different HPD live state bits is > total nonsense, at least on my machine (Dell Latitude > E5400). > > The only reason DP-B even works on my ctg is that DP-D > live state is stuck high, even though there is no physical > DP-D port. So when the detect checks DP-B live state it > sees the stuck live state of DP-D instead. If I hack > the driver to not register DP-D at all, and thus we never > enabe DP-D HPD, DP-B stops working as well. > > Just to put some conclusive evidence into this mess, > here are the actual hotplug register values for each port: > Everything disconnected: > PORT_HOTPLUG_EN (0x00061110): 0x00000000 > PORT_HOTPLUG_STAT (0x00061114): 0x00000000 > PORT_HOTPLUG_EN (0x00061110): 0x08000000 > PORT_HOTPLUG_STAT (0x00061114): 0x08000000 > PORT_HOTPLUG_EN (0x00061110): 0x10000000 > PORT_HOTPLUG_STAT (0x00061114): 0x00000000 > PORT_HOTPLUG_EN (0x00061110): 0x20000000 > PORT_HOTPLUG_STAT (0x00061114): 0x00000000 > Only port B connected: > PORT_HOTPLUG_EN (0x00061110): 0x00000000 > PORT_HOTPLUG_STAT (0x00061114): 0x00000000 > PORT_HOTPLUG_EN (0x00061110): 0x08000000 > PORT_HOTPLUG_STAT (0x00061114): 0x08000000 > PORT_HOTPLUG_EN (0x00061110): 0x10000000 > PORT_HOTPLUG_STAT (0x00061114): 0x00000000 > PORT_HOTPLUG_EN (0x00061110): 0x20000000 > PORT_HOTPLUG_STAT (0x00061114): 0x20000000 > Only port C connected: > PORT_HOTPLUG_EN (0x00061110): 0x00000000 > PORT_HOTPLUG_STAT (0x00061114): 0x00000000 > PORT_HOTPLUG_EN (0x00061110): 0x08000000 > PORT_HOTPLUG_STAT (0x00061114): 0x08000000 > PORT_HOTPLUG_EN (0x00061110): 0x10000000 > PORT_HOTPLUG_STAT (0x00061114): 0x10000000 > PORT_HOTPLUG_EN (0x00061110): 0x20000000 > PORT_HOTPLUG_STAT (0x00061114): 0x00000000 > > So the enable bit and live state bit always match 1:1. > > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> I'll take your word for it. Acked-by: Jani Nikula <jani.nikula@xxxxxxxxx> > --- > drivers/gpu/drm/i915/display/g4x_dp.c | 28 +-------------------------- > drivers/gpu/drm/i915/i915_reg.h | 13 +------------ > 2 files changed, 2 insertions(+), 39 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/g4x_dp.c b/drivers/gpu/drm/i915/display/g4x_dp.c > index a50ad0fff57c..920d570f7594 100644 > --- a/drivers/gpu/drm/i915/display/g4x_dp.c > +++ b/drivers/gpu/drm/i915/display/g4x_dp.c > @@ -1196,31 +1196,8 @@ static bool g4x_digital_port_connected(struct intel_encoder *encoder) > > return intel_de_read(dev_priv, PORT_HOTPLUG_STAT) & bit; > } > > -static bool gm45_digital_port_connected(struct intel_encoder *encoder) > -{ > - struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); > - u32 bit; > - > - switch (encoder->hpd_pin) { > - case HPD_PORT_B: > - bit = PORTB_HOTPLUG_LIVE_STATUS_GM45; > - break; > - case HPD_PORT_C: > - bit = PORTC_HOTPLUG_LIVE_STATUS_GM45; > - break; > - case HPD_PORT_D: > - bit = PORTD_HOTPLUG_LIVE_STATUS_GM45; > - break; > - default: > - MISSING_CASE(encoder->hpd_pin); > - return false; > - } > - > - return intel_de_read(dev_priv, PORT_HOTPLUG_STAT) & bit; > -} > - > static bool ilk_digital_port_connected(struct intel_encoder *encoder) > { > struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); > u32 bit = dev_priv->display.hotplug.hpd[encoder->hpd_pin]; > @@ -1383,12 +1360,9 @@ bool g4x_dp_init(struct drm_i915_private *dev_priv, > > dig_port->hpd_pulse = intel_dp_hpd_pulse; > > if (HAS_GMCH(dev_priv)) { > - if (IS_GM45(dev_priv)) > - dig_port->connected = gm45_digital_port_connected; > - else > - dig_port->connected = g4x_digital_port_connected; > + dig_port->connected = g4x_digital_port_connected; > } else { > if (port == PORT_A) > dig_port->connected = ilk_digital_port_connected; > else > diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h > index c1efa655fb68..de58695ad1c0 100644 > --- a/drivers/gpu/drm/i915/i915_reg.h > +++ b/drivers/gpu/drm/i915/i915_reg.h > @@ -2482,20 +2482,9 @@ > #define CRT_HOTPLUG_DETECT_VOLTAGE_325MV (0 << 2) > #define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2) > > #define PORT_HOTPLUG_STAT _MMIO(DISPLAY_MMIO_BASE(dev_priv) + 0x61114) > -/* > - * HDMI/DP bits are g4x+ > - * > - * WARNING: Bspec for hpd status bits on gen4 seems to be completely confused. > - * Please check the detailed lore in the commit message for for experimental > - * evidence. > - */ > -/* Bspec says GM45 should match G4X/VLV/CHV, but reality disagrees */ > -#define PORTD_HOTPLUG_LIVE_STATUS_GM45 (1 << 29) > -#define PORTC_HOTPLUG_LIVE_STATUS_GM45 (1 << 28) > -#define PORTB_HOTPLUG_LIVE_STATUS_GM45 (1 << 27) > -/* G4X/VLV/CHV DP/HDMI bits again match Bspec */ > +/* HDMI/DP bits are g4x+ */ > #define PORTD_HOTPLUG_LIVE_STATUS_G4X (1 << 27) > #define PORTC_HOTPLUG_LIVE_STATUS_G4X (1 << 28) > #define PORTB_HOTPLUG_LIVE_STATUS_G4X (1 << 29) > #define PORTD_HOTPLUG_INT_STATUS (3 << 21) -- Jani Nikula, Intel Open Source Graphics Center