RE: [PATCH 1/2] Add device enumeration interface (v2)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Emil,

This interface is intended for multiple GPU support. For example, we need to know how many GPU devices are available on the system (and for some specific vendor) in the client drivers, and then we can select proper devices for rendering/compute/etc. For current mesa and Xserver implementations, the device enumeration is done separately. I think it will be helpful if we can have such kind of function in libdrm core, which can also be leveraged by other new APIs requiring multi GPU support.

> Any particular reason why "3D controller" (0x32000) is omitted ?
No. For AMD cards, we currently have 0x30000 and 0x38000. Is 0x32000 used by Nvidia cards? If so, I think we should add it as well.

> 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.
This interface is just to enumerate the PCIE GPU devices on the system. With regard to which ones are accessible, we can use drmOpen/drmOpenWithType to check, and I don't want to have duplicated functionalities for these interfaces. And for those non-PCIE platform devices (mostly on ARM platforms), this interface shouldn't be used, and instead the client drivers should handle it by themselves.

Regards,
Jammy

-----Original Message-----
From: Emil Velikov [mailto:emil.l.velikov@xxxxxxxxx] 
Sent: Tuesday, April 28, 2015 3:07 AM
To: Zhou, Jammy; dri-devel@xxxxxxxxxxxxxxxxxxxxx
Cc: emil.l.velikov@xxxxxxxxx; Min, Frank
Subject: Re: [PATCH 1/2] Add device enumeration interface (v2)

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@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)) &&
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
_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/dri-devel





[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux