Lines Matching refs:psp
51 static int psp_load_smu_fw(struct psp_context *psp);
52 static int psp_rap_terminate(struct psp_context *psp);
53 static int psp_securedisplay_terminate(struct psp_context *psp);
70 static void psp_check_pmfw_centralized_cstate_management(struct psp_context *psp) in psp_check_pmfw_centralized_cstate_management() argument
72 struct amdgpu_device *adev = psp->adev; in psp_check_pmfw_centralized_cstate_management()
75 psp->pmfw_centralized_cstate_management = false; in psp_check_pmfw_centralized_cstate_management()
91 psp->pmfw_centralized_cstate_management = true; in psp_check_pmfw_centralized_cstate_management()
94 psp->pmfw_centralized_cstate_management = false; in psp_check_pmfw_centralized_cstate_management()
102 struct psp_context *psp = &adev->psp; in psp_early_init() local
106 psp_v3_1_set_psp_funcs(psp); in psp_early_init()
107 psp->autoload_supported = false; in psp_early_init()
111 psp_v10_0_set_psp_funcs(psp); in psp_early_init()
112 psp->autoload_supported = false; in psp_early_init()
116 psp_v11_0_set_psp_funcs(psp); in psp_early_init()
117 psp->autoload_supported = false; in psp_early_init()
127 psp_v11_0_set_psp_funcs(psp); in psp_early_init()
128 psp->autoload_supported = true; in psp_early_init()
132 psp_v12_0_set_psp_funcs(psp); in psp_early_init()
135 psp_v13_0_set_psp_funcs(psp); in psp_early_init()
142 psp_v13_0_set_psp_funcs(psp); in psp_early_init()
143 psp->autoload_supported = true; in psp_early_init()
147 psp_v11_0_8_set_psp_funcs(psp); in psp_early_init()
148 psp->autoload_supported = false; in psp_early_init()
153 psp_v13_0_set_psp_funcs(psp); in psp_early_init()
154 psp->autoload_supported = true; in psp_early_init()
157 psp_v13_0_4_set_psp_funcs(psp); in psp_early_init()
158 psp->autoload_supported = true; in psp_early_init()
164 psp->adev = adev; in psp_early_init()
166 psp_check_pmfw_centralized_cstate_management(psp); in psp_early_init()
178 static void psp_free_shared_bufs(struct psp_context *psp) in psp_free_shared_bufs() argument
184 pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL; in psp_free_shared_bufs()
185 amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, pptr); in psp_free_shared_bufs()
186 psp->tmr_bo = NULL; in psp_free_shared_bufs()
189 psp_ta_free_shared_buf(&psp->xgmi_context.context.mem_context); in psp_free_shared_bufs()
192 psp_ta_free_shared_buf(&psp->ras_context.context.mem_context); in psp_free_shared_bufs()
195 psp_ta_free_shared_buf(&psp->hdcp_context.context.mem_context); in psp_free_shared_bufs()
198 psp_ta_free_shared_buf(&psp->dtm_context.context.mem_context); in psp_free_shared_bufs()
201 psp_ta_free_shared_buf(&psp->rap_context.context.mem_context); in psp_free_shared_bufs()
204 psp_ta_free_shared_buf(&psp->securedisplay_context.context.mem_context); in psp_free_shared_bufs()
209 static void psp_memory_training_fini(struct psp_context *psp) in psp_memory_training_fini() argument
211 struct psp_memory_training_context *ctx = &psp->mem_train_ctx; in psp_memory_training_fini()
218 static int psp_memory_training_init(struct psp_context *psp) in psp_memory_training_init() argument
221 struct psp_memory_training_context *ctx = &psp->mem_train_ctx; in psp_memory_training_init()
243 psp_memory_training_fini(psp); in psp_memory_training_init()
326 static int psp_init_sriov_microcode(struct psp_context *psp) in psp_init_sriov_microcode() argument
328 struct amdgpu_device *adev = psp->adev; in psp_init_sriov_microcode()
334 ret = psp_init_cap_microcode(psp, "vega10"); in psp_init_sriov_microcode()
338 ret = psp_init_cap_microcode(psp, "navi12"); in psp_init_sriov_microcode()
342 ret = psp_init_cap_microcode(psp, "sienna_cichlid"); in psp_init_sriov_microcode()
346 ret = psp_init_cap_microcode(psp, "aldebaran"); in psp_init_sriov_microcode()
347 ret &= psp_init_ta_microcode(psp, "aldebaran"); in psp_init_sriov_microcode()
365 struct psp_context *psp = &adev->psp; in psp_sw_init() local
368 struct psp_memory_training_context *mem_training_ctx = &psp->mem_train_ctx; in psp_sw_init()
371 psp->cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL); in psp_sw_init()
372 if (!psp->cmd) { in psp_sw_init()
378 ret = psp_init_sriov_microcode(psp); in psp_sw_init()
380 ret = psp_init_microcode(psp); in psp_sw_init()
386 adev->psp.xgmi_context.supports_extended_data = in psp_sw_init()
408 psp->boot_cfg_bitmask = boot_cfg_entry.boot_cfg_bitmask; in psp_sw_init()
409 if ((psp->boot_cfg_bitmask) & in psp_sw_init()
426 ret = psp_memory_training_init(psp); in psp_sw_init()
432 ret = psp_mem_training(psp, PSP_MEM_TRAIN_COLD_BOOT); in psp_sw_init()
450 &psp->fw_pri_bo, in psp_sw_init()
451 &psp->fw_pri_mc_addr, in psp_sw_init()
452 &psp->fw_pri_buf); in psp_sw_init()
458 &psp->fence_buf_bo, in psp_sw_init()
459 &psp->fence_buf_mc_addr, in psp_sw_init()
460 &psp->fence_buf); in psp_sw_init()
466 &psp->cmd_buf_bo, &psp->cmd_buf_mc_addr, in psp_sw_init()
467 (void **)&psp->cmd_buf_mem); in psp_sw_init()
474 amdgpu_bo_free_kernel(&psp->fw_pri_bo, in psp_sw_init()
475 &psp->fw_pri_mc_addr, &psp->fw_pri_buf); in psp_sw_init()
477 amdgpu_bo_free_kernel(&psp->fence_buf_bo, in psp_sw_init()
478 &psp->fence_buf_mc_addr, &psp->fence_buf); in psp_sw_init()
485 struct psp_context *psp = &adev->psp; in psp_sw_fini() local
486 struct psp_gfx_cmd_resp *cmd = psp->cmd; in psp_sw_fini()
488 psp_memory_training_fini(psp); in psp_sw_fini()
489 if (psp->sos_fw) { in psp_sw_fini()
490 release_firmware(psp->sos_fw); in psp_sw_fini()
491 psp->sos_fw = NULL; in psp_sw_fini()
493 if (psp->asd_fw) { in psp_sw_fini()
494 release_firmware(psp->asd_fw); in psp_sw_fini()
495 psp->asd_fw = NULL; in psp_sw_fini()
497 if (psp->ta_fw) { in psp_sw_fini()
498 release_firmware(psp->ta_fw); in psp_sw_fini()
499 psp->ta_fw = NULL; in psp_sw_fini()
501 if (psp->cap_fw) { in psp_sw_fini()
502 release_firmware(psp->cap_fw); in psp_sw_fini()
503 psp->cap_fw = NULL; in psp_sw_fini()
505 if (psp->toc_fw) { in psp_sw_fini()
506 release_firmware(psp->toc_fw); in psp_sw_fini()
507 psp->toc_fw = NULL; in psp_sw_fini()
516 if (psp->km_ring.ring_mem) in psp_sw_fini()
518 &psp->km_ring.ring_mem_mc_addr, in psp_sw_fini()
519 (void **)&psp->km_ring.ring_mem); in psp_sw_fini()
521 amdgpu_bo_free_kernel(&psp->fw_pri_bo, in psp_sw_fini()
522 &psp->fw_pri_mc_addr, &psp->fw_pri_buf); in psp_sw_fini()
523 amdgpu_bo_free_kernel(&psp->fence_buf_bo, in psp_sw_fini()
524 &psp->fence_buf_mc_addr, &psp->fence_buf); in psp_sw_fini()
525 amdgpu_bo_free_kernel(&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr, in psp_sw_fini()
526 (void **)&psp->cmd_buf_mem); in psp_sw_fini()
531 int psp_wait_for(struct psp_context *psp, uint32_t reg_index, in psp_wait_for() argument
536 struct amdgpu_device *adev = psp->adev; in psp_wait_for()
538 if (psp->adev->no_hw_access) in psp_wait_for()
595 psp_cmd_submit_buf(struct psp_context *psp, in psp_cmd_submit_buf() argument
605 if (psp->adev->no_hw_access) in psp_cmd_submit_buf()
608 if (!drm_dev_enter(adev_to_drm(psp->adev), &idx)) in psp_cmd_submit_buf()
611 memset(psp->cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE); in psp_cmd_submit_buf()
613 memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp)); in psp_cmd_submit_buf()
615 index = atomic_inc_return(&psp->fence_value); in psp_cmd_submit_buf()
616 ret = psp_ring_cmd_submit(psp, psp->cmd_buf_mc_addr, fence_mc_addr, index); in psp_cmd_submit_buf()
618 atomic_dec(&psp->fence_value); in psp_cmd_submit_buf()
622 amdgpu_device_invalidate_hdp(psp->adev, NULL); in psp_cmd_submit_buf()
623 while (*((unsigned int *)psp->fence_buf) != index) { in psp_cmd_submit_buf()
635 amdgpu_device_invalidate_hdp(psp->adev, NULL); in psp_cmd_submit_buf()
639 skip_unsupport = (psp->cmd_buf_mem->resp.status == TEE_ERROR_NOT_SUPPORTED || in psp_cmd_submit_buf()
640 psp->cmd_buf_mem->resp.status == PSP_ERR_UNKNOWN_COMMAND) && amdgpu_sriov_vf(psp->adev); in psp_cmd_submit_buf()
642 memcpy((void*)&cmd->resp, (void*)&psp->cmd_buf_mem->resp, sizeof(struct psp_gfx_resp)); in psp_cmd_submit_buf()
651 if (!skip_unsupport && (psp->cmd_buf_mem->resp.status || !timeout) && !ras_intr) { in psp_cmd_submit_buf()
656 psp_gfx_cmd_name(psp->cmd_buf_mem->cmd_id), psp->cmd_buf_mem->cmd_id, in psp_cmd_submit_buf()
657 psp->cmd_buf_mem->resp.status); in psp_cmd_submit_buf()
662 if ((ucode && amdgpu_sriov_vf(psp->adev)) || !timeout) { in psp_cmd_submit_buf()
669 ucode->tmr_mc_addr_lo = psp->cmd_buf_mem->resp.fw_addr_lo; in psp_cmd_submit_buf()
670 ucode->tmr_mc_addr_hi = psp->cmd_buf_mem->resp.fw_addr_hi; in psp_cmd_submit_buf()
678 static struct psp_gfx_cmd_resp *acquire_psp_cmd_buf(struct psp_context *psp) in acquire_psp_cmd_buf() argument
680 struct psp_gfx_cmd_resp *cmd = psp->cmd; in acquire_psp_cmd_buf()
682 mutex_lock(&psp->mutex); in acquire_psp_cmd_buf()
689 static void release_psp_cmd_buf(struct psp_context *psp) in release_psp_cmd_buf() argument
691 mutex_unlock(&psp->mutex); in release_psp_cmd_buf()
694 static void psp_prep_tmr_cmd_buf(struct psp_context *psp, in psp_prep_tmr_cmd_buf() argument
698 struct amdgpu_device *adev = psp->adev; in psp_prep_tmr_cmd_buf()
702 if (amdgpu_sriov_vf(psp->adev)) in psp_prep_tmr_cmd_buf()
724 static int psp_load_toc(struct psp_context *psp, in psp_load_toc() argument
728 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_load_toc()
731 psp_copy_fw(psp, psp->toc.start_addr, psp->toc.size_bytes); in psp_load_toc()
733 psp_prep_load_toc_cmd_buf(cmd, psp->fw_pri_mc_addr, psp->toc.size_bytes); in psp_load_toc()
735 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_load_toc()
736 psp->fence_buf_mc_addr); in psp_load_toc()
738 *tmr_size = psp->cmd_buf_mem->resp.tmr_size; in psp_load_toc()
740 release_psp_cmd_buf(psp); in psp_load_toc()
746 static int psp_tmr_init(struct psp_context *psp) in psp_tmr_init() argument
760 tmr_size = PSP_TMR_SIZE(psp->adev); in psp_tmr_init()
764 if (!amdgpu_sriov_vf(psp->adev) && in psp_tmr_init()
765 psp->toc.start_addr && in psp_tmr_init()
766 psp->toc.size_bytes && in psp_tmr_init()
767 psp->fw_pri_buf) { in psp_tmr_init()
768 ret = psp_load_toc(psp, &tmr_size); in psp_tmr_init()
775 if (!psp->tmr_bo) { in psp_tmr_init()
776 pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL; in psp_tmr_init()
777 ret = amdgpu_bo_create_kernel(psp->adev, tmr_size, PSP_TMR_ALIGNMENT, in psp_tmr_init()
779 &psp->tmr_bo, &psp->tmr_mc_addr, pptr); in psp_tmr_init()
785 static bool psp_skip_tmr(struct psp_context *psp) in psp_skip_tmr() argument
787 switch (psp->adev->ip_versions[MP0_HWIP][0]) { in psp_skip_tmr()
798 static int psp_tmr_load(struct psp_context *psp) in psp_tmr_load() argument
806 if (amdgpu_sriov_vf(psp->adev) && psp_skip_tmr(psp)) in psp_tmr_load()
809 cmd = acquire_psp_cmd_buf(psp); in psp_tmr_load()
811 psp_prep_tmr_cmd_buf(psp, cmd, psp->tmr_mc_addr, psp->tmr_bo); in psp_tmr_load()
813 amdgpu_bo_size(psp->tmr_bo), psp->tmr_mc_addr); in psp_tmr_load()
815 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_tmr_load()
816 psp->fence_buf_mc_addr); in psp_tmr_load()
818 release_psp_cmd_buf(psp); in psp_tmr_load()
823 static void psp_prep_tmr_unload_cmd_buf(struct psp_context *psp, in psp_prep_tmr_unload_cmd_buf() argument
826 if (amdgpu_sriov_vf(psp->adev)) in psp_prep_tmr_unload_cmd_buf()
832 static int psp_tmr_unload(struct psp_context *psp) in psp_tmr_unload() argument
835 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_tmr_unload()
837 psp_prep_tmr_unload_cmd_buf(psp, cmd); in psp_tmr_unload()
838 dev_info(psp->adev->dev, "free PSP TMR buffer\n"); in psp_tmr_unload()
840 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_tmr_unload()
841 psp->fence_buf_mc_addr); in psp_tmr_unload()
843 release_psp_cmd_buf(psp); in psp_tmr_unload()
848 static int psp_tmr_terminate(struct psp_context *psp) in psp_tmr_terminate() argument
850 return psp_tmr_unload(psp); in psp_tmr_terminate()
853 int psp_get_fw_attestation_records_addr(struct psp_context *psp, in psp_get_fw_attestation_records_addr() argument
862 if (amdgpu_sriov_vf(psp->adev)) in psp_get_fw_attestation_records_addr()
865 cmd = acquire_psp_cmd_buf(psp); in psp_get_fw_attestation_records_addr()
869 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_get_fw_attestation_records_addr()
870 psp->fence_buf_mc_addr); in psp_get_fw_attestation_records_addr()
877 release_psp_cmd_buf(psp); in psp_get_fw_attestation_records_addr()
884 struct psp_context *psp = &adev->psp; in psp_boot_config_get() local
891 cmd = acquire_psp_cmd_buf(psp); in psp_boot_config_get()
896 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_boot_config_get()
902 release_psp_cmd_buf(psp); in psp_boot_config_get()
910 struct psp_context *psp = &adev->psp; in psp_boot_config_set() local
916 cmd = acquire_psp_cmd_buf(psp); in psp_boot_config_set()
923 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_boot_config_set()
925 release_psp_cmd_buf(psp); in psp_boot_config_set()
933 struct psp_context *psp = &adev->psp; in psp_rl_load() local
936 if (!is_psp_fw_valid(psp->rl)) in psp_rl_load()
939 cmd = acquire_psp_cmd_buf(psp); in psp_rl_load()
941 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_rl_load()
942 memcpy(psp->fw_pri_buf, psp->rl.start_addr, psp->rl.size_bytes); in psp_rl_load()
945 cmd->cmd.cmd_load_ip_fw.fw_phy_addr_lo = lower_32_bits(psp->fw_pri_mc_addr); in psp_rl_load()
946 cmd->cmd.cmd_load_ip_fw.fw_phy_addr_hi = upper_32_bits(psp->fw_pri_mc_addr); in psp_rl_load()
947 cmd->cmd.cmd_load_ip_fw.fw_size = psp->rl.size_bytes; in psp_rl_load()
950 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_rl_load()
952 release_psp_cmd_buf(psp); in psp_rl_load()
957 static int psp_asd_initialize(struct psp_context *psp) in psp_asd_initialize() argument
965 if (amdgpu_sriov_vf(psp->adev) || !psp->asd_context.bin_desc.size_bytes) in psp_asd_initialize()
968 psp->asd_context.mem_context.shared_mc_addr = 0; in psp_asd_initialize()
969 psp->asd_context.mem_context.shared_mem_size = PSP_ASD_SHARED_MEM_SIZE; in psp_asd_initialize()
970 psp->asd_context.ta_load_type = GFX_CMD_ID_LOAD_ASD; in psp_asd_initialize()
972 ret = psp_ta_load(psp, &psp->asd_context); in psp_asd_initialize()
974 psp->asd_context.initialized = true; in psp_asd_initialize()
986 int psp_ta_unload(struct psp_context *psp, struct ta_context *context) in psp_ta_unload() argument
989 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_ta_unload()
993 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_ta_unload()
995 release_psp_cmd_buf(psp); in psp_ta_unload()
1000 static int psp_asd_terminate(struct psp_context *psp) in psp_asd_terminate() argument
1004 if (amdgpu_sriov_vf(psp->adev)) in psp_asd_terminate()
1007 if (!psp->asd_context.initialized) in psp_asd_terminate()
1010 ret = psp_ta_unload(psp, &psp->asd_context); in psp_asd_terminate()
1012 psp->asd_context.initialized = false; in psp_asd_terminate()
1025 int psp_reg_program(struct psp_context *psp, enum psp_reg_prog_id reg, in psp_reg_program() argument
1034 cmd = acquire_psp_cmd_buf(psp); in psp_reg_program()
1037 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_reg_program()
1041 release_psp_cmd_buf(psp); in psp_reg_program()
1062 int psp_ta_init_shared_buf(struct psp_context *psp, in psp_ta_init_shared_buf() argument
1069 return amdgpu_bo_create_kernel(psp->adev, mem_ctx->shared_mem_size, in psp_ta_init_shared_buf()
1093 int psp_ta_invoke_indirect(struct psp_context *psp, in psp_ta_invoke_indirect() argument
1098 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_ta_invoke_indirect()
1102 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_ta_invoke_indirect()
1103 psp->fence_buf_mc_addr); in psp_ta_invoke_indirect()
1107 release_psp_cmd_buf(psp); in psp_ta_invoke_indirect()
1121 int psp_ta_invoke(struct psp_context *psp, in psp_ta_invoke() argument
1126 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_ta_invoke()
1130 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_ta_invoke()
1131 psp->fence_buf_mc_addr); in psp_ta_invoke()
1135 release_psp_cmd_buf(psp); in psp_ta_invoke()
1140 int psp_ta_load(struct psp_context *psp, struct ta_context *context) in psp_ta_load() argument
1145 cmd = acquire_psp_cmd_buf(psp); in psp_ta_load()
1147 psp_copy_fw(psp, context->bin_desc.start_addr, in psp_ta_load()
1150 psp_prep_ta_load_cmd_buf(cmd, psp->fw_pri_mc_addr, context); in psp_ta_load()
1152 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_ta_load()
1153 psp->fence_buf_mc_addr); in psp_ta_load()
1161 release_psp_cmd_buf(psp); in psp_ta_load()
1166 int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_xgmi_invoke() argument
1168 return psp_ta_invoke(psp, ta_cmd_id, &psp->xgmi_context.context); in psp_xgmi_invoke()
1171 int psp_xgmi_terminate(struct psp_context *psp) in psp_xgmi_terminate() argument
1174 struct amdgpu_device *adev = psp->adev; in psp_xgmi_terminate()
1182 if (!psp->xgmi_context.context.initialized) in psp_xgmi_terminate()
1185 ret = psp_ta_unload(psp, &psp->xgmi_context.context); in psp_xgmi_terminate()
1187 psp->xgmi_context.context.initialized = false; in psp_xgmi_terminate()
1192 int psp_xgmi_initialize(struct psp_context *psp, bool set_extended_data, bool load_ta) in psp_xgmi_initialize() argument
1197 if (!psp->ta_fw || in psp_xgmi_initialize()
1198 !psp->xgmi_context.context.bin_desc.size_bytes || in psp_xgmi_initialize()
1199 !psp->xgmi_context.context.bin_desc.start_addr) in psp_xgmi_initialize()
1205 psp->xgmi_context.context.mem_context.shared_mem_size = PSP_XGMI_SHARED_MEM_SIZE; in psp_xgmi_initialize()
1206 psp->xgmi_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_xgmi_initialize()
1208 if (!psp->xgmi_context.context.mem_context.shared_buf) { in psp_xgmi_initialize()
1209 ret = psp_ta_init_shared_buf(psp, &psp->xgmi_context.context.mem_context); in psp_xgmi_initialize()
1215 ret = psp_ta_load(psp, &psp->xgmi_context.context); in psp_xgmi_initialize()
1217 psp->xgmi_context.context.initialized = true; in psp_xgmi_initialize()
1223 xgmi_cmd = (struct ta_xgmi_shared_memory *)(psp->xgmi_context.context.mem_context.shared_buf); in psp_xgmi_initialize()
1228 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_initialize()
1233 int psp_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id) in psp_xgmi_get_hive_id() argument
1238 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_get_hive_id()
1244 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_get_hive_id()
1253 int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id) in psp_xgmi_get_node_id() argument
1258 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_get_node_id()
1264 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_get_node_id()
1273 static bool psp_xgmi_peer_link_info_supported(struct psp_context *psp) in psp_xgmi_peer_link_info_supported() argument
1275 return psp->adev->ip_versions[MP0_HWIP][0] == IP_VERSION(13, 0, 2) && in psp_xgmi_peer_link_info_supported()
1276 psp->xgmi_context.context.bin_desc.fw_version >= 0x2000000b; in psp_xgmi_peer_link_info_supported()
1286 static void psp_xgmi_reflect_topology_info(struct psp_context *psp, in psp_xgmi_reflect_topology_info() argument
1291 uint64_t src_node_id = psp->adev->gmc.xgmi.node_id; in psp_xgmi_reflect_topology_info()
1296 hive = amdgpu_get_xgmi_hive(psp->adev); in psp_xgmi_reflect_topology_info()
1304 mirror_top_info = &mirror_adev->psp.xgmi_context.top_info; in psp_xgmi_reflect_topology_info()
1327 int psp_xgmi_get_topology_info(struct psp_context *psp, in psp_xgmi_get_topology_info() argument
1341 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_get_topology_info()
1358 ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO); in psp_xgmi_get_topology_info()
1382 if (psp_xgmi_peer_link_info_supported(psp)) { in psp_xgmi_get_topology_info()
1387 ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_PEER_LINKS); in psp_xgmi_get_topology_info()
1401 if (psp->xgmi_context.supports_extended_data && in psp_xgmi_get_topology_info()
1403 psp_xgmi_reflect_topology_info(psp, topology->nodes[i]); in psp_xgmi_get_topology_info()
1410 int psp_xgmi_set_topology_info(struct psp_context *psp, in psp_xgmi_set_topology_info() argument
1421 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_set_topology_info()
1436 return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO); in psp_xgmi_set_topology_info()
1440 static void psp_ras_ta_check_status(struct psp_context *psp) in psp_ras_ta_check_status() argument
1443 (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_ta_check_status()
1447 dev_warn(psp->adev->dev, in psp_ras_ta_check_status()
1451 dev_warn(psp->adev->dev, in psp_ras_ta_check_status()
1458 dev_warn(psp->adev->dev, in psp_ras_ta_check_status()
1462 dev_warn(psp->adev->dev, in psp_ras_ta_check_status()
1468 int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_ras_invoke() argument
1473 ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_invoke()
1478 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_invoke()
1481 ret = psp_ta_invoke(psp, ta_cmd_id, &psp->ras_context.context); in psp_ras_invoke()
1494 dev_warn(psp->adev->dev, "ECC switch disabled\n"); in psp_ras_invoke()
1499 dev_warn(psp->adev->dev, in psp_ras_invoke()
1502 psp_ras_ta_check_status(psp); in psp_ras_invoke()
1508 int psp_ras_enable_features(struct psp_context *psp, in psp_ras_enable_features() argument
1514 if (!psp->ras_context.context.initialized) in psp_ras_enable_features()
1517 ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_enable_features()
1527 ret = psp_ras_invoke(psp, ras_cmd->cmd_id); in psp_ras_enable_features()
1534 int psp_ras_terminate(struct psp_context *psp) in psp_ras_terminate() argument
1541 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_terminate()
1544 if (!psp->ras_context.context.initialized) in psp_ras_terminate()
1547 ret = psp_ta_unload(psp, &psp->ras_context.context); in psp_ras_terminate()
1549 psp->ras_context.context.initialized = false; in psp_ras_terminate()
1554 static int psp_ras_initialize(struct psp_context *psp) in psp_ras_initialize() argument
1558 struct amdgpu_device *adev = psp->adev; in psp_ras_initialize()
1567 if (!adev->psp.ras_context.context.bin_desc.size_bytes || in psp_ras_initialize()
1568 !adev->psp.ras_context.context.bin_desc.start_addr) { in psp_ras_initialize()
1581 if (!amdgpu_ras_is_supported(psp->adev, AMDGPU_RAS_BLOCK__UMC)) { in psp_ras_initialize()
1614 psp->ras_context.context.mem_context.shared_mem_size = PSP_RAS_SHARED_MEM_SIZE; in psp_ras_initialize()
1615 psp->ras_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_ras_initialize()
1617 if (!psp->ras_context.context.initialized) { in psp_ras_initialize()
1618 ret = psp_ta_init_shared_buf(psp, &psp->ras_context.context.mem_context); in psp_ras_initialize()
1623 ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_initialize()
1631 ret = psp_ta_load(psp, &psp->ras_context.context); in psp_ras_initialize()
1634 psp->ras_context.context.initialized = true; in psp_ras_initialize()
1637 dev_warn(psp->adev->dev, "RAS Init Status: 0x%X\n", ras_cmd->ras_status); in psp_ras_initialize()
1638 amdgpu_ras_fini(psp->adev); in psp_ras_initialize()
1644 int psp_ras_trigger_error(struct psp_context *psp, in psp_ras_trigger_error() argument
1650 if (!psp->ras_context.context.initialized) in psp_ras_trigger_error()
1653 ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_trigger_error()
1659 ret = psp_ras_invoke(psp, ras_cmd->cmd_id); in psp_ras_trigger_error()
1678 static int psp_hdcp_initialize(struct psp_context *psp) in psp_hdcp_initialize() argument
1685 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_initialize()
1688 if (!psp->hdcp_context.context.bin_desc.size_bytes || in psp_hdcp_initialize()
1689 !psp->hdcp_context.context.bin_desc.start_addr) { in psp_hdcp_initialize()
1690 dev_info(psp->adev->dev, "HDCP: optional hdcp ta ucode is not available\n"); in psp_hdcp_initialize()
1694 psp->hdcp_context.context.mem_context.shared_mem_size = PSP_HDCP_SHARED_MEM_SIZE; in psp_hdcp_initialize()
1695 psp->hdcp_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_hdcp_initialize()
1697 if (!psp->hdcp_context.context.initialized) { in psp_hdcp_initialize()
1698 ret = psp_ta_init_shared_buf(psp, &psp->hdcp_context.context.mem_context); in psp_hdcp_initialize()
1703 ret = psp_ta_load(psp, &psp->hdcp_context.context); in psp_hdcp_initialize()
1705 psp->hdcp_context.context.initialized = true; in psp_hdcp_initialize()
1706 mutex_init(&psp->hdcp_context.mutex); in psp_hdcp_initialize()
1712 int psp_hdcp_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_hdcp_invoke() argument
1717 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_invoke()
1720 return psp_ta_invoke(psp, ta_cmd_id, &psp->hdcp_context.context); in psp_hdcp_invoke()
1723 static int psp_hdcp_terminate(struct psp_context *psp) in psp_hdcp_terminate() argument
1730 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_terminate()
1733 if (!psp->hdcp_context.context.initialized) in psp_hdcp_terminate()
1736 ret = psp_ta_unload(psp, &psp->hdcp_context.context); in psp_hdcp_terminate()
1738 psp->hdcp_context.context.initialized = false; in psp_hdcp_terminate()
1745 static int psp_dtm_initialize(struct psp_context *psp) in psp_dtm_initialize() argument
1752 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_initialize()
1755 if (!psp->dtm_context.context.bin_desc.size_bytes || in psp_dtm_initialize()
1756 !psp->dtm_context.context.bin_desc.start_addr) { in psp_dtm_initialize()
1757 dev_info(psp->adev->dev, "DTM: optional dtm ta ucode is not available\n"); in psp_dtm_initialize()
1761 psp->dtm_context.context.mem_context.shared_mem_size = PSP_DTM_SHARED_MEM_SIZE; in psp_dtm_initialize()
1762 psp->dtm_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_dtm_initialize()
1764 if (!psp->dtm_context.context.initialized) { in psp_dtm_initialize()
1765 ret = psp_ta_init_shared_buf(psp, &psp->dtm_context.context.mem_context); in psp_dtm_initialize()
1770 ret = psp_ta_load(psp, &psp->dtm_context.context); in psp_dtm_initialize()
1772 psp->dtm_context.context.initialized = true; in psp_dtm_initialize()
1773 mutex_init(&psp->dtm_context.mutex); in psp_dtm_initialize()
1779 int psp_dtm_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_dtm_invoke() argument
1784 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_invoke()
1787 return psp_ta_invoke(psp, ta_cmd_id, &psp->dtm_context.context); in psp_dtm_invoke()
1790 static int psp_dtm_terminate(struct psp_context *psp) in psp_dtm_terminate() argument
1797 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_terminate()
1800 if (!psp->dtm_context.context.initialized) in psp_dtm_terminate()
1803 ret = psp_ta_unload(psp, &psp->dtm_context.context); in psp_dtm_terminate()
1805 psp->dtm_context.context.initialized = false; in psp_dtm_terminate()
1812 static int psp_rap_initialize(struct psp_context *psp) in psp_rap_initialize() argument
1820 if (amdgpu_sriov_vf(psp->adev)) in psp_rap_initialize()
1823 if (!psp->rap_context.context.bin_desc.size_bytes || in psp_rap_initialize()
1824 !psp->rap_context.context.bin_desc.start_addr) { in psp_rap_initialize()
1825 dev_info(psp->adev->dev, "RAP: optional rap ta ucode is not available\n"); in psp_rap_initialize()
1829 psp->rap_context.context.mem_context.shared_mem_size = PSP_RAP_SHARED_MEM_SIZE; in psp_rap_initialize()
1830 psp->rap_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_rap_initialize()
1832 if (!psp->rap_context.context.initialized) { in psp_rap_initialize()
1833 ret = psp_ta_init_shared_buf(psp, &psp->rap_context.context.mem_context); in psp_rap_initialize()
1838 ret = psp_ta_load(psp, &psp->rap_context.context); in psp_rap_initialize()
1840 psp->rap_context.context.initialized = true; in psp_rap_initialize()
1841 mutex_init(&psp->rap_context.mutex); in psp_rap_initialize()
1845 ret = psp_rap_invoke(psp, TA_CMD_RAP__INITIALIZE, &status); in psp_rap_initialize()
1847 psp_rap_terminate(psp); in psp_rap_initialize()
1849 psp_ta_free_shared_buf(&psp->rap_context.context.mem_context); in psp_rap_initialize()
1851 dev_warn(psp->adev->dev, "RAP TA initialize fail (%d) status %d.\n", in psp_rap_initialize()
1860 static int psp_rap_terminate(struct psp_context *psp) in psp_rap_terminate() argument
1864 if (!psp->rap_context.context.initialized) in psp_rap_terminate()
1867 ret = psp_ta_unload(psp, &psp->rap_context.context); in psp_rap_terminate()
1869 psp->rap_context.context.initialized = false; in psp_rap_terminate()
1874 int psp_rap_invoke(struct psp_context *psp, uint32_t ta_cmd_id, enum ta_rap_status *status) in psp_rap_invoke() argument
1879 if (!psp->rap_context.context.initialized) in psp_rap_invoke()
1886 mutex_lock(&psp->rap_context.mutex); in psp_rap_invoke()
1889 psp->rap_context.context.mem_context.shared_buf; in psp_rap_invoke()
1895 ret = psp_ta_invoke(psp, rap_cmd->cmd_id, &psp->rap_context.context); in psp_rap_invoke()
1903 mutex_unlock(&psp->rap_context.mutex); in psp_rap_invoke()
1910 static int psp_securedisplay_initialize(struct psp_context *psp) in psp_securedisplay_initialize() argument
1918 if (amdgpu_sriov_vf(psp->adev)) in psp_securedisplay_initialize()
1921 if (!psp->securedisplay_context.context.bin_desc.size_bytes || in psp_securedisplay_initialize()
1922 !psp->securedisplay_context.context.bin_desc.start_addr) { in psp_securedisplay_initialize()
1923 dev_info(psp->adev->dev, "SECUREDISPLAY: securedisplay ta ucode is not available\n"); in psp_securedisplay_initialize()
1927 psp->securedisplay_context.context.mem_context.shared_mem_size = in psp_securedisplay_initialize()
1929 psp->securedisplay_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_securedisplay_initialize()
1931 if (!psp->securedisplay_context.context.initialized) { in psp_securedisplay_initialize()
1932 ret = psp_ta_init_shared_buf(psp, in psp_securedisplay_initialize()
1933 &psp->securedisplay_context.context.mem_context); in psp_securedisplay_initialize()
1938 ret = psp_ta_load(psp, &psp->securedisplay_context.context); in psp_securedisplay_initialize()
1940 psp->securedisplay_context.context.initialized = true; in psp_securedisplay_initialize()
1941 mutex_init(&psp->securedisplay_context.mutex); in psp_securedisplay_initialize()
1945 psp_prep_securedisplay_cmd_buf(psp, &securedisplay_cmd, in psp_securedisplay_initialize()
1948 ret = psp_securedisplay_invoke(psp, TA_SECUREDISPLAY_COMMAND__QUERY_TA); in psp_securedisplay_initialize()
1950 psp_securedisplay_terminate(psp); in psp_securedisplay_initialize()
1952 psp_ta_free_shared_buf(&psp->securedisplay_context.context.mem_context); in psp_securedisplay_initialize()
1953 dev_err(psp->adev->dev, "SECUREDISPLAY TA initialize fail.\n"); in psp_securedisplay_initialize()
1958 psp_securedisplay_parse_resp_status(psp, securedisplay_cmd->status); in psp_securedisplay_initialize()
1959 dev_err(psp->adev->dev, "SECUREDISPLAY: query securedisplay TA failed. ret 0x%x\n", in psp_securedisplay_initialize()
1966 static int psp_securedisplay_terminate(struct psp_context *psp) in psp_securedisplay_terminate() argument
1973 if (amdgpu_sriov_vf(psp->adev)) in psp_securedisplay_terminate()
1976 if (!psp->securedisplay_context.context.initialized) in psp_securedisplay_terminate()
1979 ret = psp_ta_unload(psp, &psp->securedisplay_context.context); in psp_securedisplay_terminate()
1981 psp->securedisplay_context.context.initialized = false; in psp_securedisplay_terminate()
1986 int psp_securedisplay_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_securedisplay_invoke() argument
1990 if (!psp->securedisplay_context.context.initialized) in psp_securedisplay_invoke()
1997 mutex_lock(&psp->securedisplay_context.mutex); in psp_securedisplay_invoke()
1999 ret = psp_ta_invoke(psp, ta_cmd_id, &psp->securedisplay_context.context); in psp_securedisplay_invoke()
2001 mutex_unlock(&psp->securedisplay_context.mutex); in psp_securedisplay_invoke()
2007 static int psp_hw_start(struct psp_context *psp) in psp_hw_start() argument
2009 struct amdgpu_device *adev = psp->adev; in psp_hw_start()
2013 if ((is_psp_fw_valid(psp->kdb)) && in psp_hw_start()
2014 (psp->funcs->bootloader_load_kdb != NULL)) { in psp_hw_start()
2015 ret = psp_bootloader_load_kdb(psp); in psp_hw_start()
2022 if ((is_psp_fw_valid(psp->spl)) && in psp_hw_start()
2023 (psp->funcs->bootloader_load_spl != NULL)) { in psp_hw_start()
2024 ret = psp_bootloader_load_spl(psp); in psp_hw_start()
2031 if ((is_psp_fw_valid(psp->sys)) && in psp_hw_start()
2032 (psp->funcs->bootloader_load_sysdrv != NULL)) { in psp_hw_start()
2033 ret = psp_bootloader_load_sysdrv(psp); in psp_hw_start()
2040 if ((is_psp_fw_valid(psp->soc_drv)) && in psp_hw_start()
2041 (psp->funcs->bootloader_load_soc_drv != NULL)) { in psp_hw_start()
2042 ret = psp_bootloader_load_soc_drv(psp); in psp_hw_start()
2049 if ((is_psp_fw_valid(psp->intf_drv)) && in psp_hw_start()
2050 (psp->funcs->bootloader_load_intf_drv != NULL)) { in psp_hw_start()
2051 ret = psp_bootloader_load_intf_drv(psp); in psp_hw_start()
2058 if ((is_psp_fw_valid(psp->dbg_drv)) && in psp_hw_start()
2059 (psp->funcs->bootloader_load_dbg_drv != NULL)) { in psp_hw_start()
2060 ret = psp_bootloader_load_dbg_drv(psp); in psp_hw_start()
2067 if ((is_psp_fw_valid(psp->ras_drv)) && in psp_hw_start()
2068 (psp->funcs->bootloader_load_ras_drv != NULL)) { in psp_hw_start()
2069 ret = psp_bootloader_load_ras_drv(psp); in psp_hw_start()
2076 if ((is_psp_fw_valid(psp->sos)) && in psp_hw_start()
2077 (psp->funcs->bootloader_load_sos != NULL)) { in psp_hw_start()
2078 ret = psp_bootloader_load_sos(psp); in psp_hw_start()
2086 ret = psp_ring_create(psp, PSP_RING_TYPE__KM); in psp_hw_start()
2095 ret = psp_tmr_init(psp); in psp_hw_start()
2107 if (psp->pmfw_centralized_cstate_management) { in psp_hw_start()
2108 ret = psp_load_smu_fw(psp); in psp_hw_start()
2113 ret = psp_tmr_load(psp); in psp_hw_start()
2314 static void psp_print_fw_hdr(struct psp_context *psp, in psp_print_fw_hdr() argument
2317 struct amdgpu_device *adev = psp->adev; in psp_print_fw_hdr()
2380 static int psp_execute_non_psp_fw_load(struct psp_context *psp, in psp_execute_non_psp_fw_load() argument
2384 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_execute_non_psp_fw_load()
2388 ret = psp_cmd_submit_buf(psp, ucode, cmd, in psp_execute_non_psp_fw_load()
2389 psp->fence_buf_mc_addr); in psp_execute_non_psp_fw_load()
2392 release_psp_cmd_buf(psp); in psp_execute_non_psp_fw_load()
2397 static int psp_load_smu_fw(struct psp_context *psp) in psp_load_smu_fw() argument
2400 struct amdgpu_device *adev = psp->adev; in psp_load_smu_fw()
2403 struct amdgpu_ras *ras = psp->ras_context.ras; in psp_load_smu_fw()
2412 if (!ucode->fw || amdgpu_sriov_vf(psp->adev)) in psp_load_smu_fw()
2425 ret = psp_execute_non_psp_fw_load(psp, ucode); in psp_load_smu_fw()
2433 static bool fw_load_skip_check(struct psp_context *psp, in fw_load_skip_check() argument
2440 (psp_smu_reload_quirk(psp) || in fw_load_skip_check()
2441 psp->autoload_supported || in fw_load_skip_check()
2442 psp->pmfw_centralized_cstate_management)) in fw_load_skip_check()
2445 if (amdgpu_sriov_vf(psp->adev) && in fw_load_skip_check()
2446 amdgpu_virt_fw_load_skip_check(psp->adev, ucode->ucode_id)) in fw_load_skip_check()
2449 if (psp->autoload_supported && in fw_load_skip_check()
2458 int psp_load_fw_list(struct psp_context *psp, in psp_load_fw_list() argument
2466 psp_print_fw_hdr(psp, ucode); in psp_load_fw_list()
2467 ret = psp_execute_non_psp_fw_load(psp, ucode); in psp_load_fw_list()
2474 static int psp_load_non_psp_fw(struct psp_context *psp) in psp_load_non_psp_fw() argument
2478 struct amdgpu_device *adev = psp->adev; in psp_load_non_psp_fw()
2480 if (psp->autoload_supported && in psp_load_non_psp_fw()
2481 !psp->pmfw_centralized_cstate_management) { in psp_load_non_psp_fw()
2482 ret = psp_load_smu_fw(psp); in psp_load_non_psp_fw()
2491 !fw_load_skip_check(psp, ucode)) { in psp_load_non_psp_fw()
2492 ret = psp_load_smu_fw(psp); in psp_load_non_psp_fw()
2498 if (fw_load_skip_check(psp, ucode)) in psp_load_non_psp_fw()
2501 if (psp->autoload_supported && in psp_load_non_psp_fw()
2512 psp_print_fw_hdr(psp, ucode); in psp_load_non_psp_fw()
2514 ret = psp_execute_non_psp_fw_load(psp, ucode); in psp_load_non_psp_fw()
2519 if (psp->autoload_supported && ucode->ucode_id == (amdgpu_sriov_vf(adev) ? in psp_load_non_psp_fw()
2521 ret = psp_rlc_autoload_start(psp); in psp_load_non_psp_fw()
2535 struct psp_context *psp = &adev->psp; in psp_load_fw() local
2539 psp_ring_stop(psp, PSP_RING_TYPE__KM); in psp_load_fw()
2541 memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE); in psp_load_fw()
2543 ret = psp_ring_init(psp, PSP_RING_TYPE__KM); in psp_load_fw()
2550 ret = psp_hw_start(psp); in psp_load_fw()
2554 ret = psp_load_non_psp_fw(psp); in psp_load_fw()
2558 ret = psp_asd_initialize(psp); in psp_load_fw()
2572 ret = psp_xgmi_initialize(psp, false, true); in psp_load_fw()
2577 dev_err(psp->adev->dev, in psp_load_fw()
2582 if (psp->ta_fw) { in psp_load_fw()
2583 ret = psp_ras_initialize(psp); in psp_load_fw()
2585 dev_err(psp->adev->dev, in psp_load_fw()
2588 ret = psp_hdcp_initialize(psp); in psp_load_fw()
2590 dev_err(psp->adev->dev, in psp_load_fw()
2593 ret = psp_dtm_initialize(psp); in psp_load_fw()
2595 dev_err(psp->adev->dev, in psp_load_fw()
2598 ret = psp_rap_initialize(psp); in psp_load_fw()
2600 dev_err(psp->adev->dev, in psp_load_fw()
2603 ret = psp_securedisplay_initialize(psp); in psp_load_fw()
2605 dev_err(psp->adev->dev, in psp_load_fw()
2612 psp_free_shared_bufs(psp); in psp_load_fw()
2619 psp_ring_destroy(psp, PSP_RING_TYPE__KM); in psp_load_fw()
2655 struct psp_context *psp = &adev->psp; in psp_hw_fini() local
2657 if (psp->ta_fw) { in psp_hw_fini()
2658 psp_ras_terminate(psp); in psp_hw_fini()
2659 psp_securedisplay_terminate(psp); in psp_hw_fini()
2660 psp_rap_terminate(psp); in psp_hw_fini()
2661 psp_dtm_terminate(psp); in psp_hw_fini()
2662 psp_hdcp_terminate(psp); in psp_hw_fini()
2665 psp_xgmi_terminate(psp); in psp_hw_fini()
2668 psp_asd_terminate(psp); in psp_hw_fini()
2669 psp_tmr_terminate(psp); in psp_hw_fini()
2671 psp_ring_destroy(psp, PSP_RING_TYPE__KM); in psp_hw_fini()
2673 psp_free_shared_bufs(psp); in psp_hw_fini()
2682 struct psp_context *psp = &adev->psp; in psp_suspend() local
2685 psp->xgmi_context.context.initialized) { in psp_suspend()
2686 ret = psp_xgmi_terminate(psp); in psp_suspend()
2693 if (psp->ta_fw) { in psp_suspend()
2694 ret = psp_ras_terminate(psp); in psp_suspend()
2699 ret = psp_hdcp_terminate(psp); in psp_suspend()
2704 ret = psp_dtm_terminate(psp); in psp_suspend()
2709 ret = psp_rap_terminate(psp); in psp_suspend()
2714 ret = psp_securedisplay_terminate(psp); in psp_suspend()
2721 ret = psp_asd_terminate(psp); in psp_suspend()
2727 ret = psp_tmr_terminate(psp); in psp_suspend()
2733 ret = psp_ring_stop(psp, PSP_RING_TYPE__KM); in psp_suspend()
2746 struct psp_context *psp = &adev->psp; in psp_resume() local
2750 if (psp->mem_train_ctx.enable_mem_training) { in psp_resume()
2751 ret = psp_mem_training(psp, PSP_MEM_TRAIN_RESUME); in psp_resume()
2760 ret = psp_hw_start(psp); in psp_resume()
2764 ret = psp_load_non_psp_fw(psp); in psp_resume()
2768 ret = psp_asd_initialize(psp); in psp_resume()
2781 ret = psp_xgmi_initialize(psp, false, true); in psp_resume()
2786 dev_err(psp->adev->dev, in psp_resume()
2790 if (psp->ta_fw) { in psp_resume()
2791 ret = psp_ras_initialize(psp); in psp_resume()
2793 dev_err(psp->adev->dev, in psp_resume()
2796 ret = psp_hdcp_initialize(psp); in psp_resume()
2798 dev_err(psp->adev->dev, in psp_resume()
2801 ret = psp_dtm_initialize(psp); in psp_resume()
2803 dev_err(psp->adev->dev, in psp_resume()
2806 ret = psp_rap_initialize(psp); in psp_resume()
2808 dev_err(psp->adev->dev, in psp_resume()
2811 ret = psp_securedisplay_initialize(psp); in psp_resume()
2813 dev_err(psp->adev->dev, in psp_resume()
2834 mutex_lock(&adev->psp.mutex); in psp_gpu_reset()
2835 ret = psp_mode1_reset(&adev->psp); in psp_gpu_reset()
2836 mutex_unlock(&adev->psp.mutex); in psp_gpu_reset()
2841 int psp_rlc_autoload_start(struct psp_context *psp) in psp_rlc_autoload_start() argument
2844 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_rlc_autoload_start()
2848 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_rlc_autoload_start()
2849 psp->fence_buf_mc_addr); in psp_rlc_autoload_start()
2851 release_psp_cmd_buf(psp); in psp_rlc_autoload_start()
2866 return psp_execute_non_psp_fw_load(&adev->psp, &ucode); in psp_update_vcn_sram()
2869 int psp_ring_cmd_submit(struct psp_context *psp, in psp_ring_cmd_submit() argument
2876 struct psp_ring *ring = &psp->km_ring; in psp_ring_cmd_submit()
2880 struct amdgpu_device *adev = psp->adev; in psp_ring_cmd_submit()
2885 psp_write_ptr_reg = psp_ring_get_wptr(psp); in psp_ring_cmd_submit()
2915 psp_ring_set_wptr(psp, psp_write_ptr_reg); in psp_ring_cmd_submit()
2919 int psp_init_asd_microcode(struct psp_context *psp, in psp_init_asd_microcode() argument
2922 struct amdgpu_device *adev = psp->adev; in psp_init_asd_microcode()
2933 err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev); in psp_init_asd_microcode()
2937 err = amdgpu_ucode_validate(adev->psp.asd_fw); in psp_init_asd_microcode()
2941 asd_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data; in psp_init_asd_microcode()
2942 adev->psp.asd_context.bin_desc.fw_version = le32_to_cpu(asd_hdr->header.ucode_version); in psp_init_asd_microcode()
2943 adev->psp.asd_context.bin_desc.feature_version = le32_to_cpu(asd_hdr->sos.fw_version); in psp_init_asd_microcode()
2944 adev->psp.asd_context.bin_desc.size_bytes = le32_to_cpu(asd_hdr->header.ucode_size_bytes); in psp_init_asd_microcode()
2945 adev->psp.asd_context.bin_desc.start_addr = (uint8_t *)asd_hdr + in psp_init_asd_microcode()
2950 release_firmware(adev->psp.asd_fw); in psp_init_asd_microcode()
2951 adev->psp.asd_fw = NULL; in psp_init_asd_microcode()
2955 int psp_init_toc_microcode(struct psp_context *psp, in psp_init_toc_microcode() argument
2958 struct amdgpu_device *adev = psp->adev; in psp_init_toc_microcode()
2969 err = request_firmware(&adev->psp.toc_fw, fw_name, adev->dev); in psp_init_toc_microcode()
2973 err = amdgpu_ucode_validate(adev->psp.toc_fw); in psp_init_toc_microcode()
2977 toc_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.toc_fw->data; in psp_init_toc_microcode()
2978 adev->psp.toc.fw_version = le32_to_cpu(toc_hdr->header.ucode_version); in psp_init_toc_microcode()
2979 adev->psp.toc.feature_version = le32_to_cpu(toc_hdr->sos.fw_version); in psp_init_toc_microcode()
2980 adev->psp.toc.size_bytes = le32_to_cpu(toc_hdr->header.ucode_size_bytes); in psp_init_toc_microcode()
2981 adev->psp.toc.start_addr = (uint8_t *)toc_hdr + in psp_init_toc_microcode()
2986 release_firmware(adev->psp.toc_fw); in psp_init_toc_microcode()
2987 adev->psp.toc_fw = NULL; in psp_init_toc_microcode()
2991 static int parse_sos_bin_descriptor(struct psp_context *psp, in parse_sos_bin_descriptor() argument
2997 if (!psp || !desc || !sos_hdr) in parse_sos_bin_descriptor()
3006 psp->sos.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3007 psp->sos.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3008 psp->sos.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3009 psp->sos.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3012 psp->sys.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3013 psp->sys.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3014 psp->sys.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3015 psp->sys.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3018 psp->kdb.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3019 psp->kdb.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3020 psp->kdb.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3021 psp->kdb.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3024 psp->toc.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3025 psp->toc.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3026 psp->toc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3027 psp->toc.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3030 psp->spl.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3031 psp->spl.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3032 psp->spl.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3033 psp->spl.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3036 psp->rl.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3037 psp->rl.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3038 psp->rl.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3039 psp->rl.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3042 psp->soc_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3043 psp->soc_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3044 psp->soc_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3045 psp->soc_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3048 psp->intf_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3049 psp->intf_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3050 psp->intf_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3051 psp->intf_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3054 psp->dbg_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3055 psp->dbg_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3056 psp->dbg_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3057 psp->dbg_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3060 psp->ras_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3061 psp->ras_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3062 psp->ras_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3063 psp->ras_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3066 dev_warn(psp->adev->dev, "Unsupported PSP FW type: %d\n", desc->fw_type); in parse_sos_bin_descriptor()
3079 sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data; in psp_init_sos_base_fw()
3085 adev->psp.sos.fw_version = le32_to_cpu(sos_hdr->header.ucode_version); in psp_init_sos_base_fw()
3086 adev->psp.sos.feature_version = le32_to_cpu(sos_hdr->sos.fw_version); in psp_init_sos_base_fw()
3088 adev->psp.sys.size_bytes = le32_to_cpu(sos_hdr->sos.offset_bytes); in psp_init_sos_base_fw()
3089 adev->psp.sys.start_addr = ucode_array_start_addr; in psp_init_sos_base_fw()
3091 adev->psp.sos.size_bytes = le32_to_cpu(sos_hdr->sos.size_bytes); in psp_init_sos_base_fw()
3092 adev->psp.sos.start_addr = ucode_array_start_addr + in psp_init_sos_base_fw()
3096 sos_hdr_v1_3 = (const struct psp_firmware_header_v1_3 *)adev->psp.sos_fw->data; in psp_init_sos_base_fw()
3098 adev->psp.sos.fw_version = le32_to_cpu(sos_hdr_v1_3->sos_aux.fw_version); in psp_init_sos_base_fw()
3099 adev->psp.sos.feature_version = le32_to_cpu(sos_hdr_v1_3->sos_aux.fw_version); in psp_init_sos_base_fw()
3101 adev->psp.sys.size_bytes = le32_to_cpu(sos_hdr_v1_3->sys_drv_aux.size_bytes); in psp_init_sos_base_fw()
3102 adev->psp.sys.start_addr = ucode_array_start_addr + in psp_init_sos_base_fw()
3105 adev->psp.sos.size_bytes = le32_to_cpu(sos_hdr_v1_3->sos_aux.size_bytes); in psp_init_sos_base_fw()
3106 adev->psp.sos.start_addr = ucode_array_start_addr + in psp_init_sos_base_fw()
3110 if ((adev->psp.sys.size_bytes == 0) || (adev->psp.sos.size_bytes == 0)) { in psp_init_sos_base_fw()
3118 int psp_init_sos_microcode(struct psp_context *psp, in psp_init_sos_microcode() argument
3121 struct amdgpu_device *adev = psp->adev; in psp_init_sos_microcode()
3138 err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev); in psp_init_sos_microcode()
3142 err = amdgpu_ucode_validate(adev->psp.sos_fw); in psp_init_sos_microcode()
3146 sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3158 sos_hdr_v1_1 = (const struct psp_firmware_header_v1_1 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3159 adev->psp.toc.size_bytes = le32_to_cpu(sos_hdr_v1_1->toc.size_bytes); in psp_init_sos_microcode()
3160 adev->psp.toc.start_addr = (uint8_t *)adev->psp.sys.start_addr + in psp_init_sos_microcode()
3162 adev->psp.kdb.size_bytes = le32_to_cpu(sos_hdr_v1_1->kdb.size_bytes); in psp_init_sos_microcode()
3163 adev->psp.kdb.start_addr = (uint8_t *)adev->psp.sys.start_addr + in psp_init_sos_microcode()
3167 sos_hdr_v1_2 = (const struct psp_firmware_header_v1_2 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3168 adev->psp.kdb.size_bytes = le32_to_cpu(sos_hdr_v1_2->kdb.size_bytes); in psp_init_sos_microcode()
3169 adev->psp.kdb.start_addr = (uint8_t *)adev->psp.sys.start_addr + in psp_init_sos_microcode()
3173 sos_hdr_v1_3 = (const struct psp_firmware_header_v1_3 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3174 adev->psp.toc.size_bytes = le32_to_cpu(sos_hdr_v1_3->v1_1.toc.size_bytes); in psp_init_sos_microcode()
3175 adev->psp.toc.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3177 adev->psp.kdb.size_bytes = le32_to_cpu(sos_hdr_v1_3->v1_1.kdb.size_bytes); in psp_init_sos_microcode()
3178 adev->psp.kdb.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3180 adev->psp.spl.size_bytes = le32_to_cpu(sos_hdr_v1_3->spl.size_bytes); in psp_init_sos_microcode()
3181 adev->psp.spl.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3183 adev->psp.rl.size_bytes = le32_to_cpu(sos_hdr_v1_3->rl.size_bytes); in psp_init_sos_microcode()
3184 adev->psp.rl.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3189 sos_hdr_v2_0 = (const struct psp_firmware_header_v2_0 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3198 err = parse_sos_bin_descriptor(psp, in psp_init_sos_microcode()
3216 release_firmware(adev->psp.sos_fw); in psp_init_sos_microcode()
3217 adev->psp.sos_fw = NULL; in psp_init_sos_microcode()
3222 static int parse_ta_bin_descriptor(struct psp_context *psp, in parse_ta_bin_descriptor() argument
3228 if (!psp || !desc || !ta_hdr) in parse_ta_bin_descriptor()
3237 psp->asd_context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3238 psp->asd_context.bin_desc.feature_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3239 psp->asd_context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3240 psp->asd_context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3243 psp->xgmi_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3244 psp->xgmi_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3245 psp->xgmi_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3248 psp->ras_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3249 psp->ras_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3250 psp->ras_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3253 psp->hdcp_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3254 psp->hdcp_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3255 psp->hdcp_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3258 psp->dtm_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3259 psp->dtm_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3260 psp->dtm_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3263 psp->rap_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3264 psp->rap_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3265 psp->rap_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3268 psp->securedisplay_context.context.bin_desc.fw_version = in parse_ta_bin_descriptor()
3270 psp->securedisplay_context.context.bin_desc.size_bytes = in parse_ta_bin_descriptor()
3272 psp->securedisplay_context.context.bin_desc.start_addr = in parse_ta_bin_descriptor()
3276 dev_warn(psp->adev->dev, "Unsupported TA type: %d\n", desc->fw_type); in parse_ta_bin_descriptor()
3283 int psp_init_ta_microcode(struct psp_context *psp, in psp_init_ta_microcode() argument
3286 struct amdgpu_device *adev = psp->adev; in psp_init_ta_microcode()
3298 err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); in psp_init_ta_microcode()
3302 err = amdgpu_ucode_validate(adev->psp.ta_fw); in psp_init_ta_microcode()
3306 ta_hdr = (const struct ta_firmware_header_v2_0 *)adev->psp.ta_fw->data; in psp_init_ta_microcode()
3321 err = parse_ta_bin_descriptor(psp, in psp_init_ta_microcode()
3331 release_firmware(adev->psp.ta_fw); in psp_init_ta_microcode()
3332 adev->psp.ta_fw = NULL; in psp_init_ta_microcode()
3336 int psp_init_cap_microcode(struct psp_context *psp, in psp_init_cap_microcode() argument
3339 struct amdgpu_device *adev = psp->adev; in psp_init_cap_microcode()
3356 err = request_firmware(&adev->psp.cap_fw, fw_name, adev->dev); in psp_init_cap_microcode()
3363 err = amdgpu_ucode_validate(adev->psp.cap_fw); in psp_init_cap_microcode()
3371 info->fw = adev->psp.cap_fw; in psp_init_cap_microcode()
3373 adev->psp.cap_fw->data; in psp_init_cap_microcode()
3376 adev->psp.cap_fw_version = le32_to_cpu(cap_hdr_v1_0->header.ucode_version); in psp_init_cap_microcode()
3377 adev->psp.cap_feature_version = le32_to_cpu(cap_hdr_v1_0->sos.fw_version); in psp_init_cap_microcode()
3378 adev->psp.cap_ucode_size = le32_to_cpu(cap_hdr_v1_0->header.ucode_size_bytes); in psp_init_cap_microcode()
3383 release_firmware(adev->psp.cap_fw); in psp_init_cap_microcode()
3384 adev->psp.cap_fw = NULL; in psp_init_cap_microcode()
3414 mutex_lock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_read()
3415 ret = psp_read_usbc_pd_fw(&adev->psp, &fw_ver); in psp_usbc_pd_fw_sysfs_read()
3416 mutex_unlock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_read()
3464 mutex_lock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_write()
3465 ret = psp_load_usbc_pd_fw(&adev->psp, fw_pri_mc_addr); in psp_usbc_pd_fw_sysfs_write()
3466 mutex_unlock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_write()
3482 void psp_copy_fw(struct psp_context *psp, uint8_t *start_addr, uint32_t bin_size) in psp_copy_fw() argument
3486 if (!drm_dev_enter(adev_to_drm(psp->adev), &idx)) in psp_copy_fw()
3489 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_copy_fw()
3490 memcpy(psp->fw_pri_buf, start_addr, bin_size); in psp_copy_fw()
3512 adev->psp.vbflash_done = false; in amdgpu_psp_vbflash_write()
3515 if (adev->psp.vbflash_image_size > AMD_VBIOS_FILE_MAX_SIZE_B) { in amdgpu_psp_vbflash_write()
3517 kvfree(adev->psp.vbflash_tmp_buf); in amdgpu_psp_vbflash_write()
3518 adev->psp.vbflash_tmp_buf = NULL; in amdgpu_psp_vbflash_write()
3519 adev->psp.vbflash_image_size = 0; in amdgpu_psp_vbflash_write()
3524 if (!adev->psp.vbflash_tmp_buf) { in amdgpu_psp_vbflash_write()
3525 adev->psp.vbflash_tmp_buf = kvmalloc(AMD_VBIOS_FILE_MAX_SIZE_B, GFP_KERNEL); in amdgpu_psp_vbflash_write()
3526 if (!adev->psp.vbflash_tmp_buf) in amdgpu_psp_vbflash_write()
3530 mutex_lock(&adev->psp.mutex); in amdgpu_psp_vbflash_write()
3531 memcpy(adev->psp.vbflash_tmp_buf + pos, buffer, count); in amdgpu_psp_vbflash_write()
3532 adev->psp.vbflash_image_size += count; in amdgpu_psp_vbflash_write()
3533 mutex_unlock(&adev->psp.mutex); in amdgpu_psp_vbflash_write()
3554 ret = amdgpu_bo_create_kernel(adev, adev->psp.vbflash_image_size, in amdgpu_psp_vbflash_read()
3563 memcpy_toio(fw_pri_cpu_addr, adev->psp.vbflash_tmp_buf, adev->psp.vbflash_image_size); in amdgpu_psp_vbflash_read()
3565 mutex_lock(&adev->psp.mutex); in amdgpu_psp_vbflash_read()
3566 ret = psp_update_spirom(&adev->psp, fw_pri_mc_addr); in amdgpu_psp_vbflash_read()
3567 mutex_unlock(&adev->psp.mutex); in amdgpu_psp_vbflash_read()
3572 kvfree(adev->psp.vbflash_tmp_buf); in amdgpu_psp_vbflash_read()
3573 adev->psp.vbflash_tmp_buf = NULL; in amdgpu_psp_vbflash_read()
3574 adev->psp.vbflash_image_size = 0; in amdgpu_psp_vbflash_read()
3593 vbflash_status = psp_vbflash_status(&adev->psp); in amdgpu_psp_vbflash_status()
3594 if (!adev->psp.vbflash_done) in amdgpu_psp_vbflash_status()
3596 else if (adev->psp.vbflash_done && !(vbflash_status & 0x80000000)) in amdgpu_psp_vbflash_status()
3614 struct psp_context *psp = &adev->psp; in amdgpu_psp_sysfs_init() local
3622 if (!psp->adev) { in amdgpu_psp_sysfs_init()
3623 psp->adev = adev; in amdgpu_psp_sysfs_init()
3624 psp_v13_0_set_psp_funcs(psp); in amdgpu_psp_sysfs_init()