diff options
Diffstat (limited to 'include/hw/pci/pci_bus.h')
-rw-r--r-- | include/hw/pci/pci_bus.h | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/include/hw/pci/pci_bus.h b/include/hw/pci/pci_bus.h new file mode 100644 index 000000000..347440d42 --- /dev/null +++ b/include/hw/pci/pci_bus.h @@ -0,0 +1,66 @@ +#ifndef QEMU_PCI_BUS_H +#define QEMU_PCI_BUS_H + +#include "hw/pci/pci.h" + +/* + * PCI Bus datastructures. + * + * Do not access the following members directly; + * use accessor functions in pci.h + */ + +struct PCIBusClass { + /*< private >*/ + BusClass parent_class; + /*< public >*/ + + int (*bus_num)(PCIBus *bus); + uint16_t (*numa_node)(PCIBus *bus); +}; + +enum PCIBusFlags { + /* This bus is the root of a PCI domain */ + PCI_BUS_IS_ROOT = 0x0001, + /* PCIe extended configuration space is accessible on this bus */ + PCI_BUS_EXTENDED_CONFIG_SPACE = 0x0002, +}; + +struct PCIBus { + BusState qbus; + enum PCIBusFlags flags; + PCIIOMMUFunc iommu_fn; + void *iommu_opaque; + uint8_t devfn_min; + uint32_t slot_reserved_mask; + pci_set_irq_fn set_irq; + pci_map_irq_fn map_irq; + pci_route_irq_fn route_intx_to_irq; + void *irq_opaque; + PCIDevice *devices[PCI_SLOT_MAX * PCI_FUNC_MAX]; + PCIDevice *parent_dev; + MemoryRegion *address_space_mem; + MemoryRegion *address_space_io; + + QLIST_HEAD(, PCIBus) child; /* this will be replaced by qdev later */ + QLIST_ENTRY(PCIBus) sibling;/* this will be replaced by qdev later */ + + /* The bus IRQ state is the logical OR of the connected devices. + Keep a count of the number of devices with raised IRQs. */ + int nirq; + int *irq_count; + + Notifier machine_done; +}; + +static inline bool pci_bus_is_root(PCIBus *bus) +{ + return !!(bus->flags & PCI_BUS_IS_ROOT); +} + +static inline bool pci_bus_allows_extended_config_space(PCIBus *bus) +{ + return !!(bus->flags & PCI_BUS_EXTENDED_CONFIG_SPACE); +} + +#endif /* QEMU_PCI_BUS_H */ |