@@ -3024,6 +3024,64 @@ int psp_init_toc_microcode(struct psp_context *psp,
3024
3024
return err ;
3025
3025
}
3026
3026
3027
+ static int parse_sos_bin_descriptor (struct psp_context * psp ,
3028
+ const struct psp_fw_bin_desc * desc ,
3029
+ const struct psp_firmware_header_v2_0 * sos_hdr )
3030
+ {
3031
+ uint8_t * ucode_start_addr = NULL ;
3032
+
3033
+ if (!psp || !desc || !sos_hdr )
3034
+ return - EINVAL ;
3035
+
3036
+ ucode_start_addr = (uint8_t * )sos_hdr +
3037
+ le32_to_cpu (desc -> offset_bytes ) +
3038
+ le32_to_cpu (sos_hdr -> header .ucode_array_offset_bytes );
3039
+
3040
+ switch (desc -> fw_type ) {
3041
+ case PSP_FW_TYPE_PSP_SOS :
3042
+ psp -> sos .fw_version = le32_to_cpu (desc -> fw_version );
3043
+ psp -> sos .feature_version = le32_to_cpu (desc -> fw_version );
3044
+ psp -> sos .size_bytes = le32_to_cpu (desc -> size_bytes );
3045
+ psp -> sos .start_addr = ucode_start_addr ;
3046
+ break ;
3047
+ case PSP_FW_TYPE_PSP_SYS_DRV :
3048
+ psp -> sys .fw_version = le32_to_cpu (desc -> fw_version );
3049
+ psp -> sys .feature_version = le32_to_cpu (desc -> fw_version );
3050
+ psp -> sys .size_bytes = le32_to_cpu (desc -> size_bytes );
3051
+ psp -> sys .start_addr = ucode_start_addr ;
3052
+ break ;
3053
+ case PSP_FW_TYPE_PSP_KDB :
3054
+ psp -> kdb .fw_version = le32_to_cpu (desc -> fw_version );
3055
+ psp -> kdb .feature_version = le32_to_cpu (desc -> fw_version );
3056
+ psp -> kdb .size_bytes = le32_to_cpu (desc -> size_bytes );
3057
+ psp -> kdb .start_addr = ucode_start_addr ;
3058
+ break ;
3059
+ case PSP_FW_TYPE_PSP_TOC :
3060
+ psp -> toc .fw_version = le32_to_cpu (desc -> fw_version );
3061
+ psp -> toc .feature_version = le32_to_cpu (desc -> fw_version );
3062
+ psp -> toc .size_bytes = le32_to_cpu (desc -> size_bytes );
3063
+ psp -> toc .start_addr = ucode_start_addr ;
3064
+ break ;
3065
+ case PSP_FW_TYPE_PSP_SPL :
3066
+ psp -> spl .fw_version = le32_to_cpu (desc -> fw_version );
3067
+ psp -> spl .feature_version = le32_to_cpu (desc -> fw_version );
3068
+ psp -> spl .size_bytes = le32_to_cpu (desc -> size_bytes );
3069
+ psp -> spl .start_addr = ucode_start_addr ;
3070
+ break ;
3071
+ case PSP_FW_TYPE_PSP_RL :
3072
+ psp -> rl .fw_version = le32_to_cpu (desc -> fw_version );
3073
+ psp -> rl .feature_version = le32_to_cpu (desc -> fw_version );
3074
+ psp -> rl .size_bytes = le32_to_cpu (desc -> size_bytes );
3075
+ psp -> rl .start_addr = ucode_start_addr ;
3076
+ break ;
3077
+ default :
3078
+ dev_warn (psp -> adev -> dev , "Unsupported PSP FW type: %d\n" , desc -> fw_type );
3079
+ break ;
3080
+ }
3081
+
3082
+ return 0 ;
3083
+ }
3084
+
3027
3085
static int psp_init_sos_base_fw (struct amdgpu_device * adev )
3028
3086
{
3029
3087
const struct psp_firmware_header_v1_0 * sos_hdr ;
@@ -3077,8 +3135,10 @@ int psp_init_sos_microcode(struct psp_context *psp,
3077
3135
const struct psp_firmware_header_v1_1 * sos_hdr_v1_1 ;
3078
3136
const struct psp_firmware_header_v1_2 * sos_hdr_v1_2 ;
3079
3137
const struct psp_firmware_header_v1_3 * sos_hdr_v1_3 ;
3138
+ const struct psp_firmware_header_v2_0 * sos_hdr_v2_0 ;
3080
3139
int err = 0 ;
3081
3140
uint8_t * ucode_array_start_addr ;
3141
+ int fw_index = 0 ;
3082
3142
3083
3143
if (!chip_name ) {
3084
3144
dev_err (adev -> dev , "invalid chip name for sos microcode\n" );
@@ -3136,6 +3196,23 @@ int psp_init_sos_microcode(struct psp_context *psp,
3136
3196
le32_to_cpu (sos_hdr_v1_3 -> rl .offset_bytes );
3137
3197
}
3138
3198
break ;
3199
+ case 2 :
3200
+ sos_hdr_v2_0 = (const struct psp_firmware_header_v2_0 * )adev -> psp .sos_fw -> data ;
3201
+
3202
+ if (le32_to_cpu (sos_hdr_v2_0 -> psp_fw_bin_count ) >= UCODE_MAX_PSP_PACKAGING ) {
3203
+ dev_err (adev -> dev , "packed SOS count exceeds maximum limit\n" );
3204
+ err = - EINVAL ;
3205
+ goto out ;
3206
+ }
3207
+
3208
+ for (fw_index = 0 ; fw_index < le32_to_cpu (sos_hdr_v2_0 -> psp_fw_bin_count ); fw_index ++ ) {
3209
+ err = parse_sos_bin_descriptor (psp ,
3210
+ & sos_hdr_v2_0 -> psp_fw_bin [fw_index ],
3211
+ sos_hdr_v2_0 );
3212
+ if (err )
3213
+ goto out ;
3214
+ }
3215
+ break ;
3139
3216
default :
3140
3217
dev_err (adev -> dev ,
3141
3218
"unsupported psp sos firmware\n" );
@@ -3154,7 +3231,7 @@ int psp_init_sos_microcode(struct psp_context *psp,
3154
3231
}
3155
3232
3156
3233
static int parse_ta_bin_descriptor (struct psp_context * psp ,
3157
- const struct ta_fw_bin_desc * desc ,
3234
+ const struct psp_fw_bin_desc * desc ,
3158
3235
const struct ta_firmware_header_v2_0 * ta_hdr )
3159
3236
{
3160
3237
uint8_t * ucode_start_addr = NULL ;
@@ -3242,7 +3319,7 @@ int psp_init_ta_microcode(struct psp_context *psp,
3242
3319
goto out ;
3243
3320
}
3244
3321
3245
- if (le32_to_cpu (ta_hdr -> ta_fw_bin_count ) >= UCODE_MAX_TA_PACKAGING ) {
3322
+ if (le32_to_cpu (ta_hdr -> ta_fw_bin_count ) >= UCODE_MAX_PSP_PACKAGING ) {
3246
3323
dev_err (adev -> dev , "packed TA count exceeds maximum limit\n" );
3247
3324
err = - EINVAL ;
3248
3325
goto out ;
0 commit comments