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.c45
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
360int amdgpu_ucode_init_bo(struct amdgpu_device *adev) 360int 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
439failed_kmap:
440 amdgpu_bo_unpin(*bo);
441failed_pin:
442 amdgpu_bo_unreserve(*bo);
443failed_reserve:
444 amdgpu_bo_unref(bo);
445failed: 418failed:
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}