drm/imagination: Add GEM and VM related code
authorDonald Robson <donald.robson@imgtec.com>
Wed, 22 Nov 2023 16:34:32 +0000 (16:34 +0000)
committerMaxime Ripard <mripard@kernel.org>
Thu, 23 Nov 2023 08:01:46 +0000 (09:01 +0100)
commitff5f643de0bf27874c4033cd57a0bd034b5c7d11
tree9bd0053f57cc211aa6753f73bc9181d5559f505e
parentf99f5f3ea7efd54ba0529c4f2d7c72712918a522
drm/imagination: Add GEM and VM related code

Add a GEM implementation based on drm_gem_shmem, and support code for the
PowerVR GPU MMU. The GPU VA manager is used for address space management.

Changes since v8:
- Updated for changes to drm_gpuvm
- Switched to dma_resv locking for vm ops
- Removed linked lists for collecting BOs in vm_context and for freeing
  after ops. This is now done internally in drm_gpuvm
- Corrected license identifiers

Changes since v7:
- kernel-doc fixes
- Remove prefixes from DRM_PVR_BO_* flags
- CREATE_BO ioctl now returns an error if provided size isn't page aligned
- Optimised MMU flushes

Changes since v6:
- Don't initialise kernel_vm_ctx when using MIPS firmware processor
- Rename drm_gpuva_manager uses to drm_gpuvm
- Sync GEM object to device on creation

Changes since v5:
- Use WRITE_ONCE() when writing to page tables
- Add memory barriers to page table insertion
- Fixed double backing page alloc on page table objects
- Fix BO mask checks in DRM_IOCTL_PVR_CREATE_BO handler
- Document use of pvr_page_table_*_idx when preallocing page table objs
- Remove pvr_vm_gpuva_mapping_init()
- Remove NULL check for unmap op in remap function
- Protect gem object with mutex during drm_gpuva_link/unlink
- Defer free or release of page table pages until after TLB flush
- Use drm_gpuva_op_remap_get_unmap_range() helper

Changes since v4:
- Correct sync function in vmap/vunmap function documentation
- Update for upstream GPU VA manager
- Fix missing frees when unmapping drm_gpuva objects
- Always zero GEM BOs on creation

Changes since v3:
- Split MMU and VM code
- Register page table allocations with kmemleak
- Use drm_dev_{enter,exit}

Changes since v2:
- Use GPU VA manager
- Use drm_gem_shmem

Co-developed-by: Matt Coster <matt.coster@imgtec.com>
Signed-off-by: Matt Coster <matt.coster@imgtec.com>
Co-developed-by: Donald Robson <donald.robson@imgtec.com>
Signed-off-by: Donald Robson <donald.robson@imgtec.com>
Signed-off-by: Sarah Walker <sarah.walker@imgtec.com>
Link: https://lore.kernel.org/r/3c96dd170efe759b73897e3675d7310a7c4b06d0.1700668843.git.donald.robson@imgtec.com
Signed-off-by: Maxime Ripard <mripard@kernel.org>
drivers/gpu/drm/imagination/Kconfig
drivers/gpu/drm/imagination/Makefile
drivers/gpu/drm/imagination/pvr_device.c
drivers/gpu/drm/imagination/pvr_device.h
drivers/gpu/drm/imagination/pvr_drv.c
drivers/gpu/drm/imagination/pvr_gem.c [new file with mode: 0644]
drivers/gpu/drm/imagination/pvr_gem.h [new file with mode: 0644]
drivers/gpu/drm/imagination/pvr_mmu.c [new file with mode: 0644]
drivers/gpu/drm/imagination/pvr_mmu.h [new file with mode: 0644]
drivers/gpu/drm/imagination/pvr_vm.c [new file with mode: 0644]
drivers/gpu/drm/imagination/pvr_vm.h [new file with mode: 0644]