• Boris Brezillon's avatar
    drm/panthor: Add the MMU/VM logical block · 647810ec
    Boris Brezillon authored
    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.
    
    v6:
    - Add Maxime's and Heiko's acks
    - Add Steve's R-b
    - Adjust the TRANSCFG value to account for SW VA space limitation on
      32-bit systems
    - Keep header inclusion alphabetically ordered
    
    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: default avatarSteven Price <steven.price@arm.com>
    Signed-off-by: default avatarSteven Price <steven.price@arm.com>
    Signed-off-by: default avatarBoris Brezillon <boris.brezillon@collabora.com>
    Acked-by: Steven Price <steven.price@arm.com> # MIT+GPL2 relicensing,Arm
    Acked-by: Grant Likely <grant.likely@linaro.org> # MIT+GPL2 relicensing,Linaro
    Acked-by: Boris Brezillon <boris.brezillon@collabora.com> # MIT+GPL2 relicensing,Collabora
    Reviewed-by: default avatarSteven Price <steven.price@arm.com>
    Acked-by: default avatarMaxime Ripard <mripard@kernel.org>
    Acked-by: default avatarHeiko Stuebner <heiko@sntech.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20240229162230.2634044-8-boris.brezillon@collabora.com
    647810ec
panthor_mmu.h 3.7 KB