Skip to content

Commit ce0db50

Browse files
qzedrobclark
authored andcommitted
drm/msm: Fix double pm_runtime_disable() call
Following commit 17e822f ("drm/msm: fix unbalanced pm_runtime_enable in adreno_gpu_{init, cleanup}"), any call to adreno_unbind() will disable runtime PM twice, as indicated by the call trees below: adreno_unbind() -> pm_runtime_force_suspend() -> pm_runtime_disable() adreno_unbind() -> gpu->funcs->destroy() [= aNxx_destroy()] -> adreno_gpu_cleanup() -> pm_runtime_disable() Note that pm_runtime_force_suspend() is called right before gpu->funcs->destroy() and both functions are called unconditionally. With recent addition of the eDP AUX bus code, this problem manifests itself when the eDP panel cannot be found yet and probing is deferred. On the first probe attempt, we disable runtime PM twice as described above. This then causes any later probe attempt to fail with [drm:adreno_load_gpu [msm]] *ERROR* Couldn't power up the GPU: -13 preventing the driver from loading. As there seem to be scenarios where the aNxx_destroy() functions are not called from adreno_unbind(), simply removing pm_runtime_disable() from inside adreno_unbind() does not seem to be the proper fix. This is what commit 17e822f ("drm/msm: fix unbalanced pm_runtime_enable in adreno_gpu_{init, cleanup}") intended to fix. Therefore, instead check whether runtime PM is still enabled, and only disable it in that case. Fixes: 17e822f ("drm/msm: fix unbalanced pm_runtime_enable in adreno_gpu_{init, cleanup}") Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com> Tested-by: Bjorn Andersson <bjorn.andersson@linaro.org> Reviewed-by: Rob Clark <robdclark@gmail.com> Link: https://lore.kernel.org/r/20220606211305.189585-1-luzmaximilian@gmail.com Signed-off-by: Rob Clark <robdclark@chromium.org>
1 parent 036d207 commit ce0db50

1 file changed

Lines changed: 2 additions & 1 deletion

File tree

drivers/gpu/drm/msm/adreno/adreno_gpu.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1057,7 +1057,8 @@ void adreno_gpu_cleanup(struct adreno_gpu *adreno_gpu)
10571057
for (i = 0; i < ARRAY_SIZE(adreno_gpu->info->fw); i++)
10581058
release_firmware(adreno_gpu->fw[i]);
10591059

1060-
pm_runtime_disable(&priv->gpu_pdev->dev);
1060+
if (pm_runtime_enabled(&priv->gpu_pdev->dev))
1061+
pm_runtime_disable(&priv->gpu_pdev->dev);
10611062

10621063
msm_gpu_cleanup(&adreno_gpu->base);
10631064
}

0 commit comments

Comments
 (0)