X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Floader%2Floader.c;h=fda49521aae4056214d54e9366acccc818cb64b9;hb=dd007d1c2ac6a50f799c7221fa1dd602e0261fde;hp=5541ccc2a746ef642763de773d4a4030e642d70a;hpb=a50c4eb2a0fd42a3da0eea560876cb43afdb81f2;p=mesa.git diff --git a/src/loader/loader.c b/src/loader/loader.c index 5541ccc2a74..fda49521aae 100644 --- a/src/loader/loader.c +++ b/src/loader/loader.c @@ -46,8 +46,8 @@ #ifdef HAVE_LIBDRM #include #ifdef USE_DRICONF -#include "xmlconfig.h" -#include "xmlpool.h" +#include "util/xmlconfig.h" +#include "util/xmlpool.h" #endif #endif @@ -110,18 +110,43 @@ static char *loader_get_dri_config_device_id(void) static char *drm_construct_id_path_tag(drmDevicePtr device) { -/* Length of "pci-xxxx_xx_xx_x\0" */ -#define PCI_ID_PATH_TAG_LENGTH 17 char *tag = NULL; if (device->bustype == DRM_BUS_PCI) { - tag = calloc(PCI_ID_PATH_TAG_LENGTH, sizeof(char)); - if (tag == NULL) - return NULL; + if (asprintf(&tag, "pci-%04x_%02x_%02x_%1u", + device->businfo.pci->domain, + device->businfo.pci->bus, + device->businfo.pci->dev, + device->businfo.pci->func) < 0) { + return NULL; + } + } else if (device->bustype == DRM_BUS_PLATFORM || + device->bustype == DRM_BUS_HOST1X) { + char *fullname, *name, *address; + + if (device->bustype == DRM_BUS_PLATFORM) + fullname = device->businfo.platform->fullname; + else + fullname = device->businfo.host1x->fullname; + + name = strrchr(fullname, '/'); + if (!name) + name = strdup(fullname); + else + name = strdup(name + 1); + + address = strchr(name, '@'); + if (address) { + *address++ = '\0'; + + if (asprintf(&tag, "platform-%s_%s", address, name) < 0) + tag = NULL; + } else { + if (asprintf(&tag, "platform-%s", name) < 0) + tag = NULL; + } - snprintf(tag, PCI_ID_PATH_TAG_LENGTH, "pci-%04x_%02x_%02x_%1u", - device->businfo.pci->domain, device->businfo.pci->bus, - device->businfo.pci->dev, device->businfo.pci->func); + free(name); } return tag; } @@ -153,7 +178,7 @@ static char *drm_get_id_path_tag_for_fd(int fd) return tag; } -int loader_get_user_preferred_fd(int default_fd, int *different_device) +int loader_get_user_preferred_fd(int default_fd, bool *different_device) { /* Arbitrary "maximum" value of drm devices. */ #define MAX_DRM_DEVICES 32 @@ -171,7 +196,7 @@ int loader_get_user_preferred_fd(int default_fd, int *different_device) #endif if (prime == NULL) { - *different_device = 0; + *different_device = false; return default_fd; } @@ -230,43 +255,20 @@ int loader_get_user_preferred_fd(int default_fd, int *different_device) return fd; err: - *different_device = 0; + *different_device = false; free(default_tag); free(prime); return default_fd; } #else -int loader_get_user_preferred_fd(int default_fd, int *different_device) +int loader_get_user_preferred_fd(int default_fd, bool *different_device) { - *different_device = 0; + *different_device = false; return default_fd; } #endif -#if defined(HAVE_LIBDRM) -static int -dev_node_from_fd(int fd, unsigned int *maj, unsigned int *min) -{ - struct stat buf; - - if (fstat(fd, &buf) < 0) { - log_(_LOADER_WARNING, "MESA-LOADER: failed to stat fd %d\n", fd); - return -1; - } - - if (!S_ISCHR(buf.st_mode)) { - log_(_LOADER_WARNING, "MESA-LOADER: fd %d not a character device\n", fd); - return -1; - } - - *maj = major(buf.st_rdev); - *min = minor(buf.st_rdev); - - return 0; -} -#endif - #if defined(HAVE_LIBDRM) static int @@ -307,35 +309,15 @@ loader_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id) return 0; } - -#if defined(HAVE_LIBDRM) -static char * -drm_get_device_name_for_fd(int fd) -{ - unsigned int maj, min; - char buf[0x40]; - int n; - - if (dev_node_from_fd(fd, &maj, &min) < 0) - return NULL; - - n = snprintf(buf, sizeof(buf), DRM_DEV_NAME, DRM_DIR_NAME, min); - if (n == -1 || n >= sizeof(buf)) - return NULL; - - return strdup(buf); -} -#endif - char * loader_get_device_name_for_fd(int fd) { char *result = NULL; #if HAVE_LIBDRM - if ((result = drm_get_device_name_for_fd(fd))) - return result; + result = drmGetDeviceNameFromFd2(fd); #endif + return result; } @@ -426,8 +408,8 @@ loader_get_extensions_name(const char *driver_name) const size_t len = strlen(name); for (size_t i = 0; i < len; i++) { - if (name[i] == '-') - name[i] = '_'; + if (name[i] == '-') + name[i] = '_'; } return name;