aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c16
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(&params, vm, start, last + 1, addr, flags);
1020 params.shadow = false;
1007 amdgpu_vm_frag_ptes(&params, vm, start, last + 1, addr, flags); 1021 amdgpu_vm_frag_ptes(&params, vm, start, last + 1, addr, flags);
1008 1022
1009 amdgpu_ring_pad_ib(ring, params.ib); 1023 amdgpu_ring_pad_ib(ring, params.ib);