diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 9 | ||||
| -rw-r--r-- | 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 8fab0d637ee5..3a9b48b227ac 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | |||
| @@ -90,8 +90,10 @@ static int psp_sw_fini(void *handle) | |||
| 90 | adev->psp.sos_fw = NULL; | 90 | adev->psp.sos_fw = NULL; |
| 91 | release_firmware(adev->psp.asd_fw); | 91 | release_firmware(adev->psp.asd_fw); |
| 92 | adev->psp.asd_fw = NULL; | 92 | adev->psp.asd_fw = NULL; |
| 93 | release_firmware(adev->psp.ta_fw); | 93 | if (adev->psp.ta_fw) { |
| 94 | adev->psp.ta_fw = NULL; | 94 | release_firmware(adev->psp.ta_fw); |
| 95 | adev->psp.ta_fw = NULL; | ||
| 96 | } | ||
| 95 | return 0; | 97 | return 0; |
| 96 | } | 98 | } |
| 97 | 99 | ||
| @@ -435,6 +437,9 @@ static int psp_xgmi_initialize(struct psp_context *psp) | |||
| 435 | struct ta_xgmi_shared_memory *xgmi_cmd; | 437 | struct ta_xgmi_shared_memory *xgmi_cmd; |
| 436 | int ret; | 438 | int ret; |
| 437 | 439 | ||
| 440 | if (!psp->adev->psp.ta_fw) | ||
| 441 | return -ENOENT; | ||
| 442 | |||
| 438 | if (!psp->xgmi_context.initialized) { | 443 | if (!psp->xgmi_context.initialized) { |
| 439 | ret = psp_xgmi_init_shared_buf(psp); | 444 | ret = psp_xgmi_init_shared_buf(psp); |
| 440 | if (ret) | 445 | 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 0c6e7f9b143f..189fcb004579 100644 --- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c | |||
| @@ -152,18 +152,22 @@ static int psp_v11_0_init_microcode(struct psp_context *psp) | |||
| 152 | 152 | ||
| 153 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name); | 153 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name); |
| 154 | err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); | 154 | err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); |
| 155 | if (err) | 155 | if (err) { |
| 156 | goto out2; | 156 | release_firmware(adev->psp.ta_fw); |
| 157 | 157 | adev->psp.ta_fw = NULL; | |
| 158 | err = amdgpu_ucode_validate(adev->psp.ta_fw); | 158 | dev_info(adev->dev, |
| 159 | if (err) | 159 | "psp v11.0: Failed to load firmware \"%s\"\n", fw_name); |
| 160 | goto out2; | 160 | } else { |
| 161 | 161 | err = amdgpu_ucode_validate(adev->psp.ta_fw); | |
| 162 | ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data; | 162 | if (err) |
| 163 | adev->psp.ta_xgmi_ucode_version = le32_to_cpu(ta_hdr->ta_xgmi_ucode_version); | 163 | goto out2; |
| 164 | adev->psp.ta_xgmi_ucode_size = le32_to_cpu(ta_hdr->ta_xgmi_size_bytes); | 164 | |
| 165 | adev->psp.ta_xgmi_start_addr = (uint8_t *)ta_hdr + | 165 | ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data; |
| 166 | le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes); | 166 | adev->psp.ta_xgmi_ucode_version = le32_to_cpu(ta_hdr->ta_xgmi_ucode_version); |
| 167 | adev->psp.ta_xgmi_ucode_size = le32_to_cpu(ta_hdr->ta_xgmi_size_bytes); | ||
| 168 | adev->psp.ta_xgmi_start_addr = (uint8_t *)ta_hdr + | ||
| 169 | le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes); | ||
| 170 | } | ||
| 167 | 171 | ||
| 168 | return 0; | 172 | return 0; |
| 169 | 173 | ||
