Change-Id: I5a8c0f4c1e9b65d2310ccb0f669b478884072a11 Signed-off-by: Chunming Zhou <David1.Zhou at amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 71 +++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 23 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index b0bf0aa..141ccf4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -112,6 +112,14 @@ void amdgpu_vm_get_pd_bo(struct amdgpu_vm *vm, list_add(&entry->tv.head, validated); } +static bool amdgpu_vm_need_backup(struct amdgpu_device *adev) +{ + if (adev->flags & AMD_IS_APU) + return false; + + return amdgpu_lockup_timeout > 0 ? true : false; +} + /** * amdgpu_vm_get_bos - add the vm BOs to a duplicates list * @@ -140,13 +148,18 @@ void amdgpu_vm_get_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm, struct amdgpu_bo_list_entry *entry = &vm->page_tables[i].entry; struct amdgpu_bo_list_entry *entry_shadow = &vm->page_tables[i].entry_shadow; - if (!entry->robj || !entry_shadow->robj) + if (!entry->robj) + continue; + + if (amdgpu_vm_need_backup(adev) && !entry_shadow->robj) continue; list_add(&entry->tv.head, duplicates); - list_add(&entry_shadow->tv.head, duplicates); + if (amdgpu_vm_need_backup(adev)) + list_add(&entry_shadow->tv.head, duplicates); } - list_add(&vm->pd_entry_shadow.tv.head, duplicates); + if (amdgpu_vm_need_backup(adev)) + list_add(&vm->pd_entry_shadow.tv.head, duplicates); } /** @@ -747,6 +760,8 @@ int amdgpu_vm_recover_page_table_from_shadow(struct amdgpu_device *adev, uint64_t pt_idx; int r; + if (!amdgpu_vm_need_backup(adev)) + return 0; /* bo and shadow use same resv, so reverve one time */ r = amdgpu_bo_reserve(vm->page_directory, false); if (unlikely(r != 0)) @@ -801,9 +816,12 @@ int amdgpu_vm_update_page_directory(struct amdgpu_device *adev, { int r; - r = amdgpu_vm_update_pd_or_shadow(adev, vm, true); - if (r) - return r; + if (amdgpu_vm_need_backup(adev)) { + r = amdgpu_vm_update_pd_or_shadow(adev, vm, true); + if (r) + return r; + } + return amdgpu_vm_update_pd_or_shadow(adev, vm, false); } @@ -1069,10 +1087,11 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev, r = reservation_object_reserve_shared(vm->page_directory->tbo.resv); if (r) goto error_free; - /* update shadow pt bo */ - amdgpu_vm_update_ptes(adev, &vm_update_params, vm, start, - last + 1, addr, flags, true); - + if (amdgpu_vm_need_backup(adev)) { + /* update shadow pt bo */ + amdgpu_vm_update_ptes(adev, &vm_update_params, vm, start, + last + 1, addr, flags, true); + } amdgpu_vm_update_ptes(adev, &vm_update_params, vm, start, last + 1, addr, flags, false); @@ -1455,7 +1474,8 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, AMDGPU_GPU_PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM, AMDGPU_GEM_CREATE_NO_CPU_ACCESS | - AMDGPU_GEM_CREATE_SHADOW, + (amdgpu_vm_need_backup(adev) ? + AMDGPU_GEM_CREATE_SHADOW : 0), NULL, resv, &pt); if (r) goto error_free; @@ -1478,12 +1498,14 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, entry->user_pages = NULL; vm->page_tables[pt_idx].addr = 0; - entry_shadow->robj = pt->shadow; - entry_shadow->priority = 0; - entry_shadow->tv.bo = &entry_shadow->robj->tbo; - entry_shadow->tv.shared = true; - entry_shadow->user_pages = NULL; - vm->page_tables[pt_idx].addr_shadow = 0; + if (amdgpu_vm_need_backup(adev)) { + entry_shadow->robj = pt->shadow; + entry_shadow->priority = 0; + entry_shadow->tv.bo = &entry_shadow->robj->tbo; + entry_shadow->tv.shared = true; + entry_shadow->user_pages = NULL; + vm->page_tables[pt_idx].addr_shadow = 0; + } } return 0; @@ -1664,7 +1686,8 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) r = amdgpu_bo_create(adev, pd_size, align, true, AMDGPU_GEM_DOMAIN_VRAM, AMDGPU_GEM_CREATE_NO_CPU_ACCESS | - AMDGPU_GEM_CREATE_SHADOW, + (amdgpu_vm_need_backup(adev) ? + AMDGPU_GEM_CREATE_SHADOW : 0), NULL, NULL, &vm->page_directory); if (r) goto error_free_sched_entity; @@ -1679,11 +1702,13 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) goto error_free_page_directory; vm->last_eviction_counter = atomic64_read(&adev->num_evictions); - vm->pd_entry_shadow.robj = vm->page_directory->shadow; - vm->pd_entry_shadow.priority = 0; - vm->pd_entry_shadow.tv.bo = &vm->page_directory->shadow->tbo; - vm->pd_entry_shadow.tv.shared = true; - vm->pd_entry_shadow.user_pages = NULL; + if (amdgpu_vm_need_backup(adev)) { + vm->pd_entry_shadow.robj = vm->page_directory->shadow; + vm->pd_entry_shadow.priority = 0; + vm->pd_entry_shadow.tv.bo = &vm->page_directory->shadow->tbo; + vm->pd_entry_shadow.tv.shared = true; + vm->pd_entry_shadow.user_pages = NULL; + } spin_lock(&adev->vm_list_lock); list_add_tail(&vm->list, &adev->vm_list); spin_unlock(&adev->vm_list_lock); -- 1.9.1