diff options
Diffstat (limited to 'include/linux/iommu.h')
-rw-r--r-- | include/linux/iommu.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index e6a7c9ff72f2..b29a5982e1c3 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/errno.h> | 22 | #include <linux/errno.h> |
23 | #include <linux/err.h> | 23 | #include <linux/err.h> |
24 | #include <linux/types.h> | 24 | #include <linux/types.h> |
25 | #include <linux/scatterlist.h> | ||
25 | #include <trace/events/iommu.h> | 26 | #include <trace/events/iommu.h> |
26 | 27 | ||
27 | #define IOMMU_READ (1 << 0) | 28 | #define IOMMU_READ (1 << 0) |
@@ -97,6 +98,8 @@ enum iommu_attr { | |||
97 | * @detach_dev: detach device from an iommu domain | 98 | * @detach_dev: detach device from an iommu domain |
98 | * @map: map a physically contiguous memory region to an iommu domain | 99 | * @map: map a physically contiguous memory region to an iommu domain |
99 | * @unmap: unmap a physically contiguous memory region from an iommu domain | 100 | * @unmap: unmap a physically contiguous memory region from an iommu domain |
101 | * @map_sg: map a scatter-gather list of physically contiguous memory chunks | ||
102 | * to an iommu domain | ||
100 | * @iova_to_phys: translate iova to physical address | 103 | * @iova_to_phys: translate iova to physical address |
101 | * @add_device: add device to iommu grouping | 104 | * @add_device: add device to iommu grouping |
102 | * @remove_device: remove device from iommu grouping | 105 | * @remove_device: remove device from iommu grouping |
@@ -114,6 +117,8 @@ struct iommu_ops { | |||
114 | phys_addr_t paddr, size_t size, int prot); | 117 | phys_addr_t paddr, size_t size, int prot); |
115 | size_t (*unmap)(struct iommu_domain *domain, unsigned long iova, | 118 | size_t (*unmap)(struct iommu_domain *domain, unsigned long iova, |
116 | size_t size); | 119 | size_t size); |
120 | size_t (*map_sg)(struct iommu_domain *domain, unsigned long iova, | ||
121 | struct scatterlist *sg, unsigned int nents, int prot); | ||
117 | phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, dma_addr_t iova); | 122 | phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, dma_addr_t iova); |
118 | int (*add_device)(struct device *dev); | 123 | int (*add_device)(struct device *dev); |
119 | void (*remove_device)(struct device *dev); | 124 | void (*remove_device)(struct device *dev); |
@@ -156,6 +161,9 @@ extern int iommu_map(struct iommu_domain *domain, unsigned long iova, | |||
156 | phys_addr_t paddr, size_t size, int prot); | 161 | phys_addr_t paddr, size_t size, int prot); |
157 | extern size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, | 162 | extern size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, |
158 | size_t size); | 163 | size_t size); |
164 | extern size_t default_iommu_map_sg(struct iommu_domain *domain, unsigned long iova, | ||
165 | struct scatterlist *sg,unsigned int nents, | ||
166 | int prot); | ||
159 | extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova); | 167 | extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova); |
160 | extern void iommu_set_fault_handler(struct iommu_domain *domain, | 168 | extern void iommu_set_fault_handler(struct iommu_domain *domain, |
161 | iommu_fault_handler_t handler, void *token); | 169 | iommu_fault_handler_t handler, void *token); |
@@ -241,6 +249,13 @@ static inline int report_iommu_fault(struct iommu_domain *domain, | |||
241 | return ret; | 249 | return ret; |
242 | } | 250 | } |
243 | 251 | ||
252 | static inline size_t iommu_map_sg(struct iommu_domain *domain, | ||
253 | unsigned long iova, struct scatterlist *sg, | ||
254 | unsigned int nents, int prot) | ||
255 | { | ||
256 | return domain->ops->map_sg(domain, iova, sg, nents, prot); | ||
257 | } | ||
258 | |||
244 | #else /* CONFIG_IOMMU_API */ | 259 | #else /* CONFIG_IOMMU_API */ |
245 | 260 | ||
246 | struct iommu_ops {}; | 261 | struct iommu_ops {}; |
@@ -293,6 +308,13 @@ static inline int iommu_unmap(struct iommu_domain *domain, unsigned long iova, | |||
293 | return -ENODEV; | 308 | return -ENODEV; |
294 | } | 309 | } |
295 | 310 | ||
311 | static inline size_t iommu_map_sg(struct iommu_domain *domain, | ||
312 | unsigned long iova, struct scatterlist *sg, | ||
313 | unsigned int nents, int prot) | ||
314 | { | ||
315 | return -ENODEV; | ||
316 | } | ||
317 | |||
296 | static inline int iommu_domain_window_enable(struct iommu_domain *domain, | 318 | static inline int iommu_domain_window_enable(struct iommu_domain *domain, |
297 | u32 wnd_nr, phys_addr_t paddr, | 319 | u32 wnd_nr, phys_addr_t paddr, |
298 | u64 size, int prot) | 320 | u64 size, int prot) |