From nobody Mon Feb 2 07:28:48 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; 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 1769798375043673.8124040745978; Fri, 30 Jan 2026 10:39:35 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id 341F2419E6; Fri, 30 Jan 2026 13:39:34 -0500 (EST) Received: from [172.19.199.6] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 9163141B42; Fri, 30 Jan 2026 13:37:22 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id EEF8441802; Fri, 30 Jan 2026 13:37:14 -0500 (EST) Received: from BL0PR03CU003.outbound.protection.outlook.com (mail-eastusazon11012037.outbound.protection.outlook.com [52.101.53.37]) (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 F10C141826 for ; Fri, 30 Jan 2026 13:37:13 -0500 (EST) Received: from DS2PR12MB9567.namprd12.prod.outlook.com (2603:10b6:8:27c::8) by PH7PR12MB6764.namprd12.prod.outlook.com (2603:10b6:510:1ae::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.11; Fri, 30 Jan 2026 18:37:10 +0000 Received: from DS2PR12MB9567.namprd12.prod.outlook.com ([fe80::636:1b52:24ca:d7e5]) by DS2PR12MB9567.namprd12.prod.outlook.com ([fe80::636:1b52:24ca:d7e5%3]) with mapi id 15.20.9564.008; Fri, 30 Jan 2026 18:37:10 +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=QSNgZylLwXqIpo8YmZQWVZXMdxRH22R5XqaJubJ/caSF11qGws07eyJXAlOlfM2y0SwfiKC/Wi8NsUxwMjFFzWZNNLnAzw4SGKogP8LKHCL8rPY5sh6tbQqMiQTb39LEniq2pD14jp7QhR/muOHIoT3aeA7aI+FBAP+BqWxa2hKPkXdNW1Q9EX9ltp05tGBAZ3uvyCMas4+VENmE6fjev3p1NRcntysr2skQ5FOxptnaOGS91NCN5FJhdPYJvwbJUsDSLft9RRekZtVtZz8weQzVkrd+uDzjh+IycI5GzS4mSFtl0VQmZythpx9ncXqrrGOHI1E1RF6EBpjZrsrMQw== 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=UwMVafKZUKqclx738R3/4WiNxyRC6LxGJHCFxA1i01I=; b=WioVkU/eA60jXJXG21CLsXsyCLjz5znpEtkLtPUmkn/R/h3NMVSSh4LmLHSNxDrBCtIt2jnnXDJfI1MP3lSjE6QmfXbv5DrUqnm+Ys2tolCbtTl+S3eR0pcdKYAraANBYYWjAm1KpuKO7nX8S7F1vsRFs4sZnvc5ewl/zOtKwM7SS+0Pu/wkvHhGWn1GcYUxorlb4Nk4RbPkdZYdgCNG6NQHsiPTiUqdfA4WVh0/40XlmqY0O2E0z2uf8Ptt83TeBlmZCP6PUdZsRW40rFnusWLakgPhZP64ulyBFWfXBxr6+W+bjyGozGGS1RIr1nSwJ0lkP2DwF3e3qML9HZ/JhA== 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=UwMVafKZUKqclx738R3/4WiNxyRC6LxGJHCFxA1i01I=; b=iEZFeByf87Gx3hxS9OAyRc/fvL1ETXeZg6TL3HlbVcBaKL/YGtPAA+LF2teqeGziRlZaTwLr/ieBeR68XAzihDkUgyFQSxO18OLLotEkk5vMcFdwdU6CB+h1yvLzrOnKNX/HEhYiqJZPJMAr3mUlCSDb4FNgq0Vek6+WZishPrZ6L0qLrOAdkbLWeDcl6h9JCmQtYhjNbu1pZJke+FSv10/7q4Qs8DiJWMhbbF2shXyWHj3HWOMYSRHqQtVvlVjwbDRpJPJoz2V2IxGtFuGE+uwtiKqKCdkkIPvQiH7EXvHC6leMRPNSQZ1aVb1102L/0BaI4SDuc//UsMdkCa8VFg== 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 v7 1/2] qemu: Add support for HW-accelerated nested SMMUv3 Date: Fri, 30 Jan 2026 10:37:06 -0800 Message-ID: <20260130183707.4148322-2-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260130183707.4148322-1-nathanc@nvidia.com> References: <20260130183707.4148322-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0257.namprd03.prod.outlook.com (2603:10b6:a03:3a0::22) To DS2PR12MB9567.namprd12.prod.outlook.com (2603:10b6:8:27c::8) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS2PR12MB9567:EE_|PH7PR12MB6764:EE_ X-MS-Office365-Filtering-Correlation-Id: b7943e56-ca64-4987-f664-08de602e93fc X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?RDpYYZmbbJJ0UhTHwdjfANWfp+kyrPqnA7pJt9Hx9EIPLA5E1ZajlElT/W1T?= =?us-ascii?Q?ktve3GXx/vQRvf399dyMLro37bR2YXFqCBVaW7UWaohKR+2qTFpJENVOD4Sb?= =?us-ascii?Q?Om2cknyzxC7VBoVxWy3CEbKr55KX84Najvm29J06LS802Cpbsj7qy2HeoHHq?= =?us-ascii?Q?ZB+bxjDpw5WB6M9A+njuajqeI03gHMn0uJlDffTw2oE6lUNQzPmGu7fJJDnS?= =?us-ascii?Q?y9o7+Ihyr26RfVTtgU6zMhFWQp7gHR73LPoZhdkEm8tpobV8FK7VEpUL/r/l?= =?us-ascii?Q?oaK6NBfKJa6BbKPSFiNAn5hoBguKyufL2AVKlW7bEymNNjcxPPscXFX8G+3E?= =?us-ascii?Q?8BWMwRm4xWIGDPW/+2eu/2/jmyjJ7iMyScLhsdKUG0vAlKH8bAeX4DAh++1M?= =?us-ascii?Q?YQPWAgLs6YNh9JYxgc9uGQzHtLIUBvw6bn+7dCh/r5ax+08aVub+70zMAkO5?= =?us-ascii?Q?MfJB6Up7QZe4frOjiK1Qd3KInRvHE6jBnO5Dntf4/u+FZt22lyRpOERccVo2?= =?us-ascii?Q?m3a7DTGF7cfkcAoNVe5upRczQJDa5yqmMgucBv2wWkek2dRUzV65V7u5x6Zc?= =?us-ascii?Q?QI+xlVfNwnt1lnOn1mKRPEBbfnS95kNMl8PlAX8DJED2NO2+GomVno2Tz7Lo?= =?us-ascii?Q?us20bdzQ1ckAkC/W1+ifThBdE6mR2irh2lCGdxFwZwXv0Hm7cMsrbbwR79gD?= =?us-ascii?Q?MXufxk673aHhfPsuYzhhg8ZJkVXvkTq3H6ATk/rxYYNbTz77qaMduQKXGiqf?= =?us-ascii?Q?yV9iOA9pkkSqGbEUP0SWqE2dLBTlkWvhD08c1huZR8DgvETrbRxMl6q1DFNh?= =?us-ascii?Q?roRXZ1O+A0OsiA9/DNyf3AmGksLsnN4qIlgyuOoh768f13JuKa+gA0rDImCE?= =?us-ascii?Q?in2vVBDcfmM89Sxt82uDCOxKIrKdfVuaSmYkjRqBtlgC7NBm3W28hWruhbD4?= =?us-ascii?Q?RI2K/iqI/7tySDk06N+jGPDS1xytB1gH1H9plSsnK+ufYvaNS5IGNrCkWvDz?= =?us-ascii?Q?9kIoD+LrZbMlgzo5Zz5BYm13iWlt4AqUAbghkYrkaZIMXppxxPMrSv/+m9wr?= =?us-ascii?Q?yhw55UDipno/5QMdSR7qGHO9k5VQb/3fjQJExb6ceiu7mDj1G67GQDlVtYVf?= =?us-ascii?Q?XuseOrepJdu+a/05jQTsVIhM7HQc2z2NpxgfCBReoG1U3wJ9w0hedmUiz0u9?= =?us-ascii?Q?U2G2zx7ovOdy09moQjCfAnQZfLH2YwiySKXtq6C8uKe69UYHiGr04E7WfWpe?= =?us-ascii?Q?RNgdJ40jDQXXM3bSmq1Ug5csuc0QekX6FuOwCmKpNnGWN0m/DBnUDto+eWRj?= =?us-ascii?Q?ZzEdyiGq+molFYTWA7Xkqcb/Pgx6I/l5I/TeocXyRgA74lccdGIl9AfnZX6W?= =?us-ascii?Q?DOye1NqFdb2IHT15kwIQH7spY0i9gPDNJAnIbcXo/ocAP7wezZKLZJ99hXgz?= =?us-ascii?Q?oJ+FfOexDytCd6rG3pUtIjJdDKxnFrUcWvWedz9A/gsMHvKiUoWLEg7GOucP?= =?us-ascii?Q?H9hV4NwCux1REE/gDtO303xSVdalVUp51g5NtthVn093M4LGZw7SJSTWyAlp?= =?us-ascii?Q?NBi5nXVJJa05d4HI2oA=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS2PR12MB9567.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?EI4bjIcXq5n3F3mSXB4iaImQkfw7DT0HjzX0i6kkZrM/2JeFGibkLuNLK+Cu?= =?us-ascii?Q?Nt67a1IoA2eiCvEp51gUv5nj3lBPPLv592pshQ9X6KW414bruVv39H7k8EhU?= =?us-ascii?Q?46XmiP5QX0Z0npdnjzYfItv/y0n/Aeoe8B4UgAI4FjG5TeIauQNsjHAlWJfn?= =?us-ascii?Q?Rju1Aj8oFQlKKDenjOQhbq0H4/H+dne6vROl2tnolqsWe/676rLFPJDRCyOa?= =?us-ascii?Q?scRpsFlkm+2IOR9nu2MPzZ/5++LDqEe6TdwGIpI6UogiYFUsFykK9CcpmGu7?= =?us-ascii?Q?N2cdDQwIVr4ZoUFr1ltDo+TyIEUVMg7HCCoOyXpApNcoH07IAPzIDfCu92cp?= =?us-ascii?Q?He70iBydxqJjtfalT97rHcnxSdTeHo7N2LSSh9Vt1htKi5kXThkg8v7BY0ZH?= =?us-ascii?Q?ojBjmdMOC2wZFv3EzhhPLyBL7yAtvYqzXossYMR8s3rzO86wNYlPF8OdNLrW?= =?us-ascii?Q?OxHRlPo6FHWanQwIrqaLjyJEaLE0yY6D3iHZMAsBIIs5GrbGltRHIZMVt89Q?= =?us-ascii?Q?SFEK7iVEbYgME5Cnu+eh+BqC0ckBwMTCvXThZpJJnw2R8UiMviP8dBSiFNxw?= =?us-ascii?Q?3R+Z7sBQryXzcy4zlpCXC16hcKFqVUTqjoWmf7YsgEG6T+OCoW7r2hZtcdTG?= =?us-ascii?Q?Z0SZ3udJ1g9tR7cdYrEuHz6bAUMpfzdZLxig6Y0UcwKUAjDy2arNcN7kTaqK?= =?us-ascii?Q?PpGw5BpuBA5893YvHfZfOzQVac+xhPaFzwd1ny138HPk7Zs4OovY+qB2P5nN?= =?us-ascii?Q?v0kl3NLheG2svKTJ47RPpeboP3CagMm98umQrpkNRZYsFO1HB5WBFMXsr6Ck?= =?us-ascii?Q?/mL6bLzyWYsFqMCnRqrROKSJvxZl0nebxne+GN6crjSRls6Xf3C1ufi9bsKh?= =?us-ascii?Q?JyyUTtWKb0ZCcagCbrNq73qSpRBtBgVU2iy6LKdqIvHuYy7KxXvPtzSv7qWq?= =?us-ascii?Q?mI6ln1/3KafH301d3x/CYp1weG9YkRUp63WLkYmVOOeGOHbQYPTq6oI6F1R/?= =?us-ascii?Q?7GsGBKFdiYajSek5OI4Ath+LoNUefKtK1Vk2WJdcKrjMD5KObMzat/TiZ6cH?= =?us-ascii?Q?y+uRf884poDtQprngmuKlfEmIXWBzBfsDP2F639WA4VeLlL9ml389NEtiR7T?= =?us-ascii?Q?gUELKBO59KzElMCh/r8+zM64Zfgt1QNG07vVnh4WWv+XxGquUrBNgzuNQWRr?= =?us-ascii?Q?eruloLW2T+C9uU7l4vgTLWspcBzTZ8cs8S/HbSXzyNVgoYIuLFqd+wpxYo8c?= =?us-ascii?Q?oWGo9O1Vkst2yU1qKSv10Dj90RoHc+bq4QcbIjJS/POxPDl5nBSpSfy8ccHC?= =?us-ascii?Q?2gebpnYIcv5HNtkjvxN6PBEJ99RUYXsgZaKlvmdzz0GBWaRqOXNAe3rmrAbD?= =?us-ascii?Q?8H5Iuz2QuOsHtaSX+XvEjmMnzeFDmlg0vwcU2hm6MzhI5g1xWmH/OsMNyn3B?= =?us-ascii?Q?RU9djziijHtgf4Um/udFIdOGm2J1Wfe8x6wxW05hNYwbHsco50PGdRAuHEbl?= =?us-ascii?Q?2aj0xWvbdqpjCqmsk9UsfTZZGmfMgnAF8Rk/eMEYz58WQeJIzt+eEkIuICtH?= =?us-ascii?Q?Zxt1Y1ToQICjgbDS4087OZtMJyJeV7XE+iDDk7Ldm6XuJcHc5OU2IgcLR6H2?= =?us-ascii?Q?OIlsZXy0rlTunh8MtJ1mR9esQMvtQl6Xx6nKIp96tDG9XeV/8TNPDZgmmghF?= =?us-ascii?Q?IV5ivSFYGDugL10t4C4ubtJTL+Chdq23migGCO11qjZKzjmJSzp4KCseOWSA?= =?us-ascii?Q?4M2W+Og1Ig=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: b7943e56-ca64-4987-f664-08de602e93fc X-MS-Exchange-CrossTenant-AuthSource: DS2PR12MB9567.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 18:37:10.2112 (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: KJM25xxrbJucAHSJirrNorn9At+kgYrVJi78h9DKR8BaQyDEaXY7pxYNgwbO42hQi7qcqMMI8Sb8e2vLm9idGA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB6764 Message-ID-Hash: J4J33S5CPG24YK5T5JZDKN2BEPHPKYQ4 X-Message-ID-Hash: J4J33S5CPG24YK5T5JZDKN2BEPHPKYQ4 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: 1769798378248158500 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, SSID, RIL, and OAS configuration. Support element for specifying PCI hostdev PASID capability offset. Signed-off-by: Nathan Chen --- docs/formatdomain.rst | 36 +++++++++++ src/conf/domain_conf.c | 101 +++++++++++++++++++++++++++++- src/conf/domain_conf.h | 6 ++ src/conf/domain_validate.c | 36 ++++++++++- src/conf/schemas/domaincommon.rng | 32 ++++++++++ src/qemu/qemu_command.c | 23 +++++++ src/util/virpci.h | 4 ++ 7 files changed, 233 insertions(+), 5 deletions(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 04ef319a73..998d289ebf 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -4880,6 +4880,13 @@ or: device; if PCI ROM loading is disabled through this attribute, attempts= to tweak the loading process further using the ``bar`` or ``file`` attribu= tes will be rejected. :since:`Since 4.3.0 (QEMU and KVM only)`. +``vpasidCapOffset`` + The ``vpasidCapOffset`` element is used to change the offset at which a + PASID PCIe extended capability is placed in a vfio-pci device's PCIe + extended configuration space. If not specified or set to 0, the capabil= ity + is placed at the end of the extended configuration space when PASID is + supported. The offset must be 4-byte aligned and within the PCIe extend= ed + configuration space. ``address`` The ``address`` element for USB devices has a ``bus`` and ``device`` attribute to specify the USB bus and device number the device appears a= t on @@ -9264,6 +9271,35 @@ 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) + + ``ssidSize`` + The ``ssidSize`` attribute sets the number of bits used to represent + SubstreamIDs. A value of N allows SSIDs in the range [0 .. 2^N - 1]. + The valid range is 0-20, and a value greater than 0 is required for + enabling PASID support, as doing so advertises PASID capability to + the vIOMMU. (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 9672168df9..e64484a60d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -13678,6 +13678,7 @@ virDomainHostdevDefParseXML(virDomainXMLOption *xml= opt, virDomainHostdevDef *def; VIR_XPATH_NODE_AUTORESTORE(ctxt) unsigned int type; + int rc; =20 ctxt->node =3D node; =20 @@ -13731,8 +13732,16 @@ virDomainHostdevDefParseXML(virDomainXMLOption *xm= lopt, def->shareable =3D true; break; =20 - case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: + rc =3D virXPathUIntBase("string(./vpasidCapOffset)", ctxt, + 0, &def->vpasidCapOffset); + if (rc =3D=3D -2) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Invalid format for vpasidCapOffset")); + goto error; + } + break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: @@ -14514,6 +14523,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 (virXMLPropUInt(driver, "ssidSize", 10, VIR_XML_PROP_NONE, + &iommu->ssid_size) < 0) + return NULL; + + if (virXMLPropUInt(driver, "oas", 10, VIR_XML_PROP_NONE, + &iommu->oas) < 0) + return NULL; } =20 if (virDomainDeviceInfoParseXML(xmlopt, node, ctxt, @@ -16577,7 +16606,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->ssid_size !=3D b->ssid_size || + a->oas !=3D b->oas) return false; =20 if (a->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && @@ -21349,6 +21384,14 @@ virDomainHostdevDefCheckABIStability(virDomainHost= devDef *src, } } =20 + if (src->vpasidCapOffset !=3D dst->vpasidCapOffset) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target host device vPASID capability offset %1$s= does not match source %2$s"), + virDomainHostdevModeTypeToString(dst->vpasidCapOffs= et), + virDomainHostdevModeTypeToString(src->vpasidCapOffs= et)); + return false; + } + if (!virDomainDeviceInfoCheckABIStability(src->info, dst->info)) return false; =20 @@ -22311,6 +22354,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->ssid_size !=3D dst->ssid_size) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device ssid_size value '%1$d= ' does not match source '%2$d'"), + dst->ssid_size, src->ssid_size); + 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'"), @@ -27732,6 +27805,10 @@ virDomainHostdevDefFormat(virBuffer *buf, if (def->shareable) virBufferAddLit(buf, "\n"); =20 + if (def->vpasidCapOffset) + virBufferAsprintf(buf, "0x%x\n", + def->vpasidCapOffset); + virDomainDeviceInfoFormat(buf, def->info, flags | VIR_DOMAIN_DEF_FORMA= T_ALLOW_BOOT | VIR_DOMAIN_DEF_FORMA= T_ALLOW_ROM); =20 @@ -28657,6 +28734,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->ssid_size > 0) { + virBufferAsprintf(&driverAttrBuf, " ssidSize=3D'%d'", + iommu->ssid_size); + } + 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 83d49969d3..1396073678 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -370,6 +370,7 @@ struct _virDomainHostdevDef { bool missing; bool readonly; bool shareable; + unsigned int vpasidCapOffset; virTristateBool writeFiltering; union { virDomainHostdevSubsys subsys; @@ -3062,6 +3063,11 @@ struct _virDomainIOMMUDef { virTristateSwitch dma_translation; virTristateSwitch xtsup; virTristateSwitch pt; + virTristateSwitch accel; + virTristateSwitch ats; + virTristateSwitch ril; + unsigned int ssid_size; + unsigned int oas; }; =20 typedef enum { diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 4482203087..7b2c32395d 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -29,6 +29,7 @@ #include "virutil.h" #include "virstring.h" #include "virhostmem.h" +#include "virpci.h" =20 #define VIR_FROM_THIS VIR_FROM_DOMAIN =20 @@ -2432,6 +2433,20 @@ virDomainHostdevDefValidate(const virDomainHostdevDe= f *hostdev) _("PCI host devices must use 'pci' or 'unas= signed' address type")); return -1; } + if (hostdev->vpasidCapOffset) { + if (hostdev->vpasidCapOffset & 0x3) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vpasidCapOffset must be 4-byte align= ed")); + return -1; + } + /* PASID ECAP size of 0x8 */ + if (hostdev->vpasidCapOffset < VIR_DOMAIN_PCI_CONFIG_SPACE= _SIZE || + hostdev->vpasidCapOffset > VIR_DOMAIN_PCIE_CONFIG_SPAC= E_SIZE - 0x8) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vpasidCapOffset must be within PCIe = extended configuration space (0x100-0xFFF)")); + return -1; + } + } break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI: if (hostdev->info->type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NO= NE && @@ -3208,7 +3223,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->ssid_size !=3D 0 || + iommu->oas !=3D 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support additiona= l attributes"), virDomainIOMMUModelTypeToString(iommu->model)); @@ -3221,7 +3241,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->ssid_size !=3D 0 || + iommu->oas !=3D 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support some addi= tional attributes"), virDomainIOMMUModelTypeToString(iommu->model)); @@ -3232,7 +3257,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->ssid_size !=3D 0 || + 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 114dd3f96f..234aae5459 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6329,6 +6329,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6610,6 +6635,13 @@ + + + + (0x[0-9a-fA-F]+|[0-9]+) + + + diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e81efdfde7..aa5ee2a787 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4802,6 +4802,7 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def, "S:failover_pair_id", failover_pair_id, "S:display", qemuOnOffAuto(pcisrc->display), "B:ramfb", ramfb, + "p:x-vpasid-cap-offset", dev->vpasidCapOffse= t, NULL) < 0) return NULL; =20 @@ -6267,9 +6268,31 @@ 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), NULL) < 0) return NULL; =20 + /* QEMU SMMUv3 has RIL support by default; only emit when explicitly d= isabling */ + if (iommu->ril =3D=3D VIR_TRISTATE_SWITCH_OFF) { + if (virJSONValueObjectAppendBoolean(props, "ril", false) < 0) + return NULL; + } + + if (iommu->ssid_size > 0) { + if (virJSONValueObjectAdd(&props, + "p:ssidsize", iommu->ssid_size, + NULL) < 0) + return NULL; + } + + if (iommu->oas > 0) { + if (virJSONValueObjectAdd(&props, + "p:oas", iommu->oas, + NULL) < 0) + return NULL; + } + return g_steal_pointer(&props); } =20 diff --git a/src/util/virpci.h b/src/util/virpci.h index fc538566e1..7e78cb267c 100644 --- a/src/util/virpci.h +++ b/src/util/virpci.h @@ -35,6 +35,10 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(virPCIDeviceList, virObjec= tUnref); =20 #define VIR_DOMAIN_DEVICE_ZPCI_MAX_UID UINT16_MAX #define VIR_DOMAIN_DEVICE_ZPCI_MAX_FID UINT32_MAX +/* Size of the standard PCI config space */ +#define VIR_DOMAIN_PCI_CONFIG_SPACE_SIZE 0x100 +/* Size of the standard PCIe config space: 4KB */ +#define VIR_DOMAIN_PCIE_CONFIG_SPACE_SIZE 0x1000 =20 typedef struct _virZPCIDeviceAddressID virZPCIDeviceAddressID; typedef struct _virZPCIDeviceAddress virZPCIDeviceAddress; --=20 2.43.0