On Mon, 12 Oct 2026 14:59:37 +0200 Ketil Johnsen <[email protected]> wrote:
> 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))); Let's create local vars so this can all fit on a single line. > 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); 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_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,
