From nobody Fri Nov 21 10:09:39 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 1762387165799868.6687512352689; Wed, 5 Nov 2025 15:59:25 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id D1DEC44139; Wed, 5 Nov 2025 18:59:22 -0500 (EST) Received: from [172.19.199.29] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 87ACC4421C; Wed, 5 Nov 2025 18:55:27 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 826EC43FF8; Wed, 5 Nov 2025 18:55:07 -0500 (EST) Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011034.outbound.protection.outlook.com [40.107.208.34]) (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 DA6A443FDE for ; Wed, 5 Nov 2025 18:55:01 -0500 (EST) Received: from PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) by MN0PR12MB5859.namprd12.prod.outlook.com (2603:10b6:208:37a::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9275.16; Wed, 5 Nov 2025 23:54:57 +0000 Received: from PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb]) by PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb%6]) with mapi id 15.20.9275.015; Wed, 5 Nov 2025 23:54:57 +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=K0Ht7I7kDh53R/wxFlztcyit0UCagLodY2x1ROTO7FDfiym/0ERgYUwUrXOtZTvD4DuDa/NbrVoqfhkb8Dk5yGhg3s1zMwibPj7hELT8aWpN/IV0P8scUsvIQiU3Bu7uTppeF9au3QGZrNpQfW33FoszpChAXjqgg3wbIJzetAQmOrD+WtbbsaZsJLuHedIYDHwZOV6RD8ma+BZ1tobT44fTWEEGl0yg33Yzyoshj54ddeYfxpxvSA1/qSttGgO0ghsNXDTua8tok6GkPYSkLqrRq6+gsEZj+A6suUNaCR0Siy6YBWz4+5Le7imk0TLV8kfPy+/ksJrQ1ieyCDIudg== 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=qhK1MRYXlZSlw7RLgQb5JGUAIZXy5eYhynoY2c8Aa/o=; b=ljJ4O75JeeN50cuezB3P/6tfd4swMEnBNfRi3Wl4oEJyATa9uEm0p6Ly/ms4uGgdL2K4UVapqtneU+vZxNW0YJ0elXJG/eZ9YENR1K+wmG1WXHNv+0Rk3MDFXdJKNW7/GU3ZtaIqwWNJzn2kqzVtUaHZkserDc8b8sy+yEWB9L0+h5/NPOFVTXylRfiQOm5Q4olyky6O1D2PYRK6YCUoBjbj6U6IyUOh4J4BCuwbz3A+rCgCt93Q3hyfujKQ33uPpN+UgFtU7yAGlXJu0ToN9UNii2PXRIlRNunwS33vPaIhUtVuBFRLK1AJxY/6TuEX6kqwqasa+w1U69xdJeAWxg== 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=qhK1MRYXlZSlw7RLgQb5JGUAIZXy5eYhynoY2c8Aa/o=; b=CmNWelHiacJpwo9C0PEmQ8w8vDCRSKRWo/4aqaAcA681tZUxvZXWkzpkLiWl27p0IaQLMsMWIBysQ60KuoO8zXtT7TmsjTIGPmQwUdcLpVu/v3cnqOwJtAGS40MXpV8tBZIjBw4x6LAttIuKKWSkzgXyqeIar2ebfrVeHmaaImMYXolH9Uf5nxWUqoHbdo/QXAT8dBHipbPNBMclbdmlR/9b/GiE6Jsx857vye+q6TWXR95rQ+hgtrRGcwm7JABvENlQZRRXeFVhSa0RM/MF7B2grA6JZzLy964pin+O+hYKZD2zA0BUY2rpVOQ8Zg6tmFghfRr7exWCtFv+HavxGg== 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: Wed, 5 Nov 2025 15:54:38 -0800 Message-ID: <20251105235439.829536-3-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251105235439.829536-1-nathanc@nvidia.com> References: <20251105235439.829536-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0026.namprd03.prod.outlook.com (2603:10b6:a03:33a::31) To PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH7PR12MB6834:EE_|MN0PR12MB5859:EE_ X-MS-Office365-Filtering-Correlation-Id: f7a9921d-2a03-4c7d-69ff-08de1cc6b932 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?jxK4eAGQTEe06bMjOjzRITtAw70dT7RcbeJWoqzgyEKwTX3G0/rIr5FeSzgy?= =?us-ascii?Q?NFVJ2GasWYVTsDzoGZzn6VlBeN1NEO2vxh204ukA6Ra43BSKd6vFzLRybaI+?= =?us-ascii?Q?f35VnAPhmTu2AL2X+L6cK36lbOm0FHGIW8PXvAga6H3qkFfvaesIO0//2pqa?= =?us-ascii?Q?vUW+s7msqyZnVs8GD+S9Baiwr2zD2gw6wLooFvivP4/IPD0l/mUsrsm9JLGY?= =?us-ascii?Q?eIWhQYAtymnNGfG0CtQGEmsTb8H6AremWWEQOxxvgh3ww8f+MQzwOOSalpDk?= =?us-ascii?Q?b7+Mk9KN7L3ZR4bam36tmbOC+EI+Lj8VVBnkZO+6xcdAGkP+89zxdLxlFc9k?= =?us-ascii?Q?rT339IBGTHbKGTTFGmbxFQHp00XIiaMA+lk0EiD960Xl5G8vVGWHr/qUCxW+?= =?us-ascii?Q?S47zkvhAycteFAiWsiXhvIR5+hB2XRE0iV+YbCPhV/3UJPsBF1vlEVHHNnwC?= =?us-ascii?Q?9RHA0yNK8//5le3DbsUg8a/ZNsdvdkoLCKnv5CPvQWLu6r/Civr8yJg03GW2?= =?us-ascii?Q?SoUV8y8BuKFL85xCda/2vgtlZpATy/ltH6Gu3shcpx+8LSg9FxxEUk6taz8c?= =?us-ascii?Q?y9l1w8dhJc/mrIleWxjnsFVp3bwZ2w1NbjiplCSeQEyw02MparoJN9+rnNiA?= =?us-ascii?Q?sF3MJSv2NVSveejlXdks7NTnNLKDByscXrz+ijIm8+hmuU62f4minqTchOuo?= =?us-ascii?Q?Yd2TBtJ2fkkEtVJUB3OqK3+YiOHAq08SlrLyo5h7P2Zkmr0OHcSVEjBt3w+G?= =?us-ascii?Q?RyIpzo509QHQqHkqPaFEuBLRk/R3qi09sHi7Iwu6tql9qLuzZNoCRioa9ypi?= =?us-ascii?Q?zdtsgrrrzmIMFW5dxvsSIOLt8YgljCrShYmUBDYgeyuG9X80Q7RodCM3g8Fv?= =?us-ascii?Q?rIDKQITivncjnpNhUMkFve1gZxjjFfMiRY8dUwL9cOuzIRq+yPpRREMGAx9t?= =?us-ascii?Q?RXn4WZZqGtSVr8oASinlfD6slBdewh5e/hp4Z3yBeNAVIT3hGqUqFT5ejfA2?= =?us-ascii?Q?Gndp4qu3O5Jh8XqPcReG5TwNUtQWIl5X0QEqQ5xv/jKWwiFmyMyMG/M/Jjs4?= =?us-ascii?Q?Mr+uL3G+381eqiR4+LHJ/MtsEOvZ1pOku6EWapOKyAfKJGX0ajVcplDESsq8?= =?us-ascii?Q?vEoMBC/WgtjYZrrplK+j4u1w9kbp/fWarumqlVrrs1zS4hBXKI7Ga3l+1odI?= =?us-ascii?Q?HHRylkkAozhMgTL2zOgT5BbmdlpLUnvunMWeO/D32WDPpcuB/kiuB/5TU/zT?= =?us-ascii?Q?yau/XVHcfXQbWoausd0v3twr0uFrPJL0onljYEpdAtRdfuR++xReydqXCqrm?= =?us-ascii?Q?g2Iafd3f/xoQ74eYQTkQOUl/twj5XlvPyW5up+m85BYLDYBneCZNG/iZDNow?= =?us-ascii?Q?Vq6ki2BWTTNZIFZcZeitQZVtbpLDy+NPJfqjUl2wV296F+jareenFfs5PnwJ?= =?us-ascii?Q?6L9n5XY951T2oACR8kkpg7JRbHxXB4IF?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH7PR12MB6834.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?FTsiHUh9W2m3NQP3tKCsmKzc87mWRoG5KUD+pzpD6h2WMK5DsDGg9ESXoCJy?= =?us-ascii?Q?xn8AzGh+qIh6TlAS+T8uJDIzFOxGBKivlGyiueFWEhFocajBF2q1iUGd4td3?= =?us-ascii?Q?LNyb+an32JK5DOaFcM9soHutEyNv1/6NZOpZRQ50m6WHsarOyjLmx8flHq2N?= =?us-ascii?Q?gPC/iN7eDAnfzQCEhQUaicKRs6xIBzSPrZhWatM5+vXJfBtvGmA2DCMGvSrg?= =?us-ascii?Q?+KYcAqb9jaLZ63VbHN+tMEqWcQE1oO89JupQSdM+F8cDcIER49qWW92gZKBK?= =?us-ascii?Q?H/oeewM34AU3CzQy4He8qJT1miOyVUICtEUtTnqydmPPh9Fww3ITiPeDn6iU?= =?us-ascii?Q?/qpdRG3tvGRttdOet/Q1+/7z7wutGPIag9XWkuE/i9/eEm94qczW11oP4R5T?= =?us-ascii?Q?TFRoS6HI4max2RgK0b77FAZbs4+8wW9nMoP0qiOz7+oTF8xXbyjMf34ilALx?= =?us-ascii?Q?2RWpvCq6CwoeJhgvvVwL/3u/q7Q9siHK81aMzPnqMu8K3IsDnIbX3AmsMpGO?= =?us-ascii?Q?gpnRsXjm1lO/gp4wIG1JDfe47TduxqiJ7MtfU0qKr5BHLkpss/MoCbBrrDcq?= =?us-ascii?Q?s9WTsjrZbaC6g7RVC301ju/RoumaSFb2lZCc+xLnwsvNIu9PAiQeXjUhb15Q?= =?us-ascii?Q?QMpgs38+MlUerfviiErOqijyfJAjRv6MxWS9zqXSNFtNpQkeDYgV4QMKwZlK?= =?us-ascii?Q?lKSrKe6lO+fbmn08zBhj4YuvdOdnVcqUYDIM2CmPxZp/QVD1P18Gm+BA00uV?= =?us-ascii?Q?FbKse5rpPYwezjXF4pe4pKaf44KzzKk0PY9zG7dZpQVGHvgVg5u+jLUVt+w0?= =?us-ascii?Q?wtRSswT+pAZrFZcn/0WgRNVN9iy2zvmvr4jnRdVcpEenD5e9vMRXYLLyH2QV?= =?us-ascii?Q?lJPBt+cim5CPLgph2ekZ03FlLlRMCBSk2f08k2WnwTvBm/+RHKSSily4PfQq?= =?us-ascii?Q?+VjboZFz/m0HrSgcGydoK2W9rFH9c3ZzG1rLyjgeo+VCmm/K9Hl9dx76vXKy?= =?us-ascii?Q?x1Y9bl+IQ791h/l9dYovyzGDvRoxAOAx2k0z5XPsaJd/GXUZy73UFNJBtIke?= =?us-ascii?Q?Ay7B3UBdelMcKll+Ur7+QW+KFJ/VUb96EmdNAwIZMPv6+SP0Uh7nGTMN4L6t?= =?us-ascii?Q?LKjC2J8T2CRA+9jJ2nrTpCexYPpycYZjMaxFcrUJ/xOkFAu7IGydd082TrPn?= =?us-ascii?Q?dvkMVF5iCj/RovY2Luhu2zA1SSuezqlGKeO5yKn48gIX/NdGAmDy41GFtxkh?= =?us-ascii?Q?vxicEYgOi6q0nyHyHwT7SYvwVIIZKTrCmtp8LidOnHL1LbmUtNv64/b6ibfn?= =?us-ascii?Q?boGjx9uRPzfEDWt9ALLcicC6omr86ad/G5sU25XCAMH2+ZRyddIITQGqxph7?= =?us-ascii?Q?BLGlvyp/QQMSv2X66PgFU8gHogiiLabiQZGPU5F2AMxp1a6fZyoEt7odQZ6e?= =?us-ascii?Q?4k70egMAsc+Yjp2XFEoYq4FymF0bdsk7vH/dU6X5LpK+YY1iZfzU0pB/eEQt?= =?us-ascii?Q?fIdimSE/8AWvW3yuW+yTyqlDH5VLooNfltgfyKfX8fKVQ5EgkQSjZijo9NBH?= =?us-ascii?Q?0ZvgdM4FmE2aojgpsalB9gGrcDNoL3hvmRtahU/e?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: f7a9921d-2a03-4c7d-69ff-08de1cc6b932 X-MS-Exchange-CrossTenant-AuthSource: PH7PR12MB6834.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Nov 2025 23:54:57.2929 (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: zQMDDEpkc2OIJpFrRMM9Pp8pFa8fHZPotlPWEIIz6AJ5GzBA1/3tlNhH7x5tUcgjwlwHVbIcNDHehXoIKo/LYA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN0PR12MB5859 Message-ID-Hash: ALYNDAV3T7OYH7O6V4QVGHL27JZI4SII X-Message-ID-Hash: ALYNDAV3T7OYH7O6V4QVGHL27JZI4SII 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: 1762387169474158500 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 | 76 ++++++++++++++++++++++++++++--- 6 files changed, 121 insertions(+), 9 deletions(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 4c245f41a9..a181462d13 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 a587dbf3e1..f3c1b3996e 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, @@ -22194,6 +22200,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'"), @@ -28525,6 +28537,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 f44e275270..4cf05d54e8 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 9fae071975..7f9d2c2fb6 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -1865,6 +1865,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", @@ -3119,13 +3124,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)); @@ -3137,7 +3157,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)); @@ -3147,7 +3168,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 97fe4267ec..ad749afc41 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6239,6 +6239,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, @@ -6286,9 +6342,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, @@ -6318,6 +6371,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); @@ -10822,15 +10886,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