diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | 67 |
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 | ||
220 | enum amdgpu_firmware_load_type | ||
221 | amdgpu_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 | |||
220 | static int amdgpu_ucode_init_single_fw(struct amdgpu_firmware_info *ucode, | 263 | static 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: | |||
331 | failed_reserve: | 383 | failed_reserve: |
332 | amdgpu_bo_unref(bo); | 384 | amdgpu_bo_unref(bo); |
333 | failed: | 385 | failed: |
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; |