From 97fd2e42b6daeca332aeb96864930d3827ff29d9 Mon Sep 17 00:00:00 2001 From: Zheng Yang Date: Thu, 12 Oct 2017 18:08:32 +0800 Subject: [PATCH] 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 --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 3 +++ drivers/gpu/drm/drm_connector.c | 30 +++++++++++++++++++++ drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 3 +++ include/drm/drm_connector.h | 5 ++++ include/drm/drm_mode_config.h | 2 ++ 5 files changed, 43 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index c82783def68c..575d207fd550 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -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"); diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c index 1db836cf1a42..deb0dd353b03 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -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 diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index d54804be6a26..5ff82856c7d6 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -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 diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index 3dabe3d0986e..78c6768c4022 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -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( diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h index c56020ba9c44..f48303ff8b65 100644 --- a/include/drm/drm_mode_config.h +++ b/include/drm/drm_mode_config.h @@ -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;