1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright 2019 Linaro, Ltd, Rob Herring <robh@kernel.org> */
3 #include <linux/bitfield.h>
4 #include <linux/delay.h>
5 #include <linux/dma-mapping.h>
6 #include <linux/interrupt.h>
8 #include <linux/iopoll.h>
9 #include <linux/io-pgtable.h>
10 #include <linux/iommu.h>
11 #include <linux/platform_device.h>
12 #include <linux/pm_runtime.h>
13 #include <linux/shmem_fs.h>
14 #include <linux/sizes.h>
16 #include "panfrost_device.h"
17 #include "panfrost_mmu.h"
18 #include "panfrost_gem.h"
19 #include "panfrost_features.h"
20 #include "panfrost_regs.h"
22 #define mmu_write(dev, reg, data) writel(data, dev->iomem + reg)
23 #define mmu_read(dev, reg) readl(dev->iomem + reg)
26 struct io_pgtable_cfg pgtbl_cfg;
27 struct io_pgtable_ops *pgtbl_ops;
31 static int wait_ready(struct panfrost_device *pfdev, u32 as_nr)
36 /* Wait for the MMU status to indicate there is no active command, in
37 * case one is pending. */
38 ret = readl_relaxed_poll_timeout_atomic(pfdev->iomem + AS_STATUS(as_nr),
39 val, !(val & AS_STATUS_AS_ACTIVE), 10, 1000);
42 dev_err(pfdev->dev, "AS_ACTIVE bit stuck\n");
47 static int write_cmd(struct panfrost_device *pfdev, u32 as_nr, u32 cmd)
51 /* write AS_COMMAND when MMU is ready to accept another command */
52 status = wait_ready(pfdev, as_nr);
54 mmu_write(pfdev, AS_COMMAND(as_nr), cmd);
59 static void lock_region(struct panfrost_device *pfdev, u32 as_nr,
60 u64 iova, size_t size)
63 u64 region = iova & PAGE_MASK;
69 * results in the range (11 .. 42)
72 size = round_up(size, PAGE_SIZE);
74 region_width = 10 + fls(size >> PAGE_SHIFT);
75 if ((size >> PAGE_SHIFT) != (1ul << (region_width - 11))) {
76 /* not pow2, so must go up to the next pow2 */
79 region |= region_width;
81 /* Lock the region that needs to be updated */
82 mmu_write(pfdev, AS_LOCKADDR_LO(as_nr), region & 0xFFFFFFFFUL);
83 mmu_write(pfdev, AS_LOCKADDR_HI(as_nr), (region >> 32) & 0xFFFFFFFFUL);
84 write_cmd(pfdev, as_nr, AS_COMMAND_LOCK);
88 static int mmu_hw_do_operation(struct panfrost_device *pfdev, u32 as_nr,
89 u64 iova, size_t size, u32 op)
94 spin_lock_irqsave(&pfdev->hwaccess_lock, flags);
96 if (op != AS_COMMAND_UNLOCK)
97 lock_region(pfdev, as_nr, iova, size);
99 /* Run the MMU operation */
100 write_cmd(pfdev, as_nr, op);
102 /* Wait for the flush to complete */
103 ret = wait_ready(pfdev, as_nr);
105 spin_unlock_irqrestore(&pfdev->hwaccess_lock, flags);
110 static void panfrost_mmu_enable(struct panfrost_device *pfdev, u32 as_nr)
112 struct io_pgtable_cfg *cfg = &pfdev->mmu->pgtbl_cfg;
113 u64 transtab = cfg->arm_mali_lpae_cfg.transtab;
114 u64 memattr = cfg->arm_mali_lpae_cfg.memattr;
116 mmu_write(pfdev, AS_TRANSTAB_LO(as_nr), transtab & 0xffffffffUL);
117 mmu_write(pfdev, AS_TRANSTAB_HI(as_nr), transtab >> 32);
119 /* Need to revisit mem attrs.
120 * NC is the default, Mali driver is inner WT.
122 mmu_write(pfdev, AS_MEMATTR_LO(as_nr), memattr & 0xffffffffUL);
123 mmu_write(pfdev, AS_MEMATTR_HI(as_nr), memattr >> 32);
125 write_cmd(pfdev, as_nr, AS_COMMAND_UPDATE);
128 static void mmu_disable(struct panfrost_device *pfdev, u32 as_nr)
130 mmu_write(pfdev, AS_TRANSTAB_LO(as_nr), 0);
131 mmu_write(pfdev, AS_TRANSTAB_HI(as_nr), 0);
133 mmu_write(pfdev, AS_MEMATTR_LO(as_nr), 0);
134 mmu_write(pfdev, AS_MEMATTR_HI(as_nr), 0);
136 write_cmd(pfdev, as_nr, AS_COMMAND_UPDATE);
139 void panfrost_mmu_reset(struct panfrost_device *pfdev)
141 panfrost_mmu_enable(pfdev, 0);
143 mmu_write(pfdev, MMU_INT_CLEAR, ~0);
144 mmu_write(pfdev, MMU_INT_MASK, ~0);
147 static size_t get_pgsize(u64 addr, size_t size)
149 if (addr & (SZ_2M - 1) || size < SZ_2M)
155 static int mmu_map_sg(struct panfrost_device *pfdev, u64 iova,
156 int prot, struct sg_table *sgt)
159 struct scatterlist *sgl;
160 struct io_pgtable_ops *ops = pfdev->mmu->pgtbl_ops;
161 u64 start_iova = iova;
163 mutex_lock(&pfdev->mmu->lock);
165 for_each_sg(sgt->sgl, sgl, sgt->nents, count) {
166 unsigned long paddr = sg_dma_address(sgl);
167 size_t len = sg_dma_len(sgl);
169 dev_dbg(pfdev->dev, "map: iova=%llx, paddr=%lx, len=%zx", iova, paddr, len);
172 size_t pgsize = get_pgsize(iova | paddr, len);
174 ops->map(ops, iova, paddr, pgsize, prot);
181 mmu_hw_do_operation(pfdev, 0, start_iova, iova - start_iova,
182 AS_COMMAND_FLUSH_PT);
184 mutex_unlock(&pfdev->mmu->lock);
189 int panfrost_mmu_map(struct panfrost_gem_object *bo)
191 struct drm_gem_object *obj = &bo->base.base;
192 struct panfrost_device *pfdev = to_panfrost_device(obj->dev);
193 struct sg_table *sgt;
195 int prot = IOMMU_READ | IOMMU_WRITE;
197 if (WARN_ON(bo->is_mapped))
201 prot |= IOMMU_NOEXEC;
203 sgt = drm_gem_shmem_get_pages_sgt(obj);
204 if (WARN_ON(IS_ERR(sgt)))
207 ret = pm_runtime_get_sync(pfdev->dev);
211 mmu_map_sg(pfdev, bo->node.start << PAGE_SHIFT, prot, sgt);
213 pm_runtime_mark_last_busy(pfdev->dev);
214 pm_runtime_put_autosuspend(pfdev->dev);
215 bo->is_mapped = true;
220 void panfrost_mmu_unmap(struct panfrost_gem_object *bo)
222 struct drm_gem_object *obj = &bo->base.base;
223 struct panfrost_device *pfdev = to_panfrost_device(obj->dev);
224 struct io_pgtable_ops *ops = pfdev->mmu->pgtbl_ops;
225 u64 iova = bo->node.start << PAGE_SHIFT;
226 size_t len = bo->node.size << PAGE_SHIFT;
227 size_t unmapped_len = 0;
230 if (WARN_ON(!bo->is_mapped))
233 dev_dbg(pfdev->dev, "unmap: iova=%llx, len=%zx", iova, len);
235 ret = pm_runtime_get_sync(pfdev->dev);
239 mutex_lock(&pfdev->mmu->lock);
241 while (unmapped_len < len) {
242 size_t unmapped_page;
243 size_t pgsize = get_pgsize(iova, len - unmapped_len);
245 if (ops->iova_to_phys(ops, iova)) {
246 unmapped_page = ops->unmap(ops, iova, pgsize);
247 WARN_ON(unmapped_page != pgsize);
250 unmapped_len += pgsize;
253 mmu_hw_do_operation(pfdev, 0, bo->node.start << PAGE_SHIFT,
254 bo->node.size << PAGE_SHIFT, AS_COMMAND_FLUSH_PT);
256 mutex_unlock(&pfdev->mmu->lock);
258 pm_runtime_mark_last_busy(pfdev->dev);
259 pm_runtime_put_autosuspend(pfdev->dev);
260 bo->is_mapped = false;
263 static void mmu_tlb_inv_context_s1(void *cookie)
265 struct panfrost_device *pfdev = cookie;
267 mmu_hw_do_operation(pfdev, 0, 0, ~0UL, AS_COMMAND_FLUSH_MEM);
270 static void mmu_tlb_inv_range_nosync(unsigned long iova, size_t size,
271 size_t granule, bool leaf, void *cookie)
274 static void mmu_tlb_sync_context(void *cookie)
276 //struct panfrost_device *pfdev = cookie;
277 // TODO: Wait 1000 GPU cycles for HW_ISSUE_6367/T60X
280 static const struct iommu_gather_ops mmu_tlb_ops = {
281 .tlb_flush_all = mmu_tlb_inv_context_s1,
282 .tlb_add_flush = mmu_tlb_inv_range_nosync,
283 .tlb_sync = mmu_tlb_sync_context,
286 static struct drm_mm_node *addr_to_drm_mm_node(struct panfrost_device *pfdev, int as, u64 addr)
288 struct drm_mm_node *node;
289 u64 offset = addr >> PAGE_SHIFT;
291 drm_mm_for_each_node(node, &pfdev->mm) {
292 if (offset >= node->start && offset < (node->start + node->size))
298 #define NUM_FAULT_PAGES (SZ_2M / PAGE_SIZE)
300 int panfrost_mmu_map_fault_addr(struct panfrost_device *pfdev, int as, u64 addr)
303 struct drm_mm_node *node;
304 struct panfrost_gem_object *bo;
305 struct address_space *mapping;
307 struct sg_table *sgt;
310 node = addr_to_drm_mm_node(pfdev, as, addr);
314 bo = drm_mm_node_to_panfrost_bo(node);
316 dev_WARN(pfdev->dev, "matching BO is not heap type (GPU VA = %llx)",
317 node->start << PAGE_SHIFT);
320 /* Assume 2MB alignment and size multiple */
321 addr &= ~((u64)SZ_2M - 1);
322 page_offset = addr >> PAGE_SHIFT;
323 page_offset -= node->start;
325 mutex_lock(&bo->base.pages_lock);
327 if (!bo->base.pages) {
328 bo->sgts = kvmalloc_array(bo->base.base.size / SZ_2M,
329 sizeof(struct sg_table), GFP_KERNEL | __GFP_ZERO);
333 pages = kvmalloc_array(bo->base.base.size >> PAGE_SHIFT,
334 sizeof(struct page *), GFP_KERNEL | __GFP_ZERO);
340 bo->base.pages = pages;
341 bo->base.pages_use_count = 1;
343 pages = bo->base.pages;
345 mapping = bo->base.base.filp->f_mapping;
346 mapping_set_unevictable(mapping);
348 for (i = page_offset; i < page_offset + NUM_FAULT_PAGES; i++) {
349 pages[i] = shmem_read_mapping_page(mapping, i);
350 if (IS_ERR(pages[i])) {
351 mutex_unlock(&bo->base.pages_lock);
352 ret = PTR_ERR(pages[i]);
357 mutex_unlock(&bo->base.pages_lock);
359 sgt = &bo->sgts[page_offset / (SZ_2M / PAGE_SIZE)];
360 ret = sg_alloc_table_from_pages(sgt, pages + page_offset,
361 NUM_FAULT_PAGES, 0, SZ_2M, GFP_KERNEL);
365 if (!dma_map_sg(pfdev->dev, sgt->sgl, sgt->nents, DMA_BIDIRECTIONAL)) {
370 mmu_map_sg(pfdev, addr, IOMMU_WRITE | IOMMU_READ | IOMMU_NOEXEC, sgt);
372 bo->is_mapped = true;
374 dev_dbg(pfdev->dev, "mapped page fault @ %llx", addr);
381 drm_gem_shmem_put_pages(&bo->base);
385 static const char *access_type_name(struct panfrost_device *pfdev,
388 switch (fault_status & AS_FAULTSTATUS_ACCESS_TYPE_MASK) {
389 case AS_FAULTSTATUS_ACCESS_TYPE_ATOMIC:
390 if (panfrost_has_hw_feature(pfdev, HW_FEATURE_AARCH64_MMU))
394 case AS_FAULTSTATUS_ACCESS_TYPE_READ:
396 case AS_FAULTSTATUS_ACCESS_TYPE_WRITE:
398 case AS_FAULTSTATUS_ACCESS_TYPE_EX:
406 static irqreturn_t panfrost_mmu_irq_handler(int irq, void *data)
408 struct panfrost_device *pfdev = data;
410 if (!mmu_read(pfdev, MMU_INT_STAT))
413 mmu_write(pfdev, MMU_INT_MASK, 0);
414 return IRQ_WAKE_THREAD;
417 static irqreturn_t panfrost_mmu_irq_handler_thread(int irq, void *data)
419 struct panfrost_device *pfdev = data;
420 u32 status = mmu_read(pfdev, MMU_INT_RAWSTAT);
423 for (i = 0; status; i++) {
424 u32 mask = BIT(i) | BIT(i + 16);
431 if (!(status & mask))
434 fault_status = mmu_read(pfdev, AS_FAULTSTATUS(i));
435 addr = mmu_read(pfdev, AS_FAULTADDRESS_LO(i));
436 addr |= (u64)mmu_read(pfdev, AS_FAULTADDRESS_HI(i)) << 32;
438 /* decode the fault status */
439 exception_type = fault_status & 0xFF;
440 access_type = (fault_status >> 8) & 0x3;
441 source_id = (fault_status >> 16);
443 /* Page fault only */
444 if ((status & mask) == BIT(i)) {
445 WARN_ON(exception_type < 0xC1 || exception_type > 0xC4);
447 ret = panfrost_mmu_map_fault_addr(pfdev, i, addr);
449 mmu_write(pfdev, MMU_INT_CLEAR, BIT(i));
455 /* terminal fault, print info about the fault */
457 "Unhandled Page fault in AS%d at VA 0x%016llX\n"
459 "raw fault status: 0x%X\n"
460 "decoded fault status: %s\n"
461 "exception type 0x%X: %s\n"
462 "access type 0x%X: %s\n"
467 (fault_status & (1 << 10) ? "DECODER FAULT" : "SLAVE FAULT"),
468 exception_type, panfrost_exception_name(pfdev, exception_type),
469 access_type, access_type_name(pfdev, fault_status),
472 mmu_write(pfdev, MMU_INT_CLEAR, mask);
477 mmu_write(pfdev, MMU_INT_MASK, ~0);
481 int panfrost_mmu_init(struct panfrost_device *pfdev)
483 struct io_pgtable_ops *pgtbl_ops;
486 pfdev->mmu = devm_kzalloc(pfdev->dev, sizeof(*pfdev->mmu), GFP_KERNEL);
490 mutex_init(&pfdev->mmu->lock);
492 irq = platform_get_irq_byname(to_platform_device(pfdev->dev), "mmu");
496 err = devm_request_threaded_irq(pfdev->dev, irq, panfrost_mmu_irq_handler,
497 panfrost_mmu_irq_handler_thread,
498 IRQF_SHARED, "mmu", pfdev);
501 dev_err(pfdev->dev, "failed to request mmu irq");
504 pfdev->mmu->pgtbl_cfg = (struct io_pgtable_cfg) {
505 .pgsize_bitmap = SZ_4K | SZ_2M,
506 .ias = FIELD_GET(0xff, pfdev->features.mmu_features),
507 .oas = FIELD_GET(0xff00, pfdev->features.mmu_features),
509 .iommu_dev = pfdev->dev,
512 pgtbl_ops = alloc_io_pgtable_ops(ARM_MALI_LPAE, &pfdev->mmu->pgtbl_cfg,
517 pfdev->mmu->pgtbl_ops = pgtbl_ops;
519 panfrost_mmu_enable(pfdev, 0);
524 void panfrost_mmu_fini(struct panfrost_device *pfdev)
526 mmu_write(pfdev, MMU_INT_MASK, 0);
527 mmu_disable(pfdev, 0);
529 free_io_pgtable_ops(pfdev->mmu->pgtbl_ops);