aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1244-drm-amdgpu-psp11-TA-firmware-is-optional-v3.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1244-drm-amdgpu-psp11-TA-firmware-is-optional-v3.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1244-drm-amdgpu-psp11-TA-firmware-is-optional-v3.patch87
1 files changed, 87 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1244-drm-amdgpu-psp11-TA-firmware-is-optional-v3.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1244-drm-amdgpu-psp11-TA-firmware-is-optional-v3.patch
new file mode 100644
index 00000000..e2dca57d
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1244-drm-amdgpu-psp11-TA-firmware-is-optional-v3.patch
@@ -0,0 +1,87 @@
+From 9bb5df3d3b06c7b391d94826bce23f3c38cab95f Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Tue, 12 Feb 2019 09:54:31 -0500
+Subject: [PATCH 1244/2940] drm/amdgpu/psp11: TA firmware is optional (v3)
+
+Don't warn or fail if it's missing.
+
+v2: handle xgmi case more gracefully.
+v3: handle older kernels properly
+
+Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
+Tested-by: James Zhu <James.Zhu@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 9 ++++++--
+ drivers/gpu/drm/amd/amdgpu/psp_v11_0.c | 28 ++++++++++++++-----------
+ 2 files changed, 23 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+index b2a48a32fa27..a4de6da19219 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+@@ -85,8 +85,10 @@ 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;
++ if (adev->psp.ta_fw) {
++ release_firmware(adev->psp.ta_fw);
++ adev->psp.ta_fw = NULL;
++ }
+ return 0;
+ }
+
+@@ -444,6 +446,9 @@ static int psp_xgmi_initialize(struct psp_context *psp)
+ struct ta_xgmi_shared_memory *xgmi_cmd;
+ int ret;
+
++ if (!psp->adev->psp.ta_fw)
++ return -ENOENT;
++
+ if (!psp->xgmi_context.initialized) {
+ ret = psp_xgmi_init_shared_buf(psp);
+ if (ret)
+diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
+index 7c68b9c6e546..15a29e2bcb22 100644
+--- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
+@@ -108,18 +108,22 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
+
+ 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 out2;
+-
+- err = amdgpu_ucode_validate(adev->psp.ta_fw);
+- if (err)
+- goto out2;
+-
+- 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);
++ if (err) {
++ release_firmware(adev->psp.ta_fw);
++ adev->psp.ta_fw = NULL;
++ dev_info(adev->dev,
++ "psp v11.0: Failed to load firmware \"%s\"\n", fw_name);
++ } else {
++ err = amdgpu_ucode_validate(adev->psp.ta_fw);
++ if (err)
++ goto out2;
++
++ 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;
+
+--
+2.17.1
+