162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Copyright 2014 Advanced Micro Devices, Inc. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 562306a36Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 662306a36Sopenharmony_ci * to deal in the Software without restriction, including without limitation 762306a36Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 862306a36Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 962306a36Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * The above copyright notice and this permission notice shall be included in 1262306a36Sopenharmony_ci * all copies or substantial portions of the Software. 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1562306a36Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1662306a36Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1762306a36Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 1862306a36Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 1962306a36Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2062306a36Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 2162306a36Sopenharmony_ci * 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#include <linux/firmware.h> 2562306a36Sopenharmony_ci#include <linux/slab.h> 2662306a36Sopenharmony_ci#include <linux/module.h> 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#include "amdgpu.h" 2962306a36Sopenharmony_ci#include "amdgpu_ucode.h" 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistatic void amdgpu_ucode_print_common_hdr(const struct common_firmware_header *hdr) 3262306a36Sopenharmony_ci{ 3362306a36Sopenharmony_ci DRM_DEBUG("size_bytes: %u\n", le32_to_cpu(hdr->size_bytes)); 3462306a36Sopenharmony_ci DRM_DEBUG("header_size_bytes: %u\n", le32_to_cpu(hdr->header_size_bytes)); 3562306a36Sopenharmony_ci DRM_DEBUG("header_version_major: %u\n", le16_to_cpu(hdr->header_version_major)); 3662306a36Sopenharmony_ci DRM_DEBUG("header_version_minor: %u\n", le16_to_cpu(hdr->header_version_minor)); 3762306a36Sopenharmony_ci DRM_DEBUG("ip_version_major: %u\n", le16_to_cpu(hdr->ip_version_major)); 3862306a36Sopenharmony_ci DRM_DEBUG("ip_version_minor: %u\n", le16_to_cpu(hdr->ip_version_minor)); 3962306a36Sopenharmony_ci DRM_DEBUG("ucode_version: 0x%08x\n", le32_to_cpu(hdr->ucode_version)); 4062306a36Sopenharmony_ci DRM_DEBUG("ucode_size_bytes: %u\n", le32_to_cpu(hdr->ucode_size_bytes)); 4162306a36Sopenharmony_ci DRM_DEBUG("ucode_array_offset_bytes: %u\n", 4262306a36Sopenharmony_ci le32_to_cpu(hdr->ucode_array_offset_bytes)); 4362306a36Sopenharmony_ci DRM_DEBUG("crc32: 0x%08x\n", le32_to_cpu(hdr->crc32)); 4462306a36Sopenharmony_ci} 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_civoid amdgpu_ucode_print_mc_hdr(const struct common_firmware_header *hdr) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci uint16_t version_major = le16_to_cpu(hdr->header_version_major); 4962306a36Sopenharmony_ci uint16_t version_minor = le16_to_cpu(hdr->header_version_minor); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci DRM_DEBUG("MC\n"); 5262306a36Sopenharmony_ci amdgpu_ucode_print_common_hdr(hdr); 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci if (version_major == 1) { 5562306a36Sopenharmony_ci const struct mc_firmware_header_v1_0 *mc_hdr = 5662306a36Sopenharmony_ci container_of(hdr, struct mc_firmware_header_v1_0, header); 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci DRM_DEBUG("io_debug_size_bytes: %u\n", 5962306a36Sopenharmony_ci le32_to_cpu(mc_hdr->io_debug_size_bytes)); 6062306a36Sopenharmony_ci DRM_DEBUG("io_debug_array_offset_bytes: %u\n", 6162306a36Sopenharmony_ci le32_to_cpu(mc_hdr->io_debug_array_offset_bytes)); 6262306a36Sopenharmony_ci } else { 6362306a36Sopenharmony_ci DRM_ERROR("Unknown MC ucode version: %u.%u\n", version_major, version_minor); 6462306a36Sopenharmony_ci } 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_civoid amdgpu_ucode_print_smc_hdr(const struct common_firmware_header *hdr) 6862306a36Sopenharmony_ci{ 6962306a36Sopenharmony_ci uint16_t version_major = le16_to_cpu(hdr->header_version_major); 7062306a36Sopenharmony_ci uint16_t version_minor = le16_to_cpu(hdr->header_version_minor); 7162306a36Sopenharmony_ci const struct smc_firmware_header_v1_0 *v1_0_hdr; 7262306a36Sopenharmony_ci const struct smc_firmware_header_v2_0 *v2_0_hdr; 7362306a36Sopenharmony_ci const struct smc_firmware_header_v2_1 *v2_1_hdr; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci DRM_DEBUG("SMC\n"); 7662306a36Sopenharmony_ci amdgpu_ucode_print_common_hdr(hdr); 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci if (version_major == 1) { 7962306a36Sopenharmony_ci v1_0_hdr = container_of(hdr, struct smc_firmware_header_v1_0, header); 8062306a36Sopenharmony_ci DRM_DEBUG("ucode_start_addr: %u\n", le32_to_cpu(v1_0_hdr->ucode_start_addr)); 8162306a36Sopenharmony_ci } else if (version_major == 2) { 8262306a36Sopenharmony_ci switch (version_minor) { 8362306a36Sopenharmony_ci case 0: 8462306a36Sopenharmony_ci v2_0_hdr = container_of(hdr, struct smc_firmware_header_v2_0, v1_0.header); 8562306a36Sopenharmony_ci DRM_DEBUG("ppt_offset_bytes: %u\n", le32_to_cpu(v2_0_hdr->ppt_offset_bytes)); 8662306a36Sopenharmony_ci DRM_DEBUG("ppt_size_bytes: %u\n", le32_to_cpu(v2_0_hdr->ppt_size_bytes)); 8762306a36Sopenharmony_ci break; 8862306a36Sopenharmony_ci case 1: 8962306a36Sopenharmony_ci v2_1_hdr = container_of(hdr, struct smc_firmware_header_v2_1, v1_0.header); 9062306a36Sopenharmony_ci DRM_DEBUG("pptable_count: %u\n", le32_to_cpu(v2_1_hdr->pptable_count)); 9162306a36Sopenharmony_ci DRM_DEBUG("pptable_entry_offset: %u\n", le32_to_cpu(v2_1_hdr->pptable_entry_offset)); 9262306a36Sopenharmony_ci break; 9362306a36Sopenharmony_ci default: 9462306a36Sopenharmony_ci break; 9562306a36Sopenharmony_ci } 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci } else { 9862306a36Sopenharmony_ci DRM_ERROR("Unknown SMC ucode version: %u.%u\n", version_major, version_minor); 9962306a36Sopenharmony_ci } 10062306a36Sopenharmony_ci} 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_civoid amdgpu_ucode_print_gfx_hdr(const struct common_firmware_header *hdr) 10362306a36Sopenharmony_ci{ 10462306a36Sopenharmony_ci uint16_t version_major = le16_to_cpu(hdr->header_version_major); 10562306a36Sopenharmony_ci uint16_t version_minor = le16_to_cpu(hdr->header_version_minor); 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci DRM_DEBUG("GFX\n"); 10862306a36Sopenharmony_ci amdgpu_ucode_print_common_hdr(hdr); 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci if (version_major == 1) { 11162306a36Sopenharmony_ci const struct gfx_firmware_header_v1_0 *gfx_hdr = 11262306a36Sopenharmony_ci container_of(hdr, struct gfx_firmware_header_v1_0, header); 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci DRM_DEBUG("ucode_feature_version: %u\n", 11562306a36Sopenharmony_ci le32_to_cpu(gfx_hdr->ucode_feature_version)); 11662306a36Sopenharmony_ci DRM_DEBUG("jt_offset: %u\n", le32_to_cpu(gfx_hdr->jt_offset)); 11762306a36Sopenharmony_ci DRM_DEBUG("jt_size: %u\n", le32_to_cpu(gfx_hdr->jt_size)); 11862306a36Sopenharmony_ci } else if (version_major == 2) { 11962306a36Sopenharmony_ci const struct gfx_firmware_header_v2_0 *gfx_hdr = 12062306a36Sopenharmony_ci container_of(hdr, struct gfx_firmware_header_v2_0, header); 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci DRM_DEBUG("ucode_feature_version: %u\n", 12362306a36Sopenharmony_ci le32_to_cpu(gfx_hdr->ucode_feature_version)); 12462306a36Sopenharmony_ci } else { 12562306a36Sopenharmony_ci DRM_ERROR("Unknown GFX ucode version: %u.%u\n", version_major, version_minor); 12662306a36Sopenharmony_ci } 12762306a36Sopenharmony_ci} 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_civoid amdgpu_ucode_print_rlc_hdr(const struct common_firmware_header *hdr) 13062306a36Sopenharmony_ci{ 13162306a36Sopenharmony_ci uint16_t version_major = le16_to_cpu(hdr->header_version_major); 13262306a36Sopenharmony_ci uint16_t version_minor = le16_to_cpu(hdr->header_version_minor); 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci DRM_DEBUG("RLC\n"); 13562306a36Sopenharmony_ci amdgpu_ucode_print_common_hdr(hdr); 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci if (version_major == 1) { 13862306a36Sopenharmony_ci const struct rlc_firmware_header_v1_0 *rlc_hdr = 13962306a36Sopenharmony_ci container_of(hdr, struct rlc_firmware_header_v1_0, header); 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci DRM_DEBUG("ucode_feature_version: %u\n", 14262306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->ucode_feature_version)); 14362306a36Sopenharmony_ci DRM_DEBUG("save_and_restore_offset: %u\n", 14462306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->save_and_restore_offset)); 14562306a36Sopenharmony_ci DRM_DEBUG("clear_state_descriptor_offset: %u\n", 14662306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->clear_state_descriptor_offset)); 14762306a36Sopenharmony_ci DRM_DEBUG("avail_scratch_ram_locations: %u\n", 14862306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->avail_scratch_ram_locations)); 14962306a36Sopenharmony_ci DRM_DEBUG("master_pkt_description_offset: %u\n", 15062306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->master_pkt_description_offset)); 15162306a36Sopenharmony_ci } else if (version_major == 2) { 15262306a36Sopenharmony_ci const struct rlc_firmware_header_v2_0 *rlc_hdr = 15362306a36Sopenharmony_ci container_of(hdr, struct rlc_firmware_header_v2_0, header); 15462306a36Sopenharmony_ci const struct rlc_firmware_header_v2_1 *rlc_hdr_v2_1 = 15562306a36Sopenharmony_ci container_of(rlc_hdr, struct rlc_firmware_header_v2_1, v2_0); 15662306a36Sopenharmony_ci const struct rlc_firmware_header_v2_2 *rlc_hdr_v2_2 = 15762306a36Sopenharmony_ci container_of(rlc_hdr_v2_1, struct rlc_firmware_header_v2_2, v2_1); 15862306a36Sopenharmony_ci const struct rlc_firmware_header_v2_3 *rlc_hdr_v2_3 = 15962306a36Sopenharmony_ci container_of(rlc_hdr_v2_2, struct rlc_firmware_header_v2_3, v2_2); 16062306a36Sopenharmony_ci const struct rlc_firmware_header_v2_4 *rlc_hdr_v2_4 = 16162306a36Sopenharmony_ci container_of(rlc_hdr_v2_3, struct rlc_firmware_header_v2_4, v2_3); 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci switch (version_minor) { 16462306a36Sopenharmony_ci case 0: 16562306a36Sopenharmony_ci /* rlc_hdr v2_0 */ 16662306a36Sopenharmony_ci DRM_DEBUG("ucode_feature_version: %u\n", 16762306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->ucode_feature_version)); 16862306a36Sopenharmony_ci DRM_DEBUG("jt_offset: %u\n", le32_to_cpu(rlc_hdr->jt_offset)); 16962306a36Sopenharmony_ci DRM_DEBUG("jt_size: %u\n", le32_to_cpu(rlc_hdr->jt_size)); 17062306a36Sopenharmony_ci DRM_DEBUG("save_and_restore_offset: %u\n", 17162306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->save_and_restore_offset)); 17262306a36Sopenharmony_ci DRM_DEBUG("clear_state_descriptor_offset: %u\n", 17362306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->clear_state_descriptor_offset)); 17462306a36Sopenharmony_ci DRM_DEBUG("avail_scratch_ram_locations: %u\n", 17562306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->avail_scratch_ram_locations)); 17662306a36Sopenharmony_ci DRM_DEBUG("reg_restore_list_size: %u\n", 17762306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->reg_restore_list_size)); 17862306a36Sopenharmony_ci DRM_DEBUG("reg_list_format_start: %u\n", 17962306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->reg_list_format_start)); 18062306a36Sopenharmony_ci DRM_DEBUG("reg_list_format_separate_start: %u\n", 18162306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->reg_list_format_separate_start)); 18262306a36Sopenharmony_ci DRM_DEBUG("starting_offsets_start: %u\n", 18362306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->starting_offsets_start)); 18462306a36Sopenharmony_ci DRM_DEBUG("reg_list_format_size_bytes: %u\n", 18562306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->reg_list_format_size_bytes)); 18662306a36Sopenharmony_ci DRM_DEBUG("reg_list_format_array_offset_bytes: %u\n", 18762306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->reg_list_format_array_offset_bytes)); 18862306a36Sopenharmony_ci DRM_DEBUG("reg_list_size_bytes: %u\n", 18962306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->reg_list_size_bytes)); 19062306a36Sopenharmony_ci DRM_DEBUG("reg_list_array_offset_bytes: %u\n", 19162306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->reg_list_array_offset_bytes)); 19262306a36Sopenharmony_ci DRM_DEBUG("reg_list_format_separate_size_bytes: %u\n", 19362306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->reg_list_format_separate_size_bytes)); 19462306a36Sopenharmony_ci DRM_DEBUG("reg_list_format_separate_array_offset_bytes: %u\n", 19562306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->reg_list_format_separate_array_offset_bytes)); 19662306a36Sopenharmony_ci DRM_DEBUG("reg_list_separate_size_bytes: %u\n", 19762306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->reg_list_separate_size_bytes)); 19862306a36Sopenharmony_ci DRM_DEBUG("reg_list_separate_array_offset_bytes: %u\n", 19962306a36Sopenharmony_ci le32_to_cpu(rlc_hdr->reg_list_separate_array_offset_bytes)); 20062306a36Sopenharmony_ci break; 20162306a36Sopenharmony_ci case 1: 20262306a36Sopenharmony_ci /* rlc_hdr v2_1 */ 20362306a36Sopenharmony_ci DRM_DEBUG("reg_list_format_direct_reg_list_length: %u\n", 20462306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_1->reg_list_format_direct_reg_list_length)); 20562306a36Sopenharmony_ci DRM_DEBUG("save_restore_list_cntl_ucode_ver: %u\n", 20662306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_1->save_restore_list_cntl_ucode_ver)); 20762306a36Sopenharmony_ci DRM_DEBUG("save_restore_list_cntl_feature_ver: %u\n", 20862306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_1->save_restore_list_cntl_feature_ver)); 20962306a36Sopenharmony_ci DRM_DEBUG("save_restore_list_cntl_size_bytes %u\n", 21062306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_1->save_restore_list_cntl_size_bytes)); 21162306a36Sopenharmony_ci DRM_DEBUG("save_restore_list_cntl_offset_bytes: %u\n", 21262306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_1->save_restore_list_cntl_offset_bytes)); 21362306a36Sopenharmony_ci DRM_DEBUG("save_restore_list_gpm_ucode_ver: %u\n", 21462306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_1->save_restore_list_gpm_ucode_ver)); 21562306a36Sopenharmony_ci DRM_DEBUG("save_restore_list_gpm_feature_ver: %u\n", 21662306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_1->save_restore_list_gpm_feature_ver)); 21762306a36Sopenharmony_ci DRM_DEBUG("save_restore_list_gpm_size_bytes %u\n", 21862306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_1->save_restore_list_gpm_size_bytes)); 21962306a36Sopenharmony_ci DRM_DEBUG("save_restore_list_gpm_offset_bytes: %u\n", 22062306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_1->save_restore_list_gpm_offset_bytes)); 22162306a36Sopenharmony_ci DRM_DEBUG("save_restore_list_srm_ucode_ver: %u\n", 22262306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_1->save_restore_list_srm_ucode_ver)); 22362306a36Sopenharmony_ci DRM_DEBUG("save_restore_list_srm_feature_ver: %u\n", 22462306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_1->save_restore_list_srm_feature_ver)); 22562306a36Sopenharmony_ci DRM_DEBUG("save_restore_list_srm_size_bytes %u\n", 22662306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_1->save_restore_list_srm_size_bytes)); 22762306a36Sopenharmony_ci DRM_DEBUG("save_restore_list_srm_offset_bytes: %u\n", 22862306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_1->save_restore_list_srm_offset_bytes)); 22962306a36Sopenharmony_ci break; 23062306a36Sopenharmony_ci case 2: 23162306a36Sopenharmony_ci /* rlc_hdr v2_2 */ 23262306a36Sopenharmony_ci DRM_DEBUG("rlc_iram_ucode_size_bytes: %u\n", 23362306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_2->rlc_iram_ucode_size_bytes)); 23462306a36Sopenharmony_ci DRM_DEBUG("rlc_iram_ucode_offset_bytes: %u\n", 23562306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_2->rlc_iram_ucode_offset_bytes)); 23662306a36Sopenharmony_ci DRM_DEBUG("rlc_dram_ucode_size_bytes: %u\n", 23762306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_2->rlc_dram_ucode_size_bytes)); 23862306a36Sopenharmony_ci DRM_DEBUG("rlc_dram_ucode_offset_bytes: %u\n", 23962306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_2->rlc_dram_ucode_offset_bytes)); 24062306a36Sopenharmony_ci break; 24162306a36Sopenharmony_ci case 3: 24262306a36Sopenharmony_ci /* rlc_hdr v2_3 */ 24362306a36Sopenharmony_ci DRM_DEBUG("rlcp_ucode_version: %u\n", 24462306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_3->rlcp_ucode_version)); 24562306a36Sopenharmony_ci DRM_DEBUG("rlcp_ucode_feature_version: %u\n", 24662306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_3->rlcp_ucode_feature_version)); 24762306a36Sopenharmony_ci DRM_DEBUG("rlcp_ucode_size_bytes: %u\n", 24862306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_3->rlcp_ucode_size_bytes)); 24962306a36Sopenharmony_ci DRM_DEBUG("rlcp_ucode_offset_bytes: %u\n", 25062306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_3->rlcp_ucode_offset_bytes)); 25162306a36Sopenharmony_ci DRM_DEBUG("rlcv_ucode_version: %u\n", 25262306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_3->rlcv_ucode_version)); 25362306a36Sopenharmony_ci DRM_DEBUG("rlcv_ucode_feature_version: %u\n", 25462306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_3->rlcv_ucode_feature_version)); 25562306a36Sopenharmony_ci DRM_DEBUG("rlcv_ucode_size_bytes: %u\n", 25662306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_3->rlcv_ucode_size_bytes)); 25762306a36Sopenharmony_ci DRM_DEBUG("rlcv_ucode_offset_bytes: %u\n", 25862306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_3->rlcv_ucode_offset_bytes)); 25962306a36Sopenharmony_ci break; 26062306a36Sopenharmony_ci case 4: 26162306a36Sopenharmony_ci /* rlc_hdr v2_4 */ 26262306a36Sopenharmony_ci DRM_DEBUG("global_tap_delays_ucode_size_bytes :%u\n", 26362306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_4->global_tap_delays_ucode_size_bytes)); 26462306a36Sopenharmony_ci DRM_DEBUG("global_tap_delays_ucode_offset_bytes: %u\n", 26562306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_4->global_tap_delays_ucode_offset_bytes)); 26662306a36Sopenharmony_ci DRM_DEBUG("se0_tap_delays_ucode_size_bytes :%u\n", 26762306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_4->se0_tap_delays_ucode_size_bytes)); 26862306a36Sopenharmony_ci DRM_DEBUG("se0_tap_delays_ucode_offset_bytes: %u\n", 26962306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_4->se0_tap_delays_ucode_offset_bytes)); 27062306a36Sopenharmony_ci DRM_DEBUG("se1_tap_delays_ucode_size_bytes :%u\n", 27162306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_4->se1_tap_delays_ucode_size_bytes)); 27262306a36Sopenharmony_ci DRM_DEBUG("se1_tap_delays_ucode_offset_bytes: %u\n", 27362306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_4->se1_tap_delays_ucode_offset_bytes)); 27462306a36Sopenharmony_ci DRM_DEBUG("se2_tap_delays_ucode_size_bytes :%u\n", 27562306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_4->se2_tap_delays_ucode_size_bytes)); 27662306a36Sopenharmony_ci DRM_DEBUG("se2_tap_delays_ucode_offset_bytes: %u\n", 27762306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_4->se2_tap_delays_ucode_offset_bytes)); 27862306a36Sopenharmony_ci DRM_DEBUG("se3_tap_delays_ucode_size_bytes :%u\n", 27962306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_4->se3_tap_delays_ucode_size_bytes)); 28062306a36Sopenharmony_ci DRM_DEBUG("se3_tap_delays_ucode_offset_bytes: %u\n", 28162306a36Sopenharmony_ci le32_to_cpu(rlc_hdr_v2_4->se3_tap_delays_ucode_offset_bytes)); 28262306a36Sopenharmony_ci break; 28362306a36Sopenharmony_ci default: 28462306a36Sopenharmony_ci DRM_ERROR("Unknown RLC v2 ucode: v2.%u\n", version_minor); 28562306a36Sopenharmony_ci break; 28662306a36Sopenharmony_ci } 28762306a36Sopenharmony_ci } else { 28862306a36Sopenharmony_ci DRM_ERROR("Unknown RLC ucode version: %u.%u\n", version_major, version_minor); 28962306a36Sopenharmony_ci } 29062306a36Sopenharmony_ci} 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_civoid amdgpu_ucode_print_sdma_hdr(const struct common_firmware_header *hdr) 29362306a36Sopenharmony_ci{ 29462306a36Sopenharmony_ci uint16_t version_major = le16_to_cpu(hdr->header_version_major); 29562306a36Sopenharmony_ci uint16_t version_minor = le16_to_cpu(hdr->header_version_minor); 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci DRM_DEBUG("SDMA\n"); 29862306a36Sopenharmony_ci amdgpu_ucode_print_common_hdr(hdr); 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci if (version_major == 1) { 30162306a36Sopenharmony_ci const struct sdma_firmware_header_v1_0 *sdma_hdr = 30262306a36Sopenharmony_ci container_of(hdr, struct sdma_firmware_header_v1_0, header); 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci DRM_DEBUG("ucode_feature_version: %u\n", 30562306a36Sopenharmony_ci le32_to_cpu(sdma_hdr->ucode_feature_version)); 30662306a36Sopenharmony_ci DRM_DEBUG("ucode_change_version: %u\n", 30762306a36Sopenharmony_ci le32_to_cpu(sdma_hdr->ucode_change_version)); 30862306a36Sopenharmony_ci DRM_DEBUG("jt_offset: %u\n", le32_to_cpu(sdma_hdr->jt_offset)); 30962306a36Sopenharmony_ci DRM_DEBUG("jt_size: %u\n", le32_to_cpu(sdma_hdr->jt_size)); 31062306a36Sopenharmony_ci if (version_minor >= 1) { 31162306a36Sopenharmony_ci const struct sdma_firmware_header_v1_1 *sdma_v1_1_hdr = 31262306a36Sopenharmony_ci container_of(sdma_hdr, struct sdma_firmware_header_v1_1, v1_0); 31362306a36Sopenharmony_ci DRM_DEBUG("digest_size: %u\n", le32_to_cpu(sdma_v1_1_hdr->digest_size)); 31462306a36Sopenharmony_ci } 31562306a36Sopenharmony_ci } else if (version_major == 2) { 31662306a36Sopenharmony_ci const struct sdma_firmware_header_v2_0 *sdma_hdr = 31762306a36Sopenharmony_ci container_of(hdr, struct sdma_firmware_header_v2_0, header); 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci DRM_DEBUG("ucode_feature_version: %u\n", 32062306a36Sopenharmony_ci le32_to_cpu(sdma_hdr->ucode_feature_version)); 32162306a36Sopenharmony_ci DRM_DEBUG("ctx_jt_offset: %u\n", le32_to_cpu(sdma_hdr->ctx_jt_offset)); 32262306a36Sopenharmony_ci DRM_DEBUG("ctx_jt_size: %u\n", le32_to_cpu(sdma_hdr->ctx_jt_size)); 32362306a36Sopenharmony_ci DRM_DEBUG("ctl_ucode_offset: %u\n", le32_to_cpu(sdma_hdr->ctl_ucode_offset)); 32462306a36Sopenharmony_ci DRM_DEBUG("ctl_jt_offset: %u\n", le32_to_cpu(sdma_hdr->ctl_jt_offset)); 32562306a36Sopenharmony_ci DRM_DEBUG("ctl_jt_size: %u\n", le32_to_cpu(sdma_hdr->ctl_jt_size)); 32662306a36Sopenharmony_ci } else { 32762306a36Sopenharmony_ci DRM_ERROR("Unknown SDMA ucode version: %u.%u\n", 32862306a36Sopenharmony_ci version_major, version_minor); 32962306a36Sopenharmony_ci } 33062306a36Sopenharmony_ci} 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_civoid amdgpu_ucode_print_psp_hdr(const struct common_firmware_header *hdr) 33362306a36Sopenharmony_ci{ 33462306a36Sopenharmony_ci uint16_t version_major = le16_to_cpu(hdr->header_version_major); 33562306a36Sopenharmony_ci uint16_t version_minor = le16_to_cpu(hdr->header_version_minor); 33662306a36Sopenharmony_ci uint32_t fw_index; 33762306a36Sopenharmony_ci const struct psp_fw_bin_desc *desc; 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci DRM_DEBUG("PSP\n"); 34062306a36Sopenharmony_ci amdgpu_ucode_print_common_hdr(hdr); 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci if (version_major == 1) { 34362306a36Sopenharmony_ci const struct psp_firmware_header_v1_0 *psp_hdr = 34462306a36Sopenharmony_ci container_of(hdr, struct psp_firmware_header_v1_0, header); 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci DRM_DEBUG("ucode_feature_version: %u\n", 34762306a36Sopenharmony_ci le32_to_cpu(psp_hdr->sos.fw_version)); 34862306a36Sopenharmony_ci DRM_DEBUG("sos_offset_bytes: %u\n", 34962306a36Sopenharmony_ci le32_to_cpu(psp_hdr->sos.offset_bytes)); 35062306a36Sopenharmony_ci DRM_DEBUG("sos_size_bytes: %u\n", 35162306a36Sopenharmony_ci le32_to_cpu(psp_hdr->sos.size_bytes)); 35262306a36Sopenharmony_ci if (version_minor == 1) { 35362306a36Sopenharmony_ci const struct psp_firmware_header_v1_1 *psp_hdr_v1_1 = 35462306a36Sopenharmony_ci container_of(psp_hdr, struct psp_firmware_header_v1_1, v1_0); 35562306a36Sopenharmony_ci DRM_DEBUG("toc_header_version: %u\n", 35662306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_1->toc.fw_version)); 35762306a36Sopenharmony_ci DRM_DEBUG("toc_offset_bytes: %u\n", 35862306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_1->toc.offset_bytes)); 35962306a36Sopenharmony_ci DRM_DEBUG("toc_size_bytes: %u\n", 36062306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_1->toc.size_bytes)); 36162306a36Sopenharmony_ci DRM_DEBUG("kdb_header_version: %u\n", 36262306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_1->kdb.fw_version)); 36362306a36Sopenharmony_ci DRM_DEBUG("kdb_offset_bytes: %u\n", 36462306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_1->kdb.offset_bytes)); 36562306a36Sopenharmony_ci DRM_DEBUG("kdb_size_bytes: %u\n", 36662306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_1->kdb.size_bytes)); 36762306a36Sopenharmony_ci } 36862306a36Sopenharmony_ci if (version_minor == 2) { 36962306a36Sopenharmony_ci const struct psp_firmware_header_v1_2 *psp_hdr_v1_2 = 37062306a36Sopenharmony_ci container_of(psp_hdr, struct psp_firmware_header_v1_2, v1_0); 37162306a36Sopenharmony_ci DRM_DEBUG("kdb_header_version: %u\n", 37262306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_2->kdb.fw_version)); 37362306a36Sopenharmony_ci DRM_DEBUG("kdb_offset_bytes: %u\n", 37462306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_2->kdb.offset_bytes)); 37562306a36Sopenharmony_ci DRM_DEBUG("kdb_size_bytes: %u\n", 37662306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_2->kdb.size_bytes)); 37762306a36Sopenharmony_ci } 37862306a36Sopenharmony_ci if (version_minor == 3) { 37962306a36Sopenharmony_ci const struct psp_firmware_header_v1_1 *psp_hdr_v1_1 = 38062306a36Sopenharmony_ci container_of(psp_hdr, struct psp_firmware_header_v1_1, v1_0); 38162306a36Sopenharmony_ci const struct psp_firmware_header_v1_3 *psp_hdr_v1_3 = 38262306a36Sopenharmony_ci container_of(psp_hdr_v1_1, struct psp_firmware_header_v1_3, v1_1); 38362306a36Sopenharmony_ci DRM_DEBUG("toc_header_version: %u\n", 38462306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_3->v1_1.toc.fw_version)); 38562306a36Sopenharmony_ci DRM_DEBUG("toc_offset_bytes: %u\n", 38662306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_3->v1_1.toc.offset_bytes)); 38762306a36Sopenharmony_ci DRM_DEBUG("toc_size_bytes: %u\n", 38862306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_3->v1_1.toc.size_bytes)); 38962306a36Sopenharmony_ci DRM_DEBUG("kdb_header_version: %u\n", 39062306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_3->v1_1.kdb.fw_version)); 39162306a36Sopenharmony_ci DRM_DEBUG("kdb_offset_bytes: %u\n", 39262306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_3->v1_1.kdb.offset_bytes)); 39362306a36Sopenharmony_ci DRM_DEBUG("kdb_size_bytes: %u\n", 39462306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_3->v1_1.kdb.size_bytes)); 39562306a36Sopenharmony_ci DRM_DEBUG("spl_header_version: %u\n", 39662306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_3->spl.fw_version)); 39762306a36Sopenharmony_ci DRM_DEBUG("spl_offset_bytes: %u\n", 39862306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_3->spl.offset_bytes)); 39962306a36Sopenharmony_ci DRM_DEBUG("spl_size_bytes: %u\n", 40062306a36Sopenharmony_ci le32_to_cpu(psp_hdr_v1_3->spl.size_bytes)); 40162306a36Sopenharmony_ci } 40262306a36Sopenharmony_ci } else if (version_major == 2) { 40362306a36Sopenharmony_ci const struct psp_firmware_header_v2_0 *psp_hdr_v2_0 = 40462306a36Sopenharmony_ci container_of(hdr, struct psp_firmware_header_v2_0, header); 40562306a36Sopenharmony_ci for (fw_index = 0; fw_index < le32_to_cpu(psp_hdr_v2_0->psp_fw_bin_count); fw_index++) { 40662306a36Sopenharmony_ci desc = &(psp_hdr_v2_0->psp_fw_bin[fw_index]); 40762306a36Sopenharmony_ci switch (desc->fw_type) { 40862306a36Sopenharmony_ci case PSP_FW_TYPE_PSP_SOS: 40962306a36Sopenharmony_ci DRM_DEBUG("psp_sos_version: %u\n", 41062306a36Sopenharmony_ci le32_to_cpu(desc->fw_version)); 41162306a36Sopenharmony_ci DRM_DEBUG("psp_sos_size_bytes: %u\n", 41262306a36Sopenharmony_ci le32_to_cpu(desc->size_bytes)); 41362306a36Sopenharmony_ci break; 41462306a36Sopenharmony_ci case PSP_FW_TYPE_PSP_SYS_DRV: 41562306a36Sopenharmony_ci DRM_DEBUG("psp_sys_drv_version: %u\n", 41662306a36Sopenharmony_ci le32_to_cpu(desc->fw_version)); 41762306a36Sopenharmony_ci DRM_DEBUG("psp_sys_drv_size_bytes: %u\n", 41862306a36Sopenharmony_ci le32_to_cpu(desc->size_bytes)); 41962306a36Sopenharmony_ci break; 42062306a36Sopenharmony_ci case PSP_FW_TYPE_PSP_KDB: 42162306a36Sopenharmony_ci DRM_DEBUG("psp_kdb_version: %u\n", 42262306a36Sopenharmony_ci le32_to_cpu(desc->fw_version)); 42362306a36Sopenharmony_ci DRM_DEBUG("psp_kdb_size_bytes: %u\n", 42462306a36Sopenharmony_ci le32_to_cpu(desc->size_bytes)); 42562306a36Sopenharmony_ci break; 42662306a36Sopenharmony_ci case PSP_FW_TYPE_PSP_TOC: 42762306a36Sopenharmony_ci DRM_DEBUG("psp_toc_version: %u\n", 42862306a36Sopenharmony_ci le32_to_cpu(desc->fw_version)); 42962306a36Sopenharmony_ci DRM_DEBUG("psp_toc_size_bytes: %u\n", 43062306a36Sopenharmony_ci le32_to_cpu(desc->size_bytes)); 43162306a36Sopenharmony_ci break; 43262306a36Sopenharmony_ci case PSP_FW_TYPE_PSP_SPL: 43362306a36Sopenharmony_ci DRM_DEBUG("psp_spl_version: %u\n", 43462306a36Sopenharmony_ci le32_to_cpu(desc->fw_version)); 43562306a36Sopenharmony_ci DRM_DEBUG("psp_spl_size_bytes: %u\n", 43662306a36Sopenharmony_ci le32_to_cpu(desc->size_bytes)); 43762306a36Sopenharmony_ci break; 43862306a36Sopenharmony_ci case PSP_FW_TYPE_PSP_RL: 43962306a36Sopenharmony_ci DRM_DEBUG("psp_rl_version: %u\n", 44062306a36Sopenharmony_ci le32_to_cpu(desc->fw_version)); 44162306a36Sopenharmony_ci DRM_DEBUG("psp_rl_size_bytes: %u\n", 44262306a36Sopenharmony_ci le32_to_cpu(desc->size_bytes)); 44362306a36Sopenharmony_ci break; 44462306a36Sopenharmony_ci case PSP_FW_TYPE_PSP_SOC_DRV: 44562306a36Sopenharmony_ci DRM_DEBUG("psp_soc_drv_version: %u\n", 44662306a36Sopenharmony_ci le32_to_cpu(desc->fw_version)); 44762306a36Sopenharmony_ci DRM_DEBUG("psp_soc_drv_size_bytes: %u\n", 44862306a36Sopenharmony_ci le32_to_cpu(desc->size_bytes)); 44962306a36Sopenharmony_ci break; 45062306a36Sopenharmony_ci case PSP_FW_TYPE_PSP_INTF_DRV: 45162306a36Sopenharmony_ci DRM_DEBUG("psp_intf_drv_version: %u\n", 45262306a36Sopenharmony_ci le32_to_cpu(desc->fw_version)); 45362306a36Sopenharmony_ci DRM_DEBUG("psp_intf_drv_size_bytes: %u\n", 45462306a36Sopenharmony_ci le32_to_cpu(desc->size_bytes)); 45562306a36Sopenharmony_ci break; 45662306a36Sopenharmony_ci case PSP_FW_TYPE_PSP_DBG_DRV: 45762306a36Sopenharmony_ci DRM_DEBUG("psp_dbg_drv_version: %u\n", 45862306a36Sopenharmony_ci le32_to_cpu(desc->fw_version)); 45962306a36Sopenharmony_ci DRM_DEBUG("psp_dbg_drv_size_bytes: %u\n", 46062306a36Sopenharmony_ci le32_to_cpu(desc->size_bytes)); 46162306a36Sopenharmony_ci break; 46262306a36Sopenharmony_ci case PSP_FW_TYPE_PSP_RAS_DRV: 46362306a36Sopenharmony_ci DRM_DEBUG("psp_ras_drv_version: %u\n", 46462306a36Sopenharmony_ci le32_to_cpu(desc->fw_version)); 46562306a36Sopenharmony_ci DRM_DEBUG("psp_ras_drv_size_bytes: %u\n", 46662306a36Sopenharmony_ci le32_to_cpu(desc->size_bytes)); 46762306a36Sopenharmony_ci break; 46862306a36Sopenharmony_ci default: 46962306a36Sopenharmony_ci DRM_DEBUG("Unsupported PSP fw type: %d\n", desc->fw_type); 47062306a36Sopenharmony_ci break; 47162306a36Sopenharmony_ci } 47262306a36Sopenharmony_ci } 47362306a36Sopenharmony_ci } else { 47462306a36Sopenharmony_ci DRM_ERROR("Unknown PSP ucode version: %u.%u\n", 47562306a36Sopenharmony_ci version_major, version_minor); 47662306a36Sopenharmony_ci } 47762306a36Sopenharmony_ci} 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_civoid amdgpu_ucode_print_gpu_info_hdr(const struct common_firmware_header *hdr) 48062306a36Sopenharmony_ci{ 48162306a36Sopenharmony_ci uint16_t version_major = le16_to_cpu(hdr->header_version_major); 48262306a36Sopenharmony_ci uint16_t version_minor = le16_to_cpu(hdr->header_version_minor); 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci DRM_DEBUG("GPU_INFO\n"); 48562306a36Sopenharmony_ci amdgpu_ucode_print_common_hdr(hdr); 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_ci if (version_major == 1) { 48862306a36Sopenharmony_ci const struct gpu_info_firmware_header_v1_0 *gpu_info_hdr = 48962306a36Sopenharmony_ci container_of(hdr, struct gpu_info_firmware_header_v1_0, header); 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ci DRM_DEBUG("version_major: %u\n", 49262306a36Sopenharmony_ci le16_to_cpu(gpu_info_hdr->version_major)); 49362306a36Sopenharmony_ci DRM_DEBUG("version_minor: %u\n", 49462306a36Sopenharmony_ci le16_to_cpu(gpu_info_hdr->version_minor)); 49562306a36Sopenharmony_ci } else { 49662306a36Sopenharmony_ci DRM_ERROR("Unknown gpu_info ucode version: %u.%u\n", version_major, version_minor); 49762306a36Sopenharmony_ci } 49862306a36Sopenharmony_ci} 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_cistatic int amdgpu_ucode_validate(const struct firmware *fw) 50162306a36Sopenharmony_ci{ 50262306a36Sopenharmony_ci const struct common_firmware_header *hdr = 50362306a36Sopenharmony_ci (const struct common_firmware_header *)fw->data; 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_ci if (fw->size == le32_to_cpu(hdr->size_bytes)) 50662306a36Sopenharmony_ci return 0; 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci return -EINVAL; 50962306a36Sopenharmony_ci} 51062306a36Sopenharmony_ci 51162306a36Sopenharmony_cibool amdgpu_ucode_hdr_version(union amdgpu_firmware_header *hdr, 51262306a36Sopenharmony_ci uint16_t hdr_major, uint16_t hdr_minor) 51362306a36Sopenharmony_ci{ 51462306a36Sopenharmony_ci if ((hdr->common.header_version_major == hdr_major) && 51562306a36Sopenharmony_ci (hdr->common.header_version_minor == hdr_minor)) 51662306a36Sopenharmony_ci return true; 51762306a36Sopenharmony_ci return false; 51862306a36Sopenharmony_ci} 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_cienum amdgpu_firmware_load_type 52162306a36Sopenharmony_ciamdgpu_ucode_get_load_type(struct amdgpu_device *adev, int load_type) 52262306a36Sopenharmony_ci{ 52362306a36Sopenharmony_ci switch (adev->asic_type) { 52462306a36Sopenharmony_ci#ifdef CONFIG_DRM_AMDGPU_SI 52562306a36Sopenharmony_ci case CHIP_TAHITI: 52662306a36Sopenharmony_ci case CHIP_PITCAIRN: 52762306a36Sopenharmony_ci case CHIP_VERDE: 52862306a36Sopenharmony_ci case CHIP_OLAND: 52962306a36Sopenharmony_ci case CHIP_HAINAN: 53062306a36Sopenharmony_ci return AMDGPU_FW_LOAD_DIRECT; 53162306a36Sopenharmony_ci#endif 53262306a36Sopenharmony_ci#ifdef CONFIG_DRM_AMDGPU_CIK 53362306a36Sopenharmony_ci case CHIP_BONAIRE: 53462306a36Sopenharmony_ci case CHIP_KAVERI: 53562306a36Sopenharmony_ci case CHIP_KABINI: 53662306a36Sopenharmony_ci case CHIP_HAWAII: 53762306a36Sopenharmony_ci case CHIP_MULLINS: 53862306a36Sopenharmony_ci return AMDGPU_FW_LOAD_DIRECT; 53962306a36Sopenharmony_ci#endif 54062306a36Sopenharmony_ci case CHIP_TOPAZ: 54162306a36Sopenharmony_ci case CHIP_TONGA: 54262306a36Sopenharmony_ci case CHIP_FIJI: 54362306a36Sopenharmony_ci case CHIP_CARRIZO: 54462306a36Sopenharmony_ci case CHIP_STONEY: 54562306a36Sopenharmony_ci case CHIP_POLARIS10: 54662306a36Sopenharmony_ci case CHIP_POLARIS11: 54762306a36Sopenharmony_ci case CHIP_POLARIS12: 54862306a36Sopenharmony_ci case CHIP_VEGAM: 54962306a36Sopenharmony_ci return AMDGPU_FW_LOAD_SMU; 55062306a36Sopenharmony_ci case CHIP_CYAN_SKILLFISH: 55162306a36Sopenharmony_ci if (!(load_type && 55262306a36Sopenharmony_ci adev->apu_flags & AMD_APU_IS_CYAN_SKILLFISH2)) 55362306a36Sopenharmony_ci return AMDGPU_FW_LOAD_DIRECT; 55462306a36Sopenharmony_ci else 55562306a36Sopenharmony_ci return AMDGPU_FW_LOAD_PSP; 55662306a36Sopenharmony_ci default: 55762306a36Sopenharmony_ci if (!load_type) 55862306a36Sopenharmony_ci return AMDGPU_FW_LOAD_DIRECT; 55962306a36Sopenharmony_ci else 56062306a36Sopenharmony_ci return AMDGPU_FW_LOAD_PSP; 56162306a36Sopenharmony_ci } 56262306a36Sopenharmony_ci} 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ciconst char *amdgpu_ucode_name(enum AMDGPU_UCODE_ID ucode_id) 56562306a36Sopenharmony_ci{ 56662306a36Sopenharmony_ci switch (ucode_id) { 56762306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SDMA0: 56862306a36Sopenharmony_ci return "SDMA0"; 56962306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SDMA1: 57062306a36Sopenharmony_ci return "SDMA1"; 57162306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SDMA2: 57262306a36Sopenharmony_ci return "SDMA2"; 57362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SDMA3: 57462306a36Sopenharmony_ci return "SDMA3"; 57562306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SDMA4: 57662306a36Sopenharmony_ci return "SDMA4"; 57762306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SDMA5: 57862306a36Sopenharmony_ci return "SDMA5"; 57962306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SDMA6: 58062306a36Sopenharmony_ci return "SDMA6"; 58162306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SDMA7: 58262306a36Sopenharmony_ci return "SDMA7"; 58362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SDMA_UCODE_TH0: 58462306a36Sopenharmony_ci return "SDMA_CTX"; 58562306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SDMA_UCODE_TH1: 58662306a36Sopenharmony_ci return "SDMA_CTL"; 58762306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_CE: 58862306a36Sopenharmony_ci return "CP_CE"; 58962306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_PFP: 59062306a36Sopenharmony_ci return "CP_PFP"; 59162306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_ME: 59262306a36Sopenharmony_ci return "CP_ME"; 59362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MEC1: 59462306a36Sopenharmony_ci return "CP_MEC1"; 59562306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MEC1_JT: 59662306a36Sopenharmony_ci return "CP_MEC1_JT"; 59762306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MEC2: 59862306a36Sopenharmony_ci return "CP_MEC2"; 59962306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MEC2_JT: 60062306a36Sopenharmony_ci return "CP_MEC2_JT"; 60162306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MES: 60262306a36Sopenharmony_ci return "CP_MES"; 60362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MES_DATA: 60462306a36Sopenharmony_ci return "CP_MES_DATA"; 60562306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MES1: 60662306a36Sopenharmony_ci return "CP_MES_KIQ"; 60762306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MES1_DATA: 60862306a36Sopenharmony_ci return "CP_MES_KIQ_DATA"; 60962306a36Sopenharmony_ci case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL: 61062306a36Sopenharmony_ci return "RLC_RESTORE_LIST_CNTL"; 61162306a36Sopenharmony_ci case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM: 61262306a36Sopenharmony_ci return "RLC_RESTORE_LIST_GPM_MEM"; 61362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM: 61462306a36Sopenharmony_ci return "RLC_RESTORE_LIST_SRM_MEM"; 61562306a36Sopenharmony_ci case AMDGPU_UCODE_ID_RLC_IRAM: 61662306a36Sopenharmony_ci return "RLC_IRAM"; 61762306a36Sopenharmony_ci case AMDGPU_UCODE_ID_RLC_DRAM: 61862306a36Sopenharmony_ci return "RLC_DRAM"; 61962306a36Sopenharmony_ci case AMDGPU_UCODE_ID_RLC_G: 62062306a36Sopenharmony_ci return "RLC_G"; 62162306a36Sopenharmony_ci case AMDGPU_UCODE_ID_RLC_P: 62262306a36Sopenharmony_ci return "RLC_P"; 62362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_RLC_V: 62462306a36Sopenharmony_ci return "RLC_V"; 62562306a36Sopenharmony_ci case AMDGPU_UCODE_ID_GLOBAL_TAP_DELAYS: 62662306a36Sopenharmony_ci return "GLOBAL_TAP_DELAYS"; 62762306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SE0_TAP_DELAYS: 62862306a36Sopenharmony_ci return "SE0_TAP_DELAYS"; 62962306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SE1_TAP_DELAYS: 63062306a36Sopenharmony_ci return "SE1_TAP_DELAYS"; 63162306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SE2_TAP_DELAYS: 63262306a36Sopenharmony_ci return "SE2_TAP_DELAYS"; 63362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SE3_TAP_DELAYS: 63462306a36Sopenharmony_ci return "SE3_TAP_DELAYS"; 63562306a36Sopenharmony_ci case AMDGPU_UCODE_ID_IMU_I: 63662306a36Sopenharmony_ci return "IMU_I"; 63762306a36Sopenharmony_ci case AMDGPU_UCODE_ID_IMU_D: 63862306a36Sopenharmony_ci return "IMU_D"; 63962306a36Sopenharmony_ci case AMDGPU_UCODE_ID_STORAGE: 64062306a36Sopenharmony_ci return "STORAGE"; 64162306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SMC: 64262306a36Sopenharmony_ci return "SMC"; 64362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_PPTABLE: 64462306a36Sopenharmony_ci return "PPTABLE"; 64562306a36Sopenharmony_ci case AMDGPU_UCODE_ID_UVD: 64662306a36Sopenharmony_ci return "UVD"; 64762306a36Sopenharmony_ci case AMDGPU_UCODE_ID_UVD1: 64862306a36Sopenharmony_ci return "UVD1"; 64962306a36Sopenharmony_ci case AMDGPU_UCODE_ID_VCE: 65062306a36Sopenharmony_ci return "VCE"; 65162306a36Sopenharmony_ci case AMDGPU_UCODE_ID_VCN: 65262306a36Sopenharmony_ci return "VCN"; 65362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_VCN1: 65462306a36Sopenharmony_ci return "VCN1"; 65562306a36Sopenharmony_ci case AMDGPU_UCODE_ID_DMCU_ERAM: 65662306a36Sopenharmony_ci return "DMCU_ERAM"; 65762306a36Sopenharmony_ci case AMDGPU_UCODE_ID_DMCU_INTV: 65862306a36Sopenharmony_ci return "DMCU_INTV"; 65962306a36Sopenharmony_ci case AMDGPU_UCODE_ID_VCN0_RAM: 66062306a36Sopenharmony_ci return "VCN0_RAM"; 66162306a36Sopenharmony_ci case AMDGPU_UCODE_ID_VCN1_RAM: 66262306a36Sopenharmony_ci return "VCN1_RAM"; 66362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_DMCUB: 66462306a36Sopenharmony_ci return "DMCUB"; 66562306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CAP: 66662306a36Sopenharmony_ci return "CAP"; 66762306a36Sopenharmony_ci default: 66862306a36Sopenharmony_ci return "UNKNOWN UCODE"; 66962306a36Sopenharmony_ci } 67062306a36Sopenharmony_ci} 67162306a36Sopenharmony_ci 67262306a36Sopenharmony_ci#define FW_VERSION_ATTR(name, mode, field) \ 67362306a36Sopenharmony_cistatic ssize_t show_##name(struct device *dev, \ 67462306a36Sopenharmony_ci struct device_attribute *attr, \ 67562306a36Sopenharmony_ci char *buf) \ 67662306a36Sopenharmony_ci{ \ 67762306a36Sopenharmony_ci struct drm_device *ddev = dev_get_drvdata(dev); \ 67862306a36Sopenharmony_ci struct amdgpu_device *adev = drm_to_adev(ddev); \ 67962306a36Sopenharmony_ci \ 68062306a36Sopenharmony_ci return sysfs_emit(buf, "0x%08x\n", adev->field); \ 68162306a36Sopenharmony_ci} \ 68262306a36Sopenharmony_cistatic DEVICE_ATTR(name, mode, show_##name, NULL) 68362306a36Sopenharmony_ci 68462306a36Sopenharmony_ciFW_VERSION_ATTR(vce_fw_version, 0444, vce.fw_version); 68562306a36Sopenharmony_ciFW_VERSION_ATTR(uvd_fw_version, 0444, uvd.fw_version); 68662306a36Sopenharmony_ciFW_VERSION_ATTR(mc_fw_version, 0444, gmc.fw_version); 68762306a36Sopenharmony_ciFW_VERSION_ATTR(me_fw_version, 0444, gfx.me_fw_version); 68862306a36Sopenharmony_ciFW_VERSION_ATTR(pfp_fw_version, 0444, gfx.pfp_fw_version); 68962306a36Sopenharmony_ciFW_VERSION_ATTR(ce_fw_version, 0444, gfx.ce_fw_version); 69062306a36Sopenharmony_ciFW_VERSION_ATTR(rlc_fw_version, 0444, gfx.rlc_fw_version); 69162306a36Sopenharmony_ciFW_VERSION_ATTR(rlc_srlc_fw_version, 0444, gfx.rlc_srlc_fw_version); 69262306a36Sopenharmony_ciFW_VERSION_ATTR(rlc_srlg_fw_version, 0444, gfx.rlc_srlg_fw_version); 69362306a36Sopenharmony_ciFW_VERSION_ATTR(rlc_srls_fw_version, 0444, gfx.rlc_srls_fw_version); 69462306a36Sopenharmony_ciFW_VERSION_ATTR(mec_fw_version, 0444, gfx.mec_fw_version); 69562306a36Sopenharmony_ciFW_VERSION_ATTR(mec2_fw_version, 0444, gfx.mec2_fw_version); 69662306a36Sopenharmony_ciFW_VERSION_ATTR(imu_fw_version, 0444, gfx.imu_fw_version); 69762306a36Sopenharmony_ciFW_VERSION_ATTR(sos_fw_version, 0444, psp.sos.fw_version); 69862306a36Sopenharmony_ciFW_VERSION_ATTR(asd_fw_version, 0444, psp.asd_context.bin_desc.fw_version); 69962306a36Sopenharmony_ciFW_VERSION_ATTR(ta_ras_fw_version, 0444, psp.ras_context.context.bin_desc.fw_version); 70062306a36Sopenharmony_ciFW_VERSION_ATTR(ta_xgmi_fw_version, 0444, psp.xgmi_context.context.bin_desc.fw_version); 70162306a36Sopenharmony_ciFW_VERSION_ATTR(smc_fw_version, 0444, pm.fw_version); 70262306a36Sopenharmony_ciFW_VERSION_ATTR(sdma_fw_version, 0444, sdma.instance[0].fw_version); 70362306a36Sopenharmony_ciFW_VERSION_ATTR(sdma2_fw_version, 0444, sdma.instance[1].fw_version); 70462306a36Sopenharmony_ciFW_VERSION_ATTR(vcn_fw_version, 0444, vcn.fw_version); 70562306a36Sopenharmony_ciFW_VERSION_ATTR(dmcu_fw_version, 0444, dm.dmcu_fw_version); 70662306a36Sopenharmony_ciFW_VERSION_ATTR(mes_fw_version, 0444, mes.sched_version & AMDGPU_MES_VERSION_MASK); 70762306a36Sopenharmony_ciFW_VERSION_ATTR(mes_kiq_fw_version, 0444, mes.kiq_version & AMDGPU_MES_VERSION_MASK); 70862306a36Sopenharmony_ci 70962306a36Sopenharmony_cistatic struct attribute *fw_attrs[] = { 71062306a36Sopenharmony_ci &dev_attr_vce_fw_version.attr, &dev_attr_uvd_fw_version.attr, 71162306a36Sopenharmony_ci &dev_attr_mc_fw_version.attr, &dev_attr_me_fw_version.attr, 71262306a36Sopenharmony_ci &dev_attr_pfp_fw_version.attr, &dev_attr_ce_fw_version.attr, 71362306a36Sopenharmony_ci &dev_attr_rlc_fw_version.attr, &dev_attr_rlc_srlc_fw_version.attr, 71462306a36Sopenharmony_ci &dev_attr_rlc_srlg_fw_version.attr, &dev_attr_rlc_srls_fw_version.attr, 71562306a36Sopenharmony_ci &dev_attr_mec_fw_version.attr, &dev_attr_mec2_fw_version.attr, 71662306a36Sopenharmony_ci &dev_attr_sos_fw_version.attr, &dev_attr_asd_fw_version.attr, 71762306a36Sopenharmony_ci &dev_attr_ta_ras_fw_version.attr, &dev_attr_ta_xgmi_fw_version.attr, 71862306a36Sopenharmony_ci &dev_attr_smc_fw_version.attr, &dev_attr_sdma_fw_version.attr, 71962306a36Sopenharmony_ci &dev_attr_sdma2_fw_version.attr, &dev_attr_vcn_fw_version.attr, 72062306a36Sopenharmony_ci &dev_attr_dmcu_fw_version.attr, &dev_attr_imu_fw_version.attr, 72162306a36Sopenharmony_ci &dev_attr_mes_fw_version.attr, &dev_attr_mes_kiq_fw_version.attr, 72262306a36Sopenharmony_ci NULL 72362306a36Sopenharmony_ci}; 72462306a36Sopenharmony_ci 72562306a36Sopenharmony_cistatic const struct attribute_group fw_attr_group = { 72662306a36Sopenharmony_ci .name = "fw_version", 72762306a36Sopenharmony_ci .attrs = fw_attrs 72862306a36Sopenharmony_ci}; 72962306a36Sopenharmony_ci 73062306a36Sopenharmony_ciint amdgpu_ucode_sysfs_init(struct amdgpu_device *adev) 73162306a36Sopenharmony_ci{ 73262306a36Sopenharmony_ci return sysfs_create_group(&adev->dev->kobj, &fw_attr_group); 73362306a36Sopenharmony_ci} 73462306a36Sopenharmony_ci 73562306a36Sopenharmony_civoid amdgpu_ucode_sysfs_fini(struct amdgpu_device *adev) 73662306a36Sopenharmony_ci{ 73762306a36Sopenharmony_ci sysfs_remove_group(&adev->dev->kobj, &fw_attr_group); 73862306a36Sopenharmony_ci} 73962306a36Sopenharmony_ci 74062306a36Sopenharmony_cistatic int amdgpu_ucode_init_single_fw(struct amdgpu_device *adev, 74162306a36Sopenharmony_ci struct amdgpu_firmware_info *ucode, 74262306a36Sopenharmony_ci uint64_t mc_addr, void *kptr) 74362306a36Sopenharmony_ci{ 74462306a36Sopenharmony_ci const struct common_firmware_header *header = NULL; 74562306a36Sopenharmony_ci const struct gfx_firmware_header_v1_0 *cp_hdr = NULL; 74662306a36Sopenharmony_ci const struct gfx_firmware_header_v2_0 *cpv2_hdr = NULL; 74762306a36Sopenharmony_ci const struct dmcu_firmware_header_v1_0 *dmcu_hdr = NULL; 74862306a36Sopenharmony_ci const struct dmcub_firmware_header_v1_0 *dmcub_hdr = NULL; 74962306a36Sopenharmony_ci const struct mes_firmware_header_v1_0 *mes_hdr = NULL; 75062306a36Sopenharmony_ci const struct sdma_firmware_header_v2_0 *sdma_hdr = NULL; 75162306a36Sopenharmony_ci const struct imu_firmware_header_v1_0 *imu_hdr = NULL; 75262306a36Sopenharmony_ci u8 *ucode_addr; 75362306a36Sopenharmony_ci 75462306a36Sopenharmony_ci if (!ucode->fw) 75562306a36Sopenharmony_ci return 0; 75662306a36Sopenharmony_ci 75762306a36Sopenharmony_ci ucode->mc_addr = mc_addr; 75862306a36Sopenharmony_ci ucode->kaddr = kptr; 75962306a36Sopenharmony_ci 76062306a36Sopenharmony_ci if (ucode->ucode_id == AMDGPU_UCODE_ID_STORAGE) 76162306a36Sopenharmony_ci return 0; 76262306a36Sopenharmony_ci 76362306a36Sopenharmony_ci header = (const struct common_firmware_header *)ucode->fw->data; 76462306a36Sopenharmony_ci cp_hdr = (const struct gfx_firmware_header_v1_0 *)ucode->fw->data; 76562306a36Sopenharmony_ci cpv2_hdr = (const struct gfx_firmware_header_v2_0 *)ucode->fw->data; 76662306a36Sopenharmony_ci dmcu_hdr = (const struct dmcu_firmware_header_v1_0 *)ucode->fw->data; 76762306a36Sopenharmony_ci dmcub_hdr = (const struct dmcub_firmware_header_v1_0 *)ucode->fw->data; 76862306a36Sopenharmony_ci mes_hdr = (const struct mes_firmware_header_v1_0 *)ucode->fw->data; 76962306a36Sopenharmony_ci sdma_hdr = (const struct sdma_firmware_header_v2_0 *)ucode->fw->data; 77062306a36Sopenharmony_ci imu_hdr = (const struct imu_firmware_header_v1_0 *)ucode->fw->data; 77162306a36Sopenharmony_ci 77262306a36Sopenharmony_ci if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { 77362306a36Sopenharmony_ci switch (ucode->ucode_id) { 77462306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SDMA_UCODE_TH0: 77562306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(sdma_hdr->ctx_ucode_size_bytes); 77662306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 77762306a36Sopenharmony_ci le32_to_cpu(sdma_hdr->header.ucode_array_offset_bytes); 77862306a36Sopenharmony_ci break; 77962306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SDMA_UCODE_TH1: 78062306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(sdma_hdr->ctl_ucode_size_bytes); 78162306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 78262306a36Sopenharmony_ci le32_to_cpu(sdma_hdr->ctl_ucode_offset); 78362306a36Sopenharmony_ci break; 78462306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MEC1: 78562306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MEC2: 78662306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(header->ucode_size_bytes) - 78762306a36Sopenharmony_ci le32_to_cpu(cp_hdr->jt_size) * 4; 78862306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 78962306a36Sopenharmony_ci le32_to_cpu(header->ucode_array_offset_bytes); 79062306a36Sopenharmony_ci break; 79162306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MEC1_JT: 79262306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MEC2_JT: 79362306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(cp_hdr->jt_size) * 4; 79462306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 79562306a36Sopenharmony_ci le32_to_cpu(header->ucode_array_offset_bytes) + 79662306a36Sopenharmony_ci le32_to_cpu(cp_hdr->jt_offset) * 4; 79762306a36Sopenharmony_ci break; 79862306a36Sopenharmony_ci case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL: 79962306a36Sopenharmony_ci ucode->ucode_size = adev->gfx.rlc.save_restore_list_cntl_size_bytes; 80062306a36Sopenharmony_ci ucode_addr = adev->gfx.rlc.save_restore_list_cntl; 80162306a36Sopenharmony_ci break; 80262306a36Sopenharmony_ci case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM: 80362306a36Sopenharmony_ci ucode->ucode_size = adev->gfx.rlc.save_restore_list_gpm_size_bytes; 80462306a36Sopenharmony_ci ucode_addr = adev->gfx.rlc.save_restore_list_gpm; 80562306a36Sopenharmony_ci break; 80662306a36Sopenharmony_ci case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM: 80762306a36Sopenharmony_ci ucode->ucode_size = adev->gfx.rlc.save_restore_list_srm_size_bytes; 80862306a36Sopenharmony_ci ucode_addr = adev->gfx.rlc.save_restore_list_srm; 80962306a36Sopenharmony_ci break; 81062306a36Sopenharmony_ci case AMDGPU_UCODE_ID_RLC_IRAM: 81162306a36Sopenharmony_ci ucode->ucode_size = adev->gfx.rlc.rlc_iram_ucode_size_bytes; 81262306a36Sopenharmony_ci ucode_addr = adev->gfx.rlc.rlc_iram_ucode; 81362306a36Sopenharmony_ci break; 81462306a36Sopenharmony_ci case AMDGPU_UCODE_ID_RLC_DRAM: 81562306a36Sopenharmony_ci ucode->ucode_size = adev->gfx.rlc.rlc_dram_ucode_size_bytes; 81662306a36Sopenharmony_ci ucode_addr = adev->gfx.rlc.rlc_dram_ucode; 81762306a36Sopenharmony_ci break; 81862306a36Sopenharmony_ci case AMDGPU_UCODE_ID_RLC_P: 81962306a36Sopenharmony_ci ucode->ucode_size = adev->gfx.rlc.rlcp_ucode_size_bytes; 82062306a36Sopenharmony_ci ucode_addr = adev->gfx.rlc.rlcp_ucode; 82162306a36Sopenharmony_ci break; 82262306a36Sopenharmony_ci case AMDGPU_UCODE_ID_RLC_V: 82362306a36Sopenharmony_ci ucode->ucode_size = adev->gfx.rlc.rlcv_ucode_size_bytes; 82462306a36Sopenharmony_ci ucode_addr = adev->gfx.rlc.rlcv_ucode; 82562306a36Sopenharmony_ci break; 82662306a36Sopenharmony_ci case AMDGPU_UCODE_ID_GLOBAL_TAP_DELAYS: 82762306a36Sopenharmony_ci ucode->ucode_size = adev->gfx.rlc.global_tap_delays_ucode_size_bytes; 82862306a36Sopenharmony_ci ucode_addr = adev->gfx.rlc.global_tap_delays_ucode; 82962306a36Sopenharmony_ci break; 83062306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SE0_TAP_DELAYS: 83162306a36Sopenharmony_ci ucode->ucode_size = adev->gfx.rlc.se0_tap_delays_ucode_size_bytes; 83262306a36Sopenharmony_ci ucode_addr = adev->gfx.rlc.se0_tap_delays_ucode; 83362306a36Sopenharmony_ci break; 83462306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SE1_TAP_DELAYS: 83562306a36Sopenharmony_ci ucode->ucode_size = adev->gfx.rlc.se1_tap_delays_ucode_size_bytes; 83662306a36Sopenharmony_ci ucode_addr = adev->gfx.rlc.se1_tap_delays_ucode; 83762306a36Sopenharmony_ci break; 83862306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SE2_TAP_DELAYS: 83962306a36Sopenharmony_ci ucode->ucode_size = adev->gfx.rlc.se2_tap_delays_ucode_size_bytes; 84062306a36Sopenharmony_ci ucode_addr = adev->gfx.rlc.se2_tap_delays_ucode; 84162306a36Sopenharmony_ci break; 84262306a36Sopenharmony_ci case AMDGPU_UCODE_ID_SE3_TAP_DELAYS: 84362306a36Sopenharmony_ci ucode->ucode_size = adev->gfx.rlc.se3_tap_delays_ucode_size_bytes; 84462306a36Sopenharmony_ci ucode_addr = adev->gfx.rlc.se3_tap_delays_ucode; 84562306a36Sopenharmony_ci break; 84662306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MES: 84762306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(mes_hdr->mes_ucode_size_bytes); 84862306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 84962306a36Sopenharmony_ci le32_to_cpu(mes_hdr->mes_ucode_offset_bytes); 85062306a36Sopenharmony_ci break; 85162306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MES_DATA: 85262306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(mes_hdr->mes_ucode_data_size_bytes); 85362306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 85462306a36Sopenharmony_ci le32_to_cpu(mes_hdr->mes_ucode_data_offset_bytes); 85562306a36Sopenharmony_ci break; 85662306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MES1: 85762306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(mes_hdr->mes_ucode_size_bytes); 85862306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 85962306a36Sopenharmony_ci le32_to_cpu(mes_hdr->mes_ucode_offset_bytes); 86062306a36Sopenharmony_ci break; 86162306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_MES1_DATA: 86262306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(mes_hdr->mes_ucode_data_size_bytes); 86362306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 86462306a36Sopenharmony_ci le32_to_cpu(mes_hdr->mes_ucode_data_offset_bytes); 86562306a36Sopenharmony_ci break; 86662306a36Sopenharmony_ci case AMDGPU_UCODE_ID_DMCU_ERAM: 86762306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(header->ucode_size_bytes) - 86862306a36Sopenharmony_ci le32_to_cpu(dmcu_hdr->intv_size_bytes); 86962306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 87062306a36Sopenharmony_ci le32_to_cpu(header->ucode_array_offset_bytes); 87162306a36Sopenharmony_ci break; 87262306a36Sopenharmony_ci case AMDGPU_UCODE_ID_DMCU_INTV: 87362306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(dmcu_hdr->intv_size_bytes); 87462306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 87562306a36Sopenharmony_ci le32_to_cpu(header->ucode_array_offset_bytes) + 87662306a36Sopenharmony_ci le32_to_cpu(dmcu_hdr->intv_offset_bytes); 87762306a36Sopenharmony_ci break; 87862306a36Sopenharmony_ci case AMDGPU_UCODE_ID_DMCUB: 87962306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(dmcub_hdr->inst_const_bytes); 88062306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 88162306a36Sopenharmony_ci le32_to_cpu(header->ucode_array_offset_bytes); 88262306a36Sopenharmony_ci break; 88362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_PPTABLE: 88462306a36Sopenharmony_ci ucode->ucode_size = ucode->fw->size; 88562306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data; 88662306a36Sopenharmony_ci break; 88762306a36Sopenharmony_ci case AMDGPU_UCODE_ID_IMU_I: 88862306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(imu_hdr->imu_iram_ucode_size_bytes); 88962306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 89062306a36Sopenharmony_ci le32_to_cpu(imu_hdr->header.ucode_array_offset_bytes); 89162306a36Sopenharmony_ci break; 89262306a36Sopenharmony_ci case AMDGPU_UCODE_ID_IMU_D: 89362306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(imu_hdr->imu_dram_ucode_size_bytes); 89462306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 89562306a36Sopenharmony_ci le32_to_cpu(imu_hdr->header.ucode_array_offset_bytes) + 89662306a36Sopenharmony_ci le32_to_cpu(imu_hdr->imu_iram_ucode_size_bytes); 89762306a36Sopenharmony_ci break; 89862306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_RS64_PFP: 89962306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(cpv2_hdr->ucode_size_bytes); 90062306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 90162306a36Sopenharmony_ci le32_to_cpu(header->ucode_array_offset_bytes); 90262306a36Sopenharmony_ci break; 90362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_RS64_PFP_P0_STACK: 90462306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(cpv2_hdr->data_size_bytes); 90562306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 90662306a36Sopenharmony_ci le32_to_cpu(cpv2_hdr->data_offset_bytes); 90762306a36Sopenharmony_ci break; 90862306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_RS64_PFP_P1_STACK: 90962306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(cpv2_hdr->data_size_bytes); 91062306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 91162306a36Sopenharmony_ci le32_to_cpu(cpv2_hdr->data_offset_bytes); 91262306a36Sopenharmony_ci break; 91362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_RS64_ME: 91462306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(cpv2_hdr->ucode_size_bytes); 91562306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 91662306a36Sopenharmony_ci le32_to_cpu(header->ucode_array_offset_bytes); 91762306a36Sopenharmony_ci break; 91862306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_RS64_ME_P0_STACK: 91962306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(cpv2_hdr->data_size_bytes); 92062306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 92162306a36Sopenharmony_ci le32_to_cpu(cpv2_hdr->data_offset_bytes); 92262306a36Sopenharmony_ci break; 92362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_RS64_ME_P1_STACK: 92462306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(cpv2_hdr->data_size_bytes); 92562306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 92662306a36Sopenharmony_ci le32_to_cpu(cpv2_hdr->data_offset_bytes); 92762306a36Sopenharmony_ci break; 92862306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_RS64_MEC: 92962306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(cpv2_hdr->ucode_size_bytes); 93062306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 93162306a36Sopenharmony_ci le32_to_cpu(header->ucode_array_offset_bytes); 93262306a36Sopenharmony_ci break; 93362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_RS64_MEC_P0_STACK: 93462306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(cpv2_hdr->data_size_bytes); 93562306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 93662306a36Sopenharmony_ci le32_to_cpu(cpv2_hdr->data_offset_bytes); 93762306a36Sopenharmony_ci break; 93862306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_RS64_MEC_P1_STACK: 93962306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(cpv2_hdr->data_size_bytes); 94062306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 94162306a36Sopenharmony_ci le32_to_cpu(cpv2_hdr->data_offset_bytes); 94262306a36Sopenharmony_ci break; 94362306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_RS64_MEC_P2_STACK: 94462306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(cpv2_hdr->data_size_bytes); 94562306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 94662306a36Sopenharmony_ci le32_to_cpu(cpv2_hdr->data_offset_bytes); 94762306a36Sopenharmony_ci break; 94862306a36Sopenharmony_ci case AMDGPU_UCODE_ID_CP_RS64_MEC_P3_STACK: 94962306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(cpv2_hdr->data_size_bytes); 95062306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 95162306a36Sopenharmony_ci le32_to_cpu(cpv2_hdr->data_offset_bytes); 95262306a36Sopenharmony_ci break; 95362306a36Sopenharmony_ci default: 95462306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(header->ucode_size_bytes); 95562306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 95662306a36Sopenharmony_ci le32_to_cpu(header->ucode_array_offset_bytes); 95762306a36Sopenharmony_ci break; 95862306a36Sopenharmony_ci } 95962306a36Sopenharmony_ci } else { 96062306a36Sopenharmony_ci ucode->ucode_size = le32_to_cpu(header->ucode_size_bytes); 96162306a36Sopenharmony_ci ucode_addr = (u8 *)ucode->fw->data + 96262306a36Sopenharmony_ci le32_to_cpu(header->ucode_array_offset_bytes); 96362306a36Sopenharmony_ci } 96462306a36Sopenharmony_ci 96562306a36Sopenharmony_ci memcpy(ucode->kaddr, ucode_addr, ucode->ucode_size); 96662306a36Sopenharmony_ci 96762306a36Sopenharmony_ci return 0; 96862306a36Sopenharmony_ci} 96962306a36Sopenharmony_ci 97062306a36Sopenharmony_cistatic int amdgpu_ucode_patch_jt(struct amdgpu_firmware_info *ucode, 97162306a36Sopenharmony_ci uint64_t mc_addr, void *kptr) 97262306a36Sopenharmony_ci{ 97362306a36Sopenharmony_ci const struct gfx_firmware_header_v1_0 *header = NULL; 97462306a36Sopenharmony_ci const struct common_firmware_header *comm_hdr = NULL; 97562306a36Sopenharmony_ci uint8_t *src_addr = NULL; 97662306a36Sopenharmony_ci uint8_t *dst_addr = NULL; 97762306a36Sopenharmony_ci 97862306a36Sopenharmony_ci if (!ucode->fw) 97962306a36Sopenharmony_ci return 0; 98062306a36Sopenharmony_ci 98162306a36Sopenharmony_ci comm_hdr = (const struct common_firmware_header *)ucode->fw->data; 98262306a36Sopenharmony_ci header = (const struct gfx_firmware_header_v1_0 *)ucode->fw->data; 98362306a36Sopenharmony_ci dst_addr = ucode->kaddr + 98462306a36Sopenharmony_ci ALIGN(le32_to_cpu(comm_hdr->ucode_size_bytes), 98562306a36Sopenharmony_ci PAGE_SIZE); 98662306a36Sopenharmony_ci src_addr = (uint8_t *)ucode->fw->data + 98762306a36Sopenharmony_ci le32_to_cpu(comm_hdr->ucode_array_offset_bytes) + 98862306a36Sopenharmony_ci (le32_to_cpu(header->jt_offset) * 4); 98962306a36Sopenharmony_ci memcpy(dst_addr, src_addr, le32_to_cpu(header->jt_size) * 4); 99062306a36Sopenharmony_ci 99162306a36Sopenharmony_ci return 0; 99262306a36Sopenharmony_ci} 99362306a36Sopenharmony_ci 99462306a36Sopenharmony_ciint amdgpu_ucode_create_bo(struct amdgpu_device *adev) 99562306a36Sopenharmony_ci{ 99662306a36Sopenharmony_ci if (adev->firmware.load_type != AMDGPU_FW_LOAD_DIRECT) { 99762306a36Sopenharmony_ci amdgpu_bo_create_kernel(adev, adev->firmware.fw_size, PAGE_SIZE, 99862306a36Sopenharmony_ci amdgpu_sriov_vf(adev) ? AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT, 99962306a36Sopenharmony_ci &adev->firmware.fw_buf, 100062306a36Sopenharmony_ci &adev->firmware.fw_buf_mc, 100162306a36Sopenharmony_ci &adev->firmware.fw_buf_ptr); 100262306a36Sopenharmony_ci if (!adev->firmware.fw_buf) { 100362306a36Sopenharmony_ci dev_err(adev->dev, "failed to create kernel buffer for firmware.fw_buf\n"); 100462306a36Sopenharmony_ci return -ENOMEM; 100562306a36Sopenharmony_ci } else if (amdgpu_sriov_vf(adev)) { 100662306a36Sopenharmony_ci memset(adev->firmware.fw_buf_ptr, 0, adev->firmware.fw_size); 100762306a36Sopenharmony_ci } 100862306a36Sopenharmony_ci } 100962306a36Sopenharmony_ci return 0; 101062306a36Sopenharmony_ci} 101162306a36Sopenharmony_ci 101262306a36Sopenharmony_civoid amdgpu_ucode_free_bo(struct amdgpu_device *adev) 101362306a36Sopenharmony_ci{ 101462306a36Sopenharmony_ci amdgpu_bo_free_kernel(&adev->firmware.fw_buf, 101562306a36Sopenharmony_ci &adev->firmware.fw_buf_mc, 101662306a36Sopenharmony_ci &adev->firmware.fw_buf_ptr); 101762306a36Sopenharmony_ci} 101862306a36Sopenharmony_ci 101962306a36Sopenharmony_ciint amdgpu_ucode_init_bo(struct amdgpu_device *adev) 102062306a36Sopenharmony_ci{ 102162306a36Sopenharmony_ci uint64_t fw_offset = 0; 102262306a36Sopenharmony_ci int i; 102362306a36Sopenharmony_ci struct amdgpu_firmware_info *ucode = NULL; 102462306a36Sopenharmony_ci 102562306a36Sopenharmony_ci /* for baremetal, the ucode is allocated in gtt, so don't need to fill the bo when reset/suspend */ 102662306a36Sopenharmony_ci if (!amdgpu_sriov_vf(adev) && (amdgpu_in_reset(adev) || adev->in_suspend)) 102762306a36Sopenharmony_ci return 0; 102862306a36Sopenharmony_ci /* 102962306a36Sopenharmony_ci * if SMU loaded firmware, it needn't add SMC, UVD, and VCE 103062306a36Sopenharmony_ci * ucode info here 103162306a36Sopenharmony_ci */ 103262306a36Sopenharmony_ci if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) { 103362306a36Sopenharmony_ci if (amdgpu_sriov_vf(adev)) 103462306a36Sopenharmony_ci adev->firmware.max_ucodes = AMDGPU_UCODE_ID_MAXIMUM - 3; 103562306a36Sopenharmony_ci else 103662306a36Sopenharmony_ci adev->firmware.max_ucodes = AMDGPU_UCODE_ID_MAXIMUM - 4; 103762306a36Sopenharmony_ci } else { 103862306a36Sopenharmony_ci adev->firmware.max_ucodes = AMDGPU_UCODE_ID_MAXIMUM; 103962306a36Sopenharmony_ci } 104062306a36Sopenharmony_ci 104162306a36Sopenharmony_ci for (i = 0; i < adev->firmware.max_ucodes; i++) { 104262306a36Sopenharmony_ci ucode = &adev->firmware.ucode[i]; 104362306a36Sopenharmony_ci if (ucode->fw) { 104462306a36Sopenharmony_ci amdgpu_ucode_init_single_fw(adev, ucode, adev->firmware.fw_buf_mc + fw_offset, 104562306a36Sopenharmony_ci adev->firmware.fw_buf_ptr + fw_offset); 104662306a36Sopenharmony_ci if (i == AMDGPU_UCODE_ID_CP_MEC1 && 104762306a36Sopenharmony_ci adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) { 104862306a36Sopenharmony_ci const struct gfx_firmware_header_v1_0 *cp_hdr; 104962306a36Sopenharmony_ci 105062306a36Sopenharmony_ci cp_hdr = (const struct gfx_firmware_header_v1_0 *)ucode->fw->data; 105162306a36Sopenharmony_ci amdgpu_ucode_patch_jt(ucode, adev->firmware.fw_buf_mc + fw_offset, 105262306a36Sopenharmony_ci adev->firmware.fw_buf_ptr + fw_offset); 105362306a36Sopenharmony_ci fw_offset += ALIGN(le32_to_cpu(cp_hdr->jt_size) << 2, PAGE_SIZE); 105462306a36Sopenharmony_ci } 105562306a36Sopenharmony_ci fw_offset += ALIGN(ucode->ucode_size, PAGE_SIZE); 105662306a36Sopenharmony_ci } 105762306a36Sopenharmony_ci } 105862306a36Sopenharmony_ci return 0; 105962306a36Sopenharmony_ci} 106062306a36Sopenharmony_ci 106162306a36Sopenharmony_cistatic const char *amdgpu_ucode_legacy_naming(struct amdgpu_device *adev, int block_type) 106262306a36Sopenharmony_ci{ 106362306a36Sopenharmony_ci if (block_type == MP0_HWIP) { 106462306a36Sopenharmony_ci switch (adev->ip_versions[MP0_HWIP][0]) { 106562306a36Sopenharmony_ci case IP_VERSION(9, 0, 0): 106662306a36Sopenharmony_ci switch (adev->asic_type) { 106762306a36Sopenharmony_ci case CHIP_VEGA10: 106862306a36Sopenharmony_ci return "vega10"; 106962306a36Sopenharmony_ci case CHIP_VEGA12: 107062306a36Sopenharmony_ci return "vega12"; 107162306a36Sopenharmony_ci default: 107262306a36Sopenharmony_ci return NULL; 107362306a36Sopenharmony_ci } 107462306a36Sopenharmony_ci case IP_VERSION(10, 0, 0): 107562306a36Sopenharmony_ci case IP_VERSION(10, 0, 1): 107662306a36Sopenharmony_ci if (adev->asic_type == CHIP_RAVEN) { 107762306a36Sopenharmony_ci if (adev->apu_flags & AMD_APU_IS_RAVEN2) 107862306a36Sopenharmony_ci return "raven2"; 107962306a36Sopenharmony_ci else if (adev->apu_flags & AMD_APU_IS_PICASSO) 108062306a36Sopenharmony_ci return "picasso"; 108162306a36Sopenharmony_ci return "raven"; 108262306a36Sopenharmony_ci } 108362306a36Sopenharmony_ci break; 108462306a36Sopenharmony_ci case IP_VERSION(11, 0, 0): 108562306a36Sopenharmony_ci return "navi10"; 108662306a36Sopenharmony_ci case IP_VERSION(11, 0, 2): 108762306a36Sopenharmony_ci return "vega20"; 108862306a36Sopenharmony_ci case IP_VERSION(11, 0, 3): 108962306a36Sopenharmony_ci return "renoir"; 109062306a36Sopenharmony_ci case IP_VERSION(11, 0, 4): 109162306a36Sopenharmony_ci return "arcturus"; 109262306a36Sopenharmony_ci case IP_VERSION(11, 0, 5): 109362306a36Sopenharmony_ci return "navi14"; 109462306a36Sopenharmony_ci case IP_VERSION(11, 0, 7): 109562306a36Sopenharmony_ci return "sienna_cichlid"; 109662306a36Sopenharmony_ci case IP_VERSION(11, 0, 9): 109762306a36Sopenharmony_ci return "navi12"; 109862306a36Sopenharmony_ci case IP_VERSION(11, 0, 11): 109962306a36Sopenharmony_ci return "navy_flounder"; 110062306a36Sopenharmony_ci case IP_VERSION(11, 0, 12): 110162306a36Sopenharmony_ci return "dimgrey_cavefish"; 110262306a36Sopenharmony_ci case IP_VERSION(11, 0, 13): 110362306a36Sopenharmony_ci return "beige_goby"; 110462306a36Sopenharmony_ci case IP_VERSION(11, 5, 0): 110562306a36Sopenharmony_ci return "vangogh"; 110662306a36Sopenharmony_ci case IP_VERSION(12, 0, 1): 110762306a36Sopenharmony_ci return "green_sardine"; 110862306a36Sopenharmony_ci case IP_VERSION(13, 0, 2): 110962306a36Sopenharmony_ci return "aldebaran"; 111062306a36Sopenharmony_ci case IP_VERSION(13, 0, 1): 111162306a36Sopenharmony_ci case IP_VERSION(13, 0, 3): 111262306a36Sopenharmony_ci return "yellow_carp"; 111362306a36Sopenharmony_ci } 111462306a36Sopenharmony_ci } else if (block_type == MP1_HWIP) { 111562306a36Sopenharmony_ci switch (adev->ip_versions[MP1_HWIP][0]) { 111662306a36Sopenharmony_ci case IP_VERSION(9, 0, 0): 111762306a36Sopenharmony_ci case IP_VERSION(10, 0, 0): 111862306a36Sopenharmony_ci case IP_VERSION(10, 0, 1): 111962306a36Sopenharmony_ci case IP_VERSION(11, 0, 2): 112062306a36Sopenharmony_ci if (adev->asic_type == CHIP_ARCTURUS) 112162306a36Sopenharmony_ci return "arcturus_smc"; 112262306a36Sopenharmony_ci return NULL; 112362306a36Sopenharmony_ci case IP_VERSION(11, 0, 0): 112462306a36Sopenharmony_ci return "navi10_smc"; 112562306a36Sopenharmony_ci case IP_VERSION(11, 0, 5): 112662306a36Sopenharmony_ci return "navi14_smc"; 112762306a36Sopenharmony_ci case IP_VERSION(11, 0, 9): 112862306a36Sopenharmony_ci return "navi12_smc"; 112962306a36Sopenharmony_ci case IP_VERSION(11, 0, 7): 113062306a36Sopenharmony_ci return "sienna_cichlid_smc"; 113162306a36Sopenharmony_ci case IP_VERSION(11, 0, 11): 113262306a36Sopenharmony_ci return "navy_flounder_smc"; 113362306a36Sopenharmony_ci case IP_VERSION(11, 0, 12): 113462306a36Sopenharmony_ci return "dimgrey_cavefish_smc"; 113562306a36Sopenharmony_ci case IP_VERSION(11, 0, 13): 113662306a36Sopenharmony_ci return "beige_goby_smc"; 113762306a36Sopenharmony_ci case IP_VERSION(13, 0, 2): 113862306a36Sopenharmony_ci return "aldebaran_smc"; 113962306a36Sopenharmony_ci } 114062306a36Sopenharmony_ci } else if (block_type == SDMA0_HWIP) { 114162306a36Sopenharmony_ci switch (adev->ip_versions[SDMA0_HWIP][0]) { 114262306a36Sopenharmony_ci case IP_VERSION(4, 0, 0): 114362306a36Sopenharmony_ci return "vega10_sdma"; 114462306a36Sopenharmony_ci case IP_VERSION(4, 0, 1): 114562306a36Sopenharmony_ci return "vega12_sdma"; 114662306a36Sopenharmony_ci case IP_VERSION(4, 1, 0): 114762306a36Sopenharmony_ci case IP_VERSION(4, 1, 1): 114862306a36Sopenharmony_ci if (adev->apu_flags & AMD_APU_IS_RAVEN2) 114962306a36Sopenharmony_ci return "raven2_sdma"; 115062306a36Sopenharmony_ci else if (adev->apu_flags & AMD_APU_IS_PICASSO) 115162306a36Sopenharmony_ci return "picasso_sdma"; 115262306a36Sopenharmony_ci return "raven_sdma"; 115362306a36Sopenharmony_ci case IP_VERSION(4, 1, 2): 115462306a36Sopenharmony_ci if (adev->apu_flags & AMD_APU_IS_RENOIR) 115562306a36Sopenharmony_ci return "renoir_sdma"; 115662306a36Sopenharmony_ci return "green_sardine_sdma"; 115762306a36Sopenharmony_ci case IP_VERSION(4, 2, 0): 115862306a36Sopenharmony_ci return "vega20_sdma"; 115962306a36Sopenharmony_ci case IP_VERSION(4, 2, 2): 116062306a36Sopenharmony_ci return "arcturus_sdma"; 116162306a36Sopenharmony_ci case IP_VERSION(4, 4, 0): 116262306a36Sopenharmony_ci return "aldebaran_sdma"; 116362306a36Sopenharmony_ci case IP_VERSION(5, 0, 0): 116462306a36Sopenharmony_ci return "navi10_sdma"; 116562306a36Sopenharmony_ci case IP_VERSION(5, 0, 1): 116662306a36Sopenharmony_ci return "cyan_skillfish2_sdma"; 116762306a36Sopenharmony_ci case IP_VERSION(5, 0, 2): 116862306a36Sopenharmony_ci return "navi14_sdma"; 116962306a36Sopenharmony_ci case IP_VERSION(5, 0, 5): 117062306a36Sopenharmony_ci return "navi12_sdma"; 117162306a36Sopenharmony_ci case IP_VERSION(5, 2, 0): 117262306a36Sopenharmony_ci return "sienna_cichlid_sdma"; 117362306a36Sopenharmony_ci case IP_VERSION(5, 2, 2): 117462306a36Sopenharmony_ci return "navy_flounder_sdma"; 117562306a36Sopenharmony_ci case IP_VERSION(5, 2, 4): 117662306a36Sopenharmony_ci return "dimgrey_cavefish_sdma"; 117762306a36Sopenharmony_ci case IP_VERSION(5, 2, 5): 117862306a36Sopenharmony_ci return "beige_goby_sdma"; 117962306a36Sopenharmony_ci case IP_VERSION(5, 2, 3): 118062306a36Sopenharmony_ci return "yellow_carp_sdma"; 118162306a36Sopenharmony_ci case IP_VERSION(5, 2, 1): 118262306a36Sopenharmony_ci return "vangogh_sdma"; 118362306a36Sopenharmony_ci } 118462306a36Sopenharmony_ci } else if (block_type == UVD_HWIP) { 118562306a36Sopenharmony_ci switch (adev->ip_versions[UVD_HWIP][0]) { 118662306a36Sopenharmony_ci case IP_VERSION(1, 0, 0): 118762306a36Sopenharmony_ci case IP_VERSION(1, 0, 1): 118862306a36Sopenharmony_ci if (adev->apu_flags & AMD_APU_IS_RAVEN2) 118962306a36Sopenharmony_ci return "raven2_vcn"; 119062306a36Sopenharmony_ci else if (adev->apu_flags & AMD_APU_IS_PICASSO) 119162306a36Sopenharmony_ci return "picasso_vcn"; 119262306a36Sopenharmony_ci return "raven_vcn"; 119362306a36Sopenharmony_ci case IP_VERSION(2, 5, 0): 119462306a36Sopenharmony_ci return "arcturus_vcn"; 119562306a36Sopenharmony_ci case IP_VERSION(2, 2, 0): 119662306a36Sopenharmony_ci if (adev->apu_flags & AMD_APU_IS_RENOIR) 119762306a36Sopenharmony_ci return "renoir_vcn"; 119862306a36Sopenharmony_ci return "green_sardine_vcn"; 119962306a36Sopenharmony_ci case IP_VERSION(2, 6, 0): 120062306a36Sopenharmony_ci return "aldebaran_vcn"; 120162306a36Sopenharmony_ci case IP_VERSION(2, 0, 0): 120262306a36Sopenharmony_ci return "navi10_vcn"; 120362306a36Sopenharmony_ci case IP_VERSION(2, 0, 2): 120462306a36Sopenharmony_ci if (adev->asic_type == CHIP_NAVI12) 120562306a36Sopenharmony_ci return "navi12_vcn"; 120662306a36Sopenharmony_ci return "navi14_vcn"; 120762306a36Sopenharmony_ci case IP_VERSION(3, 0, 0): 120862306a36Sopenharmony_ci case IP_VERSION(3, 0, 64): 120962306a36Sopenharmony_ci case IP_VERSION(3, 0, 192): 121062306a36Sopenharmony_ci if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 0)) 121162306a36Sopenharmony_ci return "sienna_cichlid_vcn"; 121262306a36Sopenharmony_ci return "navy_flounder_vcn"; 121362306a36Sopenharmony_ci case IP_VERSION(3, 0, 2): 121462306a36Sopenharmony_ci return "vangogh_vcn"; 121562306a36Sopenharmony_ci case IP_VERSION(3, 0, 16): 121662306a36Sopenharmony_ci return "dimgrey_cavefish_vcn"; 121762306a36Sopenharmony_ci case IP_VERSION(3, 0, 33): 121862306a36Sopenharmony_ci return "beige_goby_vcn"; 121962306a36Sopenharmony_ci case IP_VERSION(3, 1, 1): 122062306a36Sopenharmony_ci return "yellow_carp_vcn"; 122162306a36Sopenharmony_ci } 122262306a36Sopenharmony_ci } else if (block_type == GC_HWIP) { 122362306a36Sopenharmony_ci switch (adev->ip_versions[GC_HWIP][0]) { 122462306a36Sopenharmony_ci case IP_VERSION(9, 0, 1): 122562306a36Sopenharmony_ci return "vega10"; 122662306a36Sopenharmony_ci case IP_VERSION(9, 2, 1): 122762306a36Sopenharmony_ci return "vega12"; 122862306a36Sopenharmony_ci case IP_VERSION(9, 4, 0): 122962306a36Sopenharmony_ci return "vega20"; 123062306a36Sopenharmony_ci case IP_VERSION(9, 2, 2): 123162306a36Sopenharmony_ci case IP_VERSION(9, 1, 0): 123262306a36Sopenharmony_ci if (adev->apu_flags & AMD_APU_IS_RAVEN2) 123362306a36Sopenharmony_ci return "raven2"; 123462306a36Sopenharmony_ci else if (adev->apu_flags & AMD_APU_IS_PICASSO) 123562306a36Sopenharmony_ci return "picasso"; 123662306a36Sopenharmony_ci return "raven"; 123762306a36Sopenharmony_ci case IP_VERSION(9, 4, 1): 123862306a36Sopenharmony_ci return "arcturus"; 123962306a36Sopenharmony_ci case IP_VERSION(9, 3, 0): 124062306a36Sopenharmony_ci if (adev->apu_flags & AMD_APU_IS_RENOIR) 124162306a36Sopenharmony_ci return "renoir"; 124262306a36Sopenharmony_ci return "green_sardine"; 124362306a36Sopenharmony_ci case IP_VERSION(9, 4, 2): 124462306a36Sopenharmony_ci return "aldebaran"; 124562306a36Sopenharmony_ci case IP_VERSION(10, 1, 10): 124662306a36Sopenharmony_ci return "navi10"; 124762306a36Sopenharmony_ci case IP_VERSION(10, 1, 1): 124862306a36Sopenharmony_ci return "navi14"; 124962306a36Sopenharmony_ci case IP_VERSION(10, 1, 2): 125062306a36Sopenharmony_ci return "navi12"; 125162306a36Sopenharmony_ci case IP_VERSION(10, 3, 0): 125262306a36Sopenharmony_ci return "sienna_cichlid"; 125362306a36Sopenharmony_ci case IP_VERSION(10, 3, 2): 125462306a36Sopenharmony_ci return "navy_flounder"; 125562306a36Sopenharmony_ci case IP_VERSION(10, 3, 1): 125662306a36Sopenharmony_ci return "vangogh"; 125762306a36Sopenharmony_ci case IP_VERSION(10, 3, 4): 125862306a36Sopenharmony_ci return "dimgrey_cavefish"; 125962306a36Sopenharmony_ci case IP_VERSION(10, 3, 5): 126062306a36Sopenharmony_ci return "beige_goby"; 126162306a36Sopenharmony_ci case IP_VERSION(10, 3, 3): 126262306a36Sopenharmony_ci return "yellow_carp"; 126362306a36Sopenharmony_ci case IP_VERSION(10, 1, 3): 126462306a36Sopenharmony_ci case IP_VERSION(10, 1, 4): 126562306a36Sopenharmony_ci return "cyan_skillfish2"; 126662306a36Sopenharmony_ci } 126762306a36Sopenharmony_ci } 126862306a36Sopenharmony_ci return NULL; 126962306a36Sopenharmony_ci} 127062306a36Sopenharmony_ci 127162306a36Sopenharmony_civoid amdgpu_ucode_ip_version_decode(struct amdgpu_device *adev, int block_type, char *ucode_prefix, int len) 127262306a36Sopenharmony_ci{ 127362306a36Sopenharmony_ci int maj, min, rev; 127462306a36Sopenharmony_ci char *ip_name; 127562306a36Sopenharmony_ci const char *legacy; 127662306a36Sopenharmony_ci uint32_t version = adev->ip_versions[block_type][0]; 127762306a36Sopenharmony_ci 127862306a36Sopenharmony_ci legacy = amdgpu_ucode_legacy_naming(adev, block_type); 127962306a36Sopenharmony_ci if (legacy) { 128062306a36Sopenharmony_ci snprintf(ucode_prefix, len, "%s", legacy); 128162306a36Sopenharmony_ci return; 128262306a36Sopenharmony_ci } 128362306a36Sopenharmony_ci 128462306a36Sopenharmony_ci switch (block_type) { 128562306a36Sopenharmony_ci case GC_HWIP: 128662306a36Sopenharmony_ci ip_name = "gc"; 128762306a36Sopenharmony_ci break; 128862306a36Sopenharmony_ci case SDMA0_HWIP: 128962306a36Sopenharmony_ci ip_name = "sdma"; 129062306a36Sopenharmony_ci break; 129162306a36Sopenharmony_ci case MP0_HWIP: 129262306a36Sopenharmony_ci ip_name = "psp"; 129362306a36Sopenharmony_ci break; 129462306a36Sopenharmony_ci case MP1_HWIP: 129562306a36Sopenharmony_ci ip_name = "smu"; 129662306a36Sopenharmony_ci break; 129762306a36Sopenharmony_ci case UVD_HWIP: 129862306a36Sopenharmony_ci ip_name = "vcn"; 129962306a36Sopenharmony_ci break; 130062306a36Sopenharmony_ci default: 130162306a36Sopenharmony_ci BUG(); 130262306a36Sopenharmony_ci } 130362306a36Sopenharmony_ci 130462306a36Sopenharmony_ci maj = IP_VERSION_MAJ(version); 130562306a36Sopenharmony_ci min = IP_VERSION_MIN(version); 130662306a36Sopenharmony_ci rev = IP_VERSION_REV(version); 130762306a36Sopenharmony_ci 130862306a36Sopenharmony_ci snprintf(ucode_prefix, len, "%s_%d_%d_%d", ip_name, maj, min, rev); 130962306a36Sopenharmony_ci} 131062306a36Sopenharmony_ci 131162306a36Sopenharmony_ci/* 131262306a36Sopenharmony_ci * amdgpu_ucode_request - Fetch and validate amdgpu microcode 131362306a36Sopenharmony_ci * 131462306a36Sopenharmony_ci * @adev: amdgpu device 131562306a36Sopenharmony_ci * @fw: pointer to load firmware to 131662306a36Sopenharmony_ci * @fw_name: firmware to load 131762306a36Sopenharmony_ci * 131862306a36Sopenharmony_ci * This is a helper that will use request_firmware and amdgpu_ucode_validate 131962306a36Sopenharmony_ci * to load and run basic validation on firmware. If the load fails, remap 132062306a36Sopenharmony_ci * the error code to -ENODEV, so that early_init functions will fail to load. 132162306a36Sopenharmony_ci */ 132262306a36Sopenharmony_ciint amdgpu_ucode_request(struct amdgpu_device *adev, const struct firmware **fw, 132362306a36Sopenharmony_ci const char *fw_name) 132462306a36Sopenharmony_ci{ 132562306a36Sopenharmony_ci int err = request_firmware(fw, fw_name, adev->dev); 132662306a36Sopenharmony_ci 132762306a36Sopenharmony_ci if (err) 132862306a36Sopenharmony_ci return -ENODEV; 132962306a36Sopenharmony_ci 133062306a36Sopenharmony_ci err = amdgpu_ucode_validate(*fw); 133162306a36Sopenharmony_ci if (err) { 133262306a36Sopenharmony_ci dev_dbg(adev->dev, "\"%s\" failed to validate\n", fw_name); 133362306a36Sopenharmony_ci release_firmware(*fw); 133462306a36Sopenharmony_ci *fw = NULL; 133562306a36Sopenharmony_ci } 133662306a36Sopenharmony_ci 133762306a36Sopenharmony_ci return err; 133862306a36Sopenharmony_ci} 133962306a36Sopenharmony_ci 134062306a36Sopenharmony_ci/* 134162306a36Sopenharmony_ci * amdgpu_ucode_release - Release firmware microcode 134262306a36Sopenharmony_ci * 134362306a36Sopenharmony_ci * @fw: pointer to firmware to release 134462306a36Sopenharmony_ci */ 134562306a36Sopenharmony_civoid amdgpu_ucode_release(const struct firmware **fw) 134662306a36Sopenharmony_ci{ 134762306a36Sopenharmony_ci release_firmware(*fw); 134862306a36Sopenharmony_ci *fw = NULL; 134962306a36Sopenharmony_ci} 1350