struct pci_device *pci_devices;
/** List of PCI devices assigned to this cell that support MSI-X. */
struct pci_device *msix_device_list;
+ /** List of virtual PCI devices assigned to this cell. */
+ struct pci_device *virtual_device_list;
/** Shadow value of PCI config space address port register. */
u32 pci_addr_port_val;
union pci_msix_registers msix_registers;
/** Next PCI device in this cell with MSI-X support. */
struct pci_device *next_msix_device;
+ /** Next virtual PCI device in this cell. */
+ struct pci_device *next_virtual_device;
/** Real MSI-X table. */
union pci_msix_vector *msix_table;
/** Shadow state of MSI-X table. */
}
}
+static void pci_add_virtual_device(struct cell *cell, struct pci_device *device)
+{
+ device->cell = cell;
+ device->next_virtual_device = cell->virtual_device_list;
+ cell->virtual_device_list = device;
+}
+
static int pci_add_device(struct cell *cell, struct pci_device *device)
{
unsigned int size = device->info->msix_region_size;
return err;
}
+static void pci_remove_virtual_device(struct pci_device *device)
+{
+ struct pci_device *prev = device->cell->virtual_device_list;
+
+ if (prev == device) {
+ device->cell->virtual_device_list = device->next_virtual_device;
+ } else {
+ while (prev->next_virtual_device != device)
+ prev = prev->next_virtual_device;
+ prev->next_virtual_device = device->next_virtual_device;
+ }
+}
+
static void pci_remove_device(struct pci_device *device)
{
unsigned int size = device->info->msix_region_size;