Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: add psp funcs callback to check if aux fw is needed

Query pmfw version to determine if aux sos fw needs to be loaded
in psp v13.0.

v2: refine callback to check if aux_fw loading is needed instead of
getting pmfw version barely
v3: return the comparison directly

Signed-off-by: Le Ma <le.ma@amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Le Ma and committed by
Alex Deucher
2ae6cd58 151b1813

+21
+4
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
··· 138 138 int (*vbflash_stat)(struct psp_context *psp); 139 139 int (*fatal_error_recovery_quirk)(struct psp_context *psp); 140 140 bool (*get_ras_capability)(struct psp_context *psp); 141 + bool (*is_aux_sos_load_required)(struct psp_context *psp); 141 142 }; 142 143 143 144 struct ta_funcs { ··· 464 463 #define psp_fatal_error_recovery_quirk(psp) \ 465 464 ((psp)->funcs->fatal_error_recovery_quirk ? \ 466 465 (psp)->funcs->fatal_error_recovery_quirk((psp)) : 0) 466 + 467 + #define psp_is_aux_sos_load_required(psp) \ 468 + ((psp)->funcs->is_aux_sos_load_required ? (psp)->funcs->is_aux_sos_load_required((psp)) : 0) 467 469 468 470 extern const struct amd_ip_funcs psp_ip_funcs; 469 471
+17
drivers/gpu/drm/amd/amdgpu/psp_v13_0.c
··· 81 81 /* memory training timeout define */ 82 82 #define MEM_TRAIN_SEND_MSG_TIMEOUT_US 3000000 83 83 84 + #define regMP1_PUB_SCRATCH0 0x3b10090 85 + 84 86 static int psp_v13_0_init_microcode(struct psp_context *psp) 85 87 { 86 88 struct amdgpu_device *adev = psp->adev; ··· 809 807 } 810 808 } 811 809 810 + static bool psp_v13_0_is_aux_sos_load_required(struct psp_context *psp) 811 + { 812 + struct amdgpu_device *adev = psp->adev; 813 + u32 pmfw_ver; 814 + 815 + if (amdgpu_ip_version(adev, MP0_HWIP, 0) != IP_VERSION(13, 0, 6)) 816 + return false; 817 + 818 + /* load 4e version of sos if pmfw version less than 85.115.0 */ 819 + pmfw_ver = RREG32(regMP1_PUB_SCRATCH0 / 4); 820 + 821 + return (pmfw_ver < 0x557300); 822 + } 823 + 812 824 static const struct psp_funcs psp_v13_0_funcs = { 813 825 .init_microcode = psp_v13_0_init_microcode, 814 826 .wait_for_bootloader = psp_v13_0_wait_for_bootloader_steady_state, ··· 846 830 .vbflash_stat = psp_v13_0_vbflash_status, 847 831 .fatal_error_recovery_quirk = psp_v13_0_fatal_error_recovery_quirk, 848 832 .get_ras_capability = psp_v13_0_get_ras_capability, 833 + .is_aux_sos_load_required = psp_v13_0_is_aux_sos_load_required, 849 834 }; 850 835 851 836 void psp_v13_0_set_psp_funcs(struct psp_context *psp)