Skip to contentSkip to conversation

drm: add connector info/property for non-desktop displays

PATCH In review Dave Airlie 5 participants 13 messages Oct 25, 2017 – Nov 11, 2017

Subsystems (2)
lore
Share & tools
lore

Dave Airlie

author maintainer
#0 lore raw

PATCH 1/3 drm: add connector info/property for non-desktop displays

From: Dave Airlie <[email protected]>

This adds the infrastructure needed to quirk displays using edid and to mark them as non-desktop to denote that userspace shouldn't display a standard desktop on them.

A non-desktop display is one which doesn't work like a normal rectangular monitor or requires some transformation of the output by the rendering process to make sense.

This is meant to cover head mounted devices like HTC Vive.

---
 drivers/gpu/drm/drm_connector.c | 13 +++++++++++++
 drivers/gpu/drm/drm_edid.c      |  8 ++++++--
 include/drm/drm_connector.h     |  5 +++++
 include/drm/drm_mode_config.h   |  7 +++++++
 4 files changed, 31 insertions(+), 2 deletions(-)
drivers/gpu/drm/drm_connector.c +13 -0
index 704fc89..f9d3538 100644
@@ -234,6 +234,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);
 	}
@@ -811,6 +815,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;
 }
 
@@ -1194,6 +1203,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,
drivers/gpu/drm/drm_edid.c +6 -2
index 00ddabf..1e24d5d9 100644
@@ -82,6 +82,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;
@@ -4393,7 +4395,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;
 
@@ -4407,6 +4409,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;
 
@@ -4627,7 +4631,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:
include/drm/drm_connector.h +5 -0
index b4285c40..7fcfc57 100644
@@ -284,6 +284,11 @@ struct drm_display_info {
 	 * @hdmi: advance features of a HDMI sink.
 	 */
 	struct drm_hdmi_info hdmi;
+
+	/**
+	 * @non_desktop: Non desktop display (HMD).
+	 */
+	bool non_desktop;
 };
 
 int drm_display_info_set_bus_formats(struct drm_display_info *info,
include/drm/drm_mode_config.h +7 -0
index 0b4ac2e..b21e827 100644
@@ -728,6 +728,13 @@ struct drm_mode_config {
 	 */
 	struct drm_property *suggested_y_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;
+
 	/* dumb ioctl parameters */
 	uint32_t preferred_depth, prefer_shadow;
 
Signature · 6 lines
2.9.5

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
author maintainer
#1 lore raw

PATCH 2/3 drm/fb: add support for not enabling fbcon on non-desktop displays

From: Dave Airlie <[email protected]>

We don't want fbcon to get used on non-desktop dislays, don't pass them as enabled connectors to the fb helper setup.

This prevents my HMD from getting disorted fbcon, and from affecting other displays console.

---
 drivers/gpu/drm/drm_fb_helper.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/gpu/drm/drm_fb_helper.c +5 -1
index 116d1f1..0737400 100644
@@ -2033,6 +2033,9 @@ static bool drm_connector_enabled(struct drm_connector *connector, bool strict)
 {
 	bool enable;
 
+	if (connector->display_info.non_desktop)
+		return false;
+
 	if (strict)
 		enable = connector->status == connector_status_connected;
 	else
@@ -2052,7 +2055,8 @@ static void drm_enable_connectors(struct drm_fb_helper *fb_helper,
 		connector = fb_helper->connector_info[i]->connector;
 		enabled[i] = drm_connector_enabled(connector, true);
 		DRM_DEBUG_KMS("connector %d enabled? %s\n", connector->base.id,
-			  enabled[i] ? "yes" : "no");
+			      connector->display_info.non_desktop ? "non desktop" : enabled[i] ? "yes" : "no");
+
 		any_enabled |= enabled[i];
 	}
 
Signature · 6 lines
2.9.5

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
author maintainer
#2 lore raw

PATCH 3/3 drm/edid: quirk HTC vive headset as non-desktop.

In reply to Dave Airlie

From: Dave Airlie <[email protected]>

This uses the EDID info from my HTC Vive to mark it as non-desktop.

---
 drivers/gpu/drm/drm_edid.c | 3 +++
 1 file changed, 3 insertions(+)
drivers/gpu/drm/drm_edid.c +3 -0
index 1e24d5d9..2e8fb51 100644
@@ -159,6 +159,9 @@ static const struct edid_quirk {
 
 	/* Rotel RSX-1058 forwards sink's EDID but only does HDMI 1.1*/
 	{ "ETR", 13896, EDID_QUIRK_FORCE_8BPC },
+
+	/* HTC Vive VR Headset */
+	{ "HVR", 0xaa01, EDID_QUIRK_NON_DESKTOP },
 };
 
 /*
Signature · 6 lines
2.9.5

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
#3 lore raw
In reply to Dave Airlie

Hi,

Quoted 7 lines · Dave Airlie

This adds the infrastructure needed to quirk displays using edid and to mark them as non-desktop to denote that userspace shouldn't display a standard desktop on them.

A non-desktop display is one which doesn't work like a normal rectangular monitor or requires some transformation of the output by the rendering process to make sense.

I still think putting these behind a client cap is a good idea:
https://lists.freedesktop.org/archives/dri-devel/2017-October/155616.html

Cheers,
Daniel
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

author maintainer
#4 lore raw
Quoted 7 lines · Daniel Stone

Hi,

Quoted 4 lines · Dave Airlie

This adds the infrastructure needed to quirk displays using edid and to mark them as non-desktop to denote that userspace shouldn't display a standard desktop on them.

Quoted 6 lines
Quoted 3 lines

A non-desktop display is one which doesn't work like a normal rectangular monitor or requires some transformation of the output by the rendering process to make sense.

I still think putting these behind a client cap is a good idea:
https://lists.freedesktop.org/archives/dri-devel/2017-October/155616.html

We want the X server to see these. How else can someone discover there's a HMD plugged in?

So a client cap doesn't make any sense.

Dave.
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

author maintainer
#5 lore raw
Quoted 12 lines · Dave Airlie
Quoted 11 lines · Daniel Stone

Hi,

Quoted 7 lines · Dave Airlie

This adds the infrastructure needed to quirk displays using edid and to mark them as non-desktop to denote that userspace shouldn't display a standard desktop on them.

A non-desktop display is one which doesn't work like a normal rectangular monitor or requires some transformation of the output by the rendering process to make sense.

Quoted 7 lines
Quoted 2 lines

I still think putting these behind a client cap is a good idea:
https://lists.freedesktop.org/archives/dri-devel/2017-October/155616.html

We want the X server to see these. How else can someone discover there's a HMD plugged in?

So a client cap doesn't make any sense.

Userspace also doesn't help with getting the console off these and not having them upset your other fbcon monitor, if someone invents a userspace database and gets it into X.org/mutter/<list of wayland compositors>
then I'm happy to use it.

Dave.
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

#6 lore raw
In reply to Daniel Stone
Quoted 2 lines · Daniel Stone

I still think putting these behind a client cap is a good idea:
https://lists.freedesktop.org/archives/dri-devel/2017-October/155616.html

Assuming that everyone eventually catches up, this should be a short-term issue. So, all we have to do is figure out how to make the transition, which seems a lot less weighty than something that will affect the environment for a long time.

We need to consider the cross-version compatibility issues for both the window system and the kernel. That means an old window system with new kernel or new window system with old kernel should work as well as it does today.

Today, an HMD display is presented as a normal output and applications can discover it through the window system and present an image on it by placing their image at the right location on the screen. To keep that working, we can't hide HMD outputs from an older window system.

Signature · 1 line
-keith

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

#7 lore raw
Quoted 15 lines · Keith Packard
Quoted 2 lines · Daniel Stone

I still think putting these behind a client cap is a good idea:
https://lists.freedesktop.org/archives/dri-devel/2017-October/155616.html

Assuming that everyone eventually catches up, this should be a short-term issue. So, all we have to do is figure out how to make the transition, which seems a lot less weighty than something that will affect the environment for a long time.

We need to consider the cross-version compatibility issues for both the window system and the kernel. That means an old window system with new kernel or new window system with old kernel should work as well as it does today.

Quoted 4 lines

Today, an HMD display is presented as a normal output and applications can discover it through the window system and present an image on it by placing their image at the right location on the screen. To keep that working, we can't hide HMD outputs from an older window system.

Yeah we add flags when old userspace would get more broken by this. If old/existing userspace is handling stuff incorrectly already, there's no need to flag that it now works better, and hiding by default seems to have issues too. In case of doubt I'll opt for less uapi, anytime that's possible :-)

So my vote on no opt-in flag needed here.
-Daniel

Signature · 7 lines
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
#8 lore raw
In reply to Dave Airlie
Quoted 36 lines · Dave Airlie

From: Dave Airlie <[email protected]>

This adds the infrastructure needed to quirk displays using edid and to mark them as non-desktop to denote that userspace shouldn't display a standard desktop on them.

A non-desktop display is one which doesn't work like a normal rectangular monitor or requires some transformation of the output by the rendering process to make sense.

This is meant to cover head mounted devices like HTC Vive.

---
 drivers/gpu/drm/drm_connector.c | 13 +++++++++++++
 drivers/gpu/drm/drm_edid.c      |  8 ++++++--
 include/drm/drm_connector.h     |  5 +++++
 include/drm/drm_mode_config.h   |  7 +++++++
 4 files changed, 31 insertions(+), 2 deletions(-)
drivers/gpu/drm/drm_connector.c +4 -0
index 704fc89..f9d3538 100644
@@ -234,6 +234,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);
 	}

drivers/gpu/drm/drm_connector.c int drm_connector_create_standard_properties(struct drm_device *dev) · line 818

Quoted 4 lines
drivers/gpu/drm/drm_connector.c +1 -0
@@ -811,6 +815,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");

How to deal with devices that may switch to non-desktop mode dynamically during runtime, such as PSVR (I don't know if there are or will be others)?

The PSVR connection box initially (in "cinematic mode") passes through its HDMI input to its external HDMI output unchanged and renders the input image as a floating plane on the HMD.
The pass-through HDMI output may be connected to the system's only monitor, therefor PSVR doesn't belong in the drm_edid non-desktop quirk list during boot.

Via USB commands the connection box can be switched to "VR mode", where it passes through its HDMI input to the HMD and renders a re-undistorted version of one of the eye views to its HDMI output.

Should the non-desktop property be made mutable for such devices, or should this just be left to userspace completely, keeping them non-desktop=false?

regards
Philipp
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

#10 lore raw

PATCH 1/3 drm: add connector info/property for non-desktop displays [v2]

From: Dave Airlie <[email protected]>

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

---
 drivers/gpu/drm/drm_connector.c | 13 +++++++++++++
 drivers/gpu/drm/drm_edid.c      |  8 ++++++--
 include/drm/drm_connector.h     |  5 +++++
 include/drm/drm_mode_config.h   |  7 +++++++
 4 files changed, 31 insertions(+), 2 deletions(-)
drivers/gpu/drm/drm_connector.c +13 -0
index 704fc8934616..f9d3538c9588 100644
@@ -234,6 +234,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);
 	}
@@ -811,6 +815,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;
 }
 
@@ -1194,6 +1203,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,
drivers/gpu/drm/drm_edid.c +6 -2
index 00ddabfbf980..1e24d5d9d659 100644
@@ -82,6 +82,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;
@@ -4393,7 +4395,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;
 
@@ -4407,6 +4409,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;
 
@@ -4627,7 +4631,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:
include/drm/drm_connector.h +5 -0
index 7a7140543012..df9807a3caae 100644
@@ -284,6 +284,11 @@ struct drm_display_info {
 	 * @hdmi: advance features of a HDMI sink.
 	 */
 	struct drm_hdmi_info hdmi;
+
+	/**
+	 * @non_desktop: Non desktop display (HMD).
+	 */
+	bool non_desktop;
 };
 
 int drm_display_info_set_bus_formats(struct drm_display_info *info,
include/drm/drm_mode_config.h +7 -0
index 0b4ac2ebc610..b21e827c5c78 100644
@@ -728,6 +728,13 @@ struct drm_mode_config {
 	 */
 	struct drm_property *suggested_y_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;
+
 	/* dumb ioctl parameters */
 	uint32_t preferred_depth, prefer_shadow;
 
Signature · 6 lines
2.15.0.rc0

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
#11 lore raw

PATCH 2/3 drm/fb: add support for not enabling fbcon on non-desktop displays [v2]

In reply to Keith Packard

From: Dave Airlie <[email protected]>

We don't want fbcon to get used on non-desktop dislays, don't pass them as enabled connectors to the fb helper setup.

This prevents my HMD from getting disorted fbcon, and from affecting other displays console.

v2: Change description from non-standard to non-desktop

---
 drivers/gpu/drm/drm_fb_helper.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/gpu/drm/drm_fb_helper.c +5 -1
index 116d1f1337c7..07374008f146 100644
@@ -2033,6 +2033,9 @@ static bool drm_connector_enabled(struct drm_connector *connector, bool strict)
 {
 	bool enable;
 
+	if (connector->display_info.non_desktop)
+		return false;
+
 	if (strict)
 		enable = connector->status == connector_status_connected;
 	else
@@ -2052,7 +2055,8 @@ static void drm_enable_connectors(struct drm_fb_helper *fb_helper,
 		connector = fb_helper->connector_info[i]->connector;
 		enabled[i] = drm_connector_enabled(connector, true);
 		DRM_DEBUG_KMS("connector %d enabled? %s\n", connector->base.id,
-			  enabled[i] ? "yes" : "no");
+			      connector->display_info.non_desktop ? "non desktop" : enabled[i] ? "yes" : "no");
+
 		any_enabled |= enabled[i];
 	}
 
Signature · 6 lines
2.15.0.rc0

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
#12 lore raw

PATCH 3/3 drm/edid: quirk HTC vive headset as non-desktop. [v2]

In reply to Keith Packard

From: Dave Airlie <[email protected]>

This uses the EDID info from my HTC Vive to mark it as non-desktop.

v2: Change description from non-standard to non-desktop

---
 drivers/gpu/drm/drm_edid.c | 3 +++
 1 file changed, 3 insertions(+)
drivers/gpu/drm/drm_edid.c +3 -0
index 1e24d5d9d659..2e8fb51282ef 100644
@@ -159,6 +159,9 @@ static const struct edid_quirk {
 
 	/* Rotel RSX-1058 forwards sink's EDID but only does HDMI 1.1*/
 	{ "ETR", 13896, EDID_QUIRK_FORCE_8BPC },
+
+	/* HTC Vive VR Headset */
+	{ "HVR", 0xaa01, EDID_QUIRK_NON_DESKTOP },
 };
 
 /*
Signature · 6 lines
2.15.0.rc0

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel