summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorSrikanth Rajagopalan <rasrik@codeaurora.org>2017-06-08 15:23:31 -0700
committerSrikanth Rajagopalan <rasrik@codeaurora.org>2017-06-26 12:01:55 -0700
commit1be46f298592a16f4ff9f9140d0a8897eb52a413 (patch)
treea6f148cfda1684f684b821289a4b077f2e14fae9 /drivers/gpu/drm
parent6f56b2a9c8e2ce69e2a98e52d5f1342b25cae44e (diff)
drm/msm: add sink capabilities for HDR support
Populate HDR sink capabilities to a DRM blob. These capabilities shall be used by the userspace to calculate the sink HDR properties and setting them. Change-Id: I7c2dbca375c456052ad73889b011553090bcf8f1 Signed-off-by: Srikanth Rajagopalan <rasrik@codeaurora.org>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/msm/msm_drv.h1
-rw-r--r--drivers/gpu/drm/msm/sde/sde_connector.c44
-rw-r--r--drivers/gpu/drm/msm/sde/sde_connector.h2
3 files changed, 45 insertions, 2 deletions
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index f85938f8a034..8d6451084a1a 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -143,6 +143,7 @@ enum msm_mdp_crtc_property {
enum msm_mdp_conn_property {
/* blob properties, always put these first */
CONNECTOR_PROP_SDE_INFO,
+ CONNECTOR_PROP_HDR_INFO,
/* # of blob properties */
CONNECTOR_PROP_BLOBCOUNT,
diff --git a/drivers/gpu/drm/msm/sde/sde_connector.c b/drivers/gpu/drm/msm/sde/sde_connector.c
index e08fe210604c..04539ff8a59d 100644
--- a/drivers/gpu/drm/msm/sde/sde_connector.c
+++ b/drivers/gpu/drm/msm/sde/sde_connector.c
@@ -70,7 +70,8 @@ static void sde_connector_destroy(struct drm_connector *connector)
if (c_conn->blob_caps)
drm_property_unreference_blob(c_conn->blob_caps);
-
+ if (c_conn->blob_hdr)
+ drm_property_unreference_blob(c_conn->blob_hdr);
msm_property_destroy(&c_conn->property_info);
drm_connector_unregister(connector);
@@ -355,6 +356,32 @@ void sde_connector_complete_commit(struct drm_connector *connector)
sde_fence_signal(&to_sde_connector(connector)->retire_fence, 0);
}
+static void sde_connector_update_hdr_props(struct drm_connector *connector)
+{
+ struct sde_connector *c_conn = to_sde_connector(connector);
+ struct drm_msm_ext_panel_hdr_properties hdr_prop = {};
+
+ hdr_prop.hdr_supported = connector->hdr_supported;
+
+ if (hdr_prop.hdr_supported) {
+ hdr_prop.hdr_eotf =
+ connector->hdr_eotf;
+ hdr_prop.hdr_metadata_type_one =
+ connector->hdr_metadata_type_one;
+ hdr_prop.hdr_max_luminance =
+ connector->hdr_max_luminance;
+ hdr_prop.hdr_avg_luminance =
+ connector->hdr_avg_luminance;
+ hdr_prop.hdr_min_luminance =
+ connector->hdr_min_luminance;
+ }
+ msm_property_set_blob(&c_conn->property_info,
+ &c_conn->blob_hdr,
+ &hdr_prop,
+ sizeof(hdr_prop),
+ CONNECTOR_PROP_HDR_INFO);
+}
+
static enum drm_connector_status
sde_connector_detect(struct drm_connector *connector, bool force)
{
@@ -392,6 +419,7 @@ static const struct drm_connector_funcs sde_connector_ops = {
static int sde_connector_get_modes(struct drm_connector *connector)
{
struct sde_connector *c_conn;
+ int ret = 0;
if (!connector) {
SDE_ERROR("invalid connector\n");
@@ -403,8 +431,11 @@ static int sde_connector_get_modes(struct drm_connector *connector)
SDE_DEBUG("missing get_modes callback\n");
return 0;
}
+ ret = c_conn->ops.get_modes(connector, c_conn->display);
+ if (ret)
+ sde_connector_update_hdr_props(connector);
- return c_conn->ops.get_modes(connector, c_conn->display);
+ return ret;
}
static enum drm_mode_status
@@ -575,6 +606,13 @@ struct drm_connector *sde_connector_init(struct drm_device *dev,
kfree(info);
}
+ if (connector_type == DRM_MODE_CONNECTOR_HDMIA) {
+ msm_property_install_blob(&c_conn->property_info,
+ "hdr_properties",
+ DRM_MODE_PROP_IMMUTABLE,
+ CONNECTOR_PROP_HDR_INFO);
+ }
+
msm_property_install_range(&c_conn->property_info, "RETIRE_FENCE",
0x0, 0, INR_OPEN_MAX, 0, CONNECTOR_PROP_RETIRE_FENCE);
@@ -612,6 +650,8 @@ struct drm_connector *sde_connector_init(struct drm_device *dev,
error_destroy_property:
if (c_conn->blob_caps)
drm_property_unreference_blob(c_conn->blob_caps);
+ if (c_conn->blob_hdr)
+ drm_property_unreference_blob(c_conn->blob_hdr);
msm_property_destroy(&c_conn->property_info);
error_unregister_conn:
drm_connector_unregister(&c_conn->base);
diff --git a/drivers/gpu/drm/msm/sde/sde_connector.h b/drivers/gpu/drm/msm/sde/sde_connector.h
index 3f26ee7d5965..4b140176b5f6 100644
--- a/drivers/gpu/drm/msm/sde/sde_connector.h
+++ b/drivers/gpu/drm/msm/sde/sde_connector.h
@@ -139,6 +139,7 @@ struct sde_connector_ops {
* @property_info: Private structure for generic property handling
* @property_data: Array of private data for generic property handling
* @blob_caps: Pointer to blob structure for 'capabilities' property
+ * @blob_hdr: Pointer to blob structure for 'hdr_properties' property
*/
struct sde_connector {
struct drm_connector base;
@@ -159,6 +160,7 @@ struct sde_connector {
struct msm_property_info property_info;
struct msm_property_data property_data[CONNECTOR_PROP_COUNT];
struct drm_property_blob *blob_caps;
+ struct drm_property_blob *blob_hdr;
};
/**