@@ -511,20 +511,11 @@ static int psp_sw_fini(void *handle)
511511
512512 psp_memory_training_fini (psp );
513513
514- release_firmware (psp -> sos_fw );
515- psp -> sos_fw = NULL ;
516-
517- release_firmware (psp -> asd_fw );
518- psp -> asd_fw = NULL ;
519-
520- release_firmware (psp -> ta_fw );
521- psp -> ta_fw = NULL ;
522-
523- release_firmware (psp -> cap_fw );
524- psp -> cap_fw = NULL ;
525-
526- release_firmware (psp -> toc_fw );
527- psp -> toc_fw = NULL ;
514+ amdgpu_ucode_release (& psp -> sos_fw );
515+ amdgpu_ucode_release (& psp -> asd_fw );
516+ amdgpu_ucode_release (& psp -> ta_fw );
517+ amdgpu_ucode_release (& psp -> cap_fw );
518+ amdgpu_ucode_release (& psp -> toc_fw );
528519
529520 if (adev -> ip_versions [MP0_HWIP ][0 ] == IP_VERSION (11 , 0 , 0 ) ||
530521 adev -> ip_versions [MP0_HWIP ][0 ] == IP_VERSION (11 , 0 , 7 ))
@@ -2918,11 +2909,7 @@ int psp_init_asd_microcode(struct psp_context *psp, const char *chip_name)
29182909 int err = 0 ;
29192910
29202911 snprintf (fw_name , sizeof (fw_name ), "amdgpu/%s_asd.bin" , chip_name );
2921- err = request_firmware (& adev -> psp .asd_fw , fw_name , adev -> dev );
2922- if (err )
2923- goto out ;
2924-
2925- err = amdgpu_ucode_validate (adev -> psp .asd_fw );
2912+ err = amdgpu_ucode_request (adev , & adev -> psp .asd_fw , fw_name );
29262913 if (err )
29272914 goto out ;
29282915
@@ -2934,9 +2921,7 @@ int psp_init_asd_microcode(struct psp_context *psp, const char *chip_name)
29342921 le32_to_cpu (asd_hdr -> header .ucode_array_offset_bytes );
29352922 return 0 ;
29362923out :
2937- dev_err (adev -> dev , "fail to initialize asd microcode\n" );
2938- release_firmware (adev -> psp .asd_fw );
2939- adev -> psp .asd_fw = NULL ;
2924+ amdgpu_ucode_release (& adev -> psp .asd_fw );
29402925 return err ;
29412926}
29422927
@@ -2948,11 +2933,7 @@ int psp_init_toc_microcode(struct psp_context *psp, const char *chip_name)
29482933 int err = 0 ;
29492934
29502935 snprintf (fw_name , sizeof (fw_name ), "amdgpu/%s_toc.bin" , chip_name );
2951- err = request_firmware (& adev -> psp .toc_fw , fw_name , adev -> dev );
2952- if (err )
2953- goto out ;
2954-
2955- err = amdgpu_ucode_validate (adev -> psp .toc_fw );
2936+ err = amdgpu_ucode_request (adev , & adev -> psp .toc_fw , fw_name );
29562937 if (err )
29572938 goto out ;
29582939
@@ -2964,9 +2945,7 @@ int psp_init_toc_microcode(struct psp_context *psp, const char *chip_name)
29642945 le32_to_cpu (toc_hdr -> header .ucode_array_offset_bytes );
29652946 return 0 ;
29662947out :
2967- dev_err (adev -> dev , "fail to request/validate toc microcode\n" );
2968- release_firmware (adev -> psp .toc_fw );
2969- adev -> psp .toc_fw = NULL ;
2948+ amdgpu_ucode_release (& adev -> psp .toc_fw );
29702949 return err ;
29712950}
29722951
@@ -3111,11 +3090,7 @@ int psp_init_sos_microcode(struct psp_context *psp, const char *chip_name)
31113090 int fw_index = 0 ;
31123091
31133092 snprintf (fw_name , sizeof (fw_name ), "amdgpu/%s_sos.bin" , chip_name );
3114- err = request_firmware (& adev -> psp .sos_fw , fw_name , adev -> dev );
3115- if (err )
3116- goto out ;
3117-
3118- err = amdgpu_ucode_validate (adev -> psp .sos_fw );
3093+ err = amdgpu_ucode_request (adev , & adev -> psp .sos_fw , fw_name );
31193094 if (err )
31203095 goto out ;
31213096
@@ -3187,10 +3162,7 @@ int psp_init_sos_microcode(struct psp_context *psp, const char *chip_name)
31873162
31883163 return 0 ;
31893164out :
3190- dev_err (adev -> dev ,
3191- "failed to init sos firmware\n" );
3192- release_firmware (adev -> psp .sos_fw );
3193- adev -> psp .sos_fw = NULL ;
3165+ amdgpu_ucode_release (& adev -> psp .sos_fw );
31943166
31953167 return err ;
31963168}
@@ -3347,10 +3319,7 @@ int psp_init_ta_microcode(struct psp_context *psp, const char *chip_name)
33473319 int err ;
33483320
33493321 snprintf (fw_name , sizeof (fw_name ), "amdgpu/%s_ta.bin" , chip_name );
3350- err = request_firmware (& adev -> psp .ta_fw , fw_name , adev -> dev );
3351- if (err )
3352- return err ;
3353- err = amdgpu_ucode_validate (adev -> psp .ta_fw );
3322+ err = amdgpu_ucode_request (adev , & adev -> psp .ta_fw , fw_name );
33543323 if (err )
33553324 return err ;
33563325
@@ -3367,11 +3336,8 @@ int psp_init_ta_microcode(struct psp_context *psp, const char *chip_name)
33673336 err = - EINVAL ;
33683337 }
33693338
3370- if (err ) {
3371- dev_err (adev -> dev , "fail to initialize ta microcode\n" );
3372- release_firmware (adev -> psp .ta_fw );
3373- adev -> psp .ta_fw = NULL ;
3374- }
3339+ if (err )
3340+ amdgpu_ucode_release (& adev -> psp .ta_fw );
33753341
33763342 return err ;
33773343}
@@ -3390,17 +3356,14 @@ int psp_init_cap_microcode(struct psp_context *psp, const char *chip_name)
33903356 }
33913357
33923358 snprintf (fw_name , sizeof (fw_name ), "amdgpu/%s_cap.bin" , chip_name );
3393- err = request_firmware (& adev -> psp .cap_fw , fw_name , adev -> dev );
3394- if (err ) {
3395- dev_warn (adev -> dev , "cap microcode does not exist, skip\n" );
3396- err = 0 ;
3397- goto out ;
3398- }
3399-
3400- err = amdgpu_ucode_validate (adev -> psp .cap_fw );
3359+ err = amdgpu_ucode_request (adev , & adev -> psp .cap_fw , fw_name );
34013360 if (err ) {
3361+ if (err == - ENODEV ) {
3362+ dev_warn (adev -> dev , "cap microcode does not exist, skip\n" );
3363+ err = 0 ;
3364+ goto out ;
3365+ }
34023366 dev_err (adev -> dev , "fail to initialize cap microcode\n" );
3403- goto out ;
34043367 }
34053368
34063369 info = & adev -> firmware .ucode [AMDGPU_UCODE_ID_CAP ];
@@ -3417,8 +3380,7 @@ int psp_init_cap_microcode(struct psp_context *psp, const char *chip_name)
34173380 return 0 ;
34183381
34193382out :
3420- release_firmware (adev -> psp .cap_fw );
3421- adev -> psp .cap_fw = NULL ;
3383+ amdgpu_ucode_release (& adev -> psp .cap_fw );
34223384 return err ;
34233385}
34243386
0 commit comments