aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c224
1 files changed, 133 insertions, 91 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index fcf421263fd9..a44fc12ae1f9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -47,6 +47,7 @@
47#include "amdgpu_object.h" 47#include "amdgpu_object.h"
48#include "amdgpu_trace.h" 48#include "amdgpu_trace.h"
49#include "amdgpu_amdkfd.h" 49#include "amdgpu_amdkfd.h"
50#include "amdgpu_sdma.h"
50#include "bif/bif_4_1_d.h" 51#include "bif/bif_4_1_d.h"
51 52
52#define DRM_FILE_PAGE_OFFSET (0x100000000ULL >> PAGE_SHIFT) 53#define DRM_FILE_PAGE_OFFSET (0x100000000ULL >> PAGE_SHIFT)
@@ -255,6 +256,13 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
255 256
256 abo = ttm_to_amdgpu_bo(bo); 257 abo = ttm_to_amdgpu_bo(bo);
257 switch (bo->mem.mem_type) { 258 switch (bo->mem.mem_type) {
259 case AMDGPU_PL_GDS:
260 case AMDGPU_PL_GWS:
261 case AMDGPU_PL_OA:
262 placement->num_placement = 0;
263 placement->num_busy_placement = 0;
264 return;
265
258 case TTM_PL_VRAM: 266 case TTM_PL_VRAM:
259 if (!adev->mman.buffer_funcs_enabled) { 267 if (!adev->mman.buffer_funcs_enabled) {
260 /* Move to system memory */ 268 /* Move to system memory */
@@ -282,6 +290,7 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
282 case TTM_PL_TT: 290 case TTM_PL_TT:
283 default: 291 default:
284 amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU); 292 amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU);
293 break;
285 } 294 }
286 *placement = abo->placement; 295 *placement = abo->placement;
287} 296}
@@ -344,7 +353,7 @@ static uint64_t amdgpu_mm_node_addr(struct ttm_buffer_object *bo,
344{ 353{
345 uint64_t addr = 0; 354 uint64_t addr = 0;
346 355
347 if (mem->mem_type != TTM_PL_TT || amdgpu_gtt_mgr_has_gart_addr(mem)) { 356 if (mm_node->start != AMDGPU_BO_INVALID_OFFSET) {
348 addr = mm_node->start << PAGE_SHIFT; 357 addr = mm_node->start << PAGE_SHIFT;
349 addr += bo->bdev->man[mem->mem_type].gpu_offset; 358 addr += bo->bdev->man[mem->mem_type].gpu_offset;
350 } 359 }
@@ -432,8 +441,7 @@ int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_device *adev,
432 /* Map only what needs to be accessed. Map src to window 0 and 441 /* Map only what needs to be accessed. Map src to window 0 and
433 * dst to window 1 442 * dst to window 1
434 */ 443 */
435 if (src->mem->mem_type == TTM_PL_TT && 444 if (src->mem->start == AMDGPU_BO_INVALID_OFFSET) {
436 !amdgpu_gtt_mgr_has_gart_addr(src->mem)) {
437 r = amdgpu_map_buffer(src->bo, src->mem, 445 r = amdgpu_map_buffer(src->bo, src->mem,
438 PFN_UP(cur_size + src_page_offset), 446 PFN_UP(cur_size + src_page_offset),
439 src_node_start, 0, ring, 447 src_node_start, 0, ring,
@@ -446,8 +454,7 @@ int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_device *adev,
446 from += src_page_offset; 454 from += src_page_offset;
447 } 455 }
448 456
449 if (dst->mem->mem_type == TTM_PL_TT && 457 if (dst->mem->start == AMDGPU_BO_INVALID_OFFSET) {
450 !amdgpu_gtt_mgr_has_gart_addr(dst->mem)) {
451 r = amdgpu_map_buffer(dst->bo, dst->mem, 458 r = amdgpu_map_buffer(dst->bo, dst->mem,
452 PFN_UP(cur_size + dst_page_offset), 459 PFN_UP(cur_size + dst_page_offset),
453 dst_node_start, 1, ring, 460 dst_node_start, 1, ring,
@@ -525,7 +532,11 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo,
525 if (r) 532 if (r)
526 goto error; 533 goto error;
527 534
528 r = ttm_bo_pipeline_move(bo, fence, evict, new_mem); 535 /* Always block for VM page tables before committing the new location */
536 if (bo->type == ttm_bo_type_kernel)
537 r = ttm_bo_move_accel_cleanup(bo, fence, true, new_mem);
538 else
539 r = ttm_bo_pipeline_move(bo, fence, evict, new_mem);
529 dma_fence_put(fence); 540 dma_fence_put(fence);
530 return r; 541 return r;
531 542
@@ -676,6 +687,16 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
676 amdgpu_move_null(bo, new_mem); 687 amdgpu_move_null(bo, new_mem);
677 return 0; 688 return 0;
678 } 689 }
690 if (old_mem->mem_type == AMDGPU_PL_GDS ||
691 old_mem->mem_type == AMDGPU_PL_GWS ||
692 old_mem->mem_type == AMDGPU_PL_OA ||
693 new_mem->mem_type == AMDGPU_PL_GDS ||
694 new_mem->mem_type == AMDGPU_PL_GWS ||
695 new_mem->mem_type == AMDGPU_PL_OA) {
696 /* Nothing to save here */
697 amdgpu_move_null(bo, new_mem);
698 return 0;
699 }
679 700
680 if (!adev->mman.buffer_funcs_enabled) 701 if (!adev->mman.buffer_funcs_enabled)
681 goto memcpy; 702 goto memcpy;
@@ -1082,42 +1103,48 @@ int amdgpu_ttm_alloc_gart(struct ttm_buffer_object *bo)
1082 struct ttm_mem_reg tmp; 1103 struct ttm_mem_reg tmp;
1083 struct ttm_placement placement; 1104 struct ttm_placement placement;
1084 struct ttm_place placements; 1105 struct ttm_place placements;
1085 uint64_t flags; 1106 uint64_t addr, flags;
1086 int r; 1107 int r;
1087 1108
1088 if (bo->mem.mem_type != TTM_PL_TT || 1109 if (bo->mem.start != AMDGPU_BO_INVALID_OFFSET)
1089 amdgpu_gtt_mgr_has_gart_addr(&bo->mem))
1090 return 0; 1110 return 0;
1091 1111
1092 /* allocate GTT space */ 1112 addr = amdgpu_gmc_agp_addr(bo);
1093 tmp = bo->mem; 1113 if (addr != AMDGPU_BO_INVALID_OFFSET) {
1094 tmp.mm_node = NULL; 1114 bo->mem.start = addr >> PAGE_SHIFT;
1095 placement.num_placement = 1; 1115 } else {
1096 placement.placement = &placements;
1097 placement.num_busy_placement = 1;
1098 placement.busy_placement = &placements;
1099 placements.fpfn = 0;
1100 placements.lpfn = adev->gmc.gart_size >> PAGE_SHIFT;
1101 placements.flags = (bo->mem.placement & ~TTM_PL_MASK_MEM) |
1102 TTM_PL_FLAG_TT;
1103 1116
1104 r = ttm_bo_mem_space(bo, &placement, &tmp, &ctx); 1117 /* allocate GART space */
1105 if (unlikely(r)) 1118 tmp = bo->mem;
1106 return r; 1119 tmp.mm_node = NULL;
1120 placement.num_placement = 1;
1121 placement.placement = &placements;
1122 placement.num_busy_placement = 1;
1123 placement.busy_placement = &placements;
1124 placements.fpfn = 0;
1125 placements.lpfn = adev->gmc.gart_size >> PAGE_SHIFT;
1126 placements.flags = (bo->mem.placement & ~TTM_PL_MASK_MEM) |
1127 TTM_PL_FLAG_TT;
1128
1129 r = ttm_bo_mem_space(bo, &placement, &tmp, &ctx);
1130 if (unlikely(r))
1131 return r;
1107 1132
1108 /* compute PTE flags for this buffer object */ 1133 /* compute PTE flags for this buffer object */
1109 flags = amdgpu_ttm_tt_pte_flags(adev, bo->ttm, &tmp); 1134 flags = amdgpu_ttm_tt_pte_flags(adev, bo->ttm, &tmp);
1110 1135
1111 /* Bind pages */ 1136 /* Bind pages */
1112 gtt->offset = (u64)tmp.start << PAGE_SHIFT; 1137 gtt->offset = (u64)tmp.start << PAGE_SHIFT;
1113 r = amdgpu_ttm_gart_bind(adev, bo, flags); 1138 r = amdgpu_ttm_gart_bind(adev, bo, flags);
1114 if (unlikely(r)) { 1139 if (unlikely(r)) {
1115 ttm_bo_mem_put(bo, &tmp); 1140 ttm_bo_mem_put(bo, &tmp);
1116 return r; 1141 return r;
1142 }
1143
1144 ttm_bo_mem_put(bo, &bo->mem);
1145 bo->mem = tmp;
1117 } 1146 }
1118 1147
1119 ttm_bo_mem_put(bo, &bo->mem);
1120 bo->mem = tmp;
1121 bo->offset = (bo->mem.start << PAGE_SHIFT) + 1148 bo->offset = (bo->mem.start << PAGE_SHIFT) +
1122 bo->bdev->man[bo->mem.mem_type].gpu_offset; 1149 bo->bdev->man[bo->mem.mem_type].gpu_offset;
1123 1150
@@ -1427,13 +1454,14 @@ bool amdgpu_ttm_tt_is_readonly(struct ttm_tt *ttm)
1427} 1454}
1428 1455
1429/** 1456/**
1430 * amdgpu_ttm_tt_pte_flags - Compute PTE flags for ttm_tt object 1457 *