1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _LINUX_IOMMU_HELPER_H 3 #define _LINUX_IOMMU_HELPER_H 4 5 #include <linux/bug.h> 6 #include <linux/log2.h> 7 #include <linux/math.h> 8 #include <linux/types.h> 9 10 static inline unsigned long iommu_device_max_index(unsigned long size, 11 unsigned long offset, 12 u64 dma_mask) 13 { 14 if (size + offset > dma_mask) 15 return dma_mask - offset + 1; 16 else 17 return size; 18 } 19 20 static inline int iommu_is_span_boundary(unsigned int index, unsigned int nr, 21 unsigned long shift, unsigned long boundary_size) 22 { 23 BUG_ON(!is_power_of_2(boundary_size)); 24 25 shift = (shift + index) & (boundary_size - 1); 26 return shift + nr > boundary_size; 27 } 28 29 extern unsigned long iommu_area_alloc(unsigned long *map, unsigned long size, 30 unsigned long start, unsigned int nr, 31 unsigned long shift, 32 unsigned long boundary_size, 33 unsigned long align_mask); 34 35 static inline unsigned long iommu_num_pages(unsigned long addr, 36 unsigned long len, 37 unsigned long io_page_size) 38 { 39 unsigned long size = (addr & (io_page_size - 1)) + len; 40 41 return DIV_ROUND_UP(size, io_page_size); 42 } 43 44 #endif 45