bool pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, int fd, boolean auth_x) { struct pipe_loader_drm_device *ddev = CALLOC_STRUCT(pipe_loader_drm_device); int vendor_id, chip_id; if (!ddev) return false; if (loader_get_pci_id_for_fd(fd, &vendor_id, &chip_id)) { ddev->base.type = PIPE_LOADER_DEVICE_PCI; ddev->base.u.pci.vendor_id = vendor_id; ddev->base.u.pci.chip_id = chip_id; } else { ddev->base.type = PIPE_LOADER_DEVICE_PLATFORM; } ddev->base.ops = &pipe_loader_drm_ops; ddev->fd = fd; if (auth_x) pipe_loader_drm_x_auth(fd); ddev->base.driver_name = loader_get_driver_for_fd(fd, _LOADER_GALLIUM); if (!ddev->base.driver_name) goto fail; *dev = &ddev->base; return true; fail: FREE(ddev); return false; }
char * loader_get_driver_for_fd(int fd, unsigned driver_types) { int vendor_id, chip_id, i, j; char *driver = NULL; if (!driver_types) driver_types = _LOADER_GALLIUM | _LOADER_DRI; if (!loader_get_pci_id_for_fd(fd, &vendor_id, &chip_id)) { #ifndef __NOT_HAVE_DRM_H /* fallback to drmGetVersion(): */ drmVersionPtr version = drmGetVersion(fd); if (!version) { log_(_LOADER_WARNING, "failed to get driver name for fd %d\n", fd); return NULL; } driver = strndup(version->name, version->name_len); log_(_LOADER_INFO, "using driver %s for %d\n", driver, fd); drmFreeVersion(version); #endif return driver; } for (i = 0; driver_map[i].driver; i++) { if (vendor_id != driver_map[i].vendor_id) continue; if (!(driver_types & driver_map[i].driver_types)) continue; if (driver_map[i].predicate && !driver_map[i].predicate(fd)) continue; if (driver_map[i].num_chips_ids == -1) { driver = strdup(driver_map[i].driver); goto out; } for (j = 0; j < driver_map[i].num_chips_ids; j++) if (driver_map[i].chip_ids[j] == chip_id) { driver = strdup(driver_map[i].driver); goto out; } } out: log_(driver ? _LOADER_DEBUG : _LOADER_WARNING, "pci id for fd %d: %04x:%04x, driver %s\n", fd, vendor_id, chip_id, driver); return driver; }
static INLINE void get_bus_info( int fd, DWORD *vendorid, DWORD *deviceid, DWORD *subsysid, DWORD *revision ) { int vid, did; if (loader_get_pci_id_for_fd(fd, &vid, &did)) { DBG("PCI info: vendor=0x%04x, device=0x%04x\n", vid, did); *vendorid = vid; *deviceid = did; *subsysid = 0; *revision = 0; } else { DBG("Unable to detect card. Fake GTX 680.\n"); *vendorid = 0x10de; /* NV GTX 680 */ *deviceid = 0x1180; *subsysid = 0; *revision = 0; } }
static inline void get_bus_info( int fd, DWORD *vendorid, DWORD *deviceid, DWORD *subsysid, DWORD *revision ) { int vid, did; if (loader_get_pci_id_for_fd(fd, &vid, &did)) { DBG("PCI info: vendor=0x%04x, device=0x%04x\n", vid, did); *vendorid = vid; *deviceid = did; *subsysid = 0; *revision = 0; } else { DBG("Unable to detect card. Faking %s\n", fallback_cards[0].name); *vendorid = fallback_cards[0].vendor_id; *deviceid = fallback_cards[0].device_id; *subsysid = 0; *revision = 0; } }
static inline void get_bus_info( int fd, DWORD *vendorid, DWORD *deviceid, DWORD *subsysid, DWORD *revision ) { int vid, did; if (loader_get_pci_id_for_fd(fd, &vid, &did)) { DBG("PCI info: vendor=0x%04x, device=0x%04x\n", vid, did); *vendorid = vid; *deviceid = did; *subsysid = 0; *revision = 0; } else { DBG("Unable to detect card. Faking %s\n", FALLBACK_NAME); *vendorid = FALLBACK_VENID; *deviceid = FALLBACK_DEVID; *subsysid = 0; *revision = 0; } }