Hi, The ppc64 PowerNV (Power Non-Virtualized) machine types is the bare-metal emulation of the IBM Power server. They follow a different specification than the virtualized guest emulation, a.k.a the pSeries guest that Libvirt supports for awhile. There is an interest in running these PowerNV machines using Libvirt, in particular due to the growing popularity of the OpenCI project. This is the motivation of this work. Although these machines are present in QEMU for a few years now, they only became "Libvirt compliant" recently in upstream QEMU. The reason is that running with '-nodefaults' wouldn't allow users to add PHBs manually in the command line. Since the correspondent capabilities are already present since QEMU 5.0 I didn't find a good way to block the creation of powerNV domains for older QEMU versions (suggestions welcome). Support for these machines consists of adding a specific root-port and pcie-root implemementation for each one of them. powernv8 uses pnv-phb3-root-port/pnv-phb3 and powernv9 uses pnv-phb4-root-port/pnv-phb4. PowerNV PHBs have a similar handling as the already existing spapr-pci-host-bridge bus. These domains needs BMC devices to turn off from the OS. These devices aren't implemented in Libvirt yet (to my surprise, given that it's an Intel interface), so the domains needs to be turned off using 'virsh destroy'. I have patches that implements the required BMC devices, but decided to post them as a follow up to not make this patch set too large. The series is organized as follows: - patch 1: same patch sent a few days ago in [1], reposted here because the capabilities was added on top of it; - patches 2-9: cleanups and simplifications to allow a simple powernv8 domain to boot; - patches 10-26: add root-port and phb of the powernv8 machine; - patches 27-33: add root-port and phb of the powernv9 machine. No change in existing pcie-root and pcie-root-port models were made. This work can also be fetched from here: https://gitlab.com/danielhb/libvirt/-/tree/pnv_v1 Frederic, fell free to give this a ride and let us know how it goes. [1] https://listman.redhat.com/archives/libvir-list/2022-January/msg00766.html Daniel Henrique Barboza (33): tests: update QEMU and domain ppc64 capabilities for qemu 7.0 qemu_domain.c: add PowerNV machine helpers qemu_capabilities.c: use 'MachineIsPowerPC' in DeviceDiskCaps qemu_validate.c: use qemuDomainIsPowerPC() in qemuValidateDomainChrDef() qemu_domain.c: define ISA as default PowerNV serial qemu_validate.c: enhance 'machine type not supported' message qemu_domain.c: disable default devices for PowerNV machines tests: add basic PowerNV8 test qemu_migration.c: forbid powernv domains migration qemu: introduce QEMU_CAPS_DEVICE_PNV_PHB3_ROOT_PORT conf: add 'pnv-phb3-root-port' domain definition qemu: add 'modelName' value for pnv-phb3-root-port device qemu: introduce QEMU_CAPS_DEVICE_PNV_PHB3 conf: add 'pnv-phb3' controller model qemu: add 'modelName' value for pnv-phb3 device domain_conf.c: fix identation in virDomainControllerDefParseXML() conf: parse and format <target chip-id='...'/> introduce virDomainControllerIsPowerNVPHB conf, qemu: add default 'chip-id' value for pnv-phb3 controllers conf, qemu: add default 'targetIndex' value for pnv-phb3 devs qemu_command.c: add command line for the pnv-phb3 device qemu_domain_address.c: change pnv-phb3 minimal downstream slot domain_conf: format pnv-phb3-root-port empty addr tests: add pnv-phb3-root-port test domain_validate.c: allow targetIndex 0 out of idx 0 for PowerNV PHBs domain_conf.c: reject duplicated pnv-phb3 devices qemu: introduce QEMU_CAPS_DEVICE_PNV_PHB4_ROOT_PORT conf: add 'pnv-phb4-root-port' domain definition qemu: add 'modelName' value for pnv-phb4-root-port device qemu: introduce QEMU_CAPS_DEVICE_PNV_PHB4 conf: add 'pnv-phb4' controller model qemu: add 'modelName' value for pnv-phb4 device tests: add PowerNV9 tests docs/formatdomain.rst | 4 + docs/schemas/domaincommon.rng | 10 + src/conf/domain_conf.c | 157 +- src/conf/domain_conf.h | 8 + src/conf/domain_validate.c | 5 +- src/libvirt_private.syms | 1 + src/qemu/qemu_capabilities.c | 12 +- src/qemu/qemu_capabilities.h | 4 + src/qemu/qemu_command.c | 21 +- src/qemu/qemu_domain.c | 56 +- src/qemu/qemu_domain.h | 4 +- src/qemu/qemu_domain_address.c | 64 +- src/qemu/qemu_migration.c | 6 + src/qemu/qemu_validate.c | 63 +- tests/domaincapsdata/qemu_7.0.0.ppc64.xml | 148 + .../qemucapabilitiesdata/caps_5.0.0.ppc64.xml | 4 + .../qemucapabilitiesdata/caps_5.2.0.ppc64.xml | 4 + .../qemucapabilitiesdata/caps_6.2.0.ppc64.xml | 4 + .../caps_7.0.0.ppc64.replies | 33825 ++++++++++++++++ .../qemucapabilitiesdata/caps_7.0.0.ppc64.xml | 1143 + ...default-video-type-ppc64.ppc64-latest.args | 8 +- tests/qemuxml2argvdata/powernv8-basic.args | 32 + tests/qemuxml2argvdata/powernv8-basic.xml | 16 + tests/qemuxml2argvdata/powernv8-dupPHBs.err | 1 + tests/qemuxml2argvdata/powernv8-dupPHBs.xml | 27 + .../qemuxml2argvdata/powernv8-root-port.args | 33 + tests/qemuxml2argvdata/powernv8-root-port.xml | 17 + .../qemuxml2argvdata/powernv8-two-sockets.xml | 26 + tests/qemuxml2argvdata/powernv9-dupPHBs.err | 1 + tests/qemuxml2argvdata/powernv9-dupPHBs.xml | 27 + .../qemuxml2argvdata/powernv9-root-port.args | 33 + tests/qemuxml2argvdata/powernv9-root-port.xml | 17 + ...ault-cpu-kvm-pseries-2.7.ppc64-latest.args | 8 +- ...ault-cpu-kvm-pseries-3.1.ppc64-latest.args | 8 +- ...ault-cpu-kvm-pseries-4.2.ppc64-latest.args | 8 +- ...ault-cpu-tcg-pseries-2.7.ppc64-latest.args | 8 +- ...ault-cpu-tcg-pseries-3.1.ppc64-latest.args | 8 +- ...ault-cpu-tcg-pseries-4.2.ppc64-latest.args | 8 +- .../ppc64-pseries-graphics.ppc64-latest.args | 22 +- .../ppc64-pseries-headless.ppc64-latest.args | 16 +- .../ppc64-tpmproxy-single.ppc64-latest.args | 6 +- .../ppc64-tpmproxy-with-tpm.ppc64-latest.args | 8 +- .../tpm-emulator-spapr.ppc64-latest.args | 14 +- tests/qemuxml2argvtest.c | 18 + tests/qemuxml2xmloutdata/powernv8-basic.xml | 31 + .../qemuxml2xmloutdata/powernv8-root-port.xml | 36 + .../powernv8-two-sockets.xml | 38 + .../qemuxml2xmloutdata/powernv9-root-port.xml | 36 + tests/qemuxml2xmltest.c | 15 + tests/testutilsqemu.c | 2 +- 50 files changed, 35963 insertions(+), 108 deletions(-) create mode 100644 tests/domaincapsdata/qemu_7.0.0.ppc64.xml create mode 100644 tests/qemucapabilitiesdata/caps_7.0.0.ppc64.replies create mode 100644 tests/qemucapabilitiesdata/caps_7.0.0.ppc64.xml create mode 100644 tests/qemuxml2argvdata/powernv8-basic.args create mode 100644 tests/qemuxml2argvdata/powernv8-basic.xml create mode 100644 tests/qemuxml2argvdata/powernv8-dupPHBs.err create mode 100644 tests/qemuxml2argvdata/powernv8-dupPHBs.xml create mode 100644 tests/qemuxml2argvdata/powernv8-root-port.args create mode 100644 tests/qemuxml2argvdata/powernv8-root-port.xml create mode 100644 tests/qemuxml2argvdata/powernv8-two-sockets.xml create mode 100644 tests/qemuxml2argvdata/powernv9-dupPHBs.err create mode 100644 tests/qemuxml2argvdata/powernv9-dupPHBs.xml create mode 100644 tests/qemuxml2argvdata/powernv9-root-port.args create mode 100644 tests/qemuxml2argvdata/powernv9-root-port.xml create mode 100644 tests/qemuxml2xmloutdata/powernv8-basic.xml create mode 100644 tests/qemuxml2xmloutdata/powernv8-root-port.xml create mode 100644 tests/qemuxml2xmloutdata/powernv8-two-sockets.xml create mode 100644 tests/qemuxml2xmloutdata/powernv9-root-port.xml -- 2.34.1