From nobody Mon Aug 24 11:09:16 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=fail (Bad Signature); dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 178287250349684.02619067786372; Tue, 30 Jun 2026 19:21:43 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 574CD41BCD; Tue, 30 Jun 2026 22:21:42 -0400 (EDT) Received: from [172.19.199.7] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id B790F41DD4; Tue, 30 Jun 2026 22:18:10 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 11D0C41AC3; Tue, 30 Jun 2026 22:17:55 -0400 (EDT) Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010060.outbound.protection.outlook.com [52.101.193.60]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id BEDD441BBB for ; Tue, 30 Jun 2026 22:17:52 -0400 (EDT) Received: from DM4PR12MB5390.namprd12.prod.outlook.com (2603:10b6:5:389::15) by CY8PR12MB7169.namprd12.prod.outlook.com (2603:10b6:930:5e::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.159.19; Wed, 1 Jul 2026 02:17:45 +0000 Received: from DM4PR12MB5390.namprd12.prod.outlook.com ([fe80::2815:c27e:a0a:2720]) by DM4PR12MB5390.namprd12.prod.outlook.com ([fe80::2815:c27e:a0a:2720%6]) with mapi id 15.21.0181.008; Wed, 1 Jul 2026 02:17:45 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,FORGED_SPF_HELO,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_HELO_PASS autolearn=no autolearn_force=no version=4.0.1 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=pkCsN1iRJDfExAnvm/TzSohJ4kbYXVb5uGqcnGyjOet4bl7wptg/LnJoV1UvaWyVsSOjG6dIQhHpbndeZxef+eHlrojZaaN4AoJ6MxOdCPcaON8iiOLxfkO8L53FPZf/Urtni/7yomgKIJdfIkggNQXkZYI6GPzFU428U4fJ7P77qFPVxlUL026VdvWlM8L5W7tyEEn/7HiCrvR9nfGdvUfujT37DL7JN1ebk7dYWXEuRw+1ud4FD8vvaWJ7J56GFN4D+jiKm2dK0LFkKQvI2L9/AACXwqukQVkNbuz1kttYv9QImEuHYQgFK9Mre57rc7Ca/hMEi7g3dzvlFNb3Mg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=WUkpUjsbNl067Ay+OChQXssbjSxjbEfwretX1SbE9Fg=; b=eb8hM/ncvzOwG95MCZGkRLwIkxoqG9QS5FvE28pQvOvsIEHiFBEe0Vgb9eiOemukM39POJ0MTsfHSg2ucuUQ6CpZpoLSaF2FaPB5Z0iw8vGRToSyifAqFTMOxOGqu2gC220cnYKPR2pUw9OmvE+FbQu7vfoRUd3vRS0mcrgN5/gwgJMit6QZ+RLrA0m9Q1QwQ6qJisSEpBt24U3R/ryvtHhCd4mvzET9VGITlyNVT41pFJ2/6xHyZ4zVYPlTjPCqnByPPpcDwYQiC58IW7yejy+MOFulyBYcHBmps3s1AyNHB2HLIn/S8Dfdq98+ICeXewhDfe4MsBjmm7hrioUtNw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=WUkpUjsbNl067Ay+OChQXssbjSxjbEfwretX1SbE9Fg=; b=CA99jnhXk8tf15ZEp7sg3OKiUrhmK1uGlfkVmkNozHyctyUf69FQkEUym6k0OaM6BClPeCnAtQRKY/G5zWSDdGEZrIzMRUcdOC/7R4DgmgUcAR2wvTT9rxLBFOLTEU+qfTbq923rP1zXe+G1nn5BDRX6h84QJ1tjnE94rPEJZ9m+tw6UlU1zz4ovlA/UW7UQ0FqT0Dc+8hM8VPS0ibxd6GFEj8nhGHPO9aA2CYSqZerwU6BTI89tVifh9dEY/hmYLK+droRbVbsfRHmFIQKVpjk1Dj62IQcgU7v9JV1rkk5mokAMXxnBJPTwzC5i7y1Z1Y6QuwQ0qVIExMdqAMN/Xw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; To: devel@lists.libvirt.org Subject: [PATCH v9 1/2] qemu: Add support for HW-accelerated nested SMMUv3 Date: Tue, 30 Jun 2026 19:17:31 -0700 Message-ID: <20260701021732.2278343-2-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260701021732.2278343-1-nathanc@nvidia.com> References: <20260701021732.2278343-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR13CA0190.namprd13.prod.outlook.com (2603:10b6:a03:2c3::15) To DM4PR12MB5390.namprd12.prod.outlook.com (2603:10b6:5:389::15) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR12MB5390:EE_|CY8PR12MB7169:EE_ X-MS-Office365-Filtering-Correlation-Id: d5dfb8b8-405d-44e2-05cd-08ded716f021 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|1800799024|366016|376014|56012099006|6133799003|11063799006|22082099003|18002099003|3023799007; X-Microsoft-Antispam-Message-Info: 3m5tpJsngyhh2K43Yw8fbJKXferUlIqesPvC7UiA4ctMuFr2g+WkcwGMGod91Gvji31oeDeNh3+ocfiDX+szDvf+oMOTSWGZxMQjbvAY31v0hf/4c0lo/ewlHVyapghjs81PEM5f6MJtUhyq4PKhdZbIj2wz6W4VEt41rud7lUlrzX2tho9sdjr5i8aaVt6AcgDZc7lwQ3G0YBchERIjb7OuWmhshoN6DmW0IxepxXQUOFWDIELrXoa2R+q1O4Tc4iBy0Z5XL1ApUzTtIYeZ/aSYdNZcsBJhdHQ9FZgBzDPb9uvnwV9B5BuIr3hu0+j/fOyCPdJbBUlmMNW55KUvaBDNKQ2NwohNsAbq04ivdQ0GxID6gx5Q6EwaRIduSZjEsKKrpXFLaZIPHsNN+DKoJmx8VZq4YAAbK+iO+nGO2Cmydo+6fsl88pzKd60Ll/CFlsZv1l1MTdXr0MlZK/m55svOjxRsKFA5bej5UpkLeJXzbNHHzcHebPvQ7MsqKxXiu50XmK2vowTDmYX3fnFNhYBsrpjKAi1ezuRFHvPCzGWq3ojl5IBJ3BqUaNzEpABCETHoX/42obIle8MLHUBqmY4661pfeBnuv3Y/rRj2IenYhb0YtU/d8uiVnIlQ5cMF3S3vywLUGIbUAmvsQMHp2TBErSU88ffP4g6gpypG+Lc= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM4PR12MB5390.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(1800799024)(366016)(376014)(56012099006)(6133799003)(11063799006)(22082099003)(18002099003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?BgIkHqGNONMjHP/ZPF6MSxv0/itRhUt+VqDhA+GSBAggLYojBegD3zz7eXBi?= =?us-ascii?Q?7cE0cJq0d7pXyTe0/N4UphxpkuSxNEY6kP3RQcDQM5XHUR62BGYbXBitzfEY?= =?us-ascii?Q?KrmP5IFbbRiNNQwYbDt/jRWdOdwYrUIsvHUYHmGgoEEQ5eJhykJMYpYx/ZdQ?= =?us-ascii?Q?L6iT4/QV9hYqoTdicrbF+SfuD5KiAFD5xJts3v+3LPQyKs2Sa9eVPf8Xvo76?= =?us-ascii?Q?ddFO/uy5ptTcoKoSJvwKkEyjvbsAkIffzdxZXLLtbIbIy7sVyR81vG/Gc7wU?= =?us-ascii?Q?b6dIQ6c8+Mi+2ounucTD1ctWZa7YHbrGbePgIUa87eoScl8sQc9wuvJ5tAp2?= =?us-ascii?Q?QBjF10eE407T9RH0YtOOKEZc1YimLY4eCQjatJOdULbHK28V7aKyMJQ9z7BV?= =?us-ascii?Q?BWaPe9fw7jAkUomhgs0w+RjmZQ1SXwv646Qe2cO+38ALk4ngznuqV059w5Q3?= =?us-ascii?Q?9HDJPyw0Y7PcGcZL4LID8/euppYtoY3M3ByRYdGJVeIEZcwJUKAMHARqoBR3?= =?us-ascii?Q?zoHeO0+LoiIbQgCD8w/oO0t9EmxyTpq0bHBJXX6hSdsu3auwpSvY0LBIDQrt?= =?us-ascii?Q?3/K/Rfj0oE9n048pLq9VcQGN1Md2A0xoDWS4XlyiiXWAKbXbGEwtMohibws/?= =?us-ascii?Q?z9HdW8jRaIN+gH1LzKndkMtOyVZ81xaFE74kfz3CrlqA7lV+x/dhjvMgXf5I?= =?us-ascii?Q?wDqEyV4hLfmwSB+QDmlGsHNcLlgPfoTSFY9nRo1hWNwL8uD50VoX2mdvEaCs?= =?us-ascii?Q?SigkWlj29pa45XwrXKaik2hvLcGy2CDTouAm+AJD49knDy04zYZg6nqXh8Fx?= =?us-ascii?Q?hJxhboZWM6+Bis1sGWw9PnY8IOecinQ0771iG54mcnV1gkA+3UFJz+GmATd3?= =?us-ascii?Q?YaI5cV6H7zA6CsTrSBDR8jEoK9hykXm//iMhrUZQIkCsQCOombcZqAIfLKlH?= =?us-ascii?Q?sYHcR2HwtKTFOxAIvYAtmoaDO/ZdfQfa3U0GLkW/1ocUvp8eCkjWqJgPSz6N?= =?us-ascii?Q?wPdWwBMPtqKkcd94pOsiA6wJn9OpOVb3bBsNP3QHGLi0zUJZeR9L6vBGGW26?= =?us-ascii?Q?uZBDsOqUWbE+pCvqnrvN1webeYCqIUk6iqUe87SjZ0Fx+/dLHUpWqdJ+taNI?= =?us-ascii?Q?/lDyIlfIPFb+lDbCs1H2tuazl8fOppSZZMLhxxn84Y0z1jVd7zpdvakaxQrA?= =?us-ascii?Q?ZML0w0bNp2YYBfsfnlMWU1RJhsDrCjQfnNXF4mVuddiCpwgpVFsMqrLFYawm?= =?us-ascii?Q?K81fddmmWwEY598bGXpmlPMzhstJ3gWzOF6sezXIGejvJ0GipkWXvtmcWiL2?= =?us-ascii?Q?lqYRDemXcobg+adzcQfprXyE374Nod0r7q8Bn2XARppksNN1VvZ+c8duA0EP?= =?us-ascii?Q?aOqkbTfOiDasjoFafisZyX0HBbcs6dGMOOW1JHFvMWoCCh72cMpA7wspue6S?= =?us-ascii?Q?blHRRFNyIhRlRIAX0cXxDFgr3ZbWx8g5CSY0Bwrrjr6OhrzIZuEh62F+vfY0?= =?us-ascii?Q?f5FbeaotO8cw6gb5qREIlVvcBjMZveOI1jfP00Vy6Fzn9wpF9ulf0IMBia3B?= =?us-ascii?Q?rAatjFfDoLPilQKrDkhcHq+0c906fOmNwmxMfKsYe3Y+s4cVtLsAJSeRxShM?= =?us-ascii?Q?qPsllLZV6VLETlPTRqZniTD/A/0/2cUYi7Yixw7t7qScLeeV/VfvXvVeLUQ+?= =?us-ascii?Q?ZIcX5ekGyop6zI+uVRkS5btXjyy194E20aDPLW7W9MWn83hkePBDk1zBn3Ur?= =?us-ascii?Q?3Ss3zogmXQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d5dfb8b8-405d-44e2-05cd-08ded716f021 X-MS-Exchange-CrossTenant-AuthSource: DM4PR12MB5390.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2026 02:17:45.2084 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: HkKfMM6JpBue3hvAqmkjHKW2Sgb1WEQE4H3FwzWId1naw5Gmlf1T5zI314SV+7mkVTtXD5/RruhBASVl/XQD/A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR12MB7169 Message-ID-Hash: MM6FMYIJAYDGIXR4P765KQDXUAS77S6C X-Message-ID-Hash: MM6FMYIJAYDGIXR4P765KQDXUAS77S6C X-MailFrom: nathanc@nvidia.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Matt Ochs , Nicolin Chen , Shameer Kolothum , Nathan Chen X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Nathan Chen via Devel Reply-To: Nathan Chen X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1782872505473158500 Content-Type: text/plain; charset="utf-8" From: Nathan Chen Add support for enabling HW-accelerated nested SMMUv3 via attribute and its additional attributes for ATS, SSID, RIL, and OAS configuration. Signed-off-by: Nathan Chen --- docs/formatdomain.rst | 29 +++++++++++ src/conf/domain_conf.c | 80 +++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 5 ++ src/conf/domain_validate.c | 27 ++++++++++- src/conf/schemas/domaincommon.rng | 25 ++++++++++ src/qemu/qemu_command.c | 15 ++++++ 6 files changed, 180 insertions(+), 1 deletion(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index a861f9f177..570395f586 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -9426,6 +9426,35 @@ Examples: The ``pciBus`` attribute notes the index of the controller that an IOMMU device is attached to. (QEMU/KVM and ``smmuv3`` model only) =20 + ``accel`` + The ``accel`` attribute with possible values ``on`` and ``off`` can = be used + to enable hardware acceleration support for smmuv3 IOMMU devices. + (QEMU/KVM and ``smmuv3`` model only) + + ``ats`` + The ``ats`` attribute with possible values ``on`` and ``off`` can be= used + to enable reporting Address Translation Services capability to the g= uest + for smmuv3 IOMMU devices with ``accel`` set to ``on``, if the host + SMMUv3 supports ATS and the associated passthrough device supports A= TS. + (QEMU/KVM and ``smmuv3`` model only) + + ``ril`` + The ``ril`` attribute with possible values ``on`` and ``off`` can be= used + to report whether Range Invalidation for IOMMU devices with + ``accel`` set to ``on`` is compatible with host SMMUv3 support. + (QEMU/KVM and ``smmuv3`` model only) + + ``ssidSize`` + The ``ssidSize`` attribute sets the number of bits used to represent + SubstreamIDs. A value of N allows SSIDs in the range [0 .. 2^N - 1]. + The valid range is 0-20, and a value greater than 0 is required for + enabling PASID support, as doing so advertises PASID capability to + the vIOMMU. (QEMU/KVM and ``smmuv3`` model only) + + ``oas`` + The ``oas`` attribute sets the output address size in units of bits. + (QEMU/KVM and ``smmuv3`` 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 17c4a57cd8..39cb6bc780 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2863,6 +2863,10 @@ virDomainIOMMUDefNew(void) =20 iommu->pci_bus =3D -1; =20 + iommu->ssid_size =3D -1; + + iommu->oas =3D -1; + return g_steal_pointer(&iommu); } =20 @@ -14746,6 +14750,26 @@ virDomainIOMMUDefParseXML(virDomainXMLOption *xmlo= pt, &iommu->pci_bus, -1) < 0) return NULL; =20 + if (virXMLPropTristateSwitch(driver, "accel", VIR_XML_PROP_NONE, + &iommu->accel) < 0) + return NULL; + + if (virXMLPropTristateSwitch(driver, "ats", VIR_XML_PROP_NONE, + &iommu->ats) < 0) + return NULL; + + if (virXMLPropTristateSwitch(driver, "ril", VIR_XML_PROP_NONE, + &iommu->ril) < 0) + return NULL; + + if (virXMLPropInt(driver, "ssidSize", 10, VIR_XML_PROP_NONE, + &iommu->ssid_size, -1) < 0) + return NULL; + + if (virXMLPropInt(driver, "oas", 10, VIR_XML_PROP_NONE, + &iommu->oas, -1) < 0) + return NULL; + if ((granule =3D virXPathNode("./driver/granule", ctxt))) { g_autofree char *mode =3D virXMLPropString(granule, "mode"); unsigned long long size; @@ -16849,6 +16873,12 @@ virDomainIOMMUDefEquals(const virDomainIOMMUDef *a, a->iotlb !=3D b->iotlb || a->aw_bits !=3D b->aw_bits || a->dma_translation !=3D b->dma_translation || + a->pci_bus !=3D b->pci_bus || + a->accel !=3D b->accel || + a->ats !=3D b->ats || + a->ril !=3D b->ril || + a->ssid_size !=3D b->ssid_size || + a->oas !=3D b->oas || a->xtsup !=3D b->xtsup || a->pt !=3D b->pt || a->granule !=3D b->granule) @@ -22733,6 +22763,36 @@ virDomainIOMMUDefCheckABIStability(virDomainIOMMUD= ef *src, dst->pci_bus, src->pci_bus); return false; } + if (src->accel !=3D dst->accel) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device accel value '%1$d' do= es not match source '%2$d'"), + dst->accel, src->accel); + return false; + } + if (src->ats !=3D dst->ats) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device ATS value '%1$d' does= not match source '%2$d'"), + dst->ats, src->ats); + return false; + } + if (src->ril !=3D dst->ril) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device ril value '%1$d' does= not match source '%2$d'"), + dst->ril, src->ril); + return false; + } + if (src->ssid_size !=3D dst->ssid_size) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device ssid_size value '%1$d= ' does not match source '%2$d'"), + dst->ssid_size, src->ssid_size); + return false; + } + if (src->oas !=3D dst->oas) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device oas value '%1$d' does= not match source '%2$d'"), + dst->oas, src->oas); + return false; + } if (src->dma_translation !=3D dst->dma_translation) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Target domain IOMMU device dma translation '%1$s= ' does not match source '%2$s'"), @@ -29203,6 +29263,26 @@ virDomainIOMMUDefFormat(virBuffer *buf, virBufferAsprintf(&driverAttrBuf, " pciBus=3D'%d'", iommu->pci_bus); } + if (iommu->accel !=3D VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&driverAttrBuf, " accel=3D'%s'", + virTristateSwitchTypeToString(iommu->accel)); + } + if (iommu->ats !=3D VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&driverAttrBuf, " ats=3D'%s'", + virTristateSwitchTypeToString(iommu->ats)); + } + if (iommu->ril !=3D VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&driverAttrBuf, " ril=3D'%s'", + virTristateSwitchTypeToString(iommu->ril)); + } + if (iommu->ssid_size >=3D 0) { + virBufferAsprintf(&driverAttrBuf, " ssidSize=3D'%d'", + iommu->ssid_size); + } + if (iommu->oas >=3D 0) { + virBufferAsprintf(&driverAttrBuf, " oas=3D'%d'", + iommu->oas); + } if (iommu->granule !=3D 0) { if (iommu->granule =3D=3D -1) { virBufferAddLit(&driverChildBuf, "\n"); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 0c6c79c413..40ea6090f8 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3105,6 +3105,11 @@ struct _virDomainIOMMUDef { virTristateSwitch xtsup; virTristateSwitch pt; int granule; /* -1 means 'host', 0 unset, page size in KiB otherwise */ + virTristateSwitch accel; + virTristateSwitch ats; + virTristateSwitch ril; + int ssid_size; + int oas; }; =20 typedef enum { diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 3946f92182..40d47dab57 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -3203,6 +3203,16 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *i= ommu) virDomainIOMMUModelTypeToString(iommu->model)); return -1; } + if (iommu->accel !=3D VIR_TRISTATE_SWITCH_ON && + (iommu->ats !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->ril !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->ssid_size >=3D 0 || + iommu->oas >=3D 0)) { + virReportError(VIR_ERR_XML_ERROR, + _("accel must be enabled for iommu model '%1$s'= when setting ats, ril, ssidSize, or oas"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } break; case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: if (iommu->intremap !=3D VIR_TRISTATE_SWITCH_ABSENT || @@ -3210,7 +3220,12 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *i= ommu) iommu->eim !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->iotlb !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->dma_translation !=3D VIR_TRISTATE_SWITCH_ABSENT || - iommu->pci_bus >=3D 0) { + iommu->pci_bus >=3D 0 || + iommu->accel !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->ats !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->ril !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->ssid_size >=3D 0 || + iommu->oas >=3D 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support some addi= tional attributes"), virDomainIOMMUModelTypeToString(iommu->model)); @@ -3233,6 +3248,11 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *i= ommu) iommu->aw_bits !=3D 0 || iommu->dma_translation !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->pci_bus >=3D 0 || + iommu->accel !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->ats !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->ril !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->ssid_size >=3D 0 || + iommu->oas >=3D 0 || iommu->granule !=3D 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support some addi= tional attributes"), @@ -3245,6 +3265,11 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *i= ommu) if (iommu->pt !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->xtsup !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->pci_bus >=3D 0 || + iommu->accel !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->ats !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->ril !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->ssid_size >=3D 0 || + iommu->oas >=3D 0 || iommu->granule !=3D 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support some addi= tional attributes"), diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index 121e4e06a6..ea38065764 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6454,6 +6454,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e726dc661c..1e66da2cd3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6276,6 +6276,8 @@ qemuBuildPCINestedSmmuv3DevProps(const virDomainDef *= def, { g_autoptr(virJSONValue) props =3D NULL; g_autofree char *bus =3D NULL; + g_autofree char *ssidsizeStr =3D NULL; + g_autofree char *oasStr =3D NULL; virPCIDeviceAddress addr =3D { .bus =3D iommu->pci_bus }; =20 bus =3D qemuBuildDeviceAddressPCIGetBus(def, &addr); @@ -6286,10 +6288,23 @@ qemuBuildPCINestedSmmuv3DevProps(const virDomainDef= *def, return NULL; } =20 + if (iommu->ssid_size >=3D 0) { + ssidsizeStr =3D g_strdup_printf("%u", iommu->ssid_size); + } + + if (iommu->oas >=3D 0) { + oasStr =3D g_strdup_printf("%u", iommu->oas); + } + if (virJSONValueObjectAdd(&props, "s:driver", "arm-smmuv3", "s:primary-bus", bus, "s:id", iommu->info.alias, + "B:accel", (iommu->accel =3D=3D VIR_TRISTATE= _SWITCH_ON), + "S:ats", iommu->ats =3D=3D VIR_TRISTATE_SWIT= CH_ON ? "on" : iommu->ats =3D=3D VIR_TRISTATE_SWITCH_OFF ? "off" : NULL, + "S:ril", iommu->ril =3D=3D VIR_TRISTATE_SWIT= CH_ON ? "on" : iommu->ril =3D=3D VIR_TRISTATE_SWITCH_OFF ? "off" : NULL, + "S:ssidsize", ssidsizeStr, + "S:oas", oasStr, NULL) < 0) return NULL; =20 --=20 2.43.0