Patch "drm/msm: Fix double pm_runtime_disable() call" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    drm/msm: Fix double pm_runtime_disable() call

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     drm-msm-fix-double-pm_runtime_disable-call.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 1c3195b0b06d9f0ef2b982b08892ad04c411d94c
Author: Maximilian Luz <luzmaximilian@xxxxxxxxx>
Date:   Mon Jun 6 23:13:05 2022 +0200

    drm/msm: Fix double pm_runtime_disable() call
    
    [ Upstream commit ce0db505bc0c51ef5e9ba446c660de7e26f78f29 ]
    
    Following commit 17e822f7591f ("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 17e822f7591f ("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: 17e822f7591f ("drm/msm: fix unbalanced pm_runtime_enable in adreno_gpu_{init, cleanup}")
    Signed-off-by: Maximilian Luz <luzmaximilian@xxxxxxxxx>
    Tested-by: Bjorn Andersson <bjorn.andersson@xxxxxxxxxx>
    Reviewed-by: Rob Clark <robdclark@xxxxxxxxx>
    Link: https://lore.kernel.org/r/20220606211305.189585-1-luzmaximilian@xxxxxxxxx
    Signed-off-by: Rob Clark <robdclark@xxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index 748665232d29..bba68776cb25 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -958,7 +958,8 @@ void adreno_gpu_cleanup(struct adreno_gpu *adreno_gpu)
 	for (i = 0; i < ARRAY_SIZE(adreno_gpu->info->fw); i++)
 		release_firmware(adreno_gpu->fw[i]);
 
-	pm_runtime_disable(&priv->gpu_pdev->dev);
+	if (pm_runtime_enabled(&priv->gpu_pdev->dev))
+		pm_runtime_disable(&priv->gpu_pdev->dev);
 
 	msm_gpu_cleanup(&adreno_gpu->base);
 }



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux