This workaround applies to all steppings of Xe_LPM+. Implement the KMD
part.

v2:
    - Put the definition of VDBOX_CGCTL3F1C() in the correct sort order.
      (Matt)

Reviewed-by: Matt Roper <[email protected]>
Signed-off-by: Gustavo Sousa <[email protected]>
---
 drivers/gpu/drm/i915/gt/intel_engine_regs.h |  2 ++
 drivers/gpu/drm/i915/gt/intel_workarounds.c | 14 ++++++++++++++
 2 files changed, 16 insertions(+)

diff --git a/drivers/gpu/drm/i915/gt/intel_engine_regs.h 
b/drivers/gpu/drm/i915/gt/intel_engine_regs.h
index c0c8c12edea1..a8eac59e3779 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_regs.h
+++ b/drivers/gpu/drm/i915/gt/intel_engine_regs.h
@@ -263,5 +263,7 @@
 #define VDBOX_CGCTL3F18(base)                  _MMIO((base) + 0x3f18)
 #define   ALNUNIT_CLKGATE_DIS                  REG_BIT(13)
 
+#define VDBOX_CGCTL3F1C(base)                  _MMIO((base) + 0x3f1c)
+#define   MFXPIPE_CLKGATE_DIS                  REG_BIT(3)
 
 #endif /* __INTEL_ENGINE_REGS__ */
diff --git a/drivers/gpu/drm/i915/gt/intel_workarounds.c 
b/drivers/gpu/drm/i915/gt/intel_workarounds.c
index 12859b8d2092..63205edfea50 100644
--- a/drivers/gpu/drm/i915/gt/intel_workarounds.c
+++ b/drivers/gpu/drm/i915/gt/intel_workarounds.c
@@ -1662,9 +1662,23 @@ xelpg_gt_workarounds_init(struct intel_gt *gt, struct 
i915_wa_list *wal)
        debug_dump_steering(gt);
 }
 
+static void
+wa_16021867713(struct intel_gt *gt, struct i915_wa_list *wal)
+{
+       struct intel_engine_cs *engine;
+       int id;
+
+       for_each_engine(engine, gt, id)
+               if (engine->class == VIDEO_DECODE_CLASS)
+                       wa_write_or(wal, VDBOX_CGCTL3F1C(engine->mmio_base),
+                                   MFXPIPE_CLKGATE_DIS);
+}
+
 static void
 xelpmp_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
 {
+       wa_16021867713(gt, wal);
+
        /*
         * Wa_14018778641
         * Wa_18018781329
-- 
2.42.0

Reply via email to