@@ -861,36 +861,47 @@ static void xe_guc_exec_queue_trigger_cleanup(struct xe_exec_queue *q)
861861 xe_sched_tdr_queue_imm (& q -> guc -> sched );
862862}
863863
864- static bool guc_submit_hint_wedged (struct xe_guc * guc )
864+ /**
865+ * xe_guc_submit_wedge() - Wedge GuC submission
866+ * @guc: the GuC object
867+ *
868+ * Save exec queue's registered with GuC state by taking a ref to each queue.
869+ * Register a DRMM handler to drop refs upon driver unload.
870+ */
871+ void xe_guc_submit_wedge (struct xe_guc * guc )
865872{
866873 struct xe_device * xe = guc_to_xe (guc );
867874 struct xe_exec_queue * q ;
868875 unsigned long index ;
869876 int err ;
870877
871- if (xe -> wedged .mode != 2 )
872- return false;
873-
874- if (xe_device_wedged (xe ))
875- return true;
876-
877- xe_device_declare_wedged (xe );
878-
879- xe_guc_submit_reset_prepare (guc );
880- xe_guc_ct_stop (& guc -> ct );
878+ xe_gt_assert (guc_to_gt (guc ), guc_to_xe (guc )-> wedged .mode );
881879
882880 err = drmm_add_action_or_reset (& guc_to_xe (guc )-> drm ,
883881 guc_submit_wedged_fini , guc );
884882 if (err ) {
885883 drm_err (& xe -> drm , "Failed to register xe_guc_submit clean-up on wedged.mode=2. Although device is wedged.\n" );
886- return true; /* Device is wedged anyway */
884+ return ;
887885 }
888886
889887 mutex_lock (& guc -> submission_state .lock );
890888 xa_for_each (& guc -> submission_state .exec_queue_lookup , index , q )
891889 if (xe_exec_queue_get_unless_zero (q ))
892890 set_exec_queue_wedged (q );
893891 mutex_unlock (& guc -> submission_state .lock );
892+ }
893+
894+ static bool guc_submit_hint_wedged (struct xe_guc * guc )
895+ {
896+ struct xe_device * xe = guc_to_xe (guc );
897+
898+ if (xe -> wedged .mode != 2 )
899+ return false;
900+
901+ if (xe_device_wedged (xe ))
902+ return true;
903+
904+ xe_device_declare_wedged (xe );
894905
895906 return true;
896907}
@@ -1677,7 +1688,8 @@ int xe_guc_submit_reset_prepare(struct xe_guc *guc)
16771688
16781689void xe_guc_submit_reset_wait (struct xe_guc * guc )
16791690{
1680- wait_event (guc -> ct .wq , !guc_read_stopped (guc ));
1691+ wait_event (guc -> ct .wq , xe_device_wedged (guc_to_xe (guc )) ||
1692+ !guc_read_stopped (guc ));
16811693}
16821694
16831695void xe_guc_submit_stop (struct xe_guc * guc )
0 commit comments