18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright 2012 Advanced Micro Devices, Inc. 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 58c2ecf20Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 68c2ecf20Sopenharmony_ci * to deal in the Software without restriction, including without limitation 78c2ecf20Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 88c2ecf20Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 98c2ecf20Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 108c2ecf20Sopenharmony_ci * 118c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice shall be included in 128c2ecf20Sopenharmony_ci * all copies or substantial portions of the Software. 138c2ecf20Sopenharmony_ci * 148c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 158c2ecf20Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 168c2ecf20Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 178c2ecf20Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 188c2ecf20Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 198c2ecf20Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 208c2ecf20Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 218c2ecf20Sopenharmony_ci * 228c2ecf20Sopenharmony_ci */ 238c2ecf20Sopenharmony_ci#ifndef __AMDGPU_UCODE_H__ 248c2ecf20Sopenharmony_ci#define __AMDGPU_UCODE_H__ 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#include "amdgpu_socbb.h" 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistruct common_firmware_header { 298c2ecf20Sopenharmony_ci uint32_t size_bytes; /* size of the entire header+image(s) in bytes */ 308c2ecf20Sopenharmony_ci uint32_t header_size_bytes; /* size of just the header in bytes */ 318c2ecf20Sopenharmony_ci uint16_t header_version_major; /* header version */ 328c2ecf20Sopenharmony_ci uint16_t header_version_minor; /* header version */ 338c2ecf20Sopenharmony_ci uint16_t ip_version_major; /* IP version */ 348c2ecf20Sopenharmony_ci uint16_t ip_version_minor; /* IP version */ 358c2ecf20Sopenharmony_ci uint32_t ucode_version; 368c2ecf20Sopenharmony_ci uint32_t ucode_size_bytes; /* size of ucode in bytes */ 378c2ecf20Sopenharmony_ci uint32_t ucode_array_offset_bytes; /* payload offset from the start of the header */ 388c2ecf20Sopenharmony_ci uint32_t crc32; /* crc32 checksum of the payload */ 398c2ecf20Sopenharmony_ci}; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci/* version_major=1, version_minor=0 */ 428c2ecf20Sopenharmony_cistruct mc_firmware_header_v1_0 { 438c2ecf20Sopenharmony_ci struct common_firmware_header header; 448c2ecf20Sopenharmony_ci uint32_t io_debug_size_bytes; /* size of debug array in dwords */ 458c2ecf20Sopenharmony_ci uint32_t io_debug_array_offset_bytes; /* payload offset from the start of the header */ 468c2ecf20Sopenharmony_ci}; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci/* version_major=1, version_minor=0 */ 498c2ecf20Sopenharmony_cistruct smc_firmware_header_v1_0 { 508c2ecf20Sopenharmony_ci struct common_firmware_header header; 518c2ecf20Sopenharmony_ci uint32_t ucode_start_addr; 528c2ecf20Sopenharmony_ci}; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci/* version_major=2, version_minor=0 */ 558c2ecf20Sopenharmony_cistruct smc_firmware_header_v2_0 { 568c2ecf20Sopenharmony_ci struct smc_firmware_header_v1_0 v1_0; 578c2ecf20Sopenharmony_ci uint32_t ppt_offset_bytes; /* soft pptable offset */ 588c2ecf20Sopenharmony_ci uint32_t ppt_size_bytes; /* soft pptable size */ 598c2ecf20Sopenharmony_ci}; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_cistruct smc_soft_pptable_entry { 628c2ecf20Sopenharmony_ci uint32_t id; 638c2ecf20Sopenharmony_ci uint32_t ppt_offset_bytes; 648c2ecf20Sopenharmony_ci uint32_t ppt_size_bytes; 658c2ecf20Sopenharmony_ci}; 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci/* version_major=2, version_minor=1 */ 688c2ecf20Sopenharmony_cistruct smc_firmware_header_v2_1 { 698c2ecf20Sopenharmony_ci struct smc_firmware_header_v1_0 v1_0; 708c2ecf20Sopenharmony_ci uint32_t pptable_count; 718c2ecf20Sopenharmony_ci uint32_t pptable_entry_offset; 728c2ecf20Sopenharmony_ci}; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci/* version_major=1, version_minor=0 */ 758c2ecf20Sopenharmony_cistruct psp_firmware_header_v1_0 { 768c2ecf20Sopenharmony_ci struct common_firmware_header header; 778c2ecf20Sopenharmony_ci uint32_t ucode_feature_version; 788c2ecf20Sopenharmony_ci uint32_t sos_offset_bytes; 798c2ecf20Sopenharmony_ci uint32_t sos_size_bytes; 808c2ecf20Sopenharmony_ci}; 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci/* version_major=1, version_minor=1 */ 838c2ecf20Sopenharmony_cistruct psp_firmware_header_v1_1 { 848c2ecf20Sopenharmony_ci struct psp_firmware_header_v1_0 v1_0; 858c2ecf20Sopenharmony_ci uint32_t toc_header_version; 868c2ecf20Sopenharmony_ci uint32_t toc_offset_bytes; 878c2ecf20Sopenharmony_ci uint32_t toc_size_bytes; 888c2ecf20Sopenharmony_ci uint32_t kdb_header_version; 898c2ecf20Sopenharmony_ci uint32_t kdb_offset_bytes; 908c2ecf20Sopenharmony_ci uint32_t kdb_size_bytes; 918c2ecf20Sopenharmony_ci}; 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci/* version_major=1, version_minor=2 */ 948c2ecf20Sopenharmony_cistruct psp_firmware_header_v1_2 { 958c2ecf20Sopenharmony_ci struct psp_firmware_header_v1_0 v1_0; 968c2ecf20Sopenharmony_ci uint32_t reserve[3]; 978c2ecf20Sopenharmony_ci uint32_t kdb_header_version; 988c2ecf20Sopenharmony_ci uint32_t kdb_offset_bytes; 998c2ecf20Sopenharmony_ci uint32_t kdb_size_bytes; 1008c2ecf20Sopenharmony_ci}; 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci/* version_major=1, version_minor=3 */ 1038c2ecf20Sopenharmony_cistruct psp_firmware_header_v1_3 { 1048c2ecf20Sopenharmony_ci struct psp_firmware_header_v1_1 v1_1; 1058c2ecf20Sopenharmony_ci uint32_t spl_header_version; 1068c2ecf20Sopenharmony_ci uint32_t spl_offset_bytes; 1078c2ecf20Sopenharmony_ci uint32_t spl_size_bytes; 1088c2ecf20Sopenharmony_ci}; 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci/* version_major=1, version_minor=0 */ 1118c2ecf20Sopenharmony_cistruct ta_firmware_header_v1_0 { 1128c2ecf20Sopenharmony_ci struct common_firmware_header header; 1138c2ecf20Sopenharmony_ci uint32_t ta_xgmi_ucode_version; 1148c2ecf20Sopenharmony_ci uint32_t ta_xgmi_offset_bytes; 1158c2ecf20Sopenharmony_ci uint32_t ta_xgmi_size_bytes; 1168c2ecf20Sopenharmony_ci uint32_t ta_ras_ucode_version; 1178c2ecf20Sopenharmony_ci uint32_t ta_ras_offset_bytes; 1188c2ecf20Sopenharmony_ci uint32_t ta_ras_size_bytes; 1198c2ecf20Sopenharmony_ci uint32_t ta_hdcp_ucode_version; 1208c2ecf20Sopenharmony_ci uint32_t ta_hdcp_offset_bytes; 1218c2ecf20Sopenharmony_ci uint32_t ta_hdcp_size_bytes; 1228c2ecf20Sopenharmony_ci uint32_t ta_dtm_ucode_version; 1238c2ecf20Sopenharmony_ci uint32_t ta_dtm_offset_bytes; 1248c2ecf20Sopenharmony_ci uint32_t ta_dtm_size_bytes; 1258c2ecf20Sopenharmony_ci}; 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_cienum ta_fw_type { 1288c2ecf20Sopenharmony_ci TA_FW_TYPE_UNKOWN, 1298c2ecf20Sopenharmony_ci TA_FW_TYPE_PSP_ASD, 1308c2ecf20Sopenharmony_ci TA_FW_TYPE_PSP_XGMI, 1318c2ecf20Sopenharmony_ci TA_FW_TYPE_PSP_RAS, 1328c2ecf20Sopenharmony_ci TA_FW_TYPE_PSP_HDCP, 1338c2ecf20Sopenharmony_ci TA_FW_TYPE_PSP_DTM, 1348c2ecf20Sopenharmony_ci TA_FW_TYPE_PSP_RAP, 1358c2ecf20Sopenharmony_ci}; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_cistruct ta_fw_bin_desc { 1388c2ecf20Sopenharmony_ci uint32_t fw_type; 1398c2ecf20Sopenharmony_ci uint32_t fw_version; 1408c2ecf20Sopenharmony_ci uint32_t offset_bytes; 1418c2ecf20Sopenharmony_ci uint32_t size_bytes; 1428c2ecf20Sopenharmony_ci}; 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci/* version_major=2, version_minor=0 */ 1458c2ecf20Sopenharmony_cistruct ta_firmware_header_v2_0 { 1468c2ecf20Sopenharmony_ci struct common_firmware_header header; 1478c2ecf20Sopenharmony_ci uint32_t ta_fw_bin_count; 1488c2ecf20Sopenharmony_ci struct ta_fw_bin_desc ta_fw_bin[]; 1498c2ecf20Sopenharmony_ci}; 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci/* version_major=1, version_minor=0 */ 1528c2ecf20Sopenharmony_cistruct gfx_firmware_header_v1_0 { 1538c2ecf20Sopenharmony_ci struct common_firmware_header header; 1548c2ecf20Sopenharmony_ci uint32_t ucode_feature_version; 1558c2ecf20Sopenharmony_ci uint32_t jt_offset; /* jt location */ 1568c2ecf20Sopenharmony_ci uint32_t jt_size; /* size of jt */ 1578c2ecf20Sopenharmony_ci}; 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ci/* version_major=1, version_minor=0 */ 1608c2ecf20Sopenharmony_cistruct mes_firmware_header_v1_0 { 1618c2ecf20Sopenharmony_ci struct common_firmware_header header; 1628c2ecf20Sopenharmony_ci uint32_t mes_ucode_version; 1638c2ecf20Sopenharmony_ci uint32_t mes_ucode_size_bytes; 1648c2ecf20Sopenharmony_ci uint32_t mes_ucode_offset_bytes; 1658c2ecf20Sopenharmony_ci uint32_t mes_ucode_data_version; 1668c2ecf20Sopenharmony_ci uint32_t mes_ucode_data_size_bytes; 1678c2ecf20Sopenharmony_ci uint32_t mes_ucode_data_offset_bytes; 1688c2ecf20Sopenharmony_ci uint32_t mes_uc_start_addr_lo; 1698c2ecf20Sopenharmony_ci uint32_t mes_uc_start_addr_hi; 1708c2ecf20Sopenharmony_ci uint32_t mes_data_start_addr_lo; 1718c2ecf20Sopenharmony_ci uint32_t mes_data_start_addr_hi; 1728c2ecf20Sopenharmony_ci}; 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci/* version_major=1, version_minor=0 */ 1758c2ecf20Sopenharmony_cistruct rlc_firmware_header_v1_0 { 1768c2ecf20Sopenharmony_ci struct common_firmware_header header; 1778c2ecf20Sopenharmony_ci uint32_t ucode_feature_version; 1788c2ecf20Sopenharmony_ci uint32_t save_and_restore_offset; 1798c2ecf20Sopenharmony_ci uint32_t clear_state_descriptor_offset; 1808c2ecf20Sopenharmony_ci uint32_t avail_scratch_ram_locations; 1818c2ecf20Sopenharmony_ci uint32_t master_pkt_description_offset; 1828c2ecf20Sopenharmony_ci}; 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_ci/* version_major=2, version_minor=0 */ 1858c2ecf20Sopenharmony_cistruct rlc_firmware_header_v2_0 { 1868c2ecf20Sopenharmony_ci struct common_firmware_header header; 1878c2ecf20Sopenharmony_ci uint32_t ucode_feature_version; 1888c2ecf20Sopenharmony_ci uint32_t jt_offset; /* jt location */ 1898c2ecf20Sopenharmony_ci uint32_t jt_size; /* size of jt */ 1908c2ecf20Sopenharmony_ci uint32_t save_and_restore_offset; 1918c2ecf20Sopenharmony_ci uint32_t clear_state_descriptor_offset; 1928c2ecf20Sopenharmony_ci uint32_t avail_scratch_ram_locations; 1938c2ecf20Sopenharmony_ci uint32_t reg_restore_list_size; 1948c2ecf20Sopenharmony_ci uint32_t reg_list_format_start; 1958c2ecf20Sopenharmony_ci uint32_t reg_list_format_separate_start; 1968c2ecf20Sopenharmony_ci uint32_t starting_offsets_start; 1978c2ecf20Sopenharmony_ci uint32_t reg_list_format_size_bytes; /* size of reg list format array in bytes */ 1988c2ecf20Sopenharmony_ci uint32_t reg_list_format_array_offset_bytes; /* payload offset from the start of the header */ 1998c2ecf20Sopenharmony_ci uint32_t reg_list_size_bytes; /* size of reg list array in bytes */ 2008c2ecf20Sopenharmony_ci uint32_t reg_list_array_offset_bytes; /* payload offset from the start of the header */ 2018c2ecf20Sopenharmony_ci uint32_t reg_list_format_separate_size_bytes; /* size of reg list format array in bytes */ 2028c2ecf20Sopenharmony_ci uint32_t reg_list_format_separate_array_offset_bytes; /* payload offset from the start of the header */ 2038c2ecf20Sopenharmony_ci uint32_t reg_list_separate_size_bytes; /* size of reg list array in bytes */ 2048c2ecf20Sopenharmony_ci uint32_t reg_list_separate_array_offset_bytes; /* payload offset from the start of the header */ 2058c2ecf20Sopenharmony_ci}; 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci/* version_major=2, version_minor=1 */ 2088c2ecf20Sopenharmony_cistruct rlc_firmware_header_v2_1 { 2098c2ecf20Sopenharmony_ci struct rlc_firmware_header_v2_0 v2_0; 2108c2ecf20Sopenharmony_ci uint32_t reg_list_format_direct_reg_list_length; /* length of direct reg list format array */ 2118c2ecf20Sopenharmony_ci uint32_t save_restore_list_cntl_ucode_ver; 2128c2ecf20Sopenharmony_ci uint32_t save_restore_list_cntl_feature_ver; 2138c2ecf20Sopenharmony_ci uint32_t save_restore_list_cntl_size_bytes; 2148c2ecf20Sopenharmony_ci uint32_t save_restore_list_cntl_offset_bytes; 2158c2ecf20Sopenharmony_ci uint32_t save_restore_list_gpm_ucode_ver; 2168c2ecf20Sopenharmony_ci uint32_t save_restore_list_gpm_feature_ver; 2178c2ecf20Sopenharmony_ci uint32_t save_restore_list_gpm_size_bytes; 2188c2ecf20Sopenharmony_ci uint32_t save_restore_list_gpm_offset_bytes; 2198c2ecf20Sopenharmony_ci uint32_t save_restore_list_srm_ucode_ver; 2208c2ecf20Sopenharmony_ci uint32_t save_restore_list_srm_feature_ver; 2218c2ecf20Sopenharmony_ci uint32_t save_restore_list_srm_size_bytes; 2228c2ecf20Sopenharmony_ci uint32_t save_restore_list_srm_offset_bytes; 2238c2ecf20Sopenharmony_ci}; 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_ci/* version_major=2, version_minor=1 */ 2268c2ecf20Sopenharmony_cistruct rlc_firmware_header_v2_2 { 2278c2ecf20Sopenharmony_ci struct rlc_firmware_header_v2_1 v2_1; 2288c2ecf20Sopenharmony_ci uint32_t rlc_iram_ucode_size_bytes; 2298c2ecf20Sopenharmony_ci uint32_t rlc_iram_ucode_offset_bytes; 2308c2ecf20Sopenharmony_ci uint32_t rlc_dram_ucode_size_bytes; 2318c2ecf20Sopenharmony_ci uint32_t rlc_dram_ucode_offset_bytes; 2328c2ecf20Sopenharmony_ci}; 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci/* version_major=1, version_minor=0 */ 2358c2ecf20Sopenharmony_cistruct sdma_firmware_header_v1_0 { 2368c2ecf20Sopenharmony_ci struct common_firmware_header header; 2378c2ecf20Sopenharmony_ci uint32_t ucode_feature_version; 2388c2ecf20Sopenharmony_ci uint32_t ucode_change_version; 2398c2ecf20Sopenharmony_ci uint32_t jt_offset; /* jt location */ 2408c2ecf20Sopenharmony_ci uint32_t jt_size; /* size of jt */ 2418c2ecf20Sopenharmony_ci}; 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_ci/* version_major=1, version_minor=1 */ 2448c2ecf20Sopenharmony_cistruct sdma_firmware_header_v1_1 { 2458c2ecf20Sopenharmony_ci struct sdma_firmware_header_v1_0 v1_0; 2468c2ecf20Sopenharmony_ci uint32_t digest_size; 2478c2ecf20Sopenharmony_ci}; 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_ci/* gpu info payload */ 2508c2ecf20Sopenharmony_cistruct gpu_info_firmware_v1_0 { 2518c2ecf20Sopenharmony_ci uint32_t gc_num_se; 2528c2ecf20Sopenharmony_ci uint32_t gc_num_cu_per_sh; 2538c2ecf20Sopenharmony_ci uint32_t gc_num_sh_per_se; 2548c2ecf20Sopenharmony_ci uint32_t gc_num_rb_per_se; 2558c2ecf20Sopenharmony_ci uint32_t gc_num_tccs; 2568c2ecf20Sopenharmony_ci uint32_t gc_num_gprs; 2578c2ecf20Sopenharmony_ci uint32_t gc_num_max_gs_thds; 2588c2ecf20Sopenharmony_ci uint32_t gc_gs_table_depth; 2598c2ecf20Sopenharmony_ci uint32_t gc_gsprim_buff_depth; 2608c2ecf20Sopenharmony_ci uint32_t gc_parameter_cache_depth; 2618c2ecf20Sopenharmony_ci uint32_t gc_double_offchip_lds_buffer; 2628c2ecf20Sopenharmony_ci uint32_t gc_wave_size; 2638c2ecf20Sopenharmony_ci uint32_t gc_max_waves_per_simd; 2648c2ecf20Sopenharmony_ci uint32_t gc_max_scratch_slots_per_cu; 2658c2ecf20Sopenharmony_ci uint32_t gc_lds_size; 2668c2ecf20Sopenharmony_ci}; 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_cistruct gpu_info_firmware_v1_1 { 2698c2ecf20Sopenharmony_ci struct gpu_info_firmware_v1_0 v1_0; 2708c2ecf20Sopenharmony_ci uint32_t num_sc_per_sh; 2718c2ecf20Sopenharmony_ci uint32_t num_packer_per_sc; 2728c2ecf20Sopenharmony_ci}; 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_ci/* gpu info payload 2758c2ecf20Sopenharmony_ci * version_major=1, version_minor=1 */ 2768c2ecf20Sopenharmony_cistruct gpu_info_firmware_v1_2 { 2778c2ecf20Sopenharmony_ci struct gpu_info_firmware_v1_1 v1_1; 2788c2ecf20Sopenharmony_ci struct gpu_info_soc_bounding_box_v1_0 soc_bounding_box; 2798c2ecf20Sopenharmony_ci}; 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_ci/* version_major=1, version_minor=0 */ 2828c2ecf20Sopenharmony_cistruct gpu_info_firmware_header_v1_0 { 2838c2ecf20Sopenharmony_ci struct common_firmware_header header; 2848c2ecf20Sopenharmony_ci uint16_t version_major; /* version */ 2858c2ecf20Sopenharmony_ci uint16_t version_minor; /* version */ 2868c2ecf20Sopenharmony_ci}; 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci/* version_major=1, version_minor=0 */ 2898c2ecf20Sopenharmony_cistruct dmcu_firmware_header_v1_0 { 2908c2ecf20Sopenharmony_ci struct common_firmware_header header; 2918c2ecf20Sopenharmony_ci uint32_t intv_offset_bytes; /* interrupt vectors offset from end of header, in bytes */ 2928c2ecf20Sopenharmony_ci uint32_t intv_size_bytes; /* size of interrupt vectors, in bytes */ 2938c2ecf20Sopenharmony_ci}; 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ci/* version_major=1, version_minor=0 */ 2968c2ecf20Sopenharmony_cistruct dmcub_firmware_header_v1_0 { 2978c2ecf20Sopenharmony_ci struct common_firmware_header header; 2988c2ecf20Sopenharmony_ci uint32_t inst_const_bytes; /* size of instruction region, in bytes */ 2998c2ecf20Sopenharmony_ci uint32_t bss_data_bytes; /* size of bss/data region, in bytes */ 3008c2ecf20Sopenharmony_ci}; 3018c2ecf20Sopenharmony_ci 3028c2ecf20Sopenharmony_ci/* header is fixed size */ 3038c2ecf20Sopenharmony_ciunion amdgpu_firmware_header { 3048c2ecf20Sopenharmony_ci struct common_firmware_header common; 3058c2ecf20Sopenharmony_ci struct mc_firmware_header_v1_0 mc; 3068c2ecf20Sopenharmony_ci struct smc_firmware_header_v1_0 smc; 3078c2ecf20Sopenharmony_ci struct smc_firmware_header_v2_0 smc_v2_0; 3088c2ecf20Sopenharmony_ci struct psp_firmware_header_v1_0 psp; 3098c2ecf20Sopenharmony_ci struct psp_firmware_header_v1_1 psp_v1_1; 3108c2ecf20Sopenharmony_ci struct psp_firmware_header_v1_3 psp_v1_3; 3118c2ecf20Sopenharmony_ci struct ta_firmware_header_v1_0 ta; 3128c2ecf20Sopenharmony_ci struct ta_firmware_header_v2_0 ta_v2_0; 3138c2ecf20Sopenharmony_ci struct gfx_firmware_header_v1_0 gfx; 3148c2ecf20Sopenharmony_ci struct rlc_firmware_header_v1_0 rlc; 3158c2ecf20Sopenharmony_ci struct rlc_firmware_header_v2_0 rlc_v2_0; 3168c2ecf20Sopenharmony_ci struct rlc_firmware_header_v2_1 rlc_v2_1; 3178c2ecf20Sopenharmony_ci struct sdma_firmware_header_v1_0 sdma; 3188c2ecf20Sopenharmony_ci struct sdma_firmware_header_v1_1 sdma_v1_1; 3198c2ecf20Sopenharmony_ci struct gpu_info_firmware_header_v1_0 gpu_info; 3208c2ecf20Sopenharmony_ci struct dmcu_firmware_header_v1_0 dmcu; 3218c2ecf20Sopenharmony_ci struct dmcub_firmware_header_v1_0 dmcub; 3228c2ecf20Sopenharmony_ci uint8_t raw[0x100]; 3238c2ecf20Sopenharmony_ci}; 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci#define UCODE_MAX_TA_PACKAGING ((sizeof(union amdgpu_firmware_header) - sizeof(struct common_firmware_header) - 4) / sizeof(struct ta_fw_bin_desc)) 3268c2ecf20Sopenharmony_ci 3278c2ecf20Sopenharmony_ci/* 3288c2ecf20Sopenharmony_ci * fw loading support 3298c2ecf20Sopenharmony_ci */ 3308c2ecf20Sopenharmony_cienum AMDGPU_UCODE_ID { 3318c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_SDMA0 = 0, 3328c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_SDMA1, 3338c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_SDMA2, 3348c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_SDMA3, 3358c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_SDMA4, 3368c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_SDMA5, 3378c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_SDMA6, 3388c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_SDMA7, 3398c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_CP_CE, 3408c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_CP_PFP, 3418c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_CP_ME, 3428c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_CP_MEC1, 3438c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_CP_MEC1_JT, 3448c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_CP_MEC2, 3458c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_CP_MEC2_JT, 3468c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_CP_MES, 3478c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_CP_MES_DATA, 3488c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL, 3498c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM, 3508c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM, 3518c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_RLC_IRAM, 3528c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_RLC_DRAM, 3538c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_RLC_G, 3548c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_STORAGE, 3558c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_SMC, 3568c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_UVD, 3578c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_UVD1, 3588c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_VCE, 3598c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_VCN, 3608c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_VCN1, 3618c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_DMCU_ERAM, 3628c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_DMCU_INTV, 3638c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_VCN0_RAM, 3648c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_VCN1_RAM, 3658c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_DMCUB, 3668c2ecf20Sopenharmony_ci AMDGPU_UCODE_ID_MAXIMUM, 3678c2ecf20Sopenharmony_ci}; 3688c2ecf20Sopenharmony_ci 3698c2ecf20Sopenharmony_ci/* engine firmware status */ 3708c2ecf20Sopenharmony_cienum AMDGPU_UCODE_STATUS { 3718c2ecf20Sopenharmony_ci AMDGPU_UCODE_STATUS_INVALID, 3728c2ecf20Sopenharmony_ci AMDGPU_UCODE_STATUS_NOT_LOADED, 3738c2ecf20Sopenharmony_ci AMDGPU_UCODE_STATUS_LOADED, 3748c2ecf20Sopenharmony_ci}; 3758c2ecf20Sopenharmony_ci 3768c2ecf20Sopenharmony_cienum amdgpu_firmware_load_type { 3778c2ecf20Sopenharmony_ci AMDGPU_FW_LOAD_DIRECT = 0, 3788c2ecf20Sopenharmony_ci AMDGPU_FW_LOAD_SMU, 3798c2ecf20Sopenharmony_ci AMDGPU_FW_LOAD_PSP, 3808c2ecf20Sopenharmony_ci AMDGPU_FW_LOAD_RLC_BACKDOOR_AUTO, 3818c2ecf20Sopenharmony_ci}; 3828c2ecf20Sopenharmony_ci 3838c2ecf20Sopenharmony_ci/* conform to smu_ucode_xfer_cz.h */ 3848c2ecf20Sopenharmony_ci#define AMDGPU_SDMA0_UCODE_LOADED 0x00000001 3858c2ecf20Sopenharmony_ci#define AMDGPU_SDMA1_UCODE_LOADED 0x00000002 3868c2ecf20Sopenharmony_ci#define AMDGPU_CPCE_UCODE_LOADED 0x00000004 3878c2ecf20Sopenharmony_ci#define AMDGPU_CPPFP_UCODE_LOADED 0x00000008 3888c2ecf20Sopenharmony_ci#define AMDGPU_CPME_UCODE_LOADED 0x00000010 3898c2ecf20Sopenharmony_ci#define AMDGPU_CPMEC1_UCODE_LOADED 0x00000020 3908c2ecf20Sopenharmony_ci#define AMDGPU_CPMEC2_UCODE_LOADED 0x00000040 3918c2ecf20Sopenharmony_ci#define AMDGPU_CPRLC_UCODE_LOADED 0x00000100 3928c2ecf20Sopenharmony_ci 3938c2ecf20Sopenharmony_ci/* amdgpu firmware info */ 3948c2ecf20Sopenharmony_cistruct amdgpu_firmware_info { 3958c2ecf20Sopenharmony_ci /* ucode ID */ 3968c2ecf20Sopenharmony_ci enum AMDGPU_UCODE_ID ucode_id; 3978c2ecf20Sopenharmony_ci /* request_firmware */ 3988c2ecf20Sopenharmony_ci const struct firmware *fw; 3998c2ecf20Sopenharmony_ci /* starting mc address */ 4008c2ecf20Sopenharmony_ci uint64_t mc_addr; 4018c2ecf20Sopenharmony_ci /* kernel linear address */ 4028c2ecf20Sopenharmony_ci void *kaddr; 4038c2ecf20Sopenharmony_ci /* ucode_size_bytes */ 4048c2ecf20Sopenharmony_ci uint32_t ucode_size; 4058c2ecf20Sopenharmony_ci /* starting tmr mc address */ 4068c2ecf20Sopenharmony_ci uint32_t tmr_mc_addr_lo; 4078c2ecf20Sopenharmony_ci uint32_t tmr_mc_addr_hi; 4088c2ecf20Sopenharmony_ci}; 4098c2ecf20Sopenharmony_ci 4108c2ecf20Sopenharmony_cistruct amdgpu_firmware { 4118c2ecf20Sopenharmony_ci struct amdgpu_firmware_info ucode[AMDGPU_UCODE_ID_MAXIMUM]; 4128c2ecf20Sopenharmony_ci enum amdgpu_firmware_load_type load_type; 4138c2ecf20Sopenharmony_ci struct amdgpu_bo *fw_buf; 4148c2ecf20Sopenharmony_ci unsigned int fw_size; 4158c2ecf20Sopenharmony_ci unsigned int max_ucodes; 4168c2ecf20Sopenharmony_ci /* firmwares are loaded by psp instead of smu from vega10 */ 4178c2ecf20Sopenharmony_ci const struct amdgpu_psp_funcs *funcs; 4188c2ecf20Sopenharmony_ci struct amdgpu_bo *rbuf; 4198c2ecf20Sopenharmony_ci struct mutex mutex; 4208c2ecf20Sopenharmony_ci 4218c2ecf20Sopenharmony_ci /* gpu info firmware data pointer */ 4228c2ecf20Sopenharmony_ci const struct firmware *gpu_info_fw; 4238c2ecf20Sopenharmony_ci 4248c2ecf20Sopenharmony_ci void *fw_buf_ptr; 4258c2ecf20Sopenharmony_ci uint64_t fw_buf_mc; 4268c2ecf20Sopenharmony_ci}; 4278c2ecf20Sopenharmony_ci 4288c2ecf20Sopenharmony_civoid amdgpu_ucode_print_mc_hdr(const struct common_firmware_header *hdr); 4298c2ecf20Sopenharmony_civoid amdgpu_ucode_print_smc_hdr(const struct common_firmware_header *hdr); 4308c2ecf20Sopenharmony_civoid amdgpu_ucode_print_gfx_hdr(const struct common_firmware_header *hdr); 4318c2ecf20Sopenharmony_civoid amdgpu_ucode_print_rlc_hdr(const struct common_firmware_header *hdr); 4328c2ecf20Sopenharmony_civoid amdgpu_ucode_print_sdma_hdr(const struct common_firmware_header *hdr); 4338c2ecf20Sopenharmony_civoid amdgpu_ucode_print_psp_hdr(const struct common_firmware_header *hdr); 4348c2ecf20Sopenharmony_civoid amdgpu_ucode_print_gpu_info_hdr(const struct common_firmware_header *hdr); 4358c2ecf20Sopenharmony_ciint amdgpu_ucode_validate(const struct firmware *fw); 4368c2ecf20Sopenharmony_cibool amdgpu_ucode_hdr_version(union amdgpu_firmware_header *hdr, 4378c2ecf20Sopenharmony_ci uint16_t hdr_major, uint16_t hdr_minor); 4388c2ecf20Sopenharmony_ci 4398c2ecf20Sopenharmony_ciint amdgpu_ucode_init_bo(struct amdgpu_device *adev); 4408c2ecf20Sopenharmony_ciint amdgpu_ucode_create_bo(struct amdgpu_device *adev); 4418c2ecf20Sopenharmony_ciint amdgpu_ucode_sysfs_init(struct amdgpu_device *adev); 4428c2ecf20Sopenharmony_civoid amdgpu_ucode_free_bo(struct amdgpu_device *adev); 4438c2ecf20Sopenharmony_civoid amdgpu_ucode_sysfs_fini(struct amdgpu_device *adev); 4448c2ecf20Sopenharmony_ci 4458c2ecf20Sopenharmony_cienum amdgpu_firmware_load_type 4468c2ecf20Sopenharmony_ciamdgpu_ucode_get_load_type(struct amdgpu_device *adev, int load_type); 4478c2ecf20Sopenharmony_ci 4488c2ecf20Sopenharmony_ci#endif 449