[PATCH 15/32] drm/i915: Pin timeline after first pin.
Maarten Lankhorst
maarten.lankhorst at linux.intel.com
Mon Sep 14 14:24:55 UTC 2020
We're starting to require the reservation lock for pinning,
so wait until we have that.
Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
---
drivers/gpu/drm/i915/gt/intel_timeline.c | 36 ++++++++++++++++--------
1 file changed, 25 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/i915/gt/intel_timeline.c b/drivers/gpu/drm/i915/gt/intel_timeline.c
index 1c410770e47d..db2779f38966 100644
--- a/drivers/gpu/drm/i915/gt/intel_timeline.c
+++ b/drivers/gpu/drm/i915/gt/intel_timeline.c
@@ -51,13 +51,26 @@ static int __timeline_active(struct i915_active *active)
return 0;
}
+static int intel_timeline_pin_map(struct intel_timeline *timeline)
+{
+ struct drm_i915_gem_object *obj = timeline->hwsp_ggtt->obj;
+ void *vaddr;
+
+ vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
+ if (IS_ERR(vaddr))
+ return PTR_ERR(vaddr);
+
+ timeline->hwsp_map = vaddr;
+ timeline->hwsp_seqno = vaddr + offset_in_page(timeline->hwsp_seqno);
+ WRITE_ONCE(*(u32 *)timeline->hwsp_seqno, 0);
+ return 0;
+}
+
static int intel_timeline_init(struct intel_timeline *timeline,
struct intel_gt *gt,
struct i915_vma *hwsp,
unsigned int offset)
{
- void *vaddr;
-
kref_init(&timeline->kref);
atomic_set(&timeline->pin_count, 0);
@@ -73,14 +86,8 @@ static int intel_timeline_init(struct intel_timeline *timeline,
return PTR_ERR(hwsp);
timeline->hwsp_ggtt = hwsp;
}
-
- vaddr = i915_gem_object_pin_map(hwsp->obj, I915_MAP_WB);
- if (IS_ERR(vaddr))
- return PTR_ERR(vaddr);
-
- timeline->hwsp_map = vaddr;
- timeline->hwsp_seqno = vaddr + timeline->hwsp_offset;
- WRITE_ONCE(*(u32 *)timeline->hwsp_seqno, 0);
+ timeline->hwsp_map = NULL;
+ timeline->hwsp_seqno = NULL + timeline->hwsp_offset;
GEM_BUG_ON(timeline->hwsp_offset >= hwsp->size);
@@ -111,7 +118,8 @@ static void intel_timeline_fini(struct intel_timeline *timeline)
GEM_BUG_ON(!list_empty(&timeline->requests));
GEM_BUG_ON(timeline->retire);
- i915_gem_object_unpin_map(timeline->hwsp_ggtt->obj);
+ if (timeline->hwsp_map)
+ i915_gem_object_unpin_map(timeline->hwsp_ggtt->obj);
i915_vma_put(timeline->hwsp_ggtt);
i915_active_fini(&timeline->active);
@@ -151,6 +159,12 @@ int intel_timeline_pin(struct intel_timeline *tl, struct i915_gem_ww_ctx *ww)
if (atomic_add_unless(&tl->pin_count, 1, 0))
return 0;
+ if (!tl->hwsp_map) {
+ err = intel_timeline_pin_map(tl);
+ if (err)
+ return err;
+ }
+
err = i915_ggtt_pin(tl->hwsp_ggtt, ww, 0, PIN_HIGH);
if (err)
return err;
--
2.28.0
More information about the Intel-gfx-trybot
mailing list