diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 230 |
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 | |||
58 | INTERVAL_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 | ||
368 | static 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 | */ | ||
387 | static 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, | |||
2062 | int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) | 2075 | int 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); |