diff --git a/meson.build b/meson.build
index ee570a8f88c3b9d9df25bc2a0549b8e93f0b5ce2..3f5e5c52633b4065bddad8051ed33fc7b5184fc4 100644
--- a/meson.build
+++ b/meson.build
@@ -24,7 +24,7 @@ add_project_arguments(cc.get_supported_arguments([
 ]), language: 'c')
 
 dep_wayland_client = dependency('wayland-client', version: '>= 1.20.0')
-dep_libdrm = dependency('libdrm', version: '>=2.4.107', required: get_option('drm'))
+dep_libdrm = dependency('libdrm', version: '>=2.4.109', required: get_option('drm'))
 dep_libdrm_version = dep_libdrm.version()
 
 config_h = configuration_data()
diff --git a/wayland-info/wayland-info.c b/wayland-info/wayland-info.c
index 1346b41b58861874ca003fc95d917c95c85d3db8..0560167e0d8aedd3cb1288af724b43e3513b68fe 100644
--- a/wayland-info/wayland-info.c
+++ b/wayland-info/wayland-info.c
@@ -510,6 +510,34 @@ print_format_and_modifier(uint32_t format, uint64_t modifier)
 #endif
 }
 
+static void
+print_devid(dev_t devid)
+{
+	printf("0x%" PRIX64, (uint64_t) devid);
+
+#if HAVE_LIBDRM
+	drmDevice *dev = NULL;
+	if (drmGetDeviceFromDevId(devid, 0, &dev) != 0) {
+		perror("drmGetDeviceFromDevId failed");
+		return;
+	}
+
+	if (!(dev->available_nodes & (1 << DRM_NODE_PRIMARY))) {
+		/* Should never happen */
+		fprintf(stderr, "Device has no primary node\n");
+		return;
+	}
+
+	printf(" (%s", dev->nodes[DRM_NODE_PRIMARY]);
+	if (dev->available_nodes & (1 << DRM_NODE_RENDER)) {
+		printf(" or %s", dev->nodes[DRM_NODE_RENDER]);
+	}
+	printf(")");
+
+	drmFreeDevice(&dev);
+#endif
+}
+
 static void
 print_linux_dmabuf_info(void *data)
 {
@@ -520,7 +548,8 @@ print_linux_dmabuf_info(void *data)
 	print_global_info(data);
 
 	if (dmabuf->main_device) {
-		printf("\tmain device: 0x%" PRIX64, (uint64_t) dmabuf->main_device);
+		printf("\tmain device: ");
+		print_devid(dmabuf->main_device);
 
 		if (dmabuf->format_map == MAP_FAILED) {
 			printf("\tError: failed to map format table\n");
@@ -536,8 +565,8 @@ print_linux_dmabuf_info(void *data)
 		wl_list_for_each(tranche, &dmabuf->tranches, link) {
 			printf("\n\ttranche");
 
-			printf("\n\t\ttarget device: 0x%" PRIX64,
-			       (uint64_t) tranche->target_device);
+			printf("\n\t\ttarget device: ");
+			print_devid(tranche->target_device);
 			printf("\n\t\tflags: ");
 			if (tranche->flags == 0)
 				printf("none");