diff options
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.patch | 87 |
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 + |