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

drm/amdgpu: Load spdm_drv for psp v13_0_12

spdm_drv is a firmware that needs to be loaded
in driver initialization phase.

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

authored by

Hawking Zhang and committed by
Alex Deucher
98230feb 3516d35f

+28
+15
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
··· 2389 2389 } 2390 2390 } 2391 2391 2392 + if ((is_psp_fw_valid(psp->spdm_drv)) && 2393 + (psp->funcs->bootloader_load_spdm_drv != NULL)) { 2394 + ret = psp_bootloader_load_spdm_drv(psp); 2395 + if (ret) { 2396 + dev_err(adev->dev, "PSP load spdm_drv failed!\n"); 2397 + return ret; 2398 + } 2399 + } 2400 + 2392 2401 if ((is_psp_fw_valid(psp->sos)) && 2393 2402 (psp->funcs->bootloader_load_sos != NULL)) { 2394 2403 ret = psp_bootloader_load_sos(psp); ··· 3421 3412 psp->ipkeymgr_drv.feature_version = le32_to_cpu(desc->fw_version); 3422 3413 psp->ipkeymgr_drv.size_bytes = le32_to_cpu(desc->size_bytes); 3423 3414 psp->ipkeymgr_drv.start_addr = ucode_start_addr; 3415 + break; 3416 + case PSP_FW_TYPE_PSP_SPDM_DRV: 3417 + psp->spdm_drv.fw_version = le32_to_cpu(desc->fw_version); 3418 + psp->spdm_drv.feature_version = le32_to_cpu(desc->fw_version); 3419 + psp->spdm_drv.size_bytes = le32_to_cpu(desc->size_bytes); 3420 + psp->spdm_drv.start_addr = ucode_start_addr; 3424 3421 break; 3425 3422 default: 3426 3423 dev_warn(psp->adev->dev, "Unsupported PSP FW type: %d\n", desc->fw_type);
+6
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
··· 80 80 PSP_BL__DRAM_LONG_TRAIN = 0x100000, 81 81 PSP_BL__DRAM_SHORT_TRAIN = 0x200000, 82 82 PSP_BL__LOAD_TOS_SPL_TABLE = 0x10000000, 83 + PSP_BL__LOAD_SPDMDRV = 0x20000000, 83 84 }; 84 85 85 86 enum psp_ring_type { ··· 121 120 int (*bootloader_load_dbg_drv)(struct psp_context *psp); 122 121 int (*bootloader_load_ras_drv)(struct psp_context *psp); 123 122 int (*bootloader_load_ipkeymgr_drv)(struct psp_context *psp); 123 + int (*bootloader_load_spdm_drv)(struct psp_context *psp); 124 124 int (*bootloader_load_sos)(struct psp_context *psp); 125 125 int (*ring_create)(struct psp_context *psp, 126 126 enum psp_ring_type ring_type); ··· 345 343 struct psp_bin_desc dbg_drv; 346 344 struct psp_bin_desc ras_drv; 347 345 struct psp_bin_desc ipkeymgr_drv; 346 + struct psp_bin_desc spdm_drv; 348 347 349 348 /* tmr buffer */ 350 349 struct amdgpu_bo *tmr_bo; ··· 437 434 #define psp_bootloader_load_ipkeymgr_drv(psp) \ 438 435 ((psp)->funcs->bootloader_load_ipkeymgr_drv ? \ 439 436 (psp)->funcs->bootloader_load_ipkeymgr_drv((psp)) : 0) 437 + #define psp_bootloader_load_spdm_drv(psp) \ 438 + ((psp)->funcs->bootloader_load_spdm_drv ? \ 439 + (psp)->funcs->bootloader_load_spdm_drv((psp)) : 0) 440 440 #define psp_bootloader_load_sos(psp) \ 441 441 ((psp)->funcs->bootloader_load_sos ? (psp)->funcs->bootloader_load_sos((psp)) : 0) 442 442 #define psp_smu_reload_quirk(psp) \
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
··· 126 126 PSP_FW_TYPE_PSP_DBG_DRV, 127 127 PSP_FW_TYPE_PSP_RAS_DRV, 128 128 PSP_FW_TYPE_PSP_IPKEYMGR_DRV, 129 + PSP_FW_TYPE_PSP_SPDM_DRV, 129 130 PSP_FW_TYPE_MAX_INDEX, 130 131 }; 131 132
+6
drivers/gpu/drm/amd/amdgpu/psp_v13_0.c
··· 293 293 return psp_v13_0_bootloader_load_component(psp, &psp->ras_drv, PSP_BL__LOAD_RASDRV); 294 294 } 295 295 296 + static int psp_v13_0_bootloader_load_spdm_drv(struct psp_context *psp) 297 + { 298 + return psp_v13_0_bootloader_load_component(psp, &psp->spdm_drv, PSP_BL__LOAD_SPDMDRV); 299 + } 300 + 296 301 static inline void psp_v13_0_init_sos_version(struct psp_context *psp) 297 302 { 298 303 struct amdgpu_device *adev = psp->adev; ··· 867 862 .bootloader_load_intf_drv = psp_v13_0_bootloader_load_intf_drv, 868 863 .bootloader_load_dbg_drv = psp_v13_0_bootloader_load_dbg_drv, 869 864 .bootloader_load_ras_drv = psp_v13_0_bootloader_load_ras_drv, 865 + .bootloader_load_spdm_drv = psp_v13_0_bootloader_load_spdm_drv, 870 866 .bootloader_load_sos = psp_v13_0_bootloader_load_sos, 871 867 .ring_create = psp_v13_0_ring_create, 872 868 .ring_stop = psp_v13_0_ring_stop,