drm/i915: Move the g45 PEG band gap HPD workaround to the HPD code
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 12 Oct 2023 12:40:33 +0000 (15:40 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 31 Oct 2023 06:31:00 +0000 (08:31 +0200)
We are asked to reprogram PEG_BAND_GAP_DATA prior to enabling
hotplug detection on the g45 HDMI/DP ports. Currently we do said
reprogamming from the DP/HDMI connector initialization functions.
That code should be mostly platform agnostic so clearly not the
best place for this. Move the workaround to the place where we
actually enable HPD detection.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231012124033.26983-1-ville.syrjala@linux.intel.com
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_hdmi.c
drivers/gpu/drm/i915/display/intel_hotplug_irq.c

index ab4608dafe5d94be959a8da1e719b54d08cd1fc4..ea97db7d9abf71e498f321196ceca5e59cd68594 100644 (file)
@@ -6231,16 +6231,6 @@ intel_dp_init_connector(struct intel_digital_port *dig_port,
                                    "HDCP init failed, skipping.\n");
        }
 
-       /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
-        * 0xd.  Failure to do so will result in spurious interrupts being
-        * generated on the port when a cable is not attached.
-        */
-       if (IS_G45(dev_priv)) {
-               u32 temp = intel_de_read(dev_priv, PEG_BAND_GAP_DATA);
-               intel_de_write(dev_priv, PEG_BAND_GAP_DATA,
-                              (temp & ~0xf) | 0xd);
-       }
-
        intel_dp->frl.is_trained = false;
        intel_dp->frl.trained_rate_gbps = 0;
 
index ac315f8e782017e04540e9e46e372066217f5e38..ab18cfc19c0a3424dd7e652f45351715f2c6d82d 100644 (file)
@@ -3030,16 +3030,6 @@ void intel_hdmi_init_connector(struct intel_digital_port *dig_port,
                                    "HDCP init failed, skipping.\n");
        }
 
-       /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
-        * 0xd.  Failure to do so will result in spurious interrupts being
-        * generated on the port when a cable is not attached.
-        */
-       if (IS_G45(dev_priv)) {
-               u32 temp = intel_de_read(dev_priv, PEG_BAND_GAP_DATA);
-               intel_de_write(dev_priv, PEG_BAND_GAP_DATA,
-                              (temp & ~0xf) | 0xd);
-       }
-
        cec_fill_conn_info_from_drm(&conn_info, connector);
 
        intel_hdmi->cec_notifier =
index f07047e9cb301d3b92fb64e50c60fd4cb0c31da8..04f62f27ad74b12666d5f167c17db40c514ec063 100644 (file)
@@ -1361,11 +1361,24 @@ static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv)
        bxt_hpd_detection_setup(dev_priv);
 }
 
+static void g45_hpd_peg_band_gap_wa(struct drm_i915_private *i915)
+{
+       /*
+        * For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
+        * 0xd.  Failure to do so will result in spurious interrupts being
+        * generated on the port when a cable is not attached.
+        */
+       intel_de_rmw(i915, PEG_BAND_GAP_DATA, 0xf, 0xd);
+}
+
 static void i915_hpd_enable_detection(struct intel_encoder *encoder)
 {
        struct drm_i915_private *i915 = to_i915(encoder->base.dev);
        u32 hotplug_en = hpd_mask_i915[encoder->hpd_pin];
 
+       if (IS_G45(i915))
+               g45_hpd_peg_band_gap_wa(i915);
+
        /* HPD sense and interrupt enable are one and the same */
        i915_hotplug_interrupt_update(i915, hotplug_en, hotplug_en);
 }
@@ -1389,6 +1402,9 @@ static void i915_hpd_irq_setup(struct drm_i915_private *dev_priv)
                hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64;
        hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50;
 
+       if (IS_G45(dev_priv))
+               g45_hpd_peg_band_gap_wa(dev_priv);
+
        /* Ignore TV since it's buggy */
        i915_hotplug_interrupt_update_locked(dev_priv,
                                             HOTPLUG_INT_EN_MASK |