Lines Matching full:mmu
34 /* Wait for the MMU status to indicate there is no active command, in in wait_ready()
52 /* write AS_COMMAND when MMU is ready to accept another command */ in write_cmd()
89 /* Run the MMU operation */ in mmu_hw_do_operation_locked()
97 struct panfrost_mmu *mmu, in mmu_hw_do_operation() argument
103 ret = mmu_hw_do_operation_locked(pfdev, mmu->as, iova, size, op); in mmu_hw_do_operation()
108 static void panfrost_mmu_enable(struct panfrost_device *pfdev, struct panfrost_mmu *mmu) in panfrost_mmu_enable() argument
110 int as_nr = mmu->as; in panfrost_mmu_enable()
111 struct io_pgtable_cfg *cfg = &mmu->pgtbl_cfg; in panfrost_mmu_enable()
142 u32 panfrost_mmu_as_get(struct panfrost_device *pfdev, struct panfrost_mmu *mmu) in panfrost_mmu_as_get() argument
148 as = mmu->as; in panfrost_mmu_as_get()
150 int en = atomic_inc_return(&mmu->as_count); in panfrost_mmu_as_get()
159 list_move(&mmu->list, &pfdev->as_lru_list); in panfrost_mmu_as_get()
162 /* Unhandled pagefault on this AS, the MMU was in panfrost_mmu_as_get()
163 * disabled. We need to re-enable the MMU after in panfrost_mmu_as_get()
169 panfrost_mmu_enable(pfdev, mmu); in panfrost_mmu_as_get()
194 mmu->as = as; in panfrost_mmu_as_get()
196 atomic_set(&mmu->as_count, 1); in panfrost_mmu_as_get()
197 list_add(&mmu->list, &pfdev->as_lru_list); in panfrost_mmu_as_get()
199 dev_dbg(pfdev->dev, "Assigned AS%d to mmu %p, alloc_mask=%lx", as, mmu, pfdev->as_alloc_mask); in panfrost_mmu_as_get()
201 panfrost_mmu_enable(pfdev, mmu); in panfrost_mmu_as_get()
208 void panfrost_mmu_as_put(struct panfrost_device *pfdev, struct panfrost_mmu *mmu) in panfrost_mmu_as_put() argument
210 atomic_dec(&mmu->as_count); in panfrost_mmu_as_put()
211 WARN_ON(atomic_read(&mmu->as_count) < 0); in panfrost_mmu_as_put()
216 struct panfrost_mmu *mmu, *mmu_tmp; in panfrost_mmu_reset() local
223 list_for_each_entry_safe(mmu, mmu_tmp, &pfdev->as_lru_list, list) { in panfrost_mmu_reset()
224 mmu->as = -1; in panfrost_mmu_reset()
225 atomic_set(&mmu->as_count, 0); in panfrost_mmu_reset()
226 list_del_init(&mmu->list); in panfrost_mmu_reset()
244 struct panfrost_mmu *mmu, in panfrost_mmu_flush_range() argument
247 if (mmu->as < 0) in panfrost_mmu_flush_range()
254 mmu_hw_do_operation(pfdev, mmu, iova, size, AS_COMMAND_FLUSH_PT); in panfrost_mmu_flush_range()
259 static int mmu_map_sg(struct panfrost_device *pfdev, struct panfrost_mmu *mmu, in mmu_map_sg() argument
264 struct io_pgtable_ops *ops = mmu->pgtbl_ops; in mmu_map_sg()
271 dev_dbg(pfdev->dev, "map: as=%d, iova=%llx, paddr=%lx, len=%zx", mmu->as, iova, paddr, len); in mmu_map_sg()
283 panfrost_mmu_flush_range(pfdev, mmu, start_iova, iova - start_iova); in mmu_map_sg()
306 mmu_map_sg(pfdev, mapping->mmu, mapping->mmnode.start << PAGE_SHIFT, in panfrost_mmu_map()
318 struct io_pgtable_ops *ops = mapping->mmu->pgtbl_ops; in panfrost_mmu_unmap()
327 mapping->mmu->as, iova, len); in panfrost_mmu_unmap()
341 panfrost_mmu_flush_range(pfdev, mapping->mmu, in panfrost_mmu_unmap()
351 //struct panfrost_mmu *mmu = cookie; in mmu_tlb_sync_context()
372 struct panfrost_mmu *mmu; in addr_to_mapping() local
375 list_for_each_entry(mmu, &pfdev->as_lru_list, list) { in addr_to_mapping()
376 if (as == mmu->as) in addr_to_mapping()
383 spin_lock(&mmu->mm_lock); in addr_to_mapping()
385 drm_mm_for_each_node(node, &mmu->mm) { in addr_to_mapping()
395 spin_unlock(&mmu->mm_lock); in addr_to_mapping()
425 WARN_ON(bomapping->mmu->as != as); in panfrost_mmu_map_fault_addr()
487 mmu_map_sg(pfdev, bomapping->mmu, addr, in panfrost_mmu_map_fault_addr()
510 struct panfrost_mmu *mmu = container_of(kref, struct panfrost_mmu, in panfrost_mmu_release_ctx() local
512 struct panfrost_device *pfdev = mmu->pfdev; in panfrost_mmu_release_ctx()
515 if (mmu->as >= 0) { in panfrost_mmu_release_ctx()
518 panfrost_mmu_disable(pfdev, mmu->as); in panfrost_mmu_release_ctx()
521 clear_bit(mmu->as, &pfdev->as_alloc_mask); in panfrost_mmu_release_ctx()
522 clear_bit(mmu->as, &pfdev->as_in_use_mask); in panfrost_mmu_release_ctx()
523 list_del(&mmu->list); in panfrost_mmu_release_ctx()
527 free_io_pgtable_ops(mmu->pgtbl_ops); in panfrost_mmu_release_ctx()
528 drm_mm_takedown(&mmu->mm); in panfrost_mmu_release_ctx()
529 kfree(mmu); in panfrost_mmu_release_ctx()
532 void panfrost_mmu_ctx_put(struct panfrost_mmu *mmu) in panfrost_mmu_ctx_put() argument
534 kref_put(&mmu->refcount, panfrost_mmu_release_ctx); in panfrost_mmu_ctx_put()
537 struct panfrost_mmu *panfrost_mmu_ctx_get(struct panfrost_mmu *mmu) in panfrost_mmu_ctx_get() argument
539 kref_get(&mmu->refcount); in panfrost_mmu_ctx_get()
541 return mmu; in panfrost_mmu_ctx_get()
572 struct panfrost_mmu *mmu; in panfrost_mmu_ctx_create() local
574 mmu = kzalloc(sizeof(*mmu), GFP_KERNEL); in panfrost_mmu_ctx_create()
575 if (!mmu) in panfrost_mmu_ctx_create()
578 mmu->pfdev = pfdev; in panfrost_mmu_ctx_create()
579 spin_lock_init(&mmu->mm_lock); in panfrost_mmu_ctx_create()
582 drm_mm_init(&mmu->mm, SZ_32M >> PAGE_SHIFT, (SZ_4G - SZ_32M) >> PAGE_SHIFT); in panfrost_mmu_ctx_create()
583 mmu->mm.color_adjust = panfrost_drm_mm_color_adjust; in panfrost_mmu_ctx_create()
585 INIT_LIST_HEAD(&mmu->list); in panfrost_mmu_ctx_create()
586 mmu->as = -1; in panfrost_mmu_ctx_create()
588 mmu->pgtbl_cfg = (struct io_pgtable_cfg) { in panfrost_mmu_ctx_create()
597 mmu->pgtbl_ops = alloc_io_pgtable_ops(ARM_MALI_LPAE, &mmu->pgtbl_cfg, in panfrost_mmu_ctx_create()
598 mmu); in panfrost_mmu_ctx_create()
599 if (!mmu->pgtbl_ops) { in panfrost_mmu_ctx_create()
600 kfree(mmu); in panfrost_mmu_ctx_create()
604 kref_init(&mmu->refcount); in panfrost_mmu_ctx_create()
606 return mmu; in panfrost_mmu_ctx_create()
691 /* Ignore MMU interrupts on this AS until it's been in panfrost_mmu_irq_handler_thread()
696 /* Disable the MMU to kill jobs on this AS. */ in panfrost_mmu_irq_handler_thread()
703 /* If we received new MMU interrupts, process them before returning. */ in panfrost_mmu_irq_handler_thread()
719 irq = platform_get_irq_byname(to_platform_device(pfdev->dev), "mmu"); in panfrost_mmu_init()
726 IRQF_SHARED, KBUILD_MODNAME "-mmu", in panfrost_mmu_init()
730 dev_err(pfdev->dev, "failed to request mmu irq"); in panfrost_mmu_init()