Lines Matching refs:psp
43 static int psp_load_smu_fw(struct psp_context *psp);
61 static void psp_check_pmfw_centralized_cstate_management(struct psp_context *psp) in psp_check_pmfw_centralized_cstate_management() argument
63 struct amdgpu_device *adev = psp->adev; in psp_check_pmfw_centralized_cstate_management()
65 psp->pmfw_centralized_cstate_management = false; in psp_check_pmfw_centralized_cstate_management()
75 psp->pmfw_centralized_cstate_management = true; in psp_check_pmfw_centralized_cstate_management()
81 struct psp_context *psp = &adev->psp; in psp_early_init() local
86 psp_v3_1_set_psp_funcs(psp); in psp_early_init()
87 psp->autoload_supported = false; in psp_early_init()
90 psp_v10_0_set_psp_funcs(psp); in psp_early_init()
91 psp->autoload_supported = false; in psp_early_init()
95 psp_v11_0_set_psp_funcs(psp); in psp_early_init()
96 psp->autoload_supported = false; in psp_early_init()
103 psp_v11_0_set_psp_funcs(psp); in psp_early_init()
104 psp->autoload_supported = true; in psp_early_init()
107 psp_v12_0_set_psp_funcs(psp); in psp_early_init()
113 psp->adev = adev; in psp_early_init()
115 psp_check_pmfw_centralized_cstate_management(psp); in psp_early_init()
120 static void psp_memory_training_fini(struct psp_context *psp) in psp_memory_training_fini() argument
122 struct psp_memory_training_context *ctx = &psp->mem_train_ctx; in psp_memory_training_fini()
129 static int psp_memory_training_init(struct psp_context *psp) in psp_memory_training_init() argument
132 struct psp_memory_training_context *ctx = &psp->mem_train_ctx; in psp_memory_training_init()
154 psp_memory_training_fini(psp); in psp_memory_training_init()
161 struct psp_context *psp = &adev->psp; in psp_sw_init() local
165 ret = psp_init_microcode(psp); in psp_sw_init()
172 ret = psp_memory_training_init(psp); in psp_sw_init()
177 ret = psp_mem_training(psp, PSP_MEM_TRAIN_COLD_BOOT); in psp_sw_init()
197 psp_memory_training_fini(&adev->psp); in psp_sw_fini()
198 if (adev->psp.sos_fw) { in psp_sw_fini()
199 release_firmware(adev->psp.sos_fw); in psp_sw_fini()
200 adev->psp.sos_fw = NULL; in psp_sw_fini()
202 if (adev->psp.asd_fw) { in psp_sw_fini()
203 release_firmware(adev->psp.asd_fw); in psp_sw_fini()
204 adev->psp.asd_fw = NULL; in psp_sw_fini()
206 if (adev->psp.ta_fw) { in psp_sw_fini()
207 release_firmware(adev->psp.ta_fw); in psp_sw_fini()
208 adev->psp.ta_fw = NULL; in psp_sw_fini()
218 int psp_wait_for(struct psp_context *psp, uint32_t reg_index, in psp_wait_for() argument
223 struct amdgpu_device *adev = psp->adev; in psp_wait_for()
225 if (psp->adev->in_pci_err_recovery) in psp_wait_for()
244 psp_cmd_submit_buf(struct psp_context *psp, in psp_cmd_submit_buf() argument
254 if (psp->adev->in_pci_err_recovery) in psp_cmd_submit_buf()
257 mutex_lock(&psp->mutex); in psp_cmd_submit_buf()
259 memset(psp->cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE); in psp_cmd_submit_buf()
261 memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp)); in psp_cmd_submit_buf()
263 index = atomic_inc_return(&psp->fence_value); in psp_cmd_submit_buf()
264 ret = psp_ring_cmd_submit(psp, psp->cmd_buf_mc_addr, fence_mc_addr, index); in psp_cmd_submit_buf()
266 atomic_dec(&psp->fence_value); in psp_cmd_submit_buf()
267 mutex_unlock(&psp->mutex); in psp_cmd_submit_buf()
271 amdgpu_asic_invalidate_hdp(psp->adev, NULL); in psp_cmd_submit_buf()
272 while (*((unsigned int *)psp->fence_buf) != index) { in psp_cmd_submit_buf()
284 amdgpu_asic_invalidate_hdp(psp->adev, NULL); in psp_cmd_submit_buf()
288 skip_unsupport = (psp->cmd_buf_mem->resp.status == TEE_ERROR_NOT_SUPPORTED || in psp_cmd_submit_buf()
289 psp->cmd_buf_mem->resp.status == PSP_ERR_UNKNOWN_COMMAND) && amdgpu_sriov_vf(psp->adev); in psp_cmd_submit_buf()
298 if (!skip_unsupport && (psp->cmd_buf_mem->resp.status || !timeout) && !ras_intr) { in psp_cmd_submit_buf()
303 psp->cmd_buf_mem->cmd_id, in psp_cmd_submit_buf()
304 psp->cmd_buf_mem->resp.status); in psp_cmd_submit_buf()
306 mutex_unlock(&psp->mutex); in psp_cmd_submit_buf()
312 cmd->resp.session_id = psp->cmd_buf_mem->resp.session_id; in psp_cmd_submit_buf()
315 ucode->tmr_mc_addr_lo = psp->cmd_buf_mem->resp.fw_addr_lo; in psp_cmd_submit_buf()
316 ucode->tmr_mc_addr_hi = psp->cmd_buf_mem->resp.fw_addr_hi; in psp_cmd_submit_buf()
318 mutex_unlock(&psp->mutex); in psp_cmd_submit_buf()
323 static void psp_prep_tmr_cmd_buf(struct psp_context *psp, in psp_prep_tmr_cmd_buf() argument
327 if (amdgpu_sriov_vf(psp->adev)) in psp_prep_tmr_cmd_buf()
346 static int psp_load_toc(struct psp_context *psp, in psp_load_toc() argument
356 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_load_toc()
357 memcpy(psp->fw_pri_buf, psp->toc_start_addr, psp->toc_bin_size); in psp_load_toc()
359 psp_prep_load_toc_cmd_buf(cmd, psp->fw_pri_mc_addr, psp->toc_bin_size); in psp_load_toc()
361 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_load_toc()
362 psp->fence_buf_mc_addr); in psp_load_toc()
364 *tmr_size = psp->cmd_buf_mem->resp.tmr_size; in psp_load_toc()
370 static int psp_tmr_init(struct psp_context *psp) in psp_tmr_init() argument
388 if (!amdgpu_sriov_vf(psp->adev) && in psp_tmr_init()
389 psp->toc_start_addr && in psp_tmr_init()
390 psp->toc_bin_size && in psp_tmr_init()
391 psp->fw_pri_buf) { in psp_tmr_init()
392 ret = psp_load_toc(psp, &tmr_size); in psp_tmr_init()
399 pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL; in psp_tmr_init()
400 ret = amdgpu_bo_create_kernel(psp->adev, tmr_size, PSP_TMR_SIZE, in psp_tmr_init()
402 &psp->tmr_bo, &psp->tmr_mc_addr, pptr); in psp_tmr_init()
407 static int psp_clear_vf_fw(struct psp_context *psp) in psp_clear_vf_fw() argument
412 if (!amdgpu_sriov_vf(psp->adev) || psp->adev->asic_type != CHIP_NAVI12) in psp_clear_vf_fw()
421 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_clear_vf_fw()
427 static bool psp_skip_tmr(struct psp_context *psp) in psp_skip_tmr() argument
429 switch (psp->adev->asic_type) { in psp_skip_tmr()
438 static int psp_tmr_load(struct psp_context *psp) in psp_tmr_load() argument
446 if (amdgpu_sriov_vf(psp->adev) && psp_skip_tmr(psp)) in psp_tmr_load()
453 psp_prep_tmr_cmd_buf(psp, cmd, psp->tmr_mc_addr, in psp_tmr_load()
454 amdgpu_bo_size(psp->tmr_bo)); in psp_tmr_load()
456 amdgpu_bo_size(psp->tmr_bo), psp->tmr_mc_addr); in psp_tmr_load()
458 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_tmr_load()
459 psp->fence_buf_mc_addr); in psp_tmr_load()
466 static void psp_prep_tmr_unload_cmd_buf(struct psp_context *psp, in psp_prep_tmr_unload_cmd_buf() argument
469 if (amdgpu_sriov_vf(psp->adev)) in psp_prep_tmr_unload_cmd_buf()
475 static int psp_tmr_unload(struct psp_context *psp) in psp_tmr_unload() argument
484 psp_prep_tmr_unload_cmd_buf(psp, cmd); in psp_tmr_unload()
487 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_tmr_unload()
488 psp->fence_buf_mc_addr); in psp_tmr_unload()
495 static int psp_tmr_terminate(struct psp_context *psp) in psp_tmr_terminate() argument
501 ret = psp_tmr_unload(psp); in psp_tmr_terminate()
506 pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL; in psp_tmr_terminate()
507 amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, pptr); in psp_tmr_terminate()
525 static int psp_asd_load(struct psp_context *psp) in psp_asd_load() argument
534 if (amdgpu_sriov_vf(psp->adev) || !psp->asd_fw) in psp_asd_load()
541 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_asd_load()
542 memcpy(psp->fw_pri_buf, psp->asd_start_addr, psp->asd_ucode_size); in psp_asd_load()
544 psp_prep_asd_load_cmd_buf(cmd, psp->fw_pri_mc_addr, in psp_asd_load()
545 psp->asd_ucode_size); in psp_asd_load()
547 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_asd_load()
548 psp->fence_buf_mc_addr); in psp_asd_load()
550 psp->asd_context.asd_initialized = true; in psp_asd_load()
551 psp->asd_context.session_id = cmd->resp.session_id; in psp_asd_load()
566 static int psp_asd_unload(struct psp_context *psp) in psp_asd_unload() argument
571 if (amdgpu_sriov_vf(psp->adev)) in psp_asd_unload()
574 if (!psp->asd_context.asd_initialized) in psp_asd_unload()
581 psp_prep_ta_unload_cmd_buf(cmd, psp->asd_context.session_id); in psp_asd_unload()
583 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_asd_unload()
584 psp->fence_buf_mc_addr); in psp_asd_unload()
586 psp->asd_context.asd_initialized = false; in psp_asd_unload()
601 int psp_reg_program(struct psp_context *psp, enum psp_reg_prog_id reg, in psp_reg_program() argument
615 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_reg_program()
637 static int psp_xgmi_init_shared_buf(struct psp_context *psp) in psp_xgmi_init_shared_buf() argument
645 ret = amdgpu_bo_create_kernel(psp->adev, PSP_XGMI_SHARED_MEM_SIZE, in psp_xgmi_init_shared_buf()
647 &psp->xgmi_context.xgmi_shared_bo, in psp_xgmi_init_shared_buf()
648 &psp->xgmi_context.xgmi_shared_mc_addr, in psp_xgmi_init_shared_buf()
649 &psp->xgmi_context.xgmi_shared_buf); in psp_xgmi_init_shared_buf()
663 static int psp_ta_invoke(struct psp_context *psp, in psp_ta_invoke() argument
676 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_ta_invoke()
677 psp->fence_buf_mc_addr); in psp_ta_invoke()
684 static int psp_xgmi_load(struct psp_context *psp) in psp_xgmi_load() argument
697 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_xgmi_load()
698 memcpy(psp->fw_pri_buf, psp->ta_xgmi_start_addr, psp->ta_xgmi_ucode_size); in psp_xgmi_load()
701 psp->fw_pri_mc_addr, in psp_xgmi_load()
702 psp->ta_xgmi_ucode_size, in psp_xgmi_load()
703 psp->xgmi_context.xgmi_shared_mc_addr, in psp_xgmi_load()
706 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_xgmi_load()
707 psp->fence_buf_mc_addr); in psp_xgmi_load()
710 psp->xgmi_context.initialized = 1; in psp_xgmi_load()
711 psp->xgmi_context.session_id = cmd->resp.session_id; in psp_xgmi_load()
719 static int psp_xgmi_unload(struct psp_context *psp) in psp_xgmi_unload() argument
723 struct amdgpu_device *adev = psp->adev; in psp_xgmi_unload()
737 psp_prep_ta_unload_cmd_buf(cmd, psp->xgmi_context.session_id); in psp_xgmi_unload()
739 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_xgmi_unload()
740 psp->fence_buf_mc_addr); in psp_xgmi_unload()
747 int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_xgmi_invoke() argument
749 return psp_ta_invoke(psp, ta_cmd_id, psp->xgmi_context.session_id); in psp_xgmi_invoke()
752 int psp_xgmi_terminate(struct psp_context *psp) in psp_xgmi_terminate() argument
756 if (!psp->xgmi_context.initialized) in psp_xgmi_terminate()
759 ret = psp_xgmi_unload(psp); in psp_xgmi_terminate()
763 psp->xgmi_context.initialized = 0; in psp_xgmi_terminate()
766 amdgpu_bo_free_kernel(&psp->xgmi_context.xgmi_shared_bo, in psp_xgmi_terminate()
767 &psp->xgmi_context.xgmi_shared_mc_addr, in psp_xgmi_terminate()
768 &psp->xgmi_context.xgmi_shared_buf); in psp_xgmi_terminate()
773 int psp_xgmi_initialize(struct psp_context *psp) in psp_xgmi_initialize() argument
778 if (!psp->adev->psp.ta_fw || in psp_xgmi_initialize()
779 !psp->adev->psp.ta_xgmi_ucode_size || in psp_xgmi_initialize()
780 !psp->adev->psp.ta_xgmi_start_addr) in psp_xgmi_initialize()
783 if (!psp->xgmi_context.initialized) { in psp_xgmi_initialize()
784 ret = psp_xgmi_init_shared_buf(psp); in psp_xgmi_initialize()
790 ret = psp_xgmi_load(psp); in psp_xgmi_initialize()
795 xgmi_cmd = (struct ta_xgmi_shared_memory *)(psp->xgmi_context.xgmi_shared_buf); in psp_xgmi_initialize()
799 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_initialize()
804 int psp_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id) in psp_xgmi_get_hive_id() argument
809 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf; in psp_xgmi_get_hive_id()
815 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_get_hive_id()
824 int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id) in psp_xgmi_get_node_id() argument
829 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf; in psp_xgmi_get_node_id()
835 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_get_node_id()
844 int psp_xgmi_get_topology_info(struct psp_context *psp, in psp_xgmi_get_topology_info() argument
857 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf; in psp_xgmi_get_topology_info()
873 ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO); in psp_xgmi_get_topology_info()
890 int psp_xgmi_set_topology_info(struct psp_context *psp, in psp_xgmi_set_topology_info() argument
901 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf; in psp_xgmi_set_topology_info()
916 return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO); in psp_xgmi_set_topology_info()
920 static int psp_ras_init_shared_buf(struct psp_context *psp) in psp_ras_init_shared_buf() argument
928 ret = amdgpu_bo_create_kernel(psp->adev, PSP_RAS_SHARED_MEM_SIZE, in psp_ras_init_shared_buf()
930 &psp->ras.ras_shared_bo, in psp_ras_init_shared_buf()
931 &psp->ras.ras_shared_mc_addr, in psp_ras_init_shared_buf()
932 &psp->ras.ras_shared_buf); in psp_ras_init_shared_buf()
937 static int psp_ras_load(struct psp_context *psp) in psp_ras_load() argument
946 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_load()
953 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_ras_load()
954 memcpy(psp->fw_pri_buf, psp->ta_ras_start_addr, psp->ta_ras_ucode_size); in psp_ras_load()
957 psp->fw_pri_mc_addr, in psp_ras_load()
958 psp->ta_ras_ucode_size, in psp_ras_load()
959 psp->ras.ras_shared_mc_addr, in psp_ras_load()
962 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_ras_load()
963 psp->fence_buf_mc_addr); in psp_ras_load()
965 ras_cmd = (struct ta_ras_shared_memory*)psp->ras.ras_shared_buf; in psp_ras_load()
968 psp->ras.session_id = cmd->resp.session_id; in psp_ras_load()
971 psp->ras.ras_initialized = true; in psp_ras_load()
973 dev_warn(psp->adev->dev, "RAS Init Status: 0x%X\n", ras_cmd->ras_status); in psp_ras_load()
977 amdgpu_ras_fini(psp->adev); in psp_ras_load()
984 static int psp_ras_unload(struct psp_context *psp) in psp_ras_unload() argument
992 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_unload()
999 psp_prep_ta_unload_cmd_buf(cmd, psp->ras.session_id); in psp_ras_unload()
1001 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_ras_unload()
1002 psp->fence_buf_mc_addr); in psp_ras_unload()
1009 int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_ras_invoke() argument
1014 ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf; in psp_ras_invoke()
1019 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_invoke()
1022 ret = psp_ta_invoke(psp, ta_cmd_id, psp->ras.session_id); in psp_ras_invoke()
1035 dev_warn(psp->adev->dev, "ECC switch disabled\n"); in psp_ras_invoke()
1040 dev_warn(psp->adev->dev, in psp_ras_invoke()
1047 int psp_ras_enable_features(struct psp_context *psp, in psp_ras_enable_features() argument
1053 if (!psp->ras.ras_initialized) in psp_ras_enable_features()
1056 ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf; in psp_ras_enable_features()
1066 ret = psp_ras_invoke(psp, ras_cmd->cmd_id); in psp_ras_enable_features()
1073 static int psp_ras_terminate(struct psp_context *psp) in psp_ras_terminate() argument
1080 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_terminate()
1083 if (!psp->ras.ras_initialized) in psp_ras_terminate()
1086 ret = psp_ras_unload(psp); in psp_ras_terminate()
1090 psp->ras.ras_initialized = false; in psp_ras_terminate()
1093 amdgpu_bo_free_kernel(&psp->ras.ras_shared_bo, in psp_ras_terminate()
1094 &psp->ras.ras_shared_mc_addr, in psp_ras_terminate()
1095 &psp->ras.ras_shared_buf); in psp_ras_terminate()
1100 static int psp_ras_initialize(struct psp_context *psp) in psp_ras_initialize() argument
1107 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_initialize()
1110 if (!psp->adev->psp.ta_ras_ucode_size || in psp_ras_initialize()
1111 !psp->adev->psp.ta_ras_start_addr) { in psp_ras_initialize()
1112 dev_info(psp->adev->dev, "RAS: optional ras ta ucode is not available\n"); in psp_ras_initialize()
1116 if (!psp->ras.ras_initialized) { in psp_ras_initialize()
1117 ret = psp_ras_init_shared_buf(psp); in psp_ras_initialize()
1122 ret = psp_ras_load(psp); in psp_ras_initialize()
1129 int psp_ras_trigger_error(struct psp_context *psp, in psp_ras_trigger_error() argument
1135 if (!psp->ras.ras_initialized) in psp_ras_trigger_error()
1138 ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf; in psp_ras_trigger_error()
1144 ret = psp_ras_invoke(psp, ras_cmd->cmd_id); in psp_ras_trigger_error()
1158 static int psp_hdcp_init_shared_buf(struct psp_context *psp) in psp_hdcp_init_shared_buf() argument
1166 ret = amdgpu_bo_create_kernel(psp->adev, PSP_HDCP_SHARED_MEM_SIZE, in psp_hdcp_init_shared_buf()
1168 &psp->hdcp_context.hdcp_shared_bo, in psp_hdcp_init_shared_buf()
1169 &psp->hdcp_context.hdcp_shared_mc_addr, in psp_hdcp_init_shared_buf()
1170 &psp->hdcp_context.hdcp_shared_buf); in psp_hdcp_init_shared_buf()
1175 static int psp_hdcp_load(struct psp_context *psp) in psp_hdcp_load() argument
1183 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_load()
1190 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_hdcp_load()
1191 memcpy(psp->fw_pri_buf, psp->ta_hdcp_start_addr, in psp_hdcp_load()
1192 psp->ta_hdcp_ucode_size); in psp_hdcp_load()
1195 psp->fw_pri_mc_addr, in psp_hdcp_load()
1196 psp->ta_hdcp_ucode_size, in psp_hdcp_load()
1197 psp->hdcp_context.hdcp_shared_mc_addr, in psp_hdcp_load()
1200 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_hdcp_load()
1203 psp->hdcp_context.hdcp_initialized = true; in psp_hdcp_load()
1204 psp->hdcp_context.session_id = cmd->resp.session_id; in psp_hdcp_load()
1205 mutex_init(&psp->hdcp_context.mutex); in psp_hdcp_load()
1212 static int psp_hdcp_initialize(struct psp_context *psp) in psp_hdcp_initialize() argument
1219 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_initialize()
1222 if (!psp->adev->psp.ta_hdcp_ucode_size || in psp_hdcp_initialize()
1223 !psp->adev->psp.ta_hdcp_start_addr) { in psp_hdcp_initialize()
1224 dev_info(psp->adev->dev, "HDCP: optional hdcp ta ucode is not available\n"); in psp_hdcp_initialize()
1228 if (!psp->hdcp_context.hdcp_initialized) { in psp_hdcp_initialize()
1229 ret = psp_hdcp_init_shared_buf(psp); in psp_hdcp_initialize()
1234 ret = psp_hdcp_load(psp); in psp_hdcp_initialize()
1241 static int psp_hdcp_unload(struct psp_context *psp) in psp_hdcp_unload() argument
1249 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_unload()
1256 psp_prep_ta_unload_cmd_buf(cmd, psp->hdcp_context.session_id); in psp_hdcp_unload()
1258 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_hdcp_unload()
1265 int psp_hdcp_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_hdcp_invoke() argument
1270 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_invoke()
1273 return psp_ta_invoke(psp, ta_cmd_id, psp->hdcp_context.session_id); in psp_hdcp_invoke()
1276 static int psp_hdcp_terminate(struct psp_context *psp) in psp_hdcp_terminate() argument
1283 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_terminate()
1286 if (!psp->hdcp_context.hdcp_initialized) in psp_hdcp_terminate()
1289 ret = psp_hdcp_unload(psp); in psp_hdcp_terminate()
1293 psp->hdcp_context.hdcp_initialized = false; in psp_hdcp_terminate()
1296 amdgpu_bo_free_kernel(&psp->hdcp_context.hdcp_shared_bo, in psp_hdcp_terminate()
1297 &psp->hdcp_context.hdcp_shared_mc_addr, in psp_hdcp_terminate()
1298 &psp->hdcp_context.hdcp_shared_buf); in psp_hdcp_terminate()
1305 static int psp_dtm_init_shared_buf(struct psp_context *psp) in psp_dtm_init_shared_buf() argument
1313 ret = amdgpu_bo_create_kernel(psp->adev, PSP_DTM_SHARED_MEM_SIZE, in psp_dtm_init_shared_buf()
1315 &psp->dtm_context.dtm_shared_bo, in psp_dtm_init_shared_buf()
1316 &psp->dtm_context.dtm_shared_mc_addr, in psp_dtm_init_shared_buf()
1317 &psp->dtm_context.dtm_shared_buf); in psp_dtm_init_shared_buf()
1322 static int psp_dtm_load(struct psp_context *psp) in psp_dtm_load() argument
1330 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_load()
1337 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_dtm_load()
1338 memcpy(psp->fw_pri_buf, psp->ta_dtm_start_addr, psp->ta_dtm_ucode_size); in psp_dtm_load()
1341 psp->fw_pri_mc_addr, in psp_dtm_load()
1342 psp->ta_dtm_ucode_size, in psp_dtm_load()
1343 psp->dtm_context.dtm_shared_mc_addr, in psp_dtm_load()
1346 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_dtm_load()
1349 psp->dtm_context.dtm_initialized = true; in psp_dtm_load()
1350 psp->dtm_context.session_id = cmd->resp.session_id; in psp_dtm_load()
1351 mutex_init(&psp->dtm_context.mutex); in psp_dtm_load()
1359 static int psp_dtm_initialize(struct psp_context *psp) in psp_dtm_initialize() argument
1366 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_initialize()
1369 if (!psp->adev->psp.ta_dtm_ucode_size || in psp_dtm_initialize()
1370 !psp->adev->psp.ta_dtm_start_addr) { in psp_dtm_initialize()
1371 dev_info(psp->adev->dev, "DTM: optional dtm ta ucode is not available\n"); in psp_dtm_initialize()
1375 if (!psp->dtm_context.dtm_initialized) { in psp_dtm_initialize()
1376 ret = psp_dtm_init_shared_buf(psp); in psp_dtm_initialize()
1381 ret = psp_dtm_load(psp); in psp_dtm_initialize()
1388 static int psp_dtm_unload(struct psp_context *psp) in psp_dtm_unload() argument
1396 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_unload()
1403 psp_prep_ta_unload_cmd_buf(cmd, psp->dtm_context.session_id); in psp_dtm_unload()
1405 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_dtm_unload()
1412 int psp_dtm_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_dtm_invoke() argument
1417 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_invoke()
1420 return psp_ta_invoke(psp, ta_cmd_id, psp->dtm_context.session_id); in psp_dtm_invoke()
1423 static int psp_dtm_terminate(struct psp_context *psp) in psp_dtm_terminate() argument
1430 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_terminate()
1433 if (!psp->dtm_context.dtm_initialized) in psp_dtm_terminate()
1436 ret = psp_dtm_unload(psp); in psp_dtm_terminate()
1440 psp->dtm_context.dtm_initialized = false; in psp_dtm_terminate()
1443 amdgpu_bo_free_kernel(&psp->dtm_context.dtm_shared_bo, in psp_dtm_terminate()
1444 &psp->dtm_context.dtm_shared_mc_addr, in psp_dtm_terminate()
1445 &psp->dtm_context.dtm_shared_buf); in psp_dtm_terminate()
1452 static int psp_rap_init_shared_buf(struct psp_context *psp) in psp_rap_init_shared_buf() argument
1460 ret = amdgpu_bo_create_kernel(psp->adev, PSP_RAP_SHARED_MEM_SIZE, in psp_rap_init_shared_buf()
1462 &psp->rap_context.rap_shared_bo, in psp_rap_init_shared_buf()
1463 &psp->rap_context.rap_shared_mc_addr, in psp_rap_init_shared_buf()
1464 &psp->rap_context.rap_shared_buf); in psp_rap_init_shared_buf()
1469 static int psp_rap_load(struct psp_context *psp) in psp_rap_load() argument
1478 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_rap_load()
1479 memcpy(psp->fw_pri_buf, psp->ta_rap_start_addr, psp->ta_rap_ucode_size); in psp_rap_load()
1482 psp->fw_pri_mc_addr, in psp_rap_load()
1483 psp->ta_rap_ucode_size, in psp_rap_load()
1484 psp->rap_context.rap_shared_mc_addr, in psp_rap_load()
1487 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_rap_load()
1490 psp->rap_context.rap_initialized = true; in psp_rap_load()
1491 psp->rap_context.session_id = cmd->resp.session_id; in psp_rap_load()
1492 mutex_init(&psp->rap_context.mutex); in psp_rap_load()
1500 static int psp_rap_unload(struct psp_context *psp) in psp_rap_unload() argument
1509 psp_prep_ta_unload_cmd_buf(cmd, psp->rap_context.session_id); in psp_rap_unload()
1511 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_rap_unload()
1518 static int psp_rap_initialize(struct psp_context *psp) in psp_rap_initialize() argument
1525 if (amdgpu_sriov_vf(psp->adev)) in psp_rap_initialize()
1528 if (!psp->adev->psp.ta_rap_ucode_size || in psp_rap_initialize()
1529 !psp->adev->psp.ta_rap_start_addr) { in psp_rap_initialize()
1530 dev_info(psp->adev->dev, "RAP: optional rap ta ucode is not available\n"); in psp_rap_initialize()
1534 if (!psp->rap_context.rap_initialized) { in psp_rap_initialize()
1535 ret = psp_rap_init_shared_buf(psp); in psp_rap_initialize()
1540 ret = psp_rap_load(psp); in psp_rap_initialize()
1544 ret = psp_rap_invoke(psp, TA_CMD_RAP__INITIALIZE); in psp_rap_initialize()
1546 psp_rap_unload(psp); in psp_rap_initialize()
1548 amdgpu_bo_free_kernel(&psp->rap_context.rap_shared_bo, in psp_rap_initialize()
1549 &psp->rap_context.rap_shared_mc_addr, in psp_rap_initialize()
1550 &psp->rap_context.rap_shared_buf); in psp_rap_initialize()
1552 psp->rap_context.rap_initialized = false; in psp_rap_initialize()
1554 dev_warn(psp->adev->dev, "RAP TA initialize fail.\n"); in psp_rap_initialize()
1561 static int psp_rap_terminate(struct psp_context *psp) in psp_rap_terminate() argument
1565 if (!psp->rap_context.rap_initialized) in psp_rap_terminate()
1568 ret = psp_rap_unload(psp); in psp_rap_terminate()
1570 psp->rap_context.rap_initialized = false; in psp_rap_terminate()
1573 amdgpu_bo_free_kernel(&psp->rap_context.rap_shared_bo, in psp_rap_terminate()
1574 &psp->rap_context.rap_shared_mc_addr, in psp_rap_terminate()
1575 &psp->rap_context.rap_shared_buf); in psp_rap_terminate()
1580 int psp_rap_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_rap_invoke() argument
1585 if (!psp->rap_context.rap_initialized) in psp_rap_invoke()
1592 mutex_lock(&psp->rap_context.mutex); in psp_rap_invoke()
1595 psp->rap_context.rap_shared_buf; in psp_rap_invoke()
1601 ret = psp_ta_invoke(psp, rap_cmd->cmd_id, psp->rap_context.session_id); in psp_rap_invoke()
1603 mutex_unlock(&psp->rap_context.mutex); in psp_rap_invoke()
1607 mutex_unlock(&psp->rap_context.mutex); in psp_rap_invoke()
1613 static int psp_hw_start(struct psp_context *psp) in psp_hw_start() argument
1615 struct amdgpu_device *adev = psp->adev; in psp_hw_start()
1619 if (psp->kdb_bin_size && in psp_hw_start()
1620 (psp->funcs->bootloader_load_kdb != NULL)) { in psp_hw_start()
1621 ret = psp_bootloader_load_kdb(psp); in psp_hw_start()
1628 if (psp->spl_bin_size) { in psp_hw_start()
1629 ret = psp_bootloader_load_spl(psp); in psp_hw_start()
1636 ret = psp_bootloader_load_sysdrv(psp); in psp_hw_start()
1642 ret = psp_bootloader_load_sos(psp); in psp_hw_start()
1649 ret = psp_ring_create(psp, PSP_RING_TYPE__KM); in psp_hw_start()
1655 ret = psp_clear_vf_fw(psp); in psp_hw_start()
1661 ret = psp_tmr_init(psp); in psp_hw_start()
1672 if (psp->pmfw_centralized_cstate_management) { in psp_hw_start()
1673 ret = psp_load_smu_fw(psp); in psp_hw_start()
1678 ret = psp_tmr_load(psp); in psp_hw_start()
1801 static void psp_print_fw_hdr(struct psp_context *psp, in psp_print_fw_hdr() argument
1804 struct amdgpu_device *adev = psp->adev; in psp_print_fw_hdr()
1869 static int psp_execute_np_fw_load(struct psp_context *psp, in psp_execute_np_fw_load() argument
1874 ret = psp_prep_load_ip_fw_cmd_buf(ucode, psp->cmd); in psp_execute_np_fw_load()
1878 ret = psp_cmd_submit_buf(psp, ucode, psp->cmd, in psp_execute_np_fw_load()
1879 psp->fence_buf_mc_addr); in psp_execute_np_fw_load()
1884 static int psp_load_smu_fw(struct psp_context *psp) in psp_load_smu_fw() argument
1887 struct amdgpu_device* adev = psp->adev; in psp_load_smu_fw()
1890 struct amdgpu_ras *ras = psp->ras.ras; in psp_load_smu_fw()
1892 if (!ucode->fw || amdgpu_sriov_vf(psp->adev)) in psp_load_smu_fw()
1903 ret = psp_execute_np_fw_load(psp, ucode); in psp_load_smu_fw()
1911 static bool fw_load_skip_check(struct psp_context *psp, in fw_load_skip_check() argument
1918 (psp_smu_reload_quirk(psp) || in fw_load_skip_check()
1919 psp->autoload_supported || in fw_load_skip_check()
1920 psp->pmfw_centralized_cstate_management)) in fw_load_skip_check()
1923 if (amdgpu_sriov_vf(psp->adev) && in fw_load_skip_check()
1940 if (psp->autoload_supported && in fw_load_skip_check()
1949 static int psp_np_fw_load(struct psp_context *psp) in psp_np_fw_load() argument
1953 struct amdgpu_device* adev = psp->adev; in psp_np_fw_load()
1955 if (psp->autoload_supported && in psp_np_fw_load()
1956 !psp->pmfw_centralized_cstate_management) { in psp_np_fw_load()
1957 ret = psp_load_smu_fw(psp); in psp_np_fw_load()
1966 !fw_load_skip_check(psp, ucode)) { in psp_np_fw_load()
1967 ret = psp_load_smu_fw(psp); in psp_np_fw_load()
1973 if (fw_load_skip_check(psp, ucode)) in psp_np_fw_load()
1976 if (psp->autoload_supported && in psp_np_fw_load()
1986 psp_print_fw_hdr(psp, ucode); in psp_np_fw_load()
1988 ret = psp_execute_np_fw_load(psp, ucode); in psp_np_fw_load()
1993 if (psp->autoload_supported && ucode->ucode_id == (amdgpu_sriov_vf(adev) ? in psp_np_fw_load()
1995 ret = psp_rlc_autoload_start(psp); in psp_np_fw_load()
2009 struct psp_context *psp = &adev->psp; in psp_load_fw() local
2012 psp_ring_stop(psp, PSP_RING_TYPE__KM); /* should not destroy ring, only stop */ in psp_load_fw()
2016 psp->cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL); in psp_load_fw()
2017 if (!psp->cmd) in psp_load_fw()
2022 &psp->fw_pri_bo, in psp_load_fw()
2023 &psp->fw_pri_mc_addr, in psp_load_fw()
2024 &psp->fw_pri_buf); in psp_load_fw()
2030 &psp->fence_buf_bo, in psp_load_fw()
2031 &psp->fence_buf_mc_addr, in psp_load_fw()
2032 &psp->fence_buf); in psp_load_fw()
2038 &psp->cmd_buf_bo, &psp->cmd_buf_mc_addr, in psp_load_fw()
2039 (void **)&psp->cmd_buf_mem); in psp_load_fw()
2043 memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE); in psp_load_fw()
2045 ret = psp_ring_init(psp, PSP_RING_TYPE__KM); in psp_load_fw()
2052 ret = psp_hw_start(psp); in psp_load_fw()
2056 ret = psp_np_fw_load(psp); in psp_load_fw()
2060 ret = psp_asd_load(psp); in psp_load_fw()
2066 if (psp->adev->psp.ta_fw) { in psp_load_fw()
2067 ret = psp_ras_initialize(psp); in psp_load_fw()
2069 dev_err(psp->adev->dev, in psp_load_fw()
2072 ret = psp_hdcp_initialize(psp); in psp_load_fw()
2074 dev_err(psp->adev->dev, in psp_load_fw()
2077 ret = psp_dtm_initialize(psp); in psp_load_fw()
2079 dev_err(psp->adev->dev, in psp_load_fw()
2082 ret = psp_rap_initialize(psp); in psp_load_fw()
2084 dev_err(psp->adev->dev, in psp_load_fw()
2131 struct psp_context *psp = &adev->psp; in psp_hw_fini() local
2134 if (psp->adev->psp.ta_fw) { in psp_hw_fini()
2135 psp_ras_terminate(psp); in psp_hw_fini()
2136 psp_rap_terminate(psp); in psp_hw_fini()
2137 psp_dtm_terminate(psp); in psp_hw_fini()
2138 psp_hdcp_terminate(psp); in psp_hw_fini()
2141 psp_asd_unload(psp); in psp_hw_fini()
2142 ret = psp_clear_vf_fw(psp); in psp_hw_fini()
2148 psp_tmr_terminate(psp); in psp_hw_fini()
2149 psp_ring_destroy(psp, PSP_RING_TYPE__KM); in psp_hw_fini()
2151 amdgpu_bo_free_kernel(&psp->fw_pri_bo, in psp_hw_fini()
2152 &psp->fw_pri_mc_addr, &psp->fw_pri_buf); in psp_hw_fini()
2153 amdgpu_bo_free_kernel(&psp->fence_buf_bo, in psp_hw_fini()
2154 &psp->fence_buf_mc_addr, &psp->fence_buf); in psp_hw_fini()
2155 amdgpu_bo_free_kernel(&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr, in psp_hw_fini()
2156 (void **)&psp->cmd_buf_mem); in psp_hw_fini()
2158 kfree(psp->cmd); in psp_hw_fini()
2159 psp->cmd = NULL; in psp_hw_fini()
2168 struct psp_context *psp = &adev->psp; in psp_suspend() local
2171 psp->xgmi_context.initialized == 1) { in psp_suspend()
2172 ret = psp_xgmi_terminate(psp); in psp_suspend()
2179 if (psp->adev->psp.ta_fw) { in psp_suspend()
2180 ret = psp_ras_terminate(psp); in psp_suspend()
2185 ret = psp_hdcp_terminate(psp); in psp_suspend()
2190 ret = psp_dtm_terminate(psp); in psp_suspend()
2195 ret = psp_rap_terminate(psp); in psp_suspend()
2202 ret = psp_asd_unload(psp); in psp_suspend()
2208 ret = psp_tmr_terminate(psp); in psp_suspend()
2214 ret = psp_ring_stop(psp, PSP_RING_TYPE__KM); in psp_suspend()
2227 struct psp_context *psp = &adev->psp; in psp_resume() local
2231 ret = psp_mem_training(psp, PSP_MEM_TRAIN_RESUME); in psp_resume()
2239 ret = psp_hw_start(psp); in psp_resume()
2243 ret = psp_np_fw_load(psp); in psp_resume()
2247 ret = psp_asd_load(psp); in psp_resume()
2254 ret = psp_xgmi_initialize(psp); in psp_resume()
2259 dev_err(psp->adev->dev, in psp_resume()
2263 if (psp->adev->psp.ta_fw) { in psp_resume()
2264 ret = psp_ras_initialize(psp); in psp_resume()
2266 dev_err(psp->adev->dev, in psp_resume()
2269 ret = psp_hdcp_initialize(psp); in psp_resume()
2271 dev_err(psp->adev->dev, in psp_resume()
2274 ret = psp_dtm_initialize(psp); in psp_resume()
2276 dev_err(psp->adev->dev, in psp_resume()
2279 ret = psp_rap_initialize(psp); in psp_resume()
2281 dev_err(psp->adev->dev, in psp_resume()
2302 mutex_lock(&adev->psp.mutex); in psp_gpu_reset()
2303 ret = psp_mode1_reset(&adev->psp); in psp_gpu_reset()
2304 mutex_unlock(&adev->psp.mutex); in psp_gpu_reset()
2309 int psp_rlc_autoload_start(struct psp_context *psp) in psp_rlc_autoload_start() argument
2320 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_rlc_autoload_start()
2321 psp->fence_buf_mc_addr); in psp_rlc_autoload_start()
2336 return psp_execute_np_fw_load(&adev->psp, &ucode); in psp_update_vcn_sram()
2339 int psp_ring_cmd_submit(struct psp_context *psp, in psp_ring_cmd_submit() argument
2346 struct psp_ring *ring = &psp->km_ring; in psp_ring_cmd_submit()
2350 struct amdgpu_device *adev = psp->adev; in psp_ring_cmd_submit()
2355 psp_write_ptr_reg = psp_ring_get_wptr(psp); in psp_ring_cmd_submit()
2385 psp_ring_set_wptr(psp, psp_write_ptr_reg); in psp_ring_cmd_submit()
2389 int psp_init_asd_microcode(struct psp_context *psp, in psp_init_asd_microcode() argument
2392 struct amdgpu_device *adev = psp->adev; in psp_init_asd_microcode()
2403 err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev); in psp_init_asd_microcode()
2407 err = amdgpu_ucode_validate(adev->psp.asd_fw); in psp_init_asd_microcode()
2411 asd_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data; in psp_init_asd_microcode()
2412 adev->psp.asd_fw_version = le32_to_cpu(asd_hdr->header.ucode_version); in psp_init_asd_microcode()
2413 adev->psp.asd_feature_version = le32_to_cpu(asd_hdr->ucode_feature_version); in psp_init_asd_microcode()
2414 adev->psp.asd_ucode_size = le32_to_cpu(asd_hdr->header.ucode_size_bytes); in psp_init_asd_microcode()
2415 adev->psp.asd_start_addr = (uint8_t *)asd_hdr + in psp_init_asd_microcode()
2420 release_firmware(adev->psp.asd_fw); in psp_init_asd_microcode()
2421 adev->psp.asd_fw = NULL; in psp_init_asd_microcode()
2425 int psp_init_sos_microcode(struct psp_context *psp, in psp_init_sos_microcode() argument
2428 struct amdgpu_device *adev = psp->adev; in psp_init_sos_microcode()
2442 err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev); in psp_init_sos_microcode()
2446 err = amdgpu_ucode_validate(adev->psp.sos_fw); in psp_init_sos_microcode()
2450 sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
2455 adev->psp.sos_fw_version = le32_to_cpu(sos_hdr->header.ucode_version); in psp_init_sos_microcode()
2456 adev->psp.sos_feature_version = le32_to_cpu(sos_hdr->ucode_feature_version); in psp_init_sos_microcode()
2457 adev->psp.sos_bin_size = le32_to_cpu(sos_hdr->sos_size_bytes); in psp_init_sos_microcode()
2458 adev->psp.sys_bin_size = le32_to_cpu(sos_hdr->sos_offset_bytes); in psp_init_sos_microcode()
2459 adev->psp.sys_start_addr = (uint8_t *)sos_hdr + in psp_init_sos_microcode()
2461 adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr + in psp_init_sos_microcode()
2464 sos_hdr_v1_1 = (const struct psp_firmware_header_v1_1 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
2465 adev->psp.toc_bin_size = le32_to_cpu(sos_hdr_v1_1->toc_size_bytes); in psp_init_sos_microcode()
2466 adev->psp.toc_start_addr = (uint8_t *)adev->psp.sys_start_addr + in psp_init_sos_microcode()
2468 adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_1->kdb_size_bytes); in psp_init_sos_microcode()
2469 adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr + in psp_init_sos_microcode()
2473 sos_hdr_v1_2 = (const struct psp_firmware_header_v1_2 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
2474 adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_2->kdb_size_bytes); in psp_init_sos_microcode()
2475 adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr + in psp_init_sos_microcode()
2479 sos_hdr_v1_3 = (const struct psp_firmware_header_v1_3 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
2480 adev->psp.toc_bin_size = le32_to_cpu(sos_hdr_v1_3->v1_1.toc_size_bytes); in psp_init_sos_microcode()
2481 adev->psp.toc_start_addr = (uint8_t *)adev->psp.sys_start_addr + in psp_init_sos_microcode()
2483 adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_3->v1_1.kdb_size_bytes); in psp_init_sos_microcode()
2484 adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr + in psp_init_sos_microcode()
2486 adev->psp.spl_bin_size = le32_to_cpu(sos_hdr_v1_3->spl_size_bytes); in psp_init_sos_microcode()
2487 adev->psp.spl_start_addr = (uint8_t *)adev->psp.sys_start_addr + in psp_init_sos_microcode()
2502 release_firmware(adev->psp.sos_fw); in psp_init_sos_microcode()
2503 adev->psp.sos_fw = NULL; in psp_init_sos_microcode()
2508 int parse_ta_bin_descriptor(struct psp_context *psp, in parse_ta_bin_descriptor() argument
2514 if (!psp || !desc || !ta_hdr) in parse_ta_bin_descriptor()
2523 psp->asd_fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
2524 psp->asd_feature_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
2525 psp->asd_ucode_size = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
2526 psp->asd_start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
2527 psp->asd_fw = psp->ta_fw; in parse_ta_bin_descriptor()
2530 psp->ta_xgmi_ucode_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
2531 psp->ta_xgmi_ucode_size = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
2532 psp->ta_xgmi_start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
2535 psp->ta_ras_ucode_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
2536 psp->ta_ras_ucode_size = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
2537 psp->ta_ras_start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
2540 psp->ta_hdcp_ucode_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
2541 psp->ta_hdcp_ucode_size = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
2542 psp->ta_hdcp_start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
2545 psp->ta_dtm_ucode_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
2546 psp->ta_dtm_ucode_size = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
2547 psp->ta_dtm_start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
2550 psp->ta_rap_ucode_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
2551 psp->ta_rap_ucode_size = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
2552 psp->ta_rap_start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
2555 dev_warn(psp->adev->dev, "Unsupported TA type: %d\n", desc->fw_type); in parse_ta_bin_descriptor()
2562 int psp_init_ta_microcode(struct psp_context *psp, in psp_init_ta_microcode() argument
2565 struct amdgpu_device *adev = psp->adev; in psp_init_ta_microcode()
2577 err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); in psp_init_ta_microcode()
2581 err = amdgpu_ucode_validate(adev->psp.ta_fw); in psp_init_ta_microcode()
2585 ta_hdr = (const struct ta_firmware_header_v2_0 *)adev->psp.ta_fw->data; in psp_init_ta_microcode()
2600 err = parse_ta_bin_descriptor(psp, in psp_init_ta_microcode()
2610 release_firmware(adev->psp.ta_fw); in psp_init_ta_microcode()
2611 adev->psp.ta_fw = NULL; in psp_init_ta_microcode()
2641 mutex_lock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_read()
2642 ret = psp_read_usbc_pd_fw(&adev->psp, &fw_ver); in psp_usbc_pd_fw_sysfs_read()
2643 mutex_unlock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_read()
2695 mutex_lock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_write()
2696 ret = psp_load_usbc_pd_fw(&adev->psp, dma_addr); in psp_usbc_pd_fw_sysfs_write()
2697 mutex_unlock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_write()