iommu: Add IOMMU_DOMAIN_PLATFORM
This is used when the iommu driver is taking control of the dma_ops, currently only on S390 and power spapr. It is designed to preserve the original ops->detach_dev() semantic that these S390 was built around. Provide an opaque domain type and a 'default_domain' ops value that allows the driver to trivially force any single domain as the default domain. Update iommufd selftest to use this instead of set_platform_dma_ops Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com> Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> Link: https://lore.kernel.org/r/2-v8-81230027b2fa+9d-iommu_all_defdom_jgg@nvidia.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
df31b29847
commit
1c68cbc64f
@ -184,6 +184,8 @@ static const char *iommu_domain_type_str(unsigned int t)
|
||||
case IOMMU_DOMAIN_DMA:
|
||||
case IOMMU_DOMAIN_DMA_FQ:
|
||||
return "Translated";
|
||||
case IOMMU_DOMAIN_PLATFORM:
|
||||
return "Platform";
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
@ -1752,6 +1754,17 @@ iommu_group_alloc_default_domain(struct iommu_group *group, int req_type)
|
||||
|
||||
lockdep_assert_held(&group->mutex);
|
||||
|
||||
/*
|
||||
* Allow legacy drivers to specify the domain that will be the default
|
||||
* domain. This should always be either an IDENTITY/BLOCKED/PLATFORM
|
||||
* domain. Do not use in new drivers.
|
||||
*/
|
||||
if (bus->iommu_ops->default_domain) {
|
||||
if (req_type)
|
||||
return ERR_PTR(-EINVAL);
|
||||
return bus->iommu_ops->default_domain;
|
||||
}
|
||||
|
||||
if (req_type)
|
||||
return __iommu_group_alloc_default_domain(bus, group, req_type);
|
||||
|
||||
|
@ -281,14 +281,6 @@ static bool mock_domain_capable(struct device *dev, enum iommu_cap cap)
|
||||
return cap == IOMMU_CAP_CACHE_COHERENCY;
|
||||
}
|
||||
|
||||
static void mock_domain_set_plaform_dma_ops(struct device *dev)
|
||||
{
|
||||
/*
|
||||
* mock doesn't setup default domains because we can't hook into the
|
||||
* normal probe path
|
||||
*/
|
||||
}
|
||||
|
||||
static struct iommu_device mock_iommu_device = {
|
||||
};
|
||||
|
||||
@ -298,12 +290,16 @@ static struct iommu_device *mock_probe_device(struct device *dev)
|
||||
}
|
||||
|
||||
static const struct iommu_ops mock_ops = {
|
||||
/*
|
||||
* IOMMU_DOMAIN_BLOCKED cannot be returned from def_domain_type()
|
||||
* because it is zero.
|
||||
*/
|
||||
.default_domain = &mock_blocking_domain,
|
||||
.owner = THIS_MODULE,
|
||||
.pgsize_bitmap = MOCK_IO_PAGE_SIZE,
|
||||
.hw_info = mock_domain_hw_info,
|
||||
.domain_alloc = mock_domain_alloc,
|
||||
.capable = mock_domain_capable,
|
||||
.set_platform_dma_ops = mock_domain_set_plaform_dma_ops,
|
||||
.device_group = generic_device_group,
|
||||
.probe_device = mock_probe_device,
|
||||
.default_domain_ops =
|
||||
|
@ -64,6 +64,7 @@ struct iommu_domain_geometry {
|
||||
#define __IOMMU_DOMAIN_DMA_FQ (1U << 3) /* DMA-API uses flush queue */
|
||||
|
||||
#define __IOMMU_DOMAIN_SVA (1U << 4) /* Shared process address space */
|
||||
#define __IOMMU_DOMAIN_PLATFORM (1U << 5)
|
||||
|
||||
#define IOMMU_DOMAIN_ALLOC_FLAGS ~__IOMMU_DOMAIN_DMA_FQ
|
||||
/*
|
||||
@ -81,6 +82,8 @@ struct iommu_domain_geometry {
|
||||
* invalidation.
|
||||
* IOMMU_DOMAIN_SVA - DMA addresses are shared process addresses
|
||||
* represented by mm_struct's.
|
||||
* IOMMU_DOMAIN_PLATFORM - Legacy domain for drivers that do their own
|
||||
* dma_api stuff. Do not use in new drivers.
|
||||
*/
|
||||
#define IOMMU_DOMAIN_BLOCKED (0U)
|
||||
#define IOMMU_DOMAIN_IDENTITY (__IOMMU_DOMAIN_PT)
|
||||
@ -91,6 +94,7 @@ struct iommu_domain_geometry {
|
||||
__IOMMU_DOMAIN_DMA_API | \
|
||||
__IOMMU_DOMAIN_DMA_FQ)
|
||||
#define IOMMU_DOMAIN_SVA (__IOMMU_DOMAIN_SVA)
|
||||
#define IOMMU_DOMAIN_PLATFORM (__IOMMU_DOMAIN_PLATFORM)
|
||||
|
||||
struct iommu_domain {
|
||||
unsigned type;
|
||||
@ -262,6 +266,9 @@ struct iommu_iotlb_gather {
|
||||
* @owner: Driver module providing these ops
|
||||
* @identity_domain: An always available, always attachable identity
|
||||
* translation.
|
||||
* @default_domain: If not NULL this will always be set as the default domain.
|
||||
* This should be an IDENTITY/BLOCKED/PLATFORM domain.
|
||||
* Do not use in new drivers.
|
||||
*/
|
||||
struct iommu_ops {
|
||||
bool (*capable)(struct device *dev, enum iommu_cap);
|
||||
@ -297,6 +304,7 @@ struct iommu_ops {
|
||||
unsigned long pgsize_bitmap;
|
||||
struct module *owner;
|
||||
struct iommu_domain *identity_domain;
|
||||
struct iommu_domain *default_domain;
|
||||
};
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user