mirror of https://github.com/xemu-project/xemu.git
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…
Reference in New Issue