aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c230
1 files changed, 121 insertions, 109 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 0235d7933efd..2895d9d86f29 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -26,6 +26,7 @@
26 * Jerome Glisse 26 * Jerome Glisse
27 */ 27 */
28#include <linux/dma-fence-array.h> 28#include <linux/dma-fence-array.h>
29#include <linux/interval_tree_generic.h>
29#include <drm/drmP.h> 30#include <drm/drmP.h>
30#include <drm/amdgpu_drm.h> 31#include <drm/amdgpu_drm.h>
31#include "amdgpu.h" 32#include "amdgpu.h"
@@ -51,6 +52,15 @@
51 * SI supports 16. 52 * SI supports 16.
52 */ 53 */
53 54
55#define START(node) ((node)->start)
56#define LAST(node) ((node)->last)
57
58INTERVAL_TREE_DEFINE(struct amdgpu_bo_va_mapping, rb, uint64_t, __subtree_last,
59 START, LAST, static, amdgpu_vm_it)
60
61#undef START
62#undef LAST
63
54/* Local structure. Encapsulate some VM table update parameters to reduce 64/* Local structure. Encapsulate some VM table update parameters to reduce
55 * the number of function parameters 65 * the number of function parameters
56 */ 66 */
@@ -90,13 +100,14 @@ static unsigned amdgpu_vm_num_entries(struct amdgpu_device *adev,
90 if (level == 0) 100 if (level == 0)
91 /* For the root directory */ 101 /* For the root directory */
92 return adev->vm_manager.max_pfn >> 102 return adev->vm_manager.max_pfn >>
93 (amdgpu_vm_block_size * adev->vm_manager.num_level); 103 (adev->vm_manager.block_size *
104 adev->vm_manager.num_level);
94 else if (level == adev->vm_manager.num_level) 105 else if (level == adev->vm_manager.num_level)
95 /* For the page tables on the leaves */ 106 /* For the page tables on the leaves */
96 return AMDGPU_VM_PTE_COUNT; 107 return AMDGPU_VM_PTE_COUNT(adev);
97 else 108 else
98 /* Everything in between */ 109 /* Everything in between */
99 return 1 << amdgpu_vm_block_size; 110 return 1 << adev->vm_manager.block_size;
100} 111}
101 112
102/** 113/**
@@ -261,7 +272,7 @@ static int amdgpu_vm_alloc_levels(struct amdgpu_device *adev,
261 unsigned level) 272 unsigned level)
262{ 273{
263 unsigned shift = (adev->vm_manager.num_level - level) * 274 unsigned shift = (adev->vm_manager.num_level - level) *
264 amdgpu_vm_block_size; 275 adev->vm_manager.block_size;
265 unsigned pt_idx, from, to; 276 unsigned pt_idx, from, to;
266 int r; 277 int r;
267 278
@@ -365,11 +376,19 @@ int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
365 return amdgpu_vm_alloc_levels(adev, vm, &vm->root, saddr, eaddr, 0); 376 return amdgpu_vm_alloc_levels(adev, vm, &vm->root, saddr, eaddr, 0);
366} 377}
367 378
368static bool amdgpu_vm_is_gpu_reset(struct amdgpu_device *adev, 379/**
369 struct amdgpu_vm_id *id) 380 * amdgpu_vm_had_gpu_reset - check if reset occured since last use
381 *
382 * @adev: amdgpu_device pointer
383 * @id: VMID structure
384 *
385 * Check if GPU reset occured since last use of the VMID.
386 */
387static bool amdgpu_vm_had_gpu_reset(struct amdgpu_device *adev,
388 struct amdgpu_vm_id *id)
370{ 389{
371 return id->current_gpu_reset_count != 390 return id->current_gpu_reset_count !=
372 atomic_read(&adev->gpu_reset_counter) ? true : false; 391 atomic_read(&adev->gpu_reset_counter);
373} 392}
374 393
375/** 394/**
@@ -455,7 +474,7 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
455 /* Check all the prerequisites to using this VMID */ 474 /* Check all the prerequisites to using this VMID */
456 if (!id) 475 if (!id)
457 continue; 476 continue;
458 if (amdgpu_vm_is_gpu_reset(adev, id)) 477 if (amdgpu_vm_had_gpu_reset(adev, id))
459 continue; 478 continue;
460 479
461 if (atomic64_read(&id->owner) != vm->client_id) 480 if (atomic64_read(&id->owner) != vm->client_id)
@@ -483,7 +502,6 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
483 if (r) 502 if (r)
484 goto error; 503 goto error;
485 504
486 id->current_gpu_reset_count = atomic_read(&adev->gpu_reset_counter);
487 list_move_tail(&id->list, &adev->vm_manager.ids_lru); 505 list_move_tail(&id->list, &adev->vm_manager.ids_lru);
488 vm->ids[ring->idx] = id; 506 vm->ids[ring->idx] = id;
489 507
@@ -504,9 +522,6 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
504 if (r) 522 if (r)
505 goto error; 523 goto error;
506 524
507 dma_fence_put(id->first);
508 id->first = dma_fence_get(fence);
509
510 dma_fence_put(id->last_flush); 525 dma_fence_put(id->last_flush);
511 id->last_flush = NULL; 526 id->last_flush = NULL;
512 527
@@ -557,8 +572,8 @@ static u64 amdgpu_vm_adjust_mc_addr(struct amdgpu_device *adev, u64 mc_addr)
557{ 572{
558 u64 addr = mc_addr; 573 u64 addr = mc_addr;
559 574
560 if (adev->mc.mc_funcs && adev->mc.mc_funcs->adjust_mc_addr) 575 if (adev->gart.gart_funcs->adjust_mc_addr)
561 addr = adev->mc.mc_funcs->adjust_mc_addr(adev, addr); 576 addr = adev->gart.gart_funcs->adjust_mc_addr(adev, addr);
562 577
563 return addr; 578 return addr;
564} 579}
@@ -583,60 +598,62 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job)
583 id->gws_size != job->gws_size || 598 id->gws_size != job->gws_size ||
584 id->oa_base != job->oa_base || 599 id->oa_base != job->oa_base ||
585 id->oa_size != job->oa_size); 600 id->oa_size != job->oa_size);
601 bool vm_flush_needed = job->vm_needs_flush ||
602 amdgpu_vm_ring_has_compute_vm_bug(ring);
603 unsigned patch_offset = 0;
586 int r; 604 int r;
587 605
588 if (job->vm_needs_flush || gds_switch_needed || 606 if (amdgpu_vm_had_gpu_reset(adev, id)) {
589 amdgpu_vm_is_gpu_reset(adev, id) || 607 gds_switch_needed = true;
590 amdgpu_vm_ring_has_compute_vm_bug(ring)) { 608 vm_flush_needed = true;
591 unsigned patch_offset = 0; 609 }
592 610
593 if (ring->funcs->init_cond_exec) 611 if (!vm_flush_needed && !gds_switch_needed)
594 patch_offset = amdgpu_ring_init_cond_exec(ring); 612 return 0;
595 613
596 if (ring->funcs->emit_pipeline_sync && 614 if (ring->funcs->init_cond_exec)
597 (job->vm_needs_flush || gds_switch_needed || 615 patch_offset = amdgpu_ring_init_cond_exec(ring);
598 amdgpu_vm_ring_has_compute_vm_bug(ring)))
599 amdgpu_ring_emit_pipeline_sync(ring);
600 616
601 if (ring->funcs->emit_vm_flush && (job->vm_needs_flush || 617 if (ring->funcs->emit_pipeline_sync)
602 amdgpu_vm_is_gpu_reset(adev, id))) { 618 amdgpu_ring_emit_pipeline_sync(ring);
603 struct dma_fence *fence;
604 u64 pd_addr = amdgpu_vm_adjust_mc_addr(adev, job->vm_pd_addr);
605 619
606 trace_amdgpu_vm_flush(pd_addr, ring->idx, job->vm_id); 620 if (ring->funcs->emit_vm_flush && vm_flush_needed) {
607 amdgpu_ring_emit_vm_flush(ring, job->vm_id, pd_addr); 621 u64 pd_addr = amdgpu_vm_adjust_mc_addr(adev, job->vm_pd_addr);
622 struct dma_fence *fence;
608 623
609 r = amdgpu_fence_emit(ring, &fence); 624 trace_amdgpu_vm_flush(pd_addr, ring->idx, job->vm_id);
610 if (r) 625 amdgpu_ring_emit_vm_flush(ring, job->vm_id, pd_addr);
611 return r;
612 626
613 mutex_lock(&adev->vm_manager.lock); 627 r = amdgpu_fence_emit(ring, &fence);
614 dma_fence_put(id->last_flush); 628 if (r)
615 id->last_flush = fence; 629 return r;
616 mutex_unlock(&adev->vm_manager.lock);
617 }
618 630
619 if (gds_switch_needed) { 631 mutex_lock(&adev->vm_manager.lock);
620 id->gds_base = job->gds_base; 632 dma_fence_put(id->last_flush);
621 id->gds_size = job->gds_size; 633 id->last_flush = fence;
622 id->gws_base = job->gws_base; 634 mutex_unlock(&adev->vm_manager.lock);
623 id->gws_size = job->gws_size; 635 }
624 id->oa_base = job->oa_base;
625 id->oa_size = job->oa_size;
626 amdgpu_ring_emit_gds_switch(ring, job->vm_id,
627 job->gds_base, job->gds_size,
628 job->gws_base, job->gws_size,
629 job->oa_base, job->oa_size);
630 }
631 636
632 if (ring->funcs->patch_cond_exec) 637 if (gds_switch_needed) {
633 amdgpu_ring_patch_cond_exec(ring, patch_offset); 638 id->gds_base = job->gds_base;
639 id->gds_size = job->gds_size;
640 id->gws_base = job->gws_base;
641 id->gws_size = job->gws_size;
642 id->oa_base = job->oa_base;
643 id->oa_size = job->oa_size;
644 amdgpu_ring_emit_gds_switch(ring, job->vm_id, job->gds_base,
645 job->gds_size, job->gws_base,
646 job->gws_size, job->oa_base,
647 job->oa_size);
648 }
634 649
635 /* the double SWITCH_BUFFER here *cannot* be skipped by COND_EXEC */ 650 if (ring->funcs->patch_cond_exec)
636 if (ring->funcs->emit_switch_buffer) { 651 amdgpu_ring_patch_cond_exec(ring, patch_offset);
637 amdgpu_ring_emit_switch_buffer(ring); 652
638 amdgpu_ring_emit_switch_buffer(ring); 653 /* the double SWITCH_BUFFER here *cannot* be skipped by COND_EXEC */
639 } 654 if (ring->funcs->emit_switch_buffer) {
655 amdgpu_ring_emit_switch_buffer(ring);
656 amdgpu_ring_emit_switch_buffer(ring);
640 } 657 }
641 return 0; 658 return 0;
642} 659}
@@ -960,7 +977,7 @@ static struct amdgpu_bo *amdgpu_vm_get_pt(struct amdgpu_pte_update_params *p,
960 unsigned idx, level = p->adev->vm_manager.num_level; 977 unsigned idx, level = p->adev->vm_manager.num_level;
961 978
962 while (entry->entries) { 979 while (entry->entries) {
963 idx = addr >> (amdgpu_vm_block_size * level--); 980 idx = addr >> (p->adev->vm_manager.block_size * level--);
964 idx %= amdgpu_bo_size(entry->bo) / 8; 981 idx %= amdgpu_bo_size(entry->bo) / 8;
965 entry = &entry->entries[idx]; 982 entry = &entry->entries[idx];
966 } 983 }
@@ -987,7 +1004,8 @@ static void amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,
987 uint64_t start, uint64_t end, 1004 uint64_t start, uint64_t end,
988 uint64_t dst, uint64_t flags) 1005 uint64_t dst, uint64_t flags)
989{ 1006{
990 const uint64_t mask = AMDGPU_VM_PTE_COUNT - 1; 1007 struct amdgpu_device *adev = params->adev;
1008 const uint64_t mask = AMDGPU_VM_PTE_COUNT(adev) - 1;
991 1009
992 uint64_t cur_pe_start, cur_nptes, cur_dst; 1010 uint64_t cur_pe_start, cur_nptes, cur_dst;
993 uint64_t addr; /* next GPU address to be updated */ 1011 uint64_t addr; /* next GPU address to be updated */
@@ -1011,7 +1029,7 @@ static void amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,
1011 if ((addr & ~mask) == (end & ~mask)) 1029 if ((addr & ~mask) == (end & ~mask))
1012 nptes = end - addr; 1030 nptes = end - addr;
1013 else 1031 else
1014 nptes = AMDGPU_VM_PTE_COUNT - (addr & mask); 1032 nptes = AMDGPU_VM_PTE_COUNT(adev) - (addr & mask);
1015 1033
1016 cur_pe_start = amdgpu_bo_gpu_offset(pt); 1034 cur_pe_start = amdgpu_bo_gpu_offset(pt);
1017 cur_pe_start += (addr & mask) * 8; 1035 cur_pe_start += (addr & mask) * 8;
@@ -1039,7 +1057,7 @@ static void amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,
1039 if ((addr & ~mask) == (end & ~mask)) 1057 if ((addr & ~mask) == (end & ~mask))
1040 nptes = end - addr; 1058 nptes = end - addr;
1041 else 1059 else
1042 nptes = AMDGPU_VM_PTE_COUNT - (addr & mask); 1060 nptes = AMDGPU_VM_PTE_COUNT(adev) - (addr & mask);
1043 1061
1044 next_pe_start = amdgpu_bo_gpu_offset(pt); 1062 next_pe_start = amdgpu_bo_gpu_offset(pt);
1045 next_pe_start += (addr & mask) * 8; 1063 next_pe_start += (addr & mask) * 8;
@@ -1186,7 +1204,7 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
1186 * reserve space for one command every (1 << BLOCK_SIZE) 1204 * reserve space for one command every (1 << BLOCK_SIZE)
1187 * entries or 2k dwords (whatever is smaller) 1205 * entries or 2k dwords (whatever is smaller)
1188 */ 1206 */
1189 ncmds = (nptes >> min(amdgpu_vm_block_size, 11)) + 1; 1207 ncmds = (nptes >> min(adev->vm_manager.block_size, 11u)) + 1;
1190 1208
1191 /* padding, etc. */ 1209 /* padding, etc. */
1192 ndw = 64; 1210 ndw = 64;
@@ -1301,7 +1319,7 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,
1301 struct drm_mm_node *nodes, 1319 struct drm_mm_node *nodes,
1302 struct dma_fence **fence) 1320 struct dma_fence **fence)
1303{ 1321{
1304 uint64_t pfn, src = 0, start = mapping->it.start; 1322 uint64_t pfn, src = 0, start = mapping->start;
1305 int r; 1323 int r;
1306 1324
1307 /* normally,bo_va->flags only contians READABLE and WIRTEABLE bit go here 1325 /* normally,bo_va->flags only contians READABLE and WIRTEABLE bit go here
@@ -1353,7 +1371,7 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,
1353 } 1371 }
1354 addr += pfn << PAGE_SHIFT; 1372 addr += pfn << PAGE_SHIFT;
1355 1373
1356 last = min((uint64_t)mapping->it.last, start + max_entries - 1); 1374 last = min((uint64_t)mapping->last, start + max_entries - 1);
1357 r = amdgpu_vm_bo_update_mapping(adev, exclusive, 1375 r = amdgpu_vm_bo_update_mapping(adev, exclusive,
1358 src, pages_addr, vm, 1376 src, pages_addr, vm,
1359 start, last, flags, addr, 1377 start, last, flags, addr,
@@ -1368,7 +1386,7 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,
1368 } 1386 }
1369 start = last + 1; 1387 start = last + 1;
1370 1388
1371 } while (unlikely(start != mapping->it.last + 1)); 1389 } while (unlikely(start != mapping->last + 1));
1372 1390
1373 return 0; 1391 return 0;
1374} 1392}
@@ -1518,7 +1536,7 @@ static void amdgpu_vm_add_prt_cb(struct amdgpu_device *adev,
1518 if (fence) 1536 if (fence)
1519 dma_fence_wait(fence, false); 1537 dma_fence_wait(fence, false);
1520 1538
1521 amdgpu_vm_prt_put(cb->adev); 1539 amdgpu_vm_prt_put(adev);
1522 } else { 1540 } else {
1523 cb->adev = adev; 1541 cb->adev = adev;
1524 if (!fence || dma_fence_add_callback(fence, &cb->cb, 1542 if (!fence || dma_fence_add_callback(fence, &cb->cb,
@@ -1724,9 +1742,8 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,
1724 uint64_t saddr, uint64_t offset, 1742 uint64_t saddr, uint64_t offset,
1725 uint64_t size, uint64_t flags) 1743 uint64_t size, uint64_t flags)
1726{ 1744{
1727 struct amdgpu_bo_va_mapping *mapping; 1745 struct amdgpu_bo_va_mapping *mapping, *tmp;
1728 struct amdgpu_vm *vm = bo_va->vm; 1746 struct amdgpu_vm *vm = bo_va->vm;
1729 struct interval_tree_node *it;
1730 uint64_t eaddr; 1747 uint64_t eaddr;
1731 1748
1732 /* validate the parameters */ 1749 /* validate the parameters */
@@ -1743,14 +1760,12 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,
1743 saddr /= AMDGPU_GPU_PAGE_SIZE; 1760 saddr /= AMDGPU_GPU_PAGE_SIZE;
1744 eaddr /= AMDGPU_GPU_PAGE_SIZE; 1761 eaddr /= AMDGPU_GPU_PAGE_SIZE;
1745 1762
1746 it = interval_tree_iter_first(&vm->va, saddr, eaddr); 1763 tmp = amdgpu_vm_it_iter_first(&vm->va, saddr, eaddr);
1747 if (it) { 1764 if (tmp) {
1748 struct amdgpu_bo_va_mapping *tmp;
1749 tmp = container_of(it, struct amdgpu_bo_va_mapping, it);
1750 /* bo and tmp overlap, invalid addr */ 1765 /* bo and tmp overlap, invalid addr */
1751 dev_err(adev->dev, "bo %p va 0x%010Lx-0x%010Lx conflict with " 1766 dev_err(adev->dev, "bo %p va 0x%010Lx-0x%010Lx conflict with "
1752 "0x%010lx-0x%010lx\n", bo_va->bo, saddr, eaddr, 1767 "0x%010Lx-0x%010Lx\n", bo_va->bo, saddr, eaddr,
1753 tmp->it.start, tmp->it.last + 1); 1768 tmp->start, tmp->last + 1);
1754 return -EINVAL; 1769 return -EINVAL;
1755 } 1770 }
1756 1771
@@ -1759,13 +1774,13 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,
1759 return -ENOMEM; 1774 return -ENOMEM;
1760 1775
1761 INIT_LIST_HEAD(&mapping->list); 1776 INIT_LIST_HEAD(&mapping->list);
1762 mapping->it.start = saddr; 1777 mapping->start = saddr;
1763 mapping->it.last = eaddr; 1778 mapping->last = eaddr;
1764 mapping->offset = offset; 1779 mapping->offset = offset;
1765 mapping->flags = flags; 1780 mapping->flags = flags;
1766 1781
1767 list_add(&mapping->list, &bo_va->invalids); 1782 list_add(&mapping->list, &bo_va->invalids);
1768 interval_tree_insert(&mapping->it, &vm->va); 1783 amdgpu_vm_it_insert(mapping, &vm->va);
1769 1784
1770 if (flags & AMDGPU_PTE_PRT) 1785 if (flags & AMDGPU_PTE_PRT)
1771 amdgpu_vm_prt_get(adev); 1786 amdgpu_vm_prt_get(adev);
@@ -1823,13 +1838,13 @@ int amdgpu_vm_bo_replace_map(struct amdgpu_device *adev,
1823 saddr /= AMDGPU_GPU_PAGE_SIZE; 1838 saddr /= AMDGPU_GPU_PAGE_SIZE;
1824 eaddr /= AMDGPU_GPU_PAGE_SIZE; 1839 eaddr /= AMDGPU_GPU_PAGE_SIZE;
1825 1840
1826 mapping->it.start = saddr; 1841 mapping->start = saddr;
1827 mapping->it.last = eaddr; 1842 mapping->last = eaddr;
1828 mapping->offset = offset; 1843 mapping->offset = offset;
1829 mapping->flags = flags; 1844 mapping->flags = flags;
1830 1845
1831 list_add(&mapping->list, &bo_va->invalids); 1846 list_add(&mapping->list, &bo_va->invalids);
1832 interval_tree_insert(&mapping->it, &vm->va); 1847 amdgpu_vm_it_insert(mapping, &vm->va);
1833 1848
1834 if (flags & AMDGPU_PTE_PRT) 1849 if (flags & AMDGPU_PTE_PRT)
1835 amdgpu_vm_prt_get(adev); 1850 amdgpu_vm_prt_get(adev);
@@ -1860,7 +1875,7 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev,
1860 saddr /= AMDGPU_GPU_PAGE_SIZE; 1875 saddr /= AMDGPU_GPU_PAGE_SIZE;
1861 1876
1862 list_for_each_entry(mapping, &bo_va->valids, list) { 1877 list_for_each_entry(mapping, &bo_va->valids, list) {
1863 if (mapping->it.start == saddr) 1878 if (mapping->start == saddr)
1864 break; 1879 break;
1865 } 1880 }
1866 1881
@@ -1868,7 +1883,7 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev,
1868 valid = false; 1883 valid = false;
1869 1884
1870 list_for_each_entry(mapping, &bo_va->invalids, list) { 1885 list_for_each_entry(mapping, &bo_va->invalids, list) {
1871 if (mapping->it.start == saddr) 1886 if (mapping->start == saddr)
1872 break; 1887 break;
1873 } 1888 }
1874 1889
@@ -1877,7 +1892,7 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev,
1877 } 1892 }
1878 1893
1879 list_del(&mapping->list); 1894 list_del(&mapping->list);
1880 interval_tree_remove(&mapping->it, &vm->va); 1895 amdgpu_vm_it_remove(mapping, &vm->va);
1881 trace_amdgpu_vm_bo_unmap(bo_va, mapping); 1896 trace_amdgpu_vm_bo_unmap(bo_va, mapping);
1882 1897
1883 if (valid) 1898 if (valid)
@@ -1905,7 +1920,6 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,
1905 uint64_t saddr, uint64_t size) 1920 uint64_t saddr, uint64_t size)
1906{ 1921{
1907 struct amdgpu_bo_va_mapping *before, *after, *tmp, *next; 1922 struct amdgpu_bo_va_mapping *before, *after, *tmp, *next;
1908 struct interval_tree_node *it;
1909 LIST_HEAD(removed); 1923 LIST_HEAD(removed);
1910 uint64_t eaddr; 1924 uint64_t eaddr;
1911 1925
@@ -1927,43 +1941,42 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,
1927 INIT_LIST_HEAD(&after->list); 1941 INIT_LIST_HEAD(&after->list);
1928 1942
1929 /* Now gather all removed mappings */ 1943 /* Now gather all removed mappings */
1930 it = interval_tree_iter_first(&vm->va, saddr, eaddr); 1944 tmp = amdgpu_vm_it_iter_first(&vm->va, saddr, eaddr);
1931 while (it) { 1945 while (tmp) {
1932 tmp = container_of(it, struct amdgpu_bo_va_mapping, it);
1933 it = interval_tree_iter_next(it, saddr, eaddr);
1934
1935 /* Remember mapping split at the start */ 1946 /* Remember mapping split at the start */
1936 if (tmp->it.start < saddr) { 1947 if (tmp->start < saddr) {
1937 before->it.start = tmp->it.start; 1948 before->start = tmp->start;
1938 before->it.last = saddr - 1; 1949 before->last = saddr - 1;
1939 before->offset = tmp->offset; 1950 before->offset = tmp->offset;
1940 before->flags = tmp->flags; 1951 before->flags = tmp->flags;
1941 list_add(&before->list, &tmp->list); 1952 list_add(&before->list, &tmp->list);
1942 } 1953 }
1943 1954
1944 /* Remember mapping split at the end */ 1955 /* Remember mapping split at the end */
1945 if (tmp->it.last > eaddr) { 1956 if (tmp->last > eaddr) {
1946 after->it.start = eaddr + 1; 1957 after->start = eaddr + 1;
1947 after->it.last = tmp->it.last; 1958 after->last = tmp->last;
1948 after->offset = tmp->offset; 1959 after->offset = tmp->offset;
1949 after->offset += after->it.start - tmp->it.start; 1960 after->offset += after->start - tmp->start;
1950 after->flags = tmp->flags; 1961 after->flags = tmp->flags;
1951 list_add(&after->list, &tmp->list); 1962 list_add(&after->list, &tmp->list);
1952 } 1963 }
1953 1964
1954 list_del(&tmp->list); 1965 list_del(&tmp->list);
1955 list_add(&tmp->list, &removed); 1966 list_add(&tmp->list, &removed);
1967
1968 tmp = amdgpu_vm_it_iter_next(tmp, saddr, eaddr);
1956 } 1969 }
1957 1970
1958 /* And free them up */ 1971 /* And free them up */
1959 list_for_each_entry_safe(tmp, next, &removed, list) { 1972 list_for_each_entry_safe(tmp, next, &removed, list) {
1960 interval_tree_remove(&tmp->it, &vm->va); 1973 amdgpu_vm_it_remove(tmp, &vm->va);
1961 list_del(&tmp->list); 1974 list_del(&tmp->list);
1962 1975
1963 if (tmp->it.start < saddr) 1976 if (tmp->start < saddr)
1964 tmp->it.start = saddr; 1977 tmp->start = saddr;
1965 if (tmp->it.last > eaddr) 1978 if (tmp->last > eaddr)
1966 tmp->it.last = eaddr; 1979 tmp->last = eaddr;
1967 1980
1968 list_add(&tmp->list, &vm->freed); 1981 list_add(&tmp->list, &vm->freed);
1969 trace_amdgpu_vm_bo_unmap(NULL, tmp); 1982 trace_amdgpu_vm_bo_unmap(NULL, tmp);
@@ -1971,7 +1984,7 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,
1971 1984
1972 /* Insert partial mapping before the range */ 1985 /* Insert partial mapping before the range */
1973 if (!list_empty(&before->list)) { 1986 if (!list_empty(&before->list)) {
1974 interval_tree_insert(&before->it, &vm->va); 1987 amdgpu_vm_it_insert(before, &vm->va);
1975 if (before->flags & AMDGPU_PTE_PRT) 1988 if (before->flags & AMDGPU_PTE_PRT)
1976 amdgpu_vm_prt_get(adev); 1989 amdgpu_vm_prt_get(adev);
1977 } else { 1990 } else {
@@ -1980,7 +1993,7 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,
1980 1993
1981 /* Insert partial mapping after the range */ 1994 /* Insert partial mapping after the range */
1982 if (!list_empty(&after->list)) { 1995 if (!list_empty(&after->list)) {
1983 interval_tree_insert(&after->it, &vm->va); 1996 amdgpu_vm_it_insert(after, &vm->va);
1984 if (after->flags & AMDGPU_PTE_PRT) 1997 if (after->flags & AMDGPU_PTE_PRT)
1985 amdgpu_vm_prt_get(adev); 1998 amdgpu_vm_prt_get(adev);
1986 } else { 1999 } else {
@@ -2014,13 +2027,13 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
2014 2027
2015 list_for_each_entry_safe(mapping, next, &bo_va->valids, list) { 2028 list_for_each_entry_safe(mapping, next, &bo_va->valids, list) {
2016 list_del(&mapping->list); 2029 list_del(&mapping->list);
2017 interval_tree_remove(&mapping->it, &vm->va); 2030 amdgpu_vm_it_remove(mapping, &vm->va);
2018 trace_amdgpu_vm_bo_unmap(bo_va, mapping); 2031 trace_amdgpu_vm_bo_unmap(bo_va, mapping);
2019 list_add(&mapping->list, &vm->freed); 2032 list_add(&mapping->list, &vm->freed);
2020 } 2033 }
2021 list_for_each_entry_safe(mapping, next, &bo_va->invalids, list) { 2034 list_for_each_entry_safe(mapping, next, &bo_va->invalids, list) {
2022 list_del(&mapping->list); 2035 list_del(&mapping->list);
2023 interval_tree_remove(&mapping->it, &vm->va); 2036 amdgpu_vm_it_remove(mapping, &vm->va);
2024 amdgpu_vm_free_mapping(adev, vm, mapping, 2037 amdgpu_vm_free_mapping(adev, vm, mapping,
2025 bo_va->last_pt_update); 2038 bo_va->last_pt_update);
2026 } 2039 }
@@ -2062,7 +2075,7 @@ void amdgpu_vm_bo_invalidate(struct amdgpu_device *adev,
2062int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) 2075int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)
2063{ 2076{
2064 const unsigned align = min(AMDGPU_VM_PTB_ALIGN_SIZE, 2077 const unsigned align = min(AMDGPU_VM_PTB_ALIGN_SIZE,
2065 AMDGPU_VM_PTE_COUNT * 8); 2078 AMDGPU_VM_PTE_COUNT(adev) * 8);
2066 unsigned ring_instance; 2079 unsigned ring_instance;
2067 struct amdgpu_ring *ring; 2080 struct amdgpu_ring *ring;
2068 struct amd_sched_rq *rq; 2081 struct amd_sched_rq *rq;
@@ -2162,9 +2175,9 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
2162 if (!RB_EMPTY_ROOT(&vm->va)) { 2175 if (!RB_EMPTY_ROOT(&vm->va)) {
2163 dev_err(adev->dev, "still active bo inside vm\n"); 2176 dev_err(adev->dev, "still active bo inside vm\n");
2164 } 2177 }
2165 rbtree_postorder_for_each_entry_safe(mapping, tmp, &vm->va, it.rb) { 2178 rbtree_postorder_for_each_entry_safe(mapping, tmp, &vm->va, rb) {
2166 list_del(&mapping->list); 2179 list_del(&mapping->list);
2167 interval_tree_remove(&mapping->it, &vm->va); 2180 amdgpu_vm_it_remove(mapping, &vm->va);
2168 kfree(mapping); 2181 kfree(mapping);
2169 } 2182 }
2170 list_for_each_entry_safe(mapping, tmp, &vm->freed, list) { 2183 list_for_each_entry_safe(mapping, tmp, &vm->freed, list) {
@@ -2227,7 +2240,6 @@ void amdgpu_vm_manager_fini(struct amdgpu_device *adev)
2227 for (i = 0; i < AMDGPU_NUM_VM; ++i) { 2240 for (i = 0; i < AMDGPU_NUM_VM; ++i) {
2228 struct amdgpu_vm_id *id = &adev->vm_manager.ids[i]; 2241 struct amdgpu_vm_id *id = &adev->vm_manager.ids[i];
2229 2242
2230 dma_fence_put(adev->vm_manager.ids[i].first);
2231 amdgpu_sync_free(&adev->vm_manager.ids[i].active); 2243 amdgpu_sync_free(&adev->vm_manager.ids[i].active);
2232 dma_fence_put(id->flushed_updates); 2244 dma_fence_put(id->flushed_updates);
2233 dma_fence_put(id->last_flush); 2245 dma_fence_put(id->last_flush);