diff options
Diffstat (limited to 'include/linux')
| -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) |
