#include "i915_drv.h"
 
+static const struct intel_uc_ops uc_ops_off;
+static const struct intel_uc_ops uc_ops_on;
+
 /* Reset GuC providing us with fresh state for both GuC and HuC.
  */
 static int __intel_uc_reset_hw(struct intel_uc *uc)
        intel_huc_init_early(&uc->huc);
 
        __confirm_options(uc);
+
+       if (intel_uc_uses_guc(uc))
+               uc->ops = &uc_ops_on;
+       else
+               uc->ops = &uc_ops_off;
 }
 
 void intel_uc_driver_late_release(struct intel_uc *uc)
               (intel_uncore_read(uncore, DMA_GUC_WOPCM_OFFSET) & GUC_WOPCM_OFFSET_VALID);
 }
 
-int intel_uc_init_hw(struct intel_uc *uc)
+static int __uc_check_hw(struct intel_uc *uc)
 {
-       struct drm_i915_private *i915 = uc_to_gt(uc)->i915;
-       struct intel_guc *guc = &uc->guc;
-       struct intel_huc *huc = &uc->huc;
-       int ret, attempts;
-
        if (!intel_uc_supports_guc(uc))
                return 0;
 
         * before on this system after reboot, otherwise we risk GPU hangs.
         * To check if GuC was loaded before we look at WOPCM registers.
         */
-       if (!intel_uc_uses_guc(uc) && !uc_is_wopcm_locked(uc))
-               return 0;
+       if (uc_is_wopcm_locked(uc))
+               return -EIO;
+
+       return 0;
+}
+
+static int __uc_init_hw(struct intel_uc *uc)
+{
+       struct drm_i915_private *i915 = uc_to_gt(uc)->i915;
+       struct intel_guc *guc = &uc->guc;
+       struct intel_huc *huc = &uc->huc;
+       int ret, attempts;
+
+       GEM_BUG_ON(!intel_uc_supports_guc(uc));
+       GEM_BUG_ON(!intel_uc_uses_guc(uc));
 
        if (!intel_uc_fw_is_available(&guc->fw)) {
-               ret = uc_is_wopcm_locked(uc) ||
+               ret = __uc_check_hw(uc) ||
                      intel_uc_fw_is_overridden(&guc->fw) ||
                      intel_uc_supports_guc_submission(uc) ?
                      intel_uc_fw_status_to_error(guc->fw.status) : 0;
        return -EIO;
 }
 
-void intel_uc_fini_hw(struct intel_uc *uc)
+static void __uc_fini_hw(struct intel_uc *uc)
 {
        struct intel_guc *guc = &uc->guc;
 
         */
        return __uc_resume(uc, true);
 }
+
+static const struct intel_uc_ops uc_ops_off = {
+       .init_hw = __uc_check_hw,
+};
+
+static const struct intel_uc_ops uc_ops_on = {
+       .init_hw = __uc_init_hw,
+       .fini_hw = __uc_fini_hw,
+};
 
 #include "intel_huc.h"
 #include "i915_params.h"
 
+struct intel_uc;
+
+struct intel_uc_ops {
+       int (*init_hw)(struct intel_uc *uc);
+       void (*fini_hw)(struct intel_uc *uc);
+};
+
 struct intel_uc {
+       struct intel_uc_ops const *ops;
        struct intel_guc guc;
        struct intel_huc huc;
 
 void intel_uc_cleanup_firmwares(struct intel_uc *uc);
 void intel_uc_sanitize(struct intel_uc *uc);
 void intel_uc_init(struct intel_uc *uc);
-int intel_uc_init_hw(struct intel_uc *uc);
-void intel_uc_fini_hw(struct intel_uc *uc);
 void intel_uc_fini(struct intel_uc *uc);
 void intel_uc_reset_prepare(struct intel_uc *uc);
 void intel_uc_suspend(struct intel_uc *uc);
        return intel_huc_is_enabled(&uc->huc);
 }
 
+#define intel_uc_ops_function(_NAME, _OPS, _TYPE, _RET) \
+static inline _TYPE intel_uc_##_NAME(struct intel_uc *uc) \
+{ \
+       if (uc->ops->_OPS) \
+               return uc->ops->_OPS(uc); \
+       return _RET; \
+}
+intel_uc_ops_function(init_hw, init_hw, int, 0);
+intel_uc_ops_function(fini_hw, fini_hw, void, );
+#undef intel_uc_ops_function
+
 #endif