On 28/11/2024 11:02, Boris Brezillon wrote: > 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. > > v2: > - Move the bit that belonged in the next commit > - Drop the panthor_device_unplug() changes > > Signed-off-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx> With the comment fix: Reviewed-by: Steven Price <steven.price@xxxxxxx> > --- > drivers/gpu/drm/panthor/panthor_fw.c | 14 +++++++++----- > drivers/gpu/drm/panthor/panthor_gpu.c | 3 ++- > drivers/gpu/drm/panthor/panthor_mmu.c | 3 ++- > 3 files changed, 13 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/panthor/panthor_fw.c b/drivers/gpu/drm/panthor/panthor_fw.c > index ebf8980ca9a3..f3d3d8fbe13d 100644 > --- a/drivers/gpu/drm/panthor/panthor_fw.c > +++ b/drivers/gpu/drm/panthor/panthor_fw.c > @@ -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 can 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); > } > > /** > diff --git a/drivers/gpu/drm/panthor/panthor_gpu.c b/drivers/gpu/drm/panthor/panthor_gpu.c > index 0f3cac6ec88e..ee85a371bc38 100644 > --- a/drivers/gpu/drm/panthor/panthor_gpu.c > +++ b/drivers/gpu/drm/panthor/panthor_gpu.c > @@ -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); > diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/panthor/panthor_mmu.c > index 9478ee2093d1..6716463903bc 100644 > --- a/drivers/gpu/drm/panthor/panthor_mmu.c > +++ b/drivers/gpu/drm/panthor/panthor_mmu.c > @@ -2681,7 +2681,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++) {