On Wed, Sep 09, 2026 at 16:29:55 +0800, Zhenzhong Duan wrote:
Add pasid_bits attribute to iommu to set pasid bit width or disable pasid capability if 0 for intel-iommu.
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> --- docs/formatdomain.rst | 5 +++ src/conf/domain_conf.c | 16 ++++++++ src/conf/domain_conf.h | 1 + src/conf/domain_validate.c | 3 ++ src/conf/schemas/domaincommon.rng | 5 +++ src/qemu/qemu_validate.c | 11 ++++++ .../intel-iommu-pasid-bits.x86_64-latest.args | 34 +++++++++++++++++ .../intel-iommu-pasid-bits.x86_64-latest.xml | 37 +++++++++++++++++++ .../intel-iommu-pasid-bits.xml | 37 +++++++++++++++++++ tests/qemuxmlconftest.c | 1 + 10 files changed, 150 insertions(+) create mode 100644 tests/qemuxmlconfdata/intel-iommu-pasid-bits.x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/intel-iommu-pasid-bits.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/intel-iommu-pasid-bits.xml
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index f376cefc16..14fe85e817 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -9490,6 +9490,11 @@ Examples: Enable first stage translation. :since:`Since 12.8.0` (QEMU/KVM and ``intel`` model only)
+ ``pasid-bits`` + The ``pasid-bits`` attribute can be used to set the pasid bit width.
Both of these have a dash in the name ...
+ Max supported value is 20 according to PCI spec, pasid is disabled if 0. + :since:`Since 12.8.0` (QEMU/KVM and ``intel`` model only) + In case of ``virtio`` IOMMU device, the ``driver`` element can optionally contain ``granule`` subelement that allows to choose which granule will be used by default. It is useful when running guests with different page size diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index b6c3df0404..7b8a7e7c68 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -14786,6 +14786,10 @@ virDomainIOMMUDefParseXML(virDomainXMLOption *xmlopt, &iommu->fsts) < 0) return NULL;
+ if (virXMLPropUInt(driver, "pasid_bits", 10, VIR_XML_PROP_NONE,
... but the actual parser wants an underscore.
+ &iommu->pasid_bits) < 0) + return NULL; + if ((granule = virXPathNode("./driver/granule", ctxt))) { g_autofree char *mode = virXMLPropString(granule, "mode"); unsigned long long size;
[...]
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index e2076e7c36..16d3006c6f 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3106,6 +3106,7 @@ struct _virDomainIOMMUDef { virTristateSwitch dma_translation; virTristateSwitch scalable_mode; virTristateSwitch fsts; + virTristateSwitch pasid_bits;
This is parsed as an unsigned integer. I know that it typecasts to an enum cleanly but nevertheless needs to use the correct type.