mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 10:09:10 +02:00
drm/panthor: Group panthor_kernel_bo_xxx() helpers
Move all panthor_kernel_bo_xxx() helpers at the end of the file, just before the debugfs init logic. This will make further panthor_gem.c refactoring more readable. v2: - Collect R-bs v3: - No changes v4: - No changes v5: - No changes v6: - No changes v7: - No changes Reviewed-by: Liviu Dudau <liviu.dudau@arm.com> Reviewed-by: Steven Price <steven.price@arm.com> Link: https://patch.msgid.link/20260401134854.2275433-5-boris.brezillon@collabora.com Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
This commit is contained in:
parent
cf91128f3d
commit
f36adaaf3d
|
|
@ -132,112 +132,6 @@ static void panthor_gem_free_object(struct drm_gem_object *obj)
|
|||
drm_gem_object_put(vm_root_gem);
|
||||
}
|
||||
|
||||
/**
|
||||
* panthor_kernel_bo_destroy() - Destroy a kernel buffer object
|
||||
* @bo: Kernel buffer object to destroy. If NULL or an ERR_PTR(), the destruction
|
||||
* is skipped.
|
||||
*/
|
||||
void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo)
|
||||
{
|
||||
struct panthor_vm *vm;
|
||||
|
||||
if (IS_ERR_OR_NULL(bo))
|
||||
return;
|
||||
|
||||
vm = bo->vm;
|
||||
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));
|
||||
panthor_vm_unmap_range(vm, bo->va_node.start, bo->va_node.size);
|
||||
panthor_vm_free_va(vm, &bo->va_node);
|
||||
drm_gem_object_put(bo->obj);
|
||||
panthor_vm_put(vm);
|
||||
kfree(bo);
|
||||
}
|
||||
|
||||
/**
|
||||
* panthor_kernel_bo_create() - Create and map a GEM object to a VM
|
||||
* @ptdev: Device.
|
||||
* @vm: VM to map the GEM to. If NULL, the kernel object is not GPU mapped.
|
||||
* @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 drm_gem_shmem_object *obj;
|
||||
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);
|
||||
|
||||
obj = drm_gem_shmem_create(&ptdev->base, size);
|
||||
if (IS_ERR(obj)) {
|
||||
ret = PTR_ERR(obj);
|
||||
goto err_free_bo;
|
||||
}
|
||||
|
||||
bo = to_panthor_bo(&obj->base);
|
||||
kbo->obj = &obj->base;
|
||||
bo->flags = bo_flags;
|
||||
bo->base.map_wc = should_map_wc(bo, vm);
|
||||
bo->exclusive_vm_root_gem = panthor_vm_root_gem(vm);
|
||||
drm_gem_object_get(bo->exclusive_vm_root_gem);
|
||||
bo->base.base.resv = bo->exclusive_vm_root_gem->resv;
|
||||
|
||||
if (vm == panthor_fw_vm(ptdev))
|
||||
debug_flags |= PANTHOR_DEBUGFS_GEM_USAGE_FLAG_FW_MAPPED;
|
||||
|
||||
panthor_gem_kernel_bo_set_label(kbo, name);
|
||||
panthor_gem_debugfs_set_usage_flags(to_panthor_bo(kbo->obj), debug_flags);
|
||||
|
||||
/* 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);
|
||||
if (ret)
|
||||
goto err_put_obj;
|
||||
|
||||
ret = panthor_vm_map_bo_range(vm, bo, 0, size, kbo->va_node.start, vm_map_flags);
|
||||
if (ret)
|
||||
goto err_free_va;
|
||||
|
||||
kbo->vm = panthor_vm_get(vm);
|
||||
return kbo;
|
||||
|
||||
err_free_va:
|
||||
panthor_vm_free_va(vm, &kbo->va_node);
|
||||
|
||||
err_put_obj:
|
||||
drm_gem_object_put(&obj->base);
|
||||
|
||||
err_free_bo:
|
||||
kfree(kbo);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
static struct sg_table *
|
||||
panthor_gem_prime_map_dma_buf(struct dma_buf_attachment *attach,
|
||||
enum dma_data_direction dir)
|
||||
|
|
@ -603,6 +497,112 @@ panthor_gem_sync(struct drm_gem_object *obj, u32 type,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* panthor_kernel_bo_destroy() - Destroy a kernel buffer object
|
||||
* @bo: Kernel buffer object to destroy. If NULL or an ERR_PTR(), the destruction
|
||||
* is skipped.
|
||||
*/
|
||||
void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo)
|
||||
{
|
||||
struct panthor_vm *vm;
|
||||
|
||||
if (IS_ERR_OR_NULL(bo))
|
||||
return;
|
||||
|
||||
vm = bo->vm;
|
||||
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));
|
||||
panthor_vm_unmap_range(vm, bo->va_node.start, bo->va_node.size);
|
||||
panthor_vm_free_va(vm, &bo->va_node);
|
||||
drm_gem_object_put(bo->obj);
|
||||
panthor_vm_put(vm);
|
||||
kfree(bo);
|
||||
}
|
||||
|
||||
/**
|
||||
* panthor_kernel_bo_create() - Create and map a GEM object to a VM
|
||||
* @ptdev: Device.
|
||||
* @vm: VM to map the GEM to. If NULL, the kernel object is not GPU mapped.
|
||||
* @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 drm_gem_shmem_object *obj;
|
||||
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);
|
||||
|
||||
obj = drm_gem_shmem_create(&ptdev->base, size);
|
||||
if (IS_ERR(obj)) {
|
||||
ret = PTR_ERR(obj);
|
||||
goto err_free_bo;
|
||||
}
|
||||
|
||||
bo = to_panthor_bo(&obj->base);
|
||||
kbo->obj = &obj->base;
|
||||
bo->flags = bo_flags;
|
||||
bo->base.map_wc = should_map_wc(bo, vm);
|
||||
bo->exclusive_vm_root_gem = panthor_vm_root_gem(vm);
|
||||
drm_gem_object_get(bo->exclusive_vm_root_gem);
|
||||
bo->base.base.resv = bo->exclusive_vm_root_gem->resv;
|
||||
|
||||
if (vm == panthor_fw_vm(ptdev))
|
||||
debug_flags |= PANTHOR_DEBUGFS_GEM_USAGE_FLAG_FW_MAPPED;
|
||||
|
||||
panthor_gem_kernel_bo_set_label(kbo, name);
|
||||
panthor_gem_debugfs_set_usage_flags(to_panthor_bo(kbo->obj), debug_flags);
|
||||
|
||||
/* 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);
|
||||
if (ret)
|
||||
goto err_put_obj;
|
||||
|
||||
ret = panthor_vm_map_bo_range(vm, bo, 0, size, kbo->va_node.start, vm_map_flags);
|
||||
if (ret)
|
||||
goto err_free_va;
|
||||
|
||||
kbo->vm = panthor_vm_get(vm);
|
||||
return kbo;
|
||||
|
||||
err_free_va:
|
||||
panthor_vm_free_va(vm, &kbo->va_node);
|
||||
|
||||
err_put_obj:
|
||||
drm_gem_object_put(&obj->base);
|
||||
|
||||
err_free_bo:
|
||||
kfree(kbo);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct gem_size_totals {
|
||||
size_t size;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user