drm/i915/mtl: Resize noa_wait BO size to save restore GPR regs
authorUmesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Mon, 12 Dec 2022 22:08:59 +0000 (14:08 -0800)
committerJohn Harrison <John.C.Harrison@Intel.com>
Sat, 17 Dec 2022 08:54:46 +0000 (00:54 -0800)
On MTL, gt->scratch was using stolen lmem. An MI_SRM to stolen lmem
caused a hang that was attributed to saving and restoring the GPR
registers used for noa_wait.

Add an additional page in noa_wait BO to save/restore GPR registers for
the noa_wait logic.

Signed-off-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221212220902.1819159-2-umesh.nerlige.ramappa@intel.com
drivers/gpu/drm/i915/gt/intel_gt_types.h
drivers/gpu/drm/i915/i915_perf.c

index 0b6da2aa9718112f6a4ba76b2b7cecef5d143696..f08c2556aa258e8a83eec0aafc9f1654710ea968 100644 (file)
@@ -304,12 +304,6 @@ enum intel_gt_scratch_field {
 
        /* 8 bytes */
        INTEL_GT_SCRATCH_FIELD_COHERENTL3_WA = 256,
-
-       /* 6 * 8 bytes */
-       INTEL_GT_SCRATCH_FIELD_PERF_CS_GPR = 2048,
-
-       /* 4 bytes */
-       INTEL_GT_SCRATCH_FIELD_PERF_PREDICATE_RESULT_1 = 2096,
 };
 
 #endif /* __INTEL_GT_TYPES_H__ */
index 963175fa6ab1e323c065a55e3b08099171a7f003..cdd66f21c3ba6237b8d4b793b46302e86be7643a 100644 (file)
@@ -1845,8 +1845,7 @@ static u32 *save_restore_register(struct i915_perf_stream *stream, u32 *cs,
        for (d = 0; d < dword_count; d++) {
                *cs++ = cmd;
                *cs++ = i915_mmio_reg_offset(reg) + 4 * d;
-               *cs++ = intel_gt_scratch_offset(stream->engine->gt,
-                                               offset) + 4 * d;
+               *cs++ = i915_ggtt_offset(stream->noa_wait) + offset + 4 * d;
                *cs++ = 0;
        }
 
@@ -1879,7 +1878,13 @@ static int alloc_noa_wait(struct i915_perf_stream *stream)
                                          MI_PREDICATE_RESULT_2_ENGINE(base) :
                                          MI_PREDICATE_RESULT_1(RENDER_RING_BASE);
 
-       bo = i915_gem_object_create_internal(i915, 4096);
+       /*
+        * gt->scratch was being used to save/restore the GPR registers, but on
+        * MTL the scratch uses stolen lmem. An MI_SRM to this memory region
+        * causes an engine hang. Instead allocate an additional page here to
+        * save/restore GPR registers
+        */
+       bo = i915_gem_object_create_internal(i915, 8192);
        if (IS_ERR(bo)) {
                drm_err(&i915->drm,
                        "Failed to allocate NOA wait batchbuffer\n");
@@ -1913,14 +1918,19 @@ retry:
                goto err_unpin;
        }
 
+       stream->noa_wait = vma;
+
+#define GPR_SAVE_OFFSET 4096
+#define PREDICATE_SAVE_OFFSET 4160
+
        /* Save registers. */
        for (i = 0; i < N_CS_GPR; i++)
                cs = save_restore_register(
                        stream, cs, true /* save */, CS_GPR(i),
-                       INTEL_GT_SCRATCH_FIELD_PERF_CS_GPR + 8 * i, 2);
+                       GPR_SAVE_OFFSET + 8 * i, 2);
        cs = save_restore_register(
                stream, cs, true /* save */, mi_predicate_result,
-               INTEL_GT_SCRATCH_FIELD_PERF_PREDICATE_RESULT_1, 1);
+               PREDICATE_SAVE_OFFSET, 1);
 
        /* First timestamp snapshot location. */
        ts0 = cs;
@@ -2036,10 +2046,10 @@ retry:
        for (i = 0; i < N_CS_GPR; i++)
                cs = save_restore_register(
                        stream, cs, false /* restore */, CS_GPR(i),
-                       INTEL_GT_SCRATCH_FIELD_PERF_CS_GPR + 8 * i, 2);
+                       GPR_SAVE_OFFSET + 8 * i, 2);
        cs = save_restore_register(
                stream, cs, false /* restore */, mi_predicate_result,
-               INTEL_GT_SCRATCH_FIELD_PERF_PREDICATE_RESULT_1, 1);
+               PREDICATE_SAVE_OFFSET, 1);
 
        /* And return to the ring. */
        *cs++ = MI_BATCH_BUFFER_END;
@@ -2049,7 +2059,6 @@ retry:
        i915_gem_object_flush_map(bo);
        __i915_gem_object_release_map(bo);
 
-       stream->noa_wait = vma;
        goto out_ww;
 
 err_unpin: