Commit a06eb9be authored by Stanislaw Gruszka's avatar Stanislaw Gruszka
Browse files

accel/ivpu: Assure device is off if power up sequence fail



We should not leave device half enabled if there is failure somewhere
it power up sequence. Fix device init and resume paths.

Reviewed-by: default avatarKarol Wachowski <karol.wachowski@linux.intel.com>
Signed-off-by: default avatarStanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
Reviewed-by: default avatarJeffrey Hugo <quic_jhugo@quicinc.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231028155936.1183342-3-stanislaw.gruszka@linux.intel.com
parent bfc87f90
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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)
+17 −13
Original line number Diff line number Diff line
@@ -70,28 +70,32 @@ static int ivpu_resume(struct ivpu_device *vdev)
	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) {
	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_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);
	}
	}

	return ret;
}