30 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * IOMMU helper functions for the free area management4 */5 6#include <linux/bitmap.h>7#include <linux/iommu-helper.h>8 9unsigned long iommu_area_alloc(unsigned long *map, unsigned long size,10 unsigned long start, unsigned int nr,11 unsigned long shift, unsigned long boundary_size,12 unsigned long align_mask)13{14 unsigned long index;15 16 /* We don't want the last of the limit */17 size -= 1;18again:19 index = bitmap_find_next_zero_area(map, size, start, nr, align_mask);20 if (index < size) {21 if (iommu_is_span_boundary(index, nr, shift, boundary_size)) {22 start = ALIGN(shift + index, boundary_size) - shift;23 goto again;24 }25 bitmap_set(map, index, nr);26 return index;27 }28 return -1;29}30