diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | 45 |
1 files changed, 10 insertions, 35 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c index 65649026b836..474f88fbafce 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | |||
@@ -359,7 +359,6 @@ static int amdgpu_ucode_patch_jt(struct amdgpu_firmware_info *ucode, | |||
359 | 359 | ||
360 | int amdgpu_ucode_init_bo(struct amdgpu_device *adev) | 360 | int amdgpu_ucode_init_bo(struct amdgpu_device *adev) |
361 | { | 361 | { |
362 | struct amdgpu_bo **bo = &adev->firmware.fw_buf; | ||
363 | uint64_t fw_offset = 0; | 362 | uint64_t fw_offset = 0; |
364 | int i, err; | 363 | int i, err; |
365 | struct amdgpu_firmware_info *ucode = NULL; | 364 | struct amdgpu_firmware_info *ucode = NULL; |
@@ -370,36 +369,16 @@ int amdgpu_ucode_init_bo(struct amdgpu_device *adev) | |||
370 | return 0; | 369 | return 0; |
371 | } | 370 | } |
372 | 371 | ||
373 | if (!amdgpu_sriov_vf(adev) || !adev->in_sriov_reset) { | 372 | if (!adev->in_gpu_reset) { |
374 | err = amdgpu_bo_create(adev, adev->firmware.fw_size, PAGE_SIZE, true, | 373 | err = amdgpu_bo_create_kernel(adev, adev->firmware.fw_size, PAGE_SIZE, |
375 | amdgpu_sriov_vf(adev) ? AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT, | 374 | amdgpu_sriov_vf(adev) ? AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT, |
376 | AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, | 375 | &adev->firmware.fw_buf, |
377 | NULL, NULL, 0, bo); | 376 | &adev->firmware.fw_buf_mc, |
377 | &adev->firmware.fw_buf_ptr); | ||
378 | if (err) { | 378 | if (err) { |
379 | dev_err(adev->dev, "(%d) Firmware buffer allocate failed\n", err); | 379 | dev_err(adev->dev, "failed to create kernel buffer for firmware.fw_buf\n"); |
380 | goto failed; | 380 | goto failed; |
381 | } | 381 | } |
382 | |||
383 | err = amdgpu_bo_reserve(*bo, false); | ||
384 | if (err) { | ||
385 | dev_err(adev->dev, "(%d) Firmware buffer reserve failed\n", err); | ||
386 | goto failed_reserve; | ||
387 | } | ||
388 | |||
389 | err = amdgpu_bo_pin(*bo, amdgpu_sriov_vf(adev) ? AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT, | ||
390 | &adev->firmware.fw_buf_mc); | ||
391 | if (err) { | ||
392 | dev_err(adev->dev, "(%d) Firmware buffer pin failed\n", err); | ||
393 | goto failed_pin; | ||
394 | } | ||
395 | |||
396 | err = amdgpu_bo_kmap(*bo, &adev->firmware.fw_buf_ptr); | ||
397 | if (err) { | ||
398 | dev_err(adev->dev, "(%d) Firmware buffer kmap failed\n", err); | ||
399 | goto failed_kmap; | ||
400 | } | ||
401 | |||
402 | amdgpu_bo_unreserve(*bo); | ||
403 | } | 382 | } |
404 | 383 | ||
405 | memset(adev->firmware.fw_buf_ptr, 0, adev->firmware.fw_size); | 384 | memset(adev->firmware.fw_buf_ptr, 0, adev->firmware.fw_size); |
@@ -436,12 +415,6 @@ int amdgpu_ucode_init_bo(struct amdgpu_device *adev) | |||
436 | } | 415 | } |
437 | return 0; | 416 | return 0; |
438 | 417 | ||
439 | failed_kmap: | ||
440 | amdgpu_bo_unpin(*bo); | ||
441 | failed_pin: | ||
442 | amdgpu_bo_unreserve(*bo); | ||
443 | failed_reserve: | ||
444 | amdgpu_bo_unref(bo); | ||
445 | failed: | 418 | failed: |
446 | if (err) | 419 | if (err) |
447 | adev->firmware.load_type = AMDGPU_FW_LOAD_DIRECT; | 420 | adev->firmware.load_type = AMDGPU_FW_LOAD_DIRECT; |
@@ -464,8 +437,10 @@ int amdgpu_ucode_fini_bo(struct amdgpu_device *adev) | |||
464 | ucode->kaddr = NULL; | 437 | ucode->kaddr = NULL; |
465 | } | 438 | } |
466 | } | 439 | } |
467 | amdgpu_bo_unref(&adev->firmware.fw_buf); | 440 | |
468 | adev->firmware.fw_buf = NULL; | 441 | amdgpu_bo_free_kernel(&adev->firmware.fw_buf, |
442 | &adev->firmware.fw_buf_mc, | ||
443 | &adev->firmware.fw_buf_ptr); | ||
469 | 444 | ||
470 | return 0; | 445 | return 0; |
471 | } | 446 | } |