diff mbox series

drm: renesas: shmobile: Call drm_helper_force_disable_all() at shutdown time

Message ID 0a13f43d1e519b88e0762cce178d7852b7dba2b1.1701775726.git.geert+renesas@glider.be (mailing list archive)
State Superseded
Delegated to: Kieran Bingham
Headers show
Series drm: renesas: shmobile: Call drm_helper_force_disable_all() at shutdown time | expand

Commit Message

Geert Uytterhoeven Dec. 5, 2023, 11:30 a.m. UTC
From: Douglas Anderson <dianders@chromium.org>

Based on grepping through the source code, this driver appears to be
missing a call to drm_atomic_helper_shutdown() at system shutdown time.
This is important because drm_helper_force_disable_all() will cause
panels to get disabled cleanly which may be important for their power
sequencing.  Future changes will remove any custom powering off in
individual panel drivers so the DRM drivers need to start getting this
right.

The fact that we should call drm_atomic_helper_shutdown() in the case of
OS shutdown comes straight out of the kernel doc "driver instance
overview" in drm_drv.c.

Suggested-by: Maxime Ripard <mripard@kernel.org>
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Link: https://lore.kernel.org/r/20230901164111.RFT.15.Iaf638a1d4c8b3c307a6192efabb4cbb06b195f15@changeid
[geert: s/drm_helper_force_disable_all/drm_atomic_helper_shutdown/]
[geert: shmob_drm_remove() already calls drm_atomic_helper_shutdown]
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
Tested on Atmark Techno Armadillo-800-EVA, where the PWM instance
driving the backlight is now stopped on shutdown.
Panel-simple does print two new warnings:

    +panel-simple panel: Skipping disable of already disabled panel
    +panel-simple panel: Skipping unprepare of already unprepared panel
     reboot: System halted
---
 drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c | 8 ++++++++
 1 file changed, 8 insertions(+)

Comments

Laurent Pinchart Dec. 5, 2023, 12:16 p.m. UTC | #1
Hi Geert and Doug,

Thank you for the patch.

On Tue, Dec 05, 2023 at 12:30:02PM +0100, Geert Uytterhoeven wrote:
> From: Douglas Anderson <dianders@chromium.org>
> 
> Based on grepping through the source code, this driver appears to be
> missing a call to drm_atomic_helper_shutdown() at system shutdown time.
> This is important because drm_helper_force_disable_all() will cause
> panels to get disabled cleanly which may be important for their power
> sequencing.  Future changes will remove any custom powering off in
> individual panel drivers so the DRM drivers need to start getting this
> right.
> 
> The fact that we should call drm_atomic_helper_shutdown() in the case of
> OS shutdown comes straight out of the kernel doc "driver instance
> overview" in drm_drv.c.
> 
> Suggested-by: Maxime Ripard <mripard@kernel.org>
> Signed-off-by: Douglas Anderson <dianders@chromium.org>
> Link: https://lore.kernel.org/r/20230901164111.RFT.15.Iaf638a1d4c8b3c307a6192efabb4cbb06b195f15@changeid
> [geert: s/drm_helper_force_disable_all/drm_atomic_helper_shutdown/]
> [geert: shmob_drm_remove() already calls drm_atomic_helper_shutdown]
> Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
> Tested on Atmark Techno Armadillo-800-EVA, where the PWM instance
> driving the backlight is now stopped on shutdown.
> Panel-simple does print two new warnings:
> 
>     +panel-simple panel: Skipping disable of already disabled panel
>     +panel-simple panel: Skipping unprepare of already unprepared panel

Have you investigated where this comes from ?

>      reboot: System halted
> ---
>  drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
> index bd16d4780c6436c3..a15162be26f259a4 100644
> --- a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
> +++ b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
> @@ -171,6 +171,13 @@ static void shmob_drm_remove(struct platform_device *pdev)
>  	drm_kms_helper_poll_fini(ddev);
>  }
>  
> +static void shmob_drm_shutdown(struct platform_device *pdev)
> +{
> +	struct shmob_drm_device *sdev = platform_get_drvdata(pdev);
> +
> +	drm_atomic_helper_shutdown(&sdev->ddev);
> +}
> +
>  static int shmob_drm_probe(struct platform_device *pdev)
>  {
>  	struct shmob_drm_platform_data *pdata = pdev->dev.platform_data;
> @@ -274,6 +281,7 @@ static const struct of_device_id shmob_drm_of_table[] __maybe_unused = {
>  static struct platform_driver shmob_drm_platform_driver = {
>  	.probe		= shmob_drm_probe,
>  	.remove_new	= shmob_drm_remove,
> +	.shutdown	= shmob_drm_shutdown,
>  	.driver		= {
>  		.name	= "shmob-drm",
>  		.of_match_table = of_match_ptr(shmob_drm_of_table),
Geert Uytterhoeven Dec. 5, 2023, 1:31 p.m. UTC | #2
Hi Laurent,

On Tue, Dec 5, 2023 at 1:16 PM Laurent Pinchart
<laurent.pinchart@ideasonboard.com> wrote:
> On Tue, Dec 05, 2023 at 12:30:02PM +0100, Geert Uytterhoeven wrote:
> > From: Douglas Anderson <dianders@chromium.org>
> >
> > Based on grepping through the source code, this driver appears to be
> > missing a call to drm_atomic_helper_shutdown() at system shutdown time.
> > This is important because drm_helper_force_disable_all() will cause
> > panels to get disabled cleanly which may be important for their power
> > sequencing.  Future changes will remove any custom powering off in
> > individual panel drivers so the DRM drivers need to start getting this
> > right.
> >
> > The fact that we should call drm_atomic_helper_shutdown() in the case of
> > OS shutdown comes straight out of the kernel doc "driver instance
> > overview" in drm_drv.c.
> >
> > Suggested-by: Maxime Ripard <mripard@kernel.org>
> > Signed-off-by: Douglas Anderson <dianders@chromium.org>
> > Link: https://lore.kernel.org/r/20230901164111.RFT.15.Iaf638a1d4c8b3c307a6192efabb4cbb06b195f15@changeid
> > [geert: s/drm_helper_force_disable_all/drm_atomic_helper_shutdown/]
> > [geert: shmob_drm_remove() already calls drm_atomic_helper_shutdown]
> > Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Thanks!

> > Panel-simple does print two new warnings:
> >
> >     +panel-simple panel: Skipping disable of already disabled panel
> >     +panel-simple panel: Skipping unprepare of already unprepared panel
>
> Have you investigated where this comes from ?

Meh, I knew I forgot something ;-)

The panel is unprepared and disabled a first time from shmob_drm's
.shutdown() callback:

  shmob_drm_shutdown
    drm_atomic_helper_shutdown
      drm_atomic_helper_disable_all
        drm_atomic_commit
          drm_atomic_helper_commit
            commit_tail
              drm_atomic_helper_commit_tail
                drm_atomic_helper_commit_modeset_disables
                  disable_outputs
                    drm_atomic_bridge_chain_disable
                        drm_panel_disable
                    drm_atomic_bridge_chain_post_disable
                        drm_panel_unprepare

And a second time from simple_panel's .shutdown() callback():

  panel_simple_platform_shutdown
    panel_simple_shutdown
      drm_panel_disable
      drm_panel_unprepare

Gr{oetje,eeting}s,

                        Geert


--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
Laurent Pinchart Dec. 5, 2023, 1:40 p.m. UTC | #3
On Tue, Dec 05, 2023 at 02:31:24PM +0100, Geert Uytterhoeven wrote:
> On Tue, Dec 5, 2023 at 1:16 PM Laurent Pinchart wrote:
> > On Tue, Dec 05, 2023 at 12:30:02PM +0100, Geert Uytterhoeven wrote:
> > > From: Douglas Anderson <dianders@chromium.org>
> > >
> > > Based on grepping through the source code, this driver appears to be
> > > missing a call to drm_atomic_helper_shutdown() at system shutdown time.
> > > This is important because drm_helper_force_disable_all() will cause
> > > panels to get disabled cleanly which may be important for their power
> > > sequencing.  Future changes will remove any custom powering off in
> > > individual panel drivers so the DRM drivers need to start getting this
> > > right.
> > >
> > > The fact that we should call drm_atomic_helper_shutdown() in the case of
> > > OS shutdown comes straight out of the kernel doc "driver instance
> > > overview" in drm_drv.c.
> > >
> > > Suggested-by: Maxime Ripard <mripard@kernel.org>
> > > Signed-off-by: Douglas Anderson <dianders@chromium.org>
> > > Link: https://lore.kernel.org/r/20230901164111.RFT.15.Iaf638a1d4c8b3c307a6192efabb4cbb06b195f15@changeid
> > > [geert: s/drm_helper_force_disable_all/drm_atomic_helper_shutdown/]
> > > [geert: shmob_drm_remove() already calls drm_atomic_helper_shutdown]
> > > Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
> >
> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> 
> Thanks!
> 
> > > Panel-simple does print two new warnings:
> > >
> > >     +panel-simple panel: Skipping disable of already disabled panel
> > >     +panel-simple panel: Skipping unprepare of already unprepared panel
> >
> > Have you investigated where this comes from ?
> 
> Meh, I knew I forgot something ;-)
> 
> The panel is unprepared and disabled a first time from shmob_drm's
> .shutdown() callback:
> 
>   shmob_drm_shutdown
>     drm_atomic_helper_shutdown
>       drm_atomic_helper_disable_all
>         drm_atomic_commit
>           drm_atomic_helper_commit
>             commit_tail
>               drm_atomic_helper_commit_tail
>                 drm_atomic_helper_commit_modeset_disables
>                   disable_outputs
>                     drm_atomic_bridge_chain_disable
>                         drm_panel_disable
>                     drm_atomic_bridge_chain_post_disable
>                         drm_panel_unprepare
> 
> And a second time from simple_panel's .shutdown() callback():
> 
>   panel_simple_platform_shutdown
>     panel_simple_shutdown
>       drm_panel_disable
>       drm_panel_unprepare

That looks like what Doug mentioned should be removed in the commit
message of this patch (a confirmation would be nice). It should be fine
for now.
Doug Anderson Dec. 5, 2023, 5:35 p.m. UTC | #4
Hi,

On Tue, Dec 5, 2023 at 5:40 AM Laurent Pinchart
<laurent.pinchart@ideasonboard.com> wrote:
>
> On Tue, Dec 05, 2023 at 02:31:24PM +0100, Geert Uytterhoeven wrote:
> > On Tue, Dec 5, 2023 at 1:16 PM Laurent Pinchart wrote:
> > > On Tue, Dec 05, 2023 at 12:30:02PM +0100, Geert Uytterhoeven wrote:
> > > > From: Douglas Anderson <dianders@chromium.org>
> > > >
> > > > Based on grepping through the source code, this driver appears to be
> > > > missing a call to drm_atomic_helper_shutdown() at system shutdown time.
> > > > This is important because drm_helper_force_disable_all() will cause
> > > > panels to get disabled cleanly which may be important for their power
> > > > sequencing.  Future changes will remove any custom powering off in
> > > > individual panel drivers so the DRM drivers need to start getting this
> > > > right.
> > > >
> > > > The fact that we should call drm_atomic_helper_shutdown() in the case of
> > > > OS shutdown comes straight out of the kernel doc "driver instance
> > > > overview" in drm_drv.c.
> > > >
> > > > Suggested-by: Maxime Ripard <mripard@kernel.org>
> > > > Signed-off-by: Douglas Anderson <dianders@chromium.org>
> > > > Link: https://lore.kernel.org/r/20230901164111.RFT.15.Iaf638a1d4c8b3c307a6192efabb4cbb06b195f15@changeid
> > > > [geert: s/drm_helper_force_disable_all/drm_atomic_helper_shutdown/]
> > > > [geert: shmob_drm_remove() already calls drm_atomic_helper_shutdown]
> > > > Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
> > >
> > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> >
> > Thanks!
> >
> > > > Panel-simple does print two new warnings:
> > > >
> > > >     +panel-simple panel: Skipping disable of already disabled panel
> > > >     +panel-simple panel: Skipping unprepare of already unprepared panel
> > >
> > > Have you investigated where this comes from ?
> >
> > Meh, I knew I forgot something ;-)
> >
> > The panel is unprepared and disabled a first time from shmob_drm's
> > .shutdown() callback:
> >
> >   shmob_drm_shutdown
> >     drm_atomic_helper_shutdown
> >       drm_atomic_helper_disable_all
> >         drm_atomic_commit
> >           drm_atomic_helper_commit
> >             commit_tail
> >               drm_atomic_helper_commit_tail
> >                 drm_atomic_helper_commit_modeset_disables
> >                   disable_outputs
> >                     drm_atomic_bridge_chain_disable
> >                         drm_panel_disable
> >                     drm_atomic_bridge_chain_post_disable
> >                         drm_panel_unprepare
> >
> > And a second time from simple_panel's .shutdown() callback():
> >
> >   panel_simple_platform_shutdown
> >     panel_simple_shutdown
> >       drm_panel_disable
> >       drm_panel_unprepare
>
> That looks like what Doug mentioned should be removed in the commit
> message of this patch (a confirmation would be nice). It should be fine
> for now.

Yup, this is completely expected right now and is actually a _good_
sign that your patch is doing what it should be. We unfortunately
can't remove the panel_simple_shutdown() until all DRM modeset drivers
(or at least all the ones that could be used w/ panel_simple) are
properly calling drm_helper_force_disable_all(), though.

-Doug
diff mbox series

Patch

diff --git a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
index bd16d4780c6436c3..a15162be26f259a4 100644
--- a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
+++ b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
@@ -171,6 +171,13 @@  static void shmob_drm_remove(struct platform_device *pdev)
 	drm_kms_helper_poll_fini(ddev);
 }
 
+static void shmob_drm_shutdown(struct platform_device *pdev)
+{
+	struct shmob_drm_device *sdev = platform_get_drvdata(pdev);
+
+	drm_atomic_helper_shutdown(&sdev->ddev);
+}
+
 static int shmob_drm_probe(struct platform_device *pdev)
 {
 	struct shmob_drm_platform_data *pdata = pdev->dev.platform_data;
@@ -274,6 +281,7 @@  static const struct of_device_id shmob_drm_of_table[] __maybe_unused = {
 static struct platform_driver shmob_drm_platform_driver = {
 	.probe		= shmob_drm_probe,
 	.remove_new	= shmob_drm_remove,
+	.shutdown	= shmob_drm_shutdown,
 	.driver		= {
 		.name	= "shmob-drm",
 		.of_match_table = of_match_ptr(shmob_drm_of_table),