dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH libdrm 1/5] xf86drm: use maj/min in drmParsePciDeviceInfo()
@ 2016-11-30 20:35 Emil Velikov
  2016-11-30 20:35 ` [PATCH libdrm 2/5] xf86drm: add plumbing to not retrieve PCI device revision Emil Velikov
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Emil Velikov @ 2016-11-30 20:35 UTC (permalink / raw)
  To: dri-devel; +Cc: emil.l.velikov

From: Emil Velikov <emil.velikov@collabora.com>

Be consistent with drmParsePciBusInfo() and use solely the device
major/minor pair.

Cc: Jonathan Gray <jsg@jsg.id.au>
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
Jonathan, please respin your patches on top of this series.
---
 xf86drm.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/xf86drm.c b/xf86drm.c
index ed924a7..c788c93 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2946,7 +2946,7 @@ static int drmGetMaxNodeName(void)
            3 /* length of the node number */;
 }
 
-static int drmParsePciDeviceInfo(const char *d_name,
+static int drmParsePciDeviceInfo(int maj, int min,
                                  drmPciDeviceInfoPtr device)
 {
 #ifdef __linux__
@@ -2954,7 +2954,7 @@ static int drmParsePciDeviceInfo(const char *d_name,
     unsigned char config[64];
     int fd, ret;
 
-    snprintf(path, PATH_MAX, "/sys/class/drm/%s/device/config", d_name);
+    snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/config", maj, min);
     fd = open(path, O_RDONLY);
     if (fd < 0)
         return -errno;
@@ -2998,7 +2998,7 @@ void drmFreeDevices(drmDevicePtr devices[], int count)
             drmFreeDevice(&devices[i]);
 }
 
-static int drmProcessPciDevice(drmDevicePtr *device, const char *d_name,
+static int drmProcessPciDevice(drmDevicePtr *device,
                                const char *node, int node_type,
                                int maj, int min, bool fetch_deviceinfo)
 {
@@ -3039,7 +3039,7 @@ static int drmProcessPciDevice(drmDevicePtr *device, const char *d_name,
         addr += sizeof(drmPciBusInfo);
         (*device)->deviceinfo.pci = (drmPciDeviceInfoPtr)addr;
 
-        ret = drmParsePciDeviceInfo(d_name, (*device)->deviceinfo.pci);
+        ret = drmParsePciDeviceInfo(maj, min, (*device)->deviceinfo.pci);
         if (ret)
             goto free_device;
     }
@@ -3142,8 +3142,7 @@ int drmGetDevice(int fd, drmDevicePtr *device)
 
         switch (subsystem_type) {
         case DRM_BUS_PCI:
-            ret = drmProcessPciDevice(&d, dent->d_name, node, node_type,
-                                      maj, min, true);
+            ret = drmProcessPciDevice(&d, node, node_type, maj, min, true);
             if (ret)
                 goto free_devices;
 
@@ -3251,7 +3250,7 @@ int drmGetDevices(drmDevicePtr devices[], int max_devices)
 
         switch (subsystem_type) {
         case DRM_BUS_PCI:
-            ret = drmProcessPciDevice(&device, dent->d_name, node, node_type,
+            ret = drmProcessPciDevice(&device, node, node_type,
                                       maj, min, devices != NULL);
             if (ret)
                 goto free_devices;
-- 
2.10.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH libdrm 2/5] xf86drm: add plumbing to not retrieve PCI device revision
  2016-11-30 20:35 [PATCH libdrm 1/5] xf86drm: use maj/min in drmParsePciDeviceInfo() Emil Velikov
@ 2016-11-30 20:35 ` Emil Velikov
  2016-11-30 20:35 ` [PATCH libdrm 3/5] xf86drm: parse the separate sysfs files for vendor... info Emil Velikov
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 9+ messages in thread
From: Emil Velikov @ 2016-11-30 20:35 UTC (permalink / raw)
  To: dri-devel; +Cc: Mauro Santos, Michel Dänzer, emil.l.velikov

From: Emil Velikov <emil.velikov@collabora.com>

Will be used with the drmGetDevice[s]2 API.

Cc: Michel Dänzer <michel@daenzer.net>
Cc: Nicolai Hähnle <nhaehnle@gmail.com>
Cc: Mauro Santos <registo.mailling@gmail.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98502
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
 xf86drm.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/xf86drm.c b/xf86drm.c
index c788c93..ddb8f9f 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2947,7 +2947,8 @@ static int drmGetMaxNodeName(void)
 }
 
 static int drmParsePciDeviceInfo(int maj, int min,
-                                 drmPciDeviceInfoPtr device)
+                                 drmPciDeviceInfoPtr device,
+                                 uint32_t flags)
 {
 #ifdef __linux__
     char path[PATH_MAX + 1];
@@ -3000,7 +3001,8 @@ void drmFreeDevices(drmDevicePtr devices[], int count)
 
 static int drmProcessPciDevice(drmDevicePtr *device,
                                const char *node, int node_type,
-                               int maj, int min, bool fetch_deviceinfo)
+                               int maj, int min, bool fetch_deviceinfo,
+                               uint32_t flags)
 {
     const int max_node_str = ALIGN(drmGetMaxNodeName(), sizeof(void *));
     int ret, i;
@@ -3039,7 +3041,7 @@ static int drmProcessPciDevice(drmDevicePtr *device,
         addr += sizeof(drmPciBusInfo);
         (*device)->deviceinfo.pci = (drmPciDeviceInfoPtr)addr;
 
-        ret = drmParsePciDeviceInfo(maj, min, (*device)->deviceinfo.pci);
+        ret = drmParsePciDeviceInfo(maj, min, (*device)->deviceinfo.pci, flags);
         if (ret)
             goto free_device;
     }
@@ -3095,6 +3097,7 @@ int drmGetDevice(int fd, drmDevicePtr *device)
     int ret, i, node_count;
     int max_count = 16;
     dev_t find_rdev;
+    uint32_t flags = 0;
 
     if (fd == -1 || device == NULL)
         return -EINVAL;
@@ -3142,7 +3145,7 @@ int drmGetDevice(int fd, drmDevicePtr *device)
 
         switch (subsystem_type) {
         case DRM_BUS_PCI:
-            ret = drmProcessPciDevice(&d, node, node_type, maj, min, true);
+            ret = drmProcessPciDevice(&d, node, node_type, maj, min, true, flags);
             if (ret)
                 goto free_devices;
 
@@ -3216,6 +3219,7 @@ int drmGetDevices(drmDevicePtr devices[], int max_devices)
     int maj, min;
     int ret, i, node_count, device_count;
     int max_count = 16;
+    uint32_t flags = 0;
 
     local_devices = calloc(max_count, sizeof(drmDevicePtr));
     if (local_devices == NULL)
@@ -3251,7 +3255,7 @@ int drmGetDevices(drmDevicePtr devices[], int max_devices)
         switch (subsystem_type) {
         case DRM_BUS_PCI:
             ret = drmProcessPciDevice(&device, node, node_type,
-                                      maj, min, devices != NULL);
+                                      maj, min, devices != NULL, flags);
             if (ret)
                 goto free_devices;
 
-- 
2.10.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH libdrm 3/5] xf86drm: parse the separate sysfs files for vendor... info
  2016-11-30 20:35 [PATCH libdrm 1/5] xf86drm: use maj/min in drmParsePciDeviceInfo() Emil Velikov
  2016-11-30 20:35 ` [PATCH libdrm 2/5] xf86drm: add plumbing to not retrieve PCI device revision Emil Velikov
@ 2016-11-30 20:35 ` Emil Velikov
  2016-11-30 20:35 ` [PATCH libdrm 4/5] xf86drm: introduce drmGetDevice[s]2 Emil Velikov
  2016-11-30 20:35 ` [PATCH libdrm 5/5] tests/drmdevice: use drmGetDevice[s]2 Emil Velikov
  3 siblings, 0 replies; 9+ messages in thread
From: Emil Velikov @ 2016-11-30 20:35 UTC (permalink / raw)
  To: dri-devel; +Cc: Mauro Santos, Michel Dänzer, emil.l.velikov

From: Emil Velikov <emil.velikov@collabora.com>

Up-to recently (patch should land in 4.10) the kernel did not expose the
PCI device revision field as a separate sysfs file.

Thus one needed too parse the config file to retrieve it. This in
itself wakes up the device, which in some cases can be quite slow.

To avoid that, just check for the separate files and fall-back to the
original if kernel is not new enough.

v3: rework alongside drmGetDevice[s]2

Cc: Michel Dänzer <michel@daenzer.net>
Cc: Nicolai Hähnle <nhaehnle@gmail.com>
Cc: Mauro Santos <registo.mailling@gmail.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98502
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
 xf86drm.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 54 insertions(+), 4 deletions(-)

diff --git a/xf86drm.c b/xf86drm.c
index ddb8f9f..701cf29 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2946,11 +2946,49 @@ static int drmGetMaxNodeName(void)
            3 /* length of the node number */;
 }
 
-static int drmParsePciDeviceInfo(int maj, int min,
-                                 drmPciDeviceInfoPtr device,
-                                 uint32_t flags)
-{
 #ifdef __linux__
+static int parse_separate_sysfs_files(int maj, int min,
+                                      drmPciDeviceInfoPtr device)
+{
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+    static const char *attrs[] = {
+      "revision", /* Older kernels are missing the file, so check for it first */
+      "vendor",
+      "device",
+      "subsystem_vendor",
+      "subsystem_device",
+    };
+    char path[PATH_MAX + 1];
+    unsigned int data[ARRAY_SIZE(attrs)];
+    FILE *fp;
+    int ret;
+
+    for (unsigned i = 0; i < ARRAY_SIZE(attrs); i++) {
+        snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/%s", maj, min,
+                 attrs[i]);
+        fp = fopen(path, "r");
+        if (!fp)
+            return -errno;
+
+        ret = fscanf(fp, "%x", &data[i]);
+        fclose(fp);
+        if (ret != 1)
+            return -errno;
+
+    }
+
+    device->revision_id = data[0] & 0xff;
+    device->vendor_id = data[1] & 0xffff;
+    device->device_id = data[2] & 0xffff;
+    device->subvendor_id = data[3] & 0xffff;
+    device->subdevice_id = data[4] & 0xffff;
+
+    return 0;
+}
+
+static int parse_config_sysfs_file(int maj, int min,
+                                   drmPciDeviceInfoPtr device)
+{
     char path[PATH_MAX + 1];
     unsigned char config[64];
     int fd, ret;
@@ -2972,6 +3010,18 @@ static int drmParsePciDeviceInfo(int maj, int min,
     device->subdevice_id = config[46] | (config[47] << 8);
 
     return 0;
+}
+#endif
+
+static int drmParsePciDeviceInfo(int maj, int min,
+                                 drmPciDeviceInfoPtr device,
+                                 uint32_t flags)
+{
+#ifdef __linux__
+    if (parse_separate_sysfs_files(maj, min, device))
+        return parse_config_sysfs_file(maj, min, device);
+
+    return 0;
 #else
 #warning "Missing implementation of drmParsePciDeviceInfo"
     return -EINVAL;
-- 
2.10.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH libdrm 4/5] xf86drm: introduce drmGetDevice[s]2
  2016-11-30 20:35 [PATCH libdrm 1/5] xf86drm: use maj/min in drmParsePciDeviceInfo() Emil Velikov
  2016-11-30 20:35 ` [PATCH libdrm 2/5] xf86drm: add plumbing to not retrieve PCI device revision Emil Velikov
  2016-11-30 20:35 ` [PATCH libdrm 3/5] xf86drm: parse the separate sysfs files for vendor... info Emil Velikov
@ 2016-11-30 20:35 ` Emil Velikov
  2016-12-01  3:09   ` Michel Dänzer
  2016-11-30 20:35 ` [PATCH libdrm 5/5] tests/drmdevice: use drmGetDevice[s]2 Emil Velikov
  3 siblings, 1 reply; 9+ messages in thread
From: Emil Velikov @ 2016-11-30 20:35 UTC (permalink / raw)
  To: dri-devel; +Cc: Mauro Santos, Michel Dänzer, emil.l.velikov

From: Emil Velikov <emil.velikov@collabora.com>

Relative to the original version, here one can provide a flags bitmask.
Currently only DRM_DEVICE_IGNORE_PCI_REVISION is supported.

Implementation detail:
If it's set, we will only parse the separate sysfs files and we won't
touch the config one. The latter awakes the device (causing delays)
which is the core reason why this API was introduced.

Cc: Michel Dänzer <michel@daenzer.net>
Cc: Nicolai Hähnle <nhaehnle@gmail.com>
Cc: Mauro Santos <registo.mailling@gmail.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98502
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
Michel, Nicolai any naming suggestions or input in general will be
appreciated.
---
 xf86drm.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
 xf86drm.h |  4 ++++
 2 files changed, 60 insertions(+), 8 deletions(-)

diff --git a/xf86drm.c b/xf86drm.c
index 701cf29..f117716 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2948,7 +2948,8 @@ static int drmGetMaxNodeName(void)
 
 #ifdef __linux__
 static int parse_separate_sysfs_files(int maj, int min,
-                                      drmPciDeviceInfoPtr device)
+                                      drmPciDeviceInfoPtr device,
+                                      bool ignore_revision)
 {
 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
     static const char *attrs[] = {
@@ -2963,7 +2964,7 @@ static int parse_separate_sysfs_files(int maj, int min,
     FILE *fp;
     int ret;
 
-    for (unsigned i = 0; i < ARRAY_SIZE(attrs); i++) {
+    for (unsigned i = (0 + !!ignore_revision); i < ARRAY_SIZE(attrs); i++) {
         snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/%s", maj, min,
                  attrs[i]);
         fp = fopen(path, "r");
@@ -2977,7 +2978,7 @@ static int parse_separate_sysfs_files(int maj, int min,
 
     }
 
-    device->revision_id = data[0] & 0xff;
+    device->revision_id = ignore_revision ? 0 : data[0] & 0xff;
     device->vendor_id = data[1] & 0xffff;
     device->device_id = data[2] & 0xffff;
     device->subvendor_id = data[3] & 0xffff;
@@ -3018,7 +3019,10 @@ static int drmParsePciDeviceInfo(int maj, int min,
                                  uint32_t flags)
 {
 #ifdef __linux__
-    if (parse_separate_sysfs_files(maj, min, device))
+    if (flags & DRM_DEVICE_IGNORE_PCI_REVISION)
+        return parse_separate_sysfs_files(maj, min, device, true);
+
+    if (parse_separate_sysfs_files(maj, min, device, false))
         return parse_config_sysfs_file(maj, min, device);
 
     return 0;
@@ -3125,16 +3129,24 @@ static void drmFoldDuplicatedDevices(drmDevicePtr local_devices[], int count)
     }
 }
 
+/* Check that the given flags are valid returning 0 on success */
+static int
+drm_device_validate_flags(uint32_t flags)
+{
+        return (flags & ~DRM_DEVICE_IGNORE_PCI_REVISION);
+}
+
 /**
  * Get information about the opened drm device
  *
  * \param fd file descriptor of the drm device
+ * \param flags feature/behaviour bitmask
  * \param device the address of a drmDevicePtr where the information
  *               will be allocated in stored
  *
  * \return zero on success, negative error code otherwise.
  */
-int drmGetDevice(int fd, drmDevicePtr *device)
+int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
 {
     drmDevicePtr *local_devices;
     drmDevicePtr d;
@@ -3147,7 +3159,9 @@ int drmGetDevice(int fd, drmDevicePtr *device)
     int ret, i, node_count;
     int max_count = 16;
     dev_t find_rdev;
-    uint32_t flags = 0;
+
+    if (drm_device_validate_flags(flags))
+        return -EINVAL;
 
     if (fd == -1 || device == NULL)
         return -EINVAL;
@@ -3246,8 +3260,23 @@ free_locals:
 }
 
 /**
+ * Get information about the opened drm device
+ *
+ * \param fd file descriptor of the drm device
+ * \param device the address of a drmDevicePtr where the information
+ *               will be allocated in stored
+ *
+ * \return zero on success, negative error code otherwise.
+ */
+int drmGetDevice(int fd, drmDevicePtr *device)
+{
+    return drmGetDevice2(fd, 0, device);
+}
+
+/**
  * Get drm devices on the system
  *
+ * \param flags feature/behaviour bitmask
  * \param devices the array of devices with drmDevicePtr elements
  *                can be NULL to get the device number first
  * \param max_devices the maximum number of devices for the array
@@ -3257,7 +3286,7 @@ free_locals:
  *         alternatively the number of devices stored in devices[], which is
  *         capped by the max_devices.
  */
-int drmGetDevices(drmDevicePtr devices[], int max_devices)
+int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
 {
     drmDevicePtr *local_devices;
     drmDevicePtr device;
@@ -3269,7 +3298,9 @@ int drmGetDevices(drmDevicePtr devices[], int max_devices)
     int maj, min;
     int ret, i, node_count, device_count;
     int max_count = 16;
-    uint32_t flags = 0;
+
+    if (drm_device_validate_flags(flags))
+        return -EINVAL;
 
     local_devices = calloc(max_count, sizeof(drmDevicePtr));
     if (local_devices == NULL)
@@ -3357,6 +3388,23 @@ free_locals:
     return ret;
 }
 
+/**
+ * Get drm devices on the system
+ *
+ * \param devices the array of devices with drmDevicePtr elements
+ *                can be NULL to get the device number first
+ * \param max_devices the maximum number of devices for the array
+ *
+ * \return on error - negative error code,
+ *         if devices is NULL - total number of devices available on the system,
+ *         alternatively the number of devices stored in devices[], which is
+ *         capped by the max_devices.
+ */
+int drmGetDevices(drmDevicePtr devices[], int max_devices)
+{
+    return drmGetDevices2(0, devices, max_devices);
+}
+
 char *drmGetDeviceNameFromFd2(int fd)
 {
 #ifdef __linux__
diff --git a/xf86drm.h b/xf86drm.h
index 4da6bd3..1c6ed36 100644
--- a/xf86drm.h
+++ b/xf86drm.h
@@ -801,6 +801,10 @@ extern void drmFreeDevice(drmDevicePtr *device);
 extern int drmGetDevices(drmDevicePtr devices[], int max_devices);
 extern void drmFreeDevices(drmDevicePtr devices[], int count);
 
+#define DRM_DEVICE_IGNORE_PCI_REVISION 0x0001
+extern int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device);
+extern int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices);
+
 #if defined(__cplusplus)
 }
 #endif
-- 
2.10.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH libdrm 5/5] tests/drmdevice: use drmGetDevice[s]2
  2016-11-30 20:35 [PATCH libdrm 1/5] xf86drm: use maj/min in drmParsePciDeviceInfo() Emil Velikov
                   ` (2 preceding siblings ...)
  2016-11-30 20:35 ` [PATCH libdrm 4/5] xf86drm: introduce drmGetDevice[s]2 Emil Velikov
@ 2016-11-30 20:35 ` Emil Velikov
  3 siblings, 0 replies; 9+ messages in thread
From: Emil Velikov @ 2016-11-30 20:35 UTC (permalink / raw)
  To: dri-devel; +Cc: emil.l.velikov

From: Emil Velikov <emil.velikov@collabora.com>

... alongside the DRM_DEVICE_IGNORE_PCI_REVISION flag.

Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
 tests/drmdevice.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/tests/drmdevice.c b/tests/drmdevice.c
index 72e7066..dcad527 100644
--- a/tests/drmdevice.c
+++ b/tests/drmdevice.c
@@ -70,7 +70,7 @@ main(void)
     drmDevicePtr device;
     int fd, ret, max_devices;
 
-    max_devices = drmGetDevices(NULL, 0);
+    max_devices = drmGetDevices2(DRM_DEVICE_IGNORE_PCI_REVISION, NULL, 0);
 
     if (max_devices <= 0) {
         printf("drmGetDevices() has returned %d\n", max_devices);
@@ -83,7 +83,7 @@ main(void)
         return -1;
     }
 
-    ret = drmGetDevices(devices, max_devices);
+    ret = drmGetDevices2(DRM_DEVICE_IGNORE_PCI_REVISION, devices, max_devices);
     if (ret < 0) {
         printf("drmGetDevices() returned an error %d\n", ret);
         free(devices);
@@ -102,7 +102,7 @@ main(void)
                     continue;
                 }
 
-                if (drmGetDevice(fd, &device) == 0) {
+                if (drmGetDevice2(fd, DRM_DEVICE_IGNORE_PCI_REVISION, &device) == 0) {
                     print_device_info(device, i);
                     drmFreeDevice(&device);
                 }
-- 
2.10.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH libdrm 4/5] xf86drm: introduce drmGetDevice[s]2
  2016-11-30 20:35 ` [PATCH libdrm 4/5] xf86drm: introduce drmGetDevice[s]2 Emil Velikov
@ 2016-12-01  3:09   ` Michel Dänzer
  2016-12-01  3:56     ` Michel Dänzer
  0 siblings, 1 reply; 9+ messages in thread
From: Michel Dänzer @ 2016-12-01  3:09 UTC (permalink / raw)
  To: Emil Velikov, dri-devel; +Cc: Mauro Santos

On 01/12/16 05:35 AM, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
> 
> Relative to the original version, here one can provide a flags bitmask.
> Currently only DRM_DEVICE_IGNORE_PCI_REVISION is supported.
> 
> Implementation detail:
> If it's set, we will only parse the separate sysfs files and we won't
> touch the config one. The latter awakes the device (causing delays)
> which is the core reason why this API was introduced.
> 
> Cc: Michel Dänzer <michel@daenzer.net>
> Cc: Nicolai Hähnle <nhaehnle@gmail.com>
> Cc: Mauro Santos <registo.mailling@gmail.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98502
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
> ---
> Michel, Nicolai any naming suggestions or input in general will be
> appreciated.

It all looks good to me in general, thanks for doing this! I just have
a couple of minor suggestions for this patch which might make the code
clearer, feel free to take them or leave them. Either way, patches 3-5
are

Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>


> @@ -2963,7 +2964,7 @@ static int parse_separate_sysfs_files(int maj, int min,
>      FILE *fp;
>      int ret;
>  
> -    for (unsigned i = 0; i < ARRAY_SIZE(attrs); i++) {
> +    for (unsigned i = (0 + !!ignore_revision); i < ARRAY_SIZE(attrs); i++) {

    for (unsigned i = ignore_revision ? 1 : 0; i < ARRAY_SIZE(attrs); i++) {


> diff --git a/xf86drm.h b/xf86drm.h
> index 4da6bd3..1c6ed36 100644
> --- a/xf86drm.h
> +++ b/xf86drm.h
> @@ -801,6 +801,10 @@ extern void drmFreeDevice(drmDevicePtr *device);
>  extern int drmGetDevices(drmDevicePtr devices[], int max_devices);
>  extern void drmFreeDevices(drmDevicePtr devices[], int count);
>  
> +#define DRM_DEVICE_IGNORE_PCI_REVISION 0x0001

#define DRM_DEVICE_IGNORE_PCI_REVISION (1 << 0)

to make it clearer that flags will be separate bits, not enumeration values.


-- 
Earthling Michel Dänzer               |               http://www.amd.com
Libre software enthusiast             |             Mesa and X developer
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH libdrm 4/5] xf86drm: introduce drmGetDevice[s]2
  2016-12-01  3:09   ` Michel Dänzer
@ 2016-12-01  3:56     ` Michel Dänzer
  2016-12-01 13:35       ` Emil Velikov
  0 siblings, 1 reply; 9+ messages in thread
From: Michel Dänzer @ 2016-12-01  3:56 UTC (permalink / raw)
  To: Emil Velikov, dri-devel; +Cc: Mauro Santos

On 01/12/16 12:09 PM, Michel Dänzer wrote:
> On 01/12/16 05:35 AM, Emil Velikov wrote:
>> From: Emil Velikov <emil.velikov@collabora.com>
>>
>> Relative to the original version, here one can provide a flags bitmask.
>> Currently only DRM_DEVICE_IGNORE_PCI_REVISION is supported.
>>
>> Implementation detail:
>> If it's set, we will only parse the separate sysfs files and we won't
>> touch the config one. The latter awakes the device (causing delays)
>> which is the core reason why this API was introduced.
>>
>> Cc: Michel Dänzer <michel@daenzer.net>
>> Cc: Nicolai Hähnle <nhaehnle@gmail.com>
>> Cc: Mauro Santos <registo.mailling@gmail.com>
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98502
>> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
>> ---
>> Michel, Nicolai any naming suggestions or input in general will be
>> appreciated.
> 
> It all looks good to me in general, thanks for doing this! I just have
> a couple of minor suggestions for this patch which might make the code
> clearer, feel free to take them or leave them. Either way, patches 3-5
> are
> 
> Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>

On further thought, I wonder if maybe drmGetDevice[s]2 should default to
not retrieving the PCI revision, unless a flag is set, say
DRM_DEVICE_GET_PCI_REVISION? That would avoid unnecessarily using the
config file if the caller forgets to set the flag even though it doesn't
need the revision.

Though in that case, maybe the revision_id field should also be set to
0xff without the flag, to avoid callers forgetting to set the flag and
getting an incorrect but plausible(?) 0 for the revision.


-- 
Earthling Michel Dänzer               |               http://www.amd.com
Libre software enthusiast             |             Mesa and X developer
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH libdrm 4/5] xf86drm: introduce drmGetDevice[s]2
  2016-12-01  3:56     ` Michel Dänzer
@ 2016-12-01 13:35       ` Emil Velikov
  0 siblings, 0 replies; 9+ messages in thread
From: Emil Velikov @ 2016-12-01 13:35 UTC (permalink / raw)
  To: Michel Dänzer; +Cc: Mauro Santos, ML dri-devel

On 1 December 2016 at 03:56, Michel Dänzer <michel@daenzer.net> wrote:
> On 01/12/16 12:09 PM, Michel Dänzer wrote:
>> On 01/12/16 05:35 AM, Emil Velikov wrote:
>>> From: Emil Velikov <emil.velikov@collabora.com>
>>>
>>> Relative to the original version, here one can provide a flags bitmask.
>>> Currently only DRM_DEVICE_IGNORE_PCI_REVISION is supported.
>>>
>>> Implementation detail:
>>> If it's set, we will only parse the separate sysfs files and we won't
>>> touch the config one. The latter awakes the device (causing delays)
>>> which is the core reason why this API was introduced.
>>>
>>> Cc: Michel Dänzer <michel@daenzer.net>
>>> Cc: Nicolai Hähnle <nhaehnle@gmail.com>
>>> Cc: Mauro Santos <registo.mailling@gmail.com>
>>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98502
>>> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
>>> ---
>>> Michel, Nicolai any naming suggestions or input in general will be
>>> appreciated.
>>
>> It all looks good to me in general, thanks for doing this! I just have
>> a couple of minor suggestions for this patch which might make the code
>> clearer, feel free to take them or leave them. Either way, patches 3-5
>> are
>>
>> Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
>
> On further thought, I wonder if maybe drmGetDevice[s]2 should default to
> not retrieving the PCI revision, unless a flag is set, say
> DRM_DEVICE_GET_PCI_REVISION? That would avoid unnecessarily using the
> config file if the caller forgets to set the flag even though it doesn't
> need the revision.
>
Not 100% sold on the reasoning (if someone forgets...) yet making the
revision opt-in (as opposed to opt-out) makes sense.

> Though in that case, maybe the revision_id field should also be set to
> 0xff without the flag, to avoid callers forgetting to set the flag and
> getting an incorrect but plausible(?) 0 for the revision.
>
All suggestions sound amazing, thank you !

Barring any objections, I'll re-spin the series and send one for Mesa
later on today.

Thanks again,
Emil
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH libdrm 2/5] xf86drm: add plumbing to not retrieve PCI device revision
  2016-12-02 16:32 [PATCH libdrm 1/5] xf86drm: use maj/min in drmParsePciDeviceInfo() Emil Velikov
@ 2016-12-02 16:32 ` Emil Velikov
  0 siblings, 0 replies; 9+ messages in thread
From: Emil Velikov @ 2016-12-02 16:32 UTC (permalink / raw)
  To: dri-devel; +Cc: Mauro Santos, Michel Dänzer, emil.l.velikov

From: Emil Velikov <emil.velikov@collabora.com>

Will be used with the drmGetDevice[s]2 API.

Cc: Michel Dänzer <michel@daenzer.net>
Cc: Nicolai Hähnle <nhaehnle@gmail.com>
Cc: Mauro Santos <registo.mailling@gmail.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98502
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
 xf86drm.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/xf86drm.c b/xf86drm.c
index c788c93..ddb8f9f 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2947,7 +2947,8 @@ static int drmGetMaxNodeName(void)
 }
 
 static int drmParsePciDeviceInfo(int maj, int min,
-                                 drmPciDeviceInfoPtr device)
+                                 drmPciDeviceInfoPtr device,
+                                 uint32_t flags)
 {
 #ifdef __linux__
     char path[PATH_MAX + 1];
@@ -3000,7 +3001,8 @@ void drmFreeDevices(drmDevicePtr devices[], int count)
 
 static int drmProcessPciDevice(drmDevicePtr *device,
                                const char *node, int node_type,
-                               int maj, int min, bool fetch_deviceinfo)
+                               int maj, int min, bool fetch_deviceinfo,
+                               uint32_t flags)
 {
     const int max_node_str = ALIGN(drmGetMaxNodeName(), sizeof(void *));
     int ret, i;
@@ -3039,7 +3041,7 @@ static int drmProcessPciDevice(drmDevicePtr *device,
         addr += sizeof(drmPciBusInfo);
         (*device)->deviceinfo.pci = (drmPciDeviceInfoPtr)addr;
 
-        ret = drmParsePciDeviceInfo(maj, min, (*device)->deviceinfo.pci);
+        ret = drmParsePciDeviceInfo(maj, min, (*device)->deviceinfo.pci, flags);
         if (ret)
             goto free_device;
     }
@@ -3095,6 +3097,7 @@ int drmGetDevice(int fd, drmDevicePtr *device)
     int ret, i, node_count;
     int max_count = 16;
     dev_t find_rdev;
+    uint32_t flags = 0;
 
     if (fd == -1 || device == NULL)
         return -EINVAL;
@@ -3142,7 +3145,7 @@ int drmGetDevice(int fd, drmDevicePtr *device)
 
         switch (subsystem_type) {
         case DRM_BUS_PCI:
-            ret = drmProcessPciDevice(&d, node, node_type, maj, min, true);
+            ret = drmProcessPciDevice(&d, node, node_type, maj, min, true, flags);
             if (ret)
                 goto free_devices;
 
@@ -3216,6 +3219,7 @@ int drmGetDevices(drmDevicePtr devices[], int max_devices)
     int maj, min;
     int ret, i, node_count, device_count;
     int max_count = 16;
+    uint32_t flags = 0;
 
     local_devices = calloc(max_count, sizeof(drmDevicePtr));
     if (local_devices == NULL)
@@ -3251,7 +3255,7 @@ int drmGetDevices(drmDevicePtr devices[], int max_devices)
         switch (subsystem_type) {
         case DRM_BUS_PCI:
             ret = drmProcessPciDevice(&device, node, node_type,
-                                      maj, min, devices != NULL);
+                                      maj, min, devices != NULL, flags);
             if (ret)
                 goto free_devices;
 
-- 
2.10.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2016-12-02 16:33 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-11-30 20:35 [PATCH libdrm 1/5] xf86drm: use maj/min in drmParsePciDeviceInfo() Emil Velikov
2016-11-30 20:35 ` [PATCH libdrm 2/5] xf86drm: add plumbing to not retrieve PCI device revision Emil Velikov
2016-11-30 20:35 ` [PATCH libdrm 3/5] xf86drm: parse the separate sysfs files for vendor... info Emil Velikov
2016-11-30 20:35 ` [PATCH libdrm 4/5] xf86drm: introduce drmGetDevice[s]2 Emil Velikov
2016-12-01  3:09   ` Michel Dänzer
2016-12-01  3:56     ` Michel Dänzer
2016-12-01 13:35       ` Emil Velikov
2016-11-30 20:35 ` [PATCH libdrm 5/5] tests/drmdevice: use drmGetDevice[s]2 Emil Velikov
  -- strict thread matches above, loose matches on Subject: below --
2016-12-02 16:32 [PATCH libdrm 1/5] xf86drm: use maj/min in drmParsePciDeviceInfo() Emil Velikov
2016-12-02 16:32 ` [PATCH libdrm 2/5] xf86drm: add plumbing to not retrieve PCI device revision Emil Velikov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).