On 18/02/2024 21:41, Boris Brezillon wrote: > MMU and VM management is related and placed in the same source file. > > Page table updates are delegated to the io-pgtable-arm driver that's in > the iommu subsystem. > > The VM management logic is based on drm_gpuva_mgr, and is assuming the > VA space is mostly managed by the usermode driver, except for a reserved > portion of this VA-space that's used for kernel objects (like the heap > contexts/chunks). > > Both asynchronous and synchronous VM operations are supported, and > internal helpers are exposed to allow other logical blocks to map their > buffers in the GPU VA space. > > There's one VM_BIND queue per-VM (meaning the Vulkan driver can only > expose one sparse-binding queue), and this bind queue is managed with > a 1:1 drm_sched_entity:drm_gpu_scheduler, such that each VM gets its own > independent execution queue, avoiding VM operation serialization at the > device level (things are still serialized at the VM level). > > The rest is just implementation details that are hopefully well explained > in the documentation. > > v5: > - Fix a double panthor_vm_cleanup_op_ctx() call > - Fix a race between panthor_vm_prepare_map_op_ctx() and > panthor_vm_bo_put() > - Fix panthor_vm_pool_destroy_vm() kernel doc > - Fix paddr adjustment in panthor_vm_map_pages() > - Fix bo_offset calculation in panthor_vm_get_bo_for_va() > > v4: > - Add an helper to return the VM state > - Check drmm_mutex_init() return code > - Remove the VM from the AS reclaim list when panthor_vm_active() is > called > - Count the number of active VM users instead of considering there's > at most one user (several scheduling groups can point to the same > vM) > - Pre-allocate a VMA object for unmap operations (unmaps can trigger > a sm_step_remap() call) > - Check vm->root_page_table instead of vm->pgtbl_ops to detect if > the io-pgtable is trying to allocate the root page table > - Don't memset() the va_node in panthor_vm_alloc_va(), make it a > caller requirement > - Fix the kernel doc in a few places > - Drop the panthor_vm::base offset constraint and modify > panthor_vm_put() to explicitly check for a NULL value > - Fix unbalanced vm_bo refcount in panthor_gpuva_sm_step_remap() > - Drop stale comments about the shared_bos list > - Patch mmu_features::va_bits on 32-bit builds to reflect the > io_pgtable limitation and let the UMD know about it > > v3: > - Add acks for the MIT/GPL2 relicensing > - Propagate MMU faults to the scheduler > - Move pages pinning/unpinning out of the dma_signalling path > - Fix 32-bit support > - Rework the user/kernel VA range calculation > - Make the auto-VA range explicit (auto-VA range doesn't cover the full > kernel-VA range on the MCU VM) > - Let callers of panthor_vm_alloc_va() allocate the drm_mm_node > (embedded in panthor_kernel_bo now) > - Adjust things to match the latest drm_gpuvm changes (extobj tracking, > resv prep and more) > - Drop the per-AS lock and use slots_lock (fixes a race on vm->as.id) > - Set as.id to -1 when reusing an address space from the LRU list > - Drop misleading comment about page faults > - Remove check for irq being assigned in panthor_mmu_unplug() > > Co-developed-by: Steven Price <steven.price@xxxxxxx> > Signed-off-by: Steven Price <steven.price@xxxxxxx> > Signed-off-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx> > Acked-by: Steven Price <steven.price@xxxxxxx> # MIT+GPL2 relicensing,Arm > Acked-by: Grant Likely <grant.likely@xxxxxxxxxx> # MIT+GPL2 relicensing,Linaro > Acked-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx> # MIT+GPL2 relicensing,Collabora LGTM Reviewed-by: Steven Price <steven.price@xxxxxxx> Thanks, Stev