drm/i915: Cache ringbuffer GTT VMA
authorTvrtko Ursulin <tvrtko.ursulin@intel.com>
Fri, 15 Jan 2016 15:10:28 +0000 (15:10 +0000)
committerTvrtko Ursulin <tvrtko.ursulin@intel.com>
Mon, 18 Jan 2016 09:58:40 +0000 (09:58 +0000)
Purpose is to avoid calling i915_gem_obj_ggtt_offset from the
interrupt context without the big lock held.

v2: Renamed gtt_start to gtt_offset. (Daniel Vetter)
v3: Cache the VMA instead of address. (Chris Wilson)

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1452870629-13830-2-git-send-email-tvrtko.ursulin@linux.intel.com
drivers/gpu/drm/i915/intel_lrc.c
drivers/gpu/drm/i915/intel_ringbuffer.c
drivers/gpu/drm/i915/intel_ringbuffer.h

index 86042dc1802c87ac95ab5fc65210660339b24c55..588cad58a19620d2ed7f36a5dcfb95d9c5ce6ccf 100644 (file)
@@ -391,7 +391,6 @@ static int execlists_update_context(struct drm_i915_gem_request *rq)
        struct intel_engine_cs *ring = rq->ring;
        struct i915_hw_ppgtt *ppgtt = rq->ctx->ppgtt;
        struct drm_i915_gem_object *ctx_obj = rq->ctx->engine[ring->id].state;
-       struct drm_i915_gem_object *rb_obj = rq->ringbuf->obj;
        struct page *page;
        uint32_t *reg_state;
 
@@ -401,7 +400,7 @@ static int execlists_update_context(struct drm_i915_gem_request *rq)
        reg_state = kmap_atomic(page);
 
        reg_state[CTX_RING_TAIL+1] = rq->tail;
-       reg_state[CTX_RING_BUFFER_START+1] = i915_gem_obj_ggtt_offset(rb_obj);
+       reg_state[CTX_RING_BUFFER_START+1] = rq->ringbuf->vma->node.start;
 
        if (ppgtt && !USES_FULL_48BIT_PPGTT(ppgtt->base.dev)) {
                /* True 32b PPGTT with dynamic page allocation: update PDP
index 8cd8aabcc3ffd85085ef62c4832ecb986d3cbfa6..d4e33ac02efa9413f501b51cf67ecb464915a4ac 100644 (file)
@@ -1999,6 +1999,7 @@ void intel_unpin_ringbuffer_obj(struct intel_ringbuffer *ringbuf)
        else
                iounmap(ringbuf->virtual_start);
        ringbuf->virtual_start = NULL;
+       ringbuf->vma = NULL;
        i915_gem_object_ggtt_unpin(ringbuf->obj);
 }
 
@@ -2065,6 +2066,8 @@ int intel_pin_and_map_ringbuffer_obj(struct drm_device *dev,
                }
        }
 
+       ringbuf->vma = i915_gem_obj_to_ggtt(obj);
+
        return 0;
 }
 
index 85ce2272f92cf29ed41dbb5cb6f0ce8af4d5dfc1..ede57954080e404d144204c28c754084724320f1 100644 (file)
@@ -99,6 +99,7 @@ struct intel_ring_hangcheck {
 struct intel_ringbuffer {
        struct drm_i915_gem_object *obj;
        void __iomem *virtual_start;
+       struct i915_vma *vma;
 
        struct intel_engine_cs *ring;
        struct list_head link;