[PATCH weston 1/2] compositor-drm: add specific_device configuration option

Pekka Paalanen ppaalanen at gmail.com
Tue Mar 28 15:26:15 UTC 2017


From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>

Developers with testing rigs having multiple graphics cards plugged in
often want to test things on a specific card. We have ways to choose a
card through seat assignments, but configuring that run by run is
awkward.

Add a new DRM backend option to try to open a specific device, and quit
if it fails.

Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
---
 libweston/compositor-drm.c | 29 ++++++++++++++++++++++++++++-
 libweston/compositor-drm.h |  7 +++++++
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index 4cb27b1..ca7adba 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -3151,6 +3151,30 @@ find_primary_gpu(struct drm_backend *b, const char *seat)
 	return drm_device;
 }
 
+static struct udev_device *
+open_specific_drm_device(struct drm_backend *b, const char *name)
+{
+	struct udev_device *device;
+
+	device = udev_device_new_from_subsystem_sysname(b->udev, "drm", name);
+	if (!device) {
+		weston_log("ERROR: could not open DRM device '%s'\n", name);
+		return NULL;
+	}
+
+	if (!drm_device_is_kms(b, device)) {
+		udev_device_unref(device);
+		weston_log("ERROR: DRM device '%s' is not a KMS device.\n", name);
+		return NULL;
+	}
+
+	/* If we're returning a device to use, we must have an open FD for
+	 * it. */
+	assert(b->drm.fd >= 0);
+
+	return device;
+}
+
 static void
 planes_binding(struct weston_keyboard *keyboard, uint32_t time, uint32_t key,
 	       void *data)
@@ -3399,7 +3423,10 @@ drm_backend_create(struct weston_compositor *compositor,
 	b->session_listener.notify = session_notify;
 	wl_signal_add(&compositor->session_signal, &b->session_listener);
 
-	drm_device = find_primary_gpu(b, seat_id);
+	if (config->specific_device)
+		drm_device = open_specific_drm_device(b, config->specific_device);
+	else
+		drm_device = find_primary_gpu(b, seat_id);
 	if (drm_device == NULL) {
 		weston_log("no drm device found\n");
 		goto err_udev;
diff --git a/libweston/compositor-drm.h b/libweston/compositor-drm.h
index 0870719..cf2eeb6 100644
--- a/libweston/compositor-drm.h
+++ b/libweston/compositor-drm.h
@@ -145,6 +145,13 @@ struct weston_drm_backend_config {
 	 *
 	 * It is exprimed in milliseconds, 0 means disabled. */
 	uint32_t pageflip_timeout;
+
+	/** Specific DRM device to open
+	 *
+	 * A DRM device name, like "card0", to open. If NULL, use heuristics
+	 * based on seat names and boot_vga to find the right device.
+	 */
+	char *specific_device;
 };
 
 #ifdef  __cplusplus
-- 
2.10.2



More information about the wayland-devel mailing list