From nobody Tue Oct 28 17:46:58 2025 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; 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 1761089957593995.484662784324; Tue, 21 Oct 2025 16:39:17 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id C0E6D41CAE; Tue, 21 Oct 2025 19:39:16 -0400 (EDT) Received: from [172.19.199.20] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 87FCD43E1D; Tue, 21 Oct 2025 19:37:24 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id A784241986; Tue, 21 Oct 2025 19:33:18 -0400 (EDT) Received: from DM5PR21CU001.outbound.protection.outlook.com (mail-centralusazon11011046.outbound.protection.outlook.com [52.101.62.46]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (3072 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id E0338418D0 for ; Tue, 21 Oct 2025 19:33:16 -0400 (EDT) Received: from SJ0PR12MB6855.namprd12.prod.outlook.com (2603:10b6:a03:47e::6) by MW4PR12MB7030.namprd12.prod.outlook.com (2603:10b6:303:20a::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9253.12; Tue, 21 Oct 2025 23:33:14 +0000 Received: from SJ0PR12MB6855.namprd12.prod.outlook.com ([fe80::1924:8e6f:c8f3:83c2]) by SJ0PR12MB6855.namprd12.prod.outlook.com ([fe80::1924:8e6f:c8f3:83c2%3]) with mapi id 15.20.9253.011; Tue, 21 Oct 2025 23:33:14 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=ARC_SIGNED,ARC_VALID, 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=kUTmyCr/0+gPWa0I5M+19KzQ5U7KFv3gNFL27WH/GEnljJxcMusSF1LqiB6uPJSzYEqiqmFanoyr8jYbDIZeiU1JFFfUqjndr7TDbwjvO7qQj00II0DKdpaNCafseleFBG5t+yAGgPiAdlaUK2gF1DbV1QDBPosp8NoKUGPtRs6OXI/RuI89ieprPQDnBED2wYKouBlkVwDn3Wg9u2xJWBnEiPAjN0xIdMvPjdzfSC2Rtl/wizOeXNHepboMdBrsTSomwZWsxACud0zrmbgAIiiGCw5FojOV0pGViiv/1D48I2tzF9MJ0HUZfOKoQQzHvX32EauAkX52wwRJGVhl6w== 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=aCO0MgvWT12SHP4xPe1lHoqQh+EQeYWjOYw0qH74fKA=; b=t1A/sTeoGE0S5ZqXwzWx/1aAnvOHcXp1pHWRXDiOAbJUjM+N2AWCOdgIYPrnvz9qZ52INLHYufWrkF4HJXiMcd/eKnEUcg7QzoiGrwhv+BxA13fs/5++SGuyxVfGH8XIPbrptQNUvaAnAVhLzqZD7pjAIA01QtHgDIIqJM3F7nT9YRSXOK0eFOK4w+i1TFcN61/i1qDGmb2Ce1kCj1jukkMuCHcw6PcvsfI6QkvJW8PbseSqW5c9+O9ASSyZC4VgH3QMZ9D2/5+E3KIIl26IqVKocfX7vXRGp4Zr6sLYdTuMEfFclH+W2eRuFcprrILYE1quQ4FOUvfFtCFccDVJRg== 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=aCO0MgvWT12SHP4xPe1lHoqQh+EQeYWjOYw0qH74fKA=; b=URnLgjUYupvezdMjHmED41Ec5kgScV6IyceTp2zAHJjYpA5pKJmiewSo3wLWFVQ5DzzdDbNKNPbcwPJOo7CTwXqWPYzXVVJmpdebIYs3jaG/07l6zrJVZM+ZAGS58f0dG7U38Mnc8uErNeJk3CWZqiwoIJQUaBpbEEu4mz91GDCcpag7LnYvLQilz+IDBiiZUqU7bjoibi7uHL89mcWPQWjnTXNj80sI5jqDKkDNtgm17dPgDf7zzTwdPEGPMCyNFmYFUa0jDBmP9Dv4p19fm/BnIumZLd+rellEux6kuJJ2EJx+WIKc/CG6Tm4EgU4M+7BHM0sTXpowAPOhGZbszw== 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 v3 2/3] qemu: Implement pluggable-device smmuv3 Date: Tue, 21 Oct 2025 16:32:54 -0700 Message-ID: <20251021233255.3474571-3-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251021233255.3474571-1-nathanc@nvidia.com> References: <20251021233255.3474571-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0255.namprd03.prod.outlook.com (2603:10b6:a03:3a0::20) To SJ0PR12MB6855.namprd12.prod.outlook.com (2603:10b6:a03:47e::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR12MB6855:EE_|MW4PR12MB7030:EE_ X-MS-Office365-Filtering-Correlation-Id: 108e4a1d-b6a4-4ca4-b15a-08de10fa3459 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?2S0aUkvj/rGeSeSQfjrcHkZGWIsua+TOt9hwepb+eq9Hh2W0GdkVULd4nu4A?= =?us-ascii?Q?x37EwhIEN5QLNMLf47sQQSuN6cPz8MWwWniVOyFb7X9cFzljNKHYDN8c0gVc?= =?us-ascii?Q?zAFrs81WNmf6hCpVpSiueVjOcMk9VTLdTThQdrOid4cRs48ktpukwxJqELQ1?= =?us-ascii?Q?HCf7Z46JTly1RrpKuLh0NmnM1tEuJaG7EU7BZewMGmvrFOLF86q26cn0fAM5?= =?us-ascii?Q?/TGjseGW7Fc19uJbX+iR/Htm7cgLzpyH23niGR5bcBEKasxgoQR/4lTUIFV4?= =?us-ascii?Q?ESlGSG8JlVvokBG58+GnvlRtH3MSEAZ9PuftlLWKyXAoROVz/Z7SYPWMybJs?= =?us-ascii?Q?2//eqUhNiFspMZCh6wiAGJdgm3rSb5kr51RbnmNkLfn7T4w8rjeLDzloLpq/?= =?us-ascii?Q?EY/D30OzeiM4AcaUNxDQvrJtlD1cuk5CEn8P1DaSh9tWKFcJKUqwDmFj4+kq?= =?us-ascii?Q?OYVmc1r9ZdoLQaUCbOFJfcWenVEZZYRiJaMnsWa++n4WYay/fNgF47fL8zUH?= =?us-ascii?Q?oDf5Wk76pn7U6TXXXgWFvSJsHN/tMjn2diwknJqd00ebcYlck8leD5bqbuAr?= =?us-ascii?Q?uCtyYQsjADtdM8CjSp4Wf+8i91QDEUS0mXg8oLvaqkZ6eW6KOkMIsMX4V+bZ?= =?us-ascii?Q?C/w265u6vRtxoeWkYZg5oO5KxgBj4oDxtMPxmWklAyxIET/4LMX8Xs/aTWH3?= =?us-ascii?Q?mEgYpHlOFwIWIeaSDsL4x2FsZNoSDpijg2R845nSD8rBUuN9kCqh88Ei6utb?= =?us-ascii?Q?hOgHYkbiNx4LsAUe7MCANhiw0SRyFfDLberM1cqrJJvsno5d4EHiBePgNMGp?= =?us-ascii?Q?fMuNOuNKwweWDXMsNe8xR90nUehW0W94EkwiNb/QdKZ2A2tT9D8Ub3rcg3Vo?= =?us-ascii?Q?KU+CfOS92y4iljmzB0bX+hlq9SLUn/UI8iStu215HTR6YnSiGpAB/M4Z+0L9?= =?us-ascii?Q?R+asCTcTIdeSBB04NrrBINTkXtqjon7/6CbqN9FU3RYOesev3U8WBa604r5J?= =?us-ascii?Q?bBtaErblSPqJh89Aq01DEm1UzldC5q3+K9HRPwaYuoBJdpyJpPWQ2VRZJ5zZ?= =?us-ascii?Q?LKzQsU1gq1F7cQ3jgavGJDkO+dxhuhk5Lrlk5ipXCOI9ZyDSlTDEiwb9n6Re?= =?us-ascii?Q?4G76dQvx8I4mUNUQG79Ax0AJymO3P+TBittvfoJdslo+D15ZIk3poZJOdyzS?= =?us-ascii?Q?raQQ9V0pgCX67mYEhUoWbR2h/s9ZD0S3ZchilG3g7SDmrGkKGlBg27wWbOte?= =?us-ascii?Q?pmJi0iBZ689WfZmuv1iiUKtXXXzJFPv7hy170R985Xw52sGzAp4ULMvLmVHZ?= =?us-ascii?Q?11yk11JQO2S2dmtaDuwxf4Z1wjclFRs34ydoMceaL5OI/rActIE7bIjByNJb?= =?us-ascii?Q?H4pbX7Oy85Iu+9CeE4OnhWkUgo6sGUZlHMqpUsRevtKbDWNhzAhCrOBFWgGA?= =?us-ascii?Q?PdGu5IWsoP4A9Lqkg5viqNPBwEtvfz3+?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SJ0PR12MB6855.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?zgZOlPcyxmlYbzRJGKpUOZsbBsHIhBP9oVgh4VZqRRXPcxMjaEEBNGkXn8pe?= =?us-ascii?Q?E46zAoYY397HRNa17g8fO4ffstlAxebkeTLpRhBB9edt5qJSaRWja+5o8fi4?= =?us-ascii?Q?fVOF40Urpj6BqZlhejvhbLRMnOkNYjRFBY6fH1JDjsWTy6InTstF0SeZ1Srd?= =?us-ascii?Q?Wsghme3q5+eVE/TPxi+4rc98rl2NVXGtJ7cAmZ1Fdwc6iNYgGMRfMvb6DStj?= =?us-ascii?Q?Z2cWDBLZn97zOU1YjttiEU3SWpmeg8pEgolZUomIYJ4hcunYO8aLm0Q+XlJW?= =?us-ascii?Q?xAQVz9OI6NbBbU5fFsw+wXfUIg0eJfctCzEZ8X+yWajCAAHhDW1zFbWaLfyR?= =?us-ascii?Q?gVhDrsigooXdvifFJGBEWscFsW12oBIOJX1k/1tLo3t11o6DO1+JcDhiwYPR?= =?us-ascii?Q?hczXIHrveUDSYTVFGKXmB9kWlWg4WzKI5d6FG45qepBzoaNaYlnzIliTqqpY?= =?us-ascii?Q?m6w00P/G0nG7T4jdw+o999OM2MS1wU8G0wkXj0OTTyfHRbD8mOeDi9K6tNuB?= =?us-ascii?Q?3UGYn+1HgZLM0hw7hEFbIvy4IUGpXC9LsezthoLsRi4kzKWjqojnx7nrYs0M?= =?us-ascii?Q?/YxKh5ee6khKnaNIG04RedPTLpcBgFAtUHV30AbrjadMU8CQq+ltgAdXs6HX?= =?us-ascii?Q?lNmNjUZhoWxQZLKsuSgugRWExGL/CxkZP/8Y/pEfTLVr34lwJI4FJjUgNj5u?= =?us-ascii?Q?KexIpo+T+IyQIIMtSccqsTSLZ/qlLqDXcaZNRxa6HK7OKkdwOpe2iZ1lDDKP?= =?us-ascii?Q?6dHx9jMcCH/wQY9y0f3R56okbKQ+xUIukJKdi67+YF7Of0R+OSX4ZX5/JqWq?= =?us-ascii?Q?/mTX4EkQ7TnYsKrnN9xc7ekQDHztsL7s4G+d/DQymtm+trma15ujpz6qodVe?= =?us-ascii?Q?F2vecXUEgDIWqU5rzUIOW7qO3+uYdG7DDEHeZy7LUG0w4+5HwOhMT29eIhhM?= =?us-ascii?Q?DCuKz+ksI1JWOcdSpU+U7geS/DwxsB6gKSaf3H23mqkqLBUk9relO08WObDp?= =?us-ascii?Q?MjTvXZpCkq1z/I4hZpV57NsheZhO0l7e9wjrsPN6WxuIBlOkpzIZIvnAA3z8?= =?us-ascii?Q?HriREgabsz3SHDoIJvnck9OJ1PFfzKDb57cQveRe+Q8+/Mmkj2krvKrVlrAf?= =?us-ascii?Q?uuLekl/wXda/g74tonPZIvdN51f8MgwFcqJ3pzsCC+OdCdbIXTHF2CBDr62E?= =?us-ascii?Q?amvcbF4pWE0SunTK9idf5nnKlrdWy8NXVWJMQ2WNoM8tXMrnSts5BHfJNuAI?= =?us-ascii?Q?gYlJSsReAK2IeKMvcQ9UavYXjzQNEur1mhDre+ImVQKFU3rH8sRjHTcSAmHk?= =?us-ascii?Q?Rt6MxKSL/fVIY612+QJ/P7NxVMKVFJM4uti2mfs5AtzKn1Mov4/2Mx8HOxse?= =?us-ascii?Q?RluUJ/EbQhb1cb40zAVByqpnJNI+VkTWk8hOFUoX9AQgBzx+tw9WPGv6/6Hh?= =?us-ascii?Q?xAS5Hgpe9TeRb1xroEh78Vbwx0P3x/wHVinRhlCdQhG9nrxUm6t/BWnV/Q+c?= =?us-ascii?Q?H+6/byB0Gr4fG5GQfXv11KRA++XPU06yqbm1MbxmVGFDY20Dlxh7o5FOxgP/?= =?us-ascii?Q?GpH1F6vqjFFS5dN09XIVBJD2epbYtz90oMfuqFXH?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 108e4a1d-b6a4-4ca4-b15a-08de10fa3459 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR12MB6855.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Oct 2025 23:33:14.0499 (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: Z/Y6PHzt6FiaYIBM3xthFest3ik+DeVRZqT7y4dagUOelUPiLlVHD8xafThlXxmJznlbosMD1GmKVIl8A61oJA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB7030 Message-ID-Hash: YZUXKNVRVG5VQIOMFUWPNPIZX4IV4KP6 X-Message-ID-Hash: YZUXKNVRVG5VQIOMFUWPNPIZX4IV4KP6 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: 1761089962713154100 Content-Type: text/plain; charset="utf-8" Introduce support for "pciBus" driver attribute for "smmuv3" IOMMU model. The "pciBus" attribute indicates the index of the controller that a smmuv3 IOMMU device is attached to, and differentiates the device-pluggable arm-smmuv3 model from the virt-machine-associated smmuv3 model. Signed-off-by: Nathan Chen --- docs/formatdomain.rst | 4 ++ src/conf/domain_conf.c | 16 +++++++ src/conf/domain_conf.h | 1 + src/conf/domain_validate.c | 28 ++++++++++-- src/conf/schemas/domaincommon.rng | 5 ++ src/qemu/qemu_command.c | 76 ++++++++++++++++++++++++++++--- 6 files changed, 121 insertions(+), 9 deletions(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 39bdecf9a1..4fa9e1dd2f 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -9218,6 +9218,10 @@ Example: Enable x2APIC mode. Useful for higher number of guest CPUs. :since:`Since 11.5.0` (QEMU/KVM and ``amd`` model only) =20 + ``pciBus`` + The ``pciBus`` attribute notes the index of the controller that an + IOMMU device is attached to. (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 6e320713bb..a91989a277 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2814,6 +2814,8 @@ virDomainIOMMUDefNew(void) =20 iommu =3D g_new0(virDomainIOMMUDef, 1); =20 + iommu->pci_bus =3D -1; + return g_steal_pointer(&iommu); } =20 @@ -14449,6 +14451,10 @@ virDomainIOMMUDefParseXML(virDomainXMLOption *xmlo= pt, if (virXMLPropTristateSwitch(driver, "passthrough", VIR_XML_PROP_N= ONE, &iommu->pt) < 0) return NULL; + + if (virXMLPropInt(driver, "pciBus", 10, VIR_XML_PROP_NONE, + &iommu->pci_bus, -1) < 0) + return NULL; } =20 if (virDomainDeviceInfoParseXML(xmlopt, node, ctxt, @@ -22142,6 +22148,12 @@ virDomainIOMMUDefCheckABIStability(virDomainIOMMUD= ef *src, dst->aw_bits, src->aw_bits); return false; } + if (src->pci_bus !=3D dst->pci_bus) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device pci_bus value '%1$d' = does not match source '%2$d'"), + dst->pci_bus, src->pci_bus); + 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'"), @@ -28461,6 +28473,10 @@ virDomainIOMMUDefFormat(virBuffer *buf, virBufferAsprintf(&driverAttrBuf, " xtsup=3D'%s'", virTristateSwitchTypeToString(iommu->xtsup)); } + if (iommu->pci_bus >=3D 0) { + virBufferAsprintf(&driverAttrBuf, " pciBus=3D'%d'", + iommu->pci_bus); + } =20 virXMLFormatElement(&childBuf, "driver", &driverAttrBuf, NULL); =20 diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 139bcdc1af..1463dc83c4 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3051,6 +3051,7 @@ struct _virDomainIOMMUDef { virTristateSwitch eim; virTristateSwitch iotlb; unsigned int aw_bits; + int pci_bus; virDomainDeviceInfo info; virTristateSwitch dma_translation; virTristateSwitch xtsup; diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index dd1b491dfe..99b6ac7f7b 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -1860,6 +1860,11 @@ virDomainDefIOMMUValidate(const virDomainDef *def) _("IOMMU model smmuv3 must be specified for mul= tiple IOMMU definitions")); } =20 + if (def->niommus > 1 && iommu->pci_bus < 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("device-pluggable IOMMU with pciBus attribute= must be specified for multiple IOMMU definitions")); + } + if (iommu->intremap =3D=3D VIR_TRISTATE_SWITCH_ON && def->features[VIR_DOMAIN_FEATURE_IOAPIC] !=3D VIR_DOMAIN_IOAPI= C_QEMU) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", @@ -3109,13 +3114,28 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *= iommu) { switch (iommu->model) { case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: + if (iommu->intremap !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->caching_mode !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->eim !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->iotlb !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->aw_bits !=3D 0 || + iommu->dma_translation !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->xtsup !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->pt !=3D VIR_TRISTATE_SWITCH_ABSENT) { + virReportError(VIR_ERR_XML_ERROR, + _("iommu model '%1$s' doesn't support some addi= tional attributes"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } + break; case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: if (iommu->intremap !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->caching_mode !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->eim !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->iotlb !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->aw_bits !=3D 0 || - iommu->dma_translation !=3D VIR_TRISTATE_SWITCH_ABSENT) { + iommu->dma_translation !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->pci_bus >=3D 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support additiona= l attributes"), virDomainIOMMUModelTypeToString(iommu->model)); @@ -3127,7 +3147,8 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *io= mmu) if (iommu->caching_mode !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->eim !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->aw_bits !=3D 0 || - iommu->dma_translation !=3D VIR_TRISTATE_SWITCH_ABSENT) { + iommu->dma_translation !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->pci_bus >=3D 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support some addi= tional attributes"), virDomainIOMMUModelTypeToString(iommu->model)); @@ -3137,7 +3158,8 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *io= mmu) =20 case VIR_DOMAIN_IOMMU_MODEL_INTEL: if (iommu->pt !=3D VIR_TRISTATE_SWITCH_ABSENT || - iommu->xtsup !=3D VIR_TRISTATE_SWITCH_ABSENT) { + iommu->xtsup !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->pci_bus >=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 98596d4cea..69cc9ab13c 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6311,6 +6311,11 @@ + + + + + diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 61457c4f7a..014c27e695 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6222,6 +6222,62 @@ qemuBuildBootCommandLine(virCommand *cmd, } =20 =20 +static virJSONValue * +qemuBuildPCINestedSmmuv3DevProps(const virDomainDef *def, + const virDomainIOMMUDef *iommu, + size_t id) +{ + g_autoptr(virJSONValue) props =3D NULL; + g_autofree char *bus =3D NULL; + g_autofree char *smmuv3_id =3D NULL; + size_t i; + + for (i =3D 0; i < def->ncontrollers; i++) { + virDomainControllerDef *cont =3D def->controllers[i]; + if (cont->idx =3D=3D iommu->pci_bus) { + if (cont->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + const char *alias =3D cont->info.alias; + + if (!alias) + return NULL; + + if (virDomainDeviceAliasIsUserAlias(alias)) { + if (cont->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_PCI= _ROOT && + iommu->pci_bus =3D=3D 0) { + if (qemuDomainSupportsPCIMultibus(def)) + bus =3D g_strdup("pci.0"); + else + bus =3D g_strdup("pci"); + } else if (cont->model =3D=3D VIR_DOMAIN_CONTROLLER_MO= DEL_PCIE_ROOT) { + bus =3D g_strdup("pcie.0"); + } + } else { + bus =3D g_strdup(alias); + } + break; + } + } + } + + if (!bus) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Could not find a suitable controller for smmuv3= .")); + return NULL; + } + + smmuv3_id =3D g_strdup_printf("smmuv3.%zu", id); + + if (virJSONValueObjectAdd(&props, + "s:driver", "arm-smmuv3", + "s:primary-bus", bus, + "s:id", smmuv3_id, + NULL) < 0) + return NULL; + + return g_steal_pointer(&props); +} + + static int qemuBuildIOMMUCommandLine(virCommand *cmd, const virDomainDef *def, @@ -6269,9 +6325,6 @@ qemuBuildIOMMUCommandLine(virCommand *cmd, return -1; =20 return 0; - case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: - /* There is no -device for SMMUv3, so nothing to be done here = */ - return 0; =20 case VIR_DOMAIN_IOMMU_MODEL_AMD: if (virJSONValueObjectAdd(&wrapperProps, @@ -6301,6 +6354,17 @@ qemuBuildIOMMUCommandLine(virCommand *cmd, =20 return 0; =20 + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: + if (iommu->pci_bus >=3D 0) { + if (!(props =3D qemuBuildPCINestedSmmuv3DevProps(def, iomm= u, i))) + return -1; + if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qe= muCaps) < 0) + return -1; + break; + } else { + return 0; + } + case VIR_DOMAIN_IOMMU_MODEL_LAST: default: virReportEnumRangeError(virDomainIOMMUModel, iommu->model); @@ -10805,15 +10869,15 @@ qemuBuildCommandLine(virDomainObj *vm, if (qemuBuildBootCommandLine(cmd, def) < 0) return NULL; =20 - if (qemuBuildIOMMUCommandLine(cmd, def, qemuCaps) < 0) - return NULL; - if (qemuBuildGlobalControllerCommandLine(cmd, def) < 0) return NULL; =20 if (qemuBuildControllersCommandLine(cmd, def, qemuCaps) < 0) return NULL; =20 + if (qemuBuildIOMMUCommandLine(cmd, def, qemuCaps) < 0) + return NULL; + if (qemuBuildMemoryDeviceCommandLine(cmd, cfg, def, priv) < 0) return NULL; =20 --=20 2.43.0