Commit 7d4d1c54 authored by John Harrison's avatar John Harrison
Browse files

drm/xe/guc: Support crash dump notification from GuC



Add support for the two crash dump notifications from GuC. Either one
means GuC is toast, so just capture state trigger a reset.

Signed-off-by: default avatarJohn Harrison <John.C.Harrison@Intel.com>
Reviewed-by: default avatarMatthew Brost <matthew.brost@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241108212737.2044007-3-John.C.Harrison@Intel.com
parent 902de142
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ enum {
	CT_DEAD_PARSE_G2H_UNKNOWN,		/* 0x1000 */
	CT_DEAD_PARSE_G2H_ORIGIN,		/* 0x2000 */
	CT_DEAD_PARSE_G2H_TYPE,			/* 0x4000 */
	CT_DEAD_CRASH,				/* 0x8000 */
};

static void ct_dead_worker_func(struct work_struct *w);
@@ -1120,6 +1121,24 @@ static int parse_g2h_event(struct xe_guc_ct *ct, u32 *msg, u32 len)
	return 0;
}

static int guc_crash_process_msg(struct xe_guc_ct *ct, u32 action)
{
	struct xe_gt *gt = ct_to_gt(ct);

	if (action == XE_GUC_ACTION_NOTIFY_CRASH_DUMP_POSTED)
		xe_gt_err(gt, "GuC Crash dump notification\n");
	else if (action == XE_GUC_ACTION_NOTIFY_EXCEPTION)
		xe_gt_err(gt, "GuC Exception notification\n");
	else
		xe_gt_err(gt, "Unknown GuC crash notification: 0x%04X\n", action);

	CT_DEAD(ct, NULL, CRASH);

	kick_reset(ct);

	return 0;
}

static int parse_g2h_response(struct xe_guc_ct *ct, u32 *msg, u32 len)
{
	struct xe_gt *gt =  ct_to_gt(ct);
@@ -1294,6 +1313,10 @@ static int process_g2h_msg(struct xe_guc_ct *ct, u32 *msg, u32 len)
	case GUC_ACTION_GUC2PF_ADVERSE_EVENT:
		ret = xe_gt_sriov_pf_monitor_process_guc2pf(gt, hxg, hxg_len);
		break;
	case XE_GUC_ACTION_NOTIFY_CRASH_DUMP_POSTED:
	case XE_GUC_ACTION_NOTIFY_EXCEPTION:
		ret = guc_crash_process_msg(ct, action);
		break;
	default:
		xe_gt_err(gt, "unexpected G2H action 0x%04x\n", action);
	}