From: Hawking Zhang <[email protected]>

Add ucode handling for psp xgmi ta firmware.

Signed-off-by: Hawking Zhang <[email protected]>
Acked-by: Alex Deucher <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 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 a18a8c91d52b..b00592d60132 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -90,6 +90,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
@@ -58,6 +58,17 @@ struct psp_firmware_header_v1_0 {
 };
 
 /* 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;
        uint32_t ucode_feature_version;
@@ -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 2372f4220ecb..902b0e6a02bf 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");
 
 /* address block */
 #define smnMP1_FIRMWARE_FLAGS          0x3010024
@@ -98,7 +99,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;
 
        DRM_DEBUG("\n");
 
@@ -119,16 +121,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.13.6

_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to