lkml.org 
[lkml]   [2022]   [Jun]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 043/181] drm/msm: Fix double pm_runtime_disable() call
    Date
    From: Maximilian Luz <luzmaximilian@gmail.com>

    [ 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@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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/msm/adreno/adreno_gpu.c | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)

    diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
    index 1219f71629a5..1ced7b108f2c 100644
    --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
    +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
    @@ -1002,7 +1002,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);
    }
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-06-27 13:50    [W:2.913 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site