The pxb can be attach to and existing numa node by specifying numa_node option that equals the desired numa nodeid.
Signed-off-by: Marcel Apfelbaum marcel@redhat.com --- hw/i386/acpi-build.c | 12 ++++++++++++ hw/pci-bridge/pci_expander_bridge.c | 17 +++++++++++++++++ 2 files changed, 29 insertions(+)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 7cd011d..b5c0e86 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -908,6 +908,7 @@ build_ssdt(GArray *table_data, GArray *linker,
for (info = info_list; info; info = info->next) { PciInfo *bus_info = info->value; + PCIHostState *host;
if (bus_info->bus == 0) { continue; @@ -924,6 +925,17 @@ build_ssdt(GArray *table_data, GArray *linker, aml_append(dev, aml_name_decl("_HID", aml_string("PNP0A03"))); aml_append(dev, aml_name_decl("_BBN", aml_int((uint8_t)bus_info->bus))); + + HOST_BRIDGE_FOREACH(host) { + if (pci_bus_num(host->bus) == bus_info->bus) { + int numa_node = pci_bus_numa_node(host->bus); + if (numa_node != NUMA_NODE_UNASSIGNED) { + aml_append(dev, + aml_name_decl("_PXM", aml_int(numa_node))); + } + } + } + aml_append(dev, build_prt()); crs = build_crs(pci, bus_info, &io_ranges, &mem_ranges); aml_append(dev, aml_name_decl("_CRS", crs)); diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c index 87515c1..9329aab 100644 --- a/hw/pci-bridge/pci_expander_bridge.c +++ b/hw/pci-bridge/pci_expander_bridge.c @@ -16,6 +16,7 @@ #include "hw/pci/pci_bus.h" #include "qemu/range.h" #include "qemu/error-report.h" +#include "sysemu/sysemu.h"
#define TYPE_PXB_BUS "pxb-bus" #define PXB_BUS(obj) OBJECT_CHECK(PXBBus, (obj), TYPE_PXB_BUS) @@ -37,6 +38,7 @@ typedef struct PXBDev { /*< public >*/
uint8_t bus_nr; + uint16_t numa_node; } PXBDev;
#define TYPE_PXB_HOST "pxb-host" @@ -53,12 +55,20 @@ static bool pxb_is_root(PCIBus *bus) return true; /* by definition */ }
+static uint16_t pxb_bus_numa_node(PCIBus *bus) +{ + PXBDev *pxb = PXB_DEV(bus->parent_dev); + + return pxb->numa_node; +} + static void pxb_bus_class_init(ObjectClass *class, void *data) { PCIBusClass *pbc = PCI_BUS_CLASS(class);
pbc->bus_num = pxb_bus_num; pbc->is_root = pxb_is_root; + pbc->numa_node = pxb_bus_numa_node; }
static const TypeInfo pxb_bus_info = { @@ -126,6 +136,12 @@ static int pxb_dev_initfn(PCIDevice *dev) } }
+ if (pxb->numa_node != NUMA_NODE_UNASSIGNED && + pxb->numa_node >= nb_numa_nodes) { + error_report("Illegal numa node %d.", pxb->numa_node); + return -EINVAL; + } + if (dev->qdev.id && *dev->qdev.id) { dev_name = dev->qdev.id; } @@ -157,6 +173,7 @@ static int pxb_dev_initfn(PCIDevice *dev) static Property pxb_dev_properties[] = { /* Note: 0 is not a legal a PXB bus number. */ DEFINE_PROP_UINT8("bus_nr", PXBDev, bus_nr, 0), + DEFINE_PROP_UINT16("numa_node", PXBDev, numa_node, NUMA_NODE_UNASSIGNED), DEFINE_PROP_END_OF_LIST(), };