anv: Implement VK_EXT_pci_bus_info

Even though the Intel GPU are always at the same PCI location, all the
info we need is already provided by libdrm. Let's be future proof.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
Lionel Landwerlin 2018-10-14 13:12:50 +01:00
parent 8550be7a2f
commit 322a919a41
3 changed files with 26 additions and 5 deletions

View File

@ -309,9 +309,10 @@ anv_physical_device_free_disk_cache(struct anv_physical_device *device)
static VkResult
anv_physical_device_init(struct anv_physical_device *device,
struct anv_instance *instance,
const char *primary_path,
const char *path)
drmDevicePtr drm_device)
{
const char *primary_path = drm_device->nodes[DRM_NODE_PRIMARY];
const char *path = drm_device->nodes[DRM_NODE_RENDER];
VkResult result;
int fd;
int master_fd = -1;
@ -342,6 +343,11 @@ anv_physical_device_init(struct anv_physical_device *device,
device->no_hw = true;
}
device->pci_info.domain = drm_device->businfo.pci->domain;
device->pci_info.bus = drm_device->businfo.pci->bus;
device->pci_info.device = drm_device->businfo.pci->dev;
device->pci_info.function = drm_device->businfo.pci->func;
device->name = gen_get_device_name(device->chipset_id);
if (!gen_get_device_info(device->chipset_id, &device->info)) {
result = vk_error(VK_ERROR_INCOMPATIBLE_DRIVER);
@ -729,9 +735,7 @@ anv_enumerate_devices(struct anv_instance *instance)
devices[i]->deviceinfo.pci->vendor_id == 0x8086) {
result = anv_physical_device_init(&instance->physicalDevice,
instance,
devices[i]->nodes[DRM_NODE_PRIMARY],
devices[i]->nodes[DRM_NODE_RENDER]);
instance, devices[i]);
if (result != VK_ERROR_INCOMPATIBLE_DRIVER)
break;
}
@ -1180,6 +1184,16 @@ void anv_GetPhysicalDeviceProperties2(
break;
}
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: {
VkPhysicalDevicePCIBusInfoPropertiesEXT *properties =
(VkPhysicalDevicePCIBusInfoPropertiesEXT *)ext;
properties->pciDomain = pdevice->pci_info.domain;
properties->pciBus = pdevice->pci_info.bus;
properties->pciDevice = pdevice->pci_info.device;
properties->pciFunction = pdevice->pci_info.function;
break;
}
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES: {
VkPhysicalDevicePointClippingProperties *properties =
(VkPhysicalDevicePointClippingProperties *) ext;

View File

@ -121,6 +121,7 @@ EXTENSIONS = [
Extension('VK_EXT_external_memory_dma_buf', 1, True),
Extension('VK_EXT_global_priority', 1,
'device->has_context_priority'),
Extension('VK_EXT_pci_bus_info', 1, True),
Extension('VK_EXT_shader_viewport_index_layer', 1, True),
Extension('VK_EXT_shader_stencil_export', 1, 'device->info.gen >= 9'),
Extension('VK_EXT_vertex_attribute_divisor', 3, True),

View File

@ -841,6 +841,12 @@ struct anv_physical_device {
bool no_hw;
char path[20];
const char * name;
struct {
uint16_t domain;
uint8_t bus;
uint8_t device;
uint8_t function;
} pci_info;
struct gen_device_info info;
/** Amount of "GPU memory" we want to advertise
*