io-pgtable.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __IO_PGTABLE_H
  3. #define __IO_PGTABLE_H
  4. #include <linux/bitops.h>
  5. #include <linux/iommu.h>
  6. /*
  7. * Public API for use by IOMMU drivers
  8. */
  9. enum io_pgtable_fmt {
  10. ARM_32_LPAE_S1,
  11. ARM_32_LPAE_S2,
  12. ARM_64_LPAE_S1,
  13. ARM_64_LPAE_S2,
  14. ARM_V7S,
  15. ARM_MALI_LPAE,
  16. AMD_IOMMU_V1,
  17. AMD_IOMMU_V2,
  18. APPLE_DART,
  19. APPLE_DART2,
  20. IO_PGTABLE_NUM_FMTS,
  21. };
  22. /**
  23. * struct iommu_flush_ops - IOMMU callbacks for TLB and page table management.
  24. *
  25. * @tlb_flush_all: Synchronously invalidate the entire TLB context.
  26. * @tlb_flush_walk: Synchronously invalidate all intermediate TLB state
  27. * (sometimes referred to as the "walk cache") for a virtual
  28. * address range.
  29. * @tlb_add_page: Optional callback to queue up leaf TLB invalidation for a
  30. * single page. IOMMUs that cannot batch TLB invalidation
  31. * operations efficiently will typically issue them here, but
  32. * others may decide to update the iommu_iotlb_gather structure
  33. * and defer the invalidation until iommu_iotlb_sync() instead.
  34. *
  35. * Note that these can all be called in atomic context and must therefore
  36. * not block.
  37. */
  38. struct iommu_flush_ops {
  39. void (*tlb_flush_all)(void *cookie);
  40. void (*tlb_flush_walk)(unsigned long iova, size_t size, size_t granule,
  41. void *cookie);
  42. void (*tlb_add_page)(struct iommu_iotlb_gather *gather,
  43. unsigned long iova, size_t granule, void *cookie);
  44. };
  45. /**
  46. * struct io_pgtable_cfg - Configuration data for a set of page tables.
  47. *
  48. * @quirks: A bitmap of hardware quirks that require some special
  49. * action by the low-level page table allocator.
  50. * @pgsize_bitmap: A bitmap of page sizes supported by this set of page
  51. * tables.
  52. * @ias: Input address (iova) size, in bits.
  53. * @oas: Output address (paddr) size, in bits.
  54. * @coherent_walk A flag to indicate whether or not page table walks made
  55. * by the IOMMU are coherent with the CPU caches.
  56. * @tlb: TLB management callbacks for this set of tables.
  57. * @iommu_dev: The device representing the DMA configuration for the
  58. * page table walker.
  59. */
  60. struct io_pgtable_cfg {
  61. /*
  62. * IO_PGTABLE_QUIRK_ARM_NS: (ARM formats) Set NS and NSTABLE bits in
  63. * stage 1 PTEs, for hardware which insists on validating them
  64. * even in non-secure state where they should normally be ignored.
  65. *
  66. * IO_PGTABLE_QUIRK_NO_PERMS: Ignore the IOMMU_READ, IOMMU_WRITE and
  67. * IOMMU_NOEXEC flags and map everything with full access, for
  68. * hardware which does not implement the permissions of a given
  69. * format, and/or requires some format-specific default value.
  70. *
  71. * IO_PGTABLE_QUIRK_ARM_MTK_EXT: (ARM v7s format) MediaTek IOMMUs extend
  72. * to support up to 35 bits PA where the bit32, bit33 and bit34 are
  73. * encoded in the bit9, bit4 and bit5 of the PTE respectively.
  74. *
  75. * IO_PGTABLE_QUIRK_ARM_MTK_TTBR_EXT: (ARM v7s format) MediaTek IOMMUs
  76. * extend the translation table base support up to 35 bits PA, the
  77. * encoding format is same with IO_PGTABLE_QUIRK_ARM_MTK_EXT.
  78. *
  79. * IO_PGTABLE_QUIRK_ARM_TTBR1: (ARM LPAE format) Configure the table
  80. * for use in the upper half of a split address space.
  81. *
  82. * IO_PGTABLE_QUIRK_ARM_OUTER_WBWA: Override the outer-cacheability
  83. * attributes set in the TCR for a non-coherent page-table walker.
  84. */
  85. #define IO_PGTABLE_QUIRK_ARM_NS BIT(0)
  86. #define IO_PGTABLE_QUIRK_NO_PERMS BIT(1)
  87. #define IO_PGTABLE_QUIRK_ARM_MTK_EXT BIT(3)
  88. #define IO_PGTABLE_QUIRK_ARM_MTK_TTBR_EXT BIT(4)
  89. #define IO_PGTABLE_QUIRK_ARM_TTBR1 BIT(5)
  90. #define IO_PGTABLE_QUIRK_ARM_OUTER_WBWA BIT(6)
  91. unsigned long quirks;
  92. unsigned long pgsize_bitmap;
  93. unsigned int ias;
  94. unsigned int oas;
  95. bool coherent_walk;
  96. const struct iommu_flush_ops *tlb;
  97. struct device *iommu_dev;
  98. /* Low-level data specific to the table format */
  99. union {
  100. struct {
  101. u64 ttbr;
  102. struct {
  103. u32 ips:3;
  104. u32 tg:2;
  105. u32 sh:2;
  106. u32 orgn:2;
  107. u32 irgn:2;
  108. u32 tsz:6;
  109. } tcr;
  110. u64 mair;
  111. } arm_lpae_s1_cfg;
  112. struct {
  113. u64 vttbr;
  114. struct {
  115. u32 ps:3;
  116. u32 tg:2;
  117. u32 sh:2;
  118. u32 orgn:2;
  119. u32 irgn:2;
  120. u32 sl:2;
  121. u32 tsz:6;
  122. } vtcr;
  123. } arm_lpae_s2_cfg;
  124. struct {
  125. u32 ttbr;
  126. u32 tcr;
  127. u32 nmrr;
  128. u32 prrr;
  129. } arm_v7s_cfg;
  130. struct {
  131. u64 transtab;
  132. u64 memattr;
  133. } arm_mali_lpae_cfg;
  134. struct {
  135. u64 ttbr[4];
  136. u32 n_ttbrs;
  137. } apple_dart_cfg;
  138. };
  139. };
  140. /**
  141. * struct io_pgtable_ops - Page table manipulation API for IOMMU drivers.
  142. *
  143. * @map: Map a physically contiguous memory region.
  144. * @map_pages: Map a physically contiguous range of pages of the same size.
  145. * @unmap: Unmap a physically contiguous memory region.
  146. * @unmap_pages: Unmap a range of virtually contiguous pages of the same size.
  147. * @iova_to_phys: Translate iova to physical address.
  148. *
  149. * These functions map directly onto the iommu_ops member functions with
  150. * the same names.
  151. */
  152. struct io_pgtable_ops {
  153. int (*map)(struct io_pgtable_ops *ops, unsigned long iova,
  154. phys_addr_t paddr, size_t size, int prot, gfp_t gfp);
  155. int (*map_pages)(struct io_pgtable_ops *ops, unsigned long iova,
  156. phys_addr_t paddr, size_t pgsize, size_t pgcount,
  157. int prot, gfp_t gfp, size_t *mapped);
  158. size_t (*unmap)(struct io_pgtable_ops *ops, unsigned long iova,
  159. size_t size, struct iommu_iotlb_gather *gather);
  160. size_t (*unmap_pages)(struct io_pgtable_ops *ops, unsigned long iova,
  161. size_t pgsize, size_t pgcount,
  162. struct iommu_iotlb_gather *gather);
  163. phys_addr_t (*iova_to_phys)(struct io_pgtable_ops *ops,
  164. unsigned long iova);
  165. };
  166. /**
  167. * alloc_io_pgtable_ops() - Allocate a page table allocator for use by an IOMMU.
  168. *
  169. * @fmt: The page table format.
  170. * @cfg: The page table configuration. This will be modified to represent
  171. * the configuration actually provided by the allocator (e.g. the
  172. * pgsize_bitmap may be restricted).
  173. * @cookie: An opaque token provided by the IOMMU driver and passed back to
  174. * the callback routines in cfg->tlb.
  175. */
  176. struct io_pgtable_ops *alloc_io_pgtable_ops(enum io_pgtable_fmt fmt,
  177. struct io_pgtable_cfg *cfg,
  178. void *cookie);
  179. /**
  180. * free_io_pgtable_ops() - Free an io_pgtable_ops structure. The caller
  181. * *must* ensure that the page table is no longer
  182. * live, but the TLB can be dirty.
  183. *
  184. * @ops: The ops returned from alloc_io_pgtable_ops.
  185. */
  186. void free_io_pgtable_ops(struct io_pgtable_ops *ops);
  187. /*
  188. * Internal structures for page table allocator implementations.
  189. */
  190. /**
  191. * struct io_pgtable - Internal structure describing a set of page tables.
  192. *
  193. * @fmt: The page table format.
  194. * @cookie: An opaque token provided by the IOMMU driver and passed back to
  195. * any callback routines.
  196. * @cfg: A copy of the page table configuration.
  197. * @ops: The page table operations in use for this set of page tables.
  198. */
  199. struct io_pgtable {
  200. enum io_pgtable_fmt fmt;
  201. void *cookie;
  202. struct io_pgtable_cfg cfg;
  203. struct io_pgtable_ops ops;
  204. };
  205. #define io_pgtable_ops_to_pgtable(x) container_of((x), struct io_pgtable, ops)
  206. static inline void io_pgtable_tlb_flush_all(struct io_pgtable *iop)
  207. {
  208. if (iop->cfg.tlb && iop->cfg.tlb->tlb_flush_all)
  209. iop->cfg.tlb->tlb_flush_all(iop->cookie);
  210. }
  211. static inline void
  212. io_pgtable_tlb_flush_walk(struct io_pgtable *iop, unsigned long iova,
  213. size_t size, size_t granule)
  214. {
  215. if (iop->cfg.tlb && iop->cfg.tlb->tlb_flush_walk)
  216. iop->cfg.tlb->tlb_flush_walk(iova, size, granule, iop->cookie);
  217. }
  218. static inline void
  219. io_pgtable_tlb_add_page(struct io_pgtable *iop,
  220. struct iommu_iotlb_gather * gather, unsigned long iova,
  221. size_t granule)
  222. {
  223. if (iop->cfg.tlb && iop->cfg.tlb->tlb_add_page)
  224. iop->cfg.tlb->tlb_add_page(gather, iova, granule, iop->cookie);
  225. }
  226. /**
  227. * struct io_pgtable_init_fns - Alloc/free a set of page tables for a
  228. * particular format.
  229. *
  230. * @alloc: Allocate a set of page tables described by cfg.
  231. * @free: Free the page tables associated with iop.
  232. */
  233. struct io_pgtable_init_fns {
  234. struct io_pgtable *(*alloc)(struct io_pgtable_cfg *cfg, void *cookie);
  235. void (*free)(struct io_pgtable *iop);
  236. };
  237. extern struct io_pgtable_init_fns io_pgtable_arm_32_lpae_s1_init_fns;
  238. extern struct io_pgtable_init_fns io_pgtable_arm_32_lpae_s2_init_fns;
  239. extern struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s1_init_fns;
  240. extern struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s2_init_fns;
  241. extern struct io_pgtable_init_fns io_pgtable_arm_v7s_init_fns;
  242. extern struct io_pgtable_init_fns io_pgtable_arm_mali_lpae_init_fns;
  243. extern struct io_pgtable_init_fns io_pgtable_amd_iommu_v1_init_fns;
  244. extern struct io_pgtable_init_fns io_pgtable_amd_iommu_v2_init_fns;
  245. extern struct io_pgtable_init_fns io_pgtable_apple_dart_init_fns;
  246. #endif /* __IO_PGTABLE_H */