Aim of this bit of emulation is to use it for testing James Morse's kernel tree - in particularly letting us poke the corner cases. Right now I'm not that focused on upstreaming this (too many other things in my backlog), but any feedback on the approach etc welcome and perhaps the PPTT part is useful independent of MPAM support.
Current kernel branch (one outstanding bug reported but that's hard to hit and requires setting the narrowing target number of IDs to 1 which is bonkers): https://git.kernel.org/pub/scm/linux/kernel/git/morse/linux.git/log/?h=mpam/snapshot/v6.5-rc1 Supported: * PPTT cache description - this is necessary for the cross references MPAM table entries use to establish which Cache any given control set influences. I included option for generating shared tables which were a common choice prior to MPAM needing those cross references. * CPU emulation for MPAM. Given we aren't doing anything with the content this is just a case of adding the MPAM_IDR register and read/write registers to control current PARTID / PMG group. * MPAM MSC emulation for caches and memory controllers. Multiple RIS support allows up to 16 such elements to be controlled via a single interface (used only for memory currently. Most controls wired up, though introspection interface and sanity checks only cover some of them so far. No monitoring yet. * ACPI tables and device instantiation in ARM Virt. ACPI only because the kernel patches clearly state the DT binding is a WIP. * A hack to add lots of caches to the MAX cpu via the relevant CPU registers - these are read back to generate the PPTT Table and MPAM devices. TODO: - Dealing with case of no NUMA nodes. Currently we don't start if NUMA nodes aren't specified and mpam=on. Defaulting to a single NUMA node if MPAM is enabled may make more sense. - Error injection / reporting on invalid parameters. - Monitor support. - Wire up the interrupts properly. - Tighten checks on unexpected values to further help with catching bugs in kernel code (a few already found and fixed by James). - ACPI table test (yeah I'm lazy). - Remove remaining 'fixed' constraints on number of partitions etc so they can be different across controllers / different levels of the hierarchy. - Expand the qmp introspection interface to cover the missing parts. Example command line (who doesn't love SMT arm machines?): aarch64-softmmu/qemu-system-aarch64 -D test.log -d unimp \ -M virt,nvdimm=on,gic-version=3,mpam=on,mpam_min_msc=on \ -m 4g -cpu max,core-count=2 \ -smp 16,sockets=1,clusters=4,threads=2,cache-cluster-start-level=2,cache-node-start-level=3 \ -kernel Image \ -drive if=none,file=full.qcow2,format=qcow2,id=hd \ -device pcie-root-port,id=root_port1 -device virtio-blk-pci,drive=hd \ -qmp-pretty tcp:localhost:4445,server=on,wait=off \ ... -nographic -no-reboot -append 'earlycon root=/dev/vda2' \ -bios QEMU_EFI.fd \ -object memory-backend-ram,size=1G,id=mem0 \ -object memory-backend-ram,size=1G,id=mem1 \ -object memory-backend-ram,size=1G,id=mem2 \ -object memory-backend-ram,size=1G,id=mem3 \ -numa node,nodeid=0,cpus=0-3,memdev=mem0 \ -numa node,nodeid=1,cpus=4-7,memdev=mem1 \ -numa node,nodeid=2,cpus=8-11,memdev=mem2 \ -numa node,nodeid=3,cpus=12-15,memdev=mem3 QMP comamnds: { "execute": "qmp_capabilities" } { "execute": "query-mpam-cache", "arguments": { "level": 3 } } Will return something like (reformatted as the pretty version is 'long') An 'ideal' version of this interface will take some more thought as it needs to balance readability and clarity with complex implementation of the code to 'interpret' the register values. { "return": [ { "cpu": 0, "level": 3, "regs": [ { "mbwumon-idr": 0, "idr": 758514712831, "cfg-cpbm": [ { "words": [ 4294967295 ] }, { "words": [ 0 ] }, { "words": [ 0 ] }, { "words": [ 0 ] }, { "words": [ 0 ] }, .... { "words": [ 0 ] } ], "partid-nrw-idr": 31, "mbw-idr": 0, "csumon-idr": 0, "esr": 0, "ecr": 1, "cfg-part-sel": 0, "iidr": 44042038, "cpor-idr": 32, "msmon-idr": 0, "ccap-idr": 2952791044, "aidr": 17, "pri-idr": 35 } ], "type": 3 } ] } Jonathan Cameron (5): hw/acpi: Add PPTT cache descriptions HACK: target/arm/tcg: Add some more caches to cpu=max target/arm: Add support for MPAM CPU registers hw/arm: Add MPAM emulation. hw/arm/virt: Add MPAM MSCs for memory controllers and caches. qapi/machine.json | 8 +- qapi/mpam.json | 78 ++++ qapi/qapi-schema.json | 1 + include/hw/acpi/aml-build.h | 19 +- include/hw/arm/mpam.h | 13 + include/hw/arm/virt.h | 2 + include/hw/boards.h | 4 + target/arm/cpu.h | 15 + hw/acpi/aml-build.c | 189 +++++++- hw/arm/mpam-qapi-stubs.c | 9 + hw/arm/mpam-qapi.c | 58 +++ hw/arm/mpam.c | 886 ++++++++++++++++++++++++++++++++++++ hw/arm/virt-acpi-build.c | 327 ++++++++++++- hw/arm/virt.c | 134 ++++++ hw/core/machine-smp.c | 8 + hw/loongarch/acpi-build.c | 2 +- target/arm/cpu.c | 10 +- target/arm/helper.c | 30 ++ target/arm/tcg/cpu64.c | 12 + hw/arm/Kconfig | 4 + hw/arm/meson.build | 4 + qapi/meson.build | 1 + 22 files changed, 1803 insertions(+), 11 deletions(-) create mode 100644 qapi/mpam.json create mode 100644 include/hw/arm/mpam.h create mode 100644 hw/arm/mpam-qapi-stubs.c create mode 100644 hw/arm/mpam-qapi.c create mode 100644 hw/arm/mpam.c -- 2.39.2