]> Git Repo - linux.git/blobdiff - drivers/gpu/drm/i915/gt/intel_workarounds.c
Merge tag 'drm-next-2023-02-23' of git://anongit.freedesktop.org/drm/drm
[linux.git] / drivers / gpu / drm / i915 / gt / intel_workarounds.c
index a0740308555d85f12af2d16f3766409f9564ecc4..485c5cc5d0f960eb8db16e18a88b58ccc2f6986c 100644 (file)
@@ -30,6 +30,9 @@
  *   creation to have a "primed golden context", i.e. a context image that
  *   already contains the changes needed to all the registers.
  *
+ *   Context workarounds should be implemented in the \*_ctx_workarounds_init()
+ *   variants respective to the targeted platforms.
+ *
  * - Engine workarounds: the list of these WAs is applied whenever the specific
  *   engine is reset. It's also possible that a set of engine classes share a
  *   common power domain and they are reset together. This happens on some
  *   saves/restores their values before/after the reset takes place. See
  *   ``drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c`` for reference.
  *
+ *   Workarounds for registers specific to RCS and CCS should be implemented in
+ *   rcs_engine_wa_init() and ccs_engine_wa_init(), respectively; those for
+ *   registers belonging to BCS, VCS or VECS should be implemented in
+ *   xcs_engine_wa_init(). Workarounds for registers not belonging to a specific
+ *   engine's MMIO range but that are part of of the common RCS/CCS reset domain
+ *   should be implemented in general_render_compute_wa_init().
+ *
  * - GT workarounds: the list of these WAs is applied whenever these registers
  *   revert to their default values: on GPU reset, suspend/resume [1]_, etc.
  *
+ *   GT workarounds should be implemented in the \*_gt_workarounds_init()
+ *   variants respective to the targeted platforms.
+ *
  * - Register whitelist: some workarounds need to be implemented in userspace,
  *   but need to touch privileged registers. The whitelist in the kernel
  *   instructs the hardware to allow the access to happen. From the kernel side,
  *   this is just a special case of a MMIO workaround (as we write the list of
  *   these to/be-whitelisted registers to some special HW registers).
  *
+ *   Register whitelisting should be done in the \*_whitelist_build() variants
+ *   respective to the targeted platforms.
+ *
  * - Workaround batchbuffers: buffers that get executed automatically by the
  *   hardware on every HW context restore. These buffers are created and
  *   programmed in the default context so the hardware always go through those
@@ -224,6 +240,12 @@ wa_write(struct i915_wa_list *wal, i915_reg_t reg, u32 set)
        wa_write_clr_set(wal, reg, ~0, set);
 }
 
+static void
+wa_mcr_write(struct i915_wa_list *wal, i915_mcr_reg_t reg, u32 set)
+{
+       wa_mcr_write_clr_set(wal, reg, ~0, set);
+}
+
 static void
 wa_write_or(struct i915_wa_list *wal, i915_reg_t reg, u32 set)
 {
@@ -777,7 +799,7 @@ static void dg2_ctx_workarounds_init(struct intel_engine_cs *engine,
        /* Wa_18018764978:dg2 */
        if (IS_DG2_GRAPHICS_STEP(engine->i915, G10, STEP_C0, STEP_FOREVER) ||
            IS_DG2_G11(engine->i915) || IS_DG2_G12(engine->i915))
-               wa_masked_en(wal, PSS_MODE2, SCOREBOARD_STALL_FLUSH_CONTROL);
+               wa_mcr_masked_en(wal, XEHP_PSS_MODE2, SCOREBOARD_STALL_FLUSH_CONTROL);
 
        /* Wa_15010599737:dg2 */
        wa_mcr_masked_en(wal, CHICKEN_RASTER_1, DIS_SF_ROUND_NEAREST_EVEN);
@@ -786,6 +808,32 @@ static void dg2_ctx_workarounds_init(struct intel_engine_cs *engine,
        wa_masked_en(wal, CACHE_MODE_1, MSAA_OPTIMIZATION_REDUC_DISABLE);
 }
 
+static void mtl_ctx_workarounds_init(struct intel_engine_cs *engine,
+                                    struct i915_wa_list *wal)
+{
+       struct drm_i915_private *i915 = engine->i915;
+
+       if (IS_MTL_GRAPHICS_STEP(i915, M, STEP_A0, STEP_B0) ||
+           IS_MTL_GRAPHICS_STEP(i915, P, STEP_A0, STEP_B0)) {
+               /* Wa_14014947963 */
+               wa_masked_field_set(wal, VF_PREEMPTION,
+                                   PREEMPTION_VERTEX_COUNT, 0x4000);
+
+               /* Wa_16013271637 */
+               wa_mcr_masked_en(wal, XEHP_SLICE_COMMON_ECO_CHICKEN1,
+                                MSC_MSAA_REODER_BUF_BYPASS_DISABLE);
+
+               /* Wa_18019627453 */
+               wa_mcr_masked_en(wal, VFLSKPD, VF_PREFETCH_TLB_DIS);
+
+               /* Wa_18018764978 */
+               wa_mcr_masked_en(wal, XEHP_PSS_MODE2, SCOREBOARD_STALL_FLUSH_CONTROL);
+       }
+
+       /* Wa_18019271663 */
+       wa_masked_en(wal, CACHE_MODE_1, MSAA_OPTIMIZATION_REDUC_DISABLE);
+}
+
 static void fakewa_disable_nestedbb_mode(struct intel_engine_cs *engine,
                                         struct i915_wa_list *wal)
 {
@@ -872,7 +920,9 @@ __intel_engine_init_ctx_wa(struct intel_engine_cs *engine,
        if (engine->class != RENDER_CLASS)
                goto done;
 
-       if (IS_PONTEVECCHIO(i915))
+       if (IS_METEORLAKE(i915))
+               mtl_ctx_workarounds_init(engine, wal);
+       else if (IS_PONTEVECCHIO(i915))
                ; /* noop; none at this time */
        else if (IS_DG2(i915))
                dg2_ctx_workarounds_init(engine, wal);
@@ -1522,6 +1572,13 @@ xehpsdv_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
 
        /* Wa_14011060649:xehpsdv */
        wa_14011060649(gt, wal);
+
+       /* Wa_14012362059:xehpsdv */
+       wa_mcr_write_or(wal, XEHP_MERT_MOD_CTRL, FORCE_MISS_FTLB);
+
+       /* Wa_14014368820:xehpsdv */
+       wa_mcr_write_or(wal, XEHP_GAMCNTRL_CTRL,
+                       INVALIDATION_BROADCAST_MODE_DIS | GLOBAL_INVALIDATION_MODE);
 }
 
 static void
@@ -1562,6 +1619,12 @@ dg2_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
                                DSS_ROUTER_CLKGATE_DIS);
        }
 
+       if (IS_DG2_GRAPHICS_STEP(gt->i915, G10, STEP_A0, STEP_B0) ||
+           IS_DG2_GRAPHICS_STEP(gt->i915, G11, STEP_A0, STEP_B0)) {
+               /* Wa_14012362059:dg2 */
+               wa_mcr_write_or(wal, XEHP_MERT_MOD_CTRL, FORCE_MISS_FTLB);
+       }
+
        if (IS_DG2_GRAPHICS_STEP(gt->i915, G10, STEP_A0, STEP_B0)) {
                /* Wa_14010948348:dg2_g10 */
                wa_write_or(wal, UNSLCGCTL9430, MSQDUNIT_CLKGATE_DIS);
@@ -1607,6 +1670,12 @@ dg2_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
 
                /* Wa_14011028019:dg2_g10 */
                wa_mcr_write_or(wal, SSMCGCTL9530, RTFUNIT_CLKGATE_DIS);
+
+               /* Wa_14010680813:dg2_g10 */
+               wa_mcr_write_or(wal, XEHP_GAMSTLB_CTRL,
+                               CONTROL_BLOCK_CLKGATE_DIS |
+                               EGRESS_BLOCK_CLKGATE_DIS |
+                               TAG_BLOCK_CLKGATE_DIS);
        }
 
        /* Wa_14014830051:dg2 */
@@ -1620,7 +1689,17 @@ dg2_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
        wa_mcr_write_or(wal, XEHP_SQCM, EN_32B_ACCESS);
 
        /* Wa_14015795083 */
-       wa_mcr_write_clr(wal, GEN8_MISCCPCTL, GEN12_DOP_CLOCK_GATE_RENDER_ENABLE);
+       wa_write_clr(wal, GEN7_MISCCPCTL, GEN12_DOP_CLOCK_GATE_RENDER_ENABLE);
+
+       /* Wa_18018781329 */
+       wa_mcr_write_or(wal, RENDER_MOD_CTRL, FORCE_MISS_FTLB);
+       wa_mcr_write_or(wal, COMP_MOD_CTRL, FORCE_MISS_FTLB);
+       wa_mcr_write_or(wal, XEHP_VDBX_MOD_CTRL, FORCE_MISS_FTLB);
+       wa_mcr_write_or(wal, XEHP_VEBX_MOD_CTRL, FORCE_MISS_FTLB);
+
+       /* Wa_1509235366:dg2 */
+       wa_mcr_write_or(wal, XEHP_GAMCNTRL_CTRL,
+                       INVALIDATION_BROADCAST_MODE_DIS | GLOBAL_INVALIDATION_MODE);
 }
 
 static void
@@ -1629,13 +1708,27 @@ pvc_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
        pvc_init_mcr(gt, wal);
 
        /* Wa_14015795083 */
-       wa_mcr_write_clr(wal, GEN8_MISCCPCTL, GEN12_DOP_CLOCK_GATE_RENDER_ENABLE);
+       wa_write_clr(wal, GEN7_MISCCPCTL, GEN12_DOP_CLOCK_GATE_RENDER_ENABLE);
+
+       /* Wa_18018781329 */
+       wa_mcr_write_or(wal, RENDER_MOD_CTRL, FORCE_MISS_FTLB);
+       wa_mcr_write_or(wal, COMP_MOD_CTRL, FORCE_MISS_FTLB);
+       wa_mcr_write_or(wal, XEHP_VDBX_MOD_CTRL, FORCE_MISS_FTLB);
+       wa_mcr_write_or(wal, XEHP_VEBX_MOD_CTRL, FORCE_MISS_FTLB);
 }
 
 static void
 xelpg_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
 {
-       /* FIXME: Actual workarounds will be added in future patch(es) */
+       if (IS_MTL_GRAPHICS_STEP(gt->i915, M, STEP_A0, STEP_B0) ||
+           IS_MTL_GRAPHICS_STEP(gt->i915, P, STEP_A0, STEP_B0)) {
+               /* Wa_14014830051 */
+               wa_mcr_write_clr(wal, SARB_CHICKEN1, COMP_CKN_IN);
+
+               /* Wa_18018781329 */
+               wa_mcr_write_or(wal, RENDER_MOD_CTRL, FORCE_MISS_FTLB);
+               wa_mcr_write_or(wal, COMP_MOD_CTRL, FORCE_MISS_FTLB);
+       }
 
        /*
         * Unlike older platforms, we no longer setup implicit steering here;
@@ -1647,7 +1740,17 @@ xelpg_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
 static void
 xelpmp_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
 {
-       /* FIXME: Actual workarounds will be added in future patch(es) */
+       if (IS_MTL_MEDIA_STEP(gt->i915, STEP_A0, STEP_B0)) {
+               /*
+                * Wa_18018781329
+                *
+                * Note that although these registers are MCR on the primary
+                * GT, the media GT's versions are regular singleton registers.
+                */
+               wa_write_or(wal, XELPMP_GSC_MOD_CTRL, FORCE_MISS_FTLB);
+               wa_write_or(wal, XELPMP_VDBX_MOD_CTRL, FORCE_MISS_FTLB);
+               wa_write_or(wal, XELPMP_VEBX_MOD_CTRL, FORCE_MISS_FTLB);
+       }
 
        debug_dump_steering(gt);
 }
@@ -1767,7 +1870,8 @@ static void wa_list_apply(const struct i915_wa_list *wal)
 
        fw = wal_get_fw_for_rmw(uncore, wal);
 
-       spin_lock_irqsave(&uncore->lock, flags);
+       intel_gt_mcr_lock(gt, &flags);
+       spin_lock(&uncore->lock);
        intel_uncore_forcewake_get__locked(uncore, fw);
 
        for (i = 0, wa = wal->list; i < wal->count; i++, wa++) {
@@ -1796,7 +1900,8 @@ static void wa_list_apply(const struct i915_wa_list *wal)
        }
 
        intel_uncore_forcewake_put__locked(uncore, fw);
-       spin_unlock_irqrestore(&uncore->lock, flags);
+       spin_unlock(&uncore->lock);
+       intel_gt_mcr_unlock(gt, flags);
 }
 
 void intel_gt_apply_workarounds(struct intel_gt *gt)
@@ -1817,7 +1922,8 @@ static bool wa_list_verify(struct intel_gt *gt,
 
        fw = wal_get_fw_for_rmw(uncore, wal);
 
-       spin_lock_irqsave(&uncore->lock, flags);
+       intel_gt_mcr_lock(gt, &flags);
+       spin_lock(&uncore->lock);
        intel_uncore_forcewake_get__locked(uncore, fw);
 
        for (i = 0, wa = wal->list; i < wal->count; i++, wa++)
@@ -1827,7 +1933,8 @@ static bool wa_list_verify(struct intel_gt *gt,
                                wal->name, from);
 
        intel_uncore_forcewake_put__locked(uncore, fw);
-       spin_unlock_irqrestore(&uncore->lock, flags);
+       spin_unlock(&uncore->lock);
+       intel_gt_mcr_unlock(gt, flags);
 
        return ok;
 }
@@ -2171,7 +2278,9 @@ void intel_engine_init_whitelist(struct intel_engine_cs *engine)
 
        wa_init_start(w, engine->gt, "whitelist", engine->name);
 
-       if (IS_PONTEVECCHIO(i915))
+       if (IS_METEORLAKE(i915))
+               ; /* noop; none at this time */
+       else if (IS_PONTEVECCHIO(i915))
                pvc_whitelist_build(engine);
        else if (IS_DG2(i915))
                dg2_whitelist_build(engine);
@@ -2281,24 +2390,35 @@ rcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
 {
        struct drm_i915_private *i915 = engine->i915;
 
-       if (IS_DG2(i915)) {
-               /* Wa_1509235366:dg2 */
-               wa_write_or(wal, GEN12_GAMCNTRL_CTRL, INVALIDATION_BROADCAST_MODE_DIS |
-                           GLOBAL_INVALIDATION_MODE);
+       if (IS_MTL_GRAPHICS_STEP(i915, M, STEP_A0, STEP_B0) ||
+           IS_MTL_GRAPHICS_STEP(i915, P, STEP_A0, STEP_B0)) {
+               /* Wa_22014600077 */
+               wa_mcr_masked_en(wal, GEN10_CACHE_MODE_SS,
+                                ENABLE_EU_COUNT_FOR_TDL_FLUSH);
        }
 
-       if (IS_DG2_GRAPHICS_STEP(i915, G11, STEP_A0, STEP_B0)) {
-               /* Wa_14013392000:dg2_g11 */
-               wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN2, GEN12_ENABLE_LARGE_GRF_MODE);
-       }
-
-       if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_B0, STEP_FOREVER) ||
+       if (IS_MTL_GRAPHICS_STEP(i915, M, STEP_A0, STEP_B0) ||
+           IS_MTL_GRAPHICS_STEP(i915, P, STEP_A0, STEP_B0) ||
+           IS_DG2_GRAPHICS_STEP(i915, G10, STEP_B0, STEP_FOREVER) ||
            IS_DG2_G11(i915) || IS_DG2_G12(i915)) {
-               /* Wa_1509727124:dg2 */
+               /* Wa_1509727124 */
                wa_mcr_masked_en(wal, GEN10_SAMPLER_MODE,
                                 SC_DISABLE_POWER_OPTIMIZATION_EBB);
        }
 
+       if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_B0, STEP_FOREVER) ||
+           IS_DG2_G11(i915) || IS_DG2_G12(i915) ||
+           IS_MTL_GRAPHICS_STEP(i915, M, STEP_A0, STEP_B0)) {
+               /* Wa_22012856258 */
+               wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN2,
+                                GEN12_DISABLE_READ_SUPPRESSION);
+       }
+
+       if (IS_DG2_GRAPHICS_STEP(i915, G11, STEP_A0, STEP_B0)) {
+               /* Wa_14013392000:dg2_g11 */
+               wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN2, GEN12_ENABLE_LARGE_GRF_MODE);
+       }
+
        if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_A0, STEP_B0) ||
            IS_DG2_GRAPHICS_STEP(i915, G11, STEP_A0, STEP_B0)) {
                /* Wa_14012419201:dg2 */
@@ -2306,21 +2426,6 @@ rcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
                                 GEN12_DISABLE_HDR_PAST_PAYLOAD_HOLD_FIX);
        }
 
-       if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_B0, STEP_C0) ||
-           IS_DG2_G11(i915)) {
-               /*
-                * Wa_22012826095:dg2
-                * Wa_22013059131:dg2
-                */
-               wa_mcr_write_clr_set(wal, LSC_CHICKEN_BIT_0_UDW,
-                                    MAXREQS_PER_BANK,
-                                    REG_FIELD_PREP(MAXREQS_PER_BANK, 2));
-
-               /* Wa_22013059131:dg2 */
-               wa_mcr_write_or(wal, LSC_CHICKEN_BIT_0,
-                               FORCE_1_SUB_MESSAGE_PER_FRAGMENT);
-       }
-
        /* Wa_1308578152:dg2_g10 when first gslice is fused off */
        if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_B0, STEP_C0) &&
            needs_wa_1308578152(engine)) {
@@ -2330,14 +2435,6 @@ rcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
 
        if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_B0, STEP_FOREVER) ||
            IS_DG2_G11(i915) || IS_DG2_G12(i915)) {
-               /* Wa_22013037850:dg2 */
-               wa_mcr_write_or(wal, LSC_CHICKEN_BIT_0_UDW,
-                               DISABLE_128B_EVICTION_COMMAND_UDW);
-
-               /* Wa_22012856258:dg2 */
-               wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN2,
-                                GEN12_DISABLE_READ_SUPPRESSION);
-
                /*
                 * Wa_22010960976:dg2
                 * Wa_14013347512:dg2
@@ -2353,16 +2450,6 @@ rcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
                 */
                wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN,
                                 MDQ_ARBITRATION_MODE | UGM_BACKUP_MODE);
-
-               /*
-                * Wa_14010918519:dg2_g10
-                *
-                * LSC_CHICKEN_BIT_0 always reads back as 0 is this stepping,
-                * so ignoring verification.
-                */
-               wa_mcr_add(wal, LSC_CHICKEN_BIT_0_UDW, 0,
-                          FORCE_SLM_FENCE_SCOPE_TO_TILE | FORCE_UGM_FENCE_SCOPE_TO_TILE,
-                          0, false);
        }
 
        if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_A0, STEP_B0)) {
@@ -2386,18 +2473,6 @@ rcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
                wa_mcr_masked_en(wal, GEN9_HALF_SLICE_CHICKEN7,
                                 DG2_DISABLE_ROUND_ENABLE_ALLOW_FOR_SSLA);
 
-       if (IS_DG2_GRAPHICS_STEP(engine->i915, G10, STEP_A0, STEP_B0)) {
-               /* Wa_14010680813:dg2_g10 */
-               wa_write_or(wal, GEN12_GAMSTLB_CTRL, CONTROL_BLOCK_CLKGATE_DIS |
-                           EGRESS_BLOCK_CLKGATE_DIS | TAG_BLOCK_CLKGATE_DIS);
-       }
-
-       if (IS_DG2_GRAPHICS_STEP(engine->i915, G10, STEP_A0, STEP_B0) ||
-           IS_DG2_GRAPHICS_STEP(engine->i915, G11, STEP_A0, STEP_B0)) {
-               /* Wa_14012362059:dg2 */
-               wa_mcr_write_or(wal, XEHP_MERT_MOD_CTRL, FORCE_MISS_FTLB);
-       }
-
        if (IS_DG2_GRAPHICS_STEP(i915, G11, STEP_B0, STEP_FOREVER) ||
            IS_DG2_G10(i915)) {
                /* Wa_22014600077:dg2 */
@@ -2901,27 +2976,14 @@ add_render_compute_tuning_settings(struct drm_i915_private *i915,
                                   struct i915_wa_list *wal)
 {
        if (IS_PONTEVECCHIO(i915)) {
-               wa_write(wal, XEHPC_L3SCRUB,
-                        SCRUB_CL_DWNGRADE_SHARED | SCRUB_RATE_4B_PER_CLK);
+               wa_mcr_write(wal, XEHPC_L3SCRUB,
+                            SCRUB_CL_DWNGRADE_SHARED | SCRUB_RATE_4B_PER_CLK);
+               wa_mcr_masked_en(wal, XEHPC_LNCFMISCCFGREG0, XEHPC_HOSTCACHEEN);
        }
 
        if (IS_DG2(i915)) {
                wa_mcr_write_or(wal, XEHP_L3SCQREG7, BLEND_FILL_CACHING_OPT_DIS);
                wa_mcr_write_clr_set(wal, RT_CTRL, STACKID_CTRL, STACKID_CTRL_512);
-
-               /*
-                * This is also listed as Wa_22012654132 for certain DG2
-                * steppings, but the tuning setting programming is a superset
-                * since it applies to all DG2 variants and steppings.
-                *
-                * Note that register 0xE420 is write-only and cannot be read
-                * back for verification on DG2 (due to Wa_14012342262), so
-                * we need to explicitly skip the readback.
-                */
-               wa_mcr_add(wal, GEN10_CACHE_MODE_SS, 0,
-                          _MASKED_BIT_ENABLE(ENABLE_PREFETCH_INTO_IC),
-                          0 /* write-only, so skip validation */,
-                          true);
        }
 
        /*
@@ -2932,6 +2994,9 @@ add_render_compute_tuning_settings(struct drm_i915_private *i915,
        if (INTEL_INFO(i915)->tuning_thread_rr_after_dep)
                wa_mcr_masked_field_set(wal, GEN9_ROW_CHICKEN4, THREAD_EX_ARB_MODE,
                                        THREAD_EX_ARB_MODE_RR_AFTER_DEP);
+
+       if (GRAPHICS_VER(i915) == 12 && GRAPHICS_VER_FULL(i915) < IP_VER(12, 50))
+               wa_write_clr(wal, GEN8_GARBCNTL, GEN12_BUS_HASH_CTL_BIT_EXC);
 }
 
 /*
@@ -2950,9 +3015,60 @@ general_render_compute_wa_init(struct intel_engine_cs *engine, struct i915_wa_li
 
        add_render_compute_tuning_settings(i915, wal);
 
+       if (IS_MTL_GRAPHICS_STEP(i915, M, STEP_A0, STEP_B0) ||
+           IS_MTL_GRAPHICS_STEP(i915, P, STEP_A0, STEP_B0) ||
+           IS_DG2_GRAPHICS_STEP(i915, G10, STEP_B0, STEP_FOREVER) ||
+           IS_DG2_G11(i915) || IS_DG2_G12(i915)) {
+               /* Wa_22013037850 */
+               wa_mcr_write_or(wal, LSC_CHICKEN_BIT_0_UDW,
+                               DISABLE_128B_EVICTION_COMMAND_UDW);
+       }
+
+       if (IS_MTL_GRAPHICS_STEP(i915, M, STEP_A0, STEP_B0) ||
+           IS_MTL_GRAPHICS_STEP(i915, P, STEP_A0, STEP_B0) ||
+           IS_PONTEVECCHIO(i915) ||
+           IS_DG2(i915)) {
+               /* Wa_22014226127 */
+               wa_mcr_write_or(wal, LSC_CHICKEN_BIT_0, DISABLE_D8_D16_COASLESCE);
+       }
+
+       if (IS_MTL_GRAPHICS_STEP(i915, M, STEP_A0, STEP_B0) ||
+           IS_MTL_GRAPHICS_STEP(i915, P, STEP_A0, STEP_B0) ||
+           IS_DG2(i915)) {
+               /* Wa_18017747507 */
+               wa_masked_en(wal, VFG_PREEMPTION_CHICKEN, POLYGON_TRIFAN_LINELOOP_DISABLE);
+       }
+
+       if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_B0, STEP_C0) ||
+           IS_DG2_G11(i915)) {
+               /*
+                * Wa_22012826095:dg2
+                * Wa_22013059131:dg2
+                */
+               wa_mcr_write_clr_set(wal, LSC_CHICKEN_BIT_0_UDW,
+                                    MAXREQS_PER_BANK,
+                                    REG_FIELD_PREP(MAXREQS_PER_BANK, 2));
+
+               /* Wa_22013059131:dg2 */
+               wa_mcr_write_or(wal, LSC_CHICKEN_BIT_0,
+                               FORCE_1_SUB_MESSAGE_PER_FRAGMENT);
+       }
+
+       if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_A0, STEP_B0)) {
+               /*
+                * Wa_14010918519:dg2_g10
+                *
+                * LSC_CHICKEN_BIT_0 always reads back as 0 is this stepping,
+                * so ignoring verification.
+                */
+               wa_mcr_add(wal, LSC_CHICKEN_BIT_0_UDW, 0,
+                          FORCE_SLM_FENCE_SCOPE_TO_TILE | FORCE_UGM_FENCE_SCOPE_TO_TILE,
+                          0, false);
+       }
+
        if (IS_PONTEVECCHIO(i915)) {
                /* Wa_16016694945 */
-               wa_masked_en(wal, XEHPC_LNCFMISCCFGREG0, XEHPC_OVRLSCCC);
+               wa_mcr_masked_en(wal, XEHPC_LNCFMISCCFGREG0, XEHPC_OVRLSCCC);
        }
 
        if (IS_XEHPSDV(i915)) {
@@ -2978,30 +3094,14 @@ general_render_compute_wa_init(struct intel_engine_cs *engine, struct i915_wa_li
                        wa_mcr_masked_dis(wal, MLTICTXCTL, TDONRENDER);
                        wa_mcr_write_or(wal, L3SQCREG1_CCS0, FLUSHALLNONCOH);
                }
-
-               /* Wa_14012362059:xehpsdv */
-               wa_mcr_write_or(wal, XEHP_MERT_MOD_CTRL, FORCE_MISS_FTLB);
-
-               /* Wa_14014368820:xehpsdv */
-               wa_write_or(wal, GEN12_GAMCNTRL_CTRL, INVALIDATION_BROADCAST_MODE_DIS |
-                               GLOBAL_INVALIDATION_MODE);
        }
 
        if (IS_DG2(i915) || IS_PONTEVECCHIO(i915)) {
                /* Wa_14015227452:dg2,pvc */
                wa_mcr_masked_en(wal, GEN9_ROW_CHICKEN4, XEHP_DIS_BBL_SYSPIPE);
 
-               /* Wa_22014226127:dg2,pvc */
-               wa_mcr_write_or(wal, LSC_CHICKEN_BIT_0, DISABLE_D8_D16_COASLESCE);
-
                /* Wa_16015675438:dg2,pvc */
                wa_masked_en(wal, FF_SLICE_CS_CHICKEN2, GEN12_PERF_FIX_BALANCING_CFE_DISABLE);
-
-               /* Wa_18018781329:dg2,pvc */
-               wa_mcr_write_or(wal, RENDER_MOD_CTRL, FORCE_MISS_FTLB);
-               wa_mcr_write_or(wal, COMP_MOD_CTRL, FORCE_MISS_FTLB);
-               wa_mcr_write_or(wal, VDBX_MOD_CTRL, FORCE_MISS_FTLB);
-               wa_mcr_write_or(wal, VEBX_MOD_CTRL, FORCE_MISS_FTLB);
        }
 
        if (IS_DG2(i915)) {
@@ -3010,10 +3110,20 @@ general_render_compute_wa_init(struct intel_engine_cs *engine, struct i915_wa_li
                 * Wa_22015475538:dg2
                 */
                wa_mcr_write_or(wal, LSC_CHICKEN_BIT_0_UDW, DIS_CHAIN_2XSIMD8);
-
-               /* Wa_18017747507:dg2 */
-               wa_masked_en(wal, VFG_PREEMPTION_CHICKEN, POLYGON_TRIFAN_LINELOOP_DISABLE);
        }
+
+       if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_A0, STEP_C0) || IS_DG2_G11(i915))
+               /*
+                * Wa_22012654132
+                *
+                * Note that register 0xE420 is write-only and cannot be read
+                * back for verification on DG2 (due to Wa_14012342262), so
+                * we need to explicitly skip the readback.
+                */
+               wa_mcr_add(wal, GEN10_CACHE_MODE_SS, 0,
+                          _MASKED_BIT_ENABLE(ENABLE_PREFETCH_INTO_IC),
+                          0 /* write-only, so skip validation */,
+                          true);
 }
 
 static void
This page took 0.042066 seconds and 4 git commands to generate.