drm/i915: Make timelines gt centric
authorTvrtko Ursulin <tvrtko.ursulin@intel.com>
Fri, 21 Jun 2019 07:08:09 +0000 (08:08 +0100)
committerTvrtko Ursulin <tvrtko.ursulin@intel.com>
Fri, 21 Jun 2019 12:48:51 +0000 (13:48 +0100)
Our timelines are stored inside intel_gt so we can convert the interface
to take exactly that and not i915.

At the same time re-order the params to our more typical layout and
replace the backpointer to the new containing structure.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190621070811.7006-31-tvrtko.ursulin@linux.intel.com
drivers/gpu/drm/i915/gem/i915_gem_context.c
drivers/gpu/drm/i915/gt/intel_engine_cs.c
drivers/gpu/drm/i915/gt/intel_lrc.c
drivers/gpu/drm/i915/gt/intel_ringbuffer.c
drivers/gpu/drm/i915/gt/mock_engine.c
drivers/gpu/drm/i915/i915_timeline.c
drivers/gpu/drm/i915/i915_timeline.h
drivers/gpu/drm/i915/i915_timeline_types.h
drivers/gpu/drm/i915/selftests/i915_timeline.c
drivers/gpu/drm/i915/selftests/mock_timeline.c

index 35871c8a42a61be58be82fe3b0b0ffa4cd65997b..fb691535fbf2db3f060f6ee1a61a51d40ed2027f 100644 (file)
@@ -530,7 +530,7 @@ i915_gem_create_context(struct drm_i915_private *dev_priv, unsigned int flags)
        if (flags & I915_CONTEXT_CREATE_FLAGS_SINGLE_TIMELINE) {
                struct i915_timeline *timeline;
 
-               timeline = i915_timeline_create(dev_priv, NULL);
+               timeline = i915_timeline_create(&dev_priv->gt, NULL);
                if (IS_ERR(timeline)) {
                        context_close(ctx);
                        return ERR_CAST(timeline);
index 5fee1e184b6b8a5642de7472d3f44560ff3387f9..89edf97d8ad7d8534dcb879cab71ec36e93952aa 100644 (file)
@@ -740,8 +740,8 @@ static int measure_breadcrumb_dw(struct intel_engine_cs *engine)
        if (!frame)
                return -ENOMEM;
 
-       if (i915_timeline_init(engine->i915,
-                              &frame->timeline,
+       if (i915_timeline_init(&frame->timeline,
+                              engine->gt,
                               engine->status_page.vma))
                goto out_frame;
 
index f9f6d2bd29211645cb2006587e51c94006c64b34..415fdf2eb997e395969d5b85111b3cc371a8f319 100644 (file)
@@ -3005,12 +3005,13 @@ err_unpin_ctx:
        return ret;
 }
 
-static struct i915_timeline *get_timeline(struct i915_gem_context *ctx)
+static struct i915_timeline *
+get_timeline(struct i915_gem_context *ctx, struct intel_gt *gt)
 {
        if (ctx->timeline)
                return i915_timeline_get(ctx->timeline);
        else
-               return i915_timeline_create(ctx->i915, NULL);
+               return i915_timeline_create(gt, NULL);
 }
 
 static int execlists_context_deferred_alloc(struct intel_context *ce,
@@ -3044,7 +3045,7 @@ static int execlists_context_deferred_alloc(struct intel_context *ce,
                goto error_deref_obj;
        }
 
-       timeline = get_timeline(ce->gem_context);
+       timeline = get_timeline(ce->gem_context, engine->gt);
        if (IS_ERR(timeline)) {
                ret = PTR_ERR(timeline);
                goto error_deref_obj;
index e8e00df056e10abeafcc1a88fc957b64a76b2644..9a748be0ce0c52531ea9376acb3b0d595690b61c 100644 (file)
@@ -2273,7 +2273,7 @@ int intel_ring_submission_init(struct intel_engine_cs *engine)
        struct intel_ring *ring;
        int err;
 
-       timeline = i915_timeline_create(engine->i915, engine->status_page.vma);
+       timeline = i915_timeline_create(engine->gt, engine->status_page.vma);
        if (IS_ERR(timeline)) {
                err = PTR_ERR(timeline);
                goto err;
index b022af3385f3724764e90a83456fb8404b982c2e..423027aa71cdd52df478e497ec90f3ade2e33376 100644 (file)
@@ -56,7 +56,7 @@ static struct intel_ring *mock_ring(struct intel_engine_cs *engine)
        if (!ring)
                return NULL;
 
-       if (i915_timeline_init(engine->i915, &ring->timeline, NULL)) {
+       if (i915_timeline_init(&ring->timeline, engine->gt, NULL)) {
                kfree(ring);
                return NULL;
        }
index dc885a13b16d5cfb3d2ac7562279aeb082da1d58..3e2c3169dc69e4ad7017bd4a4c7263180ed00e28 100644 (file)
@@ -4,6 +4,8 @@
  * Copyright © 2016-2018 Intel Corporation
  */
 
+#include "gt/intel_gt_types.h"
+
 #include "i915_drv.h"
 
 #include "i915_active.h"
@@ -14,7 +16,8 @@
 #define ptr_test_bit(ptr, bit) ((unsigned long)(ptr) & BIT(bit))
 
 struct i915_timeline_hwsp {
-       struct i915_gt_timelines *gt;
+       struct intel_gt *gt;
+       struct i915_gt_timelines *gt_timelines;
        struct list_head free_link;
        struct i915_vma *vma;
        u64 free_bitmap;
@@ -28,14 +31,9 @@ struct i915_timeline_cacheline {
 #define CACHELINE_FREE CACHELINE_BITS
 };
 
-static inline struct drm_i915_private *
-hwsp_to_i915(struct i915_timeline_hwsp *hwsp)
-{
-       return container_of(hwsp->gt, struct drm_i915_private, gt.timelines);
-}
-
-static struct i915_vma *__hwsp_alloc(struct drm_i915_private *i915)
+static struct i915_vma *__hwsp_alloc(struct intel_gt *gt)
 {
+       struct drm_i915_private *i915 = gt->i915;
        struct drm_i915_gem_object *obj;
        struct i915_vma *vma;
 
@@ -45,7 +43,7 @@ static struct i915_vma *__hwsp_alloc(struct drm_i915_private *i915)
 
        i915_gem_object_set_cache_coherency(obj, I915_CACHE_LLC);
 
-       vma = i915_vma_instance(obj, &i915->ggtt.vm, NULL);
+       vma = i915_vma_instance(obj, &gt->ggtt->vm, NULL);
        if (IS_ERR(vma))
                i915_gem_object_put(obj);
 
@@ -55,8 +53,7 @@ static struct i915_vma *__hwsp_alloc(struct drm_i915_private *i915)
 static struct i915_vma *
 hwsp_alloc(struct i915_timeline *timeline, unsigned int *cacheline)
 {
-       struct drm_i915_private *i915 = timeline->i915;
-       struct i915_gt_timelines *gt = &i915->gt.timelines;
+       struct i915_gt_timelines *gt = &timeline->gt->timelines;
        struct i915_timeline_hwsp *hwsp;
 
        BUILD_BUG_ON(BITS_PER_TYPE(u64) * CACHELINE_BYTES > PAGE_SIZE);
@@ -75,16 +72,17 @@ hwsp_alloc(struct i915_timeline *timeline, unsigned int *cacheline)
                if (!hwsp)
                        return ERR_PTR(-ENOMEM);
 
-               vma = __hwsp_alloc(i915);
+               vma = __hwsp_alloc(timeline->gt);
                if (IS_ERR(vma)) {
                        kfree(hwsp);
                        return vma;
                }
 
                vma->private = hwsp;
+               hwsp->gt = timeline->gt;
                hwsp->vma = vma;
                hwsp->free_bitmap = ~0ull;
-               hwsp->gt = gt;
+               hwsp->gt_timelines = gt;
 
                spin_lock_irq(&gt->hwsp_lock);
                list_add(&hwsp->free_link, &gt->hwsp_free_list);
@@ -104,7 +102,7 @@ hwsp_alloc(struct i915_timeline *timeline, unsigned int *cacheline)
 
 static void __idle_hwsp_free(struct i915_timeline_hwsp *hwsp, int cacheline)
 {
-       struct i915_gt_timelines *gt = hwsp->gt;
+       struct i915_gt_timelines *gt = hwsp->gt_timelines;
        unsigned long flags;
 
        spin_lock_irqsave(&gt->hwsp_lock, flags);
@@ -170,7 +168,7 @@ cacheline_alloc(struct i915_timeline_hwsp *hwsp, unsigned int cacheline)
        cl->hwsp = hwsp;
        cl->vaddr = page_pack_bits(vaddr, cacheline);
 
-       i915_active_init(hwsp_to_i915(hwsp), &cl->active, __cacheline_retire);
+       i915_active_init(hwsp->gt->i915, &cl->active, __cacheline_retire);
 
        return cl;
 }
@@ -196,8 +194,8 @@ static void cacheline_free(struct i915_timeline_cacheline *cl)
                __idle_cacheline_free(cl);
 }
 
-int i915_timeline_init(struct drm_i915_private *i915,
-                      struct i915_timeline *timeline,
+int i915_timeline_init(struct i915_timeline *timeline,
+                      struct intel_gt *gt,
                       struct i915_vma *hwsp)
 {
        void *vaddr;
@@ -212,7 +210,7 @@ int i915_timeline_init(struct drm_i915_private *i915,
         */
        BUILD_BUG_ON(KSYNCMAP < I915_NUM_ENGINES);
 
-       timeline->i915 = i915;
+       timeline->gt = gt;
        timeline->pin_count = 0;
        timeline->has_initial_breadcrumb = !hwsp;
        timeline->hwsp_cacheline = NULL;
@@ -282,7 +280,7 @@ void i915_timelines_init(struct drm_i915_private *i915)
 
 static void timeline_add_to_active(struct i915_timeline *tl)
 {
-       struct i915_gt_timelines *gt = &tl->i915->gt.timelines;
+       struct i915_gt_timelines *gt = &tl->gt->timelines;
 
        mutex_lock(&gt->mutex);
        list_add(&tl->link, &gt->active_list);
@@ -291,7 +289,7 @@ static void timeline_add_to_active(struct i915_timeline *tl)
 
 static void timeline_remove_from_active(struct i915_timeline *tl)
 {
-       struct i915_gt_timelines *gt = &tl->i915->gt.timelines;
+       struct i915_gt_timelines *gt = &tl->gt->timelines;
 
        mutex_lock(&gt->mutex);
        list_del(&tl->link);
@@ -347,8 +345,7 @@ void i915_timeline_fini(struct i915_timeline *timeline)
 }
 
 struct i915_timeline *
-i915_timeline_create(struct drm_i915_private *i915,
-                    struct i915_vma *global_hwsp)
+i915_timeline_create(struct intel_gt *gt, struct i915_vma *global_hwsp)
 {
        struct i915_timeline *timeline;
        int err;
@@ -357,7 +354,7 @@ i915_timeline_create(struct drm_i915_private *i915,
        if (!timeline)
                return ERR_PTR(-ENOMEM);
 
-       err = i915_timeline_init(i915, timeline, global_hwsp);
+       err = i915_timeline_init(timeline, gt, global_hwsp);
        if (err) {
                kfree(timeline);
                return ERR_PTR(err);
index 36e5e5a651555666c510a530c4ce7b893c89a1b7..a454d49f229f9b1b14549c4dd5d5bb4e2ab1c0b4 100644 (file)
 #include "i915_syncmap.h"
 #include "i915_timeline_types.h"
 
-int i915_timeline_init(struct drm_i915_private *i915,
-                      struct i915_timeline *tl,
+int i915_timeline_init(struct i915_timeline *tl,
+                      struct intel_gt *gt,
                       struct i915_vma *hwsp);
 void i915_timeline_fini(struct i915_timeline *tl);
 
 struct i915_timeline *
-i915_timeline_create(struct drm_i915_private *i915,
-                    struct i915_vma *global_hwsp);
+i915_timeline_create(struct intel_gt *gt, struct i915_vma *global_hwsp);
 
 static inline struct i915_timeline *
 i915_timeline_get(struct i915_timeline *timeline)
index fce5cb4f10902cfbe9444aec87cadca13aa78a2c..931585e12d4176de4f9d94065c9c2d46a8796763 100644 (file)
@@ -59,7 +59,7 @@ struct i915_timeline {
        struct i915_syncmap *sync;
 
        struct list_head link;
-       struct drm_i915_private *i915;
+       struct intel_gt *gt;
 
        struct kref kref;
 };
index 76d3977f1d4b32e74e027079b1749fd7bf88ed84..44d031446f08303005b614eeefeadc63b2001acd 100644 (file)
@@ -66,7 +66,7 @@ static int __mock_hwsp_timeline(struct mock_hwsp_freelist *state,
                unsigned long cacheline;
                int err;
 
-               tl = i915_timeline_create(state->i915, NULL);
+               tl = i915_timeline_create(&state->i915->gt, NULL);
                if (IS_ERR(tl))
                        return PTR_ERR(tl);
 
@@ -448,7 +448,7 @@ tl_write(struct i915_timeline *tl, struct intel_engine_cs *engine, u32 value)
        struct i915_request *rq;
        int err;
 
-       lockdep_assert_held(&tl->i915->drm.struct_mutex); /* lazy rq refs */
+       lockdep_assert_held(&tl->gt->i915->drm.struct_mutex); /* lazy rq refs */
 
        err = i915_timeline_pin(tl);
        if (err) {
@@ -478,7 +478,7 @@ checked_i915_timeline_create(struct drm_i915_private *i915)
 {
        struct i915_timeline *tl;
 
-       tl = i915_timeline_create(i915, NULL);
+       tl = i915_timeline_create(&i915->gt, NULL);
        if (IS_ERR(tl))
                return tl;
 
@@ -660,7 +660,7 @@ static int live_hwsp_wrap(void *arg)
        mutex_lock(&i915->drm.struct_mutex);
        wakeref = intel_runtime_pm_get(&i915->runtime_pm);
 
-       tl = i915_timeline_create(i915, NULL);
+       tl = i915_timeline_create(&i915->gt, NULL);
        if (IS_ERR(tl)) {
                err = PTR_ERR(tl);
                goto out_rpm;
index 65b52be23d42cf9cd150fd1f9857cd73000a2653..c80ac0fbdd3b38f6d5bcab1ce6a2404f2b420a64 100644 (file)
@@ -10,7 +10,7 @@
 
 void mock_timeline_init(struct i915_timeline *timeline, u64 context)
 {
-       timeline->i915 = NULL;
+       timeline->gt = NULL;
        timeline->fence_context = context;
 
        mutex_init(&timeline->mutex);