summaryrefslogtreecommitdiff
path: root/xf86drm.c
diff options
context:
space:
mode:
authorEmil Velikov <emil.l.velikov@gmail.com>2015-09-07 12:37:57 +0100
committerEmil Velikov <emil.l.velikov@gmail.com>2015-09-21 17:42:40 +0100
commit536e0deba3829e194aafda6d9a1d9e938ba8277a (patch)
treedbde8090169e95b28710423e934c39c7aa1b1fc3 /xf86drm.c
parentf098d1c130f369f059a53cda5c38b3d4ea06a0b7 (diff)
xf86drm: flex platform specifics into drmParsePciBusInfo
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@gmail.com> Acked-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'xf86drm.c')
-rw-r--r--xf86drm.c46
1 files changed, 20 insertions, 26 deletions
diff --git a/xf86drm.c b/xf86drm.c
index a5a7b413..b4c5aa05 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;