iommu-helper.c 755 B

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