diff options
author | Dave Airlie <airlied@redhat.com> | 2018-05-15 18:21:51 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2018-05-15 18:31:29 -0400 |
commit | 95d2c3e15da613afd53b4b8f2cdb352dc7d12221 (patch) | |
tree | b407c31c3ad2a7e133e61ba36edb31274492fb84 /drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |
parent | b8a71080ad288eb3fe42f101e64526cdd2823f93 (diff) | |
parent | 8344c53f57057b42a5da87e9557c40fcda18fb7a (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.c | 110 |
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 { |
253 | gtt: | ||
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 | ||
846 | int 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 | |||
877 | gart_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 | |||
859 | static int amdgpu_ttm_backend_bind(struct ttm_tt *ttm, | 885 | static 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) | |||
947 | int amdgpu_ttm_recover_gart(struct ttm_buffer_object *tbo) | 972 | int 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, >t->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) | |||
1349 | static int amdgpu_ttm_fw_reserve_vram_init(struct amdgpu_device *adev) | 1370 | static 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 | ||
1579 | void amdgpu_ttm_late_init(struct amdgpu_device *adev) | ||
1580 | { | ||
1581 | amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL); | ||
1582 | } | ||
1583 | |||
1551 | void amdgpu_ttm_fini(struct amdgpu_device *adev) | 1584 | void 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); |