drm/i915/selftests: Break out of the lrc layout test after register mismatch
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 6 Jan 2021 12:39:36 +0000 (12:39 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 6 Jan 2021 15:37:19 +0000 (15:37 +0000)
AFter detecting a register mismatch between the protocontext and the
image generated by HW, immediately break out of the double loop.
Otherwise we end up with a second confusing error message.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210106123939.18435-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/selftest_lrc.c

index 3485cb7..920979a 100644 (file)
@@ -164,7 +164,7 @@ static int live_lrc_layout(void *arg)
 
                dw = 0;
                do {
-                       u32 lri = hw[dw];
+                       u32 lri = READ_ONCE(hw[dw]);
 
                        if (lri == 0) {
                                dw++;
@@ -197,9 +197,11 @@ static int live_lrc_layout(void *arg)
                        dw++;
 
                        while (lri) {
-                               if (hw[dw] != lrc[dw]) {
+                               u32 offset = READ_ONCE(hw[dw]);
+
+                               if (offset != lrc[dw]) {
                                        pr_err("%s: Different registers found at dword %d, expected %x, found %x\n",
-                                              engine->name, dw, hw[dw], lrc[dw]);
+                                              engine->name, dw, offset, lrc[dw]);
                                        err = -EINVAL;
                                        break;
                                }
@@ -211,7 +213,7 @@ static int live_lrc_layout(void *arg)
                                dw += 2;
                                lri -= 2;
                        }
-               } while ((lrc[dw] & ~BIT(0)) != MI_BATCH_BUFFER_END);
+               } while (!err && (lrc[dw] & ~BIT(0)) != MI_BATCH_BUFFER_END);
 
                if (err) {
                        pr_info("%s: HW register image:\n", engine->name);