static int drm_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id) { 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 { log_(_LOADER_WARNING, "MESA-LOADER: device is not located on the PCI bus\n"); ret = 0; } drmFreeDevice(&device); } else { log_(_LOADER_WARNING, "MESA-LOADER: failed to retrieve device information\n"); ret = 0; } return ret; }
static char *drm_get_id_path_tag_for_fd(int fd) { drmDevicePtr device; char *tag; if (drmGetDevice(fd, &device) != 0) return NULL; tag = drm_construct_id_path_tag(device); drmFreeDevice(&device); return tag; }
int main(void) { drmDevicePtr *devices; drmDevicePtr device; int fd, ret, max_devices; max_devices = drmGetDevices(NULL, 0); if (max_devices <= 0) { printf("drmGetDevices() has returned %d\n", max_devices); return -1; } devices = calloc(max_devices, sizeof(drmDevicePtr)); if (devices == NULL) { printf("Failed to allocate memory for the drmDevicePtr array\n"); return -1; } ret = drmGetDevices(devices, max_devices); if (ret < 0) { printf("drmGetDevices() returned an error %d\n", ret); free(devices); return -1; } for (int i = 0; i < ret; i++) { print_device_info(devices[i], i); for (int j = 0; j < DRM_NODE_MAX; j++) { if (devices[i]->available_nodes & 1 << j) { printf("Opening device %d node %s\n", i, devices[i]->nodes[j]); fd = open(devices[i]->nodes[j], O_RDONLY | O_CLOEXEC, 0); if (fd < 0) { printf("Failed - %s (%d)\n", strerror(errno), errno); continue; } if (drmGetDevice(fd, &device) == 0) { print_device_info(device, i); drmFreeDevice(&device); } close(fd); } } } drmFreeDevices(devices, ret); free(devices); return 0; }
/* Helper function to do the ioctls needed for setup and init. */ static boolean do_winsys_init(struct amdgpu_winsys *ws, int fd) { struct amdgpu_buffer_size_alignments alignment_info = {}; struct amdgpu_heap_info vram, gtt; struct drm_amdgpu_info_hw_ip dma = {}, uvd = {}, vce = {}; uint32_t vce_version = 0, vce_feature = 0; int r, i, j; drmDevicePtr devinfo; /* Get PCI info. */ r = drmGetDevice(fd, &devinfo); if (r) { fprintf(stderr, "amdgpu: drmGetDevice failed.\n"); goto fail; } ws->info.pci_domain = devinfo->businfo.pci->domain; ws->info.pci_bus = devinfo->businfo.pci->bus; ws->info.pci_dev = devinfo->businfo.pci->dev; ws->info.pci_func = devinfo->businfo.pci->func; drmFreeDevice(&devinfo); /* Query hardware and driver information. */ r = amdgpu_query_gpu_info(ws->dev, &ws->amdinfo); if (r) { fprintf(stderr, "amdgpu: amdgpu_query_gpu_info failed.\n"); goto fail; } r = amdgpu_query_buffer_size_alignment(ws->dev, &alignment_info); if (r) { fprintf(stderr, "amdgpu: amdgpu_query_buffer_size_alignment failed.\n"); goto fail; } r = amdgpu_query_heap_info(ws->dev, AMDGPU_GEM_DOMAIN_VRAM, 0, &vram); if (r) { fprintf(stderr, "amdgpu: amdgpu_query_heap_info(vram) failed.\n"); goto fail; } r = amdgpu_query_heap_info(ws->dev, AMDGPU_GEM_DOMAIN_GTT, 0, >t); if (r) { fprintf(stderr, "amdgpu: amdgpu_query_heap_info(gtt) failed.\n"); goto fail; } r = amdgpu_query_hw_ip_info(ws->dev, AMDGPU_HW_IP_DMA, 0, &dma); if (r) { fprintf(stderr, "amdgpu: amdgpu_query_hw_ip_info(dma) failed.\n"); goto fail; } r = amdgpu_query_hw_ip_info(ws->dev, AMDGPU_HW_IP_UVD, 0, &uvd); if (r) { fprintf(stderr, "amdgpu: amdgpu_query_hw_ip_info(uvd) failed.\n"); goto fail; } r = amdgpu_query_hw_ip_info(ws->dev, AMDGPU_HW_IP_VCE, 0, &vce); if (r) { fprintf(stderr, "amdgpu: amdgpu_query_hw_ip_info(vce) failed.\n"); goto fail; } r = amdgpu_query_firmware_version(ws->dev, AMDGPU_INFO_FW_VCE, 0, 0, &vce_version, &vce_feature); if (r) { fprintf(stderr, "amdgpu: amdgpu_query_firmware_version(vce) failed.\n"); goto fail; } /* Set chip identification. */ ws->info.pci_id = ws->amdinfo.asic_id; /* TODO: is this correct? */ ws->info.vce_harvest_config = ws->amdinfo.vce_harvest_config; switch (ws->info.pci_id) { #define CHIPSET(pci_id, name, cfamily) case pci_id: ws->info.family = CHIP_##cfamily; break; #include "pci_ids/radeonsi_pci_ids.h" #undef CHIPSET default: fprintf(stderr, "amdgpu: Invalid PCI ID.\n"); goto fail; } if (ws->info.family >= CHIP_TONGA) ws->info.chip_class = VI; else if (ws->info.family >= CHIP_BONAIRE) ws->info.chip_class = CIK; else { fprintf(stderr, "amdgpu: Unknown family.\n"); goto fail; } /* LLVM 3.6.1 is required for VI. */ if (ws->info.chip_class >= VI && HAVE_LLVM == 0x0306 && MESA_LLVM_VERSION_PATCH < 1) { fprintf(stderr, "amdgpu: LLVM 3.6.1 is required, got LLVM %i.%i.%i\n", HAVE_LLVM >> 8, HAVE_LLVM & 255, MESA_LLVM_VERSION_PATCH); goto fail; }