[PATCH v8 00/15] iommufd: TSM-backed virtual IOMMUs for confidential guests

From: Aneesh Kumar K.V (Arm)

Date: Wed Nov 04 2026 - 11:17:04 EST


This series adds IOMMUFD and PCI/TSM infrastructure for assigning PCI
devices to confidential guests. A TEE Security Manager (TSM) can provide a
virtual IOMMU (vIOMMU), and an IOMMUFD vDEVICE object represents a physical
device within that virtual IOMMU.

The series adds a common framework for operations on vDEVICE objects and
updates lifetime management to keep the VM and device-security resources
available while those objects are in use.

The Arm CCA backend is provided in a separate series, together with
operations for TEE Device Interface Security Protocol (TDISP) state changes
and access to cached device-attestation objects.

The full series, including the Arm CCA backend, is available at:

https://git.gitlab.arm.com/linux-arm/linux-cca.git cca/topics/7.4/tdisp-host

Notes:
* Codex was used to assist with commit message formatting and code
rearrangement.

Changes from v7:
https://lore.kernel.org/all/20261008055955.4014342-1-aneesh.kumar@xxxxxxxxxx
* Replace IOMMU_VDEVICE_TSM_REQ with the common IOMMU_VDEVICE_OP ioctl
framework. Keep operation definitions and callbacks in the Arm CCA
backend series.
* Replace architecture-specific request dispatch, TSM result codes and
buffer-residue returns with operation-specific request/response formats,
a zero-success return convention and resp_len for response lengths.
* Hold a KVM file reference for the full iommufd_device lifetime and
require matching device/vIOMMU KVM associations for vDEVICE allocation.
* Hold TSM device and user references as well as the backend module
reference for the vIOMMU lifetime. Make unregister reject new users
and wait for existing users before tearing down PCI connections.
* Coordinate DSM removal with TSM unregister so the completion used to
wait for users remains valid throughout teardown.
* Complete PCI registration before publishing the TSM device and roll
back PCI registration if publication fails. Require PCI operations
when registering a TSM.
* Move PCI/TSM core code into drivers/pci/tsm/core.c.
* Temporarily disable AMD vIOMMU allocation while its interfaces are updated.

Changes from v6:
https://lore.kernel.org/all/20260917140159.1163281-1-aneesh.kumar@xxxxxxxxxx
* Replace the IOMMUFD provider registry with per-device TSM operation lookup.
* Move vIOMMU allocation size and initialization into the selected vIOMMU ops.
* Select parent HWPT policy from the vIOMMU ops flags.
* Pin a vIOMMU's TSM backend module through vIOMMU destruction.

Changes from v5:
https://lore.kernel.org/all/20260525154816.1029642-1-aneesh.kumar@xxxxxxxxxx
* Replace the TSM bind/unbind interface with reference-counted contexts.
* Add the IOMMUFD vIOMMU provider abstraction.
* Route TSM guest requests through vIOMMU ops.

Changes from v4:
https://lore.kernel.org/all/20260427061005.901854-1-aneesh.kumar@xxxxxxxxxx
* Switch VFIO/iommufd to use struct file *kvm_file instead of relying on
kvm->users_count references.
* Define TSM request scope values globally in iommufd.
* Rename the ioctl to IOMMU_VDEVICE_TSM_REQ.
* Address other review feedback.

Changes from v2:
https://lore.kernel.org/all/20260309111704.2330479-1-aneesh.kumar@xxxxxxxxxx
* Bump the series revision to v4 to keep it in sync with the dependent CCA DA
patchsets. There was no v3 posting.
* Drop [PATCH v2 1/3] iommufd/viommu: Allow associating a KVM VM fd with a
vIOMMU
* Add two new patches to associate a struct kvm * with iommufd objects:
iommufd/device: Associate a kvm pointer to iommufd_device
iommufd/viommu: Associate a kvm pointer to iommufd_viommu
* Address review feedback

Changes from v1:
https://lore.kernel.org/all/20250728135216.48084-8-aneesh.kumar@xxxxxxxxxx
* Rebase onto the latest kernel
* Address review feedback
* Drop the TSM map ioctl; the KVM prefault patch will be used instead to
ensure that private memory is preallocated


Cc: Alex Williamson <alex@xxxxxxxxxxx>
Cc: Alexey Kardashevskiy <aik@xxxxxxx>
Cc: Bjorn Helgaas <bhelgaas@xxxxxxxxxx>
Cc: Catalin Marinas <catalin.marinas@xxxxxxx>
CC: Jacob Pan <jacob.pan@xxxxxxxxxxxxxxxxxxx>
Cc: Jason Gunthorpe <jgg@xxxxxxxx>
Cc: Joerg Roedel <joro@xxxxxxxxxx>
Cc: Jonathan Cameron <jic23@xxxxxxxxxx>
Cc: Jonathan Hunter <jonathanh@xxxxxxxxxx>
Cc: Kevin Tian <kevin.tian@xxxxxxxxx>
Cc: Krishna Reddy <vdumpa@xxxxxxxxxx>
Cc: Lukas Wunner <lukas@xxxxxxxxx>
Cc: Nicolin Chen <nicolinc@xxxxxxxxxx>
Cc: Robin Murphy <robin.murphy@xxxxxxx>
Cc: Samuel Ortiz <sameo@xxxxxxxxxxxx>
Cc: Shameer Kolothum <shameerali.kolothum.thodi@xxxxxxxxxx>
Cc: Steven Price <steven.price@xxxxxxx>
Cc: Suravee Suthikulpanit <suravee.suthikulpanit@xxxxxxx>
Cc: Suzuki K Poulose <suzuki.poulose@xxxxxxx>
Cc: Thierry Reding <thierry.reding@xxxxxxxxxx>
Cc: Vasant Hegde <vasant.hegde@xxxxxxx>
Cc: Will Deacon <will@xxxxxxxxxx>
Cc: Xu Yilun <yilun.xu@xxxxxxxxxxxxxxx>
Cc: kvm@xxxxxxxxxxxxxxx
Cc: linux-arm-kernel@xxxxxxxxxxxxxxxxxxx
Cc: linux-coco@xxxxxxxxxxxxxxx
Cc: linux-kernel@xxxxxxxxxxxxxxx
Cc: linux-pci@xxxxxxxxxxxxxxx
Cc: linux-tegra@xxxxxxxxxxxxxxx

Aneesh Kumar K.V (Arm) (13):
PCI/TSM: Move core code into its own directory
virt: coco: tsm: Remove the device from lookup before PCI teardown
virt: coco: tsm: Complete PCI registration before publishing the
device
virt: coco: tsm: Require PCI operations when registering a TSM
iommufd/device: Hold a KVM file reference for the device lifetime
iommufd: Add a vDEVICE operation ioctl framework
PCI/TSM: Remove the legacy guest request interface
PCI/TSM: Add vIOMMU-bound device contexts
iommufd/viommu: Select vIOMMU operations before allocation
iommufd/viommu: Allow PCI TSM backends to provide vIOMMU operations
iommufd/viommu: Allow vIOMMUs without a parent HWPT
PCI/TSM: Wait for device contexts before removing a DSM
PCI/TSM: Wait for users during unregister

Nicolin Chen (1):
iommufd/viommu: Keep a reference to the KVM file

Shameer Kolothum (1):
iommufd/device: Associate KVM file pointer with iommufd_device

Documentation/ABI/testing/sysfs-bus-pci | 15 +-
Documentation/driver-api/pci/tsm.rst | 2 +-
Documentation/userspace-api/iommufd.rst | 44 +-
MAINTAINERS | 2 +-
drivers/crypto/ccp/sev-dev-tsm.c | 4 +-
drivers/iommu/amd/iommu.c | 3 +-
drivers/iommu/amd/iommufd.c | 18 +-
drivers/iommu/amd/iommufd.h | 11 +-
drivers/iommu/amd/nested.c | 4 +-
.../arm/arm-smmu-v3/arm-smmu-v3-iommufd.c | 37 +-
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 7 +-
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 16 +-
.../iommu/arm/arm-smmu-v3/tegra241-cmdqv.c | 24 +-
drivers/iommu/iommufd/Makefile | 1 +
drivers/iommu/iommufd/device.c | 14 +-
drivers/iommu/iommufd/hw_pagetable.c | 14 +-
drivers/iommu/iommufd/iommufd_private.h | 3 +
drivers/iommu/iommufd/main.c | 3 +
drivers/iommu/iommufd/selftest.c | 33 +-
drivers/iommu/iommufd/viommu.c | 155 +++++--
drivers/pci/Makefile | 2 +-
drivers/pci/tsm/Makefile | 7 +
drivers/pci/{tsm.c => tsm/core.c} | 434 ++++++++++--------
drivers/vfio/iommufd.c | 3 +-
drivers/virt/coco/tsm-core.c | 202 +++++++-
include/linux/iommu.h | 20 +-
include/linux/iommufd.h | 29 +-
include/linux/pci-tsm.h | 154 +++----
include/linux/tsm.h | 41 +-
include/uapi/linux/iommufd.h | 36 +-
30 files changed, 884 insertions(+), 454 deletions(-)
create mode 100644 drivers/pci/tsm/Makefile
rename drivers/pci/{tsm.c => tsm/core.c} (71%)


base-commit: 6628e7d4c6b25c8d18f1345e3a20d21829aae7e4
--
2.43.0