io-pgtable-arm.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * CPU-agnostic ARM page table allocator.
  4. *
  5. * Copyright (C) 2014 ARM Limited
  6. *
  7. * Author: Will Deacon <will.deacon@arm.com>
  8. */
  9. #define pr_fmt(fmt) "arm-lpae io-pgtable: " fmt
  10. #include <linux/atomic.h>
  11. #include <linux/bitops.h>
  12. #include <linux/io-pgtable.h>
  13. #include <linux/sizes.h>
  14. #include <linux/slab.h>
  15. #include <linux/types.h>
  16. #include <linux/dma-mapping.h>
  17. #include <asm/barrier.h>
  18. #include "io-pgtable-arm.h"
  19. #include "iommu-pages.h"
  20. #define ARM_LPAE_MAX_ADDR_BITS 52
  21. #define ARM_LPAE_S2_MAX_CONCAT_PAGES 16
  22. #define ARM_LPAE_MAX_LEVELS 4
  23. /* Struct accessors */
  24. #define io_pgtable_to_data(x) \
  25. container_of((x), struct arm_lpae_io_pgtable, iop)
  26. #define io_pgtable_ops_to_data(x) \
  27. io_pgtable_to_data(io_pgtable_ops_to_pgtable(x))
  28. /*
  29. * Calculate the right shift amount to get to the portion describing level l
  30. * in a virtual address mapped by the pagetable in d.
  31. */
  32. #define ARM_LPAE_LVL_SHIFT(l,d) \
  33. (((ARM_LPAE_MAX_LEVELS - (l)) * (d)->bits_per_level) + \
  34. ilog2(sizeof(arm_lpae_iopte)))
  35. #define ARM_LPAE_GRANULE(d) \
  36. (sizeof(arm_lpae_iopte) << (d)->bits_per_level)
  37. #define ARM_LPAE_PGD_SIZE(d) \
  38. (sizeof(arm_lpae_iopte) << (d)->pgd_bits)
  39. #define ARM_LPAE_PTES_PER_TABLE(d) \
  40. (ARM_LPAE_GRANULE(d) >> ilog2(sizeof(arm_lpae_iopte)))
  41. /*
  42. * Calculate the index at level l used to map virtual address a using the
  43. * pagetable in d.
  44. */
  45. #define ARM_LPAE_PGD_IDX(l,d) \
  46. ((l) == (d)->start_level ? (d)->pgd_bits - (d)->bits_per_level : 0)
  47. #define ARM_LPAE_LVL_IDX(a,l,d) \
  48. (((u64)(a) >> ARM_LPAE_LVL_SHIFT(l,d)) & \
  49. ((1 << ((d)->bits_per_level + ARM_LPAE_PGD_IDX(l,d))) - 1))
  50. /* Calculate the block/page mapping size at level l for pagetable in d. */
  51. #define ARM_LPAE_BLOCK_SIZE(l,d) (1ULL << ARM_LPAE_LVL_SHIFT(l,d))
  52. /* Page table bits */
  53. #define ARM_LPAE_PTE_TYPE_SHIFT 0
  54. #define ARM_LPAE_PTE_TYPE_MASK 0x3
  55. #define ARM_LPAE_PTE_TYPE_BLOCK 1
  56. #define ARM_LPAE_PTE_TYPE_TABLE 3
  57. #define ARM_LPAE_PTE_TYPE_PAGE 3
  58. #define ARM_LPAE_PTE_ADDR_MASK GENMASK_ULL(47,12)
  59. #define ARM_LPAE_PTE_NSTABLE (((arm_lpae_iopte)1) << 63)
  60. #define ARM_LPAE_PTE_XN (((arm_lpae_iopte)3) << 53)
  61. #define ARM_LPAE_PTE_DBM (((arm_lpae_iopte)1) << 51)
  62. #define ARM_LPAE_PTE_AF (((arm_lpae_iopte)1) << 10)
  63. #define ARM_LPAE_PTE_SH_NS (((arm_lpae_iopte)0) << 8)
  64. #define ARM_LPAE_PTE_SH_OS (((arm_lpae_iopte)2) << 8)
  65. #define ARM_LPAE_PTE_SH_IS (((arm_lpae_iopte)3) << 8)
  66. #define ARM_LPAE_PTE_NS (((arm_lpae_iopte)1) << 5)
  67. #define ARM_LPAE_PTE_VALID (((arm_lpae_iopte)1) << 0)
  68. /* Software bit for solving coherency races */
  69. #define ARM_LPAE_PTE_SW_SYNC (((arm_lpae_iopte)1) << 55)
  70. /* Stage-1 PTE */
  71. #define ARM_LPAE_PTE_AP_UNPRIV (((arm_lpae_iopte)1) << 6)
  72. #define ARM_LPAE_PTE_AP_RDONLY_BIT 7
  73. #define ARM_LPAE_PTE_AP_RDONLY (((arm_lpae_iopte)1) << \
  74. ARM_LPAE_PTE_AP_RDONLY_BIT)
  75. #define ARM_LPAE_PTE_AP_WR_CLEAN_MASK (ARM_LPAE_PTE_AP_RDONLY | \
  76. ARM_LPAE_PTE_DBM)
  77. #define ARM_LPAE_PTE_ATTRINDX_SHIFT 2
  78. #define ARM_LPAE_PTE_nG (((arm_lpae_iopte)1) << 11)
  79. /* Stage-2 PTE */
  80. #define ARM_LPAE_PTE_HAP_FAULT (((arm_lpae_iopte)0) << 6)
  81. #define ARM_LPAE_PTE_HAP_READ (((arm_lpae_iopte)1) << 6)
  82. #define ARM_LPAE_PTE_HAP_WRITE (((arm_lpae_iopte)2) << 6)
  83. /*
  84. * For !FWB these code to:
  85. * 1111 = Normal outer write back cachable / Inner Write Back Cachable
  86. * Permit S1 to override
  87. * 0101 = Normal Non-cachable / Inner Non-cachable
  88. * 0001 = Device / Device-nGnRE
  89. * For S2FWB these code:
  90. * 0110 Force Normal Write Back
  91. * 0101 Normal* is forced Normal-NC, Device unchanged
  92. * 0001 Force Device-nGnRE
  93. */
  94. #define ARM_LPAE_PTE_MEMATTR_FWB_WB (((arm_lpae_iopte)0x6) << 2)
  95. #define ARM_LPAE_PTE_MEMATTR_OIWB (((arm_lpae_iopte)0xf) << 2)
  96. #define ARM_LPAE_PTE_MEMATTR_NC (((arm_lpae_iopte)0x5) << 2)
  97. #define ARM_LPAE_PTE_MEMATTR_DEV (((arm_lpae_iopte)0x1) << 2)
  98. /* Register bits */
  99. #define ARM_LPAE_VTCR_SL0_MASK 0x3
  100. #define ARM_LPAE_TCR_T0SZ_SHIFT 0
  101. #define ARM_LPAE_VTCR_PS_SHIFT 16
  102. #define ARM_LPAE_VTCR_PS_MASK 0x7
  103. #define ARM_LPAE_MAIR_ATTR_SHIFT(n) ((n) << 3)
  104. #define ARM_LPAE_MAIR_ATTR_MASK 0xff
  105. #define ARM_LPAE_MAIR_ATTR_DEVICE 0x04
  106. #define ARM_LPAE_MAIR_ATTR_NC 0x44
  107. #define ARM_LPAE_MAIR_ATTR_INC_OWBRWA 0xf4
  108. #define ARM_LPAE_MAIR_ATTR_WBRWA 0xff
  109. #define ARM_LPAE_MAIR_ATTR_IDX_NC 0
  110. #define ARM_LPAE_MAIR_ATTR_IDX_CACHE 1
  111. #define ARM_LPAE_MAIR_ATTR_IDX_DEV 2
  112. #define ARM_LPAE_MAIR_ATTR_IDX_INC_OCACHE 3
  113. #define ARM_MALI_LPAE_TTBR_ADRMODE_TABLE (3u << 0)
  114. #define ARM_MALI_LPAE_TTBR_READ_INNER BIT(2)
  115. #define ARM_MALI_LPAE_TTBR_SHARE_OUTER BIT(4)
  116. #define ARM_MALI_LPAE_MEMATTR_IMP_DEF 0x88ULL
  117. #define ARM_MALI_LPAE_MEMATTR_WRITE_ALLOC 0x8DULL
  118. /* IOPTE accessors */
  119. #define iopte_deref(pte,d) __va(iopte_to_paddr(pte, d))
  120. #define iopte_type(pte) \
  121. (((pte) >> ARM_LPAE_PTE_TYPE_SHIFT) & ARM_LPAE_PTE_TYPE_MASK)
  122. #define iopte_writeable_dirty(pte) \
  123. (((pte) & ARM_LPAE_PTE_AP_WR_CLEAN_MASK) == ARM_LPAE_PTE_DBM)
  124. #define iopte_set_writeable_clean(ptep) \
  125. set_bit(ARM_LPAE_PTE_AP_RDONLY_BIT, (unsigned long *)(ptep))
  126. struct arm_lpae_io_pgtable {
  127. struct io_pgtable iop;
  128. int pgd_bits;
  129. int start_level;
  130. int bits_per_level;
  131. void *pgd;
  132. };
  133. typedef u64 arm_lpae_iopte;
  134. static inline bool iopte_leaf(arm_lpae_iopte pte, int lvl,
  135. enum io_pgtable_fmt fmt)
  136. {
  137. if (lvl == (ARM_LPAE_MAX_LEVELS - 1) && fmt != ARM_MALI_LPAE)
  138. return iopte_type(pte) == ARM_LPAE_PTE_TYPE_PAGE;
  139. return iopte_type(pte) == ARM_LPAE_PTE_TYPE_BLOCK;
  140. }
  141. static inline bool iopte_table(arm_lpae_iopte pte, int lvl)
  142. {
  143. if (lvl == (ARM_LPAE_MAX_LEVELS - 1))
  144. return false;
  145. return iopte_type(pte) == ARM_LPAE_PTE_TYPE_TABLE;
  146. }
  147. static arm_lpae_iopte paddr_to_iopte(phys_addr_t paddr,
  148. struct arm_lpae_io_pgtable *data)
  149. {
  150. arm_lpae_iopte pte = paddr;
  151. /* Of the bits which overlap, either 51:48 or 15:12 are always RES0 */
  152. return (pte | (pte >> (48 - 12))) & ARM_LPAE_PTE_ADDR_MASK;
  153. }
  154. static phys_addr_t iopte_to_paddr(arm_lpae_iopte pte,
  155. struct arm_lpae_io_pgtable *data)
  156. {
  157. u64 paddr = pte & ARM_LPAE_PTE_ADDR_MASK;
  158. if (ARM_LPAE_GRANULE(data) < SZ_64K)
  159. return paddr;
  160. /* Rotate the packed high-order bits back to the top */
  161. return (paddr | (paddr << (48 - 12))) & (ARM_LPAE_PTE_ADDR_MASK << 4);
  162. }
  163. /*
  164. * Convert an index returned by ARM_LPAE_PGD_IDX(), which can point into
  165. * a concatenated PGD, into the maximum number of entries that can be
  166. * mapped in the same table page.
  167. */
  168. static inline int arm_lpae_max_entries(int i, struct arm_lpae_io_pgtable *data)
  169. {
  170. int ptes_per_table = ARM_LPAE_PTES_PER_TABLE(data);
  171. return ptes_per_table - (i & (ptes_per_table - 1));
  172. }
  173. /*
  174. * Check if concatenated PGDs are mandatory according to Arm DDI0487 (K.a)
  175. * 1) R_DXBSH: For 16KB, and 48-bit input size, use level 1 instead of 0.
  176. * 2) R_SRKBC: After de-ciphering the table for PA size and valid initial lookup
  177. * a) 40 bits PA size with 4K: use level 1 instead of level 0 (2 tables for ias = oas)
  178. * b) 40 bits PA size with 16K: use level 2 instead of level 1 (16 tables for ias = oas)
  179. * c) 42 bits PA size with 4K: use level 1 instead of level 0 (8 tables for ias = oas)
  180. * d) 48 bits PA size with 16K: use level 1 instead of level 0 (2 tables for ias = oas)
  181. */
  182. static inline bool arm_lpae_concat_mandatory(struct io_pgtable_cfg *cfg,
  183. struct arm_lpae_io_pgtable *data)
  184. {
  185. unsigned int ias = cfg->ias;
  186. unsigned int oas = cfg->oas;
  187. /* Covers 1 and 2.d */
  188. if ((ARM_LPAE_GRANULE(data) == SZ_16K) && (data->start_level == 0))
  189. return (oas == 48) || (ias == 48);
  190. /* Covers 2.a and 2.c */
  191. if ((ARM_LPAE_GRANULE(data) == SZ_4K) && (data->start_level == 0))
  192. return (oas == 40) || (oas == 42);
  193. /* Case 2.b */
  194. return (ARM_LPAE_GRANULE(data) == SZ_16K) &&
  195. (data->start_level == 1) && (oas == 40);
  196. }
  197. static dma_addr_t __arm_lpae_dma_addr(void *pages)
  198. {
  199. return (dma_addr_t)virt_to_phys(pages);
  200. }
  201. static void *__arm_lpae_alloc_pages(size_t size, gfp_t gfp,
  202. struct io_pgtable_cfg *cfg,
  203. void *cookie)
  204. {
  205. struct device *dev = cfg->iommu_dev;
  206. size_t alloc_size;
  207. dma_addr_t dma;
  208. void *pages;
  209. /*
  210. * For very small starting-level translation tables the HW requires a
  211. * minimum alignment of at least 64 to cover all cases.
  212. */
  213. alloc_size = max(size, 64);
  214. if (cfg->alloc)
  215. pages = cfg->alloc(cookie, alloc_size, gfp);
  216. else
  217. pages = iommu_alloc_pages_node_sz(dev_to_node(dev), gfp,
  218. alloc_size);
  219. if (!pages)
  220. return NULL;
  221. if (!cfg->coherent_walk) {
  222. dma = dma_map_single(dev, pages, size, DMA_TO_DEVICE);
  223. if (dma_mapping_error(dev, dma))
  224. goto out_free;
  225. /*
  226. * We depend on the IOMMU being able to work with any physical
  227. * address directly, so if the DMA layer suggests otherwise by
  228. * translating or truncating them, that bodes very badly...
  229. */
  230. if (dma != virt_to_phys(pages))
  231. goto out_unmap;
  232. }
  233. return pages;
  234. out_unmap:
  235. dev_err(dev, "Cannot accommodate DMA translation for IOMMU page tables\n");
  236. dma_unmap_single(dev, dma, size, DMA_TO_DEVICE);
  237. out_free:
  238. if (cfg->free)
  239. cfg->free(cookie, pages, size);
  240. else
  241. iommu_free_pages(pages);
  242. return NULL;
  243. }
  244. static void __arm_lpae_free_pages(void *pages, size_t size,
  245. struct io_pgtable_cfg *cfg,
  246. void *cookie)
  247. {
  248. if (!cfg->coherent_walk)
  249. dma_unmap_single(cfg->iommu_dev, __arm_lpae_dma_addr(pages),
  250. size, DMA_TO_DEVICE);
  251. if (cfg->free)
  252. cfg->free(cookie, pages, size);
  253. else
  254. iommu_free_pages(pages);
  255. }
  256. static void __arm_lpae_sync_pte(arm_lpae_iopte *ptep, int num_entries,
  257. struct io_pgtable_cfg *cfg)
  258. {
  259. dma_sync_single_for_device(cfg->iommu_dev, __arm_lpae_dma_addr(ptep),
  260. sizeof(*ptep) * num_entries, DMA_TO_DEVICE);
  261. }
  262. static void __arm_lpae_clear_pte(arm_lpae_iopte *ptep, struct io_pgtable_cfg *cfg, int num_entries)
  263. {
  264. for (int i = 0; i < num_entries; i++)
  265. ptep[i] = 0;
  266. if (!cfg->coherent_walk && num_entries)
  267. __arm_lpae_sync_pte(ptep, num_entries, cfg);
  268. }
  269. static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data,
  270. struct iommu_iotlb_gather *gather,
  271. unsigned long iova, size_t size, size_t pgcount,
  272. int lvl, arm_lpae_iopte *ptep);
  273. static void __arm_lpae_init_pte(struct arm_lpae_io_pgtable *data,
  274. phys_addr_t paddr, arm_lpae_iopte prot,
  275. int lvl, int num_entries, arm_lpae_iopte *ptep)
  276. {
  277. arm_lpae_iopte pte = prot;
  278. struct io_pgtable_cfg *cfg = &data->iop.cfg;
  279. size_t sz = ARM_LPAE_BLOCK_SIZE(lvl, data);
  280. int i;
  281. if (data->iop.fmt != ARM_MALI_LPAE && lvl == ARM_LPAE_MAX_LEVELS - 1)
  282. pte |= ARM_LPAE_PTE_TYPE_PAGE;
  283. else
  284. pte |= ARM_LPAE_PTE_TYPE_BLOCK;
  285. for (i = 0; i < num_entries; i++)
  286. ptep[i] = pte | paddr_to_iopte(paddr + i * sz, data);
  287. if (!cfg->coherent_walk)
  288. __arm_lpae_sync_pte(ptep, num_entries, cfg);
  289. }
  290. static int arm_lpae_init_pte(struct arm_lpae_io_pgtable *data,
  291. unsigned long iova, phys_addr_t paddr,
  292. arm_lpae_iopte prot, int lvl, int num_entries,
  293. arm_lpae_iopte *ptep)
  294. {
  295. int i;
  296. for (i = 0; i < num_entries; i++)
  297. if (iopte_leaf(ptep[i], lvl, data->iop.fmt)) {
  298. /* We require an unmap first */
  299. WARN_ON(!(data->iop.cfg.quirks & IO_PGTABLE_QUIRK_NO_WARN));
  300. return -EEXIST;
  301. } else if (iopte_type(ptep[i]) == ARM_LPAE_PTE_TYPE_TABLE) {
  302. /*
  303. * We need to unmap and free the old table before
  304. * overwriting it with a block entry.
  305. */
  306. arm_lpae_iopte *tblp;
  307. size_t sz = ARM_LPAE_BLOCK_SIZE(lvl, data);
  308. tblp = ptep - ARM_LPAE_LVL_IDX(iova, lvl, data);
  309. if (__arm_lpae_unmap(data, NULL, iova + i * sz, sz, 1,
  310. lvl, tblp) != sz) {
  311. WARN_ON(1);
  312. return -EINVAL;
  313. }
  314. }
  315. __arm_lpae_init_pte(data, paddr, prot, lvl, num_entries, ptep);
  316. return 0;
  317. }
  318. static arm_lpae_iopte arm_lpae_install_table(arm_lpae_iopte *table,
  319. arm_lpae_iopte *ptep,
  320. arm_lpae_iopte curr,
  321. struct arm_lpae_io_pgtable *data)
  322. {
  323. arm_lpae_iopte old, new;
  324. struct io_pgtable_cfg *cfg = &data->iop.cfg;
  325. new = paddr_to_iopte(__pa(table), data) | ARM_LPAE_PTE_TYPE_TABLE;
  326. if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_NS)
  327. new |= ARM_LPAE_PTE_NSTABLE;
  328. /*
  329. * Ensure the table itself is visible before its PTE can be.
  330. * Whilst we could get away with cmpxchg64_release below, this
  331. * doesn't have any ordering semantics when !CONFIG_SMP.
  332. */
  333. dma_wmb();
  334. old = cmpxchg64_relaxed(ptep, curr, new);
  335. if (cfg->coherent_walk || (old & ARM_LPAE_PTE_SW_SYNC))
  336. return old;
  337. /* Even if it's not ours, there's no point waiting; just kick it */
  338. __arm_lpae_sync_pte(ptep, 1, cfg);
  339. if (old == curr)
  340. WRITE_ONCE(*ptep, new | ARM_LPAE_PTE_SW_SYNC);
  341. return old;
  342. }
  343. static int __arm_lpae_map(struct arm_lpae_io_pgtable *data, unsigned long iova,
  344. phys_addr_t paddr, size_t size, size_t pgcount,
  345. arm_lpae_iopte prot, int lvl, arm_lpae_iopte *ptep,
  346. gfp_t gfp, size_t *mapped)
  347. {
  348. arm_lpae_iopte *cptep, pte;
  349. size_t block_size = ARM_LPAE_BLOCK_SIZE(lvl, data);
  350. size_t tblsz = ARM_LPAE_GRANULE(data);
  351. struct io_pgtable_cfg *cfg = &data->iop.cfg;
  352. int ret = 0, num_entries, max_entries, map_idx_start;
  353. /* Find our entry at the current level */
  354. map_idx_start = ARM_LPAE_LVL_IDX(iova, lvl, data);
  355. ptep += map_idx_start;
  356. /* If we can install a leaf entry at this level, then do so */
  357. if (size == block_size) {
  358. max_entries = arm_lpae_max_entries(map_idx_start, data);
  359. num_entries = min_t(int, pgcount, max_entries);
  360. ret = arm_lpae_init_pte(data, iova, paddr, prot, lvl, num_entries, ptep);
  361. if (!ret)
  362. *mapped += num_entries * size;
  363. return ret;
  364. }
  365. /* We can't allocate tables at the final level */
  366. if (WARN_ON(lvl >= ARM_LPAE_MAX_LEVELS - 1))
  367. return -EINVAL;
  368. /* Grab a pointer to the next level */
  369. pte = READ_ONCE(*ptep);
  370. if (!pte) {
  371. cptep = __arm_lpae_alloc_pages(tblsz, gfp, cfg, data->iop.cookie);
  372. if (!cptep)
  373. return -ENOMEM;
  374. pte = arm_lpae_install_table(cptep, ptep, 0, data);
  375. if (pte)
  376. __arm_lpae_free_pages(cptep, tblsz, cfg, data->iop.cookie);
  377. } else if (!cfg->coherent_walk && !(pte & ARM_LPAE_PTE_SW_SYNC)) {
  378. __arm_lpae_sync_pte(ptep, 1, cfg);
  379. }
  380. if (pte && !iopte_leaf(pte, lvl, data->iop.fmt)) {
  381. cptep = iopte_deref(pte, data);
  382. } else if (pte) {
  383. /* We require an unmap first */
  384. WARN_ON(!(cfg->quirks & IO_PGTABLE_QUIRK_NO_WARN));
  385. return -EEXIST;
  386. }
  387. /* Rinse, repeat */
  388. return __arm_lpae_map(data, iova, paddr, size, pgcount, prot, lvl + 1,
  389. cptep, gfp, mapped);
  390. }
  391. static arm_lpae_iopte arm_lpae_prot_to_pte(struct arm_lpae_io_pgtable *data,
  392. int prot)
  393. {
  394. arm_lpae_iopte pte;
  395. if (data->iop.fmt == ARM_64_LPAE_S1 ||
  396. data->iop.fmt == ARM_32_LPAE_S1) {
  397. pte = ARM_LPAE_PTE_nG;
  398. if (!(prot & IOMMU_WRITE) && (prot & IOMMU_READ))
  399. pte |= ARM_LPAE_PTE_AP_RDONLY;
  400. else if (data->iop.cfg.quirks & IO_PGTABLE_QUIRK_ARM_HD)
  401. pte |= ARM_LPAE_PTE_DBM;
  402. if (!(prot & IOMMU_PRIV))
  403. pte |= ARM_LPAE_PTE_AP_UNPRIV;
  404. } else {
  405. pte = ARM_LPAE_PTE_HAP_FAULT;
  406. if (prot & IOMMU_READ)
  407. pte |= ARM_LPAE_PTE_HAP_READ;
  408. if (prot & IOMMU_WRITE)
  409. pte |= ARM_LPAE_PTE_HAP_WRITE;
  410. }
  411. /*
  412. * Note that this logic is structured to accommodate Mali LPAE
  413. * having stage-1-like attributes but stage-2-like permissions.
  414. */
  415. if (data->iop.fmt == ARM_64_LPAE_S2 ||
  416. data->iop.fmt == ARM_32_LPAE_S2) {
  417. if (prot & IOMMU_MMIO) {
  418. pte |= ARM_LPAE_PTE_MEMATTR_DEV;
  419. } else if (prot & IOMMU_CACHE) {
  420. if (data->iop.cfg.quirks & IO_PGTABLE_QUIRK_ARM_S2FWB)
  421. pte |= ARM_LPAE_PTE_MEMATTR_FWB_WB;
  422. else
  423. pte |= ARM_LPAE_PTE_MEMATTR_OIWB;
  424. } else {
  425. pte |= ARM_LPAE_PTE_MEMATTR_NC;
  426. }
  427. } else {
  428. if (prot & IOMMU_MMIO)
  429. pte |= (ARM_LPAE_MAIR_ATTR_IDX_DEV
  430. << ARM_LPAE_PTE_ATTRINDX_SHIFT);
  431. else if (prot & IOMMU_CACHE)
  432. pte |= (ARM_LPAE_MAIR_ATTR_IDX_CACHE
  433. << ARM_LPAE_PTE_ATTRINDX_SHIFT);
  434. }
  435. /*
  436. * Also Mali has its own notions of shareability wherein its Inner
  437. * domain covers the cores within the GPU, and its Outer domain is
  438. * "outside the GPU" (i.e. either the Inner or System domain in CPU
  439. * terms, depending on coherency).
  440. */
  441. if (prot & IOMMU_CACHE && data->iop.fmt != ARM_MALI_LPAE)
  442. pte |= ARM_LPAE_PTE_SH_IS;
  443. else
  444. pte |= ARM_LPAE_PTE_SH_OS;
  445. if (prot & IOMMU_NOEXEC)
  446. pte |= ARM_LPAE_PTE_XN;
  447. if (data->iop.cfg.quirks & IO_PGTABLE_QUIRK_ARM_NS)
  448. pte |= ARM_LPAE_PTE_NS;
  449. if (data->iop.fmt != ARM_MALI_LPAE)
  450. pte |= ARM_LPAE_PTE_AF;
  451. return pte;
  452. }
  453. static int arm_lpae_map_pages(struct io_pgtable_ops *ops, unsigned long iova,
  454. phys_addr_t paddr, size_t pgsize, size_t pgcount,
  455. int iommu_prot, gfp_t gfp, size_t *mapped)
  456. {
  457. struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
  458. struct io_pgtable_cfg *cfg = &data->iop.cfg;
  459. arm_lpae_iopte *ptep = data->pgd;
  460. int ret, lvl = data->start_level;
  461. arm_lpae_iopte prot;
  462. long iaext = (s64)iova >> cfg->ias;
  463. if (WARN_ON(!pgsize || (pgsize & cfg->pgsize_bitmap) != pgsize))
  464. return -EINVAL;
  465. if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_TTBR1)
  466. iaext = ~iaext;
  467. if (WARN_ON(iaext || paddr >> cfg->oas))
  468. return -ERANGE;
  469. if (!(iommu_prot & (IOMMU_READ | IOMMU_WRITE)))
  470. return -EINVAL;
  471. prot = arm_lpae_prot_to_pte(data, iommu_prot);
  472. ret = __arm_lpae_map(data, iova, paddr, pgsize, pgcount, prot, lvl,
  473. ptep, gfp, mapped);
  474. /*
  475. * Synchronise all PTE updates for the new mapping before there's
  476. * a chance for anything to kick off a table walk for the new iova.
  477. */
  478. wmb();
  479. return ret;
  480. }
  481. static void __arm_lpae_free_pgtable(struct arm_lpae_io_pgtable *data, int lvl,
  482. arm_lpae_iopte *ptep)
  483. {
  484. arm_lpae_iopte *start, *end;
  485. unsigned long table_size;
  486. if (lvl == data->start_level)
  487. table_size = ARM_LPAE_PGD_SIZE(data);
  488. else
  489. table_size = ARM_LPAE_GRANULE(data);
  490. start = ptep;
  491. /* Only leaf entries at the last level */
  492. if (lvl == ARM_LPAE_MAX_LEVELS - 1)
  493. end = ptep;
  494. else
  495. end = (void *)ptep + table_size;
  496. while (ptep != end) {
  497. arm_lpae_iopte pte = *ptep++;
  498. if (!pte || iopte_leaf(pte, lvl, data->iop.fmt))
  499. continue;
  500. __arm_lpae_free_pgtable(data, lvl + 1, iopte_deref(pte, data));
  501. }
  502. __arm_lpae_free_pages(start, table_size, &data->iop.cfg, data->iop.cookie);
  503. }
  504. static void arm_lpae_free_pgtable(struct io_pgtable *iop)
  505. {
  506. struct arm_lpae_io_pgtable *data = io_pgtable_to_data(iop);
  507. __arm_lpae_free_pgtable(data, data->start_level, data->pgd);
  508. kfree(data);
  509. }
  510. static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data,
  511. struct iommu_iotlb_gather *gather,
  512. unsigned long iova, size_t size, size_t pgcount,
  513. int lvl, arm_lpae_iopte *ptep)
  514. {
  515. arm_lpae_iopte pte;
  516. struct io_pgtable *iop = &data->iop;
  517. int i = 0, num_entries, max_entries, unmap_idx_start;
  518. /* Something went horribly wrong and we ran out of page table */
  519. if (WARN_ON(lvl == ARM_LPAE_MAX_LEVELS))
  520. return 0;
  521. unmap_idx_start = ARM_LPAE_LVL_IDX(iova, lvl, data);
  522. ptep += unmap_idx_start;
  523. pte = READ_ONCE(*ptep);
  524. if (!pte) {
  525. WARN_ON(!(data->iop.cfg.quirks & IO_PGTABLE_QUIRK_NO_WARN));
  526. return 0;
  527. }
  528. /* If the size matches this level, we're in the right place */
  529. if (size == ARM_LPAE_BLOCK_SIZE(lvl, data)) {
  530. max_entries = arm_lpae_max_entries(unmap_idx_start, data);
  531. num_entries = min_t(int, pgcount, max_entries);
  532. /* Find and handle non-leaf entries */
  533. for (i = 0; i < num_entries; i++) {
  534. pte = READ_ONCE(ptep[i]);
  535. if (!pte) {
  536. WARN_ON(!(data->iop.cfg.quirks & IO_PGTABLE_QUIRK_NO_WARN));
  537. break;
  538. }
  539. if (!iopte_leaf(pte, lvl, iop->fmt)) {
  540. __arm_lpae_clear_pte(&ptep[i], &iop->cfg, 1);
  541. /* Also flush any partial walks */
  542. io_pgtable_tlb_flush_walk(iop, iova + i * size, size,
  543. ARM_LPAE_GRANULE(data));
  544. __arm_lpae_free_pgtable(data, lvl + 1, iopte_deref(pte, data));
  545. }
  546. }
  547. /* Clear the remaining entries */
  548. __arm_lpae_clear_pte(ptep, &iop->cfg, i);
  549. if (gather && !iommu_iotlb_gather_queued(gather))
  550. for (int j = 0; j < i; j++)
  551. io_pgtable_tlb_add_page(iop, gather, iova + j * size, size);
  552. return i * size;
  553. } else if (iopte_leaf(pte, lvl, iop->fmt)) {
  554. WARN_ONCE(true, "Unmap of a partial large IOPTE is not allowed");
  555. return 0;
  556. }
  557. /* Keep on walkin' */
  558. ptep = iopte_deref(pte, data);
  559. return __arm_lpae_unmap(data, gather, iova, size, pgcount, lvl + 1, ptep);
  560. }
  561. static size_t arm_lpae_unmap_pages(struct io_pgtable_ops *ops, unsigned long iova,
  562. size_t pgsize, size_t pgcount,
  563. struct iommu_iotlb_gather *gather)
  564. {
  565. struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
  566. struct io_pgtable_cfg *cfg = &data->iop.cfg;
  567. arm_lpae_iopte *ptep = data->pgd;
  568. long iaext = (s64)iova >> cfg->ias;
  569. if (WARN_ON(!pgsize || (pgsize & cfg->pgsize_bitmap) != pgsize || !pgcount))
  570. return 0;
  571. if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_TTBR1)
  572. iaext = ~iaext;
  573. if (WARN_ON(iaext))
  574. return 0;
  575. return __arm_lpae_unmap(data, gather, iova, pgsize, pgcount,
  576. data->start_level, ptep);
  577. }
  578. struct io_pgtable_walk_data {
  579. struct io_pgtable *iop;
  580. void *data;
  581. int (*visit)(struct io_pgtable_walk_data *walk_data, int lvl,
  582. arm_lpae_iopte *ptep, size_t size);
  583. unsigned long flags;
  584. u64 addr;
  585. const u64 end;
  586. };
  587. static int __arm_lpae_iopte_walk(struct arm_lpae_io_pgtable *data,
  588. struct io_pgtable_walk_data *walk_data,
  589. arm_lpae_iopte *ptep,
  590. int lvl);
  591. struct iova_to_phys_data {
  592. arm_lpae_iopte pte;
  593. int lvl;
  594. };
  595. static int visit_iova_to_phys(struct io_pgtable_walk_data *walk_data, int lvl,
  596. arm_lpae_iopte *ptep, size_t size)
  597. {
  598. struct iova_to_phys_data *data = walk_data->data;
  599. data->pte = *ptep;
  600. data->lvl = lvl;
  601. return 0;
  602. }
  603. static phys_addr_t arm_lpae_iova_to_phys(struct io_pgtable_ops *ops,
  604. unsigned long iova)
  605. {
  606. struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
  607. struct iova_to_phys_data d;
  608. struct io_pgtable_walk_data walk_data = {
  609. .data = &d,
  610. .visit = visit_iova_to_phys,
  611. .addr = iova,
  612. .end = iova + 1,
  613. };
  614. int ret;
  615. ret = __arm_lpae_iopte_walk(data, &walk_data, data->pgd, data->start_level);
  616. if (ret)
  617. return 0;
  618. iova &= (ARM_LPAE_BLOCK_SIZE(d.lvl, data) - 1);
  619. return iopte_to_paddr(d.pte, data) | iova;
  620. }
  621. static int visit_pgtable_walk(struct io_pgtable_walk_data *walk_data, int lvl,
  622. arm_lpae_iopte *ptep, size_t size)
  623. {
  624. struct arm_lpae_io_pgtable_walk_data *data = walk_data->data;
  625. data->ptes[lvl] = *ptep;
  626. return 0;
  627. }
  628. static int arm_lpae_pgtable_walk(struct io_pgtable_ops *ops, unsigned long iova,
  629. void *wd)
  630. {
  631. struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
  632. struct io_pgtable_walk_data walk_data = {
  633. .data = wd,
  634. .visit = visit_pgtable_walk,
  635. .addr = iova,
  636. .end = iova + 1,
  637. };
  638. return __arm_lpae_iopte_walk(data, &walk_data, data->pgd, data->start_level);
  639. }
  640. static int io_pgtable_visit(struct arm_lpae_io_pgtable *data,
  641. struct io_pgtable_walk_data *walk_data,
  642. arm_lpae_iopte *ptep, int lvl)
  643. {
  644. struct io_pgtable *iop = &data->iop;
  645. arm_lpae_iopte pte = READ_ONCE(*ptep);
  646. size_t size = ARM_LPAE_BLOCK_SIZE(lvl, data);
  647. int ret = walk_data->visit(walk_data, lvl, ptep, size);
  648. if (ret)
  649. return ret;
  650. if (iopte_leaf(pte, lvl, iop->fmt)) {
  651. walk_data->addr += size;
  652. return 0;
  653. }
  654. if (!iopte_table(pte, lvl)) {
  655. return -EINVAL;
  656. }
  657. ptep = iopte_deref(pte, data);
  658. return __arm_lpae_iopte_walk(data, walk_data, ptep, lvl + 1);
  659. }
  660. static int __arm_lpae_iopte_walk(struct arm_lpae_io_pgtable *data,
  661. struct io_pgtable_walk_data *walk_data,
  662. arm_lpae_iopte *ptep,
  663. int lvl)
  664. {
  665. u32 idx;
  666. int max_entries, ret;
  667. if (WARN_ON(lvl == ARM_LPAE_MAX_LEVELS))
  668. return -EINVAL;
  669. if (lvl == data->start_level)
  670. max_entries = ARM_LPAE_PGD_SIZE(data) / sizeof(arm_lpae_iopte);
  671. else
  672. max_entries = ARM_LPAE_PTES_PER_TABLE(data);
  673. for (idx = ARM_LPAE_LVL_IDX(walk_data->addr, lvl, data);
  674. (idx < max_entries) && (walk_data->addr < walk_data->end); ++idx) {
  675. ret = io_pgtable_visit(data, walk_data, ptep + idx, lvl);
  676. if (ret)
  677. return ret;
  678. }
  679. return 0;
  680. }
  681. static int visit_dirty(struct io_pgtable_walk_data *walk_data, int lvl,
  682. arm_lpae_iopte *ptep, size_t size)
  683. {
  684. struct iommu_dirty_bitmap *dirty = walk_data->data;
  685. if (!iopte_leaf(*ptep, lvl, walk_data->iop->fmt))
  686. return 0;
  687. if (iopte_writeable_dirty(*ptep)) {
  688. iommu_dirty_bitmap_record(dirty, walk_data->addr, size);
  689. if (!(walk_data->flags & IOMMU_DIRTY_NO_CLEAR))
  690. iopte_set_writeable_clean(ptep);
  691. }
  692. return 0;
  693. }
  694. static int arm_lpae_read_and_clear_dirty(struct io_pgtable_ops *ops,
  695. unsigned long iova, size_t size,
  696. unsigned long flags,
  697. struct iommu_dirty_bitmap *dirty)
  698. {
  699. struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
  700. struct io_pgtable_cfg *cfg = &data->iop.cfg;
  701. struct io_pgtable_walk_data walk_data = {
  702. .iop = &data->iop,
  703. .data = dirty,
  704. .visit = visit_dirty,
  705. .flags = flags,
  706. .addr = iova,
  707. .end = iova + size,
  708. };
  709. arm_lpae_iopte *ptep = data->pgd;
  710. int lvl = data->start_level;
  711. if (WARN_ON(!size))
  712. return -EINVAL;
  713. if (WARN_ON((iova + size - 1) & ~(BIT(cfg->ias) - 1)))
  714. return -EINVAL;
  715. if (data->iop.fmt != ARM_64_LPAE_S1)
  716. return -EINVAL;
  717. return __arm_lpae_iopte_walk(data, &walk_data, ptep, lvl);
  718. }
  719. static void arm_lpae_restrict_pgsizes(struct io_pgtable_cfg *cfg)
  720. {
  721. unsigned long granule, page_sizes;
  722. unsigned int max_addr_bits = 48;
  723. /*
  724. * We need to restrict the supported page sizes to match the
  725. * translation regime for a particular granule. Aim to match
  726. * the CPU page size if possible, otherwise prefer smaller sizes.
  727. * While we're at it, restrict the block sizes to match the
  728. * chosen granule.
  729. */
  730. if (cfg->pgsize_bitmap & PAGE_SIZE)
  731. granule = PAGE_SIZE;
  732. else if (cfg->pgsize_bitmap & ~PAGE_MASK)
  733. granule = 1UL << __fls(cfg->pgsize_bitmap & ~PAGE_MASK);
  734. else if (cfg->pgsize_bitmap & PAGE_MASK)
  735. granule = 1UL << __ffs(cfg->pgsize_bitmap & PAGE_MASK);
  736. else
  737. granule = 0;
  738. switch (granule) {
  739. case SZ_4K:
  740. page_sizes = (SZ_4K | SZ_2M | SZ_1G);
  741. break;
  742. case SZ_16K:
  743. page_sizes = (SZ_16K | SZ_32M);
  744. break;
  745. case SZ_64K:
  746. max_addr_bits = 52;
  747. page_sizes = (SZ_64K | SZ_512M);
  748. if (cfg->oas > 48)
  749. page_sizes |= 1ULL << 42; /* 4TB */
  750. break;
  751. default:
  752. page_sizes = 0;
  753. }
  754. cfg->pgsize_bitmap &= page_sizes;
  755. cfg->ias = min(cfg->ias, max_addr_bits);
  756. cfg->oas = min(cfg->oas, max_addr_bits);
  757. }
  758. static struct arm_lpae_io_pgtable *
  759. arm_lpae_alloc_pgtable(struct io_pgtable_cfg *cfg)
  760. {
  761. struct arm_lpae_io_pgtable *data;
  762. int levels, va_bits, pg_shift;
  763. arm_lpae_restrict_pgsizes(cfg);
  764. if (!(cfg->pgsize_bitmap & (SZ_4K | SZ_16K | SZ_64K)))
  765. return NULL;
  766. if (cfg->ias > ARM_LPAE_MAX_ADDR_BITS)
  767. return NULL;
  768. if (cfg->oas > ARM_LPAE_MAX_ADDR_BITS)
  769. return NULL;
  770. data = kmalloc_obj(*data);
  771. if (!data)
  772. return NULL;
  773. pg_shift = __ffs(cfg->pgsize_bitmap);
  774. data->bits_per_level = pg_shift - ilog2(sizeof(arm_lpae_iopte));
  775. va_bits = cfg->ias - pg_shift;
  776. levels = DIV_ROUND_UP(va_bits, data->bits_per_level);
  777. data->start_level = ARM_LPAE_MAX_LEVELS - levels;
  778. /* Calculate the actual size of our pgd (without concatenation) */
  779. data->pgd_bits = va_bits - (data->bits_per_level * (levels - 1));
  780. data->iop.ops = (struct io_pgtable_ops) {
  781. .map_pages = arm_lpae_map_pages,
  782. .unmap_pages = arm_lpae_unmap_pages,
  783. .iova_to_phys = arm_lpae_iova_to_phys,
  784. .read_and_clear_dirty = arm_lpae_read_and_clear_dirty,
  785. .pgtable_walk = arm_lpae_pgtable_walk,
  786. };
  787. return data;
  788. }
  789. static struct io_pgtable *
  790. arm_64_lpae_alloc_pgtable_s1(struct io_pgtable_cfg *cfg, void *cookie)
  791. {
  792. u64 reg;
  793. struct arm_lpae_io_pgtable *data;
  794. typeof(&cfg->arm_lpae_s1_cfg.tcr) tcr = &cfg->arm_lpae_s1_cfg.tcr;
  795. bool tg1;
  796. if (cfg->quirks & ~(IO_PGTABLE_QUIRK_ARM_NS |
  797. IO_PGTABLE_QUIRK_ARM_TTBR1 |
  798. IO_PGTABLE_QUIRK_ARM_OUTER_WBWA |
  799. IO_PGTABLE_QUIRK_ARM_HD |
  800. IO_PGTABLE_QUIRK_NO_WARN))
  801. return NULL;
  802. data = arm_lpae_alloc_pgtable(cfg);
  803. if (!data)
  804. return NULL;
  805. /* TCR */
  806. if (cfg->coherent_walk) {
  807. tcr->sh = ARM_LPAE_TCR_SH_IS;
  808. tcr->irgn = ARM_LPAE_TCR_RGN_WBWA;
  809. tcr->orgn = ARM_LPAE_TCR_RGN_WBWA;
  810. if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_OUTER_WBWA)
  811. goto out_free_data;
  812. } else {
  813. tcr->sh = ARM_LPAE_TCR_SH_OS;
  814. tcr->irgn = ARM_LPAE_TCR_RGN_NC;
  815. if (!(cfg->quirks & IO_PGTABLE_QUIRK_ARM_OUTER_WBWA))
  816. tcr->orgn = ARM_LPAE_TCR_RGN_NC;
  817. else
  818. tcr->orgn = ARM_LPAE_TCR_RGN_WBWA;
  819. }
  820. tg1 = cfg->quirks & IO_PGTABLE_QUIRK_ARM_TTBR1;
  821. switch (ARM_LPAE_GRANULE(data)) {
  822. case SZ_4K:
  823. tcr->tg = tg1 ? ARM_LPAE_TCR_TG1_4K : ARM_LPAE_TCR_TG0_4K;
  824. break;
  825. case SZ_16K:
  826. tcr->tg = tg1 ? ARM_LPAE_TCR_TG1_16K : ARM_LPAE_TCR_TG0_16K;
  827. break;
  828. case SZ_64K:
  829. tcr->tg = tg1 ? ARM_LPAE_TCR_TG1_64K : ARM_LPAE_TCR_TG0_64K;
  830. break;
  831. }
  832. switch (cfg->oas) {
  833. case 32:
  834. tcr->ips = ARM_LPAE_TCR_PS_32_BIT;
  835. break;
  836. case 36:
  837. tcr->ips = ARM_LPAE_TCR_PS_36_BIT;
  838. break;
  839. case 40:
  840. tcr->ips = ARM_LPAE_TCR_PS_40_BIT;
  841. break;
  842. case 42:
  843. tcr->ips = ARM_LPAE_TCR_PS_42_BIT;
  844. break;
  845. case 44:
  846. tcr->ips = ARM_LPAE_TCR_PS_44_BIT;
  847. break;
  848. case 48:
  849. tcr->ips = ARM_LPAE_TCR_PS_48_BIT;
  850. break;
  851. case 52:
  852. tcr->ips = ARM_LPAE_TCR_PS_52_BIT;
  853. break;
  854. default:
  855. goto out_free_data;
  856. }
  857. tcr->tsz = 64ULL - cfg->ias;
  858. /* MAIRs */
  859. reg = (ARM_LPAE_MAIR_ATTR_NC
  860. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_NC)) |
  861. (ARM_LPAE_MAIR_ATTR_WBRWA
  862. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_CACHE)) |
  863. (ARM_LPAE_MAIR_ATTR_DEVICE
  864. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_DEV)) |
  865. (ARM_LPAE_MAIR_ATTR_INC_OWBRWA
  866. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_INC_OCACHE));
  867. cfg->arm_lpae_s1_cfg.mair = reg;
  868. /* Looking good; allocate a pgd */
  869. data->pgd = __arm_lpae_alloc_pages(ARM_LPAE_PGD_SIZE(data),
  870. GFP_KERNEL, cfg, cookie);
  871. if (!data->pgd)
  872. goto out_free_data;
  873. /* Ensure the empty pgd is visible before any actual TTBR write */
  874. wmb();
  875. /* TTBR */
  876. cfg->arm_lpae_s1_cfg.ttbr = virt_to_phys(data->pgd);
  877. return &data->iop;
  878. out_free_data:
  879. kfree(data);
  880. return NULL;
  881. }
  882. static struct io_pgtable *
  883. arm_64_lpae_alloc_pgtable_s2(struct io_pgtable_cfg *cfg, void *cookie)
  884. {
  885. u64 sl;
  886. struct arm_lpae_io_pgtable *data;
  887. typeof(&cfg->arm_lpae_s2_cfg.vtcr) vtcr = &cfg->arm_lpae_s2_cfg.vtcr;
  888. if (cfg->quirks & ~(IO_PGTABLE_QUIRK_ARM_S2FWB |
  889. IO_PGTABLE_QUIRK_NO_WARN))
  890. return NULL;
  891. data = arm_lpae_alloc_pgtable(cfg);
  892. if (!data)
  893. return NULL;
  894. if (arm_lpae_concat_mandatory(cfg, data)) {
  895. if (WARN_ON((ARM_LPAE_PGD_SIZE(data) / sizeof(arm_lpae_iopte)) >
  896. ARM_LPAE_S2_MAX_CONCAT_PAGES))
  897. return NULL;
  898. data->pgd_bits += data->bits_per_level;
  899. data->start_level++;
  900. }
  901. /* VTCR */
  902. if (cfg->coherent_walk) {
  903. vtcr->sh = ARM_LPAE_TCR_SH_IS;
  904. vtcr->irgn = ARM_LPAE_TCR_RGN_WBWA;
  905. vtcr->orgn = ARM_LPAE_TCR_RGN_WBWA;
  906. } else {
  907. vtcr->sh = ARM_LPAE_TCR_SH_OS;
  908. vtcr->irgn = ARM_LPAE_TCR_RGN_NC;
  909. vtcr->orgn = ARM_LPAE_TCR_RGN_NC;
  910. }
  911. sl = data->start_level;
  912. switch (ARM_LPAE_GRANULE(data)) {
  913. case SZ_4K:
  914. vtcr->tg = ARM_LPAE_TCR_TG0_4K;
  915. sl++; /* SL0 format is different for 4K granule size */
  916. break;
  917. case SZ_16K:
  918. vtcr->tg = ARM_LPAE_TCR_TG0_16K;
  919. break;
  920. case SZ_64K:
  921. vtcr->tg = ARM_LPAE_TCR_TG0_64K;
  922. break;
  923. }
  924. switch (cfg->oas) {
  925. case 32:
  926. vtcr->ps = ARM_LPAE_TCR_PS_32_BIT;
  927. break;
  928. case 36:
  929. vtcr->ps = ARM_LPAE_TCR_PS_36_BIT;
  930. break;
  931. case 40:
  932. vtcr->ps = ARM_LPAE_TCR_PS_40_BIT;
  933. break;
  934. case 42:
  935. vtcr->ps = ARM_LPAE_TCR_PS_42_BIT;
  936. break;
  937. case 44:
  938. vtcr->ps = ARM_LPAE_TCR_PS_44_BIT;
  939. break;
  940. case 48:
  941. vtcr->ps = ARM_LPAE_TCR_PS_48_BIT;
  942. break;
  943. case 52:
  944. vtcr->ps = ARM_LPAE_TCR_PS_52_BIT;
  945. break;
  946. default:
  947. goto out_free_data;
  948. }
  949. vtcr->tsz = 64ULL - cfg->ias;
  950. vtcr->sl = ~sl & ARM_LPAE_VTCR_SL0_MASK;
  951. /* Allocate pgd pages */
  952. data->pgd = __arm_lpae_alloc_pages(ARM_LPAE_PGD_SIZE(data),
  953. GFP_KERNEL, cfg, cookie);
  954. if (!data->pgd)
  955. goto out_free_data;
  956. /* Ensure the empty pgd is visible before any actual TTBR write */
  957. wmb();
  958. /* VTTBR */
  959. cfg->arm_lpae_s2_cfg.vttbr = virt_to_phys(data->pgd);
  960. return &data->iop;
  961. out_free_data:
  962. kfree(data);
  963. return NULL;
  964. }
  965. static struct io_pgtable *
  966. arm_32_lpae_alloc_pgtable_s1(struct io_pgtable_cfg *cfg, void *cookie)
  967. {
  968. if (cfg->ias > 32 || cfg->oas > 40)
  969. return NULL;
  970. cfg->pgsize_bitmap &= (SZ_4K | SZ_2M | SZ_1G);
  971. return arm_64_lpae_alloc_pgtable_s1(cfg, cookie);
  972. }
  973. static struct io_pgtable *
  974. arm_32_lpae_alloc_pgtable_s2(struct io_pgtable_cfg *cfg, void *cookie)
  975. {
  976. if (cfg->ias > 40 || cfg->oas > 40)
  977. return NULL;
  978. cfg->pgsize_bitmap &= (SZ_4K | SZ_2M | SZ_1G);
  979. return arm_64_lpae_alloc_pgtable_s2(cfg, cookie);
  980. }
  981. static struct io_pgtable *
  982. arm_mali_lpae_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie)
  983. {
  984. struct arm_lpae_io_pgtable *data;
  985. /* No quirks for Mali (hopefully) */
  986. if (cfg->quirks)
  987. return NULL;
  988. if (cfg->ias > 48 || cfg->oas > 40)
  989. return NULL;
  990. cfg->pgsize_bitmap &= (SZ_4K | SZ_2M | SZ_1G);
  991. data = arm_lpae_alloc_pgtable(cfg);
  992. if (!data)
  993. return NULL;
  994. /* Mali seems to need a full 4-level table regardless of IAS */
  995. if (data->start_level > 0) {
  996. data->start_level = 0;
  997. data->pgd_bits = 0;
  998. }
  999. /*
  1000. * MEMATTR: Mali has no actual notion of a non-cacheable type, so the
  1001. * best we can do is mimic the out-of-tree driver and hope that the
  1002. * "implementation-defined caching policy" is good enough. Similarly,
  1003. * we'll use it for the sake of a valid attribute for our 'device'
  1004. * index, although callers should never request that in practice.
  1005. */
  1006. cfg->arm_mali_lpae_cfg.memattr =
  1007. (ARM_MALI_LPAE_MEMATTR_IMP_DEF
  1008. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_NC)) |
  1009. (ARM_MALI_LPAE_MEMATTR_WRITE_ALLOC
  1010. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_CACHE)) |
  1011. (ARM_MALI_LPAE_MEMATTR_IMP_DEF
  1012. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_DEV));
  1013. data->pgd = __arm_lpae_alloc_pages(ARM_LPAE_PGD_SIZE(data), GFP_KERNEL,
  1014. cfg, cookie);
  1015. if (!data->pgd)
  1016. goto out_free_data;
  1017. /* Ensure the empty pgd is visible before TRANSTAB can be written */
  1018. wmb();
  1019. cfg->arm_mali_lpae_cfg.transtab = virt_to_phys(data->pgd) |
  1020. ARM_MALI_LPAE_TTBR_READ_INNER |
  1021. ARM_MALI_LPAE_TTBR_ADRMODE_TABLE;
  1022. if (cfg->coherent_walk)
  1023. cfg->arm_mali_lpae_cfg.transtab |= ARM_MALI_LPAE_TTBR_SHARE_OUTER;
  1024. return &data->iop;
  1025. out_free_data:
  1026. kfree(data);
  1027. return NULL;
  1028. }
  1029. struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s1_init_fns = {
  1030. .caps = IO_PGTABLE_CAP_CUSTOM_ALLOCATOR,
  1031. .alloc = arm_64_lpae_alloc_pgtable_s1,
  1032. .free = arm_lpae_free_pgtable,
  1033. };
  1034. struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s2_init_fns = {
  1035. .caps = IO_PGTABLE_CAP_CUSTOM_ALLOCATOR,
  1036. .alloc = arm_64_lpae_alloc_pgtable_s2,
  1037. .free = arm_lpae_free_pgtable,
  1038. };
  1039. struct io_pgtable_init_fns io_pgtable_arm_32_lpae_s1_init_fns = {
  1040. .caps = IO_PGTABLE_CAP_CUSTOM_ALLOCATOR,
  1041. .alloc = arm_32_lpae_alloc_pgtable_s1,
  1042. .free = arm_lpae_free_pgtable,
  1043. };
  1044. struct io_pgtable_init_fns io_pgtable_arm_32_lpae_s2_init_fns = {
  1045. .caps = IO_PGTABLE_CAP_CUSTOM_ALLOCATOR,
  1046. .alloc = arm_32_lpae_alloc_pgtable_s2,
  1047. .free = arm_lpae_free_pgtable,
  1048. };
  1049. struct io_pgtable_init_fns io_pgtable_arm_mali_lpae_init_fns = {
  1050. .caps = IO_PGTABLE_CAP_CUSTOM_ALLOCATOR,
  1051. .alloc = arm_mali_lpae_alloc_pgtable,
  1052. .free = arm_lpae_free_pgtable,
  1053. };