[PATCH libdrm 02/12] xf86drm: flex platform specifics into drmParsePciBusInfo

Emil Velikov emil.l.velikov at gmail.com
Wed Sep 9 10:21:23 PDT 2015


This will allow one to reuse the core drmGetDevices implementation on
other platforms. Keeping all the platform specifics in ParseFoo.

On the plus side this saves a bit of code :)

Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
---
 xf86drm.c | 46 ++++++++++++++++++++--------------------------
 1 file changed, 20 insertions(+), 26 deletions(-)

diff --git a/xf86drm.c b/xf86drm.c
index a5a7b41..b4c5aa0 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2855,23 +2855,33 @@ static int drmParseSubsystemType(const char *str)
     return -EINVAL;
 }
 
-static int drmParsePciBusInfo(const char *str, drmPciBusInfoPtr info)
+static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info)
 {
+    char path[PATH_MAX + 1];
+    char data[128];
+    char *str;
     int domain, bus, dev, func;
-    char *value;
+    int fd, ret;
 
-    if (str == NULL)
-        return -EINVAL;
+    snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/uevent", maj, min);
+    fd = open(path, O_RDONLY);
+    if (fd < 0)
+        return -errno;
 
-    value = strstr(str, "PCI_SLOT_NAME=");
-    if (value == NULL)
-        return -EINVAL;
+    ret = read(fd, data, sizeof(data));
+    close(fd);
+    if (ret < 0)
+        return -errno;
 
-    value += strlen("PCI_SLOT_NAME=");
+#define TAG "PCI_SLOT_NAME="
+    str = strstr(data, TAG);
+    if (str == NULL)
+        return -EINVAL;
 
-    if (sscanf(value, "%04x:%02x:%02x.%1u",
+    if (sscanf(str, TAG "%04x:%02x:%02x.%1u",
                &domain, &bus, &dev, &func) != 4)
         return -EINVAL;
+#undef TAG
 
     info->domain = domain;
     info->bus = bus;
@@ -2981,7 +2991,6 @@ int drmGetDevices(drmDevicePtr devices[], int max_devices)
     struct stat sbuf = {0};
     char node[PATH_MAX + 1] = "";
     char path[PATH_MAX + 1] = "";
-    char data[128] = "";
     unsigned char config[64] = "";
     int node_type, subsystem_type;
     int maj, min;
@@ -3030,22 +3039,7 @@ int drmGetDevices(drmDevicePtr devices[], int max_devices)
                 goto free_locals;
             }
 
-            snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/uevent",
-                     maj, min);
-            fd = open(path, O_RDONLY);
-            if (fd < 0) {
-                ret = -errno;
-                goto free_locals;
-            }
-            ret = read(fd, data, sizeof(data));
-            if (ret < 0) {
-                ret = -errno;
-                close(fd);
-                goto free_locals;
-            }
-
-            ret = drmParsePciBusInfo(data, pcibus);
-            close(fd);
+            ret = drmParsePciBusInfo(maj, min, pcibus);
             if (ret)
                 goto free_locals;
 
-- 
2.5.0



More information about the dri-devel mailing list