msm_iommu.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2013 Red Hat
  4. * Author: Rob Clark <robdclark@gmail.com>
  5. */
  6. #include <linux/adreno-smmu-priv.h>
  7. #include <linux/io-pgtable.h>
  8. #include "msm_drv.h"
  9. #include "msm_mmu.h"
  10. struct msm_iommu {
  11. struct msm_mmu base;
  12. struct iommu_domain *domain;
  13. atomic_t pagetables;
  14. };
  15. #define to_msm_iommu(x) container_of(x, struct msm_iommu, base)
  16. struct msm_iommu_pagetable {
  17. struct msm_mmu base;
  18. struct msm_mmu *parent;
  19. struct io_pgtable_ops *pgtbl_ops;
  20. const struct iommu_flush_ops *tlb;
  21. struct device *iommu_dev;
  22. unsigned long pgsize_bitmap; /* Bitmap of page sizes in use */
  23. phys_addr_t ttbr;
  24. u32 asid;
  25. };
  26. static struct msm_iommu_pagetable *to_pagetable(struct msm_mmu *mmu)
  27. {
  28. return container_of(mmu, struct msm_iommu_pagetable, base);
  29. }
  30. /* based on iommu_pgsize() in iommu.c: */
  31. static size_t calc_pgsize(struct msm_iommu_pagetable *pagetable,
  32. unsigned long iova, phys_addr_t paddr,
  33. size_t size, size_t *count)
  34. {
  35. unsigned int pgsize_idx, pgsize_idx_next;
  36. unsigned long pgsizes;
  37. size_t offset, pgsize, pgsize_next;
  38. unsigned long addr_merge = paddr | iova;
  39. /* Page sizes supported by the hardware and small enough for @size */
  40. pgsizes = pagetable->pgsize_bitmap & GENMASK(__fls(size), 0);
  41. /* Constrain the page sizes further based on the maximum alignment */
  42. if (likely(addr_merge))
  43. pgsizes &= GENMASK(__ffs(addr_merge), 0);
  44. /* Make sure we have at least one suitable page size */
  45. BUG_ON(!pgsizes);
  46. /* Pick the biggest page size remaining */
  47. pgsize_idx = __fls(pgsizes);
  48. pgsize = BIT(pgsize_idx);
  49. if (!count)
  50. return pgsize;
  51. /* Find the next biggest support page size, if it exists */
  52. pgsizes = pagetable->pgsize_bitmap & ~GENMASK(pgsize_idx, 0);
  53. if (!pgsizes)
  54. goto out_set_count;
  55. pgsize_idx_next = __ffs(pgsizes);
  56. pgsize_next = BIT(pgsize_idx_next);
  57. /*
  58. * There's no point trying a bigger page size unless the virtual
  59. * and physical addresses are similarly offset within the larger page.
  60. */
  61. if ((iova ^ paddr) & (pgsize_next - 1))
  62. goto out_set_count;
  63. /* Calculate the offset to the next page size alignment boundary */
  64. offset = pgsize_next - (addr_merge & (pgsize_next - 1));
  65. /*
  66. * If size is big enough to accommodate the larger page, reduce
  67. * the number of smaller pages.
  68. */
  69. if (offset + pgsize_next <= size)
  70. size = offset;
  71. out_set_count:
  72. *count = size >> pgsize_idx;
  73. return pgsize;
  74. }
  75. static int msm_iommu_pagetable_unmap(struct msm_mmu *mmu, u64 iova,
  76. size_t size)
  77. {
  78. struct msm_iommu_pagetable *pagetable = to_pagetable(mmu);
  79. struct io_pgtable_ops *ops = pagetable->pgtbl_ops;
  80. while (size) {
  81. size_t unmapped, pgsize, count;
  82. pgsize = calc_pgsize(pagetable, iova, iova, size, &count);
  83. unmapped = ops->unmap_pages(ops, iova, pgsize, count, NULL);
  84. if (!unmapped)
  85. break;
  86. iova += unmapped;
  87. size -= unmapped;
  88. }
  89. iommu_flush_iotlb_all(to_msm_iommu(pagetable->parent)->domain);
  90. return (size == 0) ? 0 : -EINVAL;
  91. }
  92. static int msm_iommu_pagetable_map(struct msm_mmu *mmu, u64 iova,
  93. struct sg_table *sgt, size_t len, int prot)
  94. {
  95. struct msm_iommu_pagetable *pagetable = to_pagetable(mmu);
  96. struct io_pgtable_ops *ops = pagetable->pgtbl_ops;
  97. struct scatterlist *sg;
  98. u64 addr = iova;
  99. unsigned int i;
  100. for_each_sgtable_sg(sgt, sg, i) {
  101. size_t size = sg->length;
  102. phys_addr_t phys = sg_phys(sg);
  103. while (size) {
  104. size_t pgsize, count, mapped = 0;
  105. int ret;
  106. pgsize = calc_pgsize(pagetable, addr, phys, size, &count);
  107. ret = ops->map_pages(ops, addr, phys, pgsize, count,
  108. prot, GFP_KERNEL, &mapped);
  109. /* map_pages could fail after mapping some of the pages,
  110. * so update the counters before error handling.
  111. */
  112. phys += mapped;
  113. addr += mapped;
  114. size -= mapped;
  115. if (ret) {
  116. msm_iommu_pagetable_unmap(mmu, iova, addr - iova);
  117. return -EINVAL;
  118. }
  119. }
  120. }
  121. return 0;
  122. }
  123. static void msm_iommu_pagetable_destroy(struct msm_mmu *mmu)
  124. {
  125. struct msm_iommu_pagetable *pagetable = to_pagetable(mmu);
  126. struct msm_iommu *iommu = to_msm_iommu(pagetable->parent);
  127. struct adreno_smmu_priv *adreno_smmu =
  128. dev_get_drvdata(pagetable->parent->dev);
  129. /*
  130. * If this is the last attached pagetable for the parent,
  131. * disable TTBR0 in the arm-smmu driver
  132. */
  133. if (atomic_dec_return(&iommu->pagetables) == 0)
  134. adreno_smmu->set_ttbr0_cfg(adreno_smmu->cookie, NULL);
  135. free_io_pgtable_ops(pagetable->pgtbl_ops);
  136. kfree(pagetable);
  137. }
  138. int msm_iommu_pagetable_params(struct msm_mmu *mmu,
  139. phys_addr_t *ttbr, int *asid)
  140. {
  141. struct msm_iommu_pagetable *pagetable;
  142. if (mmu->type != MSM_MMU_IOMMU_PAGETABLE)
  143. return -EINVAL;
  144. pagetable = to_pagetable(mmu);
  145. if (ttbr)
  146. *ttbr = pagetable->ttbr;
  147. if (asid)
  148. *asid = pagetable->asid;
  149. return 0;
  150. }
  151. struct iommu_domain_geometry *msm_iommu_get_geometry(struct msm_mmu *mmu)
  152. {
  153. struct msm_iommu *iommu = to_msm_iommu(mmu);
  154. return &iommu->domain->geometry;
  155. }
  156. static const struct msm_mmu_funcs pagetable_funcs = {
  157. .map = msm_iommu_pagetable_map,
  158. .unmap = msm_iommu_pagetable_unmap,
  159. .destroy = msm_iommu_pagetable_destroy,
  160. };
  161. static void msm_iommu_tlb_flush_all(void *cookie)
  162. {
  163. struct msm_iommu_pagetable *pagetable = cookie;
  164. struct adreno_smmu_priv *adreno_smmu;
  165. if (!pm_runtime_get_if_in_use(pagetable->iommu_dev))
  166. return;
  167. adreno_smmu = dev_get_drvdata(pagetable->parent->dev);
  168. pagetable->tlb->tlb_flush_all((void *)adreno_smmu->cookie);
  169. pm_runtime_put_autosuspend(pagetable->iommu_dev);
  170. }
  171. static void msm_iommu_tlb_flush_walk(unsigned long iova, size_t size,
  172. size_t granule, void *cookie)
  173. {
  174. struct msm_iommu_pagetable *pagetable = cookie;
  175. struct adreno_smmu_priv *adreno_smmu;
  176. if (!pm_runtime_get_if_in_use(pagetable->iommu_dev))
  177. return;
  178. adreno_smmu = dev_get_drvdata(pagetable->parent->dev);
  179. pagetable->tlb->tlb_flush_walk(iova, size, granule, (void *)adreno_smmu->cookie);
  180. pm_runtime_put_autosuspend(pagetable->iommu_dev);
  181. }
  182. static void msm_iommu_tlb_add_page(struct iommu_iotlb_gather *gather,
  183. unsigned long iova, size_t granule, void *cookie)
  184. {
  185. }
  186. static const struct iommu_flush_ops tlb_ops = {
  187. .tlb_flush_all = msm_iommu_tlb_flush_all,
  188. .tlb_flush_walk = msm_iommu_tlb_flush_walk,
  189. .tlb_add_page = msm_iommu_tlb_add_page,
  190. };
  191. static int msm_fault_handler(struct iommu_domain *domain, struct device *dev,
  192. unsigned long iova, int flags, void *arg);
  193. struct msm_mmu *msm_iommu_pagetable_create(struct msm_mmu *parent)
  194. {
  195. struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(parent->dev);
  196. struct msm_iommu *iommu = to_msm_iommu(parent);
  197. struct msm_iommu_pagetable *pagetable;
  198. const struct io_pgtable_cfg *ttbr1_cfg = NULL;
  199. struct io_pgtable_cfg ttbr0_cfg;
  200. int ret;
  201. /* Get the pagetable configuration from the domain */
  202. if (adreno_smmu->cookie)
  203. ttbr1_cfg = adreno_smmu->get_ttbr1_cfg(adreno_smmu->cookie);
  204. /*
  205. * If you hit this WARN_ONCE() you are probably missing an entry in
  206. * qcom_smmu_impl_of_match[] in arm-smmu-qcom.c
  207. */
  208. if (WARN_ONCE(!ttbr1_cfg, "No per-process page tables"))
  209. return ERR_PTR(-ENODEV);
  210. pagetable = kzalloc(sizeof(*pagetable), GFP_KERNEL);
  211. if (!pagetable)
  212. return ERR_PTR(-ENOMEM);
  213. msm_mmu_init(&pagetable->base, parent->dev, &pagetable_funcs,
  214. MSM_MMU_IOMMU_PAGETABLE);
  215. /* Clone the TTBR1 cfg as starting point for TTBR0 cfg: */
  216. ttbr0_cfg = *ttbr1_cfg;
  217. /* The incoming cfg will have the TTBR1 quirk enabled */
  218. ttbr0_cfg.quirks &= ~IO_PGTABLE_QUIRK_ARM_TTBR1;
  219. ttbr0_cfg.tlb = &tlb_ops;
  220. pagetable->pgtbl_ops = alloc_io_pgtable_ops(ARM_64_LPAE_S1,
  221. &ttbr0_cfg, pagetable);
  222. if (!pagetable->pgtbl_ops) {
  223. kfree(pagetable);
  224. return ERR_PTR(-ENOMEM);
  225. }
  226. /*
  227. * If this is the first pagetable that we've allocated, send it back to
  228. * the arm-smmu driver as a trigger to set up TTBR0
  229. */
  230. if (atomic_inc_return(&iommu->pagetables) == 1) {
  231. ret = adreno_smmu->set_ttbr0_cfg(adreno_smmu->cookie, &ttbr0_cfg);
  232. if (ret) {
  233. free_io_pgtable_ops(pagetable->pgtbl_ops);
  234. kfree(pagetable);
  235. return ERR_PTR(ret);
  236. }
  237. }
  238. /* Needed later for TLB flush */
  239. pagetable->parent = parent;
  240. pagetable->tlb = ttbr1_cfg->tlb;
  241. pagetable->iommu_dev = ttbr1_cfg->iommu_dev;
  242. pagetable->pgsize_bitmap = ttbr0_cfg.pgsize_bitmap;
  243. pagetable->ttbr = ttbr0_cfg.arm_lpae_s1_cfg.ttbr;
  244. /*
  245. * TODO we would like each set of page tables to have a unique ASID
  246. * to optimize TLB invalidation. But iommu_flush_iotlb_all() will
  247. * end up flushing the ASID used for TTBR1 pagetables, which is not
  248. * what we want. So for now just use the same ASID as TTBR1.
  249. */
  250. pagetable->asid = 0;
  251. return &pagetable->base;
  252. }
  253. static int msm_fault_handler(struct iommu_domain *domain, struct device *dev,
  254. unsigned long iova, int flags, void *arg)
  255. {
  256. struct msm_iommu *iommu = arg;
  257. struct msm_mmu *mmu = &iommu->base;
  258. struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(iommu->base.dev);
  259. struct adreno_smmu_fault_info info, *ptr = NULL;
  260. if (adreno_smmu->get_fault_info) {
  261. adreno_smmu->get_fault_info(adreno_smmu->cookie, &info);
  262. ptr = &info;
  263. }
  264. if (iommu->base.handler)
  265. return iommu->base.handler(iommu->base.arg, iova, flags, ptr);
  266. pr_warn_ratelimited("*** fault: iova=%16lx, flags=%d\n", iova, flags);
  267. if (mmu->funcs->resume_translation)
  268. mmu->funcs->resume_translation(mmu);
  269. return 0;
  270. }
  271. static void msm_iommu_resume_translation(struct msm_mmu *mmu)
  272. {
  273. struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(mmu->dev);
  274. if (adreno_smmu->resume_translation)
  275. adreno_smmu->resume_translation(adreno_smmu->cookie, true);
  276. }
  277. static void msm_iommu_detach(struct msm_mmu *mmu)
  278. {
  279. struct msm_iommu *iommu = to_msm_iommu(mmu);
  280. iommu_detach_device(iommu->domain, mmu->dev);
  281. }
  282. static int msm_iommu_map(struct msm_mmu *mmu, uint64_t iova,
  283. struct sg_table *sgt, size_t len, int prot)
  284. {
  285. struct msm_iommu *iommu = to_msm_iommu(mmu);
  286. size_t ret;
  287. /* The arm-smmu driver expects the addresses to be sign extended */
  288. if (iova & BIT_ULL(48))
  289. iova |= GENMASK_ULL(63, 49);
  290. ret = iommu_map_sgtable(iommu->domain, iova, sgt, prot);
  291. WARN_ON(!ret);
  292. return (ret == len) ? 0 : -EINVAL;
  293. }
  294. static int msm_iommu_unmap(struct msm_mmu *mmu, uint64_t iova, size_t len)
  295. {
  296. struct msm_iommu *iommu = to_msm_iommu(mmu);
  297. if (iova & BIT_ULL(48))
  298. iova |= GENMASK_ULL(63, 49);
  299. iommu_unmap(iommu->domain, iova, len);
  300. return 0;
  301. }
  302. static void msm_iommu_destroy(struct msm_mmu *mmu)
  303. {
  304. struct msm_iommu *iommu = to_msm_iommu(mmu);
  305. iommu_domain_free(iommu->domain);
  306. kfree(iommu);
  307. }
  308. static const struct msm_mmu_funcs funcs = {
  309. .detach = msm_iommu_detach,
  310. .map = msm_iommu_map,
  311. .unmap = msm_iommu_unmap,
  312. .destroy = msm_iommu_destroy,
  313. .resume_translation = msm_iommu_resume_translation,
  314. };
  315. struct msm_mmu *msm_iommu_new(struct device *dev, unsigned long quirks)
  316. {
  317. struct iommu_domain *domain;
  318. struct msm_iommu *iommu;
  319. int ret;
  320. if (!device_iommu_mapped(dev))
  321. return NULL;
  322. domain = iommu_paging_domain_alloc(dev);
  323. if (IS_ERR(domain))
  324. return ERR_CAST(domain);
  325. iommu_set_pgtable_quirks(domain, quirks);
  326. iommu = kzalloc(sizeof(*iommu), GFP_KERNEL);
  327. if (!iommu) {
  328. iommu_domain_free(domain);
  329. return ERR_PTR(-ENOMEM);
  330. }
  331. iommu->domain = domain;
  332. msm_mmu_init(&iommu->base, dev, &funcs, MSM_MMU_IOMMU);
  333. atomic_set(&iommu->pagetables, 0);
  334. ret = iommu_attach_device(iommu->domain, dev);
  335. if (ret) {
  336. iommu_domain_free(domain);
  337. kfree(iommu);
  338. return ERR_PTR(ret);
  339. }
  340. return &iommu->base;
  341. }
  342. struct msm_mmu *msm_iommu_gpu_new(struct device *dev, struct msm_gpu *gpu, unsigned long quirks)
  343. {
  344. struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(dev);
  345. struct msm_iommu *iommu;
  346. struct msm_mmu *mmu;
  347. mmu = msm_iommu_new(dev, quirks);
  348. if (IS_ERR_OR_NULL(mmu))
  349. return mmu;
  350. iommu = to_msm_iommu(mmu);
  351. iommu_set_fault_handler(iommu->domain, msm_fault_handler, iommu);
  352. /* Enable stall on iommu fault: */
  353. if (adreno_smmu->set_stall)
  354. adreno_smmu->set_stall(adreno_smmu->cookie, true);
  355. return mmu;
  356. }