aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c67
1 files changed, 63 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
index be16377128c3..73c3e664d99a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
@@ -217,6 +217,49 @@ bool amdgpu_ucode_hdr_version(union amdgpu_firmware_header *hdr,
217 return true; 217 return true;
218} 218}
219 219
220enum amdgpu_firmware_load_type
221amdgpu_ucode_get_load_type(struct amdgpu_device *adev, int load_type)
222{
223 switch (adev->asic_type) {
224#ifdef CONFIG_DRM_AMDGPU_SI
225 case CHIP_TAHITI:
226 case CHIP_PITCAIRN:
227 case CHIP_VERDE:
228 case CHIP_OLAND:
229 return AMDGPU_FW_LOAD_DIRECT;
230#endif
231#ifdef CONFIG_DRM_AMDGPU_CIK
232 case CHIP_BONAIRE:
233 case CHIP_KAVERI:
234 case CHIP_KABINI:
235 case CHIP_HAWAII:
236 case CHIP_MULLINS:
237 return AMDGPU_FW_LOAD_DIRECT;
238#endif
239 case CHIP_TOPAZ:
240 case CHIP_TONGA:
241 case CHIP_FIJI:
242 case CHIP_CARRIZO:
243 case CHIP_STONEY:
244 case CHIP_POLARIS10:
245 case CHIP_POLARIS11:
246 case CHIP_POLARIS12:
247 if (!load_type)
248 return AMDGPU_FW_LOAD_DIRECT;
249 else
250 return AMDGPU_FW_LOAD_SMU;
251 case CHIP_VEGA10:
252 if (!load_type)
253 return AMDGPU_FW_LOAD_DIRECT;
254 else
255 return AMDGPU_FW_LOAD_PSP;
256 default:
257 DRM_ERROR("Unknow firmware load type\n");
258 }
259
260 return AMDGPU_FW_LOAD_DIRECT;
261}
262
220static int amdgpu_ucode_init_single_fw(struct amdgpu_firmware_info *ucode, 263static int amdgpu_ucode_init_single_fw(struct amdgpu_firmware_info *ucode,
221 uint64_t mc_addr, void *kptr) 264 uint64_t mc_addr, void *kptr)
222{ 265{
@@ -273,7 +316,7 @@ int amdgpu_ucode_init_bo(struct amdgpu_device *adev)
273 uint64_t fw_mc_addr; 316 uint64_t fw_mc_addr;
274 void *fw_buf_ptr = NULL; 317 void *fw_buf_ptr = NULL;
275 uint64_t fw_offset = 0; 318 uint64_t fw_offset = 0;
276 int i, err; 319 int i, err, max;
277 struct amdgpu_firmware_info *ucode = NULL; 320 struct amdgpu_firmware_info *ucode = NULL;
278 const struct common_firmware_header *header = NULL; 321 const struct common_firmware_header *header = NULL;
279 322
@@ -306,7 +349,16 @@ int amdgpu_ucode_init_bo(struct amdgpu_device *adev)
306 349
307 amdgpu_bo_unreserve(*bo); 350 amdgpu_bo_unreserve(*bo);
308 351
309 for (i = 0; i < AMDGPU_UCODE_ID_MAXIMUM; i++) { 352 /*
353 * if SMU loaded firmware, it needn't add SMC, UVD, and VCE
354 * ucode info here
355 */
356 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
357 max = AMDGPU_UCODE_ID_MAXIMUM - 3;
358 else
359 max = AMDGPU_UCODE_ID_MAXIMUM;
360
361 for (i = 0; i < max; i++) {
310 ucode = &adev->firmware.ucode[i]; 362 ucode = &adev->firmware.ucode[i];
311 if (ucode->fw) { 363 if (ucode->fw) {
312 header = (const struct common_firmware_header *)ucode->fw->data; 364 header = (const struct common_firmware_header *)ucode->fw->data;
@@ -331,7 +383,8 @@ failed_pin:
331failed_reserve: 383failed_reserve:
332 amdgpu_bo_unref(bo); 384 amdgpu_bo_unref(bo);
333failed: 385failed:
334 adev->firmware.smu_load = false; 386 if (err)
387 adev->firmware.load_type = AMDGPU_FW_LOAD_DIRECT;
335 388
336 return err; 389 return err;
337} 390}
@@ -340,8 +393,14 @@ int amdgpu_ucode_fini_bo(struct amdgpu_device *adev)
340{ 393{
341 int i; 394 int i;
342 struct amdgpu_firmware_info *ucode = NULL; 395 struct amdgpu_firmware_info *ucode = NULL;
396 int max;
397
398 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
399 max = AMDGPU_UCODE_ID_MAXIMUM - 3;
400 else
401 max = AMDGPU_UCODE_ID_MAXIMUM;
343 402
344 for (i = 0; i < AMDGPU_UCODE_ID_MAXIMUM; i++) { 403 for (i = 0; i < max; i++) {
345 ucode = &adev->firmware.ucode[i]; 404 ucode = &adev->firmware.ucode[i];
346 if (ucode->fw) { 405 if (ucode->fw) {
347 ucode->mc_addr = 0; 406 ucode->mc_addr = 0;