mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 19:43:40 +02:00
drm/panthor: Be robust against runtime PM resume failures in the suspend path
The runtime PM resume operation is not guaranteed to succeed, but if it fails, the device should be in a suspended state. Make sure we're robust to resume failures in the unplug path. v3: - Fix typo - Add R-bs v2: - Move the bit that belonged in the next commit - Drop the panthor_device_unplug() changes Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Reviewed-by: Adrian Larumbe <adrian.larumbe@collabora.com> Reviewed-by: Steven Price <steven.price@arm.com> Link: https://patchwork.freedesktop.org/patch/msgid/20241211075419.2333731-3-boris.brezillon@collabora.com
This commit is contained in:
parent
4bd56ca822
commit
dcddad6c89
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/iosys-map.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_managed.h>
|
||||
|
|
@ -1190,11 +1191,13 @@ void panthor_fw_unplug(struct panthor_device *ptdev)
|
|||
|
||||
cancel_delayed_work_sync(&ptdev->fw->watchdog.ping_work);
|
||||
|
||||
/* Make sure the IRQ handler can be called after that point. */
|
||||
if (ptdev->fw->irq.irq)
|
||||
panthor_job_irq_suspend(&ptdev->fw->irq);
|
||||
if (!IS_ENABLED(CONFIG_PM) || pm_runtime_active(ptdev->base.dev)) {
|
||||
/* Make sure the IRQ handler cannot be called after that point. */
|
||||
if (ptdev->fw->irq.irq)
|
||||
panthor_job_irq_suspend(&ptdev->fw->irq);
|
||||
|
||||
panthor_fw_stop(ptdev);
|
||||
panthor_fw_stop(ptdev);
|
||||
}
|
||||
|
||||
list_for_each_entry(section, &ptdev->fw->sections, node)
|
||||
panthor_kernel_bo_destroy(section->mem);
|
||||
|
|
@ -1207,7 +1210,8 @@ void panthor_fw_unplug(struct panthor_device *ptdev)
|
|||
panthor_vm_put(ptdev->fw->vm);
|
||||
ptdev->fw->vm = NULL;
|
||||
|
||||
panthor_gpu_power_off(ptdev, L2, ptdev->gpu_info.l2_present, 20000);
|
||||
if (!IS_ENABLED(CONFIG_PM) || pm_runtime_active(ptdev->base.dev))
|
||||
panthor_gpu_power_off(ptdev, L2, ptdev->gpu_info.l2_present, 20000);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -180,7 +180,8 @@ void panthor_gpu_unplug(struct panthor_device *ptdev)
|
|||
unsigned long flags;
|
||||
|
||||
/* Make sure the IRQ handler is not running after that point. */
|
||||
panthor_gpu_irq_suspend(&ptdev->gpu->irq);
|
||||
if (!IS_ENABLED(CONFIG_PM) || pm_runtime_active(ptdev->base.dev))
|
||||
panthor_gpu_irq_suspend(&ptdev->gpu->irq);
|
||||
|
||||
/* Wake-up all waiters. */
|
||||
spin_lock_irqsave(&ptdev->gpu->reqs_lock, flags);
|
||||
|
|
|
|||
|
|
@ -2672,7 +2672,8 @@ int panthor_vm_prepare_mapped_bos_resvs(struct drm_exec *exec, struct panthor_vm
|
|||
*/
|
||||
void panthor_mmu_unplug(struct panthor_device *ptdev)
|
||||
{
|
||||
panthor_mmu_irq_suspend(&ptdev->mmu->irq);
|
||||
if (!IS_ENABLED(CONFIG_PM) || pm_runtime_active(ptdev->base.dev))
|
||||
panthor_mmu_irq_suspend(&ptdev->mmu->irq);
|
||||
|
||||
mutex_lock(&ptdev->mmu->as.slots_lock);
|
||||
for (u32 i = 0; i < ARRAY_SIZE(ptdev->mmu->as.slots); i++) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user