| .. | .. |
|---|
| 23 | 23 | #ifndef __AMDGPU_UCODE_H__ |
|---|
| 24 | 24 | #define __AMDGPU_UCODE_H__ |
|---|
| 25 | 25 | |
|---|
| 26 | +#include "amdgpu_socbb.h" |
|---|
| 27 | + |
|---|
| 26 | 28 | struct common_firmware_header { |
|---|
| 27 | 29 | uint32_t size_bytes; /* size of the entire header+image(s) in bytes */ |
|---|
| 28 | 30 | uint32_t header_size_bytes; /* size of just the header in bytes */ |
|---|
| .. | .. |
|---|
| 49 | 51 | uint32_t ucode_start_addr; |
|---|
| 50 | 52 | }; |
|---|
| 51 | 53 | |
|---|
| 54 | +/* version_major=2, version_minor=0 */ |
|---|
| 55 | +struct smc_firmware_header_v2_0 { |
|---|
| 56 | + struct smc_firmware_header_v1_0 v1_0; |
|---|
| 57 | + uint32_t ppt_offset_bytes; /* soft pptable offset */ |
|---|
| 58 | + uint32_t ppt_size_bytes; /* soft pptable size */ |
|---|
| 59 | +}; |
|---|
| 60 | + |
|---|
| 61 | +struct smc_soft_pptable_entry { |
|---|
| 62 | + uint32_t id; |
|---|
| 63 | + uint32_t ppt_offset_bytes; |
|---|
| 64 | + uint32_t ppt_size_bytes; |
|---|
| 65 | +}; |
|---|
| 66 | + |
|---|
| 67 | +/* version_major=2, version_minor=1 */ |
|---|
| 68 | +struct smc_firmware_header_v2_1 { |
|---|
| 69 | + struct smc_firmware_header_v1_0 v1_0; |
|---|
| 70 | + uint32_t pptable_count; |
|---|
| 71 | + uint32_t pptable_entry_offset; |
|---|
| 72 | +}; |
|---|
| 73 | + |
|---|
| 52 | 74 | /* version_major=1, version_minor=0 */ |
|---|
| 53 | 75 | struct psp_firmware_header_v1_0 { |
|---|
| 54 | 76 | struct common_firmware_header header; |
|---|
| .. | .. |
|---|
| 57 | 79 | uint32_t sos_size_bytes; |
|---|
| 58 | 80 | }; |
|---|
| 59 | 81 | |
|---|
| 82 | +/* version_major=1, version_minor=1 */ |
|---|
| 83 | +struct psp_firmware_header_v1_1 { |
|---|
| 84 | + struct psp_firmware_header_v1_0 v1_0; |
|---|
| 85 | + uint32_t toc_header_version; |
|---|
| 86 | + uint32_t toc_offset_bytes; |
|---|
| 87 | + uint32_t toc_size_bytes; |
|---|
| 88 | + uint32_t kdb_header_version; |
|---|
| 89 | + uint32_t kdb_offset_bytes; |
|---|
| 90 | + uint32_t kdb_size_bytes; |
|---|
| 91 | +}; |
|---|
| 92 | + |
|---|
| 93 | +/* version_major=1, version_minor=2 */ |
|---|
| 94 | +struct psp_firmware_header_v1_2 { |
|---|
| 95 | + struct psp_firmware_header_v1_0 v1_0; |
|---|
| 96 | + uint32_t reserve[3]; |
|---|
| 97 | + uint32_t kdb_header_version; |
|---|
| 98 | + uint32_t kdb_offset_bytes; |
|---|
| 99 | + uint32_t kdb_size_bytes; |
|---|
| 100 | +}; |
|---|
| 101 | + |
|---|
| 102 | +/* version_major=1, version_minor=3 */ |
|---|
| 103 | +struct psp_firmware_header_v1_3 { |
|---|
| 104 | + struct psp_firmware_header_v1_1 v1_1; |
|---|
| 105 | + uint32_t spl_header_version; |
|---|
| 106 | + uint32_t spl_offset_bytes; |
|---|
| 107 | + uint32_t spl_size_bytes; |
|---|
| 108 | +}; |
|---|
| 109 | + |
|---|
| 110 | +/* version_major=1, version_minor=0 */ |
|---|
| 111 | +struct ta_firmware_header_v1_0 { |
|---|
| 112 | + struct common_firmware_header header; |
|---|
| 113 | + uint32_t ta_xgmi_ucode_version; |
|---|
| 114 | + uint32_t ta_xgmi_offset_bytes; |
|---|
| 115 | + uint32_t ta_xgmi_size_bytes; |
|---|
| 116 | + uint32_t ta_ras_ucode_version; |
|---|
| 117 | + uint32_t ta_ras_offset_bytes; |
|---|
| 118 | + uint32_t ta_ras_size_bytes; |
|---|
| 119 | + uint32_t ta_hdcp_ucode_version; |
|---|
| 120 | + uint32_t ta_hdcp_offset_bytes; |
|---|
| 121 | + uint32_t ta_hdcp_size_bytes; |
|---|
| 122 | + uint32_t ta_dtm_ucode_version; |
|---|
| 123 | + uint32_t ta_dtm_offset_bytes; |
|---|
| 124 | + uint32_t ta_dtm_size_bytes; |
|---|
| 125 | +}; |
|---|
| 126 | + |
|---|
| 127 | +enum ta_fw_type { |
|---|
| 128 | + TA_FW_TYPE_UNKOWN, |
|---|
| 129 | + TA_FW_TYPE_PSP_ASD, |
|---|
| 130 | + TA_FW_TYPE_PSP_XGMI, |
|---|
| 131 | + TA_FW_TYPE_PSP_RAS, |
|---|
| 132 | + TA_FW_TYPE_PSP_HDCP, |
|---|
| 133 | + TA_FW_TYPE_PSP_DTM, |
|---|
| 134 | + TA_FW_TYPE_PSP_RAP, |
|---|
| 135 | +}; |
|---|
| 136 | + |
|---|
| 137 | +struct ta_fw_bin_desc { |
|---|
| 138 | + uint32_t fw_type; |
|---|
| 139 | + uint32_t fw_version; |
|---|
| 140 | + uint32_t offset_bytes; |
|---|
| 141 | + uint32_t size_bytes; |
|---|
| 142 | +}; |
|---|
| 143 | + |
|---|
| 144 | +/* version_major=2, version_minor=0 */ |
|---|
| 145 | +struct ta_firmware_header_v2_0 { |
|---|
| 146 | + struct common_firmware_header header; |
|---|
| 147 | + uint32_t ta_fw_bin_count; |
|---|
| 148 | + struct ta_fw_bin_desc ta_fw_bin[]; |
|---|
| 149 | +}; |
|---|
| 150 | + |
|---|
| 60 | 151 | /* version_major=1, version_minor=0 */ |
|---|
| 61 | 152 | struct gfx_firmware_header_v1_0 { |
|---|
| 62 | 153 | struct common_firmware_header header; |
|---|
| 63 | 154 | uint32_t ucode_feature_version; |
|---|
| 64 | 155 | uint32_t jt_offset; /* jt location */ |
|---|
| 65 | 156 | uint32_t jt_size; /* size of jt */ |
|---|
| 157 | +}; |
|---|
| 158 | + |
|---|
| 159 | +/* version_major=1, version_minor=0 */ |
|---|
| 160 | +struct mes_firmware_header_v1_0 { |
|---|
| 161 | + struct common_firmware_header header; |
|---|
| 162 | + uint32_t mes_ucode_version; |
|---|
| 163 | + uint32_t mes_ucode_size_bytes; |
|---|
| 164 | + uint32_t mes_ucode_offset_bytes; |
|---|
| 165 | + uint32_t mes_ucode_data_version; |
|---|
| 166 | + uint32_t mes_ucode_data_size_bytes; |
|---|
| 167 | + uint32_t mes_ucode_data_offset_bytes; |
|---|
| 168 | + uint32_t mes_uc_start_addr_lo; |
|---|
| 169 | + uint32_t mes_uc_start_addr_hi; |
|---|
| 170 | + uint32_t mes_data_start_addr_lo; |
|---|
| 171 | + uint32_t mes_data_start_addr_hi; |
|---|
| 66 | 172 | }; |
|---|
| 67 | 173 | |
|---|
| 68 | 174 | /* version_major=1, version_minor=0 */ |
|---|
| .. | .. |
|---|
| 116 | 222 | uint32_t save_restore_list_srm_offset_bytes; |
|---|
| 117 | 223 | }; |
|---|
| 118 | 224 | |
|---|
| 225 | +/* version_major=2, version_minor=1 */ |
|---|
| 226 | +struct rlc_firmware_header_v2_2 { |
|---|
| 227 | + struct rlc_firmware_header_v2_1 v2_1; |
|---|
| 228 | + uint32_t rlc_iram_ucode_size_bytes; |
|---|
| 229 | + uint32_t rlc_iram_ucode_offset_bytes; |
|---|
| 230 | + uint32_t rlc_dram_ucode_size_bytes; |
|---|
| 231 | + uint32_t rlc_dram_ucode_offset_bytes; |
|---|
| 232 | +}; |
|---|
| 233 | + |
|---|
| 119 | 234 | /* version_major=1, version_minor=0 */ |
|---|
| 120 | 235 | struct sdma_firmware_header_v1_0 { |
|---|
| 121 | 236 | struct common_firmware_header header; |
|---|
| .. | .. |
|---|
| 150 | 265 | uint32_t gc_lds_size; |
|---|
| 151 | 266 | }; |
|---|
| 152 | 267 | |
|---|
| 268 | +struct gpu_info_firmware_v1_1 { |
|---|
| 269 | + struct gpu_info_firmware_v1_0 v1_0; |
|---|
| 270 | + uint32_t num_sc_per_sh; |
|---|
| 271 | + uint32_t num_packer_per_sc; |
|---|
| 272 | +}; |
|---|
| 273 | + |
|---|
| 274 | +/* gpu info payload |
|---|
| 275 | + * version_major=1, version_minor=1 */ |
|---|
| 276 | +struct gpu_info_firmware_v1_2 { |
|---|
| 277 | + struct gpu_info_firmware_v1_1 v1_1; |
|---|
| 278 | + struct gpu_info_soc_bounding_box_v1_0 soc_bounding_box; |
|---|
| 279 | +}; |
|---|
| 280 | + |
|---|
| 153 | 281 | /* version_major=1, version_minor=0 */ |
|---|
| 154 | 282 | struct gpu_info_firmware_header_v1_0 { |
|---|
| 155 | 283 | struct common_firmware_header header; |
|---|
| .. | .. |
|---|
| 157 | 285 | uint16_t version_minor; /* version */ |
|---|
| 158 | 286 | }; |
|---|
| 159 | 287 | |
|---|
| 288 | +/* version_major=1, version_minor=0 */ |
|---|
| 289 | +struct dmcu_firmware_header_v1_0 { |
|---|
| 290 | + struct common_firmware_header header; |
|---|
| 291 | + uint32_t intv_offset_bytes; /* interrupt vectors offset from end of header, in bytes */ |
|---|
| 292 | + uint32_t intv_size_bytes; /* size of interrupt vectors, in bytes */ |
|---|
| 293 | +}; |
|---|
| 294 | + |
|---|
| 295 | +/* version_major=1, version_minor=0 */ |
|---|
| 296 | +struct dmcub_firmware_header_v1_0 { |
|---|
| 297 | + struct common_firmware_header header; |
|---|
| 298 | + uint32_t inst_const_bytes; /* size of instruction region, in bytes */ |
|---|
| 299 | + uint32_t bss_data_bytes; /* size of bss/data region, in bytes */ |
|---|
| 300 | +}; |
|---|
| 301 | + |
|---|
| 160 | 302 | /* header is fixed size */ |
|---|
| 161 | 303 | union amdgpu_firmware_header { |
|---|
| 162 | 304 | struct common_firmware_header common; |
|---|
| 163 | 305 | struct mc_firmware_header_v1_0 mc; |
|---|
| 164 | 306 | struct smc_firmware_header_v1_0 smc; |
|---|
| 307 | + struct smc_firmware_header_v2_0 smc_v2_0; |
|---|
| 165 | 308 | struct psp_firmware_header_v1_0 psp; |
|---|
| 309 | + struct psp_firmware_header_v1_1 psp_v1_1; |
|---|
| 310 | + struct psp_firmware_header_v1_3 psp_v1_3; |
|---|
| 311 | + struct ta_firmware_header_v1_0 ta; |
|---|
| 312 | + struct ta_firmware_header_v2_0 ta_v2_0; |
|---|
| 166 | 313 | struct gfx_firmware_header_v1_0 gfx; |
|---|
| 167 | 314 | struct rlc_firmware_header_v1_0 rlc; |
|---|
| 168 | 315 | struct rlc_firmware_header_v2_0 rlc_v2_0; |
|---|
| .. | .. |
|---|
| 170 | 317 | struct sdma_firmware_header_v1_0 sdma; |
|---|
| 171 | 318 | struct sdma_firmware_header_v1_1 sdma_v1_1; |
|---|
| 172 | 319 | struct gpu_info_firmware_header_v1_0 gpu_info; |
|---|
| 320 | + struct dmcu_firmware_header_v1_0 dmcu; |
|---|
| 321 | + struct dmcub_firmware_header_v1_0 dmcub; |
|---|
| 173 | 322 | uint8_t raw[0x100]; |
|---|
| 174 | 323 | }; |
|---|
| 324 | + |
|---|
| 325 | +#define UCODE_MAX_TA_PACKAGING ((sizeof(union amdgpu_firmware_header) - sizeof(struct common_firmware_header) - 4) / sizeof(struct ta_fw_bin_desc)) |
|---|
| 175 | 326 | |
|---|
| 176 | 327 | /* |
|---|
| 177 | 328 | * fw loading support |
|---|
| .. | .. |
|---|
| 179 | 330 | enum AMDGPU_UCODE_ID { |
|---|
| 180 | 331 | AMDGPU_UCODE_ID_SDMA0 = 0, |
|---|
| 181 | 332 | AMDGPU_UCODE_ID_SDMA1, |
|---|
| 333 | + AMDGPU_UCODE_ID_SDMA2, |
|---|
| 334 | + AMDGPU_UCODE_ID_SDMA3, |
|---|
| 335 | + AMDGPU_UCODE_ID_SDMA4, |
|---|
| 336 | + AMDGPU_UCODE_ID_SDMA5, |
|---|
| 337 | + AMDGPU_UCODE_ID_SDMA6, |
|---|
| 338 | + AMDGPU_UCODE_ID_SDMA7, |
|---|
| 182 | 339 | AMDGPU_UCODE_ID_CP_CE, |
|---|
| 183 | 340 | AMDGPU_UCODE_ID_CP_PFP, |
|---|
| 184 | 341 | AMDGPU_UCODE_ID_CP_ME, |
|---|
| .. | .. |
|---|
| 186 | 343 | AMDGPU_UCODE_ID_CP_MEC1_JT, |
|---|
| 187 | 344 | AMDGPU_UCODE_ID_CP_MEC2, |
|---|
| 188 | 345 | AMDGPU_UCODE_ID_CP_MEC2_JT, |
|---|
| 189 | | - AMDGPU_UCODE_ID_RLC_G, |
|---|
| 346 | + AMDGPU_UCODE_ID_CP_MES, |
|---|
| 347 | + AMDGPU_UCODE_ID_CP_MES_DATA, |
|---|
| 190 | 348 | AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL, |
|---|
| 191 | 349 | AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM, |
|---|
| 192 | 350 | AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM, |
|---|
| 351 | + AMDGPU_UCODE_ID_RLC_IRAM, |
|---|
| 352 | + AMDGPU_UCODE_ID_RLC_DRAM, |
|---|
| 353 | + AMDGPU_UCODE_ID_RLC_G, |
|---|
| 193 | 354 | AMDGPU_UCODE_ID_STORAGE, |
|---|
| 194 | 355 | AMDGPU_UCODE_ID_SMC, |
|---|
| 195 | 356 | AMDGPU_UCODE_ID_UVD, |
|---|
| 357 | + AMDGPU_UCODE_ID_UVD1, |
|---|
| 196 | 358 | AMDGPU_UCODE_ID_VCE, |
|---|
| 197 | 359 | AMDGPU_UCODE_ID_VCN, |
|---|
| 360 | + AMDGPU_UCODE_ID_VCN1, |
|---|
| 361 | + AMDGPU_UCODE_ID_DMCU_ERAM, |
|---|
| 362 | + AMDGPU_UCODE_ID_DMCU_INTV, |
|---|
| 363 | + AMDGPU_UCODE_ID_VCN0_RAM, |
|---|
| 364 | + AMDGPU_UCODE_ID_VCN1_RAM, |
|---|
| 365 | + AMDGPU_UCODE_ID_DMCUB, |
|---|
| 198 | 366 | AMDGPU_UCODE_ID_MAXIMUM, |
|---|
| 199 | 367 | }; |
|---|
| 200 | 368 | |
|---|
| .. | .. |
|---|
| 203 | 371 | AMDGPU_UCODE_STATUS_INVALID, |
|---|
| 204 | 372 | AMDGPU_UCODE_STATUS_NOT_LOADED, |
|---|
| 205 | 373 | AMDGPU_UCODE_STATUS_LOADED, |
|---|
| 374 | +}; |
|---|
| 375 | + |
|---|
| 376 | +enum amdgpu_firmware_load_type { |
|---|
| 377 | + AMDGPU_FW_LOAD_DIRECT = 0, |
|---|
| 378 | + AMDGPU_FW_LOAD_SMU, |
|---|
| 379 | + AMDGPU_FW_LOAD_PSP, |
|---|
| 380 | + AMDGPU_FW_LOAD_RLC_BACKDOOR_AUTO, |
|---|
| 206 | 381 | }; |
|---|
| 207 | 382 | |
|---|
| 208 | 383 | /* conform to smu_ucode_xfer_cz.h */ |
|---|
| .. | .. |
|---|
| 232 | 407 | uint32_t tmr_mc_addr_hi; |
|---|
| 233 | 408 | }; |
|---|
| 234 | 409 | |
|---|
| 410 | +struct amdgpu_firmware { |
|---|
| 411 | + struct amdgpu_firmware_info ucode[AMDGPU_UCODE_ID_MAXIMUM]; |
|---|
| 412 | + enum amdgpu_firmware_load_type load_type; |
|---|
| 413 | + struct amdgpu_bo *fw_buf; |
|---|
| 414 | + unsigned int fw_size; |
|---|
| 415 | + unsigned int max_ucodes; |
|---|
| 416 | + /* firmwares are loaded by psp instead of smu from vega10 */ |
|---|
| 417 | + const struct amdgpu_psp_funcs *funcs; |
|---|
| 418 | + struct amdgpu_bo *rbuf; |
|---|
| 419 | + struct mutex mutex; |
|---|
| 420 | + |
|---|
| 421 | + /* gpu info firmware data pointer */ |
|---|
| 422 | + const struct firmware *gpu_info_fw; |
|---|
| 423 | + |
|---|
| 424 | + void *fw_buf_ptr; |
|---|
| 425 | + uint64_t fw_buf_mc; |
|---|
| 426 | +}; |
|---|
| 427 | + |
|---|
| 235 | 428 | void amdgpu_ucode_print_mc_hdr(const struct common_firmware_header *hdr); |
|---|
| 236 | 429 | void amdgpu_ucode_print_smc_hdr(const struct common_firmware_header *hdr); |
|---|
| 237 | 430 | void amdgpu_ucode_print_gfx_hdr(const struct common_firmware_header *hdr); |
|---|
| 238 | 431 | void amdgpu_ucode_print_rlc_hdr(const struct common_firmware_header *hdr); |
|---|
| 239 | 432 | void amdgpu_ucode_print_sdma_hdr(const struct common_firmware_header *hdr); |
|---|
| 433 | +void amdgpu_ucode_print_psp_hdr(const struct common_firmware_header *hdr); |
|---|
| 240 | 434 | void amdgpu_ucode_print_gpu_info_hdr(const struct common_firmware_header *hdr); |
|---|
| 241 | 435 | int amdgpu_ucode_validate(const struct firmware *fw); |
|---|
| 242 | 436 | bool amdgpu_ucode_hdr_version(union amdgpu_firmware_header *hdr, |
|---|
| 243 | 437 | uint16_t hdr_major, uint16_t hdr_minor); |
|---|
| 438 | + |
|---|
| 244 | 439 | int amdgpu_ucode_init_bo(struct amdgpu_device *adev); |
|---|
| 245 | | -int amdgpu_ucode_fini_bo(struct amdgpu_device *adev); |
|---|
| 440 | +int amdgpu_ucode_create_bo(struct amdgpu_device *adev); |
|---|
| 441 | +int amdgpu_ucode_sysfs_init(struct amdgpu_device *adev); |
|---|
| 442 | +void amdgpu_ucode_free_bo(struct amdgpu_device *adev); |
|---|
| 443 | +void amdgpu_ucode_sysfs_fini(struct amdgpu_device *adev); |
|---|
| 246 | 444 | |
|---|
| 247 | 445 | enum amdgpu_firmware_load_type |
|---|
| 248 | 446 | amdgpu_ucode_get_load_type(struct amdgpu_device *adev, int load_type); |
|---|