drm/i915/guc: Handle context reset notification
GuC will issue a reset on detecting an engine hang and will notify the driver via a G2H message. The driver will service the notification by resetting the guilty context to a simple state or banning it completely. v2: (John Harrison) - Move msg[0] lookup after length check v3: (John Harrison) - s/drm_dbg/drm_err Cc: Matthew Brost <matthew.brost@intel.com> Cc: John Harrison <John.C.Harrison@Intel.com> Signed-off-by: Matthew Brost <matthew.brost@intel.com> Reviewed-by: John Harrison <John.C.Harrison@Intel.com> Signed-off-by: John Harrison <John.C.Harrison@Intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20210727002348.97202-13-matthew.brost@intel.com
This commit is contained in:
parent
cad46a332f
commit
1e0fd2b5da
@ -269,6 +269,8 @@ int intel_guc_deregister_done_process_msg(struct intel_guc *guc,
|
||||
const u32 *msg, u32 len);
|
||||
int intel_guc_sched_done_process_msg(struct intel_guc *guc,
|
||||
const u32 *msg, u32 len);
|
||||
int intel_guc_context_reset_process_msg(struct intel_guc *guc,
|
||||
const u32 *msg, u32 len);
|
||||
|
||||
void intel_guc_submission_reset_prepare(struct intel_guc *guc);
|
||||
void intel_guc_submission_reset(struct intel_guc *guc, bool stalled);
|
||||
|
@ -984,6 +984,9 @@ static int ct_process_request(struct intel_guc_ct *ct, struct ct_incoming_msg *r
|
||||
case INTEL_GUC_ACTION_SCHED_CONTEXT_MODE_DONE:
|
||||
ret = intel_guc_sched_done_process_msg(guc, payload, len);
|
||||
break;
|
||||
case INTEL_GUC_ACTION_CONTEXT_RESET_NOTIFICATION:
|
||||
ret = intel_guc_context_reset_process_msg(guc, payload, len);
|
||||
break;
|
||||
default:
|
||||
ret = -EOPNOTSUPP;
|
||||
break;
|
||||
|
@ -2201,6 +2201,42 @@ int intel_guc_sched_done_process_msg(struct intel_guc *guc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void guc_context_replay(struct intel_context *ce)
|
||||
{
|
||||
struct i915_sched_engine *sched_engine = ce->engine->sched_engine;
|
||||
|
||||
__guc_reset_context(ce, true);
|
||||
tasklet_hi_schedule(&sched_engine->tasklet);
|
||||
}
|
||||
|
||||
static void guc_handle_context_reset(struct intel_guc *guc,
|
||||
struct intel_context *ce)
|
||||
{
|
||||
trace_intel_context_reset(ce);
|
||||
guc_context_replay(ce);
|
||||
}
|
||||
|
||||
int intel_guc_context_reset_process_msg(struct intel_guc *guc,
|
||||
const u32 *msg, u32 len)
|
||||
{
|
||||
struct intel_context *ce;
|
||||
int desc_idx;
|
||||
|
||||
if (unlikely(len != 1)) {
|
||||
drm_err(&guc_to_gt(guc)->i915->drm, "Invalid length %u", len);
|
||||
return -EPROTO;
|
||||
}
|
||||
|
||||
desc_idx = msg[0];
|
||||
ce = g2h_context_lookup(guc, desc_idx);
|
||||
if (unlikely(!ce))
|
||||
return -EPROTO;
|
||||
|
||||
guc_handle_context_reset(guc, ce);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void intel_guc_submission_print_info(struct intel_guc *guc,
|
||||
struct drm_printer *p)
|
||||
{
|
||||
|
@ -920,6 +920,11 @@ DECLARE_EVENT_CLASS(intel_context,
|
||||
__entry->guc_sched_state_no_lock)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(intel_context, intel_context_reset,
|
||||
TP_PROTO(struct intel_context *ce),
|
||||
TP_ARGS(ce)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(intel_context, intel_context_register,
|
||||
TP_PROTO(struct intel_context *ce),
|
||||
TP_ARGS(ce)
|
||||
@ -1007,6 +1012,11 @@ trace_i915_request_out(struct i915_request *rq)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void
|
||||
trace_intel_context_reset(struct intel_context *ce)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void
|
||||
trace_intel_context_register(struct intel_context *ce)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user