Line data Source code
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 0 : static inline int iommu_is_span_boundary(unsigned int index, unsigned int nr, 21 : unsigned long shift, unsigned long boundary_size) 22 : { 23 0 : BUG_ON(!is_power_of_2(boundary_size)); 24 : 25 0 : shift = (shift + index) & (boundary_size - 1); 26 0 : 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