iommu: Add tlbi_domain op

Some higher-level DMA mappers might be able to squeeze out more
performance if TLB invalidation can be delegated to them, since they
might have more knowledge about when a stale TLB is problem than the
IOMMU driver.  Add a callback for this purpose that can be implemented
by individual IOMMU drivers.

CRs-Fixed: 997751
Change-Id: If817f5514fdd5d24b9c592440760b81b88ec71a8
Signed-off-by: Mitchel Humpherys <mitchelh@codeaurora.org>
This commit is contained in:
Mitchel Humpherys 2015-12-03 11:17:23 -08:00 committed by Jeevan Shriram
parent b7d9fb96e0
commit e7f52c5c47

View file

@ -173,6 +173,7 @@ struct iommu_dm_region {
* @trigger_fault: trigger a fault on the device attached to an iommu domain * @trigger_fault: trigger a fault on the device attached to an iommu domain
* @reg_read: read an IOMMU register * @reg_read: read an IOMMU register
* @reg_write: write an IOMMU register * @reg_write: write an IOMMU register
* @tlbi_domain: Invalidate all TLBs covering an iommu domain
* @priv: per-instance data private to the iommu driver * @priv: per-instance data private to the iommu driver
*/ */
struct iommu_ops { struct iommu_ops {
@ -220,6 +221,7 @@ struct iommu_ops {
unsigned long offset); unsigned long offset);
void (*reg_write)(struct iommu_domain *domain, unsigned long val, void (*reg_write)(struct iommu_domain *domain, unsigned long val,
unsigned long offset); unsigned long offset);
void (*tlbi_domain)(struct iommu_domain *domain);
#ifdef CONFIG_OF_IOMMU #ifdef CONFIG_OF_IOMMU
int (*of_xlate)(struct device *dev, struct of_phandle_args *args); int (*of_xlate)(struct device *dev, struct of_phandle_args *args);
@ -382,6 +384,12 @@ extern struct iommu_group *pci_device_group(struct device *dev);
/* Generic device grouping function */ /* Generic device grouping function */
extern struct iommu_group *generic_device_group(struct device *dev); extern struct iommu_group *generic_device_group(struct device *dev);
static inline void iommu_tlbiall(struct iommu_domain *domain)
{
if (domain->ops->tlbi_domain)
domain->ops->tlbi_domain(domain);
}
#else /* CONFIG_IOMMU_API */ #else /* CONFIG_IOMMU_API */
struct iommu_ops {}; struct iommu_ops {};
@ -626,6 +634,10 @@ static int iommu_dma_supported(struct iommu_domain *domain, struct device *dev,
return -EINVAL; return -EINVAL;
} }
static inline void iommu_tlbiall(struct iommu_domain *domain)
{
}
#endif /* CONFIG_IOMMU_API */ #endif /* CONFIG_IOMMU_API */
#endif /* __LINUX_IOMMU_H */ #endif /* __LINUX_IOMMU_H */