aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/0757-drm-amdgpu-psp-init-de-init-xgmi-ta-microcode.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0757-drm-amdgpu-psp-init-de-init-xgmi-ta-microcode.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/0757-drm-amdgpu-psp-init-de-init-xgmi-ta-microcode.patch126
1 files changed, 126 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0757-drm-amdgpu-psp-init-de-init-xgmi-ta-microcode.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0757-drm-amdgpu-psp-init-de-init-xgmi-ta-microcode.patch
new file mode 100644
index 00000000..58bfbdf7
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0757-drm-amdgpu-psp-init-de-init-xgmi-ta-microcode.patch
@@ -0,0 +1,126 @@
+From f4d40a43d1d1a9b1c04517cab02cdeca2f1b2388 Mon Sep 17 00:00:00 2001
+From: Hawking Zhang <Hawking.Zhang@amd.com>
+Date: Thu, 11 Oct 2018 21:48:00 +0800
+Subject: [PATCH 0757/2940] drm/amdgpu/psp: init/de-init xgmi ta microcode
+
+Add ucode handling for psp xgmi ta firmware.
+
+Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 2 ++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h | 12 +++++++
+ drivers/gpu/drm/amd/amdgpu/psp_v11_0.c | 38 +++++++++++++++++------
+ 3 files changed, 42 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+index aa1cb20ef0ae..b36c4dffff66 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+@@ -91,6 +91,8 @@ static int psp_sw_fini(void *handle)
+ adev->psp.sos_fw = NULL;
+ release_firmware(adev->psp.asd_fw);
+ adev->psp.asd_fw = NULL;
++ release_firmware(adev->psp.ta_fw);
++ adev->psp.ta_fw = NULL;
+ return 0;
+ }
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
+index aa6641b944a0..7ac25a1c7853 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
+@@ -57,6 +57,17 @@ struct psp_firmware_header_v1_0 {
+ uint32_t sos_size_bytes;
+ };
+
++/* version_major=1, version_minor=0 */
++struct ta_firmware_header_v1_0 {
++ struct common_firmware_header header;
++ uint32_t ta_xgmi_ucode_version;
++ uint32_t ta_xgmi_offset_bytes;
++ uint32_t ta_xgmi_size_bytes;
++ uint32_t ta_ras_ucode_version;
++ uint32_t ta_ras_offset_bytes;
++ uint32_t ta_ras_size_bytes;
++};
++
+ /* version_major=1, version_minor=0 */
+ struct gfx_firmware_header_v1_0 {
+ struct common_firmware_header header;
+@@ -170,6 +181,7 @@ union amdgpu_firmware_header {
+ struct mc_firmware_header_v1_0 mc;
+ struct smc_firmware_header_v1_0 smc;
+ struct psp_firmware_header_v1_0 psp;
++ struct ta_firmware_header_v1_0 ta;
+ struct gfx_firmware_header_v1_0 gfx;
+ struct rlc_firmware_header_v1_0 rlc;
+ struct rlc_firmware_header_v2_0 rlc_v2_0;
+diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
+index 5f066979f59c..2d338ee5fade 100644
+--- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
+@@ -34,6 +34,7 @@
+ #include "nbio/nbio_7_4_offset.h"
+
+ MODULE_FIRMWARE("amdgpu/vega20_sos.bin");
++MODULE_FIRMWARE("amdgpu/vega20_ta.bin");
+ MODULE_FIRMWARE("amdgpu/vega20_sos_old.bin");
+
+ /* address block */
+@@ -101,7 +102,8 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
+ const char *chip_name;
+ char fw_name[30];
+ int err = 0;
+- const struct psp_firmware_header_v1_0 *hdr;
++ const struct psp_firmware_header_v1_0 *sos_hdr;
++ const struct ta_firmware_header_v1_0 *ta_hdr;
+ uint32_t bl_version;
+
+ DRM_DEBUG("\n");
+@@ -129,16 +131,32 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
+ if (err)
+ goto out;
+
+- hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data;
+- adev->psp.sos_fw_version = le32_to_cpu(hdr->header.ucode_version);
+- adev->psp.sos_feature_version = le32_to_cpu(hdr->ucode_feature_version);
+- adev->psp.sos_bin_size = le32_to_cpu(hdr->sos_size_bytes);
+- adev->psp.sys_bin_size = le32_to_cpu(hdr->header.ucode_size_bytes) -
+- le32_to_cpu(hdr->sos_size_bytes);
+- adev->psp.sys_start_addr = (uint8_t *)hdr +
+- le32_to_cpu(hdr->header.ucode_array_offset_bytes);
++ sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data;
++ adev->psp.sos_fw_version = le32_to_cpu(sos_hdr->header.ucode_version);
++ adev->psp.sos_feature_version = le32_to_cpu(sos_hdr->ucode_feature_version);
++ adev->psp.sos_bin_size = le32_to_cpu(sos_hdr->sos_size_bytes);
++ adev->psp.sys_bin_size = le32_to_cpu(sos_hdr->header.ucode_size_bytes) -
++ le32_to_cpu(sos_hdr->sos_size_bytes);
++ adev->psp.sys_start_addr = (uint8_t *)sos_hdr +
++ le32_to_cpu(sos_hdr->header.ucode_array_offset_bytes);
+ adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr +
+- le32_to_cpu(hdr->sos_offset_bytes);
++ le32_to_cpu(sos_hdr->sos_offset_bytes);
++
++ snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name);
++ err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev);
++ if (err)
++ goto out;
++
++ err = amdgpu_ucode_validate(adev->psp.ta_fw);
++ if (err)
++ goto out;
++
++ ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data;
++ adev->psp.ta_xgmi_ucode_version = le32_to_cpu(ta_hdr->ta_xgmi_ucode_version);
++ adev->psp.ta_xgmi_ucode_size = le32_to_cpu(ta_hdr->ta_xgmi_size_bytes);
++ adev->psp.ta_xgmi_start_addr = (uint8_t *)ta_hdr +
++ le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes);
++
+ return 0;
+ out:
+ if (err) {
+--
+2.17.1
+