From nobody Mon Feb 2 09:25:52 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; 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 8.43.85.245 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 [8.43.85.245]) by mx.zohomail.com with SMTPS id 176773328015766.37319767384486; Tue, 6 Jan 2026 13:01:20 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id 830A441ADB; Tue, 6 Jan 2026 16:01:19 -0500 (EST) Received: from [172.19.199.83] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 0411B43E6A; Tue, 6 Jan 2026 15:55:18 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id EAAC341AD6; Tue, 6 Jan 2026 15:54:40 -0500 (EST) Received: from BN1PR04CU002.outbound.protection.outlook.com (mail-eastus2azon11010013.outbound.protection.outlook.com [52.101.56.13]) (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 91EFD41AE4 for ; Tue, 6 Jan 2026 15:54:37 -0500 (EST) Received: from SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) by DS0PR12MB8416.namprd12.prod.outlook.com (2603:10b6:8:ff::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9499.2; Tue, 6 Jan 2026 20:54:28 +0000 Received: from SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::69ae:2df4:372b:6fbc]) by SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::69ae:2df4:372b:6fbc%7]) with mapi id 15.20.9499.002; Tue, 6 Jan 2026 20:54:28 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-5.0 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_INVALID,DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vOVfEUfmuEgtfIcuegjVprzrtHMZL9Q7ac64KjkN4dbK3IT+A8z/ZTgFVuCB3idhK+mxpWMaAWIQrL9rZkGVfaGi51CB0gBpUcJ/Fy+RWypevXIbmio/pSmJX4tQC6h1NLyMSBhs7wNE2gFN8ycxhjjvSOxCV98rtTuzVpyQDnAoOjn376jL0yaBzj76QnOg2vlIOWJwjYWRQBMRHgg/nowGQEgry7ccV9PENHOgRGGYTr5rkTex5xq7ibDDv03epGH7/ChdtrPX/kDABKRgdIYGmNXh3znzJ/IdtRBBjcNULec1bCRDHRhGDg9FreJMBrvYCsH8bl+AFOPQQm42NA== 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=PoI4pA0Gp66juFFmEZBIz8CYU4oE629evpJg0Y/UZJQ=; b=f0HFEt3KWY2T9mkHD0bCnXigIQcPUQbs1SYL3Niup2BC9MRSBsd2iLOnz/Q0QfXlKwL+kBpD0XLDky4vHfVjU1wl8PmDOHa+YHndf5vubFI5HDa5LqqfnyWi7EBewAY7fcXS+hSnf/c5GhhVraM+Q92iJmHHnMGKlbtTYx6xWfdKF9cZtH/W9lBwFyGwCX9qyWVsMRSvQoLX/WA+NQWlXWw8UWgwrGpCJVOWzgg/MJ57CNydH0zI7392+Dpc0VNaqeJ39ZkprIUeM0qcfrc1721g92j3iJyNNcAprJ+k6Z/CCl8cz9Y9Gx9FRKv/qGWzyhT3+pYutpa15zn/iOXwVw== 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=PoI4pA0Gp66juFFmEZBIz8CYU4oE629evpJg0Y/UZJQ=; b=hobK+MhKB4PyMbBnUVd+q8haZhjXKoI4vmGbPIlp9MaIeWrv4VybtBPZ6b6x8UjRZTJmQ3JwMeqREkXZZ64bj+YUyBTm/OXzJBlMqpl+u3DvY5u5mYiTMkCbep0ZdL0PfXep4tmoUfOjj7E5QPank+8cSRj6RDzWuso0vt8IVazl77MvSMPwkAo+12dVxn+wcU7HzaJlT61Ljs8AaUyqRD9w0O/6pM9k9FscSvTCv7EJLpFOWLCn28zqbVyyU8wA5yNdFxiksxnwJlK8Jh2r8HJDKJgPSwZodF32KEAoNo7MapLYCxBfhjC627dWYftGAd4OYVg3HPLmMQRje7QcNw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; To: devel@lists.libvirt.org Subject: [RFC PATCH v6 1/4] qemu: Add support for HW-accelerated nested SMMUv3 Date: Tue, 6 Jan 2026 12:54:22 -0800 Message-ID: <20260106205425.363116-2-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260106205425.363116-1-nathanc@nvidia.com> References: <20260106205425.363116-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BY5PR03CA0006.namprd03.prod.outlook.com (2603:10b6:a03:1e0::16) To SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN7PR12MB6838:EE_|DS0PR12MB8416:EE_ X-MS-Office365-Filtering-Correlation-Id: d6765498-6e94-4f1f-24b6-08de4d65c7d3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|1800799024|366016; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?JDkg/JwPVPkKETlT60/M34PDsfTAIJJ6CiLuXAGdRS5pP5UYLKKQ8Di7Scqz?= =?us-ascii?Q?6o/wNaoVgaJXroL2t3Mx1LzzRQXQPtOdvt0SvkWsgOChkLhd/niReCNDYHja?= =?us-ascii?Q?Aok5c9yXQYCaGcnxfUknfDwJTbaxkVXL19zUAXJ0FStPp80/VKOYHgLNJDfG?= =?us-ascii?Q?//UjW51gxMeMnOcrSrU7cSMaJVzzPtv9GudyqQcp3VJJiBYPMCVoE3UqUfr9?= =?us-ascii?Q?m04bIy2Z6QzNsTYpYln3+tBNQ7b70wGbqNIXcScsPyTjiWPa3QBuUGY93AnL?= =?us-ascii?Q?mvhIUF+/9m2anzYZNn5qR70dWnd9X4tOVVhLkuzq+G2yts83rRhjPmZwDJ+i?= =?us-ascii?Q?DUcrh04qgf6RUp8X4RvdtTJdXVnbCaxaMfiR84tzmN72+guyeOLR2UvWSWGm?= =?us-ascii?Q?PcpR1Zy8Mnbo8ACN2tyMZOxrHrRxpIHCvVeIJ4TvABsm4ujS/UeltsVN+RVb?= =?us-ascii?Q?k2BDK6cTSzHwJF+bPtO7h9gCgNi63Y9UQZJ+7iaZmiPLT/JRiC3kGoZFdkef?= =?us-ascii?Q?bPqN8U7HsqtK4v7vWtbHBsKNo49vSvkIkxCWEh7wuNqgqBddH4n9VF45ugT7?= =?us-ascii?Q?tin2EQgpvnMMF8LnJnqNxsPf7ZuAwcVVXJQlqmWCaiecanAo/oyZ7NAqRuPw?= =?us-ascii?Q?vUk6GUu8ipIY0P6jl73EbwHxRnmqf+jighH2UvH01zYOpKSHS36ZZ9jt3ji0?= =?us-ascii?Q?yJXYe0Y6QeLwfg+gSEWAOYdg+iXzLYhnXMmM6p4Mihwcw0iY0MJNnkxTt5kg?= =?us-ascii?Q?koi+vjOsqMnxgzbVBublx2LiVbpVzZOBZ7kcqQjisUfU5zneEXuCNWiADuof?= =?us-ascii?Q?KjlP9VNK9M6utXbi8nYw8zLdHsaLaoMVFg4PssTNDnNmPUkq4ws0gfJIoFsd?= =?us-ascii?Q?KmsOEAlVnOX8y577eHRiz3M5bdvokW2xKiS7/4Bx+XmKyWasNcM0QQK5rWwB?= =?us-ascii?Q?hyXZDxGSAEsnEEI4kpHwwnZeV44KZ3gihyDiP2d24E8By+dhSvzSgbO0ZNxV?= =?us-ascii?Q?j8MWoYygXNObEZwjCcfuEr+WK8n4pr9D97MJZRnT+AsKsA7f5Vr87ZRKekIP?= =?us-ascii?Q?jU+dIfC/mMGaWcU4ThRwzdj6IvgaYMfnhjmuXvZ3Du1Ob9QrgibaHMAyDQfP?= =?us-ascii?Q?nRwcAzDdZWw3aKoQlvF65RhiYkL8EktwwX3IO9SOPfZH8Qf+rybrlFsArHql?= =?us-ascii?Q?JrvrBgy52FzQqPKU8vGlJRkvrtEf3dcAmU1zXaKv4aQ2D+OrniII071MNSHD?= =?us-ascii?Q?a+ML4rVJwGKh2+9PGUYJ/wYdJsdN6KAyxVvCWnQjRCz3qjPtnoH7ewLvz3fn?= =?us-ascii?Q?kb8a4HRYMmcXfVPPr3odpLTyYkohTTQhKV1KqksLIr4NIgkrvvFFPtVo8WMt?= =?us-ascii?Q?ne2RWNWyIaISTj9v77ZFnd7nz8OVvd+JhMo+7niF5RojW0Ny7CNUhw9bpXNG?= =?us-ascii?Q?mGW7xO96viN/EBxBHBRnFbo/GMRMhFXr?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN7PR12MB6838.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(1800799024)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?vxCunZNg8rPWCuEG2nt4im+o+UoHzlda5bROmKe4Be4zTs0yqUzSrSKhzTyk?= =?us-ascii?Q?ERvkV4fw3wJt9D2VtGcunHrqp3mRfJhpttt38SvK8YfiZWa9L7t1tYpc9HK1?= =?us-ascii?Q?+I4nLYxHZ3fnp5v90cVhxb2Wpnxu4vJo32tdmRM+Yh8kYVd4A/n/XXASftL+?= =?us-ascii?Q?yVQ21fmkT2ScJqgKHiSA6Jf6r7VPExBf+Hr99mKHIQ1npRCI6BOqlBpLSAb1?= =?us-ascii?Q?v7VDZUJ2WKCi19D7/TH+yBLIJEyN2ylF3mb+c6+OJBQSVMUoN0L6bDtF3nuR?= =?us-ascii?Q?PxoFDRLO0ESvDFvbFVxxfRt1dSLJ2i84zdVXMQzGRn1jNAqDqMO5cNfxpF0f?= =?us-ascii?Q?PtJ5bQOHEpSqxwRWshLFtY+sEU/EYebpKjrn6yZaUbAQbb4Nj8PHQnutiQzm?= =?us-ascii?Q?nY5gkd1jHw4LIX1nEtEMWAdZrSWR/utFaJ3C1OiEJGYbChCA2QT7xBI633SY?= =?us-ascii?Q?4RKa9xMXabQQ4H0GkNVDQA8WKEWO2EvpDJnn91y28Dq82B0qa+vmMc7DNRwT?= =?us-ascii?Q?NWW8ZIzTLahKx/yeL24gdHrpdaXxdbLS7qUbVdTtPOHhTLRM0VqVSH14QDSc?= =?us-ascii?Q?oI92aOrBWdEVUR34zZnJhMlBkbihmlm+9nzBLEfoUG9+vI759FyyamF2bziW?= =?us-ascii?Q?NuaF7oBHwyoUs93ZRkQURpS7SeH8CCM/Oo++NMaic59slLzEzcs/oqPXtbGX?= =?us-ascii?Q?j3uPhnn0iNI2c7LXYSchMPOJH278lfLhXwK1tbJOnc7PkLynDfb1YEtNejl5?= =?us-ascii?Q?pk2O/A2ktAfMozggMVeIdfZhJjNBC+v4GPHShV/CgKD6YzB57nIJvrRnSmhu?= =?us-ascii?Q?qPbFCgecOTGwQiasXnLcf5Ohc4LB3dYsXG5MY81KCjZnrS2HB5+c1csm+6PH?= =?us-ascii?Q?AogqpUa0wBbuHJuH+Nmqhe5ZRnwfjDdPa7VodzYIH5jwwyDzy3OPWSUEUSOy?= =?us-ascii?Q?tSVlnDWfnQjP64ofBePJjXYUz9Qaow0sKSqfY0cPYaESqEaUGDO3LQxCiAk8?= =?us-ascii?Q?aJo83SYsDyrjWcCM8luEDY07zFpRWSpAZFHT5s7alHDMljFLh/Dlnfno5iOi?= =?us-ascii?Q?sQOFhsuoZT1ZYKvrZ/75MumqfsfG2KUc0sRwV/AnsX1giMjQft4fZC0kaUKF?= =?us-ascii?Q?p9JW1h+f8YQyUtnwHWPpyJRwtPM8uGWBcMrGJpszAPTg+dFE71mnE6Ty0hkf?= =?us-ascii?Q?5P0bPkNvQAu3JkyuHvrcKTNzCql+AwhpI8PfXjyuug/GYxKN5Lqhr90AOPMZ?= =?us-ascii?Q?O4e56Z8C5LFD2g2T7bf/v5SJyefPVsfWN1EKYQCRmJA1k+xBRfBqWIwjlZTa?= =?us-ascii?Q?UUGElqN8WLhVc0Pj+q7aIRrcyQzunJEtxHB2V339MZmuyqktaCIC6euQQEdL?= =?us-ascii?Q?oldNXfXHKm9nex73lkTUaZPrZMABukyRn6HvrR/pV1J+EE0kkL4jJBFW0Igg?= =?us-ascii?Q?Dp3z0bJBfUzBZVDIzJX7oh8mntYqrIII0Jx063R58bFBMzYFHuMVZS7i4Y7U?= =?us-ascii?Q?1MM8grYpP6HsQWQ4JY9bTNUqRjFh3qVwZSlK+JhzKCvTIUqY/4Of8sIb7wOR?= =?us-ascii?Q?yhsHAKCPkB5r2yS84EFo05XiBA4G9w6cWDlTYWu4fLENNbY3l7RbDGdbquY1?= =?us-ascii?Q?IFLGHok4cmsm1nFiGy96OiGqxgCT9eFZ8cbryVwRd23IBQB+U9xsgR1R0OGd?= =?us-ascii?Q?0rFjotpFY5Su/EeLmQMv5UAjZNOTTCKfjFKixy8QLbtsogIqFQzg1Br637cU?= =?us-ascii?Q?nhJBUWNYaQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d6765498-6e94-4f1f-24b6-08de4d65c7d3 X-MS-Exchange-CrossTenant-AuthSource: SN7PR12MB6838.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Jan 2026 20:54:27.3677 (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: q7SQUY269ODCmTRfbk9I08jYU0J26maEN6Jwyk/M6Q/1X/zlRT1jj90mK6HyldAzNXBLlrSYlxA7cQVeDfTD3Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB8416 Message-ID-Hash: LKNV2HXZY4JTX22BJZ574LRTV5IPQ4RD X-Message-ID-Hash: LKNV2HXZY4JTX22BJZ574LRTV5IPQ4RD 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: skolothumtho@nvidia.com, nicolinc@nvidia.com, nathanc@nvidia.com, mochs@nvidia.com 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: 1767733283000158500 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, PASID, RIL, and OAS configuration. Signed-off-by: Nathan Chen --- docs/formatdomain.rst | 27 +++++++ src/conf/domain_conf.c | 78 ++++++++++++++++++- src/conf/domain_conf.h | 5 ++ src/conf/domain_validate.c | 21 ++++- src/conf/schemas/domaincommon.rng | 25 ++++++ src/qemu/qemu_command.c | 11 +++ ...-smmuv3-pci-bus-single.aarch64-latest.args | 2 +- .../iommu-smmuv3-pci-bus.aarch64-latest.args | 4 +- 8 files changed, 166 insertions(+), 7 deletions(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 04ef319a73..458a514b60 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -9264,6 +9264,33 @@ Example: 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 smmuv3Dev 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 smmuv3Dev 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 smmuv3Dev IOMMU devices with + ``accel`` set to ``on`` is compatible with host SMMUv3 support. + (QEMU/KVM and ``smmuv3`` model only) + + ``pasid`` + The ``pasid`` attribute with possible values ``on`` and ``off`` can = be + used to enable Process Address Space ID support for smmuv3Dev IOMMU = devices + with ``accel`` set to ``on``. (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) + The ``virtio`` IOMMU devices can further have ``address`` element as descr= ibed in `Device addresses`_ (address has to by type of ``pci``). =20 diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index b85bbbcaf6..99183b5c82 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -14514,6 +14514,26 @@ virDomainIOMMUDefParseXML(virDomainXMLOption *xmlo= pt, if (virXMLPropInt(driver, "pciBus", 10, VIR_XML_PROP_NONE, &iommu->pci_bus, -1) < 0) return NULL; + + 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 (virXMLPropTristateSwitch(driver, "pasid", VIR_XML_PROP_NONE, + &iommu->pasid) < 0) + return NULL; + + if (virXMLPropUInt(driver, "oas", 10, VIR_XML_PROP_NONE, + &iommu->oas) < 0) + return NULL; } =20 if (virDomainDeviceInfoParseXML(xmlopt, node, ctxt, @@ -16565,7 +16585,13 @@ virDomainIOMMUDefEquals(const virDomainIOMMUDef *a, a->eim !=3D b->eim || a->iotlb !=3D b->iotlb || a->aw_bits !=3D b->aw_bits || - a->dma_translation !=3D b->dma_translation) + 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->pasid !=3D b->pasid || + a->oas !=3D b->oas) return false; =20 if (a->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && @@ -22262,6 +22288,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->pasid !=3D dst->pasid) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device pasid value '%1$d' do= es not match source '%2$d'"), + dst->pasid, src->pasid); + 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'"), @@ -28608,6 +28664,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->pasid !=3D VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&driverAttrBuf, " pasid=3D'%s'", + virTristateSwitchTypeToString(iommu->pasid)); + } + if (iommu->oas > 0) { + virBufferAsprintf(&driverAttrBuf, " oas=3D'%d'", + iommu->oas); + } =20 virXMLFormatElement(&childBuf, "driver", &driverAttrBuf, NULL); =20 diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index cb35ff06bd..71ed4ce0ed 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3062,6 +3062,11 @@ struct _virDomainIOMMUDef { virTristateSwitch dma_translation; virTristateSwitch xtsup; virTristateSwitch pt; + virTristateSwitch accel; + virTristateSwitch ats; + virTristateSwitch ril; + virTristateSwitch pasid; + unsigned int oas; }; =20 typedef enum { diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 4558e7b210..0f84e9f237 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -3140,7 +3140,12 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *i= ommu) iommu->iotlb !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->aw_bits !=3D 0 || 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->pasid !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->oas !=3D 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support additiona= l attributes"), virDomainIOMMUModelTypeToString(iommu->model)); @@ -3153,7 +3158,12 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *i= ommu) iommu->eim !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->aw_bits !=3D 0 || 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->pasid !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->oas !=3D 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support some addi= tional attributes"), virDomainIOMMUModelTypeToString(iommu->model)); @@ -3164,7 +3174,12 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *i= ommu) case VIR_DOMAIN_IOMMU_MODEL_INTEL: if (iommu->pt !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->xtsup !=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->pasid !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->oas !=3D 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support some addi= tional attributes"), virDomainIOMMUModelTypeToString(iommu->model)); diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index 5d5fd87f87..3d6dc695c4 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6329,6 +6329,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 0de0a79b46..c4a6ec7aa6 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6267,9 +6267,20 @@ qemuBuildPCINestedSmmuv3DevProps(const virDomainDef = *def, "s:driver", "arm-smmuv3", "s:primary-bus", bus, "s:id", iommu->info.alias, + "b:accel", (iommu->accel =3D=3D VIR_TRISTATE= _SWITCH_ON), + "b:ats", (iommu->ats =3D=3D VIR_TRISTATE_SWI= TCH_ON), + "b:ril", (iommu->ril =3D=3D VIR_TRISTATE_SWI= TCH_ON), + "b:pasid", (iommu->pasid =3D=3D VIR_TRISTATE= _SWITCH_ON), NULL) < 0) return NULL; =20 + if (iommu->oas > 0) { + if (virJSONValueObjectAdd(&props, + "U:oas", (unsigned long long)iommu->oas, + NULL) < 0) + return NULL; + } + return g_steal_pointer(&props); } =20 diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-single.aarch64-late= st.args b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-single.aarch64-latest.= args index 34e7bda1c5..f5c76018e9 100644 --- a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-single.aarch64-latest.args +++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-single.aarch64-latest.args @@ -30,7 +30,7 @@ XDG_CONFIG_HOME=3D/var/lib/libvirt/qemu/domain--1-guest/.= config \ -device '{"driver":"pxb-pcie","bus_nr":248,"id":"pci.2","bus":"pcie.0","ad= dr":"0x2"}' \ -device '{"driver":"pcie-root-port","port":0,"chassis":21,"id":"pci.3","bu= s":"pci.1","addr":"0x0"}' \ -device '{"driver":"pcie-root-port","port":168,"chassis":22,"id":"pci.4","= bus":"pci.2","addr":"0x0"}' \ --device '{"driver":"arm-smmuv3","primary-bus":"pci.1","id":"iommu0"}' \ +-device '{"driver":"arm-smmuv3","primary-bus":"pci.1","id":"iommu0","accel= ":false,"ats":false,"ril":false,"pasid":false}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -object '{"qom-type":"rng-random","id":"objrng0","filename":"/dev/urandom"= }' \ -device '{"driver":"virtio-rng-pci","rng":"objrng0","id":"rng0","bus":"pci= .3","addr":"0x0"}' \ diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus.aarch64-latest.args= b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus.aarch64-latest.args index ff75b08944..839763e6d2 100644 --- a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus.aarch64-latest.args +++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus.aarch64-latest.args @@ -30,8 +30,8 @@ XDG_CONFIG_HOME=3D/var/lib/libvirt/qemu/domain--1-guest/.= config \ -device '{"driver":"pxb-pcie","bus_nr":248,"id":"pci.2","bus":"pcie.0","ad= dr":"0x2"}' \ -device '{"driver":"pcie-root-port","port":0,"chassis":21,"id":"pci.3","bu= s":"pci.1","addr":"0x0"}' \ -device '{"driver":"pcie-root-port","port":168,"chassis":22,"id":"pci.4","= bus":"pci.2","addr":"0x0"}' \ --device '{"driver":"arm-smmuv3","primary-bus":"pci.1","id":"iommu0"}' \ --device '{"driver":"arm-smmuv3","primary-bus":"pci.2","id":"iommu1"}' \ +-device '{"driver":"arm-smmuv3","primary-bus":"pci.1","id":"iommu0","accel= ":false,"ats":false,"ril":false,"pasid":false}' \ +-device '{"driver":"arm-smmuv3","primary-bus":"pci.2","id":"iommu1","accel= ":false,"ats":false,"ril":false,"pasid":false}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -object '{"qom-type":"rng-random","id":"objrng0","filename":"/dev/urandom"= }' \ -device '{"driver":"virtio-rng-pci","rng":"objrng0","id":"rng0","bus":"pci= .3","addr":"0x0"}' \ --=20 2.43.0