]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/i915/dmc: Fixup TGL/ADL-S HRR event handler type
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 22 Oct 2025 10:07:17 +0000 (13:07 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 22 Oct 2025 18:39:42 +0000 (21:39 +0300)
TGL/ADL-S DMC firmware incorrectly uses the undelayed vblank
trigger for the HRR event, when it should be using the delayed
vblank trigger.

Fixed DMC firmware was never relaesed and isntead the Windows
driver just fixes this up by hand. Follow suit.

Not that we actually enable the HRR event currently. But let's
fix up the event ID, just in case someone ever needs to enable
this.

Tested-by: Petr Vorel <pvorel@suse.cz>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20251022100718.24803-3-ville.syrjala@linux.intel.com
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Reviewed-by: Imre Deak <imre.deak@intel.com>
Tested-by: Imre Deak <imre.deak@intel.com>
drivers/gpu/drm/i915/display/intel_dmc.c

index 5ba531e3bc364d81df2c7bdfb44a940adc40293d..02ef0a252220892e88c314c59e3a6f521b16274d 100644 (file)
@@ -577,6 +577,21 @@ static bool fixup_dmc_evt(struct intel_display *display,
                return true;
        }
 
+       /*
+        * TGL/ADL-S DMC firmware incorrectly uses the undelayed vblank
+        * event for the HRR handler, when it should be using the delayed
+        * vblank event instead. Fixed firmware was never released
+        * so the Windows driver just hacks around it by overriding
+        * the event ID. Do the same.
+        */
+       if ((display->platform.tigerlake || display->platform.alderlake_s) &&
+           is_event_handler(display, dmc_id, MAINDMC_EVENT_VBLANK_A, reg_ctl, *data_ctl)) {
+               *data_ctl &= ~DMC_EVT_CTL_EVENT_ID_MASK;
+               *data_ctl |=  REG_FIELD_PREP(DMC_EVT_CTL_EVENT_ID_MASK,
+                                            MAINDMC_EVENT_VBLANK_DELAYED_A);
+               return true;
+       }
+
        return false;
 }
 
@@ -598,7 +613,7 @@ static bool disable_dmc_evt(struct intel_display *display,
 
        /* also disable the HRR event on the main DMC on TGL/ADLS */
        if ((display->platform.tigerlake || display->platform.alderlake_s) &&
-           is_event_handler(display, dmc_id, MAINDMC_EVENT_VBLANK_A, reg, data))
+           is_event_handler(display, dmc_id, MAINDMC_EVENT_VBLANK_DELAYED_A, reg, data))
                return true;
 
        return false;