iommu-helper.h (1146B)
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 10static 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 20static 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 29extern 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 35static 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