aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1684-drm-amdgpu-defer-cmd-fence-fw-buffers-destroy-on-hw_.patch
diff options
context:
space:
mode:
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_.patch95
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
+