iommu: Introduce iommu domain types
This allows to handle domains differently based on their type in the future. An IOMMU driver can implement certain optimizations for DMA-API domains for example. The domain types can be extended later and some of the existing domain attributes can be migrated to become domain flags. Tested-by: Thierry Reding <treding@nvidia.com> Tested-by: Heiko Stuebner <heiko@sntech.de> Reviewed-by: Alex Williamson <alex.williamson@redhat.com> Acked-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
938c470976
commit
8539c7c16b
|
@ -909,14 +909,15 @@ struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
|
||||||
ops = bus->iommu_ops;
|
ops = bus->iommu_ops;
|
||||||
|
|
||||||
if (ops->domain_alloc)
|
if (ops->domain_alloc)
|
||||||
domain = ops->domain_alloc();
|
domain = ops->domain_alloc(IOMMU_DOMAIN_UNMANAGED);
|
||||||
else
|
else
|
||||||
domain = kzalloc(sizeof(*domain), GFP_KERNEL);
|
domain = kzalloc(sizeof(*domain), GFP_KERNEL);
|
||||||
|
|
||||||
if (!domain)
|
if (!domain)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
domain->ops = bus->iommu_ops;
|
domain->ops = bus->iommu_ops;
|
||||||
|
domain->type = IOMMU_DOMAIN_UNMANAGED;
|
||||||
|
|
||||||
if (ops->domain_init && domain->ops->domain_init(domain))
|
if (ops->domain_init && domain->ops->domain_init(domain))
|
||||||
goto out_free;
|
goto out_free;
|
||||||
|
|
|
@ -51,7 +51,32 @@ struct iommu_domain_geometry {
|
||||||
bool force_aperture; /* DMA only allowed in mappable range? */
|
bool force_aperture; /* DMA only allowed in mappable range? */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Domain feature flags */
|
||||||
|
#define __IOMMU_DOMAIN_PAGING (1U << 0) /* Support for iommu_map/unmap */
|
||||||
|
#define __IOMMU_DOMAIN_DMA_API (1U << 1) /* Domain for use in DMA-API
|
||||||
|
implementation */
|
||||||
|
#define __IOMMU_DOMAIN_PT (1U << 2) /* Domain is identity mapped */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This are the possible domain-types
|
||||||
|
*
|
||||||
|
* IOMMU_DOMAIN_BLOCKED - All DMA is blocked, can be used to isolate
|
||||||
|
* devices
|
||||||
|
* IOMMU_DOMAIN_IDENTITY - DMA addresses are system physical addresses
|
||||||
|
* IOMMU_DOMAIN_UNMANAGED - DMA mappings managed by IOMMU-API user, used
|
||||||
|
* for VMs
|
||||||
|
* IOMMU_DOMAIN_DMA - Internally used for DMA-API implementations.
|
||||||
|
* This flag allows IOMMU drivers to implement
|
||||||
|
* certain optimizations for these domains
|
||||||
|
*/
|
||||||
|
#define IOMMU_DOMAIN_BLOCKED (0U)
|
||||||
|
#define IOMMU_DOMAIN_IDENTITY (__IOMMU_DOMAIN_PT)
|
||||||
|
#define IOMMU_DOMAIN_UNMANAGED (__IOMMU_DOMAIN_PAGING)
|
||||||
|
#define IOMMU_DOMAIN_DMA (__IOMMU_DOMAIN_PAGING | \
|
||||||
|
__IOMMU_DOMAIN_DMA_API)
|
||||||
|
|
||||||
struct iommu_domain {
|
struct iommu_domain {
|
||||||
|
unsigned type;
|
||||||
const struct iommu_ops *ops;
|
const struct iommu_ops *ops;
|
||||||
void *priv;
|
void *priv;
|
||||||
iommu_fault_handler_t handler;
|
iommu_fault_handler_t handler;
|
||||||
|
@ -117,7 +142,7 @@ struct iommu_ops {
|
||||||
void (*domain_destroy)(struct iommu_domain *domain);
|
void (*domain_destroy)(struct iommu_domain *domain);
|
||||||
|
|
||||||
/* Domain allocation and freeing by the iommu driver */
|
/* Domain allocation and freeing by the iommu driver */
|
||||||
struct iommu_domain *(*domain_alloc)(void);
|
struct iommu_domain *(*domain_alloc)(unsigned iommu_domain_type);
|
||||||
void (*domain_free)(struct iommu_domain *);
|
void (*domain_free)(struct iommu_domain *);
|
||||||
|
|
||||||
int (*attach_dev)(struct iommu_domain *domain, struct device *dev);
|
int (*attach_dev)(struct iommu_domain *domain, struct device *dev);
|
||||||
|
|
Loading…
Reference in New Issue