diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp
index 42c5a3b1..d05b7f5f 100644
--- a/src/cam/drm.cpp
+++ b/src/cam/drm.cpp
@@ -8,6 +8,7 @@
 #include "drm.h"
 
 #include <algorithm>
+#include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <iostream>
@@ -393,9 +394,15 @@ Device::~Device()
 
 int Device::init()
 {
-	constexpr size_t NODE_NAME_MAX = sizeof("/dev/dri/card255");
-	char name[NODE_NAME_MAX];
-	int ret;
+	constexpr size_t DIR_NAME_MAX = sizeof("/dev/dri/") - 1;
+	constexpr size_t PRE_NODE_NAME_MAX = sizeof("card") - 1;
+	constexpr size_t POST_NODE_NAME_MAX = sizeof("255") - 1;
+	constexpr size_t NODE_NAME_MAX =
+		DIR_NAME_MAX + PRE_NODE_NAME_MAX + POST_NODE_NAME_MAX;
+	std::string name;
+	name.reserve(NODE_NAME_MAX);
+	name = "/dev/dri/";
+	int ret = 0;
 
 	/*
 	 * Open the first DRM/KMS device. The libdrm drmOpen*() functions
@@ -404,16 +411,37 @@ int Device::init()
 	 * from drmOpen() is of no practical use as any modern system will
 	 * handle that through udev or an equivalent component.
 	 */
-	snprintf(name, sizeof(name), "/dev/dri/card%u", 0);
-	fd_ = open(name, O_RDWR | O_CLOEXEC);
-	if (fd_ < 0) {
+	DIR *folder = opendir(name.c_str());
+	if (!folder) {
 		ret = -errno;
-		std::cerr
-			<< "Failed to open DRM/KMS device " << name << ": "
-			<< strerror(-ret) << std::endl;
+		std::cerr << "Failed to open " << name
+			  << " directory: " << strerror(-ret) << std::endl;
 		return ret;
 	}
 
+	name += "card";
+	for (struct dirent *res; (res = readdir(folder));) {
+		if (!strncmp(res->d_name, "card", 4)) {
+			name += res->d_name + PRE_NODE_NAME_MAX;
+			fd_ = open(name.c_str(), O_RDWR | O_CLOEXEC);
+			if (fd_ >= 0) {
+				break;
+			}
+
+			ret = -errno;
+			std::cerr << "Failed to open DRM/KMS device " << name
+				  << ": " << strerror(-ret) << std::endl;
+			name.resize(DIR_NAME_MAX + PRE_NODE_NAME_MAX);
+		}
+	}
+
+	closedir(folder);
+
+	if (fd_ < 0) {
+		std::cerr << "Failed to open any DRM/KMS device" << std::endl;
+		return -ENOENT;
+	}
+
 	/*
 	 * Enable the atomic APIs. This also automatically enables the
 	 * universal planes API.
