drm/i915/hotplug: Reduce SHPD_FILTER to 250us
authorSuraj Kandpal <suraj.kandpal@intel.com>
Thu, 20 Jul 2023 10:46:24 +0000 (16:16 +0530)
committerUma Shankar <uma.shankar@intel.com>
Wed, 26 Jul 2023 04:58:13 +0000 (10:28 +0530)
On TGP, the RTC (always running) was reduced from 3MHz to 32KHz.
As a result of this change, when HPD active going low pulse or HPD IRQ
is presented and the refclk (19.2MHz) is not toggling already toggling,
there is a 60 to 90us synchronization delay which effectively reduces
the duration of the IRQ pulse to less than the programmed 500us filter
value and the hot plug interrupt is NOT registered.
Solution was to Reduce SHPD_FILTER to 250us for ADL and above.
This solution was derived when the below patch was floated.
[1]https://patchwork.freedesktop.org/patch/532187
and after some internal discussion Ville's suggestion made sense.

Bspec: 68970

Cc: Uma Shankar <uma.shankar@intel.com>
Cc: Ville Syrjala <ville.syrjala@linux.intel.com>
Suggested-by: Ville Syrjala <ville.syrjala@linux.intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Uma Shankar <uma.shankar@intel.com>
Signed-off-by: Uma Shankar <uma.shankar@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230720104624.3063544-1-suraj.kandpal@intel.com
drivers/gpu/drm/i915/display/intel_hotplug_irq.c
drivers/gpu/drm/i915/i915_reg.h

index f95fa793fabba4f1812d779ad510b12c4ccf91c1..95a7ea94f41743d715a64a4e119630d566c31714 100644 (file)
@@ -842,6 +842,8 @@ static void icp_hpd_irq_setup(struct drm_i915_private *dev_priv)
 
        if (INTEL_PCH_TYPE(dev_priv) <= PCH_TGP)
                intel_uncore_write(&dev_priv->uncore, SHPD_FILTER_CNT, SHPD_FILTER_CNT_500_ADJ);
+       else
+               intel_uncore_write(&dev_priv->uncore, SHPD_FILTER_CNT, SHPD_FILTER_CNT_250);
 
        ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs);
 
@@ -1049,7 +1051,7 @@ static void mtp_hpd_irq_setup(struct drm_i915_private *i915)
        enabled_irqs = intel_hpd_enabled_irqs(i915, i915->display.hotplug.pch_hpd);
        hotplug_irqs = intel_hpd_hotplug_irqs(i915, i915->display.hotplug.pch_hpd);
 
-       intel_de_write(i915, SHPD_FILTER_CNT, SHPD_FILTER_CNT_500_ADJ);
+       intel_de_write(i915, SHPD_FILTER_CNT, SHPD_FILTER_CNT_250);
 
        mtp_hpd_invert(i915);
        ibx_display_interrupt_update(i915, hotplug_irqs, enabled_irqs);
index 7a4f462e8b70bc115cbf25cb2378b31e995965ab..4f94a0367cb968fdd1b06f799b49f5d86c8be664 100644 (file)
 
 #define SHPD_FILTER_CNT                                _MMIO(0xc4038)
 #define   SHPD_FILTER_CNT_500_ADJ              0x001D9
+#define   SHPD_FILTER_CNT_250                  0x000F8
 
 #define _PCH_DPLL_A              0xc6014
 #define _PCH_DPLL_B              0xc6018