From nobody Mon Sep 8 02:21:10 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 (BodyHash is different from the expected one); 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 1755226638291749.1430900749934; Thu, 14 Aug 2025 19:57:18 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 4142D985; Thu, 14 Aug 2025 22:57:17 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 07A62B31; Thu, 14 Aug 2025 22:54:47 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 948D9984; Thu, 14 Aug 2025 22:54:37 -0400 (EDT) Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2084.outbound.protection.outlook.com [40.107.223.84]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id B413F97E for ; Thu, 14 Aug 2025 22:54:33 -0400 (EDT) Received: from PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) by PH7PR12MB5685.namprd12.prod.outlook.com (2603:10b6:510:13c::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9031.15; Fri, 15 Aug 2025 02:54:29 +0000 Received: from PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb]) by PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb%4]) with mapi id 15.20.9009.017; Fri, 15 Aug 2025 02:54:28 +0000 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, FORGED_SPF_HELO,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_PASS autolearn=no autolearn_force=no version=3.4.4 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QD1hb6E1Ud7tcFcNwPnHamfiQOMGcwrB3v/JTSVyqUGifSDhl61dp3P65ihHQR/jhtiFmp+y1WbrMsEFerwGVLwkQH21Yxf3UW07fVHyZFIFWXxOblvVcBklaN4UhBibLqMDSPtl6nt2w8YjtbBy2GHvkZnV5Larwa2IRp9hbnC9vG3tQ7BctK7yPvwQxEIADn5xqehnzUJIpLvHZD+NHMRCRSL6i1NXNdZ31GqyjdU8WFehR95/xJr/e0reLZiryTmxI+aOXlzY+i9n8N/Wp16BaBbuR8/8oFhGbLGvcyLAM6dAeeXlN0VHyT2RNq9FfG8jJqxBE/fiBNIi2SZKMA== 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=fOw+lwd5J7DulSoW1djv3N/oSbw84J6eC+7DzUyCeCc=; b=VwIBMBLp4KYHF4IKJQ0MPUs1WH42b0yuyG15MbAhB/EXnwM36mCX82Fl6mgbnyBbZw1yv/ZtTZwD2Lj9bDw19OXX//+LXuQ3s/X69+0/w+vbvxe2lItHpzpLrDSrCmYwz/PFxg4gn1GlnZo8QucfyhJtvJTDdcJEqy3zz4FhP8qlECz8feIQNaggai9wzssNXawKgYeR46AmBx4ZsJ7VmRiR/mpho0Q+8pQgvtvGj1Ve20OWKYqWYGQvUa2u7HAPkdeMwjdD3LnidchXRUkGXzlWS16861cWi3dqrx6MwAINYTcfu8EBAqRjYSnYCF1EQbdhT250BMwz6uxHVpZzcg== 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=fOw+lwd5J7DulSoW1djv3N/oSbw84J6eC+7DzUyCeCc=; b=Zg1EBW2lwz5ovl3/5EzAfWtI6boyx98j/+4P+mO4n2VNYP4IAr1nuCrB+zInVpYyXHUrMASG7mPguxvG41sFiIDE1sPKtz6/OISNw7qUzL8HDa9NVql2pJc7mdMzdQZRRivFa+OUmTl6ypJZr3sQ+5eZTHzafIAEKORgXxiNLN1CHzdFsAGhLOmtvmchvDYwfZomgGWadp2cbuG5UbSgdgSpGlfKMErF/DdhKu1VrtOVSmsOPG0Hofqv8PKRP1z7hq9kYo3S8eCAfr5u1bMNkSpUAORUaYuolZcElEnmaZTJD4nlRpV6aBRbTX2MWJo3MIMrKJrW+xdfiKAlwEFF1g== 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 1/5] qemu: add IOMMU model smmuv3Dev Date: Thu, 14 Aug 2025 19:54:10 -0700 Message-ID: <20250815025415.2805374-2-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250815025415.2805374-1-nathanc@nvidia.com> References: <20250815025415.2805374-1-nathanc@nvidia.com> X-ClientProxiedBy: BYAPR05CA0098.namprd05.prod.outlook.com (2603:10b6:a03:e0::39) To PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH7PR12MB6834:EE_|PH7PR12MB5685:EE_ X-MS-Office365-Filtering-Correlation-Id: 95858a45-1ef9-4293-1dd9-08dddba70d6c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?gkFEsC4df0NXEwETuFN1N5VOY57KnbCAAKwmx9j+3Lw14/WRLmPOm8Iu9qE1?= =?us-ascii?Q?MxSAvFYpIo7mPC5kMJb/caCuq+RL4HZKyuW/odv6ogQKYI3tf1dweTnPeiFe?= =?us-ascii?Q?kF3L9KmP4Bag5Tr+nTV0OwcR2f7QfMV5YbvkLkiTqwPsTTjESahyvCzD2wp6?= =?us-ascii?Q?aOLNWA0CQVoU78AHgvT03loNSvPmu4o6d/GrJygAORycWoQdq0as35M3qXhY?= =?us-ascii?Q?NxoHbQmCzIpu84lACHposjjUXAhPeJLfq36iQg2O/NJ3HeR2JSlIctK7jbKM?= =?us-ascii?Q?qcm517UJbA5py/RTYN2BV/6cimDyyO5DqHmrFvp94O8c+1fZOuQns/oKmzdP?= =?us-ascii?Q?mqfU/M0KDkAsT3RVGuHjkKb3Lrdkop+SMCIBHe9vsnmjn7pXixI6qspdMoP0?= =?us-ascii?Q?ub1m9wSawZNEYmy2n0xcNLfc0x21UaVF+JlpCt7RjQjBEX33bWU/Hrc7Fx0N?= =?us-ascii?Q?CceHQB3uiyxbs7xr3AZ5FO19nl7zo9RenyJqjeQcTA7bL1VIb80wLP7NC1nY?= =?us-ascii?Q?jCIvBFV1g2zBJGz/x0h0U0N6CUcepLk0yM7lJ4DmrhuXFJZF5CS1FVMEYr/e?= =?us-ascii?Q?zixmXPDCHqLrSEKzD7NjhKVE35a2XujchIYtVIUCDQYcvsClwKcSFT5hDKH3?= =?us-ascii?Q?US0Fr/F9KpE60ifF7/yDc0Iw3Ld5awQ4fZIK1agT7uC28qIiGCqi5zAEV3KL?= =?us-ascii?Q?oUgBXWy7AlMGVXhCpNYWvinHfOcLYU3O1E9u11QQVo2FbZvumr0YeH+09qsm?= =?us-ascii?Q?Mv56UkCpcej3X9RUv2Mmg6mOf/IMiGdAuz+3lyi/L9gVCa45OyQ5G7XIANRQ?= =?us-ascii?Q?IPa1tIT6q7K4NK3PuKerA/55sOV0In7rCMUfy6Cg6arH4LEMWOVM9PsWfAcL?= =?us-ascii?Q?w9N0dxbNbarajn0KEtkvcFN/jyKkQi5f1FPcHoQebqsgi68Woymx0AB7V8pg?= =?us-ascii?Q?z5O+ZnPjrvJ+kMlFSZOOFk2wrcZHZE0loU15ATkDxaKf+R2ZHqoLARByZ6ow?= =?us-ascii?Q?sPCSW6ICBgQ5CBMjguOR6A8pxFFwjEk3Y9+tVFr1JCQA7iH7RnMMCNoWvijl?= =?us-ascii?Q?INUT79GdEUD3DccLIdt9uOoN4d99lvEpAuOQ/qTsA0JtCUhPFDFvHxG/jEoa?= =?us-ascii?Q?H+1IKZ21or0rJFp0O0Zn2LdbwV7su1LgLwpN7ByzDAnby5Z3v0SEb24OQy8s?= =?us-ascii?Q?3fDFsyxw8NPjxlJtq5ifD9NEEmI7eBrVBsXR7TJUR9oc/Wbk4UwOfpv3hOXU?= =?us-ascii?Q?RBGHAHeveW264RC5hXz4DfTUfQ5SDNP7A8hAiMM5oIGIMMdgZYKvqikQ+Fdp?= =?us-ascii?Q?ABI48SY/55TfcGyz7rTvFkaTEMV/8VVJLJFMsffdWIlHWPpem9kwClqX5u1e?= =?us-ascii?Q?HyDnyHtyVJ/CBonAb9jrGzHmlp9OL0yAqIy6F6tAxMqaHb6Iy7Ovtwuc80r1?= =?us-ascii?Q?BaEcIFE538U=3D?= 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)(1800799024)(366016)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?vIsUL+0JXYyMLcQcBGUTU9fr8m/SYnVSFvhduOo/e4EBlf1joa9+GXCl5oc2?= =?us-ascii?Q?tYq9wNoP9IHBZ4wY0Nz+Ma0mqWZVHZnHNQlNSsMqY/5RPwi4wMxo1e0JVLEz?= =?us-ascii?Q?xFhKwmRK6sgHSMFYrgBiVyWmtfsd3IwPczT8JzhmeT31qD6I2di8ovI77hDh?= =?us-ascii?Q?TydxvEAr169NryD9URMgrhQBzBL6S+4zB7WGzmFj61nipNJbnvUseIq8V/E4?= =?us-ascii?Q?g2F7JwKwCLoA+DgRz5nlbO7AfJrFs64eYClJXah2taUmTF+9+A0pSlZ76hej?= =?us-ascii?Q?p0vFk2HXbqUdv6RbEPRD+WH1/FaaOexrHfSnXRqXXkexjq7BcBdXwuWzysyD?= =?us-ascii?Q?yM57Tzmv3fOrOAYxtiaYqc5jTTHqhV5elu7i0gBkSJDjoHgZkkWn5ZrAaCka?= =?us-ascii?Q?41IQlc1oED+yaIgl3fBuK7q/UpCB9+dnr5thdXmiNevuBo1MvtOwzzelNNmq?= =?us-ascii?Q?muKGsV7aTyDh83yf+dW19H4WhScotTYzkjjJGtff7RiEiP+4omW9hn2STcjI?= =?us-ascii?Q?zkcZ44MCUav8qmk6OChBZ8TUkB+KBuneth9mfYZc3aEsh/Tmc4HPm7onbQs8?= =?us-ascii?Q?PCscFsOsIb5I2e6TERcXDk5KUjbC9/saQYTqo6bhsNcqU1A0SwIOYvFfzBDB?= =?us-ascii?Q?wT8tTgvAthpOXcDOSJG6ewcqSApT//5cYl/lC4VrT/zQ73fZgFB7BTClUiZn?= =?us-ascii?Q?EpN9WsMYf2IpBW/RZvESiU3UR6c3C/98awZX/8NRSk51vBqptPDgQ3Y1RkaO?= =?us-ascii?Q?oHZYmR4L2pMTA4v/PU0Ig9PNfES1THH57PWTQkVVz7XvCzV38RlX95ePW57K?= =?us-ascii?Q?olQdUGkAcKiFMnrvMfe4S0aqV4Zv548JDxJC8fHlzmBzlcjRzuJ7a2V1g7P8?= =?us-ascii?Q?sS8llphakYSXvcsjwg7r4c1UQi5hLdJP8sfuJB7NiM7D2L4YK3hvoAl2n5SK?= =?us-ascii?Q?b/4Cw9Ex7FMN59QM6VN+fWKy/iq9AkSdbeXyVfP/ttFs6a8ZHrDBcBUKfBi5?= =?us-ascii?Q?4otozrNAnoSVetIItsErG84FkvQwPqtjgi1cwNrsNi5ixBoqn/JUUiVerADH?= =?us-ascii?Q?eQVUd4nT5NC35utmxU13Lsn2+BxIVbpL/bR0pc7PyjB6Lqs4KqWwFhDO5xVH?= =?us-ascii?Q?kct/55g0LxcjyUapxs7LuiRMjdrZWBOLPFKNiQKSvtHeFPOYndjFXB0nmYnu?= =?us-ascii?Q?XkJM7OrcEiQziJgstgZG6TkFXHRhj+LNm/U4/VqTOrVpWfM+CKAHq/ZVdH1s?= =?us-ascii?Q?7EfAOqb8lkhHUZX8f2hDVCTRCp9N5gQFaNsAYfksOnp6eHh/IeLPJuIWXq0g?= =?us-ascii?Q?XSPCr6IfKPDkk5KtS+6vCg74w/Iam1dTFVMy6gl3/k4OtM4GUBVmq5vwSh4I?= =?us-ascii?Q?yyPM8OYlF5/+0GroQVSIWD1WoJZpJ0AxYgGn2Nb9O3mRv3DPxbODwIKnmZPr?= =?us-ascii?Q?M7rnmW4UEYOMieoVlFQMCPJPsr4Xea6AqAgDkOBUiRr9I4sKOsvAH28Uso2o?= =?us-ascii?Q?UoN1bmZd2up881Ysw8OXzLzYr2jGJhUVf1zEUqHASG4BSobzhIKywyJwyh7t?= =?us-ascii?Q?q2wf4+9Sr3pNUOhZjmcuf2SEKuCeIxYabJYMYqNg?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 95858a45-1ef9-4293-1dd9-08dddba70d6c X-MS-Exchange-CrossTenant-AuthSource: PH7PR12MB6834.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Aug 2025 02:54:28.8849 (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: sjk/z6hZXSSGJ4VuKh2z2IOx5AbfKKZShqv/PkloUKtoPYpgwjT650fJvIrHciiLohJAk+BqOvL4CIT7gGrXhQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB5685 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: IVNTVDBUJ42KWIFE5RTFFHP5QTB4NLDC X-Message-ID-Hash: IVNTVDBUJ42KWIFE5RTFFHP5QTB4NLDC X-MailFrom: nathanc@nvidia.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: shameerali.kolothum.thodi@huawei.com, nicolinc@nvidia.com, nathanc@nvidia.com X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: 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: 1755226640460116600 Content-Type: text/plain; charset="utf-8" Introduce support for "smmuv3Dev" IOMMU model and "parentIdx" and "accel" IOMMU device attributes. The former indicates the index of the controller that a smmuv3Dev IOMMU device is attached to, while the latter indicates whether hardware accelerated SMMUv3 support is to be enabled. Signed-off-by: Nathan Chen --- docs/formatdomain.rst | 13 +++++- src/conf/domain_conf.c | 35 +++++++++++++++ src/conf/domain_conf.h | 3 ++ src/conf/domain_validate.c | 26 +++++++++-- src/conf/schemas/domaincommon.rng | 11 +++++ src/qemu/qemu_command.c | 73 +++++++++++++++++++++++++++++-- src/qemu/qemu_domain_address.c | 2 + src/qemu/qemu_validate.c | 16 +++++++ 8 files changed, 170 insertions(+), 9 deletions(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 976746e292..2558df18ef 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -9090,8 +9090,17 @@ Example: ``model`` Supported values are ``intel`` (for Q35 guests) ``smmuv3`` (:since:`since 5.5.0`, for ARM virt guests), ``virtio`` - (:since:`since 8.3.0`, for Q35 and ARM virt guests) and - ``amd`` (:since:`since 11.5.0`). + (:since:`since 8.3.0`, for Q35 and ARM virt guests), + ``amd`` (:since:`since 11.5.0`), and ``smmuv3Dev`` (for + ARM virt guests). + +``parentIdx`` + The ``parentIdx`` attribute notes the index of the controller that a + smmuv3Dev IOMMU device is attached to. + +``accel`` + The ``accel`` attribute with possible values ``on`` and ``off`` can be = used + to enable hardware acceleration support for smmuv3Dev IOMMU devices. =20 ``driver`` The ``driver`` subelement can be used to configure additional options, = some diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 59958c2f08..dc222887d4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1353,6 +1353,7 @@ VIR_ENUM_IMPL(virDomainIOMMUModel, "smmuv3", "virtio", "amd", + "smmuv3Dev", ); =20 VIR_ENUM_IMPL(virDomainVsockModel, @@ -2813,6 +2814,8 @@ virDomainIOMMUDefNew(void) =20 iommu =3D g_new0(virDomainIOMMUDef, 1); =20 + iommu->parent_idx =3D -1; + return g_steal_pointer(&iommu); } =20 @@ -14362,6 +14365,14 @@ virDomainIOMMUDefParseXML(virDomainXMLOption *xmlo= pt, VIR_XML_PROP_REQUIRED, &iommu->model) < 0) return NULL; =20 + if (virXMLPropInt(node, "parentIdx", 10, VIR_XML_PROP_NONE, + &iommu->parent_idx, -1) < 0) + return NULL; + + if (virXMLPropTristateSwitch(node, "accel", VIR_XML_PROP_NONE, + &iommu->accel) < 0) + return NULL; + if ((driver =3D virXPathNode("./driver", ctxt))) { if (virXMLPropTristateSwitch(driver, "intremap", VIR_XML_PROP_NONE, &iommu->intremap) < 0) @@ -22021,6 +22032,18 @@ virDomainIOMMUDefCheckABIStability(virDomainIOMMUD= ef *src, dst->aw_bits, src->aw_bits); return false; } + if (src->parent_idx !=3D dst->parent_idx) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device parent_idx value '%1$= d' does not match source '%2$d'"), + dst->parent_idx, src->parent_idx); + 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->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'"), @@ -28342,6 +28365,18 @@ virDomainIOMMUDefFormat(virBuffer *buf, virBufferAsprintf(&attrBuf, " model=3D'%s'", virDomainIOMMUModelTypeToString(iommu->model)); =20 + if (iommu->parent_idx >=3D 0 && iommu->model =3D=3D VIR_DOMAIN_IOMMU_M= ODEL_SMMUV3_DEV) { + virBufferAsprintf(&attrBuf, " parentIdx=3D'%d'", + iommu->parent_idx); + } + + if (iommu->model =3D=3D VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV) { + if (iommu->accel !=3D VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&attrBuf, " accel=3D'%s'", + virTristateSwitchTypeToString(iommu->accel)); + } + } + virXMLFormatElement(buf, "iommu", &attrBuf, &childBuf); } =20 diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 596d138973..f87c5bbe93 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3036,6 +3036,7 @@ typedef enum { VIR_DOMAIN_IOMMU_MODEL_SMMUV3, VIR_DOMAIN_IOMMU_MODEL_VIRTIO, VIR_DOMAIN_IOMMU_MODEL_AMD, + VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV, =20 VIR_DOMAIN_IOMMU_MODEL_LAST } virDomainIOMMUModel; @@ -3047,10 +3048,12 @@ struct _virDomainIOMMUDef { virTristateSwitch eim; virTristateSwitch iotlb; unsigned int aw_bits; + int parent_idx; virDomainDeviceInfo info; virTristateSwitch dma_translation; virTristateSwitch xtsup; virTristateSwitch pt; + virTristateSwitch accel; }; =20 typedef enum { diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 40edecef83..f1b1b8cc55 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -3085,7 +3085,8 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *io= mmu) 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->accel !=3D VIR_TRISTATE_SWITCH_ABSENT) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support additiona= l attributes"), virDomainIOMMUModelTypeToString(iommu->model)); @@ -3097,7 +3098,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->accel !=3D VIR_TRISTATE_SWITCH_ABSENT) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support some addi= tional attributes"), virDomainIOMMUModelTypeToString(iommu->model)); @@ -3107,7 +3109,24 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *i= ommu) =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->accel !=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_SMMUV3_DEV: + 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)); @@ -3132,6 +3151,7 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *io= mmu) =20 case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: case VIR_DOMAIN_IOMMU_MODEL_AMD: + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV: case VIR_DOMAIN_IOMMU_MODEL_LAST: break; } diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index a714c3fcc5..0e57d2a9b9 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6246,8 +6246,19 @@ smmuv3 virtio amd + smmuv3Dev + + + + + + + + + + diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 457dee7029..8a124a495b 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6250,6 +6250,63 @@ qemuBuildBootCommandLine(virCommand *cmd, } =20 =20 +static virJSONValue * +qemuBuildPCISmmuv3DevDevProps(const virDomainDef *def, + const virDomainIOMMUDef *iommu) +{ + g_autoptr(virJSONValue) props =3D NULL; + g_autofree char *bus =3D NULL; + size_t i; + bool contIsPHB =3D false; + + for (i =3D 0; i < def->ncontrollers; i++) { + virDomainControllerDef *cont =3D def->controllers[i]; + if (cont->idx =3D=3D iommu->parent_idx) { + if (cont->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + const char *alias =3D cont->info.alias; + contIsPHB =3D virDomainControllerIsPSeriesPHB(cont); + + if (!alias) + return NULL; + + if (virDomainDeviceAliasIsUserAlias(alias)) { + if (cont->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_PCI= _ROOT && + iommu->parent_idx <=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) + return NULL; + + if (contIsPHB && iommu->parent_idx > 0) { + char *temp_bus =3D g_strdup_printf("%s.0", bus); + g_free(bus); + bus =3D temp_bus; + } + + if (virJSONValueObjectAdd(&props, + "s:driver", "arm-smmuv3", + "s:primary-bus", bus, + "b:accel", (iommu->accel =3D=3D VIR_TRISTATE= _SWITCH_ON), + NULL) < 0) + return NULL; + + return g_steal_pointer(&props); +} + + static int qemuBuildIOMMUCommandLine(virCommand *cmd, const virDomainDef *def, @@ -6298,7 +6355,6 @@ qemuBuildIOMMUCommandLine(virCommand *cmd, return 0; =20 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: @@ -6329,6 +6385,14 @@ qemuBuildIOMMUCommandLine(virCommand *cmd, =20 return 0; =20 + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV: + if (!(props =3D qemuBuildPCISmmuv3DevDevProps(def, iommu))) + return -1; + if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qemuCaps) = < 0) + return -1; + + return 0; + case VIR_DOMAIN_IOMMU_MODEL_LAST: default: virReportEnumRangeError(virDomainIOMMUModel, iommu->model); @@ -7162,6 +7226,7 @@ qemuBuildMachineCommandLine(virCommand *cmd, case VIR_DOMAIN_IOMMU_MODEL_INTEL: case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: case VIR_DOMAIN_IOMMU_MODEL_AMD: + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV: /* These IOMMUs are formatted in qemuBuildIOMMUCommandLine */ break; =20 @@ -10807,15 +10872,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 diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 96a9ca9b14..06bf4fab32 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -952,6 +952,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDevic= eDef *dev, =20 case VIR_DOMAIN_IOMMU_MODEL_INTEL: case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV: case VIR_DOMAIN_IOMMU_MODEL_LAST: /* These are not PCI devices */ return 0; @@ -2378,6 +2379,7 @@ qemuDomainAssignDevicePCISlots(virDomainDef *def, =20 case VIR_DOMAIN_IOMMU_MODEL_INTEL: case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV: case VIR_DOMAIN_IOMMU_MODEL_LAST: /* These are not PCI devices */ break; diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index adba3e4a89..163d7758b8 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -5406,6 +5406,22 @@ qemuValidateDomainDeviceDefIOMMU(const virDomainIOMM= UDef *iommu, } break; =20 + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV: + if (!qemuDomainIsARMVirt(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("IOMMU device: '%1$s' is only supported with = ARM Virt machines"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } + // TODO: Check for pluggable device SMMUv3 qemu capability + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_VIRT_IOMMU)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("IOMMU device: '%1$s' is not supported with t= his QEMU binary"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } + break; + case VIR_DOMAIN_IOMMU_MODEL_LAST: default: virReportEnumRangeError(virDomainIOMMUModel, iommu->model); --=20 2.43.0