accel/ivpu: Assure device is off if power up sequence fail
authorStanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
Sat, 28 Oct 2023 15:59:30 +0000 (17:59 +0200)
committerStanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
Tue, 31 Oct 2023 14:53:19 +0000 (15:53 +0100)
We should not leave device half enabled if there is failure somewhere
it power up sequence. Fix device init and resume paths.

Reviewed-by: Karol Wachowski <karol.wachowski@linux.intel.com>
Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231028155936.1183342-3-stanislaw.gruszka@linux.intel.com
drivers/accel/ivpu/ivpu_drv.c
drivers/accel/ivpu/ivpu_pm.c

index 39bac45d88b5ed2fbb38172cea5997efc7626018..064cabef41bb448fa2ca9fde28d5495a4ae7ad58 100644 (file)
@@ -543,7 +543,7 @@ static int ivpu_dev_init(struct ivpu_device *vdev)
        /* Power up early so the rest of init code can access VPU registers */
        ret = ivpu_hw_power_up(vdev);
        if (ret)
-               goto err_xa_destroy;
+               goto err_power_down;
 
        ret = ivpu_mmu_global_context_init(vdev);
        if (ret)
index 2d05fb9e31970d2016f3269b3cf3cc480471a56e..33d7c7731fe32659707cc845c48a6e57710818e9 100644 (file)
@@ -70,27 +70,31 @@ retry:
        ret = ivpu_hw_power_up(vdev);
        if (ret) {
                ivpu_err(vdev, "Failed to power up HW: %d\n", ret);
-               return ret;
+               goto err_power_down;
        }
 
        ret = ivpu_mmu_enable(vdev);
        if (ret) {
                ivpu_err(vdev, "Failed to resume MMU: %d\n", ret);
-               ivpu_hw_power_down(vdev);
-               return ret;
+               goto err_power_down;
        }
 
        ret = ivpu_boot(vdev);
-       if (ret) {
-               ivpu_mmu_disable(vdev);
-               ivpu_hw_power_down(vdev);
-               if (!ivpu_fw_is_cold_boot(vdev)) {
-                       ivpu_warn(vdev, "Failed to resume the FW: %d. Retrying cold boot..\n", ret);
-                       ivpu_pm_prepare_cold_boot(vdev);
-                       goto retry;
-               } else {
-                       ivpu_err(vdev, "Failed to resume the FW: %d\n", ret);
-               }
+       if (ret)
+               goto err_mmu_disable;
+
+       return 0;
+
+err_mmu_disable:
+       ivpu_mmu_disable(vdev);
+err_power_down:
+       ivpu_hw_power_down(vdev);
+
+       if (!ivpu_fw_is_cold_boot(vdev)) {
+               ivpu_pm_prepare_cold_boot(vdev);
+               goto retry;
+       } else {
+               ivpu_err(vdev, "Failed to resume the FW: %d\n", ret);
        }
 
        return ret;