aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2855-drm-amdgpu-support-key-database-loading-for-navi10.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2855-drm-amdgpu-support-key-database-loading-for-navi10.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2855-drm-amdgpu-support-key-database-loading-for-navi10.patch188
1 files changed, 188 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2855-drm-amdgpu-support-key-database-loading-for-navi10.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2855-drm-amdgpu-support-key-database-loading-for-navi10.patch
new file mode 100644
index 00000000..cc476475
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2855-drm-amdgpu-support-key-database-loading-for-navi10.patch
@@ -0,0 +1,188 @@
+From 3cc8460275f60dac732a6902ee6ebd397da262e7 Mon Sep 17 00:00:00 2001
+From: Hawking Zhang <Hawking.Zhang@amd.com>
+Date: Thu, 11 Jul 2019 00:13:54 +0800
+Subject: [PATCH 2855/2940] drm/amdgpu: support key database loading for navi10
+
+Starting from navi10, driver should send Key Database Load command
+to bootloader before loading sys_drv and sos
+
+Change-Id: Ibba76748c90156e3ab9ab0e91f897d2e650735f4
+Signed-off-by: John Clements <John.Clements@amd.com>
+Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
+Reviewed-by: Xiaojie Yuan <xiaojie.yuan@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 9 +++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h | 5 +++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | 6 +++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h | 3 ++
+ drivers/gpu/drm/amd/amdgpu/psp_v11_0.c | 48 ++++++++++++++++++++++-
+ 5 files changed, 70 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+index 8a4f8c3b5b5d..44446b178085 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+@@ -773,6 +773,15 @@ static int psp_hw_start(struct psp_context *psp)
+ int ret;
+
+ if (!amdgpu_sriov_vf(adev) || !adev->in_gpu_reset) {
++ if (psp->kdb_start_addr &&
++ (psp->funcs->bootloader_load_kdb != NULL)) {
++ ret = psp_bootloader_load_kdb(psp);
++ if (ret) {
++ DRM_ERROR("PSP load kdb failed!\n");
++ return ret;
++ }
++ }
++
+ ret = psp_bootloader_load_sysdrv(psp);
+ if (ret) {
+ DRM_ERROR("PSP load sysdrv failed!\n");
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+index 6dcad432de1b..e0fc2a790e53 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+@@ -79,6 +79,7 @@ enum psp_reg_prog_id {
+ struct psp_funcs
+ {
+ int (*init_microcode)(struct psp_context *psp);
++ int (*bootloader_load_kdb)(struct psp_context *psp);
+ int (*bootloader_load_sysdrv)(struct psp_context *psp);
+ int (*bootloader_load_sos)(struct psp_context *psp);
+ int (*ring_init)(struct psp_context *psp, enum psp_ring_type ring_type);
+@@ -162,9 +163,11 @@ struct psp_context
+ uint32_t sys_bin_size;
+ uint32_t sos_bin_size;
+ uint32_t toc_bin_size;
++ uint32_t kdb_bin_size;
+ uint8_t *sys_start_addr;
+ uint8_t *sos_start_addr;
+ uint8_t *toc_start_addr;
++ uint8_t *kdb_start_addr;
+
+ /* tmr buffer */
+ struct amdgpu_bo *tmr_bo;
+@@ -226,6 +229,8 @@ struct amdgpu_psp_funcs {
+ (psp)->funcs->compare_sram_data((psp), (ucode), (type))
+ #define psp_init_microcode(psp) \
+ ((psp)->funcs->init_microcode ? (psp)->funcs->init_microcode((psp)) : 0)
++#define psp_bootloader_load_kdb(psp) \
++ ((psp)->funcs->bootloader_load_kdb ? (psp)->funcs->bootloader_load_kdb((psp)) : 0)
+ #define psp_bootloader_load_sysdrv(psp) \
+ ((psp)->funcs->bootloader_load_sysdrv ? (psp)->funcs->bootloader_load_sysdrv((psp)) : 0)
+ #define psp_bootloader_load_sos(psp) \
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
+index bf7e8ba86b4a..2042b6059127 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
+@@ -262,6 +262,12 @@ void amdgpu_ucode_print_psp_hdr(const struct common_firmware_header *hdr)
+ le32_to_cpu(psp_hdr_v1_1->toc_offset_bytes));
+ DRM_DEBUG("toc_size_bytes: %u\n",
+ le32_to_cpu(psp_hdr_v1_1->toc_size_bytes));
++ DRM_DEBUG("kdb_header_version: %u\n",
++ le32_to_cpu(psp_hdr_v1_1->kdb_header_version));
++ DRM_DEBUG("kdb_offset_bytes: %u\n",
++ le32_to_cpu(psp_hdr_v1_1->kdb_offset_bytes));
++ DRM_DEBUG("kdb_size_bytes: %u\n",
++ le32_to_cpu(psp_hdr_v1_1->kdb_size_bytes));
+ }
+ } else {
+ DRM_ERROR("Unknown PSP ucode version: %u.%u\n",
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
+index f46944453c6e..c1fb6dc86440 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
+@@ -85,6 +85,9 @@ struct psp_firmware_header_v1_1 {
+ uint32_t toc_header_version;
+ uint32_t toc_offset_bytes;
+ uint32_t toc_size_bytes;
++ uint32_t kdb_header_version;
++ uint32_t kdb_offset_bytes;
++ uint32_t kdb_size_bytes;
+ };
+
+ /* version_major=1, version_minor=0 */
+diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
+index 4496b2e56627..3b8d8a89b1b4 100644
+--- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
+@@ -116,6 +116,9 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
+ adev->psp.toc_bin_size = le32_to_cpu(sos_hdr_v1_1->toc_size_bytes);
+ adev->psp.toc_start_addr = (uint8_t *)adev->psp.sys_start_addr +
+ le32_to_cpu(sos_hdr_v1_1->toc_offset_bytes);
++ adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_1->kdb_size_bytes);
++ adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr +
++ le32_to_cpu(sos_hdr_v1_1->kdb_offset_bytes);
+ }
+ break;
+ default:
+@@ -191,6 +194,48 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
+ return err;
+ }
+
++static int psp_v11_0_bootloader_load_kdb(struct psp_context *psp)
++{
++ int ret;
++ uint32_t psp_gfxdrv_command_reg = 0;
++ struct amdgpu_device *adev = psp->adev;
++ uint32_t sol_reg;
++
++ /* Check tOS sign of life register to confirm sys driver and sOS
++ * are already been loaded.
++ */
++ sol_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81);
++ if (sol_reg) {
++ psp->sos_fw_version = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_58);
++ dev_info(adev->dev, "sos fw version = 0x%x.\n", psp->sos_fw_version);
++ return 0;
++ }
++
++ /* Wait for bootloader to signify that is ready having bit 31 of C2PMSG_35 set to 1 */
++ ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
++ 0x80000000, 0x80000000, false);
++ if (ret)
++ return ret;
++
++ memset(psp->fw_pri_buf, 0, PSP_1_MEG);
++
++ /* Copy PSP KDB binary to memory */
++ memcpy(psp->fw_pri_buf, psp->kdb_start_addr, psp->kdb_bin_size);
++
++ /* Provide the sys driver to bootloader */
++ WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36,
++ (uint32_t)(psp->fw_pri_mc_addr >> 20));
++ psp_gfxdrv_command_reg = PSP_BL__LOAD_KEY_DATABASE;
++ WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_35,
++ psp_gfxdrv_command_reg);
++
++ /* Wait for bootloader to signify that is ready having bit 31 of C2PMSG_35 set to 1*/
++ ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
++ 0x80000000, 0x80000000, false);
++
++ return ret;
++}
++
+ static int psp_v11_0_bootloader_load_sysdrv(struct psp_context *psp)
+ {
+ int ret;
+@@ -204,7 +249,7 @@ static int psp_v11_0_bootloader_load_sysdrv(struct psp_context *psp)
+ sol_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81);
+ if (sol_reg) {
+ psp->sos_fw_version = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_58);
+- printk("sos fw version = 0x%x.\n", psp->sos_fw_version);
++ dev_info(adev->dev, "sos fw version = 0x%x.\n", psp->sos_fw_version);
+ return 0;
+ }
+
+@@ -836,6 +881,7 @@ static int psp_v11_0_rlc_autoload_start(struct psp_context *psp)
+
+ 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,
+ .bootloader_load_sysdrv = psp_v11_0_bootloader_load_sysdrv,
+ .bootloader_load_sos = psp_v11_0_bootloader_load_sos,
+ .ring_init = psp_v11_0_ring_init,
+--
+2.17.1
+