Linux 6.0-rc1
[linux-2.6-microblaze.git] / lib / iommu-helper.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * IOMMU helper functions for the free area management
4  */
5
6 #include <linux/bitmap.h>
7 #include <linux/iommu-helper.h>
8
9 unsigned 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;
18 again:
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 }