From: Boris Brezillon <[email protected]> Refactors/splits existing panthor_kernel_bo_create(). Adds panthor_kernel_bo_create_from_gem() so we can create kernel BOs from imported protected memory in future change.
Signed-off-by: Boris Brezillon <[email protected]> Co-developed-by: Ketil Johnsen <[email protected]> Signed-off-by: Ketil Johnsen <[email protected]> --- v4: - First version of this change as a separate commit --- drivers/gpu/drm/panthor/panthor_gem.c | 94 ++++++++++++++++++--------- drivers/gpu/drm/panthor/panthor_gem.h | 7 ++ 2 files changed, 71 insertions(+), 30 deletions(-) diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c index 2e39a32fcd673..f1939b4aafed1 100644 --- a/drivers/gpu/drm/panthor/panthor_gem.c +++ b/drivers/gpu/drm/panthor/panthor_gem.c @@ -1033,7 +1033,6 @@ panthor_gem_create(struct drm_device *dev, size_t size, uint32_t flags, bo->base.resv = bo->exclusive_vm_root_gem->resv; } - panthor_gem_debugfs_add_usage_flags(bo, usage_flags); panthor_gem_debugfs_bo_add(bo); return bo; @@ -1260,7 +1259,9 @@ void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo) panthor_kernel_bo_vunmap(bo); drm_WARN_ON(bo->obj->dev, - to_panthor_bo(bo->obj)->exclusive_vm_root_gem != panthor_vm_root_gem(vm)); + to_panthor_bo(bo->obj)->exclusive_vm_root_gem && + (to_panthor_bo(bo->obj)->exclusive_vm_root_gem != + panthor_vm_root_gem(vm))); panthor_vm_unmap_range(vm, bo->va_node.start, bo->va_node.size); panthor_vm_free_va(vm, &bo->va_node); if (vm == panthor_fw_vm(ptdev)) @@ -1271,46 +1272,33 @@ void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo) } /** - * panthor_kernel_bo_create() - Create and map a GEM object to a VM + * panthor_kernel_bo_create_from_gem() - Create kernel BO from existing GEM object * @ptdev: Device. * @vm: VM to map the GEM to. - * @size: Size of the buffer object. - * @bo_flags: Combination of drm_panthor_bo_flags flags. + * @bo: BO to use for our kernel BO. * @vm_map_flags: Combination of drm_panthor_vm_bind_op_flags (only those * that are related to map operations). * @gpu_va: GPU address assigned when mapping to the VM. * If gpu_va == PANTHOR_VM_KERNEL_AUTO_VA, the virtual address will be * automatically allocated. - * @name: Descriptive label of the BO's contents + * @vm_map_size: Size of the BO to map to the VM. * * Return: A valid pointer in case of success, an ERR_PTR() otherwise. */ struct panthor_kernel_bo * -panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, - size_t size, u32 bo_flags, u32 vm_map_flags, - u64 gpu_va, const char *name) +panthor_kernel_bo_create_from_gem(struct panthor_device *ptdev, + struct panthor_vm *vm, + struct panthor_gem_object *bo, + u32 vm_map_flags, u64 gpu_va, u32 vm_map_size) { struct panthor_kernel_bo *kbo; - struct panthor_gem_object *bo; - u32 debug_flags = PANTHOR_DEBUGFS_GEM_USAGE_FLAG_KERNEL; int ret; - if (drm_WARN_ON(&ptdev->base, !vm)) - return ERR_PTR(-EINVAL); - kbo = kzalloc_obj(*kbo); if (!kbo) return ERR_PTR(-ENOMEM); - if (vm == panthor_fw_vm(ptdev)) - debug_flags |= PANTHOR_DEBUGFS_GEM_USAGE_FLAG_FW_MAPPED; - - bo = panthor_gem_create(&ptdev->base, size, bo_flags, vm, debug_flags); - if (IS_ERR(bo)) { - ret = PTR_ERR(bo); - goto err_free_kbo; - } - + drm_gem_object_get(&bo->base); kbo->obj = &bo->base; if (vm == panthor_fw_vm(ptdev)) { @@ -1319,24 +1307,27 @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, goto err_put_obj; } - panthor_gem_kernel_bo_set_label(kbo, name); - /* The system and GPU MMU page size might differ, which becomes a * problem for FW sections that need to be mapped at explicit address * since our PAGE_SIZE alignment might cover a VA range that's * expected to be used for another section. * Make sure we never map more than we need. */ - size = ALIGN(size, panthor_vm_page_size(vm)); - ret = panthor_vm_alloc_va(vm, gpu_va, size, &kbo->va_node); + vm_map_size = ALIGN(vm_map_size, panthor_vm_page_size(vm)); + ret = panthor_vm_alloc_va(vm, gpu_va, vm_map_size, &kbo->va_node); if (ret) goto err_unpin; - ret = panthor_vm_map_bo_range(vm, bo, 0, size, kbo->va_node.start, vm_map_flags); + ret = panthor_vm_map_bo_range(vm, bo, 0, vm_map_size, + kbo->va_node.start, vm_map_flags); if (ret) goto err_free_va; kbo->vm = panthor_vm_get(vm); + if (vm == panthor_fw_vm(ptdev)) + panthor_gem_debugfs_add_usage_flags( + bo, PANTHOR_DEBUGFS_GEM_USAGE_FLAG_FW_MAPPED); + return kbo; err_free_va: @@ -1348,12 +1339,55 @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, err_put_obj: drm_gem_object_put(&bo->base); - -err_free_kbo: kfree(kbo); return ERR_PTR(ret); } +/** + * panthor_kernel_bo_create() - Create and map a GEM object to a VM + * @ptdev: Device. + * @vm: VM to map the GEM to. + * @size: Size of the buffer object. + * @bo_flags: Combination of drm_panthor_bo_flags flags. + * @vm_map_flags: Combination of drm_panthor_vm_bind_op_flags (only those + * that are related to map operations). + * @gpu_va: GPU address assigned when mapping to the VM. + * If gpu_va == PANTHOR_VM_KERNEL_AUTO_VA, the virtual address will be + * automatically allocated. + * @name: Descriptive label of the BO's contents + * + * Return: A valid pointer in case of success, an ERR_PTR() otherwise. + */ +struct panthor_kernel_bo * +panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, + size_t size, u32 bo_flags, u32 vm_map_flags, + u64 gpu_va, const char *name) +{ + struct panthor_kernel_bo *kbo; + struct panthor_gem_object *bo; + + if (drm_WARN_ON(&ptdev->base, !vm)) + return ERR_PTR(-EINVAL); + + bo = panthor_gem_create(&ptdev->base, size, bo_flags, vm, 0); + if (IS_ERR(bo)) + return ERR_CAST(bo); + + kbo = panthor_kernel_bo_create_from_gem(ptdev, vm, bo, vm_map_flags, + gpu_va, size); + if (!IS_ERR(kbo)) { + panthor_gem_debugfs_add_usage_flags( + bo, PANTHOR_DEBUGFS_GEM_USAGE_FLAG_KERNEL); + panthor_gem_kernel_bo_set_label(kbo, name); + } + + /* panthor_kernel_bo_create_from_gem() acquires a GEM ref if the import + * succeeds, so we can release it unconditionally here. + */ + drm_gem_object_put(&bo->base); + return kbo; +} + /** * panthor_dummy_bo_create() - Create a Panthor BO meant to back sparse bindings. * @ptdev: Device. diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h index 4da3f59693ce4..03dd3927b5d16 100644 --- a/drivers/gpu/drm/panthor/panthor_gem.h +++ b/drivers/gpu/drm/panthor/panthor_gem.h @@ -318,6 +318,13 @@ panthor_kernel_bo_vunmap(struct panthor_kernel_bo *bo) } } +struct panthor_kernel_bo * +panthor_kernel_bo_create_from_gem(struct panthor_device *ptdev, + struct panthor_vm *vm, + struct panthor_gem_object *bo, + u32 vm_map_flags, u64 gpu_va, + u32 vm_map_size); + struct panthor_kernel_bo * panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, size_t size, u32 bo_flags, u32 vm_map_flags, -- 2.43.0
