io-pgtable-arm.c 35 KB

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