Hi Jammy, Frank
As far as I can see you're trying to get a different version of drmGetBusid(). With the DRM_IOCTL_{G,S}ET_UNIQUE ioctl being lovely as it is I do see your point, but I'm not sure that the current design will be too useful.
Do we have any upcoming users for this new function, can you share a bit about the usecase ?
On 24/04/15 03:44, Jammy Zhou wrote:
drmGetDevices interface is added to enumernate GPU devices on the system
v2: rebase the code and some improvement for the coding style
Signed-off-by: Frank Min Frank.Min@amd.com Signed-off-by: Jammy Zhou Jammy.Zhou@amd.com (v2)
Makefile.am | 3 ++- xf86drm.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ xf86drm.h | 18 ++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-)
diff --git a/Makefile.am b/Makefile.am index 42d3d7f..8236ed8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -89,7 +89,8 @@ SUBDIRS = \ libdrm_la_LTLIBRARIES = libdrm.la libdrm_ladir = $(libdir) libdrm_la_LDFLAGS = -version-number 2:4:0 -no-undefined -libdrm_la_LIBADD = @CLOCK_LIB@ +libdrm_la_LIBADD = @CLOCK_LIB@ \
@PCIACCESS_LIBS@
libdrm_la_CPPFLAGS = -I$(top_srcdir)/include/drm AM_CFLAGS = \ diff --git a/xf86drm.c b/xf86drm.c index ffc53b8..4d67861 100644 --- a/xf86drm.c +++ b/xf86drm.c @@ -63,6 +63,7 @@
#include "xf86drm.h" #include "libdrm.h" +#include <pciaccess.h>
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) #define DRM_MAJOR 145 @@ -2817,3 +2818,50 @@ char *drmGetRenderDeviceNameFromFd(int fd) { return drmGetMinorNameForFD(fd, DRM_NODE_RENDER); }
+/**
- Enumerate the GPU devices on the system
- \param devs device array set to return the device information
- (if NULL, the number of device is returned)
- \param vendor the vendor ID for GPU devices to list
- (optional, if not specified, all GPU devices are returned)
- \return the number of GPU devices
- */
+int drmGetDevices(drmDevicePtr devs, uint16_t vendor) +{
- struct pci_device_iterator * iter;
- struct pci_device * dev;
- uint32_t count = 0;
- if (pci_system_init())
return -EINVAL;
- iter = pci_slot_match_iterator_create(NULL);
- if (!iter)
return -EINVAL;
- while ((dev = pci_device_next(iter))) {
if (((dev->device_class == 0x30000) ||
(dev->device_class == 0x38000)) &&
Any particular reason why "3D controller" (0x32000) is omitted ?
((vendor == 0) || (dev->vendor_id == vendor))){
if (devs) {
devs[count].domain = dev->domain;
devs[count].bus = dev->bus;
devs[count].dev = dev->dev;
devs[count].func = dev->func;
devs[count].vendor_id = dev->vendor_id;
devs[count].device_id = dev->device_id;
devs[count].subvendor_id = dev->subvendor_id;
devs[count].subdevice_id = dev->subdevice_id;
devs[count].revision_id = dev->revision;
}
count++;
}
- }
- pci_iterator_destroy(iter);
- pci_system_cleanup();
Using libpciaccess, will give you the number of PCI devices available on the system rather than the ones accessible - think about platform devices and/or devices without a drm driver.
Another solution will be to get the information based on the primary/control/render nodes available. This will also allow one to know what the device can be used for - be that via a separate parameter set by the function or having different functions altogether.
Cheers Emil