qcom-io-pgtable-arm.c 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720
  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. * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  10. */
  11. #define pr_fmt(fmt) "arm-lpae io-pgtable: " fmt
  12. #include <linux/atomic.h>
  13. #include <linux/bitfield.h>
  14. #include <linux/bitops.h>
  15. #include <linux/io-pgtable.h>
  16. #include <linux/kernel.h>
  17. #include <linux/sizes.h>
  18. #include <linux/slab.h>
  19. #include <linux/types.h>
  20. #include <linux/dma-mapping.h>
  21. #include <linux/qcom-iommu-util.h>
  22. #include <linux/qcom-io-pgtable.h>
  23. #include <asm/barrier.h>
  24. #include "qcom-io-pgtable-alloc.h"
  25. #include "io-pgtable-arm.h"
  26. #define ARM_LPAE_MAX_ADDR_BITS 52
  27. #define ARM_LPAE_S2_MAX_CONCAT_PAGES 16
  28. #define ARM_LPAE_MAX_LEVELS 4
  29. /* Struct accessors */
  30. #define io_pgtable_to_data(x) \
  31. container_of((x), struct arm_lpae_io_pgtable, iop)
  32. #define io_pgtable_ops_to_data(x) \
  33. io_pgtable_to_data(io_pgtable_ops_to_pgtable(x))
  34. /*
  35. * Calculate the right shift amount to get to the portion describing level l
  36. * in a virtual address mapped by the pagetable in d.
  37. */
  38. #define ARM_LPAE_LVL_SHIFT(l, d) \
  39. (((ARM_LPAE_MAX_LEVELS - (l)) * (d)->bits_per_level) + \
  40. ilog2(sizeof(arm_lpae_iopte)))
  41. #define ARM_LPAE_GRANULE(d) \
  42. (sizeof(arm_lpae_iopte) << (d)->bits_per_level)
  43. #define ARM_LPAE_PGD_SIZE(d) \
  44. (sizeof(arm_lpae_iopte) << (d)->pgd_bits)
  45. #define ARM_LPAE_PTES_PER_TABLE(d) \
  46. (ARM_LPAE_GRANULE(d) >> ilog2(sizeof(arm_lpae_iopte)))
  47. /*
  48. * Calculate the index at level l used to map virtual address a using the
  49. * pagetable in d.
  50. */
  51. #define ARM_LPAE_PGD_IDX(l, d) \
  52. ((l) == (d)->start_level ? (d)->pgd_bits - (d)->bits_per_level : 0)
  53. #define ARM_LPAE_LVL_IDX(a, l, d) \
  54. (((u64)(a) >> ARM_LPAE_LVL_SHIFT(l, d)) & \
  55. ((1 << ((d)->bits_per_level + ARM_LPAE_PGD_IDX(l, d))) - 1))
  56. /* Calculate the block/page mapping size at level l for pagetable in d. */
  57. #define ARM_LPAE_BLOCK_SIZE(l, d) (1ULL << ARM_LPAE_LVL_SHIFT(l, d))
  58. /* Page table bits */
  59. #define ARM_LPAE_PTE_TYPE_SHIFT 0
  60. #define ARM_LPAE_PTE_TYPE_MASK 0x3
  61. #define ARM_LPAE_PTE_TYPE_BLOCK 1
  62. #define ARM_LPAE_PTE_TYPE_TABLE 3
  63. #define ARM_LPAE_PTE_TYPE_PAGE 3
  64. #define ARM_LPAE_PTE_ADDR_MASK GENMASK_ULL(47, 12)
  65. #define ARM_LPAE_PTE_NSTABLE (((arm_lpae_iopte)1) << 63)
  66. #define ARM_LPAE_PTE_XN (((arm_lpae_iopte)3) << 53)
  67. #define ARM_LPAE_PTE_AF (((arm_lpae_iopte)1) << 10)
  68. #define ARM_LPAE_PTE_SH_NS (((arm_lpae_iopte)0) << 8)
  69. #define ARM_LPAE_PTE_SH_OS (((arm_lpae_iopte)2) << 8)
  70. #define ARM_LPAE_PTE_SH_IS (((arm_lpae_iopte)3) << 8)
  71. #define ARM_LPAE_PTE_NS (((arm_lpae_iopte)1) << 5)
  72. #define ARM_LPAE_PTE_VALID (((arm_lpae_iopte)1) << 0)
  73. #define ARM_LPAE_PTE_ATTR_LO_MASK (((arm_lpae_iopte)0x3ff) << 2)
  74. /* Ignore the contiguous bit for block splitting */
  75. #define ARM_LPAE_PTE_ATTR_HI_MASK (((arm_lpae_iopte)6) << 52)
  76. #define ARM_LPAE_PTE_ATTR_MASK (ARM_LPAE_PTE_ATTR_LO_MASK | \
  77. ARM_LPAE_PTE_ATTR_HI_MASK)
  78. /* Software bit for solving coherency races */
  79. #define ARM_LPAE_PTE_SW_SYNC (((arm_lpae_iopte)1) << 55)
  80. /* Stage-1 PTE */
  81. #define ARM_LPAE_PTE_AP_UNPRIV (((arm_lpae_iopte)1) << 6)
  82. #define ARM_LPAE_PTE_AP_RDONLY (((arm_lpae_iopte)2) << 6)
  83. #define ARM_LPAE_PTE_ATTRINDX_SHIFT 2
  84. #define ARM_LPAE_PTE_nG (((arm_lpae_iopte)1) << 11)
  85. /* Stage-2 PTE */
  86. #define ARM_LPAE_PTE_HAP_FAULT (((arm_lpae_iopte)0) << 6)
  87. #define ARM_LPAE_PTE_HAP_READ (((arm_lpae_iopte)1) << 6)
  88. #define ARM_LPAE_PTE_HAP_WRITE (((arm_lpae_iopte)2) << 6)
  89. #define ARM_LPAE_PTE_MEMATTR_OIWB (((arm_lpae_iopte)0xf) << 2)
  90. #define ARM_LPAE_PTE_MEMATTR_NC (((arm_lpae_iopte)0x5) << 2)
  91. #define ARM_LPAE_PTE_MEMATTR_DEV (((arm_lpae_iopte)0x1) << 2)
  92. /* Register bits */
  93. #define ARM_LPAE_VTCR_SL0_MASK 0x3
  94. #define ARM_LPAE_TCR_T0SZ_SHIFT 0
  95. #define ARM_LPAE_VTCR_PS_SHIFT 16
  96. #define ARM_LPAE_VTCR_PS_MASK 0x7
  97. #define ARM_LPAE_MAIR_ATTR_SHIFT(n) ((n) << 3)
  98. #define ARM_LPAE_MAIR_ATTR_MASK 0xff
  99. #define ARM_LPAE_MAIR_ATTR_DEVICE 0x04ULL
  100. #define ARM_LPAE_MAIR_ATTR_NC 0x44ULL
  101. #define ARM_LPAE_MAIR_ATTR_INC_OWBRANWA 0xe4ULL
  102. #define ARM_LPAE_MAIR_ATTR_IWBRWA_OWBRANWA 0xefULL
  103. #define ARM_LPAE_MAIR_ATTR_INC_OWBRWA 0xf4ULL
  104. #define ARM_LPAE_MAIR_ATTR_WBRWA 0xffULL
  105. #define ARM_LPAE_MAIR_ATTR_IDX_NC 0
  106. #define ARM_LPAE_MAIR_ATTR_IDX_CACHE 1
  107. #define ARM_LPAE_MAIR_ATTR_IDX_DEV 2
  108. #define ARM_LPAE_MAIR_ATTR_IDX_INC_OCACHE 3
  109. #define ARM_LPAE_MAIR_ATTR_IDX_INC_OCACHE_NWA 4
  110. #define ARM_LPAE_MAIR_ATTR_IDX_ICACHE_OCACHE_NWA 5
  111. #define ARM_MALI_LPAE_TTBR_ADRMODE_TABLE (3u << 0)
  112. #define ARM_MALI_LPAE_TTBR_READ_INNER BIT(2)
  113. #define ARM_MALI_LPAE_TTBR_SHARE_OUTER BIT(4)
  114. #define ARM_MALI_LPAE_MEMATTR_IMP_DEF 0x88ULL
  115. #define ARM_MALI_LPAE_MEMATTR_WRITE_ALLOC 0x8DULL
  116. /* IOPTE accessors */
  117. #define iopte_deref(pte, d) __va(iopte_to_paddr(pte, d))
  118. #define iopte_type(pte) \
  119. (((pte) >> ARM_LPAE_PTE_TYPE_SHIFT) & ARM_LPAE_PTE_TYPE_MASK)
  120. #define iopte_prot(pte) ((pte) & ARM_LPAE_PTE_ATTR_MASK)
  121. struct arm_lpae_io_pgtable {
  122. struct io_pgtable iop;
  123. int pgd_bits;
  124. int start_level;
  125. int bits_per_level;
  126. void *pgd;
  127. u32 vmid;
  128. const struct qcom_iommu_flush_ops *iommu_tlb_ops;
  129. const struct qcom_iommu_pgtable_log_ops *pgtable_log_ops;
  130. /* Protects table refcounts */
  131. spinlock_t lock;
  132. };
  133. typedef u64 arm_lpae_iopte;
  134. /*
  135. * We'll use some ignored bits in table entries to keep track of the number
  136. * of page mappings beneath the table. The maximum number of entries
  137. * beneath any table mapping in armv8 is 8192 (which is possible at the
  138. * 2nd and 3rd level when using a 64K granule size). The bits at our
  139. * disposal are:
  140. *
  141. * 4k granule: [54..52], [11..2]
  142. * 64k granule: [54..52], [15..2]
  143. *
  144. * [54..52], [11..2] is enough bits for tracking table mappings at any
  145. * level for any granule, so we'll use those.
  146. *
  147. * If iopte_tblcnt reaches zero for a last-level pagetable, the pagetable
  148. * will be freed.
  149. */
  150. #define BOTTOM_IGNORED_MASK GENMASK(11, 2)
  151. #define TOP_IGNORED_MASK GENMASK_ULL(54, 52)
  152. #define IOPTE_RESERVED_MASK (TOP_IGNORED_MASK | BOTTOM_IGNORED_MASK)
  153. #define BOTTOM_VAL_BITS GENMASK(9, 0)
  154. #define TOP_VAL_BITS GENMASK(12, 10)
  155. static arm_lpae_iopte iopte_val(arm_lpae_iopte table_pte)
  156. {
  157. return table_pte & ~IOPTE_RESERVED_MASK;
  158. }
  159. static int iopte_tblcnt(arm_lpae_iopte table_pte)
  160. {
  161. int top_cnt = FIELD_GET(TOP_IGNORED_MASK, table_pte);
  162. int bottom_cnt = FIELD_GET(BOTTOM_IGNORED_MASK, table_pte);
  163. return FIELD_PREP(TOP_VAL_BITS, top_cnt) |
  164. FIELD_PREP(BOTTOM_VAL_BITS, bottom_cnt);
  165. }
  166. static void iopte_tblcnt_set(arm_lpae_iopte *table_pte, int val)
  167. {
  168. arm_lpae_iopte pte = iopte_val(*table_pte);
  169. int top_val = FIELD_GET(TOP_VAL_BITS, val);
  170. int bottom_val = FIELD_GET(BOTTOM_VAL_BITS, val);
  171. pte |= FIELD_PREP(TOP_IGNORED_MASK, top_val) |
  172. FIELD_PREP(BOTTOM_IGNORED_MASK, bottom_val);
  173. *table_pte = pte;
  174. }
  175. static void iopte_tblcnt_sub(arm_lpae_iopte *table_ptep, int cnt)
  176. {
  177. int current_cnt = iopte_tblcnt(*table_ptep);
  178. current_cnt -= cnt;
  179. iopte_tblcnt_set(table_ptep, current_cnt);
  180. }
  181. static void iopte_tblcnt_add(arm_lpae_iopte *table_ptep, int cnt)
  182. {
  183. int current_cnt = iopte_tblcnt(*table_ptep);
  184. current_cnt += cnt;
  185. iopte_tblcnt_set(table_ptep, current_cnt);
  186. }
  187. static inline bool iopte_leaf(arm_lpae_iopte pte, int lvl,
  188. enum io_pgtable_fmt fmt)
  189. {
  190. if (lvl == (ARM_LPAE_MAX_LEVELS - 1) && fmt != ARM_MALI_LPAE)
  191. return iopte_type(pte) == ARM_LPAE_PTE_TYPE_PAGE;
  192. return iopte_type(pte) == ARM_LPAE_PTE_TYPE_BLOCK;
  193. }
  194. static arm_lpae_iopte paddr_to_iopte(phys_addr_t paddr,
  195. struct arm_lpae_io_pgtable *data)
  196. {
  197. arm_lpae_iopte pte = paddr;
  198. /* Of the bits which overlap, either 51:48 or 15:12 are always RES0 */
  199. return (pte | (pte >> (48 - 12))) & ARM_LPAE_PTE_ADDR_MASK;
  200. }
  201. static phys_addr_t iopte_to_paddr(arm_lpae_iopte pte,
  202. struct arm_lpae_io_pgtable *data)
  203. {
  204. u64 paddr = iopte_val(pte) & ARM_LPAE_PTE_ADDR_MASK;
  205. if (ARM_LPAE_GRANULE(data) < SZ_64K)
  206. return paddr;
  207. /* Rotate the packed high-order bits back to the top */
  208. return (paddr | (paddr << (48 - 12))) & (ARM_LPAE_PTE_ADDR_MASK << 4);
  209. }
  210. static bool selftest_running;
  211. static dma_addr_t __arm_lpae_dma_addr(void *pages)
  212. {
  213. return (dma_addr_t)virt_to_phys(pages);
  214. }
  215. static void *__arm_lpae_alloc_pages(struct arm_lpae_io_pgtable *data,
  216. size_t size, gfp_t gfp,
  217. struct io_pgtable_cfg *cfg, void *cookie)
  218. {
  219. struct device *dev = cfg->iommu_dev;
  220. dma_addr_t dma;
  221. struct page *p;
  222. void *pages;
  223. VM_BUG_ON((gfp & __GFP_HIGHMEM));
  224. p = qcom_io_pgtable_alloc_page(data->vmid, gfp | __GFP_ZERO);
  225. if (!p)
  226. return NULL;
  227. pages = page_address(p);
  228. if (!cfg->coherent_walk) {
  229. dma = dma_map_single(dev, pages, size, DMA_TO_DEVICE);
  230. if (dma_mapping_error(dev, dma))
  231. goto out_free;
  232. /*
  233. * We depend on the IOMMU being able to work with any physical
  234. * address directly, so if the DMA layer suggests otherwise by
  235. * translating or truncating them, that bodes very badly...
  236. */
  237. if (dma != virt_to_phys(pages))
  238. goto out_unmap;
  239. }
  240. return pages;
  241. out_unmap:
  242. dev_err(dev, "Cannot accommodate DMA translation for IOMMU page tables\n");
  243. dma_unmap_single(dev, dma, size, DMA_TO_DEVICE);
  244. out_free:
  245. qcom_io_pgtable_free_page(p);
  246. return NULL;
  247. }
  248. static void __arm_lpae_free_pages(struct arm_lpae_io_pgtable *data,
  249. void *pages, size_t size,
  250. struct io_pgtable_cfg *cfg, void *cookie,
  251. bool deferred_free)
  252. {
  253. if (!cfg->coherent_walk)
  254. dma_unmap_single(cfg->iommu_dev, __arm_lpae_dma_addr(pages),
  255. size, DMA_TO_DEVICE);
  256. if (deferred_free)
  257. qcom_io_pgtable_tlb_add_walk_page(data->iommu_tlb_ops, cookie, pages);
  258. else
  259. qcom_io_pgtable_free_page(virt_to_page(pages));
  260. }
  261. static void __arm_lpae_sync_pte(arm_lpae_iopte *ptep, int num_entries,
  262. struct io_pgtable_cfg *cfg)
  263. {
  264. dma_sync_single_for_device(cfg->iommu_dev, __arm_lpae_dma_addr(ptep),
  265. sizeof(*ptep) * num_entries, DMA_TO_DEVICE);
  266. }
  267. static void __arm_lpae_set_pte(arm_lpae_iopte *ptep, arm_lpae_iopte pte,
  268. int num_entries, struct io_pgtable_cfg *cfg)
  269. {
  270. int i;
  271. for (i = 0; i < num_entries; i++)
  272. ptep[i] = pte;
  273. if (!cfg->coherent_walk)
  274. __arm_lpae_sync_pte(ptep, num_entries, cfg);
  275. }
  276. static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data,
  277. struct iommu_iotlb_gather *gather,
  278. unsigned long iova, size_t size, size_t pgcount,
  279. int lvl, arm_lpae_iopte *ptep, unsigned long *flags);
  280. static void __arm_lpae_init_pte(struct arm_lpae_io_pgtable *data,
  281. phys_addr_t paddr, arm_lpae_iopte prot,
  282. int lvl, int num_entries, arm_lpae_iopte *ptep,
  283. bool flush)
  284. {
  285. arm_lpae_iopte pte = prot;
  286. size_t sz = ARM_LPAE_BLOCK_SIZE(lvl, data);
  287. struct io_pgtable_cfg *cfg = &data->iop.cfg;
  288. int i;
  289. if (data->iop.fmt != ARM_MALI_LPAE && lvl == ARM_LPAE_MAX_LEVELS - 1)
  290. pte |= ARM_LPAE_PTE_TYPE_PAGE;
  291. else
  292. pte |= ARM_LPAE_PTE_TYPE_BLOCK;
  293. for (i = 0; i < num_entries; i++)
  294. ptep[i] = pte | paddr_to_iopte(paddr + i * sz, data);
  295. if (flush && !cfg->coherent_walk)
  296. __arm_lpae_sync_pte(ptep, num_entries, cfg);
  297. }
  298. static int arm_lpae_init_pte(struct arm_lpae_io_pgtable *data,
  299. unsigned long iova, phys_addr_t paddr,
  300. arm_lpae_iopte prot, int lvl, int num_entries,
  301. arm_lpae_iopte *ptep, arm_lpae_iopte *prev_ptep,
  302. bool flush)
  303. {
  304. int i;
  305. for (i = 0; i < num_entries; i++)
  306. if (ptep[i] & ARM_LPAE_PTE_VALID) {
  307. /* We require an unmap first */
  308. WARN_ON(!selftest_running);
  309. return -EEXIST;
  310. }
  311. __arm_lpae_init_pte(data, paddr, prot, lvl, num_entries, ptep, flush);
  312. if (prev_ptep)
  313. iopte_tblcnt_add(prev_ptep, num_entries);
  314. return 0;
  315. }
  316. static arm_lpae_iopte arm_lpae_install_table(arm_lpae_iopte *table,
  317. arm_lpae_iopte *ptep,
  318. arm_lpae_iopte curr,
  319. struct io_pgtable_cfg *cfg,
  320. int refcount,
  321. struct arm_lpae_io_pgtable *data,
  322. unsigned long *flags)
  323. {
  324. arm_lpae_iopte old, new;
  325. /*
  326. * Drop the lock for TLB SYNC operation in order to
  327. * enable clock & regulator through rpm hooks and
  328. * acquire after it.
  329. */
  330. spin_unlock_irqrestore(&data->lock, *flags);
  331. /* Due to tlb maintenance in unmap being deferred */
  332. qcom_io_pgtable_tlb_sync(data->iommu_tlb_ops, data->iop.cookie);
  333. spin_lock_irqsave(&data->lock, *flags);
  334. new = __pa(table) | ARM_LPAE_PTE_TYPE_TABLE;
  335. if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_NS)
  336. new |= ARM_LPAE_PTE_NSTABLE;
  337. iopte_tblcnt_set(&new, refcount);
  338. /*
  339. * Ensure the table itself is visible before its PTE can be.
  340. * Whilst we could get away with cmpxchg64_release below, this
  341. * doesn't have any ordering semantics when !CONFIG_SMP.
  342. */
  343. dma_wmb();
  344. old = cmpxchg64_relaxed(ptep, curr, new);
  345. if (cfg->coherent_walk || (old & ARM_LPAE_PTE_SW_SYNC))
  346. return old;
  347. /* Even if it's not ours, there's no point waiting; just kick it */
  348. __arm_lpae_sync_pte(ptep, 1, cfg);
  349. if (old == curr)
  350. WRITE_ONCE(*ptep, new | ARM_LPAE_PTE_SW_SYNC);
  351. return old;
  352. }
  353. struct map_state {
  354. unsigned long iova_end;
  355. unsigned int pgsize;
  356. arm_lpae_iopte *pgtable;
  357. arm_lpae_iopte *prev_pgtable;
  358. arm_lpae_iopte *pte_start;
  359. unsigned int num_pte;
  360. };
  361. /* map state optimization works at level 3 */
  362. #define MAP_STATE_LVL 3
  363. static int __arm_lpae_map(struct arm_lpae_io_pgtable *data, unsigned long iova,
  364. phys_addr_t paddr, size_t size, size_t pgcount,
  365. arm_lpae_iopte prot, int lvl, arm_lpae_iopte *ptep,
  366. arm_lpae_iopte *prev_ptep, struct map_state *ms,
  367. gfp_t gfp, unsigned long *flags, size_t *mapped)
  368. {
  369. arm_lpae_iopte *cptep, pte;
  370. size_t block_size = ARM_LPAE_BLOCK_SIZE(lvl, data);
  371. size_t prev_block_size;
  372. size_t tblsz = ARM_LPAE_GRANULE(data);
  373. struct io_pgtable_cfg *cfg = &data->iop.cfg;
  374. void *cookie = data->iop.cookie;
  375. arm_lpae_iopte *pgtable = ptep;
  376. int ret = 0, num_entries, max_entries, map_idx_start;
  377. /* Find our entry at the current level */
  378. map_idx_start = ARM_LPAE_LVL_IDX(iova, lvl, data);
  379. ptep += map_idx_start;
  380. /* If we can install a leaf entry at this level, then do so */
  381. if (size == block_size) {
  382. if (!ms) {
  383. max_entries = ARM_LPAE_PTES_PER_TABLE(data) - map_idx_start;
  384. num_entries = min_t(int, pgcount, max_entries);
  385. ret = arm_lpae_init_pte(data, iova, paddr, prot, lvl,
  386. num_entries, ptep, prev_ptep, true);
  387. if (!ret && mapped)
  388. *mapped += size * num_entries;
  389. return ret;
  390. }
  391. if (lvl == MAP_STATE_LVL) {
  392. prev_block_size = ARM_LPAE_BLOCK_SIZE(lvl - 1, data);
  393. if (ms->pgtable && !cfg->coherent_walk)
  394. dma_sync_single_for_device(cfg->iommu_dev,
  395. __arm_lpae_dma_addr(ms->pte_start),
  396. ms->num_pte * sizeof(*ptep),
  397. DMA_TO_DEVICE);
  398. ms->iova_end = round_down(iova, prev_block_size) + prev_block_size;
  399. ms->pgtable = pgtable;
  400. ms->prev_pgtable = prev_ptep;
  401. ms->pgsize = size;
  402. ms->pte_start = ptep;
  403. ms->num_pte = 1;
  404. } else {
  405. /*
  406. * We have some map state from previous page mappings,
  407. * but we're about to set up a block mapping. Flush
  408. * out the previous page mappings.
  409. */
  410. if (ms->pgtable && !cfg->coherent_walk)
  411. dma_sync_single_for_device(cfg->iommu_dev,
  412. __arm_lpae_dma_addr(ms->pte_start),
  413. ms->num_pte * sizeof(*ptep),
  414. DMA_TO_DEVICE);
  415. memset(ms, 0, sizeof(*ms));
  416. ms = NULL;
  417. }
  418. ret = arm_lpae_init_pte(data, iova, paddr, prot, lvl, 1, ptep, prev_ptep,
  419. ms == NULL);
  420. if (!ret && mapped)
  421. *mapped += size;
  422. return ret;
  423. }
  424. /* We can't allocate tables at the final level */
  425. if (WARN_ON(lvl >= ARM_LPAE_MAX_LEVELS - 1))
  426. return -EINVAL;
  427. /* Grab a pointer to the next level */
  428. pte = READ_ONCE(*ptep);
  429. if (!pte) {
  430. /*
  431. * Drop the lock in order to support GFP_KERNEL.
  432. *
  433. * Only last level pagetables will be freed if iotlb_tblcnt reaches 0.
  434. * Since we are installing a new pagetable, the current pagetable cannot
  435. * be the last level. So we can assume ptep is still a valid memory location
  436. * after reaquiring the lock.
  437. */
  438. spin_unlock_irqrestore(&data->lock, *flags);
  439. cptep = __arm_lpae_alloc_pages(data, tblsz, gfp, cfg, cookie);
  440. spin_lock_irqsave(&data->lock, *flags);
  441. if (!cptep)
  442. return -ENOMEM;
  443. pte = arm_lpae_install_table(cptep, ptep, 0, cfg, 0, data, flags);
  444. if (pte)
  445. __arm_lpae_free_pages(data, cptep, tblsz, cfg, cookie, false);
  446. else
  447. qcom_io_pgtable_log_new_table(data->pgtable_log_ops,
  448. data->iop.cookie, cptep,
  449. iova & ~(block_size - 1),
  450. block_size);
  451. } else if (!cfg->coherent_walk && !(pte & ARM_LPAE_PTE_SW_SYNC)) {
  452. __arm_lpae_sync_pte(ptep, 1, cfg);
  453. }
  454. if (pte && !iopte_leaf(pte, lvl, data->iop.fmt)) {
  455. cptep = iopte_deref(pte, data);
  456. } else if (pte) {
  457. /* We require an unmap first */
  458. WARN_ON(!selftest_running);
  459. return -EEXIST;
  460. }
  461. /* Rinse, repeat */
  462. return __arm_lpae_map(data, iova, paddr, size, pgcount, prot, lvl + 1,
  463. cptep, ptep, ms, gfp, flags, mapped);
  464. }
  465. static arm_lpae_iopte arm_lpae_prot_to_pte(struct arm_lpae_io_pgtable *data,
  466. int prot)
  467. {
  468. arm_lpae_iopte pte;
  469. if (data->iop.fmt == QCOM_ARM_64_LPAE_S1 ||
  470. data->iop.fmt == ARM_32_LPAE_S1) {
  471. pte = ARM_LPAE_PTE_nG;
  472. if (!(prot & IOMMU_WRITE) && (prot & IOMMU_READ))
  473. pte |= ARM_LPAE_PTE_AP_RDONLY;
  474. if (!(prot & IOMMU_PRIV))
  475. pte |= ARM_LPAE_PTE_AP_UNPRIV;
  476. } else {
  477. pte = ARM_LPAE_PTE_HAP_FAULT;
  478. if (prot & IOMMU_READ)
  479. pte |= ARM_LPAE_PTE_HAP_READ;
  480. if (prot & IOMMU_WRITE)
  481. pte |= ARM_LPAE_PTE_HAP_WRITE;
  482. }
  483. /*
  484. * Note that this logic is structured to accommodate Mali LPAE
  485. * having stage-1-like attributes but stage-2-like permissions.
  486. */
  487. if (data->iop.fmt == ARM_64_LPAE_S2 ||
  488. data->iop.fmt == ARM_32_LPAE_S2) {
  489. if (prot & IOMMU_MMIO)
  490. pte |= ARM_LPAE_PTE_MEMATTR_DEV;
  491. else if (prot & IOMMU_CACHE)
  492. pte |= ARM_LPAE_PTE_MEMATTR_OIWB;
  493. else
  494. pte |= ARM_LPAE_PTE_MEMATTR_NC;
  495. } else {
  496. if (prot & IOMMU_MMIO)
  497. pte |= (ARM_LPAE_MAIR_ATTR_IDX_DEV
  498. << ARM_LPAE_PTE_ATTRINDX_SHIFT);
  499. else if ((prot & IOMMU_CACHE) && (prot & IOMMU_SYS_CACHE_NWA))
  500. pte |= (ARM_LPAE_MAIR_ATTR_IDX_ICACHE_OCACHE_NWA
  501. << ARM_LPAE_PTE_ATTRINDX_SHIFT);
  502. /* IOMMU_CACHE + IOMMU_SYS_CACHE equivalent to IOMMU_CACHE */
  503. else if (prot & IOMMU_CACHE)
  504. pte |= (ARM_LPAE_MAIR_ATTR_IDX_CACHE
  505. << ARM_LPAE_PTE_ATTRINDX_SHIFT);
  506. else if (prot & IOMMU_SYS_CACHE)
  507. pte |= (ARM_LPAE_MAIR_ATTR_IDX_INC_OCACHE
  508. << ARM_LPAE_PTE_ATTRINDX_SHIFT);
  509. else if (prot & IOMMU_SYS_CACHE_NWA)
  510. pte |= (ARM_LPAE_MAIR_ATTR_IDX_INC_OCACHE_NWA
  511. << ARM_LPAE_PTE_ATTRINDX_SHIFT);
  512. }
  513. if (prot & IOMMU_CACHE)
  514. pte |= ARM_LPAE_PTE_SH_IS;
  515. else
  516. pte |= ARM_LPAE_PTE_SH_OS;
  517. if (prot & IOMMU_NOEXEC)
  518. pte |= ARM_LPAE_PTE_XN;
  519. if (data->iop.cfg.quirks & IO_PGTABLE_QUIRK_ARM_NS)
  520. pte |= ARM_LPAE_PTE_NS;
  521. if (data->iop.fmt != ARM_MALI_LPAE)
  522. pte |= ARM_LPAE_PTE_AF;
  523. return pte;
  524. }
  525. int qcom_arm_lpae_map_pages(struct io_pgtable_ops *ops, unsigned long iova,
  526. phys_addr_t paddr, size_t pgsize, size_t pgcount,
  527. int iommu_prot, gfp_t gfp, size_t *mapped)
  528. {
  529. struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
  530. struct io_pgtable_cfg *cfg = &data->iop.cfg;
  531. arm_lpae_iopte *ptep = data->pgd;
  532. int ret, lvl = data->start_level;
  533. arm_lpae_iopte prot;
  534. long iaext = (s64)iova >> cfg->ias;
  535. unsigned long flags;
  536. if (WARN_ON(!pgsize || (pgsize & cfg->pgsize_bitmap) != pgsize || !pgcount))
  537. return -EINVAL;
  538. if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_TTBR1)
  539. iaext = ~iaext;
  540. if (WARN_ON(iaext || paddr >> cfg->oas))
  541. return -ERANGE;
  542. /* If no access, then nothing to do */
  543. if (!(iommu_prot & (IOMMU_READ | IOMMU_WRITE)))
  544. return 0;
  545. prot = arm_lpae_prot_to_pte(data, iommu_prot);
  546. spin_lock_irqsave(&data->lock, flags);
  547. ret = __arm_lpae_map(data, iova, paddr, pgsize, pgcount, prot, lvl,
  548. ptep, NULL, NULL, gfp, &flags, mapped);
  549. spin_unlock_irqrestore(&data->lock, flags);
  550. /*
  551. * Synchronise all PTE updates for the new mapping before there's
  552. * a chance for anything to kick off a table walk for the new iova.
  553. */
  554. wmb();
  555. return ret;
  556. }
  557. EXPORT_SYMBOL(qcom_arm_lpae_map_pages);
  558. int qcom_arm_lpae_map(struct io_pgtable_ops *ops, unsigned long iova,
  559. phys_addr_t paddr, size_t size, int iommu_prot, gfp_t gfp)
  560. {
  561. return qcom_arm_lpae_map_pages(ops, iova, paddr, size, 1, iommu_prot, gfp,
  562. NULL);
  563. }
  564. EXPORT_SYMBOL(qcom_arm_lpae_map);
  565. static size_t arm_lpae_pgsize(unsigned long pgsize_bitmap, unsigned long addr_merge,
  566. size_t size)
  567. {
  568. unsigned int pgsize_idx, align_pgsize_idx;
  569. size_t pgsize;
  570. /* Max page size that still fits into 'size' */
  571. pgsize_idx = __fls(size);
  572. /* need to consider alignment requirements ? */
  573. if (likely(addr_merge)) {
  574. /* Max page size allowed by address */
  575. align_pgsize_idx = __ffs(addr_merge);
  576. pgsize_idx = min(pgsize_idx, align_pgsize_idx);
  577. }
  578. /* build a mask of acceptable page sizes */
  579. pgsize = (1UL << (pgsize_idx + 1)) - 1;
  580. /* throw away page sizes not supported by the hardware */
  581. pgsize &= pgsize_bitmap;
  582. /* make sure we're still sane */
  583. BUG_ON(!pgsize);
  584. /* pick the biggest page */
  585. pgsize_idx = __fls(pgsize);
  586. pgsize = 1UL << pgsize_idx;
  587. return pgsize;
  588. }
  589. static int arm_lpae_map_by_pgsize(struct io_pgtable_ops *ops,
  590. unsigned long iova, phys_addr_t paddr,
  591. size_t size, int iommu_prot, gfp_t gfp,
  592. size_t *mapped, struct map_state *ms,
  593. unsigned long *flags)
  594. {
  595. struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
  596. struct io_pgtable_cfg *cfg = &data->iop.cfg;
  597. arm_lpae_iopte *ptep = data->pgd, *ms_ptep;
  598. int ret, lvl = data->start_level;
  599. arm_lpae_iopte prot = arm_lpae_prot_to_pte(data, iommu_prot);
  600. unsigned int min_pagesz = 1 << __ffs(cfg->pgsize_bitmap);
  601. long iaext = (s64)(iova + size - 1) >> cfg->ias;
  602. size_t pgsize;
  603. if (!IS_ALIGNED(iova | paddr | size, min_pagesz)) {
  604. pr_err("unaligned: iova 0x%lx pa %pa size 0x%zx min_pagesz 0x%x\n",
  605. iova, &paddr, size, min_pagesz);
  606. return -EINVAL;
  607. }
  608. if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_TTBR1)
  609. iaext = ~iaext;
  610. if (WARN_ON(iaext || (paddr + size - 1) >> cfg->oas))
  611. return -ERANGE;
  612. /* If no access, then nothing to do */
  613. if (!(iommu_prot & (IOMMU_READ | IOMMU_WRITE))) {
  614. /* Increment 'mapped' so that the IOVA can be incremented accordingly. */
  615. *mapped += size;
  616. return 0;
  617. }
  618. while (size) {
  619. pgsize = arm_lpae_pgsize(cfg->pgsize_bitmap, iova | paddr, size);
  620. if (ms->pgtable && (iova < ms->iova_end)) {
  621. ms_ptep = ms->pgtable + ARM_LPAE_LVL_IDX(iova, MAP_STATE_LVL, data);
  622. ret = arm_lpae_init_pte(data, iova, paddr, prot, MAP_STATE_LVL,
  623. 1, ms_ptep, ms->prev_pgtable, false);
  624. if (ret)
  625. return ret;
  626. ms->num_pte++;
  627. } else {
  628. ret = __arm_lpae_map(data, iova, paddr, pgsize, 1,
  629. prot, lvl, ptep, NULL, ms, gfp,
  630. flags, NULL);
  631. if (ret)
  632. return ret;
  633. }
  634. iova += pgsize;
  635. paddr += pgsize;
  636. *mapped += pgsize;
  637. size -= pgsize;
  638. }
  639. return 0;
  640. }
  641. int qcom_arm_lpae_map_sg(struct io_pgtable_ops *ops, unsigned long iova,
  642. struct scatterlist *sg, unsigned int nents, int prot,
  643. gfp_t gfp, size_t *mapped)
  644. {
  645. size_t len = 0;
  646. unsigned int i = 0;
  647. int ret;
  648. phys_addr_t start;
  649. struct map_state ms = {};
  650. struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
  651. struct io_pgtable_cfg *cfg = &data->iop.cfg;
  652. unsigned long flags;
  653. *mapped = 0;
  654. spin_lock_irqsave(&data->lock, flags);
  655. while (i <= nents) {
  656. phys_addr_t s_phys = sg_phys(sg);
  657. if (len && s_phys != start + len) {
  658. ret = arm_lpae_map_by_pgsize(ops, iova + *mapped, start,
  659. len, prot, gfp, mapped, &ms, &flags);
  660. if (ret) {
  661. spin_unlock_irqrestore(&data->lock, flags);
  662. return ret;
  663. }
  664. len = 0;
  665. }
  666. if (len) {
  667. len += sg->length;
  668. } else {
  669. len = sg->length;
  670. start = s_phys;
  671. }
  672. if (++i < nents)
  673. sg = sg_next(sg);
  674. }
  675. spin_unlock_irqrestore(&data->lock, flags);
  676. if (ms.pgtable && !cfg->coherent_walk)
  677. dma_sync_single_for_device(cfg->iommu_dev,
  678. __arm_lpae_dma_addr(ms.pte_start),
  679. ms.num_pte * sizeof(*ms.pte_start),
  680. DMA_TO_DEVICE);
  681. /*
  682. * Synchronise all PTE updates for the new mapping before there's
  683. * a chance for anything to kick off a table walk for the new iova.
  684. */
  685. wmb();
  686. return 0;
  687. }
  688. EXPORT_SYMBOL(qcom_arm_lpae_map_sg);
  689. static void __arm_lpae_free_pgtable(struct arm_lpae_io_pgtable *data, int lvl,
  690. arm_lpae_iopte *ptep, bool deferred_free)
  691. {
  692. arm_lpae_iopte *start, *end;
  693. unsigned long table_size;
  694. void *cookie = data->iop.cookie;
  695. if (lvl == data->start_level)
  696. table_size = ARM_LPAE_PGD_SIZE(data);
  697. else
  698. table_size = ARM_LPAE_GRANULE(data);
  699. start = ptep;
  700. /* Only leaf entries at the last level */
  701. if (lvl == ARM_LPAE_MAX_LEVELS - 1)
  702. end = ptep;
  703. else
  704. end = (void *)ptep + table_size;
  705. while (ptep != end) {
  706. arm_lpae_iopte pte = *ptep++;
  707. if (!pte || iopte_leaf(pte, lvl, data->iop.fmt))
  708. continue;
  709. __arm_lpae_free_pgtable(data, lvl + 1, iopte_deref(pte, data),
  710. deferred_free);
  711. }
  712. __arm_lpae_free_pages(data, start, table_size, &data->iop.cfg, cookie,
  713. deferred_free);
  714. qcom_io_pgtable_log_remove_table(data->pgtable_log_ops,
  715. data->iop.cookie, start,
  716. 0, /* iova unknown */
  717. ARM_LPAE_BLOCK_SIZE(lvl - 1, data));
  718. }
  719. static void arm_lpae_free_pgtable(struct io_pgtable *iop)
  720. {
  721. struct arm_lpae_io_pgtable *data = io_pgtable_to_data(iop);
  722. __arm_lpae_free_pgtable(data, data->start_level, data->pgd, false);
  723. qcom_io_pgtable_allocator_unregister(data->vmid);
  724. kfree(data);
  725. }
  726. static size_t arm_lpae_split_blk_unmap(struct arm_lpae_io_pgtable *data,
  727. struct iommu_iotlb_gather *gather,
  728. unsigned long iova, size_t size,
  729. arm_lpae_iopte blk_pte, int lvl,
  730. arm_lpae_iopte *ptep, size_t pgcount,
  731. unsigned long *flags)
  732. {
  733. struct io_pgtable_cfg *cfg = &data->iop.cfg;
  734. arm_lpae_iopte pte, *tablep;
  735. phys_addr_t blk_paddr;
  736. size_t tablesz = ARM_LPAE_GRANULE(data);
  737. size_t split_sz = ARM_LPAE_BLOCK_SIZE(lvl, data);
  738. int ptes_per_table = ARM_LPAE_PTES_PER_TABLE(data);
  739. int i, unmap_idx_start = -1, num_entries = 0, max_entries;
  740. void *cookie = data->iop.cookie;
  741. int child_cnt = 0;
  742. if (WARN_ON(lvl == ARM_LPAE_MAX_LEVELS))
  743. return 0;
  744. tablep = __arm_lpae_alloc_pages(data, tablesz, GFP_ATOMIC, cfg, cookie);
  745. if (!tablep)
  746. return 0; /* Bytes unmapped */
  747. if (size == split_sz) {
  748. unmap_idx_start = ARM_LPAE_LVL_IDX(iova, lvl, data);
  749. max_entries = ptes_per_table - unmap_idx_start;
  750. num_entries = min_t(int, pgcount, max_entries);
  751. }
  752. blk_paddr = iopte_to_paddr(blk_pte, data);
  753. pte = iopte_prot(blk_pte);
  754. for (i = 0; i < ptes_per_table; i++, blk_paddr += split_sz) {
  755. /* Unmap! */
  756. if (i >= unmap_idx_start && i < (unmap_idx_start + num_entries))
  757. continue;
  758. __arm_lpae_init_pte(data, blk_paddr, pte, lvl, 1, &tablep[i], true);
  759. child_cnt++;
  760. }
  761. pte = arm_lpae_install_table(tablep, ptep, blk_pte, cfg, child_cnt, data, flags);
  762. if (pte != blk_pte) {
  763. __arm_lpae_free_pages(data, tablep, tablesz, cfg, cookie, false);
  764. /*
  765. * We may race against someone unmapping another part of this
  766. * block, but anything else is invalid. We can't misinterpret
  767. * a page entry here since we're never at the last level.
  768. */
  769. if (iopte_type(pte) != ARM_LPAE_PTE_TYPE_TABLE)
  770. return 0;
  771. tablep = iopte_deref(pte, data);
  772. } else if (unmap_idx_start >= 0) {
  773. /*
  774. * note lvl + 1 due to split_sz above.
  775. * add 0xDEA as flag since split_block_unmap shouldn't ever be called
  776. */
  777. size_t prev_block_size = ARM_LPAE_BLOCK_SIZE(lvl + 1, data);
  778. qcom_io_pgtable_log_new_table(data->pgtable_log_ops,
  779. data->iop.cookie, tablep,
  780. iova & ~(prev_block_size - 1) + 0xDEA,
  781. prev_block_size);
  782. return num_entries * size;
  783. }
  784. return __arm_lpae_unmap(data, gather, iova, size, pgcount, lvl, tablep, flags);
  785. }
  786. static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data,
  787. struct iommu_iotlb_gather *gather,
  788. unsigned long iova, size_t size, size_t pgcount,
  789. int lvl, arm_lpae_iopte *ptep, unsigned long *flags)
  790. {
  791. arm_lpae_iopte pte;
  792. struct io_pgtable *iop = &data->iop;
  793. int ptes_per_table = ARM_LPAE_PTES_PER_TABLE(data);
  794. int i = 0, num_entries, max_entries, unmap_idx_start;
  795. /* Something went horribly wrong and we ran out of page table */
  796. if (WARN_ON(lvl == ARM_LPAE_MAX_LEVELS))
  797. return 0;
  798. unmap_idx_start = ARM_LPAE_LVL_IDX(iova, lvl, data);
  799. ptep += unmap_idx_start;
  800. pte = READ_ONCE(*ptep);
  801. if (WARN_ON(!pte))
  802. return 0;
  803. /* If the size matches this level, we're in the right place */
  804. if (size == ARM_LPAE_BLOCK_SIZE(lvl, data)) {
  805. max_entries = ptes_per_table - unmap_idx_start;
  806. num_entries = min_t(int, pgcount, max_entries);
  807. while (i < num_entries) {
  808. pte = READ_ONCE(*ptep);
  809. if (WARN_ON(!pte))
  810. break;
  811. __arm_lpae_set_pte(ptep, 0, 1, &iop->cfg);
  812. if (!iopte_leaf(pte, lvl, iop->fmt)) {
  813. __arm_lpae_free_pgtable(data, lvl + 1, iopte_deref(pte, data),
  814. true);
  815. } else if (!iommu_iotlb_gather_queued(gather)) {
  816. /*
  817. * Order the PTE update against queueing the IOVA, to
  818. * guarantee that a flush callback from a different CPU
  819. * has observed it before the TLBIALL can be issued.
  820. */
  821. smp_wmb();
  822. }
  823. ptep++;
  824. i++;
  825. }
  826. return i * size;
  827. } else if ((lvl == ARM_LPAE_MAX_LEVELS - 2) && !iopte_leaf(pte, lvl,
  828. iop->fmt)) {
  829. arm_lpae_iopte *table;
  830. arm_lpae_iopte *entry;
  831. table = iopte_deref(pte, data);
  832. unmap_idx_start = ARM_LPAE_LVL_IDX(iova, lvl + 1, data);
  833. entry = table + unmap_idx_start;
  834. max_entries = ptes_per_table - unmap_idx_start;
  835. num_entries = min_t(int, pgcount, max_entries);
  836. __arm_lpae_set_pte(entry, 0, num_entries, &iop->cfg);
  837. iopte_tblcnt_sub(ptep, num_entries);
  838. if (!iopte_tblcnt(*ptep)) {
  839. size_t block_size = ARM_LPAE_BLOCK_SIZE(lvl, data);
  840. /*
  841. * no valid mappings left under this table.
  842. * Defer table free until after iommu_iotlb_sync, or
  843. * qcom_io_pgtable_tlb_sync, whichever occurs first.
  844. */
  845. __arm_lpae_set_pte(ptep, 0, 1, &iop->cfg);
  846. __arm_lpae_free_pgtable(data, lvl + 1, table, true);
  847. qcom_io_pgtable_log_remove_table(data->pgtable_log_ops,
  848. data->iop.cookie, table,
  849. iova & ~(block_size - 1),
  850. block_size);
  851. }
  852. return num_entries * size;
  853. } else if (iopte_leaf(pte, lvl, iop->fmt)) {
  854. /*
  855. * Insert a table at the next level to map the old region,
  856. * minus the part we want to unmap
  857. */
  858. return arm_lpae_split_blk_unmap(data, gather, iova, size, pte,
  859. lvl + 1, ptep, pgcount, flags);
  860. }
  861. /* Keep on walkin' */
  862. ptep = iopte_deref(pte, data);
  863. return __arm_lpae_unmap(data, gather, iova, size, pgcount, lvl + 1, ptep, flags);
  864. }
  865. size_t qcom_arm_lpae_unmap_pages(struct io_pgtable_ops *ops, unsigned long iova,
  866. size_t pgsize, size_t pgcount,
  867. struct iommu_iotlb_gather *gather)
  868. {
  869. struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
  870. struct io_pgtable_cfg *cfg = &data->iop.cfg;
  871. arm_lpae_iopte *ptep = data->pgd;
  872. long iaext = (s64)iova >> cfg->ias;
  873. size_t unmapped;
  874. unsigned long flags;
  875. if (WARN_ON(!pgsize || (pgsize & cfg->pgsize_bitmap) != pgsize || !pgcount))
  876. return 0;
  877. if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_TTBR1)
  878. iaext = ~iaext;
  879. if (WARN_ON(iaext))
  880. return 0;
  881. spin_lock_irqsave(&data->lock, flags);
  882. unmapped = __arm_lpae_unmap(data, gather, iova, pgsize, pgcount,
  883. data->start_level, ptep, &flags);
  884. qcom_io_pgtable_tlb_add_inv(data->iommu_tlb_ops, data->iop.cookie);
  885. spin_unlock_irqrestore(&data->lock, flags);
  886. return unmapped;
  887. }
  888. EXPORT_SYMBOL(qcom_arm_lpae_unmap_pages);
  889. size_t qcom_arm_lpae_unmap(struct io_pgtable_ops *ops, unsigned long iova,
  890. size_t size, struct iommu_iotlb_gather *gather)
  891. {
  892. return qcom_arm_lpae_unmap_pages(ops, iova, size, 1, gather);
  893. }
  894. EXPORT_SYMBOL(qcom_arm_lpae_unmap);
  895. static phys_addr_t arm_lpae_iova_to_phys(struct io_pgtable_ops *ops,
  896. unsigned long iova)
  897. {
  898. struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
  899. arm_lpae_iopte pte, *ptep = data->pgd;
  900. int lvl = data->start_level;
  901. unsigned long flags;
  902. spin_lock_irqsave(&data->lock, flags);
  903. do {
  904. /* Valid IOPTE pointer? */
  905. if (!ptep)
  906. goto err;
  907. /* Grab the IOPTE we're interested in */
  908. ptep += ARM_LPAE_LVL_IDX(iova, lvl, data);
  909. pte = READ_ONCE(*ptep);
  910. /* Valid entry? */
  911. if (!pte)
  912. goto err;
  913. /* Leaf entry? */
  914. if (iopte_leaf(pte, lvl, data->iop.fmt))
  915. goto found_translation;
  916. /* Take it to the next level */
  917. ptep = iopte_deref(pte, data);
  918. } while (++lvl < ARM_LPAE_MAX_LEVELS);
  919. /* Ran out of page tables to walk */
  920. err:
  921. spin_unlock_irqrestore(&data->lock, flags);
  922. return 0;
  923. found_translation:
  924. spin_unlock_irqrestore(&data->lock, flags);
  925. iova &= (ARM_LPAE_BLOCK_SIZE(lvl, data) - 1);
  926. return iopte_to_paddr(pte, data) | iova;
  927. }
  928. static void arm_lpae_restrict_pgsizes(struct io_pgtable_cfg *cfg)
  929. {
  930. unsigned long granule, page_sizes;
  931. unsigned int max_addr_bits = 48;
  932. /*
  933. * We need to restrict the supported page sizes to match the
  934. * translation regime for a particular granule. Aim to match
  935. * the CPU page size if possible, otherwise prefer smaller sizes.
  936. * While we're at it, restrict the block sizes to match the
  937. * chosen granule.
  938. */
  939. if (cfg->pgsize_bitmap & PAGE_SIZE)
  940. granule = PAGE_SIZE;
  941. else if (cfg->pgsize_bitmap & ~PAGE_MASK)
  942. granule = 1UL << __fls(cfg->pgsize_bitmap & ~PAGE_MASK);
  943. else if (cfg->pgsize_bitmap & PAGE_MASK)
  944. granule = 1UL << __ffs(cfg->pgsize_bitmap & PAGE_MASK);
  945. else
  946. granule = 0;
  947. switch (granule) {
  948. case SZ_4K:
  949. page_sizes = (SZ_4K | SZ_2M | SZ_1G);
  950. break;
  951. case SZ_16K:
  952. page_sizes = (SZ_16K | SZ_32M);
  953. break;
  954. case SZ_64K:
  955. max_addr_bits = 52;
  956. page_sizes = (SZ_64K | SZ_512M);
  957. if (cfg->oas > 48)
  958. page_sizes |= 1ULL << 42; /* 4TB */
  959. break;
  960. default:
  961. page_sizes = 0;
  962. }
  963. cfg->pgsize_bitmap &= page_sizes;
  964. cfg->ias = min(cfg->ias, max_addr_bits);
  965. cfg->oas = min(cfg->oas, max_addr_bits);
  966. }
  967. static struct arm_lpae_io_pgtable *
  968. arm_lpae_alloc_pgtable(struct io_pgtable_cfg *cfg)
  969. {
  970. struct arm_lpae_io_pgtable *data;
  971. struct qcom_io_pgtable_info *pgtbl_info = to_qcom_io_pgtable_info(cfg);
  972. int levels, va_bits, pg_shift;
  973. arm_lpae_restrict_pgsizes(cfg);
  974. if (!(cfg->pgsize_bitmap & (SZ_4K | SZ_16K | SZ_64K)))
  975. return NULL;
  976. if (cfg->ias > ARM_LPAE_MAX_ADDR_BITS)
  977. return NULL;
  978. if (cfg->oas > ARM_LPAE_MAX_ADDR_BITS)
  979. return NULL;
  980. data = kmalloc(sizeof(*data), GFP_KERNEL);
  981. if (!data)
  982. return NULL;
  983. pg_shift = __ffs(cfg->pgsize_bitmap);
  984. data->bits_per_level = pg_shift - ilog2(sizeof(arm_lpae_iopte));
  985. va_bits = cfg->ias - pg_shift;
  986. levels = DIV_ROUND_UP(va_bits, data->bits_per_level);
  987. data->start_level = ARM_LPAE_MAX_LEVELS - levels;
  988. /* Calculate the actual size of our pgd (without concatenation) */
  989. data->pgd_bits = va_bits - (data->bits_per_level * (levels - 1));
  990. data->iop.ops = (struct io_pgtable_ops) {
  991. .map = qcom_arm_lpae_map,
  992. .map_pages = qcom_arm_lpae_map_pages,
  993. .unmap = qcom_arm_lpae_unmap,
  994. .unmap_pages = qcom_arm_lpae_unmap_pages,
  995. .iova_to_phys = arm_lpae_iova_to_phys,
  996. };
  997. spin_lock_init(&data->lock);
  998. data->iommu_tlb_ops = pgtbl_info->iommu_tlb_ops;
  999. data->pgtable_log_ops = pgtbl_info->pgtable_log_ops;
  1000. data->vmid = pgtbl_info->vmid;
  1001. if (qcom_io_pgtable_allocator_register(data->vmid)) {
  1002. kfree(data);
  1003. return NULL;
  1004. }
  1005. return data;
  1006. }
  1007. static struct io_pgtable *
  1008. arm_64_lpae_alloc_pgtable_s1(struct io_pgtable_cfg *cfg, void *cookie)
  1009. {
  1010. u64 reg;
  1011. struct arm_lpae_io_pgtable *data;
  1012. typeof(&cfg->arm_lpae_s1_cfg.tcr) tcr = &cfg->arm_lpae_s1_cfg.tcr;
  1013. bool tg1;
  1014. if (cfg->quirks & ~(IO_PGTABLE_QUIRK_ARM_NS |
  1015. IO_PGTABLE_QUIRK_ARM_TTBR1 |
  1016. IO_PGTABLE_QUIRK_ARM_OUTER_WBWA |
  1017. IO_PGTABLE_QUIRK_QCOM_USE_LLC_NWA))
  1018. return NULL;
  1019. data = arm_lpae_alloc_pgtable(cfg);
  1020. if (!data)
  1021. return NULL;
  1022. /* TCR */
  1023. if (cfg->coherent_walk) {
  1024. tcr->sh = ARM_LPAE_TCR_SH_IS;
  1025. tcr->irgn = ARM_LPAE_TCR_RGN_WBWA;
  1026. tcr->orgn = ARM_LPAE_TCR_RGN_WBWA;
  1027. if (WARN_ON(cfg->quirks & (IO_PGTABLE_QUIRK_ARM_OUTER_WBWA |
  1028. IO_PGTABLE_QUIRK_QCOM_USE_LLC_NWA)))
  1029. goto out_free_data;
  1030. } else {
  1031. tcr->sh = ARM_LPAE_TCR_SH_OS;
  1032. tcr->irgn = ARM_LPAE_TCR_RGN_NC;
  1033. if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_OUTER_WBWA)
  1034. tcr->orgn = ARM_LPAE_TCR_RGN_WBWA;
  1035. else if (cfg->quirks & IO_PGTABLE_QUIRK_QCOM_USE_LLC_NWA)
  1036. tcr->orgn = ARM_LPAE_TCR_RGN_WB;
  1037. else
  1038. tcr->orgn = ARM_LPAE_TCR_RGN_NC;
  1039. }
  1040. tg1 = cfg->quirks & IO_PGTABLE_QUIRK_ARM_TTBR1;
  1041. switch (ARM_LPAE_GRANULE(data)) {
  1042. case SZ_4K:
  1043. tcr->tg = tg1 ? ARM_LPAE_TCR_TG1_4K : ARM_LPAE_TCR_TG0_4K;
  1044. break;
  1045. case SZ_16K:
  1046. tcr->tg = tg1 ? ARM_LPAE_TCR_TG1_16K : ARM_LPAE_TCR_TG0_16K;
  1047. break;
  1048. case SZ_64K:
  1049. tcr->tg = tg1 ? ARM_LPAE_TCR_TG1_64K : ARM_LPAE_TCR_TG0_64K;
  1050. break;
  1051. }
  1052. switch (cfg->oas) {
  1053. case 32:
  1054. tcr->ips = ARM_LPAE_TCR_PS_32_BIT;
  1055. break;
  1056. case 36:
  1057. tcr->ips = ARM_LPAE_TCR_PS_36_BIT;
  1058. break;
  1059. case 40:
  1060. tcr->ips = ARM_LPAE_TCR_PS_40_BIT;
  1061. break;
  1062. case 42:
  1063. tcr->ips = ARM_LPAE_TCR_PS_42_BIT;
  1064. break;
  1065. case 44:
  1066. tcr->ips = ARM_LPAE_TCR_PS_44_BIT;
  1067. break;
  1068. case 48:
  1069. tcr->ips = ARM_LPAE_TCR_PS_48_BIT;
  1070. break;
  1071. case 52:
  1072. tcr->ips = ARM_LPAE_TCR_PS_52_BIT;
  1073. break;
  1074. default:
  1075. goto out_free_data;
  1076. }
  1077. tcr->tsz = 64ULL - cfg->ias;
  1078. /* MAIRs */
  1079. reg = (ARM_LPAE_MAIR_ATTR_NC
  1080. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_NC)) |
  1081. (ARM_LPAE_MAIR_ATTR_WBRWA
  1082. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_CACHE)) |
  1083. (ARM_LPAE_MAIR_ATTR_DEVICE
  1084. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_DEV)) |
  1085. (ARM_LPAE_MAIR_ATTR_INC_OWBRWA
  1086. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_INC_OCACHE)) |
  1087. (ARM_LPAE_MAIR_ATTR_INC_OWBRANWA
  1088. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_INC_OCACHE_NWA)) |
  1089. (ARM_LPAE_MAIR_ATTR_IWBRWA_OWBRANWA
  1090. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_ICACHE_OCACHE_NWA));
  1091. cfg->arm_lpae_s1_cfg.mair = reg;
  1092. /* Looking good; allocate a pgd */
  1093. data->pgd = __arm_lpae_alloc_pages(data, ARM_LPAE_PGD_SIZE(data),
  1094. GFP_KERNEL, cfg, cookie);
  1095. if (!data->pgd)
  1096. goto out_free_data;
  1097. /* Ensure the empty pgd is visible before any actual TTBR write */
  1098. wmb();
  1099. /* TTBR */
  1100. cfg->arm_lpae_s1_cfg.ttbr = virt_to_phys(data->pgd);
  1101. return &data->iop;
  1102. out_free_data:
  1103. qcom_io_pgtable_allocator_unregister(data->vmid);
  1104. kfree(data);
  1105. return NULL;
  1106. }
  1107. static struct io_pgtable *
  1108. arm_64_lpae_alloc_pgtable_s2(struct io_pgtable_cfg *cfg, void *cookie)
  1109. {
  1110. u64 sl;
  1111. struct arm_lpae_io_pgtable *data;
  1112. typeof(&cfg->arm_lpae_s2_cfg.vtcr) vtcr = &cfg->arm_lpae_s2_cfg.vtcr;
  1113. /* The NS quirk doesn't apply at stage 2 */
  1114. if (cfg->quirks)
  1115. return NULL;
  1116. data = arm_lpae_alloc_pgtable(cfg);
  1117. if (!data)
  1118. return NULL;
  1119. /*
  1120. * Concatenate PGDs at level 1 if possible in order to reduce
  1121. * the depth of the stage-2 walk.
  1122. */
  1123. if (data->start_level == 0) {
  1124. unsigned long pgd_pages;
  1125. pgd_pages = ARM_LPAE_PGD_SIZE(data) / sizeof(arm_lpae_iopte);
  1126. if (pgd_pages <= ARM_LPAE_S2_MAX_CONCAT_PAGES) {
  1127. data->pgd_bits += data->bits_per_level;
  1128. data->start_level++;
  1129. }
  1130. }
  1131. /* VTCR */
  1132. if (cfg->coherent_walk) {
  1133. vtcr->sh = ARM_LPAE_TCR_SH_IS;
  1134. vtcr->irgn = ARM_LPAE_TCR_RGN_WBWA;
  1135. vtcr->orgn = ARM_LPAE_TCR_RGN_WBWA;
  1136. } else {
  1137. vtcr->sh = ARM_LPAE_TCR_SH_OS;
  1138. vtcr->irgn = ARM_LPAE_TCR_RGN_NC;
  1139. vtcr->orgn = ARM_LPAE_TCR_RGN_NC;
  1140. }
  1141. sl = data->start_level;
  1142. switch (ARM_LPAE_GRANULE(data)) {
  1143. case SZ_4K:
  1144. vtcr->tg = ARM_LPAE_TCR_TG0_4K;
  1145. sl++; /* SL0 format is different for 4K granule size */
  1146. break;
  1147. case SZ_16K:
  1148. vtcr->tg = ARM_LPAE_TCR_TG0_16K;
  1149. break;
  1150. case SZ_64K:
  1151. vtcr->tg = ARM_LPAE_TCR_TG0_64K;
  1152. break;
  1153. }
  1154. switch (cfg->oas) {
  1155. case 32:
  1156. vtcr->ps = ARM_LPAE_TCR_PS_32_BIT;
  1157. break;
  1158. case 36:
  1159. vtcr->ps = ARM_LPAE_TCR_PS_36_BIT;
  1160. break;
  1161. case 40:
  1162. vtcr->ps = ARM_LPAE_TCR_PS_40_BIT;
  1163. break;
  1164. case 42:
  1165. vtcr->ps = ARM_LPAE_TCR_PS_42_BIT;
  1166. break;
  1167. case 44:
  1168. vtcr->ps = ARM_LPAE_TCR_PS_44_BIT;
  1169. break;
  1170. case 48:
  1171. vtcr->ps = ARM_LPAE_TCR_PS_48_BIT;
  1172. break;
  1173. case 52:
  1174. vtcr->ps = ARM_LPAE_TCR_PS_52_BIT;
  1175. break;
  1176. default:
  1177. goto out_free_data;
  1178. }
  1179. vtcr->tsz = 64ULL - cfg->ias;
  1180. vtcr->sl = ~sl & ARM_LPAE_VTCR_SL0_MASK;
  1181. /* Allocate pgd pages */
  1182. data->pgd = __arm_lpae_alloc_pages(data, ARM_LPAE_PGD_SIZE(data),
  1183. GFP_KERNEL, cfg, cookie);
  1184. if (!data->pgd)
  1185. goto out_free_data;
  1186. /* Ensure the empty pgd is visible before any actual TTBR write */
  1187. wmb();
  1188. /* VTTBR */
  1189. cfg->arm_lpae_s2_cfg.vttbr = virt_to_phys(data->pgd);
  1190. return &data->iop;
  1191. out_free_data:
  1192. qcom_io_pgtable_allocator_unregister(data->vmid);
  1193. kfree(data);
  1194. return NULL;
  1195. }
  1196. static struct io_pgtable *
  1197. arm_32_lpae_alloc_pgtable_s1(struct io_pgtable_cfg *cfg, void *cookie)
  1198. {
  1199. if (cfg->ias > 32 || cfg->oas > 40)
  1200. return NULL;
  1201. cfg->pgsize_bitmap &= (SZ_4K | SZ_2M | SZ_1G);
  1202. return arm_64_lpae_alloc_pgtable_s1(cfg, cookie);
  1203. }
  1204. static struct io_pgtable *
  1205. arm_32_lpae_alloc_pgtable_s2(struct io_pgtable_cfg *cfg, void *cookie)
  1206. {
  1207. if (cfg->ias > 40 || cfg->oas > 40)
  1208. return NULL;
  1209. cfg->pgsize_bitmap &= (SZ_4K | SZ_2M | SZ_1G);
  1210. return arm_64_lpae_alloc_pgtable_s2(cfg, cookie);
  1211. }
  1212. static struct io_pgtable *
  1213. arm_mali_lpae_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie)
  1214. {
  1215. struct arm_lpae_io_pgtable *data;
  1216. /* No quirks for Mali (hopefully) */
  1217. if (cfg->quirks)
  1218. return NULL;
  1219. if (cfg->ias > 48 || cfg->oas > 40)
  1220. return NULL;
  1221. cfg->pgsize_bitmap &= (SZ_4K | SZ_2M | SZ_1G);
  1222. data = arm_lpae_alloc_pgtable(cfg);
  1223. if (!data)
  1224. return NULL;
  1225. /* Mali seems to need a full 4-level table regardless of IAS */
  1226. if (data->start_level > 0) {
  1227. data->start_level = 0;
  1228. data->pgd_bits = 0;
  1229. }
  1230. /*
  1231. * MEMATTR: Mali has no actual notion of a non-cacheable type, so the
  1232. * best we can do is mimic the out-of-tree driver and hope that the
  1233. * "implementation-defined caching policy" is good enough. Similarly,
  1234. * we'll use it for the sake of a valid attribute for our 'device'
  1235. * index, although callers should never request that in practice.
  1236. */
  1237. cfg->arm_mali_lpae_cfg.memattr =
  1238. (ARM_MALI_LPAE_MEMATTR_IMP_DEF
  1239. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_NC)) |
  1240. (ARM_MALI_LPAE_MEMATTR_WRITE_ALLOC
  1241. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_CACHE)) |
  1242. (ARM_MALI_LPAE_MEMATTR_IMP_DEF
  1243. << ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_DEV));
  1244. data->pgd = __arm_lpae_alloc_pages(data, ARM_LPAE_PGD_SIZE(data), GFP_KERNEL,
  1245. cfg, cookie);
  1246. if (!data->pgd)
  1247. goto out_free_data;
  1248. /* Ensure the empty pgd is visible before TRANSTAB can be written */
  1249. wmb();
  1250. cfg->arm_mali_lpae_cfg.transtab = virt_to_phys(data->pgd) |
  1251. ARM_MALI_LPAE_TTBR_READ_INNER |
  1252. ARM_MALI_LPAE_TTBR_ADRMODE_TABLE;
  1253. return &data->iop;
  1254. out_free_data:
  1255. qcom_io_pgtable_allocator_unregister(data->vmid);
  1256. kfree(data);
  1257. return NULL;
  1258. }
  1259. struct io_pgtable_init_fns qcom_io_pgtable_arm_64_lpae_s1_init_fns = {
  1260. .alloc = arm_64_lpae_alloc_pgtable_s1,
  1261. .free = arm_lpae_free_pgtable,
  1262. };
  1263. struct io_pgtable_init_fns qcom_io_pgtable_arm_64_lpae_s2_init_fns = {
  1264. .alloc = arm_64_lpae_alloc_pgtable_s2,
  1265. .free = arm_lpae_free_pgtable,
  1266. };
  1267. struct io_pgtable_init_fns qcom_io_pgtable_arm_32_lpae_s1_init_fns = {
  1268. .alloc = arm_32_lpae_alloc_pgtable_s1,
  1269. .free = arm_lpae_free_pgtable,
  1270. };
  1271. struct io_pgtable_init_fns qcom_io_pgtable_arm_32_lpae_s2_init_fns = {
  1272. .alloc = arm_32_lpae_alloc_pgtable_s2,
  1273. .free = arm_lpae_free_pgtable,
  1274. };
  1275. struct io_pgtable_init_fns qcom_io_pgtable_arm_mali_lpae_init_fns = {
  1276. .alloc = arm_mali_lpae_alloc_pgtable,
  1277. .free = arm_lpae_free_pgtable,
  1278. };
  1279. #ifdef CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST
  1280. static struct io_pgtable_cfg *cfg_cookie __initdata;
  1281. static void __init dummy_tlb_flush_all(void *cookie)
  1282. {
  1283. WARN_ON(cookie != cfg_cookie);
  1284. }
  1285. static void __init dummy_tlb_flush(unsigned long iova, size_t size,
  1286. size_t granule, void *cookie)
  1287. {
  1288. WARN_ON(cookie != cfg_cookie);
  1289. WARN_ON(!(size & cfg_cookie->pgsize_bitmap));
  1290. }
  1291. static void __init dummy_tlb_add_page(struct iommu_iotlb_gather *gather,
  1292. unsigned long iova, size_t granule,
  1293. void *cookie)
  1294. {
  1295. dummy_tlb_flush(iova, granule, granule, cookie);
  1296. }
  1297. static const struct iommu_flush_ops dummy_tlb_ops __initconst = {
  1298. .tlb_flush_all = dummy_tlb_flush_all,
  1299. .tlb_flush_walk = dummy_tlb_flush,
  1300. .tlb_add_page = dummy_tlb_add_page,
  1301. };
  1302. static void __init arm_lpae_dump_ops(struct io_pgtable_ops *ops)
  1303. {
  1304. struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
  1305. struct io_pgtable_cfg *cfg = &data->iop.cfg;
  1306. pr_err("cfg: pgsize_bitmap 0x%lx, ias %u-bit\n",
  1307. cfg->pgsize_bitmap, cfg->ias);
  1308. pr_err("data: %d levels, 0x%zx pgd_size, %u pg_shift, %u bits_per_level, pgd @ %p\n",
  1309. ARM_LPAE_MAX_LEVELS - data->start_level, ARM_LPAE_PGD_SIZE(data),
  1310. ilog2(ARM_LPAE_GRANULE(data)), data->bits_per_level, data->pgd);
  1311. }
  1312. #define __FAIL(ops, i) ({ \
  1313. WARN(1, "selftest: test failed for fmt idx %d\n", (i)); \
  1314. arm_lpae_dump_ops(ops); \
  1315. selftest_running = false; \
  1316. -EFAULT; \
  1317. })
  1318. static int __init arm_lpae_run_tests(struct io_pgtable_cfg *cfg)
  1319. {
  1320. static const enum io_pgtable_fmt fmts[] __initconst = {
  1321. QCOM_ARM_64_LPAE_S1,
  1322. ARM_64_LPAE_S2,
  1323. };
  1324. int i, j;
  1325. unsigned long iova;
  1326. size_t size;
  1327. struct io_pgtable_ops *ops;
  1328. selftest_running = true;
  1329. for (i = 0; i < ARRAY_SIZE(fmts); ++i) {
  1330. cfg_cookie = cfg;
  1331. ops = alloc_io_pgtable_ops(fmts[i], cfg, cfg);
  1332. if (!ops) {
  1333. pr_err("selftest: failed to allocate io pgtable ops\n");
  1334. return -ENOMEM;
  1335. }
  1336. /*
  1337. * Initial sanity checks.
  1338. * Empty page tables shouldn't provide any translations.
  1339. */
  1340. if (ops->iova_to_phys(ops, 42))
  1341. return __FAIL(ops, i);
  1342. if (ops->iova_to_phys(ops, SZ_1G + 42))
  1343. return __FAIL(ops, i);
  1344. if (ops->iova_to_phys(ops, SZ_2G + 42))
  1345. return __FAIL(ops, i);
  1346. /*
  1347. * Distinct mappings of different granule sizes.
  1348. */
  1349. iova = 0;
  1350. for_each_set_bit(j, &cfg->pgsize_bitmap, BITS_PER_LONG) {
  1351. size = 1UL << j;
  1352. if (ops->map(ops, iova, iova, size, IOMMU_READ |
  1353. IOMMU_WRITE |
  1354. IOMMU_NOEXEC |
  1355. IOMMU_CACHE, GFP_KERNEL))
  1356. return __FAIL(ops, i);
  1357. /* Overlapping mappings */
  1358. if (!ops->map(ops, iova, iova + size, size,
  1359. IOMMU_READ | IOMMU_NOEXEC, GFP_KERNEL))
  1360. return __FAIL(ops, i);
  1361. if (ops->iova_to_phys(ops, iova + 42) != (iova + 42))
  1362. return __FAIL(ops, i);
  1363. iova += SZ_1G;
  1364. }
  1365. /* Partial unmap */
  1366. size = 1UL << __ffs(cfg->pgsize_bitmap);
  1367. if (ops->unmap(ops, SZ_1G + size, size, NULL) != size)
  1368. return __FAIL(ops, i);
  1369. /* Remap of partial unmap */
  1370. if (ops->map(ops, SZ_1G + size, size, size, IOMMU_READ, GFP_KERNEL))
  1371. return __FAIL(ops, i);
  1372. if (ops->iova_to_phys(ops, SZ_1G + size + 42) != (size + 42))
  1373. return __FAIL(ops, i);
  1374. /* Full unmap */
  1375. iova = 0;
  1376. for_each_set_bit(j, &cfg->pgsize_bitmap, BITS_PER_LONG) {
  1377. size = 1UL << j;
  1378. if (ops->unmap(ops, iova, size, NULL) != size)
  1379. return __FAIL(ops, i);
  1380. if (ops->iova_to_phys(ops, iova + 42))
  1381. return __FAIL(ops, i);
  1382. /* Remap full block */
  1383. if (ops->map(ops, iova, iova, size, IOMMU_WRITE, GFP_KERNEL))
  1384. return __FAIL(ops, i);
  1385. if (ops->iova_to_phys(ops, iova + 42) != (iova + 42))
  1386. return __FAIL(ops, i);
  1387. iova += SZ_1G;
  1388. }
  1389. free_io_pgtable_ops(ops);
  1390. }
  1391. selftest_running = false;
  1392. return 0;
  1393. }
  1394. int __init qcom_arm_lpae_do_selftests(void)
  1395. {
  1396. static const unsigned long pgsize[] __initconst = {
  1397. SZ_4K | SZ_2M | SZ_1G,
  1398. SZ_16K | SZ_32M,
  1399. SZ_64K | SZ_512M,
  1400. };
  1401. static const unsigned int ias[] __initconst = {
  1402. 32, 36, 40, 42, 44, 48,
  1403. };
  1404. int i, j, pass = 0, fail = 0;
  1405. struct io_pgtable_cfg cfg = {
  1406. .tlb = &dummy_tlb_ops,
  1407. .oas = 48,
  1408. .coherent_walk = true,
  1409. };
  1410. for (i = 0; i < ARRAY_SIZE(pgsize); ++i) {
  1411. for (j = 0; j < ARRAY_SIZE(ias); ++j) {
  1412. cfg.pgsize_bitmap = pgsize[i];
  1413. cfg.ias = ias[j];
  1414. pr_info("selftest: pgsize_bitmap 0x%08lx, IAS %u\n",
  1415. pgsize[i], ias[j]);
  1416. if (arm_lpae_run_tests(&cfg))
  1417. fail++;
  1418. else
  1419. pass++;
  1420. }
  1421. }
  1422. pr_info("selftest: completed with %d PASS %d FAIL\n", pass, fail);
  1423. return fail ? -EFAULT : 0;
  1424. }
  1425. #else
  1426. int __init qcom_arm_lpae_do_selftests(void)
  1427. {
  1428. return 0;
  1429. }
  1430. #endif