From: Neil Armstrong <neil.armstrong@linaro.org>
To: Douglas Anderson <dianders@chromium.org>,
dri-devel@lists.freedesktop.org, Daniel Vetter <daniel@ffwll.ch>,
Maxime Ripard <mripard@kernel.org>
Cc: Linus Walleij <linus.walleij@linaro.org>,
Chris Morgan <macromorgan@hotmail.com>,
Yuran Pereira <yuran.pereira@hotmail.com>,
Dmitry Baryshkov <dmitry.baryshkov@linaro.org>,
David Airlie <airlied@gmail.com>,
Jessica Zhang <quic_jesszhan@quicinc.com>,
Jonathan Corbet <corbet@lwn.net>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Thomas Zimmermann <tzimmermann@suse.de>,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] drm/panel: Avoid warnings w/ panel-simple/panel-edp at shutdown
Date: Tue, 16 Jul 2024 12:53:50 +0200 [thread overview]
Message-ID: <b35eb84d-5ed4-469c-8df3-d7e895bb910c@linaro.org> (raw)
In-Reply-To: <20240621134427.1.Ieb287c2c3ee3f6d3b0d5f49b29f746b93621749c@changeid>
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@ffwll.ch>
> Signed-off-by: Douglas Anderson <dianders@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@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@linaro.org>
next prev parent reply other threads:[~2024-07-16 10:53 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-21 20:44 Douglas Anderson
2024-06-21 20:46 ` Doug Anderson
2024-07-15 16:40 ` Doug Anderson
2024-07-22 16:04 ` Doug Anderson
2024-07-16 10:53 ` Neil Armstrong [this message]
2024-07-16 20:19 ` Linus Walleij
-- strict thread matches above, loose matches on Subject: below --
2024-06-11 14:48 Douglas Anderson
2024-06-12 8:09 ` Maxime Ripard
2024-06-12 14:39 ` Doug Anderson
2024-06-12 15:13 ` Daniel Vetter
2024-06-12 16:03 ` Doug Anderson
2024-06-12 16:52 ` Doug Anderson
2024-06-17 14:09 ` Daniel Vetter
2024-06-12 8:58 ` Daniel Vetter
2024-06-12 14:49 ` Doug Anderson
2024-06-12 15:03 ` Maxime Ripard
2024-06-12 16:00 ` Doug Anderson
2024-06-12 15:11 ` Daniel Vetter
2024-06-12 16:00 ` Doug Anderson
2024-06-17 14:17 ` Daniel Vetter
2024-06-18 23:49 ` Doug Anderson
2024-06-21 16:04 ` Daniel Vetter
2024-06-12 16:47 ` Linus Walleij
2024-06-12 17:22 ` Doug Anderson
2024-06-17 14:22 ` Daniel Vetter
2024-06-18 23:49 ` Doug Anderson
2024-06-21 16:14 ` Daniel Vetter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b35eb84d-5ed4-469c-8df3-d7e895bb910c@linaro.org \
--to=neil.armstrong@linaro.org \
--cc=airlied@gmail.com \
--cc=corbet@lwn.net \
--cc=daniel@ffwll.ch \
--cc=dianders@chromium.org \
--cc=dmitry.baryshkov@linaro.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=linus.walleij@linaro.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=macromorgan@hotmail.com \
--cc=mripard@kernel.org \
--cc=quic_jesszhan@quicinc.com \
--cc=tzimmermann@suse.de \
--cc=yuran.pereira@hotmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®