diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1684-drm-amdgpu-defer-cmd-fence-fw-buffers-destroy-on-hw_.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/1684-drm-amdgpu-defer-cmd-fence-fw-buffers-destroy-on-hw_.patch | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1684-drm-amdgpu-defer-cmd-fence-fw-buffers-destroy-on-hw_.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1684-drm-amdgpu-defer-cmd-fence-fw-buffers-destroy-on-hw_.patch new file mode 100644 index 00000000..115f4e4f --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1684-drm-amdgpu-defer-cmd-fence-fw-buffers-destroy-on-hw_.patch @@ -0,0 +1,95 @@ +From 5f53a427623c6bbe17fdd7b9f9e0546a9ac5e089 Mon Sep 17 00:00:00 2001 +From: Evan Quan <evan.quan@amd.com> +Date: Fri, 15 Mar 2019 16:25:15 +0800 +Subject: [PATCH 1684/2940] drm/amdgpu: defer cmd/fence/fw buffers destroy on + hw_init failure + +As the cleanup jobs performed in pre_fini may still need these +buffers. NULL pointer dereference will be triggered without them. + +Change-Id: I398efd652584e022debf237950207199a4ea78fc +Signed-off-by: Evan Quan <evan.quan@amd.com> +Reviewed-by: Feifei Xu <Feifei.Xu@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 31 ++++++++++--------------- + 1 file changed, 12 insertions(+), 19 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +index 6e8c5feec1ec..f4ae1204e197 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +@@ -893,59 +893,52 @@ static int psp_load_fw(struct amdgpu_device *adev) + &psp->fence_buf_mc_addr, + &psp->fence_buf); + if (ret) +- goto failed_mem2; ++ goto failed; + + ret = amdgpu_bo_create_kernel(adev, PSP_CMD_BUFFER_SIZE, PAGE_SIZE, + AMDGPU_GEM_DOMAIN_VRAM, + &psp->cmd_buf_bo, &psp->cmd_buf_mc_addr, + (void **)&psp->cmd_buf_mem); + if (ret) +- goto failed_mem1; ++ goto failed; + + memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE); + + ret = psp_ring_init(psp, PSP_RING_TYPE__KM); + if (ret) { + DRM_ERROR("PSP ring init failed!\n"); +- goto failed_mem; ++ goto failed; + } + + ret = psp_tmr_init(psp); + if (ret) { + DRM_ERROR("PSP tmr init failed!\n"); +- goto failed_mem; ++ goto failed; + } + + ret = psp_asd_init(psp); + if (ret) { + DRM_ERROR("PSP asd init failed!\n"); +- goto failed_mem; ++ goto failed; + } + + skip_memalloc: + ret = psp_hw_start(psp); + if (ret) +- goto failed_mem; ++ goto failed; + + ret = psp_np_fw_load(psp); + if (ret) +- goto failed_mem; ++ goto failed; + + return 0; + +-failed_mem: +- amdgpu_bo_free_kernel(&psp->cmd_buf_bo, +- &psp->cmd_buf_mc_addr, +- (void **)&psp->cmd_buf_mem); +-failed_mem1: +- amdgpu_bo_free_kernel(&psp->fence_buf_bo, +- &psp->fence_buf_mc_addr, &psp->fence_buf); +-failed_mem2: +- amdgpu_bo_free_kernel(&psp->fw_pri_bo, +- &psp->fw_pri_mc_addr, &psp->fw_pri_buf); + failed: +- kfree(psp->cmd); +- psp->cmd = NULL; ++ /* ++ * all cleanup jobs (xgmi terminate, ras terminate, ++ * ring destroy, cmd/fence/fw buffers destory, ++ * psp->cmd destory) are delayed to psp_hw_fini ++ */ + return ret; + } + +-- +2.17.1 + |