RE: [PATCH] drm: rz-du: Ensure correct suspend/resume ordering with VSP

From: Biju Das

Date: Mon Mar 30 2026 - 04:12:17 EST


Hi Tommaso,

> -----Original Message-----
> From: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>
> Sent: 24 March 2026 19:33
> Subject: Re: [PATCH] drm: rz-du: Ensure correct suspend/resume ordering with VSP
>
> On Tue, Mar 24, 2026 at 07:05:05PM +0100, Tommaso Merciai wrote:
> > The VSP serves as an interface to memory and a compositor to the DU.
> > It therefore needs to be suspended after and resumed before the DU, to
> > be properly stopped and restarted in a controlled fashion driven by
> > the DU driver. This currently works by chance. Avoid relying on luck
> > by enforcing the correct suspend/resume ordering with device links.
> >
> > Based on similar work done by Laurent Pinchart for R-Car DU.
>
> If the R-Car DU patch gets merged before this one, you could mention the commit ID here.

Now the R-Car patch hit on drm-misc-next. Can you please repost this patch
with commit ID?

Cheers,
Biju



>
> >
> > Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@xxxxxxxxxxxxxx>
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@xxxxxxxxxxxxxxxx>
>
> > ---
> > drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c | 16 ++++++++++++++++
> > drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.h | 2 ++
> > 2 files changed, 18 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c
> > b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c
> > index bd486377f037..eb626c3cc421 100644
> > --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c
> > +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c
> > @@ -20,6 +20,7 @@
> > #include <drm/drm_vblank.h>
> >
> > #include <linux/bitops.h>
> > +#include <linux/device.h>
> > #include <linux/dma-mapping.h>
> > #include <linux/of_platform.h>
> > #include <linux/platform_device.h>
> > @@ -293,6 +294,9 @@ static void rzg2l_du_vsp_cleanup(struct drm_device
> > *dev, void *res) {
> > struct rzg2l_du_vsp *vsp = res;
> >
> > + if (vsp->link)
> > + device_link_del(vsp->link);
> > +
> > put_device(vsp->vsp);
> > }
> >
> > @@ -317,6 +321,18 @@ int rzg2l_du_vsp_init(struct rzg2l_du_vsp *vsp, struct device_node *np,
> > if (ret < 0)
> > return ret;
> >
> > + /*
> > + * Enforce suspend/resume ordering between the DU (consumer) and the
> > + * VSP (supplier). The DU will be suspended before and resume after the
> > + * VSP.
> > + */
> > + vsp->link = device_link_add(rcdu->dev, vsp->vsp, DL_FLAG_STATELESS);
> > + if (!vsp->link) {
> > + dev_err(rcdu->dev, "Failed to create device link to VSP %s\n",
> > + dev_name(vsp->vsp));
> > + return -EINVAL;
> > + }
> > +
> > ret = vsp1_du_init(vsp->vsp);
> > if (ret < 0)
> > return ret;
> > diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.h
> > b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.h
> > index 322eb80dcbaf..a22aaf0843ed 100644
> > --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.h
> > +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.h
> > @@ -15,6 +15,7 @@
> > #include <linux/scatterlist.h>
> >
> > struct device;
> > +struct device_link;
> > struct drm_framebuffer;
> > struct rzg2l_du_device;
> > struct rzg2l_du_format_info;
> > @@ -29,6 +30,7 @@ struct rzg2l_du_vsp_plane { struct rzg2l_du_vsp {
> > unsigned int index;
> > struct device *vsp;
> > + struct device_link *link;
> > struct rzg2l_du_device *dev;
> > };
> >
>
> --
> Regards,
>
> Laurent Pinchart