From c79760ba9747244cc5ad5c8791c840be6ed62ae6 Mon Sep 17 00:00:00 2001 From: Abhinav Kumar Date: Tue, 28 May 2019 17:16:04 -0700 Subject: [PATCH] disp: msm: dp: populate supported colorspace property for DP Populate the supported colorspaces property for DP as part of getting the display modes. This will expose the supported colorspaces of the sink to userspace and in-turn the userspace shall pick the colorspace suitable for the use-case. Change-Id: I70408c719610bc63f9c06dad8cd50f7fa5d94908 Signed-off-by: Abhinav Kumar --- msm/dp/dp_display.c | 10 ++++++++++ msm/msm_drv.h | 1 + msm/sde/sde_connector.c | 23 +++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/msm/dp/dp_display.c b/msm/dp/dp_display.c index 8fa0dc81fd..68b26d4cf7 100644 --- a/msm/dp/dp_display.c +++ b/msm/dp/dp_display.c @@ -1676,6 +1676,14 @@ end: return 0; } +static void dp_display_clear_colorspaces(struct dp_display *dp_display) +{ + struct drm_connector *connector; + + connector = dp_display->base_connector; + connector->color_enc_fmt = 0; +} + static int dp_display_pre_disable(struct dp_display *dp_display, void *panel) { struct dp_display_private *dp; @@ -1732,6 +1740,8 @@ static int dp_display_pre_disable(struct dp_display *dp_display, void *panel) } } + dp_display_clear_colorspaces(dp_display); + clean: if (dp_panel->audio_supported) dp_panel->audio->off(dp_panel->audio); diff --git a/msm/msm_drv.h b/msm/msm_drv.h index 264c69f001..a99a64a8da 100644 --- a/msm/msm_drv.h +++ b/msm/msm_drv.h @@ -190,6 +190,7 @@ enum msm_mdp_conn_property { CONNECTOR_PROP_ROI_V1, CONNECTOR_PROP_BL_SCALE, CONNECTOR_PROP_SV_BL_SCALE, + CONNECTOR_PROP_SUPPORTED_COLORSPACES, /* enum/bitmask properties */ CONNECTOR_PROP_TOPOLOGY_NAME, diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c index 844d2b8590..99550b67a6 100644 --- a/msm/sde/sde_connector.c +++ b/msm/sde/sde_connector.c @@ -1480,6 +1480,20 @@ static void sde_connector_update_hdr_props(struct drm_connector *connector) &hdr, sizeof(hdr), CONNECTOR_PROP_EXT_HDR_INFO); } +static void sde_connector_update_colorspace(struct drm_connector *connector) +{ + int ret; + + ret = msm_property_set_property( + sde_connector_get_propinfo(connector), + sde_connector_get_property_state(connector->state), + CONNECTOR_PROP_SUPPORTED_COLORSPACES, + connector->color_enc_fmt); + + if (ret) + SDE_ERROR("failed to set colorspace property for connector\n"); +} + static enum drm_connector_status sde_connector_detect(struct drm_connector *connector, bool force) { @@ -1919,6 +1933,9 @@ static int sde_connector_get_modes(struct drm_connector *connector) if (c_conn->hdr_capable) sde_connector_update_hdr_props(connector); + if (c_conn->connector_type == DRM_MODE_CONNECTOR_DisplayPort) + sde_connector_update_colorspace(connector); + return mode_count; } @@ -2388,6 +2405,12 @@ static int _sde_connector_install_properties(struct drm_device *dev, c_conn->bl_scale = MAX_BL_SCALE_LEVEL; c_conn->bl_scale_sv = MAX_SV_BL_SCALE_LEVEL; + if (connector_type == DRM_MODE_CONNECTOR_DisplayPort) + msm_property_install_range(&c_conn->property_info, + "supported_colorspaces", + DRM_MODE_PROP_IMMUTABLE, 0, 0xffff, 0, + CONNECTOR_PROP_SUPPORTED_COLORSPACES); + /* enum/bitmask properties */ msm_property_install_enum(&c_conn->property_info, "topology_name", DRM_MODE_PROP_IMMUTABLE, 0, e_topology_name,