Skip to content

Commit 341d041

Browse files
committed
Merge tag 'for-linus-iommufd' of git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd
Pull iommufd updates from Jason Gunthorpe: "Several new features and uAPI for iommufd: - IOMMU_IOAS_MAP_FILE allows passing in a file descriptor as the backing memory for an iommu mapping. To date VFIO/iommufd have used VMA's and pin_user_pages(), this now allows using memfds and memfd_pin_folios(). Notably this creates a pure folio path from the memfd to the iommu page table where memory is never broken down to PAGE_SIZE. - IOMMU_IOAS_CHANGE_PROCESS moves the pinned page accounting between two processes. Combined with the above this allows iommufd to support a VMM re-start using exec() where something like qemu would exec() a new version of itself and fd pass the memfds/iommufd/etc to the new process. The memfd allows DMA access to the memory to continue while the new process is getting setup, and the CHANGE_PROCESS updates all the accounting. - Support for fault reporting to userspace on non-PRI HW, such as ARM stall-mode embedded devices. - IOMMU_VIOMMU_ALLOC introduces the concept of a HW/driver backed virtual iommu. This will be used by VMMs to access hardware features that are contained with in a VM. The first use is to inform the kernel of the virtual SID to physical SID mapping when issuing SID based invalidation on ARM. Further uses will tie HW features that are directly accessed by the VM, such as invalidation queue assignment and others. - IOMMU_VDEVICE_ALLOC informs the kernel about the mapping of virtual device to physical device within a VIOMMU. Minimially this is used to translate VM issued cache invalidation commands from virtual to physical device IDs. - Enhancements to IOMMU_HWPT_INVALIDATE and IOMMU_HWPT_ALLOC to work with the VIOMMU - ARM SMMuv3 support for nested translation. Using the VIOMMU and VDEVICE the driver can model this HW's behavior for nested translation. This includes a shared branch from Will" * tag 'for-linus-iommufd' of git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd: (51 commits) iommu/arm-smmu-v3: Import IOMMUFD module namespace iommufd: IOMMU_IOAS_CHANGE_PROCESS selftest iommufd: Add IOMMU_IOAS_CHANGE_PROCESS iommufd: Lock all IOAS objects iommufd: Export do_update_pinned iommu/arm-smmu-v3: Support IOMMU_HWPT_INVALIDATE using a VIOMMU object iommu/arm-smmu-v3: Allow ATS for IOMMU_DOMAIN_NESTED iommu/arm-smmu-v3: Use S2FWB for NESTED domains iommu/arm-smmu-v3: Support IOMMU_DOMAIN_NESTED iommu/arm-smmu-v3: Support IOMMU_VIOMMU_ALLOC Documentation: userspace-api: iommufd: Update vDEVICE iommufd/selftest: Add vIOMMU coverage for IOMMU_HWPT_INVALIDATE ioctl iommufd/selftest: Add IOMMU_TEST_OP_DEV_CHECK_CACHE test command iommufd/selftest: Add mock_viommu_cache_invalidate iommufd/viommu: Add iommufd_viommu_find_dev helper iommu: Add iommu_copy_struct_from_full_user_array helper iommufd: Allow hwpt_id to carry viommu_id for IOMMU_HWPT_INVALIDATE iommu/viommu: Add cache_invalidate to iommufd_viommu_ops iommufd/selftest: Add IOMMU_VDEVICE_ALLOC test coverage iommufd/viommu: Add IOMMUFD_OBJ_VDEVICE and IOMMU_VDEVICE_ALLOC ioctl ...
2 parents 51ae62a + 6d026e6 commit 341d041

38 files changed

+3354
-427
lines changed

Documentation/userspace-api/iommufd.rst

Lines changed: 179 additions & 47 deletions
Large diffs are not rendered by default.

drivers/acpi/arm64/iort.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,6 +1218,17 @@ static bool iort_pci_rc_supports_ats(struct acpi_iort_node *node)
12181218
return pci_rc->ats_attribute & ACPI_IORT_ATS_SUPPORTED;
12191219
}
12201220

1221+
static bool iort_pci_rc_supports_canwbs(struct acpi_iort_node *node)
1222+
{
1223+
struct acpi_iort_memory_access *memory_access;
1224+
struct acpi_iort_root_complex *pci_rc;
1225+
1226+
pci_rc = (struct acpi_iort_root_complex *)node->node_data;
1227+
memory_access =
1228+
(struct acpi_iort_memory_access *)&pci_rc->memory_properties;
1229+
return memory_access->memory_flags & ACPI_IORT_MF_CANWBS;
1230+
}
1231+
12211232
static int iort_iommu_xlate(struct device *dev, struct acpi_iort_node *node,
12221233
u32 streamid)
12231234
{
@@ -1335,6 +1346,8 @@ int iort_iommu_configure_id(struct device *dev, const u32 *id_in)
13351346
fwspec = dev_iommu_fwspec_get(dev);
13361347
if (fwspec && iort_pci_rc_supports_ats(node))
13371348
fwspec->flags |= IOMMU_FWSPEC_PCI_RC_ATS;
1349+
if (fwspec && iort_pci_rc_supports_canwbs(node))
1350+
fwspec->flags |= IOMMU_FWSPEC_PCI_RC_CANWBS;
13381351
} else {
13391352
node = iort_scan_node(ACPI_IORT_NODE_NAMED_COMPONENT,
13401353
iort_match_node_callback, dev);

drivers/iommu/Kconfig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,15 @@ config ARM_SMMU_V3_SVA
415415
Say Y here if your system supports SVA extensions such as PCIe PASID
416416
and PRI.
417417

418+
config ARM_SMMU_V3_IOMMUFD
419+
bool "Enable IOMMUFD features for ARM SMMUv3 (EXPERIMENTAL)"
420+
depends on IOMMUFD
421+
help
422+
Support for IOMMUFD features intended to support virtual machines
423+
with accelerated virtual IOMMUs.
424+
425+
Say Y here if you are doing development and testing on this feature.
426+
418427
config ARM_SMMU_V3_KUNIT_TEST
419428
tristate "KUnit tests for arm-smmu-v3 driver" if !KUNIT_ALL_TESTS
420429
depends on KUNIT

drivers/iommu/arm/arm-smmu-v3/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# SPDX-License-Identifier: GPL-2.0
22
obj-$(CONFIG_ARM_SMMU_V3) += arm_smmu_v3.o
33
arm_smmu_v3-y := arm-smmu-v3.o
4+
arm_smmu_v3-$(CONFIG_ARM_SMMU_V3_IOMMUFD) += arm-smmu-v3-iommufd.o
45
arm_smmu_v3-$(CONFIG_ARM_SMMU_V3_SVA) += arm-smmu-v3-sva.o
56
arm_smmu_v3-$(CONFIG_TEGRA241_CMDQV) += tegra241-cmdqv.o
67

0 commit comments

Comments
 (0)