A quick test to verify that the backend accepts each type of timeline
and can use them to track and control request emission.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/gt/selftest_timeline.c | 105 ++++++++++++++++++++
 1 file changed, 105 insertions(+)

diff --git a/drivers/gpu/drm/i915/gt/selftest_timeline.c 
b/drivers/gpu/drm/i915/gt/selftest_timeline.c
index 6b412228a6fd..dcc03522b277 100644
--- a/drivers/gpu/drm/i915/gt/selftest_timeline.c
+++ b/drivers/gpu/drm/i915/gt/selftest_timeline.c
@@ -1364,9 +1364,114 @@ static int live_hwsp_recycle(void *arg)
        return err;
 }
 
+static int live_hwsp_relative(void *arg)
+{
+       struct intel_gt *gt = arg;
+       struct intel_engine_cs *engine;
+       enum intel_engine_id id;
+
+       /*
+        * Check backend support for different timeline modes.
+        */
+
+       for_each_engine(engine, gt, id) {
+               enum intel_timeline_mode mode;
+
+               if (!intel_engine_has_scheduler(engine))
+                       continue;
+
+               for (mode = INTEL_TIMELINE_ABSOLUTE;
+                    mode <= INTEL_TIMELINE_RELATIVE_ENGINE;
+                    mode++) {
+                       struct intel_timeline *tl;
+                       struct i915_request *rq;
+                       struct intel_context *ce;
+                       const char *msg;
+                       int err;
+
+                       if (mode == INTEL_TIMELINE_RELATIVE_CONTEXT &&
+                           !HAS_EXECLISTS(gt->i915))
+                               continue;
+
+                       ce = intel_context_create(engine);
+                       if (IS_ERR(ce))
+                               return PTR_ERR(ce);
+
+                       err = intel_context_alloc_state(ce);
+                       if (err) {
+                               intel_context_put(ce);
+                               return err;
+                       }
+
+                       switch (mode) {
+                       case INTEL_TIMELINE_ABSOLUTE:
+                               tl = intel_timeline_create(gt);
+                               msg = "local";
+                               break;
+
+                       case INTEL_TIMELINE_RELATIVE_CONTEXT:
+                               tl = __intel_timeline_create(gt,
+                                                            ce->state,
+                                                            
INTEL_TIMELINE_RELATIVE_CONTEXT |
+                                                            0x400);
+                               msg = "ppHWSP";
+                               break;
+
+                       case INTEL_TIMELINE_RELATIVE_ENGINE:
+                               tl = __intel_timeline_create(gt,
+                                                            
engine->status_page.vma,
+                                                            0x400);
+                               msg = "HWSP";
+                               break;
+                       default:
+                               continue;
+                       }
+                       if (IS_ERR(tl)) {
+                               intel_context_put(ce);
+                               return PTR_ERR(tl);
+                       }
+
+                       pr_info("Testing %s timeline on %s\n",
+                               msg, engine->name);
+
+                       intel_timeline_put(ce->timeline);
+                       ce->timeline = tl;
+
+                       err = intel_timeline_pin(tl, NULL);
+                       if (err) {
+                               intel_context_put(ce);
+                               return err;
+                       }
+                       tl->seqno = 0xc0000000;
+                       WRITE_ONCE(*(u32 *)tl->hwsp_seqno, tl->seqno);
+                       intel_timeline_unpin(tl);
+
+                       rq = intel_context_create_request(ce);
+                       intel_context_put(ce);
+                       if (IS_ERR(rq))
+                               return PTR_ERR(rq);
+
+                       GEM_BUG_ON(rcu_access_pointer(rq->timeline) != tl);
+
+                       i915_request_get(rq);
+                       i915_request_add(rq);
+
+                       if (i915_request_wait(rq, 0, HZ / 5) < 0) {
+                               i915_request_put(rq);
+                               return -EIO;
+                       }
+
+                       i915_request_put(rq);
+               }
+       }
+
+       return 0;
+}
+
 int intel_timeline_live_selftests(struct drm_i915_private *i915)
 {
        static const struct i915_subtest tests[] = {
+               SUBTEST(live_hwsp_relative),
                SUBTEST(live_hwsp_recycle),
                SUBTEST(live_hwsp_engine),
                SUBTEST(live_hwsp_alternate),
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to