[PATCH 3/7] drm/amdgpu: let amdgpu_vm_clear_bo figure out ats status
Kuehling, Felix
Felix.Kuehling at amd.com
Wed Feb 20 00:42:40 UTC 2019
On 2019-02-19 8:40 a.m., Christian König wrote:
> Instead of providing it from outside figure out the ats status in the
> function itself from the data structures.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
One suggestion inline. Other than that this patch is Reviewed-by: Felix
Kuehling <Felix.Kuehling at amd.com>
Regards,
Felix
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 52 ++++++++++++++------------
> 1 file changed, 29 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index 3c7b98a758c9..48da4ac76837 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -747,8 +747,6 @@ bool amdgpu_vm_ready(struct amdgpu_vm *vm)
> * @adev: amdgpu_device pointer
> * @vm: VM to clear BO from
> * @bo: BO to clear
> - * @level: level this BO is at
> - * @pte_support_ats: indicate ATS support from PTE
> *
> * Root PD needs to be reserved when calling this.
> *
> @@ -756,10 +754,11 @@ bool amdgpu_vm_ready(struct amdgpu_vm *vm)
> * 0 on success, errno otherwise.
> */
> static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,
> - struct amdgpu_vm *vm, struct amdgpu_bo *bo,
> - unsigned level, bool pte_support_ats)
> + struct amdgpu_vm *vm,
> + struct amdgpu_bo *bo)
> {
> struct ttm_operation_ctx ctx = { true, false };
> + unsigned level = adev->vm_manager.root_level;
> struct dma_fence *fence = NULL;
> unsigned entries, ats_entries;
> struct amdgpu_ring *ring;
> @@ -768,17 +767,32 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,
> int r;
>
> entries = amdgpu_bo_size(bo) / 8;
> + if (vm->pte_support_ats) {
> + ats_entries = amdgpu_vm_level_shift(adev, level);
> + ats_entries += AMDGPU_GPU_PAGE_SHIFT;
> + ats_entries = AMDGPU_GMC_HOLE_START >> ats_entries;
>
> - if (pte_support_ats) {
> - if (level == adev->vm_manager.root_level) {
> - ats_entries = amdgpu_vm_level_shift(adev, level);
> - ats_entries += AMDGPU_GPU_PAGE_SHIFT;
> - ats_entries = AMDGPU_GMC_HOLE_START >> ats_entries;
> + if (!bo->parent) {
> ats_entries = min(ats_entries, entries);
> entries -= ats_entries;
> } else {
> - ats_entries = entries;
> - entries = 0;
> + struct amdgpu_bo *ancestor = bo;
> + struct amdgpu_vm_pt *pt;
> +
> + ++level;
> + while (ancestor->parent->parent) {
> + ancestor = ancestor->parent;
> + ++level;
> + }
This could be simplified as
do {
ancestor = ancestor->parent;
++level;
} while (ancestor->parent);
> +
> + pt = container_of(ancestor->vm_bo, struct amdgpu_vm_pt,
> + base);
> + if ((pt - vm->root.entries) >= ats_entries) {
> + ats_entries = 0;
> + } else {
> + ats_entries = entries;
> + entries = 0;
> + }
> }
> } else {
> ats_entries = 0;
> @@ -911,7 +925,6 @@ int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
> {
> struct amdgpu_vm_pt_cursor cursor;
> struct amdgpu_bo *pt;
> - bool ats = false;
> uint64_t eaddr;
> int r;
>
> @@ -921,9 +934,6 @@ int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
>
> eaddr = saddr + size - 1;
>
> - if (vm->pte_support_ats)
> - ats = saddr < AMDGPU_GMC_HOLE_START;
> -
> saddr /= AMDGPU_GPU_PAGE_SIZE;
> eaddr /= AMDGPU_GPU_PAGE_SIZE;
>
> @@ -972,7 +982,7 @@ int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
>
> amdgpu_vm_bo_base_init(&entry->base, vm, pt);
>
> - r = amdgpu_vm_clear_bo(adev, vm, pt, cursor.level, ats);
> + r = amdgpu_vm_clear_bo(adev, vm, pt);
> if (r)
> goto error_free_pt;
> }
> @@ -3047,9 +3057,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
>
> amdgpu_vm_bo_base_init(&vm->root.base, vm, root);
>
> - r = amdgpu_vm_clear_bo(adev, vm, root,
> - adev->vm_manager.root_level,
> - vm->pte_support_ats);
> + r = amdgpu_vm_clear_bo(adev, vm, root);
> if (r)
> goto error_unreserve;
>
> @@ -3144,9 +3152,8 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm, uns
> * changing any other state, in case it fails.
> */
> if (pte_support_ats != vm->pte_support_ats) {
> - r = amdgpu_vm_clear_bo(adev, vm, vm->root.base.bo,
> - adev->vm_manager.root_level,
> - pte_support_ats);
> + vm->pte_support_ats = pte_support_ats;
> + r = amdgpu_vm_clear_bo(adev, vm, vm->root.base.bo);
> if (r)
> goto free_idr;
> }
> @@ -3154,7 +3161,6 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm, uns
> /* Update VM state */
> vm->use_cpu_for_update = !!(adev->vm_manager.vm_update_mode &
> AMDGPU_VM_USE_CPU_FOR_COMPUTE);
> - vm->pte_support_ats = pte_support_ats;
> DRM_DEBUG_DRIVER("VM update mode is %s\n",
> vm->use_cpu_for_update ? "CPU" : "SDMA");
> WARN_ONCE((vm->use_cpu_for_update && !amdgpu_gmc_vram_full_visible(&adev->gmc)),
More information about the amd-gfx
mailing list