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 <[email protected]>
> ---
>  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.


Reply via email to