compositor-drm: add specific_device configuration option
authorPekka Paalanen <pekka.paalanen@collabora.co.uk>
Tue, 28 Mar 2017 15:04:27 +0000 (18:04 +0300)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Mon, 18 Dec 2017 11:50:41 +0000 (13:50 +0200)
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@collabora.co.uk>
Reviewed-by: Daniel Stone <daniels@collabora.com>
libweston/compositor-drm.c
libweston/compositor-drm.h

index b77209c..3eda70f 100644 (file)
@@ -3813,6 +3813,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, const struct timespec *time,
               uint32_t key, void *data)
@@ -4064,7 +4088,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;
index 8181492..68f93ea 100644 (file)
@@ -139,6 +139,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