diff options
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 50 |
2 files changed, 53 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 6bf16d95e7e4..cfc6c786b2f2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -1062,6 +1062,9 @@ struct amdgpu_bo_list { | |||
1062 | struct amdgpu_bo_list * | 1062 | struct amdgpu_bo_list * |
1063 | amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id); | 1063 | amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id); |
1064 | void amdgpu_bo_list_put(struct amdgpu_bo_list *list); | 1064 | void amdgpu_bo_list_put(struct amdgpu_bo_list *list); |
1065 | void amdgpu_bo_list_copy(struct amdgpu_device *adev, | ||
1066 | struct amdgpu_bo_list *dst, | ||
1067 | struct amdgpu_bo_list *src); | ||
1065 | void amdgpu_bo_list_free(struct amdgpu_bo_list *list); | 1068 | void amdgpu_bo_list_free(struct amdgpu_bo_list *list); |
1066 | 1069 | ||
1067 | /* | 1070 | /* |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c index f82a2dd83874..4d27fa1660b9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | |||
@@ -166,6 +166,56 @@ void amdgpu_bo_list_put(struct amdgpu_bo_list *list) | |||
166 | mutex_unlock(&list->lock); | 166 | mutex_unlock(&list->lock); |
167 | } | 167 | } |
168 | 168 | ||
169 | void amdgpu_bo_list_copy(struct amdgpu_device *adev, | ||
170 | struct amdgpu_bo_list *dst, | ||
171 | struct amdgpu_bo_list *src) | ||
172 | { | ||
173 | struct amdgpu_bo_list_entry *array; | ||
174 | struct amdgpu_bo *gds_obj = adev->gds.gds_gfx_bo; | ||
175 | struct amdgpu_bo *gws_obj = adev->gds.gws_gfx_bo; | ||
176 | struct amdgpu_bo *oa_obj = adev->gds.oa_gfx_bo; | ||
177 | |||
178 | bool has_userptr = false; | ||
179 | unsigned i; | ||
180 | |||
181 | array = drm_calloc_large(src->num_entries, sizeof(struct amdgpu_bo_list_entry)); | ||
182 | if (!array) | ||
183 | return; | ||
184 | memset(array, 0, src->num_entries * sizeof(struct amdgpu_bo_list_entry)); | ||
185 | |||
186 | for (i = 0; i < src->num_entries; ++i) { | ||
187 | memcpy(array, src->array, | ||
188 | src->num_entries * sizeof(struct amdgpu_bo_list_entry)); | ||
189 | array[i].robj = amdgpu_bo_ref(src->array[i].robj); | ||
190 | if (amdgpu_ttm_tt_has_userptr(array[i].robj->tbo.ttm)) { | ||
191 | has_userptr = true; | ||
192 | array[i].prefered_domains = AMDGPU_GEM_DOMAIN_GTT; | ||
193 | array[i].allowed_domains = AMDGPU_GEM_DOMAIN_GTT; | ||
194 | } | ||
195 | array[i].tv.bo = &array[i].robj->tbo; | ||
196 | array[i].tv.shared = true; | ||
197 | |||
198 | if (array[i].prefered_domains == AMDGPU_GEM_DOMAIN_GDS) | ||
199 | gds_obj = array[i].robj; | ||
200 | if (array[i].prefered_domains == AMDGPU_GEM_DOMAIN_GWS) | ||
201 | gws_obj = array[i].robj; | ||
202 | if (array[i].prefered_domains == AMDGPU_GEM_DOMAIN_OA) | ||
203 | oa_obj = array[i].robj; | ||
204 | } | ||
205 | |||
206 | for (i = 0; i < dst->num_entries; ++i) | ||
207 | amdgpu_bo_unref(&dst->array[i].robj); | ||
208 | |||
209 | drm_free_large(dst->array); | ||
210 | |||
211 | dst->gds_obj = gds_obj; | ||
212 | dst->gws_obj = gws_obj; | ||
213 | dst->oa_obj = oa_obj; | ||
214 | dst->has_userptr = has_userptr; | ||
215 | dst->array = array; | ||
216 | dst->num_entries = src->num_entries; | ||
217 | } | ||
218 | |||
169 | void amdgpu_bo_list_free(struct amdgpu_bo_list *list) | 219 | void amdgpu_bo_list_free(struct amdgpu_bo_list *list) |
170 | { | 220 | { |
171 | unsigned i; | 221 | unsigned i; |