From nobody Fri Nov 21 10:09:38 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 1763603265155243.99461388749978; Wed, 19 Nov 2025 17:47:45 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id 2C2F344102; Wed, 19 Nov 2025 20:47:44 -0500 (EST) Received: from [172.19.199.50] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id A75D144127; Wed, 19 Nov 2025 20:45:34 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 69B5541ADB; Wed, 19 Nov 2025 20:42:52 -0500 (EST) Received: from PH8PR06CU001.outbound.protection.outlook.com (mail-westus3azon11012008.outbound.protection.outlook.com [40.107.209.8]) (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 A221A41ADB for ; Wed, 19 Nov 2025 20:42:50 -0500 (EST) Received: from SN7SPRMB0025.namprd12.prod.outlook.com (2603:10b6:806:32f::22) by DS0PR12MB7826.namprd12.prod.outlook.com (2603:10b6:8:148::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.10; Thu, 20 Nov 2025 01:42:47 +0000 Received: from SN7SPRMB0025.namprd12.prod.outlook.com ([fe80::eec4:cde6:1a24:ccdd]) by SN7SPRMB0025.namprd12.prod.outlook.com ([fe80::eec4:cde6:1a24:ccdd%6]) with mapi id 15.20.9343.009; Thu, 20 Nov 2025 01:42:47 +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=ZrFDgceD2WBt91nMX3Ju44riV20WvEjDLsUnjTXo1WhWuhs3+DYT9D9UQA+i0FleNffRB7IfVmUTam4im7O8GEZas4sTdQZInZbeQuAAhHXTg1FpyvulpbTgzDsOQoV6gHUo0xFkv1x54Xqky76E63tGZ5qKCWqNRruAuWpWZPOXBbziv8KhqxfeXtDzjekawY1GYd5K56GdzOmc2kJDTafHFj6BHdhzABWSUQ0ySHpH/HaIjlk8VoRou8MJzmwaAEvbCqiNJioVsVCXeGNe9BJ1EiLsXzppBBvasiu5IuSBiPtvQQmAnj/hXO/En92GkKDVKzDdVmD53+yEdww21Q== 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=oX8vPpLCrnsu5yTTwYvrKlxTpuY3cEtnSCrLyMYABxg=; b=ZP3M1igCPJgoXzTyBjrkRC8EHRxQC6B2WDd2YjnVILR7fiO8l7eUEh26sAwh+r/LAF14USbQTU0KOtiEypG5EiAPgWTkruOue2Vcb1EM8TO+I5Zpfud3LQVu8qYkSW4Hjj0n18w27WdZSUc5pc78ywTVzrVjlwt2sONkyB60Fd1NnnTNF9DFZ7W9NKJcrAMf3lpuv9pmNi0i6UUE+mHPPl+4Fy3gpkyyB8uo/xVvtlCmhM6VH4T8vgOEGsQbrri5o89P2Xl/zNsrRMrqXbNFFEUtMOU2CdPiH6a/5Bh9zeBcqi5RGwSZFRprlOxIyJ23FD7OrWe2LMnd74gUpWbVuQ== 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=oX8vPpLCrnsu5yTTwYvrKlxTpuY3cEtnSCrLyMYABxg=; b=kouaQSiM6yCdWiaQFNLwJkshz0OSy831ktuyXm6FNdg8cgsJap8W3WZgZpNw7aAkbPjSfj+oDxjP15Jxqu3vGlZ5Z3MLeY3Qxna+VYmHD8ieQmS54B6Hkamwwr7bfDjTzFVSJO+fYxRJ6mBvQy3oJdkkbuAmdR/oXt2whhRgYlJwhvAEO0P3iXe47fodP0uz0mayiqgtlvSS5XYxYhamcWAT33ZFCxB7wgFS/I59+BB+Cb78vJgewvgcVGZ/jvFU5hUbuiiFzkk/Lv4mYVM3Jxa5xTRsGd197vquYDRbhkiiT5RUDY98X1ftS4Ts0k/CPaUwk9Fd3odbcW6O1j8mVg== 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 2/4] qemu: Implement pluggable-device smmuv3 Date: Wed, 19 Nov 2025 17:42:41 -0800 Message-ID: <20251120014243.2678797-3-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251120014243.2678797-1-nathanc@nvidia.com> References: <20251120014243.2678797-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0P220CA0001.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:41b::7) To SN7SPRMB0025.namprd12.prod.outlook.com (2603:10b6:806:32f::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN7SPRMB0025:EE_|DS0PR12MB7826:EE_ X-MS-Office365-Filtering-Correlation-Id: 1521594a-0fe0-4c5a-17db-08de27d61ba0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?HzJ0xRn7vp6OTyijKnE+tQFxJ+f6qeAN0BaxDnDnvb4tibL6R1grbv7xA8K2?= =?us-ascii?Q?7xmemqpnCDmxviQx8gKmRcgInaYeN5VIOiWrPgFJdjBztKGzuCUKSZ61cBb5?= =?us-ascii?Q?hdKas7qikAUkxgcLfn4RsAoim9L2UbN2RkxRZ2EGDXYRYymhU9czQ6C496UV?= =?us-ascii?Q?jXSI5KhXqwxAW/Qn35nw0IiHe6SyNaOYVS6EOAdwHlwsqCLXAmIE1p9harqk?= =?us-ascii?Q?fpudJF7iECKAcxeGRr5bExmxEwrx288RIgGp2i2MUHM0hvVvdV72EeMqsu+O?= =?us-ascii?Q?USB58LWZBQ6LWNVoJyJy+8J7bc2w4oaxL88KF9mtKwRYZmjSSRPuu+DOWmU9?= =?us-ascii?Q?IMOl+kSeiGZtfjQN/gJpB31wkv/T0+SdDxIwYSdJgO9ry3dSMfUsjJ7HJ2jP?= =?us-ascii?Q?Sy5dS+wRDAK8e38z7fC6Nx5/WeHQSxsbQDGh8pjb2z6c0zymJVrpN+9rnpSy?= =?us-ascii?Q?FoClRVbhW7u77s2p/1Htbkgxq6rJeYxC9bFNgFttN1pn4pKz33FgwuP0/IoM?= =?us-ascii?Q?4qF6lDaltKpR6L6M+eLljBT5ASdFKXmadEJHGQqh/ifhL0DHf5PSYSQgm1Sb?= =?us-ascii?Q?UBK6H/6ze5rYPRW5UKEBj/DxwtfGKT+tE0hE+TyL9iXA/Pc0oAilJcnuqch8?= =?us-ascii?Q?G7XfbPfHim6N1vTdOliEmxieDjkYrWKXeKxPTUWfdJNiOKhNM8hN6deDNO+k?= =?us-ascii?Q?OCnyaPVdqSod7wYG2WP7acfqJjXv0WSGtnPpNoH557eZ9vpW/eNvpjaEKCu8?= =?us-ascii?Q?xYwotB70Ye74nTxY+jLgzDst4172ozEFyj+v7wEMaYt0zeGRnsz5XQfm99mZ?= =?us-ascii?Q?fNlGAuRAL7LVAZeRPUYM3vWKvq3KFop8U7IbbG8BydSWM7o08j4ny7T4NufN?= =?us-ascii?Q?BJwKHJQKjDZxt0lw1LgpokwGZYN+fkiTxsmmyBS1GBCgwjjemDddgy7s3xgj?= =?us-ascii?Q?R2rpD3BYqSvX6enYQFEE7STB2c7JJ137cIrLQ6kSe2nnTSTCf4Y3VJgbypB9?= =?us-ascii?Q?5g5WIdIWOUJaeLWFW5WjI19ibHGECmHh3dB7XXB8hADILsoARt1vI820L+jn?= =?us-ascii?Q?yMsICKqvh7NkR/JmHvwe0mvgYQSoyJBBngk5nE1Vy+T2TCLYgaGaifGI2CFV?= =?us-ascii?Q?CEXwtUMuggpa7j9dYop7/f3JUaLbSauNwF0s6PMyaDgx4zk8OtAnndpjqKsv?= =?us-ascii?Q?19x22cKAlhqZ5vEiIv/1vn/FpnWPB25YpRtq+z5A3MNsOX5ZB5dJgm1z8a5e?= =?us-ascii?Q?I4dZmFanb7L2aerDHz1jQn+kHR0xnRb4GTQ6FL15iNlgs6O2Z2j5X0cUVPKH?= =?us-ascii?Q?wV2OjUa/Cy1FhE4PfjSqPU39eAv7pA+Au1eusgiknJh7K9RYay8LSNyTldQS?= =?us-ascii?Q?QueOjJgWNwPn2LvH4Gg5z1R2FA7dZqEob1+HdXQcmcv3uMTT2GCZhRkLcQwu?= =?us-ascii?Q?kxkTfrMuiCBrBkeaoBpEslWvLsoUGQtm?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN7SPRMB0025.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?D9hipPT53Rnm/v+7dp2biB1nAwrVpDglOR8F8XXf7lMPtr8jh+WXjnUT9C9X?= =?us-ascii?Q?QtNJgBaC1ptFP6/3NVI5e39++hGzKgsscTl59w70ciueX6Xu6F440UyBzlvE?= =?us-ascii?Q?ZKx8xC97pwGZaUt2Ly7cwqIa5yGzJsYhIzJUf65HoHE+xXbvflNbHGE1o4o/?= =?us-ascii?Q?6DjHWwr368CZEj17UD2SwJQ5YaUXwwMh2+zrrt4sUz/lRLS7UzXolMUxunQF?= =?us-ascii?Q?olduD+DJ2me4SyayL2bCblatqAwdmilVxiOvaAOgqSL3mPYBnn8Xlh2CEFCL?= =?us-ascii?Q?HYSpXxPP2C+Pf6Trqc5sSa1y0SUoXIxDi/MgGiqc9Z3oUKpqRFqtDBSfkj2M?= =?us-ascii?Q?yd/HS3JcDwwpmnNXzTf/48JwEMnfaXPdenmTSZ49hYgEocqzJgqQyfDNHizr?= =?us-ascii?Q?NTkbT5oDevMz36+iPNGSK+EpBz9OwErYPke5S1mf/2rdpIipGah1hS9aRXvp?= =?us-ascii?Q?o3O326wXImwLGCKh0JzjjNCKvAyfK5Mfqp0Y9JuvPQGE0JjBtJUkDDDLH90e?= =?us-ascii?Q?nAr1EZt0TbVA+/wWyk9biucQUS7oHb+RAr9RW8ZctACI7LOdU8v64bt97sHd?= =?us-ascii?Q?SIws3fXMiMnb3y0vVZ+gfLW/lrbDO+Q6ET8IRl/oWNbUPRm+6j/k457bzKbg?= =?us-ascii?Q?Q2geFRavqog+EfAmj7gfWhvXcLJttJOa6QFMAwQchoGevGY4Arbmndnowz3i?= =?us-ascii?Q?krN01a+lVi4SUUVDTc+2e1qUj2lHwCQH4Xz7hY+MmeobxIUOg1izRGLI+nMX?= =?us-ascii?Q?pa5Mf0O13flrQRn7NlNuf4iwxm/fWz5zxngkM+c+uP1W+ygm1HBGDiNYc2JK?= =?us-ascii?Q?XTx6MxgC6MFhzgjNYbP89ihpW91qmQxE8vzO0kJpI1KLePx0gn5HC5t1WxCQ?= =?us-ascii?Q?JKtOZ3Z8NRoUS1S2R6a2xnMQIolvMbb9tOoOa4cSW9xNYxyywHAqSrwrk6d2?= =?us-ascii?Q?ayvujmrpJawBAjPdkXAvcsbB+ReWcCqM4UytPH7dH6Xahs3pxlcQr9opTYUO?= =?us-ascii?Q?h+Edxm3qJFYTvuSvRzIcOJeSy2J3ZJ1wQVN+QQuy5sNIX/A401fYbG2PmeNa?= =?us-ascii?Q?YLb+b2AqbXDCP8ohRg1eiUlJm44vtd03KwnwjJZP8qvpj0lu1Vcg4K6HqxCd?= =?us-ascii?Q?w2aBrOU4ES7lHzJ+slFTVHwuu9f1DdPm3QihJHDKtPiWD4EkKgydrlV0V07o?= =?us-ascii?Q?+y7HSaEUmXaPowa1NGB2D6aUEQQ6P4E7HQYGQYcIHztLmWYATnKdCNN+UQdc?= =?us-ascii?Q?7Jr86iT+6Q5xtTECB4/H03uGv0Xii909v2xQsP6n+TnDDaHPZ9G+fpl5ZQ1d?= =?us-ascii?Q?P86+Gfpqg6GlFyenIODB0jmRRCsZ4a4DNLwTSWJTJJgh97Yz7BpaxXF4UE4E?= =?us-ascii?Q?n+3F35c4X9kBClfX3YChZdOGOs2IuFw21bBSDXErnIkKYtCvSfV2I4gfnqQ8?= =?us-ascii?Q?m33NqV8Vh6VYR4ehG2hIwPar4AdRNGnJ75nELVtgv6iFv1ljyfrAhB+mZz67?= =?us-ascii?Q?zkYWLKHNrBoE5u3lcMffeWkfwXIXwc4sxkw9NkrWbRPwPAStaZXTibu29TJy?= =?us-ascii?Q?63egT90u7kDLE+1i/9G02lZkQDefQRdV8rF5FUHy?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1521594a-0fe0-4c5a-17db-08de27d61ba0 X-MS-Exchange-CrossTenant-AuthSource: SN7SPRMB0025.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Nov 2025 01:42:47.3810 (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: mziC0eD5H/UEmFGcAAf31IeNDw4OH2px8ShR6t4aFRmHTuKyJowWMEH2aGelBTKilFoKzhB7yLrhP4sFWuPagw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB7826 Message-ID-Hash: T55A5XGZNJKKNXWYB4MOIFTPPHHNDIXJ X-Message-ID-Hash: T55A5XGZNJKKNXWYB4MOIFTPPHHNDIXJ 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: 1763603267741019100 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 Reviewed-by: J=C3=A1n Tomko --- 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 | 58 +++++++++++++++++++++++++++++-- 6 files changed, 106 insertions(+), 6 deletions(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index c6d0b183d0..160e7ad9c7 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -9238,6 +9238,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 0c7a32b03c..af9c4cc39b 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2815,6 +2815,8 @@ virDomainIOMMUDefNew(void) =20 iommu =3D g_new0(virDomainIOMMUDef, 1); =20 + iommu->pci_bus =3D -1; + return g_steal_pointer(&iommu); } =20 @@ -14497,6 +14499,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, @@ -22223,6 +22229,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'"), @@ -28554,6 +28566,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 6aa716b907..4c78589c9e 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3055,6 +3055,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 3339fc83e0..8bbea5f000 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -1853,6 +1853,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", @@ -3107,13 +3112,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)); @@ -3125,7 +3145,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)); @@ -3135,7 +3156,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 ae3fa95904..9afc679258 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6322,6 +6322,11 @@ + + + + + diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 9c8330645b..16521bb4e5 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6239,6 +6239,51 @@ 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; + } 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, @@ -6268,6 +6313,7 @@ qemuBuildIOMMUCommandLine(virCommand *cmd, return -1; =20 break; + case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: if (virJSONValueObjectAdd(&props, "s:driver", "virtio-iommu", @@ -6283,9 +6329,6 @@ qemuBuildIOMMUCommandLine(virCommand *cmd, return -1; =20 break; - case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: - /* There is no -device for SMMUv3, so nothing to be done here = */ - break; =20 case VIR_DOMAIN_IOMMU_MODEL_AMD: if (virJSONValueObjectAdd(&wrapperProps, @@ -6315,6 +6358,15 @@ qemuBuildIOMMUCommandLine(virCommand *cmd, =20 break; =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; + case VIR_DOMAIN_IOMMU_MODEL_LAST: default: virReportEnumRangeError(virDomainIOMMUModel, iommu->model); --=20 2.43.0