diff options
| author | Joerg Roedel <joro@8bytes.org> | 2013-01-29 14:26:20 +0100 | 
|---|---|---|
| committer | Joerg Roedel <joro@8bytes.org> | 2013-02-06 10:47:22 +0100 | 
| commit | d7787d579cbef9f8079104759a2259fc916c688c (patch) | |
| tree | 28e2066c0c89b1d25e8caf2c60956ecc45e3f781 | |
| parent | d2e121601619631517409cba34e50db3cbff5852 (diff) | |
| download | olio-linux-3.10-d7787d579cbef9f8079104759a2259fc916c688c.tar.xz olio-linux-3.10-d7787d579cbef9f8079104759a2259fc916c688c.zip  | |
iommu: Add domain window handling functions
Add the iommu_domain_window_enable() and iommu_domain_window_disable()
functions to the IOMMU-API. These functions will be used to setup
domains that are based on subwindows and not on paging.
Signed-off-by: Joerg Roedel <joro@8bytes.org>
| -rw-r--r-- | drivers/iommu/iommu.c | 20 | ||||
| -rw-r--r-- | include/linux/iommu.h | 22 | 
2 files changed, 42 insertions, 0 deletions
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 0e0e5f2e0cc..b3aced7356c 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -852,6 +852,26 @@ size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size)  }  EXPORT_SYMBOL_GPL(iommu_unmap); + +int iommu_domain_window_enable(struct iommu_domain *domain, u32 wnd_nr, +			       phys_addr_t paddr, u64 size) +{ +	if (unlikely(domain->ops->domain_window_enable == NULL)) +		return -ENODEV; + +	return domain->ops->domain_window_enable(domain, wnd_nr, paddr, size); +} +EXPORT_SYMBOL_GPL(iommu_domain_window_enable); + +void iommu_domain_window_disable(struct iommu_domain *domain, u32 wnd_nr) +{ +	if (unlikely(domain->ops->domain_window_disable == NULL)) +		return; + +	return domain->ops->domain_window_disable(domain, wnd_nr); +} +EXPORT_SYMBOL_GPL(iommu_domain_window_disable); +  static int __init iommu_init(void)  {  	iommu_group_kset = kset_create_and_add("iommu_groups", diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 26066f54a84..5ea3d725091 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -101,6 +101,12 @@ struct iommu_ops {  			       enum iommu_attr attr, void *data);  	int (*domain_set_attr)(struct iommu_domain *domain,  			       enum iommu_attr attr, void *data); + +	/* Window handling functions */ +	int (*domain_window_enable)(struct iommu_domain *domain, u32 wnd_nr, +				    phys_addr_t paddr, u64 size); +	void (*domain_window_disable)(struct iommu_domain *domain, u32 wnd_nr); +  	unsigned long pgsize_bitmap;  }; @@ -158,6 +164,10 @@ extern int iommu_domain_get_attr(struct iommu_domain *domain, enum iommu_attr,  extern int iommu_domain_set_attr(struct iommu_domain *domain, enum iommu_attr,  				 void *data); +/* Window handling function prototypes */ +extern int iommu_domain_window_enable(struct iommu_domain *domain, u32 wnd_nr, +				      phys_addr_t offset, u64 size); +extern void iommu_domain_window_disable(struct iommu_domain *domain, u32 wnd_nr);  /**   * report_iommu_fault() - report about an IOMMU fault to the IOMMU framework   * @domain: the iommu domain where the fault has happened @@ -240,6 +250,18 @@ static inline int iommu_unmap(struct iommu_domain *domain, unsigned long iova,  	return -ENODEV;  } +static inline int iommu_domain_window_enable(struct iommu_domain *domain, +					     u32 wnd_nr, phys_addr_t paddr, +					     u64 size) +{ +	return -ENODEV; +} + +static inline void iommu_domain_window_disable(struct iommu_domain *domain, +					       u32 wnd_nr) +{ +} +  static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain,  					     unsigned long iova)  {  |