drm/xe/uc: Fix uC status tracking
authorDaniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Wed, 13 Sep 2023 23:28:36 +0000 (16:28 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 21 Dec 2023 16:41:14 +0000 (11:41 -0500)
The current uC status tracking has a few issues:

1) the HuC is moved to "disabled" instead of "not supported"

2) the status is left uninitialized instead of "disabled" when the
   modparam is used to disable support

3) due to #1, a number of checks are done against "disabled" instead of
   the appropriate status.

Address all of those by making sure to follow the appropriate state
transition and checking against the required state.

v2: rebase on s/guc_submission_enabled/uc_enabled/

Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: John Harrison <John.C.Harrison@Intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: John Harrison <John.C.Harrison@Intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_guc.c
drivers/gpu/drm/xe/xe_huc.c
drivers/gpu/drm/xe/xe_uc.c
drivers/gpu/drm/xe/xe_uc_fw.c
drivers/gpu/drm/xe/xe_wopcm.c

index 134019fdda7eb762181df074627e764c83ab3249..84f0b5488783b9eff888d2ae6d8d58a0f5997026 100644 (file)
@@ -242,6 +242,9 @@ int xe_guc_init(struct xe_guc *guc)
        if (ret)
                goto out;
 
+       if (!xe_uc_fw_is_enabled(&guc->fw))
+               return 0;
+
        ret = xe_guc_log_init(&guc->log);
        if (ret)
                goto out;
index c856da1e94229f170021a8e67f02fbeebb95cace..293403d16f25c434eddd3f1a2778afaa59d41baf 100644 (file)
@@ -43,22 +43,21 @@ int xe_huc_init(struct xe_huc *huc)
        if (ret)
                goto out;
 
+       if (!xe_uc_fw_is_enabled(&huc->fw))
+               return 0;
+
        xe_uc_fw_change_status(&huc->fw, XE_UC_FIRMWARE_LOADABLE);
 
        return 0;
 
 out:
-       if (xe_uc_fw_is_disabled(&huc->fw)) {
-               drm_info(&xe->drm, "HuC disabled\n");
-               return 0;
-       }
        drm_err(&xe->drm, "HuC init failed with %d", ret);
        return ret;
 }
 
 int xe_huc_upload(struct xe_huc *huc)
 {
-       if (xe_uc_fw_is_disabled(&huc->fw))
+       if (!xe_uc_fw_is_loadable(&huc->fw))
                return 0;
        return xe_uc_fw_upload(&huc->fw, 0, HUC_UKERNEL);
 }
@@ -70,7 +69,7 @@ int xe_huc_auth(struct xe_huc *huc)
        struct xe_guc *guc = huc_to_guc(huc);
        int ret;
 
-       if (xe_uc_fw_is_disabled(&huc->fw))
+       if (!xe_uc_fw_is_loadable(&huc->fw))
                return 0;
 
        xe_assert(xe, !xe_uc_fw_is_running(&huc->fw));
@@ -107,7 +106,7 @@ fail:
 
 void xe_huc_sanitize(struct xe_huc *huc)
 {
-       if (xe_uc_fw_is_disabled(&huc->fw))
+       if (!xe_uc_fw_is_loadable(&huc->fw))
                return;
        xe_uc_fw_change_status(&huc->fw, XE_UC_FIRMWARE_LOADABLE);
 }
@@ -119,7 +118,7 @@ void xe_huc_print_info(struct xe_huc *huc, struct drm_printer *p)
 
        xe_uc_fw_print(&huc->fw, p);
 
-       if (xe_uc_fw_is_disabled(&huc->fw))
+       if (!xe_uc_fw_is_enabled(&huc->fw))
                return;
 
        err = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
index 5b7d6177c1c261d4657fcad51e7b905328b4bda7..784f53c5f282f5817938c9a21ec8ef1dfb360644 100644 (file)
@@ -31,9 +31,10 @@ int xe_uc_init(struct xe_uc *uc)
 {
        int ret;
 
-       /* GuC submission not enabled, nothing to do */
-       if (!xe_device_uc_enabled(uc_to_xe(uc)))
-               return 0;
+       /*
+        * We call the GuC/HuC init functions even if GuC submission is off to
+        * correctly move our tracking of the FW state to "disabled".
+        */
 
        ret = xe_guc_init(&uc->guc);
        if (ret)
@@ -43,6 +44,9 @@ int xe_uc_init(struct xe_uc *uc)
        if (ret)
                goto err;
 
+       if (!xe_device_uc_enabled(uc_to_xe(uc)))
+               return 0;
+
        ret = xe_wopcm_init(&uc->wopcm);
        if (ret)
                goto err;
index efc70836453d0bee457fa1ad3960baa027697ec2..a890ece72f34e132f8d81b4d45b7e4f3930a67fa 100644 (file)
@@ -340,17 +340,19 @@ int xe_uc_fw_init(struct xe_uc_fw *uc_fw)
        xe_assert(xe, !uc_fw->path);
 
        uc_fw_auto_select(xe, uc_fw);
-       xe_uc_fw_change_status(uc_fw, uc_fw->path ? *uc_fw->path ?
+       xe_uc_fw_change_status(uc_fw, uc_fw->path ?
                               XE_UC_FIRMWARE_SELECTED :
-                              XE_UC_FIRMWARE_DISABLED :
                               XE_UC_FIRMWARE_NOT_SUPPORTED);
 
-       /* Transform no huc in the list into firmware disabled */
-       if (uc_fw->type == XE_UC_FW_TYPE_HUC && !xe_uc_fw_is_supported(uc_fw)) {
+       if (!xe_uc_fw_is_supported(uc_fw))
+               return 0;
+
+       if (!xe_device_uc_enabled(xe)) {
                xe_uc_fw_change_status(uc_fw, XE_UC_FIRMWARE_DISABLED);
-               err = -ENOPKG;
-               return err;
+               drm_dbg(&xe->drm, "%s disabled", xe_uc_fw_type_repr(uc_fw->type));
+               return 0;
        }
+
        err = request_firmware(&fw, uc_fw->path, dev);
        if (err)
                goto fail;
index 9a85bcc18830346c95e6ab5fd6fd1a6d3ee2e828..bf85d4fa56ccc76dff2be5b3c5285c65170e561a 100644 (file)
@@ -139,8 +139,7 @@ static int __wopcm_init_regs(struct xe_device *xe, struct xe_gt *gt,
 {
        u32 base = wopcm->guc.base;
        u32 size = wopcm->guc.size;
-       u32 huc_agent = xe_uc_fw_is_disabled(&gt->uc.huc.fw) ? 0 :
-               HUC_LOADING_AGENT_GUC;
+       u32 huc_agent = xe_uc_fw_is_available(&gt->uc.huc.fw) ? HUC_LOADING_AGENT_GUC : 0;
        u32 mask;
        int err;