diff options
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 70 |
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 | ||
255 | static int amdgpu_mm_node_addr(struct ttm_buffer_object *bo, | 255 | static 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 | ||
280 | static int amdgpu_move_blit(struct ttm_buffer_object *bo, | 266 | static 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 | ||