mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
iommu/riscv: Report cache coherency capability
VFIO and iommufd require IOMMU_CAP_CACHE_COHERENCY because they use IOMMU_CACHE mappings and have no userspace cache-maintenance path. RISC-V page tables preserve physical memory attributes for IOMMU_CACHE mappings. Svpbmt marks mappings without IOMMU_CACHE as non-cacheable, but preserving physical attributes cannot make a noncoherent device path coherent. Report the capability only for devices marked DMA coherent. This limits userspace assignment to paths that can honor cacheable mappings. Signed-off-by: Andrew Jones <andrew.jones@oss.qualcomm.com> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
This commit is contained in:
parent
93f51579e7
commit
3069e8f3e1
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/acpi_rimt.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/crash_dump.h>
|
||||
#include <linux/dma-map-ops.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/iommu.h>
|
||||
#include <linux/iopoll.h>
|
||||
|
|
@ -1444,6 +1445,16 @@ static struct iommu_group *riscv_iommu_device_group(struct device *dev)
|
|||
return generic_device_group(dev);
|
||||
}
|
||||
|
||||
static bool riscv_iommu_capable(struct device *dev, enum iommu_cap cap)
|
||||
{
|
||||
switch (cap) {
|
||||
case IOMMU_CAP_CACHE_COHERENCY:
|
||||
return dev_is_dma_coherent(dev);
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static int riscv_iommu_of_xlate(struct device *dev, const struct of_phandle_args *args)
|
||||
{
|
||||
return iommu_fwspec_add_ids(dev, args->args, 1);
|
||||
|
|
@ -1505,6 +1516,7 @@ static void riscv_iommu_release_device(struct device *dev)
|
|||
|
||||
static const struct iommu_ops riscv_iommu_ops = {
|
||||
.of_xlate = riscv_iommu_of_xlate,
|
||||
.capable = riscv_iommu_capable,
|
||||
.identity_domain = &riscv_iommu_identity_domain,
|
||||
.blocked_domain = &riscv_iommu_blocking_domain,
|
||||
.release_domain = &riscv_iommu_blocking_domain,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user