iova.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2006, Intel Corporation.
  4. *
  5. * Copyright (C) 2006-2008 Intel Corporation
  6. * Author: Anil S Keshavamurthy <[email protected]>
  7. */
  8. #ifndef _IOVA_H_
  9. #define _IOVA_H_
  10. #include <linux/types.h>
  11. #include <linux/kernel.h>
  12. #include <linux/rbtree.h>
  13. #include <linux/dma-mapping.h>
  14. #include <linux/android_vendor.h>
  15. /* iova structure */
  16. struct iova {
  17. struct rb_node node;
  18. unsigned long pfn_hi; /* Highest allocated pfn */
  19. unsigned long pfn_lo; /* Lowest allocated pfn */
  20. };
  21. struct iova_rcache;
  22. /* holds all the iova translations for a domain */
  23. struct iova_domain {
  24. spinlock_t iova_rbtree_lock; /* Lock to protect update of rbtree */
  25. struct rb_root rbroot; /* iova domain rbtree root */
  26. struct rb_node *cached_node; /* Save last alloced node */
  27. struct rb_node *cached32_node; /* Save last 32-bit alloced node */
  28. unsigned long granule; /* pfn granularity for this domain */
  29. unsigned long start_pfn; /* Lower limit for this domain */
  30. unsigned long dma_32bit_pfn;
  31. unsigned long max32_alloc_size; /* Size of last failed allocation */
  32. struct iova anchor; /* rbtree lookup anchor */
  33. struct iova_rcache *rcaches;
  34. struct hlist_node cpuhp_dead;
  35. ANDROID_VENDOR_DATA(1);
  36. };
  37. static inline unsigned long iova_size(struct iova *iova)
  38. {
  39. return iova->pfn_hi - iova->pfn_lo + 1;
  40. }
  41. static inline unsigned long iova_shift(struct iova_domain *iovad)
  42. {
  43. return __ffs(iovad->granule);
  44. }
  45. static inline unsigned long iova_mask(struct iova_domain *iovad)
  46. {
  47. return iovad->granule - 1;
  48. }
  49. static inline size_t iova_offset(struct iova_domain *iovad, dma_addr_t iova)
  50. {
  51. return iova & iova_mask(iovad);
  52. }
  53. static inline size_t iova_align(struct iova_domain *iovad, size_t size)
  54. {
  55. return ALIGN(size, iovad->granule);
  56. }
  57. static inline dma_addr_t iova_dma_addr(struct iova_domain *iovad, struct iova *iova)
  58. {
  59. return (dma_addr_t)iova->pfn_lo << iova_shift(iovad);
  60. }
  61. static inline unsigned long iova_pfn(struct iova_domain *iovad, dma_addr_t iova)
  62. {
  63. return iova >> iova_shift(iovad);
  64. }
  65. #if IS_REACHABLE(CONFIG_IOMMU_IOVA)
  66. int iova_cache_get(void);
  67. void iova_cache_put(void);
  68. unsigned long iova_rcache_range(void);
  69. void free_iova(struct iova_domain *iovad, unsigned long pfn);
  70. void __free_iova(struct iova_domain *iovad, struct iova *iova);
  71. struct iova *alloc_iova(struct iova_domain *iovad, unsigned long size,
  72. unsigned long limit_pfn,
  73. bool size_aligned);
  74. void free_iova_fast(struct iova_domain *iovad, unsigned long pfn,
  75. unsigned long size);
  76. unsigned long alloc_iova_fast(struct iova_domain *iovad, unsigned long size,
  77. unsigned long limit_pfn, bool flush_rcache);
  78. struct iova *reserve_iova(struct iova_domain *iovad, unsigned long pfn_lo,
  79. unsigned long pfn_hi);
  80. void init_iova_domain(struct iova_domain *iovad, unsigned long granule,
  81. unsigned long start_pfn);
  82. int iova_domain_init_rcaches(struct iova_domain *iovad);
  83. struct iova *find_iova(struct iova_domain *iovad, unsigned long pfn);
  84. void put_iova_domain(struct iova_domain *iovad);
  85. #else
  86. static inline int iova_cache_get(void)
  87. {
  88. return -ENOTSUPP;
  89. }
  90. static inline void iova_cache_put(void)
  91. {
  92. }
  93. static inline void free_iova(struct iova_domain *iovad, unsigned long pfn)
  94. {
  95. }
  96. static inline void __free_iova(struct iova_domain *iovad, struct iova *iova)
  97. {
  98. }
  99. static inline struct iova *alloc_iova(struct iova_domain *iovad,
  100. unsigned long size,
  101. unsigned long limit_pfn,
  102. bool size_aligned)
  103. {
  104. return NULL;
  105. }
  106. static inline void free_iova_fast(struct iova_domain *iovad,
  107. unsigned long pfn,
  108. unsigned long size)
  109. {
  110. }
  111. static inline unsigned long alloc_iova_fast(struct iova_domain *iovad,
  112. unsigned long size,
  113. unsigned long limit_pfn,
  114. bool flush_rcache)
  115. {
  116. return 0;
  117. }
  118. static inline struct iova *reserve_iova(struct iova_domain *iovad,
  119. unsigned long pfn_lo,
  120. unsigned long pfn_hi)
  121. {
  122. return NULL;
  123. }
  124. static inline void init_iova_domain(struct iova_domain *iovad,
  125. unsigned long granule,
  126. unsigned long start_pfn)
  127. {
  128. }
  129. static inline struct iova *find_iova(struct iova_domain *iovad,
  130. unsigned long pfn)
  131. {
  132. return NULL;
  133. }
  134. static inline void put_iova_domain(struct iova_domain *iovad)
  135. {
  136. }
  137. #endif
  138. #endif