* [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys
@ 2018-06-25 17:36 Emil Velikov
2018-06-25 17:36 ` [PATCH libdrm 02/10] xf86drm: introduce drm_device_has_rdev() helper Emil Velikov
` (10 more replies)
0 siblings, 11 replies; 31+ messages in thread
From: Emil Velikov @ 2018-06-25 17:36 UTC (permalink / raw)
To: dri-devel; +Cc: emil.l.velikov
From: Emil Velikov <emil.velikov@collabora.com>
Currently one can open() any /dev node. If it's unknown
drmParseSubsystemType() will return an error.
Track that and bail as needed.
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
xf86drm.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/xf86drm.c b/xf86drm.c
index 87c216cf..e1bbbe99 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -3814,6 +3814,8 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
return -EINVAL;
subsystem_type = drmParseSubsystemType(maj, min);
+ if (subsystem_type < 0)
+ return subsystem_type;
local_devices = calloc(max_count, sizeof(drmDevicePtr));
if (local_devices == NULL)
--
2.18.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH libdrm 02/10] xf86drm: introduce drm_device_has_rdev() helper
2018-06-25 17:36 [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys Emil Velikov
@ 2018-06-25 17:36 ` Emil Velikov
2018-06-28 10:14 ` Robert Foss
2018-06-25 17:36 ` [PATCH libdrm 03/10] xf86drm: Fold drmDevice processing into process_device() helper Emil Velikov
` (9 subsequent siblings)
10 siblings, 1 reply; 31+ messages in thread
From: Emil Velikov @ 2018-06-25 17:36 UTC (permalink / raw)
To: dri-devel; +Cc: emil.l.velikov
From: Emil Velikov <emil.velikov@collabora.com>
Currently we match the opened drmDevice fd with each drmDevice we
process.
Move that after all the devices are processed and folded, via the
drm_device_has_rdev(). This makes the code easier to follow and allows
us to unify the massive process loop across drmGetDevice2 and
drmGetDevices2. That in itself is coming with a later commit.
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
xf86drm.c | 34 +++++++++++++++++++++++++---------
1 file changed, 25 insertions(+), 9 deletions(-)
diff --git a/xf86drm.c b/xf86drm.c
index e1bbbe99..cbc0a408 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -3705,6 +3705,21 @@ drm_device_validate_flags(uint32_t flags)
return (flags & ~DRM_DEVICE_GET_PCI_REVISION);
}
+static bool
+drm_device_has_rdev(drmDevicePtr device, dev_t find_rdev)
+{
+ struct stat sbuf;
+
+ for (int i = 0; i < DRM_NODE_MAX; i++) {
+ if (device->available_nodes & 1 << i) {
+ if (stat(device->nodes[i], &sbuf) == 0 &&
+ sbuf.st_rdev == find_rdev)
+ return true;
+ }
+ }
+ return false;
+}
+
/**
* Get information about the opened drm device
*
@@ -3889,21 +3904,22 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
local_devices = temp;
}
- /* store target at local_devices[0] for ease to use below */
- if (find_rdev == sbuf.st_rdev && i) {
- local_devices[i] = local_devices[0];
- local_devices[0] = d;
- }
- else
- local_devices[i] = d;
+ local_devices[i] = d;
i++;
}
node_count = i;
drmFoldDuplicatedDevices(local_devices, node_count);
- *device = local_devices[0];
- drmFreeDevices(&local_devices[1], node_count - 1);
+ for (i = 0; i < node_count; i++) {
+ if (!local_devices[i])
+ continue;
+
+ if (drm_device_has_rdev(local_devices[i], find_rdev))
+ *device = local_devices[i];
+ else
+ drmFreeDevice(&local_devices[i]);
+ }
closedir(sysdir);
free(local_devices);
--
2.18.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH libdrm 03/10] xf86drm: Fold drmDevice processing into process_device() helper
2018-06-25 17:36 [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys Emil Velikov
2018-06-25 17:36 ` [PATCH libdrm 02/10] xf86drm: introduce drm_device_has_rdev() helper Emil Velikov
@ 2018-06-25 17:36 ` Emil Velikov
2018-06-28 11:50 ` Robert Foss
2018-06-25 17:36 ` [PATCH libdrm 04/10] xf86drm: Allocate drmDevicePtr's on stack Emil Velikov
` (8 subsequent siblings)
10 siblings, 1 reply; 31+ messages in thread
From: Emil Velikov @ 2018-06-25 17:36 UTC (permalink / raw)
To: dri-devel; +Cc: emil.l.velikov
From: Emil Velikov <emil.velikov@collabora.com>
Don't the duplicate (nearly) identical code across the two call sites.
It improves legibility and the diff stat seems nice.
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
xf86drm.c | 159 ++++++++++++++++++------------------------------------
1 file changed, 51 insertions(+), 108 deletions(-)
diff --git a/xf86drm.c b/xf86drm.c
index cbc0a408..114cf855 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -3676,6 +3676,52 @@ free_device:
return ret;
}
+static int
+process_device(drmDevicePtr *device, const char *d_name,
+ int req_subsystem_type,
+ bool fetch_deviceinfo, uint32_t flags)
+{
+ struct stat sbuf;
+ char node[PATH_MAX + 1];
+ int node_type, subsystem_type;
+ unsigned int maj, min;
+
+ node_type = drmGetNodeType(d_name);
+ if (node_type < 0)
+ return -1;
+
+ snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, d_name);
+ if (stat(node, &sbuf))
+ return -1;
+
+ maj = major(sbuf.st_rdev);
+ min = minor(sbuf.st_rdev);
+
+ if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
+ return -1;
+
+ subsystem_type = drmParseSubsystemType(maj, min);
+ if (req_subsystem_type != -1 && req_subsystem_type != subsystem_type)
+ return -1;
+
+ switch (subsystem_type) {
+ case DRM_BUS_PCI:
+ return drmProcessPciDevice(device, node, node_type, maj, min,
+ fetch_deviceinfo, flags);
+ case DRM_BUS_USB:
+ return drmProcessUsbDevice(device, node, node_type, maj, min,
+ fetch_deviceinfo, flags);
+ case DRM_BUS_PLATFORM:
+ return drmProcessPlatformDevice(device, node, node_type, maj, min,
+ fetch_deviceinfo, flags);
+ case DRM_BUS_HOST1X:
+ return drmProcessHost1xDevice(device, node, node_type, maj, min,
+ fetch_deviceinfo, flags);
+ default:
+ return -1;
+ }
+}
+
/* Consider devices located on the same bus as duplicate and fold the respective
* entries into a single one.
*
@@ -3805,8 +3851,7 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
DIR *sysdir;
struct dirent *dent;
struct stat sbuf;
- char node[PATH_MAX + 1];
- int node_type, subsystem_type;
+ int subsystem_type;
int maj, min;
int ret, i, node_count;
int max_count = 16;
@@ -3844,55 +3889,9 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
i = 0;
while ((dent = readdir(sysdir))) {
- node_type = drmGetNodeType(dent->d_name);
- if (node_type < 0)
- continue;
-
- snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, dent->d_name);
- if (stat(node, &sbuf))
- continue;
-
- maj = major(sbuf.st_rdev);
- min = minor(sbuf.st_rdev);
-
- if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
- continue;
-
- if (drmParseSubsystemType(maj, min) != subsystem_type)
- continue;
-
- switch (subsystem_type) {
- case DRM_BUS_PCI:
- ret = drmProcessPciDevice(&d, node, node_type, maj, min, true, flags);
- if (ret)
- continue;
-
- break;
-
- case DRM_BUS_USB:
- ret = drmProcessUsbDevice(&d, node, node_type, maj, min, true, flags);
- if (ret)
- continue;
-
- break;
-
- case DRM_BUS_PLATFORM:
- ret = drmProcessPlatformDevice(&d, node, node_type, maj, min, true, flags);
- if (ret)
- continue;
-
- break;
-
- case DRM_BUS_HOST1X:
- ret = drmProcessHost1xDevice(&d, node, node_type, maj, min, true, flags);
- if (ret)
- continue;
-
- break;
-
- default:
+ ret = process_device(&d, dent->d_name, subsystem_type, true, flags);
+ if (ret)
continue;
- }
if (i >= max_count) {
drmDevicePtr *temp;
@@ -3973,10 +3972,6 @@ int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
drmDevicePtr device;
DIR *sysdir;
struct dirent *dent;
- struct stat sbuf;
- char node[PATH_MAX + 1];
- int node_type, subsystem_type;
- int maj, min;
int ret, i, node_count, device_count;
int max_count = 16;
@@ -3995,61 +3990,9 @@ int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
i = 0;
while ((dent = readdir(sysdir))) {
- node_type = drmGetNodeType(dent->d_name);
- if (node_type < 0)
- continue;
-
- snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, dent->d_name);
- if (stat(node, &sbuf))
- continue;
-
- maj = major(sbuf.st_rdev);
- min = minor(sbuf.st_rdev);
-
- if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
- continue;
-
- subsystem_type = drmParseSubsystemType(maj, min);
-
- if (subsystem_type < 0)
- continue;
-
- switch (subsystem_type) {
- case DRM_BUS_PCI:
- ret = drmProcessPciDevice(&device, node, node_type,
- maj, min, devices != NULL, flags);
- if (ret)
- continue;
-
- break;
-
- case DRM_BUS_USB:
- ret = drmProcessUsbDevice(&device, node, node_type, maj, min,
- devices != NULL, flags);
- if (ret)
- continue;
-
- break;
-
- case DRM_BUS_PLATFORM:
- ret = drmProcessPlatformDevice(&device, node, node_type, maj, min,
- devices != NULL, flags);
- if (ret)
- continue;
-
- break;
-
- case DRM_BUS_HOST1X:
- ret = drmProcessHost1xDevice(&device, node, node_type, maj, min,
- devices != NULL, flags);
- if (ret)
- continue;
-
- break;
-
- default:
+ ret = process_device(&device, dent->d_name, -1, devices != NULL, flags);
+ if (ret)
continue;
- }
if (i >= max_count) {
drmDevicePtr *temp;
--
2.18.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH libdrm 04/10] xf86drm: Allocate drmDevicePtr's on stack
2018-06-25 17:36 [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys Emil Velikov
2018-06-25 17:36 ` [PATCH libdrm 02/10] xf86drm: introduce drm_device_has_rdev() helper Emil Velikov
2018-06-25 17:36 ` [PATCH libdrm 03/10] xf86drm: Fold drmDevice processing into process_device() helper Emil Velikov
@ 2018-06-25 17:36 ` Emil Velikov
2018-06-28 12:52 ` Robert Foss
` (2 more replies)
2018-06-25 17:36 ` [PATCH libdrm " Emil Velikov
` (7 subsequent siblings)
10 siblings, 3 replies; 31+ messages in thread
From: Emil Velikov @ 2018-06-25 17:36 UTC (permalink / raw)
To: dri-devel; +Cc: emil.l.velikov
From: Emil Velikov <emil.velikov@collabora.com>
Currently we dynamically allocate 16 pointers and reallocate more as
needed.
Instead, allocate the maximum number (256) on stack - the number is
small enough and is unlikely to change in the foreseeable future.
This allows us to simplify the error handling and even shed a few bytes
off the final binary.
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
xf86drm.c | 64 ++++++-------------------------------------------------
1 file changed, 6 insertions(+), 58 deletions(-)
diff --git a/xf86drm.c b/xf86drm.c
index 114cf855..d4810740 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -3846,7 +3846,7 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
return 0;
#else
- drmDevicePtr *local_devices;
+ drmDevicePtr local_devices[256];
drmDevicePtr d;
DIR *sysdir;
struct dirent *dent;
@@ -3854,7 +3854,6 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
int subsystem_type;
int maj, min;
int ret, i, node_count;
- int max_count = 16;
dev_t find_rdev;
if (drm_device_validate_flags(flags))
@@ -3877,15 +3876,9 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
if (subsystem_type < 0)
return subsystem_type;
- local_devices = calloc(max_count, sizeof(drmDevicePtr));
- if (local_devices == NULL)
- return -ENOMEM;
-
sysdir = opendir(DRM_DIR_NAME);
- if (!sysdir) {
- ret = -errno;
- goto free_locals;
- }
+ if (!sysdir)
+ return -errno;
i = 0;
while ((dent = readdir(sysdir))) {
@@ -3893,16 +3886,6 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
if (ret)
continue;
- if (i >= max_count) {
- drmDevicePtr *temp;
-
- max_count += 16;
- temp = realloc(local_devices, max_count * sizeof(drmDevicePtr));
- if (!temp)
- goto free_devices;
- local_devices = temp;
- }
-
local_devices[i] = d;
i++;
}
@@ -3921,18 +3904,9 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
}
closedir(sysdir);
- free(local_devices);
if (*device == NULL)
return -ENODEV;
return 0;
-
-free_devices:
- drmFreeDevices(local_devices, i);
- closedir(sysdir);
-
-free_locals:
- free(local_devices);
- return ret;
#endif
}
@@ -3968,25 +3942,18 @@ int drmGetDevice(int fd, drmDevicePtr *device)
*/
int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
{
- drmDevicePtr *local_devices;
+ drmDevicePtr local_devices[256];
drmDevicePtr device;
DIR *sysdir;
struct dirent *dent;
int ret, i, node_count, device_count;
- int max_count = 16;
if (drm_device_validate_flags(flags))
return -EINVAL;
- local_devices = calloc(max_count, sizeof(drmDevicePtr));
- if (local_devices == NULL)
- return -ENOMEM;
-
sysdir = opendir(DRM_DIR_NAME);
- if (!sysdir) {
- ret = -errno;
- goto free_locals;
- }
+ if (!sysdir)
+ return -errno;
i = 0;
while ((dent = readdir(sysdir))) {
@@ -3994,16 +3961,6 @@ int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
if (ret)
continue;
- if (i >= max_count) {
- drmDevicePtr *temp;
-
- max_count += 16;
- temp = realloc(local_devices, max_count * sizeof(drmDevicePtr));
- if (!temp)
- goto free_devices;
- local_devices = temp;
- }
-
local_devices[i] = device;
i++;
}
@@ -4025,16 +3982,7 @@ int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
}
closedir(sysdir);
- free(local_devices);
return device_count;
-
-free_devices:
- drmFreeDevices(local_devices, i);
- closedir(sysdir);
-
-free_locals:
- free(local_devices);
- return ret;
}
/**
--
2.18.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH libdrm 05/10] xf86drm: introduce a get_real_pci_path() helper
2018-06-25 17:36 [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys Emil Velikov
` (2 preceding siblings ...)
2018-06-25 17:36 ` [PATCH libdrm 04/10] xf86drm: Allocate drmDevicePtr's on stack Emil Velikov
@ 2018-06-25 17:36 ` Emil Velikov
2018-06-28 10:21 ` Eric Engestrom
2018-06-28 16:06 ` Robert Foss
2018-06-25 17:36 ` [PATCH libdrm 06/10] xf86drm: Add drmDevice support for virtio_gpu Emil Velikov
` (6 subsequent siblings)
10 siblings, 2 replies; 31+ messages in thread
From: Emil Velikov @ 2018-06-25 17:36 UTC (permalink / raw)
To: dri-devel; +Cc: emil.l.velikov
From: Emil Velikov <emil.velikov@collabora.com>
Introduce a helper which gets the real sysfs path for the given pci
device.
In other words, instead opening the /sys/dev/char/*/device symlink, we
opt for the actual /sys/devices/pci*/*/
It folds three (nearly identical) snprintf's and paves the way of adding
extra devices (see next patch) a piece of pie.
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
xf86drm.c | 62 ++++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 50 insertions(+), 12 deletions(-)
diff --git a/xf86drm.c b/xf86drm.c
index d4810740..8ccd528f 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2992,16 +2992,37 @@ static int drmParseSubsystemType(int maj, int min)
#endif
}
+static char *
+get_real_pci_path(int maj, int min)
+{
+ char path[PATH_MAX + 1];
+ char *real_path = malloc(PATH_MAX);
+
+ if (!real_path)
+ return NULL;
+
+ snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min);
+ if (!realpath(path, real_path)) {
+ free(real_path);
+ return NULL;
+ }
+
+ return real_path;
+}
+
static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info)
{
#ifdef __linux__
unsigned int domain, bus, dev, func;
- char path[PATH_MAX + 1], *value;
+ char *real_path, *value;
int num;
- snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min);
+ real_path = get_real_pci_path(maj, min);
+ if (!real_path)
+ return -ENOENT;
- value = sysfs_uevent_get(path, "PCI_SLOT_NAME");
+ value = sysfs_uevent_get(real_path, "PCI_SLOT_NAME");
+ free(real_path);
if (!value)
return -ENOENT;
@@ -3114,24 +3135,32 @@ static int parse_separate_sysfs_files(int maj, int min,
"subsystem_vendor",
"subsystem_device",
};
- char path[PATH_MAX + 1];
+ char path[PATH_MAX + 1], *real_path;
unsigned int data[ARRAY_SIZE(attrs)];
FILE *fp;
int ret;
+ real_path = get_real_pci_path(maj, min);
+ if (!real_path)
+ return -ENOENT;
+
for (unsigned i = ignore_revision ? 1 : 0; i < ARRAY_SIZE(attrs); i++) {
- snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/%s", maj, min,
- attrs[i]);
+ snprintf(path, PATH_MAX, "%s/%s", real_path, attrs[i]);
fp = fopen(path, "r");
- if (!fp)
+ if (!fp) {
+ free(real_path);
return -errno;
+ }
ret = fscanf(fp, "%x", &data[i]);
fclose(fp);
- if (ret != 1)
+ if (ret != 1) {
+ free(real_path);
return -errno;
+ }
}
+ free(real_path);
device->revision_id = ignore_revision ? 0xff : data[0] & 0xff;
device->vendor_id = data[1] & 0xffff;
@@ -3145,19 +3174,28 @@ static int parse_separate_sysfs_files(int maj, int min,
static int parse_config_sysfs_file(int maj, int min,
drmPciDeviceInfoPtr device)
{
- char path[PATH_MAX + 1];
+ char path[PATH_MAX + 1], *real_path;
unsigned char config[64];
int fd, ret;
- snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/config", maj, min);
+ real_path = get_real_pci_path(maj, min);
+ if (!real_path)
+ return -ENOENT;
+
+ snprintf(path, PATH_MAX, "%s/config", real_path);
fd = open(path, O_RDONLY);
- if (fd < 0)
+ if (fd < 0) {
+ free(real_path);
return -errno;
+ }
ret = read(fd, config, sizeof(config));
close(fd);
- if (ret < 0)
+ if (ret < 0) {
+ free(real_path);
return -errno;
+ }
+ free(real_path);
device->vendor_id = config[0] | (config[1] << 8);
device->device_id = config[2] | (config[3] << 8);
--
2.18.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH libdrm 06/10] xf86drm: Add drmDevice support for virtio_gpu
2018-06-25 17:36 [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys Emil Velikov
` (3 preceding siblings ...)
2018-06-25 17:36 ` [PATCH libdrm " Emil Velikov
@ 2018-06-25 17:36 ` Emil Velikov
2018-06-28 16:08 ` Robert Foss
2018-06-25 17:36 ` [PATCH libdrm 07/10] tests/drmdevices: install alongside other utilities Emil Velikov
` (5 subsequent siblings)
10 siblings, 1 reply; 31+ messages in thread
From: Emil Velikov @ 2018-06-25 17:36 UTC (permalink / raw)
To: dri-devel; +Cc: emil.l.velikov
From: Emil Velikov <emil.velikov@collabora.com>
The GPU almost exclusively lives on the PCI bus, so we expose it as a
normal PCI one.
This allows any existing drmDevice users to work without any changes.
One could wonder why a separate typeset is not introduced, alike say
host1x. Unlike host1x the PCI/platform distinction for virtio provides
no extra information. Plus needed we can add the separate set at a later
stage.
Here are a couple of 'features' that virtio seems to be missing:
- provides extra information on top the plaform devices
- supports a range of GPU devices
- is considered hardware description (DT)
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
xf86drm.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/xf86drm.c b/xf86drm.c
index 8ccd528f..b847ea26 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2954,6 +2954,9 @@ sysfs_uevent_get(const char *path, const char *fmt, ...)
}
#endif
+/* Little white lie to avoid major rework of the existing code */
+#define DRM_BUS_VIRTIO 0x10
+
static int drmParseSubsystemType(int maj, int min)
{
#ifdef __linux__
@@ -2983,6 +2986,9 @@ static int drmParseSubsystemType(int maj, int min)
if (strncmp(name, "/host1x", 7) == 0)
return DRM_BUS_HOST1X;
+ if (strncmp(name, "/virtio", 7) == 0)
+ return DRM_BUS_VIRTIO;
+
return -EINVAL;
#elif defined(__OpenBSD__)
return DRM_BUS_PCI;
@@ -2996,7 +3002,7 @@ static char *
get_real_pci_path(int maj, int min)
{
char path[PATH_MAX + 1];
- char *real_path = malloc(PATH_MAX);
+ char *term, *real_path = malloc(PATH_MAX);
if (!real_path)
return NULL;
@@ -3007,6 +3013,10 @@ get_real_pci_path(int maj, int min)
return NULL;
}
+ term = strrchr(real_path, '/');
+ if (term && strncmp(term, "/virtio", 7) == 0)
+ *term = 0;
+
return real_path;
}
@@ -3744,6 +3754,7 @@ process_device(drmDevicePtr *device, const char *d_name,
switch (subsystem_type) {
case DRM_BUS_PCI:
+ case DRM_BUS_VIRTIO:
return drmProcessPciDevice(device, node, node_type, maj, min,
fetch_deviceinfo, flags);
case DRM_BUS_USB:
--
2.18.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH libdrm 07/10] tests/drmdevices: install alongside other utilities
2018-06-25 17:36 [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys Emil Velikov
` (4 preceding siblings ...)
2018-06-25 17:36 ` [PATCH libdrm 06/10] xf86drm: Add drmDevice support for virtio_gpu Emil Velikov
@ 2018-06-25 17:36 ` Emil Velikov
2018-06-28 16:09 ` Robert Foss
2018-06-25 17:36 ` [PATCH libdrm 08/10] tests/drmdevice: add a couple of printf headers Emil Velikov
` (4 subsequent siblings)
10 siblings, 1 reply; 31+ messages in thread
From: Emil Velikov @ 2018-06-25 17:36 UTC (permalink / raw)
To: dri-devel; +Cc: emil.l.velikov
From: Emil Velikov <emil.velikov@collabora.com>
It's mildly useful program, to ship it when the user wants the "tests"
installed. Obviously the "tests" in the name is a misnomer.
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
tests/Makefile.am | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 0355a925..b72c24f9 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -43,5 +43,10 @@ TESTS = \
random
check_PROGRAMS = \
- $(TESTS) \
- drmdevice
+ $(TESTS)
+
+if HAVE_INSTALL_TESTS
+bin_PROGRAMS = drmdevice
+else
+check_PROGRAMS += drmdevice
+endif
--
2.18.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH libdrm 08/10] tests/drmdevice: add a couple of printf headers
2018-06-25 17:36 [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys Emil Velikov
` (5 preceding siblings ...)
2018-06-25 17:36 ` [PATCH libdrm 07/10] tests/drmdevices: install alongside other utilities Emil Velikov
@ 2018-06-25 17:36 ` Emil Velikov
2018-06-28 16:09 ` Robert Foss
2018-06-25 17:36 ` [PATCH libdrm 09/10] drmdevice: convert the tabbed output into a tree Emil Velikov
` (3 subsequent siblings)
10 siblings, 1 reply; 31+ messages in thread
From: Emil Velikov @ 2018-06-25 17:36 UTC (permalink / raw)
To: dri-devel; +Cc: emil.l.velikov
From: Emil Velikov <emil.velikov@collabora.com>
Add a few printf statements, which should make the output easier to
parse.
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
tests/drmdevice.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/tests/drmdevice.c b/tests/drmdevice.c
index 9dd5098a..0d75836f 100644
--- a/tests/drmdevice.c
+++ b/tests/drmdevice.c
@@ -112,12 +112,15 @@ main(void)
drmDevicePtr device;
int fd, ret, max_devices;
+ printf("--- Checking the number of DRM device available ---\n");
max_devices = drmGetDevices2(0, NULL, 0);
if (max_devices <= 0) {
printf("drmGetDevices2() has returned %d\n", max_devices);
return -1;
}
+ printf("--- Devices reported %d ---\n", max_devices);
+
devices = calloc(max_devices, sizeof(drmDevicePtr));
if (devices == NULL) {
@@ -125,6 +128,7 @@ main(void)
return -1;
}
+ printf("--- Retrieving devices information (PCI device revision is ignored) ---\n");
ret = drmGetDevices2(0, devices, max_devices);
if (ret < 0) {
printf("drmGetDevices2() returned an error %d\n", ret);
@@ -137,13 +141,14 @@ main(void)
for (int j = 0; j < DRM_NODE_MAX; j++) {
if (devices[i]->available_nodes & 1 << j) {
- printf("Opening device %d node %s\n", i, devices[i]->nodes[j]);
+ printf("--- Opening device node %s ---\n", devices[i]->nodes[j]);
fd = open(devices[i]->nodes[j], O_RDONLY | O_CLOEXEC, 0);
if (fd < 0) {
printf("Failed - %s (%d)\n", strerror(errno), errno);
continue;
}
+ printf("--- Retrieving device info, for node %s ---\n", devices[i]->nodes[j]);
if (drmGetDevice2(fd, DRM_DEVICE_GET_PCI_REVISION, &device) == 0) {
print_device_info(device, i, true);
drmFreeDevice(&device);
--
2.18.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH libdrm 09/10] drmdevice: convert the tabbed output into a tree
2018-06-25 17:36 [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys Emil Velikov
` (6 preceding siblings ...)
2018-06-25 17:36 ` [PATCH libdrm 08/10] tests/drmdevice: add a couple of printf headers Emil Velikov
@ 2018-06-25 17:36 ` Emil Velikov
2018-06-28 10:19 ` Eric Engestrom
` (2 more replies)
2018-06-25 17:36 ` [PATCH libdrm 10/10] drmdevice: print the correct host1x information Emil Velikov
` (2 subsequent siblings)
10 siblings, 3 replies; 31+ messages in thread
From: Emil Velikov @ 2018-06-25 17:36 UTC (permalink / raw)
To: dri-devel; +Cc: emil.l.velikov
From: Emil Velikov <emil.velikov@collabora.com>
Making the output a little bit easier to parse by human beings.
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
tests/drmdevice.c | 78 +++++++++++++++++++++++------------------------
1 file changed, 39 insertions(+), 39 deletions(-)
diff --git a/tests/drmdevice.c b/tests/drmdevice.c
index 0d75836f..e9e9d7f1 100644
--- a/tests/drmdevice.c
+++ b/tests/drmdevice.c
@@ -36,67 +36,67 @@ static void
print_device_info(drmDevicePtr device, int i, bool print_revision)
{
printf("device[%i]\n", i);
- printf("\tavailable_nodes %04x\n", device->available_nodes);
- printf("\tnodes\n");
+ printf("+->available_nodes %#04x\n", device->available_nodes);
+ printf("+->nodes\n");
for (int j = 0; j < DRM_NODE_MAX; j++)
if (device->available_nodes & 1 << j)
- printf("\t\tnodes[%d] %s\n", j, device->nodes[j]);
+ printf("| +->nodes[%d] %s\n", j, device->nodes[j]);
- printf("\tbustype %04x\n", device->bustype);
- printf("\tbusinfo\n");
+ printf("+->bustype %04x\n", device->bustype);
+ printf("+->businfo\n");
if (device->bustype == DRM_BUS_PCI) {
- printf("\t\tpci\n");
- printf("\t\t\tdomain\t%04x\n",device->businfo.pci->domain);
- printf("\t\t\tbus\t%02x\n", device->businfo.pci->bus);
- printf("\t\t\tdev\t%02x\n", device->businfo.pci->dev);
- printf("\t\t\tfunc\t%1u\n", device->businfo.pci->func);
-
- printf("\tdeviceinfo\n");
- printf("\t\tpci\n");
- printf("\t\t\tvendor_id\t%04x\n", device->deviceinfo.pci->vendor_id);
- printf("\t\t\tdevice_id\t%04x\n", device->deviceinfo.pci->device_id);
- printf("\t\t\tsubvendor_id\t%04x\n", device->deviceinfo.pci->subvendor_id);
- printf("\t\t\tsubdevice_id\t%04x\n", device->deviceinfo.pci->subdevice_id);
+ printf("| +->pci\n");
+ printf("| +->domain %04x\n",device->businfo.pci->domain);
+ printf("| +->bus %02x\n", device->businfo.pci->bus);
+ printf("| +->dev %02x\n", device->businfo.pci->dev);
+ printf("| +->func %1u\n", device->businfo.pci->func);
+
+ printf("+->deviceinfo\n");
+ printf(" +->pci\n");
+ printf(" +->vendor_id %04x\n", device->deviceinfo.pci->vendor_id);
+ printf(" +->device_id %04x\n", device->deviceinfo.pci->device_id);
+ printf(" +->subvendor_id %04x\n", device->deviceinfo.pci->subvendor_id);
+ printf(" +->subdevice_id %04x\n", device->deviceinfo.pci->subdevice_id);
if (print_revision)
- printf("\t\t\trevision_id\t%02x\n", device->deviceinfo.pci->revision_id);
+ printf(" +->revision_id %02x\n", device->deviceinfo.pci->revision_id);
else
- printf("\t\t\trevision_id\tIGNORED\n");
+ printf(" +->revision_id IGNORED\n");
} else if (device->bustype == DRM_BUS_USB) {
- printf("\t\tusb\n");
- printf("\t\t\tbus\t%03u\n", device->businfo.usb->bus);
- printf("\t\t\tdev\t%03u\n", device->businfo.usb->dev);
-
- printf("\tdeviceinfo\n");
- printf("\t\tusb\n");
- printf("\t\t\tvendor\t%04x\n", device->deviceinfo.usb->vendor);
- printf("\t\t\tproduct\t%04x\n", device->deviceinfo.usb->product);
+ printf("| +->usb\n");
+ printf("| +->bus %03u\n", device->businfo.usb->bus);
+ printf("| +->dev %03u\n", device->businfo.usb->dev);
+
+ printf("+->deviceinfo\n");
+ printf(" +->usb\n");
+ printf(" +->vendor %04x\n", device->deviceinfo.usb->vendor);
+ printf(" +->product %04x\n", device->deviceinfo.usb->product);
} else if (device->bustype == DRM_BUS_PLATFORM) {
char **compatible = device->deviceinfo.platform->compatible;
- printf("\t\tplatform\n");
- printf("\t\t\tfullname\t%s\n", device->businfo.platform->fullname);
+ printf("| +->platform\n");
+ printf("| +->fullname\t%s\n", device->businfo.platform->fullname);
- printf("\tdeviceinfo\n");
- printf("\t\tplatform\n");
- printf("\t\t\tcompatible\n");
+ printf("+->deviceinfo\n");
+ printf(" +->platform\n");
+ printf(" +->compatible\n");
while (*compatible) {
- printf("\t\t\t\t%s\n", *compatible);
+ printf(" %s\n", *compatible);
compatible++;
}
} else if (device->bustype == DRM_BUS_HOST1X) {
char **compatible = device->deviceinfo.platform->compatible;
- printf("\t\thost1x\n");
- printf("\t\t\tfullname\t%s\n", device->businfo.host1x->fullname);
+ printf("| +->host1x\n");
+ printf("| +->fullname\t%s\n", device->businfo.host1x->fullname);
- printf("\tdeviceinfo\n");
- printf("\t\tplatform\n");
- printf("\t\t\tcompatible\n");
+ printf("+->deviceinfo\n");
+ printf(" +->platform\n");
+ printf(" +->compatible\n");
while (*compatible) {
- printf("\t\t\t\t%s\n", *compatible);
+ printf(" %s\n", *compatible);
compatible++;
}
} else {
--
2.18.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH libdrm 10/10] drmdevice: print the correct host1x information
2018-06-25 17:36 [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys Emil Velikov
` (7 preceding siblings ...)
2018-06-25 17:36 ` [PATCH libdrm 09/10] drmdevice: convert the tabbed output into a tree Emil Velikov
@ 2018-06-25 17:36 ` Emil Velikov
2018-06-28 16:09 ` Robert Foss
2018-06-28 10:11 ` [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys Robert Foss
2018-06-28 10:11 ` Robert Foss
10 siblings, 1 reply; 31+ messages in thread
From: Emil Velikov @ 2018-06-25 17:36 UTC (permalink / raw)
To: dri-devel; +Cc: emil.l.velikov
From: Emil Velikov <emil.velikov@collabora.com>
While fairly close, the host1x and platform are two separate things.
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
tests/drmdevice.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tests/drmdevice.c b/tests/drmdevice.c
index e9e9d7f1..97ce8ff9 100644
--- a/tests/drmdevice.c
+++ b/tests/drmdevice.c
@@ -86,13 +86,13 @@ print_device_info(drmDevicePtr device, int i, bool print_revision)
compatible++;
}
} else if (device->bustype == DRM_BUS_HOST1X) {
- char **compatible = device->deviceinfo.platform->compatible;
+ char **compatible = device->deviceinfo.host1x->compatible;
printf("| +->host1x\n");
printf("| +->fullname\t%s\n", device->businfo.host1x->fullname);
printf("+->deviceinfo\n");
- printf(" +->platform\n");
+ printf(" +->host1x\n");
printf(" +->compatible\n");
while (*compatible) {
--
2.18.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys
2018-06-25 17:36 [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys Emil Velikov
` (8 preceding siblings ...)
2018-06-25 17:36 ` [PATCH libdrm 10/10] drmdevice: print the correct host1x information Emil Velikov
@ 2018-06-28 10:11 ` Robert Foss
2018-06-28 10:11 ` Robert Foss
10 siblings, 0 replies; 31+ messages in thread
From: Robert Foss @ 2018-06-28 10:11 UTC (permalink / raw)
To: Emil Velikov, dri-devel
This series has been:
Tested-by: Robert Foss <robert.foss@collabora.com>
On 2018-06-25 19:36, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
>
> Currently one can open() any /dev node. If it's unknown
> drmParseSubsystemType() will return an error.
>
> Track that and bail as needed.
>
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> ---
> xf86drm.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/xf86drm.c b/xf86drm.c
> index 87c216cf..e1bbbe99 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -3814,6 +3814,8 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
> return -EINVAL;
>
> subsystem_type = drmParseSubsystemType(maj, min);
> + if (subsystem_type < 0)
> + return subsystem_type;
>
> local_devices = calloc(max_count, sizeof(drmDevicePtr));
> if (local_devices == NULL)
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys
2018-06-25 17:36 [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys Emil Velikov
` (9 preceding siblings ...)
2018-06-28 10:11 ` [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys Robert Foss
@ 2018-06-28 10:11 ` Robert Foss
10 siblings, 0 replies; 31+ messages in thread
From: Robert Foss @ 2018-06-28 10:11 UTC (permalink / raw)
To: Emil Velikov, dri-devel
Feel free to add my r-b to this patch.
On 2018-06-25 19:36, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
>
> Currently one can open() any /dev node. If it's unknown
> drmParseSubsystemType() will return an error.
>
> Track that and bail as needed.
>
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> ---
> xf86drm.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/xf86drm.c b/xf86drm.c
> index 87c216cf..e1bbbe99 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -3814,6 +3814,8 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
> return -EINVAL;
>
> subsystem_type = drmParseSubsystemType(maj, min);
> + if (subsystem_type < 0)
> + return subsystem_type;
>
> local_devices = calloc(max_count, sizeof(drmDevicePtr));
> if (local_devices == NULL)
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 02/10] xf86drm: introduce drm_device_has_rdev() helper
2018-06-25 17:36 ` [PATCH libdrm 02/10] xf86drm: introduce drm_device_has_rdev() helper Emil Velikov
@ 2018-06-28 10:14 ` Robert Foss
0 siblings, 0 replies; 31+ messages in thread
From: Robert Foss @ 2018-06-28 10:14 UTC (permalink / raw)
To: Emil Velikov, dri-devel
Feel free to add my r-b to this patch.
On 2018-06-25 19:36, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
>
> Currently we match the opened drmDevice fd with each drmDevice we
> process.
>
> Move that after all the devices are processed and folded, via the
> drm_device_has_rdev(). This makes the code easier to follow and allows
> us to unify the massive process loop across drmGetDevice2 and
> drmGetDevices2. That in itself is coming with a later commit.
>
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> ---
> xf86drm.c | 34 +++++++++++++++++++++++++---------
> 1 file changed, 25 insertions(+), 9 deletions(-)
>
> diff --git a/xf86drm.c b/xf86drm.c
> index e1bbbe99..cbc0a408 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -3705,6 +3705,21 @@ drm_device_validate_flags(uint32_t flags)
> return (flags & ~DRM_DEVICE_GET_PCI_REVISION);
> }
>
> +static bool
> +drm_device_has_rdev(drmDevicePtr device, dev_t find_rdev)
> +{
> + struct stat sbuf;
> +
> + for (int i = 0; i < DRM_NODE_MAX; i++) {
> + if (device->available_nodes & 1 << i) {
> + if (stat(device->nodes[i], &sbuf) == 0 &&
> + sbuf.st_rdev == find_rdev)
> + return true;
> + }
> + }
> + return false;
> +}
> +
> /**
> * Get information about the opened drm device
> *
> @@ -3889,21 +3904,22 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
> local_devices = temp;
> }
>
> - /* store target at local_devices[0] for ease to use below */
> - if (find_rdev == sbuf.st_rdev && i) {
> - local_devices[i] = local_devices[0];
> - local_devices[0] = d;
> - }
> - else
> - local_devices[i] = d;
> + local_devices[i] = d;
> i++;
> }
> node_count = i;
>
> drmFoldDuplicatedDevices(local_devices, node_count);
>
> - *device = local_devices[0];
> - drmFreeDevices(&local_devices[1], node_count - 1);
> + for (i = 0; i < node_count; i++) {
> + if (!local_devices[i])
> + continue;
> +
> + if (drm_device_has_rdev(local_devices[i], find_rdev))
> + *device = local_devices[i];
> + else
> + drmFreeDevice(&local_devices[i]);
> + }
>
> closedir(sysdir);
> free(local_devices);
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 09/10] drmdevice: convert the tabbed output into a tree
2018-06-25 17:36 ` [PATCH libdrm 09/10] drmdevice: convert the tabbed output into a tree Emil Velikov
@ 2018-06-28 10:19 ` Eric Engestrom
2018-06-28 16:43 ` Emil Velikov
2018-06-28 16:09 ` Robert Foss
2018-06-29 15:24 ` [PATCH libdrm v2 " Emil Velikov
2 siblings, 1 reply; 31+ messages in thread
From: Eric Engestrom @ 2018-06-28 10:19 UTC (permalink / raw)
To: Emil Velikov; +Cc: dri-devel
On Monday, 2018-06-25 17:40:02 +0000, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
>
> Making the output a little bit easier to parse by human beings.
>
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> ---
> tests/drmdevice.c | 78 +++++++++++++++++++++++------------------------
> 1 file changed, 39 insertions(+), 39 deletions(-)
>
> diff --git a/tests/drmdevice.c b/tests/drmdevice.c
> index 0d75836f..e9e9d7f1 100644
> --- a/tests/drmdevice.c
> +++ b/tests/drmdevice.c
> @@ -36,67 +36,67 @@ static void
> print_device_info(drmDevicePtr device, int i, bool print_revision)
> {
> printf("device[%i]\n", i);
> - printf("\tavailable_nodes %04x\n", device->available_nodes);
> - printf("\tnodes\n");
> + printf("+->available_nodes %#04x\n", device->available_nodes);
> + printf("+->nodes\n");
Nit: I'd put a space between `>` and the text, for readability
> for (int j = 0; j < DRM_NODE_MAX; j++)
> if (device->available_nodes & 1 << j)
> - printf("\t\tnodes[%d] %s\n", j, device->nodes[j]);
> + printf("| +->nodes[%d] %s\n", j, device->nodes[j]);
>
> - printf("\tbustype %04x\n", device->bustype);
> - printf("\tbusinfo\n");
> + printf("+->bustype %04x\n", device->bustype);
> + printf("+->businfo\n");
> if (device->bustype == DRM_BUS_PCI) {
> - printf("\t\tpci\n");
> - printf("\t\t\tdomain\t%04x\n",device->businfo.pci->domain);
> - printf("\t\t\tbus\t%02x\n", device->businfo.pci->bus);
> - printf("\t\t\tdev\t%02x\n", device->businfo.pci->dev);
> - printf("\t\t\tfunc\t%1u\n", device->businfo.pci->func);
> -
> - printf("\tdeviceinfo\n");
> - printf("\t\tpci\n");
> - printf("\t\t\tvendor_id\t%04x\n", device->deviceinfo.pci->vendor_id);
> - printf("\t\t\tdevice_id\t%04x\n", device->deviceinfo.pci->device_id);
> - printf("\t\t\tsubvendor_id\t%04x\n", device->deviceinfo.pci->subvendor_id);
> - printf("\t\t\tsubdevice_id\t%04x\n", device->deviceinfo.pci->subdevice_id);
> + printf("| +->pci\n");
> + printf("| +->domain %04x\n",device->businfo.pci->domain);
> + printf("| +->bus %02x\n", device->businfo.pci->bus);
> + printf("| +->dev %02x\n", device->businfo.pci->dev);
> + printf("| +->func %1u\n", device->businfo.pci->func);
> +
> + printf("+->deviceinfo\n");
> + printf(" +->pci\n");
> + printf(" +->vendor_id %04x\n", device->deviceinfo.pci->vendor_id);
> + printf(" +->device_id %04x\n", device->deviceinfo.pci->device_id);
> + printf(" +->subvendor_id %04x\n", device->deviceinfo.pci->subvendor_id);
> + printf(" +->subdevice_id %04x\n", device->deviceinfo.pci->subdevice_id);
> if (print_revision)
> - printf("\t\t\trevision_id\t%02x\n", device->deviceinfo.pci->revision_id);
> + printf(" +->revision_id %02x\n", device->deviceinfo.pci->revision_id);
> else
> - printf("\t\t\trevision_id\tIGNORED\n");
> + printf(" +->revision_id IGNORED\n");
>
> } else if (device->bustype == DRM_BUS_USB) {
> - printf("\t\tusb\n");
> - printf("\t\t\tbus\t%03u\n", device->businfo.usb->bus);
> - printf("\t\t\tdev\t%03u\n", device->businfo.usb->dev);
> -
> - printf("\tdeviceinfo\n");
> - printf("\t\tusb\n");
> - printf("\t\t\tvendor\t%04x\n", device->deviceinfo.usb->vendor);
> - printf("\t\t\tproduct\t%04x\n", device->deviceinfo.usb->product);
> + printf("| +->usb\n");
> + printf("| +->bus %03u\n", device->businfo.usb->bus);
> + printf("| +->dev %03u\n", device->businfo.usb->dev);
> +
> + printf("+->deviceinfo\n");
> + printf(" +->usb\n");
> + printf(" +->vendor %04x\n", device->deviceinfo.usb->vendor);
> + printf(" +->product %04x\n", device->deviceinfo.usb->product);
> } else if (device->bustype == DRM_BUS_PLATFORM) {
> char **compatible = device->deviceinfo.platform->compatible;
>
> - printf("\t\tplatform\n");
> - printf("\t\t\tfullname\t%s\n", device->businfo.platform->fullname);
> + printf("| +->platform\n");
> + printf("| +->fullname\t%s\n", device->businfo.platform->fullname);
>
> - printf("\tdeviceinfo\n");
> - printf("\t\tplatform\n");
> - printf("\t\t\tcompatible\n");
> + printf("+->deviceinfo\n");
> + printf(" +->platform\n");
> + printf(" +->compatible\n");
>
> while (*compatible) {
> - printf("\t\t\t\t%s\n", *compatible);
> + printf(" %s\n", *compatible);
> compatible++;
> }
> } else if (device->bustype == DRM_BUS_HOST1X) {
> char **compatible = device->deviceinfo.platform->compatible;
>
> - printf("\t\thost1x\n");
> - printf("\t\t\tfullname\t%s\n", device->businfo.host1x->fullname);
> + printf("| +->host1x\n");
> + printf("| +->fullname\t%s\n", device->businfo.host1x->fullname);
>
> - printf("\tdeviceinfo\n");
> - printf("\t\tplatform\n");
> - printf("\t\t\tcompatible\n");
> + printf("+->deviceinfo\n");
> + printf(" +->platform\n");
> + printf(" +->compatible\n");
>
> while (*compatible) {
> - printf("\t\t\t\t%s\n", *compatible);
> + printf(" %s\n", *compatible);
> compatible++;
> }
> } else {
> --
> 2.18.0
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 05/10] xf86drm: introduce a get_real_pci_path() helper
2018-06-25 17:36 ` [PATCH libdrm " Emil Velikov
@ 2018-06-28 10:21 ` Eric Engestrom
2018-06-28 10:23 ` Eric Engestrom
2018-06-28 16:42 ` Emil Velikov
2018-06-28 16:06 ` Robert Foss
1 sibling, 2 replies; 31+ messages in thread
From: Eric Engestrom @ 2018-06-28 10:21 UTC (permalink / raw)
To: Emil Velikov; +Cc: dri-devel
On Monday, 2018-06-25 17:39:14 +0000, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
>
> Introduce a helper which gets the real sysfs path for the given pci
> device.
>
> In other words, instead opening the /sys/dev/char/*/device symlink, we
> opt for the actual /sys/devices/pci*/*/
>
> It folds three (nearly identical) snprintf's and paves the way of adding
> extra devices (see next patch) a piece of pie.
>
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> ---
> xf86drm.c | 62 ++++++++++++++++++++++++++++++++++++++++++++-----------
> 1 file changed, 50 insertions(+), 12 deletions(-)
>
> diff --git a/xf86drm.c b/xf86drm.c
> index d4810740..8ccd528f 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -2992,16 +2992,37 @@ static int drmParseSubsystemType(int maj, int min)
> #endif
> }
>
> +static char *
> +get_real_pci_path(int maj, int min)
> +{
> + char path[PATH_MAX + 1];
> + char *real_path = malloc(PATH_MAX);
Why not allocate this on the stack and pass it in?
It would avoid the error handling you had to add in this patch :)
> +
> + if (!real_path)
> + return NULL;
> +
> + snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min);
> + if (!realpath(path, real_path)) {
> + free(real_path);
> + return NULL;
> + }
> +
> + return real_path;
> +}
> +
> static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info)
> {
> #ifdef __linux__
> unsigned int domain, bus, dev, func;
> - char path[PATH_MAX + 1], *value;
> + char *real_path, *value;
> int num;
>
> - snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min);
> + real_path = get_real_pci_path(maj, min);
> + if (!real_path)
> + return -ENOENT;
>
> - value = sysfs_uevent_get(path, "PCI_SLOT_NAME");
> + value = sysfs_uevent_get(real_path, "PCI_SLOT_NAME");
> + free(real_path);
> if (!value)
> return -ENOENT;
>
> @@ -3114,24 +3135,32 @@ static int parse_separate_sysfs_files(int maj, int min,
> "subsystem_vendor",
> "subsystem_device",
> };
> - char path[PATH_MAX + 1];
> + char path[PATH_MAX + 1], *real_path;
> unsigned int data[ARRAY_SIZE(attrs)];
> FILE *fp;
> int ret;
>
> + real_path = get_real_pci_path(maj, min);
> + if (!real_path)
> + return -ENOENT;
> +
> for (unsigned i = ignore_revision ? 1 : 0; i < ARRAY_SIZE(attrs); i++) {
> - snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/%s", maj, min,
> - attrs[i]);
> + snprintf(path, PATH_MAX, "%s/%s", real_path, attrs[i]);
> fp = fopen(path, "r");
> - if (!fp)
> + if (!fp) {
> + free(real_path);
> return -errno;
> + }
>
> ret = fscanf(fp, "%x", &data[i]);
> fclose(fp);
> - if (ret != 1)
> + if (ret != 1) {
> + free(real_path);
> return -errno;
> + }
>
> }
> + free(real_path);
>
> device->revision_id = ignore_revision ? 0xff : data[0] & 0xff;
> device->vendor_id = data[1] & 0xffff;
> @@ -3145,19 +3174,28 @@ static int parse_separate_sysfs_files(int maj, int min,
> static int parse_config_sysfs_file(int maj, int min,
> drmPciDeviceInfoPtr device)
> {
> - char path[PATH_MAX + 1];
> + char path[PATH_MAX + 1], *real_path;
> unsigned char config[64];
> int fd, ret;
>
> - snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/config", maj, min);
> + real_path = get_real_pci_path(maj, min);
> + if (!real_path)
> + return -ENOENT;
> +
> + snprintf(path, PATH_MAX, "%s/config", real_path);
> fd = open(path, O_RDONLY);
> - if (fd < 0)
> + if (fd < 0) {
> + free(real_path);
> return -errno;
> + }
>
> ret = read(fd, config, sizeof(config));
> close(fd);
> - if (ret < 0)
> + if (ret < 0) {
> + free(real_path);
> return -errno;
> + }
> + free(real_path);
>
> device->vendor_id = config[0] | (config[1] << 8);
> device->device_id = config[2] | (config[3] << 8);
> --
> 2.18.0
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 05/10] xf86drm: introduce a get_real_pci_path() helper
2018-06-28 10:21 ` Eric Engestrom
@ 2018-06-28 10:23 ` Eric Engestrom
2018-06-28 16:42 ` Emil Velikov
1 sibling, 0 replies; 31+ messages in thread
From: Eric Engestrom @ 2018-06-28 10:23 UTC (permalink / raw)
To: Emil Velikov; +Cc: dri-devel
On Thursday, 2018-06-28 11:21:26 +0100, Eric Engestrom wrote:
> On Monday, 2018-06-25 17:39:14 +0000, Emil Velikov wrote:
> > From: Emil Velikov <emil.velikov@collabora.com>
> >
> > Introduce a helper which gets the real sysfs path for the given pci
> > device.
> >
> > In other words, instead opening the /sys/dev/char/*/device symlink, we
> > opt for the actual /sys/devices/pci*/*/
> >
> > It folds three (nearly identical) snprintf's and paves the way of adding
> > extra devices (see next patch) a piece of pie.
> >
> > Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> > ---
> > xf86drm.c | 62 ++++++++++++++++++++++++++++++++++++++++++++-----------
> > 1 file changed, 50 insertions(+), 12 deletions(-)
> >
> > diff --git a/xf86drm.c b/xf86drm.c
> > index d4810740..8ccd528f 100644
> > --- a/xf86drm.c
> > +++ b/xf86drm.c
> > @@ -2992,16 +2992,37 @@ static int drmParseSubsystemType(int maj, int min)
> > #endif
> > }
> >
> > +static char *
> > +get_real_pci_path(int maj, int min)
> > +{
> > + char path[PATH_MAX + 1];
> > + char *real_path = malloc(PATH_MAX);
>
> Why not allocate this on the stack and pass it in?
> It would avoid the error handling you had to add in this patch :)
Sorry, I forgot to add: with that amend, the series is
Reviewed-by: Eric Engestrom <eric@engestrom.ch>
>
> > +
> > + if (!real_path)
> > + return NULL;
> > +
> > + snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min);
> > + if (!realpath(path, real_path)) {
> > + free(real_path);
> > + return NULL;
> > + }
> > +
> > + return real_path;
> > +}
> > +
> > static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info)
> > {
> > #ifdef __linux__
> > unsigned int domain, bus, dev, func;
> > - char path[PATH_MAX + 1], *value;
> > + char *real_path, *value;
> > int num;
> >
> > - snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min);
> > + real_path = get_real_pci_path(maj, min);
> > + if (!real_path)
> > + return -ENOENT;
> >
> > - value = sysfs_uevent_get(path, "PCI_SLOT_NAME");
> > + value = sysfs_uevent_get(real_path, "PCI_SLOT_NAME");
> > + free(real_path);
> > if (!value)
> > return -ENOENT;
> >
> > @@ -3114,24 +3135,32 @@ static int parse_separate_sysfs_files(int maj, int min,
> > "subsystem_vendor",
> > "subsystem_device",
> > };
> > - char path[PATH_MAX + 1];
> > + char path[PATH_MAX + 1], *real_path;
> > unsigned int data[ARRAY_SIZE(attrs)];
> > FILE *fp;
> > int ret;
> >
> > + real_path = get_real_pci_path(maj, min);
> > + if (!real_path)
> > + return -ENOENT;
> > +
> > for (unsigned i = ignore_revision ? 1 : 0; i < ARRAY_SIZE(attrs); i++) {
> > - snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/%s", maj, min,
> > - attrs[i]);
> > + snprintf(path, PATH_MAX, "%s/%s", real_path, attrs[i]);
> > fp = fopen(path, "r");
> > - if (!fp)
> > + if (!fp) {
> > + free(real_path);
> > return -errno;
> > + }
> >
> > ret = fscanf(fp, "%x", &data[i]);
> > fclose(fp);
> > - if (ret != 1)
> > + if (ret != 1) {
> > + free(real_path);
> > return -errno;
> > + }
> >
> > }
> > + free(real_path);
> >
> > device->revision_id = ignore_revision ? 0xff : data[0] & 0xff;
> > device->vendor_id = data[1] & 0xffff;
> > @@ -3145,19 +3174,28 @@ static int parse_separate_sysfs_files(int maj, int min,
> > static int parse_config_sysfs_file(int maj, int min,
> > drmPciDeviceInfoPtr device)
> > {
> > - char path[PATH_MAX + 1];
> > + char path[PATH_MAX + 1], *real_path;
> > unsigned char config[64];
> > int fd, ret;
> >
> > - snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/config", maj, min);
> > + real_path = get_real_pci_path(maj, min);
> > + if (!real_path)
> > + return -ENOENT;
> > +
> > + snprintf(path, PATH_MAX, "%s/config", real_path);
> > fd = open(path, O_RDONLY);
> > - if (fd < 0)
> > + if (fd < 0) {
> > + free(real_path);
> > return -errno;
> > + }
> >
> > ret = read(fd, config, sizeof(config));
> > close(fd);
> > - if (ret < 0)
> > + if (ret < 0) {
> > + free(real_path);
> > return -errno;
> > + }
> > + free(real_path);
> >
> > device->vendor_id = config[0] | (config[1] << 8);
> > device->device_id = config[2] | (config[3] << 8);
> > --
> > 2.18.0
> >
> > _______________________________________________
> > dri-devel mailing list
> > dri-devel@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 03/10] xf86drm: Fold drmDevice processing into process_device() helper
2018-06-25 17:36 ` [PATCH libdrm 03/10] xf86drm: Fold drmDevice processing into process_device() helper Emil Velikov
@ 2018-06-28 11:50 ` Robert Foss
0 siblings, 0 replies; 31+ messages in thread
From: Robert Foss @ 2018-06-28 11:50 UTC (permalink / raw)
To: Emil Velikov, dri-devel
Feel free to add my r-b to this patch.
On 2018-06-25 19:36, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
>
> Don't the duplicate (nearly) identical code across the two call sites.
> It improves legibility and the diff stat seems nice.
>
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> ---
> xf86drm.c | 159 ++++++++++++++++++------------------------------------
> 1 file changed, 51 insertions(+), 108 deletions(-)
>
> diff --git a/xf86drm.c b/xf86drm.c
> index cbc0a408..114cf855 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -3676,6 +3676,52 @@ free_device:
> return ret;
> }
>
> +static int
> +process_device(drmDevicePtr *device, const char *d_name,
> + int req_subsystem_type,
> + bool fetch_deviceinfo, uint32_t flags)
> +{
> + struct stat sbuf;
> + char node[PATH_MAX + 1];
> + int node_type, subsystem_type;
> + unsigned int maj, min;
> +
> + node_type = drmGetNodeType(d_name);
> + if (node_type < 0)
> + return -1;
> +
> + snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, d_name);
> + if (stat(node, &sbuf))
> + return -1;
> +
> + maj = major(sbuf.st_rdev);
> + min = minor(sbuf.st_rdev);
> +
> + if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
> + return -1;
> +
> + subsystem_type = drmParseSubsystemType(maj, min);
> + if (req_subsystem_type != -1 && req_subsystem_type != subsystem_type)
> + return -1;
> +
> + switch (subsystem_type) {
> + case DRM_BUS_PCI:
> + return drmProcessPciDevice(device, node, node_type, maj, min,
> + fetch_deviceinfo, flags);
> + case DRM_BUS_USB:
> + return drmProcessUsbDevice(device, node, node_type, maj, min,
> + fetch_deviceinfo, flags);
> + case DRM_BUS_PLATFORM:
> + return drmProcessPlatformDevice(device, node, node_type, maj, min,
> + fetch_deviceinfo, flags);
> + case DRM_BUS_HOST1X:
> + return drmProcessHost1xDevice(device, node, node_type, maj, min,
> + fetch_deviceinfo, flags);
> + default:
> + return -1;
> + }
> +}
> +
> /* Consider devices located on the same bus as duplicate and fold the respective
> * entries into a single one.
> *
> @@ -3805,8 +3851,7 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
> DIR *sysdir;
> struct dirent *dent;
> struct stat sbuf;
> - char node[PATH_MAX + 1];
> - int node_type, subsystem_type;
> + int subsystem_type;
> int maj, min;
> int ret, i, node_count;
> int max_count = 16;
> @@ -3844,55 +3889,9 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
>
> i = 0;
> while ((dent = readdir(sysdir))) {
> - node_type = drmGetNodeType(dent->d_name);
> - if (node_type < 0)
> - continue;
> -
> - snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, dent->d_name);
> - if (stat(node, &sbuf))
> - continue;
> -
> - maj = major(sbuf.st_rdev);
> - min = minor(sbuf.st_rdev);
> -
> - if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
> - continue;
> -
> - if (drmParseSubsystemType(maj, min) != subsystem_type)
> - continue;
> -
> - switch (subsystem_type) {
> - case DRM_BUS_PCI:
> - ret = drmProcessPciDevice(&d, node, node_type, maj, min, true, flags);
> - if (ret)
> - continue;
> -
> - break;
> -
> - case DRM_BUS_USB:
> - ret = drmProcessUsbDevice(&d, node, node_type, maj, min, true, flags);
> - if (ret)
> - continue;
> -
> - break;
> -
> - case DRM_BUS_PLATFORM:
> - ret = drmProcessPlatformDevice(&d, node, node_type, maj, min, true, flags);
> - if (ret)
> - continue;
> -
> - break;
> -
> - case DRM_BUS_HOST1X:
> - ret = drmProcessHost1xDevice(&d, node, node_type, maj, min, true, flags);
> - if (ret)
> - continue;
> -
> - break;
> -
> - default:
> + ret = process_device(&d, dent->d_name, subsystem_type, true, flags);
> + if (ret)
> continue;
> - }
>
> if (i >= max_count) {
> drmDevicePtr *temp;
> @@ -3973,10 +3972,6 @@ int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
> drmDevicePtr device;
> DIR *sysdir;
> struct dirent *dent;
> - struct stat sbuf;
> - char node[PATH_MAX + 1];
> - int node_type, subsystem_type;
> - int maj, min;
> int ret, i, node_count, device_count;
> int max_count = 16;
>
> @@ -3995,61 +3990,9 @@ int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
>
> i = 0;
> while ((dent = readdir(sysdir))) {
> - node_type = drmGetNodeType(dent->d_name);
> - if (node_type < 0)
> - continue;
> -
> - snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, dent->d_name);
> - if (stat(node, &sbuf))
> - continue;
> -
> - maj = major(sbuf.st_rdev);
> - min = minor(sbuf.st_rdev);
> -
> - if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
> - continue;
> -
> - subsystem_type = drmParseSubsystemType(maj, min);
> -
> - if (subsystem_type < 0)
> - continue;
> -
> - switch (subsystem_type) {
> - case DRM_BUS_PCI:
> - ret = drmProcessPciDevice(&device, node, node_type,
> - maj, min, devices != NULL, flags);
> - if (ret)
> - continue;
> -
> - break;
> -
> - case DRM_BUS_USB:
> - ret = drmProcessUsbDevice(&device, node, node_type, maj, min,
> - devices != NULL, flags);
> - if (ret)
> - continue;
> -
> - break;
> -
> - case DRM_BUS_PLATFORM:
> - ret = drmProcessPlatformDevice(&device, node, node_type, maj, min,
> - devices != NULL, flags);
> - if (ret)
> - continue;
> -
> - break;
> -
> - case DRM_BUS_HOST1X:
> - ret = drmProcessHost1xDevice(&device, node, node_type, maj, min,
> - devices != NULL, flags);
> - if (ret)
> - continue;
> -
> - break;
> -
> - default:
> + ret = process_device(&device, dent->d_name, -1, devices != NULL, flags);
> + if (ret)
> continue;
> - }
>
> if (i >= max_count) {
> drmDevicePtr *temp;
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 04/10] xf86drm: Allocate drmDevicePtr's on stack
2018-06-25 17:36 ` [PATCH libdrm 04/10] xf86drm: Allocate drmDevicePtr's on stack Emil Velikov
@ 2018-06-28 12:52 ` Robert Foss
2018-06-28 17:07 ` Emil Velikov
2018-06-29 15:20 ` [PATCH libdrm v2 " Emil Velikov
2018-06-29 15:22 ` [PATCH libdrm v2 05/10] xf86drm: introduce a get_real_pci_path() helper Emil Velikov
2 siblings, 1 reply; 31+ messages in thread
From: Robert Foss @ 2018-06-28 12:52 UTC (permalink / raw)
To: Emil Velikov, dri-devel
Hey Emil,
On 2018-06-25 19:36, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
>
> Currently we dynamically allocate 16 pointers and reallocate more as
> needed.
>
> Instead, allocate the maximum number (256) on stack - the number is
> small enough and is unlikely to change in the foreseeable future.
>
> This allows us to simplify the error handling and even shed a few bytes
> off the final binary.
>
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> ---
> xf86drm.c | 64 ++++++-------------------------------------------------
> 1 file changed, 6 insertions(+), 58 deletions(-)
>
> diff --git a/xf86drm.c b/xf86drm.c
> index 114cf855..d4810740 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -3846,7 +3846,7 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
>
> return 0;
> #else
> - drmDevicePtr *local_devices;
> + drmDevicePtr local_devices[256];
This number is seen later on in this patch, maybe it should be broken out into a
define, since it's reused later on too at [1].
> drmDevicePtr d;
> DIR *sysdir;
> struct dirent *dent;
> @@ -3854,7 +3854,6 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
> int subsystem_type;
> int maj, min;
> int ret, i, node_count;
> - int max_count = 16;
> dev_t find_rdev;
>
> if (drm_device_validate_flags(flags))
> @@ -3877,15 +3876,9 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
> if (subsystem_type < 0)
> return subsystem_type;
>
> - local_devices = calloc(max_count, sizeof(drmDevicePtr));
> - if (local_devices == NULL)
> - return -ENOMEM;
> -
> sysdir = opendir(DRM_DIR_NAME);
> - if (!sysdir) {
> - ret = -errno;
> - goto free_locals;
> - }
> + if (!sysdir)
> + return -errno;
>
> i = 0;
> while ((dent = readdir(sysdir))) {
> @@ -3893,16 +3886,6 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
> if (ret)
> continue;
>
> - if (i >= max_count) {
Is this check really not needded what exactly is it that defines 256 as the maximum?
From what I understand readdir(sysdir) is the call that defines how many
devices will be looked through, and as far as I understand it can return an
arbitrary number of files.
> - drmDevicePtr *temp;
> -
> - max_count += 16;
> - temp = realloc(local_devices, max_count * sizeof(drmDevicePtr));
> - if (!temp)
> - goto free_devices;
> - local_devices = temp;
> - }
> -
> local_devices[i] = d;
> i++;
> }
> @@ -3921,18 +3904,9 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
> }
>
> closedir(sysdir);
> - free(local_devices);
> if (*device == NULL)
> return -ENODEV;
> return 0;
> -
> -free_devices:
> - drmFreeDevices(local_devices, i);
> - closedir(sysdir);
> -
> -free_locals:
> - free(local_devices);
> - return ret;
> #endif
> }
>
> @@ -3968,25 +3942,18 @@ int drmGetDevice(int fd, drmDevicePtr *device)
> */
> int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
> {
> - drmDevicePtr *local_devices;
> + drmDevicePtr local_devices[256];'
[1]
> drmDevicePtr device;
> DIR *sysdir;
> struct dirent *dent;
> int ret, i, node_count, device_count;
> - int max_count = 16;
>
> if (drm_device_validate_flags(flags))
> return -EINVAL;
>
> - local_devices = calloc(max_count, sizeof(drmDevicePtr));
> - if (local_devices == NULL)
> - return -ENOMEM;
> -
> sysdir = opendir(DRM_DIR_NAME);
> - if (!sysdir) {
> - ret = -errno;
> - goto free_locals;
> - }
> + if (!sysdir)
> + return -errno;
>
> i = 0;
> while ((dent = readdir(sysdir))) {
> @@ -3994,16 +3961,6 @@ int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
> if (ret)
> continue;
>
> - if (i >= max_count) {
This out of bounds check should be dealt with too, if the above bounds check
should be.
> - drmDevicePtr *temp;
> -
> - max_count += 16;
> - temp = realloc(local_devices, max_count * sizeof(drmDevicePtr));
> - if (!temp)
> - goto free_devices;
> - local_devices = temp;
> - }
> -
> local_devices[i] = device;
> i++;
> }
> @@ -4025,16 +3982,7 @@ int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
> }
>
> closedir(sysdir);
> - free(local_devices);
> return device_count;
> -
> -free_devices:
> - drmFreeDevices(local_devices, i);
> - closedir(sysdir);
> -
> -free_locals:
> - free(local_devices);
> - return ret;
> }
>
> /**
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 05/10] xf86drm: introduce a get_real_pci_path() helper
2018-06-25 17:36 ` [PATCH libdrm " Emil Velikov
2018-06-28 10:21 ` Eric Engestrom
@ 2018-06-28 16:06 ` Robert Foss
1 sibling, 0 replies; 31+ messages in thread
From: Robert Foss @ 2018-06-28 16:06 UTC (permalink / raw)
To: Emil Velikov, dri-devel
Feel free to add my r-b to this patch.
On 2018-06-25 19:36, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
>
> Introduce a helper which gets the real sysfs path for the given pci
> device.
>
> In other words, instead opening the /sys/dev/char/*/device symlink, we
> opt for the actual /sys/devices/pci*/*/
>
> It folds three (nearly identical) snprintf's and paves the way of adding
> extra devices (see next patch) a piece of pie.
>
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> ---
> xf86drm.c | 62 ++++++++++++++++++++++++++++++++++++++++++++-----------
> 1 file changed, 50 insertions(+), 12 deletions(-)
>
> diff --git a/xf86drm.c b/xf86drm.c
> index d4810740..8ccd528f 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -2992,16 +2992,37 @@ static int drmParseSubsystemType(int maj, int min)
> #endif
> }
>
> +static char *
> +get_real_pci_path(int maj, int min)
> +{
> + char path[PATH_MAX + 1];
> + char *real_path = malloc(PATH_MAX);
> +
> + if (!real_path)
> + return NULL;
> +
> + snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min);
> + if (!realpath(path, real_path)) {
> + free(real_path);
> + return NULL;
> + }
> +
> + return real_path;
> +}
> +
> static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info)
> {
> #ifdef __linux__
> unsigned int domain, bus, dev, func;
> - char path[PATH_MAX + 1], *value;
> + char *real_path, *value;
> int num;
>
> - snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min);
> + real_path = get_real_pci_path(maj, min);
> + if (!real_path)
> + return -ENOENT;
>
> - value = sysfs_uevent_get(path, "PCI_SLOT_NAME");
> + value = sysfs_uevent_get(real_path, "PCI_SLOT_NAME");
> + free(real_path);
> if (!value)
> return -ENOENT;
>
> @@ -3114,24 +3135,32 @@ static int parse_separate_sysfs_files(int maj, int min,
> "subsystem_vendor",
> "subsystem_device",
> };
> - char path[PATH_MAX + 1];
> + char path[PATH_MAX + 1], *real_path;
> unsigned int data[ARRAY_SIZE(attrs)];
> FILE *fp;
> int ret;
>
> + real_path = get_real_pci_path(maj, min);
> + if (!real_path)
> + return -ENOENT;
> +
> for (unsigned i = ignore_revision ? 1 : 0; i < ARRAY_SIZE(attrs); i++) {
> - snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/%s", maj, min,
> - attrs[i]);
> + snprintf(path, PATH_MAX, "%s/%s", real_path, attrs[i]);
> fp = fopen(path, "r");
> - if (!fp)
> + if (!fp) {
> + free(real_path);
> return -errno;
> + }
>
> ret = fscanf(fp, "%x", &data[i]);
> fclose(fp);
> - if (ret != 1)
> + if (ret != 1) {
> + free(real_path);
> return -errno;
> + }
>
> }
> + free(real_path);
>
> device->revision_id = ignore_revision ? 0xff : data[0] & 0xff;
> device->vendor_id = data[1] & 0xffff;
> @@ -3145,19 +3174,28 @@ static int parse_separate_sysfs_files(int maj, int min,
> static int parse_config_sysfs_file(int maj, int min,
> drmPciDeviceInfoPtr device)
> {
> - char path[PATH_MAX + 1];
> + char path[PATH_MAX + 1], *real_path;
> unsigned char config[64];
> int fd, ret;
>
> - snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/config", maj, min);
> + real_path = get_real_pci_path(maj, min);
> + if (!real_path)
> + return -ENOENT;
> +
> + snprintf(path, PATH_MAX, "%s/config", real_path);
> fd = open(path, O_RDONLY);
> - if (fd < 0)
> + if (fd < 0) {
> + free(real_path);
> return -errno;
> + }
>
> ret = read(fd, config, sizeof(config));
> close(fd);
> - if (ret < 0)
> + if (ret < 0) {
> + free(real_path);
> return -errno;
> + }
> + free(real_path);
>
> device->vendor_id = config[0] | (config[1] << 8);
> device->device_id = config[2] | (config[3] << 8);
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 06/10] xf86drm: Add drmDevice support for virtio_gpu
2018-06-25 17:36 ` [PATCH libdrm 06/10] xf86drm: Add drmDevice support for virtio_gpu Emil Velikov
@ 2018-06-28 16:08 ` Robert Foss
0 siblings, 0 replies; 31+ messages in thread
From: Robert Foss @ 2018-06-28 16:08 UTC (permalink / raw)
To: Emil Velikov, dri-devel
Feel free to add my r-b to this patch.
On 2018-06-25 19:36, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
>
> The GPU almost exclusively lives on the PCI bus, so we expose it as a
> normal PCI one.
>
> This allows any existing drmDevice users to work without any changes.
>
> One could wonder why a separate typeset is not introduced, alike say
> host1x. Unlike host1x the PCI/platform distinction for virtio provides
> no extra information. Plus needed we can add the separate set at a later
> stage.
>
> Here are a couple of 'features' that virtio seems to be missing:
> - provides extra information on top the plaform devices
> - supports a range of GPU devices
> - is considered hardware description (DT)
>
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> ---
> xf86drm.c | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/xf86drm.c b/xf86drm.c
> index 8ccd528f..b847ea26 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -2954,6 +2954,9 @@ sysfs_uevent_get(const char *path, const char *fmt, ...)
> }
> #endif
>
> +/* Little white lie to avoid major rework of the existing code */
> +#define DRM_BUS_VIRTIO 0x10
> +
> static int drmParseSubsystemType(int maj, int min)
> {
> #ifdef __linux__
> @@ -2983,6 +2986,9 @@ static int drmParseSubsystemType(int maj, int min)
> if (strncmp(name, "/host1x", 7) == 0)
> return DRM_BUS_HOST1X;
>
> + if (strncmp(name, "/virtio", 7) == 0)
> + return DRM_BUS_VIRTIO;
> +
> return -EINVAL;
> #elif defined(__OpenBSD__)
> return DRM_BUS_PCI;
> @@ -2996,7 +3002,7 @@ static char *
> get_real_pci_path(int maj, int min)
> {
> char path[PATH_MAX + 1];
> - char *real_path = malloc(PATH_MAX);
> + char *term, *real_path = malloc(PATH_MAX);
>
> if (!real_path)
> return NULL;
> @@ -3007,6 +3013,10 @@ get_real_pci_path(int maj, int min)
> return NULL;
> }
>
> + term = strrchr(real_path, '/');
> + if (term && strncmp(term, "/virtio", 7) == 0)
> + *term = 0;
> +
> return real_path;
> }
>
> @@ -3744,6 +3754,7 @@ process_device(drmDevicePtr *device, const char *d_name,
>
> switch (subsystem_type) {
> case DRM_BUS_PCI:
> + case DRM_BUS_VIRTIO:
> return drmProcessPciDevice(device, node, node_type, maj, min,
> fetch_deviceinfo, flags);
> case DRM_BUS_USB:
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 07/10] tests/drmdevices: install alongside other utilities
2018-06-25 17:36 ` [PATCH libdrm 07/10] tests/drmdevices: install alongside other utilities Emil Velikov
@ 2018-06-28 16:09 ` Robert Foss
0 siblings, 0 replies; 31+ messages in thread
From: Robert Foss @ 2018-06-28 16:09 UTC (permalink / raw)
To: Emil Velikov, dri-devel
Feel free to add my r-b to this patch.
On 2018-06-25 19:36, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
>
> It's mildly useful program, to ship it when the user wants the "tests"
> installed. Obviously the "tests" in the name is a misnomer.
>
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> ---
> tests/Makefile.am | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index 0355a925..b72c24f9 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -43,5 +43,10 @@ TESTS = \
> random
>
> check_PROGRAMS = \
> - $(TESTS) \
> - drmdevice
> + $(TESTS)
> +
> +if HAVE_INSTALL_TESTS
> +bin_PROGRAMS = drmdevice
> +else
> +check_PROGRAMS += drmdevice
> +endif
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 08/10] tests/drmdevice: add a couple of printf headers
2018-06-25 17:36 ` [PATCH libdrm 08/10] tests/drmdevice: add a couple of printf headers Emil Velikov
@ 2018-06-28 16:09 ` Robert Foss
0 siblings, 0 replies; 31+ messages in thread
From: Robert Foss @ 2018-06-28 16:09 UTC (permalink / raw)
To: Emil Velikov, dri-devel
Feel free to add my r-b to this patch.
On 2018-06-25 19:36, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
>
> Add a few printf statements, which should make the output easier to
> parse.
>
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> ---
> tests/drmdevice.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/tests/drmdevice.c b/tests/drmdevice.c
> index 9dd5098a..0d75836f 100644
> --- a/tests/drmdevice.c
> +++ b/tests/drmdevice.c
> @@ -112,12 +112,15 @@ main(void)
> drmDevicePtr device;
> int fd, ret, max_devices;
>
> + printf("--- Checking the number of DRM device available ---\n");
> max_devices = drmGetDevices2(0, NULL, 0);
>
> if (max_devices <= 0) {
> printf("drmGetDevices2() has returned %d\n", max_devices);
> return -1;
> }
> + printf("--- Devices reported %d ---\n", max_devices);
> +
>
> devices = calloc(max_devices, sizeof(drmDevicePtr));
> if (devices == NULL) {
> @@ -125,6 +128,7 @@ main(void)
> return -1;
> }
>
> + printf("--- Retrieving devices information (PCI device revision is ignored) ---\n");
> ret = drmGetDevices2(0, devices, max_devices);
> if (ret < 0) {
> printf("drmGetDevices2() returned an error %d\n", ret);
> @@ -137,13 +141,14 @@ main(void)
>
> for (int j = 0; j < DRM_NODE_MAX; j++) {
> if (devices[i]->available_nodes & 1 << j) {
> - printf("Opening device %d node %s\n", i, devices[i]->nodes[j]);
> + printf("--- Opening device node %s ---\n", devices[i]->nodes[j]);
> fd = open(devices[i]->nodes[j], O_RDONLY | O_CLOEXEC, 0);
> if (fd < 0) {
> printf("Failed - %s (%d)\n", strerror(errno), errno);
> continue;
> }
>
> + printf("--- Retrieving device info, for node %s ---\n", devices[i]->nodes[j]);
> if (drmGetDevice2(fd, DRM_DEVICE_GET_PCI_REVISION, &device) == 0) {
> print_device_info(device, i, true);
> drmFreeDevice(&device);
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 09/10] drmdevice: convert the tabbed output into a tree
2018-06-25 17:36 ` [PATCH libdrm 09/10] drmdevice: convert the tabbed output into a tree Emil Velikov
2018-06-28 10:19 ` Eric Engestrom
@ 2018-06-28 16:09 ` Robert Foss
2018-06-29 15:24 ` [PATCH libdrm v2 " Emil Velikov
2 siblings, 0 replies; 31+ messages in thread
From: Robert Foss @ 2018-06-28 16:09 UTC (permalink / raw)
To: Emil Velikov, dri-devel
Feel free to add my r-b to this patch.
On 2018-06-25 19:36, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
>
> Making the output a little bit easier to parse by human beings.
>
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> ---
> tests/drmdevice.c | 78 +++++++++++++++++++++++------------------------
> 1 file changed, 39 insertions(+), 39 deletions(-)
>
> diff --git a/tests/drmdevice.c b/tests/drmdevice.c
> index 0d75836f..e9e9d7f1 100644
> --- a/tests/drmdevice.c
> +++ b/tests/drmdevice.c
> @@ -36,67 +36,67 @@ static void
> print_device_info(drmDevicePtr device, int i, bool print_revision)
> {
> printf("device[%i]\n", i);
> - printf("\tavailable_nodes %04x\n", device->available_nodes);
> - printf("\tnodes\n");
> + printf("+->available_nodes %#04x\n", device->available_nodes);
> + printf("+->nodes\n");
> for (int j = 0; j < DRM_NODE_MAX; j++)
> if (device->available_nodes & 1 << j)
> - printf("\t\tnodes[%d] %s\n", j, device->nodes[j]);
> + printf("| +->nodes[%d] %s\n", j, device->nodes[j]);
>
> - printf("\tbustype %04x\n", device->bustype);
> - printf("\tbusinfo\n");
> + printf("+->bustype %04x\n", device->bustype);
> + printf("+->businfo\n");
> if (device->bustype == DRM_BUS_PCI) {
> - printf("\t\tpci\n");
> - printf("\t\t\tdomain\t%04x\n",device->businfo.pci->domain);
> - printf("\t\t\tbus\t%02x\n", device->businfo.pci->bus);
> - printf("\t\t\tdev\t%02x\n", device->businfo.pci->dev);
> - printf("\t\t\tfunc\t%1u\n", device->businfo.pci->func);
> -
> - printf("\tdeviceinfo\n");
> - printf("\t\tpci\n");
> - printf("\t\t\tvendor_id\t%04x\n", device->deviceinfo.pci->vendor_id);
> - printf("\t\t\tdevice_id\t%04x\n", device->deviceinfo.pci->device_id);
> - printf("\t\t\tsubvendor_id\t%04x\n", device->deviceinfo.pci->subvendor_id);
> - printf("\t\t\tsubdevice_id\t%04x\n", device->deviceinfo.pci->subdevice_id);
> + printf("| +->pci\n");
> + printf("| +->domain %04x\n",device->businfo.pci->domain);
> + printf("| +->bus %02x\n", device->businfo.pci->bus);
> + printf("| +->dev %02x\n", device->businfo.pci->dev);
> + printf("| +->func %1u\n", device->businfo.pci->func);
> +
> + printf("+->deviceinfo\n");
> + printf(" +->pci\n");
> + printf(" +->vendor_id %04x\n", device->deviceinfo.pci->vendor_id);
> + printf(" +->device_id %04x\n", device->deviceinfo.pci->device_id);
> + printf(" +->subvendor_id %04x\n", device->deviceinfo.pci->subvendor_id);
> + printf(" +->subdevice_id %04x\n", device->deviceinfo.pci->subdevice_id);
> if (print_revision)
> - printf("\t\t\trevision_id\t%02x\n", device->deviceinfo.pci->revision_id);
> + printf(" +->revision_id %02x\n", device->deviceinfo.pci->revision_id);
> else
> - printf("\t\t\trevision_id\tIGNORED\n");
> + printf(" +->revision_id IGNORED\n");
>
> } else if (device->bustype == DRM_BUS_USB) {
> - printf("\t\tusb\n");
> - printf("\t\t\tbus\t%03u\n", device->businfo.usb->bus);
> - printf("\t\t\tdev\t%03u\n", device->businfo.usb->dev);
> -
> - printf("\tdeviceinfo\n");
> - printf("\t\tusb\n");
> - printf("\t\t\tvendor\t%04x\n", device->deviceinfo.usb->vendor);
> - printf("\t\t\tproduct\t%04x\n", device->deviceinfo.usb->product);
> + printf("| +->usb\n");
> + printf("| +->bus %03u\n", device->businfo.usb->bus);
> + printf("| +->dev %03u\n", device->businfo.usb->dev);
> +
> + printf("+->deviceinfo\n");
> + printf(" +->usb\n");
> + printf(" +->vendor %04x\n", device->deviceinfo.usb->vendor);
> + printf(" +->product %04x\n", device->deviceinfo.usb->product);
> } else if (device->bustype == DRM_BUS_PLATFORM) {
> char **compatible = device->deviceinfo.platform->compatible;
>
> - printf("\t\tplatform\n");
> - printf("\t\t\tfullname\t%s\n", device->businfo.platform->fullname);
> + printf("| +->platform\n");
> + printf("| +->fullname\t%s\n", device->businfo.platform->fullname);
>
> - printf("\tdeviceinfo\n");
> - printf("\t\tplatform\n");
> - printf("\t\t\tcompatible\n");
> + printf("+->deviceinfo\n");
> + printf(" +->platform\n");
> + printf(" +->compatible\n");
>
> while (*compatible) {
> - printf("\t\t\t\t%s\n", *compatible);
> + printf(" %s\n", *compatible);
> compatible++;
> }
> } else if (device->bustype == DRM_BUS_HOST1X) {
> char **compatible = device->deviceinfo.platform->compatible;
>
> - printf("\t\thost1x\n");
> - printf("\t\t\tfullname\t%s\n", device->businfo.host1x->fullname);
> + printf("| +->host1x\n");
> + printf("| +->fullname\t%s\n", device->businfo.host1x->fullname);
>
> - printf("\tdeviceinfo\n");
> - printf("\t\tplatform\n");
> - printf("\t\t\tcompatible\n");
> + printf("+->deviceinfo\n");
> + printf(" +->platform\n");
> + printf(" +->compatible\n");
>
> while (*compatible) {
> - printf("\t\t\t\t%s\n", *compatible);
> + printf(" %s\n", *compatible);
> compatible++;
> }
> } else {
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 10/10] drmdevice: print the correct host1x information
2018-06-25 17:36 ` [PATCH libdrm 10/10] drmdevice: print the correct host1x information Emil Velikov
@ 2018-06-28 16:09 ` Robert Foss
0 siblings, 0 replies; 31+ messages in thread
From: Robert Foss @ 2018-06-28 16:09 UTC (permalink / raw)
To: dri-devel
Nice catch!
Feel free to add my r-b to this patch.
On 2018-06-25 19:36, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
>
> While fairly close, the host1x and platform are two separate things.
>
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> ---
> tests/drmdevice.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/tests/drmdevice.c b/tests/drmdevice.c
> index e9e9d7f1..97ce8ff9 100644
> --- a/tests/drmdevice.c
> +++ b/tests/drmdevice.c
> @@ -86,13 +86,13 @@ print_device_info(drmDevicePtr device, int i, bool print_revision)
> compatible++;
> }
> } else if (device->bustype == DRM_BUS_HOST1X) {
> - char **compatible = device->deviceinfo.platform->compatible;
> + char **compatible = device->deviceinfo.host1x->compatible;
>
> printf("| +->host1x\n");
> printf("| +->fullname\t%s\n", device->businfo.host1x->fullname);
>
> printf("+->deviceinfo\n");
> - printf(" +->platform\n");
> + printf(" +->host1x\n");
> printf(" +->compatible\n");
>
> while (*compatible) {
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 05/10] xf86drm: introduce a get_real_pci_path() helper
2018-06-28 10:21 ` Eric Engestrom
2018-06-28 10:23 ` Eric Engestrom
@ 2018-06-28 16:42 ` Emil Velikov
1 sibling, 0 replies; 31+ messages in thread
From: Emil Velikov @ 2018-06-28 16:42 UTC (permalink / raw)
To: Eric Engestrom; +Cc: ML dri-devel
Hi Eric,
On 28 June 2018 at 11:21, Eric Engestrom <eric@engestrom.ch> wrote:
>> @@ -2992,16 +2992,37 @@ static int drmParseSubsystemType(int maj, int min)
>> #endif
>> }
>>
>> +static char *
>> +get_real_pci_path(int maj, int min)
>> +{
>> + char path[PATH_MAX + 1];
>> + char *real_path = malloc(PATH_MAX);
>
> Why not allocate this on the stack and pass it in?
> It would avoid the error handling you had to add in this patch :)
>
As always, thanks for having a look.
I was mostly hesitant since some callers already have a char foo[PATH_MAX +1].
Thinking about it - the default stack size should be enough to
accommodate an extra ~4k bytes.
Will fix.
Thanks
Emil
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 09/10] drmdevice: convert the tabbed output into a tree
2018-06-28 10:19 ` Eric Engestrom
@ 2018-06-28 16:43 ` Emil Velikov
0 siblings, 0 replies; 31+ messages in thread
From: Emil Velikov @ 2018-06-28 16:43 UTC (permalink / raw)
To: Eric Engestrom; +Cc: ML dri-devel
On 28 June 2018 at 11:19, Eric Engestrom <eric@engestrom.ch> wrote:
> On Monday, 2018-06-25 17:40:02 +0000, Emil Velikov wrote:
>> From: Emil Velikov <emil.velikov@collabora.com>
>>
>> Making the output a little bit easier to parse by human beings.
>>
>> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
>> ---
>> tests/drmdevice.c | 78 +++++++++++++++++++++++------------------------
>> 1 file changed, 39 insertions(+), 39 deletions(-)
>>
>> diff --git a/tests/drmdevice.c b/tests/drmdevice.c
>> index 0d75836f..e9e9d7f1 100644
>> --- a/tests/drmdevice.c
>> +++ b/tests/drmdevice.c
>> @@ -36,67 +36,67 @@ static void
>> print_device_info(drmDevicePtr device, int i, bool print_revision)
>> {
>> printf("device[%i]\n", i);
>> - printf("\tavailable_nodes %04x\n", device->available_nodes);
>> - printf("\tnodes\n");
>> + printf("+->available_nodes %#04x\n", device->available_nodes);
>> + printf("+->nodes\n");
>
> Nit: I'd put a space between `>` and the text, for readability
>
Ack, will do.
Thanks
Emil
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm 04/10] xf86drm: Allocate drmDevicePtr's on stack
2018-06-28 12:52 ` Robert Foss
@ 2018-06-28 17:07 ` Emil Velikov
0 siblings, 0 replies; 31+ messages in thread
From: Emil Velikov @ 2018-06-28 17:07 UTC (permalink / raw)
To: Robert Foss; +Cc: ML dri-devel
Hi Rob,
On 28 June 2018 at 13:52, Robert Foss <robert.foss@collabora.com> wrote:
> Hey Emil,
>
> On 2018-06-25 19:36, Emil Velikov wrote:
>>
>> From: Emil Velikov <emil.velikov@collabora.com>
>>
>> Currently we dynamically allocate 16 pointers and reallocate more as
>> needed.
>>
>> Instead, allocate the maximum number (256) on stack - the number is
>> small enough and is unlikely to change in the foreseeable future.
>>
>> This allows us to simplify the error handling and even shed a few bytes
>> off the final binary.
>>
>> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
>> ---
>> xf86drm.c | 64 ++++++-------------------------------------------------
>> 1 file changed, 6 insertions(+), 58 deletions(-)
>>
>> diff --git a/xf86drm.c b/xf86drm.c
>> index 114cf855..d4810740 100644
>> --- a/xf86drm.c
>> +++ b/xf86drm.c
>> @@ -3846,7 +3846,7 @@ int drmGetDevice2(int fd, uint32_t flags,
>> drmDevicePtr *device)
>> return 0;
>> #else
>> - drmDevicePtr *local_devices;
>> + drmDevicePtr local_devices[256];
>
>
> This number is seen later on in this patch, maybe it should be broken out
> into a
> define, since it's reused later on too at [1].
>
Sure thing. The lame MAX_DRM_NODES comes to mind, so alternatives are welcome.
>
>> drmDevicePtr d;
>> DIR *sysdir;
>> struct dirent *dent;
>> @@ -3854,7 +3854,6 @@ int drmGetDevice2(int fd, uint32_t flags,
>> drmDevicePtr *device)
>> int subsystem_type;
>> int maj, min;
>> int ret, i, node_count;
>> - int max_count = 16;
>> dev_t find_rdev;
>> if (drm_device_validate_flags(flags))
>> @@ -3877,15 +3876,9 @@ int drmGetDevice2(int fd, uint32_t flags,
>> drmDevicePtr *device)
>> if (subsystem_type < 0)
>> return subsystem_type;
>> - local_devices = calloc(max_count, sizeof(drmDevicePtr));
>> - if (local_devices == NULL)
>> - return -ENOMEM;
>> -
>> sysdir = opendir(DRM_DIR_NAME);
>> - if (!sysdir) {
>> - ret = -errno;
>> - goto free_locals;
>> - }
>> + if (!sysdir)
>> + return -errno;
>> i = 0;
>> while ((dent = readdir(sysdir))) {
>> @@ -3893,16 +3886,6 @@ int drmGetDevice2(int fd, uint32_t flags,
>> drmDevicePtr *device)
>> if (ret)
>> continue;
>> - if (i >= max_count) {
>
>
> Is this check really not needded what exactly is it that defines 256 as the
> maximum?
>
> From what I understand readdir(sysdir) is the call that defines how many
> devices will be looked through, and as far as I understand it can return an
> arbitrary number of files.
>
The kernel drm core has a number of places that assume maximum of 3x64
devices nodes.
That's 64 for each of primary, control and render nodes. I've rounded
it up to 256 for simplicity.
I assume we'll be able to see if anyone changes the kernel, although
bailing out just in case is a good idea.
The is one exciting error message - let me know if anything else comes to mind.
if (i >= MAX_DRM_NODES) {
fprintf(stderr, "More than %d drm nodes detected. Please report a
bug - that should not happen.\nSkipping extra nodes\n",
MAX_DRM_NODES);
break;
}
I'll send out v2 for the patches that need work some time
tomorrow/over the weekend..
Thanks
Emil
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
* [PATCH libdrm v2 04/10] xf86drm: Allocate drmDevicePtr's on stack
2018-06-25 17:36 ` [PATCH libdrm 04/10] xf86drm: Allocate drmDevicePtr's on stack Emil Velikov
2018-06-28 12:52 ` Robert Foss
@ 2018-06-29 15:20 ` Emil Velikov
2018-06-29 15:49 ` Robert Foss
2018-06-29 15:22 ` [PATCH libdrm v2 05/10] xf86drm: introduce a get_real_pci_path() helper Emil Velikov
2 siblings, 1 reply; 31+ messages in thread
From: Emil Velikov @ 2018-06-29 15:20 UTC (permalink / raw)
To: dri-devel; +Cc: Robert Foss, emil.l.velikov
From: Emil Velikov <emil.velikov@collabora.com>
Currently we dynamically allocate 16 pointers and reallocate more as
needed.
Instead, allocate the maximum number (256) on stack - the number is
small enough and is unlikely to change in the foreseeable future.
This allows us to simplify the error handling and even shed a few bytes
off the final binary.
v2:
- add a define & description behind the magic 256 (Rob)
- report error to strerr and skip when over 256 device nodes (Rob)
Cc: Robert Foss <robert.foss@collabora.com>
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Tested-by: Robert Foss <robert.foss@collabora.com> (v1)
Reviewed-by: Robert Foss <robert.foss@collabora.com> (v1)
Reviewed-by: Eric Engestrom <eric@engestrom.ch> (v1)
---
xf86drm.c | 79 ++++++++++++++++---------------------------------------
1 file changed, 23 insertions(+), 56 deletions(-)
diff --git a/xf86drm.c b/xf86drm.c
index 114cf855..02da3e1f 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -3766,6 +3766,13 @@ drm_device_has_rdev(drmDevicePtr device, dev_t find_rdev)
return false;
}
+/*
+ * The kernel drm core has a number of places that assume maximum of
+ * 3x64 devices nodes. That's 64 for each of primary, control and
+ * render nodes. Rounded it up to 256 for simplicity.
+ */
+#define MAX_DRM_NODES 256
+
/**
* Get information about the opened drm device
*
@@ -3846,7 +3853,7 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
return 0;
#else
- drmDevicePtr *local_devices;
+ drmDevicePtr local_devices[MAX_DRM_NODES];
drmDevicePtr d;
DIR *sysdir;
struct dirent *dent;
@@ -3854,7 +3861,6 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
int subsystem_type;
int maj, min;
int ret, i, node_count;
- int max_count = 16;
dev_t find_rdev;
if (drm_device_validate_flags(flags))
@@ -3877,15 +3883,9 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
if (subsystem_type < 0)
return subsystem_type;
- local_devices = calloc(max_count, sizeof(drmDevicePtr));
- if (local_devices == NULL)
- return -ENOMEM;
-
sysdir = opendir(DRM_DIR_NAME);
- if (!sysdir) {
- ret = -errno;
- goto free_locals;
- }
+ if (!sysdir)
+ return -errno;
i = 0;
while ((dent = readdir(sysdir))) {
@@ -3893,16 +3893,12 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
if (ret)
continue;
- if (i >= max_count) {
- drmDevicePtr *temp;
-
- max_count += 16;
- temp = realloc(local_devices, max_count * sizeof(drmDevicePtr));
- if (!temp)
- goto free_devices;
- local_devices = temp;
+ if (i >= MAX_DRM_NODES) {
+ fprintf(stderr, "More than %d drm nodes detected. "
+ "Please report a bug - that should not happen.\n"
+ "Skipping extra nodes\n", MAX_DRM_NODES);
+ break;
}
-
local_devices[i] = d;
i++;
}
@@ -3921,18 +3917,9 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
}
closedir(sysdir);
- free(local_devices);
if (*device == NULL)
return -ENODEV;
return 0;
-
-free_devices:
- drmFreeDevices(local_devices, i);
- closedir(sysdir);
-
-free_locals:
- free(local_devices);
- return ret;
#endif
}
@@ -3968,25 +3955,18 @@ int drmGetDevice(int fd, drmDevicePtr *device)
*/
int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
{
- drmDevicePtr *local_devices;
+ drmDevicePtr local_devices[MAX_DRM_NODES];
drmDevicePtr device;
DIR *sysdir;
struct dirent *dent;
int ret, i, node_count, device_count;
- int max_count = 16;
if (drm_device_validate_flags(flags))
return -EINVAL;
- local_devices = calloc(max_count, sizeof(drmDevicePtr));
- if (local_devices == NULL)
- return -ENOMEM;
-
sysdir = opendir(DRM_DIR_NAME);
- if (!sysdir) {
- ret = -errno;
- goto free_locals;
- }
+ if (!sysdir)
+ return -errno;
i = 0;
while ((dent = readdir(sysdir))) {
@@ -3994,16 +3974,12 @@ int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
if (ret)
continue;
- if (i >= max_count) {
- drmDevicePtr *temp;
-
- max_count += 16;
- temp = realloc(local_devices, max_count * sizeof(drmDevicePtr));
- if (!temp)
- goto free_devices;
- local_devices = temp;
+ if (i >= MAX_DRM_NODES) {
+ fprintf(stderr, "More than %d drm nodes detected. "
+ "Please report a bug - that should not happen.\n"
+ "Skipping extra nodes\n", MAX_DRM_NODES);
+ break;
}
-
local_devices[i] = device;
i++;
}
@@ -4025,16 +4001,7 @@ int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
}
closedir(sysdir);
- free(local_devices);
return device_count;
-
-free_devices:
- drmFreeDevices(local_devices, i);
- closedir(sysdir);
-
-free_locals:
- free(local_devices);
- return ret;
}
/**
--
2.18.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH libdrm v2 05/10] xf86drm: introduce a get_real_pci_path() helper
2018-06-25 17:36 ` [PATCH libdrm 04/10] xf86drm: Allocate drmDevicePtr's on stack Emil Velikov
2018-06-28 12:52 ` Robert Foss
2018-06-29 15:20 ` [PATCH libdrm v2 " Emil Velikov
@ 2018-06-29 15:22 ` Emil Velikov
2 siblings, 0 replies; 31+ messages in thread
From: Emil Velikov @ 2018-06-29 15:22 UTC (permalink / raw)
To: dri-devel; +Cc: Eric Engestrom, emil.l.velikov
From: Emil Velikov <emil.velikov@collabora.com>
Introduce a helper which gets the real sysfs path for the given pci
device.
In other words, instead opening the /sys/dev/char/*/device symlink, we
opt for the actual /sys/devices/pci*/*/
It folds three (nearly identical) snprintf's and paves the way of adding
extra devices (see next patch) a piece of pie.
v2: use a caller (on stack) provided real_path (Eric)
Cc: Eric Engestrom <eric@engestrom.ch>
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Tested-by: Robert Foss <robert.foss@collabora.com> (v1)
Reviewed-by: Robert Foss <robert.foss@collabora.com> (v1)
Reviewed-by: Eric Engestrom <eric@engestrom.ch> (v1)
---
Eric, I couldn't quite remove all the error handling since on realpath()
failure the output buffer contents are undefined :-\
xf86drm.c | 34 ++++++++++++++++++++++++++--------
1 file changed, 26 insertions(+), 8 deletions(-)
diff --git a/xf86drm.c b/xf86drm.c
index 02da3e1f..51e00d23 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2992,16 +2992,29 @@ static int drmParseSubsystemType(int maj, int min)
#endif
}
+static char *
+get_real_pci_path(int maj, int min, char *real_path)
+{
+ char path[PATH_MAX + 1];
+
+ snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min);
+ if (!realpath(path, real_path))
+ return NULL;
+
+ return real_path;
+}
+
static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info)
{
#ifdef __linux__
unsigned int domain, bus, dev, func;
- char path[PATH_MAX + 1], *value;
+ char real_path[PATH_MAX + 1], *value;
int num;
- snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min);
+ if (get_real_pci_path(maj, min, real_path) == NULL)
+ return -ENOENT;
- value = sysfs_uevent_get(path, "PCI_SLOT_NAME");
+ value = sysfs_uevent_get(real_path, "PCI_SLOT_NAME");
if (!value)
return -ENOENT;
@@ -3114,14 +3127,16 @@ static int parse_separate_sysfs_files(int maj, int min,
"subsystem_vendor",
"subsystem_device",
};
- char path[PATH_MAX + 1];
+ char path[PATH_MAX + 1], real_path[PATH_MAX + 1];
unsigned int data[ARRAY_SIZE(attrs)];
FILE *fp;
int ret;
+ if (get_real_pci_path(maj, min, real_path) == NULL)
+ return -ENOENT;
+
for (unsigned i = ignore_revision ? 1 : 0; i < ARRAY_SIZE(attrs); i++) {
- snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/%s", maj, min,
- attrs[i]);
+ snprintf(path, PATH_MAX, "%s/%s", real_path, attrs[i]);
fp = fopen(path, "r");
if (!fp)
return -errno;
@@ -3145,11 +3160,14 @@ static int parse_separate_sysfs_files(int maj, int min,
static int parse_config_sysfs_file(int maj, int min,
drmPciDeviceInfoPtr device)
{
- char path[PATH_MAX + 1];
+ char path[PATH_MAX + 1], real_path[PATH_MAX + 1];
unsigned char config[64];
int fd, ret;
- snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/config", maj, min);
+ if (get_real_pci_path(maj, min, real_path) == NULL)
+ return -ENOENT;
+
+ snprintf(path, PATH_MAX, "%s/config", real_path);
fd = open(path, O_RDONLY);
if (fd < 0)
return -errno;
--
2.18.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH libdrm v2 09/10] drmdevice: convert the tabbed output into a tree
2018-06-25 17:36 ` [PATCH libdrm 09/10] drmdevice: convert the tabbed output into a tree Emil Velikov
2018-06-28 10:19 ` Eric Engestrom
2018-06-28 16:09 ` Robert Foss
@ 2018-06-29 15:24 ` Emil Velikov
2 siblings, 0 replies; 31+ messages in thread
From: Emil Velikov @ 2018-06-29 15:24 UTC (permalink / raw)
To: dri-devel; +Cc: Eric Engestrom, emil.l.velikov
From: Emil Velikov <emil.velikov@collabora.com>
Making the output a little bit easier to parse by human beings.
v2: Add extra whitespace (Eric)
Cc: Eric Engestrom <eric@engestrom.ch>
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Tested-by: Robert Foss <robert.foss@collabora.com> (v1)
Reviewed-by: Robert Foss <robert.foss@collabora.com> (v1)
Reviewed-by: Eric Engestrom <eric@engestrom.ch> (v1)
---
tests/drmdevice.c | 77 +++++++++++++++++++++++------------------------
1 file changed, 38 insertions(+), 39 deletions(-)
diff --git a/tests/drmdevice.c b/tests/drmdevice.c
index 0d75836f..049df3cf 100644
--- a/tests/drmdevice.c
+++ b/tests/drmdevice.c
@@ -36,67 +36,66 @@ static void
print_device_info(drmDevicePtr device, int i, bool print_revision)
{
printf("device[%i]\n", i);
- printf("\tavailable_nodes %04x\n", device->available_nodes);
- printf("\tnodes\n");
+ printf("+-> available_nodes %#04x\n", device->available_nodes);
+ printf("+-> nodes\n");
for (int j = 0; j < DRM_NODE_MAX; j++)
if (device->available_nodes & 1 << j)
- printf("\t\tnodes[%d] %s\n", j, device->nodes[j]);
+ printf("| +-> nodes[%d] %s\n", j, device->nodes[j]);
- printf("\tbustype %04x\n", device->bustype);
- printf("\tbusinfo\n");
+ printf("+-> bustype %04x\n", device->bustype);
if (device->bustype == DRM_BUS_PCI) {
- printf("\t\tpci\n");
- printf("\t\t\tdomain\t%04x\n",device->businfo.pci->domain);
- printf("\t\t\tbus\t%02x\n", device->businfo.pci->bus);
- printf("\t\t\tdev\t%02x\n", device->businfo.pci->dev);
- printf("\t\t\tfunc\t%1u\n", device->businfo.pci->func);
-
- printf("\tdeviceinfo\n");
- printf("\t\tpci\n");
- printf("\t\t\tvendor_id\t%04x\n", device->deviceinfo.pci->vendor_id);
- printf("\t\t\tdevice_id\t%04x\n", device->deviceinfo.pci->device_id);
- printf("\t\t\tsubvendor_id\t%04x\n", device->deviceinfo.pci->subvendor_id);
- printf("\t\t\tsubdevice_id\t%04x\n", device->deviceinfo.pci->subdevice_id);
+ printf("| +-> pci\n");
+ printf("| +-> domain %04x\n",device->businfo.pci->domain);
+ printf("| +-> bus %02x\n", device->businfo.pci->bus);
+ printf("| +-> dev %02x\n", device->businfo.pci->dev);
+ printf("| +-> func %1u\n", device->businfo.pci->func);
+
+ printf("+-> deviceinfo\n");
+ printf(" +-> pci\n");
+ printf(" +-> vendor_id %04x\n", device->deviceinfo.pci->vendor_id);
+ printf(" +-> device_id %04x\n", device->deviceinfo.pci->device_id);
+ printf(" +-> subvendor_id %04x\n", device->deviceinfo.pci->subvendor_id);
+ printf(" +-> subdevice_id %04x\n", device->deviceinfo.pci->subdevice_id);
if (print_revision)
- printf("\t\t\trevision_id\t%02x\n", device->deviceinfo.pci->revision_id);
+ printf(" +-> revision_id %02x\n", device->deviceinfo.pci->revision_id);
else
- printf("\t\t\trevision_id\tIGNORED\n");
+ printf(" +-> revision_id IGNORED\n");
} else if (device->bustype == DRM_BUS_USB) {
- printf("\t\tusb\n");
- printf("\t\t\tbus\t%03u\n", device->businfo.usb->bus);
- printf("\t\t\tdev\t%03u\n", device->businfo.usb->dev);
-
- printf("\tdeviceinfo\n");
- printf("\t\tusb\n");
- printf("\t\t\tvendor\t%04x\n", device->deviceinfo.usb->vendor);
- printf("\t\t\tproduct\t%04x\n", device->deviceinfo.usb->product);
+ printf("| +-> usb\n");
+ printf("| +-> bus %03u\n", device->businfo.usb->bus);
+ printf("| +-> dev %03u\n", device->businfo.usb->dev);
+
+ printf("+-> deviceinfo\n");
+ printf(" +-> usb\n");
+ printf(" +-> vendor %04x\n", device->deviceinfo.usb->vendor);
+ printf(" +-> product %04x\n", device->deviceinfo.usb->product);
} else if (device->bustype == DRM_BUS_PLATFORM) {
char **compatible = device->deviceinfo.platform->compatible;
- printf("\t\tplatform\n");
- printf("\t\t\tfullname\t%s\n", device->businfo.platform->fullname);
+ printf("| +-> platform\n");
+ printf("| +-> fullname\t%s\n", device->businfo.platform->fullname);
- printf("\tdeviceinfo\n");
- printf("\t\tplatform\n");
- printf("\t\t\tcompatible\n");
+ printf("+-> deviceinfo\n");
+ printf(" +-> platform\n");
+ printf(" +-> compatible\n");
while (*compatible) {
- printf("\t\t\t\t%s\n", *compatible);
+ printf(" %s\n", *compatible);
compatible++;
}
} else if (device->bustype == DRM_BUS_HOST1X) {
char **compatible = device->deviceinfo.platform->compatible;
- printf("\t\thost1x\n");
- printf("\t\t\tfullname\t%s\n", device->businfo.host1x->fullname);
+ printf("| +-> host1x\n");
+ printf("| +-> fullname\t%s\n", device->businfo.host1x->fullname);
- printf("\tdeviceinfo\n");
- printf("\t\tplatform\n");
- printf("\t\t\tcompatible\n");
+ printf("+-> deviceinfo\n");
+ printf(" +-> platform\n");
+ printf(" +-> compatible\n");
while (*compatible) {
- printf("\t\t\t\t%s\n", *compatible);
+ printf(" %s\n", *compatible);
compatible++;
}
} else {
--
2.18.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 31+ messages in thread
* Re: [PATCH libdrm v2 04/10] xf86drm: Allocate drmDevicePtr's on stack
2018-06-29 15:20 ` [PATCH libdrm v2 " Emil Velikov
@ 2018-06-29 15:49 ` Robert Foss
0 siblings, 0 replies; 31+ messages in thread
From: Robert Foss @ 2018-06-29 15:49 UTC (permalink / raw)
To: Emil Velikov, dri-devel
LGTM
On 2018-06-29 17:20, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
>
> Currently we dynamically allocate 16 pointers and reallocate more as
> needed.
>
> Instead, allocate the maximum number (256) on stack - the number is
> small enough and is unlikely to change in the foreseeable future.
>
> This allows us to simplify the error handling and even shed a few bytes
> off the final binary.
>
> v2:
> - add a define & description behind the magic 256 (Rob)
> - report error to strerr and skip when over 256 device nodes (Rob)
>
> Cc: Robert Foss <robert.foss@collabora.com>
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> Tested-by: Robert Foss <robert.foss@collabora.com> (v1)
> Reviewed-by: Robert Foss <robert.foss@collabora.com> (v1)
> Reviewed-by: Eric Engestrom <eric@engestrom.ch> (v1)
> ---
> xf86drm.c | 79 ++++++++++++++++---------------------------------------
> 1 file changed, 23 insertions(+), 56 deletions(-)
>
> diff --git a/xf86drm.c b/xf86drm.c
> index 114cf855..02da3e1f 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -3766,6 +3766,13 @@ drm_device_has_rdev(drmDevicePtr device, dev_t find_rdev)
> return false;
> }
>
> +/*
> + * The kernel drm core has a number of places that assume maximum of
> + * 3x64 devices nodes. That's 64 for each of primary, control and
> + * render nodes. Rounded it up to 256 for simplicity.
> + */
> +#define MAX_DRM_NODES 256
> +
> /**
> * Get information about the opened drm device
> *
> @@ -3846,7 +3853,7 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
>
> return 0;
> #else
> - drmDevicePtr *local_devices;
> + drmDevicePtr local_devices[MAX_DRM_NODES];
> drmDevicePtr d;
> DIR *sysdir;
> struct dirent *dent;
> @@ -3854,7 +3861,6 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
> int subsystem_type;
> int maj, min;
> int ret, i, node_count;
> - int max_count = 16;
> dev_t find_rdev;
>
> if (drm_device_validate_flags(flags))
> @@ -3877,15 +3883,9 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
> if (subsystem_type < 0)
> return subsystem_type;
>
> - local_devices = calloc(max_count, sizeof(drmDevicePtr));
> - if (local_devices == NULL)
> - return -ENOMEM;
> -
> sysdir = opendir(DRM_DIR_NAME);
> - if (!sysdir) {
> - ret = -errno;
> - goto free_locals;
> - }
> + if (!sysdir)
> + return -errno;
>
> i = 0;
> while ((dent = readdir(sysdir))) {
> @@ -3893,16 +3893,12 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
> if (ret)
> continue;
>
> - if (i >= max_count) {
> - drmDevicePtr *temp;
> -
> - max_count += 16;
> - temp = realloc(local_devices, max_count * sizeof(drmDevicePtr));
> - if (!temp)
> - goto free_devices;
> - local_devices = temp;
> + if (i >= MAX_DRM_NODES) {
> + fprintf(stderr, "More than %d drm nodes detected. "
> + "Please report a bug - that should not happen.\n"
> + "Skipping extra nodes\n", MAX_DRM_NODES);
> + break;
> }
> -
> local_devices[i] = d;
> i++;
> }
> @@ -3921,18 +3917,9 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
> }
>
> closedir(sysdir);
> - free(local_devices);
> if (*device == NULL)
> return -ENODEV;
> return 0;
> -
> -free_devices:
> - drmFreeDevices(local_devices, i);
> - closedir(sysdir);
> -
> -free_locals:
> - free(local_devices);
> - return ret;
> #endif
> }
>
> @@ -3968,25 +3955,18 @@ int drmGetDevice(int fd, drmDevicePtr *device)
> */
> int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
> {
> - drmDevicePtr *local_devices;
> + drmDevicePtr local_devices[MAX_DRM_NODES];
> drmDevicePtr device;
> DIR *sysdir;
> struct dirent *dent;
> int ret, i, node_count, device_count;
> - int max_count = 16;
>
> if (drm_device_validate_flags(flags))
> return -EINVAL;
>
> - local_devices = calloc(max_count, sizeof(drmDevicePtr));
> - if (local_devices == NULL)
> - return -ENOMEM;
> -
> sysdir = opendir(DRM_DIR_NAME);
> - if (!sysdir) {
> - ret = -errno;
> - goto free_locals;
> - }
> + if (!sysdir)
> + return -errno;
>
> i = 0;
> while ((dent = readdir(sysdir))) {
> @@ -3994,16 +3974,12 @@ int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
> if (ret)
> continue;
>
> - if (i >= max_count) {
> - drmDevicePtr *temp;
> -
> - max_count += 16;
> - temp = realloc(local_devices, max_count * sizeof(drmDevicePtr));
> - if (!temp)
> - goto free_devices;
> - local_devices = temp;
> + if (i >= MAX_DRM_NODES) {
> + fprintf(stderr, "More than %d drm nodes detected. "
> + "Please report a bug - that should not happen.\n"
> + "Skipping extra nodes\n", MAX_DRM_NODES);
> + break;
> }
> -
> local_devices[i] = device;
> i++;
> }
> @@ -4025,16 +4001,7 @@ int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
> }
>
> closedir(sysdir);
> - free(local_devices);
> return device_count;
> -
> -free_devices:
> - drmFreeDevices(local_devices, i);
> - closedir(sysdir);
> -
> -free_locals:
> - free(local_devices);
> - return ret;
> }
>
> /**
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 31+ messages in thread
end of thread, other threads:[~2018-06-29 15:49 UTC | newest]
Thread overview: 31+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-25 17:36 [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys Emil Velikov
2018-06-25 17:36 ` [PATCH libdrm 02/10] xf86drm: introduce drm_device_has_rdev() helper Emil Velikov
2018-06-28 10:14 ` Robert Foss
2018-06-25 17:36 ` [PATCH libdrm 03/10] xf86drm: Fold drmDevice processing into process_device() helper Emil Velikov
2018-06-28 11:50 ` Robert Foss
2018-06-25 17:36 ` [PATCH libdrm 04/10] xf86drm: Allocate drmDevicePtr's on stack Emil Velikov
2018-06-28 12:52 ` Robert Foss
2018-06-28 17:07 ` Emil Velikov
2018-06-29 15:20 ` [PATCH libdrm v2 " Emil Velikov
2018-06-29 15:49 ` Robert Foss
2018-06-29 15:22 ` [PATCH libdrm v2 05/10] xf86drm: introduce a get_real_pci_path() helper Emil Velikov
2018-06-25 17:36 ` [PATCH libdrm " Emil Velikov
2018-06-28 10:21 ` Eric Engestrom
2018-06-28 10:23 ` Eric Engestrom
2018-06-28 16:42 ` Emil Velikov
2018-06-28 16:06 ` Robert Foss
2018-06-25 17:36 ` [PATCH libdrm 06/10] xf86drm: Add drmDevice support for virtio_gpu Emil Velikov
2018-06-28 16:08 ` Robert Foss
2018-06-25 17:36 ` [PATCH libdrm 07/10] tests/drmdevices: install alongside other utilities Emil Velikov
2018-06-28 16:09 ` Robert Foss
2018-06-25 17:36 ` [PATCH libdrm 08/10] tests/drmdevice: add a couple of printf headers Emil Velikov
2018-06-28 16:09 ` Robert Foss
2018-06-25 17:36 ` [PATCH libdrm 09/10] drmdevice: convert the tabbed output into a tree Emil Velikov
2018-06-28 10:19 ` Eric Engestrom
2018-06-28 16:43 ` Emil Velikov
2018-06-28 16:09 ` Robert Foss
2018-06-29 15:24 ` [PATCH libdrm v2 " Emil Velikov
2018-06-25 17:36 ` [PATCH libdrm 10/10] drmdevice: print the correct host1x information Emil Velikov
2018-06-28 16:09 ` Robert Foss
2018-06-28 10:11 ` [PATCH libdrm 01/10] xf86drm: drmGetDevice2: error out if the fd has unknown subsys Robert Foss
2018-06-28 10:11 ` Robert Foss
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.