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:
committed by
John Harrison
parent
cad46a332f
commit
1e0fd2b5da
@@ -269,6 +269,8 @@ int intel_guc_deregister_done_process_msg(struct intel_guc *guc,
|
|||||||
const u32 *msg, u32 len);
|
const u32 *msg, u32 len);
|
||||||
int intel_guc_sched_done_process_msg(struct intel_guc *guc,
|
int intel_guc_sched_done_process_msg(struct intel_guc *guc,
|
||||||
const u32 *msg, u32 len);
|
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_prepare(struct intel_guc *guc);
|
||||||
void intel_guc_submission_reset(struct intel_guc *guc, bool stalled);
|
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:
|
case INTEL_GUC_ACTION_SCHED_CONTEXT_MODE_DONE:
|
||||||
ret = intel_guc_sched_done_process_msg(guc, payload, len);
|
ret = intel_guc_sched_done_process_msg(guc, payload, len);
|
||||||
break;
|
break;
|
||||||
|
case INTEL_GUC_ACTION_CONTEXT_RESET_NOTIFICATION:
|
||||||
|
ret = intel_guc_context_reset_process_msg(guc, payload, len);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ret = -EOPNOTSUPP;
|
ret = -EOPNOTSUPP;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -2201,6 +2201,42 @@ int intel_guc_sched_done_process_msg(struct intel_guc *guc,
|
|||||||
return 0;
|
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,
|
void intel_guc_submission_print_info(struct intel_guc *guc,
|
||||||
struct drm_printer *p)
|
struct drm_printer *p)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -920,6 +920,11 @@ DECLARE_EVENT_CLASS(intel_context,
|
|||||||
__entry->guc_sched_state_no_lock)
|
__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,
|
DEFINE_EVENT(intel_context, intel_context_register,
|
||||||
TP_PROTO(struct intel_context *ce),
|
TP_PROTO(struct intel_context *ce),
|
||||||
TP_ARGS(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
|
static inline void
|
||||||
trace_intel_context_register(struct intel_context *ce)
|
trace_intel_context_register(struct intel_context *ce)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user