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:
parent
b7d9fb96e0
commit
e7f52c5c47
1 changed files with 12 additions and 0 deletions
|
@ -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 */
|
||||||
|
|
Loading…
Add table
Reference in a new issue