Lines Matching refs:psp
49 static int psp_load_smu_fw(struct psp_context *psp);
50 static int psp_rap_terminate(struct psp_context *psp);
51 static int psp_securedisplay_terminate(struct psp_context *psp);
53 static int psp_ring_init(struct psp_context *psp, in psp_ring_init() argument
58 struct amdgpu_device *adev = psp->adev; in psp_ring_init()
60 ring = &psp->km_ring; in psp_ring_init()
95 static void psp_check_pmfw_centralized_cstate_management(struct psp_context *psp) in psp_check_pmfw_centralized_cstate_management() argument
97 struct amdgpu_device *adev = psp->adev; in psp_check_pmfw_centralized_cstate_management()
100 psp->pmfw_centralized_cstate_management = false; in psp_check_pmfw_centralized_cstate_management()
116 psp->pmfw_centralized_cstate_management = true; in psp_check_pmfw_centralized_cstate_management()
119 psp->pmfw_centralized_cstate_management = false; in psp_check_pmfw_centralized_cstate_management()
124 static int psp_init_sriov_microcode(struct psp_context *psp) in psp_init_sriov_microcode() argument
126 struct amdgpu_device *adev = psp->adev; in psp_init_sriov_microcode()
137 ret = psp_init_cap_microcode(psp, ucode_prefix); in psp_init_sriov_microcode()
141 ret = psp_init_cap_microcode(psp, ucode_prefix); in psp_init_sriov_microcode()
142 ret &= psp_init_ta_microcode(psp, ucode_prefix); in psp_init_sriov_microcode()
149 ret = psp_init_cap_microcode(psp, ucode_prefix); in psp_init_sriov_microcode()
150 ret &= psp_init_ta_microcode(psp, ucode_prefix); in psp_init_sriov_microcode()
154 ret = psp_init_cap_microcode(psp, ucode_prefix); in psp_init_sriov_microcode()
157 ret = psp_init_ta_microcode(psp, ucode_prefix); in psp_init_sriov_microcode()
168 struct psp_context *psp = &adev->psp; in psp_early_init() local
170 psp->autoload_supported = true; in psp_early_init()
171 psp->boot_time_tmr = true; in psp_early_init()
175 psp_v3_1_set_psp_funcs(psp); in psp_early_init()
176 psp->autoload_supported = false; in psp_early_init()
177 psp->boot_time_tmr = false; in psp_early_init()
181 psp_v10_0_set_psp_funcs(psp); in psp_early_init()
182 psp->autoload_supported = false; in psp_early_init()
183 psp->boot_time_tmr = false; in psp_early_init()
187 psp_v11_0_set_psp_funcs(psp); in psp_early_init()
188 psp->autoload_supported = false; in psp_early_init()
189 psp->boot_time_tmr = false; in psp_early_init()
193 adev->psp.sup_pd_fw_up = !amdgpu_sriov_vf(adev); in psp_early_init()
202 psp_v11_0_set_psp_funcs(psp); in psp_early_init()
203 psp->boot_time_tmr = false; in psp_early_init()
207 psp_v12_0_set_psp_funcs(psp); in psp_early_init()
208 psp->autoload_supported = false; in psp_early_init()
209 psp->boot_time_tmr = false; in psp_early_init()
212 psp->boot_time_tmr = false; in psp_early_init()
216 psp_v13_0_set_psp_funcs(psp); in psp_early_init()
217 psp->autoload_supported = false; in psp_early_init()
220 psp_v13_0_set_psp_funcs(psp); in psp_early_init()
221 psp->autoload_supported = false; in psp_early_init()
222 adev->psp.sup_ifwi_up = !amdgpu_sriov_vf(adev); in psp_early_init()
232 psp_v13_0_set_psp_funcs(psp); in psp_early_init()
233 psp->boot_time_tmr = false; in psp_early_init()
237 psp_v11_0_8_set_psp_funcs(psp); in psp_early_init()
239 psp->autoload_supported = false; in psp_early_init()
240 psp->boot_time_tmr = false; in psp_early_init()
245 psp_v13_0_set_psp_funcs(psp); in psp_early_init()
246 adev->psp.sup_ifwi_up = !amdgpu_sriov_vf(adev); in psp_early_init()
247 psp->boot_time_tmr = false; in psp_early_init()
250 psp_v13_0_4_set_psp_funcs(psp); in psp_early_init()
251 psp->boot_time_tmr = false; in psp_early_init()
255 psp_v14_0_set_psp_funcs(psp); in psp_early_init()
258 psp_v14_0_set_psp_funcs(psp); in psp_early_init()
259 psp->boot_time_tmr = false; in psp_early_init()
265 psp->adev = adev; in psp_early_init()
269 psp_check_pmfw_centralized_cstate_management(psp); in psp_early_init()
272 return psp_init_sriov_microcode(psp); in psp_early_init()
274 return psp_init_microcode(psp); in psp_early_init()
284 static void psp_free_shared_bufs(struct psp_context *psp) in psp_free_shared_bufs() argument
290 pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL; in psp_free_shared_bufs()
291 amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, pptr); in psp_free_shared_bufs()
292 psp->tmr_bo = NULL; in psp_free_shared_bufs()
295 psp_ta_free_shared_buf(&psp->xgmi_context.context.mem_context); in psp_free_shared_bufs()
298 psp_ta_free_shared_buf(&psp->ras_context.context.mem_context); in psp_free_shared_bufs()
301 psp_ta_free_shared_buf(&psp->hdcp_context.context.mem_context); in psp_free_shared_bufs()
304 psp_ta_free_shared_buf(&psp->dtm_context.context.mem_context); in psp_free_shared_bufs()
307 psp_ta_free_shared_buf(&psp->rap_context.context.mem_context); in psp_free_shared_bufs()
310 psp_ta_free_shared_buf(&psp->securedisplay_context.context.mem_context); in psp_free_shared_bufs()
315 static void psp_memory_training_fini(struct psp_context *psp) in psp_memory_training_fini() argument
317 struct psp_memory_training_context *ctx = &psp->mem_train_ctx; in psp_memory_training_fini()
324 static int psp_memory_training_init(struct psp_context *psp) in psp_memory_training_init() argument
327 struct psp_memory_training_context *ctx = &psp->mem_train_ctx; in psp_memory_training_init()
330 dev_dbg(psp->adev->dev, "memory training is not supported!\n"); in psp_memory_training_init()
336 dev_err(psp->adev->dev, "alloc mem_train_ctx.sys_cache failed!\n"); in psp_memory_training_init()
341 dev_dbg(psp->adev->dev, in psp_memory_training_init()
350 psp_memory_training_fini(psp); in psp_memory_training_init()
441 struct psp_context *psp = &adev->psp; in psp_sw_init() local
444 struct psp_memory_training_context *mem_training_ctx = &psp->mem_train_ctx; in psp_sw_init()
447 psp->cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL); in psp_sw_init()
448 if (!psp->cmd) { in psp_sw_init()
453 adev->psp.xgmi_context.supports_extended_data = in psp_sw_init()
475 psp->boot_cfg_bitmask = boot_cfg_entry.boot_cfg_bitmask; in psp_sw_init()
476 if ((psp->boot_cfg_bitmask) & in psp_sw_init()
494 ret = psp_memory_training_init(psp); in psp_sw_init()
500 ret = psp_mem_training(psp, PSP_MEM_TRAIN_COLD_BOOT); in psp_sw_init()
510 &psp->fw_pri_bo, in psp_sw_init()
511 &psp->fw_pri_mc_addr, in psp_sw_init()
512 &psp->fw_pri_buf); in psp_sw_init()
519 &psp->fence_buf_bo, in psp_sw_init()
520 &psp->fence_buf_mc_addr, in psp_sw_init()
521 &psp->fence_buf); in psp_sw_init()
528 &psp->cmd_buf_bo, &psp->cmd_buf_mc_addr, in psp_sw_init()
529 (void **)&psp->cmd_buf_mem); in psp_sw_init()
536 amdgpu_bo_free_kernel(&psp->fence_buf_bo, in psp_sw_init()
537 &psp->fence_buf_mc_addr, &psp->fence_buf); in psp_sw_init()
539 amdgpu_bo_free_kernel(&psp->fw_pri_bo, in psp_sw_init()
540 &psp->fw_pri_mc_addr, &psp->fw_pri_buf); in psp_sw_init()
547 struct psp_context *psp = &adev->psp; in psp_sw_fini() local
549 psp_memory_training_fini(psp); in psp_sw_fini()
551 amdgpu_ucode_release(&psp->sos_fw); in psp_sw_fini()
552 amdgpu_ucode_release(&psp->asd_fw); in psp_sw_fini()
553 amdgpu_ucode_release(&psp->ta_fw); in psp_sw_fini()
554 amdgpu_ucode_release(&psp->cap_fw); in psp_sw_fini()
555 amdgpu_ucode_release(&psp->toc_fw); in psp_sw_fini()
557 kfree(psp->cmd); in psp_sw_fini()
558 psp->cmd = NULL; in psp_sw_fini()
560 psp_free_shared_bufs(psp); in psp_sw_fini()
562 if (psp->km_ring.ring_mem) in psp_sw_fini()
564 &psp->km_ring.ring_mem_mc_addr, in psp_sw_fini()
565 (void **)&psp->km_ring.ring_mem); in psp_sw_fini()
567 amdgpu_bo_free_kernel(&psp->fw_pri_bo, in psp_sw_fini()
568 &psp->fw_pri_mc_addr, &psp->fw_pri_buf); in psp_sw_fini()
569 amdgpu_bo_free_kernel(&psp->fence_buf_bo, in psp_sw_fini()
570 &psp->fence_buf_mc_addr, &psp->fence_buf); in psp_sw_fini()
571 amdgpu_bo_free_kernel(&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr, in psp_sw_fini()
572 (void **)&psp->cmd_buf_mem); in psp_sw_fini()
577 int psp_wait_for(struct psp_context *psp, uint32_t reg_index, in psp_wait_for() argument
582 struct amdgpu_device *adev = psp->adev; in psp_wait_for()
584 if (psp->adev->no_hw_access) in psp_wait_for()
602 int psp_wait_for_spirom_update(struct psp_context *psp, uint32_t reg_index, in psp_wait_for_spirom_update() argument
607 struct amdgpu_device *adev = psp->adev; in psp_wait_for_spirom_update()
609 if (psp->adev->no_hw_access) in psp_wait_for_spirom_update()
662 static bool psp_err_warn(struct psp_context *psp) in psp_err_warn() argument
664 struct psp_gfx_cmd_resp *cmd = psp->cmd_buf_mem; in psp_err_warn()
667 if (amdgpu_ip_version(psp->adev, MP0_HWIP, 0) == IP_VERSION(13, 0, 2) && in psp_err_warn()
677 psp_cmd_submit_buf(struct psp_context *psp, in psp_cmd_submit_buf() argument
683 int timeout = psp->adev->psp_timeout; in psp_cmd_submit_buf()
687 if (psp->adev->no_hw_access) in psp_cmd_submit_buf()
690 memset(psp->cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE); in psp_cmd_submit_buf()
692 memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp)); in psp_cmd_submit_buf()
694 index = atomic_inc_return(&psp->fence_value); in psp_cmd_submit_buf()
695 ret = psp_ring_cmd_submit(psp, psp->cmd_buf_mc_addr, fence_mc_addr, index); in psp_cmd_submit_buf()
697 atomic_dec(&psp->fence_value); in psp_cmd_submit_buf()
701 amdgpu_device_invalidate_hdp(psp->adev, NULL); in psp_cmd_submit_buf()
702 while (*((unsigned int *)psp->fence_buf) != index) { in psp_cmd_submit_buf()
714 amdgpu_device_invalidate_hdp(psp->adev, NULL); in psp_cmd_submit_buf()
718 skip_unsupport = (psp->cmd_buf_mem->resp.status == TEE_ERROR_NOT_SUPPORTED || in psp_cmd_submit_buf()
719 psp->cmd_buf_mem->resp.status == PSP_ERR_UNKNOWN_COMMAND) && amdgpu_sriov_vf(psp->adev); in psp_cmd_submit_buf()
721 memcpy(&cmd->resp, &psp->cmd_buf_mem->resp, sizeof(struct psp_gfx_resp)); in psp_cmd_submit_buf()
730 if (!skip_unsupport && (psp->cmd_buf_mem->resp.status || !timeout) && !ras_intr) { in psp_cmd_submit_buf()
732 dev_warn(psp->adev->dev, in psp_cmd_submit_buf()
735 if (psp_err_warn(psp)) in psp_cmd_submit_buf()
737 psp->adev->dev, in psp_cmd_submit_buf()
739 psp_gfx_cmd_name(psp->cmd_buf_mem->cmd_id), in psp_cmd_submit_buf()
740 psp->cmd_buf_mem->cmd_id, in psp_cmd_submit_buf()
741 psp->cmd_buf_mem->resp.status); in psp_cmd_submit_buf()
746 if ((ucode && amdgpu_sriov_vf(psp->adev)) || !timeout) { in psp_cmd_submit_buf()
753 ucode->tmr_mc_addr_lo = psp->cmd_buf_mem->resp.fw_addr_lo; in psp_cmd_submit_buf()
754 ucode->tmr_mc_addr_hi = psp->cmd_buf_mem->resp.fw_addr_hi; in psp_cmd_submit_buf()
761 static struct psp_gfx_cmd_resp *acquire_psp_cmd_buf(struct psp_context *psp) in acquire_psp_cmd_buf() argument
763 struct psp_gfx_cmd_resp *cmd = psp->cmd; in acquire_psp_cmd_buf()
765 mutex_lock(&psp->mutex); in acquire_psp_cmd_buf()
772 static void release_psp_cmd_buf(struct psp_context *psp) in release_psp_cmd_buf() argument
774 mutex_unlock(&psp->mutex); in release_psp_cmd_buf()
777 static void psp_prep_tmr_cmd_buf(struct psp_context *psp, in psp_prep_tmr_cmd_buf() argument
781 struct amdgpu_device *adev = psp->adev; in psp_prep_tmr_cmd_buf()
790 if (amdgpu_sriov_vf(psp->adev)) in psp_prep_tmr_cmd_buf()
812 static int psp_load_toc(struct psp_context *psp, in psp_load_toc() argument
816 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_load_toc()
819 psp_copy_fw(psp, psp->toc.start_addr, psp->toc.size_bytes); in psp_load_toc()
821 psp_prep_load_toc_cmd_buf(cmd, psp->fw_pri_mc_addr, psp->toc.size_bytes); in psp_load_toc()
823 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_load_toc()
824 psp->fence_buf_mc_addr); in psp_load_toc()
826 *tmr_size = psp->cmd_buf_mem->resp.tmr_size; in psp_load_toc()
828 release_psp_cmd_buf(psp); in psp_load_toc()
834 static int psp_tmr_init(struct psp_context *psp) in psp_tmr_init() argument
848 tmr_size = PSP_TMR_SIZE(psp->adev); in psp_tmr_init()
853 if (!amdgpu_sriov_vf(psp->adev) && in psp_tmr_init()
854 psp->toc.start_addr && in psp_tmr_init()
855 psp->toc.size_bytes && in psp_tmr_init()
856 psp->fw_pri_buf) { in psp_tmr_init()
857 ret = psp_load_toc(psp, &tmr_size); in psp_tmr_init()
859 dev_err(psp->adev->dev, "Failed to load toc\n"); in psp_tmr_init()
864 if (!psp->tmr_bo && !psp->boot_time_tmr) { in psp_tmr_init()
865 pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL; in psp_tmr_init()
866 ret = amdgpu_bo_create_kernel(psp->adev, tmr_size, in psp_tmr_init()
868 AMDGPU_HAS_VRAM(psp->adev) ? in psp_tmr_init()
871 &psp->tmr_bo, &psp->tmr_mc_addr, in psp_tmr_init()
878 static bool psp_skip_tmr(struct psp_context *psp) in psp_skip_tmr() argument
880 switch (amdgpu_ip_version(psp->adev, MP0_HWIP, 0)) { in psp_skip_tmr()
894 static int psp_tmr_load(struct psp_context *psp) in psp_tmr_load() argument
902 if (amdgpu_sriov_vf(psp->adev) && psp_skip_tmr(psp)) in psp_tmr_load()
905 cmd = acquire_psp_cmd_buf(psp); in psp_tmr_load()
907 psp_prep_tmr_cmd_buf(psp, cmd, psp->tmr_mc_addr, psp->tmr_bo); in psp_tmr_load()
908 if (psp->tmr_bo) in psp_tmr_load()
909 dev_info(psp->adev->dev, "reserve 0x%lx from 0x%llx for PSP TMR\n", in psp_tmr_load()
910 amdgpu_bo_size(psp->tmr_bo), psp->tmr_mc_addr); in psp_tmr_load()
912 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_tmr_load()
913 psp->fence_buf_mc_addr); in psp_tmr_load()
915 release_psp_cmd_buf(psp); in psp_tmr_load()
920 static void psp_prep_tmr_unload_cmd_buf(struct psp_context *psp, in psp_prep_tmr_unload_cmd_buf() argument
923 if (amdgpu_sriov_vf(psp->adev)) in psp_prep_tmr_unload_cmd_buf()
929 static int psp_tmr_unload(struct psp_context *psp) in psp_tmr_unload() argument
937 if (amdgpu_sriov_vf(psp->adev) && psp_skip_tmr(psp)) in psp_tmr_unload()
940 cmd = acquire_psp_cmd_buf(psp); in psp_tmr_unload()
942 psp_prep_tmr_unload_cmd_buf(psp, cmd); in psp_tmr_unload()
943 dev_dbg(psp->adev->dev, "free PSP TMR buffer\n"); in psp_tmr_unload()
945 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_tmr_unload()
946 psp->fence_buf_mc_addr); in psp_tmr_unload()
948 release_psp_cmd_buf(psp); in psp_tmr_unload()
953 static int psp_tmr_terminate(struct psp_context *psp) in psp_tmr_terminate() argument
955 return psp_tmr_unload(psp); in psp_tmr_terminate()
958 int psp_get_fw_attestation_records_addr(struct psp_context *psp, in psp_get_fw_attestation_records_addr() argument
967 if (amdgpu_sriov_vf(psp->adev)) in psp_get_fw_attestation_records_addr()
970 cmd = acquire_psp_cmd_buf(psp); in psp_get_fw_attestation_records_addr()
974 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_get_fw_attestation_records_addr()
975 psp->fence_buf_mc_addr); in psp_get_fw_attestation_records_addr()
982 release_psp_cmd_buf(psp); in psp_get_fw_attestation_records_addr()
989 struct psp_context *psp = &adev->psp; in psp_boot_config_get() local
996 cmd = acquire_psp_cmd_buf(psp); in psp_boot_config_get()
1001 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_boot_config_get()
1007 release_psp_cmd_buf(psp); in psp_boot_config_get()
1015 struct psp_context *psp = &adev->psp; in psp_boot_config_set() local
1021 cmd = acquire_psp_cmd_buf(psp); in psp_boot_config_set()
1028 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_boot_config_set()
1030 release_psp_cmd_buf(psp); in psp_boot_config_set()
1038 struct psp_context *psp = &adev->psp; in psp_rl_load() local
1041 if (!is_psp_fw_valid(psp->rl)) in psp_rl_load()
1044 cmd = acquire_psp_cmd_buf(psp); in psp_rl_load()
1046 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_rl_load()
1047 memcpy(psp->fw_pri_buf, psp->rl.start_addr, psp->rl.size_bytes); in psp_rl_load()
1050 cmd->cmd.cmd_load_ip_fw.fw_phy_addr_lo = lower_32_bits(psp->fw_pri_mc_addr); in psp_rl_load()
1051 cmd->cmd.cmd_load_ip_fw.fw_phy_addr_hi = upper_32_bits(psp->fw_pri_mc_addr); in psp_rl_load()
1052 cmd->cmd.cmd_load_ip_fw.fw_size = psp->rl.size_bytes; in psp_rl_load()
1055 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_rl_load()
1057 release_psp_cmd_buf(psp); in psp_rl_load()
1062 int psp_memory_partition(struct psp_context *psp, int mode) in psp_memory_partition() argument
1067 if (amdgpu_sriov_vf(psp->adev)) in psp_memory_partition()
1070 cmd = acquire_psp_cmd_buf(psp); in psp_memory_partition()
1075 dev_info(psp->adev->dev, in psp_memory_partition()
1077 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_memory_partition()
1079 dev_err(psp->adev->dev, in psp_memory_partition()
1082 release_psp_cmd_buf(psp); in psp_memory_partition()
1087 int psp_spatial_partition(struct psp_context *psp, int mode) in psp_spatial_partition() argument
1092 if (amdgpu_sriov_vf(psp->adev)) in psp_spatial_partition()
1095 cmd = acquire_psp_cmd_buf(psp); in psp_spatial_partition()
1100 dev_info(psp->adev->dev, "Requesting %d partitions through PSP", mode); in psp_spatial_partition()
1101 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_spatial_partition()
1103 release_psp_cmd_buf(psp); in psp_spatial_partition()
1108 static int psp_asd_initialize(struct psp_context *psp) in psp_asd_initialize() argument
1116 if (amdgpu_sriov_vf(psp->adev) || !psp->asd_context.bin_desc.size_bytes) in psp_asd_initialize()
1120 if (!amdgpu_device_has_display_hardware(psp->adev) && in psp_asd_initialize()
1121 amdgpu_ip_version(psp->adev, MP0_HWIP, 0) >= IP_VERSION(13, 0, 10)) in psp_asd_initialize()
1124 psp->asd_context.mem_context.shared_mc_addr = 0; in psp_asd_initialize()
1125 psp->asd_context.mem_context.shared_mem_size = PSP_ASD_SHARED_MEM_SIZE; in psp_asd_initialize()
1126 psp->asd_context.ta_load_type = GFX_CMD_ID_LOAD_ASD; in psp_asd_initialize()
1128 ret = psp_ta_load(psp, &psp->asd_context); in psp_asd_initialize()
1130 psp->asd_context.initialized = true; in psp_asd_initialize()
1142 int psp_ta_unload(struct psp_context *psp, struct ta_context *context) in psp_ta_unload() argument
1145 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_ta_unload()
1149 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_ta_unload()
1153 release_psp_cmd_buf(psp); in psp_ta_unload()
1158 static int psp_asd_terminate(struct psp_context *psp) in psp_asd_terminate() argument
1162 if (amdgpu_sriov_vf(psp->adev)) in psp_asd_terminate()
1165 if (!psp->asd_context.initialized) in psp_asd_terminate()
1168 ret = psp_ta_unload(psp, &psp->asd_context); in psp_asd_terminate()
1170 psp->asd_context.initialized = false; in psp_asd_terminate()
1183 int psp_reg_program(struct psp_context *psp, enum psp_reg_prog_id reg, in psp_reg_program() argument
1192 cmd = acquire_psp_cmd_buf(psp); in psp_reg_program()
1195 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_reg_program()
1197 dev_err(psp->adev->dev, "PSP failed to program reg id %d\n", reg); in psp_reg_program()
1199 release_psp_cmd_buf(psp); in psp_reg_program()
1220 int psp_ta_init_shared_buf(struct psp_context *psp, in psp_ta_init_shared_buf() argument
1227 return amdgpu_bo_create_kernel(psp->adev, mem_ctx->shared_mem_size, in psp_ta_init_shared_buf()
1244 int psp_ta_invoke(struct psp_context *psp, in psp_ta_invoke() argument
1249 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_ta_invoke()
1253 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_ta_invoke()
1254 psp->fence_buf_mc_addr); in psp_ta_invoke()
1258 release_psp_cmd_buf(psp); in psp_ta_invoke()
1263 int psp_ta_load(struct psp_context *psp, struct ta_context *context) in psp_ta_load() argument
1268 cmd = acquire_psp_cmd_buf(psp); in psp_ta_load()
1270 psp_copy_fw(psp, context->bin_desc.start_addr, in psp_ta_load()
1273 psp_prep_ta_load_cmd_buf(cmd, psp->fw_pri_mc_addr, context); in psp_ta_load()
1275 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_ta_load()
1276 psp->fence_buf_mc_addr); in psp_ta_load()
1283 release_psp_cmd_buf(psp); in psp_ta_load()
1288 int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_xgmi_invoke() argument
1290 return psp_ta_invoke(psp, ta_cmd_id, &psp->xgmi_context.context); in psp_xgmi_invoke()
1293 int psp_xgmi_terminate(struct psp_context *psp) in psp_xgmi_terminate() argument
1296 struct amdgpu_device *adev = psp->adev; in psp_xgmi_terminate()
1304 if (!psp->xgmi_context.context.initialized) in psp_xgmi_terminate()
1307 ret = psp_ta_unload(psp, &psp->xgmi_context.context); in psp_xgmi_terminate()
1309 psp->xgmi_context.context.initialized = false; in psp_xgmi_terminate()
1314 int psp_xgmi_initialize(struct psp_context *psp, bool set_extended_data, bool load_ta) in psp_xgmi_initialize() argument
1319 if (!psp->ta_fw || in psp_xgmi_initialize()
1320 !psp->xgmi_context.context.bin_desc.size_bytes || in psp_xgmi_initialize()
1321 !psp->xgmi_context.context.bin_desc.start_addr) in psp_xgmi_initialize()
1327 psp->xgmi_context.context.mem_context.shared_mem_size = PSP_XGMI_SHARED_MEM_SIZE; in psp_xgmi_initialize()
1328 psp->xgmi_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_xgmi_initialize()
1330 if (!psp->xgmi_context.context.mem_context.shared_buf) { in psp_xgmi_initialize()
1331 ret = psp_ta_init_shared_buf(psp, &psp->xgmi_context.context.mem_context); in psp_xgmi_initialize()
1337 ret = psp_ta_load(psp, &psp->xgmi_context.context); in psp_xgmi_initialize()
1339 psp->xgmi_context.context.initialized = true; in psp_xgmi_initialize()
1345 xgmi_cmd = (struct ta_xgmi_shared_memory *)(psp->xgmi_context.context.mem_context.shared_buf); in psp_xgmi_initialize()
1350 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_initialize()
1352 psp->xgmi_context.xgmi_ta_caps = xgmi_cmd->caps_flag; in psp_xgmi_initialize()
1357 int psp_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id) in psp_xgmi_get_hive_id() argument
1362 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_get_hive_id()
1368 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_get_hive_id()
1377 int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id) in psp_xgmi_get_node_id() argument
1382 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_get_node_id()
1388 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_get_node_id()
1397 static bool psp_xgmi_peer_link_info_supported(struct psp_context *psp) in psp_xgmi_peer_link_info_supported() argument
1399 return (amdgpu_ip_version(psp->adev, MP0_HWIP, 0) == in psp_xgmi_peer_link_info_supported()
1401 psp->xgmi_context.context.bin_desc.fw_version >= 0x2000000b) || in psp_xgmi_peer_link_info_supported()
1402 amdgpu_ip_version(psp->adev, MP0_HWIP, 0) >= in psp_xgmi_peer_link_info_supported()
1413 static void psp_xgmi_reflect_topology_info(struct psp_context *psp, in psp_xgmi_reflect_topology_info() argument
1418 uint64_t src_node_id = psp->adev->gmc.xgmi.node_id; in psp_xgmi_reflect_topology_info()
1423 hive = amdgpu_get_xgmi_hive(psp->adev); in psp_xgmi_reflect_topology_info()
1434 mirror_top_info = &mirror_adev->psp.xgmi_context.top_info; in psp_xgmi_reflect_topology_info()
1457 int psp_xgmi_get_topology_info(struct psp_context *psp, in psp_xgmi_get_topology_info() argument
1471 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_get_topology_info()
1488 ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_TOPOLOGY_INFO); in psp_xgmi_get_topology_info()
1512 if (psp_xgmi_peer_link_info_supported(psp)) { in psp_xgmi_get_topology_info()
1516 (psp->xgmi_context.supports_extended_data && in psp_xgmi_get_topology_info()
1518 amdgpu_ip_version(psp->adev, MP0_HWIP, 0) == in psp_xgmi_get_topology_info()
1520 amdgpu_ip_version(psp->adev, MP0_HWIP, 0) == in psp_xgmi_get_topology_info()
1522 bool ta_port_num_support = amdgpu_sriov_vf(psp->adev) ? 0 : in psp_xgmi_get_topology_info()
1523 psp->xgmi_context.xgmi_ta_caps & EXTEND_PEER_LINK_INFO_CMD_FLAG; in psp_xgmi_get_topology_info()
1548 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_get_topology_info()
1570 psp_xgmi_reflect_topology_info(psp, topology->nodes[i]); in psp_xgmi_get_topology_info()
1577 int psp_xgmi_set_topology_info(struct psp_context *psp, in psp_xgmi_set_topology_info() argument
1588 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_set_topology_info()
1603 return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO); in psp_xgmi_set_topology_info()
1607 static void psp_ras_ta_check_status(struct psp_context *psp) in psp_ras_ta_check_status() argument
1610 (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_ta_check_status()
1614 dev_warn(psp->adev->dev, in psp_ras_ta_check_status()
1618 dev_warn(psp->adev->dev, in psp_ras_ta_check_status()
1625 dev_warn(psp->adev->dev, in psp_ras_ta_check_status()
1629 dev_warn(psp->adev->dev, in psp_ras_ta_check_status()
1635 static int psp_ras_send_cmd(struct psp_context *psp, in psp_ras_send_cmd() argument
1645 mutex_lock(&psp->ras_context.mutex); in psp_ras_send_cmd()
1646 ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_send_cmd()
1664 dev_err(psp->adev->dev, "Invalid ras cmd id: %u\n", cmd); in psp_ras_send_cmd()
1670 ret = psp_ras_invoke(psp, ras_cmd->cmd_id); in psp_ras_send_cmd()
1678 if (ret || ras_cmd->ras_status || psp->cmd_buf_mem->resp.status) in psp_ras_send_cmd()
1690 mutex_unlock(&psp->ras_context.mutex); in psp_ras_send_cmd()
1695 int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_ras_invoke() argument
1700 ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_invoke()
1705 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_invoke()
1708 ret = psp_ta_invoke(psp, ta_cmd_id, &psp->ras_context.context); in psp_ras_invoke()
1714 dev_warn(psp->adev->dev, "RAS: Unsupported Interface\n"); in psp_ras_invoke()
1720 dev_warn(psp->adev->dev, "ECC switch disabled\n"); in psp_ras_invoke()
1724 dev_warn(psp->adev->dev, in psp_ras_invoke()
1727 psp_ras_ta_check_status(psp); in psp_ras_invoke()
1733 int psp_ras_enable_features(struct psp_context *psp, in psp_ras_enable_features() argument
1739 if (!psp->ras_context.context.initialized || !info) in psp_ras_enable_features()
1744 ret = psp_ras_send_cmd(psp, cmd_id, info, NULL); in psp_ras_enable_features()
1751 int psp_ras_terminate(struct psp_context *psp) in psp_ras_terminate() argument
1758 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_terminate()
1761 if (!psp->ras_context.context.initialized) in psp_ras_terminate()
1764 ret = psp_ta_unload(psp, &psp->ras_context.context); in psp_ras_terminate()
1766 psp->ras_context.context.initialized = false; in psp_ras_terminate()
1768 mutex_destroy(&psp->ras_context.mutex); in psp_ras_terminate()
1773 int psp_ras_initialize(struct psp_context *psp) in psp_ras_initialize() argument
1777 struct amdgpu_device *adev = psp->adev; in psp_ras_initialize()
1786 if (!adev->psp.ras_context.context.bin_desc.size_bytes || in psp_ras_initialize()
1787 !adev->psp.ras_context.context.bin_desc.start_addr) { in psp_ras_initialize()
1845 psp->ras_context.context.mem_context.shared_mem_size = PSP_RAS_SHARED_MEM_SIZE; in psp_ras_initialize()
1846 psp->ras_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_ras_initialize()
1848 if (!psp->ras_context.context.mem_context.shared_buf) { in psp_ras_initialize()
1849 ret = psp_ta_init_shared_buf(psp, &psp->ras_context.context.mem_context); in psp_ras_initialize()
1854 ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_initialize()
1869 ret = psp_ta_load(psp, &psp->ras_context.context); in psp_ras_initialize()
1872 psp->ras_context.context.initialized = true; in psp_ras_initialize()
1873 mutex_init(&psp->ras_context.mutex); in psp_ras_initialize()
1879 psp->ras_context.context.initialized = false; in psp_ras_initialize()
1885 int psp_ras_trigger_error(struct psp_context *psp, in psp_ras_trigger_error() argument
1888 struct amdgpu_device *adev = psp->adev; in psp_ras_trigger_error()
1893 if (!psp->ras_context.context.initialized || !info) in psp_ras_trigger_error()
1917 ret = psp_ras_send_cmd(psp, in psp_ras_trigger_error()
1936 int psp_ras_query_address(struct psp_context *psp, in psp_ras_query_address() argument
1942 if (!psp->ras_context.context.initialized || in psp_ras_query_address()
1946 ret = psp_ras_send_cmd(psp, in psp_ras_query_address()
1954 static int psp_hdcp_initialize(struct psp_context *psp) in psp_hdcp_initialize() argument
1961 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_initialize()
1965 if (!amdgpu_device_has_display_hardware(psp->adev)) in psp_hdcp_initialize()
1968 if (!psp->hdcp_context.context.bin_desc.size_bytes || in psp_hdcp_initialize()
1969 !psp->hdcp_context.context.bin_desc.start_addr) { in psp_hdcp_initialize()
1970 dev_info(psp->adev->dev, "HDCP: optional hdcp ta ucode is not available\n"); in psp_hdcp_initialize()
1974 psp->hdcp_context.context.mem_context.shared_mem_size = PSP_HDCP_SHARED_MEM_SIZE; in psp_hdcp_initialize()
1975 psp->hdcp_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_hdcp_initialize()
1977 if (!psp->hdcp_context.context.mem_context.shared_buf) { in psp_hdcp_initialize()
1978 ret = psp_ta_init_shared_buf(psp, &psp->hdcp_context.context.mem_context); in psp_hdcp_initialize()
1983 ret = psp_ta_load(psp, &psp->hdcp_context.context); in psp_hdcp_initialize()
1985 psp->hdcp_context.context.initialized = true; in psp_hdcp_initialize()
1986 mutex_init(&psp->hdcp_context.mutex); in psp_hdcp_initialize()
1992 int psp_hdcp_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_hdcp_invoke() argument
1997 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_invoke()
2000 if (!psp->hdcp_context.context.initialized) in psp_hdcp_invoke()
2003 return psp_ta_invoke(psp, ta_cmd_id, &psp->hdcp_context.context); in psp_hdcp_invoke()
2006 static int psp_hdcp_terminate(struct psp_context *psp) in psp_hdcp_terminate() argument
2013 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_terminate()
2016 if (!psp->hdcp_context.context.initialized) in psp_hdcp_terminate()
2019 ret = psp_ta_unload(psp, &psp->hdcp_context.context); in psp_hdcp_terminate()
2021 psp->hdcp_context.context.initialized = false; in psp_hdcp_terminate()
2028 static int psp_dtm_initialize(struct psp_context *psp) in psp_dtm_initialize() argument
2035 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_initialize()
2039 if (!amdgpu_device_has_display_hardware(psp->adev)) in psp_dtm_initialize()
2042 if (!psp->dtm_context.context.bin_desc.size_bytes || in psp_dtm_initialize()
2043 !psp->dtm_context.context.bin_desc.start_addr) { in psp_dtm_initialize()
2044 dev_info(psp->adev->dev, "DTM: optional dtm ta ucode is not available\n"); in psp_dtm_initialize()
2048 psp->dtm_context.context.mem_context.shared_mem_size = PSP_DTM_SHARED_MEM_SIZE; in psp_dtm_initialize()
2049 psp->dtm_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_dtm_initialize()
2051 if (!psp->dtm_context.context.mem_context.shared_buf) { in psp_dtm_initialize()
2052 ret = psp_ta_init_shared_buf(psp, &psp->dtm_context.context.mem_context); in psp_dtm_initialize()
2057 ret = psp_ta_load(psp, &psp->dtm_context.context); in psp_dtm_initialize()
2059 psp->dtm_context.context.initialized = true; in psp_dtm_initialize()
2060 mutex_init(&psp->dtm_context.mutex); in psp_dtm_initialize()
2066 int psp_dtm_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_dtm_invoke() argument
2071 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_invoke()
2074 if (!psp->dtm_context.context.initialized) in psp_dtm_invoke()
2077 return psp_ta_invoke(psp, ta_cmd_id, &psp->dtm_context.context); in psp_dtm_invoke()
2080 static int psp_dtm_terminate(struct psp_context *psp) in psp_dtm_terminate() argument
2087 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_terminate()
2090 if (!psp->dtm_context.context.initialized) in psp_dtm_terminate()
2093 ret = psp_ta_unload(psp, &psp->dtm_context.context); in psp_dtm_terminate()
2095 psp->dtm_context.context.initialized = false; in psp_dtm_terminate()
2102 static int psp_rap_initialize(struct psp_context *psp) in psp_rap_initialize() argument
2110 if (amdgpu_sriov_vf(psp->adev)) in psp_rap_initialize()
2113 if (!psp->rap_context.context.bin_desc.size_bytes || in psp_rap_initialize()
2114 !psp->rap_context.context.bin_desc.start_addr) { in psp_rap_initialize()
2115 dev_info(psp->adev->dev, "RAP: optional rap ta ucode is not available\n"); in psp_rap_initialize()
2119 psp->rap_context.context.mem_context.shared_mem_size = PSP_RAP_SHARED_MEM_SIZE; in psp_rap_initialize()
2120 psp->rap_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_rap_initialize()
2122 if (!psp->rap_context.context.mem_context.shared_buf) { in psp_rap_initialize()
2123 ret = psp_ta_init_shared_buf(psp, &psp->rap_context.context.mem_context); in psp_rap_initialize()
2128 ret = psp_ta_load(psp, &psp->rap_context.context); in psp_rap_initialize()
2130 psp->rap_context.context.initialized = true; in psp_rap_initialize()
2131 mutex_init(&psp->rap_context.mutex); in psp_rap_initialize()
2135 ret = psp_rap_invoke(psp, TA_CMD_RAP__INITIALIZE, &status); in psp_rap_initialize()
2137 psp_rap_terminate(psp); in psp_rap_initialize()
2139 psp_ta_free_shared_buf(&psp->rap_context.context.mem_context); in psp_rap_initialize()
2141 dev_warn(psp->adev->dev, "RAP TA initialize fail (%d) status %d.\n", in psp_rap_initialize()
2150 static int psp_rap_terminate(struct psp_context *psp) in psp_rap_terminate() argument
2154 if (!psp->rap_context.context.initialized) in psp_rap_terminate()
2157 ret = psp_ta_unload(psp, &psp->rap_context.context); in psp_rap_terminate()
2159 psp->rap_context.context.initialized = false; in psp_rap_terminate()
2164 int psp_rap_invoke(struct psp_context *psp, uint32_t ta_cmd_id, enum ta_rap_status *status) in psp_rap_invoke() argument
2169 if (!psp->rap_context.context.initialized) in psp_rap_invoke()
2176 mutex_lock(&psp->rap_context.mutex); in psp_rap_invoke()
2179 psp->rap_context.context.mem_context.shared_buf; in psp_rap_invoke()
2185 ret = psp_ta_invoke(psp, rap_cmd->cmd_id, &psp->rap_context.context); in psp_rap_invoke()
2193 mutex_unlock(&psp->rap_context.mutex); in psp_rap_invoke()
2200 static int psp_securedisplay_initialize(struct psp_context *psp) in psp_securedisplay_initialize() argument
2208 if (amdgpu_sriov_vf(psp->adev)) in psp_securedisplay_initialize()
2212 if (!amdgpu_device_has_display_hardware(psp->adev)) in psp_securedisplay_initialize()
2215 if (!psp->securedisplay_context.context.bin_desc.size_bytes || in psp_securedisplay_initialize()
2216 !psp->securedisplay_context.context.bin_desc.start_addr) { in psp_securedisplay_initialize()
2217 dev_info(psp->adev->dev, "SECUREDISPLAY: securedisplay ta ucode is not available\n"); in psp_securedisplay_initialize()
2221 psp->securedisplay_context.context.mem_context.shared_mem_size = in psp_securedisplay_initialize()
2223 psp->securedisplay_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_securedisplay_initialize()
2225 if (!psp->securedisplay_context.context.initialized) { in psp_securedisplay_initialize()
2226 ret = psp_ta_init_shared_buf(psp, in psp_securedisplay_initialize()
2227 &psp->securedisplay_context.context.mem_context); in psp_securedisplay_initialize()
2232 ret = psp_ta_load(psp, &psp->securedisplay_context.context); in psp_securedisplay_initialize()
2234 psp->securedisplay_context.context.initialized = true; in psp_securedisplay_initialize()
2235 mutex_init(&psp->securedisplay_context.mutex); in psp_securedisplay_initialize()
2239 mutex_lock(&psp->securedisplay_context.mutex); in psp_securedisplay_initialize()
2241 psp_prep_securedisplay_cmd_buf(psp, &securedisplay_cmd, in psp_securedisplay_initialize()
2244 ret = psp_securedisplay_invoke(psp, TA_SECUREDISPLAY_COMMAND__QUERY_TA); in psp_securedisplay_initialize()
2246 mutex_unlock(&psp->securedisplay_context.mutex); in psp_securedisplay_initialize()
2249 psp_securedisplay_terminate(psp); in psp_securedisplay_initialize()
2251 psp_ta_free_shared_buf(&psp->securedisplay_context.context.mem_context); in psp_securedisplay_initialize()
2252 dev_err(psp->adev->dev, "SECUREDISPLAY TA initialize fail.\n"); in psp_securedisplay_initialize()
2257 psp_securedisplay_parse_resp_status(psp, securedisplay_cmd->status); in psp_securedisplay_initialize()
2258 dev_err(psp->adev->dev, "SECUREDISPLAY: query securedisplay TA failed. ret 0x%x\n", in psp_securedisplay_initialize()
2261 psp->securedisplay_context.context.bin_desc.size_bytes = 0; in psp_securedisplay_initialize()
2267 static int psp_securedisplay_terminate(struct psp_context *psp) in psp_securedisplay_terminate() argument
2274 if (amdgpu_sriov_vf(psp->adev)) in psp_securedisplay_terminate()
2277 if (!psp->securedisplay_context.context.initialized) in psp_securedisplay_terminate()
2280 ret = psp_ta_unload(psp, &psp->securedisplay_context.context); in psp_securedisplay_terminate()
2282 psp->securedisplay_context.context.initialized = false; in psp_securedisplay_terminate()
2287 int psp_securedisplay_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_securedisplay_invoke() argument
2291 if (!psp->securedisplay_context.context.initialized) in psp_securedisplay_invoke()
2299 ret = psp_ta_invoke(psp, ta_cmd_id, &psp->securedisplay_context.context); in psp_securedisplay_invoke()
2307 struct psp_context *psp = &adev->psp; in amdgpu_psp_wait_for_bootloader() local
2310 if (!amdgpu_sriov_vf(adev) && psp->funcs && psp->funcs->wait_for_bootloader != NULL) in amdgpu_psp_wait_for_bootloader()
2311 ret = psp->funcs->wait_for_bootloader(psp); in amdgpu_psp_wait_for_bootloader()
2316 bool amdgpu_psp_get_ras_capability(struct psp_context *psp) in amdgpu_psp_get_ras_capability() argument
2318 if (psp->funcs && in amdgpu_psp_get_ras_capability()
2319 psp->funcs->get_ras_capability) { in amdgpu_psp_get_ras_capability()
2320 return psp->funcs->get_ras_capability(psp); in amdgpu_psp_get_ras_capability()
2328 struct psp_context *psp = &adev->psp; in amdgpu_psp_tos_reload_needed() local
2333 if (psp->funcs && psp->funcs->is_reload_needed) in amdgpu_psp_tos_reload_needed()
2334 return psp->funcs->is_reload_needed(psp); in amdgpu_psp_tos_reload_needed()
2339 static int psp_hw_start(struct psp_context *psp) in psp_hw_start() argument
2341 struct amdgpu_device *adev = psp->adev; in psp_hw_start()
2345 if ((is_psp_fw_valid(psp->kdb)) && in psp_hw_start()
2346 (psp->funcs->bootloader_load_kdb != NULL)) { in psp_hw_start()
2347 ret = psp_bootloader_load_kdb(psp); in psp_hw_start()
2354 if ((is_psp_fw_valid(psp->spl)) && in psp_hw_start()
2355 (psp->funcs->bootloader_load_spl != NULL)) { in psp_hw_start()
2356 ret = psp_bootloader_load_spl(psp); in psp_hw_start()
2363 if ((is_psp_fw_valid(psp->sys)) && in psp_hw_start()
2364 (psp->funcs->bootloader_load_sysdrv != NULL)) { in psp_hw_start()
2365 ret = psp_bootloader_load_sysdrv(psp); in psp_hw_start()
2372 if ((is_psp_fw_valid(psp->soc_drv)) && in psp_hw_start()
2373 (psp->funcs->bootloader_load_soc_drv != NULL)) { in psp_hw_start()
2374 ret = psp_bootloader_load_soc_drv(psp); in psp_hw_start()
2381 if ((is_psp_fw_valid(psp->intf_drv)) && in psp_hw_start()
2382 (psp->funcs->bootloader_load_intf_drv != NULL)) { in psp_hw_start()
2383 ret = psp_bootloader_load_intf_drv(psp); in psp_hw_start()
2390 if ((is_psp_fw_valid(psp->dbg_drv)) && in psp_hw_start()
2391 (psp->funcs->bootloader_load_dbg_drv != NULL)) { in psp_hw_start()
2392 ret = psp_bootloader_load_dbg_drv(psp); in psp_hw_start()
2399 if ((is_psp_fw_valid(psp->ras_drv)) && in psp_hw_start()
2400 (psp->funcs->bootloader_load_ras_drv != NULL)) { in psp_hw_start()
2401 ret = psp_bootloader_load_ras_drv(psp); in psp_hw_start()
2408 if ((is_psp_fw_valid(psp->ipkeymgr_drv)) && in psp_hw_start()
2409 (psp->funcs->bootloader_load_ipkeymgr_drv != NULL)) { in psp_hw_start()
2410 ret = psp_bootloader_load_ipkeymgr_drv(psp); in psp_hw_start()
2417 if ((is_psp_fw_valid(psp->spdm_drv)) && in psp_hw_start()
2418 (psp->funcs->bootloader_load_spdm_drv != NULL)) { in psp_hw_start()
2419 ret = psp_bootloader_load_spdm_drv(psp); in psp_hw_start()
2426 if ((is_psp_fw_valid(psp->sos)) && in psp_hw_start()
2427 (psp->funcs->bootloader_load_sos != NULL)) { in psp_hw_start()
2428 ret = psp_bootloader_load_sos(psp); in psp_hw_start()
2436 ret = psp_ring_create(psp, PSP_RING_TYPE__KM); in psp_hw_start()
2445 if (!psp->boot_time_tmr || psp->autoload_supported) { in psp_hw_start()
2446 ret = psp_tmr_init(psp); in psp_hw_start()
2459 if (psp->pmfw_centralized_cstate_management) { in psp_hw_start()
2460 ret = psp_load_smu_fw(psp); in psp_hw_start()
2465 if (!psp->boot_time_tmr || !psp->autoload_supported) { in psp_hw_start()
2466 ret = psp_tmr_load(psp); in psp_hw_start()
2696 static void psp_print_fw_hdr(struct psp_context *psp, in psp_print_fw_hdr() argument
2699 struct amdgpu_device *adev = psp->adev; in psp_print_fw_hdr()
2744 static int psp_prep_load_ip_fw_cmd_buf(struct psp_context *psp, in psp_prep_load_ip_fw_cmd_buf() argument
2758 dev_err(psp->adev->dev, "Unknown firmware type\n"); in psp_prep_load_ip_fw_cmd_buf()
2763 int psp_execute_ip_fw_load(struct psp_context *psp, in psp_execute_ip_fw_load() argument
2767 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_execute_ip_fw_load()
2769 ret = psp_prep_load_ip_fw_cmd_buf(psp, ucode, cmd); in psp_execute_ip_fw_load()
2771 ret = psp_cmd_submit_buf(psp, ucode, cmd, in psp_execute_ip_fw_load()
2772 psp->fence_buf_mc_addr); in psp_execute_ip_fw_load()
2775 release_psp_cmd_buf(psp); in psp_execute_ip_fw_load()
2780 static int psp_load_p2s_table(struct psp_context *psp) in psp_load_p2s_table() argument
2783 struct amdgpu_device *adev = psp->adev; in psp_load_p2s_table()
2795 if (psp->sos.fw_version < supp_vers) in psp_load_p2s_table()
2799 if (!ucode->fw || amdgpu_sriov_vf(psp->adev)) in psp_load_p2s_table()
2802 ret = psp_execute_ip_fw_load(psp, ucode); in psp_load_p2s_table()
2807 static int psp_load_smu_fw(struct psp_context *psp) in psp_load_smu_fw() argument
2810 struct amdgpu_device *adev = psp->adev; in psp_load_smu_fw()
2813 struct amdgpu_ras *ras = psp->ras_context.ras; in psp_load_smu_fw()
2823 if (!ucode->fw || amdgpu_sriov_vf(psp->adev)) in psp_load_smu_fw()
2834 ret = psp_execute_ip_fw_load(psp, ucode); in psp_load_smu_fw()
2842 static bool fw_load_skip_check(struct psp_context *psp, in fw_load_skip_check() argument
2852 (psp_smu_reload_quirk(psp) || in fw_load_skip_check()
2853 psp->autoload_supported || in fw_load_skip_check()
2854 psp->pmfw_centralized_cstate_management)) in fw_load_skip_check()
2857 if (amdgpu_sriov_vf(psp->adev) && in fw_load_skip_check()
2858 amdgpu_virt_fw_load_skip_check(psp->adev, ucode->ucode_id)) in fw_load_skip_check()
2861 if (psp->autoload_supported && in fw_load_skip_check()
2870 int psp_load_fw_list(struct psp_context *psp, in psp_load_fw_list() argument
2878 psp_print_fw_hdr(psp, ucode); in psp_load_fw_list()
2879 ret = psp_execute_ip_fw_load(psp, ucode); in psp_load_fw_list()
2886 static int psp_load_non_psp_fw(struct psp_context *psp) in psp_load_non_psp_fw() argument
2890 struct amdgpu_device *adev = psp->adev; in psp_load_non_psp_fw()
2892 if (psp->autoload_supported && in psp_load_non_psp_fw()
2893 !psp->pmfw_centralized_cstate_management) { in psp_load_non_psp_fw()
2894 ret = psp_load_smu_fw(psp); in psp_load_non_psp_fw()
2900 psp_load_p2s_table(psp); in psp_load_non_psp_fw()
2906 !fw_load_skip_check(psp, ucode)) { in psp_load_non_psp_fw()
2907 ret = psp_load_smu_fw(psp); in psp_load_non_psp_fw()
2913 if (fw_load_skip_check(psp, ucode)) in psp_load_non_psp_fw()
2916 if (psp->autoload_supported && in psp_load_non_psp_fw()
2931 psp_print_fw_hdr(psp, ucode); in psp_load_non_psp_fw()
2933 ret = psp_execute_ip_fw_load(psp, ucode); in psp_load_non_psp_fw()
2938 if (psp->autoload_supported && ucode->ucode_id == (amdgpu_sriov_vf(adev) ? in psp_load_non_psp_fw()
2940 ret = psp_rlc_autoload_start(psp); in psp_load_non_psp_fw()
2954 struct psp_context *psp = &adev->psp; in psp_load_fw() local
2958 psp_ring_stop(psp, PSP_RING_TYPE__KM); in psp_load_fw()
2960 memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE); in psp_load_fw()
2962 ret = psp_ring_init(psp, PSP_RING_TYPE__KM); in psp_load_fw()
2969 ret = psp_hw_start(psp); in psp_load_fw()
2973 ret = psp_load_non_psp_fw(psp); in psp_load_fw()
2977 ret = psp_asd_initialize(psp); in psp_load_fw()
2991 ret = psp_xgmi_initialize(psp, false, true); in psp_load_fw()
2996 dev_err(psp->adev->dev, in psp_load_fw()
3001 if (psp->ta_fw) { in psp_load_fw()
3002 ret = psp_ras_initialize(psp); in psp_load_fw()
3004 dev_err(psp->adev->dev, in psp_load_fw()
3007 ret = psp_hdcp_initialize(psp); in psp_load_fw()
3009 dev_err(psp->adev->dev, in psp_load_fw()
3012 ret = psp_dtm_initialize(psp); in psp_load_fw()
3014 dev_err(psp->adev->dev, in psp_load_fw()
3017 ret = psp_rap_initialize(psp); in psp_load_fw()
3019 dev_err(psp->adev->dev, in psp_load_fw()
3022 ret = psp_securedisplay_initialize(psp); in psp_load_fw()
3024 dev_err(psp->adev->dev, in psp_load_fw()
3031 psp_free_shared_bufs(psp); in psp_load_fw()
3038 psp_ring_destroy(psp, PSP_RING_TYPE__KM); in psp_load_fw()
3071 struct psp_context *psp = &adev->psp; in psp_hw_fini() local
3073 if (psp->ta_fw) { in psp_hw_fini()
3074 psp_ras_terminate(psp); in psp_hw_fini()
3075 psp_securedisplay_terminate(psp); in psp_hw_fini()
3076 psp_rap_terminate(psp); in psp_hw_fini()
3077 psp_dtm_terminate(psp); in psp_hw_fini()
3078 psp_hdcp_terminate(psp); in psp_hw_fini()
3081 psp_xgmi_terminate(psp); in psp_hw_fini()
3084 psp_asd_terminate(psp); in psp_hw_fini()
3085 psp_tmr_terminate(psp); in psp_hw_fini()
3087 psp_ring_destroy(psp, PSP_RING_TYPE__KM); in psp_hw_fini()
3096 struct psp_context *psp = &adev->psp; in psp_suspend() local
3099 psp->xgmi_context.context.initialized) { in psp_suspend()
3100 ret = psp_xgmi_terminate(psp); in psp_suspend()
3107 if (psp->ta_fw) { in psp_suspend()
3108 ret = psp_ras_terminate(psp); in psp_suspend()
3113 ret = psp_hdcp_terminate(psp); in psp_suspend()
3118 ret = psp_dtm_terminate(psp); in psp_suspend()
3123 ret = psp_rap_terminate(psp); in psp_suspend()
3128 ret = psp_securedisplay_terminate(psp); in psp_suspend()
3135 ret = psp_asd_terminate(psp); in psp_suspend()
3141 ret = psp_tmr_terminate(psp); in psp_suspend()
3147 ret = psp_ring_stop(psp, PSP_RING_TYPE__KM); in psp_suspend()
3159 struct psp_context *psp = &adev->psp; in psp_resume() local
3163 if (psp->mem_train_ctx.enable_mem_training) { in psp_resume()
3164 ret = psp_mem_training(psp, PSP_MEM_TRAIN_RESUME); in psp_resume()
3177 ret = psp_hw_start(psp); in psp_resume()
3181 ret = psp_load_non_psp_fw(psp); in psp_resume()
3185 ret = psp_asd_initialize(psp); in psp_resume()
3198 ret = psp_xgmi_initialize(psp, false, true); in psp_resume()
3203 dev_err(psp->adev->dev, in psp_resume()
3207 if (psp->ta_fw) { in psp_resume()
3208 ret = psp_ras_initialize(psp); in psp_resume()
3210 dev_err(psp->adev->dev, in psp_resume()
3213 ret = psp_hdcp_initialize(psp); in psp_resume()
3215 dev_err(psp->adev->dev, in psp_resume()
3218 ret = psp_dtm_initialize(psp); in psp_resume()
3220 dev_err(psp->adev->dev, in psp_resume()
3223 ret = psp_rap_initialize(psp); in psp_resume()
3225 dev_err(psp->adev->dev, in psp_resume()
3228 ret = psp_securedisplay_initialize(psp); in psp_resume()
3230 dev_err(psp->adev->dev, in psp_resume()
3251 mutex_lock(&adev->psp.mutex); in psp_gpu_reset()
3252 ret = psp_mode1_reset(&adev->psp); in psp_gpu_reset()
3253 mutex_unlock(&adev->psp.mutex); in psp_gpu_reset()
3258 int psp_rlc_autoload_start(struct psp_context *psp) in psp_rlc_autoload_start() argument
3261 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_rlc_autoload_start()
3265 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_rlc_autoload_start()
3266 psp->fence_buf_mc_addr); in psp_rlc_autoload_start()
3268 release_psp_cmd_buf(psp); in psp_rlc_autoload_start()
3273 int psp_ring_cmd_submit(struct psp_context *psp, in psp_ring_cmd_submit() argument
3280 struct psp_ring *ring = &psp->km_ring; in psp_ring_cmd_submit()
3284 struct amdgpu_device *adev = psp->adev; in psp_ring_cmd_submit()
3289 psp_write_ptr_reg = psp_ring_get_wptr(psp); in psp_ring_cmd_submit()
3321 psp_ring_set_wptr(psp, psp_write_ptr_reg); in psp_ring_cmd_submit()
3325 int psp_init_asd_microcode(struct psp_context *psp, const char *chip_name) in psp_init_asd_microcode() argument
3327 struct amdgpu_device *adev = psp->adev; in psp_init_asd_microcode()
3331 err = amdgpu_ucode_request(adev, &adev->psp.asd_fw, AMDGPU_UCODE_REQUIRED, in psp_init_asd_microcode()
3336 asd_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data; in psp_init_asd_microcode()
3337 adev->psp.asd_context.bin_desc.fw_version = le32_to_cpu(asd_hdr->header.ucode_version); in psp_init_asd_microcode()
3338 adev->psp.asd_context.bin_desc.feature_version = le32_to_cpu(asd_hdr->sos.fw_version); in psp_init_asd_microcode()
3339 adev->psp.asd_context.bin_desc.size_bytes = le32_to_cpu(asd_hdr->header.ucode_size_bytes); in psp_init_asd_microcode()
3340 adev->psp.asd_context.bin_desc.start_addr = (uint8_t *)asd_hdr + in psp_init_asd_microcode()
3344 amdgpu_ucode_release(&adev->psp.asd_fw); in psp_init_asd_microcode()
3348 int psp_init_toc_microcode(struct psp_context *psp, const char *chip_name) in psp_init_toc_microcode() argument
3350 struct amdgpu_device *adev = psp->adev; in psp_init_toc_microcode()
3354 err = amdgpu_ucode_request(adev, &adev->psp.toc_fw, AMDGPU_UCODE_REQUIRED, in psp_init_toc_microcode()
3359 toc_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.toc_fw->data; in psp_init_toc_microcode()
3360 adev->psp.toc.fw_version = le32_to_cpu(toc_hdr->header.ucode_version); in psp_init_toc_microcode()
3361 adev->psp.toc.feature_version = le32_to_cpu(toc_hdr->sos.fw_version); in psp_init_toc_microcode()
3362 adev->psp.toc.size_bytes = le32_to_cpu(toc_hdr->header.ucode_size_bytes); in psp_init_toc_microcode()
3363 adev->psp.toc.start_addr = (uint8_t *)toc_hdr + in psp_init_toc_microcode()
3367 amdgpu_ucode_release(&adev->psp.toc_fw); in psp_init_toc_microcode()
3371 static int parse_sos_bin_descriptor(struct psp_context *psp, in parse_sos_bin_descriptor() argument
3377 if (!psp || !desc || !sos_hdr) in parse_sos_bin_descriptor()
3386 psp->sos.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3387 psp->sos.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3388 psp->sos.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3389 psp->sos.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3392 psp->sys.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3393 psp->sys.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3394 psp->sys.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3395 psp->sys.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3398 psp->kdb.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3399 psp->kdb.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3400 psp->kdb.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3401 psp->kdb.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3404 psp->toc.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3405 psp->toc.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3406 psp->toc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3407 psp->toc.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3410 psp->spl.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3411 psp->spl.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3412 psp->spl.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3413 psp->spl.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3416 psp->rl.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3417 psp->rl.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3418 psp->rl.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3419 psp->rl.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3422 psp->soc_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3423 psp->soc_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3424 psp->soc_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3425 psp->soc_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3428 psp->intf_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3429 psp->intf_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3430 psp->intf_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3431 psp->intf_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3434 psp->dbg_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3435 psp->dbg_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3436 psp->dbg_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3437 psp->dbg_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3440 psp->ras_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3441 psp->ras_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3442 psp->ras_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3443 psp->ras_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3446 psp->ipkeymgr_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3447 psp->ipkeymgr_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3448 psp->ipkeymgr_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3449 psp->ipkeymgr_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3452 psp->spdm_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3453 psp->spdm_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3454 psp->spdm_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3455 psp->spdm_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3458 dev_warn(psp->adev->dev, "Unsupported PSP FW type: %d\n", desc->fw_type); in parse_sos_bin_descriptor()
3471 sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data; in psp_init_sos_base_fw()
3477 adev->psp.sos.fw_version = le32_to_cpu(sos_hdr->header.ucode_version); in psp_init_sos_base_fw()
3478 adev->psp.sos.feature_version = le32_to_cpu(sos_hdr->sos.fw_version); in psp_init_sos_base_fw()
3480 adev->psp.sys.size_bytes = le32_to_cpu(sos_hdr->sos.offset_bytes); in psp_init_sos_base_fw()
3481 adev->psp.sys.start_addr = ucode_array_start_addr; in psp_init_sos_base_fw()
3483 adev->psp.sos.size_bytes = le32_to_cpu(sos_hdr->sos.size_bytes); in psp_init_sos_base_fw()
3484 adev->psp.sos.start_addr = ucode_array_start_addr + in psp_init_sos_base_fw()
3488 sos_hdr_v1_3 = (const struct psp_firmware_header_v1_3 *)adev->psp.sos_fw->data; in psp_init_sos_base_fw()
3490 adev->psp.sos.fw_version = le32_to_cpu(sos_hdr_v1_3->sos_aux.fw_version); in psp_init_sos_base_fw()
3491 adev->psp.sos.feature_version = le32_to_cpu(sos_hdr_v1_3->sos_aux.fw_version); in psp_init_sos_base_fw()
3493 adev->psp.sys.size_bytes = le32_to_cpu(sos_hdr_v1_3->sys_drv_aux.size_bytes); in psp_init_sos_base_fw()
3494 adev->psp.sys.start_addr = ucode_array_start_addr + in psp_init_sos_base_fw()
3497 adev->psp.sos.size_bytes = le32_to_cpu(sos_hdr_v1_3->sos_aux.size_bytes); in psp_init_sos_base_fw()
3498 adev->psp.sos.start_addr = ucode_array_start_addr + in psp_init_sos_base_fw()
3502 if ((adev->psp.sys.size_bytes == 0) || (adev->psp.sos.size_bytes == 0)) { in psp_init_sos_base_fw()
3510 int psp_init_sos_microcode(struct psp_context *psp, const char *chip_name) in psp_init_sos_microcode() argument
3512 struct amdgpu_device *adev = psp->adev; in psp_init_sos_microcode()
3524 err = amdgpu_ucode_request(adev, &adev->psp.sos_fw, AMDGPU_UCODE_REQUIRED, in psp_init_sos_microcode()
3529 sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3541 sos_hdr_v1_1 = (const struct psp_firmware_header_v1_1 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3542 adev->psp.toc.size_bytes = le32_to_cpu(sos_hdr_v1_1->toc.size_bytes); in psp_init_sos_microcode()
3543 adev->psp.toc.start_addr = (uint8_t *)adev->psp.sys.start_addr + in psp_init_sos_microcode()
3545 adev->psp.kdb.size_bytes = le32_to_cpu(sos_hdr_v1_1->kdb.size_bytes); in psp_init_sos_microcode()
3546 adev->psp.kdb.start_addr = (uint8_t *)adev->psp.sys.start_addr + in psp_init_sos_microcode()
3550 sos_hdr_v1_2 = (const struct psp_firmware_header_v1_2 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3551 adev->psp.kdb.size_bytes = le32_to_cpu(sos_hdr_v1_2->kdb.size_bytes); in psp_init_sos_microcode()
3552 adev->psp.kdb.start_addr = (uint8_t *)adev->psp.sys.start_addr + in psp_init_sos_microcode()
3556 sos_hdr_v1_3 = (const struct psp_firmware_header_v1_3 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3557 adev->psp.toc.size_bytes = le32_to_cpu(sos_hdr_v1_3->v1_1.toc.size_bytes); in psp_init_sos_microcode()
3558 adev->psp.toc.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3560 adev->psp.kdb.size_bytes = le32_to_cpu(sos_hdr_v1_3->v1_1.kdb.size_bytes); in psp_init_sos_microcode()
3561 adev->psp.kdb.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3563 adev->psp.spl.size_bytes = le32_to_cpu(sos_hdr_v1_3->spl.size_bytes); in psp_init_sos_microcode()
3564 adev->psp.spl.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3566 adev->psp.rl.size_bytes = le32_to_cpu(sos_hdr_v1_3->rl.size_bytes); in psp_init_sos_microcode()
3567 adev->psp.rl.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3572 sos_hdr_v2_0 = (const struct psp_firmware_header_v2_0 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3583 sos_hdr_v2_1 = (const struct psp_firmware_header_v2_1 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3587 if (psp_is_aux_sos_load_required(psp)) in psp_init_sos_microcode()
3597 err = parse_sos_bin_descriptor(psp, fw_bin + fw_index, in psp_init_sos_microcode()
3612 amdgpu_ucode_release(&adev->psp.sos_fw); in psp_init_sos_microcode()
3617 static bool is_ta_fw_applicable(struct psp_context *psp, in is_ta_fw_applicable() argument
3620 struct amdgpu_device *adev = psp->adev; in is_ta_fw_applicable()
3647 static int parse_ta_bin_descriptor(struct psp_context *psp, in parse_ta_bin_descriptor() argument
3653 if (!psp || !desc || !ta_hdr) in parse_ta_bin_descriptor()
3656 if (!is_ta_fw_applicable(psp, desc)) in parse_ta_bin_descriptor()
3665 psp->asd_context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3666 psp->asd_context.bin_desc.feature_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3667 psp->asd_context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3668 psp->asd_context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3672 psp->xgmi_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3673 psp->xgmi_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3674 psp->xgmi_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3677 psp->ras_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3678 psp->ras_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3679 psp->ras_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3682 psp->hdcp_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3683 psp->hdcp_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3684 psp->hdcp_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3687 psp->dtm_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3688 psp->dtm_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3689 psp->dtm_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3692 psp->rap_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3693 psp->rap_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3694 psp->rap_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3697 psp->securedisplay_context.context.bin_desc.fw_version = in parse_ta_bin_descriptor()
3699 psp->securedisplay_context.context.bin_desc.size_bytes = in parse_ta_bin_descriptor()
3701 psp->securedisplay_context.context.bin_desc.start_addr = in parse_ta_bin_descriptor()
3705 dev_warn(psp->adev->dev, "Unsupported TA type: %d\n", desc->fw_type); in parse_ta_bin_descriptor()
3712 static int parse_ta_v1_microcode(struct psp_context *psp) in parse_ta_v1_microcode() argument
3715 struct amdgpu_device *adev = psp->adev; in parse_ta_v1_microcode()
3717 ta_hdr = (const struct ta_firmware_header_v1_0 *) adev->psp.ta_fw->data; in parse_ta_v1_microcode()
3722 adev->psp.xgmi_context.context.bin_desc.fw_version = in parse_ta_v1_microcode()
3724 adev->psp.xgmi_context.context.bin_desc.size_bytes = in parse_ta_v1_microcode()
3726 adev->psp.xgmi_context.context.bin_desc.start_addr = in parse_ta_v1_microcode()
3730 adev->psp.ras_context.context.bin_desc.fw_version = in parse_ta_v1_microcode()
3732 adev->psp.ras_context.context.bin_desc.size_bytes = in parse_ta_v1_microcode()
3734 adev->psp.ras_context.context.bin_desc.start_addr = in parse_ta_v1_microcode()
3735 (uint8_t *)adev->psp.xgmi_context.context.bin_desc.start_addr + in parse_ta_v1_microcode()
3738 adev->psp.hdcp_context.context.bin_desc.fw_version = in parse_ta_v1_microcode()
3740 adev->psp.hdcp_context.context.bin_desc.size_bytes = in parse_ta_v1_microcode()
3742 adev->psp.hdcp_context.context.bin_desc.start_addr = in parse_ta_v1_microcode()
3746 adev->psp.dtm_context.context.bin_desc.fw_version = in parse_ta_v1_microcode()
3748 adev->psp.dtm_context.context.bin_desc.size_bytes = in parse_ta_v1_microcode()
3750 adev->psp.dtm_context.context.bin_desc.start_addr = in parse_ta_v1_microcode()
3751 (uint8_t *)adev->psp.hdcp_context.context.bin_desc.start_addr + in parse_ta_v1_microcode()
3754 adev->psp.securedisplay_context.context.bin_desc.fw_version = in parse_ta_v1_microcode()
3756 adev->psp.securedisplay_context.context.bin_desc.size_bytes = in parse_ta_v1_microcode()
3758 adev->psp.securedisplay_context.context.bin_desc.start_addr = in parse_ta_v1_microcode()
3759 (uint8_t *)adev->psp.hdcp_context.context.bin_desc.start_addr + in parse_ta_v1_microcode()
3762 adev->psp.ta_fw_version = le32_to_cpu(ta_hdr->header.ucode_version); in parse_ta_v1_microcode()
3767 static int parse_ta_v2_microcode(struct psp_context *psp) in parse_ta_v2_microcode() argument
3770 struct amdgpu_device *adev = psp->adev; in parse_ta_v2_microcode()
3774 ta_hdr = (const struct ta_firmware_header_v2_0 *)adev->psp.ta_fw->data; in parse_ta_v2_microcode()
3785 err = parse_ta_bin_descriptor(psp, in parse_ta_v2_microcode()
3795 int psp_init_ta_microcode(struct psp_context *psp, const char *chip_name) in psp_init_ta_microcode() argument
3798 struct amdgpu_device *adev = psp->adev; in psp_init_ta_microcode()
3801 err = amdgpu_ucode_request(adev, &adev->psp.ta_fw, AMDGPU_UCODE_REQUIRED, in psp_init_ta_microcode()
3806 hdr = (const struct common_firmware_header *)adev->psp.ta_fw->data; in psp_init_ta_microcode()
3809 err = parse_ta_v1_microcode(psp); in psp_init_ta_microcode()
3812 err = parse_ta_v2_microcode(psp); in psp_init_ta_microcode()
3820 amdgpu_ucode_release(&adev->psp.ta_fw); in psp_init_ta_microcode()
3825 int psp_init_cap_microcode(struct psp_context *psp, const char *chip_name) in psp_init_cap_microcode() argument
3827 struct amdgpu_device *adev = psp->adev; in psp_init_cap_microcode()
3837 err = amdgpu_ucode_request(adev, &adev->psp.cap_fw, AMDGPU_UCODE_OPTIONAL, in psp_init_cap_microcode()
3851 info->fw = adev->psp.cap_fw; in psp_init_cap_microcode()
3853 adev->psp.cap_fw->data; in psp_init_cap_microcode()
3856 adev->psp.cap_fw_version = le32_to_cpu(cap_hdr_v1_0->header.ucode_version); in psp_init_cap_microcode()
3857 adev->psp.cap_feature_version = le32_to_cpu(cap_hdr_v1_0->sos.fw_version); in psp_init_cap_microcode()
3858 adev->psp.cap_ucode_size = le32_to_cpu(cap_hdr_v1_0->header.ucode_size_bytes); in psp_init_cap_microcode()
3863 amdgpu_ucode_release(&adev->psp.cap_fw); in psp_init_cap_microcode()
3867 int psp_config_sq_perfmon(struct psp_context *psp, in psp_config_sq_perfmon() argument
3873 if (amdgpu_sriov_vf(psp->adev)) in psp_config_sq_perfmon()
3877 dev_err(psp->adev->dev, "invalid xcp_id %d\n", xcp_id); in psp_config_sq_perfmon()
3881 if (amdgpu_ip_version(psp->adev, MP0_HWIP, 0) != IP_VERSION(13, 0, 6)) { in psp_config_sq_perfmon()
3882 dev_err(psp->adev->dev, "Unsupported MP0 version 0x%x for CONFIG_SQ_PERFMON command\n", in psp_config_sq_perfmon()
3883 amdgpu_ip_version(psp->adev, MP0_HWIP, 0)); in psp_config_sq_perfmon()
3886 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_config_sq_perfmon()
3894 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_config_sq_perfmon()
3896 dev_warn(psp->adev->dev, "PSP failed to config sq: xcp%d core%d reg%d perfmon%d\n", in psp_config_sq_perfmon()
3899 release_psp_cmd_buf(psp); in psp_config_sq_perfmon()
3931 mutex_lock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_read()
3932 ret = psp_read_usbc_pd_fw(&adev->psp, &fw_ver); in psp_usbc_pd_fw_sysfs_read()
3933 mutex_unlock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_read()
3982 mutex_lock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_write()
3983 ret = psp_load_usbc_pd_fw(&adev->psp, fw_pri_mc_addr); in psp_usbc_pd_fw_sysfs_write()
3984 mutex_unlock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_write()
4000 void psp_copy_fw(struct psp_context *psp, uint8_t *start_addr, uint32_t bin_size) in psp_copy_fw() argument
4004 if (!drm_dev_enter(adev_to_drm(psp->adev), &idx)) in psp_copy_fw()
4007 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_copy_fw()
4008 memcpy(psp->fw_pri_buf, start_addr, bin_size); in psp_copy_fw()
4035 adev->psp.vbflash_done = false; in amdgpu_psp_vbflash_write()
4038 if (adev->psp.vbflash_image_size > AMD_VBIOS_FILE_MAX_SIZE_B) { in amdgpu_psp_vbflash_write()
4040 kvfree(adev->psp.vbflash_tmp_buf); in amdgpu_psp_vbflash_write()
4041 adev->psp.vbflash_tmp_buf = NULL; in amdgpu_psp_vbflash_write()
4042 adev->psp.vbflash_image_size = 0; in amdgpu_psp_vbflash_write()
4047 if (!adev->psp.vbflash_tmp_buf) { in amdgpu_psp_vbflash_write()
4048 adev->psp.vbflash_tmp_buf = kvmalloc(AMD_VBIOS_FILE_MAX_SIZE_B, GFP_KERNEL); in amdgpu_psp_vbflash_write()
4049 if (!adev->psp.vbflash_tmp_buf) in amdgpu_psp_vbflash_write()
4053 mutex_lock(&adev->psp.mutex); in amdgpu_psp_vbflash_write()
4054 memcpy(adev->psp.vbflash_tmp_buf + pos, buffer, count); in amdgpu_psp_vbflash_write()
4055 adev->psp.vbflash_image_size += count; in amdgpu_psp_vbflash_write()
4056 mutex_unlock(&adev->psp.mutex); in amdgpu_psp_vbflash_write()
4075 if (adev->psp.vbflash_image_size == 0) in amdgpu_psp_vbflash_read()
4080 ret = amdgpu_bo_create_kernel(adev, adev->psp.vbflash_image_size, in amdgpu_psp_vbflash_read()
4089 memcpy_toio(fw_pri_cpu_addr, adev->psp.vbflash_tmp_buf, adev->psp.vbflash_image_size); in amdgpu_psp_vbflash_read()
4091 mutex_lock(&adev->psp.mutex); in amdgpu_psp_vbflash_read()
4092 ret = psp_update_spirom(&adev->psp, fw_pri_mc_addr); in amdgpu_psp_vbflash_read()
4093 mutex_unlock(&adev->psp.mutex); in amdgpu_psp_vbflash_read()
4098 kvfree(adev->psp.vbflash_tmp_buf); in amdgpu_psp_vbflash_read()
4099 adev->psp.vbflash_tmp_buf = NULL; in amdgpu_psp_vbflash_read()
4100 adev->psp.vbflash_image_size = 0; in amdgpu_psp_vbflash_read()
4137 vbflash_status = psp_vbflash_status(&adev->psp); in amdgpu_psp_vbflash_status()
4138 if (!adev->psp.vbflash_done) in amdgpu_psp_vbflash_status()
4140 else if (adev->psp.vbflash_done && !(vbflash_status & 0x80000000)) in amdgpu_psp_vbflash_status()
4165 return adev->psp.sup_pd_fw_up ? 0660 : 0; in amdgpu_flash_attr_is_visible()
4167 return adev->psp.sup_ifwi_up ? 0440 : 0; in amdgpu_flash_attr_is_visible()
4178 return adev->psp.sup_ifwi_up ? 0660 : 0; in amdgpu_bin_flash_attr_is_visible()