[Intel-gfx] [RFC] drm/i915: Remove FIXME_lrc_ctx backpointer
The first pass implementation of execlists required a backpointer to the context to be held in the intel_ringbuffer. However the context pointer is available higher in the call stack. Remove the backpointer from the ring buffer structure and instead pass it down through the call stack. Signed-off-by: Nick Hoath nicholas.ho...@intel.com --- drivers/gpu/drm/i915/i915_gem.c | 7 ++-- drivers/gpu/drm/i915/intel_lrc.c| 65 - drivers/gpu/drm/i915/intel_lrc.h| 10 +++-- drivers/gpu/drm/i915/intel_ringbuffer.h | 14 +++ 4 files changed, 56 insertions(+), 40 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index e9c783d..724bbdf 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -2322,6 +2322,7 @@ int __i915_add_request(struct intel_engine_cs *ring, struct drm_i915_gem_request *request; struct intel_ringbuffer *ringbuf; u32 request_ring_position, request_start; + struct intel_context *ctx = NULL; int ret; request = ring-preallocated_lazy_request; @@ -2329,7 +2330,7 @@ int __i915_add_request(struct intel_engine_cs *ring, return -ENOMEM; if (i915.enable_execlists) { - struct intel_context *ctx = request-ctx; + ctx = request-ctx; ringbuf = ctx-engine[ring-id].ringbuf; } else ringbuf = ring-buffer; @@ -2343,7 +2344,7 @@ int __i915_add_request(struct intel_engine_cs *ring, * what. */ if (i915.enable_execlists) { - ret = logical_ring_flush_all_caches(ringbuf); + ret = logical_ring_flush_all_caches(ringbuf, ctx); if (ret) return ret; } else { @@ -2360,7 +2361,7 @@ int __i915_add_request(struct intel_engine_cs *ring, request_ring_position = intel_ring_get_tail(ringbuf); if (i915.enable_execlists) { - ret = ring-emit_request(ringbuf); + ret = ring-emit_request(ringbuf, ctx); if (ret) return ret; } else { diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index 803fc38..1be836a 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c @@ -578,7 +578,8 @@ static int execlists_context_queue(struct intel_engine_cs *ring, return 0; } -static int logical_ring_invalidate_all_caches(struct intel_ringbuffer *ringbuf) +static int logical_ring_invalidate_all_caches(struct intel_ringbuffer *ringbuf, + struct intel_context *ctx) { struct intel_engine_cs *ring = ringbuf-ring; uint32_t flush_domains; @@ -588,7 +589,8 @@ static int logical_ring_invalidate_all_caches(struct intel_ringbuffer *ringbuf) if (ring-gpu_caches_dirty) flush_domains = I915_GEM_GPU_DOMAINS; - ret = ring-emit_flush(ringbuf, I915_GEM_GPU_DOMAINS, flush_domains); + ret = ring-emit_flush(ringbuf, ctx, + I915_GEM_GPU_DOMAINS, flush_domains); if (ret) return ret; @@ -597,6 +599,7 @@ static int logical_ring_invalidate_all_caches(struct intel_ringbuffer *ringbuf) } static int execlists_move_to_gpu(struct intel_ringbuffer *ringbuf, +struct intel_context *ctx, struct list_head *vmas) { struct intel_engine_cs *ring = ringbuf-ring; @@ -624,7 +627,7 @@ static int execlists_move_to_gpu(struct intel_ringbuffer *ringbuf, /* Unconditionally invalidate gpu caches and ensure that we do flush * any residual writes from the previous batch. */ - return logical_ring_invalidate_all_caches(ringbuf); + return logical_ring_invalidate_all_caches(ringbuf, ctx); } /** @@ -704,13 +707,13 @@ int intel_execlists_submission(struct drm_device *dev, struct drm_file *file, return -EINVAL; } - ret = execlists_move_to_gpu(ringbuf, vmas); + ret = execlists_move_to_gpu(ringbuf, ctx, vmas); if (ret) return ret; if (ring == dev_priv-ring[RCS] instp_mode != dev_priv-relative_constants_mode) { - ret = intel_logical_ring_begin(ringbuf, 4); + ret = intel_logical_ring_begin(ringbuf, ctx, 4); if (ret) return ret; @@ -723,7 +726,7 @@ int intel_execlists_submission(struct drm_device *dev, struct drm_file *file, dev_priv-relative_constants_mode = instp_mode; } - ret = ring-emit_bb_start(ringbuf, exec_start, flags); + ret = ring-emit_bb_start(ringbuf, ctx, exec_start, flags); if (ret) return ret; @@ -755,7 +758,8 @@ void intel_logical_ring_stop(struct intel_engine_cs *ring)
[Intel-gfx] [RFC] drm/i915: Remove FIXME_lrc_ctx backpointer
The first pass implementation of execlists required a backpointer to the context to be held in the intel_ringbuffer. However the context pointer is available higher in the call stack. Remove the backpointer from the ring buffer structure and instead pass it down through the call stack. Signed-off-by: Nick Hoath nicholas.ho...@intel.com CC: Chris Harris chris.har...@intel.com --- drivers/gpu/drm/i915/i915_gem.c | 7 ++-- drivers/gpu/drm/i915/intel_lrc.c| 65 - drivers/gpu/drm/i915/intel_lrc.h| 10 +++-- drivers/gpu/drm/i915/intel_ringbuffer.h | 14 +++ 4 files changed, 56 insertions(+), 40 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index e9c783d..724bbdf 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -2322,6 +2322,7 @@ int __i915_add_request(struct intel_engine_cs *ring, struct drm_i915_gem_request *request; struct intel_ringbuffer *ringbuf; u32 request_ring_position, request_start; + struct intel_context *ctx = NULL; int ret; request = ring-preallocated_lazy_request; @@ -2329,7 +2330,7 @@ int __i915_add_request(struct intel_engine_cs *ring, return -ENOMEM; if (i915.enable_execlists) { - struct intel_context *ctx = request-ctx; + ctx = request-ctx; ringbuf = ctx-engine[ring-id].ringbuf; } else ringbuf = ring-buffer; @@ -2343,7 +2344,7 @@ int __i915_add_request(struct intel_engine_cs *ring, * what. */ if (i915.enable_execlists) { - ret = logical_ring_flush_all_caches(ringbuf); + ret = logical_ring_flush_all_caches(ringbuf, ctx); if (ret) return ret; } else { @@ -2360,7 +2361,7 @@ int __i915_add_request(struct intel_engine_cs *ring, request_ring_position = intel_ring_get_tail(ringbuf); if (i915.enable_execlists) { - ret = ring-emit_request(ringbuf); + ret = ring-emit_request(ringbuf, ctx); if (ret) return ret; } else { diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index 803fc38..1be836a 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c @@ -578,7 +578,8 @@ static int execlists_context_queue(struct intel_engine_cs *ring, return 0; } -static int logical_ring_invalidate_all_caches(struct intel_ringbuffer *ringbuf) +static int logical_ring_invalidate_all_caches(struct intel_ringbuffer *ringbuf, + struct intel_context *ctx) { struct intel_engine_cs *ring = ringbuf-ring; uint32_t flush_domains; @@ -588,7 +589,8 @@ static int logical_ring_invalidate_all_caches(struct intel_ringbuffer *ringbuf) if (ring-gpu_caches_dirty) flush_domains = I915_GEM_GPU_DOMAINS; - ret = ring-emit_flush(ringbuf, I915_GEM_GPU_DOMAINS, flush_domains); + ret = ring-emit_flush(ringbuf, ctx, + I915_GEM_GPU_DOMAINS, flush_domains); if (ret) return ret; @@ -597,6 +599,7 @@ static int logical_ring_invalidate_all_caches(struct intel_ringbuffer *ringbuf) } static int execlists_move_to_gpu(struct intel_ringbuffer *ringbuf, +struct intel_context *ctx, struct list_head *vmas) { struct intel_engine_cs *ring = ringbuf-ring; @@ -624,7 +627,7 @@ static int execlists_move_to_gpu(struct intel_ringbuffer *ringbuf, /* Unconditionally invalidate gpu caches and ensure that we do flush * any residual writes from the previous batch. */ - return logical_ring_invalidate_all_caches(ringbuf); + return logical_ring_invalidate_all_caches(ringbuf, ctx); } /** @@ -704,13 +707,13 @@ int intel_execlists_submission(struct drm_device *dev, struct drm_file *file, return -EINVAL; } - ret = execlists_move_to_gpu(ringbuf, vmas); + ret = execlists_move_to_gpu(ringbuf, ctx, vmas); if (ret) return ret; if (ring == dev_priv-ring[RCS] instp_mode != dev_priv-relative_constants_mode) { - ret = intel_logical_ring_begin(ringbuf, 4); + ret = intel_logical_ring_begin(ringbuf, ctx, 4); if (ret) return ret; @@ -723,7 +726,7 @@ int intel_execlists_submission(struct drm_device *dev, struct drm_file *file, dev_priv-relative_constants_mode = instp_mode; } - ret = ring-emit_bb_start(ringbuf, exec_start, flags); + ret = ring-emit_bb_start(ringbuf, ctx, exec_start, flags); if (ret) return ret; @@ -755,7 +758,8 @@ void