Lines Matching refs:psp

48 static int psp_load_smu_fw(struct psp_context *psp);
49 static int psp_ta_unload(struct psp_context *psp, struct ta_context *context);
50 static int psp_ta_load(struct psp_context *psp, struct ta_context *context);
51 static int psp_rap_terminate(struct psp_context *psp);
52 static int psp_securedisplay_terminate(struct psp_context *psp);
69 static void psp_check_pmfw_centralized_cstate_management(struct psp_context *psp) in psp_check_pmfw_centralized_cstate_management() argument
71 struct amdgpu_device *adev = psp->adev; in psp_check_pmfw_centralized_cstate_management()
74 psp->pmfw_centralized_cstate_management = false; in psp_check_pmfw_centralized_cstate_management()
88 psp->pmfw_centralized_cstate_management = true; in psp_check_pmfw_centralized_cstate_management()
91 psp->pmfw_centralized_cstate_management = false; in psp_check_pmfw_centralized_cstate_management()
99 struct psp_context *psp = &adev->psp; in psp_early_init() local
103 psp_v3_1_set_psp_funcs(psp); in psp_early_init()
104 psp->autoload_supported = false; in psp_early_init()
108 psp_v10_0_set_psp_funcs(psp); in psp_early_init()
109 psp->autoload_supported = false; in psp_early_init()
113 psp_v11_0_set_psp_funcs(psp); in psp_early_init()
114 psp->autoload_supported = false; in psp_early_init()
124 psp_v11_0_set_psp_funcs(psp); in psp_early_init()
125 psp->autoload_supported = true; in psp_early_init()
129 psp_v12_0_set_psp_funcs(psp); in psp_early_init()
132 psp_v13_0_set_psp_funcs(psp); in psp_early_init()
136 psp_v13_0_set_psp_funcs(psp); in psp_early_init()
137 psp->autoload_supported = true; in psp_early_init()
141 psp_v11_0_8_set_psp_funcs(psp); in psp_early_init()
142 psp->autoload_supported = false; in psp_early_init()
149 psp->adev = adev; in psp_early_init()
151 psp_check_pmfw_centralized_cstate_management(psp); in psp_early_init()
156 static void psp_memory_training_fini(struct psp_context *psp) in psp_memory_training_fini() argument
158 struct psp_memory_training_context *ctx = &psp->mem_train_ctx; in psp_memory_training_fini()
165 static int psp_memory_training_init(struct psp_context *psp) in psp_memory_training_init() argument
168 struct psp_memory_training_context *ctx = &psp->mem_train_ctx; in psp_memory_training_init()
190 psp_memory_training_fini(psp); in psp_memory_training_init()
265 struct psp_context *psp = &adev->psp; in psp_sw_init() local
268 struct psp_memory_training_context *mem_training_ctx = &psp->mem_train_ctx; in psp_sw_init()
270 psp->cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL); in psp_sw_init()
271 if (!psp->cmd) { in psp_sw_init()
277 ret = psp_init_microcode(psp); in psp_sw_init()
284 ret = psp_init_ta_microcode(psp, "aldebaran"); in psp_sw_init()
295 psp->boot_cfg_bitmask = boot_cfg_entry.boot_cfg_bitmask; in psp_sw_init()
296 if ((psp->boot_cfg_bitmask) & in psp_sw_init()
313 ret = psp_memory_training_init(psp); in psp_sw_init()
319 ret = psp_mem_training(psp, PSP_MEM_TRAIN_COLD_BOOT); in psp_sw_init()
340 struct psp_context *psp = &adev->psp; in psp_sw_fini() local
341 struct psp_gfx_cmd_resp *cmd = psp->cmd; in psp_sw_fini()
343 psp_memory_training_fini(psp); in psp_sw_fini()
344 if (psp->sos_fw) { in psp_sw_fini()
345 release_firmware(psp->sos_fw); in psp_sw_fini()
346 psp->sos_fw = NULL; in psp_sw_fini()
348 if (psp->asd_fw) { in psp_sw_fini()
349 release_firmware(psp->asd_fw); in psp_sw_fini()
350 psp->asd_fw = NULL; in psp_sw_fini()
352 if (psp->ta_fw) { in psp_sw_fini()
353 release_firmware(psp->ta_fw); in psp_sw_fini()
354 psp->ta_fw = NULL; in psp_sw_fini()
367 int psp_wait_for(struct psp_context *psp, uint32_t reg_index, in psp_wait_for() argument
372 struct amdgpu_device *adev = psp->adev; in psp_wait_for()
374 if (psp->adev->no_hw_access) in psp_wait_for()
431 psp_cmd_submit_buf(struct psp_context *psp, in psp_cmd_submit_buf() argument
441 if (psp->adev->no_hw_access) in psp_cmd_submit_buf()
444 if (!drm_dev_enter(adev_to_drm(psp->adev), &idx)) in psp_cmd_submit_buf()
447 memset(psp->cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE); in psp_cmd_submit_buf()
449 memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp)); in psp_cmd_submit_buf()
451 index = atomic_inc_return(&psp->fence_value); in psp_cmd_submit_buf()
452 ret = psp_ring_cmd_submit(psp, psp->cmd_buf_mc_addr, fence_mc_addr, index); in psp_cmd_submit_buf()
454 atomic_dec(&psp->fence_value); in psp_cmd_submit_buf()
458 amdgpu_device_invalidate_hdp(psp->adev, NULL); in psp_cmd_submit_buf()
459 while (*((unsigned int *)psp->fence_buf) != index) { in psp_cmd_submit_buf()
471 amdgpu_device_invalidate_hdp(psp->adev, NULL); in psp_cmd_submit_buf()
475 skip_unsupport = (psp->cmd_buf_mem->resp.status == TEE_ERROR_NOT_SUPPORTED || in psp_cmd_submit_buf()
476 psp->cmd_buf_mem->resp.status == PSP_ERR_UNKNOWN_COMMAND) && amdgpu_sriov_vf(psp->adev); in psp_cmd_submit_buf()
478 memcpy((void*)&cmd->resp, (void*)&psp->cmd_buf_mem->resp, sizeof(struct psp_gfx_resp)); in psp_cmd_submit_buf()
487 if (!skip_unsupport && (psp->cmd_buf_mem->resp.status || !timeout) && !ras_intr) { in psp_cmd_submit_buf()
492 psp_gfx_cmd_name(psp->cmd_buf_mem->cmd_id), psp->cmd_buf_mem->cmd_id, in psp_cmd_submit_buf()
493 psp->cmd_buf_mem->resp.status); in psp_cmd_submit_buf()
501 ucode->tmr_mc_addr_lo = psp->cmd_buf_mem->resp.fw_addr_lo; in psp_cmd_submit_buf()
502 ucode->tmr_mc_addr_hi = psp->cmd_buf_mem->resp.fw_addr_hi; in psp_cmd_submit_buf()
510 static struct psp_gfx_cmd_resp *acquire_psp_cmd_buf(struct psp_context *psp) in acquire_psp_cmd_buf() argument
512 struct psp_gfx_cmd_resp *cmd = psp->cmd; in acquire_psp_cmd_buf()
514 mutex_lock(&psp->mutex); in acquire_psp_cmd_buf()
521 void release_psp_cmd_buf(struct psp_context *psp) in release_psp_cmd_buf() argument
523 mutex_unlock(&psp->mutex); in release_psp_cmd_buf()
526 static void psp_prep_tmr_cmd_buf(struct psp_context *psp, in psp_prep_tmr_cmd_buf() argument
530 struct amdgpu_device *adev = psp->adev; in psp_prep_tmr_cmd_buf()
534 if (amdgpu_sriov_vf(psp->adev)) in psp_prep_tmr_cmd_buf()
556 static int psp_load_toc(struct psp_context *psp, in psp_load_toc() argument
560 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_load_toc()
563 psp_copy_fw(psp, psp->toc.start_addr, psp->toc.size_bytes); in psp_load_toc()
565 psp_prep_load_toc_cmd_buf(cmd, psp->fw_pri_mc_addr, psp->toc.size_bytes); in psp_load_toc()
567 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_load_toc()
568 psp->fence_buf_mc_addr); in psp_load_toc()
570 *tmr_size = psp->cmd_buf_mem->resp.tmr_size; in psp_load_toc()
572 release_psp_cmd_buf(psp); in psp_load_toc()
578 static int psp_tmr_init(struct psp_context *psp) in psp_tmr_init() argument
592 tmr_size = PSP_TMR_SIZE(psp->adev); in psp_tmr_init()
596 if (!amdgpu_sriov_vf(psp->adev) && in psp_tmr_init()
597 psp->toc.start_addr && in psp_tmr_init()
598 psp->toc.size_bytes && in psp_tmr_init()
599 psp->fw_pri_buf) { in psp_tmr_init()
600 ret = psp_load_toc(psp, &tmr_size); in psp_tmr_init()
607 pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL; in psp_tmr_init()
608 ret = amdgpu_bo_create_kernel(psp->adev, tmr_size, PSP_TMR_SIZE(psp->adev), in psp_tmr_init()
610 &psp->tmr_bo, &psp->tmr_mc_addr, pptr); in psp_tmr_init()
615 static bool psp_skip_tmr(struct psp_context *psp) in psp_skip_tmr() argument
617 switch (psp->adev->ip_versions[MP0_HWIP][0]) { in psp_skip_tmr()
627 static int psp_tmr_load(struct psp_context *psp) in psp_tmr_load() argument
635 if (amdgpu_sriov_vf(psp->adev) && psp_skip_tmr(psp)) in psp_tmr_load()
638 cmd = acquire_psp_cmd_buf(psp); in psp_tmr_load()
640 psp_prep_tmr_cmd_buf(psp, cmd, psp->tmr_mc_addr, psp->tmr_bo); in psp_tmr_load()
642 amdgpu_bo_size(psp->tmr_bo), psp->tmr_mc_addr); in psp_tmr_load()
644 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_tmr_load()
645 psp->fence_buf_mc_addr); in psp_tmr_load()
647 release_psp_cmd_buf(psp); in psp_tmr_load()
652 static void psp_prep_tmr_unload_cmd_buf(struct psp_context *psp, in psp_prep_tmr_unload_cmd_buf() argument
655 if (amdgpu_sriov_vf(psp->adev)) in psp_prep_tmr_unload_cmd_buf()
661 static int psp_tmr_unload(struct psp_context *psp) in psp_tmr_unload() argument
664 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_tmr_unload()
666 psp_prep_tmr_unload_cmd_buf(psp, cmd); in psp_tmr_unload()
669 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_tmr_unload()
670 psp->fence_buf_mc_addr); in psp_tmr_unload()
672 release_psp_cmd_buf(psp); in psp_tmr_unload()
677 static int psp_tmr_terminate(struct psp_context *psp) in psp_tmr_terminate() argument
683 ret = psp_tmr_unload(psp); in psp_tmr_terminate()
688 pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL; in psp_tmr_terminate()
689 amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, pptr); in psp_tmr_terminate()
694 int psp_get_fw_attestation_records_addr(struct psp_context *psp, in psp_get_fw_attestation_records_addr() argument
703 if (amdgpu_sriov_vf(psp->adev)) in psp_get_fw_attestation_records_addr()
706 cmd = acquire_psp_cmd_buf(psp); in psp_get_fw_attestation_records_addr()
710 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_get_fw_attestation_records_addr()
711 psp->fence_buf_mc_addr); in psp_get_fw_attestation_records_addr()
718 release_psp_cmd_buf(psp); in psp_get_fw_attestation_records_addr()
725 struct psp_context *psp = &adev->psp; in psp_boot_config_get() local
732 cmd = acquire_psp_cmd_buf(psp); in psp_boot_config_get()
737 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_boot_config_get()
743 release_psp_cmd_buf(psp); in psp_boot_config_get()
751 struct psp_context *psp = &adev->psp; in psp_boot_config_set() local
757 cmd = acquire_psp_cmd_buf(psp); in psp_boot_config_set()
764 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_boot_config_set()
766 release_psp_cmd_buf(psp); in psp_boot_config_set()
774 struct psp_context *psp = &adev->psp; in psp_rl_load() local
777 if (!is_psp_fw_valid(psp->rl)) in psp_rl_load()
780 cmd = acquire_psp_cmd_buf(psp); in psp_rl_load()
782 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_rl_load()
783 memcpy(psp->fw_pri_buf, psp->rl.start_addr, psp->rl.size_bytes); in psp_rl_load()
786 cmd->cmd.cmd_load_ip_fw.fw_phy_addr_lo = lower_32_bits(psp->fw_pri_mc_addr); in psp_rl_load()
787 cmd->cmd.cmd_load_ip_fw.fw_phy_addr_hi = upper_32_bits(psp->fw_pri_mc_addr); in psp_rl_load()
788 cmd->cmd.cmd_load_ip_fw.fw_size = psp->rl.size_bytes; in psp_rl_load()
791 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_rl_load()
793 release_psp_cmd_buf(psp); in psp_rl_load()
798 static int psp_asd_load(struct psp_context *psp) in psp_asd_load() argument
800 return psp_ta_load(psp, &psp->asd_context); in psp_asd_load()
803 static int psp_asd_initialize(struct psp_context *psp) in psp_asd_initialize() argument
811 if (amdgpu_sriov_vf(psp->adev) || !psp->asd_context.bin_desc.size_bytes) in psp_asd_initialize()
814 psp->asd_context.mem_context.shared_mc_addr = 0; in psp_asd_initialize()
815 psp->asd_context.mem_context.shared_mem_size = PSP_ASD_SHARED_MEM_SIZE; in psp_asd_initialize()
816 psp->asd_context.ta_load_type = GFX_CMD_ID_LOAD_ASD; in psp_asd_initialize()
818 ret = psp_asd_load(psp); in psp_asd_initialize()
820 psp->asd_context.initialized = true; in psp_asd_initialize()
832 static int psp_ta_unload(struct psp_context *psp, struct ta_context *context) in psp_ta_unload() argument
835 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_ta_unload()
839 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_ta_unload()
841 release_psp_cmd_buf(psp); in psp_ta_unload()
846 static int psp_asd_unload(struct psp_context *psp) in psp_asd_unload() argument
848 return psp_ta_unload(psp, &psp->asd_context); in psp_asd_unload()
851 static int psp_asd_terminate(struct psp_context *psp) in psp_asd_terminate() argument
855 if (amdgpu_sriov_vf(psp->adev)) in psp_asd_terminate()
858 if (!psp->asd_context.initialized) in psp_asd_terminate()
861 ret = psp_asd_unload(psp); in psp_asd_terminate()
864 psp->asd_context.initialized = false; in psp_asd_terminate()
877 int psp_reg_program(struct psp_context *psp, enum psp_reg_prog_id reg, in psp_reg_program() argument
886 cmd = acquire_psp_cmd_buf(psp); in psp_reg_program()
889 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_reg_program()
893 release_psp_cmd_buf(psp); in psp_reg_program()
914 static int psp_ta_init_shared_buf(struct psp_context *psp, in psp_ta_init_shared_buf() argument
923 ret = amdgpu_bo_create_kernel(psp->adev, mem_ctx->shared_mem_size, in psp_ta_init_shared_buf()
938 static int psp_xgmi_init_shared_buf(struct psp_context *psp) in psp_xgmi_init_shared_buf() argument
940 return psp_ta_init_shared_buf(psp, &psp->xgmi_context.context.mem_context); in psp_xgmi_init_shared_buf()
952 static int psp_ta_invoke(struct psp_context *psp, in psp_ta_invoke() argument
957 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_ta_invoke()
961 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_ta_invoke()
962 psp->fence_buf_mc_addr); in psp_ta_invoke()
964 release_psp_cmd_buf(psp); in psp_ta_invoke()
969 static int psp_ta_load(struct psp_context *psp, struct ta_context *context) in psp_ta_load() argument
974 cmd = acquire_psp_cmd_buf(psp); in psp_ta_load()
976 psp_copy_fw(psp, context->bin_desc.start_addr, in psp_ta_load()
979 psp_prep_ta_load_cmd_buf(cmd, psp->fw_pri_mc_addr, context); in psp_ta_load()
981 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_ta_load()
982 psp->fence_buf_mc_addr); in psp_ta_load()
988 release_psp_cmd_buf(psp); in psp_ta_load()
993 static int psp_xgmi_load(struct psp_context *psp) in psp_xgmi_load() argument
995 return psp_ta_load(psp, &psp->xgmi_context.context); in psp_xgmi_load()
998 static int psp_xgmi_unload(struct psp_context *psp) in psp_xgmi_unload() argument
1000 return psp_ta_unload(psp, &psp->xgmi_context.context); in psp_xgmi_unload()
1003 int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_xgmi_invoke() argument
1005 return psp_ta_invoke(psp, ta_cmd_id, &psp->xgmi_context.context); in psp_xgmi_invoke()
1008 int psp_xgmi_terminate(struct psp_context *psp) in psp_xgmi_terminate() argument
1011 struct amdgpu_device *adev = psp->adev; in psp_xgmi_terminate()
1019 if (!psp->xgmi_context.context.initialized) in psp_xgmi_terminate()
1022 ret = psp_xgmi_unload(psp); in psp_xgmi_terminate()
1026 psp->xgmi_context.context.initialized = false; in psp_xgmi_terminate()
1029 psp_ta_free_shared_buf(&psp->xgmi_context.context.mem_context); in psp_xgmi_terminate()
1034 int psp_xgmi_initialize(struct psp_context *psp, bool set_extended_data, bool load_ta) in psp_xgmi_initialize() argument
1039 if (!psp->ta_fw || in psp_xgmi_initialize()
1040 !psp->xgmi_context.context.bin_desc.size_bytes || in psp_xgmi_initialize()
1041 !psp->xgmi_context.context.bin_desc.start_addr) in psp_xgmi_initialize()
1047 psp->xgmi_context.context.mem_context.shared_mem_size = PSP_XGMI_SHARED_MEM_SIZE; in psp_xgmi_initialize()
1048 psp->xgmi_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_xgmi_initialize()
1050 if (!psp->xgmi_context.context.initialized) { in psp_xgmi_initialize()
1051 ret = psp_xgmi_init_shared_buf(psp); in psp_xgmi_initialize()
1057 ret = psp_xgmi_load(psp); in psp_xgmi_initialize()
1059 psp->xgmi_context.context.initialized = true; in psp_xgmi_initialize()
1065 xgmi_cmd = (struct ta_xgmi_shared_memory *)(psp->xgmi_context.context.mem_context.shared_buf); in psp_xgmi_initialize()
1070 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_initialize()
1075 int psp_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id) in psp_xgmi_get_hive_id() argument
1080 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_get_hive_id()
1086 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_get_hive_id()
1095 int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id) in psp_xgmi_get_node_id() argument
1100 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_get_node_id()
1106 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_get_node_id()
1115 static bool psp_xgmi_peer_link_info_supported(struct psp_context *psp) in psp_xgmi_peer_link_info_supported() argument
1117 return psp->adev->ip_versions[MP0_HWIP][0] == IP_VERSION(13, 0, 2) && in psp_xgmi_peer_link_info_supported()
1118 psp->xgmi_context.context.bin_desc.fw_version >= 0x2000000b; in psp_xgmi_peer_link_info_supported()
1128 static void psp_xgmi_reflect_topology_info(struct psp_context *psp, in psp_xgmi_reflect_topology_info() argument
1133 uint64_t src_node_id = psp->adev->gmc.xgmi.node_id; in psp_xgmi_reflect_topology_info()
1138 hive = amdgpu_get_xgmi_hive(psp->adev); in psp_xgmi_reflect_topology_info()
1146 mirror_top_info = &mirror_adev->psp.xgmi_context.top_info; in psp_xgmi_reflect_topology_info()
1167 int psp_xgmi_get_topology_info(struct psp_context *psp, in psp_xgmi_get_topology_info() argument
1181 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_get_topology_info()
1198 ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO); in psp_xgmi_get_topology_info()
1222 if (psp_xgmi_peer_link_info_supported(psp)) { in psp_xgmi_get_topology_info()
1227 ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_PEER_LINKS); in psp_xgmi_get_topology_info()
1241 if (psp->xgmi_context.supports_extended_data && in psp_xgmi_get_topology_info()
1243 psp_xgmi_reflect_topology_info(psp, topology->nodes[i]); in psp_xgmi_get_topology_info()
1250 int psp_xgmi_set_topology_info(struct psp_context *psp, in psp_xgmi_set_topology_info() argument
1261 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_set_topology_info()
1276 return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO); in psp_xgmi_set_topology_info()
1280 static int psp_ras_init_shared_buf(struct psp_context *psp) in psp_ras_init_shared_buf() argument
1282 return psp_ta_init_shared_buf(psp, &psp->ras_context.context.mem_context); in psp_ras_init_shared_buf()
1285 static int psp_ras_load(struct psp_context *psp) in psp_ras_load() argument
1287 return psp_ta_load(psp, &psp->ras_context.context); in psp_ras_load()
1290 static int psp_ras_unload(struct psp_context *psp) in psp_ras_unload() argument
1292 return psp_ta_unload(psp, &psp->ras_context.context); in psp_ras_unload()
1295 static void psp_ras_ta_check_status(struct psp_context *psp) in psp_ras_ta_check_status() argument
1298 (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_ta_check_status()
1302 dev_warn(psp->adev->dev, in psp_ras_ta_check_status()
1306 dev_warn(psp->adev->dev, in psp_ras_ta_check_status()
1312 dev_warn(psp->adev->dev, in psp_ras_ta_check_status()
1318 int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_ras_invoke() argument
1323 ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_invoke()
1328 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_invoke()
1331 ret = psp_ta_invoke(psp, ta_cmd_id, &psp->ras_context.context); in psp_ras_invoke()
1344 dev_warn(psp->adev->dev, "ECC switch disabled\n"); in psp_ras_invoke()
1349 dev_warn(psp->adev->dev, in psp_ras_invoke()
1352 psp_ras_ta_check_status(psp); in psp_ras_invoke()
1358 int psp_ras_enable_features(struct psp_context *psp, in psp_ras_enable_features() argument
1364 if (!psp->ras_context.context.initialized) in psp_ras_enable_features()
1367 ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_enable_features()
1377 ret = psp_ras_invoke(psp, ras_cmd->cmd_id); in psp_ras_enable_features()
1384 static int psp_ras_terminate(struct psp_context *psp) in psp_ras_terminate() argument
1391 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_terminate()
1394 if (!psp->ras_context.context.initialized) in psp_ras_terminate()
1397 ret = psp_ras_unload(psp); in psp_ras_terminate()
1401 psp->ras_context.context.initialized = false; in psp_ras_terminate()
1404 psp_ta_free_shared_buf(&psp->ras_context.context.mem_context); in psp_ras_terminate()
1409 static int psp_ras_initialize(struct psp_context *psp) in psp_ras_initialize() argument
1413 struct amdgpu_device *adev = psp->adev; in psp_ras_initialize()
1422 if (!adev->psp.ras_context.context.bin_desc.size_bytes || in psp_ras_initialize()
1423 !adev->psp.ras_context.context.bin_desc.start_addr) { in psp_ras_initialize()
1436 if (!amdgpu_ras_is_supported(psp->adev, AMDGPU_RAS_BLOCK__UMC)) { in psp_ras_initialize()
1469 psp->ras_context.context.mem_context.shared_mem_size = PSP_RAS_SHARED_MEM_SIZE; in psp_ras_initialize()
1470 psp->ras_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_ras_initialize()
1472 if (!psp->ras_context.context.initialized) { in psp_ras_initialize()
1473 ret = psp_ras_init_shared_buf(psp); in psp_ras_initialize()
1478 ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_initialize()
1486 ret = psp_ras_load(psp); in psp_ras_initialize()
1489 psp->ras_context.context.initialized = true; in psp_ras_initialize()
1492 dev_warn(psp->adev->dev, "RAS Init Status: 0x%X\n", ras_cmd->ras_status); in psp_ras_initialize()
1493 amdgpu_ras_fini(psp->adev); in psp_ras_initialize()
1499 int psp_ras_trigger_error(struct psp_context *psp, in psp_ras_trigger_error() argument
1505 if (!psp->ras_context.context.initialized) in psp_ras_trigger_error()
1508 ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_trigger_error()
1514 ret = psp_ras_invoke(psp, ras_cmd->cmd_id); in psp_ras_trigger_error()
1531 static int psp_hdcp_init_shared_buf(struct psp_context *psp) in psp_hdcp_init_shared_buf() argument
1533 return psp_ta_init_shared_buf(psp, &psp->hdcp_context.context.mem_context); in psp_hdcp_init_shared_buf()
1536 static int psp_hdcp_load(struct psp_context *psp) in psp_hdcp_load() argument
1538 return psp_ta_load(psp, &psp->hdcp_context.context); in psp_hdcp_load()
1541 static int psp_hdcp_initialize(struct psp_context *psp) in psp_hdcp_initialize() argument
1548 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_initialize()
1551 if (!psp->hdcp_context.context.bin_desc.size_bytes || in psp_hdcp_initialize()
1552 !psp->hdcp_context.context.bin_desc.start_addr) { in psp_hdcp_initialize()
1553 dev_info(psp->adev->dev, "HDCP: optional hdcp ta ucode is not available\n"); in psp_hdcp_initialize()
1557 psp->hdcp_context.context.mem_context.shared_mem_size = PSP_HDCP_SHARED_MEM_SIZE; in psp_hdcp_initialize()
1558 psp->hdcp_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_hdcp_initialize()
1560 if (!psp->hdcp_context.context.initialized) { in psp_hdcp_initialize()
1561 ret = psp_hdcp_init_shared_buf(psp); in psp_hdcp_initialize()
1566 ret = psp_hdcp_load(psp); in psp_hdcp_initialize()
1568 psp->hdcp_context.context.initialized = true; in psp_hdcp_initialize()
1569 mutex_init(&psp->hdcp_context.mutex); in psp_hdcp_initialize()
1575 static int psp_hdcp_unload(struct psp_context *psp) in psp_hdcp_unload() argument
1577 return psp_ta_unload(psp, &psp->hdcp_context.context); in psp_hdcp_unload()
1580 int psp_hdcp_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_hdcp_invoke() argument
1585 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_invoke()
1588 return psp_ta_invoke(psp, ta_cmd_id, &psp->hdcp_context.context); in psp_hdcp_invoke()
1591 static int psp_hdcp_terminate(struct psp_context *psp) in psp_hdcp_terminate() argument
1598 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_terminate()
1601 if (!psp->hdcp_context.context.initialized) { in psp_hdcp_terminate()
1602 if (psp->hdcp_context.context.mem_context.shared_buf) in psp_hdcp_terminate()
1608 ret = psp_hdcp_unload(psp); in psp_hdcp_terminate()
1612 psp->hdcp_context.context.initialized = false; in psp_hdcp_terminate()
1616 psp_ta_free_shared_buf(&psp->hdcp_context.context.mem_context); in psp_hdcp_terminate()
1623 static int psp_dtm_init_shared_buf(struct psp_context *psp) in psp_dtm_init_shared_buf() argument
1625 return psp_ta_init_shared_buf(psp, &psp->dtm_context.context.mem_context); in psp_dtm_init_shared_buf()
1628 static int psp_dtm_load(struct psp_context *psp) in psp_dtm_load() argument
1630 return psp_ta_load(psp, &psp->dtm_context.context); in psp_dtm_load()
1633 static int psp_dtm_initialize(struct psp_context *psp) in psp_dtm_initialize() argument
1640 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_initialize()
1643 if (!psp->dtm_context.context.bin_desc.size_bytes || in psp_dtm_initialize()
1644 !psp->dtm_context.context.bin_desc.start_addr) { in psp_dtm_initialize()
1645 dev_info(psp->adev->dev, "DTM: optional dtm ta ucode is not available\n"); in psp_dtm_initialize()
1649 psp->dtm_context.context.mem_context.shared_mem_size = PSP_DTM_SHARED_MEM_SIZE; in psp_dtm_initialize()
1650 psp->dtm_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_dtm_initialize()
1652 if (!psp->dtm_context.context.initialized) { in psp_dtm_initialize()
1653 ret = psp_dtm_init_shared_buf(psp); in psp_dtm_initialize()
1658 ret = psp_dtm_load(psp); in psp_dtm_initialize()
1660 psp->dtm_context.context.initialized = true; in psp_dtm_initialize()
1661 mutex_init(&psp->dtm_context.mutex); in psp_dtm_initialize()
1667 static int psp_dtm_unload(struct psp_context *psp) in psp_dtm_unload() argument
1669 return psp_ta_unload(psp, &psp->dtm_context.context); in psp_dtm_unload()
1672 int psp_dtm_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_dtm_invoke() argument
1677 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_invoke()
1680 return psp_ta_invoke(psp, ta_cmd_id, &psp->dtm_context.context); in psp_dtm_invoke()
1683 static int psp_dtm_terminate(struct psp_context *psp) in psp_dtm_terminate() argument
1690 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_terminate()
1693 if (!psp->dtm_context.context.initialized) { in psp_dtm_terminate()
1694 if (psp->dtm_context.context.mem_context.shared_buf) in psp_dtm_terminate()
1700 ret = psp_dtm_unload(psp); in psp_dtm_terminate()
1704 psp->dtm_context.context.initialized = false; in psp_dtm_terminate()
1708 psp_ta_free_shared_buf(&psp->dtm_context.context.mem_context); in psp_dtm_terminate()
1715 static int psp_rap_init_shared_buf(struct psp_context *psp) in psp_rap_init_shared_buf() argument
1717 return psp_ta_init_shared_buf(psp, &psp->rap_context.context.mem_context); in psp_rap_init_shared_buf()
1720 static int psp_rap_load(struct psp_context *psp) in psp_rap_load() argument
1722 return psp_ta_load(psp, &psp->rap_context.context); in psp_rap_load()
1725 static int psp_rap_unload(struct psp_context *psp) in psp_rap_unload() argument
1727 return psp_ta_unload(psp, &psp->rap_context.context); in psp_rap_unload()
1730 static int psp_rap_initialize(struct psp_context *psp) in psp_rap_initialize() argument
1738 if (amdgpu_sriov_vf(psp->adev)) in psp_rap_initialize()
1741 if (!psp->rap_context.context.bin_desc.size_bytes || in psp_rap_initialize()
1742 !psp->rap_context.context.bin_desc.start_addr) { in psp_rap_initialize()
1743 dev_info(psp->adev->dev, "RAP: optional rap ta ucode is not available\n"); in psp_rap_initialize()
1747 psp->rap_context.context.mem_context.shared_mem_size = PSP_RAP_SHARED_MEM_SIZE; in psp_rap_initialize()
1748 psp->rap_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_rap_initialize()
1750 if (!psp->rap_context.context.initialized) { in psp_rap_initialize()
1751 ret = psp_rap_init_shared_buf(psp); in psp_rap_initialize()
1756 ret = psp_rap_load(psp); in psp_rap_initialize()
1758 psp->rap_context.context.initialized = true; in psp_rap_initialize()
1759 mutex_init(&psp->rap_context.mutex); in psp_rap_initialize()
1763 ret = psp_rap_invoke(psp, TA_CMD_RAP__INITIALIZE, &status); in psp_rap_initialize()
1765 psp_rap_terminate(psp); in psp_rap_initialize()
1767 dev_warn(psp->adev->dev, "RAP TA initialize fail (%d) status %d.\n", in psp_rap_initialize()
1776 static int psp_rap_terminate(struct psp_context *psp) in psp_rap_terminate() argument
1780 if (!psp->rap_context.context.initialized) in psp_rap_terminate()
1783 ret = psp_rap_unload(psp); in psp_rap_terminate()
1785 psp->rap_context.context.initialized = false; in psp_rap_terminate()
1788 psp_ta_free_shared_buf(&psp->rap_context.context.mem_context); in psp_rap_terminate()
1793 int psp_rap_invoke(struct psp_context *psp, uint32_t ta_cmd_id, enum ta_rap_status *status) in psp_rap_invoke() argument
1798 if (!psp->rap_context.context.initialized) in psp_rap_invoke()
1805 mutex_lock(&psp->rap_context.mutex); in psp_rap_invoke()
1808 psp->rap_context.context.mem_context.shared_buf; in psp_rap_invoke()
1814 ret = psp_ta_invoke(psp, rap_cmd->cmd_id, &psp->rap_context.context); in psp_rap_invoke()
1822 mutex_unlock(&psp->rap_context.mutex); in psp_rap_invoke()
1829 static int psp_securedisplay_init_shared_buf(struct psp_context *psp) in psp_securedisplay_init_shared_buf() argument
1832 psp, &psp->securedisplay_context.context.mem_context); in psp_securedisplay_init_shared_buf()
1835 static int psp_securedisplay_load(struct psp_context *psp) in psp_securedisplay_load() argument
1837 return psp_ta_load(psp, &psp->securedisplay_context.context); in psp_securedisplay_load()
1840 static int psp_securedisplay_unload(struct psp_context *psp) in psp_securedisplay_unload() argument
1842 return psp_ta_unload(psp, &psp->securedisplay_context.context); in psp_securedisplay_unload()
1845 static int psp_securedisplay_initialize(struct psp_context *psp) in psp_securedisplay_initialize() argument
1853 if (amdgpu_sriov_vf(psp->adev)) in psp_securedisplay_initialize()
1856 if (!psp->securedisplay_context.context.bin_desc.size_bytes || in psp_securedisplay_initialize()
1857 !psp->securedisplay_context.context.bin_desc.start_addr) { in psp_securedisplay_initialize()
1858 dev_info(psp->adev->dev, "SECUREDISPLAY: securedisplay ta ucode is not available\n"); in psp_securedisplay_initialize()
1862 psp->securedisplay_context.context.mem_context.shared_mem_size = in psp_securedisplay_initialize()
1864 psp->securedisplay_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_securedisplay_initialize()
1866 if (!psp->securedisplay_context.context.initialized) { in psp_securedisplay_initialize()
1867 ret = psp_securedisplay_init_shared_buf(psp); in psp_securedisplay_initialize()
1872 ret = psp_securedisplay_load(psp); in psp_securedisplay_initialize()
1874 psp->securedisplay_context.context.initialized = true; in psp_securedisplay_initialize()
1875 mutex_init(&psp->securedisplay_context.mutex); in psp_securedisplay_initialize()
1879 psp_prep_securedisplay_cmd_buf(psp, &securedisplay_cmd, in psp_securedisplay_initialize()
1882 ret = psp_securedisplay_invoke(psp, TA_SECUREDISPLAY_COMMAND__QUERY_TA); in psp_securedisplay_initialize()
1884 psp_securedisplay_terminate(psp); in psp_securedisplay_initialize()
1885 dev_err(psp->adev->dev, "SECUREDISPLAY TA initialize fail.\n"); in psp_securedisplay_initialize()
1890 psp_securedisplay_parse_resp_status(psp, securedisplay_cmd->status); in psp_securedisplay_initialize()
1891 dev_err(psp->adev->dev, "SECUREDISPLAY: query securedisplay TA failed. ret 0x%x\n", in psp_securedisplay_initialize()
1898 static int psp_securedisplay_terminate(struct psp_context *psp) in psp_securedisplay_terminate() argument
1905 if (amdgpu_sriov_vf(psp->adev)) in psp_securedisplay_terminate()
1908 if (!psp->securedisplay_context.context.initialized) in psp_securedisplay_terminate()
1911 ret = psp_securedisplay_unload(psp); in psp_securedisplay_terminate()
1915 psp->securedisplay_context.context.initialized = false; in psp_securedisplay_terminate()
1918 psp_ta_free_shared_buf(&psp->securedisplay_context.context.mem_context); in psp_securedisplay_terminate()
1923 int psp_securedisplay_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_securedisplay_invoke() argument
1927 if (!psp->securedisplay_context.context.initialized) in psp_securedisplay_invoke()
1934 mutex_lock(&psp->securedisplay_context.mutex); in psp_securedisplay_invoke()
1936 ret = psp_ta_invoke(psp, ta_cmd_id, &psp->securedisplay_context.context); in psp_securedisplay_invoke()
1938 mutex_unlock(&psp->securedisplay_context.mutex); in psp_securedisplay_invoke()
1944 static int psp_hw_start(struct psp_context *psp) in psp_hw_start() argument
1946 struct amdgpu_device *adev = psp->adev; in psp_hw_start()
1950 if ((is_psp_fw_valid(psp->kdb)) && in psp_hw_start()
1951 (psp->funcs->bootloader_load_kdb != NULL)) { in psp_hw_start()
1952 ret = psp_bootloader_load_kdb(psp); in psp_hw_start()
1959 if ((is_psp_fw_valid(psp->spl)) && in psp_hw_start()
1960 (psp->funcs->bootloader_load_spl != NULL)) { in psp_hw_start()
1961 ret = psp_bootloader_load_spl(psp); in psp_hw_start()
1968 if ((is_psp_fw_valid(psp->sys)) && in psp_hw_start()
1969 (psp->funcs->bootloader_load_sysdrv != NULL)) { in psp_hw_start()
1970 ret = psp_bootloader_load_sysdrv(psp); in psp_hw_start()
1977 if ((is_psp_fw_valid(psp->soc_drv)) && in psp_hw_start()
1978 (psp->funcs->bootloader_load_soc_drv != NULL)) { in psp_hw_start()
1979 ret = psp_bootloader_load_soc_drv(psp); in psp_hw_start()
1986 if ((is_psp_fw_valid(psp->intf_drv)) && in psp_hw_start()
1987 (psp->funcs->bootloader_load_intf_drv != NULL)) { in psp_hw_start()
1988 ret = psp_bootloader_load_intf_drv(psp); in psp_hw_start()
1995 if ((is_psp_fw_valid(psp->dbg_drv)) && in psp_hw_start()
1996 (psp->funcs->bootloader_load_dbg_drv != NULL)) { in psp_hw_start()
1997 ret = psp_bootloader_load_dbg_drv(psp); in psp_hw_start()
2004 if ((is_psp_fw_valid(psp->sos)) && in psp_hw_start()
2005 (psp->funcs->bootloader_load_sos != NULL)) { in psp_hw_start()
2006 ret = psp_bootloader_load_sos(psp); in psp_hw_start()
2014 ret = psp_ring_create(psp, PSP_RING_TYPE__KM); in psp_hw_start()
2020 ret = psp_tmr_init(psp); in psp_hw_start()
2031 if (psp->pmfw_centralized_cstate_management) { in psp_hw_start()
2032 ret = psp_load_smu_fw(psp); in psp_hw_start()
2037 ret = psp_tmr_load(psp); in psp_hw_start()
2160 static void psp_print_fw_hdr(struct psp_context *psp, in psp_print_fw_hdr() argument
2163 struct amdgpu_device *adev = psp->adev; in psp_print_fw_hdr()
2226 static int psp_execute_non_psp_fw_load(struct psp_context *psp, in psp_execute_non_psp_fw_load() argument
2230 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_execute_non_psp_fw_load()
2234 ret = psp_cmd_submit_buf(psp, ucode, cmd, in psp_execute_non_psp_fw_load()
2235 psp->fence_buf_mc_addr); in psp_execute_non_psp_fw_load()
2238 release_psp_cmd_buf(psp); in psp_execute_non_psp_fw_load()
2243 static int psp_load_smu_fw(struct psp_context *psp) in psp_load_smu_fw() argument
2246 struct amdgpu_device *adev = psp->adev; in psp_load_smu_fw()
2249 struct amdgpu_ras *ras = psp->ras_context.ras; in psp_load_smu_fw()
2251 if (!ucode->fw || amdgpu_sriov_vf(psp->adev)) in psp_load_smu_fw()
2264 ret = psp_execute_non_psp_fw_load(psp, ucode); in psp_load_smu_fw()
2272 static bool fw_load_skip_check(struct psp_context *psp, in fw_load_skip_check() argument
2279 (psp_smu_reload_quirk(psp) || in fw_load_skip_check()
2280 psp->autoload_supported || in fw_load_skip_check()
2281 psp->pmfw_centralized_cstate_management)) in fw_load_skip_check()
2284 if (amdgpu_sriov_vf(psp->adev) && in fw_load_skip_check()
2301 if (psp->autoload_supported && in fw_load_skip_check()
2310 int psp_load_fw_list(struct psp_context *psp, in psp_load_fw_list() argument
2318 psp_print_fw_hdr(psp, ucode); in psp_load_fw_list()
2319 ret = psp_execute_non_psp_fw_load(psp, ucode); in psp_load_fw_list()
2326 static int psp_load_non_psp_fw(struct psp_context *psp) in psp_load_non_psp_fw() argument
2330 struct amdgpu_device *adev = psp->adev; in psp_load_non_psp_fw()
2332 if (psp->autoload_supported && in psp_load_non_psp_fw()
2333 !psp->pmfw_centralized_cstate_management) { in psp_load_non_psp_fw()
2334 ret = psp_load_smu_fw(psp); in psp_load_non_psp_fw()
2343 !fw_load_skip_check(psp, ucode)) { in psp_load_non_psp_fw()
2344 ret = psp_load_smu_fw(psp); in psp_load_non_psp_fw()
2350 if (fw_load_skip_check(psp, ucode)) in psp_load_non_psp_fw()
2353 if (psp->autoload_supported && in psp_load_non_psp_fw()
2364 psp_print_fw_hdr(psp, ucode); in psp_load_non_psp_fw()
2366 ret = psp_execute_non_psp_fw_load(psp, ucode); in psp_load_non_psp_fw()
2371 if (psp->autoload_supported && ucode->ucode_id == (amdgpu_sriov_vf(adev) ? in psp_load_non_psp_fw()
2373 ret = psp_rlc_autoload_start(psp); in psp_load_non_psp_fw()
2387 struct psp_context *psp = &adev->psp; in psp_load_fw() local
2390 psp_ring_stop(psp, PSP_RING_TYPE__KM); /* should not destroy ring, only stop */ in psp_load_fw()
2397 &psp->fw_pri_bo, in psp_load_fw()
2398 &psp->fw_pri_mc_addr, in psp_load_fw()
2399 &psp->fw_pri_buf); in psp_load_fw()
2403 &psp->fw_pri_bo, in psp_load_fw()
2404 &psp->fw_pri_mc_addr, in psp_load_fw()
2405 &psp->fw_pri_buf); in psp_load_fw()
2413 &psp->fence_buf_bo, in psp_load_fw()
2414 &psp->fence_buf_mc_addr, in psp_load_fw()
2415 &psp->fence_buf); in psp_load_fw()
2421 &psp->cmd_buf_bo, &psp->cmd_buf_mc_addr, in psp_load_fw()
2422 (void **)&psp->cmd_buf_mem); in psp_load_fw()
2426 memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE); in psp_load_fw()
2428 ret = psp_ring_init(psp, PSP_RING_TYPE__KM); in psp_load_fw()
2435 ret = psp_hw_start(psp); in psp_load_fw()
2439 ret = psp_load_non_psp_fw(psp); in psp_load_fw()
2443 ret = psp_asd_initialize(psp); in psp_load_fw()
2455 if (psp->ta_fw) { in psp_load_fw()
2456 ret = psp_ras_initialize(psp); in psp_load_fw()
2458 dev_err(psp->adev->dev, in psp_load_fw()
2461 ret = psp_hdcp_initialize(psp); in psp_load_fw()
2463 dev_err(psp->adev->dev, in psp_load_fw()
2466 ret = psp_dtm_initialize(psp); in psp_load_fw()
2468 dev_err(psp->adev->dev, in psp_load_fw()
2471 ret = psp_rap_initialize(psp); in psp_load_fw()
2473 dev_err(psp->adev->dev, in psp_load_fw()
2476 ret = psp_securedisplay_initialize(psp); in psp_load_fw()
2478 dev_err(psp->adev->dev, in psp_load_fw()
2525 struct psp_context *psp = &adev->psp; in psp_hw_fini() local
2527 if (psp->ta_fw) { in psp_hw_fini()
2528 psp_ras_terminate(psp); in psp_hw_fini()
2529 psp_securedisplay_terminate(psp); in psp_hw_fini()
2530 psp_rap_terminate(psp); in psp_hw_fini()
2531 psp_dtm_terminate(psp); in psp_hw_fini()
2532 psp_hdcp_terminate(psp); in psp_hw_fini()
2535 psp_asd_terminate(psp); in psp_hw_fini()
2537 psp_tmr_terminate(psp); in psp_hw_fini()
2538 psp_ring_destroy(psp, PSP_RING_TYPE__KM); in psp_hw_fini()
2540 amdgpu_bo_free_kernel(&psp->fw_pri_bo, in psp_hw_fini()
2541 &psp->fw_pri_mc_addr, &psp->fw_pri_buf); in psp_hw_fini()
2542 amdgpu_bo_free_kernel(&psp->fence_buf_bo, in psp_hw_fini()
2543 &psp->fence_buf_mc_addr, &psp->fence_buf); in psp_hw_fini()
2544 amdgpu_bo_free_kernel(&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr, in psp_hw_fini()
2545 (void **)&psp->cmd_buf_mem); in psp_hw_fini()
2554 struct psp_context *psp = &adev->psp; in psp_suspend() local
2557 psp->xgmi_context.context.initialized) { in psp_suspend()
2558 ret = psp_xgmi_terminate(psp); in psp_suspend()
2565 if (psp->ta_fw) { in psp_suspend()
2566 ret = psp_ras_terminate(psp); in psp_suspend()
2571 ret = psp_hdcp_terminate(psp); in psp_suspend()
2576 ret = psp_dtm_terminate(psp); in psp_suspend()
2581 ret = psp_rap_terminate(psp); in psp_suspend()
2586 ret = psp_securedisplay_terminate(psp); in psp_suspend()
2593 ret = psp_asd_terminate(psp); in psp_suspend()
2599 ret = psp_tmr_terminate(psp); in psp_suspend()
2605 ret = psp_ring_stop(psp, PSP_RING_TYPE__KM); in psp_suspend()
2618 struct psp_context *psp = &adev->psp; in psp_resume() local
2622 if (psp->mem_train_ctx.enable_mem_training) { in psp_resume()
2623 ret = psp_mem_training(psp, PSP_MEM_TRAIN_RESUME); in psp_resume()
2632 ret = psp_hw_start(psp); in psp_resume()
2636 ret = psp_load_non_psp_fw(psp); in psp_resume()
2640 ret = psp_asd_initialize(psp); in psp_resume()
2653 ret = psp_xgmi_initialize(psp, false, true); in psp_resume()
2658 dev_err(psp->adev->dev, in psp_resume()
2662 if (psp->ta_fw) { in psp_resume()
2663 ret = psp_ras_initialize(psp); in psp_resume()
2665 dev_err(psp->adev->dev, in psp_resume()
2668 ret = psp_hdcp_initialize(psp); in psp_resume()
2670 dev_err(psp->adev->dev, in psp_resume()
2673 ret = psp_dtm_initialize(psp); in psp_resume()
2675 dev_err(psp->adev->dev, in psp_resume()
2678 ret = psp_rap_initialize(psp); in psp_resume()
2680 dev_err(psp->adev->dev, in psp_resume()
2683 ret = psp_securedisplay_initialize(psp); in psp_resume()
2685 dev_err(psp->adev->dev, in psp_resume()
2706 mutex_lock(&adev->psp.mutex); in psp_gpu_reset()
2707 ret = psp_mode1_reset(&adev->psp); in psp_gpu_reset()
2708 mutex_unlock(&adev->psp.mutex); in psp_gpu_reset()
2713 int psp_rlc_autoload_start(struct psp_context *psp) in psp_rlc_autoload_start() argument
2716 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_rlc_autoload_start()
2720 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_rlc_autoload_start()
2721 psp->fence_buf_mc_addr); in psp_rlc_autoload_start()
2723 release_psp_cmd_buf(psp); in psp_rlc_autoload_start()
2738 return psp_execute_non_psp_fw_load(&adev->psp, &ucode); in psp_update_vcn_sram()
2741 int psp_ring_cmd_submit(struct psp_context *psp, in psp_ring_cmd_submit() argument
2748 struct psp_ring *ring = &psp->km_ring; in psp_ring_cmd_submit()
2752 struct amdgpu_device *adev = psp->adev; in psp_ring_cmd_submit()
2757 psp_write_ptr_reg = psp_ring_get_wptr(psp); in psp_ring_cmd_submit()
2787 psp_ring_set_wptr(psp, psp_write_ptr_reg); in psp_ring_cmd_submit()
2791 int psp_init_asd_microcode(struct psp_context *psp, in psp_init_asd_microcode() argument
2794 struct amdgpu_device *adev = psp->adev; in psp_init_asd_microcode()
2805 err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev); in psp_init_asd_microcode()
2809 err = amdgpu_ucode_validate(adev->psp.asd_fw); in psp_init_asd_microcode()
2813 asd_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data; in psp_init_asd_microcode()
2814 adev->psp.asd_context.bin_desc.fw_version = le32_to_cpu(asd_hdr->header.ucode_version); in psp_init_asd_microcode()
2815 adev->psp.asd_context.bin_desc.feature_version = le32_to_cpu(asd_hdr->sos.fw_version); in psp_init_asd_microcode()
2816 adev->psp.asd_context.bin_desc.size_bytes = le32_to_cpu(asd_hdr->header.ucode_size_bytes); in psp_init_asd_microcode()
2817 adev->psp.asd_context.bin_desc.start_addr = (uint8_t *)asd_hdr + in psp_init_asd_microcode()
2822 release_firmware(adev->psp.asd_fw); in psp_init_asd_microcode()
2823 adev->psp.asd_fw = NULL; in psp_init_asd_microcode()
2827 int psp_init_toc_microcode(struct psp_context *psp, in psp_init_toc_microcode() argument
2830 struct amdgpu_device *adev = psp->adev; in psp_init_toc_microcode()
2841 err = request_firmware(&adev->psp.toc_fw, fw_name, adev->dev); in psp_init_toc_microcode()
2845 err = amdgpu_ucode_validate(adev->psp.toc_fw); in psp_init_toc_microcode()
2849 toc_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.toc_fw->data; in psp_init_toc_microcode()
2850 adev->psp.toc.fw_version = le32_to_cpu(toc_hdr->header.ucode_version); in psp_init_toc_microcode()
2851 adev->psp.toc.feature_version = le32_to_cpu(toc_hdr->sos.fw_version); in psp_init_toc_microcode()
2852 adev->psp.toc.size_bytes = le32_to_cpu(toc_hdr->header.ucode_size_bytes); in psp_init_toc_microcode()
2853 adev->psp.toc.start_addr = (uint8_t *)toc_hdr + in psp_init_toc_microcode()
2858 release_firmware(adev->psp.toc_fw); in psp_init_toc_microcode()
2859 adev->psp.toc_fw = NULL; in psp_init_toc_microcode()
2863 static int parse_sos_bin_descriptor(struct psp_context *psp, in parse_sos_bin_descriptor() argument
2869 if (!psp || !desc || !sos_hdr) in parse_sos_bin_descriptor()
2878 psp->sos.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2879 psp->sos.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2880 psp->sos.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
2881 psp->sos.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
2884 psp->sys.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2885 psp->sys.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2886 psp->sys.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
2887 psp->sys.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
2890 psp->kdb.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2891 psp->kdb.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2892 psp->kdb.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
2893 psp->kdb.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
2896 psp->toc.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2897 psp->toc.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2898 psp->toc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
2899 psp->toc.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
2902 psp->spl.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2903 psp->spl.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2904 psp->spl.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
2905 psp->spl.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
2908 psp->rl.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2909 psp->rl.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2910 psp->rl.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
2911 psp->rl.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
2914 psp->soc_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2915 psp->soc_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2916 psp->soc_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
2917 psp->soc_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
2920 psp->intf_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2921 psp->intf_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2922 psp->intf_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
2923 psp->intf_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
2926 psp->dbg_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2927 psp->dbg_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
2928 psp->dbg_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
2929 psp->dbg_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
2932 dev_warn(psp->adev->dev, "Unsupported PSP FW type: %d\n", desc->fw_type); in parse_sos_bin_descriptor()
2945 sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data; in psp_init_sos_base_fw()
2951 adev->psp.sos.fw_version = le32_to_cpu(sos_hdr->header.ucode_version); in psp_init_sos_base_fw()
2952 adev->psp.sos.feature_version = le32_to_cpu(sos_hdr->sos.fw_version); in psp_init_sos_base_fw()
2954 adev->psp.sys.size_bytes = le32_to_cpu(sos_hdr->sos.offset_bytes); in psp_init_sos_base_fw()
2955 adev->psp.sys.start_addr = ucode_array_start_addr; in psp_init_sos_base_fw()
2957 adev->psp.sos.size_bytes = le32_to_cpu(sos_hdr->sos.size_bytes); in psp_init_sos_base_fw()
2958 adev->psp.sos.start_addr = ucode_array_start_addr + in psp_init_sos_base_fw()
2960 adev->psp.xgmi_context.supports_extended_data = false; in psp_init_sos_base_fw()
2963 sos_hdr_v1_3 = (const struct psp_firmware_header_v1_3 *)adev->psp.sos_fw->data; in psp_init_sos_base_fw()
2965 adev->psp.sos.fw_version = le32_to_cpu(sos_hdr_v1_3->sos_aux.fw_version); in psp_init_sos_base_fw()
2966 adev->psp.sos.feature_version = le32_to_cpu(sos_hdr_v1_3->sos_aux.fw_version); in psp_init_sos_base_fw()
2968 adev->psp.sys.size_bytes = le32_to_cpu(sos_hdr_v1_3->sys_drv_aux.size_bytes); in psp_init_sos_base_fw()
2969 adev->psp.sys.start_addr = ucode_array_start_addr + in psp_init_sos_base_fw()
2972 adev->psp.sos.size_bytes = le32_to_cpu(sos_hdr_v1_3->sos_aux.size_bytes); in psp_init_sos_base_fw()
2973 adev->psp.sos.start_addr = ucode_array_start_addr + in psp_init_sos_base_fw()
2975 adev->psp.xgmi_context.supports_extended_data = true; in psp_init_sos_base_fw()
2978 if ((adev->psp.sys.size_bytes == 0) || (adev->psp.sos.size_bytes == 0)) { in psp_init_sos_base_fw()
2986 int psp_init_sos_microcode(struct psp_context *psp, in psp_init_sos_microcode() argument
2989 struct amdgpu_device *adev = psp->adev; in psp_init_sos_microcode()
3006 err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev); in psp_init_sos_microcode()
3010 err = amdgpu_ucode_validate(adev->psp.sos_fw); in psp_init_sos_microcode()
3014 sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3026 sos_hdr_v1_1 = (const struct psp_firmware_header_v1_1 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3027 adev->psp.toc.size_bytes = le32_to_cpu(sos_hdr_v1_1->toc.size_bytes); in psp_init_sos_microcode()
3028 adev->psp.toc.start_addr = (uint8_t *)adev->psp.sys.start_addr + in psp_init_sos_microcode()
3030 adev->psp.kdb.size_bytes = le32_to_cpu(sos_hdr_v1_1->kdb.size_bytes); in psp_init_sos_microcode()
3031 adev->psp.kdb.start_addr = (uint8_t *)adev->psp.sys.start_addr + in psp_init_sos_microcode()
3035 sos_hdr_v1_2 = (const struct psp_firmware_header_v1_2 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3036 adev->psp.kdb.size_bytes = le32_to_cpu(sos_hdr_v1_2->kdb.size_bytes); in psp_init_sos_microcode()
3037 adev->psp.kdb.start_addr = (uint8_t *)adev->psp.sys.start_addr + in psp_init_sos_microcode()
3041 sos_hdr_v1_3 = (const struct psp_firmware_header_v1_3 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3042 adev->psp.toc.size_bytes = le32_to_cpu(sos_hdr_v1_3->v1_1.toc.size_bytes); in psp_init_sos_microcode()
3043 adev->psp.toc.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3045 adev->psp.kdb.size_bytes = le32_to_cpu(sos_hdr_v1_3->v1_1.kdb.size_bytes); in psp_init_sos_microcode()
3046 adev->psp.kdb.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3048 adev->psp.spl.size_bytes = le32_to_cpu(sos_hdr_v1_3->spl.size_bytes); in psp_init_sos_microcode()
3049 adev->psp.spl.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3051 adev->psp.rl.size_bytes = le32_to_cpu(sos_hdr_v1_3->rl.size_bytes); in psp_init_sos_microcode()
3052 adev->psp.rl.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3057 sos_hdr_v2_0 = (const struct psp_firmware_header_v2_0 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3066 err = parse_sos_bin_descriptor(psp, in psp_init_sos_microcode()
3084 release_firmware(adev->psp.sos_fw); in psp_init_sos_microcode()
3085 adev->psp.sos_fw = NULL; in psp_init_sos_microcode()
3090 static int parse_ta_bin_descriptor(struct psp_context *psp, in parse_ta_bin_descriptor() argument
3096 if (!psp || !desc || !ta_hdr) in parse_ta_bin_descriptor()
3105 psp->asd_context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3106 psp->asd_context.bin_desc.feature_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3107 psp->asd_context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3108 psp->asd_context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3111 psp->xgmi_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3112 psp->xgmi_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3113 psp->xgmi_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3116 psp->ras_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3117 psp->ras_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3118 psp->ras_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3121 psp->hdcp_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3122 psp->hdcp_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3123 psp->hdcp_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3126 psp->dtm_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3127 psp->dtm_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3128 psp->dtm_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3131 psp->rap_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3132 psp->rap_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3133 psp->rap_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3136 psp->securedisplay_context.context.bin_desc.fw_version = in parse_ta_bin_descriptor()
3138 psp->securedisplay_context.context.bin_desc.size_bytes = in parse_ta_bin_descriptor()
3140 psp->securedisplay_context.context.bin_desc.start_addr = in parse_ta_bin_descriptor()
3144 dev_warn(psp->adev->dev, "Unsupported TA type: %d\n", desc->fw_type); in parse_ta_bin_descriptor()
3151 int psp_init_ta_microcode(struct psp_context *psp, in psp_init_ta_microcode() argument
3154 struct amdgpu_device *adev = psp->adev; in psp_init_ta_microcode()
3166 err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); in psp_init_ta_microcode()
3170 err = amdgpu_ucode_validate(adev->psp.ta_fw); in psp_init_ta_microcode()
3174 ta_hdr = (const struct ta_firmware_header_v2_0 *)adev->psp.ta_fw->data; in psp_init_ta_microcode()
3189 err = parse_ta_bin_descriptor(psp, in psp_init_ta_microcode()
3199 release_firmware(adev->psp.ta_fw); in psp_init_ta_microcode()
3200 adev->psp.ta_fw = NULL; in psp_init_ta_microcode()
3230 mutex_lock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_read()
3231 ret = psp_read_usbc_pd_fw(&adev->psp, &fw_ver); in psp_usbc_pd_fw_sysfs_read()
3232 mutex_unlock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_read()
3280 mutex_lock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_write()
3281 ret = psp_load_usbc_pd_fw(&adev->psp, fw_pri_mc_addr); in psp_usbc_pd_fw_sysfs_write()
3282 mutex_unlock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_write()
3298 void psp_copy_fw(struct psp_context *psp, uint8_t *start_addr, uint32_t bin_size) in psp_copy_fw() argument
3302 if (!drm_dev_enter(adev_to_drm(psp->adev), &idx)) in psp_copy_fw()
3305 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_copy_fw()
3306 memcpy(psp->fw_pri_buf, start_addr, bin_size); in psp_copy_fw()