[PATCH 2/3] drm/vc4: Add monochrome mode to the VEC.

Dave Stevenson dave.stevenson at raspberrypi.com
Tue Jun 18 18:15:29 UTC 2024


Hi Maxime

On Tue, 18 Jun 2024 at 10:28, Maxime Ripard <mripard at kernel.org> wrote:
>
> Hi,
>
> On Fri, Feb 16, 2024 at 06:48:56PM GMT, Dave Stevenson wrote:
> > The VEC supports not producing colour bursts for monochrome output.
> > It also has an option for disabling the chroma input to remove
> > chroma from the signal.
> >
> > Now that there is a DRM_MODE_TV_MODE_MONOCHROME defined, plumb
> > this in.
> >
> > Signed-off-by: Dave Stevenson <dave.stevenson at raspberrypi.com>
> > ---
> >  drivers/gpu/drm/vc4/vc4_vec.c | 28 +++++++++++++++++++++++++++-
> >  1 file changed, 27 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/vc4/vc4_vec.c b/drivers/gpu/drm/vc4/vc4_vec.c
> > index 268f18b10ee0..f9e134dd1e3b 100644
> > --- a/drivers/gpu/drm/vc4/vc4_vec.c
> > +++ b/drivers/gpu/drm/vc4/vc4_vec.c
> > @@ -234,6 +234,7 @@ enum vc4_vec_tv_mode_id {
> >       VC4_VEC_TV_MODE_PAL_60,
> >       VC4_VEC_TV_MODE_PAL_N,
> >       VC4_VEC_TV_MODE_SECAM,
> > +     VC4_VEC_TV_MODE_MONOCHROME,
> >  };
> >
> >  struct vc4_vec_tv_mode {
> > @@ -324,6 +325,22 @@ static const struct vc4_vec_tv_mode vc4_vec_tv_modes[] = {
> >               .config1 = VEC_CONFIG1_C_CVBS_CVBS,
> >               .custom_freq = 0x29c71c72,
> >       },
> > +     {
> > +             /* 50Hz mono */
> > +             .mode = DRM_MODE_TV_MODE_MONOCHROME,
> > +             .expected_htotal = 864,
> > +             .config0 = VEC_CONFIG0_PAL_BDGHI_STD | VEC_CONFIG0_BURDIS |
> > +                        VEC_CONFIG0_CHRDIS,
> > +             .config1 = VEC_CONFIG1_C_CVBS_CVBS,
> > +     },
> > +     {
> > +             /* 60Hz mono */
> > +             .mode = DRM_MODE_TV_MODE_MONOCHROME,
> > +             .expected_htotal = 858,
> > +             .config0 = VEC_CONFIG0_PAL_M_STD | VEC_CONFIG0_BURDIS |
> > +                        VEC_CONFIG0_CHRDIS,
> > +             .config1 = VEC_CONFIG1_C_CVBS_CVBS,
> > +     },
> >  };
> >
> >  static inline const struct vc4_vec_tv_mode *
> > @@ -351,6 +368,7 @@ static const struct drm_prop_enum_list legacy_tv_mode_names[] = {
> >       { VC4_VEC_TV_MODE_PAL_M, "PAL-M", },
> >       { VC4_VEC_TV_MODE_PAL_N, "PAL-N", },
> >       { VC4_VEC_TV_MODE_SECAM, "SECAM", },
> > +     { VC4_VEC_TV_MODE_MONOCHROME, "Mono", },
> >  };
> >
> >  static enum drm_connector_status
> > @@ -406,6 +424,10 @@ vc4_vec_connector_set_property(struct drm_connector *connector,
> >               state->tv.mode = DRM_MODE_TV_MODE_SECAM;
> >               break;
> >
> > +     case VC4_VEC_TV_MODE_MONOCHROME:
> > +             state->tv.mode = DRM_MODE_TV_MODE_MONOCHROME;
> > +             break;
> > +
> >       default:
> >               return -EINVAL;
> >       }
> > @@ -453,6 +475,9 @@ vc4_vec_connector_get_property(struct drm_connector *connector,
> >               *val = VC4_VEC_TV_MODE_SECAM;
> >               break;
> >
> > +     case DRM_MODE_TV_MODE_MONOCHROME:
> > +             return VC4_VEC_TV_MODE_MONOCHROME;

I have got an error here - it should be
 *val = VC4_VEC_TV_MODE_MONOCHROME;
  break;

> > +
> >       default:
> >               return -EINVAL;
> >       }
>
> We don't need to expose the new value here, that property is only for
> the legacy, driver-specific property. So you should only need the
> vc4_vec_tv_modes changes

As both properties share the same underlying value, that means that if
the new property selects Monochrome, the legacy one will return
-EINVAL as it is an unknown value.

modetest and kmsprint -p both bomb out in this situation as by the
looks of it we fail to get a pointer to the connector returned. That
means you can't switch it back again.

Am I missing something?

  Dave


More information about the dri-devel mailing list