Skip to content

Commit

Permalink
drm/i915: Rename helpers used for unwinding, use macro for can_preempt
Browse files Browse the repository at this point in the history
We would also like to make use of execlist_cancel_port_requests and
unwind_incomplete_requests in GuC preemption backend.
Let's rename the functions to use the correct prefixes, so that we can
simply add the declarations in the following patch.
Similar thing for applies for can_preempt, except we're introducing
HAS_LOGICAL_RING_PREEMPTION macro instad, converting other users that
were previously touching device info directly.

v2: s/intel_engine/execlists and pass execlists to unwind (Chris)
v3: use locked version for exporting, drop const qual (Chris)

Signed-off-by: Michał Winiarski <[email protected]>
Cc: Chris Wilson <[email protected]>
Cc: Joonas Lahtinen <[email protected]>
Cc: Michal Wajdeczko <[email protected]>
Reviewed-by: Chris Wilson <[email protected]>
Signed-off-by: Chris Wilson <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
  • Loading branch information
mwiniars authored and ickle committed Oct 26, 2017
1 parent fa87271 commit a4598d1
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 20 deletions.
2 changes: 1 addition & 1 deletion drivers/gpu/drm/i915/i915_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@ static int i915_getparam(struct drm_device *dev, void *data,
value |= I915_SCHEDULER_CAP_ENABLED;
value |= I915_SCHEDULER_CAP_PRIORITY;

if (INTEL_INFO(dev_priv)->has_logical_ring_preemption &&
if (HAS_LOGICAL_RING_PREEMPTION(dev_priv) &&
i915_modparams.enable_execlists &&
!i915_modparams.enable_guc_submission)
value |= I915_SCHEDULER_CAP_PREEMPTION;
Expand Down
2 changes: 2 additions & 0 deletions drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -3140,6 +3140,8 @@ intel_info(const struct drm_i915_private *dev_priv)

#define HAS_LOGICAL_RING_CONTEXTS(dev_priv) \
((dev_priv)->info.has_logical_ring_contexts)
#define HAS_LOGICAL_RING_PREEMPTION(dev_priv) \
((dev_priv)->info.has_logical_ring_preemption)
#define USES_PPGTT(dev_priv) (i915_modparams.enable_ppgtt)
#define USES_FULL_PPGTT(dev_priv) (i915_modparams.enable_ppgtt >= 2)
#define USES_FULL_48BIT_PPGTT(dev_priv) (i915_modparams.enable_ppgtt == 3)
Expand Down
6 changes: 3 additions & 3 deletions drivers/gpu/drm/i915/intel_engine_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -620,7 +620,7 @@ int intel_engine_init_common(struct intel_engine_cs *engine)
* Similarly the preempt context must always be available so that
* we can interrupt the engine at any time.
*/
if (INTEL_INFO(engine->i915)->has_logical_ring_preemption) {
if (HAS_LOGICAL_RING_PREEMPTION(engine->i915)) {
ring = engine->context_pin(engine,
engine->i915->preempt_context);
if (IS_ERR(ring)) {
Expand Down Expand Up @@ -651,7 +651,7 @@ int intel_engine_init_common(struct intel_engine_cs *engine)
err_breadcrumbs:
intel_engine_fini_breadcrumbs(engine);
err_unpin_preempt:
if (INTEL_INFO(engine->i915)->has_logical_ring_preemption)
if (HAS_LOGICAL_RING_PREEMPTION(engine->i915))
engine->context_unpin(engine, engine->i915->preempt_context);
err_unpin_kernel:
engine->context_unpin(engine, engine->i915->kernel_context);
Expand Down Expand Up @@ -679,7 +679,7 @@ void intel_engine_cleanup_common(struct intel_engine_cs *engine)
intel_engine_cleanup_cmd_parser(engine);
i915_gem_batch_pool_fini(&engine->batch_pool);

if (INTEL_INFO(engine->i915)->has_logical_ring_preemption)
if (HAS_LOGICAL_RING_PREEMPTION(engine->i915))
engine->context_unpin(engine, engine->i915->preempt_context);
engine->context_unpin(engine, engine->i915->kernel_context);
}
Expand Down
35 changes: 19 additions & 16 deletions drivers/gpu/drm/i915/intel_lrc.c
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,7 @@ static void unwind_wa_tail(struct drm_i915_gem_request *rq)
assert_ring_tail_valid(rq->ring, rq->tail);
}

static void unwind_incomplete_requests(struct intel_engine_cs *engine)
static void __unwind_incomplete_requests(struct intel_engine_cs *engine)
{
struct drm_i915_gem_request *rq, *rn;
struct i915_priolist *uninitialized_var(p);
Expand Down Expand Up @@ -385,6 +385,17 @@ static void unwind_incomplete_requests(struct intel_engine_cs *engine)
}
}

static void
execlists_unwind_incomplete_requests(struct intel_engine_execlists *execlists)
{
struct intel_engine_cs *engine =
container_of(execlists, typeof(*engine), execlists);

spin_lock_irq(&engine->timeline->lock);
__unwind_incomplete_requests(engine);
spin_unlock_irq(&engine->timeline->lock);
}

static inline void
execlists_context_status_change(struct drm_i915_gem_request *rq,
unsigned long status)
Expand Down Expand Up @@ -515,11 +526,6 @@ static void inject_preempt_context(struct intel_engine_cs *engine)
elsp_write(ce->lrc_desc, elsp);
}

static bool can_preempt(struct intel_engine_cs *engine)
{
return INTEL_INFO(engine->i915)->has_logical_ring_preemption;
}

static void execlists_dequeue(struct intel_engine_cs *engine)
{
struct intel_engine_execlists * const execlists = &engine->execlists;
Expand Down Expand Up @@ -567,7 +573,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
if (port_count(&port[0]) > 1)
goto unlock;

if (can_preempt(engine) &&
if (HAS_LOGICAL_RING_PREEMPTION(engine->i915) &&
rb_entry(rb, struct i915_priolist, node)->priority >
max(last->priotree.priority, 0)) {
/*
Expand Down Expand Up @@ -691,7 +697,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
}

static void
execlist_cancel_port_requests(struct intel_engine_execlists *execlists)
execlists_cancel_port_requests(struct intel_engine_execlists * const execlists)
{
struct execlist_port *port = execlists->port;
unsigned int num_ports = execlists_num_ports(execlists);
Expand All @@ -718,7 +724,7 @@ static void execlists_cancel_requests(struct intel_engine_cs *engine)
spin_lock_irqsave(&engine->timeline->lock, flags);

/* Cancel the requests on the HW and clear the ELSP tracker. */
execlist_cancel_port_requests(execlists);
execlists_cancel_port_requests(execlists);

/* Mark all executing requests as skipped. */
list_for_each_entry(rq, &engine->timeline->requests, link) {
Expand Down Expand Up @@ -858,11 +864,8 @@ static void intel_lrc_irq_handler(unsigned long data)

if (status & GEN8_CTX_STATUS_ACTIVE_IDLE &&
buf[2*head + 1] == PREEMPT_ID) {
execlist_cancel_port_requests(execlists);

spin_lock_irq(&engine->timeline->lock);
unwind_incomplete_requests(engine);
spin_unlock_irq(&engine->timeline->lock);
execlists_cancel_port_requests(execlists);
execlists_unwind_incomplete_requests(execlists);

GEM_BUG_ON(!execlists_is_active(execlists,
EXECLISTS_ACTIVE_PREEMPT));
Expand Down Expand Up @@ -1531,10 +1534,10 @@ static void reset_common_ring(struct intel_engine_cs *engine,
* guessing the missed context-switch events by looking at what
* requests were completed.
*/
execlist_cancel_port_requests(execlists);
execlists_cancel_port_requests(execlists);

/* Push back any incomplete requests for replay after the reset. */
unwind_incomplete_requests(engine);
__unwind_incomplete_requests(engine);

spin_unlock_irqrestore(&engine->timeline->lock, flags);

Expand Down

0 comments on commit a4598d1

Please sign in to comment.