drm/i915/gt: Disable HW load balancing for CCS
[linux-block.git] / drivers / gpu / drm / i915 / gt / intel_workarounds.c
index 3ae0dbd39eaa3cfccd6f0dc617f34fe348b213b1..a237e823364b2216d62aeca9cbc1851f25cb63b2 100644 (file)
@@ -11,6 +11,7 @@
 #include "intel_gpu_commands.h"
 #include "intel_gt.h"
 #include "intel_gt_mcr.h"
+#include "intel_gt_print.h"
 #include "intel_gt_regs.h"
 #include "intel_ring.h"
 #include "intel_workarounds.h"
@@ -50,7 +51,8 @@
  *   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().
+ *   should be implemented in general_render_compute_wa_init(). The settings
+ *   about the CCS load balancing should be added in ccs_engine_wa_mode().
  *
  * - GT workarounds: the list of these WAs is applied whenever these registers
  *   revert to their default values: on GPU reset, suspend/resume [1]_, etc.
@@ -119,8 +121,8 @@ static void wa_init_finish(struct i915_wa_list *wal)
        if (!wal->count)
                return;
 
-       drm_dbg(&wal->gt->i915->drm, "Initialized %u %s workarounds on %s\n",
-               wal->wa_count, wal->name, wal->engine_name);
+       gt_dbg(wal->gt, "Initialized %u %s workarounds on %s\n",
+              wal->wa_count, wal->name, wal->engine_name);
 }
 
 static enum forcewake_domains
@@ -764,68 +766,49 @@ static void dg2_ctx_workarounds_init(struct intel_engine_cs *engine,
 {
        dg2_ctx_gt_tuning_init(engine, wal);
 
-       /* Wa_16011186671:dg2_g11 */
-       if (IS_DG2_GRAPHICS_STEP(engine->i915, G11, STEP_A0, STEP_B0)) {
-               wa_mcr_masked_dis(wal, VFLSKPD, DIS_MULT_MISS_RD_SQUASH);
-               wa_mcr_masked_en(wal, VFLSKPD, DIS_OVER_FETCH_CACHE);
-       }
-
-       if (IS_DG2_GRAPHICS_STEP(engine->i915, G10, STEP_A0, STEP_B0)) {
-               /* Wa_14010469329:dg2_g10 */
-               wa_mcr_masked_en(wal, XEHP_COMMON_SLICE_CHICKEN3,
-                                XEHP_DUAL_SIMD8_SEQ_MERGE_DISABLE);
-
-               /*
-                * Wa_22010465075:dg2_g10
-                * Wa_22010613112:dg2_g10
-                * Wa_14010698770:dg2_g10
-                */
-               wa_mcr_masked_en(wal, XEHP_COMMON_SLICE_CHICKEN3,
-                                GEN12_DISABLE_CPS_AWARE_COLOR_PIPE);
-       }
-
        /* Wa_16013271637:dg2 */
        wa_mcr_masked_en(wal, XEHP_SLICE_COMMON_ECO_CHICKEN1,
                         MSC_MSAA_REODER_BUF_BYPASS_DISABLE);
 
        /* Wa_14014947963:dg2 */
-       if (IS_DG2_GRAPHICS_STEP(engine->i915, G10, STEP_B0, STEP_FOREVER) ||
-           IS_DG2_G11(engine->i915) || IS_DG2_G12(engine->i915))
-               wa_masked_field_set(wal, VF_PREEMPTION, PREEMPTION_VERTEX_COUNT, 0x4000);
+       wa_masked_field_set(wal, VF_PREEMPTION, PREEMPTION_VERTEX_COUNT, 0x4000);
 
        /* 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_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);
+       wa_mcr_masked_en(wal, XEHP_PSS_MODE2, SCOREBOARD_STALL_FLUSH_CONTROL);
 
        /* Wa_18019271663:dg2 */
        wa_masked_en(wal, CACHE_MODE_1, MSAA_OPTIMIZATION_REDUC_DISABLE);
+
+       /* Wa_14019877138:dg2 */
+       wa_mcr_masked_en(wal, XEHP_PSS_CHICKEN, FD_END_COLLECT);
 }
 
-static void mtl_ctx_gt_tuning_init(struct intel_engine_cs *engine,
-                                  struct i915_wa_list *wal)
+static void xelpg_ctx_gt_tuning_init(struct intel_engine_cs *engine,
+                                    struct i915_wa_list *wal)
 {
-       struct drm_i915_private *i915 = engine->i915;
+       struct intel_gt *gt = engine->gt;
 
        dg2_ctx_gt_tuning_init(engine, wal);
 
-       if (IS_MTL_GRAPHICS_STEP(i915, M, STEP_B0, STEP_FOREVER) ||
-           IS_MTL_GRAPHICS_STEP(i915, P, STEP_B0, STEP_FOREVER))
+       /*
+        * Due to Wa_16014892111, the DRAW_WATERMARK tuning must be done in
+        * gen12_emit_indirect_ctx_rcs() rather than here on some early
+        * steppings.
+        */
+       if (!(IS_GFX_GT_IP_STEP(gt, IP_VER(12, 70), STEP_A0, STEP_B0) ||
+             IS_GFX_GT_IP_STEP(gt, IP_VER(12, 71), STEP_A0, STEP_B0)))
                wa_add(wal, DRAW_WATERMARK, VERT_WM_VAL, 0x3FF, 0, false);
 }
 
-static void mtl_ctx_workarounds_init(struct intel_engine_cs *engine,
-                                    struct i915_wa_list *wal)
+static void xelpg_ctx_workarounds_init(struct intel_engine_cs *engine,
+                                      struct i915_wa_list *wal)
 {
-       struct drm_i915_private *i915 = engine->i915;
+       struct intel_gt *gt = engine->gt;
 
-       mtl_ctx_gt_tuning_init(engine, wal);
+       xelpg_ctx_gt_tuning_init(engine, wal);
 
-       if (IS_MTL_GRAPHICS_STEP(i915, M, STEP_A0, STEP_B0) ||
-           IS_MTL_GRAPHICS_STEP(i915, P, STEP_A0, STEP_B0)) {
+       if (IS_GFX_GT_IP_STEP(gt, IP_VER(12, 70), STEP_A0, STEP_B0) ||
+           IS_GFX_GT_IP_STEP(gt, IP_VER(12, 71), STEP_A0, STEP_B0)) {
                /* Wa_14014947963 */
                wa_masked_field_set(wal, VF_PREEMPTION,
                                    PREEMPTION_VERTEX_COUNT, 0x4000);
@@ -843,6 +826,9 @@ static void mtl_ctx_workarounds_init(struct intel_engine_cs *engine,
 
        /* Wa_18019271663 */
        wa_masked_en(wal, CACHE_MODE_1, MSAA_OPTIMIZATION_REDUC_DISABLE);
+
+       /* Wa_14019877138 */
+       wa_mcr_masked_en(wal, XEHP_PSS_CHICKEN, FD_END_COLLECT);
 }
 
 static void fakewa_disable_nestedbb_mode(struct intel_engine_cs *engine,
@@ -931,8 +917,8 @@ __intel_engine_init_ctx_wa(struct intel_engine_cs *engine,
        if (engine->class != RENDER_CLASS)
                goto done;
 
-       if (IS_METEORLAKE(i915))
-               mtl_ctx_workarounds_init(engine, wal);
+       if (IS_GFX_GT_IP_RANGE(engine->gt, IP_VER(12, 70), IP_VER(12, 74)))
+               xelpg_ctx_workarounds_init(engine, wal);
        else if (IS_PONTEVECCHIO(i915))
                ; /* noop; none at this time */
        else if (IS_DG2(i915))
@@ -1606,31 +1592,11 @@ xehpsdv_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
 static void
 dg2_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
 {
-       struct intel_engine_cs *engine;
-       int id;
-
        xehp_init_mcr(gt, wal);
 
        /* Wa_14011060649:dg2 */
        wa_14011060649(gt, wal);
 
-       /*
-        * Although there are per-engine instances of these registers,
-        * they technically exist outside the engine itself and are not
-        * impacted by engine resets.  Furthermore, they're part of the
-        * GuC blacklist so trying to treat them as engine workarounds
-        * will result in GuC initialization failure and a wedged GPU.
-        */
-       for_each_engine(engine, gt, id) {
-               if (engine->class != VIDEO_DECODE_CLASS)
-                       continue;
-
-               /* Wa_16010515920:dg2_g10 */
-               if (IS_DG2_GRAPHICS_STEP(gt->i915, G10, STEP_A0, STEP_B0))
-                       wa_write_or(wal, VDBOX_CGCTL3F18(engine->mmio_base),
-                                   ALNUNIT_CLKGATE_DIS);
-       }
-
        if (IS_DG2_G10(gt->i915)) {
                /* Wa_22010523718:dg2 */
                wa_write_or(wal, UNSLICE_UNIT_LEVEL_CLKGATE,
@@ -1641,70 +1607,15 @@ 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);
-
-               /* Wa_14011037102:dg2_g10 */
-               wa_write_or(wal, UNSLCGCTL9444, LTCDD_CLKGATE_DIS);
-
-               /* Wa_14011371254:dg2_g10 */
-               wa_mcr_write_or(wal, XEHP_SLICE_UNIT_LEVEL_CLKGATE, NODEDSS_CLKGATE_DIS);
-
-               /* Wa_14011431319:dg2_g10 */
-               wa_write_or(wal, UNSLCGCTL9440, GAMTLBOACS_CLKGATE_DIS |
-                           GAMTLBVDBOX7_CLKGATE_DIS |
-                           GAMTLBVDBOX6_CLKGATE_DIS |
-                           GAMTLBVDBOX5_CLKGATE_DIS |
-                           GAMTLBVDBOX4_CLKGATE_DIS |
-                           GAMTLBVDBOX3_CLKGATE_DIS |
-                           GAMTLBVDBOX2_CLKGATE_DIS |
-                           GAMTLBVDBOX1_CLKGATE_DIS |
-                           GAMTLBVDBOX0_CLKGATE_DIS |
-                           GAMTLBKCR_CLKGATE_DIS |
-                           GAMTLBGUC_CLKGATE_DIS |
-                           GAMTLBBLT_CLKGATE_DIS);
-               wa_write_or(wal, UNSLCGCTL9444, GAMTLBGFXA0_CLKGATE_DIS |
-                           GAMTLBGFXA1_CLKGATE_DIS |
-                           GAMTLBCOMPA0_CLKGATE_DIS |
-                           GAMTLBCOMPA1_CLKGATE_DIS |
-                           GAMTLBCOMPB0_CLKGATE_DIS |
-                           GAMTLBCOMPB1_CLKGATE_DIS |
-                           GAMTLBCOMPC0_CLKGATE_DIS |
-                           GAMTLBCOMPC1_CLKGATE_DIS |
-                           GAMTLBCOMPD0_CLKGATE_DIS |
-                           GAMTLBCOMPD1_CLKGATE_DIS |
-                           GAMTLBMERT_CLKGATE_DIS   |
-                           GAMTLBVEBOX3_CLKGATE_DIS |
-                           GAMTLBVEBOX2_CLKGATE_DIS |
-                           GAMTLBVEBOX1_CLKGATE_DIS |
-                           GAMTLBVEBOX0_CLKGATE_DIS);
-
-               /* Wa_14010569222:dg2_g10 */
-               wa_write_or(wal, UNSLICE_UNIT_LEVEL_CLKGATE,
-                           GAMEDIA_CLKGATE_DIS);
-
-               /* 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 */
        wa_mcr_write_clr(wal, SARB_CHICKEN1, COMP_CKN_IN);
 
-       /* Wa_14015795083 */
-       wa_write_clr(wal, GEN7_MISCCPCTL, GEN12_DOP_CLOCK_GATE_RENDER_ENABLE);
+       /*
+        * Wa_14015795083
+        * Skip verification for possibly locked register.
+        */
+       wa_add(wal, GEN7_MISCCPCTL, GEN12_DOP_CLOCK_GATE_RENDER_ENABLE,
+              0, 0, false);
 
        /* Wa_18018781329 */
        wa_mcr_write_or(wal, RENDER_MOD_CTRL, FORCE_MISS_FTLB);
@@ -1741,14 +1652,15 @@ pvc_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
 static void
 xelpg_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
 {
-       /* Wa_14018778641 / Wa_18018781329 */
+       /* Wa_14018575942 / 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_22016670082 */
        wa_write_or(wal, GEN12_SQCNT1, GEN12_STRICT_RAR_ENABLE);
 
-       if (IS_MTL_GRAPHICS_STEP(gt->i915, M, STEP_A0, STEP_B0) ||
-           IS_MTL_GRAPHICS_STEP(gt->i915, P, STEP_A0, STEP_B0)) {
+       if (IS_GFX_GT_IP_STEP(gt, IP_VER(12, 70), STEP_A0, STEP_B0) ||
+           IS_GFX_GT_IP_STEP(gt, IP_VER(12, 71), STEP_A0, STEP_B0)) {
                /* Wa_14014830051 */
                wa_mcr_write_clr(wal, SARB_CHICKEN1, COMP_CKN_IN);
 
@@ -1763,9 +1675,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
@@ -1775,6 +1701,9 @@ xelpmp_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
         */
        wa_write_or(wal, XELPMP_GSC_MOD_CTRL, FORCE_MISS_FTLB);
 
+       /* Wa_22016670082 */
+       wa_write_or(wal, GEN12_SQCNT1, GEN12_STRICT_RAR_ENABLE);
+
        debug_dump_steering(gt);
 }
 
@@ -1791,10 +1720,8 @@ xelpmp_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
  */
 static void gt_tuning_settings(struct intel_gt *gt, struct i915_wa_list *wal)
 {
-       if (IS_METEORLAKE(gt->i915)) {
-               if (gt->type != GT_MEDIA)
-                       wa_mcr_write_or(wal, XEHP_L3SCQREG7, BLEND_FILL_CACHING_OPT_DIS);
-
+       if (IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 70), IP_VER(12, 74))) {
+               wa_mcr_write_or(wal, XEHP_L3SCQREG7, BLEND_FILL_CACHING_OPT_DIS);
                wa_mcr_write_or(wal, XEHP_SQCM, EN_32B_ACCESS);
        }
 
@@ -1818,15 +1745,15 @@ gt_init_workarounds(struct intel_gt *gt, struct i915_wa_list *wal)
        gt_tuning_settings(gt, wal);
 
        if (gt->type == GT_MEDIA) {
-               if (MEDIA_VER(i915) >= 13)
+               if (MEDIA_VER_FULL(i915) == IP_VER(13, 0))
                        xelpmp_gt_workarounds_init(gt, wal);
                else
-                       MISSING_CASE(MEDIA_VER(i915));
+                       MISSING_CASE(MEDIA_VER_FULL(i915));
 
                return;
        }
 
-       if (GRAPHICS_VER_FULL(i915) >= IP_VER(12, 70))
+       if (IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 70), IP_VER(12, 74)))
                xelpg_gt_workarounds_init(gt, wal);
        else if (IS_PONTEVECCHIO(i915))
                pvc_gt_workarounds_init(gt, wal);
@@ -1884,10 +1811,10 @@ wa_verify(struct intel_gt *gt, const struct i915_wa *wa, u32 cur,
          const char *name, const char *from)
 {
        if ((cur ^ wa->set) & wa->read) {
-               drm_err(&gt->i915->drm,
-                       "%s workaround lost on %s! (reg[%x]=0x%x, relevant bits were 0x%x vs expected 0x%x)\n",
-                       name, from, i915_mmio_reg_offset(wa->reg),
-                       cur, cur & wa->read, wa->set & wa->read);
+               gt_err(gt,
+                      "%s workaround lost on %s! (reg[%x]=0x%x, relevant bits were 0x%x vs expected 0x%x)\n",
+                      name, from, i915_mmio_reg_offset(wa->reg),
+                      cur, cur & wa->read, wa->set & wa->read);
 
                return false;
        }
@@ -2242,29 +2169,10 @@ static void dg2_whitelist_build(struct intel_engine_cs *engine)
 
        switch (engine->class) {
        case RENDER_CLASS:
-               /*
-                * Wa_1507100340:dg2_g10
-                *
-                * This covers 4 registers which are next to one another :
-                *   - PS_INVOCATION_COUNT
-                *   - PS_INVOCATION_COUNT_UDW
-                *   - PS_DEPTH_COUNT
-                *   - PS_DEPTH_COUNT_UDW
-                */
-               if (IS_DG2_GRAPHICS_STEP(engine->i915, G10, STEP_A0, STEP_B0))
-                       whitelist_reg_ext(w, PS_INVOCATION_COUNT,
-                                         RING_FORCE_TO_NONPRIV_ACCESS_RD |
-                                         RING_FORCE_TO_NONPRIV_RANGE_4);
-
                /* Required by recommended tuning setting (not a workaround) */
                whitelist_mcr_reg(w, XEHP_COMMON_SLICE_CHICKEN3);
 
                break;
-       case COMPUTE_CLASS:
-               /* Wa_16011157294:dg2_g10 */
-               if (IS_DG2_GRAPHICS_STEP(engine->i915, G10, STEP_A0, STEP_B0))
-                       whitelist_reg(w, GEN9_CTX_PREEMPT_REG);
-               break;
        default:
                break;
        }
@@ -2294,7 +2202,7 @@ static void pvc_whitelist_build(struct intel_engine_cs *engine)
        blacklist_trtt(engine);
 }
 
-static void mtl_whitelist_build(struct intel_engine_cs *engine)
+static void xelpg_whitelist_build(struct intel_engine_cs *engine)
 {
        struct i915_wa_list *w = &engine->whitelist;
 
@@ -2316,8 +2224,10 @@ void intel_engine_init_whitelist(struct intel_engine_cs *engine)
 
        wa_init_start(w, engine->gt, "whitelist", engine->name);
 
-       if (IS_METEORLAKE(i915))
-               mtl_whitelist_build(engine);
+       if (engine->gt->type == GT_MEDIA)
+               ; /* none yet */
+       else if (IS_GFX_GT_IP_RANGE(engine->gt, IP_VER(12, 70), IP_VER(12, 74)))
+               xelpg_whitelist_build(engine);
        else if (IS_PONTEVECCHIO(i915))
                pvc_whitelist_build(engine);
        else if (IS_DG2(i915))
@@ -2415,62 +2325,35 @@ engine_fake_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
        }
 }
 
-static bool needs_wa_1308578152(struct intel_engine_cs *engine)
-{
-       return intel_sseu_find_first_xehp_dss(&engine->gt->info.sseu, 0, 0) >=
-               GEN_DSS_PER_GSLICE;
-}
-
 static void
 rcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
 {
        struct drm_i915_private *i915 = engine->i915;
+       struct intel_gt *gt = engine->gt;
 
-       if (IS_MTL_GRAPHICS_STEP(i915, M, STEP_A0, STEP_B0) ||
-           IS_MTL_GRAPHICS_STEP(i915, P, STEP_A0, STEP_B0)) {
+       if (IS_GFX_GT_IP_STEP(gt, IP_VER(12, 70), STEP_A0, STEP_B0) ||
+           IS_GFX_GT_IP_STEP(gt, IP_VER(12, 71), STEP_A0, STEP_B0)) {
                /* Wa_22014600077 */
                wa_mcr_masked_en(wal, GEN10_CACHE_MODE_SS,
                                 ENABLE_EU_COUNT_FOR_TDL_FLUSH);
        }
 
-       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)) {
+       if (IS_GFX_GT_IP_STEP(gt, IP_VER(12, 70), STEP_A0, STEP_B0) ||
+           IS_GFX_GT_IP_STEP(gt, IP_VER(12, 71), STEP_A0, STEP_B0) ||
+           IS_DG2(i915)) {
                /* 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)) {
+       if (IS_GFX_GT_IP_STEP(gt, IP_VER(12, 70), STEP_A0, STEP_B0) ||
+           IS_DG2(i915)) {
                /* 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 */
-               wa_mcr_masked_en(wal, GEN9_ROW_CHICKEN4,
-                                GEN12_DISABLE_HDR_PAST_PAYLOAD_HOLD_FIX);
-       }
-
-       /* 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)) {
-               wa_masked_dis(wal, GEN12_CS_DEBUG_MODE1_CCCSUNIT_BE_COMMON,
-                             GEN12_REPLAY_MODE_GRANULARITY);
-       }
-
-       if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_B0, STEP_FOREVER) ||
-           IS_DG2_G11(i915) || IS_DG2_G12(i915)) {
+       if (IS_DG2(i915)) {
                /*
                 * Wa_22010960976:dg2
                 * Wa_14013347512:dg2
@@ -2479,39 +2362,25 @@ rcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
                                  LSC_L1_FLUSH_CTL_3D_DATAPORT_FLUSH_EVENTS_MASK);
        }
 
-       if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_A0, STEP_B0)) {
-               /*
-                * Wa_1608949956:dg2_g10
-                * Wa_14010198302:dg2_g10
-                */
-               wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN,
-                                MDQ_ARBITRATION_MODE | UGM_BACKUP_MODE);
+       if (IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 70), IP_VER(12, 71)) ||
+           IS_DG2(i915)) {
+               /* Wa_14015150844 */
+               wa_mcr_add(wal, XEHP_HDC_CHICKEN0, 0,
+                          _MASKED_BIT_ENABLE(DIS_ATOMIC_CHAINING_TYPED_WRITES),
+                          0, true);
        }
 
-       if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_A0, STEP_B0))
-               /* Wa_22010430635:dg2 */
-               wa_mcr_masked_en(wal,
-                                GEN9_ROW_CHICKEN4,
-                                GEN12_DISABLE_GRF_CLEAR);
-
-       /* Wa_14013202645:dg2 */
-       if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_B0, STEP_C0) ||
-           IS_DG2_GRAPHICS_STEP(i915, G11, STEP_A0, STEP_B0))
-               wa_mcr_write_or(wal, RT_CTRL, DIS_NULL_QUERY);
-
-       /* Wa_22012532006:dg2 */
-       if (IS_DG2_GRAPHICS_STEP(engine->i915, G10, STEP_A0, STEP_C0) ||
-           IS_DG2_GRAPHICS_STEP(engine->i915, G11, STEP_A0, STEP_B0))
-               wa_mcr_masked_en(wal, GEN9_HALF_SLICE_CHICKEN7,
-                                DG2_DISABLE_ROUND_ENABLE_ALLOW_FOR_SSLA);
-
-       if (IS_DG2_GRAPHICS_STEP(i915, G11, STEP_B0, STEP_FOREVER) ||
-           IS_DG2_G10(i915)) {
-               /* Wa_22014600077:dg2 */
-               wa_mcr_add(wal, GEN10_CACHE_MODE_SS, 0,
-                          _MASKED_BIT_ENABLE(ENABLE_EU_COUNT_FOR_TDL_FLUSH),
-                          0 /* Wa_14012342262 write-only reg, so skip verification */,
-                          true);
+       if (IS_DG2(i915) || IS_ALDERLAKE_P(i915) || IS_ALDERLAKE_S(i915) ||
+           IS_DG1(i915) || IS_ROCKETLAKE(i915) || IS_TIGERLAKE(i915)) {
+               /*
+                * Wa_1606700617:tgl,dg1,adl-p
+                * Wa_22010271021:tgl,rkl,dg1,adl-s,adl-p
+                * Wa_14010826681:tgl,dg1,rkl,adl-p
+                * Wa_18019627453:dg2
+                */
+               wa_masked_en(wal,
+                            GEN9_CS_DEBUG_MODE1,
+                            FF_DOP_CLOCK_GATE_DISABLE);
        }
 
        if (IS_ALDERLAKE_P(i915) || IS_ALDERLAKE_S(i915) || IS_DG1(i915) ||
@@ -2527,19 +2396,11 @@ rcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
                 */
                wa_write_or(wal, GEN7_FF_THREAD_MODE,
                            GEN12_FF_TESSELATION_DOP_GATE_DISABLE);
-       }
 
-       if (IS_ALDERLAKE_P(i915) || IS_DG2(i915) || IS_ALDERLAKE_S(i915) ||
-           IS_DG1(i915) || IS_ROCKETLAKE(i915) || IS_TIGERLAKE(i915)) {
-               /*
-                * Wa_1606700617:tgl,dg1,adl-p
-                * Wa_22010271021:tgl,rkl,dg1,adl-s,adl-p
-                * Wa_14010826681:tgl,dg1,rkl,adl-p
-                * Wa_18019627453:dg2
-                */
-               wa_masked_en(wal,
-                            GEN9_CS_DEBUG_MODE1,
-                            FF_DOP_CLOCK_GATE_DISABLE);
+               /* Wa_1406941453:tgl,rkl,dg1,adl-s,adl-p */
+               wa_mcr_masked_en(wal,
+                                GEN10_SAMPLER_MODE,
+                                ENABLE_SMALLPL);
        }
 
        if (IS_ALDERLAKE_P(i915) || IS_ALDERLAKE_S(i915) ||
@@ -2566,14 +2427,6 @@ rcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
                             GEN8_RC_SEMA_IDLE_MSG_DISABLE);
        }
 
-       if (IS_DG1(i915) || IS_ROCKETLAKE(i915) || IS_TIGERLAKE(i915) ||
-           IS_ALDERLAKE_S(i915) || IS_ALDERLAKE_P(i915)) {
-               /* Wa_1406941453:tgl,rkl,dg1,adl-s,adl-p */
-               wa_mcr_masked_en(wal,
-                                GEN10_SAMPLER_MODE,
-                                ENABLE_SMALLPL);
-       }
-
        if (GRAPHICS_VER(i915) == 11) {
                /* This is not an Wa. Enable for better image quality */
                wa_masked_en(wal,
@@ -2951,6 +2804,11 @@ xcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
                         RING_SEMA_WAIT_POLL(engine->mmio_base),
                         1);
        }
+       /* Wa_16018031267, Wa_16018063123 */
+       if (NEEDS_FASTCOLOR_BLT_WABB(engine))
+               wa_masked_field_set(wal, ECOSKPD(engine->mmio_base),
+                                   XEHP_BLITTER_SCHEDULING_MODE_MASK,
+                                   XEHP_BLITTER_ROUND_ROBIN_MODE);
 }
 
 static void
@@ -2975,10 +2833,12 @@ ccs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
  * function invoked by __intel_engine_init_ctx_wa().
  */
 static void
-add_render_compute_tuning_settings(struct drm_i915_private *i915,
+add_render_compute_tuning_settings(struct intel_gt *gt,
                                   struct i915_wa_list *wal)
 {
-       if (IS_METEORLAKE(i915) || IS_DG2(i915))
+       struct drm_i915_private *i915 = gt->i915;
+
+       if (IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 70), IP_VER(12, 74)) || IS_DG2(i915))
                wa_mcr_write_clr_set(wal, RT_CTRL, STACKID_CTRL, STACKID_CTRL_512);
 
        /*
@@ -2994,6 +2854,22 @@ add_render_compute_tuning_settings(struct drm_i915_private *i915,
                wa_write_clr(wal, GEN8_GARBCNTL, GEN12_BUS_HASH_CTL_BIT_EXC);
 }
 
+static void ccs_engine_wa_mode(struct intel_engine_cs *engine, struct i915_wa_list *wal)
+{
+       struct intel_gt *gt = engine->gt;
+
+       if (!IS_DG2(gt->i915))
+               return;
+
+       /*
+        * Wa_14019159160: This workaround, along with others, leads to
+        * significant challenges in utilizing load balancing among the
+        * CCS slices. Consequently, an architectural decision has been
+        * made to completely disable automatic CCS load balancing.
+        */
+       wa_masked_en(wal, GEN12_RCU_MODE, XEHP_RCU_MODE_FIXED_SLICE_CCS_MODE);
+}
+
 /*
  * The workarounds in this function apply to shared registers in
  * the general render reset domain that aren't tied to a
@@ -3007,8 +2883,9 @@ static void
 general_render_compute_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
 {
        struct drm_i915_private *i915 = engine->i915;
+       struct intel_gt *gt = engine->gt;
 
-       add_render_compute_tuning_settings(i915, wal);
+       add_render_compute_tuning_settings(gt, wal);
 
        if (GRAPHICS_VER(i915) >= 11) {
                /* This is not a Wa (although referred to as
@@ -3029,13 +2906,18 @@ general_render_compute_wa_init(struct intel_engine_cs *engine, struct i915_wa_li
                                 GEN11_INDIRECT_STATE_BASE_ADDR_OVERRIDE);
        }
 
-       if (IS_MTL_GRAPHICS_STEP(i915, M, STEP_B0, STEP_FOREVER) ||
-           IS_MTL_GRAPHICS_STEP(i915, P, STEP_B0, STEP_FOREVER))
+       if (IS_GFX_GT_IP_STEP(gt, IP_VER(12, 70), STEP_B0, STEP_FOREVER) ||
+           IS_GFX_GT_IP_STEP(gt, IP_VER(12, 71), STEP_B0, STEP_FOREVER) ||
+           IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 74), IP_VER(12, 74))) {
                /* Wa_14017856879 */
                wa_mcr_masked_en(wal, GEN9_ROW_CHICKEN3, MTL_DISABLE_FIX_FOR_EOT_FLUSH);
 
-       if (IS_MTL_GRAPHICS_STEP(i915, M, STEP_A0, STEP_B0) ||
-           IS_MTL_GRAPHICS_STEP(i915, P, STEP_A0, STEP_B0))
+               /* Wa_14020495402 */
+               wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN2, XELPG_DISABLE_TDL_SVHS_GATING);
+       }
+
+       if (IS_GFX_GT_IP_STEP(gt, IP_VER(12, 70), STEP_A0, STEP_B0) ||
+           IS_GFX_GT_IP_STEP(gt, IP_VER(12, 71), STEP_A0, STEP_B0))
                /*
                 * Wa_14017066071
                 * Wa_14017654203
@@ -3043,37 +2925,46 @@ general_render_compute_wa_init(struct intel_engine_cs *engine, struct i915_wa_li
                wa_mcr_masked_en(wal, GEN10_SAMPLER_MODE,
                                 MTL_DISABLE_SAMPLER_SC_OOO);
 
-       if (IS_MTL_GRAPHICS_STEP(i915, P, STEP_A0, STEP_B0))
+       if (IS_GFX_GT_IP_STEP(gt, IP_VER(12, 71), STEP_A0, STEP_B0))
                /* Wa_22015279794 */
                wa_mcr_masked_en(wal, GEN10_CACHE_MODE_SS,
                                 DISABLE_PREFETCH_INTO_IC);
 
-       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)) {
+       if (IS_GFX_GT_IP_STEP(gt, IP_VER(12, 70), STEP_A0, STEP_B0) ||
+           IS_GFX_GT_IP_STEP(gt, IP_VER(12, 71), STEP_A0, STEP_B0) ||
+           IS_DG2(i915)) {
                /* Wa_22013037850 */
                wa_mcr_write_or(wal, LSC_CHICKEN_BIT_0_UDW,
                                DISABLE_128B_EVICTION_COMMAND_UDW);
+
+               /* Wa_18017747507 */
+               wa_masked_en(wal, VFG_PREEMPTION_CHICKEN, POLYGON_TRIFAN_LINELOOP_DISABLE);
        }
 
-       if (IS_MTL_GRAPHICS_STEP(i915, M, STEP_A0, STEP_B0) ||
-           IS_MTL_GRAPHICS_STEP(i915, P, STEP_A0, STEP_B0) ||
+       if (IS_GFX_GT_IP_STEP(gt, IP_VER(12, 70), STEP_A0, STEP_B0) ||
+           IS_GFX_GT_IP_STEP(gt, IP_VER(12, 71), 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_PONTEVECCHIO(i915) || IS_DG2(i915))
+               /* Wa_14015227452:dg2,pvc */
+               wa_mcr_masked_en(wal, GEN9_ROW_CHICKEN4, XEHP_DIS_BBL_SYSPIPE);
+
+       if (IS_DG2(i915)) {
+               /*
+                * Wa_16011620976:dg2_g11
+                * Wa_22015475538:dg2
+                */
+               wa_mcr_write_or(wal, LSC_CHICKEN_BIT_0_UDW, DIS_CHAIN_2XSIMD8);
+
+               /* Wa_18028616096 */
+               wa_mcr_write_or(wal, LSC_CHICKEN_BIT_0_UDW, UGM_FRAGMENT_THRESHOLD_TO_3);
        }
 
-       if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_B0, STEP_C0) ||
-           IS_DG2_G11(i915)) {
+       if (IS_DG2_G11(i915)) {
                /*
                 * Wa_22012826095:dg2
                 * Wa_22013059131:dg2
@@ -3085,18 +2976,18 @@ general_render_compute_wa_init(struct intel_engine_cs *engine, struct i915_wa_li
                /* 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
+                * Wa_22012654132
                 *
-                * LSC_CHICKEN_BIT_0 always reads back as 0 is this stepping,
-                * so ignoring verification.
+                * 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, LSC_CHICKEN_BIT_0_UDW, 0,
-                          FORCE_SLM_FENCE_SCOPE_TO_TILE | FORCE_UGM_FENCE_SCOPE_TO_TILE,
-                          0, false);
+               wa_mcr_add(wal, GEN10_CACHE_MODE_SS, 0,
+                          _MASKED_BIT_ENABLE(ENABLE_PREFETCH_INTO_IC),
+                          0 /* write-only, so skip validation */,
+                          true);
        }
 
        if (IS_XEHPSDV(i915)) {
@@ -3114,35 +3005,6 @@ general_render_compute_wa_init(struct intel_engine_cs *engine, struct i915_wa_li
                wa_mcr_masked_en(wal, GEN8_HALF_SLICE_CHICKEN1,
                                 GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE);
        }
-
-       if (IS_DG2(i915) || IS_PONTEVECCHIO(i915)) {
-               /* Wa_14015227452:dg2,pvc */
-               wa_mcr_masked_en(wal, GEN9_ROW_CHICKEN4, XEHP_DIS_BBL_SYSPIPE);
-
-               /* Wa_16015675438:dg2,pvc */
-               wa_masked_en(wal, FF_SLICE_CS_CHICKEN2, GEN12_PERF_FIX_BALANCING_CFE_DISABLE);
-       }
-
-       if (IS_DG2(i915)) {
-               /*
-                * Wa_16011620976:dg2_g11
-                * Wa_22015475538:dg2
-                */
-               wa_mcr_write_or(wal, LSC_CHICKEN_BIT_0_UDW, DIS_CHAIN_2XSIMD8);
-       }
-
-       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
@@ -3158,8 +3020,10 @@ engine_init_workarounds(struct intel_engine_cs *engine, struct i915_wa_list *wal
         * to a single RCS/CCS engine's workaround list since
         * they're reset as part of the general render domain reset.
         */
-       if (engine->flags & I915_ENGINE_FIRST_RENDER_COMPUTE)
+       if (engine->flags & I915_ENGINE_FIRST_RENDER_COMPUTE) {
                general_render_compute_wa_init(engine, wal);
+               ccs_engine_wa_mode(engine, wal);
+       }
 
        if (engine->class == COMPUTE_CLASS)
                ccs_engine_wa_init(engine, wal);