void xe_gsc_load_start(struct xe_gsc *gsc)
 {
        struct xe_gt *gt = gsc_to_gt(gsc);
+       struct xe_device *xe = gt_to_xe(gt);
 
        if (!xe_uc_fw_is_loadable(&gsc->fw) || !gsc->q)
                return;
 
+       /*
+        * The GSC HW is only reset by driver FLR or D3cold entry. We don't
+        * support the former at runtime, while the latter is only supported on
+        * DGFX, for which we don't support GSC. Therefore, if GSC failed to
+        * load previously there is no need to try again because the HW is
+        * stuck in the error state.
+        */
+       xe_assert(xe, !IS_DGFX(xe));
+       if (xe_uc_fw_is_in_error_state(&gsc->fw))
+               return;
+
        /* GSC FW survives GT reset and D3Hot */
        if (gsc_fw_is_loaded(gt)) {
                xe_uc_fw_change_status(&gsc->fw, XE_UC_FIRMWARE_TRANSFERRED);
 
        return "<invalid>";
 }
 
-static inline int xe_uc_fw_status_to_error(enum xe_uc_fw_status status)
+static inline int xe_uc_fw_status_to_error(const enum xe_uc_fw_status status)
 {
        switch (status) {
        case XE_UC_FIRMWARE_NOT_SUPPORTED:
 }
 
 static inline enum xe_uc_fw_status
-__xe_uc_fw_status(struct xe_uc_fw *uc_fw)
+__xe_uc_fw_status(const struct xe_uc_fw *uc_fw)
 {
        /* shouldn't call this before checking hw/blob availability */
        XE_WARN_ON(uc_fw->status == XE_UC_FIRMWARE_UNINITIALIZED);
        return uc_fw->user_overridden;
 }
 
+static inline bool xe_uc_fw_is_in_error_state(const struct xe_uc_fw *uc_fw)
+{
+       return xe_uc_fw_status_to_error(__xe_uc_fw_status(uc_fw)) < 0;
+}
+
 static inline void xe_uc_fw_sanitize(struct xe_uc_fw *uc_fw)
 {
        if (xe_uc_fw_is_loadable(uc_fw))