This series depends on: - [SeaBIOS] [PATCH 0/2] fw/pci: better support for multiple host bridges (https://www.mail-archive.com/seabios@seabios.org/msg07103.html) - Not yet final, comments need to be adressed
- [Qemu-devel] [PATCH v2 00/47] ACPI refactoring: replace template patching with C ASL API (http://lists.gnu.org/archive/html/qemu-devel/2015-01/msg02895.html)
Reasoning: We need multiple primary busess for a few reasons, the most important one is to be able to associate a pass-trough device with a guest NUMA node. The OS-es are able to associate a NUMA node only to a primary bus, not to a specific PCI device or a pci-2-pci bridge. PC machines support multiple NUMA nodes for CPUs and memory, however the IO was not yet supported.
Series status: The series is fully functional but tested only with Windows2012 server/Fedora 19 and e1000/virtio-net-pci. You are more than welcome to try using: -device pxb-device,id=bridge1,bus_nr=4 -device e1000,bus=bridge1,addr=0x1 -bios <patched with the above series>
patch 1 adds the necessary acpi constructs based on Igor's series patch 2-5 implements acpi code needed to expose the pxb's primary bus to guests patch 6 separates the pci_bus code into a designated file patch 7-11 handles the implicit assumptions in code that only one primary bus can exist patch 12 handles the actual implementation of the PXB devices patch 13-14 enables the device patch 15 implements PXB map_irq function, (can be squashed into the actual PXB) patch 16-17 hacks that need to be addressed before removing the "RFC" status.
Todo: - Solve the little hacks (patches 16/17) - Resend the SeaBios series after the comments are addressed - More testing with other OS-es and other pci devices - Implement the association of a root bus with a NUMA node (acpi proximity) - Think of migration implications and missing code (Ideas?)
Any comments will be welcomed and appreciated. I will not be able to respond next week, but after that I'll answer to all questions/comments.
Thanks, Marcel
Marcel Apfelbaum (17): acpi: added needed acpi constructs hw/acpi: add support for multiple root busses hw/apci: add _PRT method for extra root busses hw/acpi: add _CRS method for extra root busses hw/acpi: remove from root bus 0 the crs resources used by other busses. hw/pci: move pci bus related code to separate files hw/pci: made pci_bus_is_root a PCIBusClass method hw/pci: made pci_bus_num a PCIBusClass method hw/pci: introduce TYPE_PCI_MAIN_HOST_BRIDGE interface hw/pci: removed 'rootbus nr is 0' assumption from qmp_pci_query hw/pci: implement iteration over multiple host bridges hw/pci: introduce PCI Expander Bridge (PXB) hw/pci: inform bios if the system has more than one pci bridge hw/pci: piix - suport multiple host bridges hw/pxb: add map_irq func hw/pci-bridge: hack - disable shpc bar (will be removed from the series) hw/acpi: hack - generate dummy region ranges for first acpi-build (will be removed from the series)
arch_init.c | 1 + hw/acpi/acpi-build-utils.c | 107 +++++++- hw/alpha/typhoon.c | 1 + hw/i386/acpi-build.c | 305 ++++++++++++++++++++- hw/i386/kvm/pci-assign.c | 1 + hw/i386/pc.c | 13 + hw/mips/gt64xxx_pci.c | 1 + hw/pci-bridge/Makefile.objs | 1 + hw/pci-bridge/pci_bridge_dev.c | 2 + hw/pci-bridge/pci_expander_bridge.c | 191 ++++++++++++++ hw/pci-host/bonito.c | 1 + hw/pci-host/grackle.c | 1 + hw/pci-host/piix.c | 63 ++++- hw/pci-host/ppce500.c | 1 + hw/pci-host/q35.c | 5 + hw/pci-host/uninorth.c | 1 + hw/pci/Makefile.objs | 2 +- hw/pci/pci-hotplug-old.c | 1 + hw/pci/pci.c | 501 +---------------------------------- hw/pci/pci_bus.c | 510 ++++++++++++++++++++++++++++++++++++ hw/pci/pci_host.c | 6 + hw/ppc/ppc4xx_pci.c | 1 + hw/scsi/megasas.c | 1 + hw/sh4/r2d.c | 1 + hw/sh4/sh_pci.c | 1 + hw/vfio/pci.c | 1 + hw/xen/xen_pt.c | 1 + include/hw/acpi/acpi-build-utils.h | 12 + include/hw/pci/pci.h | 6 +- include/hw/pci/pci_bus.h | 29 ++ include/hw/pci/pci_host.h | 11 + 31 files changed, 1267 insertions(+), 512 deletions(-) create mode 100644 hw/pci-bridge/pci_expander_bridge.c create mode 100644 hw/pci/pci_bus.c