Hi,

Sorry for late. I missed this patch.

I will take a look soon.

Thanks,
Inki Dae

2026년 10월 5일 (월) 오전 1:18, Chen-Yu Tsai <[email protected]>님이 작성:

> Hi,
>
> On Mon, Aug 3, 2026 at 3:52 PM Chen-Yu Tsai <[email protected]> wrote:
> >
> > The exynos driver currently checks the modifier in a helper called by
> > the plane atomic check helper callback. This check only concerns whether
> > the selected plane supports the tiled format or not. This is tied to
> > the plane's hardware capability.
> >
> > Turns out the tiled support was added around the same time modifiers
> > were being plumbed through DRM planes. The latter provided a way to
> > describe per-plane modifier support.
> >
> > Add a field to the hardware plane capability struct to allow adding
> > an optional list of supported modifiers. This is passed to
> > drm_universal_plane_init(). This also allows the core to generate
> > and pass to userspace a list of supported modifiers for each plane.
> >
> > EXYNOS_DRM_PLANE_CAP_TILE and the existing helper are removed, as the
> > check is now down by the DRM atomic check.
> >
> > Signed-off-by: Chen-Yu Tsai <[email protected]>
>
> Any chance someone could take a look at this? This drops some redundant
> code.
>
> > ---
> >  drivers/gpu/drm/exynos/exynos_drm_drv.h   |  2 +-
> >  drivers/gpu/drm/exynos/exynos_drm_plane.c | 30 +----------------------
> >  drivers/gpu/drm/exynos/exynos_mixer.c     |  8 +++++-
> >  3 files changed, 9 insertions(+), 31 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h
> b/drivers/gpu/drm/exynos/exynos_drm_drv.h
> > index b126cd129944..ab0edb826261 100644
> > --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
> > +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
> > @@ -92,7 +92,6 @@ struct exynos_drm_plane {
> >  #define EXYNOS_DRM_PLANE_CAP_DOUBLE    (1 << 0)
> >  #define EXYNOS_DRM_PLANE_CAP_SCALE     (1 << 1)
> >  #define EXYNOS_DRM_PLANE_CAP_ZPOS      (1 << 2)
> > -#define EXYNOS_DRM_PLANE_CAP_TILE      (1 << 3)
> >  #define EXYNOS_DRM_PLANE_CAP_PIX_BLEND (1 << 4)
> >  #define EXYNOS_DRM_PLANE_CAP_WIN_BLEND (1 << 5)
> >
> > @@ -112,6 +111,7 @@ struct exynos_drm_plane_config {
> >         const uint32_t *pixel_formats;
> >         unsigned int num_pixel_formats;
> >         unsigned int capabilities;
> > +       const uint64_t *modifiers;
> >  };
> >
> >  /*
> > diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.c
> b/drivers/gpu/drm/exynos/exynos_drm_plane.c
> > index 5c04ef87e400..31f5f0941154 100644
> > --- a/drivers/gpu/drm/exynos/exynos_drm_plane.c
> > +++ b/drivers/gpu/drm/exynos/exynos_drm_plane.c
> > @@ -174,30 +174,6 @@ static struct drm_plane_funcs exynos_plane_funcs = {
> >         .atomic_destroy_state = exynos_drm_plane_destroy_state,
> >  };
> >
> > -static int
> > -exynos_drm_plane_check_format(const struct exynos_drm_plane_config
> *config,
> > -                             struct exynos_drm_plane_state *state)
> > -{
> > -       struct drm_framebuffer *fb = state->base.fb;
> > -       struct drm_device *dev = fb->dev;
> > -
> > -       switch (fb->modifier) {
> > -       case DRM_FORMAT_MOD_SAMSUNG_64_32_TILE:
> > -               if (!(config->capabilities & EXYNOS_DRM_PLANE_CAP_TILE))
> > -                       return -ENOTSUPP;
> > -               break;
> > -
> > -       case DRM_FORMAT_MOD_LINEAR:
> > -               break;
> > -
> > -       default:
> > -               DRM_DEV_ERROR(dev->dev, "unsupported pixel format
> modifier");
> > -               return -ENOTSUPP;
> > -       }
> > -
> > -       return 0;
> > -}
> > -
> >  static int
> >  exynos_drm_plane_check_size(const struct exynos_drm_plane_config
> *config,
> >                             struct exynos_drm_plane_state *state)
> > @@ -245,10 +221,6 @@ static int exynos_plane_atomic_check(struct
> drm_plane *plane,
> >         /* translate state into exynos_state */
> >         exynos_plane_mode_set(exynos_state);
> >
> > -       ret = exynos_drm_plane_check_format(exynos_plane->config,
> exynos_state);
> > -       if (ret)
> > -               return ret;
> > -
> >         ret = exynos_drm_plane_check_size(exynos_plane->config,
> exynos_state);
> >         return ret;
> >  }
> > @@ -312,7 +284,7 @@ int exynos_plane_init(struct drm_device *dev,
> >                                        &exynos_plane_funcs,
> >                                        config->pixel_formats,
> >                                        config->num_pixel_formats,
> > -                                      NULL, config->type, NULL);
> > +                                      config->modifiers, config->type,
> NULL);
> >         if (err) {
> >                 DRM_DEV_ERROR(dev->dev, "failed to initialize plane\n");
> >                 return err;
> > diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c
> b/drivers/gpu/drm/exynos/exynos_mixer.c
> > index 69dea5049309..d74e605a452b 100644
> > --- a/drivers/gpu/drm/exynos/exynos_mixer.c
> > +++ b/drivers/gpu/drm/exynos/exynos_mixer.c
> > @@ -93,6 +93,12 @@ static const uint32_t vp_formats[] = {
> >         DRM_FORMAT_NV21,
> >  };
> >
> > +static const uint64_t vp_modifiers[] = {
> > +       DRM_FORMAT_MOD_LINEAR,
> > +       DRM_FORMAT_MOD_SAMSUNG_64_32_TILE,
> > +       DRM_FORMAT_MOD_INVALID
> > +};
> > +
> >  struct mixer_context {
> >         struct platform_device *pdev;
> >         struct device           *dev;
> > @@ -148,8 +154,8 @@ static const struct exynos_drm_plane_config
> plane_configs[MIXER_WIN_NR] = {
> >                 .num_pixel_formats = ARRAY_SIZE(vp_formats),
> >                 .capabilities = EXYNOS_DRM_PLANE_CAP_SCALE |
> >                                 EXYNOS_DRM_PLANE_CAP_ZPOS |
> > -                               EXYNOS_DRM_PLANE_CAP_TILE |
> >                                 EXYNOS_DRM_PLANE_CAP_WIN_BLEND,
> > +               .modifiers = vp_modifiers,
> >         },
> >  };
> >
> > --
> > 2.55.0.571.g244d577d93-goog
> >
>
>

Reply via email to