drm: Add HDR panel metadata property

HDR_PANEL_METADATA is used to indicate HDR capacity of sink device.

Change-Id: I598a7bb5634f14b57f94135fd3be6b0ad2075116
Signed-off-by: Zheng Yang <zhengyang@rock-chips.com>
This commit is contained in:
Zheng Yang
2017-10-12 18:08:32 +08:00
committed by Tao Huang
parent 2391d71d38
commit 97fd2e42b6
5 changed files with 43 additions and 0 deletions

View File

@@ -2360,6 +2360,8 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
{
struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
connector);
struct hdr_static_metadata *metedata =
&connector->hdr_sink_metadata.hdmi_type1;
struct edid *edid;
int ret = 0;
@@ -2376,6 +2378,7 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
drm_connector_update_edid_property(connector, edid);
cec_notifier_set_phys_addr_from_edid(hdmi->cec_notifier, edid);
ret = drm_add_edid_modes(connector, edid);
drm_mode_connector_update_hdr_property(connector, metedata);
kfree(edid);
} else {
dev_dbg(hdmi->dev, "failed to get edid\n");

View File

@@ -1005,6 +1005,14 @@ int drm_connector_create_standard_properties(struct drm_device *dev)
return -ENOMEM;
dev->mode_config.hdr_output_metadata_property = prop;
prop = drm_property_create(dev,
DRM_MODE_PROP_BLOB |
DRM_MODE_PROP_IMMUTABLE,
"HDR_PANEL_METADATA", 0);
if (!prop)
return -ENOMEM;
dev->mode_config.hdr_panel_metadata_property = prop;
return 0;
}
@@ -1554,6 +1562,28 @@ int drm_connector_update_edid_property(struct drm_connector *connector,
}
EXPORT_SYMBOL(drm_connector_update_edid_property);
int
drm_mode_connector_update_hdr_property(struct drm_connector *connector,
const struct hdr_static_metadata *data)
{
struct drm_device *dev = connector->dev;
size_t size = sizeof(*data);
struct drm_property *property =
dev->mode_config.hdr_panel_metadata_property;
struct drm_property_blob **replace =
&connector->state->hdr_panel_blob_ptr;
int ret;
ret = drm_property_replace_global_blob(dev,
replace,
size,
data,
&connector->base,
property);
return ret;
}
EXPORT_SYMBOL(drm_mode_connector_update_hdr_property);
/**
* drm_connector_set_link_status_property - Set link status property of a connector
* @connector: drm connector

View File

@@ -836,6 +836,9 @@ dw_hdmi_rockchip_attach_properties(struct drm_connector *connector,
prop = connector->dev->mode_config.hdr_output_metadata_property;
if (version >= 0x211a)
drm_object_attach_property(&connector->base, prop, 0);
prop = connector->dev->mode_config.hdr_panel_metadata_property;
drm_object_attach_property(&connector->base, prop, 0);
}
static void

View File

@@ -466,6 +466,8 @@ struct drm_connector_state {
* DRM blob property for HDR output metadata
*/
struct drm_property_blob *hdr_output_metadata;
struct drm_property_blob *hdr_panel_blob_ptr;
};
/**
@@ -1213,6 +1215,9 @@ int drm_connector_set_path_property(struct drm_connector *connector,
int drm_connector_set_tile_property(struct drm_connector *connector);
int drm_connector_update_edid_property(struct drm_connector *connector,
const struct edid *edid);
int
drm_mode_connector_update_hdr_property(struct drm_connector *connector,
const struct hdr_static_metadata *data);
void drm_connector_set_link_status_property(struct drm_connector *connector,
uint64_t link_status);
int drm_connector_init_panel_orientation_property(

View File

@@ -824,6 +824,8 @@ struct drm_mode_config {
*/
struct drm_property *hdr_output_metadata_property;
struct drm_property *hdr_panel_metadata_property;
/* dumb ioctl parameters */
uint32_t preferred_depth, prefer_shadow;