On Fri, Feb 21, 2025 at 08:07:25AM +0000, CLEMENT MATHIEU--DRIF wrote: > From: Clement Mathieu--Drif <clement.mathieu--d...@eviden.com> > > This patch set belongs to a list of series that add SVM support for VT-d. > > Here we focus on implementing ATS support in the IOMMU and adding a > PCI-level API to be used by virtual devices. > > This work is based on the VT-d specification version 4.1 (March 2023). > > Here is a link to our GitHub repository where you can find the following > elements: > - Qemu with all the patches for SVM > - ATS > - PRI > - Device IOTLB invalidations > - Requests with already pre-translated addresses > - A demo device > - A simple driver for the demo device > - A userspace program (for testing and demonstration purposes) > > https://github.com/BullSequana/Qemu-in-guest-SVM-demo
more build failures: https://gitlab.com/mstredhat/qemu/-/jobs/9206060668 > =============== > > Context and design notes > '''''''''''''''''''''''' > > The main purpose of this work is to enable vVT-d users to make > translation requests to the vIOMMU as described in the PCIe Gen 5.0 > specification (section 10). Moreover, we aim to implement a > PCI/Memory-level framework that could be used by other vIOMMUs > to implement the same features. > > What is ATS? > '''''''''''' > > ATS (Address Translation Service) is a PCIe-level protocol that > enables PCIe devices to query an IOMMU for virtual to physical > address translations in a specific address space (such as a userland > process address space). When a device receives translation responses > from an IOMMU, it may decide to store them in an internal cache, > often known as "ATC" (Address Translation Cache) or "Device IOTLB". > To keep page tables and caches consistent, the IOMMU is allowed to > send asynchronous invalidation requests to its client devices. > > To avoid introducing an unnecessarily complex API, this series simply > exposes 3 functions. The first 2 are a pair of setup functions that > are called to install and remove the ATS invalidation callback during > the initialization phase of a process. The third one will be > used to request translations. The callback setup API introduced in > this series calls the IOMMUNotifier API under the hood. > > API design > '''''''''' > > - int pci_register_iommu_tlb_event_notifier(PCIDevice *dev, > uint32_t pasid, > IOMMUNotifier *n); > > - int pci_unregister_iommu_tlb_event_notifier(PCIDevice *dev, uint32_t pasid, > IOMMUNotifier *n); > > - ssize_t pci_ats_request_translation_pasid(PCIDevice *dev, uint32_t pasid, > bool priv_req, bool exec_req, > hwaddr addr, size_t length, > bool no_write, > IOMMUTLBEntry *result, > size_t result_length, > uint32_t *err_count); > > Although device developers may want to implement custom ATC for > testing or performance measurement purposes, we provide a generic > implementation as a utility module. > > Overview > '''''''' > > Here are the interactions between an ATS-capable PCIe device and the vVT-d: > > > > > > ┌───────────┐ ┌────────────┐ > > │Device │ │PCI / Memory│ > > │ │ pci_ats_request_│abstraction │ iommu_ats_ > > │ │ translation_ │ │ request_ > > │┌─────────┐│ pasid │ AS lookup │ translation > > ││Logic ││────────────────>│╶╶╶╶╶╶╶╶╶╶╶>│──────┐ > > │└─────────┘│<────────────────│<╶╶╶╶╶╶╶╶╶╶╶│<──┐ │ > > │┌─────────┐│ │ │ │ │ > > ││inv func ││<───────┐ │ │ │ │ > > │└─────────┘│ │ │ │ │ │ > > │ │ │ │ │ │ │ │ > > │ ∨ │ │ │ │ │ │ > > │┌─────────┐│ │ │ │ │ │ > > ││ATC ││ │ │ │ │ │ > > │└─────────┘│ │ │ │ │ │ > > └───────────┘ │ └────────────┘ │ │ > > │ │ │ > > │ │ │ > > │ │ │ > > │ │ │ > > │ ┌────────────────────┼──┼─┐ > > │ │vVT-d │ │ │ > > │ │ │ │ │ > > │ │ │ │ │ > > │ │ │ │ │ > > │ │ │ │ │ > > │ │ │ ∨ │ > > │ │┌───────────────────────┐│ > > │ ││Translation logic ││ > > │ │└───────────────────────┘│ > > └────┼────────────┐ │ > > │ │ │ > > │┌───────────────────────┐│ > > ││ Invalidation queue ││ > > │└───────────∧───────────┘│ > > └────────────┼────────────┘ > > │ > > │ > > │ > > ┌────────────────────────┐ > > │Kernel driver │ > > │ │ > > └────────────────────────┘ > > v3 > - Rebase onto master > - Fix compilation issue in non-debug mode (Michael) > > v2 > - Rebase on master after merge of Zhenzhong's FLTS series > - Rename the series as it is now based on master. > > - Changes after review by Michael: > - Split long lines in memory.h > - Change patch encoding (no UTF-8) > > - Changes after review by Zhenzhong: > - Rework "Fill the PASID field when creating an IOMMUTLBEntry" > > > > Clement Mathieu--Drif (19): > memory: Add permissions in IOMMUAccessFlags > intel_iommu: Declare supported PASID size > memory: Allow to store the PASID in IOMMUTLBEntry > intel_iommu: Fill the PASID field when creating an IOMMUTLBEntry > pcie: Add helper to declare PASID capability for a pcie device > pcie: Helper functions to check if PASID is enabled > pcie: Helper function to check if ATS is enabled > pci: Cache the bus mastering status in the device > pci: Add IOMMU operations to get memory regions with PASID > intel_iommu: Implement the get_memory_region_pasid iommu operation > memory: Store user data pointer in the IOMMU notifiers > pci: Add a pci-level initialization function for iommu notifiers > atc: Generic ATC that can be used by PCIe devices that support SVM > atc: Add unit tests > memory: Add an API for ATS support > pci: Add a pci-level API for ATS > intel_iommu: Set address mask when a translation fails and adjust W > permission > intel_iommu: Return page walk level even when the translation fails > intel_iommu: Add support for ATS > > hw/i386/intel_iommu.c | 125 ++++++-- > hw/i386/intel_iommu_internal.h | 2 + > hw/pci/pci.c | 111 ++++++- > hw/pci/pcie.c | 42 +++ > include/exec/memory.h | 51 +++- > include/hw/i386/intel_iommu.h | 2 +- > include/hw/pci/pci.h | 83 ++++++ > include/hw/pci/pci_device.h | 1 + > include/hw/pci/pcie.h | 9 +- > include/hw/pci/pcie_regs.h | 5 + > system/memory.c | 21 ++ > tests/unit/meson.build | 1 + > tests/unit/test-atc.c | 527 +++++++++++++++++++++++++++++++++ > util/atc.c | 211 +++++++++++++ > util/atc.h | 117 ++++++++ > util/meson.build | 1 + > 16 files changed, 1278 insertions(+), 31 deletions(-) > create mode 100644 tests/unit/test-atc.c > create mode 100644 util/atc.c > create mode 100644 util/atc.h > > -- > 2.48.1