Message ID | 20180413220019.20037-1-stanislav.lisovskiy@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sat, Apr 14, 2018 at 01:00:19AM +0300, StanLis wrote: > From: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com> > > Added content_type property to > drm_connector_state in order to properly handle > external HDMI TV content-type setting. > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com> > --- > drivers/gpu/drm/drm_atomic.c | 4 ++++ > drivers/gpu/drm/drm_connector.c | 34 +++++++++++++++++++++++++++++ > drivers/gpu/drm/drm_edid.c | 1 + > drivers/gpu/drm/i915/intel_atomic.c | 1 + > drivers/gpu/drm/i915/intel_drv.h | 1 + > drivers/gpu/drm/i915/intel_hdmi.c | 4 ++++ > drivers/gpu/drm/i915/intel_modes.c | 10 +++++++++ > include/drm/drm_connector.h | 2 ++ > include/drm/drm_mode_config.h | 5 +++++ > include/uapi/drm/drm_mode.h | 5 +++++ Pls split the patch into two parts: one for drm core, the other for i915. Then post to dri-devel, with intel-gfx cc:d. > 10 files changed, 67 insertions(+) > > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c > index 7d25c42f22db..72fd2a1c801f 100644 > --- a/drivers/gpu/drm/drm_atomic.c > +++ b/drivers/gpu/drm/drm_atomic.c > @@ -1266,6 +1266,8 @@ 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) { > + state->content_type = val; > } else if (property == connector->scaling_mode_property) { > state->scaling_mode = val; > } else if (property == connector->content_protection_property) { > @@ -1351,6 +1353,8 @@ 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) { > + *val = state->content_type; > } 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..d03586edd483 100644 > --- a/drivers/gpu/drm/drm_connector.c > +++ b/drivers/gpu/drm/drm_connector.c > @@ -720,6 +720,13 @@ 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_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" }, > @@ -1260,6 +1267,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..946a182e0201 100644 > --- a/drivers/gpu/drm/drm_edid.c > +++ b/drivers/gpu/drm/drm_edid.c > @@ -4867,6 +4867,7 @@ 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; > > /* > * Populate picture aspect ratio from either > diff --git a/drivers/gpu/drm/i915/intel_atomic.c b/drivers/gpu/drm/i915/intel_atomic.c > index 40285d1b91b7..61ddb5871d8a 100644 > --- a/drivers/gpu/drm/i915/intel_atomic.c > +++ b/drivers/gpu/drm/i915/intel_atomic.c > @@ -124,6 +124,7 @@ int intel_digital_connector_atomic_check(struct drm_connector *conn, > if (new_conn_state->force_audio != old_conn_state->force_audio || > new_conn_state->broadcast_rgb != old_conn_state->broadcast_rgb || > new_conn_state->base.picture_aspect_ratio != old_conn_state->base.picture_aspect_ratio || > + new_conn_state->base.content_type != old_conn_state->base.content_type || > new_conn_state->base.scaling_mode != old_conn_state->base.scaling_mode) > crtc_state->mode_changed = true; > > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h > index 5bd2263407b2..07fd7ba21f38 100644 > --- a/drivers/gpu/drm/i915/intel_drv.h > +++ b/drivers/gpu/drm/i915/intel_drv.h > @@ -1818,6 +1818,7 @@ int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter); > void intel_attach_force_audio_property(struct drm_connector *connector); > void intel_attach_broadcast_rgb_property(struct drm_connector *connector); > void intel_attach_aspect_ratio_property(struct drm_connector *connector); > +void intel_attach_content_type_property(struct drm_connector *connector); > > > /* intel_overlay.c */ > diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c > index ee929f31f7db..cd484276e9b0 100644 > --- a/drivers/gpu/drm/i915/intel_hdmi.c > +++ b/drivers/gpu/drm/i915/intel_hdmi.c > @@ -491,6 +491,8 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder, > intel_hdmi->rgb_quant_range_selectable, > is_hdmi2_sink); > > + frame.avi.content_type = connector->state->content_type; > + > /* TODO: handle pixel repetition for YCBCR420 outputs */ > intel_write_infoframe(encoder, crtc_state, &frame); > } > @@ -2065,7 +2067,9 @@ intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *c > intel_attach_force_audio_property(connector); > intel_attach_broadcast_rgb_property(connector); > intel_attach_aspect_ratio_property(connector); > + intel_attach_content_type_property(connector); > connector->state->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE; > + connector->state->content_type = HDMI_CONTENT_TYPE_GRAPHICS; > } > > /* > diff --git a/drivers/gpu/drm/i915/intel_modes.c b/drivers/gpu/drm/i915/intel_modes.c > index b39846613e3c..232811ab71a3 100644 > --- a/drivers/gpu/drm/i915/intel_modes.c > +++ b/drivers/gpu/drm/i915/intel_modes.c > @@ -133,3 +133,13 @@ intel_attach_aspect_ratio_property(struct drm_connector *connector) > connector->dev->mode_config.aspect_ratio_property, > DRM_MODE_PICTURE_ASPECT_NONE); > } > + > +void > +intel_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_GRAPHICS); > +} > + > diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h > index 675cc3f8cf85..b656d6ffdca0 100644 > --- a/include/drm/drm_connector.h > +++ b/include/drm/drm_connector.h > @@ -417,6 +417,7 @@ struct drm_connector_state { > * values for &enum hdmi_picture_aspect > */ > enum hdmi_picture_aspect picture_aspect_ratio; > + enum hdmi_content_type content_type; Missing kernel-doc here? I didn't look at things too closely yet, but on a high level this is looking quite good. > > /** > * @scaling_mode: Connector property to control the > @@ -1094,6 +1095,7 @@ int drm_connector_attach_scaling_mode_property(struct drm_connector *connector, > 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..d9f1b290d2a6 100644 > --- a/include/uapi/drm/drm_mode.h > +++ b/include/uapi/drm/drm_mode.h > @@ -94,6 +94,11 @@ extern "C" { > #define DRM_MODE_PICTURE_ASPECT_4_3 1 > #define DRM_MODE_PICTURE_ASPECT_16_9 2 > > +#define DRM_MODE_CONTENT_TYPE_GRAPHICS 0 > +#define DRM_MODE_CONTENT_TYPE_PHOTO 1 > +#define DRM_MODE_CONTENT_TYPE_CINEMA 2 > +#define DRM_MODE_CONTENT_TYPE_GAME 3 > + > /* 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
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 7d25c42f22db..72fd2a1c801f 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -1266,6 +1266,8 @@ 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) { + state->content_type = val; } else if (property == connector->scaling_mode_property) { state->scaling_mode = val; } else if (property == connector->content_protection_property) { @@ -1351,6 +1353,8 @@ 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) { + *val = state->content_type; } 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..d03586edd483 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -720,6 +720,13 @@ 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_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" }, @@ -1260,6 +1267,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..946a182e0201 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -4867,6 +4867,7 @@ 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; /* * Populate picture aspect ratio from either diff --git a/drivers/gpu/drm/i915/intel_atomic.c b/drivers/gpu/drm/i915/intel_atomic.c index 40285d1b91b7..61ddb5871d8a 100644 --- a/drivers/gpu/drm/i915/intel_atomic.c +++ b/drivers/gpu/drm/i915/intel_atomic.c @@ -124,6 +124,7 @@ int intel_digital_connector_atomic_check(struct drm_connector *conn, if (new_conn_state->force_audio != old_conn_state->force_audio || new_conn_state->broadcast_rgb != old_conn_state->broadcast_rgb || new_conn_state->base.picture_aspect_ratio != old_conn_state->base.picture_aspect_ratio || + new_conn_state->base.content_type != old_conn_state->base.content_type || new_conn_state->base.scaling_mode != old_conn_state->base.scaling_mode) crtc_state->mode_changed = true; diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 5bd2263407b2..07fd7ba21f38 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -1818,6 +1818,7 @@ int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter); void intel_attach_force_audio_property(struct drm_connector *connector); void intel_attach_broadcast_rgb_property(struct drm_connector *connector); void intel_attach_aspect_ratio_property(struct drm_connector *connector); +void intel_attach_content_type_property(struct drm_connector *connector); /* intel_overlay.c */ diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index ee929f31f7db..cd484276e9b0 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c @@ -491,6 +491,8 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder, intel_hdmi->rgb_quant_range_selectable, is_hdmi2_sink); + frame.avi.content_type = connector->state->content_type; + /* TODO: handle pixel repetition for YCBCR420 outputs */ intel_write_infoframe(encoder, crtc_state, &frame); } @@ -2065,7 +2067,9 @@ intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *c intel_attach_force_audio_property(connector); intel_attach_broadcast_rgb_property(connector); intel_attach_aspect_ratio_property(connector); + intel_attach_content_type_property(connector); connector->state->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE; + connector->state->content_type = HDMI_CONTENT_TYPE_GRAPHICS; } /* diff --git a/drivers/gpu/drm/i915/intel_modes.c b/drivers/gpu/drm/i915/intel_modes.c index b39846613e3c..232811ab71a3 100644 --- a/drivers/gpu/drm/i915/intel_modes.c +++ b/drivers/gpu/drm/i915/intel_modes.c @@ -133,3 +133,13 @@ intel_attach_aspect_ratio_property(struct drm_connector *connector) connector->dev->mode_config.aspect_ratio_property, DRM_MODE_PICTURE_ASPECT_NONE); } + +void +intel_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_GRAPHICS); +} + diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index 675cc3f8cf85..b656d6ffdca0 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -417,6 +417,7 @@ struct drm_connector_state { * values for &enum hdmi_picture_aspect */ enum hdmi_picture_aspect picture_aspect_ratio; + enum hdmi_content_type content_type; /** * @scaling_mode: Connector property to control the @@ -1094,6 +1095,7 @@ int drm_connector_attach_scaling_mode_property(struct drm_connector *connector, 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..d9f1b290d2a6 100644 --- a/include/uapi/drm/drm_mode.h +++ b/include/uapi/drm/drm_mode.h @@ -94,6 +94,11 @@ extern "C" { #define DRM_MODE_PICTURE_ASPECT_4_3 1 #define DRM_MODE_PICTURE_ASPECT_16_9 2 +#define DRM_MODE_CONTENT_TYPE_GRAPHICS 0 +#define DRM_MODE_CONTENT_TYPE_PHOTO 1 +#define DRM_MODE_CONTENT_TYPE_CINEMA 2 +#define DRM_MODE_CONTENT_TYPE_GAME 3 + /* Aspect ratio flag bitmask (4 bits 22:19) */ #define DRM_MODE_FLAG_PIC_AR_MASK (0x0F<<19) #define DRM_MODE_FLAG_PIC_AR_NONE \