Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'amd-drm-next-6.3-2023-01-13' of https://gitlab.freedesktop.org/agd5f/linux into drm-next

amd-drm-next-6.3-2023-01-13:

amdgpu:
- Fix possible segfault in failure case
- Rework FW requests to happen in early_init for all IPs so
that we don't lose the sbios console if FW is missing
- PSR fixes
- Misc cleanups
- Unload fix
- SMU13 fixes

amdkfd:
- Fix for cleared VRAM BOs
- Fix cleanup if GPUVM creation fails
- Memory accounting fix
- Use resource_size rather than open codeing it
- GC11 mGPU fix

radeon:
- Fix memory leak on shutdown

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230113225911.7776-1-alexander.deucher@amd.com

+994 -1588
+3 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
··· 97 97 98 98 struct amdgpu_kfd_dev { 99 99 struct kfd_dev *dev; 100 - uint64_t vram_used; 100 + int64_t vram_used; 101 101 uint64_t vram_used_aligned; 102 102 bool init_complete; 103 103 struct work_struct reset_work; ··· 271 271 ((struct drm_file *)(drm_priv))->driver_priv)->vm) 272 272 273 273 int amdgpu_amdkfd_gpuvm_set_vm_pasid(struct amdgpu_device *adev, 274 - struct file *filp, u32 pasid); 274 + struct amdgpu_vm *avm, u32 pasid); 275 275 int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct amdgpu_device *adev, 276 - struct file *filp, 276 + struct amdgpu_vm *avm, 277 277 void **process_info, 278 278 struct dma_fence **ef); 279 279 void amdgpu_amdkfd_gpuvm_release_process_vm(struct amdgpu_device *adev,
+10 -22
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
··· 1431 1431 } 1432 1432 1433 1433 int amdgpu_amdkfd_gpuvm_set_vm_pasid(struct amdgpu_device *adev, 1434 - struct file *filp, u32 pasid) 1434 + struct amdgpu_vm *avm, u32 pasid) 1435 1435 1436 1436 { 1437 - struct amdgpu_fpriv *drv_priv; 1438 - struct amdgpu_vm *avm; 1439 1437 int ret; 1440 - 1441 - ret = amdgpu_file_to_fpriv(filp, &drv_priv); 1442 - if (ret) 1443 - return ret; 1444 - avm = &drv_priv->vm; 1445 1438 1446 1439 /* Free the original amdgpu allocated pasid, 1447 1440 * will be replaced with kfd allocated pasid. ··· 1452 1459 } 1453 1460 1454 1461 int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct amdgpu_device *adev, 1455 - struct file *filp, 1462 + struct amdgpu_vm *avm, 1456 1463 void **process_info, 1457 1464 struct dma_fence **ef) 1458 1465 { 1459 - struct amdgpu_fpriv *drv_priv; 1460 - struct amdgpu_vm *avm; 1461 1466 int ret; 1462 - 1463 - ret = amdgpu_file_to_fpriv(filp, &drv_priv); 1464 - if (ret) 1465 - return ret; 1466 - avm = &drv_priv->vm; 1467 1467 1468 1468 /* Already a compute VM? */ 1469 1469 if (avm->process_info) ··· 1599 1613 struct amdgpu_bo *bo; 1600 1614 struct drm_gem_object *gobj = NULL; 1601 1615 u32 domain, alloc_domain; 1616 + uint64_t aligned_size; 1602 1617 u64 alloc_flags; 1603 1618 int ret; 1604 1619 ··· 1655 1668 * the memory. 1656 1669 */ 1657 1670 if ((*mem)->aql_queue) 1658 - size = size >> 1; 1671 + size >>= 1; 1672 + aligned_size = PAGE_ALIGN(size); 1659 1673 1660 1674 (*mem)->alloc_flags = flags; 1661 1675 1662 1676 amdgpu_sync_create(&(*mem)->sync); 1663 1677 1664 - ret = amdgpu_amdkfd_reserve_mem_limit(adev, size, flags); 1678 + ret = amdgpu_amdkfd_reserve_mem_limit(adev, aligned_size, flags); 1665 1679 if (ret) { 1666 1680 pr_debug("Insufficient memory\n"); 1667 1681 goto err_reserve_limit; 1668 1682 } 1669 1683 1670 1684 pr_debug("\tcreate BO VA 0x%llx size 0x%llx domain %s\n", 1671 - va, size, domain_string(alloc_domain)); 1685 + va, (*mem)->aql_queue ? size << 1 : size, domain_string(alloc_domain)); 1672 1686 1673 - ret = amdgpu_gem_object_create(adev, size, 1, alloc_domain, alloc_flags, 1687 + ret = amdgpu_gem_object_create(adev, aligned_size, 1, alloc_domain, alloc_flags, 1674 1688 bo_type, NULL, &gobj); 1675 1689 if (ret) { 1676 1690 pr_debug("Failed to create BO on domain %s. ret %d\n", ··· 1728 1740 /* Don't unreserve system mem limit twice */ 1729 1741 goto err_reserve_limit; 1730 1742 err_bo_create: 1731 - amdgpu_amdkfd_unreserve_mem_limit(adev, size, flags); 1743 + amdgpu_amdkfd_unreserve_mem_limit(adev, aligned_size, flags); 1732 1744 err_reserve_limit: 1733 1745 mutex_destroy(&(*mem)->lock); 1734 1746 if (gobj) ··· 2088 2100 } 2089 2101 2090 2102 amdgpu_amdkfd_remove_eviction_fence( 2091 - bo, bo->kfd_bo->process_info->eviction_fence); 2103 + bo, bo->vm_bo->vm->process_info->eviction_fence); 2092 2104 2093 2105 amdgpu_bo_unreserve(bo); 2094 2106
+2 -9
drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
··· 411 411 return -EINVAL; 412 412 } 413 413 414 - err = request_firmware(&adev->pm.fw, fw_name, adev->dev); 415 - if (err) { 416 - DRM_ERROR("Failed to request firmware\n"); 417 - return err; 418 - } 419 - 420 - err = amdgpu_ucode_validate(adev->pm.fw); 414 + err = amdgpu_ucode_request(adev, &adev->pm.fw, fw_name); 421 415 if (err) { 422 416 DRM_ERROR("Failed to load firmware \"%s\"", fw_name); 423 - release_firmware(adev->pm.fw); 424 - adev->pm.fw = NULL; 417 + amdgpu_ucode_release(&adev->pm.fw); 425 418 return err; 426 419 } 427 420
+11 -11
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 36 36 #include <generated/utsrelease.h> 37 37 #include <linux/pci-p2pdma.h> 38 38 39 + #include <drm/drm_aperture.h> 39 40 #include <drm/drm_atomic_helper.h> 40 41 #include <drm/drm_fb_helper.h> 41 42 #include <drm/drm_probe_helper.h> ··· 90 89 #define AMDGPU_RESUME_MS 2000 91 90 #define AMDGPU_MAX_RETRY_LIMIT 2 92 91 #define AMDGPU_RETRY_SRIOV_RESET(r) ((r) == -EBUSY || (r) == -ETIMEDOUT || (r) == -EINVAL) 92 + 93 + static const struct drm_driver amdgpu_kms_driver; 93 94 94 95 const char *amdgpu_asic_name[] = { 95 96 "TAHITI", ··· 1985 1982 } 1986 1983 1987 1984 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_gpu_info.bin", chip_name); 1988 - err = request_firmware(&adev->firmware.gpu_info_fw, fw_name, adev->dev); 1985 + err = amdgpu_ucode_request(adev, &adev->firmware.gpu_info_fw, fw_name); 1989 1986 if (err) { 1990 1987 dev_err(adev->dev, 1991 - "Failed to load gpu_info firmware \"%s\"\n", 1992 - fw_name); 1993 - goto out; 1994 - } 1995 - err = amdgpu_ucode_validate(adev->firmware.gpu_info_fw); 1996 - if (err) { 1997 - dev_err(adev->dev, 1998 - "Failed to validate gpu_info firmware \"%s\"\n", 1988 + "Failed to get gpu_info firmware \"%s\"\n", 1999 1989 fw_name); 2000 1990 goto out; 2001 1991 } ··· 3684 3688 if (r) 3685 3689 return r; 3686 3690 3691 + /* Get rid of things like offb */ 3692 + r = drm_aperture_remove_conflicting_pci_framebuffers(adev->pdev, &amdgpu_kms_driver); 3693 + if (r) 3694 + return r; 3695 + 3687 3696 /* Enable TMZ based on IP_VERSION */ 3688 3697 amdgpu_gmc_tmz_set(adev); 3689 3698 ··· 4024 4023 4025 4024 amdgpu_fence_driver_sw_fini(adev); 4026 4025 amdgpu_device_ip_fini(adev); 4027 - release_firmware(adev->firmware.gpu_info_fw); 4028 - adev->firmware.gpu_info_fw = NULL; 4026 + amdgpu_ucode_release(&adev->firmware.gpu_info_fw); 4029 4027 adev->accel_working = false; 4030 4028 dma_fence_put(rcu_dereference_protected(adev->gang_submit, true)); 4031 4029
-6
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
··· 23 23 */ 24 24 25 25 #include <drm/amdgpu_drm.h> 26 - #include <drm/drm_aperture.h> 27 26 #include <drm/drm_drv.h> 28 27 #include <drm/drm_fbdev_generic.h> 29 28 #include <drm/drm_gem.h> ··· 2122 2123 } 2123 2124 } 2124 2125 #endif 2125 - 2126 - /* Get rid of things like offb */ 2127 - ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, &amdgpu_kms_driver); 2128 - if (ret) 2129 - return ret; 2130 2126 2131 2127 adev = devm_drm_dev_alloc(&pdev->dev, &amdgpu_kms_driver, typeof(*adev), ddev); 2132 2128 if (IS_ERR(adev))
+3 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
··· 62 62 goto unlock; 63 63 } 64 64 65 - ret = ttm_bo_vm_fault_reserved(vmf, vmf->vma->vm_page_prot, 66 - TTM_BO_VM_NUM_PREFAULT); 65 + ret = ttm_bo_vm_fault_reserved(vmf, vmf->vma->vm_page_prot, 66 + TTM_BO_VM_NUM_PREFAULT); 67 67 68 - drm_dev_exit(idx); 68 + drm_dev_exit(idx); 69 69 } else { 70 70 ret = ttm_bo_vm_dummy_page(vmf, vmf->vma->vm_page_prot); 71 71 }
+59
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
··· 21 21 * 22 22 */ 23 23 24 + #include <linux/firmware.h> 25 + 24 26 #include "amdgpu_mes.h" 25 27 #include "amdgpu.h" 26 28 #include "soc15_common.h" ··· 1424 1422 amdgpu_mes_ctx_free_meta_data(&ctx_data); 1425 1423 kfree(vm); 1426 1424 return 0; 1425 + } 1426 + 1427 + int amdgpu_mes_init_microcode(struct amdgpu_device *adev, int pipe) 1428 + { 1429 + const struct mes_firmware_header_v1_0 *mes_hdr; 1430 + struct amdgpu_firmware_info *info; 1431 + char ucode_prefix[30]; 1432 + char fw_name[40]; 1433 + int r; 1434 + 1435 + amdgpu_ucode_ip_version_decode(adev, GC_HWIP, ucode_prefix, sizeof(ucode_prefix)); 1436 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mes%s.bin", 1437 + ucode_prefix, 1438 + pipe == AMDGPU_MES_SCHED_PIPE ? "" : "1"); 1439 + r = amdgpu_ucode_request(adev, &adev->mes.fw[pipe], fw_name); 1440 + if (r) 1441 + goto out; 1442 + 1443 + mes_hdr = (const struct mes_firmware_header_v1_0 *) 1444 + adev->mes.fw[pipe]->data; 1445 + adev->mes.uc_start_addr[pipe] = 1446 + le32_to_cpu(mes_hdr->mes_uc_start_addr_lo) | 1447 + ((uint64_t)(le32_to_cpu(mes_hdr->mes_uc_start_addr_hi)) << 32); 1448 + adev->mes.data_start_addr[pipe] = 1449 + le32_to_cpu(mes_hdr->mes_data_start_addr_lo) | 1450 + ((uint64_t)(le32_to_cpu(mes_hdr->mes_data_start_addr_hi)) << 32); 1451 + 1452 + if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { 1453 + int ucode, ucode_data; 1454 + 1455 + if (pipe == AMDGPU_MES_SCHED_PIPE) { 1456 + ucode = AMDGPU_UCODE_ID_CP_MES; 1457 + ucode_data = AMDGPU_UCODE_ID_CP_MES_DATA; 1458 + } else { 1459 + ucode = AMDGPU_UCODE_ID_CP_MES1; 1460 + ucode_data = AMDGPU_UCODE_ID_CP_MES1_DATA; 1461 + } 1462 + 1463 + info = &adev->firmware.ucode[ucode]; 1464 + info->ucode_id = ucode; 1465 + info->fw = adev->mes.fw[pipe]; 1466 + adev->firmware.fw_size += 1467 + ALIGN(le32_to_cpu(mes_hdr->mes_ucode_size_bytes), 1468 + PAGE_SIZE); 1469 + 1470 + info = &adev->firmware.ucode[ucode_data]; 1471 + info->ucode_id = ucode_data; 1472 + info->fw = adev->mes.fw[pipe]; 1473 + adev->firmware.fw_size += 1474 + ALIGN(le32_to_cpu(mes_hdr->mes_ucode_data_size_bytes), 1475 + PAGE_SIZE); 1476 + } 1477 + 1478 + return 0; 1479 + out: 1480 + amdgpu_ucode_release(&adev->mes.fw[pipe]); 1481 + return r; 1427 1482 }
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h
··· 306 306 307 307 int amdgpu_mes_ctx_get_offs(struct amdgpu_ring *ring, unsigned int id_offs); 308 308 309 + int amdgpu_mes_init_microcode(struct amdgpu_device *adev, int pipe); 309 310 int amdgpu_mes_init(struct amdgpu_device *adev); 310 311 void amdgpu_mes_fini(struct amdgpu_device *adev); 311 312
+3 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
··· 470 470 return true; 471 471 472 472 fail: 473 - DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size, 474 - man->size); 473 + if (man) 474 + DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size, 475 + man->size); 475 476 return false; 476 477 } 477 478
+148 -153
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
··· 123 123 } 124 124 } 125 125 126 + static int psp_init_sriov_microcode(struct psp_context *psp) 127 + { 128 + struct amdgpu_device *adev = psp->adev; 129 + char ucode_prefix[30]; 130 + int ret = 0; 131 + 132 + amdgpu_ucode_ip_version_decode(adev, MP0_HWIP, ucode_prefix, sizeof(ucode_prefix)); 133 + 134 + switch (adev->ip_versions[MP0_HWIP][0]) { 135 + case IP_VERSION(9, 0, 0): 136 + case IP_VERSION(11, 0, 7): 137 + case IP_VERSION(11, 0, 9): 138 + adev->virt.autoload_ucode_id = AMDGPU_UCODE_ID_CP_MEC2; 139 + ret = psp_init_cap_microcode(psp, ucode_prefix); 140 + break; 141 + case IP_VERSION(13, 0, 2): 142 + adev->virt.autoload_ucode_id = AMDGPU_UCODE_ID_CP_MEC2; 143 + ret = psp_init_cap_microcode(psp, ucode_prefix); 144 + ret &= psp_init_ta_microcode(psp, ucode_prefix); 145 + break; 146 + case IP_VERSION(13, 0, 0): 147 + adev->virt.autoload_ucode_id = 0; 148 + break; 149 + case IP_VERSION(13, 0, 10): 150 + adev->virt.autoload_ucode_id = AMDGPU_UCODE_ID_CP_MES1_DATA; 151 + break; 152 + default: 153 + return -EINVAL; 154 + } 155 + return ret; 156 + } 157 + 126 158 static int psp_early_init(void *handle) 127 159 { 128 160 struct amdgpu_device *adev = (struct amdgpu_device *)handle; ··· 225 193 226 194 psp_check_pmfw_centralized_cstate_management(psp); 227 195 228 - return 0; 196 + if (amdgpu_sriov_vf(adev)) 197 + return psp_init_sriov_microcode(psp); 198 + else 199 + return psp_init_microcode(psp); 229 200 } 230 201 231 202 void psp_ta_free_shared_buf(struct ta_mem_context *mem_ctx) ··· 386 351 return ret; 387 352 } 388 353 389 - static int psp_init_sriov_microcode(struct psp_context *psp) 390 - { 391 - struct amdgpu_device *adev = psp->adev; 392 - int ret = 0; 393 - 394 - switch (adev->ip_versions[MP0_HWIP][0]) { 395 - case IP_VERSION(9, 0, 0): 396 - adev->virt.autoload_ucode_id = AMDGPU_UCODE_ID_CP_MEC2; 397 - ret = psp_init_cap_microcode(psp, "vega10"); 398 - break; 399 - case IP_VERSION(11, 0, 9): 400 - adev->virt.autoload_ucode_id = AMDGPU_UCODE_ID_CP_MEC2; 401 - ret = psp_init_cap_microcode(psp, "navi12"); 402 - break; 403 - case IP_VERSION(11, 0, 7): 404 - adev->virt.autoload_ucode_id = AMDGPU_UCODE_ID_CP_MEC2; 405 - ret = psp_init_cap_microcode(psp, "sienna_cichlid"); 406 - break; 407 - case IP_VERSION(13, 0, 2): 408 - adev->virt.autoload_ucode_id = AMDGPU_UCODE_ID_CP_MEC2; 409 - ret = psp_init_cap_microcode(psp, "aldebaran"); 410 - ret &= psp_init_ta_microcode(psp, "aldebaran"); 411 - break; 412 - case IP_VERSION(13, 0, 0): 413 - adev->virt.autoload_ucode_id = 0; 414 - break; 415 - case IP_VERSION(13, 0, 10): 416 - adev->virt.autoload_ucode_id = AMDGPU_UCODE_ID_CP_MES1_DATA; 417 - break; 418 - default: 419 - BUG(); 420 - break; 421 - } 422 - return ret; 423 - } 424 - 425 354 static int psp_sw_init(void *handle) 426 355 { 427 356 struct amdgpu_device *adev = (struct amdgpu_device *)handle; ··· 399 400 if (!psp->cmd) { 400 401 DRM_ERROR("Failed to allocate memory to command buffer!\n"); 401 402 ret = -ENOMEM; 402 - } 403 - 404 - if (amdgpu_sriov_vf(adev)) 405 - ret = psp_init_sriov_microcode(psp); 406 - else 407 - ret = psp_init_microcode(psp); 408 - if (ret) { 409 - DRM_ERROR("Failed to load psp firmware!\n"); 410 - return ret; 411 403 } 412 404 413 405 adev->psp.xgmi_context.supports_extended_data = ··· 505 515 506 516 psp_memory_training_fini(psp); 507 517 508 - release_firmware(psp->sos_fw); 509 - psp->sos_fw = NULL; 510 - 511 - release_firmware(psp->asd_fw); 512 - psp->asd_fw = NULL; 513 - 514 - release_firmware(psp->ta_fw); 515 - psp->ta_fw = NULL; 516 - 517 - release_firmware(psp->cap_fw); 518 - psp->cap_fw = NULL; 519 - 520 - release_firmware(psp->toc_fw); 521 - psp->toc_fw = NULL; 518 + amdgpu_ucode_release(&psp->sos_fw); 519 + amdgpu_ucode_release(&psp->asd_fw); 520 + amdgpu_ucode_release(&psp->ta_fw); 521 + amdgpu_ucode_release(&psp->cap_fw); 522 + amdgpu_ucode_release(&psp->toc_fw); 522 523 523 524 if (adev->ip_versions[MP0_HWIP][0] == IP_VERSION(11, 0, 0) || 524 525 adev->ip_versions[MP0_HWIP][0] == IP_VERSION(11, 0, 7)) ··· 2895 2914 return 0; 2896 2915 } 2897 2916 2898 - int psp_init_asd_microcode(struct psp_context *psp, 2899 - const char *chip_name) 2917 + int psp_init_asd_microcode(struct psp_context *psp, const char *chip_name) 2900 2918 { 2901 2919 struct amdgpu_device *adev = psp->adev; 2902 2920 char fw_name[PSP_FW_NAME_LEN]; 2903 2921 const struct psp_firmware_header_v1_0 *asd_hdr; 2904 2922 int err = 0; 2905 2923 2906 - if (!chip_name) { 2907 - dev_err(adev->dev, "invalid chip name for asd microcode\n"); 2908 - return -EINVAL; 2909 - } 2910 - 2911 2924 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name); 2912 - err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev); 2913 - if (err) 2914 - goto out; 2915 - 2916 - err = amdgpu_ucode_validate(adev->psp.asd_fw); 2925 + err = amdgpu_ucode_request(adev, &adev->psp.asd_fw, fw_name); 2917 2926 if (err) 2918 2927 goto out; 2919 2928 ··· 2915 2944 le32_to_cpu(asd_hdr->header.ucode_array_offset_bytes); 2916 2945 return 0; 2917 2946 out: 2918 - dev_err(adev->dev, "fail to initialize asd microcode\n"); 2919 - release_firmware(adev->psp.asd_fw); 2920 - adev->psp.asd_fw = NULL; 2947 + amdgpu_ucode_release(&adev->psp.asd_fw); 2921 2948 return err; 2922 2949 } 2923 2950 2924 - int psp_init_toc_microcode(struct psp_context *psp, 2925 - const char *chip_name) 2951 + int psp_init_toc_microcode(struct psp_context *psp, const char *chip_name) 2926 2952 { 2927 2953 struct amdgpu_device *adev = psp->adev; 2928 2954 char fw_name[PSP_FW_NAME_LEN]; 2929 2955 const struct psp_firmware_header_v1_0 *toc_hdr; 2930 2956 int err = 0; 2931 2957 2932 - if (!chip_name) { 2933 - dev_err(adev->dev, "invalid chip name for toc microcode\n"); 2934 - return -EINVAL; 2935 - } 2936 - 2937 2958 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_toc.bin", chip_name); 2938 - err = request_firmware(&adev->psp.toc_fw, fw_name, adev->dev); 2939 - if (err) 2940 - goto out; 2941 - 2942 - err = amdgpu_ucode_validate(adev->psp.toc_fw); 2959 + err = amdgpu_ucode_request(adev, &adev->psp.toc_fw, fw_name); 2943 2960 if (err) 2944 2961 goto out; 2945 2962 ··· 2939 2980 le32_to_cpu(toc_hdr->header.ucode_array_offset_bytes); 2940 2981 return 0; 2941 2982 out: 2942 - dev_err(adev->dev, "fail to request/validate toc microcode\n"); 2943 - release_firmware(adev->psp.toc_fw); 2944 - adev->psp.toc_fw = NULL; 2983 + amdgpu_ucode_release(&adev->psp.toc_fw); 2945 2984 return err; 2946 2985 } 2947 2986 ··· 3070 3113 return 0; 3071 3114 } 3072 3115 3073 - int psp_init_sos_microcode(struct psp_context *psp, 3074 - const char *chip_name) 3116 + int psp_init_sos_microcode(struct psp_context *psp, const char *chip_name) 3075 3117 { 3076 3118 struct amdgpu_device *adev = psp->adev; 3077 3119 char fw_name[PSP_FW_NAME_LEN]; ··· 3083 3127 uint8_t *ucode_array_start_addr; 3084 3128 int fw_index = 0; 3085 3129 3086 - if (!chip_name) { 3087 - dev_err(adev->dev, "invalid chip name for sos microcode\n"); 3088 - return -EINVAL; 3089 - } 3090 - 3091 3130 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", chip_name); 3092 - err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev); 3093 - if (err) 3094 - goto out; 3095 - 3096 - err = amdgpu_ucode_validate(adev->psp.sos_fw); 3131 + err = amdgpu_ucode_request(adev, &adev->psp.sos_fw, fw_name); 3097 3132 if (err) 3098 3133 goto out; 3099 3134 ··· 3156 3209 3157 3210 return 0; 3158 3211 out: 3159 - dev_err(adev->dev, 3160 - "failed to init sos firmware\n"); 3161 - release_firmware(adev->psp.sos_fw); 3162 - adev->psp.sos_fw = NULL; 3212 + amdgpu_ucode_release(&adev->psp.sos_fw); 3163 3213 3164 3214 return err; 3165 3215 } ··· 3222 3278 return 0; 3223 3279 } 3224 3280 3225 - int psp_init_ta_microcode(struct psp_context *psp, 3226 - const char *chip_name) 3281 + static int parse_ta_v1_microcode(struct psp_context *psp) 3227 3282 { 3283 + const struct ta_firmware_header_v1_0 *ta_hdr; 3228 3284 struct amdgpu_device *adev = psp->adev; 3229 - char fw_name[PSP_FW_NAME_LEN]; 3285 + 3286 + ta_hdr = (const struct ta_firmware_header_v1_0 *) adev->psp.ta_fw->data; 3287 + 3288 + if (le16_to_cpu(ta_hdr->header.header_version_major) != 1) 3289 + return -EINVAL; 3290 + 3291 + adev->psp.xgmi_context.context.bin_desc.fw_version = 3292 + le32_to_cpu(ta_hdr->xgmi.fw_version); 3293 + adev->psp.xgmi_context.context.bin_desc.size_bytes = 3294 + le32_to_cpu(ta_hdr->xgmi.size_bytes); 3295 + adev->psp.xgmi_context.context.bin_desc.start_addr = 3296 + (uint8_t *)ta_hdr + 3297 + le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes); 3298 + 3299 + adev->psp.ras_context.context.bin_desc.fw_version = 3300 + le32_to_cpu(ta_hdr->ras.fw_version); 3301 + adev->psp.ras_context.context.bin_desc.size_bytes = 3302 + le32_to_cpu(ta_hdr->ras.size_bytes); 3303 + adev->psp.ras_context.context.bin_desc.start_addr = 3304 + (uint8_t *)adev->psp.xgmi_context.context.bin_desc.start_addr + 3305 + le32_to_cpu(ta_hdr->ras.offset_bytes); 3306 + 3307 + adev->psp.hdcp_context.context.bin_desc.fw_version = 3308 + le32_to_cpu(ta_hdr->hdcp.fw_version); 3309 + adev->psp.hdcp_context.context.bin_desc.size_bytes = 3310 + le32_to_cpu(ta_hdr->hdcp.size_bytes); 3311 + adev->psp.hdcp_context.context.bin_desc.start_addr = 3312 + (uint8_t *)ta_hdr + 3313 + le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes); 3314 + 3315 + adev->psp.dtm_context.context.bin_desc.fw_version = 3316 + le32_to_cpu(ta_hdr->dtm.fw_version); 3317 + adev->psp.dtm_context.context.bin_desc.size_bytes = 3318 + le32_to_cpu(ta_hdr->dtm.size_bytes); 3319 + adev->psp.dtm_context.context.bin_desc.start_addr = 3320 + (uint8_t *)adev->psp.hdcp_context.context.bin_desc.start_addr + 3321 + le32_to_cpu(ta_hdr->dtm.offset_bytes); 3322 + 3323 + adev->psp.securedisplay_context.context.bin_desc.fw_version = 3324 + le32_to_cpu(ta_hdr->securedisplay.fw_version); 3325 + adev->psp.securedisplay_context.context.bin_desc.size_bytes = 3326 + le32_to_cpu(ta_hdr->securedisplay.size_bytes); 3327 + adev->psp.securedisplay_context.context.bin_desc.start_addr = 3328 + (uint8_t *)adev->psp.hdcp_context.context.bin_desc.start_addr + 3329 + le32_to_cpu(ta_hdr->securedisplay.offset_bytes); 3330 + 3331 + adev->psp.ta_fw_version = le32_to_cpu(ta_hdr->header.ucode_version); 3332 + 3333 + return 0; 3334 + } 3335 + 3336 + static int parse_ta_v2_microcode(struct psp_context *psp) 3337 + { 3230 3338 const struct ta_firmware_header_v2_0 *ta_hdr; 3339 + struct amdgpu_device *adev = psp->adev; 3231 3340 int err = 0; 3232 3341 int ta_index = 0; 3233 3342 3234 - if (!chip_name) { 3235 - dev_err(adev->dev, "invalid chip name for ta microcode\n"); 3236 - return -EINVAL; 3237 - } 3238 - 3239 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name); 3240 - err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); 3241 - if (err) 3242 - goto out; 3243 - 3244 - err = amdgpu_ucode_validate(adev->psp.ta_fw); 3245 - if (err) 3246 - goto out; 3247 - 3248 3343 ta_hdr = (const struct ta_firmware_header_v2_0 *)adev->psp.ta_fw->data; 3249 3344 3250 - if (le16_to_cpu(ta_hdr->header.header_version_major) != 2) { 3251 - dev_err(adev->dev, "unsupported TA header version\n"); 3252 - err = -EINVAL; 3253 - goto out; 3254 - } 3345 + if (le16_to_cpu(ta_hdr->header.header_version_major) != 2) 3346 + return -EINVAL; 3255 3347 3256 3348 if (le32_to_cpu(ta_hdr->ta_fw_bin_count) >= UCODE_MAX_PSP_PACKAGING) { 3257 3349 dev_err(adev->dev, "packed TA count exceeds maximum limit\n"); 3258 - err = -EINVAL; 3259 - goto out; 3350 + return -EINVAL; 3260 3351 } 3261 3352 3262 3353 for (ta_index = 0; ta_index < le32_to_cpu(ta_hdr->ta_fw_bin_count); ta_index++) { ··· 3299 3320 &ta_hdr->ta_fw_bin[ta_index], 3300 3321 ta_hdr); 3301 3322 if (err) 3302 - goto out; 3323 + return err; 3303 3324 } 3304 3325 3305 3326 return 0; 3306 - out: 3307 - dev_err(adev->dev, "fail to initialize ta microcode\n"); 3308 - release_firmware(adev->psp.ta_fw); 3309 - adev->psp.ta_fw = NULL; 3327 + } 3328 + 3329 + int psp_init_ta_microcode(struct psp_context *psp, const char *chip_name) 3330 + { 3331 + const struct common_firmware_header *hdr; 3332 + struct amdgpu_device *adev = psp->adev; 3333 + char fw_name[PSP_FW_NAME_LEN]; 3334 + int err; 3335 + 3336 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name); 3337 + err = amdgpu_ucode_request(adev, &adev->psp.ta_fw, fw_name); 3338 + if (err) 3339 + return err; 3340 + 3341 + hdr = (const struct common_firmware_header *)adev->psp.ta_fw->data; 3342 + switch (le16_to_cpu(hdr->header_version_major)) { 3343 + case 1: 3344 + err = parse_ta_v1_microcode(psp); 3345 + break; 3346 + case 2: 3347 + err = parse_ta_v2_microcode(psp); 3348 + break; 3349 + default: 3350 + dev_err(adev->dev, "unsupported TA header version\n"); 3351 + err = -EINVAL; 3352 + } 3353 + 3354 + if (err) 3355 + amdgpu_ucode_release(&adev->psp.ta_fw); 3356 + 3310 3357 return err; 3311 3358 } 3312 3359 3313 - int psp_init_cap_microcode(struct psp_context *psp, 3314 - const char *chip_name) 3360 + int psp_init_cap_microcode(struct psp_context *psp, const char *chip_name) 3315 3361 { 3316 3362 struct amdgpu_device *adev = psp->adev; 3317 3363 char fw_name[PSP_FW_NAME_LEN]; ··· 3344 3340 struct amdgpu_firmware_info *info = NULL; 3345 3341 int err = 0; 3346 3342 3347 - if (!chip_name) { 3348 - dev_err(adev->dev, "invalid chip name for cap microcode\n"); 3349 - return -EINVAL; 3350 - } 3351 - 3352 3343 if (!amdgpu_sriov_vf(adev)) { 3353 3344 dev_err(adev->dev, "cap microcode should only be loaded under SRIOV\n"); 3354 3345 return -EINVAL; 3355 3346 } 3356 3347 3357 3348 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_cap.bin", chip_name); 3358 - err = request_firmware(&adev->psp.cap_fw, fw_name, adev->dev); 3349 + err = amdgpu_ucode_request(adev, &adev->psp.cap_fw, fw_name); 3359 3350 if (err) { 3360 - dev_warn(adev->dev, "cap microcode does not exist, skip\n"); 3361 - err = 0; 3362 - goto out; 3363 - } 3364 - 3365 - err = amdgpu_ucode_validate(adev->psp.cap_fw); 3366 - if (err) { 3351 + if (err == -ENODEV) { 3352 + dev_warn(adev->dev, "cap microcode does not exist, skip\n"); 3353 + err = 0; 3354 + goto out; 3355 + } 3367 3356 dev_err(adev->dev, "fail to initialize cap microcode\n"); 3368 - goto out; 3369 3357 } 3370 3358 3371 3359 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CAP]; ··· 3374 3378 return 0; 3375 3379 3376 3380 out: 3377 - release_firmware(adev->psp.cap_fw); 3378 - adev->psp.cap_fw = NULL; 3381 + amdgpu_ucode_release(&adev->psp.cap_fw); 3379 3382 return err; 3380 3383 } 3381 3384
+12 -13
drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
··· 154 154 155 155 static int amdgpu_sdma_init_inst_ctx(struct amdgpu_sdma_instance *sdma_inst) 156 156 { 157 - int err = 0; 158 157 uint16_t version_major; 159 158 const struct common_firmware_header *header = NULL; 160 159 const struct sdma_firmware_header_v1_0 *hdr; 161 160 const struct sdma_firmware_header_v2_0 *hdr_v2; 162 - 163 - err = amdgpu_ucode_validate(sdma_inst->fw); 164 - if (err) 165 - return err; 166 161 167 162 header = (const struct common_firmware_header *) 168 163 sdma_inst->fw->data; ··· 190 195 int i; 191 196 192 197 for (i = 0; i < adev->sdma.num_instances; i++) { 193 - release_firmware(adev->sdma.instance[i].fw); 198 + amdgpu_ucode_release(&adev->sdma.instance[i].fw); 194 199 if (duplicate) 195 200 break; 196 201 } ··· 200 205 } 201 206 202 207 int amdgpu_sdma_init_microcode(struct amdgpu_device *adev, 203 - char *fw_name, u32 instance, 204 - bool duplicate) 208 + u32 instance, bool duplicate) 205 209 { 206 210 struct amdgpu_firmware_info *info = NULL; 207 211 const struct common_firmware_header *header = NULL; 208 - int err = 0, i; 212 + int err, i; 209 213 const struct sdma_firmware_header_v2_0 *sdma_hdr; 210 214 uint16_t version_major; 215 + char ucode_prefix[30]; 216 + char fw_name[40]; 211 217 212 - err = request_firmware(&adev->sdma.instance[instance].fw, fw_name, adev->dev); 218 + amdgpu_ucode_ip_version_decode(adev, SDMA0_HWIP, ucode_prefix, sizeof(ucode_prefix)); 219 + if (instance == 0) 220 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s.bin", ucode_prefix); 221 + else 222 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s%d.bin", ucode_prefix, instance); 223 + err = amdgpu_ucode_request(adev, &adev->sdma.instance[instance].fw, fw_name); 213 224 if (err) 214 225 goto out; 215 226 ··· 280 279 } 281 280 282 281 out: 283 - if (err) { 284 - DRM_ERROR("SDMA: Failed to init firmware \"%s\"\n", fw_name); 282 + if (err) 285 283 amdgpu_sdma_destroy_inst_ctx(adev, duplicate); 286 - } 287 284 return err; 288 285 } 289 286
+2 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
··· 124 124 int amdgpu_sdma_process_ecc_irq(struct amdgpu_device *adev, 125 125 struct amdgpu_irq_src *source, 126 126 struct amdgpu_iv_entry *entry); 127 - int amdgpu_sdma_init_microcode(struct amdgpu_device *adev, 128 - char *fw_name, u32 instance, bool duplicate); 127 + int amdgpu_sdma_init_microcode(struct amdgpu_device *adev, u32 instance, 128 + bool duplicate); 129 129 void amdgpu_sdma_destroy_inst_ctx(struct amdgpu_device *adev, 130 130 bool duplicate); 131 131 void amdgpu_sdma_unset_buffer_funcs_helper(struct amdgpu_device *adev);
+258 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
··· 504 504 } 505 505 } 506 506 507 - int amdgpu_ucode_validate(const struct firmware *fw) 507 + static int amdgpu_ucode_validate(const struct firmware *fw) 508 508 { 509 509 const struct common_firmware_header *hdr = 510 510 (const struct common_firmware_header *)fw->data; ··· 1059 1059 return 0; 1060 1060 } 1061 1061 1062 + static const char *amdgpu_ucode_legacy_naming(struct amdgpu_device *adev, int block_type) 1063 + { 1064 + if (block_type == MP0_HWIP) { 1065 + switch (adev->ip_versions[MP0_HWIP][0]) { 1066 + case IP_VERSION(9, 0, 0): 1067 + switch (adev->asic_type) { 1068 + case CHIP_VEGA10: 1069 + return "vega10"; 1070 + case CHIP_VEGA12: 1071 + return "vega12"; 1072 + default: 1073 + return NULL; 1074 + } 1075 + break; 1076 + case IP_VERSION(10, 0, 0): 1077 + case IP_VERSION(10, 0, 1): 1078 + if (adev->asic_type == CHIP_RAVEN) { 1079 + if (adev->apu_flags & AMD_APU_IS_RAVEN2) 1080 + return "raven2"; 1081 + else if (adev->apu_flags & AMD_APU_IS_PICASSO) 1082 + return "picasso"; 1083 + return "raven"; 1084 + } 1085 + break; 1086 + case IP_VERSION(11, 0, 0): 1087 + return "navi10"; 1088 + case IP_VERSION(11, 0, 2): 1089 + return "vega20"; 1090 + case IP_VERSION(11, 0, 4): 1091 + return "arcturus"; 1092 + case IP_VERSION(11, 0, 5): 1093 + return "navi14"; 1094 + case IP_VERSION(11, 0, 7): 1095 + return "sienna_cichlid"; 1096 + case IP_VERSION(11, 0, 9): 1097 + return "navi12"; 1098 + case IP_VERSION(11, 0, 11): 1099 + return "navy_flounder"; 1100 + case IP_VERSION(11, 0, 12): 1101 + return "dimgrey_cavefish"; 1102 + case IP_VERSION(11, 0, 13): 1103 + return "beige_goby"; 1104 + case IP_VERSION(11, 5, 0): 1105 + return "vangogh"; 1106 + case IP_VERSION(12, 0, 1): 1107 + if (adev->asic_type == CHIP_RENOIR) { 1108 + if (adev->apu_flags & AMD_APU_IS_RENOIR) 1109 + return "renoir"; 1110 + return "green_sardine"; 1111 + } 1112 + break; 1113 + case IP_VERSION(13, 0, 2): 1114 + return "aldebaran"; 1115 + case IP_VERSION(13, 0, 1): 1116 + case IP_VERSION(13, 0, 3): 1117 + return "yellow_carp"; 1118 + } 1119 + } else if (block_type == MP1_HWIP) { 1120 + switch (adev->ip_versions[MP1_HWIP][0]) { 1121 + case IP_VERSION(9, 0, 0): 1122 + case IP_VERSION(10, 0, 0): 1123 + case IP_VERSION(10, 0, 1): 1124 + case IP_VERSION(11, 0, 2): 1125 + if (adev->asic_type == CHIP_ARCTURUS) 1126 + return "arcturus_smc"; 1127 + return NULL; 1128 + case IP_VERSION(11, 0, 0): 1129 + return "navi10_smc"; 1130 + case IP_VERSION(11, 0, 5): 1131 + return "navi14_smc"; 1132 + case IP_VERSION(11, 0, 9): 1133 + return "navi12_smc"; 1134 + case IP_VERSION(11, 0, 7): 1135 + return "sienna_cichlid_smc"; 1136 + case IP_VERSION(11, 0, 11): 1137 + return "navy_flounder_smc"; 1138 + case IP_VERSION(11, 0, 12): 1139 + return "dimgrey_cavefish_smc"; 1140 + case IP_VERSION(11, 0, 13): 1141 + return "beige_goby_smc"; 1142 + case IP_VERSION(13, 0, 2): 1143 + return "aldebaran_smc"; 1144 + } 1145 + } else if (block_type == SDMA0_HWIP) { 1146 + switch (adev->ip_versions[SDMA0_HWIP][0]) { 1147 + case IP_VERSION(4, 0, 0): 1148 + return "vega10_sdma"; 1149 + case IP_VERSION(4, 0, 1): 1150 + return "vega12_sdma"; 1151 + case IP_VERSION(4, 1, 0): 1152 + case IP_VERSION(4, 1, 1): 1153 + if (adev->apu_flags & AMD_APU_IS_RAVEN2) 1154 + return "raven2_sdma"; 1155 + else if (adev->apu_flags & AMD_APU_IS_PICASSO) 1156 + return "picasso_sdma"; 1157 + return "raven_sdma"; 1158 + case IP_VERSION(4, 1, 2): 1159 + if (adev->apu_flags & AMD_APU_IS_RENOIR) 1160 + return "renoir_sdma"; 1161 + return "green_sardine_sdma"; 1162 + case IP_VERSION(4, 2, 0): 1163 + return "vega20_sdma"; 1164 + case IP_VERSION(4, 2, 2): 1165 + return "arcturus_sdma"; 1166 + case IP_VERSION(4, 4, 0): 1167 + return "aldebaran_sdma"; 1168 + case IP_VERSION(5, 0, 0): 1169 + return "navi10_sdma"; 1170 + case IP_VERSION(5, 0, 1): 1171 + return "cyan_skillfish2_sdma"; 1172 + case IP_VERSION(5, 0, 2): 1173 + return "navi14_sdma"; 1174 + case IP_VERSION(5, 0, 5): 1175 + return "navi12_sdma"; 1176 + case IP_VERSION(5, 2, 0): 1177 + return "sienna_cichlid_sdma"; 1178 + case IP_VERSION(5, 2, 2): 1179 + return "navy_flounder_sdma"; 1180 + case IP_VERSION(5, 2, 4): 1181 + return "dimgrey_cavefish_sdma"; 1182 + case IP_VERSION(5, 2, 5): 1183 + return "beige_goby_sdma"; 1184 + case IP_VERSION(5, 2, 3): 1185 + return "yellow_carp_sdma"; 1186 + case IP_VERSION(5, 2, 1): 1187 + return "vangogh_sdma"; 1188 + } 1189 + } else if (block_type == UVD_HWIP) { 1190 + switch (adev->ip_versions[UVD_HWIP][0]) { 1191 + case IP_VERSION(1, 0, 0): 1192 + case IP_VERSION(1, 0, 1): 1193 + if (adev->apu_flags & AMD_APU_IS_RAVEN2) 1194 + return "raven2_vcn"; 1195 + else if (adev->apu_flags & AMD_APU_IS_PICASSO) 1196 + return "picasso_vcn"; 1197 + return "raven_vcn"; 1198 + case IP_VERSION(2, 5, 0): 1199 + return "arcturus_vcn"; 1200 + case IP_VERSION(2, 2, 0): 1201 + if (adev->apu_flags & AMD_APU_IS_RENOIR) 1202 + return "renoir_vcn"; 1203 + return "green_sardine_vcn"; 1204 + case IP_VERSION(2, 6, 0): 1205 + return "aldebaran_vcn"; 1206 + case IP_VERSION(2, 0, 0): 1207 + return "navi10_vcn"; 1208 + case IP_VERSION(2, 0, 2): 1209 + if (adev->asic_type == CHIP_NAVI12) 1210 + return "navi12_vcn"; 1211 + return "navi14_vcn"; 1212 + case IP_VERSION(3, 0, 0): 1213 + case IP_VERSION(3, 0, 64): 1214 + case IP_VERSION(3, 0, 192): 1215 + if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 0)) 1216 + return "sienna_cichlid_vcn"; 1217 + return "navy_flounder_vcn"; 1218 + case IP_VERSION(3, 0, 2): 1219 + return "vangogh_vcn"; 1220 + case IP_VERSION(3, 0, 16): 1221 + return "dimgrey_cavefish_vcn"; 1222 + case IP_VERSION(3, 0, 33): 1223 + return "beige_goby_vcn"; 1224 + case IP_VERSION(3, 1, 1): 1225 + return "yellow_carp_vcn"; 1226 + } 1227 + } else if (block_type == GC_HWIP) { 1228 + switch (adev->ip_versions[GC_HWIP][0]) { 1229 + case IP_VERSION(9, 0, 1): 1230 + return "vega10"; 1231 + case IP_VERSION(9, 2, 1): 1232 + return "vega12"; 1233 + case IP_VERSION(9, 4, 0): 1234 + return "vega20"; 1235 + case IP_VERSION(9, 2, 2): 1236 + case IP_VERSION(9, 1, 0): 1237 + if (adev->apu_flags & AMD_APU_IS_RAVEN2) 1238 + return "raven2"; 1239 + else if (adev->apu_flags & AMD_APU_IS_PICASSO) 1240 + return "picasso"; 1241 + return "raven"; 1242 + case IP_VERSION(9, 4, 1): 1243 + return "arcturus"; 1244 + case IP_VERSION(9, 3, 0): 1245 + if (adev->apu_flags & AMD_APU_IS_RENOIR) 1246 + return "renoir"; 1247 + return "green_sardine"; 1248 + case IP_VERSION(9, 4, 2): 1249 + return "aldebaran"; 1250 + case IP_VERSION(10, 1, 10): 1251 + return "navi10"; 1252 + case IP_VERSION(10, 1, 1): 1253 + return "navi14"; 1254 + case IP_VERSION(10, 1, 2): 1255 + return "navi12"; 1256 + case IP_VERSION(10, 3, 0): 1257 + return "sienna_cichlid"; 1258 + case IP_VERSION(10, 3, 2): 1259 + return "navy_flounder"; 1260 + case IP_VERSION(10, 3, 1): 1261 + return "vangogh"; 1262 + case IP_VERSION(10, 3, 4): 1263 + return "dimgrey_cavefish"; 1264 + case IP_VERSION(10, 3, 5): 1265 + return "beige_goby"; 1266 + case IP_VERSION(10, 3, 3): 1267 + return "yellow_carp"; 1268 + case IP_VERSION(10, 1, 3): 1269 + case IP_VERSION(10, 1, 4): 1270 + return "cyan_skillfish2"; 1271 + } 1272 + } 1273 + return NULL; 1274 + } 1275 + 1062 1276 void amdgpu_ucode_ip_version_decode(struct amdgpu_device *adev, int block_type, char *ucode_prefix, int len) 1063 1277 { 1064 1278 int maj, min, rev; 1065 1279 char *ip_name; 1280 + const char *legacy; 1066 1281 uint32_t version = adev->ip_versions[block_type][0]; 1282 + 1283 + legacy = amdgpu_ucode_legacy_naming(adev, block_type); 1284 + if (legacy) { 1285 + snprintf(ucode_prefix, len, "%s", legacy); 1286 + return; 1287 + } 1067 1288 1068 1289 switch (block_type) { 1069 1290 case GC_HWIP: ··· 1311 1090 rev = IP_VERSION_REV(version); 1312 1091 1313 1092 snprintf(ucode_prefix, len, "%s_%d_%d_%d", ip_name, maj, min, rev); 1093 + } 1094 + 1095 + /* 1096 + * amdgpu_ucode_request - Fetch and validate amdgpu microcode 1097 + * 1098 + * @adev: amdgpu device 1099 + * @fw: pointer to load firmware to 1100 + * @fw_name: firmware to load 1101 + * 1102 + * This is a helper that will use request_firmware and amdgpu_ucode_validate 1103 + * to load and run basic validation on firmware. If the load fails, remap 1104 + * the error code to -ENODEV, so that early_init functions will fail to load. 1105 + */ 1106 + int amdgpu_ucode_request(struct amdgpu_device *adev, const struct firmware **fw, 1107 + const char *fw_name) 1108 + { 1109 + int err = request_firmware(fw, fw_name, adev->dev); 1110 + 1111 + if (err) 1112 + return -ENODEV; 1113 + err = amdgpu_ucode_validate(*fw); 1114 + if (err) 1115 + dev_dbg(adev->dev, "\"%s\" failed to validate\n", fw_name); 1116 + 1117 + return err; 1118 + } 1119 + 1120 + /* 1121 + * amdgpu_ucode_release - Release firmware microcode 1122 + * 1123 + * @fw: pointer to firmware to release 1124 + */ 1125 + void amdgpu_ucode_release(const struct firmware **fw) 1126 + { 1127 + release_firmware(*fw); 1128 + *fw = NULL; 1314 1129 }
+3 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
··· 543 543 void amdgpu_ucode_print_sdma_hdr(const struct common_firmware_header *hdr); 544 544 void amdgpu_ucode_print_psp_hdr(const struct common_firmware_header *hdr); 545 545 void amdgpu_ucode_print_gpu_info_hdr(const struct common_firmware_header *hdr); 546 - int amdgpu_ucode_validate(const struct firmware *fw); 546 + int amdgpu_ucode_request(struct amdgpu_device *adev, const struct firmware **fw, 547 + const char *fw_name); 548 + void amdgpu_ucode_release(const struct firmware **fw); 547 549 bool amdgpu_ucode_hdr_version(union amdgpu_firmware_header *hdr, 548 550 uint16_t hdr_major, uint16_t hdr_minor); 549 551
+3 -11
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
··· 260 260 return -EINVAL; 261 261 } 262 262 263 - r = request_firmware(&adev->uvd.fw, fw_name, adev->dev); 264 - if (r) { 265 - dev_err(adev->dev, "amdgpu_uvd: Can't load firmware \"%s\"\n", 266 - fw_name); 267 - return r; 268 - } 269 - 270 - r = amdgpu_ucode_validate(adev->uvd.fw); 263 + r = amdgpu_ucode_request(adev, &adev->uvd.fw, fw_name); 271 264 if (r) { 272 265 dev_err(adev->dev, "amdgpu_uvd: Can't validate firmware \"%s\"\n", 273 266 fw_name); 274 - release_firmware(adev->uvd.fw); 275 - adev->uvd.fw = NULL; 267 + amdgpu_ucode_release(&adev->uvd.fw); 276 268 return r; 277 269 } 278 270 ··· 389 397 amdgpu_ring_fini(&adev->uvd.inst[j].ring_enc[i]); 390 398 } 391 399 amdgpu_bo_free_kernel(&adev->uvd.ib_bo, NULL, &addr); 392 - release_firmware(adev->uvd.fw); 400 + amdgpu_ucode_release(&adev->uvd.fw); 393 401 394 402 return 0; 395 403 }
+3 -11
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
··· 158 158 return -EINVAL; 159 159 } 160 160 161 - r = request_firmware(&adev->vce.fw, fw_name, adev->dev); 162 - if (r) { 163 - dev_err(adev->dev, "amdgpu_vce: Can't load firmware \"%s\"\n", 164 - fw_name); 165 - return r; 166 - } 167 - 168 - r = amdgpu_ucode_validate(adev->vce.fw); 161 + r = amdgpu_ucode_request(adev, &adev->vce.fw, fw_name); 169 162 if (r) { 170 163 dev_err(adev->dev, "amdgpu_vce: Can't validate firmware \"%s\"\n", 171 164 fw_name); 172 - release_firmware(adev->vce.fw); 173 - adev->vce.fw = NULL; 165 + amdgpu_ucode_release(&adev->vce.fw); 174 166 return r; 175 167 } 176 168 ··· 220 228 for (i = 0; i < adev->vce.num_rings; i++) 221 229 amdgpu_ring_fini(&adev->vce.ring[i]); 222 230 223 - release_firmware(adev->vce.fw); 231 + amdgpu_ucode_release(&adev->vce.fw); 224 232 mutex_destroy(&adev->vce.idle_mutex); 225 233 226 234 return 0;
+16 -49
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
··· 80 80 81 81 static void amdgpu_vcn_idle_work_handler(struct work_struct *work); 82 82 83 + int amdgpu_vcn_early_init(struct amdgpu_device *adev) 84 + { 85 + char ucode_prefix[30]; 86 + char fw_name[40]; 87 + int r; 88 + 89 + amdgpu_ucode_ip_version_decode(adev, UVD_HWIP, ucode_prefix, sizeof(ucode_prefix)); 90 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s.bin", ucode_prefix); 91 + r = amdgpu_ucode_request(adev, &adev->vcn.fw, fw_name); 92 + if (r) 93 + amdgpu_ucode_release(&adev->vcn.fw); 94 + 95 + return r; 96 + } 97 + 83 98 int amdgpu_vcn_sw_init(struct amdgpu_device *adev) 84 99 { 85 100 unsigned long bo_size; 86 - const char *fw_name; 87 101 const struct common_firmware_header *hdr; 88 102 unsigned char fw_check; 89 103 unsigned int fw_shared_size, log_offset; ··· 113 99 switch (adev->ip_versions[UVD_HWIP][0]) { 114 100 case IP_VERSION(1, 0, 0): 115 101 case IP_VERSION(1, 0, 1): 116 - if (adev->apu_flags & AMD_APU_IS_RAVEN2) 117 - fw_name = FIRMWARE_RAVEN2; 118 - else if (adev->apu_flags & AMD_APU_IS_PICASSO) 119 - fw_name = FIRMWARE_PICASSO; 120 - else 121 - fw_name = FIRMWARE_RAVEN; 122 - break; 123 102 case IP_VERSION(2, 5, 0): 124 - fw_name = FIRMWARE_ARCTURUS; 125 103 if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && 126 104 (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) 127 105 adev->vcn.indirect_sram = true; 128 106 break; 129 107 case IP_VERSION(2, 2, 0): 130 - if (adev->apu_flags & AMD_APU_IS_RENOIR) 131 - fw_name = FIRMWARE_RENOIR; 132 - else 133 - fw_name = FIRMWARE_GREEN_SARDINE; 134 - 135 108 if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && 136 109 (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) 137 110 adev->vcn.indirect_sram = true; 138 111 break; 139 112 case IP_VERSION(2, 6, 0): 140 - fw_name = FIRMWARE_ALDEBARAN; 141 113 if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && 142 114 (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) 143 115 adev->vcn.indirect_sram = true; 144 116 break; 145 117 case IP_VERSION(2, 0, 0): 146 - fw_name = FIRMWARE_NAVI10; 147 118 if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && 148 119 (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) 149 120 adev->vcn.indirect_sram = true; 150 121 break; 151 122 case IP_VERSION(2, 0, 2): 152 - if (adev->asic_type == CHIP_NAVI12) 153 - fw_name = FIRMWARE_NAVI12; 154 - else 155 - fw_name = FIRMWARE_NAVI14; 156 123 if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && 157 124 (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) 158 125 adev->vcn.indirect_sram = true; ··· 141 146 case IP_VERSION(3, 0, 0): 142 147 case IP_VERSION(3, 0, 64): 143 148 case IP_VERSION(3, 0, 192): 144 - if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 0)) 145 - fw_name = FIRMWARE_SIENNA_CICHLID; 146 - else 147 - fw_name = FIRMWARE_NAVY_FLOUNDER; 148 149 if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && 149 150 (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) 150 151 adev->vcn.indirect_sram = true; 151 152 break; 152 153 case IP_VERSION(3, 0, 2): 153 - fw_name = FIRMWARE_VANGOGH; 154 154 if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && 155 155 (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) 156 156 adev->vcn.indirect_sram = true; 157 157 break; 158 158 case IP_VERSION(3, 0, 16): 159 - fw_name = FIRMWARE_DIMGREY_CAVEFISH; 160 159 if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && 161 160 (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) 162 161 adev->vcn.indirect_sram = true; 163 162 break; 164 163 case IP_VERSION(3, 0, 33): 165 - fw_name = FIRMWARE_BEIGE_GOBY; 166 164 if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && 167 165 (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) 168 166 adev->vcn.indirect_sram = true; 169 167 break; 170 168 case IP_VERSION(3, 1, 1): 171 - fw_name = FIRMWARE_YELLOW_CARP; 172 169 if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && 173 170 (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) 174 171 adev->vcn.indirect_sram = true; 175 172 break; 176 173 case IP_VERSION(3, 1, 2): 177 - fw_name = FIRMWARE_VCN_3_1_2; 178 174 if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && 179 175 (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) 180 176 adev->vcn.indirect_sram = true; 181 177 break; 182 178 case IP_VERSION(4, 0, 0): 183 - fw_name = FIRMWARE_VCN4_0_0; 184 179 if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && 185 180 (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) 186 181 adev->vcn.indirect_sram = true; 187 182 break; 188 183 case IP_VERSION(4, 0, 2): 189 - fw_name = FIRMWARE_VCN4_0_2; 190 184 if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && 191 185 (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) 192 186 adev->vcn.indirect_sram = true; 193 187 break; 194 188 case IP_VERSION(4, 0, 4): 195 - fw_name = FIRMWARE_VCN4_0_4; 196 189 if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && 197 190 (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) 198 191 adev->vcn.indirect_sram = true; 199 192 break; 200 193 default: 201 194 return -EINVAL; 202 - } 203 - 204 - r = request_firmware(&adev->vcn.fw, fw_name, adev->dev); 205 - if (r) { 206 - dev_err(adev->dev, "amdgpu_vcn: Can't load firmware \"%s\"\n", 207 - fw_name); 208 - return r; 209 - } 210 - 211 - r = amdgpu_ucode_validate(adev->vcn.fw); 212 - if (r) { 213 - dev_err(adev->dev, "amdgpu_vcn: Can't validate firmware \"%s\"\n", 214 - fw_name); 215 - release_firmware(adev->vcn.fw); 216 - adev->vcn.fw = NULL; 217 - return r; 218 195 } 219 196 220 197 hdr = (const struct common_firmware_header *)adev->vcn.fw->data; ··· 306 339 amdgpu_ring_fini(&adev->vcn.inst[j].ring_enc[i]); 307 340 } 308 341 309 - release_firmware(adev->vcn.fw); 342 + amdgpu_ucode_release(&adev->vcn.fw); 310 343 mutex_destroy(&adev->vcn.vcn1_jpeg1_workaround); 311 344 mutex_destroy(&adev->vcn.vcn_pg_lock); 312 345
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
··· 369 369 VCN_UNIFIED_RING, 370 370 }; 371 371 372 + int amdgpu_vcn_early_init(struct amdgpu_device *adev); 372 373 int amdgpu_vcn_sw_init(struct amdgpu_device *adev); 373 374 int amdgpu_vcn_sw_fini(struct amdgpu_device *adev); 374 375 int amdgpu_vcn_suspend(struct amdgpu_device *adev);
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
··· 882 882 kfree(rsv); 883 883 884 884 list_for_each_entry_safe(rsv, temp, &mgr->reserved_pages, blocks) { 885 - drm_buddy_free_list(&mgr->mm, &rsv->blocks); 885 + drm_buddy_free_list(&mgr->mm, &rsv->allocated); 886 886 kfree(rsv); 887 887 } 888 888 drm_buddy_fini(&mgr->mm);
+6 -10
drivers/gpu/drm/amd/amdgpu/cik_sdma.c
··· 73 73 static void cik_sdma_free_microcode(struct amdgpu_device *adev) 74 74 { 75 75 int i; 76 - for (i = 0; i < adev->sdma.num_instances; i++) { 77 - release_firmware(adev->sdma.instance[i].fw); 78 - adev->sdma.instance[i].fw = NULL; 79 - } 76 + 77 + for (i = 0; i < adev->sdma.num_instances; i++) 78 + amdgpu_ucode_release(&adev->sdma.instance[i].fw); 80 79 } 81 80 82 81 /* ··· 136 137 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name); 137 138 else 138 139 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name); 139 - err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev); 140 + err = amdgpu_ucode_request(adev, &adev->sdma.instance[i].fw, fw_name); 140 141 if (err) 141 142 goto out; 142 - err = amdgpu_ucode_validate(adev->sdma.instance[i].fw); 143 143 } 144 144 out: 145 145 if (err) { 146 146 pr_err("cik_sdma: Failed to load firmware \"%s\"\n", fw_name); 147 - for (i = 0; i < adev->sdma.num_instances; i++) { 148 - release_firmware(adev->sdma.instance[i].fw); 149 - adev->sdma.instance[i].fw = NULL; 150 - } 147 + for (i = 0; i < adev->sdma.num_instances; i++) 148 + amdgpu_ucode_release(&adev->sdma.instance[i].fw); 151 149 } 152 150 return err; 153 151 }
+38 -117
drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
··· 3891 3891 3892 3892 static void gfx_v10_0_free_microcode(struct amdgpu_device *adev) 3893 3893 { 3894 - release_firmware(adev->gfx.pfp_fw); 3895 - adev->gfx.pfp_fw = NULL; 3896 - release_firmware(adev->gfx.me_fw); 3897 - adev->gfx.me_fw = NULL; 3898 - release_firmware(adev->gfx.ce_fw); 3899 - adev->gfx.ce_fw = NULL; 3900 - release_firmware(adev->gfx.rlc_fw); 3901 - adev->gfx.rlc_fw = NULL; 3902 - release_firmware(adev->gfx.mec_fw); 3903 - adev->gfx.mec_fw = NULL; 3904 - release_firmware(adev->gfx.mec2_fw); 3905 - adev->gfx.mec2_fw = NULL; 3894 + amdgpu_ucode_release(&adev->gfx.pfp_fw); 3895 + amdgpu_ucode_release(&adev->gfx.me_fw); 3896 + amdgpu_ucode_release(&adev->gfx.ce_fw); 3897 + amdgpu_ucode_release(&adev->gfx.rlc_fw); 3898 + amdgpu_ucode_release(&adev->gfx.mec_fw); 3899 + amdgpu_ucode_release(&adev->gfx.mec2_fw); 3906 3900 3907 3901 kfree(adev->gfx.rlc.register_list_format); 3908 3902 } ··· 3968 3974 3969 3975 static int gfx_v10_0_init_microcode(struct amdgpu_device *adev) 3970 3976 { 3971 - const char *chip_name; 3972 3977 char fw_name[40]; 3973 - char *wks = ""; 3978 + char ucode_prefix[30]; 3979 + const char *wks = ""; 3974 3980 int err; 3975 3981 const struct rlc_firmware_header_v2_0 *rlc_hdr; 3976 3982 uint16_t version_major; ··· 3978 3984 3979 3985 DRM_DEBUG("\n"); 3980 3986 3981 - switch (adev->ip_versions[GC_HWIP][0]) { 3982 - case IP_VERSION(10, 1, 10): 3983 - chip_name = "navi10"; 3984 - break; 3985 - case IP_VERSION(10, 1, 1): 3986 - chip_name = "navi14"; 3987 - if (!(adev->pdev->device == 0x7340 && 3988 - adev->pdev->revision != 0x00)) 3989 - wks = "_wks"; 3990 - break; 3991 - case IP_VERSION(10, 1, 2): 3992 - chip_name = "navi12"; 3993 - break; 3994 - case IP_VERSION(10, 3, 0): 3995 - chip_name = "sienna_cichlid"; 3996 - break; 3997 - case IP_VERSION(10, 3, 2): 3998 - chip_name = "navy_flounder"; 3999 - break; 4000 - case IP_VERSION(10, 3, 1): 4001 - chip_name = "vangogh"; 4002 - break; 4003 - case IP_VERSION(10, 3, 4): 4004 - chip_name = "dimgrey_cavefish"; 4005 - break; 4006 - case IP_VERSION(10, 3, 5): 4007 - chip_name = "beige_goby"; 4008 - break; 4009 - case IP_VERSION(10, 3, 3): 4010 - chip_name = "yellow_carp"; 4011 - break; 4012 - case IP_VERSION(10, 3, 6): 4013 - chip_name = "gc_10_3_6"; 4014 - break; 4015 - case IP_VERSION(10, 1, 3): 4016 - case IP_VERSION(10, 1, 4): 4017 - chip_name = "cyan_skillfish2"; 4018 - break; 4019 - case IP_VERSION(10, 3, 7): 4020 - chip_name = "gc_10_3_7"; 4021 - break; 4022 - default: 4023 - BUG(); 4024 - } 3987 + if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 1, 1) && 3988 + (!(adev->pdev->device == 0x7340 && adev->pdev->revision != 0x00))) 3989 + wks = "_wks"; 3990 + amdgpu_ucode_ip_version_decode(adev, GC_HWIP, ucode_prefix, sizeof(ucode_prefix)); 4025 3991 4026 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp%s.bin", chip_name, wks); 4027 - err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev); 4028 - if (err) 4029 - goto out; 4030 - err = amdgpu_ucode_validate(adev->gfx.pfp_fw); 3992 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp%s.bin", ucode_prefix, wks); 3993 + err = amdgpu_ucode_request(adev, &adev->gfx.pfp_fw, fw_name); 4031 3994 if (err) 4032 3995 goto out; 4033 3996 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_PFP); 4034 3997 4035 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me%s.bin", chip_name, wks); 4036 - err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); 4037 - if (err) 4038 - goto out; 4039 - err = amdgpu_ucode_validate(adev->gfx.me_fw); 3998 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me%s.bin", ucode_prefix, wks); 3999 + err = amdgpu_ucode_request(adev, &adev->gfx.me_fw, fw_name); 4040 4000 if (err) 4041 4001 goto out; 4042 4002 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_ME); 4043 4003 4044 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce%s.bin", chip_name, wks); 4045 - err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); 4046 - if (err) 4047 - goto out; 4048 - err = amdgpu_ucode_validate(adev->gfx.ce_fw); 4004 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce%s.bin", ucode_prefix, wks); 4005 + err = amdgpu_ucode_request(adev, &adev->gfx.ce_fw, fw_name); 4049 4006 if (err) 4050 4007 goto out; 4051 4008 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_CE); 4052 4009 4053 4010 if (!amdgpu_sriov_vf(adev)) { 4054 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); 4055 - err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); 4056 - if (err) 4057 - goto out; 4011 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", ucode_prefix); 4012 + err = amdgpu_ucode_request(adev, &adev->gfx.rlc_fw, fw_name); 4058 4013 /* don't check this. There are apparently firmwares in the wild with 4059 4014 * incorrect size in the header 4060 4015 */ 4061 - err = amdgpu_ucode_validate(adev->gfx.rlc_fw); 4016 + if (err == -ENODEV) 4017 + goto out; 4062 4018 if (err) 4063 4019 dev_dbg(adev->dev, 4064 - "gfx10: amdgpu_ucode_validate() failed \"%s\"\n", 4020 + "gfx10: amdgpu_ucode_request() failed \"%s\"\n", 4065 4021 fw_name); 4066 4022 rlc_hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data; 4067 4023 version_major = le16_to_cpu(rlc_hdr->header.header_version_major); ··· 4021 4077 goto out; 4022 4078 } 4023 4079 4024 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec%s.bin", chip_name, wks); 4025 - err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev); 4026 - if (err) 4027 - goto out; 4028 - err = amdgpu_ucode_validate(adev->gfx.mec_fw); 4080 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec%s.bin", ucode_prefix, wks); 4081 + err = amdgpu_ucode_request(adev, &adev->gfx.mec_fw, fw_name); 4029 4082 if (err) 4030 4083 goto out; 4031 4084 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC1); 4032 4085 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC1_JT); 4033 4086 4034 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2%s.bin", chip_name, wks); 4035 - err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev); 4087 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2%s.bin", ucode_prefix, wks); 4088 + err = amdgpu_ucode_request(adev, &adev->gfx.mec2_fw, fw_name); 4036 4089 if (!err) { 4037 - err = amdgpu_ucode_validate(adev->gfx.mec2_fw); 4038 - if (err) 4039 - goto out; 4040 4090 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC2); 4041 4091 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC2_JT); 4042 4092 } else { 4043 4093 err = 0; 4044 4094 adev->gfx.mec2_fw = NULL; 4045 4095 } 4096 + amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC2); 4097 + amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC2_JT); 4046 4098 4047 4099 gfx_v10_0_check_fw_write_wait(adev); 4048 4100 out: 4049 4101 if (err) { 4050 - dev_err(adev->dev, 4051 - "gfx10: Failed to init firmware \"%s\"\n", 4052 - fw_name); 4053 - release_firmware(adev->gfx.pfp_fw); 4054 - adev->gfx.pfp_fw = NULL; 4055 - release_firmware(adev->gfx.me_fw); 4056 - adev->gfx.me_fw = NULL; 4057 - release_firmware(adev->gfx.ce_fw); 4058 - adev->gfx.ce_fw = NULL; 4059 - release_firmware(adev->gfx.rlc_fw); 4060 - adev->gfx.rlc_fw = NULL; 4061 - release_firmware(adev->gfx.mec_fw); 4062 - adev->gfx.mec_fw = NULL; 4063 - release_firmware(adev->gfx.mec2_fw); 4064 - adev->gfx.mec2_fw = NULL; 4102 + amdgpu_ucode_release(&adev->gfx.pfp_fw); 4103 + amdgpu_ucode_release(&adev->gfx.me_fw); 4104 + amdgpu_ucode_release(&adev->gfx.ce_fw); 4105 + amdgpu_ucode_release(&adev->gfx.rlc_fw); 4106 + amdgpu_ucode_release(&adev->gfx.mec_fw); 4107 + amdgpu_ucode_release(&adev->gfx.mec2_fw); 4065 4108 } 4066 4109 4067 4110 gfx_v10_0_check_gfxoff_flag(adev); ··· 4201 4270 amdgpu_bo_free_kernel(&adev->gfx.mec.mec_fw_obj, NULL, NULL); 4202 4271 } 4203 4272 4204 - static int gfx_v10_0_me_init(struct amdgpu_device *adev) 4273 + static void gfx_v10_0_me_init(struct amdgpu_device *adev) 4205 4274 { 4206 - int r; 4207 - 4208 4275 bitmap_zero(adev->gfx.me.queue_bitmap, AMDGPU_MAX_GFX_QUEUES); 4209 4276 4210 4277 amdgpu_gfx_graphics_queue_acquire(adev); 4211 - 4212 - r = gfx_v10_0_init_microcode(adev); 4213 - if (r) 4214 - DRM_ERROR("Failed to load gfx firmware!\n"); 4215 - 4216 - return r; 4217 4278 } 4218 4279 4219 4280 static int gfx_v10_0_mec_init(struct amdgpu_device *adev) ··· 4573 4650 4574 4651 adev->gfx.gfx_current_status = AMDGPU_GFX_NORMAL_MODE; 4575 4652 4576 - r = gfx_v10_0_me_init(adev); 4577 - if (r) 4578 - return r; 4653 + gfx_v10_0_me_init(adev); 4579 4654 4580 4655 if (adev->gfx.rlc.funcs) { 4581 4656 if (adev->gfx.rlc.funcs->init) { ··· 7551 7630 /* init rlcg reg access ctrl */ 7552 7631 gfx_v10_0_init_rlcg_reg_access_ctrl(adev); 7553 7632 7554 - return 0; 7633 + return gfx_v10_0_init_microcode(adev); 7555 7634 } 7556 7635 7557 7636 static int gfx_v10_0_late_init(void *handle)
+41 -83
drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
··· 431 431 432 432 static void gfx_v11_0_free_microcode(struct amdgpu_device *adev) 433 433 { 434 - release_firmware(adev->gfx.pfp_fw); 435 - adev->gfx.pfp_fw = NULL; 436 - release_firmware(adev->gfx.me_fw); 437 - adev->gfx.me_fw = NULL; 438 - release_firmware(adev->gfx.rlc_fw); 439 - adev->gfx.rlc_fw = NULL; 440 - release_firmware(adev->gfx.mec_fw); 441 - adev->gfx.mec_fw = NULL; 434 + amdgpu_ucode_release(&adev->gfx.pfp_fw); 435 + amdgpu_ucode_release(&adev->gfx.me_fw); 436 + amdgpu_ucode_release(&adev->gfx.rlc_fw); 437 + amdgpu_ucode_release(&adev->gfx.mec_fw); 442 438 443 439 kfree(adev->gfx.rlc.register_list_format); 440 + } 441 + 442 + static int gfx_v11_0_init_toc_microcode(struct amdgpu_device *adev, const char *ucode_prefix) 443 + { 444 + const struct psp_firmware_header_v1_0 *toc_hdr; 445 + int err = 0; 446 + char fw_name[40]; 447 + 448 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_toc.bin", ucode_prefix); 449 + err = amdgpu_ucode_request(adev, &adev->psp.toc_fw, fw_name); 450 + if (err) 451 + goto out; 452 + 453 + toc_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.toc_fw->data; 454 + adev->psp.toc.fw_version = le32_to_cpu(toc_hdr->header.ucode_version); 455 + adev->psp.toc.feature_version = le32_to_cpu(toc_hdr->sos.fw_version); 456 + adev->psp.toc.size_bytes = le32_to_cpu(toc_hdr->header.ucode_size_bytes); 457 + adev->psp.toc.start_addr = (uint8_t *)toc_hdr + 458 + le32_to_cpu(toc_hdr->header.ucode_array_offset_bytes); 459 + return 0; 460 + out: 461 + amdgpu_ucode_release(&adev->psp.toc_fw); 462 + return err; 444 463 } 445 464 446 465 static int gfx_v11_0_init_microcode(struct amdgpu_device *adev) ··· 476 457 amdgpu_ucode_ip_version_decode(adev, GC_HWIP, ucode_prefix, sizeof(ucode_prefix)); 477 458 478 459 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", ucode_prefix); 479 - err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev); 480 - if (err) 481 - goto out; 482 - err = amdgpu_ucode_validate(adev->gfx.pfp_fw); 460 + err = amdgpu_ucode_request(adev, &adev->gfx.pfp_fw, fw_name); 483 461 if (err) 484 462 goto out; 485 463 /* check pfp fw hdr version to decide if enable rs64 for gfx11.*/ ··· 493 477 } 494 478 495 479 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", ucode_prefix); 496 - err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); 497 - if (err) 498 - goto out; 499 - err = amdgpu_ucode_validate(adev->gfx.me_fw); 480 + err = amdgpu_ucode_request(adev, &adev->gfx.me_fw, fw_name); 500 481 if (err) 501 482 goto out; 502 483 if (adev->gfx.rs64_enable) { ··· 506 493 507 494 if (!amdgpu_sriov_vf(adev)) { 508 495 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", ucode_prefix); 509 - err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); 510 - if (err) 511 - goto out; 512 - err = amdgpu_ucode_validate(adev->gfx.rlc_fw); 496 + err = amdgpu_ucode_request(adev, &adev->gfx.rlc_fw, fw_name); 513 497 if (err) 514 498 goto out; 515 499 rlc_hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data; ··· 518 508 } 519 509 520 510 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", ucode_prefix); 521 - err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev); 522 - if (err) 523 - goto out; 524 - err = amdgpu_ucode_validate(adev->gfx.mec_fw); 511 + err = amdgpu_ucode_request(adev, &adev->gfx.mec_fw, fw_name); 525 512 if (err) 526 513 goto out; 527 514 if (adev->gfx.rs64_enable) { ··· 532 525 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC1_JT); 533 526 } 534 527 528 + if (adev->firmware.load_type == AMDGPU_FW_LOAD_RLC_BACKDOOR_AUTO) 529 + err = gfx_v11_0_init_toc_microcode(adev, ucode_prefix); 530 + 535 531 /* only one MEC for gfx 11.0.0. */ 536 532 adev->gfx.mec2_fw = NULL; 537 533 538 534 out: 539 535 if (err) { 540 - dev_err(adev->dev, 541 - "gfx11: Failed to init firmware \"%s\"\n", 542 - fw_name); 543 - release_firmware(adev->gfx.pfp_fw); 544 - adev->gfx.pfp_fw = NULL; 545 - release_firmware(adev->gfx.me_fw); 546 - adev->gfx.me_fw = NULL; 547 - release_firmware(adev->gfx.rlc_fw); 548 - adev->gfx.rlc_fw = NULL; 549 - release_firmware(adev->gfx.mec_fw); 550 - adev->gfx.mec_fw = NULL; 536 + amdgpu_ucode_release(&adev->gfx.pfp_fw); 537 + amdgpu_ucode_release(&adev->gfx.me_fw); 538 + amdgpu_ucode_release(&adev->gfx.rlc_fw); 539 + amdgpu_ucode_release(&adev->gfx.mec_fw); 551 540 } 552 541 553 - return err; 554 - } 555 - 556 - static int gfx_v11_0_init_toc_microcode(struct amdgpu_device *adev) 557 - { 558 - const struct psp_firmware_header_v1_0 *toc_hdr; 559 - int err = 0; 560 - char fw_name[40]; 561 - char ucode_prefix[30]; 562 - 563 - amdgpu_ucode_ip_version_decode(adev, GC_HWIP, ucode_prefix, sizeof(ucode_prefix)); 564 - 565 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_toc.bin", ucode_prefix); 566 - err = request_firmware(&adev->psp.toc_fw, fw_name, adev->dev); 567 - if (err) 568 - goto out; 569 - 570 - err = amdgpu_ucode_validate(adev->psp.toc_fw); 571 - if (err) 572 - goto out; 573 - 574 - toc_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.toc_fw->data; 575 - adev->psp.toc.fw_version = le32_to_cpu(toc_hdr->header.ucode_version); 576 - adev->psp.toc.feature_version = le32_to_cpu(toc_hdr->sos.fw_version); 577 - adev->psp.toc.size_bytes = le32_to_cpu(toc_hdr->header.ucode_size_bytes); 578 - adev->psp.toc.start_addr = (uint8_t *)toc_hdr + 579 - le32_to_cpu(toc_hdr->header.ucode_array_offset_bytes); 580 - return 0; 581 - out: 582 - dev_err(adev->dev, "Failed to load TOC microcode\n"); 583 - release_firmware(adev->psp.toc_fw); 584 - adev->psp.toc_fw = NULL; 585 542 return err; 586 543 } 587 544 ··· 685 714 amdgpu_bo_free_kernel(&adev->gfx.mec.mec_fw_data_obj, NULL, NULL); 686 715 } 687 716 688 - static int gfx_v11_0_me_init(struct amdgpu_device *adev) 717 + static void gfx_v11_0_me_init(struct amdgpu_device *adev) 689 718 { 690 - int r; 691 - 692 719 bitmap_zero(adev->gfx.me.queue_bitmap, AMDGPU_MAX_GFX_QUEUES); 693 720 694 721 amdgpu_gfx_graphics_queue_acquire(adev); 695 - 696 - r = gfx_v11_0_init_microcode(adev); 697 - if (r) 698 - DRM_ERROR("Failed to load gfx firmware!\n"); 699 - 700 - return r; 701 722 } 702 723 703 724 static int gfx_v11_0_mec_init(struct amdgpu_device *adev) ··· 1303 1340 } 1304 1341 } 1305 1342 1306 - r = gfx_v11_0_me_init(adev); 1307 - if (r) 1308 - return r; 1343 + gfx_v11_0_me_init(adev); 1309 1344 1310 1345 r = gfx_v11_0_rlc_init(adev); 1311 1346 if (r) { ··· 1371 1410 1372 1411 /* allocate visible FB for rlc auto-loading fw */ 1373 1412 if (adev->firmware.load_type == AMDGPU_FW_LOAD_RLC_BACKDOOR_AUTO) { 1374 - r = gfx_v11_0_init_toc_microcode(adev); 1375 - if (r) 1376 - dev_err(adev->dev, "Failed to load toc firmware!\n"); 1377 1413 r = gfx_v11_0_rlc_autoload_buffer_init(adev); 1378 1414 if (r) 1379 1415 return r; ··· 4651 4693 4652 4694 gfx_v11_0_init_rlcg_reg_access_ctrl(adev); 4653 4695 4654 - return 0; 4696 + return gfx_v11_0_init_microcode(adev); 4655 4697 } 4656 4698 4657 4699 static int gfx_v11_0_ras_late_init(void *handle)
+8 -22
drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
··· 338 338 } 339 339 340 340 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name); 341 - err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev); 342 - if (err) 343 - goto out; 344 - err = amdgpu_ucode_validate(adev->gfx.pfp_fw); 341 + err = amdgpu_ucode_request(adev, &adev->gfx.pfp_fw, fw_name); 345 342 if (err) 346 343 goto out; 347 344 cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data; ··· 346 349 adev->gfx.pfp_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); 347 350 348 351 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name); 349 - err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); 350 - if (err) 351 - goto out; 352 - err = amdgpu_ucode_validate(adev->gfx.me_fw); 352 + err = amdgpu_ucode_request(adev, &adev->gfx.me_fw, fw_name); 353 353 if (err) 354 354 goto out; 355 355 cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data; ··· 354 360 adev->gfx.me_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); 355 361 356 362 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name); 357 - err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); 358 - if (err) 359 - goto out; 360 - err = amdgpu_ucode_validate(adev->gfx.ce_fw); 363 + err = amdgpu_ucode_request(adev, &adev->gfx.ce_fw, fw_name); 361 364 if (err) 362 365 goto out; 363 366 cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data; ··· 362 371 adev->gfx.ce_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); 363 372 364 373 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); 365 - err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); 374 + err = amdgpu_ucode_request(adev, &adev->gfx.rlc_fw, fw_name); 366 375 if (err) 367 376 goto out; 368 - err = amdgpu_ucode_validate(adev->gfx.rlc_fw); 369 377 rlc_hdr = (const struct rlc_firmware_header_v1_0 *)adev->gfx.rlc_fw->data; 370 378 adev->gfx.rlc_fw_version = le32_to_cpu(rlc_hdr->header.ucode_version); 371 379 adev->gfx.rlc_feature_version = le32_to_cpu(rlc_hdr->ucode_feature_version); ··· 372 382 out: 373 383 if (err) { 374 384 pr_err("gfx6: Failed to load firmware \"%s\"\n", fw_name); 375 - release_firmware(adev->gfx.pfp_fw); 376 - adev->gfx.pfp_fw = NULL; 377 - release_firmware(adev->gfx.me_fw); 378 - adev->gfx.me_fw = NULL; 379 - release_firmware(adev->gfx.ce_fw); 380 - adev->gfx.ce_fw = NULL; 381 - release_firmware(adev->gfx.rlc_fw); 382 - adev->gfx.rlc_fw = NULL; 385 + amdgpu_ucode_release(&adev->gfx.pfp_fw); 386 + amdgpu_ucode_release(&adev->gfx.me_fw); 387 + amdgpu_ucode_release(&adev->gfx.ce_fw); 388 + amdgpu_ucode_release(&adev->gfx.rlc_fw); 383 389 } 384 390 return err; 385 391 }
+17 -51
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
··· 887 887 static void gfx_v7_0_init_pg(struct amdgpu_device *adev); 888 888 static void gfx_v7_0_get_cu_info(struct amdgpu_device *adev); 889 889 890 + static void gfx_v7_0_free_microcode(struct amdgpu_device *adev) 891 + { 892 + amdgpu_ucode_release(&adev->gfx.pfp_fw); 893 + amdgpu_ucode_release(&adev->gfx.me_fw); 894 + amdgpu_ucode_release(&adev->gfx.ce_fw); 895 + amdgpu_ucode_release(&adev->gfx.mec_fw); 896 + amdgpu_ucode_release(&adev->gfx.mec2_fw); 897 + amdgpu_ucode_release(&adev->gfx.rlc_fw); 898 + } 899 + 890 900 /* 891 901 * Core functions 892 902 */ ··· 937 927 } 938 928 939 929 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name); 940 - err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev); 941 - if (err) 942 - goto out; 943 - err = amdgpu_ucode_validate(adev->gfx.pfp_fw); 930 + err = amdgpu_ucode_request(adev, &adev->gfx.pfp_fw, fw_name); 944 931 if (err) 945 932 goto out; 946 933 947 934 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name); 948 - err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); 949 - if (err) 950 - goto out; 951 - err = amdgpu_ucode_validate(adev->gfx.me_fw); 935 + err = amdgpu_ucode_request(adev, &adev->gfx.me_fw, fw_name); 952 936 if (err) 953 937 goto out; 954 938 955 939 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name); 956 - err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); 957 - if (err) 958 - goto out; 959 - err = amdgpu_ucode_validate(adev->gfx.ce_fw); 940 + err = amdgpu_ucode_request(adev, &adev->gfx.ce_fw, fw_name); 960 941 if (err) 961 942 goto out; 962 943 963 944 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name); 964 - err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev); 965 - if (err) 966 - goto out; 967 - err = amdgpu_ucode_validate(adev->gfx.mec_fw); 945 + err = amdgpu_ucode_request(adev, &adev->gfx.mec_fw, fw_name); 968 946 if (err) 969 947 goto out; 970 948 971 949 if (adev->asic_type == CHIP_KAVERI) { 972 950 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name); 973 - err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev); 974 - if (err) 975 - goto out; 976 - err = amdgpu_ucode_validate(adev->gfx.mec2_fw); 951 + err = amdgpu_ucode_request(adev, &adev->gfx.mec2_fw, fw_name); 977 952 if (err) 978 953 goto out; 979 954 } 980 955 981 956 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); 982 - err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); 957 + err = amdgpu_ucode_request(adev, &adev->gfx.rlc_fw, fw_name); 983 958 if (err) 984 959 goto out; 985 - err = amdgpu_ucode_validate(adev->gfx.rlc_fw); 986 - 987 960 out: 988 961 if (err) { 989 962 pr_err("gfx7: Failed to load firmware \"%s\"\n", fw_name); 990 - release_firmware(adev->gfx.pfp_fw); 991 - adev->gfx.pfp_fw = NULL; 992 - release_firmware(adev->gfx.me_fw); 993 - adev->gfx.me_fw = NULL; 994 - release_firmware(adev->gfx.ce_fw); 995 - adev->gfx.ce_fw = NULL; 996 - release_firmware(adev->gfx.mec_fw); 997 - adev->gfx.mec_fw = NULL; 998 - release_firmware(adev->gfx.mec2_fw); 999 - adev->gfx.mec2_fw = NULL; 1000 - release_firmware(adev->gfx.rlc_fw); 1001 - adev->gfx.rlc_fw = NULL; 963 + gfx_v7_0_free_microcode(adev); 1002 964 } 1003 965 return err; 1004 - } 1005 - 1006 - static void gfx_v7_0_free_microcode(struct amdgpu_device *adev) 1007 - { 1008 - release_firmware(adev->gfx.pfp_fw); 1009 - adev->gfx.pfp_fw = NULL; 1010 - release_firmware(adev->gfx.me_fw); 1011 - adev->gfx.me_fw = NULL; 1012 - release_firmware(adev->gfx.ce_fw); 1013 - adev->gfx.ce_fw = NULL; 1014 - release_firmware(adev->gfx.mec_fw); 1015 - adev->gfx.mec_fw = NULL; 1016 - release_firmware(adev->gfx.mec2_fw); 1017 - adev->gfx.mec2_fw = NULL; 1018 - release_firmware(adev->gfx.rlc_fw); 1019 - adev->gfx.rlc_fw = NULL; 1020 966 } 1021 967 1022 968 /**
+33 -61
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
··· 924 924 925 925 static void gfx_v8_0_free_microcode(struct amdgpu_device *adev) 926 926 { 927 - release_firmware(adev->gfx.pfp_fw); 928 - adev->gfx.pfp_fw = NULL; 929 - release_firmware(adev->gfx.me_fw); 930 - adev->gfx.me_fw = NULL; 931 - release_firmware(adev->gfx.ce_fw); 932 - adev->gfx.ce_fw = NULL; 933 - release_firmware(adev->gfx.rlc_fw); 934 - adev->gfx.rlc_fw = NULL; 935 - release_firmware(adev->gfx.mec_fw); 936 - adev->gfx.mec_fw = NULL; 927 + amdgpu_ucode_release(&adev->gfx.pfp_fw); 928 + amdgpu_ucode_release(&adev->gfx.me_fw); 929 + amdgpu_ucode_release(&adev->gfx.ce_fw); 930 + amdgpu_ucode_release(&adev->gfx.rlc_fw); 931 + amdgpu_ucode_release(&adev->gfx.mec_fw); 937 932 if ((adev->asic_type != CHIP_STONEY) && 938 933 (adev->asic_type != CHIP_TOPAZ)) 939 - release_firmware(adev->gfx.mec2_fw); 940 - adev->gfx.mec2_fw = NULL; 934 + amdgpu_ucode_release(&adev->gfx.mec2_fw); 941 935 942 936 kfree(adev->gfx.rlc.register_list_format); 943 937 } ··· 983 989 984 990 if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) { 985 991 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp_2.bin", chip_name); 986 - err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev); 987 - if (err == -ENOENT) { 992 + err = amdgpu_ucode_request(adev, &adev->gfx.pfp_fw, fw_name); 993 + if (err == -ENODEV) { 988 994 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name); 989 - err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev); 995 + err = amdgpu_ucode_request(adev, &adev->gfx.pfp_fw, fw_name); 990 996 } 991 997 } else { 992 998 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name); 993 - err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev); 999 + err = amdgpu_ucode_request(adev, &adev->gfx.pfp_fw, fw_name); 994 1000 } 995 - if (err) 996 - goto out; 997 - err = amdgpu_ucode_validate(adev->gfx.pfp_fw); 998 1001 if (err) 999 1002 goto out; 1000 1003 cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data; ··· 1000 1009 1001 1010 if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) { 1002 1011 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me_2.bin", chip_name); 1003 - err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); 1004 - if (err == -ENOENT) { 1012 + err = amdgpu_ucode_request(adev, &adev->gfx.me_fw, fw_name); 1013 + if (err == -ENODEV) { 1005 1014 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name); 1006 - err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); 1015 + err = amdgpu_ucode_request(adev, &adev->gfx.me_fw, fw_name); 1007 1016 } 1008 1017 } else { 1009 1018 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name); 1010 - err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); 1019 + err = amdgpu_ucode_request(adev, &adev->gfx.me_fw, fw_name); 1011 1020 } 1012 - if (err) 1013 - goto out; 1014 - err = amdgpu_ucode_validate(adev->gfx.me_fw); 1015 1021 if (err) 1016 1022 goto out; 1017 1023 cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data; ··· 1018 1030 1019 1031 if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) { 1020 1032 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce_2.bin", chip_name); 1021 - err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); 1022 - if (err == -ENOENT) { 1033 + err = amdgpu_ucode_request(adev, &adev->gfx.ce_fw, fw_name); 1034 + if (err == -ENODEV) { 1023 1035 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name); 1024 - err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); 1036 + err = amdgpu_ucode_request(adev, &adev->gfx.ce_fw, fw_name); 1025 1037 } 1026 1038 } else { 1027 1039 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name); 1028 - err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); 1040 + err = amdgpu_ucode_request(adev, &adev->gfx.ce_fw, fw_name); 1029 1041 } 1030 - if (err) 1031 - goto out; 1032 - err = amdgpu_ucode_validate(adev->gfx.ce_fw); 1033 1042 if (err) 1034 1043 goto out; 1035 1044 cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data; ··· 1045 1060 adev->virt.chained_ib_support = false; 1046 1061 1047 1062 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); 1048 - err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); 1063 + err = amdgpu_ucode_request(adev, &adev->gfx.rlc_fw, fw_name); 1049 1064 if (err) 1050 1065 goto out; 1051 - err = amdgpu_ucode_validate(adev->gfx.rlc_fw); 1052 1066 rlc_hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data; 1053 1067 adev->gfx.rlc_fw_version = le32_to_cpu(rlc_hdr->header.ucode_version); 1054 1068 adev->gfx.rlc_feature_version = le32_to_cpu(rlc_hdr->ucode_feature_version); ··· 1094 1110 1095 1111 if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) { 1096 1112 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec_2.bin", chip_name); 1097 - err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev); 1098 - if (err == -ENOENT) { 1113 + err = amdgpu_ucode_request(adev, &adev->gfx.mec_fw, fw_name); 1114 + if (err == -ENODEV) { 1099 1115 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name); 1100 - err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev); 1116 + err = amdgpu_ucode_request(adev, &adev->gfx.mec_fw, fw_name); 1101 1117 } 1102 1118 } else { 1103 1119 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name); 1104 - err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev); 1120 + err = amdgpu_ucode_request(adev, &adev->gfx.mec_fw, fw_name); 1105 1121 } 1106 - if (err) 1107 - goto out; 1108 - err = amdgpu_ucode_validate(adev->gfx.mec_fw); 1109 1122 if (err) 1110 1123 goto out; 1111 1124 cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; ··· 1113 1132 (adev->asic_type != CHIP_TOPAZ)) { 1114 1133 if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) { 1115 1134 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2_2.bin", chip_name); 1116 - err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev); 1117 - if (err == -ENOENT) { 1135 + err = amdgpu_ucode_request(adev, &adev->gfx.mec2_fw, fw_name); 1136 + if (err == -ENODEV) { 1118 1137 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name); 1119 - err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev); 1138 + err = amdgpu_ucode_request(adev, &adev->gfx.mec2_fw, fw_name); 1120 1139 } 1121 1140 } else { 1122 1141 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name); 1123 - err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev); 1142 + err = amdgpu_ucode_request(adev, &adev->gfx.mec2_fw, fw_name); 1124 1143 } 1125 1144 if (!err) { 1126 - err = amdgpu_ucode_validate(adev->gfx.mec2_fw); 1127 - if (err) 1128 - goto out; 1129 1145 cp_hdr = (const struct gfx_firmware_header_v1_0 *) 1130 1146 adev->gfx.mec2_fw->data; 1131 1147 adev->gfx.mec2_fw_version = ··· 1197 1219 dev_err(adev->dev, 1198 1220 "gfx8: Failed to load firmware \"%s\"\n", 1199 1221 fw_name); 1200 - release_firmware(adev->gfx.pfp_fw); 1201 - adev->gfx.pfp_fw = NULL; 1202 - release_firmware(adev->gfx.me_fw); 1203 - adev->gfx.me_fw = NULL; 1204 - release_firmware(adev->gfx.ce_fw); 1205 - adev->gfx.ce_fw = NULL; 1206 - release_firmware(adev->gfx.rlc_fw); 1207 - adev->gfx.rlc_fw = NULL; 1208 - release_firmware(adev->gfx.mec_fw); 1209 - adev->gfx.mec_fw = NULL; 1210 - release_firmware(adev->gfx.mec2_fw); 1211 - adev->gfx.mec2_fw = NULL; 1222 + amdgpu_ucode_release(&adev->gfx.pfp_fw); 1223 + amdgpu_ucode_release(&adev->gfx.me_fw); 1224 + amdgpu_ucode_release(&adev->gfx.ce_fw); 1225 + amdgpu_ucode_release(&adev->gfx.rlc_fw); 1226 + amdgpu_ucode_release(&adev->gfx.mec_fw); 1227 + amdgpu_ucode_release(&adev->gfx.mec2_fw); 1212 1228 } 1213 1229 return err; 1214 1230 }
+30 -110
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
··· 1078 1078 1079 1079 static void gfx_v9_0_free_microcode(struct amdgpu_device *adev) 1080 1080 { 1081 - release_firmware(adev->gfx.pfp_fw); 1082 - adev->gfx.pfp_fw = NULL; 1083 - release_firmware(adev->gfx.me_fw); 1084 - adev->gfx.me_fw = NULL; 1085 - release_firmware(adev->gfx.ce_fw); 1086 - adev->gfx.ce_fw = NULL; 1087 - release_firmware(adev->gfx.rlc_fw); 1088 - adev->gfx.rlc_fw = NULL; 1089 - release_firmware(adev->gfx.mec_fw); 1090 - adev->gfx.mec_fw = NULL; 1091 - release_firmware(adev->gfx.mec2_fw); 1092 - adev->gfx.mec2_fw = NULL; 1081 + amdgpu_ucode_release(&adev->gfx.pfp_fw); 1082 + amdgpu_ucode_release(&adev->gfx.me_fw); 1083 + amdgpu_ucode_release(&adev->gfx.ce_fw); 1084 + amdgpu_ucode_release(&adev->gfx.rlc_fw); 1085 + amdgpu_ucode_release(&adev->gfx.mec_fw); 1086 + amdgpu_ucode_release(&adev->gfx.mec2_fw); 1093 1087 1094 1088 kfree(adev->gfx.rlc.register_list_format); 1095 1089 } ··· 1245 1251 } 1246 1252 1247 1253 static int gfx_v9_0_init_cp_gfx_microcode(struct amdgpu_device *adev, 1248 - const char *chip_name) 1254 + char *chip_name) 1249 1255 { 1250 1256 char fw_name[30]; 1251 1257 int err; 1252 1258 1253 1259 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name); 1254 - err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev); 1255 - if (err) 1256 - goto out; 1257 - err = amdgpu_ucode_validate(adev->gfx.pfp_fw); 1260 + err = amdgpu_ucode_request(adev, &adev->gfx.pfp_fw, fw_name); 1258 1261 if (err) 1259 1262 goto out; 1260 1263 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_PFP); 1261 1264 1262 1265 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name); 1263 - err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); 1264 - if (err) 1265 - goto out; 1266 - err = amdgpu_ucode_validate(adev->gfx.me_fw); 1266 + err = amdgpu_ucode_request(adev, &adev->gfx.me_fw, fw_name); 1267 1267 if (err) 1268 1268 goto out; 1269 1269 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_ME); 1270 1270 1271 1271 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name); 1272 - err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); 1273 - if (err) 1274 - goto out; 1275 - err = amdgpu_ucode_validate(adev->gfx.ce_fw); 1272 + err = amdgpu_ucode_request(adev, &adev->gfx.ce_fw, fw_name); 1276 1273 if (err) 1277 1274 goto out; 1278 1275 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_CE); 1279 1276 1280 1277 out: 1281 1278 if (err) { 1282 - dev_err(adev->dev, 1283 - "gfx9: Failed to init firmware \"%s\"\n", 1284 - fw_name); 1285 - release_firmware(adev->gfx.pfp_fw); 1286 - adev->gfx.pfp_fw = NULL; 1287 - release_firmware(adev->gfx.me_fw); 1288 - adev->gfx.me_fw = NULL; 1289 - release_firmware(adev->gfx.ce_fw); 1290 - adev->gfx.ce_fw = NULL; 1279 + amdgpu_ucode_release(&adev->gfx.pfp_fw); 1280 + amdgpu_ucode_release(&adev->gfx.me_fw); 1281 + amdgpu_ucode_release(&adev->gfx.ce_fw); 1291 1282 } 1292 1283 return err; 1293 1284 } 1294 1285 1295 1286 static int gfx_v9_0_init_rlc_microcode(struct amdgpu_device *adev, 1296 - const char *chip_name) 1287 + char *chip_name) 1297 1288 { 1298 1289 char fw_name[30]; 1299 1290 int err; ··· 1307 1328 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_kicker_rlc.bin", chip_name); 1308 1329 else 1309 1330 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); 1310 - err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); 1311 - if (err) 1312 - goto out; 1313 - err = amdgpu_ucode_validate(adev->gfx.rlc_fw); 1331 + err = amdgpu_ucode_request(adev, &adev->gfx.rlc_fw, fw_name); 1314 1332 if (err) 1315 1333 goto out; 1316 1334 rlc_hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data; ··· 1316 1340 version_minor = le16_to_cpu(rlc_hdr->header.header_version_minor); 1317 1341 err = amdgpu_gfx_rlc_init_microcode(adev, version_major, version_minor); 1318 1342 out: 1319 - if (err) { 1320 - dev_err(adev->dev, 1321 - "gfx9: Failed to init firmware \"%s\"\n", 1322 - fw_name); 1323 - release_firmware(adev->gfx.rlc_fw); 1324 - adev->gfx.rlc_fw = NULL; 1325 - } 1343 + if (err) 1344 + amdgpu_ucode_release(&adev->gfx.rlc_fw); 1345 + 1326 1346 return err; 1327 1347 } 1328 1348 ··· 1333 1361 } 1334 1362 1335 1363 static int gfx_v9_0_init_cp_compute_microcode(struct amdgpu_device *adev, 1336 - const char *chip_name) 1364 + char *chip_name) 1337 1365 { 1338 1366 char fw_name[30]; 1339 1367 int err; ··· 1343 1371 else 1344 1372 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name); 1345 1373 1346 - err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev); 1374 + err = amdgpu_ucode_request(adev, &adev->gfx.mec_fw, fw_name); 1347 1375 if (err) 1348 - goto out; 1349 - err = amdgpu_ucode_validate(adev->gfx.mec_fw); 1350 - if (err) 1351 - goto out; 1376 + return err; 1352 1377 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC1); 1353 1378 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC1_JT); 1354 1379 ··· 1355 1386 else 1356 1387 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name); 1357 1388 1358 - err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev); 1389 + err = amdgpu_ucode_request(adev, &adev->gfx.mec2_fw, fw_name); 1359 1390 if (!err) { 1360 - err = amdgpu_ucode_validate(adev->gfx.mec2_fw); 1361 - if (err) 1362 - goto out; 1363 1391 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC2); 1364 1392 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC2_JT); 1365 1393 } else { ··· 1368 1402 adev->gfx.mec2_feature_version = adev->gfx.mec_feature_version; 1369 1403 } 1370 1404 1371 - out: 1372 1405 gfx_v9_0_check_if_need_gfxoff(adev); 1373 1406 gfx_v9_0_check_fw_write_wait(adev); 1374 1407 if (err) { 1375 - dev_err(adev->dev, 1376 - "gfx9: Failed to init firmware \"%s\"\n", 1377 - fw_name); 1378 - release_firmware(adev->gfx.mec_fw); 1379 - adev->gfx.mec_fw = NULL; 1380 - release_firmware(adev->gfx.mec2_fw); 1381 - adev->gfx.mec2_fw = NULL; 1408 + amdgpu_ucode_release(&adev->gfx.mec_fw); 1409 + amdgpu_ucode_release(&adev->gfx.mec2_fw); 1382 1410 } 1383 1411 return err; 1384 1412 } 1385 1413 1386 1414 static int gfx_v9_0_init_microcode(struct amdgpu_device *adev) 1387 1415 { 1388 - const char *chip_name; 1416 + char ucode_prefix[30]; 1389 1417 int r; 1390 1418 1391 1419 DRM_DEBUG("\n"); 1392 - 1393 - switch (adev->ip_versions[GC_HWIP][0]) { 1394 - case IP_VERSION(9, 0, 1): 1395 - chip_name = "vega10"; 1396 - break; 1397 - case IP_VERSION(9, 2, 1): 1398 - chip_name = "vega12"; 1399 - break; 1400 - case IP_VERSION(9, 4, 0): 1401 - chip_name = "vega20"; 1402 - break; 1403 - case IP_VERSION(9, 2, 2): 1404 - case IP_VERSION(9, 1, 0): 1405 - if (adev->apu_flags & AMD_APU_IS_RAVEN2) 1406 - chip_name = "raven2"; 1407 - else if (adev->apu_flags & AMD_APU_IS_PICASSO) 1408 - chip_name = "picasso"; 1409 - else 1410 - chip_name = "raven"; 1411 - break; 1412 - case IP_VERSION(9, 4, 1): 1413 - chip_name = "arcturus"; 1414 - break; 1415 - case IP_VERSION(9, 3, 0): 1416 - if (adev->apu_flags & AMD_APU_IS_RENOIR) 1417 - chip_name = "renoir"; 1418 - else 1419 - chip_name = "green_sardine"; 1420 - break; 1421 - case IP_VERSION(9, 4, 2): 1422 - chip_name = "aldebaran"; 1423 - break; 1424 - default: 1425 - BUG(); 1426 - } 1420 + amdgpu_ucode_ip_version_decode(adev, GC_HWIP, ucode_prefix, sizeof(ucode_prefix)); 1427 1421 1428 1422 /* No CPG in Arcturus */ 1429 1423 if (adev->gfx.num_gfx_rings) { 1430 - r = gfx_v9_0_init_cp_gfx_microcode(adev, chip_name); 1424 + r = gfx_v9_0_init_cp_gfx_microcode(adev, ucode_prefix); 1431 1425 if (r) 1432 1426 return r; 1433 1427 } 1434 1428 1435 - r = gfx_v9_0_init_rlc_microcode(adev, chip_name); 1429 + r = gfx_v9_0_init_rlc_microcode(adev, ucode_prefix); 1436 1430 if (r) 1437 1431 return r; 1438 1432 1439 - r = gfx_v9_0_init_cp_compute_microcode(adev, chip_name); 1433 + r = gfx_v9_0_init_cp_compute_microcode(adev, ucode_prefix); 1440 1434 if (r) 1441 1435 return r; 1442 1436 ··· 2084 2158 return r; 2085 2159 2086 2160 adev->gfx.gfx_current_status = AMDGPU_GFX_NORMAL_MODE; 2087 - 2088 - r = gfx_v9_0_init_microcode(adev); 2089 - if (r) { 2090 - DRM_ERROR("Failed to load gfx firmware!\n"); 2091 - return r; 2092 - } 2093 2161 2094 2162 if (adev->gfx.rlc.funcs) { 2095 2163 if (adev->gfx.rlc.funcs->init) { ··· 4526 4606 /* init rlcg reg access ctrl */ 4527 4607 gfx_v9_0_init_rlcg_reg_access_ctrl(adev); 4528 4608 4529 - return 0; 4609 + return gfx_v9_0_init_microcode(adev); 4530 4610 } 4531 4611 4532 4612 static int gfx_v9_0_ecc_late_init(void *handle)
+3 -11
drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
··· 131 131 snprintf(fw_name, sizeof(fw_name), "amdgpu/si58_mc.bin"); 132 132 else 133 133 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", chip_name); 134 - err = request_firmware(&adev->gmc.fw, fw_name, adev->dev); 135 - if (err) 136 - goto out; 137 - 138 - err = amdgpu_ucode_validate(adev->gmc.fw); 139 - 140 - out: 134 + err = amdgpu_ucode_request(adev, &adev->gmc.fw, fw_name); 141 135 if (err) { 142 136 dev_err(adev->dev, 143 137 "si_mc: Failed to load firmware \"%s\"\n", 144 138 fw_name); 145 - release_firmware(adev->gmc.fw); 146 - adev->gmc.fw = NULL; 139 + amdgpu_ucode_release(&adev->gmc.fw); 147 140 } 148 141 return err; 149 142 } ··· 887 894 amdgpu_vm_manager_fini(adev); 888 895 amdgpu_gart_table_vram_free(adev); 889 896 amdgpu_bo_fini(adev); 890 - release_firmware(adev->gmc.fw); 891 - adev->gmc.fw = NULL; 897 + amdgpu_ucode_release(&adev->gmc.fw); 892 898 893 899 return 0; 894 900 }
+3 -10
drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
··· 156 156 157 157 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", chip_name); 158 158 159 - err = request_firmware(&adev->gmc.fw, fw_name, adev->dev); 160 - if (err) 161 - goto out; 162 - err = amdgpu_ucode_validate(adev->gmc.fw); 163 - 164 - out: 159 + err = amdgpu_ucode_request(adev, &adev->gmc.fw, fw_name); 165 160 if (err) { 166 161 pr_err("cik_mc: Failed to load firmware \"%s\"\n", fw_name); 167 - release_firmware(adev->gmc.fw); 168 - adev->gmc.fw = NULL; 162 + amdgpu_ucode_release(&adev->gmc.fw); 169 163 } 170 164 return err; 171 165 } ··· 1072 1078 kfree(adev->gmc.vm_fault_info); 1073 1079 amdgpu_gart_table_vram_free(adev); 1074 1080 amdgpu_bo_fini(adev); 1075 - release_firmware(adev->gmc.fw); 1076 - adev->gmc.fw = NULL; 1081 + amdgpu_ucode_release(&adev->gmc.fw); 1077 1082 1078 1083 return 0; 1079 1084 }
+3 -10
drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
··· 264 264 } 265 265 266 266 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", chip_name); 267 - err = request_firmware(&adev->gmc.fw, fw_name, adev->dev); 268 - if (err) 269 - goto out; 270 - err = amdgpu_ucode_validate(adev->gmc.fw); 271 - 272 - out: 267 + err = amdgpu_ucode_request(adev, &adev->gmc.fw, fw_name); 273 268 if (err) { 274 269 pr_err("mc: Failed to load firmware \"%s\"\n", fw_name); 275 - release_firmware(adev->gmc.fw); 276 - adev->gmc.fw = NULL; 270 + amdgpu_ucode_release(&adev->gmc.fw); 277 271 } 278 272 return err; 279 273 } ··· 1194 1200 kfree(adev->gmc.vm_fault_info); 1195 1201 amdgpu_gart_table_vram_free(adev); 1196 1202 amdgpu_bo_fini(adev); 1197 - release_firmware(adev->gmc.fw); 1198 - adev->gmc.fw = NULL; 1203 + amdgpu_ucode_release(&adev->gmc.fw); 1199 1204 1200 1205 return 0; 1201 1206 }
+2 -5
drivers/gpu/drm/amd/amdgpu/imu_v11_0.c
··· 49 49 amdgpu_ucode_ip_version_decode(adev, GC_HWIP, ucode_prefix, sizeof(ucode_prefix)); 50 50 51 51 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_imu.bin", ucode_prefix); 52 - err = request_firmware(&adev->gfx.imu_fw, fw_name, adev->dev); 53 - if (err) 54 - goto out; 55 - err = amdgpu_ucode_validate(adev->gfx.imu_fw); 52 + err = amdgpu_ucode_request(adev, &adev->gfx.imu_fw, fw_name); 56 53 if (err) 57 54 goto out; 58 55 imu_hdr = (const struct imu_firmware_header_v1_0 *)adev->gfx.imu_fw->data; ··· 74 77 dev_err(adev->dev, 75 78 "gfx11: Failed to load firmware \"%s\"\n", 76 79 fw_name); 77 - release_firmware(adev->gfx.imu_fw); 80 + amdgpu_ucode_release(&adev->gfx.imu_fw); 78 81 } 79 82 80 83 return err;
+18 -90
drivers/gpu/drm/amd/amdgpu/mes_v10_1.c
··· 379 379 .resume_gang = mes_v10_1_resume_gang, 380 380 }; 381 381 382 - static int mes_v10_1_init_microcode(struct amdgpu_device *adev, 383 - enum admgpu_mes_pipe pipe) 384 - { 385 - const char *chip_name; 386 - char fw_name[30]; 387 - int err; 388 - const struct mes_firmware_header_v1_0 *mes_hdr; 389 - struct amdgpu_firmware_info *info; 390 - 391 - switch (adev->ip_versions[GC_HWIP][0]) { 392 - case IP_VERSION(10, 1, 10): 393 - chip_name = "navi10"; 394 - break; 395 - case IP_VERSION(10, 3, 0): 396 - chip_name = "sienna_cichlid"; 397 - break; 398 - default: 399 - BUG(); 400 - } 401 - 402 - if (pipe == AMDGPU_MES_SCHED_PIPE) 403 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mes.bin", 404 - chip_name); 405 - else 406 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mes1.bin", 407 - chip_name); 408 - 409 - err = request_firmware(&adev->mes.fw[pipe], fw_name, adev->dev); 410 - if (err) 411 - return err; 412 - 413 - err = amdgpu_ucode_validate(adev->mes.fw[pipe]); 414 - if (err) { 415 - release_firmware(adev->mes.fw[pipe]); 416 - adev->mes.fw[pipe] = NULL; 417 - return err; 418 - } 419 - 420 - mes_hdr = (const struct mes_firmware_header_v1_0 *) 421 - adev->mes.fw[pipe]->data; 422 - adev->mes.uc_start_addr[pipe] = 423 - le32_to_cpu(mes_hdr->mes_uc_start_addr_lo) | 424 - ((uint64_t)(le32_to_cpu(mes_hdr->mes_uc_start_addr_hi)) << 32); 425 - adev->mes.data_start_addr[pipe] = 426 - le32_to_cpu(mes_hdr->mes_data_start_addr_lo) | 427 - ((uint64_t)(le32_to_cpu(mes_hdr->mes_data_start_addr_hi)) << 32); 428 - 429 - if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { 430 - int ucode, ucode_data; 431 - 432 - if (pipe == AMDGPU_MES_SCHED_PIPE) { 433 - ucode = AMDGPU_UCODE_ID_CP_MES; 434 - ucode_data = AMDGPU_UCODE_ID_CP_MES_DATA; 435 - } else { 436 - ucode = AMDGPU_UCODE_ID_CP_MES1; 437 - ucode_data = AMDGPU_UCODE_ID_CP_MES1_DATA; 438 - } 439 - 440 - info = &adev->firmware.ucode[ucode]; 441 - info->ucode_id = ucode; 442 - info->fw = adev->mes.fw[pipe]; 443 - adev->firmware.fw_size += 444 - ALIGN(le32_to_cpu(mes_hdr->mes_ucode_size_bytes), 445 - PAGE_SIZE); 446 - 447 - info = &adev->firmware.ucode[ucode_data]; 448 - info->ucode_id = ucode_data; 449 - info->fw = adev->mes.fw[pipe]; 450 - adev->firmware.fw_size += 451 - ALIGN(le32_to_cpu(mes_hdr->mes_ucode_data_size_bytes), 452 - PAGE_SIZE); 453 - } 454 - 455 - return 0; 456 - } 457 - 458 - static void mes_v10_1_free_microcode(struct amdgpu_device *adev, 459 - enum admgpu_mes_pipe pipe) 460 - { 461 - release_firmware(adev->mes.fw[pipe]); 462 - adev->mes.fw[pipe] = NULL; 463 - } 464 - 465 382 static int mes_v10_1_allocate_ucode_buffer(struct amdgpu_device *adev, 466 383 enum admgpu_mes_pipe pipe) 467 384 { ··· 924 1007 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 925 1008 int pipe, r; 926 1009 927 - adev->mes.adev = adev; 928 1010 adev->mes.funcs = &mes_v10_1_funcs; 929 1011 adev->mes.kiq_hw_init = &mes_v10_1_kiq_hw_init; 930 1012 ··· 934 1018 for (pipe = 0; pipe < AMDGPU_MAX_MES_PIPES; pipe++) { 935 1019 if (!adev->enable_mes_kiq && pipe == AMDGPU_MES_KIQ_PIPE) 936 1020 continue; 937 - 938 - r = mes_v10_1_init_microcode(adev, pipe); 939 - if (r) 940 - return r; 941 1021 942 1022 r = mes_v10_1_allocate_eop_buf(adev, pipe); 943 1023 if (r) ··· 971 1059 amdgpu_bo_free_kernel(&adev->mes.eop_gpu_obj[pipe], 972 1060 &adev->mes.eop_gpu_addr[pipe], 973 1061 NULL); 974 - 975 - mes_v10_1_free_microcode(adev, pipe); 1062 + amdgpu_ucode_release(&adev->mes.fw[pipe]); 976 1063 } 977 1064 978 1065 amdgpu_bo_free_kernel(&adev->gfx.kiq.ring.mqd_obj, ··· 1140 1229 return amdgpu_mes_resume(adev); 1141 1230 } 1142 1231 1232 + static int mes_v10_0_early_init(void *handle) 1233 + { 1234 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1235 + int pipe, r; 1236 + 1237 + for (pipe = 0; pipe < AMDGPU_MAX_MES_PIPES; pipe++) { 1238 + if (!adev->enable_mes_kiq && pipe == AMDGPU_MES_KIQ_PIPE) 1239 + continue; 1240 + r = amdgpu_mes_init_microcode(adev, pipe); 1241 + if (r) 1242 + return r; 1243 + } 1244 + 1245 + return 0; 1246 + } 1247 + 1143 1248 static int mes_v10_0_late_init(void *handle) 1144 1249 { 1145 1250 struct amdgpu_device *adev = (struct amdgpu_device *)handle; ··· 1168 1241 1169 1242 static const struct amd_ip_funcs mes_v10_1_ip_funcs = { 1170 1243 .name = "mes_v10_1", 1244 + .early_init = mes_v10_0_early_init, 1171 1245 .late_init = mes_v10_0_late_init, 1172 1246 .sw_init = mes_v10_1_sw_init, 1173 1247 .sw_fini = mes_v10_1_sw_fini,
+18 -81
drivers/gpu/drm/amd/amdgpu/mes_v11_0.c
··· 459 459 .misc_op = mes_v11_0_misc_op, 460 460 }; 461 461 462 - static int mes_v11_0_init_microcode(struct amdgpu_device *adev, 463 - enum admgpu_mes_pipe pipe) 464 - { 465 - char fw_name[30]; 466 - char ucode_prefix[30]; 467 - int err; 468 - const struct mes_firmware_header_v1_0 *mes_hdr; 469 - struct amdgpu_firmware_info *info; 470 - 471 - amdgpu_ucode_ip_version_decode(adev, GC_HWIP, ucode_prefix, sizeof(ucode_prefix)); 472 - 473 - if (pipe == AMDGPU_MES_SCHED_PIPE) 474 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mes.bin", 475 - ucode_prefix); 476 - else 477 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mes1.bin", 478 - ucode_prefix); 479 - 480 - err = request_firmware(&adev->mes.fw[pipe], fw_name, adev->dev); 481 - if (err) 482 - return err; 483 - 484 - err = amdgpu_ucode_validate(adev->mes.fw[pipe]); 485 - if (err) { 486 - release_firmware(adev->mes.fw[pipe]); 487 - adev->mes.fw[pipe] = NULL; 488 - return err; 489 - } 490 - 491 - mes_hdr = (const struct mes_firmware_header_v1_0 *) 492 - adev->mes.fw[pipe]->data; 493 - adev->mes.uc_start_addr[pipe] = 494 - le32_to_cpu(mes_hdr->mes_uc_start_addr_lo) | 495 - ((uint64_t)(le32_to_cpu(mes_hdr->mes_uc_start_addr_hi)) << 32); 496 - adev->mes.data_start_addr[pipe] = 497 - le32_to_cpu(mes_hdr->mes_data_start_addr_lo) | 498 - ((uint64_t)(le32_to_cpu(mes_hdr->mes_data_start_addr_hi)) << 32); 499 - 500 - if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { 501 - int ucode, ucode_data; 502 - 503 - if (pipe == AMDGPU_MES_SCHED_PIPE) { 504 - ucode = AMDGPU_UCODE_ID_CP_MES; 505 - ucode_data = AMDGPU_UCODE_ID_CP_MES_DATA; 506 - } else { 507 - ucode = AMDGPU_UCODE_ID_CP_MES1; 508 - ucode_data = AMDGPU_UCODE_ID_CP_MES1_DATA; 509 - } 510 - 511 - info = &adev->firmware.ucode[ucode]; 512 - info->ucode_id = ucode; 513 - info->fw = adev->mes.fw[pipe]; 514 - adev->firmware.fw_size += 515 - ALIGN(le32_to_cpu(mes_hdr->mes_ucode_size_bytes), 516 - PAGE_SIZE); 517 - 518 - info = &adev->firmware.ucode[ucode_data]; 519 - info->ucode_id = ucode_data; 520 - info->fw = adev->mes.fw[pipe]; 521 - adev->firmware.fw_size += 522 - ALIGN(le32_to_cpu(mes_hdr->mes_ucode_data_size_bytes), 523 - PAGE_SIZE); 524 - } 525 - 526 - return 0; 527 - } 528 - 529 - static void mes_v11_0_free_microcode(struct amdgpu_device *adev, 530 - enum admgpu_mes_pipe pipe) 531 - { 532 - release_firmware(adev->mes.fw[pipe]); 533 - adev->mes.fw[pipe] = NULL; 534 - } 535 - 536 462 static int mes_v11_0_allocate_ucode_buffer(struct amdgpu_device *adev, 537 463 enum admgpu_mes_pipe pipe) 538 464 { ··· 1017 1091 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1018 1092 int pipe, r; 1019 1093 1020 - adev->mes.adev = adev; 1021 1094 adev->mes.funcs = &mes_v11_0_funcs; 1022 1095 adev->mes.kiq_hw_init = &mes_v11_0_kiq_hw_init; 1023 1096 adev->mes.kiq_hw_fini = &mes_v11_0_kiq_hw_fini; ··· 1028 1103 for (pipe = 0; pipe < AMDGPU_MAX_MES_PIPES; pipe++) { 1029 1104 if (!adev->enable_mes_kiq && pipe == AMDGPU_MES_KIQ_PIPE) 1030 1105 continue; 1031 - 1032 - r = mes_v11_0_init_microcode(adev, pipe); 1033 - if (r) 1034 - return r; 1035 1106 1036 1107 r = mes_v11_0_allocate_eop_buf(adev, pipe); 1037 1108 if (r) ··· 1065 1144 amdgpu_bo_free_kernel(&adev->mes.eop_gpu_obj[pipe], 1066 1145 &adev->mes.eop_gpu_addr[pipe], 1067 1146 NULL); 1068 - 1069 - mes_v11_0_free_microcode(adev, pipe); 1147 + amdgpu_ucode_release(&adev->mes.fw[pipe]); 1070 1148 } 1071 1149 1072 1150 amdgpu_bo_free_kernel(&adev->gfx.kiq.ring.mqd_obj, ··· 1262 1342 return amdgpu_mes_resume(adev); 1263 1343 } 1264 1344 1345 + static int mes_v11_0_early_init(void *handle) 1346 + { 1347 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1348 + int pipe, r; 1349 + 1350 + for (pipe = 0; pipe < AMDGPU_MAX_MES_PIPES; pipe++) { 1351 + if (!adev->enable_mes_kiq && pipe == AMDGPU_MES_KIQ_PIPE) 1352 + continue; 1353 + r = amdgpu_mes_init_microcode(adev, pipe); 1354 + if (r) 1355 + return r; 1356 + } 1357 + 1358 + return 0; 1359 + } 1360 + 1265 1361 static int mes_v11_0_late_init(void *handle) 1266 1362 { 1267 1363 struct amdgpu_device *adev = (struct amdgpu_device *)handle; ··· 1292 1356 1293 1357 static const struct amd_ip_funcs mes_v11_0_ip_funcs = { 1294 1358 .name = "mes_v11_0", 1359 + .early_init = mes_v11_0_early_init, 1295 1360 .late_init = mes_v11_0_late_init, 1296 1361 .sw_init = mes_v11_0_sw_init, 1297 1362 .sw_fini = mes_v11_0_sw_fini,
+5 -71
drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
··· 47 47 static int psp_v10_0_init_microcode(struct psp_context *psp) 48 48 { 49 49 struct amdgpu_device *adev = psp->adev; 50 - const char *chip_name; 51 - char fw_name[30]; 50 + char ucode_prefix[30]; 52 51 int err = 0; 53 - const struct ta_firmware_header_v1_0 *ta_hdr; 54 52 DRM_DEBUG("\n"); 55 53 56 - switch (adev->asic_type) { 57 - case CHIP_RAVEN: 58 - if (adev->apu_flags & AMD_APU_IS_RAVEN2) 59 - chip_name = "raven2"; 60 - else if (adev->apu_flags & AMD_APU_IS_PICASSO) 61 - chip_name = "picasso"; 62 - else 63 - chip_name = "raven"; 64 - break; 65 - default: BUG(); 66 - } 54 + amdgpu_ucode_ip_version_decode(adev, MP0_HWIP, ucode_prefix, sizeof(ucode_prefix)); 67 55 68 - err = psp_init_asd_microcode(psp, chip_name); 56 + err = psp_init_asd_microcode(psp, ucode_prefix); 69 57 if (err) 70 - goto out; 58 + return err; 71 59 72 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name); 73 - err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); 74 - if (err) { 75 - release_firmware(adev->psp.ta_fw); 76 - adev->psp.ta_fw = NULL; 77 - dev_info(adev->dev, 78 - "psp v10.0: Failed to load firmware \"%s\"\n", 79 - fw_name); 80 - } else { 81 - err = amdgpu_ucode_validate(adev->psp.ta_fw); 82 - if (err) 83 - goto out2; 84 - 85 - ta_hdr = (const struct ta_firmware_header_v1_0 *) 86 - adev->psp.ta_fw->data; 87 - adev->psp.hdcp_context.context.bin_desc.fw_version = 88 - le32_to_cpu(ta_hdr->hdcp.fw_version); 89 - adev->psp.hdcp_context.context.bin_desc.size_bytes = 90 - le32_to_cpu(ta_hdr->hdcp.size_bytes); 91 - adev->psp.hdcp_context.context.bin_desc.start_addr = 92 - (uint8_t *)ta_hdr + 93 - le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes); 94 - 95 - adev->psp.dtm_context.context.bin_desc.fw_version = 96 - le32_to_cpu(ta_hdr->dtm.fw_version); 97 - adev->psp.dtm_context.context.bin_desc.size_bytes = 98 - le32_to_cpu(ta_hdr->dtm.size_bytes); 99 - adev->psp.dtm_context.context.bin_desc.start_addr = 100 - (uint8_t *)adev->psp.hdcp_context.context.bin_desc.start_addr + 101 - le32_to_cpu(ta_hdr->dtm.offset_bytes); 102 - 103 - adev->psp.securedisplay_context.context.bin_desc.fw_version = 104 - le32_to_cpu(ta_hdr->securedisplay.fw_version); 105 - adev->psp.securedisplay_context.context.bin_desc.size_bytes = 106 - le32_to_cpu(ta_hdr->securedisplay.size_bytes); 107 - adev->psp.securedisplay_context.context.bin_desc.start_addr = 108 - (uint8_t *)adev->psp.hdcp_context.context.bin_desc.start_addr + 109 - le32_to_cpu(ta_hdr->securedisplay.offset_bytes); 110 - 111 - adev->psp.ta_fw_version = le32_to_cpu(ta_hdr->header.ucode_version); 112 - } 113 - 114 - return 0; 115 - 116 - out2: 117 - release_firmware(adev->psp.ta_fw); 118 - adev->psp.ta_fw = NULL; 119 - out: 120 - if (err) { 121 - dev_err(adev->dev, 122 - "psp v10.0: Failed to load firmware \"%s\"\n", 123 - fw_name); 124 - } 125 - 126 - return err; 60 + return psp_init_ta_microcode(psp, ucode_prefix); 127 61 } 128 62 129 63 static int psp_v10_0_ring_create(struct psp_context *psp,
+14 -117
drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
··· 88 88 static int psp_v11_0_init_microcode(struct psp_context *psp) 89 89 { 90 90 struct amdgpu_device *adev = psp->adev; 91 - const char *chip_name; 92 - char fw_name[PSP_FW_NAME_LEN]; 91 + char ucode_prefix[30]; 93 92 int err = 0; 94 - const struct ta_firmware_header_v1_0 *ta_hdr; 95 93 96 94 DRM_DEBUG("\n"); 97 95 98 - switch (adev->ip_versions[MP0_HWIP][0]) { 99 - case IP_VERSION(11, 0, 2): 100 - chip_name = "vega20"; 101 - break; 102 - case IP_VERSION(11, 0, 0): 103 - chip_name = "navi10"; 104 - break; 105 - case IP_VERSION(11, 0, 5): 106 - chip_name = "navi14"; 107 - break; 108 - case IP_VERSION(11, 0, 9): 109 - chip_name = "navi12"; 110 - break; 111 - case IP_VERSION(11, 0, 4): 112 - chip_name = "arcturus"; 113 - break; 114 - case IP_VERSION(11, 0, 7): 115 - chip_name = "sienna_cichlid"; 116 - break; 117 - case IP_VERSION(11, 0, 11): 118 - chip_name = "navy_flounder"; 119 - break; 120 - case IP_VERSION(11, 5, 0): 121 - chip_name = "vangogh"; 122 - break; 123 - case IP_VERSION(11, 0, 12): 124 - chip_name = "dimgrey_cavefish"; 125 - break; 126 - case IP_VERSION(11, 0, 13): 127 - chip_name = "beige_goby"; 128 - break; 129 - default: 130 - BUG(); 131 - } 132 - 96 + amdgpu_ucode_ip_version_decode(adev, MP0_HWIP, ucode_prefix, sizeof(ucode_prefix)); 133 97 134 98 switch (adev->ip_versions[MP0_HWIP][0]) { 135 99 case IP_VERSION(11, 0, 2): 136 100 case IP_VERSION(11, 0, 4): 137 - err = psp_init_sos_microcode(psp, chip_name); 101 + err = psp_init_sos_microcode(psp, ucode_prefix); 138 102 if (err) 139 103 return err; 140 - err = psp_init_asd_microcode(psp, chip_name); 104 + err = psp_init_asd_microcode(psp, ucode_prefix); 141 105 if (err) 142 106 return err; 143 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name); 144 - err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); 145 - if (err) { 146 - release_firmware(adev->psp.ta_fw); 147 - adev->psp.ta_fw = NULL; 148 - dev_info(adev->dev, 149 - "psp v11.0: Failed to load firmware \"%s\"\n", fw_name); 150 - } else { 151 - err = amdgpu_ucode_validate(adev->psp.ta_fw); 152 - if (err) 153 - goto out2; 154 - 155 - ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data; 156 - adev->psp.xgmi_context.context.bin_desc.fw_version = 157 - le32_to_cpu(ta_hdr->xgmi.fw_version); 158 - adev->psp.xgmi_context.context.bin_desc.size_bytes = 159 - le32_to_cpu(ta_hdr->xgmi.size_bytes); 160 - adev->psp.xgmi_context.context.bin_desc.start_addr = 161 - (uint8_t *)ta_hdr + 162 - le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes); 163 - adev->psp.ta_fw_version = le32_to_cpu(ta_hdr->header.ucode_version); 164 - adev->psp.ras_context.context.bin_desc.fw_version = 165 - le32_to_cpu(ta_hdr->ras.fw_version); 166 - adev->psp.ras_context.context.bin_desc.size_bytes = 167 - le32_to_cpu(ta_hdr->ras.size_bytes); 168 - adev->psp.ras_context.context.bin_desc.start_addr = 169 - (uint8_t *)adev->psp.xgmi_context.context.bin_desc.start_addr + 170 - le32_to_cpu(ta_hdr->ras.offset_bytes); 171 - } 107 + err = psp_init_ta_microcode(psp, ucode_prefix); 108 + adev->psp.securedisplay_context.context.bin_desc.size_bytes = 0; 172 109 break; 173 110 case IP_VERSION(11, 0, 0): 174 111 case IP_VERSION(11, 0, 5): 175 112 case IP_VERSION(11, 0, 9): 176 - err = psp_init_sos_microcode(psp, chip_name); 113 + err = psp_init_sos_microcode(psp, ucode_prefix); 177 114 if (err) 178 115 return err; 179 - err = psp_init_asd_microcode(psp, chip_name); 116 + err = psp_init_asd_microcode(psp, ucode_prefix); 180 117 if (err) 181 118 return err; 182 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name); 183 - err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); 184 - if (err) { 185 - release_firmware(adev->psp.ta_fw); 186 - adev->psp.ta_fw = NULL; 187 - dev_info(adev->dev, 188 - "psp v11.0: Failed to load firmware \"%s\"\n", fw_name); 189 - } else { 190 - err = amdgpu_ucode_validate(adev->psp.ta_fw); 191 - if (err) 192 - goto out2; 193 - 194 - ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data; 195 - adev->psp.hdcp_context.context.bin_desc.fw_version = 196 - le32_to_cpu(ta_hdr->hdcp.fw_version); 197 - adev->psp.hdcp_context.context.bin_desc.size_bytes = 198 - le32_to_cpu(ta_hdr->hdcp.size_bytes); 199 - adev->psp.hdcp_context.context.bin_desc.start_addr = 200 - (uint8_t *)ta_hdr + 201 - le32_to_cpu( 202 - ta_hdr->header.ucode_array_offset_bytes); 203 - 204 - adev->psp.ta_fw_version = le32_to_cpu(ta_hdr->header.ucode_version); 205 - 206 - adev->psp.dtm_context.context.bin_desc.fw_version = 207 - le32_to_cpu(ta_hdr->dtm.fw_version); 208 - adev->psp.dtm_context.context.bin_desc.size_bytes = 209 - le32_to_cpu(ta_hdr->dtm.size_bytes); 210 - adev->psp.dtm_context.context.bin_desc.start_addr = 211 - (uint8_t *)adev->psp.hdcp_context.context 212 - .bin_desc.start_addr + 213 - le32_to_cpu(ta_hdr->dtm.offset_bytes); 214 - } 119 + err = psp_init_ta_microcode(psp, ucode_prefix); 120 + adev->psp.securedisplay_context.context.bin_desc.size_bytes = 0; 215 121 break; 216 122 case IP_VERSION(11, 0, 7): 217 123 case IP_VERSION(11, 0, 11): 218 124 case IP_VERSION(11, 0, 12): 219 125 case IP_VERSION(11, 0, 13): 220 - err = psp_init_sos_microcode(psp, chip_name); 126 + err = psp_init_sos_microcode(psp, ucode_prefix); 221 127 if (err) 222 128 return err; 223 - err = psp_init_ta_microcode(psp, chip_name); 224 - if (err) 225 - return err; 129 + err = psp_init_ta_microcode(psp, ucode_prefix); 226 130 break; 227 131 case IP_VERSION(11, 5, 0): 228 - err = psp_init_asd_microcode(psp, chip_name); 132 + err = psp_init_asd_microcode(psp, ucode_prefix); 229 133 if (err) 230 134 return err; 231 - err = psp_init_toc_microcode(psp, chip_name); 232 - if (err) 233 - return err; 135 + err = psp_init_toc_microcode(psp, ucode_prefix); 234 136 break; 235 137 default: 236 138 BUG(); 237 139 } 238 140 239 - return 0; 240 - 241 - out2: 242 - release_firmware(adev->psp.ta_fw); 243 - adev->psp.ta_fw = NULL; 244 141 return err; 245 142 } 246 143
+9 -67
drivers/gpu/drm/amd/amdgpu/psp_v12_0.c
··· 48 48 static int psp_v12_0_init_microcode(struct psp_context *psp) 49 49 { 50 50 struct amdgpu_device *adev = psp->adev; 51 - const char *chip_name; 52 - char fw_name[30]; 51 + char ucode_prefix[30]; 53 52 int err = 0; 54 - const struct ta_firmware_header_v1_0 *ta_hdr; 55 53 DRM_DEBUG("\n"); 56 54 57 - switch (adev->asic_type) { 58 - case CHIP_RENOIR: 59 - if (adev->apu_flags & AMD_APU_IS_RENOIR) 60 - chip_name = "renoir"; 61 - else 62 - chip_name = "green_sardine"; 63 - break; 64 - default: 65 - BUG(); 66 - } 55 + amdgpu_ucode_ip_version_decode(adev, MP0_HWIP, ucode_prefix, sizeof(ucode_prefix)); 67 56 68 - err = psp_init_asd_microcode(psp, chip_name); 57 + err = psp_init_asd_microcode(psp, ucode_prefix); 69 58 if (err) 70 59 return err; 71 60 72 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name); 73 - err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); 74 - if (err) { 75 - release_firmware(adev->psp.ta_fw); 76 - adev->psp.ta_fw = NULL; 77 - dev_info(adev->dev, 78 - "psp v12.0: Failed to load firmware \"%s\"\n", 79 - fw_name); 80 - } else { 81 - err = amdgpu_ucode_validate(adev->psp.ta_fw); 82 - if (err) 83 - goto out; 61 + err = psp_init_ta_microcode(psp, ucode_prefix); 62 + if (err) 63 + return err; 84 64 85 - ta_hdr = (const struct ta_firmware_header_v1_0 *) 86 - adev->psp.ta_fw->data; 87 - adev->psp.hdcp_context.context.bin_desc.fw_version = 88 - le32_to_cpu(ta_hdr->hdcp.fw_version); 89 - adev->psp.hdcp_context.context.bin_desc.size_bytes = 90 - le32_to_cpu(ta_hdr->hdcp.size_bytes); 91 - adev->psp.hdcp_context.context.bin_desc.start_addr = 92 - (uint8_t *)ta_hdr + 93 - le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes); 94 - 95 - adev->psp.ta_fw_version = le32_to_cpu(ta_hdr->header.ucode_version); 96 - 97 - adev->psp.dtm_context.context.bin_desc.fw_version = 98 - le32_to_cpu(ta_hdr->dtm.fw_version); 99 - adev->psp.dtm_context.context.bin_desc.size_bytes = 100 - le32_to_cpu(ta_hdr->dtm.size_bytes); 101 - adev->psp.dtm_context.context.bin_desc.start_addr = 102 - (uint8_t *)adev->psp.hdcp_context.context.bin_desc.start_addr + 103 - le32_to_cpu(ta_hdr->dtm.offset_bytes); 104 - 105 - if (adev->apu_flags & AMD_APU_IS_RENOIR) { 106 - adev->psp.securedisplay_context.context.bin_desc.fw_version = 107 - le32_to_cpu(ta_hdr->securedisplay.fw_version); 108 - adev->psp.securedisplay_context.context.bin_desc.size_bytes = 109 - le32_to_cpu(ta_hdr->securedisplay.size_bytes); 110 - adev->psp.securedisplay_context.context.bin_desc.start_addr = 111 - (uint8_t *)adev->psp.hdcp_context.context.bin_desc.start_addr + 112 - le32_to_cpu(ta_hdr->securedisplay.offset_bytes); 113 - } 114 - } 65 + /* only supported on renoir */ 66 + if (!(adev->apu_flags & AMD_APU_IS_RENOIR)) 67 + adev->psp.securedisplay_context.context.bin_desc.size_bytes = 0; 115 68 116 69 return 0; 117 - 118 - out: 119 - release_firmware(adev->psp.ta_fw); 120 - adev->psp.ta_fw = NULL; 121 - if (err) { 122 - dev_err(adev->dev, 123 - "psp v12.0: Failed to load firmware \"%s\"\n", 124 - fw_name); 125 - } 126 - 127 - return err; 128 70 } 129 71 130 72 static int psp_v12_0_bootloader_load_sysdrv(struct psp_context *psp)
+7 -20
drivers/gpu/drm/amd/amdgpu/psp_v13_0.c
··· 70 70 static int psp_v13_0_init_microcode(struct psp_context *psp) 71 71 { 72 72 struct amdgpu_device *adev = psp->adev; 73 - const char *chip_name; 74 73 char ucode_prefix[30]; 75 74 int err = 0; 76 75 77 - switch (adev->ip_versions[MP0_HWIP][0]) { 78 - case IP_VERSION(13, 0, 2): 79 - chip_name = "aldebaran"; 80 - break; 81 - case IP_VERSION(13, 0, 1): 82 - case IP_VERSION(13, 0, 3): 83 - chip_name = "yellow_carp"; 84 - break; 85 - default: 86 - amdgpu_ucode_ip_version_decode(adev, MP0_HWIP, ucode_prefix, sizeof(ucode_prefix)); 87 - chip_name = ucode_prefix; 88 - break; 89 - } 76 + amdgpu_ucode_ip_version_decode(adev, MP0_HWIP, ucode_prefix, sizeof(ucode_prefix)); 90 77 91 78 switch (adev->ip_versions[MP0_HWIP][0]) { 92 79 case IP_VERSION(13, 0, 2): 93 - err = psp_init_sos_microcode(psp, chip_name); 80 + err = psp_init_sos_microcode(psp, ucode_prefix); 94 81 if (err) 95 82 return err; 96 83 /* It's not necessary to load ras ta on Guest side */ 97 84 if (!amdgpu_sriov_vf(adev)) { 98 - err = psp_init_ta_microcode(&adev->psp, chip_name); 85 + err = psp_init_ta_microcode(psp, ucode_prefix); 99 86 if (err) 100 87 return err; 101 88 } ··· 92 105 case IP_VERSION(13, 0, 5): 93 106 case IP_VERSION(13, 0, 8): 94 107 case IP_VERSION(13, 0, 11): 95 - err = psp_init_toc_microcode(psp, chip_name); 108 + err = psp_init_toc_microcode(psp, ucode_prefix); 96 109 if (err) 97 110 return err; 98 - err = psp_init_ta_microcode(psp, chip_name); 111 + err = psp_init_ta_microcode(psp, ucode_prefix); 99 112 if (err) 100 113 return err; 101 114 break; 102 115 case IP_VERSION(13, 0, 0): 103 116 case IP_VERSION(13, 0, 7): 104 117 case IP_VERSION(13, 0, 10): 105 - err = psp_init_sos_microcode(psp, chip_name); 118 + err = psp_init_sos_microcode(psp, ucode_prefix); 106 119 if (err) 107 120 return err; 108 121 /* It's not necessary to load ras ta on Guest side */ 109 - err = psp_init_ta_microcode(psp, chip_name); 122 + err = psp_init_ta_microcode(psp, ucode_prefix); 110 123 if (err) 111 124 return err; 112 125 break;
+3 -11
drivers/gpu/drm/amd/amdgpu/psp_v13_0_4.c
··· 35 35 static int psp_v13_0_4_init_microcode(struct psp_context *psp) 36 36 { 37 37 struct amdgpu_device *adev = psp->adev; 38 - const char *chip_name; 39 38 char ucode_prefix[30]; 40 39 int err = 0; 41 40 42 - switch (adev->ip_versions[MP0_HWIP][0]) { 43 - case IP_VERSION(13, 0, 4): 44 - amdgpu_ucode_ip_version_decode(adev, MP0_HWIP, ucode_prefix, sizeof(ucode_prefix)); 45 - chip_name = ucode_prefix; 46 - break; 47 - default: 48 - BUG(); 49 - } 41 + amdgpu_ucode_ip_version_decode(adev, MP0_HWIP, ucode_prefix, sizeof(ucode_prefix)); 50 42 51 43 switch (adev->ip_versions[MP0_HWIP][0]) { 52 44 case IP_VERSION(13, 0, 4): 53 - err = psp_init_toc_microcode(psp, chip_name); 45 + err = psp_init_toc_microcode(psp, ucode_prefix); 54 46 if (err) 55 47 return err; 56 - err = psp_init_ta_microcode(psp, chip_name); 48 + err = psp_init_ta_microcode(psp, ucode_prefix); 57 49 if (err) 58 50 return err; 59 51 break;
+4 -12
drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
··· 57 57 static int psp_v3_1_init_microcode(struct psp_context *psp) 58 58 { 59 59 struct amdgpu_device *adev = psp->adev; 60 - const char *chip_name; 60 + char ucode_prefix[30]; 61 61 int err = 0; 62 62 63 63 DRM_DEBUG("\n"); 64 64 65 - switch (adev->asic_type) { 66 - case CHIP_VEGA10: 67 - chip_name = "vega10"; 68 - break; 69 - case CHIP_VEGA12: 70 - chip_name = "vega12"; 71 - break; 72 - default: BUG(); 73 - } 65 + amdgpu_ucode_ip_version_decode(adev, MP0_HWIP, ucode_prefix, sizeof(ucode_prefix)); 74 66 75 - err = psp_init_sos_microcode(psp, chip_name); 67 + err = psp_init_sos_microcode(psp, ucode_prefix); 76 68 if (err) 77 69 return err; 78 70 79 - err = psp_init_asd_microcode(psp, chip_name); 71 + err = psp_init_asd_microcode(psp, ucode_prefix); 80 72 if (err) 81 73 return err; 82 74
+6 -12
drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
··· 113 113 static void sdma_v2_4_free_microcode(struct amdgpu_device *adev) 114 114 { 115 115 int i; 116 - for (i = 0; i < adev->sdma.num_instances; i++) { 117 - release_firmware(adev->sdma.instance[i].fw); 118 - adev->sdma.instance[i].fw = NULL; 119 - } 116 + 117 + for (i = 0; i < adev->sdma.num_instances; i++) 118 + amdgpu_ucode_release(&adev->sdma.instance[i].fw); 120 119 } 121 120 122 121 /** ··· 150 151 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name); 151 152 else 152 153 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name); 153 - err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev); 154 - if (err) 155 - goto out; 156 - err = amdgpu_ucode_validate(adev->sdma.instance[i].fw); 154 + err = amdgpu_ucode_request(adev, &adev->sdma.instance[i].fw, fw_name); 157 155 if (err) 158 156 goto out; 159 157 hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma.instance[i].fw->data; ··· 172 176 out: 173 177 if (err) { 174 178 pr_err("sdma_v2_4: Failed to load firmware \"%s\"\n", fw_name); 175 - for (i = 0; i < adev->sdma.num_instances; i++) { 176 - release_firmware(adev->sdma.instance[i].fw); 177 - adev->sdma.instance[i].fw = NULL; 178 - } 179 + for (i = 0; i < adev->sdma.num_instances; i++) 180 + amdgpu_ucode_release(&adev->sdma.instance[i].fw); 179 181 } 180 182 return err; 181 183 }
+6 -12
drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
··· 250 250 static void sdma_v3_0_free_microcode(struct amdgpu_device *adev) 251 251 { 252 252 int i; 253 - for (i = 0; i < adev->sdma.num_instances; i++) { 254 - release_firmware(adev->sdma.instance[i].fw); 255 - adev->sdma.instance[i].fw = NULL; 256 - } 253 + 254 + for (i = 0; i < adev->sdma.num_instances; i++) 255 + amdgpu_ucode_release(&adev->sdma.instance[i].fw); 257 256 } 258 257 259 258 /** ··· 308 309 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name); 309 310 else 310 311 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name); 311 - err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev); 312 - if (err) 313 - goto out; 314 - err = amdgpu_ucode_validate(adev->sdma.instance[i].fw); 312 + err = amdgpu_ucode_request(adev, &adev->sdma.instance[i].fw, fw_name); 315 313 if (err) 316 314 goto out; 317 315 hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma.instance[i].fw->data; ··· 328 332 out: 329 333 if (err) { 330 334 pr_err("sdma_v3_0: Failed to load firmware \"%s\"\n", fw_name); 331 - for (i = 0; i < adev->sdma.num_instances; i++) { 332 - release_firmware(adev->sdma.instance[i].fw); 333 - adev->sdma.instance[i].fw = NULL; 334 - } 335 + for (i = 0; i < adev->sdma.num_instances; i++) 336 + amdgpu_ucode_release(&adev->sdma.instance[i].fw); 335 337 } 336 338 return err; 337 339 }
+2 -45
drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
··· 575 575 // vega10 real chip need to use PSP to load firmware 576 576 static int sdma_v4_0_init_microcode(struct amdgpu_device *adev) 577 577 { 578 - const char *chip_name; 579 - char fw_name[30]; 580 578 int ret, i; 581 579 582 - DRM_DEBUG("\n"); 583 - 584 - switch (adev->ip_versions[SDMA0_HWIP][0]) { 585 - case IP_VERSION(4, 0, 0): 586 - chip_name = "vega10"; 587 - break; 588 - case IP_VERSION(4, 0, 1): 589 - chip_name = "vega12"; 590 - break; 591 - case IP_VERSION(4, 2, 0): 592 - chip_name = "vega20"; 593 - break; 594 - case IP_VERSION(4, 1, 0): 595 - case IP_VERSION(4, 1, 1): 596 - if (adev->apu_flags & AMD_APU_IS_RAVEN2) 597 - chip_name = "raven2"; 598 - else if (adev->apu_flags & AMD_APU_IS_PICASSO) 599 - chip_name = "picasso"; 600 - else 601 - chip_name = "raven"; 602 - break; 603 - case IP_VERSION(4, 2, 2): 604 - chip_name = "arcturus"; 605 - break; 606 - case IP_VERSION(4, 1, 2): 607 - if (adev->apu_flags & AMD_APU_IS_RENOIR) 608 - chip_name = "renoir"; 609 - else 610 - chip_name = "green_sardine"; 611 - break; 612 - case IP_VERSION(4, 4, 0): 613 - chip_name = "aldebaran"; 614 - break; 615 - default: 616 - BUG(); 617 - } 618 - 619 580 for (i = 0; i < adev->sdma.num_instances; i++) { 620 - if (i == 0) 621 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name); 622 - else 623 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma%d.bin", chip_name, i); 624 581 if (adev->ip_versions[SDMA0_HWIP][0] == IP_VERSION(4, 2, 2) || 625 582 adev->ip_versions[SDMA0_HWIP][0] == IP_VERSION(4, 4, 0)) { 626 583 /* Acturus & Aldebaran will leverage the same FW memory 627 584 for every SDMA instance */ 628 - ret = amdgpu_sdma_init_microcode(adev, fw_name, 0, true); 585 + ret = amdgpu_sdma_init_microcode(adev, 0, true); 629 586 break; 630 587 } else { 631 - ret = amdgpu_sdma_init_microcode(adev, fw_name, i, false); 588 + ret = amdgpu_sdma_init_microcode(adev, i, false); 632 589 if (ret) 633 590 return ret; 634 591 }
+2 -28
drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
··· 237 237 // emulation only, won't work on real chip 238 238 // navi10 real chip need to use PSP to load firmware 239 239 static int sdma_v5_0_init_microcode(struct amdgpu_device *adev) 240 - { 241 - const char *chip_name; 242 - char fw_name[40]; 243 - int ret, i; 240 + { int ret, i; 244 241 245 242 if (amdgpu_sriov_vf(adev) && (adev->ip_versions[SDMA0_HWIP][0] == IP_VERSION(5, 0, 5))) 246 243 return 0; 247 244 248 - DRM_DEBUG("\n"); 249 - 250 - switch (adev->ip_versions[SDMA0_HWIP][0]) { 251 - case IP_VERSION(5, 0, 0): 252 - chip_name = "navi10"; 253 - break; 254 - case IP_VERSION(5, 0, 2): 255 - chip_name = "navi14"; 256 - break; 257 - case IP_VERSION(5, 0, 5): 258 - chip_name = "navi12"; 259 - break; 260 - case IP_VERSION(5, 0, 1): 261 - chip_name = "cyan_skillfish2"; 262 - break; 263 - default: 264 - BUG(); 265 - } 266 - 267 245 for (i = 0; i < adev->sdma.num_instances; i++) { 268 - if (i == 0) 269 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name); 270 - else 271 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name); 272 - ret = amdgpu_sdma_init_microcode(adev, fw_name, i, false); 246 + ret = amdgpu_sdma_init_microcode(adev, i, false); 273 247 if (ret) 274 248 return ret; 275 249 }
+1 -54
drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
··· 89 89 return base + internal_offset; 90 90 } 91 91 92 - /** 93 - * sdma_v5_2_init_microcode - load ucode images from disk 94 - * 95 - * @adev: amdgpu_device pointer 96 - * 97 - * Use the firmware interface to load the ucode images into 98 - * the driver (not loaded into hw). 99 - * Returns 0 on success, error on failure. 100 - */ 101 - 102 - // emulation only, won't work on real chip 103 - // navi10 real chip need to use PSP to load firmware 104 - static int sdma_v5_2_init_microcode(struct amdgpu_device *adev) 105 - { 106 - const char *chip_name; 107 - char fw_name[40]; 108 - 109 - DRM_DEBUG("\n"); 110 - 111 - switch (adev->ip_versions[SDMA0_HWIP][0]) { 112 - case IP_VERSION(5, 2, 0): 113 - chip_name = "sienna_cichlid_sdma"; 114 - break; 115 - case IP_VERSION(5, 2, 2): 116 - chip_name = "navy_flounder_sdma"; 117 - break; 118 - case IP_VERSION(5, 2, 1): 119 - chip_name = "vangogh_sdma"; 120 - break; 121 - case IP_VERSION(5, 2, 4): 122 - chip_name = "dimgrey_cavefish_sdma"; 123 - break; 124 - case IP_VERSION(5, 2, 5): 125 - chip_name = "beige_goby_sdma"; 126 - break; 127 - case IP_VERSION(5, 2, 3): 128 - chip_name = "yellow_carp_sdma"; 129 - break; 130 - case IP_VERSION(5, 2, 6): 131 - chip_name = "sdma_5_2_6"; 132 - break; 133 - case IP_VERSION(5, 2, 7): 134 - chip_name = "sdma_5_2_7"; 135 - break; 136 - default: 137 - BUG(); 138 - } 139 - 140 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s.bin", chip_name); 141 - 142 - return amdgpu_sdma_init_microcode(adev, fw_name, 0, true); 143 - } 144 - 145 92 static unsigned sdma_v5_2_ring_init_cond_exec(struct amdgpu_ring *ring) 146 93 { 147 94 unsigned ret; ··· 1235 1288 return r; 1236 1289 } 1237 1290 1238 - r = sdma_v5_2_init_microcode(adev); 1291 + r = amdgpu_sdma_init_microcode(adev, 0, true); 1239 1292 if (r) { 1240 1293 DRM_ERROR("Failed to load sdma firmware!\n"); 1241 1294 return r;
+1 -24
drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
··· 78 78 return base + internal_offset; 79 79 } 80 80 81 - /** 82 - * sdma_v6_0_init_microcode - load ucode images from disk 83 - * 84 - * @adev: amdgpu_device pointer 85 - * 86 - * Use the firmware interface to load the ucode images into 87 - * the driver (not loaded into hw). 88 - * Returns 0 on success, error on failure. 89 - */ 90 - static int sdma_v6_0_init_microcode(struct amdgpu_device *adev) 91 - { 92 - char fw_name[30]; 93 - char ucode_prefix[30]; 94 - 95 - DRM_DEBUG("\n"); 96 - 97 - amdgpu_ucode_ip_version_decode(adev, SDMA0_HWIP, ucode_prefix, sizeof(ucode_prefix)); 98 - 99 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s.bin", ucode_prefix); 100 - 101 - return amdgpu_sdma_init_microcode(adev, fw_name, 0, true); 102 - } 103 - 104 81 static unsigned sdma_v6_0_ring_init_cond_exec(struct amdgpu_ring *ring) 105 82 { 106 83 unsigned ret; ··· 1237 1260 if (r) 1238 1261 return r; 1239 1262 1240 - r = sdma_v6_0_init_microcode(adev); 1263 + r = amdgpu_sdma_init_microcode(adev, 0, true); 1241 1264 if (r) { 1242 1265 DRM_ERROR("Failed to load sdma firmware!\n"); 1243 1266 return r;
+3 -2
drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
··· 57 57 static void vcn_v1_0_ring_begin_use(struct amdgpu_ring *ring); 58 58 59 59 /** 60 - * vcn_v1_0_early_init - set function pointers 60 + * vcn_v1_0_early_init - set function pointers and load microcode 61 61 * 62 62 * @handle: amdgpu_device pointer 63 63 * 64 64 * Set ring and irq function pointers 65 + * Load microcode from filesystem 65 66 */ 66 67 static int vcn_v1_0_early_init(void *handle) 67 68 { ··· 76 75 77 76 jpeg_v1_0_early_init(handle); 78 77 79 - return 0; 78 + return amdgpu_vcn_early_init(adev); 80 79 } 81 80 82 81 /**
+3 -2
drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
··· 62 62 int inst_idx, struct dpg_pause_state *new_state); 63 63 static int vcn_v2_0_start_sriov(struct amdgpu_device *adev); 64 64 /** 65 - * vcn_v2_0_early_init - set function pointers 65 + * vcn_v2_0_early_init - set function pointers and load microcode 66 66 * 67 67 * @handle: amdgpu_device pointer 68 68 * 69 69 * Set ring and irq function pointers 70 + * Load microcode from filesystem 70 71 */ 71 72 static int vcn_v2_0_early_init(void *handle) 72 73 { ··· 82 81 vcn_v2_0_set_enc_ring_funcs(adev); 83 82 vcn_v2_0_set_irq_funcs(adev); 84 83 85 - return 0; 84 + return amdgpu_vcn_early_init(adev); 86 85 } 87 86 88 87 /**
+3 -2
drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
··· 71 71 }; 72 72 73 73 /** 74 - * vcn_v2_5_early_init - set function pointers 74 + * vcn_v2_5_early_init - set function pointers and load microcode 75 75 * 76 76 * @handle: amdgpu_device pointer 77 77 * 78 78 * Set ring and irq function pointers 79 + * Load microcode from filesystem 79 80 */ 80 81 static int vcn_v2_5_early_init(void *handle) 81 82 { ··· 108 107 vcn_v2_5_set_irq_funcs(adev); 109 108 vcn_v2_5_set_ras_funcs(adev); 110 109 111 - return 0; 110 + return amdgpu_vcn_early_init(adev); 112 111 } 113 112 114 113 /**
+3 -2
drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
··· 78 78 static void vcn_v3_0_enc_ring_set_wptr(struct amdgpu_ring *ring); 79 79 80 80 /** 81 - * vcn_v3_0_early_init - set function pointers 81 + * vcn_v3_0_early_init - set function pointers and load microcode 82 82 * 83 83 * @handle: amdgpu_device pointer 84 84 * 85 85 * Set ring and irq function pointers 86 + * Load microcode from filesystem 86 87 */ 87 88 static int vcn_v3_0_early_init(void *handle) 88 89 { ··· 110 109 vcn_v3_0_set_enc_ring_funcs(adev); 111 110 vcn_v3_0_set_irq_funcs(adev); 112 111 113 - return 0; 112 + return amdgpu_vcn_early_init(adev); 114 113 } 115 114 116 115 /**
+3 -2
drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
··· 68 68 static void vcn_v4_0_set_ras_funcs(struct amdgpu_device *adev); 69 69 70 70 /** 71 - * vcn_v4_0_early_init - set function pointers 71 + * vcn_v4_0_early_init - set function pointers and load microcode 72 72 * 73 73 * @handle: amdgpu_device pointer 74 74 * 75 75 * Set ring and irq function pointers 76 + * Load microcode from filesystem 76 77 */ 77 78 static int vcn_v4_0_early_init(void *handle) 78 79 { ··· 89 88 vcn_v4_0_set_irq_funcs(adev); 90 89 vcn_v4_0_set_ras_funcs(adev); 91 90 92 - return 0; 91 + return amdgpu_vcn_early_init(adev); 93 92 } 94 93 95 94 /**
+7 -2
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
··· 1127 1127 } 1128 1128 1129 1129 /* Update the VRAM usage count */ 1130 - if (flags & KFD_IOC_ALLOC_MEM_FLAGS_VRAM) 1131 - WRITE_ONCE(pdd->vram_usage, pdd->vram_usage + args->size); 1130 + if (flags & KFD_IOC_ALLOC_MEM_FLAGS_VRAM) { 1131 + uint64_t size = args->size; 1132 + 1133 + if (flags & KFD_IOC_ALLOC_MEM_FLAGS_AQL_QUEUE_MEM) 1134 + size >>= 1; 1135 + WRITE_ONCE(pdd->vram_usage, pdd->vram_usage + PAGE_ALIGN(size)); 1136 + } 1132 1137 1133 1138 mutex_unlock(&p->mutex); 1134 1139
+1 -1
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
··· 200 200 queue_input.wptr_addr = (uint64_t)q->properties.write_ptr; 201 201 202 202 if (q->wptr_bo) { 203 - wptr_addr_off = (uint64_t)q->properties.write_ptr - (uint64_t)q->wptr_bo->kfd_bo->va; 203 + wptr_addr_off = (uint64_t)q->properties.write_ptr & (PAGE_SIZE - 1); 204 204 queue_input.wptr_mc_addr = ((uint64_t)q->wptr_bo->tbo.resource->start << PAGE_SHIFT) + wptr_addr_off; 205 205 } 206 206
+1 -2
drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
··· 1027 1027 /* Disable SVM support capability */ 1028 1028 pgmap->type = 0; 1029 1029 if (pgmap->type == MEMORY_DEVICE_PRIVATE) 1030 - devm_release_mem_region(adev->dev, res->start, 1031 - res->end - res->start + 1); 1030 + devm_release_mem_region(adev->dev, res->start, resource_size(res)); 1032 1031 return PTR_ERR(r); 1033 1032 } 1034 1033
+10 -2
drivers/gpu/drm/amd/amdkfd/kfd_process.c
··· 1563 1563 int kfd_process_device_init_vm(struct kfd_process_device *pdd, 1564 1564 struct file *drm_file) 1565 1565 { 1566 + struct amdgpu_fpriv *drv_priv; 1567 + struct amdgpu_vm *avm; 1566 1568 struct kfd_process *p; 1567 1569 struct kfd_dev *dev; 1568 1570 int ret; ··· 1575 1573 if (pdd->drm_priv) 1576 1574 return -EBUSY; 1577 1575 1576 + ret = amdgpu_file_to_fpriv(drm_file, &drv_priv); 1577 + if (ret) 1578 + return ret; 1579 + avm = &drv_priv->vm; 1580 + 1578 1581 p = pdd->process; 1579 1582 dev = pdd->dev; 1580 1583 1581 - ret = amdgpu_amdkfd_gpuvm_acquire_process_vm(dev->adev, drm_file, 1584 + ret = amdgpu_amdkfd_gpuvm_acquire_process_vm(dev->adev, avm, 1582 1585 &p->kgd_process_info, 1583 1586 &p->ef); 1584 1587 if (ret) { ··· 1600 1593 if (ret) 1601 1594 goto err_init_cwsr; 1602 1595 1603 - ret = amdgpu_amdkfd_gpuvm_set_vm_pasid(dev->adev, drm_file, p->pasid); 1596 + ret = amdgpu_amdkfd_gpuvm_set_vm_pasid(dev->adev, avm, p->pasid); 1604 1597 if (ret) 1605 1598 goto err_set_pasid; 1606 1599 ··· 1614 1607 kfd_process_device_destroy_ib_mem(pdd); 1615 1608 err_reserve_ib_mem: 1616 1609 pdd->drm_priv = NULL; 1610 + amdgpu_amdkfd_gpuvm_destroy_cb(dev->adev, avm); 1617 1611 1618 1612 return ret; 1619 1613 }
+9
drivers/gpu/drm/amd/amdkfd/kfd_svm.c
··· 571 571 goto reserve_bo_failed; 572 572 } 573 573 574 + if (clear) { 575 + r = amdgpu_bo_sync_wait(bo, AMDGPU_FENCE_OWNER_KFD, false); 576 + if (r) { 577 + pr_debug("failed %d to sync bo\n", r); 578 + amdgpu_bo_unreserve(bo); 579 + goto reserve_bo_failed; 580 + } 581 + } 582 + 574 583 r = dma_resv_reserve_fences(bo->tbo.base.resv, 1); 575 584 if (r) { 576 585 pr_debug("failed %d to reserve bo\n", r);
+66 -50
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 1883 1883 return 0; 1884 1884 } 1885 1885 1886 - r = request_firmware_direct(&adev->dm.fw_dmcu, fw_name_dmcu, adev->dev); 1887 - if (r == -ENOENT) { 1886 + r = amdgpu_ucode_request(adev, &adev->dm.fw_dmcu, fw_name_dmcu); 1887 + if (r == -ENODEV) { 1888 1888 /* DMCU firmware is not necessary, so don't raise a fuss if it's missing */ 1889 1889 DRM_DEBUG_KMS("dm: DMCU firmware not found\n"); 1890 1890 adev->dm.fw_dmcu = NULL; 1891 1891 return 0; 1892 1892 } 1893 1893 if (r) { 1894 - dev_err(adev->dev, "amdgpu_dm: Can't load firmware \"%s\"\n", 1895 - fw_name_dmcu); 1896 - return r; 1897 - } 1898 - 1899 - r = amdgpu_ucode_validate(adev->dm.fw_dmcu); 1900 - if (r) { 1901 1894 dev_err(adev->dev, "amdgpu_dm: Can't validate firmware \"%s\"\n", 1902 1895 fw_name_dmcu); 1903 - release_firmware(adev->dm.fw_dmcu); 1904 - adev->dm.fw_dmcu = NULL; 1896 + amdgpu_ucode_release(&adev->dm.fw_dmcu); 1905 1897 return r; 1906 1898 } 1907 1899 ··· 1939 1947 struct dmub_srv_fb_info *fb_info; 1940 1948 struct dmub_srv *dmub_srv; 1941 1949 const struct dmcub_firmware_header_v1_0 *hdr; 1942 - const char *fw_name_dmub; 1943 1950 enum dmub_asic dmub_asic; 1944 1951 enum dmub_status status; 1945 1952 int r; ··· 1946 1955 switch (adev->ip_versions[DCE_HWIP][0]) { 1947 1956 case IP_VERSION(2, 1, 0): 1948 1957 dmub_asic = DMUB_ASIC_DCN21; 1949 - fw_name_dmub = FIRMWARE_RENOIR_DMUB; 1950 - if (ASICREV_IS_GREEN_SARDINE(adev->external_rev_id)) 1951 - fw_name_dmub = FIRMWARE_GREEN_SARDINE_DMUB; 1952 1958 break; 1953 1959 case IP_VERSION(3, 0, 0): 1954 - if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 0)) { 1960 + if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 0)) 1955 1961 dmub_asic = DMUB_ASIC_DCN30; 1956 - fw_name_dmub = FIRMWARE_SIENNA_CICHLID_DMUB; 1957 - } else { 1962 + else 1958 1963 dmub_asic = DMUB_ASIC_DCN30; 1959 - fw_name_dmub = FIRMWARE_NAVY_FLOUNDER_DMUB; 1960 - } 1961 1964 break; 1962 1965 case IP_VERSION(3, 0, 1): 1963 1966 dmub_asic = DMUB_ASIC_DCN301; 1964 - fw_name_dmub = FIRMWARE_VANGOGH_DMUB; 1965 1967 break; 1966 1968 case IP_VERSION(3, 0, 2): 1967 1969 dmub_asic = DMUB_ASIC_DCN302; 1968 - fw_name_dmub = FIRMWARE_DIMGREY_CAVEFISH_DMUB; 1969 1970 break; 1970 1971 case IP_VERSION(3, 0, 3): 1971 1972 dmub_asic = DMUB_ASIC_DCN303; 1972 - fw_name_dmub = FIRMWARE_BEIGE_GOBY_DMUB; 1973 1973 break; 1974 1974 case IP_VERSION(3, 1, 2): 1975 1975 case IP_VERSION(3, 1, 3): 1976 1976 dmub_asic = (adev->external_rev_id == YELLOW_CARP_B0) ? DMUB_ASIC_DCN31B : DMUB_ASIC_DCN31; 1977 - fw_name_dmub = FIRMWARE_YELLOW_CARP_DMUB; 1978 1977 break; 1979 1978 case IP_VERSION(3, 1, 4): 1980 1979 dmub_asic = DMUB_ASIC_DCN314; 1981 - fw_name_dmub = FIRMWARE_DCN_314_DMUB; 1982 1980 break; 1983 1981 case IP_VERSION(3, 1, 5): 1984 1982 dmub_asic = DMUB_ASIC_DCN315; 1985 - fw_name_dmub = FIRMWARE_DCN_315_DMUB; 1986 1983 break; 1987 1984 case IP_VERSION(3, 1, 6): 1988 1985 dmub_asic = DMUB_ASIC_DCN316; 1989 - fw_name_dmub = FIRMWARE_DCN316_DMUB; 1990 1986 break; 1991 1987 case IP_VERSION(3, 2, 0): 1992 1988 dmub_asic = DMUB_ASIC_DCN32; 1993 - fw_name_dmub = FIRMWARE_DCN_V3_2_0_DMCUB; 1994 1989 break; 1995 1990 case IP_VERSION(3, 2, 1): 1996 1991 dmub_asic = DMUB_ASIC_DCN321; 1997 - fw_name_dmub = FIRMWARE_DCN_V3_2_1_DMCUB; 1998 1992 break; 1999 1993 default: 2000 1994 /* ASIC doesn't support DMUB. */ 2001 - return 0; 2002 - } 2003 - 2004 - r = request_firmware_direct(&adev->dm.dmub_fw, fw_name_dmub, adev->dev); 2005 - if (r) { 2006 - DRM_ERROR("DMUB firmware loading failed: %d\n", r); 2007 - return 0; 2008 - } 2009 - 2010 - r = amdgpu_ucode_validate(adev->dm.dmub_fw); 2011 - if (r) { 2012 - DRM_ERROR("Couldn't validate DMUB firmware: %d\n", r); 2013 1995 return 0; 2014 1996 } 2015 1997 ··· 2109 2145 adev->dm.dmub_srv = NULL; 2110 2146 } 2111 2147 2112 - release_firmware(adev->dm.dmub_fw); 2113 - adev->dm.dmub_fw = NULL; 2114 - 2115 - release_firmware(adev->dm.fw_dmcu); 2116 - adev->dm.fw_dmcu = NULL; 2148 + amdgpu_ucode_release(&adev->dm.dmub_fw); 2149 + amdgpu_ucode_release(&adev->dm.fw_dmcu); 2117 2150 2118 2151 return 0; 2119 2152 } ··· 4479 4518 4480 4519 #endif 4481 4520 4521 + static int dm_init_microcode(struct amdgpu_device *adev) 4522 + { 4523 + char *fw_name_dmub; 4524 + int r; 4525 + 4526 + switch (adev->ip_versions[DCE_HWIP][0]) { 4527 + case IP_VERSION(2, 1, 0): 4528 + fw_name_dmub = FIRMWARE_RENOIR_DMUB; 4529 + if (ASICREV_IS_GREEN_SARDINE(adev->external_rev_id)) 4530 + fw_name_dmub = FIRMWARE_GREEN_SARDINE_DMUB; 4531 + break; 4532 + case IP_VERSION(3, 0, 0): 4533 + if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 0)) 4534 + fw_name_dmub = FIRMWARE_SIENNA_CICHLID_DMUB; 4535 + else 4536 + fw_name_dmub = FIRMWARE_NAVY_FLOUNDER_DMUB; 4537 + break; 4538 + case IP_VERSION(3, 0, 1): 4539 + fw_name_dmub = FIRMWARE_VANGOGH_DMUB; 4540 + break; 4541 + case IP_VERSION(3, 0, 2): 4542 + fw_name_dmub = FIRMWARE_DIMGREY_CAVEFISH_DMUB; 4543 + break; 4544 + case IP_VERSION(3, 0, 3): 4545 + fw_name_dmub = FIRMWARE_BEIGE_GOBY_DMUB; 4546 + break; 4547 + case IP_VERSION(3, 1, 2): 4548 + case IP_VERSION(3, 1, 3): 4549 + fw_name_dmub = FIRMWARE_YELLOW_CARP_DMUB; 4550 + break; 4551 + case IP_VERSION(3, 1, 4): 4552 + fw_name_dmub = FIRMWARE_DCN_314_DMUB; 4553 + break; 4554 + case IP_VERSION(3, 1, 5): 4555 + fw_name_dmub = FIRMWARE_DCN_315_DMUB; 4556 + break; 4557 + case IP_VERSION(3, 1, 6): 4558 + fw_name_dmub = FIRMWARE_DCN316_DMUB; 4559 + break; 4560 + case IP_VERSION(3, 2, 0): 4561 + fw_name_dmub = FIRMWARE_DCN_V3_2_0_DMCUB; 4562 + break; 4563 + case IP_VERSION(3, 2, 1): 4564 + fw_name_dmub = FIRMWARE_DCN_V3_2_1_DMCUB; 4565 + break; 4566 + default: 4567 + /* ASIC doesn't support DMUB. */ 4568 + return 0; 4569 + } 4570 + r = amdgpu_ucode_request(adev, &adev->dm.dmub_fw, fw_name_dmub); 4571 + if (r) 4572 + DRM_ERROR("DMUB firmware loading failed: %d\n", r); 4573 + return r; 4574 + } 4575 + 4482 4576 static int dm_early_init(void *handle) 4483 4577 { 4484 4578 struct amdgpu_device *adev = (struct amdgpu_device *)handle; ··· 4666 4650 #endif 4667 4651 adev->dc_enabled = true; 4668 4652 4669 - return 0; 4653 + return dm_init_microcode(adev); 4670 4654 } 4671 4655 4672 4656 static bool modereset_required(struct drm_crtc_state *crtc_state) ··· 7444 7428 new_conn_state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED; 7445 7429 pr_debug("[HDCP_DM] ENABLED->DESIRED & mode_changed %s :true\n", __func__); 7446 7430 return true; 7447 - }; 7431 + } 7448 7432 new_conn_state->content_protection = DRM_MODE_CONTENT_PROTECTION_ENABLED; 7449 7433 pr_debug("[HDCP_DM] ENABLED -> DESIRED %s :false\n", __func__); 7450 7434 return false; ··· 7498 7482 pr_debug("[HDCP_DM] DESIRED->DESIRED or ENABLE->ENABLE mode_change %s :true\n", 7499 7483 __func__); 7500 7484 return true; 7501 - }; 7485 + } 7502 7486 pr_debug("[HDCP_DM] DESIRED->DESIRED & ENABLE->ENABLE %s :false\n", 7503 7487 __func__); 7504 7488 return false; 7505 - }; 7489 + } 7506 7490 7507 7491 pr_debug("[HDCP_DM] UNDESIRED->UNDESIRED %s :false\n", __func__); 7508 7492 return false;
+3
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.c
··· 122 122 psr_config.allow_multi_disp_optimizations = 123 123 (amdgpu_dc_feature_mask & DC_PSR_ALLOW_MULTI_DISP_OPT); 124 124 125 + if (!psr_su_set_y_granularity(dc, link, stream, &psr_config)) 126 + return false; 127 + 125 128 ret = dc_link_setup_psr(link, stream, &psr_config, &psr_context); 126 129 127 130 }
+1 -2
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c
··· 577 577 578 578 void dcn3_clk_mgr_destroy(struct clk_mgr_internal *clk_mgr) 579 579 { 580 - if (clk_mgr->base.bw_params) 581 - kfree(clk_mgr->base.bw_params); 580 + kfree(clk_mgr->base.bw_params); 582 581 583 582 if (clk_mgr->wm_range_table) 584 583 dm_helpers_free_gpu_mem(clk_mgr->base.ctx, DC_MEM_ALLOC_TYPE_GART,
+1 -2
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c
··· 783 783 784 784 void dcn32_clk_mgr_destroy(struct clk_mgr_internal *clk_mgr) 785 785 { 786 - if (clk_mgr->base.bw_params) 787 - kfree(clk_mgr->base.bw_params); 786 + kfree(clk_mgr->base.bw_params); 788 787 789 788 if (clk_mgr->wm_range_table) 790 789 dm_helpers_free_gpu_mem(clk_mgr->base.ctx, DC_MEM_ALLOC_TYPE_GART,
+1 -1
drivers/gpu/drm/amd/display/dc/core/dc_stream.c
··· 408 408 struct dc_stream_state *stream, 409 409 const struct dc_cursor_position *position) 410 410 { 411 - struct dc *dc = stream->ctx->dc; 411 + struct dc *dc; 412 412 bool reset_idle_optimizations = false; 413 413 414 414 if (NULL == stream) {
+31
drivers/gpu/drm/amd/display/modules/power/power_helpers.c
··· 916 916 { 917 917 return context && context->stream_count == 1 && dc_is_embedded_signal(stream->signal); 918 918 } 919 + 920 + bool psr_su_set_y_granularity(struct dc *dc, struct dc_link *link, 921 + struct dc_stream_state *stream, 922 + struct psr_config *config) 923 + { 924 + uint16_t pic_height; 925 + uint8_t slice_height; 926 + 927 + if ((link->connector_signal & SIGNAL_TYPE_EDP) && 928 + (!dc->caps.edp_dsc_support || 929 + link->panel_config.dsc.disable_dsc_edp || 930 + !link->dpcd_caps.dsc_caps.dsc_basic_caps.fields.dsc_support.DSC_SUPPORT || 931 + !stream->timing.dsc_cfg.num_slices_v)) 932 + return true; 933 + 934 + pic_height = stream->timing.v_addressable + 935 + stream->timing.v_border_top + stream->timing.v_border_bottom; 936 + slice_height = pic_height / stream->timing.dsc_cfg.num_slices_v; 937 + 938 + if (slice_height) { 939 + if (config->su_y_granularity && 940 + (slice_height % config->su_y_granularity)) { 941 + ASSERT(0); 942 + return false; 943 + } 944 + 945 + config->su_y_granularity = slice_height; 946 + } 947 + 948 + return true; 949 + }
+3
drivers/gpu/drm/amd/display/modules/power/power_helpers.h
··· 59 59 const struct dc_stream_state *stream); 60 60 bool mod_power_only_edp(const struct dc_state *context, 61 61 const struct dc_stream_state *stream); 62 + bool psr_su_set_y_granularity(struct dc *dc, struct dc_link *link, 63 + struct dc_stream_state *stream, 64 + struct psr_config *config); 62 65 #endif /* MODULES_POWER_POWER_HELPERS_H_ */
+2 -9
drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c
··· 7714 7714 } 7715 7715 7716 7716 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_smc.bin", chip_name); 7717 - err = request_firmware(&adev->pm.fw, fw_name, adev->dev); 7718 - if (err) 7719 - goto out; 7720 - err = amdgpu_ucode_validate(adev->pm.fw); 7721 - 7722 - out: 7717 + err = amdgpu_ucode_request(adev, &adev->pm.fw, fw_name); 7723 7718 if (err) { 7724 7719 DRM_ERROR("si_smc: Failed to load firmware. err = %d\"%s\"\n", 7725 7720 err, fw_name); 7726 - release_firmware(adev->pm.fw); 7727 - adev->pm.fw = NULL; 7721 + amdgpu_ucode_release(&adev->pm.fw); 7728 7722 } 7729 7723 return err; 7730 - 7731 7724 } 7732 7725 7733 7726 static int si_dpm_sw_init(void *handle)
+1 -2
drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c
··· 111 111 112 112 hwmgr_sw_fini(hwmgr); 113 113 114 - release_firmware(adev->pm.fw); 115 - adev->pm.fw = NULL; 114 + amdgpu_ucode_release(&adev->pm.fw); 116 115 117 116 return 0; 118 117 }
+5 -7
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
··· 623 623 { 624 624 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 625 625 struct smu_context *smu; 626 + int r; 626 627 627 628 smu = kzalloc(sizeof(struct smu_context), GFP_KERNEL); 628 629 if (!smu) ··· 641 640 adev->powerplay.pp_handle = smu; 642 641 adev->powerplay.pp_funcs = &swsmu_pm_funcs; 643 642 644 - return smu_set_funcs(adev); 643 + r = smu_set_funcs(adev); 644 + if (r) 645 + return r; 646 + return smu_init_microcode(smu); 645 647 } 646 648 647 649 static int smu_set_default_dpm_table(struct smu_context *smu) ··· 1070 1066 1071 1067 smu->smu_dpm.dpm_level = AMD_DPM_FORCED_LEVEL_AUTO; 1072 1068 smu->smu_dpm.requested_dpm_level = AMD_DPM_FORCED_LEVEL_AUTO; 1073 - 1074 - ret = smu_init_microcode(smu); 1075 - if (ret) { 1076 - dev_err(adev->dev, "Failed to load smu firmware!\n"); 1077 - return ret; 1078 - } 1079 1069 1080 1070 ret = smu_smc_table_sw_init(smu); 1081 1071 if (ret) {
+7 -44
drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
··· 93 93 int smu_v11_0_init_microcode(struct smu_context *smu) 94 94 { 95 95 struct amdgpu_device *adev = smu->adev; 96 - const char *chip_name; 96 + char ucode_prefix[30]; 97 97 char fw_name[SMU_FW_NAME_LEN]; 98 98 int err = 0; 99 99 const struct smc_firmware_header_v1_0 *hdr; ··· 105 105 (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 7)))) 106 106 return 0; 107 107 108 - switch (adev->ip_versions[MP1_HWIP][0]) { 109 - case IP_VERSION(11, 0, 0): 110 - chip_name = "navi10"; 111 - break; 112 - case IP_VERSION(11, 0, 5): 113 - chip_name = "navi14"; 114 - break; 115 - case IP_VERSION(11, 0, 9): 116 - chip_name = "navi12"; 117 - break; 118 - case IP_VERSION(11, 0, 7): 119 - chip_name = "sienna_cichlid"; 120 - break; 121 - case IP_VERSION(11, 0, 11): 122 - chip_name = "navy_flounder"; 123 - break; 124 - case IP_VERSION(11, 0, 12): 125 - chip_name = "dimgrey_cavefish"; 126 - break; 127 - case IP_VERSION(11, 0, 13): 128 - chip_name = "beige_goby"; 129 - break; 130 - case IP_VERSION(11, 0, 2): 131 - chip_name = "arcturus"; 132 - break; 133 - default: 134 - dev_err(adev->dev, "Unsupported IP version 0x%x\n", 135 - adev->ip_versions[MP1_HWIP][0]); 136 - return -EINVAL; 137 - } 108 + amdgpu_ucode_ip_version_decode(adev, MP1_HWIP, ucode_prefix, sizeof(ucode_prefix)); 138 109 139 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_smc.bin", chip_name); 110 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s.bin", ucode_prefix); 140 111 141 - err = request_firmware(&adev->pm.fw, fw_name, adev->dev); 142 - if (err) 143 - goto out; 144 - err = amdgpu_ucode_validate(adev->pm.fw); 112 + err = amdgpu_ucode_request(adev, &adev->pm.fw, fw_name); 145 113 if (err) 146 114 goto out; 147 115 ··· 127 159 } 128 160 129 161 out: 130 - if (err) { 131 - DRM_ERROR("smu_v11_0: Failed to load firmware \"%s\"\n", 132 - fw_name); 133 - release_firmware(adev->pm.fw); 134 - adev->pm.fw = NULL; 135 - } 162 + if (err) 163 + amdgpu_ucode_release(&adev->pm.fw); 136 164 return err; 137 165 } 138 166 ··· 136 172 { 137 173 struct amdgpu_device *adev = smu->adev; 138 174 139 - release_firmware(adev->pm.fw); 140 - adev->pm.fw = NULL; 175 + amdgpu_ucode_release(&adev->pm.fw); 141 176 adev->pm.fw_version = 0; 142 177 } 143 178
+10 -22
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
··· 88 88 int smu_v13_0_init_microcode(struct smu_context *smu) 89 89 { 90 90 struct amdgpu_device *adev = smu->adev; 91 - const char *chip_name; 92 91 char fw_name[30]; 93 92 char ucode_prefix[30]; 94 93 int err = 0; ··· 99 100 if (amdgpu_sriov_vf(adev)) 100 101 return 0; 101 102 102 - switch (adev->ip_versions[MP1_HWIP][0]) { 103 - case IP_VERSION(13, 0, 2): 104 - chip_name = "aldebaran_smc"; 105 - break; 106 - default: 107 - amdgpu_ucode_ip_version_decode(adev, MP1_HWIP, ucode_prefix, sizeof(ucode_prefix)); 108 - chip_name = ucode_prefix; 109 - } 103 + amdgpu_ucode_ip_version_decode(adev, MP1_HWIP, ucode_prefix, sizeof(ucode_prefix)); 110 104 111 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s.bin", chip_name); 105 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s.bin", ucode_prefix); 112 106 113 - err = request_firmware(&adev->pm.fw, fw_name, adev->dev); 114 - if (err) 115 - goto out; 116 - err = amdgpu_ucode_validate(adev->pm.fw); 107 + err = amdgpu_ucode_request(adev, &adev->pm.fw, fw_name); 117 108 if (err) 118 109 goto out; 119 110 ··· 121 132 } 122 133 123 134 out: 124 - if (err) { 125 - DRM_ERROR("smu_v13_0: Failed to load firmware \"%s\"\n", 126 - fw_name); 127 - release_firmware(adev->pm.fw); 128 - adev->pm.fw = NULL; 129 - } 135 + if (err) 136 + amdgpu_ucode_release(&adev->pm.fw); 130 137 return err; 131 138 } 132 139 ··· 130 145 { 131 146 struct amdgpu_device *adev = smu->adev; 132 147 133 - release_firmware(adev->pm.fw); 134 - adev->pm.fw = NULL; 148 + amdgpu_ucode_release(&adev->pm.fw); 135 149 adev->pm.fw_version = 0; 136 150 } 137 151 ··· 2242 2258 if (amdgpu_sriov_vf(smu->adev) || 2243 2259 !smu_baco->platform_support) 2244 2260 return false; 2261 + 2262 + /* return true if ASIC is in BACO state already */ 2263 + if (smu_v13_0_baco_get_state(smu) == SMU_BACO_STATE_ENTER) 2264 + return true; 2245 2265 2246 2266 if (smu_cmn_feature_is_supported(smu, SMU_FEATURE_BACO_BIT) && 2247 2267 !smu_cmn_feature_is_enabled(smu, SMU_FEATURE_BACO_BIT))
+1
drivers/gpu/drm/radeon/radeon_device.c
··· 1023 1023 { 1024 1024 if (rdev->mode_info.atom_context) { 1025 1025 kfree(rdev->mode_info.atom_context->scratch); 1026 + kfree(rdev->mode_info.atom_context->iio); 1026 1027 } 1027 1028 kfree(rdev->mode_info.atom_context); 1028 1029 rdev->mode_info.atom_context = NULL;