From: Akeem G Abodunrin <akeem.g.abodun...@intel.com>

When bit 19 of MI_LOAD_REGISTER_IMM instruction opcode is set on devices
of tgl+, HW does not care about certain register address offsets, but
instead check the following for valid address ranges on specific engines:
        RCS && CCS: BITS(0 - 10)
        BCS: BITS(0 - 11)
        VECS && VCS: BITS(0 - 13)
Also, tgl+ now support relative addressing for BCS engine - So, this
patch fixes issue with live_gt_lrc selftest that is failing where there is
mismatch between LRC register layout generated during init and HW
default register offsets.

Bspec: 45728

Cc: Kumar Valsan, Prathap <prathap.kumar.val...@intel.com>
Signed-off-by: Akeem G Abodunrin <akeem.g.abodun...@intel.com>
Signed-off-by: Ramalingam C <ramalinga...@intel.com>
---
 drivers/gpu/drm/i915/gt/selftest_lrc.c | 36 +++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gt/selftest_lrc.c 
b/drivers/gpu/drm/i915/gt/selftest_lrc.c
index 63fd508fea49..5b2a205ab372 100644
--- a/drivers/gpu/drm/i915/gt/selftest_lrc.c
+++ b/drivers/gpu/drm/i915/gt/selftest_lrc.c
@@ -131,6 +131,27 @@ static int context_flush(struct intel_context *ce, long 
timeout)
        return err;
 }
 
+static int get_lri_mask(struct intel_engine_cs *engine, u32 lri)
+{
+       if ((lri & MI_LRI_LRM_CS_MMIO) == 0)
+               return ~0u;
+
+       if (GRAPHICS_VER(engine->i915) < 12)
+               return 0xfff;
+
+       switch (engine->class) {
+       default:
+       case RENDER_CLASS:
+       case COMPUTE_CLASS:
+               return 0x07ff;
+       case COPY_ENGINE_CLASS:
+               return 0x0fff;
+       case VIDEO_DECODE_CLASS:
+       case VIDEO_ENHANCEMENT_CLASS:
+               return 0x3fff;
+       }
+}
+
 static int live_lrc_layout(void *arg)
 {
        struct intel_gt *gt = arg;
@@ -170,6 +191,7 @@ static int live_lrc_layout(void *arg)
                dw = 0;
                do {
                        u32 lri = READ_ONCE(hw[dw]);
+                       u32 lri_mask;
 
                        if (lri == 0) {
                                dw++;
@@ -197,6 +219,18 @@ static int live_lrc_layout(void *arg)
                                break;
                        }
 
+                       /*
+                        * When bit 19 of MI_LOAD_REGISTER_IMM instruction
+                        * opcode is set on Gen12+ devices, HW does not
+                        * care about certain register address offsets, and
+                        * instead check the following for valid address
+                        * ranges on specific engines:
+                        * RCS && CCS: BITS(0 - 10)
+                        * BCS: BITS(0 - 11)
+                        * VECS && VCS: BITS(0 - 13)
+                        */
+                       lri_mask = get_lri_mask(engine, lri);
+
                        lri &= 0x7f;
                        lri++;
                        dw++;
@@ -204,7 +238,7 @@ static int live_lrc_layout(void *arg)
                        while (lri) {
                                u32 offset = READ_ONCE(hw[dw]);
 
-                               if (offset != lrc[dw]) {
+                               if ((offset ^ lrc[dw]) & lri_mask) {
                                        pr_err("%s: Different registers found 
at dword %d, expected %x, found %x\n",
                                               engine->name, dw, offset, 
lrc[dw]);
                                        err = -EINVAL;
-- 
2.20.1

Reply via email to