OSDN Git Service

amdgpu: add amdgpu_bo_list_update interface v2
authorJammy Zhou <Jammy.Zhou@amd.com>
Mon, 18 May 2015 12:27:24 +0000 (20:27 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 5 Aug 2015 17:47:50 +0000 (13:47 -0400)
v2: some minor improvement

Signed-off-by: Jammy Zhou <Jammy.Zhou@amd.com>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
amdgpu/amdgpu.h
amdgpu/amdgpu_bo.c

index dacffec..32bf30e 100644 (file)
@@ -781,6 +781,25 @@ int amdgpu_bo_list_create(amdgpu_device_handle dev,
 */
 int amdgpu_bo_list_destroy(amdgpu_bo_list_handle handle);
 
+/**
+ * Update resources for existing BO list
+ *
+ * \param   handle              - \c [in] BO list handle
+ * \param   number_of_resources - \c [in] Number of BOs in the list
+ * \param   resources           - \c [in] List of BO handles
+ * \param   resource_prios      - \c [in] Optional priority for each handle
+ *
+ * \return   0 on success\n
+ *          >0 - AMD specific error code\n
+ *          <0 - Negative POSIX Error code
+ *
+ * \sa amdgpu_bo_list_update()
+*/
+int amdgpu_bo_list_update(amdgpu_bo_list_handle handle,
+                         uint32_t number_of_resources,
+                         amdgpu_bo_handle *resources,
+                         uint8_t *resource_prios);
+
 /*
  * Special GPU Resources
  *
index 3dfaf62..ec04955 100644 (file)
@@ -715,3 +715,38 @@ int amdgpu_bo_list_destroy(amdgpu_bo_list_handle list)
 
        return r;
 }
+
+int amdgpu_bo_list_update(amdgpu_bo_list_handle handle,
+                         uint32_t number_of_resources,
+                         amdgpu_bo_handle *resources,
+                         uint8_t *resource_prios)
+{
+       struct drm_amdgpu_bo_list_entry *list;
+       union drm_amdgpu_bo_list args;
+       unsigned i;
+       int r;
+
+       list = calloc(number_of_resources, sizeof(struct drm_amdgpu_bo_list_entry));
+       if (list == NULL)
+               return -ENOMEM;
+
+       memset(&args, 0, sizeof(args));
+       args.in.operation = AMDGPU_BO_LIST_OP_UPDATE;
+       args.in.list_handle = handle->handle;
+       args.in.bo_number = number_of_resources;
+       args.in.bo_info_size = sizeof(struct drm_amdgpu_bo_list_entry);
+       args.in.bo_info_ptr = (uintptr_t)list;
+
+       for (i = 0; i < number_of_resources; i++) {
+               list[i].bo_handle = resources[i]->handle;
+               if (resource_prios)
+                       list[i].bo_priority = resource_prios[i];
+               else
+                       list[i].bo_priority = 0;
+       }
+
+       r = drmCommandWriteRead(handle->dev->fd, DRM_AMDGPU_BO_LIST,
+                               &args, sizeof(args));
+       free(list);
+       return r;
+}