[Mesa-dev] [PATCH 02/16] loader: slim down loader_get_pci_id_for_fd implementation(s)
Nicolai Hähnle
nhaehnle at gmail.com
Tue Oct 18 08:35:28 UTC 2016
On 11.10.2016 20:31, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov at collabora.com>
>
> Currently mesa has three code paths in the loader - libudev, manual
> sysfs and drm ioctl one.
>
> Considering the issues we had with libudev - strip those down in favour
> of the libdrm drm device API. The latter can be implemented in any way
> depending on the platform and can be reused by others.
>
> Cc: Jonathan Gray <jsg at jsg.id.au>
> Cc: Jean-Sébastien Pédron <dumbbell at FreeBSD.org>
> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
> ---
> Jonathan, Jean-Sébastien I believe I've prodded you guys for a *BSD
> implementation of the drm*Device API a while back. With this commit
> you'll be 'forced' to prep some ;-)
>
> About the implementation itself feel free to use libudev/equivalent (we
> cannot do so on Linux, since due to fun interactions with Steam's one)
> or any other means available on your platform. Fwiw I would strongly
> suggest _against_ adding DRM specific ioctls just for this purpose but
> at the end of the day it's your code/userbase.
>
> On the FreeBSD/DragonFly side this means that you no londer require a
> handful of patches for mesa, which is always a plus.
> ---
> src/loader/loader.c | 172 +++++-----------------------------------------------
> 1 file changed, 16 insertions(+), 156 deletions(-)
>
> diff --git a/src/loader/loader.c b/src/loader/loader.c
> index 3e60e4c..41ea016 100644
> --- a/src/loader/loader.c
> +++ b/src/loader/loader.c
[snip]
> static int
> drm_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id)
> {
> - drmVersionPtr version;
> -
> - *chip_id = -1;
> -
> - version = drmGetVersion(fd);
> - if (!version) {
> - log_(_LOADER_WARNING, "MESA-LOADER: invalid drm fd\n");
> - return 0;
> - }
> - if (!version->name) {
> - log_(_LOADER_WARNING, "MESA-LOADER: unable to determine the driver name\n");
> - drmFreeVersion(version);
> - return 0;
> - }
> -
> - if (strcmp(version->name, "i915") == 0) {
> - struct drm_i915_getparam gp;
> - int ret;
> -
> - *vendor_id = 0x8086;
> -
> - memset(&gp, 0, sizeof(gp));
> - gp.param = I915_PARAM_CHIPSET_ID;
> - gp.value = chip_id;
> - ret = drmCommandWriteRead(fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
> - if (ret) {
> - log_(_LOADER_WARNING, "MESA-LOADER: failed to get param for i915\n");
> - *chip_id = -1;
> + drmDevicePtr device;
> + int ret;
> +
> + if (drmGetDevice(fd, &device) == 0) {
> + if (device->bustype == DRM_BUS_PCI) {
> + *vendor_id = device->deviceinfo.pci->vendor_id;
> + *chip_id = device->deviceinfo.pci->device_id;
> + ret = 1;
> }
> - }
> - else if (strcmp(version->name, "radeon") == 0) {
> - struct drm_radeon_info info;
> - int ret;
> -
> - *vendor_id = 0x1002;
> -
> - memset(&info, 0, sizeof(info));
> - info.request = RADEON_INFO_DEVICE_ID;
> - info.value = (unsigned long) chip_id;
> - ret = drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info));
> - if (ret) {
> - log_(_LOADER_WARNING, "MESA-LOADER: failed to get info for radeon\n");
> - *chip_id = -1;
> + else {
> + log_(_LOADER_WARNING, "MESA-LOADER: device is not located on the PCI bus\n");
> + ret = 0;
> }
> + drmFreeDevice(&device);
> }
> - else if (strcmp(version->name, "nouveau") == 0) {
> - *vendor_id = 0x10de;
> - /* not used */
> - *chip_id = 0;
> - }
> - else if (strcmp(version->name, "vmwgfx") == 0) {
> - *vendor_id = 0x15ad;
> - /* assume SVGA II */
> - *chip_id = 0x0405;
> + else {
> + log_(_LOADER_WARNING, "MESA-LOADER: device is not located on the PCI bus\n");
> + ret = 0;
> }
This should probably be a different error/warning message.
Nicolai
>
> - drmFreeVersion(version);
> -
> - return (*chip_id >= 0);
> + return ret;
> }
> #endif
>
> @@ -585,14 +453,6 @@ drm_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id)
> int
> loader_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id)
> {
> -#if HAVE_LIBUDEV
> - if (libudev_get_pci_id_for_fd(fd, vendor_id, chip_id))
> - return 1;
> -#endif
> -#if HAVE_SYSFS
> - if (sysfs_get_pci_id_for_fd(fd, vendor_id, chip_id))
> - return 1;
> -#endif
> #if HAVE_LIBDRM
> if (drm_get_pci_id_for_fd(fd, vendor_id, chip_id))
> return 1;
>
More information about the mesa-dev
mailing list