summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
index f82a2dd83874..7eed523bf28f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
@@ -62,6 +62,39 @@ static int amdgpu_bo_list_create(struct amdgpu_fpriv *fpriv,
return 0;
}
+struct amdgpu_bo_list *
+amdgpu_bo_list_clone(struct amdgpu_bo_list *list)
+{
+ struct amdgpu_bo_list *result;
+ unsigned i;
+
+ result = kmalloc(sizeof(struct amdgpu_bo_list), GFP_KERNEL);
+ if (!result)
+ return NULL;
+
+ result->array = drm_calloc_large(list->num_entries,
+ sizeof(struct amdgpu_bo_list_entry));
+ if (!result->array) {
+ kfree(result);
+ return NULL;
+ }
+
+ mutex_init(&result->lock);
+ result->gds_obj = list->gds_obj;
+ result->gws_obj = list->gws_obj;
+ result->oa_obj = list->oa_obj;
+ result->has_userptr = list->has_userptr;
+ result->num_entries = list->num_entries;
+
+ memcpy(result->array, list->array, list->num_entries *
+ sizeof(struct amdgpu_bo_list_entry));
+
+ for (i = 0; i < result->num_entries; ++i)
+ amdgpu_bo_ref(result->array[i].robj);
+
+ return result;
+}
+
static void amdgpu_bo_list_destroy(struct amdgpu_fpriv *fpriv, int id)
{
struct amdgpu_bo_list *list;