Each Partitionable Endpoint (IOMMU group) has an address range on a PCI bus where devices are allowed to do DMA. These ranges are called DMA windows. By default, there is a single DMA window, 1 or 2GB big, mapped at zero on a PCI bus.
PAPR defines a DDW RTAS API which allows pseries guests querying the hypervisor about DDW support and capabilities (page size mask for now). A pseries guest may request an additional (to the default) DMA windows using this RTAS API. The existing pseries Linux guests request an additional window as big as the guest RAM and map the entire guest window which effectively creates direct mapping of the guest memory to a PCI bus. This patchset reworks PPC64 IOMMU code and adds necessary structures to support big windows on pseries. This patchset is based on the upstream QEMU. This implements comments from v13; another change is the patches are smaller and VFIO code is slightly better separated from sPAPR and common code. This includes "vmstate: Define VARRAY with VMS_ALLOC" as the patchset needs it and it has been posted separately but has not been neither accepted nor rejected so far. Please comment. Thanks! Alexey Kardashevskiy (18): memory: Fix IOMMU replay base address vmstate: Define VARRAY with VMS_ALLOC spapr_pci: Move DMA window enablement to a helper spapr_iommu: Move table allocation to helpers spapr_iommu: Introduce "enabled" state for TCE table spapr_iommu: Finish renaming vfio_accel to need_vfio spapr_iommu: Realloc table during migration spapr_iommu: Migrate full state spapr_iommu: Add root memory region spapr_pci: Reset DMA config on PHB reset memory: Add reporting of supported page sizes vfio: Check that IOMMU MR translates to system address space vfio: spapr: Add SPAPR IOMMU v2 support (DMA memory preregistering) spapr_pci: Add and export DMA resetting helper vfio: Add host side IOMMU capabilities spapr_iommu, vfio, memory: Notify IOMMU about starting/stopping being used by VFIO vfio/spapr: Use VFIO_SPAPR_TCE_v2_IOMMU spapr_pci/spapr_pci_vfio: Support Dynamic DMA Windows (DDW) hw/ppc/Makefile.objs | 1 + hw/ppc/spapr.c | 7 +- hw/ppc/spapr_iommu.c | 202 ++++++++++++++++++++++------ hw/ppc/spapr_pci.c | 125 +++++++++++++++--- hw/ppc/spapr_rtas_ddw.c | 300 ++++++++++++++++++++++++++++++++++++++++++ hw/ppc/spapr_vio.c | 8 +- hw/vfio/Makefile.objs | 1 + hw/vfio/common.c | 241 +++++++++++++++++++++++++++------ hw/vfio/prereg.c | 137 +++++++++++++++++++ include/exec/memory.h | 22 +++- include/hw/pci-host/spapr.h | 15 +++ include/hw/ppc/spapr.h | 31 ++++- include/hw/vfio/vfio-common.h | 14 +- include/migration/vmstate.h | 10 ++ memory.c | 17 ++- target-ppc/kvm_ppc.h | 2 +- trace-events | 10 +- 17 files changed, 1018 insertions(+), 125 deletions(-) create mode 100644 hw/ppc/spapr_rtas_ddw.c create mode 100644 hw/vfio/prereg.c -- 2.5.0.rc3