[Intel-gfx] [v10 1/3] drm: Add HDMI colorspace property
Ville Syrjälä
ville.syrjala at linux.intel.com
Mon Feb 4 17:24:07 UTC 2019
On Mon, Feb 04, 2019 at 05:08:40PM +0000, Shankar, Uma wrote:
>
>
> >-----Original Message-----
> >From: Ville Syrjälä [mailto:ville.syrjala at linux.intel.com]
> >Sent: Monday, February 4, 2019 8:55 PM
> >To: Shankar, Uma <uma.shankar at intel.com>
> >Cc: intel-gfx at lists.freedesktop.org; Syrjala, Ville <ville.syrjala at intel.com>;
> >Lankhorst, Maarten <maarten.lankhorst at intel.com>; dri-
> >devel at lists.freedesktop.org
> >Subject: Re: [Intel-gfx] [v10 1/3] drm: Add HDMI colorspace property
> >
> >On Fri, Feb 01, 2019 at 08:50:11PM +0200, Ville Syrjälä wrote:
> >> On Wed, Jan 30, 2019 at 06:24:24PM +0530, Uma Shankar wrote:
> >> > Create a new connector property to program colorspace to sink
> >> > devices. Modern sink devices support more than 1 type of colorspace
> >> > like 601, 709, BT2020 etc. This helps to switch based on content
> >> > type which is to be displayed. The decision lies with compositors as
> >> > to in which scenarios, a particular colorspace will be picked.
> >> >
> >> > This will be helpful mostly to switch to higher gamut colorspaces
> >> > like BT2020 when the media content is encoded as BT2020. Thereby
> >> > giving a good visual experience to users.
> >> >
> >> > The expectation from userspace is that it should parse the EDID and
> >> > get supported colorspaces. Use this property and switch to the one
> >> > supported. Sink supported colorspaces should be retrieved by
> >> > userspace from EDID and driver will not explicitly expose them.
> >> >
> >> > Basically the expectation from userspace is:
> >> > - Set up CRTC DEGAMMA/CTM/GAMMA to convert to some sink
> >> > colorspace
> >> > - Set this new property to let the sink know what it
> >> > converted the CRTC output to.
> >> >
> >> > v2: Addressed Maarten and Ville's review comments. Enhanced the
> >> > colorspace enum to incorporate both HDMI and DP supported
> >> > colorspaces. Also, added a default option for colorspace.
> >> >
> >> > v3: Removed Adobe references from enum definitions as per Ville,
> >> > Hans Verkuil and Jonas Karlman suggestions. Changed Default to an
> >> > unset state where driver will assign the colorspace is not chosen by
> >> > user, suggested by Ville and Maarten. Addressed other misc review
> >> > comments from Maarten. Split the changes to have separate colorspace
> >> > property for DP and HDMI.
> >> >
> >> > v4: Addressed Chris and Ville's review comments, and created a
> >> > common colorspace property for DP and HDMI, filtered the list based
> >> > on the colorspaces supported by the respective protocol standard.
> >> >
> >> > v5: Made the property creation helper accept enum list based on
> >> > platform capabilties as suggested by Shashank. Consolidated HDMI and
> >> > DP property creation in the common helper.
> >> >
> >> > v6: Addressed Shashank's review comments.
> >> >
> >> > v7: Added defines instead of enum in uapi as per Brian Starkey's
> >> > suggestion in order to go with string matching at userspace. Updated
> >> > the commit message to add more details as well kernel docs.
> >> >
> >> > v8: Addressed Maarten's review comments.
> >> >
> >> > v9: Removed macro defines from uapi as per Brian Starkey and Daniel
> >> > Stone's comments and moved to drm include file. Moved back to older
> >> > design with exposing all HDMI colorspaces to userspace since
> >> > infoframe capability is there even on legacy platforms, as per
> >> > Ville's review comments.
> >> >
> >> > v10: Fixed sparse warnings, updated the RB from Maarten and Jani's ack.
> >> >
> >> > Signed-off-by: Uma Shankar <uma.shankar at intel.com>
> >> > Acked-by: Jani Nikula <jani.nikula at intel.com>
> >> > Reviewed-by: Shashank Sharma <shashank.sharma at intel.com>
> >> > Reviewed-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
> >> > ---
> >> > drivers/gpu/drm/drm_atomic_uapi.c | 4 +++
> >> > drivers/gpu/drm/drm_connector.c | 75
> >+++++++++++++++++++++++++++++++++++++++
> >> > include/drm/drm_connector.h | 46 ++++++++++++++++++++++++
> >> > 3 files changed, 125 insertions(+)
> >> >
> >> > diff --git a/drivers/gpu/drm/drm_atomic_uapi.c
> >> > b/drivers/gpu/drm/drm_atomic_uapi.c
> >> > index 9a1f41a..9b5d44f 100644
> >> > --- a/drivers/gpu/drm/drm_atomic_uapi.c
> >> > +++ b/drivers/gpu/drm/drm_atomic_uapi.c
> >> > @@ -746,6 +746,8 @@ static int drm_atomic_connector_set_property(struct
> >drm_connector *connector,
> >> > return -EINVAL;
> >> > }
> >> > state->content_protection = val;
> >> > + } else if (property == connector->colorspace_property) {
> >> > + state->colorspace = val;
> >> > } else if (property == config->writeback_fb_id_property) {
> >> > struct drm_framebuffer *fb = drm_framebuffer_lookup(dev,
> >NULL, val);
> >> > int ret = drm_atomic_set_writeback_fb_for_connector(state,
> >fb);
> >> > @@ -814,6 +816,8 @@ static int drm_atomic_connector_set_property(struct
> >drm_connector *connector,
> >> > *val = state->picture_aspect_ratio;
> >> > } else if (property == config->content_type_property) {
> >> > *val = state->content_type;
> >> > + } else if (property == connector->colorspace_property) {
> >> > + *val = state->colorspace;
> >> > } else if (property == connector->scaling_mode_property) {
> >> > *val = state->scaling_mode;
> >> > } else if (property == connector->content_protection_property) {
> >> > diff --git a/drivers/gpu/drm/drm_connector.c
> >> > b/drivers/gpu/drm/drm_connector.c index 8475396..ed10dd9 100644
> >> > --- a/drivers/gpu/drm/drm_connector.c
> >> > +++ b/drivers/gpu/drm/drm_connector.c
> >> > @@ -826,6 +826,30 @@ int drm_display_info_set_bus_formats(struct
> >> > drm_display_info *info, };
> >> > DRM_ENUM_NAME_FN(drm_get_content_protection_name,
> >drm_cp_enum_list)
> >> >
> >> > +static const struct drm_prop_enum_list hdmi_colorspaces[] = {
> >> > + /* For Default case, driver will set the colorspace */
> >> > + { DRM_MODE_COLORIMETRY_DEFAULT, "Default" },
> >> > + /* Standard Definition Colorimetry based on CEA 861 */
> >> > + { DRM_MODE_COLORIMETRY_ITU_601, "ITU_601" },
> >>
> >> The spec no longer has the BT.601 note here. Which I guess makes sense
> >> since BT.601 didn't even specify any color primaries initially. Later
> >> versions do by they have distinct primaries for NTSC vs. PAL. The spec
> >> calls this just SMPTE 170M now, so I think we should do the same.
>
> Ok Sure, Will update this name. Yeah this was a little confusing as to what name to
> go with. Will take the one defined now in spec i.e., SMPTE 170M.
>
> >>
> >> > + { DRM_MODE_COLORIMETRY_ITU_709, "ITU_709" },
> >> > + /* Standard Definition Colorimetry based on IEC 61966-2-4 */
> >> > + { DRM_MODE_COLORIMETRY_XV_YCC_601, "XV_YCC_601" },
> >> > + /* High Definition Colorimetry based on IEC 61966-2-4 */
> >> > + { DRM_MODE_COLORIMETRY_XV_YCC_709, "XV_YCC_709" },
> >> > + /* Colorimetry based on IEC 61966-2-1/Amendment 1 */
> >> > + { DRM_MODE_COLORIMETRY_S_YCC_601, "S_YCC_601" },
> >> > + /* Colorimetry based on IEC 61966-2-5 [33] */
> >> > + { DRM_MODE_COLORIMETRY_OPYCC_601, "opYCC_601" },
> >>
> >> The spelling is rather inconsistent here. XV_ vs. S_ vs. op. Why not
> >> use the same spelling style for all?
>
> This is the names defined in spec and I used as is. I will make them as
> XVYCC, SYCC and OPYCC for consistency. Hope this is ok ?
>
> >>
> >> > + /* Colorimetry based on IEC 61966-2-5 */
> >> > + { DRM_MODE_COLORIMETRY_OPRGB, "opRGB" },
> >> > + /* Colorimetry based on ITU-R BT.2020 */
> >> > + { DRM_MODE_COLORIMETRY_BT2020_RGB, "BT2020_RGB" },
> >> > + /* Colorimetry based on ITU-R BT.2020 */
> >> > + { DRM_MODE_COLORIMETRY_BT2020_YCC, "BT2020_YCC" },
> >> > + /* Colorimetry based on ITU-R BT.2020 */
> >> > + { DRM_MODE_COLORIMETRY_BT2020_CYCC, "BT2020_CYCC" },
> >>
> >> "BT2020" vs. "ITU_709" is rather inconsistent as well.
>
> Ok, will update this.
>
> >> We also seem to be missing the two DCI-P3 things here.
>
> Yeah, I initially did as per 861.F where it was not there. This got added in 861.G,
> will add this.
>
> >> > +};
> >> > +
> >> > /**
> >> > * DOC: standard connector properties
> >> > *
> >> > @@ -1548,6 +1572,57 @@ int
> >> > drm_mode_create_aspect_ratio_property(struct drm_device *dev)
> >> > EXPORT_SYMBOL(drm_mode_create_aspect_ratio_property);
> >> >
> >> > /**
> >> > + * DOC: standard connector properties
> >> > + *
> >> > + * Colorspace:
> >> > + * drm_mode_create_colorspace_property - create colorspace property
> >> > + * This property helps select a suitable colorspace based on the sink
> >> > + * capability. Modern sink devices support wider gamut like BT2020.
> >> > + * This helps switch to BT2020 mode if the BT2020 encoded video stream
> >> > + * is being played by the user, same for any other colorspace. Thereby
> >> > + * giving a good visual experience to users.
> >> > + *
> >> > + * The expectation from userspace is that it should parse the EDID
> >> > + * and get supported colorspaces. Use this property and switch to the
> >> > + * one supported. Sink supported colorspaces should be retrieved by
> >> > + * userspace from EDID and driver will not explicitly expose them.
> >> > + *
> >> > + * Basically the expectation from userspace is:
> >> > + * - Set up CRTC DEGAMMA/CTM/GAMMA to convert to some sink
> >> > + * colorspace
> >> > + * - Set this new property to let the sink know what it
> >> > + * converted the CRTC output to.
> >> > + * - This property is just to inform sink what colorspace
> >> > + * source is trying to drive.
> >> > + *
> >> > + * Called by a driver the first time it's needed, must be attached
> >> > +to desired
> >> > + * connectors.
> >> > + */
> >> > +int drm_mode_create_colorspace_property(struct drm_connector
> >> > +*connector) {
> >> > + struct drm_device *dev = connector->dev;
> >> > + struct drm_property *prop;
> >> > +
> >> > + if (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA ||
> >> > + connector->connector_type == DRM_MODE_CONNECTOR_HDMIB) {
> >> > + prop = drm_property_create_enum(dev,
> >DRM_MODE_PROP_ENUM,
> >> > + "Colorspace",
> >> > + hdmi_colorspaces,
> >> > +
> > ARRAY_SIZE(hdmi_colorspaces));
> >> > + if (!prop)
> >> > + return -ENOMEM;
> >> > + } else {
> >> > + DRM_DEBUG_KMS("Colorspace property not supported\n");
> >> > + return 0;
> >> > + }
> >> > +
> >> > + connector->colorspace_property = prop;
> >> > +
> >> > + return 0;
> >> > +}
> >> > +EXPORT_SYMBOL(drm_mode_create_colorspace_property);
> >> > +
> >> > +/**
> >> > * drm_mode_create_content_type_property - create content type property
> >> > * @dev: DRM device
> >> > *
> >> > diff --git a/include/drm/drm_connector.h
> >> > b/include/drm/drm_connector.h index 9941613..29495b3 100644
> >> > --- a/include/drm/drm_connector.h
> >> > +++ b/include/drm/drm_connector.h
> >> > @@ -253,6 +253,38 @@ enum drm_panel_orientation {
> >> > DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
> >> > };
> >> >
> >> > +/*
> >> > + * This is a consolidated colorimetry list supported by HDMI and
> >> > + * DP protocol standard. The respective connectors will register
> >> > + * a property with the subset of this list (supported by that
> >> > + * respective protocol). Userspace will set the colorspace through
> >> > + * a colorspace property which will be created and exposed to
> >> > + * userspace.
> >> > + */
> >> > +
> >> > +/* For Default case, driver will set the colorspace */
> >> > +#define DRM_MODE_COLORIMETRY_DEFAULT 0
> >> > +/* CEA 861 Normal Colorimetry options */
> >> > +#define DRM_MODE_COLORIMETRY_ITU_601 1
> >> > +#define DRM_MODE_COLORIMETRY_ITU_709 2
> >> > +/* CEA 861 Extended Colorimetry Options */
> >> > +#define DRM_MODE_COLORIMETRY_XV_YCC_601 3
> >> > +#define DRM_MODE_COLORIMETRY_XV_YCC_709 4
> >> > +#define DRM_MODE_COLORIMETRY_S_YCC_601 5
> >> > +#define DRM_MODE_COLORIMETRY_OPYCC_601 6
> >> > +#define DRM_MODE_COLORIMETRY_OPRGB 7
> >> > +#define DRM_MODE_COLORIMETRY_BT2020_RGB 8
> >> > +#define DRM_MODE_COLORIMETRY_BT2020_YCC 9
> >> > +#define DRM_MODE_COLORIMETRY_BT2020_CYCC 10
> >> > +/* DP MSA Colorimetry Options */
> >> > +#define DRM_MODE_DP_COLORIMETRY_Y_CBCR_ITU_601 11
> >> > +#define DRM_MODE_DP_COLORIMETRY_Y_CBCR_ITU_709 12
> >> > +#define DRM_MODE_DP_COLORIMETRY_SRGB 13
> >> > +#define DRM_MODE_DP_COLORIMETRY_RGB_WIDE_GAMUT
> > 14
> >> > +#define DRM_MODE_DP_COLORIMETRY_SCRGB 15
> >> > +#define DRM_MODE_DP_COLORIMETRY_DCI_P3 16
> >> > +#define DRM_MODE_DP_COLORIMETRY_CUSTOM_COLOR_PROFILE
> > 17
> >>
> >> I think some kind of macro to define these would be good. Assuming
> >> we're trying directly interpret these as the C/EC/ACE bits. I can't
> >> remember if multiple enum values can have the same integer value. If
> >> not we'd also need a YCbCr vs. RGB bit in there somewhere. Assuming we
> >> want to keep RGB and YCbCr separate. Currently only BT.2020 has a
> >> conflict between the two.
> >
> >So I think I'm leaning towards having separate YCbCr vs. RGB values (which is
> >what you had here already, with BT.2020 being the only case where that actually
> >matters). That way someone could even do YCbCr 4:4:4 passthrough by just
> >stuffing YUV data into their RGB framebuffer (with the components swizzled the
> >right way).
> >
> >The one thing that rather breaks that usecase is the automagic 4k YCbCr 4:2:0
> >fallback. So in in order to guarantee that things work correctly I guess we still
> >need explcit control over the output CSC.
> >
> >Ie. some kind of output color encoding prop like this:
> > default /* current behaviour */
> > ycbcr BT.601
> > ycbcr BT.709
> > ycbcr BT.2020
> > /* no ycbcr 4:2:0 fallback for below modes? */
> > rgb 4:4:4
> > ycbcr 4:4:4 BT.601
> > ycbcr 4:4:4 BT.709
> > ycbcr 4:4:4 BT.2020
> > ycbcr 4:2:2 BT.601
> > ycbcr 4:2:2 BT.709
> > ycbcr 4:2:2 BT.2020
> > ycbcr 4:2:0 BT.601
> > ycbcr 4:2:0 BT.709
> > ycbcr 4:2:0 BT.2020
> >
> >Hmm. In fact the automagic 4:2:0 fallback sort of breaks the colorspace prop
> >alredy because if someone set an RGB colorspace but we end up converting to
> >YCbCr 4:2:0 what should we tell the sink? Maybe we just reject the modeset in
> >that case and tell users they need to wait for the output color encoding prop to
> >support that usecase?
>
> Hi yes, an output encoding property to control this make sense and will be useful.
> So if a user decides to have a RGB buffer at source or wants to blend multiple layers in RGB,
> and still want o/p converted to YUV420 at o/p, he can use the current colorspace property to
> set that and send to sink. In case he doesn't do it explicitly we can still let the content be driven
> but with warnings or choose to fail his modeset if that seems better.
>
> What do you suggest, should we keep current property interface like this and extend the usage
> with a separate property on top of it.
I think separate prop to control the output CSC is best. The
colorspace prop should only control the infoframe. If the
two are in violent disagreement we can fail the modeset.
>
> Thanks Ville for your review comments and suggestions.
>
> Regards,
> Uma Shankar
>
> >
> >>
> >> > +
> >> > /**
> >> > * struct drm_display_info - runtime data about the connected sink
> >> > *
> >> > @@ -503,6 +535,13 @@ struct drm_connector_state {
> >> > unsigned int content_protection;
> >> >
> >> > /**
> >> > + * @colorspace: State variable for Connector property to request
> >> > + * colorspace change on Sink. This is most commonly used to switch
> >> > + * to wider color gamuts like BT2020.
> >> > + */
> >> > + u32 colorspace;
> >> > +
> >> > + /**
> >> > * @writeback_job: Writeback job for writeback connectors
> >> > *
> >> > * Holds the framebuffer and out-fence for a writeback connector.
> >> > As @@ -995,6 +1034,12 @@ struct drm_connector {
> >> > struct drm_property *content_protection_property;
> >> >
> >> > /**
> >> > + * @colorspace_property: Connector property to set the suitable
> >> > + * colorspace supported by the sink.
> >> > + */
> >> > + struct drm_property *colorspace_property;
> >> > +
> >> > + /**
> >> > * @path_blob_ptr:
> >> > *
> >> > * DRM blob property data for the DP MST path property. This
> >> > should only @@ -1269,6 +1314,7 @@ int
> >> > drm_connector_attach_vrr_capable_property(
> >> > int drm_connector_attach_content_protection_property(
> >> > struct drm_connector *connector); int
> >> > drm_mode_create_aspect_ratio_property(struct drm_device *dev);
> >> > +int drm_mode_create_colorspace_property(struct drm_connector
> >> > +*connector);
> >> > int drm_mode_create_content_type_property(struct drm_device *dev);
> >> > void drm_hdmi_avi_infoframe_content_type(struct hdmi_avi_infoframe
> >*frame,
> >> > const struct drm_connector_state
> >*conn_state);
> >> > --
> >> > 1.9.1
> >> >
> >> > _______________________________________________
> >> > Intel-gfx mailing list
> >> > Intel-gfx at lists.freedesktop.org
> >> > https://lists.freedesktop.org/mailman/listinfo/intel-gfx
> >>
> >> --
> >> Ville Syrjälä
> >> Intel
> >> _______________________________________________
> >> Intel-gfx mailing list
> >> Intel-gfx at lists.freedesktop.org
> >> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
> >
> >--
> >Ville Syrjälä
> >Intel
--
Ville Syrjälä
Intel
More information about the dri-devel
mailing list