Default to first modesettable DRM device 68/27368/5
authorDamian Hobson-Garcia <dhobsong@igel.co.jp>
Wed, 6 Apr 2022 09:11:38 +0000 (18:11 +0900)
committerDamian Hobson-Garcia <dhobsong@igel.co.jp>
Wed, 20 Apr 2022 01:58:39 +0000 (10:58 +0900)
When no DRM device is specified on the command line, try all
available DRM devices until an available modesettable device is
found.

Bug-AGL: SPEC-3815

Change-Id: I72343558fcda755a63aee549767ccc8c00c06724
Signed-off-by: Damian Hobson-Garcia <dhobsong@igel.co.jp>
README.md
drm-lease-manager/lease-manager.c
drm-lease-manager/main.c

index f9a7650..458cdde 100644 (file)
--- a/README.md
+++ b/README.md
@@ -65,8 +65,8 @@ Once installed, running the following command will start the DRM Lease Manager d
 
     drm-lease-manager [<path DRM device>]
 
-If no DRM device is specified, `/dev/dri/card0` will be used.  
-More detailed options can be displayed by specifying the `-h` flag.
+If no DRM device is specified, the first available device capabale of modesetting will
+be used.  More detailed options can be displayed by specifying the `-h` flag.
 
 ### Dynamic lease transfer
 
index b339037..291594c 100644 (file)
@@ -515,6 +515,29 @@ err:
        return NULL;
 }
 
+static struct lm *drm_find_drm_device(const char *device)
+{
+       drmDevicePtr devices[64];
+       int ndevs;
+       struct lm *lm = NULL;
+
+       if (device)
+               return drm_device_get_resources(device);
+
+       ndevs = drmGetDevices2(0, devices, 64);
+
+       for (int i = 0; i < ndevs; i++) {
+               lm = drm_device_get_resources(
+                   devices[i]->nodes[DRM_NODE_PRIMARY]);
+               if (lm)
+                       break;
+       }
+
+       drmFreeDevices(devices, ndevs);
+
+       return lm;
+}
+
 static int lm_create_leases(struct lm *lm, int num_leases,
                            const struct lease_config *configs)
 {
@@ -544,10 +567,12 @@ struct lm *lm_create_with_config(const char *device, int num_leases,
                                 struct lease_config *configs)
 {
        struct lease_config *default_configs = NULL;
-       struct lm *lm = drm_device_get_resources(device);
+       struct lm *lm = drm_find_drm_device(device);
 
-       if (!lm)
+       if (!lm) {
+               ERROR_LOG("No available DRM device found\n");
                return NULL;
+       }
 
        if (configs == NULL || num_leases == 0) {
                num_leases = create_default_lease_configs(lm, &default_configs);
index ff69e75..b4ad379 100644 (file)
@@ -48,7 +48,7 @@ const struct option options[] = {
 
 int main(int argc, char **argv)
 {
-       char *device = "/dev/dri/card0";
+       char *device = NULL;
        char *config_file = "/etc/drm-lease-manager.toml";
 
        bool debug_log = false;