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@xxxxxxx> Signed-off-by: Jammy Zhou <Jammy.Zhou@xxxxxxx> (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)) && + ((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(); + return count; +} diff --git a/xf86drm.h b/xf86drm.h index 40c55c9..6150e71 100644 --- a/xf86drm.h +++ b/xf86drm.h @@ -752,6 +752,24 @@ extern int drmPrimeFDToHandle(int fd, int prime_fd, uint32_t *handle); extern char *drmGetPrimaryDeviceNameFromFd(int fd); extern char *drmGetRenderDeviceNameFromFd(int fd); +/** + * Structure for a general pcie gpu device + */ +typedef struct _drmDevice { + uint16_t domain; + uint8_t bus; + uint8_t dev; + uint8_t func; + uint8_t revision_id; + uint16_t vendor_id; + uint16_t device_id; + uint16_t subvendor_id; + uint16_t subdevice_id; +} drmDevice, *drmDevicePtr; + + +extern int drmGetDevices(drmDevicePtr devs, uint16_t vendor); + #if defined(__cplusplus) || defined(c_plusplus) } #endif -- 1.9.1 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel