summaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorEvan Quan <evan.quan@amd.com>2018-12-20 09:44:54 -0500
committerAlex Deucher <alexander.deucher@amd.com>2018-12-21 15:26:49 -0500
commit06d6370e7b200882ab23bafd86a4024c7571c778 (patch)
tree5c77ceed2c7efb710518b9ba6e420977f7fa3d6e /drivers/gpu
parent8c9d90eebd23b6d40ddf4ce5df5ca2b932336a06 (diff)
drm/amdgpu: add Vega20 PSP ASD firmware loading
Add PSP ASD firmware loading on Vega20. Not sure why this was missing before. Signed-off-by: Evan Quan <evan.quan@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/psp_v11_0.c40
1 files changed, 31 insertions, 9 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
index 138d552bb022..0c6e7f9b143f 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 @@
34#include "nbio/nbio_7_4_offset.h" 34#include "nbio/nbio_7_4_offset.h"
35 35
36MODULE_FIRMWARE("amdgpu/vega20_sos.bin"); 36MODULE_FIRMWARE("amdgpu/vega20_sos.bin");
37MODULE_FIRMWARE("amdgpu/vega20_asd.bin");
37MODULE_FIRMWARE("amdgpu/vega20_ta.bin"); 38MODULE_FIRMWARE("amdgpu/vega20_ta.bin");
38 39
39/* address block */ 40/* address block */
@@ -100,6 +101,7 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
100 char fw_name[30]; 101 char fw_name[30];
101 int err = 0; 102 int err = 0;
102 const struct psp_firmware_header_v1_0 *sos_hdr; 103 const struct psp_firmware_header_v1_0 *sos_hdr;
104 const struct psp_firmware_header_v1_0 *asd_hdr;
103 const struct ta_firmware_header_v1_0 *ta_hdr; 105 const struct ta_firmware_header_v1_0 *ta_hdr;
104 106
105 DRM_DEBUG("\n"); 107 DRM_DEBUG("\n");
@@ -132,14 +134,30 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
132 adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr + 134 adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr +
133 le32_to_cpu(sos_hdr->sos_offset_bytes); 135 le32_to_cpu(sos_hdr->sos_offset_bytes);
134 136
137 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name);
138 err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
139 if (err)
140 goto out1;
141
142 err = amdgpu_ucode_validate(adev->psp.asd_fw);
143 if (err)
144 goto out1;
145
146 asd_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data;
147 adev->psp.asd_fw_version = le32_to_cpu(asd_hdr->header.ucode_version);
148 adev->psp.asd_feature_version = le32_to_cpu(asd_hdr->ucode_feature_version);
149 adev->psp.asd_ucode_size = le32_to_cpu(asd_hdr->header.ucode_size_bytes);
150 adev->psp.asd_start_addr = (uint8_t *)asd_hdr +
151 le32_to_cpu(asd_hdr->header.ucode_array_offset_bytes);
152
135 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);
136 err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); 154 err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev);
137 if (err) 155 if (err)
138 goto out; 156 goto out2;
139 157
140 err = amdgpu_ucode_validate(adev->psp.ta_fw); 158 err = amdgpu_ucode_validate(adev->psp.ta_fw);
141 if (err) 159 if (err)
142 goto out; 160 goto out2;
143 161
144 ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data; 162 ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data;
145 adev->psp.ta_xgmi_ucode_version = le32_to_cpu(ta_hdr->ta_xgmi_ucode_version); 163 adev->psp.ta_xgmi_ucode_version = le32_to_cpu(ta_hdr->ta_xgmi_ucode_version);
@@ -148,14 +166,18 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
148 le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes); 166 le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes);
149 167
150 return 0; 168 return 0;
169
170out2:
171 release_firmware(adev->psp.ta_fw);
172 adev->psp.ta_fw = NULL;
173out1:
174 release_firmware(adev->psp.asd_fw);
175 adev->psp.asd_fw = NULL;
151out: 176out:
152 if (err) { 177 dev_err(adev->dev,
153 dev_err(adev->dev, 178 "psp v11.0: Failed to load firmware \"%s\"\n", fw_name);
154 "psp v11.0: Failed to load firmware \"%s\"\n", 179 release_firmware(adev->psp.sos_fw);
155 fw_name); 180 adev->psp.sos_fw = NULL;
156 release_firmware(adev->psp.sos_fw);
157 adev->psp.sos_fw = NULL;
158 }
159 181
160 return err; 182 return err;
161} 183}