[PATCH] findreg

Chris Wilson chris at chris-wilson.co.uk
Fri Jul 24 10:54:26 UTC 2020


---
 drivers/gpu/drm/i915/gt/selftest_lrc.c | 60 ++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)

diff --git a/drivers/gpu/drm/i915/gt/selftest_lrc.c b/drivers/gpu/drm/i915/gt/selftest_lrc.c
index 3fc5de961280..670324d80a53 100644
--- a/drivers/gpu/drm/i915/gt/selftest_lrc.c
+++ b/drivers/gpu/drm/i915/gt/selftest_lrc.c
@@ -6452,9 +6452,69 @@ static int live_pphwsp_runtime(void *arg)
 	return err;
 }
 
+static int live_lrc_findreg(void *arg)
+{
+	struct intel_gt *gt = arg;
+	struct intel_engine_cs *engine;
+	enum intel_engine_id id;
+
+	for_each_engine(engine, gt, id) {
+		const u32 target = i915_mmio_reg_offset(RING_FORCE_TO_NONPRIV(engine->mmio_base, 0));
+		unsigned int dw, end;
+		u32 *hw;
+
+		if (!engine->default_state)
+			continue;
+
+		hw = shmem_pin_map(engine->default_state);
+		if (IS_ERR(hw))
+			return PTR_ERR(hw);
+		hw += LRC_STATE_OFFSET / sizeof(*hw);
+
+		end = (engine->context_size - LRC_STATE_OFFSET) / sizeof(*hw);
+		dw = 0;
+		do {
+			u32 lri = hw[dw];
+
+			if (lri == 0) {
+				dw++;
+				continue;
+			}
+
+			if ((lri & GENMASK(31, 23)) != MI_INSTR(0x22, 0)) {
+				pr_info("%s: Expected LRI command at dword %d, found %08x\n",
+				       engine->name, dw, lri);
+				break;
+			}
+
+			lri &= 0x7f;
+			lri++;
+			dw++;
+
+			while (lri) {
+				if (hw[dw] == target) {
+					pr_info("Found %x at context image offset 0x%x\n",
+						target, dw);
+					goto end;
+				}
+
+				dw += 2;
+				lri -= 2;
+			}
+		} while (dw < end);
+
+end:
+		hw -= LRC_STATE_OFFSET / sizeof(*hw);
+		shmem_unpin_map(engine->default_state, hw);
+	}
+
+	return 0;
+}
+
 int intel_lrc_live_selftests(struct drm_i915_private *i915)
 {
 	static const struct i915_subtest tests[] = {
+		SUBTEST(live_lrc_findreg),
 		SUBTEST(live_lrc_layout),
 		SUBTEST(live_lrc_fixed),
 		SUBTEST(live_lrc_state),
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list