[PATCH] drm/panel: Avoid warnings w/ panel-simple/panel-edp at shutdown
Neil Armstrong
neil.armstrong at linaro.org
Tue Jul 16 10:53:50 UTC 2024
On 21/06/2024 22:44, Douglas Anderson wrote:
> At shutdown if you've got a _properly_ coded DRM modeset driver then
> you'll get these two warnings at shutdown time:
>
> Skipping disable of already disabled panel
> Skipping unprepare of already unprepared panel
>
> These warnings are ugly and sound concerning, but they're actually a
> sign of a properly working system. That's not great.
>
> We're not ready to get rid of the calls to drm_panel_disable() and
> drm_panel_unprepare() because we're not 100% convinced that all DRM
> modeset drivers are properly calling drm_atomic_helper_shutdown() or
> drm_helper_force_disable_all() at the right times. However, having the
> warning show up for correctly working systems is bad.
>
> As a bit of a workaround, add some "if" tests to try to avoid the
> warning on correctly working systems. Also add some comments and
> update the TODO items in the hopes that future developers won't be too
> confused by what's going on here.
>
> Suggested-by: Daniel Vetter <daniel at ffwll.ch>
> Signed-off-by: Douglas Anderson <dianders at chromium.org>
> ---
> This patch came out of discussion on dri-devel on 2024-06-21
> [1]. NOTE: I have put all changes into one patch since it didn't seem
> to add anything to break up the updating of the TODO or the comments
> in the core into separate patches since the patch is all about one
> topic and all code is expected to land in the same tree.
>
> Previous versions:
> v0: https://lore.kernel.org/r/20240604172305.v3.24.Ieb287c2c3ee3f6d3b0d5f49b29f746b93621749c@changeid/
> v1: https://lore.kernel.org/r/20240611074846.1.Ieb287c2c3ee3f6d3b0d5f49b29f746b93621749c@changeid
>
> [1] https://people.freedesktop.org/~cbrill/dri-log/?channel=dri-devel&date=2024-06-21
>
> Documentation/gpu/todo.rst | 35 +++++++++++++---------------
> drivers/gpu/drm/drm_panel.c | 18 ++++++++++++++
> drivers/gpu/drm/panel/panel-edp.c | 26 ++++++++++++++-------
> drivers/gpu/drm/panel/panel-simple.c | 26 ++++++++++++++-------
> 4 files changed, 68 insertions(+), 37 deletions(-)
>
> diff --git a/Documentation/gpu/todo.rst b/Documentation/gpu/todo.rst
> index 2ea6ffc9b22b..96c453980ab6 100644
> --- a/Documentation/gpu/todo.rst
> +++ b/Documentation/gpu/todo.rst
> @@ -475,25 +475,22 @@ Remove disable/unprepare in remove/shutdown in panel-simple and panel-edp
> As of commit d2aacaf07395 ("drm/panel: Check for already prepared/enabled in
> drm_panel"), we have a check in the drm_panel core to make sure nobody
> double-calls prepare/enable/disable/unprepare. Eventually that should probably
> -be turned into a WARN_ON() or somehow made louder, but right now we actually
> -expect it to trigger and so we don't want it to be too loud.
> -
> -Specifically, that warning will trigger for panel-edp and panel-simple at
> -shutdown time because those panels hardcode a call to drm_panel_disable()
> -and drm_panel_unprepare() at shutdown and remove time that they call regardless
> -of panel state. On systems with a properly coded DRM modeset driver that
> -calls drm_atomic_helper_shutdown() this is pretty much guaranteed to cause
> -the warning to fire.
> -
> -Unfortunately we can't safely remove the calls in panel-edp and panel-simple
> -until we're sure that all DRM modeset drivers that are used with those panels
> -properly call drm_atomic_helper_shutdown(). This TODO item is to validate
> -that all DRM modeset drivers used with panel-edp and panel-simple properly
> -call drm_atomic_helper_shutdown() and then remove the calls to
> -disable/unprepare from those panels. Alternatively, this TODO item could be
> -removed by convincing stakeholders that those calls are fine and downgrading
> -the error message in drm_panel_disable() / drm_panel_unprepare() to a
> -debug-level message.
> +be turned into a WARN_ON() or somehow made louder.
> +
> +At the moment, we expect that we may still encounter the warnings in the
> +drm_panel core when using panel-simple and panel-edp. Since those panel
> +drivers are used with a lot of different DRM modeset drivers they still
> +make an extra effort to disable/unprepare the panel themsevles at shutdown
> +time. Specifically we could still encounter those warnings if the panel
> +driver gets shutdown() _before_ the DRM modeset driver and the DRM modeset
> +driver properly calls drm_atomic_helper_shutdown() in its own shutdown()
> +callback. Warnings could be avoided in such a case by using something like
> +device links to ensure that the panel gets shutdown() after the DRM modeset
> +driver.
> +
> +Once all DRM modeset drivers are known to shutdown properly, the extra
> +calls to disable/unprepare in remove/shutdown in panel-simple and panel-edp
> +should be removed and this TODO item marked complete.
>
> Contact: Douglas Anderson <dianders at chromium.org>
>
> diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
> index cfbe020de54e..19ab0a794add 100644
> --- a/drivers/gpu/drm/drm_panel.c
> +++ b/drivers/gpu/drm/drm_panel.c
> @@ -161,6 +161,15 @@ int drm_panel_unprepare(struct drm_panel *panel)
> if (!panel)
> return -EINVAL;
>
> + /*
> + * If you are seeing the warning below it likely means one of two things:
> + * - Your panel driver incorrectly calls drm_panel_unprepare() in its
> + * shutdown routine. You should delete this.
> + * - You are using panel-edp or panel-simple and your DRM modeset
> + * driver's shutdown() callback happened after the panel's shutdown().
> + * In this case the warning is harmless though ideally you should
> + * figure out how to reverse the order of the shutdown() callbacks.
> + */
> if (!panel->prepared) {
> dev_warn(panel->dev, "Skipping unprepare of already unprepared panel\n");
> return 0;
> @@ -245,6 +254,15 @@ int drm_panel_disable(struct drm_panel *panel)
> if (!panel)
> return -EINVAL;
>
> + /*
> + * If you are seeing the warning below it likely means one of two things:
> + * - Your panel driver incorrectly calls drm_panel_disable() in its
> + * shutdown routine. You should delete this.
> + * - You are using panel-edp or panel-simple and your DRM modeset
> + * driver's shutdown() callback happened after the panel's shutdown().
> + * In this case the warning is harmless though ideally you should
> + * figure out how to reverse the order of the shutdown() callbacks.
> + */
> if (!panel->enabled) {
> dev_warn(panel->dev, "Skipping disable of already disabled panel\n");
> return 0;
> diff --git a/drivers/gpu/drm/panel/panel-edp.c b/drivers/gpu/drm/panel/panel-edp.c
> index 3a574a9b46e7..8723cd190913 100644
> --- a/drivers/gpu/drm/panel/panel-edp.c
> +++ b/drivers/gpu/drm/panel/panel-edp.c
> @@ -954,16 +954,24 @@ static void panel_edp_shutdown(struct device *dev)
> * drm_atomic_helper_shutdown() at shutdown time and that should
> * cause the panel to be disabled / unprepared if needed. For now,
> * however, we'll keep these calls due to the sheer number of
> - * different DRM modeset drivers used with panel-edp. The fact that
> - * we're calling these and _also_ the drm_atomic_helper_shutdown()
> - * will try to disable/unprepare means that we can get a warning about
> - * trying to disable/unprepare an already disabled/unprepared panel,
> - * but that's something we'll have to live with until we've confirmed
> - * that all DRM modeset drivers are properly calling
> - * drm_atomic_helper_shutdown().
> + * different DRM modeset drivers used with panel-edp. Once we've
> + * confirmed that all DRM modeset drivers using this panel properly
> + * call drm_atomic_helper_shutdown() we can simply delete the two
> + * calls below.
> + *
> + * TO BE EXPLICIT: THE CALLS BELOW SHOULDN'T BE COPIED TO ANY NEW
> + * PANEL DRIVERS.
> + *
> + * FIXME: If we're still haven't figured out if all DRM modeset
> + * drivers properly call drm_atomic_helper_shutdown() but we _have_
> + * managed to make sure that DRM modeset drivers get their shutdown()
> + * callback before the panel's shutdown() callback (perhaps using
> + * device link), we could add a WARN_ON here to help move forward.
> */
> - drm_panel_disable(&panel->base);
> - drm_panel_unprepare(&panel->base);
> + if (panel->base.enabled)
> + drm_panel_disable(&panel->base);
> + if (panel->base.prepared)
> + drm_panel_unprepare(&panel->base);
> }
>
> static void panel_edp_remove(struct device *dev)
> diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
> index 8345ed891f5a..022ffab2324a 100644
> --- a/drivers/gpu/drm/panel/panel-simple.c
> +++ b/drivers/gpu/drm/panel/panel-simple.c
> @@ -726,16 +726,24 @@ static void panel_simple_shutdown(struct device *dev)
> * drm_atomic_helper_shutdown() at shutdown time and that should
> * cause the panel to be disabled / unprepared if needed. For now,
> * however, we'll keep these calls due to the sheer number of
> - * different DRM modeset drivers used with panel-simple. The fact that
> - * we're calling these and _also_ the drm_atomic_helper_shutdown()
> - * will try to disable/unprepare means that we can get a warning about
> - * trying to disable/unprepare an already disabled/unprepared panel,
> - * but that's something we'll have to live with until we've confirmed
> - * that all DRM modeset drivers are properly calling
> - * drm_atomic_helper_shutdown().
> + * different DRM modeset drivers used with panel-simple. Once we've
> + * confirmed that all DRM modeset drivers using this panel properly
> + * call drm_atomic_helper_shutdown() we can simply delete the two
> + * calls below.
> + *
> + * TO BE EXPLICIT: THE CALLS BELOW SHOULDN'T BE COPIED TO ANY NEW
> + * PANEL DRIVERS.
> + *
> + * FIXME: If we're still haven't figured out if all DRM modeset
> + * drivers properly call drm_atomic_helper_shutdown() but we _have_
> + * managed to make sure that DRM modeset drivers get their shutdown()
> + * callback before the panel's shutdown() callback (perhaps using
> + * device link), we could add a WARN_ON here to help move forward.
> */
> - drm_panel_disable(&panel->base);
> - drm_panel_unprepare(&panel->base);
> + if (panel->base.enabled)
> + drm_panel_disable(&panel->base);
> + if (panel->base.prepared)
> + drm_panel_unprepare(&panel->base);
> }
>
> static void panel_simple_remove(struct device *dev)
LGTM and see if we have negative feedback
Acked-by: Neil Armstrong <neil.armstrong at linaro.org>
More information about the dri-devel
mailing list