aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
diff options
context:
space:
mode:
authorSean Paul <seanpaul@chromium.org>2017-05-18 09:24:30 -0400
committerSean Paul <seanpaul@chromium.org>2017-05-18 09:24:30 -0400
commit6b7781b42dc9bc9bcd1523b6c24b876cdda0bef3 (patch)
treeee55c67e4ea30b9eb44f301ba0bde2e631a26162 /drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
parent52d9d38c183bf0e09601d875ea31bb53c05dd8cf (diff)
parente98c58e55f68f8785aebfab1f8c9a03d8de0afe1 (diff)
Merge remote-tracking branch 'airlied/drm-next' into drm-misc-next
Picking up drm-next @ 4.12-rc1 in order to apply Michal Hocko's vmalloc patch set Signed-off-by: Sean Paul <seanpaul@chromium.org>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c36
1 files changed, 27 insertions, 9 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 6a3028c13580..b5fa003c1341 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -203,7 +203,9 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
203 abo = container_of(bo, struct amdgpu_bo, tbo); 203 abo = container_of(bo, struct amdgpu_bo, tbo);
204 switch (bo->mem.mem_type) { 204 switch (bo->mem.mem_type) {
205 case TTM_PL_VRAM: 205 case TTM_PL_VRAM:
206 if (adev->mman.buffer_funcs_ring->ready == false) { 206 if (adev->mman.buffer_funcs &&
207 adev->mman.buffer_funcs_ring &&
208 adev->mman.buffer_funcs_ring->ready == false) {
207 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU); 209 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU);
208 } else { 210 } else {
209 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT); 211 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT);
@@ -763,7 +765,7 @@ int amdgpu_ttm_recover_gart(struct amdgpu_device *adev)
763{ 765{
764 struct amdgpu_ttm_tt *gtt, *tmp; 766 struct amdgpu_ttm_tt *gtt, *tmp;
765 struct ttm_mem_reg bo_mem; 767 struct ttm_mem_reg bo_mem;
766 uint32_t flags; 768 uint64_t flags;
767 int r; 769 int r;
768 770
769 bo_mem.mem_type = TTM_PL_TT; 771 bo_mem.mem_type = TTM_PL_TT;
@@ -1038,11 +1040,17 @@ uint64_t amdgpu_ttm_tt_pte_flags(struct amdgpu_device *adev, struct ttm_tt *ttm,
1038static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo, 1040static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
1039 const struct ttm_place *place) 1041 const struct ttm_place *place)
1040{ 1042{
1041 if (bo->mem.mem_type == TTM_PL_VRAM && 1043 unsigned long num_pages = bo->mem.num_pages;
1042 bo->mem.start == AMDGPU_BO_INVALID_OFFSET) { 1044 struct drm_mm_node *node = bo->mem.mm_node;
1043 unsigned long num_pages = bo->mem.num_pages; 1045
1044 struct drm_mm_node *node = bo->mem.mm_node; 1046 if (bo->mem.start != AMDGPU_BO_INVALID_OFFSET)
1047 return ttm_bo_eviction_valuable(bo, place);
1048
1049 switch (bo->mem.mem_type) {
1050 case TTM_PL_TT:
1051 return true;
1045 1052
1053 case TTM_PL_VRAM:
1046 /* Check each drm MM node individually */ 1054 /* Check each drm MM node individually */
1047 while (num_pages) { 1055 while (num_pages) {
1048 if (place->fpfn < (node->start + node->size) && 1056 if (place->fpfn < (node->start + node->size) &&
@@ -1052,8 +1060,10 @@ static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
1052 num_pages -= node->size; 1060 num_pages -= node->size;
1053 ++node; 1061 ++node;
1054 } 1062 }
1063 break;
1055 1064
1056 return false; 1065 default:
1066 break;
1057 } 1067 }
1058 1068
1059 return ttm_bo_eviction_valuable(bo, place); 1069 return ttm_bo_eviction_valuable(bo, place);
@@ -1188,7 +1198,7 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
1188 return; 1198 return;
1189 amdgpu_ttm_debugfs_fini(adev); 1199 amdgpu_ttm_debugfs_fini(adev);
1190 if (adev->stollen_vga_memory) { 1200 if (adev->stollen_vga_memory) {
1191 r = amdgpu_bo_reserve(adev->stollen_vga_memory, false); 1201 r = amdgpu_bo_reserve(adev->stollen_vga_memory, true);
1192 if (r == 0) { 1202 if (r == 0) {
1193 amdgpu_bo_unpin(adev->stollen_vga_memory); 1203 amdgpu_bo_unpin(adev->stollen_vga_memory);
1194 amdgpu_bo_unreserve(adev->stollen_vga_memory); 1204 amdgpu_bo_unreserve(adev->stollen_vga_memory);
@@ -1401,6 +1411,8 @@ error_free:
1401 1411
1402#if defined(CONFIG_DEBUG_FS) 1412#if defined(CONFIG_DEBUG_FS)
1403 1413
1414extern void amdgpu_gtt_mgr_print(struct seq_file *m, struct ttm_mem_type_manager
1415 *man);
1404static int amdgpu_mm_dump_table(struct seq_file *m, void *data) 1416static int amdgpu_mm_dump_table(struct seq_file *m, void *data)
1405{ 1417{
1406 struct drm_info_node *node = (struct drm_info_node *)m->private; 1418 struct drm_info_node *node = (struct drm_info_node *)m->private;
@@ -1414,11 +1426,17 @@ static int amdgpu_mm_dump_table(struct seq_file *m, void *data)
1414 spin_lock(&glob->lru_lock); 1426 spin_lock(&glob->lru_lock);
1415 drm_mm_print(mm, &p); 1427 drm_mm_print(mm, &p);
1416 spin_unlock(&glob->lru_lock); 1428 spin_unlock(&glob->lru_lock);
1417 if (ttm_pl == TTM_PL_VRAM) 1429 switch (ttm_pl) {
1430 case TTM_PL_VRAM:
1418 seq_printf(m, "man size:%llu pages, ram usage:%lluMB, vis usage:%lluMB\n", 1431 seq_printf(m, "man size:%llu pages, ram usage:%lluMB, vis usage:%lluMB\n",
1419 adev->mman.bdev.man[ttm_pl].size, 1432 adev->mman.bdev.man[ttm_pl].size,
1420 (u64)atomic64_read(&adev->vram_usage) >> 20, 1433 (u64)atomic64_read(&adev->vram_usage) >> 20,
1421 (u64)atomic64_read(&adev->vram_vis_usage) >> 20); 1434 (u64)atomic64_read(&adev->vram_vis_usage) >> 20);
1435 break;
1436 case TTM_PL_TT:
1437 amdgpu_gtt_mgr_print(m, &adev->mman.bdev.man[TTM_PL_TT]);
1438 break;
1439 }
1422 return 0; 1440 return 0;
1423} 1441}
1424 1442