intel-pasid.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // SPDX-License-Identifier: GPL-2.0
  2. /**
  3. * intel-pasid.c - PASID idr, table and entry manipulation
  4. *
  5. * Copyright (C) 2018 Intel Corporation
  6. *
  7. * Author: Lu Baolu <baolu.lu@linux.intel.com>
  8. */
  9. #define pr_fmt(fmt) "DMAR: " fmt
  10. #include <linux/dmar.h>
  11. #include <linux/intel-iommu.h>
  12. #include <linux/iommu.h>
  13. #include <linux/memory.h>
  14. #include <linux/spinlock.h>
  15. #include "intel-pasid.h"
  16. /*
  17. * Intel IOMMU system wide PASID name space:
  18. */
  19. static DEFINE_SPINLOCK(pasid_lock);
  20. u32 intel_pasid_max_id = PASID_MAX;
  21. static DEFINE_IDR(pasid_idr);
  22. int intel_pasid_alloc_id(void *ptr, int start, int end, gfp_t gfp)
  23. {
  24. int ret, min, max;
  25. min = max_t(int, start, PASID_MIN);
  26. max = min_t(int, end, intel_pasid_max_id);
  27. WARN_ON(in_interrupt());
  28. idr_preload(gfp);
  29. spin_lock(&pasid_lock);
  30. ret = idr_alloc(&pasid_idr, ptr, min, max, GFP_ATOMIC);
  31. spin_unlock(&pasid_lock);
  32. idr_preload_end();
  33. return ret;
  34. }
  35. void intel_pasid_free_id(int pasid)
  36. {
  37. spin_lock(&pasid_lock);
  38. idr_remove(&pasid_idr, pasid);
  39. spin_unlock(&pasid_lock);
  40. }
  41. void *intel_pasid_lookup_id(int pasid)
  42. {
  43. void *p;
  44. spin_lock(&pasid_lock);
  45. p = idr_find(&pasid_idr, pasid);
  46. spin_unlock(&pasid_lock);
  47. return p;
  48. }