mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
drm/panthor: Simplify FW fast reset path
Stop checking the FW halt_status as MCU_STATUS should be sufficient. This should make the check for successful FW halt and subsequently setting fast_reset to true more robust. We should also clear GLB_REQ.GLB_HALT bit only on post-reset prior to starting the FW and only if we're doing a fast reset, because the slow reset will re-initialize all FW sections, including the global interface. Signed-off-by: Karunika Choo <karunika.choo@arm.com> Reviewed-by: Liviu Dudau <liviu.dudau@arm.com> Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> Link: https://lore.kernel.org/r/20241119135030.3352939-1-karunika.choo@arm.com Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
This commit is contained in:
parent
dd7db8d911
commit
498893bd59
1 changed files with 8 additions and 7 deletions
|
@ -1098,17 +1098,11 @@ void panthor_fw_pre_reset(struct panthor_device *ptdev, bool on_hang)
|
||||||
panthor_fw_update_reqs(glb_iface, req, GLB_HALT, GLB_HALT);
|
panthor_fw_update_reqs(glb_iface, req, GLB_HALT, GLB_HALT);
|
||||||
gpu_write(ptdev, CSF_DOORBELL(CSF_GLB_DOORBELL_ID), 1);
|
gpu_write(ptdev, CSF_DOORBELL(CSF_GLB_DOORBELL_ID), 1);
|
||||||
if (!readl_poll_timeout(ptdev->iomem + MCU_STATUS, status,
|
if (!readl_poll_timeout(ptdev->iomem + MCU_STATUS, status,
|
||||||
status == MCU_STATUS_HALT, 10, 100000) &&
|
status == MCU_STATUS_HALT, 10, 100000)) {
|
||||||
glb_iface->output->halt_status == PANTHOR_FW_HALT_OK) {
|
|
||||||
ptdev->fw->fast_reset = true;
|
ptdev->fw->fast_reset = true;
|
||||||
} else {
|
} else {
|
||||||
drm_warn(&ptdev->base, "Failed to cleanly suspend MCU");
|
drm_warn(&ptdev->base, "Failed to cleanly suspend MCU");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The FW detects 0 -> 1 transitions. Make sure we reset
|
|
||||||
* the HALT bit before the FW is rebooted.
|
|
||||||
*/
|
|
||||||
panthor_fw_update_reqs(glb_iface, req, 0, GLB_HALT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
panthor_job_irq_suspend(&ptdev->fw->irq);
|
panthor_job_irq_suspend(&ptdev->fw->irq);
|
||||||
|
@ -1134,6 +1128,13 @@ int panthor_fw_post_reset(struct panthor_device *ptdev)
|
||||||
* the FW sections. If it fails, go for a full reset.
|
* the FW sections. If it fails, go for a full reset.
|
||||||
*/
|
*/
|
||||||
if (ptdev->fw->fast_reset) {
|
if (ptdev->fw->fast_reset) {
|
||||||
|
/* The FW detects 0 -> 1 transitions. Make sure we reset
|
||||||
|
* the HALT bit before the FW is rebooted.
|
||||||
|
* This is not needed on a slow reset because FW sections are
|
||||||
|
* re-initialized.
|
||||||
|
*/
|
||||||
|
panthor_fw_update_reqs(glb_iface, req, 0, GLB_HALT);
|
||||||
|
|
||||||
ret = panthor_fw_start(ptdev);
|
ret = panthor_fw_start(ptdev);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
Loading…
Add table
Reference in a new issue