drm: Implement HDR source metadata set and get property handling
authorUma Shankar <uma.shankar@intel.com>
Wed, 31 May 2017 10:10:55 +0000 (15:40 +0530)
committerLeonard Crestez <leonard.crestez@nxp.com>
Wed, 17 Apr 2019 23:51:34 +0000 (02:51 +0300)
HDR source metadata set and get property implemented in this
patch. The blob data is received from userspace and saved in
connector state, the same is returned as blob in get property
call to userspace.

Signed-off-by: Uma Shankar <uma.shankar@intel.com>
drivers/gpu/drm/drm_atomic.c
drivers/gpu/drm/drm_atomic_helper.c

index 281cf9c..d4248ac 100644 (file)
@@ -1350,6 +1350,8 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector,
 {
        struct drm_device *dev = connector->dev;
        struct drm_mode_config *config = &dev->mode_config;
+       bool replaced = false;
+       int ret;
 
        if (property == config->prop_crtc_id) {
                struct drm_crtc *crtc = drm_crtc_find(dev, NULL, val);
@@ -1398,6 +1400,15 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector,
                 */
                if (state->link_status != DRM_LINK_STATUS_GOOD)
                        state->link_status = val;
+       } else if (property == config->hdr_source_metadata_property) {
+               ret = drm_atomic_replace_property_blob_from_id(dev,
+                               &state->hdr_source_metadata_blob_ptr,
+                               val,
+                               sizeof(struct hdr_static_metadata),
+                               -1,
+                               &replaced);
+               state->hdr_metadata_changed |= replaced;
+               return ret;
        } else if (property == config->aspect_ratio_property) {
                state->picture_aspect_ratio = val;
        } else if (property == config->content_type_property) {
@@ -1516,6 +1527,9 @@ drm_atomic_connector_get_property(struct drm_connector *connector,
                *val = 0;
        } else if (property == config->writeback_out_fence_ptr_property) {
                *val = 0;
+       } else if (property == config->hdr_source_metadata_property) {
+               *val = (state->hdr_source_metadata_blob_ptr) ?
+                       state->hdr_source_metadata_blob_ptr->base.id : 0;
        } else if (connector->funcs->atomic_get_property) {
                return connector->funcs->atomic_get_property(connector,
                                state, property, val);
index 94f5c36..b26ab02 100644 (file)
@@ -3753,6 +3753,11 @@ __drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector,
 
        /* Don't copy over a writeback job, they are used only once */
        state->writeback_job = NULL;
+
+       if (state->hdr_source_metadata_blob_ptr)
+               drm_property_blob_get(state->hdr_source_metadata_blob_ptr);
+
+       state->hdr_metadata_changed = false;
 }
 EXPORT_SYMBOL(__drm_atomic_helper_connector_duplicate_state);
 
@@ -3882,6 +3887,9 @@ __drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state)
 
        if (state->commit)
                drm_crtc_commit_put(state->commit);
+
+       if (state->hdr_source_metadata_blob_ptr)
+               drm_property_blob_put(state->hdr_source_metadata_blob_ptr);
 }
 EXPORT_SYMBOL(__drm_atomic_helper_connector_destroy_state);