[PATCH v7 0/9] PCI/TSM: Core infrastructure for PCI device security (TDISP)

Dan Williams
2025-10-24T02:04:16Z

Changes since v6 [1]:
- Rebase on v6.18-rc2
- Drop @owner from 'struct pci_tsm' and lookup @ops through @tsm_dev
(Alexey)
- Drop CONFIG_PCI_IDE_STREAM_MAX, only require pci_ide_set_nr_streams()
for host bridge implementations that limit streams to something less
than topology max (Aneesh)
- Convert Stream index allocators from bitmaps to ida (preparation for
solving Stream ID uniqueness problem reported by Alexey)
- Misc whitespace cleanups (Jonathan)
- Misc kdoc fixups
- Fix nr_ide_streams data type, a u8 is too small
- Rename PCI_DOE_PROTO_ => PCI_DOE_FEATURE_ (Alexey)
- Rename @base to @base_tsm in 'struct pci_tsm_pf0' (Aneesh)
- Fix up PCIe r6.1 reference for PCIe r7.0 (Bjorn)
- Fix to_pci_tsm_pf0() failing to walk to the DSM device (Yilun)
- Add pci_tsm_fn_exit() for sub-function cleanups post DSM disconnect
(Aneesh)
- Move the samples/devsec/ implementation to a follow-on patch set

[1]: http://lore.kernel.org/20250911235647.3248419-1-dan.j.williams@intel.com

This set is available at
https://git.kernel.org/pub/scm/linux/kernel/git/devsec/tsm.git/log/?h=staging
(rebasing branch) or devsec-20251023 (immutable tag). That branch
additionally contains address association support, Stream ID uniqueness
compability quirk, updated samples/devsec/ (now with multifunction
device and simple bind support), and an updated preview of v2 of "[PATCH
0/7] PCI/TSM: TEE I/O infrastructure" (fixes x86 encrypted ioremap and
other changes) [2].

[2]: http://lore.kernel.org/20250827035259.1356758-1-dan.j.williams@intel.com

It passes an updated regression testing using samples/devsec/. See this
commit on the staging branch for that test:

https://git.kernel.org/pub/scm/linux/kernel/git/devsec/tsm.git/commit/?id=44932bffdcc1

Status: ->connect() flow is settled
-----------------------------------
At the risk of tempting fate, the goal is this v7 goes to linux-next via
a stable tsm.git#next branch. Enable one or more TSM driver
implementations to queue on top for v6.19-rc1 via arch-specific trees
for TDX, TIO, CCA, or COVE-IO. I.e. target v6.19 to support baseline
link encryption (IDE) / secure-session establishment without
confidential device-assignment.

That tsm.git#next goal still needs follow-on patches like the following
to settle:

Alexey Kardashevskiy (1):
PCI/IDE: Initialize an ID for all IDE streams

Xu Yilun (1):
PCI/IDE: Add Address Association Register setup for downstream MMIO

...but otherwise the core infrastructure is ready to support IDE
establishment via a platform TSM.

Next steps:
-----------
- Stage at least one vendor ->connect() implementation on top of a
tsm.git#staging snapshot, for integration testing.

- Additionally get at least one vendor ->connect() implementation queued
in an arch tree for linux-next in time for v6.19, otherwise
tsm.git#next may need to wait for v6.20.

Updated Cover letter:
---------------------

Trusted execution environment (TEE) Device Interface Security Protocol
(TDISP) is a chapter name in the PCI Express Base Specification (r7.0).
It describes an alphabet soup of mechanisms, SPDM, CMA, IDE, TSM/DSM,
that system software uses to establish trust in a device and assign it
to a confidential virtual machine (CVM). It is a protocol for
dynamically extending the Trusted Computing Boundary (TCB) of a CVM with
a PCI device interface enabled to issue DMA to CVM private memory.

The acronym soup problem is extended by each platform architecture
having distinct TEE Security Manager (TSM) API implementations /
capabilities, and each endpoint Device Security Manager (DSM) having its
own idiosyncratic behaviors and requirements around TDISP state
transitions.

Despite all that opportunity for differentiation, there is a significant
portion of the implementation that is cross-vendor common. The PCI/TSM
extension of the PCI core subsystem is a library for TSM drivers to
establish link encryption and enable device access to confidential
memory.

This foundational phase is focused on host-side link encryption, the
next phase focuses on guest-side locking and accepting devices, the
phase after that focuses on all the host-side setup for private DMA and
private MMIO. There are more phases beyond that, like device
attestation, but the goal is upstream manageable incremental steps that
provide tangible value to Linux at each step.

Dan Williams (9):
coco/tsm: Introduce a core device for TEE Security Managers
PCI/IDE: Enumerate Selective Stream IDE capabilities
PCI: Introduce pci_walk_bus_reverse(), for_each_pci_dev_reverse()
PCI/TSM: Establish Secure Sessions and Link Encryption
PCI: Add PCIe Device 3 Extended Capability enumeration
PCI: Establish document for PCI host bridge sysfs attributes
PCI/IDE: Add IDE establishment helpers
PCI/IDE: Report available IDE streams
PCI/TSM: Report active IDE streams

drivers/pci/Kconfig | 18 +
drivers/virt/coco/Kconfig | 3 +
drivers/pci/Makefile | 2 +
drivers/virt/coco/Makefile | 1 +
Documentation/ABI/testing/sysfs-bus-pci | 51 ++
Documentation/ABI/testing/sysfs-class-tsm | 19 +
.../ABI/testing/sysfs-devices-pci-host-bridge | 45 ++
Documentation/driver-api/pci/index.rst | 1 +
Documentation/driver-api/pci/tsm.rst | 21 +
drivers/pci/pci.h | 21 +
include/linux/device/bus.h | 3 +
include/linux/pci-doe.h | 4 +
include/linux/pci-ide.h | 81 +++
include/linux/pci-tsm.h | 159 +++++
include/linux/pci.h | 28 +
include/linux/tsm.h | 14 +
include/uapi/linux/pci_regs.h | 89 +++
drivers/base/bus.c | 38 ++
drivers/pci/bus.c | 38 ++
drivers/pci/doe.c | 2 -
drivers/pci/ide.c | 592 ++++++++++++++++
drivers/pci/pci-sysfs.c | 4 +
drivers/pci/probe.c | 29 +-
drivers/pci/remove.c | 6 +
drivers/pci/search.c | 62 +-
drivers/pci/tsm.c | 643 ++++++++++++++++++
drivers/virt/coco/tsm-core.c | 165 +++++
MAINTAINERS | 7 +-
28 files changed, 2133 insertions(+), 13 deletions(-)
create mode 100644 Documentation/ABI/testing/sysfs-class-tsm
create mode 100644 Documentation/ABI/testing/sysfs-devices-pci-host-bridge
create mode 100644 Documentation/driver-api/pci/tsm.rst
create mode 100644 include/linux/pci-ide.h
create mode 100644 include/linux/pci-tsm.h
create mode 100644 drivers/pci/ide.c
create mode 100644 drivers/pci/tsm.c
create mode 100644 drivers/virt/coco/tsm-core.c

base-commit: 211ddde0823f1442e4ad052a2f30f050145ccada
--
2.51.0