aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c70
1 files changed, 29 insertions, 41 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 8c5f75d29f32..e97dfe888d55 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -252,29 +252,15 @@ static void amdgpu_move_null(struct ttm_buffer_object *bo,
252 new_mem->mm_node = NULL; 252 new_mem->mm_node = NULL;
253} 253}
254 254
255static int amdgpu_mm_node_addr(struct ttm_buffer_object *bo, 255static uint64_t amdgpu_mm_node_addr(struct ttm_buffer_object *bo,
256 struct drm_mm_node *mm_node, 256 struct drm_mm_node *mm_node,
257 struct ttm_mem_reg *mem, 257 struct ttm_mem_reg *mem)
258 uint64_t *addr)
259{ 258{
260 int r; 259 uint64_t addr;
261
262 switch (mem->mem_type) {
263 case TTM_PL_TT:
264 r = amdgpu_ttm_bind(bo, mem);
265 if (r)
266 return r;
267
268 case TTM_PL_VRAM:
269 *addr = mm_node->start << PAGE_SHIFT;
270 *addr += bo->bdev->man[mem->mem_type].gpu_offset;
271 break;
272 default:
273 DRM_ERROR("Unknown placement %d\n", mem->mem_type);
274 return -EINVAL;
275 }
276 260
277 return 0; 261 addr = mm_node->start << PAGE_SHIFT;
262 addr += bo->bdev->man[mem->mem_type].gpu_offset;
263 return addr;
278} 264}
279 265
280static int amdgpu_move_blit(struct ttm_buffer_object *bo, 266static int amdgpu_move_blit(struct ttm_buffer_object *bo,
@@ -298,18 +284,25 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo,
298 return -EINVAL; 284 return -EINVAL;
299 } 285 }
300 286
287 if (old_mem->mem_type == TTM_PL_TT) {
288 r = amdgpu_ttm_bind(bo, old_mem);
289 if (r)
290 return r;
291 }
292
301 old_mm = old_mem->mm_node; 293 old_mm = old_mem->mm_node;
302 r = amdgpu_mm_node_addr(bo, old_mm, old_mem, &old_start);
303 if (r)
304 return r;
305 old_size = old_mm->size; 294 old_size = old_mm->size;
295 old_start = amdgpu_mm_node_addr(bo, old_mm, old_mem);
306 296
297 if (new_mem->mem_type == TTM_PL_TT) {
298 r = amdgpu_ttm_bind(bo, new_mem);
299 if (r)
300 return r;
301 }
307 302
308 new_mm = new_mem->mm_node; 303 new_mm = new_mem->mm_node;
309 r = amdgpu_mm_node_addr(bo, new_mm, new_mem, &new_start);
310 if (r)
311 return r;
312 new_size = new_mm->size; 304 new_size = new_mm->size;
305 new_start = amdgpu_mm_node_addr(bo, new_mm, new_mem);
313 306
314 num_pages = new_mem->num_pages; 307 num_pages = new_mem->num_pages;
315 while (num_pages) { 308 while (num_pages) {
@@ -331,10 +324,7 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo,
331 324
332 old_size -= cur_pages; 325 old_size -= cur_pages;
333 if (!old_size) { 326 if (!old_size) {
334 r = amdgpu_mm_node_addr(bo, ++old_mm, old_mem, 327 old_start = amdgpu_mm_node_addr(bo, ++old_mm, old_mem);
335 &old_start);
336 if (r)
337 goto error;
338 old_size = old_mm->size; 328 old_size = old_mm->size;
339 } else { 329 } else {
340 old_start += cur_pages * PAGE_SIZE; 330 old_start += cur_pages * PAGE_SIZE;
@@ -342,11 +332,7 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo,
342 332
343 new_size -= cur_pages; 333 new_size -= cur_pages;
344 if (!new_size) { 334 if (!new_size) {
345 r = amdgpu_mm_node_addr(bo, ++new_mm, new_mem, 335 new_start = amdgpu_mm_node_addr(bo, ++new_mm, new_mem);
346 &new_start);
347 if (r)
348 goto error;
349
350 new_size = new_mm->size; 336 new_size = new_mm->size;
351 } else { 337 } else {
352 new_start += cur_pages * PAGE_SIZE; 338 new_start += cur_pages * PAGE_SIZE;
@@ -1347,6 +1333,12 @@ int amdgpu_fill_buffer(struct amdgpu_bo *bo,
1347 return -EINVAL; 1333 return -EINVAL;
1348 } 1334 }
1349 1335
1336 if (bo->tbo.mem.mem_type == TTM_PL_TT) {
1337 r = amdgpu_ttm_bind(&bo->tbo, &bo->tbo.mem);
1338 if (r)
1339 return r;
1340 }
1341
1350 num_pages = bo->tbo.num_pages; 1342 num_pages = bo->tbo.num_pages;
1351 mm_node = bo->tbo.mem.mm_node; 1343 mm_node = bo->tbo.mem.mm_node;
1352 num_loops = 0; 1344 num_loops = 0;
@@ -1382,11 +1374,7 @@ int amdgpu_fill_buffer(struct amdgpu_bo *bo,
1382 uint32_t byte_count = mm_node->size << PAGE_SHIFT; 1374 uint32_t byte_count = mm_node->size << PAGE_SHIFT;
1383 uint64_t dst_addr; 1375 uint64_t dst_addr;
1384 1376
1385 r = amdgpu_mm_node_addr(&bo->tbo, mm_node, 1377 dst_addr = amdgpu_mm_node_addr(&bo->tbo, mm_node, &bo->tbo.mem);
1386 &bo->tbo.mem, &dst_addr);
1387 if (r)
1388 return r;
1389
1390 while (byte_count) { 1378 while (byte_count) {
1391 uint32_t cur_size_in_bytes = min(byte_count, max_bytes); 1379 uint32_t cur_size_in_bytes = min(byte_count, max_bytes);
1392 1380