Skip to content

Commit

Permalink
drm/i915: Allow ringbuffers to be bound anywhere
Browse files Browse the repository at this point in the history
Now that we have WC vmapping available, we can bind our rings anywhere
in the GGTT and do not need to restrict them to the mappable region.
Except for stolen objects, for which direct access is verbatim and we
must use the mappable aperture.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20160818161718.27187-17-chris@chris-wilson.co.uk
  • Loading branch information
Chris Wilson committed Aug 18, 2016
1 parent 05a20d0 commit 9d80841
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 8 deletions.
15 changes: 8 additions & 7 deletions drivers/gpu/drm/i915/intel_ringbuffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -1892,17 +1892,20 @@ int intel_ring_pin(struct intel_ring *ring)
{
/* Ring wraparound at offset 0 sometimes hangs. No idea why. */
unsigned int flags = PIN_GLOBAL | PIN_OFFSET_BIAS | 4096;
enum i915_map_type map;
struct i915_vma *vma = ring->vma;
void *addr;
int ret;

GEM_BUG_ON(ring->vaddr);

if (ring->needs_iomap)
map = HAS_LLC(ring->engine->i915) ? I915_MAP_WB : I915_MAP_WC;

if (vma->obj->stolen)
flags |= PIN_MAPPABLE;

if (!(vma->flags & I915_VMA_GLOBAL_BIND)) {
if (flags & PIN_MAPPABLE)
if (flags & PIN_MAPPABLE || map == I915_MAP_WC)
ret = i915_gem_object_set_to_gtt_domain(vma->obj, true);
else
ret = i915_gem_object_set_to_cpu_domain(vma->obj, true);
Expand All @@ -1914,10 +1917,10 @@ int intel_ring_pin(struct intel_ring *ring)
if (unlikely(ret))
return ret;

if (flags & PIN_MAPPABLE)
if (i915_vma_is_map_and_fenceable(vma))
addr = (void __force *)i915_vma_pin_iomap(vma);
else
addr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
addr = i915_gem_object_pin_map(vma->obj, map);
if (IS_ERR(addr))
goto err;

Expand All @@ -1934,7 +1937,7 @@ void intel_ring_unpin(struct intel_ring *ring)
GEM_BUG_ON(!ring->vma);
GEM_BUG_ON(!ring->vaddr);

if (ring->needs_iomap)
if (i915_vma_is_map_and_fenceable(ring->vma))
i915_vma_unpin_iomap(ring->vma);
else
i915_gem_object_unpin_map(ring->vma->obj);
Expand Down Expand Up @@ -2005,8 +2008,6 @@ intel_engine_create_ring(struct intel_engine_cs *engine, int size)
return ERR_CAST(vma);
}
ring->vma = vma;
if (!HAS_LLC(engine->i915) || vma->obj->stolen)
ring->needs_iomap = true;

list_add(&ring->link, &engine->buffers);
return ring;
Expand Down
1 change: 0 additions & 1 deletion drivers/gpu/drm/i915/intel_ringbuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@ struct intel_ring {
int space;
int size;
int effective_size;
bool needs_iomap;

/** We track the position of the requests in the ring buffer, and
* when each is retired we increment last_retired_head as the GPU
Expand Down

0 comments on commit 9d80841

Please sign in to comment.