xf86drm: add drmGetNodeTypeFromDevId
authorSimon Ser <contact@emersion.fr>
Wed, 4 Oct 2023 09:21:34 +0000 (11:21 +0200)
committerSimon Ser <contact@emersion.fr>
Mon, 20 Nov 2023 12:22:10 +0000 (12:22 +0000)
This is useful to figure out whether the dev_t refers to a primary
node or a render node. Indeed, drmGetDeviceFromDevId returns a
drmDevice, which holds both the primary and render nodes.

Signed-off-by: Simon Ser <contact@emersion.fr>
core-symbols.txt
xf86drm.c
xf86drm.h

index 0d3464e9873505c704f87a1e2546a60d228c6dbf..8b22f3a1a7603c09783eb9fd51ac86154b294cc2 100644 (file)
@@ -70,6 +70,7 @@ drmGetLibVersion
 drmGetLock
 drmGetMagic
 drmGetMap
+drmGetNodeTypeFromDevId
 drmGetNodeTypeFromFd
 drmGetPrimaryDeviceNameFromFd
 drmGetRenderDeviceNameFromFd
index ebc609560ed998fd753c7c733a46a86f9ecf0554..2e76f0eab47761191b48aa1681057561f5b538b8 100644 (file)
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -4687,6 +4687,23 @@ drm_public int drmGetDeviceFromDevId(dev_t find_rdev, uint32_t flags, drmDeviceP
 #endif
 }
 
+drm_public int drmGetNodeTypeFromDevId(dev_t devid)
+{
+    int maj, min, node_type;
+
+    maj = major(devid);
+    min = minor(devid);
+
+    if (!drmNodeIsDRM(maj, min))
+        return -EINVAL;
+
+    node_type = drmGetMinorType(maj, min);
+    if (node_type == -1)
+        return -ENODEV;
+
+    return node_type;
+}
+
 /**
  * Get information about the opened drm device
  *
index d20df47deb05d6dff9cf97cb710322ee26e285a9..2cb14156385b386235c2a9e3e31b76260d2e6bdd 100644 (file)
--- a/xf86drm.h
+++ b/xf86drm.h
@@ -919,6 +919,13 @@ extern int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_device
 
 extern int drmGetDeviceFromDevId(dev_t dev_id, uint32_t flags, drmDevicePtr *device);
 
+/**
+ * Get the node type (DRM_NODE_PRIMARY or DRM_NODE_RENDER) from a device ID.
+ *
+ * Returns negative errno on error.
+ */
+extern int drmGetNodeTypeFromDevId(dev_t devid);
+
 extern int drmDevicesEqual(drmDevicePtr a, drmDevicePtr b);
 
 extern int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle);