From: Jinjie Ruan <[email protected]>

Instead of failing with 'MPAM support requires NUMA nodes to be
specified', -M virt,mpam=on with no -numa now treats all RAM as one
implicit node 0 and creates a single memory MSC for it (node 0, one
RIS, same partitioning configuration as a per-node instance).  The
ACPI MPAM locator keeps proximity domain 0, which the mainline
arm_mpam driver resolves to node 0 via its pxm_to_node()
NUMA_NO_NODE fallback; no SRAT is fabricated and the guest stays
non-NUMA-aware.  Cache MSC creation is unaffected, and explicit
-numa / mpam-min-msc paths are unchanged.

Signed-off-by: Jinjie Ruan <[email protected]>
---
 hw/arm/virt.c | 30 +++++++++++++++++++++++++-----
 1 file changed, 25 insertions(+), 5 deletions(-)

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 4ef7aed..ee4308e 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -2244,11 +2244,31 @@ static void create_mpam_msc(VirtMachineState *vms, 
Error **errp)
     hwaddr base = vms->memmap[VIRT_MPAM_MSC].base;
 
     if (ms->numa_state->num_nodes == 0) {
-        error_setg(errp,
-                   "MPAM support requires NUMA nodes to be specified");
-        return;
-    }
-    if (!vms->mpam_min_msc) {
+        /*
+         * No -numa: treat all RAM as one implicit node 0 -- a single
+         * memory MSC with one RIS.  The ACPI locator keeps proximity
+         * domain 0, which the arm_mpam driver resolves to node 0 via its
+         * pxm_to_node() NUMA_NO_NODE fallback; no SRAT is fabricated and
+         * the guest stays non-NUMA-aware.
+         */
+        int err_spi, oflow_spi;
+
+        dev = qdev_new(TYPE_MPAM_MSC_MEM);
+        object_property_set_uint(OBJECT(dev), "node", 0, &error_fatal);
+        object_property_set_uint(OBJECT(dev), "num-ris", 1, &error_fatal);
+        object_property_set_uint(OBJECT(dev), "num-partid",
+                                 MPAM_VIRT_NUM_PARTID, &error_fatal);
+        object_property_set_uint(OBJECT(dev), "num-int-partid",
+                                 MPAM_VIRT_NUM_INTPARTID, &error_fatal);
+        mpam_msc_assign_irqs(dev, &err_spi, &oflow_spi, &next_spi);
+        sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+        sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
+        sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
+                           qdev_get_gpio_in(vms->gic, err_spi));
+        sysbus_connect_irq(SYS_BUS_DEVICE(dev), 1,
+                           qdev_get_gpio_in(vms->gic, oflow_spi));
+        base += MPAM_SIZE;
+    } else if (!vms->mpam_min_msc) {
         for (i = 0; i < ms->numa_state->num_nodes; i++) {
             /* at most 16 mem MSCs (4-bit selector space, SPI budget) */
             if (ms->numa_state->nodes[i].node_mem > 0 && count < 16) {
-- 
2.43.0


Reply via email to