aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3787-drm-amdgpu-sriov-add-ring_stop-before-ring_create-in.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3787-drm-amdgpu-sriov-add-ring_stop-before-ring_create-in.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3787-drm-amdgpu-sriov-add-ring_stop-before-ring_create-in.patch108
1 files changed, 108 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3787-drm-amdgpu-sriov-add-ring_stop-before-ring_create-in.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3787-drm-amdgpu-sriov-add-ring_stop-before-ring_create-in.patch
new file mode 100644
index 00000000..e5d7b5db
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3787-drm-amdgpu-sriov-add-ring_stop-before-ring_create-in.patch
@@ -0,0 +1,108 @@
+From d9d44114bec4855d582d50108a2a13f1c833148c Mon Sep 17 00:00:00 2001
+From: Jack Zhang <Jack.Zhang1@amd.com>
+Date: Tue, 10 Sep 2019 12:29:14 +0800
+Subject: [PATCH 3787/4256] drm/amdgpu/sriov: add ring_stop before ring_create
+ in psp v11 code
+
+psp v11 code missed ring stop in ring create function(VMR)
+while psp v3.1 code had the code. This will cause VM destroy1
+fail and psp ring create fail.
+
+For SIOV-VF, ring_stop should not be deleted in ring_create
+function.
+
+Signed-off-by: Jack Zhang <Jack.Zhang1@amd.com>
+Reviewed-by: Feifei Xu <Feifei.Xu@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/psp_v11_0.c | 61 ++++++++++++++------------
+ 1 file changed, 34 insertions(+), 27 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
+index 9d5d44cfe813..54de388ae114 100644
+--- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
+@@ -407,6 +407,34 @@ static bool psp_v11_0_support_vmr_ring(struct psp_context *psp)
+ return false;
+ }
+
++static int psp_v11_0_ring_stop(struct psp_context *psp,
++ enum psp_ring_type ring_type)
++{
++ int ret = 0;
++ struct amdgpu_device *adev = psp->adev;
++
++ /* Write the ring destroy command*/
++ if (psp_v11_0_support_vmr_ring(psp))
++ WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101,
++ GFX_CTRL_CMD_ID_DESTROY_GPCOM_RING);
++ else
++ WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_64,
++ GFX_CTRL_CMD_ID_DESTROY_RINGS);
++
++ /* there might be handshake issue with hardware which needs delay */
++ mdelay(20);
++
++ /* Wait for response flag (bit 31) */
++ if (psp_v11_0_support_vmr_ring(psp))
++ ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),
++ 0x80000000, 0x80000000, false);
++ else
++ ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
++ 0x80000000, 0x80000000, false);
++
++ return ret;
++}
++
+ static int psp_v11_0_ring_create(struct psp_context *psp,
+ enum psp_ring_type ring_type)
+ {
+@@ -416,6 +444,12 @@ static int psp_v11_0_ring_create(struct psp_context *psp,
+ struct amdgpu_device *adev = psp->adev;
+
+ if (psp_v11_0_support_vmr_ring(psp)) {
++ ret = psp_v11_0_ring_stop(psp, ring_type);
++ if (ret) {
++ DRM_ERROR("psp_v11_0_ring_stop_sriov failed!\n");
++ return ret;
++ }
++
+ /* Write low address of the ring to C2PMSG_102 */
+ psp_ring_reg = lower_32_bits(ring->ring_mem_mc_addr);
+ WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, psp_ring_reg);
+@@ -460,33 +494,6 @@ static int psp_v11_0_ring_create(struct psp_context *psp,
+ return ret;
+ }
+
+-static int psp_v11_0_ring_stop(struct psp_context *psp,
+- enum psp_ring_type ring_type)
+-{
+- int ret = 0;
+- struct amdgpu_device *adev = psp->adev;
+-
+- /* Write the ring destroy command*/
+- if (psp_v11_0_support_vmr_ring(psp))
+- WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101,
+- GFX_CTRL_CMD_ID_DESTROY_GPCOM_RING);
+- else
+- WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_64,
+- GFX_CTRL_CMD_ID_DESTROY_RINGS);
+-
+- /* there might be handshake issue with hardware which needs delay */
+- mdelay(20);
+-
+- /* Wait for response flag (bit 31) */
+- if (psp_v11_0_support_vmr_ring(psp))
+- ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),
+- 0x80000000, 0x80000000, false);
+- else
+- ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
+- 0x80000000, 0x80000000, false);
+-
+- return ret;
+-}
+
+ static int psp_v11_0_ring_destroy(struct psp_context *psp,
+ enum psp_ring_type ring_type)
+--
+2.17.1
+