diff options
author | Dave Airlie <airlied@redhat.com> | 2018-03-01 15:38:11 +0200 |
---|---|---|
committer | Leonard Crestez <leonard.crestez@nxp.com> | 2018-08-24 12:41:33 +0300 |
commit | 4628cee10a7b7f25dbe52822e381d485000b17cc (patch) | |
tree | b5bfa063403585c477519980a5c2d264d9d87bfc | |
parent | 5526e9f22f36b4b644ef4be1efb1c0b55fc48bfb (diff) |
drm: add connector info/property for non-desktop displays [v2]
This adds the infrastructure needed to quirk displays
using edid and to mark them a non-desktop.
A non-desktop display is one which shouldn't normally be included
as a part of a desktop environment.
This is meant to cover head mounted devices like HTC Vive.
v2: Change description from non-standard to non-desktop, add docs
Reviewed-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Marius Vlad <marius-cristian.vlad@nxp.com>
(Ported 66660d4cf21b7dfcb25 from git://people.freedesktop.org/~airlied/linux)
-rw-r--r-- | drivers/gpu/drm/drm_connector.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_edid.c | 8 | ||||
-rw-r--r-- | include/drm/drm_connector.h | 5 | ||||
-rw-r--r-- | include/drm/drm_crtc.h | 8 |
4 files changed, 32 insertions, 2 deletions
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c index ae733d62ee39..65beb5b411bb 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -248,6 +248,10 @@ int drm_connector_init(struct drm_device *dev, config->link_status_property, 0); + drm_object_attach_property(&connector->base, + config->non_desktop_property, + 0); + if (drm_core_check_feature(dev, DRIVER_ATOMIC)) { drm_object_attach_property(&connector->base, config->prop_crtc_id, 0); } @@ -659,6 +663,11 @@ int drm_connector_create_standard_properties(struct drm_device *dev) return -ENOMEM; dev->mode_config.link_status_property = prop; + prop = drm_property_create_bool(dev, DRM_MODE_PROP_IMMUTABLE, "non-desktop"); + if (!prop) + return -ENOMEM; + dev->mode_config.non_desktop_property = prop; + return 0; } @@ -978,6 +987,10 @@ int drm_mode_connector_update_edid_property(struct drm_connector *connector, if (edid) size = EDID_LENGTH * (1 + edid->extensions); + drm_object_property_set_value(&connector->base, + dev->mode_config.non_desktop_property, + connector->display_info.non_desktop); + ret = drm_property_replace_global_blob(dev, &connector->edid_blob_ptr, size, diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index e696b5ca5c8a..1da4567737be 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -79,6 +79,8 @@ #define EDID_QUIRK_FORCE_6BPC (1 << 10) /* Force 10bpc */ #define EDID_QUIRK_FORCE_10BPC (1 << 11) +/* Non desktop display (i.e. HMD) */ +#define EDID_QUIRK_NON_DESKTOP (1 << 12) struct detailed_mode_closure { struct drm_connector *connector; @@ -4409,7 +4411,7 @@ static void drm_parse_cea_ext(struct drm_connector *connector, } static void drm_add_display_info(struct drm_connector *connector, - struct edid *edid) + struct edid *edid, u32 quirks) { struct drm_display_info *info = &connector->display_info; @@ -4423,6 +4425,8 @@ static void drm_add_display_info(struct drm_connector *connector, info->max_tmds_clock = 0; info->dvi_dual = false; + info->non_desktop = !!(quirks & EDID_QUIRK_NON_DESKTOP); + if (edid->revision < 3) return; @@ -4643,7 +4647,7 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) * To avoid multiple parsing of same block, lets parse that map * from sink info, before parsing CEA modes. */ - drm_add_display_info(connector, edid); + drm_add_display_info(connector, edid, quirks); /* * EDID spec says modes should be preferred in this order: diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index e87c963c84a1..ebdcc4a3857d 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -274,6 +274,11 @@ struct drm_display_info { u8 cea_rev; /** + * @non_desktop: Non desktop display (HMD) + */ + bool non_desktop; + + /** * @hdmi: advance features of a HDMI sink. */ struct drm_hdmi_info hdmi; diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 491ee9901047..6fcc80703333 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -1303,6 +1303,14 @@ struct drm_mode_config { * the position of the output on the host's screen. */ struct drm_property *suggested_x_property; + + /** + * @non_desktop_property: Optional connector property with a hint + * that device isn't a standard display, and the console/desktop + * should not be displayed on it. + */ + struct drm_property *non_desktop_property; + /** * @suggested_y_property: Optional connector property with a hint for * the position of the output on the host's screen. |