]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/i915: Enable DDI A/B AUX interrupts on LNL+
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 19 Nov 2025 18:53:09 +0000 (20:53 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 27 Nov 2025 22:47:51 +0000 (00:47 +0200)
Apparently the DDI A/B AUX interrupts move onto the PICA side
on LNL. Unmask them properly so that we actually get the
interrupts. The interrupt handler was already trying to handle
them despite the interrupts remaining masked.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patch.msgid.link/20251119185310.10428-2-ville.syrjala@linux.intel.com
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/display/intel_display_irq.c
drivers/gpu/drm/i915/display/intel_display_irq.h
drivers/gpu/drm/i915/display/intel_hotplug_irq.c

index d2933ac3acb4827c4e3271ce52279cc406d781c0..9adeebb376b189ef72a97e0206e0c24b0f4e7117 100644 (file)
@@ -2410,10 +2410,20 @@ void gen8_de_irq_postinstall(struct intel_display *display)
        }
 }
 
+u32 xelpdp_pica_aux_mask(struct intel_display *display)
+{
+       u32 mask = XELPDP_AUX_TC_MASK;
+
+       if (DISPLAY_VER(display) >= 20)
+               mask |= XE2LPD_AUX_DDI_MASK;
+
+       return mask;
+}
+
 static void mtp_irq_postinstall(struct intel_display *display)
 {
        u32 sde_mask = SDE_GMBUS_ICP | SDE_PICAINTERRUPT;
-       u32 de_hpd_mask = XELPDP_AUX_TC_MASK;
+       u32 de_hpd_mask = xelpdp_pica_aux_mask(display);
        u32 de_hpd_enables = de_hpd_mask | XELPDP_DP_ALT_HOTPLUG_MASK |
                             XELPDP_TBT_HOTPLUG_MASK;
 
index 84acd31948cfc1e5366d507aa43b4681bbc2c129..b25d180254d753a7528cd423a02527af6e031532 100644 (file)
@@ -16,6 +16,8 @@ struct drm_printer;
 struct intel_display;
 struct intel_display_irq_snapshot;
 
+u32 xelpdp_pica_aux_mask(struct intel_display *display);
+
 void valleyview_enable_display_irqs(struct intel_display *display);
 void valleyview_disable_display_irqs(struct intel_display *display);
 
index 46c47b3d6f428ad9aca433e82ff3fc8551fd220b..82c39e4ffa371d1fc7c2aba48d6e9a9065b25aa0 100644 (file)
@@ -519,12 +519,9 @@ void xelpdp_pica_irq_handler(struct intel_display *display, u32 iir)
 {
        enum hpd_pin pin;
        u32 hotplug_trigger = iir & (XELPDP_DP_ALT_HOTPLUG_MASK | XELPDP_TBT_HOTPLUG_MASK);
-       u32 trigger_aux = iir & XELPDP_AUX_TC_MASK;
+       u32 trigger_aux = iir & xelpdp_pica_aux_mask(display);
        u32 pin_mask = 0, long_mask = 0;
 
-       if (DISPLAY_VER(display) >= 20)
-               trigger_aux |= iir & XE2LPD_AUX_DDI_MASK;
-
        for (pin = HPD_PORT_TC1; pin <= HPD_PORT_TC4; pin++) {
                u32 val;