aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2018-05-15 18:21:51 -0400
committerDave Airlie <airlied@redhat.com>2018-05-15 18:31:29 -0400
commit95d2c3e15da613afd53b4b8f2cdb352dc7d12221 (patch)
treeb407c31c3ad2a7e133e61ba36edb31274492fb84 /drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
parentb8a71080ad288eb3fe42f101e64526cdd2823f93 (diff)
parent8344c53f57057b42a5da87e9557c40fcda18fb7a (diff)
Merge branch 'drm-next-4.18' of git://people.freedesktop.org/~agd5f/linux into drm-next
Main changes for 4.18. I'd like to do a separate pull for vega20 later this week or next. Highlights: - Reserve pre-OS scanout buffer during init for seemless transition from console to driver - VEGAM support - Improved GPU scheduler documentation - Initial gfxoff support for raven - SR-IOV fixes - Default to non-AGP on PowerPC for radeon - Fine grained clock voltage control for vega10 - Power profiles for vega10 - Further clean up of powerplay/driver interface - Underlay fixes - Display link bw updates - Gamma fixes - Scatter/Gather display support on CZ/ST - Misc bug fixes and clean ups [airlied: fixup v3d vs scheduler API change] Link: https://patchwork.freedesktop.org/patch/msgid/20180515185450.1113-1-alexander.deucher@amd.com Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c110
1 files changed, 71 insertions, 39 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index c713d30cba86..69a2b25b3696 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -111,7 +111,7 @@ static int amdgpu_ttm_global_init(struct amdgpu_device *adev)
111 ring = adev->mman.buffer_funcs_ring; 111 ring = adev->mman.buffer_funcs_ring;
112 rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_KERNEL]; 112 rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_KERNEL];
113 r = drm_sched_entity_init(&ring->sched, &adev->mman.entity, 113 r = drm_sched_entity_init(&ring->sched, &adev->mman.entity,
114 rq, amdgpu_sched_jobs, NULL); 114 rq, NULL);
115 if (r) { 115 if (r) {
116 DRM_ERROR("Failed setting up TTM BO move run queue.\n"); 116 DRM_ERROR("Failed setting up TTM BO move run queue.\n");
117 goto error_entity; 117 goto error_entity;
@@ -223,20 +223,8 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
223 if (!adev->mman.buffer_funcs_enabled) { 223 if (!adev->mman.buffer_funcs_enabled) {
224 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU); 224 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU);
225 } else if (adev->gmc.visible_vram_size < adev->gmc.real_vram_size && 225 } else if (adev->gmc.visible_vram_size < adev->gmc.real_vram_size &&
226 !(abo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)) { 226 !(abo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) &&
227 unsigned fpfn = adev->gmc.visible_vram_size >> PAGE_SHIFT; 227 amdgpu_bo_in_cpu_visible_vram(abo)) {
228 struct drm_mm_node *node = bo->mem.mm_node;
229 unsigned long pages_left;
230
231 for (pages_left = bo->mem.num_pages;
232 pages_left;
233 pages_left -= node->size, node++) {
234 if (node->start < fpfn)
235 break;
236 }
237
238 if (!pages_left)
239 goto gtt;
240 228
241 /* Try evicting to the CPU inaccessible part of VRAM 229 /* Try evicting to the CPU inaccessible part of VRAM
242 * first, but only set GTT as busy placement, so this 230 * first, but only set GTT as busy placement, so this
@@ -245,12 +233,11 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
245 */ 233 */
246 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM | 234 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM |
247 AMDGPU_GEM_DOMAIN_GTT); 235 AMDGPU_GEM_DOMAIN_GTT);
248 abo->placements[0].fpfn = fpfn; 236 abo->placements[0].fpfn = adev->gmc.visible_vram_size >> PAGE_SHIFT;
249 abo->placements[0].lpfn = 0; 237 abo->placements[0].lpfn = 0;
250 abo->placement.busy_placement = &abo->placements[1]; 238 abo->placement.busy_placement = &abo->placements[1];
251 abo->placement.num_busy_placement = 1; 239 abo->placement.num_busy_placement = 1;
252 } else { 240 } else {
253gtt:
254 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT); 241 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT);
255 } 242 }
256 break; 243 break;
@@ -856,6 +843,45 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm)
856 sg_free_table(ttm->sg); 843 sg_free_table(ttm->sg);
857} 844}
858 845
846int amdgpu_ttm_gart_bind(struct amdgpu_device *adev,
847 struct ttm_buffer_object *tbo,
848 uint64_t flags)
849{
850 struct amdgpu_bo *abo = ttm_to_amdgpu_bo(tbo);
851 struct ttm_tt *ttm = tbo->ttm;
852 struct amdgpu_ttm_tt *gtt = (void *)ttm;
853 int r;
854
855 if (abo->flags & AMDGPU_GEM_CREATE_MQD_GFX9) {
856 uint64_t page_idx = 1;
857
858 r = amdgpu_gart_bind(adev, gtt->offset, page_idx,
859 ttm->pages, gtt->ttm.dma_address, flags);
860 if (r)
861 goto gart_bind_fail;
862
863 /* Patch mtype of the second part BO */
864 flags &= ~AMDGPU_PTE_MTYPE_MASK;
865 flags |= AMDGPU_PTE_MTYPE(AMDGPU_MTYPE_NC);
866
867 r = amdgpu_gart_bind(adev,
868 gtt->offset + (page_idx << PAGE_SHIFT),
869 ttm->num_pages - page_idx,
870 &ttm->pages[page_idx],
871 &(gtt->ttm.dma_address[page_idx]), flags);
872 } else {
873 r = amdgpu_gart_bind(adev, gtt->offset, ttm->num_pages,
874 ttm->pages, gtt->ttm.dma_address, flags);
875 }
876
877gart_bind_fail:
878 if (r)
879 DRM_ERROR("failed to bind %lu pages at 0x%08llX\n",
880 ttm->num_pages, gtt->offset);
881
882 return r;
883}
884
859static int amdgpu_ttm_backend_bind(struct ttm_tt *ttm, 885static int amdgpu_ttm_backend_bind(struct ttm_tt *ttm,
860 struct ttm_mem_reg *bo_mem) 886 struct ttm_mem_reg *bo_mem)
861{ 887{
@@ -929,8 +955,7 @@ int amdgpu_ttm_alloc_gart(struct ttm_buffer_object *bo)
929 955
930 flags = amdgpu_ttm_tt_pte_flags(adev, bo->ttm, &tmp); 956 flags = amdgpu_ttm_tt_pte_flags(adev, bo->ttm, &tmp);
931 gtt->offset = (u64)tmp.start << PAGE_SHIFT; 957 gtt->offset = (u64)tmp.start << PAGE_SHIFT;
932 r = amdgpu_gart_bind(adev, gtt->offset, bo->ttm->num_pages, 958 r = amdgpu_ttm_gart_bind(adev, bo, flags);
933 bo->ttm->pages, gtt->ttm.dma_address, flags);
934 if (unlikely(r)) { 959 if (unlikely(r)) {
935 ttm_bo_mem_put(bo, &tmp); 960 ttm_bo_mem_put(bo, &tmp);
936 return r; 961 return r;
@@ -947,19 +972,15 @@ int amdgpu_ttm_alloc_gart(struct ttm_buffer_object *bo)
947int amdgpu_ttm_recover_gart(struct ttm_buffer_object *tbo) 972int amdgpu_ttm_recover_gart(struct ttm_buffer_object *tbo)
948{ 973{
949 struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev); 974 struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
950 struct amdgpu_ttm_tt *gtt = (void *)tbo->ttm;
951 uint64_t flags; 975 uint64_t flags;
952 int r; 976 int r;
953 977
954 if (!gtt) 978 if (!tbo->ttm)
955 return 0; 979 return 0;
956 980
957 flags = amdgpu_ttm_tt_pte_flags(adev, &gtt->ttm.ttm, &tbo->mem); 981 flags = amdgpu_ttm_tt_pte_flags(adev, tbo->ttm, &tbo->mem);
958 r = amdgpu_gart_bind(adev, gtt->offset, gtt->ttm.ttm.num_pages, 982 r = amdgpu_ttm_gart_bind(adev, tbo, flags);
959 gtt->ttm.ttm.pages, gtt->ttm.dma_address, flags); 983
960 if (r)
961 DRM_ERROR("failed to bind %lu pages at 0x%08llX\n",
962 gtt->ttm.ttm.num_pages, gtt->offset);
963 return r; 984 return r;
964} 985}
965 986
@@ -1349,6 +1370,7 @@ static void amdgpu_ttm_fw_reserve_vram_fini(struct amdgpu_device *adev)
1349static int amdgpu_ttm_fw_reserve_vram_init(struct amdgpu_device *adev) 1370static int amdgpu_ttm_fw_reserve_vram_init(struct amdgpu_device *adev)
1350{ 1371{
1351 struct ttm_operation_ctx ctx = { false, false }; 1372 struct ttm_operation_ctx ctx = { false, false };
1373 struct amdgpu_bo_param bp;
1352 int r = 0; 1374 int r = 0;
1353 int i; 1375 int i;
1354 u64 vram_size = adev->gmc.visible_vram_size; 1376 u64 vram_size = adev->gmc.visible_vram_size;
@@ -1356,17 +1378,21 @@ static int amdgpu_ttm_fw_reserve_vram_init(struct amdgpu_device *adev)
1356 u64 size = adev->fw_vram_usage.size; 1378 u64 size = adev->fw_vram_usage.size;
1357 struct amdgpu_bo *bo; 1379 struct amdgpu_bo *bo;
1358 1380
1381 memset(&bp, 0, sizeof(bp));
1382 bp.size = adev->fw_vram_usage.size;
1383 bp.byte_align = PAGE_SIZE;
1384 bp.domain = AMDGPU_GEM_DOMAIN_VRAM;
1385 bp.flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
1386 AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
1387 bp.type = ttm_bo_type_kernel;
1388 bp.resv = NULL;
1359 adev->fw_vram_usage.va = NULL; 1389 adev->fw_vram_usage.va = NULL;
1360 adev->fw_vram_usage.reserved_bo = NULL; 1390 adev->fw_vram_usage.reserved_bo = NULL;
1361 1391
1362 if (adev->fw_vram_usage.size > 0 && 1392 if (adev->fw_vram_usage.size > 0 &&
1363 adev->fw_vram_usage.size <= vram_size) { 1393 adev->fw_vram_usage.size <= vram_size) {
1364 1394
1365 r = amdgpu_bo_create(adev, adev->fw_vram_usage.size, PAGE_SIZE, 1395 r = amdgpu_bo_create(adev, &bp,
1366 AMDGPU_GEM_DOMAIN_VRAM,
1367 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
1368 AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS,
1369 ttm_bo_type_kernel, NULL,
1370 &adev->fw_vram_usage.reserved_bo); 1396 &adev->fw_vram_usage.reserved_bo);
1371 if (r) 1397 if (r)
1372 goto error_create; 1398 goto error_create;
@@ -1474,12 +1500,14 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
1474 return r; 1500 return r;
1475 } 1501 }
1476 1502
1477 r = amdgpu_bo_create_kernel(adev, adev->gmc.stolen_size, PAGE_SIZE, 1503 if (adev->gmc.stolen_size) {
1478 AMDGPU_GEM_DOMAIN_VRAM, 1504 r = amdgpu_bo_create_kernel(adev, adev->gmc.stolen_size, PAGE_SIZE,
1479 &adev->stolen_vga_memory, 1505 AMDGPU_GEM_DOMAIN_VRAM,
1480 NULL, NULL); 1506 &adev->stolen_vga_memory,
1481 if (r) 1507 NULL, NULL);
1482 return r; 1508 if (r)
1509 return r;
1510 }
1483 DRM_INFO("amdgpu: %uM of VRAM memory ready\n", 1511 DRM_INFO("amdgpu: %uM of VRAM memory ready\n",
1484 (unsigned) (adev->gmc.real_vram_size / (1024 * 1024))); 1512 (unsigned) (adev->gmc.real_vram_size / (1024 * 1024)));
1485 1513
@@ -1548,13 +1576,17 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
1548 return 0; 1576 return 0;
1549} 1577}
1550 1578
1579void amdgpu_ttm_late_init(struct amdgpu_device *adev)
1580{
1581 amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL);
1582}
1583
1551void amdgpu_ttm_fini(struct amdgpu_device *adev) 1584void amdgpu_ttm_fini(struct amdgpu_device *adev)
1552{ 1585{
1553 if (!adev->mman.initialized) 1586 if (!adev->mman.initialized)
1554 return; 1587 return;
1555 1588
1556 amdgpu_ttm_debugfs_fini(adev); 1589 amdgpu_ttm_debugfs_fini(adev);
1557 amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL);
1558 amdgpu_ttm_fw_reserve_vram_fini(adev); 1590 amdgpu_ttm_fw_reserve_vram_fini(adev);
1559 if (adev->mman.aper_base_kaddr) 1591 if (adev->mman.aper_base_kaddr)
1560 iounmap(adev->mman.aper_base_kaddr); 1592 iounmap(adev->mman.aper_base_kaddr);