drm/i915/selftests: fix a couple IS_ERR() vs NULL tests
[platform/kernel/linux-starfive.git] / drivers / gpu / drm / i915 / gt / selftest_lrc.c
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2018 Intel Corporation
4  */
5
6 #include <linux/prime_numbers.h>
7
8 #include "gem/i915_gem_internal.h"
9
10 #include "i915_selftest.h"
11 #include "intel_engine_heartbeat.h"
12 #include "intel_engine_pm.h"
13 #include "intel_reset.h"
14 #include "intel_ring.h"
15 #include "selftest_engine_heartbeat.h"
16 #include "selftests/i915_random.h"
17 #include "selftests/igt_flush_test.h"
18 #include "selftests/igt_live_test.h"
19 #include "selftests/igt_spinner.h"
20 #include "selftests/lib_sw_fence.h"
21 #include "shmem_utils.h"
22
23 #include "gem/selftests/igt_gem_utils.h"
24 #include "gem/selftests/mock_context.h"
25
26 #define CS_GPR(engine, n) ((engine)->mmio_base + 0x600 + (n) * 4)
27 #define NUM_GPR 16
28 #define NUM_GPR_DW (NUM_GPR * 2) /* each GPR is 2 dwords */
29
30 static struct i915_vma *create_scratch(struct intel_gt *gt)
31 {
32         return __vm_create_scratch_for_read_pinned(&gt->ggtt->vm, PAGE_SIZE);
33 }
34
35 static bool is_active(struct i915_request *rq)
36 {
37         if (i915_request_is_active(rq))
38                 return true;
39
40         if (i915_request_on_hold(rq))
41                 return true;
42
43         if (i915_request_has_initial_breadcrumb(rq) && i915_request_started(rq))
44                 return true;
45
46         return false;
47 }
48
49 static int wait_for_submit(struct intel_engine_cs *engine,
50                            struct i915_request *rq,
51                            unsigned long timeout)
52 {
53         /* Ignore our own attempts to suppress excess tasklets */
54         tasklet_hi_schedule(&engine->sched_engine->tasklet);
55
56         timeout += jiffies;
57         do {
58                 bool done = time_after(jiffies, timeout);
59
60                 if (i915_request_completed(rq)) /* that was quick! */
61                         return 0;
62
63                 /* Wait until the HW has acknowleged the submission (or err) */
64                 intel_engine_flush_submission(engine);
65                 if (!READ_ONCE(engine->execlists.pending[0]) && is_active(rq))
66                         return 0;
67
68                 if (done)
69                         return -ETIME;
70
71                 cond_resched();
72         } while (1);
73 }
74
75 static int emit_semaphore_signal(struct intel_context *ce, void *slot)
76 {
77         const u32 offset =
78                 i915_ggtt_offset(ce->engine->status_page.vma) +
79                 offset_in_page(slot);
80         struct i915_request *rq;
81         u32 *cs;
82
83         rq = intel_context_create_request(ce);
84         if (IS_ERR(rq))
85                 return PTR_ERR(rq);
86
87         cs = intel_ring_begin(rq, 4);
88         if (IS_ERR(cs)) {
89                 i915_request_add(rq);
90                 return PTR_ERR(cs);
91         }
92
93         *cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
94         *cs++ = offset;
95         *cs++ = 0;
96         *cs++ = 1;
97
98         intel_ring_advance(rq, cs);
99
100         rq->sched.attr.priority = I915_PRIORITY_BARRIER;
101         i915_request_add(rq);
102         return 0;
103 }
104
105 static int context_flush(struct intel_context *ce, long timeout)
106 {
107         struct i915_request *rq;
108         struct dma_fence *fence;
109         int err = 0;
110
111         rq = intel_engine_create_kernel_request(ce->engine);
112         if (IS_ERR(rq))
113                 return PTR_ERR(rq);
114
115         fence = i915_active_fence_get(&ce->timeline->last_request);
116         if (fence) {
117                 i915_request_await_dma_fence(rq, fence);
118                 dma_fence_put(fence);
119         }
120
121         rq = i915_request_get(rq);
122         i915_request_add(rq);
123         if (i915_request_wait(rq, 0, timeout) < 0)
124                 err = -ETIME;
125         i915_request_put(rq);
126
127         rmb(); /* We know the request is written, make sure all state is too! */
128         return err;
129 }
130
131 static int get_lri_mask(struct intel_engine_cs *engine, u32 lri)
132 {
133         if ((lri & MI_LRI_LRM_CS_MMIO) == 0)
134                 return ~0u;
135
136         if (GRAPHICS_VER(engine->i915) < 12)
137                 return 0xfff;
138
139         switch (engine->class) {
140         default:
141         case RENDER_CLASS:
142         case COMPUTE_CLASS:
143                 return 0x07ff;
144         case COPY_ENGINE_CLASS:
145                 return 0x0fff;
146         case VIDEO_DECODE_CLASS:
147         case VIDEO_ENHANCEMENT_CLASS:
148                 return 0x3fff;
149         }
150 }
151
152 static int live_lrc_layout(void *arg)
153 {
154         struct intel_gt *gt = arg;
155         struct intel_engine_cs *engine;
156         enum intel_engine_id id;
157         u32 *lrc;
158         int err;
159
160         /*
161          * Check the registers offsets we use to create the initial reg state
162          * match the layout saved by HW.
163          */
164
165         lrc = (u32 *)__get_free_page(GFP_KERNEL); /* requires page alignment */
166         if (!lrc)
167                 return -ENOMEM;
168         GEM_BUG_ON(offset_in_page(lrc));
169
170         err = 0;
171         for_each_engine(engine, gt, id) {
172                 u32 *hw;
173                 int dw;
174
175                 if (!engine->default_state)
176                         continue;
177
178                 hw = shmem_pin_map(engine->default_state);
179                 if (!hw) {
180                         err = -ENOMEM;
181                         break;
182                 }
183                 hw += LRC_STATE_OFFSET / sizeof(*hw);
184
185                 __lrc_init_regs(memset(lrc, POISON_INUSE, PAGE_SIZE),
186                                 engine->kernel_context, engine, true);
187
188                 dw = 0;
189                 do {
190                         u32 lri = READ_ONCE(hw[dw]);
191                         u32 lri_mask;
192
193                         if (lri == 0) {
194                                 dw++;
195                                 continue;
196                         }
197
198                         if (lrc[dw] == 0) {
199                                 pr_debug("%s: skipped instruction %x at dword %d\n",
200                                          engine->name, lri, dw);
201                                 dw++;
202                                 continue;
203                         }
204
205                         if ((lri & GENMASK(31, 23)) != MI_INSTR(0x22, 0)) {
206                                 pr_err("%s: Expected LRI command at dword %d, found %08x\n",
207                                        engine->name, dw, lri);
208                                 err = -EINVAL;
209                                 break;
210                         }
211
212                         if (lrc[dw] != lri) {
213                                 pr_err("%s: LRI command mismatch at dword %d, expected %08x found %08x\n",
214                                        engine->name, dw, lri, lrc[dw]);
215                                 err = -EINVAL;
216                                 break;
217                         }
218
219                         /*
220                          * When bit 19 of MI_LOAD_REGISTER_IMM instruction
221                          * opcode is set on Gen12+ devices, HW does not
222                          * care about certain register address offsets, and
223                          * instead check the following for valid address
224                          * ranges on specific engines:
225                          * RCS && CCS: BITS(0 - 10)
226                          * BCS: BITS(0 - 11)
227                          * VECS && VCS: BITS(0 - 13)
228                          */
229                         lri_mask = get_lri_mask(engine, lri);
230
231                         lri &= 0x7f;
232                         lri++;
233                         dw++;
234
235                         while (lri) {
236                                 u32 offset = READ_ONCE(hw[dw]);
237
238                                 if ((offset ^ lrc[dw]) & lri_mask) {
239                                         pr_err("%s: Different registers found at dword %d, expected %x, found %x\n",
240                                                engine->name, dw, offset, lrc[dw]);
241                                         err = -EINVAL;
242                                         break;
243                                 }
244
245                                 /*
246                                  * Skip over the actual register value as we
247                                  * expect that to differ.
248                                  */
249                                 dw += 2;
250                                 lri -= 2;
251                         }
252                 } while (!err && (lrc[dw] & ~BIT(0)) != MI_BATCH_BUFFER_END);
253
254                 if (err) {
255                         pr_info("%s: HW register image:\n", engine->name);
256                         igt_hexdump(hw, PAGE_SIZE);
257
258                         pr_info("%s: SW register image:\n", engine->name);
259                         igt_hexdump(lrc, PAGE_SIZE);
260                 }
261
262                 shmem_unpin_map(engine->default_state, hw);
263                 if (err)
264                         break;
265         }
266
267         free_page((unsigned long)lrc);
268         return err;
269 }
270
271 static int find_offset(const u32 *lri, u32 offset)
272 {
273         int i;
274
275         for (i = 0; i < PAGE_SIZE / sizeof(u32); i++)
276                 if (lri[i] == offset)
277                         return i;
278
279         return -1;
280 }
281
282 static int live_lrc_fixed(void *arg)
283 {
284         struct intel_gt *gt = arg;
285         struct intel_engine_cs *engine;
286         enum intel_engine_id id;
287         int err = 0;
288
289         /*
290          * Check the assumed register offsets match the actual locations in
291          * the context image.
292          */
293
294         for_each_engine(engine, gt, id) {
295                 const struct {
296                         u32 reg;
297                         u32 offset;
298                         const char *name;
299                 } tbl[] = {
300                         {
301                                 i915_mmio_reg_offset(RING_START(engine->mmio_base)),
302                                 CTX_RING_START - 1,
303                                 "RING_START"
304                         },
305                         {
306                                 i915_mmio_reg_offset(RING_CTL(engine->mmio_base)),
307                                 CTX_RING_CTL - 1,
308                                 "RING_CTL"
309                         },
310                         {
311                                 i915_mmio_reg_offset(RING_HEAD(engine->mmio_base)),
312                                 CTX_RING_HEAD - 1,
313                                 "RING_HEAD"
314                         },
315                         {
316                                 i915_mmio_reg_offset(RING_TAIL(engine->mmio_base)),
317                                 CTX_RING_TAIL - 1,
318                                 "RING_TAIL"
319                         },
320                         {
321                                 i915_mmio_reg_offset(RING_MI_MODE(engine->mmio_base)),
322                                 lrc_ring_mi_mode(engine),
323                                 "RING_MI_MODE"
324                         },
325                         {
326                                 i915_mmio_reg_offset(RING_BBSTATE(engine->mmio_base)),
327                                 CTX_BB_STATE - 1,
328                                 "BB_STATE"
329                         },
330                         {
331                                 i915_mmio_reg_offset(RING_BB_PER_CTX_PTR(engine->mmio_base)),
332                                 lrc_ring_wa_bb_per_ctx(engine),
333                                 "RING_BB_PER_CTX_PTR"
334                         },
335                         {
336                                 i915_mmio_reg_offset(RING_INDIRECT_CTX(engine->mmio_base)),
337                                 lrc_ring_indirect_ptr(engine),
338                                 "RING_INDIRECT_CTX_PTR"
339                         },
340                         {
341                                 i915_mmio_reg_offset(RING_INDIRECT_CTX_OFFSET(engine->mmio_base)),
342                                 lrc_ring_indirect_offset(engine),
343                                 "RING_INDIRECT_CTX_OFFSET"
344                         },
345                         {
346                                 i915_mmio_reg_offset(RING_CTX_TIMESTAMP(engine->mmio_base)),
347                                 CTX_TIMESTAMP - 1,
348                                 "RING_CTX_TIMESTAMP"
349                         },
350                         {
351                                 i915_mmio_reg_offset(GEN8_RING_CS_GPR(engine->mmio_base, 0)),
352                                 lrc_ring_gpr0(engine),
353                                 "RING_CS_GPR0"
354                         },
355                         {
356                                 i915_mmio_reg_offset(RING_CMD_BUF_CCTL(engine->mmio_base)),
357                                 lrc_ring_cmd_buf_cctl(engine),
358                                 "RING_CMD_BUF_CCTL"
359                         },
360                         { },
361                 }, *t;
362                 u32 *hw;
363
364                 if (!engine->default_state)
365                         continue;
366
367                 hw = shmem_pin_map(engine->default_state);
368                 if (!hw) {
369                         err = -ENOMEM;
370                         break;
371                 }
372                 hw += LRC_STATE_OFFSET / sizeof(*hw);
373
374                 for (t = tbl; t->name; t++) {
375                         int dw = find_offset(hw, t->reg);
376
377                         if (dw != t->offset) {
378                                 pr_err("%s: Offset for %s [0x%x] mismatch, found %x, expected %x\n",
379                                        engine->name,
380                                        t->name,
381                                        t->reg,
382                                        dw,
383                                        t->offset);
384                                 err = -EINVAL;
385                         }
386                 }
387
388                 shmem_unpin_map(engine->default_state, hw);
389         }
390
391         return err;
392 }
393
394 static int __live_lrc_state(struct intel_engine_cs *engine,
395                             struct i915_vma *scratch)
396 {
397         struct intel_context *ce;
398         struct i915_request *rq;
399         struct i915_gem_ww_ctx ww;
400         enum {
401                 RING_START_IDX = 0,
402                 RING_TAIL_IDX,
403                 MAX_IDX
404         };
405         u32 expected[MAX_IDX];
406         u32 *cs;
407         int err;
408         int n;
409
410         ce = intel_context_create(engine);
411         if (IS_ERR(ce))
412                 return PTR_ERR(ce);
413
414         i915_gem_ww_ctx_init(&ww, false);
415 retry:
416         err = i915_gem_object_lock(scratch->obj, &ww);
417         if (!err)
418                 err = intel_context_pin_ww(ce, &ww);
419         if (err)
420                 goto err_put;
421
422         rq = i915_request_create(ce);
423         if (IS_ERR(rq)) {
424                 err = PTR_ERR(rq);
425                 goto err_unpin;
426         }
427
428         cs = intel_ring_begin(rq, 4 * MAX_IDX);
429         if (IS_ERR(cs)) {
430                 err = PTR_ERR(cs);
431                 i915_request_add(rq);
432                 goto err_unpin;
433         }
434
435         *cs++ = MI_STORE_REGISTER_MEM_GEN8 | MI_USE_GGTT;
436         *cs++ = i915_mmio_reg_offset(RING_START(engine->mmio_base));
437         *cs++ = i915_ggtt_offset(scratch) + RING_START_IDX * sizeof(u32);
438         *cs++ = 0;
439
440         expected[RING_START_IDX] = i915_ggtt_offset(ce->ring->vma);
441
442         *cs++ = MI_STORE_REGISTER_MEM_GEN8 | MI_USE_GGTT;
443         *cs++ = i915_mmio_reg_offset(RING_TAIL(engine->mmio_base));
444         *cs++ = i915_ggtt_offset(scratch) + RING_TAIL_IDX * sizeof(u32);
445         *cs++ = 0;
446
447         err = i915_request_await_object(rq, scratch->obj, true);
448         if (!err)
449                 err = i915_vma_move_to_active(scratch, rq, EXEC_OBJECT_WRITE);
450
451         i915_request_get(rq);
452         i915_request_add(rq);
453         if (err)
454                 goto err_rq;
455
456         intel_engine_flush_submission(engine);
457         expected[RING_TAIL_IDX] = ce->ring->tail;
458
459         if (i915_request_wait(rq, 0, HZ / 5) < 0) {
460                 err = -ETIME;
461                 goto err_rq;
462         }
463
464         cs = i915_gem_object_pin_map(scratch->obj, I915_MAP_WB);
465         if (IS_ERR(cs)) {
466                 err = PTR_ERR(cs);
467                 goto err_rq;
468         }
469
470         for (n = 0; n < MAX_IDX; n++) {
471                 if (cs[n] != expected[n]) {
472                         pr_err("%s: Stored register[%d] value[0x%x] did not match expected[0x%x]\n",
473                                engine->name, n, cs[n], expected[n]);
474                         err = -EINVAL;
475                         break;
476                 }
477         }
478
479         i915_gem_object_unpin_map(scratch->obj);
480
481 err_rq:
482         i915_request_put(rq);
483 err_unpin:
484         intel_context_unpin(ce);
485 err_put:
486         if (err == -EDEADLK) {
487                 err = i915_gem_ww_ctx_backoff(&ww);
488                 if (!err)
489                         goto retry;
490         }
491         i915_gem_ww_ctx_fini(&ww);
492         intel_context_put(ce);
493         return err;
494 }
495
496 static int live_lrc_state(void *arg)
497 {
498         struct intel_gt *gt = arg;
499         struct intel_engine_cs *engine;
500         struct i915_vma *scratch;
501         enum intel_engine_id id;
502         int err = 0;
503
504         /*
505          * Check the live register state matches what we expect for this
506          * intel_context.
507          */
508
509         scratch = create_scratch(gt);
510         if (IS_ERR(scratch))
511                 return PTR_ERR(scratch);
512
513         for_each_engine(engine, gt, id) {
514                 err = __live_lrc_state(engine, scratch);
515                 if (err)
516                         break;
517         }
518
519         if (igt_flush_test(gt->i915))
520                 err = -EIO;
521
522         i915_vma_unpin_and_release(&scratch, 0);
523         return err;
524 }
525
526 static int gpr_make_dirty(struct intel_context *ce)
527 {
528         struct i915_request *rq;
529         u32 *cs;
530         int n;
531
532         rq = intel_context_create_request(ce);
533         if (IS_ERR(rq))
534                 return PTR_ERR(rq);
535
536         cs = intel_ring_begin(rq, 2 * NUM_GPR_DW + 2);
537         if (IS_ERR(cs)) {
538                 i915_request_add(rq);
539                 return PTR_ERR(cs);
540         }
541
542         *cs++ = MI_LOAD_REGISTER_IMM(NUM_GPR_DW);
543         for (n = 0; n < NUM_GPR_DW; n++) {
544                 *cs++ = CS_GPR(ce->engine, n);
545                 *cs++ = STACK_MAGIC;
546         }
547         *cs++ = MI_NOOP;
548
549         intel_ring_advance(rq, cs);
550
551         rq->sched.attr.priority = I915_PRIORITY_BARRIER;
552         i915_request_add(rq);
553
554         return 0;
555 }
556
557 static struct i915_request *
558 __gpr_read(struct intel_context *ce, struct i915_vma *scratch, u32 *slot)
559 {
560         const u32 offset =
561                 i915_ggtt_offset(ce->engine->status_page.vma) +
562                 offset_in_page(slot);
563         struct i915_request *rq;
564         u32 *cs;
565         int err;
566         int n;
567
568         rq = intel_context_create_request(ce);
569         if (IS_ERR(rq))
570                 return rq;
571
572         cs = intel_ring_begin(rq, 6 + 4 * NUM_GPR_DW);
573         if (IS_ERR(cs)) {
574                 i915_request_add(rq);
575                 return ERR_CAST(cs);
576         }
577
578         *cs++ = MI_ARB_ON_OFF | MI_ARB_ENABLE;
579         *cs++ = MI_NOOP;
580
581         *cs++ = MI_SEMAPHORE_WAIT |
582                 MI_SEMAPHORE_GLOBAL_GTT |
583                 MI_SEMAPHORE_POLL |
584                 MI_SEMAPHORE_SAD_NEQ_SDD;
585         *cs++ = 0;
586         *cs++ = offset;
587         *cs++ = 0;
588
589         for (n = 0; n < NUM_GPR_DW; n++) {
590                 *cs++ = MI_STORE_REGISTER_MEM_GEN8 | MI_USE_GGTT;
591                 *cs++ = CS_GPR(ce->engine, n);
592                 *cs++ = i915_ggtt_offset(scratch) + n * sizeof(u32);
593                 *cs++ = 0;
594         }
595
596         i915_vma_lock(scratch);
597         err = i915_request_await_object(rq, scratch->obj, true);
598         if (!err)
599                 err = i915_vma_move_to_active(scratch, rq, EXEC_OBJECT_WRITE);
600         i915_vma_unlock(scratch);
601
602         i915_request_get(rq);
603         i915_request_add(rq);
604         if (err) {
605                 i915_request_put(rq);
606                 rq = ERR_PTR(err);
607         }
608
609         return rq;
610 }
611
612 static int __live_lrc_gpr(struct intel_engine_cs *engine,
613                           struct i915_vma *scratch,
614                           bool preempt)
615 {
616         u32 *slot = memset32(engine->status_page.addr + 1000, 0, 4);
617         struct intel_context *ce;
618         struct i915_request *rq;
619         u32 *cs;
620         int err;
621         int n;
622
623         if (GRAPHICS_VER(engine->i915) < 9 && engine->class != RENDER_CLASS)
624                 return 0; /* GPR only on rcs0 for gen8 */
625
626         err = gpr_make_dirty(engine->kernel_context);
627         if (err)
628                 return err;
629
630         ce = intel_context_create(engine);
631         if (IS_ERR(ce))
632                 return PTR_ERR(ce);
633
634         rq = __gpr_read(ce, scratch, slot);
635         if (IS_ERR(rq)) {
636                 err = PTR_ERR(rq);
637                 goto err_put;
638         }
639
640         err = wait_for_submit(engine, rq, HZ / 2);
641         if (err)
642                 goto err_rq;
643
644         if (preempt) {
645                 err = gpr_make_dirty(engine->kernel_context);
646                 if (err)
647                         goto err_rq;
648
649                 err = emit_semaphore_signal(engine->kernel_context, slot);
650                 if (err)
651                         goto err_rq;
652
653                 err = wait_for_submit(engine, rq, HZ / 2);
654                 if (err)
655                         goto err_rq;
656         } else {
657                 slot[0] = 1;
658                 wmb();
659         }
660
661         if (i915_request_wait(rq, 0, HZ / 5) < 0) {
662                 err = -ETIME;
663                 goto err_rq;
664         }
665
666         cs = i915_gem_object_pin_map_unlocked(scratch->obj, I915_MAP_WB);
667         if (IS_ERR(cs)) {
668                 err = PTR_ERR(cs);
669                 goto err_rq;
670         }
671
672         for (n = 0; n < NUM_GPR_DW; n++) {
673                 if (cs[n]) {
674                         pr_err("%s: GPR[%d].%s was not zero, found 0x%08x!\n",
675                                engine->name,
676                                n / 2, n & 1 ? "udw" : "ldw",
677                                cs[n]);
678                         err = -EINVAL;
679                         break;
680                 }
681         }
682
683         i915_gem_object_unpin_map(scratch->obj);
684
685 err_rq:
686         memset32(&slot[0], -1, 4);
687         wmb();
688         i915_request_put(rq);
689 err_put:
690         intel_context_put(ce);
691         return err;
692 }
693
694 static int live_lrc_gpr(void *arg)
695 {
696         struct intel_gt *gt = arg;
697         struct intel_engine_cs *engine;
698         struct i915_vma *scratch;
699         enum intel_engine_id id;
700         int err = 0;
701
702         /*
703          * Check that GPR registers are cleared in new contexts as we need
704          * to avoid leaking any information from previous contexts.
705          */
706
707         scratch = create_scratch(gt);
708         if (IS_ERR(scratch))
709                 return PTR_ERR(scratch);
710
711         for_each_engine(engine, gt, id) {
712                 st_engine_heartbeat_disable(engine);
713
714                 err = __live_lrc_gpr(engine, scratch, false);
715                 if (err)
716                         goto err;
717
718                 err = __live_lrc_gpr(engine, scratch, true);
719                 if (err)
720                         goto err;
721
722 err:
723                 st_engine_heartbeat_enable(engine);
724                 if (igt_flush_test(gt->i915))
725                         err = -EIO;
726                 if (err)
727                         break;
728         }
729
730         i915_vma_unpin_and_release(&scratch, 0);
731         return err;
732 }
733
734 static struct i915_request *
735 create_timestamp(struct intel_context *ce, void *slot, int idx)
736 {
737         const u32 offset =
738                 i915_ggtt_offset(ce->engine->status_page.vma) +
739                 offset_in_page(slot);
740         struct i915_request *rq;
741         u32 *cs;
742         int err;
743
744         rq = intel_context_create_request(ce);
745         if (IS_ERR(rq))
746                 return rq;
747
748         cs = intel_ring_begin(rq, 10);
749         if (IS_ERR(cs)) {
750                 err = PTR_ERR(cs);
751                 goto err;
752         }
753
754         *cs++ = MI_ARB_ON_OFF | MI_ARB_ENABLE;
755         *cs++ = MI_NOOP;
756
757         *cs++ = MI_SEMAPHORE_WAIT |
758                 MI_SEMAPHORE_GLOBAL_GTT |
759                 MI_SEMAPHORE_POLL |
760                 MI_SEMAPHORE_SAD_NEQ_SDD;
761         *cs++ = 0;
762         *cs++ = offset;
763         *cs++ = 0;
764
765         *cs++ = MI_STORE_REGISTER_MEM_GEN8 | MI_USE_GGTT;
766         *cs++ = i915_mmio_reg_offset(RING_CTX_TIMESTAMP(rq->engine->mmio_base));
767         *cs++ = offset + idx * sizeof(u32);
768         *cs++ = 0;
769
770         intel_ring_advance(rq, cs);
771
772         err = 0;
773 err:
774         i915_request_get(rq);
775         i915_request_add(rq);
776         if (err) {
777                 i915_request_put(rq);
778                 return ERR_PTR(err);
779         }
780
781         return rq;
782 }
783
784 struct lrc_timestamp {
785         struct intel_engine_cs *engine;
786         struct intel_context *ce[2];
787         u32 poison;
788 };
789
790 static bool timestamp_advanced(u32 start, u32 end)
791 {
792         return (s32)(end - start) > 0;
793 }
794
795 static int __lrc_timestamp(const struct lrc_timestamp *arg, bool preempt)
796 {
797         u32 *slot = memset32(arg->engine->status_page.addr + 1000, 0, 4);
798         struct i915_request *rq;
799         u32 timestamp;
800         int err = 0;
801
802         arg->ce[0]->lrc_reg_state[CTX_TIMESTAMP] = arg->poison;
803         rq = create_timestamp(arg->ce[0], slot, 1);
804         if (IS_ERR(rq))
805                 return PTR_ERR(rq);
806
807         err = wait_for_submit(rq->engine, rq, HZ / 2);
808         if (err)
809                 goto err;
810
811         if (preempt) {
812                 arg->ce[1]->lrc_reg_state[CTX_TIMESTAMP] = 0xdeadbeef;
813                 err = emit_semaphore_signal(arg->ce[1], slot);
814                 if (err)
815                         goto err;
816         } else {
817                 slot[0] = 1;
818                 wmb();
819         }
820
821         /* And wait for switch to kernel (to save our context to memory) */
822         err = context_flush(arg->ce[0], HZ / 2);
823         if (err)
824                 goto err;
825
826         if (!timestamp_advanced(arg->poison, slot[1])) {
827                 pr_err("%s(%s): invalid timestamp on restore, context:%x, request:%x\n",
828                        arg->engine->name, preempt ? "preempt" : "simple",
829                        arg->poison, slot[1]);
830                 err = -EINVAL;
831         }
832
833         timestamp = READ_ONCE(arg->ce[0]->lrc_reg_state[CTX_TIMESTAMP]);
834         if (!timestamp_advanced(slot[1], timestamp)) {
835                 pr_err("%s(%s): invalid timestamp on save, request:%x, context:%x\n",
836                        arg->engine->name, preempt ? "preempt" : "simple",
837                        slot[1], timestamp);
838                 err = -EINVAL;
839         }
840
841 err:
842         memset32(slot, -1, 4);
843         i915_request_put(rq);
844         return err;
845 }
846
847 static int live_lrc_timestamp(void *arg)
848 {
849         struct lrc_timestamp data = {};
850         struct intel_gt *gt = arg;
851         enum intel_engine_id id;
852         const u32 poison[] = {
853                 0,
854                 S32_MAX,
855                 (u32)S32_MAX + 1,
856                 U32_MAX,
857         };
858
859         /*
860          * We want to verify that the timestamp is saved and restore across
861          * context switches and is monotonic.
862          *
863          * So we do this with a little bit of LRC poisoning to check various
864          * boundary conditions, and see what happens if we preempt the context
865          * with a second request (carrying more poison into the timestamp).
866          */
867
868         for_each_engine(data.engine, gt, id) {
869                 int i, err = 0;
870
871                 st_engine_heartbeat_disable(data.engine);
872
873                 for (i = 0; i < ARRAY_SIZE(data.ce); i++) {
874                         struct intel_context *tmp;
875
876                         tmp = intel_context_create(data.engine);
877                         if (IS_ERR(tmp)) {
878                                 err = PTR_ERR(tmp);
879                                 goto err;
880                         }
881
882                         err = intel_context_pin(tmp);
883                         if (err) {
884                                 intel_context_put(tmp);
885                                 goto err;
886                         }
887
888                         data.ce[i] = tmp;
889                 }
890
891                 for (i = 0; i < ARRAY_SIZE(poison); i++) {
892                         data.poison = poison[i];
893
894                         err = __lrc_timestamp(&data, false);
895                         if (err)
896                                 break;
897
898                         err = __lrc_timestamp(&data, true);
899                         if (err)
900                                 break;
901                 }
902
903 err:
904                 st_engine_heartbeat_enable(data.engine);
905                 for (i = 0; i < ARRAY_SIZE(data.ce); i++) {
906                         if (!data.ce[i])
907                                 break;
908
909                         intel_context_unpin(data.ce[i]);
910                         intel_context_put(data.ce[i]);
911                 }
912
913                 if (igt_flush_test(gt->i915))
914                         err = -EIO;
915                 if (err)
916                         return err;
917         }
918
919         return 0;
920 }
921
922 static struct i915_vma *
923 create_user_vma(struct i915_address_space *vm, unsigned long size)
924 {
925         struct drm_i915_gem_object *obj;
926         struct i915_vma *vma;
927         int err;
928
929         obj = i915_gem_object_create_internal(vm->i915, size);
930         if (IS_ERR(obj))
931                 return ERR_CAST(obj);
932
933         vma = i915_vma_instance(obj, vm, NULL);
934         if (IS_ERR(vma)) {
935                 i915_gem_object_put(obj);
936                 return vma;
937         }
938
939         err = i915_vma_pin(vma, 0, 0, PIN_USER);
940         if (err) {
941                 i915_gem_object_put(obj);
942                 return ERR_PTR(err);
943         }
944
945         return vma;
946 }
947
948 static u32 safe_poison(u32 offset, u32 poison)
949 {
950         /*
951          * Do not enable predication as it will nop all subsequent commands,
952          * not only disabling the tests (by preventing all the other SRM) but
953          * also preventing the arbitration events at the end of the request.
954          */
955         if (offset == i915_mmio_reg_offset(RING_PREDICATE_RESULT(0)))
956                 poison &= ~REG_BIT(0);
957
958         return poison;
959 }
960
961 static struct i915_vma *
962 store_context(struct intel_context *ce, struct i915_vma *scratch)
963 {
964         struct i915_vma *batch;
965         u32 dw, x, *cs, *hw;
966         u32 *defaults;
967
968         batch = create_user_vma(ce->vm, SZ_64K);
969         if (IS_ERR(batch))
970                 return batch;
971
972         cs = i915_gem_object_pin_map_unlocked(batch->obj, I915_MAP_WC);
973         if (IS_ERR(cs)) {
974                 i915_vma_put(batch);
975                 return ERR_CAST(cs);
976         }
977
978         defaults = shmem_pin_map(ce->engine->default_state);
979         if (!defaults) {
980                 i915_gem_object_unpin_map(batch->obj);
981                 i915_vma_put(batch);
982                 return ERR_PTR(-ENOMEM);
983         }
984
985         x = 0;
986         dw = 0;
987         hw = defaults;
988         hw += LRC_STATE_OFFSET / sizeof(*hw);
989         do {
990                 u32 len = hw[dw] & 0x7f;
991
992                 if (hw[dw] == 0) {
993                         dw++;
994                         continue;
995                 }
996
997                 if ((hw[dw] & GENMASK(31, 23)) != MI_INSTR(0x22, 0)) {
998                         dw += len + 2;
999                         continue;
1000                 }
1001
1002                 dw++;
1003                 len = (len + 1) / 2;
1004                 while (len--) {
1005                         *cs++ = MI_STORE_REGISTER_MEM_GEN8;
1006                         *cs++ = hw[dw];
1007                         *cs++ = lower_32_bits(scratch->node.start + x);
1008                         *cs++ = upper_32_bits(scratch->node.start + x);
1009
1010                         dw += 2;
1011                         x += 4;
1012                 }
1013         } while (dw < PAGE_SIZE / sizeof(u32) &&
1014                  (hw[dw] & ~BIT(0)) != MI_BATCH_BUFFER_END);
1015
1016         *cs++ = MI_BATCH_BUFFER_END;
1017
1018         shmem_unpin_map(ce->engine->default_state, defaults);
1019
1020         i915_gem_object_flush_map(batch->obj);
1021         i915_gem_object_unpin_map(batch->obj);
1022
1023         return batch;
1024 }
1025
1026 static int move_to_active(struct i915_request *rq,
1027                           struct i915_vma *vma,
1028                           unsigned int flags)
1029 {
1030         int err;
1031
1032         i915_vma_lock(vma);
1033         err = i915_request_await_object(rq, vma->obj, flags);
1034         if (!err)
1035                 err = i915_vma_move_to_active(vma, rq, flags);
1036         i915_vma_unlock(vma);
1037
1038         return err;
1039 }
1040
1041 static struct i915_request *
1042 record_registers(struct intel_context *ce,
1043                  struct i915_vma *before,
1044                  struct i915_vma *after,
1045                  u32 *sema)
1046 {
1047         struct i915_vma *b_before, *b_after;
1048         struct i915_request *rq;
1049         u32 *cs;
1050         int err;
1051
1052         b_before = store_context(ce, before);
1053         if (IS_ERR(b_before))
1054                 return ERR_CAST(b_before);
1055
1056         b_after = store_context(ce, after);
1057         if (IS_ERR(b_after)) {
1058                 rq = ERR_CAST(b_after);
1059                 goto err_before;
1060         }
1061
1062         rq = intel_context_create_request(ce);
1063         if (IS_ERR(rq))
1064                 goto err_after;
1065
1066         err = move_to_active(rq, before, EXEC_OBJECT_WRITE);
1067         if (err)
1068                 goto err_rq;
1069
1070         err = move_to_active(rq, b_before, 0);
1071         if (err)
1072                 goto err_rq;
1073
1074         err = move_to_active(rq, after, EXEC_OBJECT_WRITE);
1075         if (err)
1076                 goto err_rq;
1077
1078         err = move_to_active(rq, b_after, 0);
1079         if (err)
1080                 goto err_rq;
1081
1082         cs = intel_ring_begin(rq, 14);
1083         if (IS_ERR(cs)) {
1084                 err = PTR_ERR(cs);
1085                 goto err_rq;
1086         }
1087
1088         *cs++ = MI_ARB_ON_OFF | MI_ARB_DISABLE;
1089         *cs++ = MI_BATCH_BUFFER_START_GEN8 | BIT(8);
1090         *cs++ = lower_32_bits(b_before->node.start);
1091         *cs++ = upper_32_bits(b_before->node.start);
1092
1093         *cs++ = MI_ARB_ON_OFF | MI_ARB_ENABLE;
1094         *cs++ = MI_SEMAPHORE_WAIT |
1095                 MI_SEMAPHORE_GLOBAL_GTT |
1096                 MI_SEMAPHORE_POLL |
1097                 MI_SEMAPHORE_SAD_NEQ_SDD;
1098         *cs++ = 0;
1099         *cs++ = i915_ggtt_offset(ce->engine->status_page.vma) +
1100                 offset_in_page(sema);
1101         *cs++ = 0;
1102         *cs++ = MI_NOOP;
1103
1104         *cs++ = MI_ARB_ON_OFF | MI_ARB_DISABLE;
1105         *cs++ = MI_BATCH_BUFFER_START_GEN8 | BIT(8);
1106         *cs++ = lower_32_bits(b_after->node.start);
1107         *cs++ = upper_32_bits(b_after->node.start);
1108
1109         intel_ring_advance(rq, cs);
1110
1111         WRITE_ONCE(*sema, 0);
1112         i915_request_get(rq);
1113         i915_request_add(rq);
1114 err_after:
1115         i915_vma_put(b_after);
1116 err_before:
1117         i915_vma_put(b_before);
1118         return rq;
1119
1120 err_rq:
1121         i915_request_add(rq);
1122         rq = ERR_PTR(err);
1123         goto err_after;
1124 }
1125
1126 static struct i915_vma *load_context(struct intel_context *ce, u32 poison)
1127 {
1128         struct i915_vma *batch;
1129         u32 dw, *cs, *hw;
1130         u32 *defaults;
1131
1132         batch = create_user_vma(ce->vm, SZ_64K);
1133         if (IS_ERR(batch))
1134                 return batch;
1135
1136         cs = i915_gem_object_pin_map_unlocked(batch->obj, I915_MAP_WC);
1137         if (IS_ERR(cs)) {
1138                 i915_vma_put(batch);
1139                 return ERR_CAST(cs);
1140         }
1141
1142         defaults = shmem_pin_map(ce->engine->default_state);
1143         if (!defaults) {
1144                 i915_gem_object_unpin_map(batch->obj);
1145                 i915_vma_put(batch);
1146                 return ERR_PTR(-ENOMEM);
1147         }
1148
1149         dw = 0;
1150         hw = defaults;
1151         hw += LRC_STATE_OFFSET / sizeof(*hw);
1152         do {
1153                 u32 len = hw[dw] & 0x7f;
1154
1155                 if (hw[dw] == 0) {
1156                         dw++;
1157                         continue;
1158                 }
1159
1160                 if ((hw[dw] & GENMASK(31, 23)) != MI_INSTR(0x22, 0)) {
1161                         dw += len + 2;
1162                         continue;
1163                 }
1164
1165                 dw++;
1166                 len = (len + 1) / 2;
1167                 *cs++ = MI_LOAD_REGISTER_IMM(len);
1168                 while (len--) {
1169                         *cs++ = hw[dw];
1170                         *cs++ = safe_poison(hw[dw] & get_lri_mask(ce->engine,
1171                                                                   MI_LRI_LRM_CS_MMIO),
1172                                             poison);
1173                         dw += 2;
1174                 }
1175         } while (dw < PAGE_SIZE / sizeof(u32) &&
1176                  (hw[dw] & ~BIT(0)) != MI_BATCH_BUFFER_END);
1177
1178         *cs++ = MI_BATCH_BUFFER_END;
1179
1180         shmem_unpin_map(ce->engine->default_state, defaults);
1181
1182         i915_gem_object_flush_map(batch->obj);
1183         i915_gem_object_unpin_map(batch->obj);
1184
1185         return batch;
1186 }
1187
1188 static int poison_registers(struct intel_context *ce, u32 poison, u32 *sema)
1189 {
1190         struct i915_request *rq;
1191         struct i915_vma *batch;
1192         u32 *cs;
1193         int err;
1194
1195         batch = load_context(ce, poison);
1196         if (IS_ERR(batch))
1197                 return PTR_ERR(batch);
1198
1199         rq = intel_context_create_request(ce);
1200         if (IS_ERR(rq)) {
1201                 err = PTR_ERR(rq);
1202                 goto err_batch;
1203         }
1204
1205         err = move_to_active(rq, batch, 0);
1206         if (err)
1207                 goto err_rq;
1208
1209         cs = intel_ring_begin(rq, 8);
1210         if (IS_ERR(cs)) {
1211                 err = PTR_ERR(cs);
1212                 goto err_rq;
1213         }
1214
1215         *cs++ = MI_ARB_ON_OFF | MI_ARB_DISABLE;
1216         *cs++ = MI_BATCH_BUFFER_START_GEN8 | BIT(8);
1217         *cs++ = lower_32_bits(batch->node.start);
1218         *cs++ = upper_32_bits(batch->node.start);
1219
1220         *cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
1221         *cs++ = i915_ggtt_offset(ce->engine->status_page.vma) +
1222                 offset_in_page(sema);
1223         *cs++ = 0;
1224         *cs++ = 1;
1225
1226         intel_ring_advance(rq, cs);
1227
1228         rq->sched.attr.priority = I915_PRIORITY_BARRIER;
1229 err_rq:
1230         i915_request_add(rq);
1231 err_batch:
1232         i915_vma_put(batch);
1233         return err;
1234 }
1235
1236 static bool is_moving(u32 a, u32 b)
1237 {
1238         return a != b;
1239 }
1240
1241 static int compare_isolation(struct intel_engine_cs *engine,
1242                              struct i915_vma *ref[2],
1243                              struct i915_vma *result[2],
1244                              struct intel_context *ce,
1245                              u32 poison)
1246 {
1247         u32 x, dw, *hw, *lrc;
1248         u32 *A[2], *B[2];
1249         u32 *defaults;
1250         int err = 0;
1251
1252         A[0] = i915_gem_object_pin_map_unlocked(ref[0]->obj, I915_MAP_WC);
1253         if (IS_ERR(A[0]))
1254                 return PTR_ERR(A[0]);
1255
1256         A[1] = i915_gem_object_pin_map_unlocked(ref[1]->obj, I915_MAP_WC);
1257         if (IS_ERR(A[1])) {
1258                 err = PTR_ERR(A[1]);
1259                 goto err_A0;
1260         }
1261
1262         B[0] = i915_gem_object_pin_map_unlocked(result[0]->obj, I915_MAP_WC);
1263         if (IS_ERR(B[0])) {
1264                 err = PTR_ERR(B[0]);
1265                 goto err_A1;
1266         }
1267
1268         B[1] = i915_gem_object_pin_map_unlocked(result[1]->obj, I915_MAP_WC);
1269         if (IS_ERR(B[1])) {
1270                 err = PTR_ERR(B[1]);
1271                 goto err_B0;
1272         }
1273
1274         lrc = i915_gem_object_pin_map_unlocked(ce->state->obj,
1275                                                i915_coherent_map_type(engine->i915,
1276                                                                       ce->state->obj,
1277                                                                       false));
1278         if (IS_ERR(lrc)) {
1279                 err = PTR_ERR(lrc);
1280                 goto err_B1;
1281         }
1282         lrc += LRC_STATE_OFFSET / sizeof(*hw);
1283
1284         defaults = shmem_pin_map(ce->engine->default_state);
1285         if (!defaults) {
1286                 err = -ENOMEM;
1287                 goto err_lrc;
1288         }
1289
1290         x = 0;
1291         dw = 0;
1292         hw = defaults;
1293         hw += LRC_STATE_OFFSET / sizeof(*hw);
1294         do {
1295                 u32 len = hw[dw] & 0x7f;
1296
1297                 if (hw[dw] == 0) {
1298                         dw++;
1299                         continue;
1300                 }
1301
1302                 if ((hw[dw] & GENMASK(31, 23)) != MI_INSTR(0x22, 0)) {
1303                         dw += len + 2;
1304                         continue;
1305                 }
1306
1307                 dw++;
1308                 len = (len + 1) / 2;
1309                 while (len--) {
1310                         if (!is_moving(A[0][x], A[1][x]) &&
1311                             (A[0][x] != B[0][x] || A[1][x] != B[1][x])) {
1312                                 switch (hw[dw] & 4095) {
1313                                 case 0x30: /* RING_HEAD */
1314                                 case 0x34: /* RING_TAIL */
1315                                         break;
1316
1317                                 default:
1318                                         pr_err("%s[%d]: Mismatch for register %4x, default %08x, reference %08x, result (%08x, %08x), poison %08x, context %08x\n",
1319                                                engine->name, dw,
1320                                                hw[dw], hw[dw + 1],
1321                                                A[0][x], B[0][x], B[1][x],
1322                                                poison, lrc[dw + 1]);
1323                                         err = -EINVAL;
1324                                 }
1325                         }
1326                         dw += 2;
1327                         x++;
1328                 }
1329         } while (dw < PAGE_SIZE / sizeof(u32) &&
1330                  (hw[dw] & ~BIT(0)) != MI_BATCH_BUFFER_END);
1331
1332         shmem_unpin_map(ce->engine->default_state, defaults);
1333 err_lrc:
1334         i915_gem_object_unpin_map(ce->state->obj);
1335 err_B1:
1336         i915_gem_object_unpin_map(result[1]->obj);
1337 err_B0:
1338         i915_gem_object_unpin_map(result[0]->obj);
1339 err_A1:
1340         i915_gem_object_unpin_map(ref[1]->obj);
1341 err_A0:
1342         i915_gem_object_unpin_map(ref[0]->obj);
1343         return err;
1344 }
1345
1346 static int __lrc_isolation(struct intel_engine_cs *engine, u32 poison)
1347 {
1348         u32 *sema = memset32(engine->status_page.addr + 1000, 0, 1);
1349         struct i915_vma *ref[2], *result[2];
1350         struct intel_context *A, *B;
1351         struct i915_request *rq;
1352         int err;
1353
1354         A = intel_context_create(engine);
1355         if (IS_ERR(A))
1356                 return PTR_ERR(A);
1357
1358         B = intel_context_create(engine);
1359         if (IS_ERR(B)) {
1360                 err = PTR_ERR(B);
1361                 goto err_A;
1362         }
1363
1364         ref[0] = create_user_vma(A->vm, SZ_64K);
1365         if (IS_ERR(ref[0])) {
1366                 err = PTR_ERR(ref[0]);
1367                 goto err_B;
1368         }
1369
1370         ref[1] = create_user_vma(A->vm, SZ_64K);
1371         if (IS_ERR(ref[1])) {
1372                 err = PTR_ERR(ref[1]);
1373                 goto err_ref0;
1374         }
1375
1376         rq = record_registers(A, ref[0], ref[1], sema);
1377         if (IS_ERR(rq)) {
1378                 err = PTR_ERR(rq);
1379                 goto err_ref1;
1380         }
1381
1382         WRITE_ONCE(*sema, 1);
1383         wmb();
1384
1385         if (i915_request_wait(rq, 0, HZ / 2) < 0) {
1386                 i915_request_put(rq);
1387                 err = -ETIME;
1388                 goto err_ref1;
1389         }
1390         i915_request_put(rq);
1391
1392         result[0] = create_user_vma(A->vm, SZ_64K);
1393         if (IS_ERR(result[0])) {
1394                 err = PTR_ERR(result[0]);
1395                 goto err_ref1;
1396         }
1397
1398         result[1] = create_user_vma(A->vm, SZ_64K);
1399         if (IS_ERR(result[1])) {
1400                 err = PTR_ERR(result[1]);
1401                 goto err_result0;
1402         }
1403
1404         rq = record_registers(A, result[0], result[1], sema);
1405         if (IS_ERR(rq)) {
1406                 err = PTR_ERR(rq);
1407                 goto err_result1;
1408         }
1409
1410         err = poison_registers(B, poison, sema);
1411         if (err) {
1412                 WRITE_ONCE(*sema, -1);
1413                 i915_request_put(rq);
1414                 goto err_result1;
1415         }
1416
1417         if (i915_request_wait(rq, 0, HZ / 2) < 0) {
1418                 i915_request_put(rq);
1419                 err = -ETIME;
1420                 goto err_result1;
1421         }
1422         i915_request_put(rq);
1423
1424         err = compare_isolation(engine, ref, result, A, poison);
1425
1426 err_result1:
1427         i915_vma_put(result[1]);
1428 err_result0:
1429         i915_vma_put(result[0]);
1430 err_ref1:
1431         i915_vma_put(ref[1]);
1432 err_ref0:
1433         i915_vma_put(ref[0]);
1434 err_B:
1435         intel_context_put(B);
1436 err_A:
1437         intel_context_put(A);
1438         return err;
1439 }
1440
1441 static bool skip_isolation(const struct intel_engine_cs *engine)
1442 {
1443         if (engine->class == COPY_ENGINE_CLASS && GRAPHICS_VER(engine->i915) == 9)
1444                 return true;
1445
1446         if (engine->class == RENDER_CLASS && GRAPHICS_VER(engine->i915) == 11)
1447                 return true;
1448
1449         return false;
1450 }
1451
1452 static int live_lrc_isolation(void *arg)
1453 {
1454         struct intel_gt *gt = arg;
1455         struct intel_engine_cs *engine;
1456         enum intel_engine_id id;
1457         const u32 poison[] = {
1458                 STACK_MAGIC,
1459                 0x3a3a3a3a,
1460                 0x5c5c5c5c,
1461                 0xffffffff,
1462                 0xffff0000,
1463         };
1464         int err = 0;
1465
1466         /*
1467          * Our goal is try and verify that per-context state cannot be
1468          * tampered with by another non-privileged client.
1469          *
1470          * We take the list of context registers from the LRI in the default
1471          * context image and attempt to modify that list from a remote context.
1472          */
1473
1474         for_each_engine(engine, gt, id) {
1475                 int i;
1476
1477                 /* Just don't even ask */
1478                 if (!IS_ENABLED(CONFIG_DRM_I915_SELFTEST_BROKEN) &&
1479                     skip_isolation(engine))
1480                         continue;
1481
1482                 intel_engine_pm_get(engine);
1483                 for (i = 0; i < ARRAY_SIZE(poison); i++) {
1484                         int result;
1485
1486                         result = __lrc_isolation(engine, poison[i]);
1487                         if (result && !err)
1488                                 err = result;
1489
1490                         result = __lrc_isolation(engine, ~poison[i]);
1491                         if (result && !err)
1492                                 err = result;
1493                 }
1494                 intel_engine_pm_put(engine);
1495                 if (igt_flush_test(gt->i915)) {
1496                         err = -EIO;
1497                         break;
1498                 }
1499         }
1500
1501         return err;
1502 }
1503
1504 static int indirect_ctx_submit_req(struct intel_context *ce)
1505 {
1506         struct i915_request *rq;
1507         int err = 0;
1508
1509         rq = intel_context_create_request(ce);
1510         if (IS_ERR(rq))
1511                 return PTR_ERR(rq);
1512
1513         i915_request_get(rq);
1514         i915_request_add(rq);
1515
1516         if (i915_request_wait(rq, 0, HZ / 5) < 0)
1517                 err = -ETIME;
1518
1519         i915_request_put(rq);
1520
1521         return err;
1522 }
1523
1524 #define CTX_BB_CANARY_OFFSET (3 * 1024)
1525 #define CTX_BB_CANARY_INDEX  (CTX_BB_CANARY_OFFSET / sizeof(u32))
1526
1527 static u32 *
1528 emit_indirect_ctx_bb_canary(const struct intel_context *ce, u32 *cs)
1529 {
1530         *cs++ = MI_STORE_REGISTER_MEM_GEN8 |
1531                 MI_SRM_LRM_GLOBAL_GTT |
1532                 MI_LRI_LRM_CS_MMIO;
1533         *cs++ = i915_mmio_reg_offset(RING_START(0));
1534         *cs++ = i915_ggtt_offset(ce->state) +
1535                 context_wa_bb_offset(ce) +
1536                 CTX_BB_CANARY_OFFSET;
1537         *cs++ = 0;
1538
1539         return cs;
1540 }
1541
1542 static void
1543 indirect_ctx_bb_setup(struct intel_context *ce)
1544 {
1545         u32 *cs = context_indirect_bb(ce);
1546
1547         cs[CTX_BB_CANARY_INDEX] = 0xdeadf00d;
1548
1549         setup_indirect_ctx_bb(ce, ce->engine, emit_indirect_ctx_bb_canary);
1550 }
1551
1552 static bool check_ring_start(struct intel_context *ce)
1553 {
1554         const u32 * const ctx_bb = (void *)(ce->lrc_reg_state) -
1555                 LRC_STATE_OFFSET + context_wa_bb_offset(ce);
1556
1557         if (ctx_bb[CTX_BB_CANARY_INDEX] == ce->lrc_reg_state[CTX_RING_START])
1558                 return true;
1559
1560         pr_err("ring start mismatch: canary 0x%08x vs state 0x%08x\n",
1561                ctx_bb[CTX_BB_CANARY_INDEX],
1562                ce->lrc_reg_state[CTX_RING_START]);
1563
1564         return false;
1565 }
1566
1567 static int indirect_ctx_bb_check(struct intel_context *ce)
1568 {
1569         int err;
1570
1571         err = indirect_ctx_submit_req(ce);
1572         if (err)
1573                 return err;
1574
1575         if (!check_ring_start(ce))
1576                 return -EINVAL;
1577
1578         return 0;
1579 }
1580
1581 static int __live_lrc_indirect_ctx_bb(struct intel_engine_cs *engine)
1582 {
1583         struct intel_context *a, *b;
1584         int err;
1585
1586         a = intel_context_create(engine);
1587         if (IS_ERR(a))
1588                 return PTR_ERR(a);
1589         err = intel_context_pin(a);
1590         if (err)
1591                 goto put_a;
1592
1593         b = intel_context_create(engine);
1594         if (IS_ERR(b)) {
1595                 err = PTR_ERR(b);
1596                 goto unpin_a;
1597         }
1598         err = intel_context_pin(b);
1599         if (err)
1600                 goto put_b;
1601
1602         /* We use the already reserved extra page in context state */
1603         if (!a->wa_bb_page) {
1604                 GEM_BUG_ON(b->wa_bb_page);
1605                 GEM_BUG_ON(GRAPHICS_VER(engine->i915) == 12);
1606                 goto unpin_b;
1607         }
1608
1609         /*
1610          * In order to test that our per context bb is truly per context,
1611          * and executes at the intended spot on context restoring process,
1612          * make the batch store the ring start value to memory.
1613          * As ring start is restored apriori of starting the indirect ctx bb and
1614          * as it will be different for each context, it fits to this purpose.
1615          */
1616         indirect_ctx_bb_setup(a);
1617         indirect_ctx_bb_setup(b);
1618
1619         err = indirect_ctx_bb_check(a);
1620         if (err)
1621                 goto unpin_b;
1622
1623         err = indirect_ctx_bb_check(b);
1624
1625 unpin_b:
1626         intel_context_unpin(b);
1627 put_b:
1628         intel_context_put(b);
1629 unpin_a:
1630         intel_context_unpin(a);
1631 put_a:
1632         intel_context_put(a);
1633
1634         return err;
1635 }
1636
1637 static int live_lrc_indirect_ctx_bb(void *arg)
1638 {
1639         struct intel_gt *gt = arg;
1640         struct intel_engine_cs *engine;
1641         enum intel_engine_id id;
1642         int err = 0;
1643
1644         for_each_engine(engine, gt, id) {
1645                 intel_engine_pm_get(engine);
1646                 err = __live_lrc_indirect_ctx_bb(engine);
1647                 intel_engine_pm_put(engine);
1648
1649                 if (igt_flush_test(gt->i915))
1650                         err = -EIO;
1651
1652                 if (err)
1653                         break;
1654         }
1655
1656         return err;
1657 }
1658
1659 static void garbage_reset(struct intel_engine_cs *engine,
1660                           struct i915_request *rq)
1661 {
1662         const unsigned int bit = I915_RESET_ENGINE + engine->id;
1663         unsigned long *lock = &engine->gt->reset.flags;
1664
1665         local_bh_disable();
1666         if (!test_and_set_bit(bit, lock)) {
1667                 tasklet_disable(&engine->sched_engine->tasklet);
1668
1669                 if (!rq->fence.error)
1670                         __intel_engine_reset_bh(engine, NULL);
1671
1672                 tasklet_enable(&engine->sched_engine->tasklet);
1673                 clear_and_wake_up_bit(bit, lock);
1674         }
1675         local_bh_enable();
1676 }
1677
1678 static struct i915_request *garbage(struct intel_context *ce,
1679                                     struct rnd_state *prng)
1680 {
1681         struct i915_request *rq;
1682         int err;
1683
1684         err = intel_context_pin(ce);
1685         if (err)
1686                 return ERR_PTR(err);
1687
1688         prandom_bytes_state(prng,
1689                             ce->lrc_reg_state,
1690                             ce->engine->context_size -
1691                             LRC_STATE_OFFSET);
1692
1693         rq = intel_context_create_request(ce);
1694         if (IS_ERR(rq)) {
1695                 err = PTR_ERR(rq);
1696                 goto err_unpin;
1697         }
1698
1699         i915_request_get(rq);
1700         i915_request_add(rq);
1701         return rq;
1702
1703 err_unpin:
1704         intel_context_unpin(ce);
1705         return ERR_PTR(err);
1706 }
1707
1708 static int __lrc_garbage(struct intel_engine_cs *engine, struct rnd_state *prng)
1709 {
1710         struct intel_context *ce;
1711         struct i915_request *hang;
1712         int err = 0;
1713
1714         ce = intel_context_create(engine);
1715         if (IS_ERR(ce))
1716                 return PTR_ERR(ce);
1717
1718         hang = garbage(ce, prng);
1719         if (IS_ERR(hang)) {
1720                 err = PTR_ERR(hang);
1721                 goto err_ce;
1722         }
1723
1724         if (wait_for_submit(engine, hang, HZ / 2)) {
1725                 i915_request_put(hang);
1726                 err = -ETIME;
1727                 goto err_ce;
1728         }
1729
1730         intel_context_set_banned(ce);
1731         garbage_reset(engine, hang);
1732
1733         intel_engine_flush_submission(engine);
1734         if (!hang->fence.error) {
1735                 i915_request_put(hang);
1736                 pr_err("%s: corrupted context was not reset\n",
1737                        engine->name);
1738                 err = -EINVAL;
1739                 goto err_ce;
1740         }
1741
1742         if (i915_request_wait(hang, 0, HZ / 2) < 0) {
1743                 pr_err("%s: corrupted context did not recover\n",
1744                        engine->name);
1745                 i915_request_put(hang);
1746                 err = -EIO;
1747                 goto err_ce;
1748         }
1749         i915_request_put(hang);
1750
1751 err_ce:
1752         intel_context_put(ce);
1753         return err;
1754 }
1755
1756 static int live_lrc_garbage(void *arg)
1757 {
1758         struct intel_gt *gt = arg;
1759         struct intel_engine_cs *engine;
1760         enum intel_engine_id id;
1761
1762         /*
1763          * Verify that we can recover if one context state is completely
1764          * corrupted.
1765          */
1766
1767         if (!IS_ENABLED(CONFIG_DRM_I915_SELFTEST_BROKEN))
1768                 return 0;
1769
1770         for_each_engine(engine, gt, id) {
1771                 I915_RND_STATE(prng);
1772                 int err = 0, i;
1773
1774                 if (!intel_has_reset_engine(engine->gt))
1775                         continue;
1776
1777                 intel_engine_pm_get(engine);
1778                 for (i = 0; i < 3; i++) {
1779                         err = __lrc_garbage(engine, &prng);
1780                         if (err)
1781                                 break;
1782                 }
1783                 intel_engine_pm_put(engine);
1784
1785                 if (igt_flush_test(gt->i915))
1786                         err = -EIO;
1787                 if (err)
1788                         return err;
1789         }
1790
1791         return 0;
1792 }
1793
1794 static int __live_pphwsp_runtime(struct intel_engine_cs *engine)
1795 {
1796         struct intel_context *ce;
1797         struct i915_request *rq;
1798         IGT_TIMEOUT(end_time);
1799         int err;
1800
1801         ce = intel_context_create(engine);
1802         if (IS_ERR(ce))
1803                 return PTR_ERR(ce);
1804
1805         ce->stats.runtime.num_underflow = 0;
1806         ce->stats.runtime.max_underflow = 0;
1807
1808         do {
1809                 unsigned int loop = 1024;
1810
1811                 while (loop) {
1812                         rq = intel_context_create_request(ce);
1813                         if (IS_ERR(rq)) {
1814                                 err = PTR_ERR(rq);
1815                                 goto err_rq;
1816                         }
1817
1818                         if (--loop == 0)
1819                                 i915_request_get(rq);
1820
1821                         i915_request_add(rq);
1822                 }
1823
1824                 if (__igt_timeout(end_time, NULL))
1825                         break;
1826
1827                 i915_request_put(rq);
1828         } while (1);
1829
1830         err = i915_request_wait(rq, 0, HZ / 5);
1831         if (err < 0) {
1832                 pr_err("%s: request not completed!\n", engine->name);
1833                 goto err_wait;
1834         }
1835
1836         igt_flush_test(engine->i915);
1837
1838         pr_info("%s: pphwsp runtime %lluns, average %lluns\n",
1839                 engine->name,
1840                 intel_context_get_total_runtime_ns(ce),
1841                 intel_context_get_avg_runtime_ns(ce));
1842
1843         err = 0;
1844         if (ce->stats.runtime.num_underflow) {
1845                 pr_err("%s: pphwsp underflow %u time(s), max %u cycles!\n",
1846                        engine->name,
1847                        ce->stats.runtime.num_underflow,
1848                        ce->stats.runtime.max_underflow);
1849                 GEM_TRACE_DUMP();
1850                 err = -EOVERFLOW;
1851         }
1852
1853 err_wait:
1854         i915_request_put(rq);
1855 err_rq:
1856         intel_context_put(ce);
1857         return err;
1858 }
1859
1860 static int live_pphwsp_runtime(void *arg)
1861 {
1862         struct intel_gt *gt = arg;
1863         struct intel_engine_cs *engine;
1864         enum intel_engine_id id;
1865         int err = 0;
1866
1867         /*
1868          * Check that cumulative context runtime as stored in the pphwsp[16]
1869          * is monotonic.
1870          */
1871
1872         for_each_engine(engine, gt, id) {
1873                 err = __live_pphwsp_runtime(engine);
1874                 if (err)
1875                         break;
1876         }
1877
1878         if (igt_flush_test(gt->i915))
1879                 err = -EIO;
1880
1881         return err;
1882 }
1883
1884 int intel_lrc_live_selftests(struct drm_i915_private *i915)
1885 {
1886         static const struct i915_subtest tests[] = {
1887                 SUBTEST(live_lrc_layout),
1888                 SUBTEST(live_lrc_fixed),
1889                 SUBTEST(live_lrc_state),
1890                 SUBTEST(live_lrc_gpr),
1891                 SUBTEST(live_lrc_isolation),
1892                 SUBTEST(live_lrc_timestamp),
1893                 SUBTEST(live_lrc_garbage),
1894                 SUBTEST(live_pphwsp_runtime),
1895                 SUBTEST(live_lrc_indirect_ctx_bb),
1896         };
1897
1898         if (!HAS_LOGICAL_RING_CONTEXTS(i915))
1899                 return 0;
1900
1901         return intel_gt_live_subtests(tests, to_gt(i915));
1902 }