vfio/pci: Cache vendor and device ID
Simplify access to commonly referenced PCI vendor and device ID by caching it on the VFIOPCIDevice struct. Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
		
							parent
							
								
									c9c5000991
								
							
						
					
					
						commit
						ff635e3775
					
				@ -19,12 +19,8 @@
 | 
				
			|||||||
/* Use uin32_t for vendor & device so PCI_ANY_ID expands and cannot match hw */
 | 
					/* Use uin32_t for vendor & device so PCI_ANY_ID expands and cannot match hw */
 | 
				
			||||||
static bool vfio_pci_is(VFIOPCIDevice *vdev, uint32_t vendor, uint32_t device)
 | 
					static bool vfio_pci_is(VFIOPCIDevice *vdev, uint32_t vendor, uint32_t device)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    PCIDevice *pdev = &vdev->pdev;
 | 
					    return (vendor == PCI_ANY_ID || vendor == vdev->vendor_id) &&
 | 
				
			||||||
 | 
					           (device == PCI_ANY_ID || device == vdev->device_id);
 | 
				
			||||||
    return (vendor == PCI_ANY_ID ||
 | 
					 | 
				
			||||||
            vendor == pci_get_word(pdev->config + PCI_VENDOR_ID)) &&
 | 
					 | 
				
			||||||
           (device == PCI_ANY_ID ||
 | 
					 | 
				
			||||||
            device == pci_get_word(pdev->config + PCI_DEVICE_ID));
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool vfio_is_vga(VFIOPCIDevice *vdev)
 | 
					static bool vfio_is_vga(VFIOPCIDevice *vdev)
 | 
				
			||||||
@ -1178,15 +1174,9 @@ out:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void vfio_setup_resetfn_quirk(VFIOPCIDevice *vdev)
 | 
					void vfio_setup_resetfn_quirk(VFIOPCIDevice *vdev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    PCIDevice *pdev = &vdev->pdev;
 | 
					    switch (vdev->vendor_id) {
 | 
				
			||||||
    uint16_t vendor, device;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    vendor = pci_get_word(pdev->config + PCI_VENDOR_ID);
 | 
					 | 
				
			||||||
    device = pci_get_word(pdev->config + PCI_DEVICE_ID);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    switch (vendor) {
 | 
					 | 
				
			||||||
    case 0x1002:
 | 
					    case 0x1002:
 | 
				
			||||||
        switch (device) {
 | 
					        switch (vdev->device_id) {
 | 
				
			||||||
        /* Bonaire */
 | 
					        /* Bonaire */
 | 
				
			||||||
        case 0x6649: /* Bonaire [FirePro W5100] */
 | 
					        case 0x6649: /* Bonaire [FirePro W5100] */
 | 
				
			||||||
        case 0x6650:
 | 
					        case 0x6650:
 | 
				
			||||||
 | 
				
			|||||||
@ -1221,17 +1221,14 @@ static int vfio_msix_early_setup(VFIOPCIDevice *vdev)
 | 
				
			|||||||
     * specific quirk if the device is known or we have a broken configuration.
 | 
					     * specific quirk if the device is known or we have a broken configuration.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    if (msix->pba_offset >= vdev->bars[msix->pba_bar].region.size) {
 | 
					    if (msix->pba_offset >= vdev->bars[msix->pba_bar].region.size) {
 | 
				
			||||||
        PCIDevice *pdev = &vdev->pdev;
 | 
					 | 
				
			||||||
        uint16_t vendor = pci_get_word(pdev->config + PCI_VENDOR_ID);
 | 
					 | 
				
			||||||
        uint16_t device = pci_get_word(pdev->config + PCI_DEVICE_ID);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /*
 | 
					        /*
 | 
				
			||||||
         * Chelsio T5 Virtual Function devices are encoded as 0x58xx for T5
 | 
					         * Chelsio T5 Virtual Function devices are encoded as 0x58xx for T5
 | 
				
			||||||
         * adapters. The T5 hardware returns an incorrect value of 0x8000 for
 | 
					         * adapters. The T5 hardware returns an incorrect value of 0x8000 for
 | 
				
			||||||
         * the VF PBA offset while the BAR itself is only 8k. The correct value
 | 
					         * the VF PBA offset while the BAR itself is only 8k. The correct value
 | 
				
			||||||
         * is 0x1000, so we hard code that here.
 | 
					         * is 0x1000, so we hard code that here.
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        if (vendor == PCI_VENDOR_ID_CHELSIO && (device & 0xff00) == 0x5800) {
 | 
					        if (vdev->vendor_id == PCI_VENDOR_ID_CHELSIO &&
 | 
				
			||||||
 | 
					            (vdev->device_id & 0xff00) == 0x5800) {
 | 
				
			||||||
            msix->pba_offset = 0x1000;
 | 
					            msix->pba_offset = 0x1000;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            error_report("vfio: Hardware reports invalid configuration, "
 | 
					            error_report("vfio: Hardware reports invalid configuration, "
 | 
				
			||||||
@ -2407,6 +2404,9 @@ static int vfio_initfn(PCIDevice *pdev)
 | 
				
			|||||||
    /* QEMU can choose to expose the ROM or not */
 | 
					    /* QEMU can choose to expose the ROM or not */
 | 
				
			||||||
    memset(vdev->emulated_config_bits + PCI_ROM_ADDRESS, 0xff, 4);
 | 
					    memset(vdev->emulated_config_bits + PCI_ROM_ADDRESS, 0xff, 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    vdev->vendor_id = pci_get_word(pdev->config + PCI_VENDOR_ID);
 | 
				
			||||||
 | 
					    vdev->device_id = pci_get_word(pdev->config + PCI_DEVICE_ID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* QEMU can change multi-function devices to single function, or reverse */
 | 
					    /* QEMU can change multi-function devices to single function, or reverse */
 | 
				
			||||||
    vdev->emulated_config_bits[PCI_HEADER_TYPE] =
 | 
					    vdev->emulated_config_bits[PCI_HEADER_TYPE] =
 | 
				
			||||||
                                              PCI_HEADER_TYPE_MULTI_FUNCTION;
 | 
					                                              PCI_HEADER_TYPE_MULTI_FUNCTION;
 | 
				
			||||||
 | 
				
			|||||||
@ -116,6 +116,8 @@ typedef struct VFIOPCIDevice {
 | 
				
			|||||||
    EventNotifier err_notifier;
 | 
					    EventNotifier err_notifier;
 | 
				
			||||||
    EventNotifier req_notifier;
 | 
					    EventNotifier req_notifier;
 | 
				
			||||||
    int (*resetfn)(struct VFIOPCIDevice *);
 | 
					    int (*resetfn)(struct VFIOPCIDevice *);
 | 
				
			||||||
 | 
					    uint16_t vendor_id;
 | 
				
			||||||
 | 
					    uint16_t device_id;
 | 
				
			||||||
    uint32_t features;
 | 
					    uint32_t features;
 | 
				
			||||||
#define VFIO_FEATURE_ENABLE_VGA_BIT 0
 | 
					#define VFIO_FEATURE_ENABLE_VGA_BIT 0
 | 
				
			||||||
#define VFIO_FEATURE_ENABLE_VGA (1 << VFIO_FEATURE_ENABLE_VGA_BIT)
 | 
					#define VFIO_FEATURE_ENABLE_VGA (1 << VFIO_FEATURE_ENABLE_VGA_BIT)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user