CTX_CS_INDIRECT_CTX_OFFSET default value is not retrieved from the GPU
by inhibit+context save mechanism since it is not part of the Engine
Context. Thus, at restore, 0x0 is programed back to the GPU, which is
an invalid value according to the PRM.

This causes sporadic hangs on Alder Lake when executing test
IntelAngleEnd2EndTestCases (error VK_DEVICE_LOST).

Fix it by partially reverting commit c9dfd66cb91e ("drm/xe/lrc: Allow
INDIRECT_CTX for more engine classes"). Re-add the programming of
CTX_CS_INDIRECT_CTX_OFFSET.

Fixes: c9dfd66cb91e ("drm/xe/lrc: Allow INDIRECT_CTX for more engine classes")
Suggested-by: Tvrtko Ursulin <[email protected]>
Signed-off-by: Helen Koike <[email protected]>
---
 drivers/gpu/drm/xe/regs/xe_lrc_layout.h | 3 +++
 drivers/gpu/drm/xe/xe_lrc.c             | 7 +++----
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/xe/regs/xe_lrc_layout.h 
b/drivers/gpu/drm/xe/regs/xe_lrc_layout.h
index 4ab86fc369fd..e4c7c3549735 100644
--- a/drivers/gpu/drm/xe/regs/xe_lrc_layout.h
+++ b/drivers/gpu/drm/xe/regs/xe_lrc_layout.h
@@ -43,4 +43,7 @@
 #define INDIRECT_CTX_RING_START_UDW    (0x08 + 1)
 #define INDIRECT_CTX_RING_CTL          (0x0a + 1)
 
+#define CTX_INDIRECT_CTX_OFFSET_MASK   REG_GENMASK(15, 6)
+#define CTX_INDIRECT_CTX_OFFSET_DEFAULT        
REG_FIELD_PREP(CTX_INDIRECT_CTX_OFFSET_MASK, 0xd)
+
 #endif
diff --git a/drivers/gpu/drm/xe/xe_lrc.c b/drivers/gpu/drm/xe/xe_lrc.c
index 35b4e8289b5f..1a0e39089a67 100644
--- a/drivers/gpu/drm/xe/xe_lrc.c
+++ b/drivers/gpu/drm/xe/xe_lrc.c
@@ -1449,15 +1449,14 @@ setup_indirect_ctx(struct xe_lrc *lrc, struct 
xe_hw_engine *hwe)
        finish_bo(&state);
        kfree(state.buffer);
 
-       /*
-        * Enable INDIRECT_CTX leaving INDIRECT_CTX_OFFSET at its default: it
-        * varies per engine class, but the default is good enough
-        */
        xe_lrc_write_ctx_reg(lrc,
                             CTX_CS_INDIRECT_CTX,
                             (xe_bo_ggtt_addr(lrc->bo) + state.offset) |
                             /* Size in CLs. */
                             (state.written * sizeof(u32) / 64));
+       xe_lrc_write_ctx_reg(lrc,
+                            CTX_CS_INDIRECT_CTX_OFFSET,
+                            CTX_INDIRECT_CTX_OFFSET_DEFAULT);
 
        return 0;
 }
-- 
2.54.0

Reply via email to