drm/i915/xehp: Enable ccs/dual-ctx in RCU_MODE
authorMatt Roper <matthew.d.roper@intel.com>
Wed, 2 Mar 2022 00:15:54 +0000 (16:15 -0800)
committerMatt Roper <matthew.d.roper@intel.com>
Wed, 2 Mar 2022 14:45:21 +0000 (06:45 -0800)
We have to specify in the Render Control Unit Mode register
when CCS is enabled.

v2:
 - Move RCU_MODE programming to a helper function.  (Tvrtko)
 - Clean up and clarify comments.  (Tvrtko)
 - Add RCU_MODE to the GuC save/restore list.  (Daniele)
v3:
 - Move this patch before the GuC ADS update to enable compute engines;
   the definition of RCU_MODE and its insertion into the save/restore
   list moves to this patch.  (Daniele)
v4:
 - Call xehp_enable_ccs_engines() directly in guc_resume() and
   execlists_resume() rather than adding an extra layer of wrapping to
   the engine->resume() vfunc.  (Umesh)

Bspec: 46034
Original-author: Michel Thierry
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Cc: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
Cc: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Signed-off-by: Aravind Iddamsetty <aravind.iddamsetty@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220302001554.1836066-1-matthew.d.roper@intel.com
drivers/gpu/drm/i915/gt/intel_engine.h
drivers/gpu/drm/i915/gt/intel_engine_cs.c
drivers/gpu/drm/i915/gt/intel_execlists_submission.c
drivers/gpu/drm/i915/gt/intel_gt_regs.h
drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c
drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c

index be4b1e6..1c0ab05 100644 (file)
@@ -265,6 +265,8 @@ intel_engine_create_pinned_context(struct intel_engine_cs *engine,
 
 void intel_engine_destroy_pinned_context(struct intel_context *ce);
 
+void xehp_enable_ccs_engines(struct intel_engine_cs *engine);
+
 #define ENGINE_PHYSICAL        0
 #define ENGINE_MOCK    1
 #define ENGINE_VIRTUAL 2
index 2136c56..92f4cf9 100644 (file)
@@ -2070,6 +2070,23 @@ intel_engine_execlist_find_hung_request(struct intel_engine_cs *engine)
        return active;
 }
 
+void xehp_enable_ccs_engines(struct intel_engine_cs *engine)
+{
+       /*
+        * If there are any non-fused-off CCS engines, we need to enable CCS
+        * support in the RCU_MODE register.  This only needs to be done once,
+        * so for simplicity we'll take care of this in the RCS engine's
+        * resume handler; since the RCS and all CCS engines belong to the
+        * same reset domain and are reset together, this will also take care
+        * of re-applying the setting after i915-triggered resets.
+        */
+       if (!CCS_MASK(engine->gt))
+               return;
+
+       intel_uncore_write(engine->uncore, GEN12_RCU_MODE,
+                          _MASKED_BIT_ENABLE(GEN12_RCU_MODE_CCS_ENABLE));
+}
+
 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
 #include "mock_engine.c"
 #include "selftest_engine.c"
index c8407cc..3e0c81f 100644 (file)
@@ -2911,6 +2911,9 @@ static int execlists_resume(struct intel_engine_cs *engine)
 
        enable_execlists(engine);
 
+       if (engine->class == RENDER_CLASS)
+               xehp_enable_ccs_engines(engine);
+
        return 0;
 }
 
index 84f1897..e629443 100644 (file)
 #define   ECOBITS_PPGTT_CACHE64B               (3 << 8)
 #define   ECOBITS_PPGTT_CACHE4B                        (0 << 8)
 
+#define GEN12_RCU_MODE                         _MMIO(0x14800)
+#define   GEN12_RCU_MODE_CCS_ENABLE            REG_BIT(0)
+
 #define CHV_FUSE_GT                            _MMIO(VLV_DISPLAY_BASE + 0x2168)
 #define   CHV_FGT_DISABLE_SS0                  (1 << 10)
 #define   CHV_FGT_DISABLE_SS1                  (1 << 11)
index 847e003..29fbe46 100644 (file)
@@ -335,6 +335,10 @@ static int guc_mmio_regset_init(struct temp_regset *regset,
        ret |= GUC_MMIO_REG_ADD(regset, RING_HWS_PGA(base), false);
        ret |= GUC_MMIO_REG_ADD(regset, RING_IMR(base), false);
 
+       if (engine->class == RENDER_CLASS &&
+           CCS_MASK(engine->gt))
+               ret |= GUC_MMIO_REG_ADD(regset, GEN12_RCU_MODE, true);
+
        for (i = 0, wa = wal->list; i < wal->count; i++, wa++)
                ret |= GUC_MMIO_REG_ADD(regset, wa->reg, wa->masked_reg);
 
index a5c17bb..1ce7e04 100644 (file)
@@ -3595,6 +3595,9 @@ static int guc_resume(struct intel_engine_cs *engine)
        setup_hwsp(engine);
        start_engine(engine);
 
+       if (engine->class == RENDER_CLASS)
+               xehp_enable_ccs_engines(engine);
+
        return 0;
 }