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 at amd.com> > Signed-off-by: Jammy Zhou <Jammy.Zhou at 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