diff options
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 1eae307cdfd4..d2824d97b7e5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -65,6 +65,8 @@ struct amdgpu_pte_update_params { | |||
65 | void (*func)(struct amdgpu_pte_update_params *params, uint64_t pe, | 65 | void (*func)(struct amdgpu_pte_update_params *params, uint64_t pe, |
66 | uint64_t addr, unsigned count, uint32_t incr, | 66 | uint64_t addr, unsigned count, uint32_t incr, |
67 | uint32_t flags); | 67 | uint32_t flags); |
68 | /* indicate update pt or its shadow */ | ||
69 | bool shadow; | ||
68 | }; | 70 | }; |
69 | 71 | ||
70 | /** | 72 | /** |
@@ -761,7 +763,11 @@ static void amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params, | |||
761 | addr = start; | 763 | addr = start; |
762 | pt_idx = addr >> amdgpu_vm_block_size; | 764 | pt_idx = addr >> amdgpu_vm_block_size; |
763 | pt = vm->page_tables[pt_idx].entry.robj; | 765 | pt = vm->page_tables[pt_idx].entry.robj; |
764 | 766 | if (params->shadow) { | |
767 | if (!pt->shadow) | ||
768 | return; | ||
769 | pt = vm->page_tables[pt_idx].entry.robj->shadow; | ||
770 | } | ||
765 | if ((addr & ~mask) == (end & ~mask)) | 771 | if ((addr & ~mask) == (end & ~mask)) |
766 | nptes = end - addr; | 772 | nptes = end - addr; |
767 | else | 773 | else |
@@ -780,6 +786,11 @@ static void amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params, | |||
780 | while (addr < end) { | 786 | while (addr < end) { |
781 | pt_idx = addr >> amdgpu_vm_block_size; | 787 | pt_idx = addr >> amdgpu_vm_block_size; |
782 | pt = vm->page_tables[pt_idx].entry.robj; | 788 | pt = vm->page_tables[pt_idx].entry.robj; |
789 | if (params->shadow) { | ||
790 | if (!pt->shadow) | ||
791 | return; | ||
792 | pt = vm->page_tables[pt_idx].entry.robj->shadow; | ||
793 | } | ||
783 | 794 | ||
784 | if ((addr & ~mask) == (end & ~mask)) | 795 | if ((addr & ~mask) == (end & ~mask)) |
785 | nptes = end - addr; | 796 | nptes = end - addr; |
@@ -1004,6 +1015,9 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev, | |||
1004 | if (r) | 1015 | if (r) |
1005 | goto error_free; | 1016 | goto error_free; |
1006 | 1017 | ||
1018 | params.shadow = true; | ||
1019 | amdgpu_vm_frag_ptes(¶ms, vm, start, last + 1, addr, flags); | ||
1020 | params.shadow = false; | ||
1007 | amdgpu_vm_frag_ptes(¶ms, vm, start, last + 1, addr, flags); | 1021 | amdgpu_vm_frag_ptes(¶ms, vm, start, last + 1, addr, flags); |
1008 | 1022 | ||
1009 | amdgpu_ring_pad_ib(ring, params.ib); | 1023 | amdgpu_ring_pad_ib(ring, params.ib); |