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
3 changed files with 26 additions and 9 deletions
|
@ -184,6 +184,8 @@ static const char *iommu_domain_type_str(unsigned int t)
|
||||||
case IOMMU_DOMAIN_DMA:
|
case IOMMU_DOMAIN_DMA:
|
||||||
case IOMMU_DOMAIN_DMA_FQ:
|
case IOMMU_DOMAIN_DMA_FQ:
|
||||||
return "Translated";
|
return "Translated";
|
||||||
|
case IOMMU_DOMAIN_PLATFORM:
|
||||||
|
return "Platform";
|
||||||
default:
|
default:
|
||||||
return "Unknown";
|
return "Unknown";
|
||||||
}
|
}
|
||||||
|
@ -1752,6 +1754,17 @@ iommu_group_alloc_default_domain(struct iommu_group *group, int req_type)
|
||||||
|
|
||||||
lockdep_assert_held(&group->mutex);
|
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)
|
if (req_type)
|
||||||
return __iommu_group_alloc_default_domain(bus, group, 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;
|
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 = {
|
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 = {
|
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,
|
.owner = THIS_MODULE,
|
||||||
.pgsize_bitmap = MOCK_IO_PAGE_SIZE,
|
.pgsize_bitmap = MOCK_IO_PAGE_SIZE,
|
||||||
.hw_info = mock_domain_hw_info,
|
.hw_info = mock_domain_hw_info,
|
||||||
.domain_alloc = mock_domain_alloc,
|
.domain_alloc = mock_domain_alloc,
|
||||||
.capable = mock_domain_capable,
|
.capable = mock_domain_capable,
|
||||||
.set_platform_dma_ops = mock_domain_set_plaform_dma_ops,
|
|
||||||
.device_group = generic_device_group,
|
.device_group = generic_device_group,
|
||||||
.probe_device = mock_probe_device,
|
.probe_device = mock_probe_device,
|
||||||
.default_domain_ops =
|
.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_DMA_FQ (1U << 3) /* DMA-API uses flush queue */
|
||||||
|
|
||||||
#define __IOMMU_DOMAIN_SVA (1U << 4) /* Shared process address space */
|
#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
|
#define IOMMU_DOMAIN_ALLOC_FLAGS ~__IOMMU_DOMAIN_DMA_FQ
|
||||||
/*
|
/*
|
||||||
|
@ -81,6 +82,8 @@ struct iommu_domain_geometry {
|
||||||
* invalidation.
|
* invalidation.
|
||||||
* IOMMU_DOMAIN_SVA - DMA addresses are shared process addresses
|
* IOMMU_DOMAIN_SVA - DMA addresses are shared process addresses
|
||||||
* represented by mm_struct's.
|
* 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_BLOCKED (0U)
|
||||||
#define IOMMU_DOMAIN_IDENTITY (__IOMMU_DOMAIN_PT)
|
#define IOMMU_DOMAIN_IDENTITY (__IOMMU_DOMAIN_PT)
|
||||||
|
@ -91,6 +94,7 @@ struct iommu_domain_geometry {
|
||||||
__IOMMU_DOMAIN_DMA_API | \
|
__IOMMU_DOMAIN_DMA_API | \
|
||||||
__IOMMU_DOMAIN_DMA_FQ)
|
__IOMMU_DOMAIN_DMA_FQ)
|
||||||
#define IOMMU_DOMAIN_SVA (__IOMMU_DOMAIN_SVA)
|
#define IOMMU_DOMAIN_SVA (__IOMMU_DOMAIN_SVA)
|
||||||
|
#define IOMMU_DOMAIN_PLATFORM (__IOMMU_DOMAIN_PLATFORM)
|
||||||
|
|
||||||
struct iommu_domain {
|
struct iommu_domain {
|
||||||
unsigned type;
|
unsigned type;
|
||||||
|
@ -262,6 +266,9 @@ struct iommu_iotlb_gather {
|
||||||
* @owner: Driver module providing these ops
|
* @owner: Driver module providing these ops
|
||||||
* @identity_domain: An always available, always attachable identity
|
* @identity_domain: An always available, always attachable identity
|
||||||
* translation.
|
* 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 {
|
struct iommu_ops {
|
||||||
bool (*capable)(struct device *dev, enum iommu_cap);
|
bool (*capable)(struct device *dev, enum iommu_cap);
|
||||||
|
@ -297,6 +304,7 @@ struct iommu_ops {
|
||||||
unsigned long pgsize_bitmap;
|
unsigned long pgsize_bitmap;
|
||||||
struct module *owner;
|
struct module *owner;
|
||||||
struct iommu_domain *identity_domain;
|
struct iommu_domain *identity_domain;
|
||||||
|
struct iommu_domain *default_domain;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue