[Intel-gfx] [PATCH v7 1/2] drm: content-type property for HDMI connector
Lisovskiy, Stanislav
stanislav.lisovskiy at intel.com
Fri Apr 27 10:42:04 UTC 2018
Ping.
On Mon, 2018-04-23 at 13:45 +0000, Lisovskiy, Stanislav wrote:
> Ping
> ________________________________________
> From: Intel-gfx [intel-gfx-bounces at lists.freedesktop.org] on behalf
> of StanLis [stanislav.lisovskiy at intel.com]
> Sent: Monday, April 23, 2018 10:34 AM
> To: dri-devel at lists.freedesktop.org
> Cc: intel-gfx at lists.freedesktop.org
> Subject: [Intel-gfx] [PATCH v7 1/2] drm: content-type property for
> HDMI connector
>
> From: Stanislav Lisovskiy <stanislav.lisovskiy at intel.com>
>
> Added content_type property to drm_connector_state
> in order to properly handle external HDMI TV content-type setting.
>
> v2:
> * Moved helper function which attaches content type property
> to the drm core, as was suggested.
> Removed redundant connector state initialization.
>
> v3:
> * Removed caps in drm_content_type_enum_list.
> After some discussion it turned out that HDMI Spec 1.4
> was wrongly assuming that IT Content(itc) bit doesn't affect
> Content type states, however itc bit needs to be manupulated
> as well. In order to not expose additional property for itc,
> for sake of simplicity it was decided to bind those together
> in same "content type" property.
>
> v4:
> * Added it_content checking in intel_digital_connector_atomic_check.
> Fixed documentation for new content type enum.
>
> v5:
> * Moved patch revision's description to commit messages.
>
> v6:
> * Minor naming fix for the content type enumeration string.
>
> v7:
> * Fix parameter name for documentation and parameter alignment
> in order not to get warning. Added Content Type description to
> new HDMI connector properties section.
>
> Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy at intel.com>
> ---
> Documentation/gpu/drm-kms.rst | 6 +++
> Documentation/gpu/kms-properties.csv | 1 +
> drivers/gpu/drm/drm_atomic.c | 17 +++++++
> drivers/gpu/drm/drm_connector.c | 74
> ++++++++++++++++++++++++++++
> drivers/gpu/drm/drm_edid.c | 2 +
> include/drm/drm_connector.h | 18 +++++++
> include/drm/drm_mode_config.h | 5 ++
> include/uapi/drm/drm_mode.h | 7 +++
> 8 files changed, 130 insertions(+)
>
> diff --git a/Documentation/gpu/drm-kms.rst b/Documentation/gpu/drm-
> kms.rst
> index 1dffd1ac4cd4..e233c2626bd0 100644
> --- a/Documentation/gpu/drm-kms.rst
> +++ b/Documentation/gpu/drm-kms.rst
> @@ -517,6 +517,12 @@ Standard Connector Properties
> .. kernel-doc:: drivers/gpu/drm/drm_connector.c
> :doc: standard connector properties
>
> +HDMI Specific Connector Properties
> +-----------------------------
> +
> +.. kernel-doc:: drivers/gpu/drm/drm_connector.c
> + :doc: HDMI connector properties
> +
> Plane Composition Properties
> ----------------------------
>
> diff --git a/Documentation/gpu/kms-properties.csv
> b/Documentation/gpu/kms-properties.csv
> index 6b28b014cb7d..3567c986bd7d 100644
> --- a/Documentation/gpu/kms-properties.csv
> +++ b/Documentation/gpu/kms-properties.csv
> @@ -17,6 +17,7 @@ Owner Module/Drivers,Group,Property
> Name,Type,Property Values,Object attached,De
> ,Virtual GPU,“suggested X”,RANGE,"Min=0,
> Max=0xffffffff",Connector,property to suggest an X offset for a
> connector
> ,,“suggested Y”,RANGE,"Min=0, Max=0xffffffff",Connector,property to
> suggest an Y offset for a connector
> ,Optional,"""aspect ratio""",ENUM,"{ ""None"", ""4:3"", ""16:9""
> }",Connector,TDB
> +,Optional,"""content type""",ENUM,"{ ""No Data"", ""Graphics"",
> ""Photo"", ""Cinema"", ""Game"" }",Connector,TBD
> i915,Generic,"""Broadcast RGB""",ENUM,"{ ""Automatic"", ""Full"",
> ""Limited 16:235"" }",Connector,"When this property is set to Limited
> 16:235 and CTM is set, the hardware will be programmed with the
> result of the multiplication of CTM by the limited range matrix to
> ensure the pixels normaly in the range 0..1.0 are remapped to the
> range 16/255..235/255."
> ,,“audio”,ENUM,"{ ""force-dvi"", ""off"", ""auto"", ""on""
> }",Connector,TBD
> ,SDVO-TV,“mode”,ENUM,"{ ""NTSC_M"", ""NTSC_J"", ""NTSC_443"",
> ""PAL_B"" } etc.",Connector,TBD
> diff --git a/drivers/gpu/drm/drm_atomic.c
> b/drivers/gpu/drm/drm_atomic.c
> index 7d25c42f22db..479499f5848e 100644
> --- a/drivers/gpu/drm/drm_atomic.c
> +++ b/drivers/gpu/drm/drm_atomic.c
> @@ -1266,6 +1266,15 @@ static int
> drm_atomic_connector_set_property(struct drm_connector *connector,
> state->link_status = val;
> } else if (property == config->aspect_ratio_property) {
> state->picture_aspect_ratio = val;
> + } else if (property == config->content_type_property) {
> + /*
> + * Lowest two bits of content_type property control
> + * content_type, bit 2 controls itc bit.
> + * It was decided to have a single property called
> + * content_type, instead of content_type and itc.
> + */
> + state->content_type = val & 3;
> + state->it_content = val >> 2;
> } else if (property == connector->scaling_mode_property) {
> state->scaling_mode = val;
> } else if (property == connector-
> >content_protection_property) {
> @@ -1351,6 +1360,14 @@ drm_atomic_connector_get_property(struct
> drm_connector *connector,
> *val = state->link_status;
> } else if (property == config->aspect_ratio_property) {
> *val = state->picture_aspect_ratio;
> + } else if (property == config->content_type_property) {
> + /*
> + * Lowest two bits of content_type property control
> + * content_type, bit 2 controls itc bit.
> + * It was decided to have a single property called
> + * content_type, instead of content_type and itc.
> + */
> + *val = state->content_type | (state->it_content <<
> 2);
> } 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 b3cde897cd80..4f89602ebaf0 100644
> --- a/drivers/gpu/drm/drm_connector.c
> +++ b/drivers/gpu/drm/drm_connector.c
> @@ -720,6 +720,14 @@ static const struct drm_prop_enum_list
> drm_aspect_ratio_enum_list[] = {
> { DRM_MODE_PICTURE_ASPECT_16_9, "16:9" },
> };
>
> +static const struct drm_prop_enum_list drm_content_type_enum_list[]
> = {
> + { DRM_MODE_CONTENT_TYPE_NO_DATA, "No Data" },
> + { DRM_MODE_CONTENT_TYPE_GRAPHICS, "Graphics" },
> + { DRM_MODE_CONTENT_TYPE_PHOTO, "Photo" },
> + { DRM_MODE_CONTENT_TYPE_CINEMA, "Cinema" },
> + { DRM_MODE_CONTENT_TYPE_GAME, "Game" },
> +};
> +
> static const struct drm_prop_enum_list
> drm_panel_orientation_enum_list[] = {
> { DRM_MODE_PANEL_ORIENTATION_NORMAL, "Normal" },
> { DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP, "Upside Down" },
> @@ -996,6 +1004,45 @@ int drm_mode_create_dvi_i_properties(struct
> drm_device *dev)
> }
> EXPORT_SYMBOL(drm_mode_create_dvi_i_properties);
>
> +
> +/**
> + * DOC: HDMI connector properties
> + *
> + * content type (HDMI specific):
> + * Indicates content type setting to be used in HDMI infoframes
> to indicate
> + * content type for the external device, so that it adjusts it's
> display
> + * settings accordingly.
> + *
> + * The value of this property can be one of the following:
> + *
> + * - DRM_MODE_CONTENT_TYPE_NO_DATA = 0
> + * Content type is unknown, it content(itc) bit is
> cleared.
> + * - DRM_MODE_CONTENT_TYPE_GRAPHICS = 4
> + * Content type is graphics, it content(itc) bit is set.
> + * - DRM_MODE_CONTENT_TYPE_PHOTO = 5
> + * Content type is photo, itc bit is set.
> + * - DRM_MODE_CONTENT_TYPE_CINEMA = 6
> + * Content type is cinema, itc bit is set.
> + * - DRM_MODE_CONTENT_TYPE_GAME = 7
> + * Content type is game, itc bit is set.
> + */
> +
> +/**
> + * drm_connector_attach_content_type_property - attach content-type
> property
> + * @connector: connector to attach content type property on.
> + *
> + * Called by a driver the first time a HDMI connector is made.
> + */
> +int drm_connector_attach_content_type_property(struct drm_connector
> *connector)
> +{
> + if (!drm_mode_create_content_type_property(connector->dev))
> + drm_object_attach_property(&connector->base,
> + connector->dev-
> >mode_config.content_type_property,
> + DRM_MODE_CONTENT_TYPE_NO_D
> ATA);
> + return 0;
> +}
> +EXPORT_SYMBOL(drm_connector_attach_content_type_property);
> +
> /**
> * drm_create_tv_properties - create TV specific connector
> properties
> * @dev: DRM device
> @@ -1260,6 +1307,33 @@ int
> drm_mode_create_aspect_ratio_property(struct drm_device *dev)
> }
> EXPORT_SYMBOL(drm_mode_create_aspect_ratio_property);
>
> +/**
> + * drm_mode_create_content_type_property - create content type
> property
> + * @dev: DRM device
> + *
> + * Called by a driver the first time it's needed, must be attached
> to desired
> + * connectors.
> + *
> + * Returns:
> + * Zero on success, negative errno on failure.
> + */
> +int drm_mode_create_content_type_property(struct drm_device *dev)
> +{
> + if (dev->mode_config.content_type_property)
> + return 0;
> +
> + dev->mode_config.content_type_property =
> + drm_property_create_enum(dev, 0, "content type",
> + drm_content_type_enum_list,
> + ARRAY_SIZE(drm_content_type_
> enum_list));
> +
> + if (dev->mode_config.content_type_property == NULL)
> + return -ENOMEM;
> +
> + return 0;
> +}
> +EXPORT_SYMBOL(drm_mode_create_content_type_property);
> +
> /**
> * drm_mode_create_suggested_offset_properties - create suggests
> offset properties
> * @dev: DRM device
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 134069f36482..b1b7f9683e34 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -4867,6 +4867,8 @@ drm_hdmi_avi_infoframe_from_display_mode(struct
> hdmi_avi_infoframe *frame,
> }
>
> frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
> + frame->content_type = HDMI_CONTENT_TYPE_GRAPHICS;
> + frame->itc = 0;
>
> /*
> * Populate picture aspect ratio from either
> diff --git a/include/drm/drm_connector.h
> b/include/drm/drm_connector.h
> index 675cc3f8cf85..1fedab750f09 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -418,6 +418,22 @@ struct drm_connector_state {
> */
> enum hdmi_picture_aspect picture_aspect_ratio;
>
> + /**
> + * @content_type: Connector property to control the
> + * HDMI infoframe content type setting.
> + * The %DRM_MODE_CONTENT_TYPE_\* values lowest 2 bits much
> + * match the values for &enum hdmi_content_type
> + */
> + enum hdmi_content_type content_type;
> +
> + /**
> + * @it_content: Connector property to control the
> + * HDMI infoframe it content setting(used with content type).
> + * The %DRM_MODE_CONTENT_TYPE_\* values bit 2
> + * match the values of it_content
> + */
> + bool it_content;
> +
> /**
> * @scaling_mode: Connector property to control the
> * upscaling, mostly used for built-in panels.
> @@ -1089,11 +1105,13 @@ int drm_mode_create_tv_properties(struct
> drm_device *dev,
> unsigned int num_modes,
> const char * const modes[]);
> int drm_mode_create_scaling_mode_property(struct drm_device *dev);
> +int drm_connector_attach_content_type_property(struct drm_connector
> *dev);
> int drm_connector_attach_scaling_mode_property(struct drm_connector
> *connector,
> u32
> scaling_mode_mask);
> 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_content_type_property(struct drm_device *dev);
> int drm_mode_create_suggested_offset_properties(struct drm_device
> *dev);
>
> int drm_mode_connector_set_path_property(struct drm_connector
> *connector,
> diff --git a/include/drm/drm_mode_config.h
> b/include/drm/drm_mode_config.h
> index 33b3a96d66d0..fb45839179dd 100644
> --- a/include/drm/drm_mode_config.h
> +++ b/include/drm/drm_mode_config.h
> @@ -726,6 +726,11 @@ struct drm_mode_config {
> * HDMI infoframe aspect ratio setting.
> */
> struct drm_property *aspect_ratio_property;
> + /**
> + * @content_type_property: Optional connector property to
> control the
> + * HDMI infoframe content type setting.
> + */
> + struct drm_property *content_type_property;
> /**
> * @degamma_lut_property: Optional CRTC property to set the
> LUT used to
> * convert the framebuffer's colors to linear gamma.
> diff --git a/include/uapi/drm/drm_mode.h
> b/include/uapi/drm/drm_mode.h
> index 50bcf4214ff9..3c234bfa80b9 100644
> --- a/include/uapi/drm/drm_mode.h
> +++ b/include/uapi/drm/drm_mode.h
> @@ -94,6 +94,13 @@ extern "C" {
> #define DRM_MODE_PICTURE_ASPECT_4_3 1
> #define DRM_MODE_PICTURE_ASPECT_16_9 2
>
> +/* HDMI content type and itc bit bound together for simplicity */
> +#define DRM_MODE_CONTENT_TYPE_NO_DATA 0
> +#define DRM_MODE_CONTENT_TYPE_GRAPHICS 4
> +#define DRM_MODE_CONTENT_TYPE_PHOTO 5
> +#define DRM_MODE_CONTENT_TYPE_CINEMA 6
> +#define DRM_MODE_CONTENT_TYPE_GAME 7
> +
> /* Aspect ratio flag bitmask (4 bits 22:19) */
> #define DRM_MODE_FLAG_PIC_AR_MASK (0x0F<<19)
> #define DRM_MODE_FLAG_PIC_AR_NONE \
> --
> 2.17.0
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
--
Best Regards,
Lisovskiy Stanislav
More information about the Intel-gfx
mailing list