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

Reply via email to