aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4532-drm-amdgpu-add-psp-funcs-for-ring-write-pointer-read.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4532-drm-amdgpu-add-psp-funcs-for-ring-write-pointer-read.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4532-drm-amdgpu-add-psp-funcs-for-ring-write-pointer-read.patch217
1 files changed, 217 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4532-drm-amdgpu-add-psp-funcs-for-ring-write-pointer-read.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4532-drm-amdgpu-add-psp-funcs-for-ring-write-pointer-read.patch
new file mode 100644
index 00000000..597ca5c1
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4532-drm-amdgpu-add-psp-funcs-for-ring-write-pointer-read.patch
@@ -0,0 +1,217 @@
+From 5a274a9eba4f444bec6d0550400b726deb5ce4e4 Mon Sep 17 00:00:00 2001
+From: Hawking Zhang <Hawking.Zhang@amd.com>
+Date: Mon, 18 Nov 2019 17:13:56 +0800
+Subject: [PATCH 4532/4736] drm/amdgpu: add psp funcs for ring write pointer
+ read/write
+
+The ring write pointer regsiter update is the only part that
+is IP specific ones in psp_cmd_submit function.
+
+Add two callbacks for wptr read/write so that we unify the
+psp_cmd_submit function for all the ASICs.
+
+Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
+Reviewed-by: John Clements <john.clements@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h | 5 +++++
+ drivers/gpu/drm/amd/amdgpu/psp_v10_0.c | 16 +++++++++++++++
+ drivers/gpu/drm/amd/amdgpu/psp_v11_0.c | 26 ++++++++++++++++++++++++
+ drivers/gpu/drm/amd/amdgpu/psp_v12_0.c | 26 ++++++++++++++++++++++++
+ drivers/gpu/drm/amd/amdgpu/psp_v3_1.c | 27 +++++++++++++++++++++++++
+ 5 files changed, 100 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+index 09c5474ebcc3..d5620c46f3fc 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+@@ -116,6 +116,8 @@ struct psp_funcs
+ int (*mem_training_init)(struct psp_context *psp);
+ void (*mem_training_fini)(struct psp_context *psp);
+ int (*mem_training)(struct psp_context *psp, uint32_t ops);
++ uint32_t (*ring_get_wptr)(struct psp_context *psp);
++ void (*ring_set_wptr)(struct psp_context *psp, uint32_t value);
+ };
+
+ #define AMDGPU_XGMI_MAX_CONNECTED_NODES 64
+@@ -346,6 +348,9 @@ struct amdgpu_psp_funcs {
+ ((psp)->funcs->ras_cure_posion ? \
+ (psp)->funcs->ras_cure_posion(psp, (addr)) : -EINVAL)
+
++#define psp_ring_get_wptr(psp) (psp)->funcs->ring_get_wptr((psp))
++#define psp_ring_set_wptr(psp, value) (psp)->funcs->ring_set_wptr((psp), (value))
++
+ extern const struct amd_ip_funcs psp_ip_funcs;
+
+ extern const struct amdgpu_ip_block_version psp_v3_1_ip_block;
+diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
+index ed8beff02e62..b8a461d46cb5 100644
+--- a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
+@@ -404,6 +404,20 @@ static int psp_v10_0_mode1_reset(struct psp_context *psp)
+ return -EINVAL;
+ }
+
++static uint32_t psp_v10_0_ring_get_wptr(struct psp_context *psp)
++{
++ struct amdgpu_device *adev = psp->adev;
++
++ return RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67);
++}
++
++static void psp_v10_0_ring_set_wptr(struct psp_context *psp, uint32_t value)
++{
++ struct amdgpu_device *adev = psp->adev;
++
++ WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, value);
++}
++
+ static const struct psp_funcs psp_v10_0_funcs = {
+ .init_microcode = psp_v10_0_init_microcode,
+ .ring_init = psp_v10_0_ring_init,
+@@ -413,6 +427,8 @@ static const struct psp_funcs psp_v10_0_funcs = {
+ .cmd_submit = psp_v10_0_cmd_submit,
+ .compare_sram_data = psp_v10_0_compare_sram_data,
+ .mode1_reset = psp_v10_0_mode1_reset,
++ .ring_get_wptr = psp_v10_0_ring_get_wptr,
++ .ring_set_wptr = psp_v10_0_ring_set_wptr,
+ };
+
+ void psp_v10_0_set_psp_funcs(struct psp_context *psp)
+diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
+index 0875ece1bea2..68f4cd7311a8 100644
+--- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
+@@ -1076,6 +1076,30 @@ static int psp_v11_0_memory_training(struct psp_context *psp, uint32_t ops)
+ return 0;
+ }
+
++static uint32_t psp_v11_0_ring_get_wptr(struct psp_context *psp)
++{
++ uint32_t data;
++ struct amdgpu_device *adev = psp->adev;
++
++ if (psp_v11_0_support_vmr_ring(psp))
++ data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102);
++ else
++ data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67);
++
++ return data;
++}
++
++static void psp_v11_0_ring_set_wptr(struct psp_context *psp, uint32_t value)
++{
++ struct amdgpu_device *adev = psp->adev;
++
++ if (psp_v11_0_support_vmr_ring(psp)) {
++ WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, value);
++ WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, GFX_CTRL_CMD_ID_CONSUME_CMD);
++ } else
++ WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, value);
++}
++
+ static const struct psp_funcs psp_v11_0_funcs = {
+ .init_microcode = psp_v11_0_init_microcode,
+ .bootloader_load_kdb = psp_v11_0_bootloader_load_kdb,
+@@ -1099,6 +1123,8 @@ static const struct psp_funcs psp_v11_0_funcs = {
+ .mem_training_init = psp_v11_0_memory_training_init,
+ .mem_training_fini = psp_v11_0_memory_training_fini,
+ .mem_training = psp_v11_0_memory_training,
++ .ring_get_wptr = psp_v11_0_ring_get_wptr,
++ .ring_set_wptr = psp_v11_0_ring_set_wptr,
+ };
+
+ void psp_v11_0_set_psp_funcs(struct psp_context *psp)
+diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v12_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v12_0.c
+index 8f553f6f92d6..75b3f9d15a18 100644
+--- a/drivers/gpu/drm/amd/amdgpu/psp_v12_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/psp_v12_0.c
+@@ -547,6 +547,30 @@ static int psp_v12_0_mode1_reset(struct psp_context *psp)
+ return 0;
+ }
+
++static uint32_t psp_v12_0_ring_get_wptr(struct psp_context *psp)
++{
++ uint32_t data;
++ struct amdgpu_device *adev = psp->adev;
++
++ if (psp_v12_0_support_vmr_ring(psp))
++ data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102);
++ else
++ data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67);
++
++ return data;
++}
++
++static void psp_v12_0_ring_set_wptr(struct psp_context *psp, uint32_t value)
++{
++ struct amdgpu_device *adev = psp->adev;
++
++ if (psp_v12_0_support_vmr_ring(psp)) {
++ WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, value);
++ WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, GFX_CTRL_CMD_ID_CONSUME_CMD);
++ } else
++ WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, value);
++}
++
+ static const struct psp_funcs psp_v12_0_funcs = {
+ .init_microcode = psp_v12_0_init_microcode,
+ .bootloader_load_sysdrv = psp_v12_0_bootloader_load_sysdrv,
+@@ -558,6 +582,8 @@ static const struct psp_funcs psp_v12_0_funcs = {
+ .cmd_submit = psp_v12_0_cmd_submit,
+ .compare_sram_data = psp_v12_0_compare_sram_data,
+ .mode1_reset = psp_v12_0_mode1_reset,
++ .ring_get_wptr = psp_v12_0_ring_get_wptr,
++ .ring_set_wptr = psp_v12_0_ring_set_wptr,
+ };
+
+ void psp_v12_0_set_psp_funcs(struct psp_context *psp)
+diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
+index f652241aa71a..1de86e550a90 100644
+--- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
++++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
+@@ -640,6 +640,31 @@ static bool psp_v3_1_support_vmr_ring(struct psp_context *psp)
+ return false;
+ }
+
++static uint32_t psp_v3_1_ring_get_wptr(struct psp_context *psp)
++{
++ uint32_t data;
++ struct amdgpu_device *adev = psp->adev;
++
++ if (psp_v3_1_support_vmr_ring(psp))
++ data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102);
++ else
++ data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67);
++ return data;
++}
++
++static void psp_v3_1_ring_set_wptr(struct psp_context *psp, uint32_t value)
++{
++ struct amdgpu_device *adev = psp->adev;
++
++ if (psp_v3_1_support_vmr_ring(psp)) {
++ WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, value);
++ /* send interrupt to PSP for SRIOV ring write pointer update */
++ WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101,
++ GFX_CTRL_CMD_ID_CONSUME_CMD);
++ } else
++ WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, value);
++}
++
+ static const struct psp_funcs psp_v3_1_funcs = {
+ .init_microcode = psp_v3_1_init_microcode,
+ .bootloader_load_sysdrv = psp_v3_1_bootloader_load_sysdrv,
+@@ -653,6 +678,8 @@ static const struct psp_funcs psp_v3_1_funcs = {
+ .smu_reload_quirk = psp_v3_1_smu_reload_quirk,
+ .mode1_reset = psp_v3_1_mode1_reset,
+ .support_vmr_ring = psp_v3_1_support_vmr_ring,
++ .ring_get_wptr = psp_v3_1_ring_get_wptr,
++ .ring_set_wptr = psp_v3_1_ring_set_wptr,
+ };
+
+ void psp_v3_1_set_psp_funcs(struct psp_context *psp)
+--
+2.17.1
+