diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/0011-drm-amdgpu-fix-and-cleanup-VM-ready-check.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/0011-drm-amdgpu-fix-and-cleanup-VM-ready-check.patch | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/0011-drm-amdgpu-fix-and-cleanup-VM-ready-check.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/0011-drm-amdgpu-fix-and-cleanup-VM-ready-check.patch new file mode 100644 index 00000000..11d0530d --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/0011-drm-amdgpu-fix-and-cleanup-VM-ready-check.patch @@ -0,0 +1,138 @@ +From 66d694efa3ee79ddf831b60c2bd3a26946939ef1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Thu, 24 Aug 2017 12:32:55 +0200 +Subject: [PATCH 0011/4131] drm/amdgpu: fix and cleanup VM ready check +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Stop checking the mapped BO itself, cause that one is +certainly not a page table. + +Additional to that move the code into amdgpu_vm.c + +Signed-off-by: Christian König <christian.koenig@amd.com> +Reviewed-by: Chunming Zhou <david1.zhou@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 33 ++------------------------------- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 32 ++++++++++++++++++++++++++++++++ + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 1 + + 3 files changed, 35 insertions(+), 31 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +index 837332e..dea0b75 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +@@ -125,35 +125,6 @@ int amdgpu_gem_object_open(struct drm_gem_object *obj, + return 0; + } + +-static int amdgpu_gem_vm_check(void *param, struct amdgpu_bo *bo) +-{ +- /* if anything is swapped out don't swap it in here, +- just abort and wait for the next CS */ +- if (!amdgpu_bo_gpu_accessible(bo)) +- return -ERESTARTSYS; +- +- if (bo->shadow && !amdgpu_bo_gpu_accessible(bo->shadow)) +- return -ERESTARTSYS; +- +- return 0; +-} +- +-static bool amdgpu_gem_vm_ready(struct amdgpu_device *adev, +- struct amdgpu_vm *vm, +- struct list_head *list) +-{ +- struct ttm_validate_buffer *entry; +- +- list_for_each_entry(entry, list, head) { +- struct amdgpu_bo *bo = +- container_of(entry->bo, struct amdgpu_bo, tbo); +- if (amdgpu_gem_vm_check(NULL, bo)) +- return false; +- } +- +- return !amdgpu_vm_validate_pt_bos(adev, vm, amdgpu_gem_vm_check, NULL); +-} +- + void amdgpu_gem_object_close(struct drm_gem_object *obj, + struct drm_file *file_priv) + { +@@ -187,7 +158,7 @@ void amdgpu_gem_object_close(struct drm_gem_object *obj, + if (bo_va && --bo_va->ref_count == 0) { + amdgpu_vm_bo_rmv(adev, bo_va); + +- if (amdgpu_gem_vm_ready(adev, vm, &list)) { ++ if (amdgpu_vm_ready(adev, vm)) { + struct dma_fence *fence = NULL; + + r = amdgpu_vm_clear_freed(adev, vm, &fence); +@@ -511,7 +482,7 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, + { + int r = -ERESTARTSYS; + +- if (!amdgpu_gem_vm_ready(adev, vm, list)) ++ if (!amdgpu_vm_ready(adev, vm)) + goto error; + + r = amdgpu_vm_update_directories(adev, vm); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +index b469c10..f56889b 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +@@ -232,6 +232,38 @@ int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm, + } + + /** ++ * amdgpu_vm_check - helper for amdgpu_vm_ready ++ */ ++static int amdgpu_vm_check(void *param, struct amdgpu_bo *bo) ++{ ++ /* if anything is swapped out don't swap it in here, ++ just abort and wait for the next CS */ ++ if (!amdgpu_bo_gpu_accessible(bo)) ++ return -ERESTARTSYS; ++ ++ if (bo->shadow && !amdgpu_bo_gpu_accessible(bo->shadow)) ++ return -ERESTARTSYS; ++ ++ return 0; ++} ++ ++/** ++ * amdgpu_vm_ready - check VM is ready for updates ++ * ++ * @adev: amdgpu device ++ * @vm: VM to check ++ * ++ * Check if all VM PDs/PTs are ready for updates ++ */ ++bool amdgpu_vm_ready(struct amdgpu_device *adev, struct amdgpu_vm *vm) ++{ ++ if (amdgpu_vm_check(NULL, vm->root.bo)) ++ return false; ++ ++ return !amdgpu_vm_validate_pt_bos(adev, vm, amdgpu_vm_check, NULL); ++} ++ ++/** + * amdgpu_vm_alloc_levels - allocate the PD/PT levels + * + * @adev: amdgpu_device pointer +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +index 6716355..48ba604 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +@@ -225,6 +225,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm); + void amdgpu_vm_get_pd_bo(struct amdgpu_vm *vm, + struct list_head *validated, + struct amdgpu_bo_list_entry *entry); ++bool amdgpu_vm_ready(struct amdgpu_device *adev, struct amdgpu_vm *vm); + int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm, + int (*callback)(void *p, struct amdgpu_bo *bo), + void *param); +-- +2.7.4 + |