diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0757-drm-amdgpu-psp-init-de-init-xgmi-ta-microcode.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0757-drm-amdgpu-psp-init-de-init-xgmi-ta-microcode.patch | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0757-drm-amdgpu-psp-init-de-init-xgmi-ta-microcode.patch b/meta-amd-bsp/recipes-kernel/linux-4.19/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/meta-amd-bsp/recipes-kernel/linux-4.19/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 + |