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)
committerNitin Garg <nitin.garg@nxp.com>
Tue, 20 Mar 2018 19:55:35 +0000 (14:55 -0500)
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 a5583bd..ab202c1 100644 (file)
@@ -979,6 +979,8 @@ 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);
@@ -1003,6 +1005,14 @@ 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,
+                                       -1,
+                                       &replaced);
+                       state->hdr_metadata_changed |= replaced;
+                       return ret;
        } else if (connector->funcs->atomic_set_property) {
                return connector->funcs->atomic_set_property(connector,
                                state, property, val);
@@ -1043,6 +1053,9 @@ drm_atomic_connector_get_property(struct drm_connector *connector,
                *val = connector->dpms;
        } else if (property == config->link_status_property) {
                *val = state->link_status;
+       } 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 a539394..ccd2500 100644 (file)
@@ -3258,6 +3258,10 @@ __drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector,
        memcpy(state, connector->state, sizeof(*state));
        if (state->crtc)
                drm_connector_reference(connector);
+       if (state->hdr_source_metadata_blob_ptr)
+               drm_property_reference_blob(state->hdr_source_metadata_blob_ptr);
+
+       state->hdr_metadata_changed = false;
 }
 EXPORT_SYMBOL(__drm_atomic_helper_connector_duplicate_state);
 
@@ -3385,6 +3389,8 @@ __drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state)
         */
        if (state->crtc)
                drm_connector_unreference(state->connector);
+       if (state->hdr_source_metadata_blob_ptr)
+               drm_property_unreference_blob(state->hdr_source_metadata_blob_ptr);
 }
 EXPORT_SYMBOL(__drm_atomic_helper_connector_destroy_state);