Lines Matching full:psp
51 static int psp_load_smu_fw(struct psp_context *psp);
52 static int psp_rap_terminate(struct psp_context *psp);
53 static int psp_securedisplay_terminate(struct psp_context *psp);
55 static int psp_ring_init(struct psp_context *psp, in psp_ring_init() argument
60 struct amdgpu_device *adev = psp->adev; in psp_ring_init()
62 ring = &psp->km_ring; in psp_ring_init()
90 * - Load other non-psp fw
97 static void psp_check_pmfw_centralized_cstate_management(struct psp_context *psp) in psp_check_pmfw_centralized_cstate_management() argument
99 struct amdgpu_device *adev = psp->adev; in psp_check_pmfw_centralized_cstate_management()
102 psp->pmfw_centralized_cstate_management = false; in psp_check_pmfw_centralized_cstate_management()
118 psp->pmfw_centralized_cstate_management = true; in psp_check_pmfw_centralized_cstate_management()
121 psp->pmfw_centralized_cstate_management = false; in psp_check_pmfw_centralized_cstate_management()
126 static int psp_init_sriov_microcode(struct psp_context *psp) in psp_init_sriov_microcode() argument
128 struct amdgpu_device *adev = psp->adev; in psp_init_sriov_microcode()
139 ret = psp_init_cap_microcode(psp, ucode_prefix); in psp_init_sriov_microcode()
143 ret = psp_init_cap_microcode(psp, ucode_prefix); in psp_init_sriov_microcode()
144 ret &= psp_init_ta_microcode(psp, ucode_prefix); in psp_init_sriov_microcode()
152 ret = psp_init_cap_microcode(psp, ucode_prefix); in psp_init_sriov_microcode()
153 ret &= psp_init_ta_microcode(psp, ucode_prefix); in psp_init_sriov_microcode()
157 ret = psp_init_cap_microcode(psp, ucode_prefix); in psp_init_sriov_microcode()
160 ret = psp_init_ta_microcode(psp, ucode_prefix); in psp_init_sriov_microcode()
171 struct psp_context *psp = &adev->psp; in psp_early_init() local
173 psp->autoload_supported = true; in psp_early_init()
174 psp->boot_time_tmr = true; in psp_early_init()
178 psp_v3_1_set_psp_funcs(psp); in psp_early_init()
179 psp->autoload_supported = false; in psp_early_init()
180 psp->boot_time_tmr = false; in psp_early_init()
184 psp_v10_0_set_psp_funcs(psp); in psp_early_init()
185 psp->autoload_supported = false; in psp_early_init()
186 psp->boot_time_tmr = false; in psp_early_init()
190 psp_v11_0_set_psp_funcs(psp); in psp_early_init()
191 psp->autoload_supported = false; in psp_early_init()
192 psp->boot_time_tmr = false; in psp_early_init()
196 adev->psp.sup_pd_fw_up = !amdgpu_sriov_vf(adev); in psp_early_init()
205 psp_v11_0_set_psp_funcs(psp); in psp_early_init()
206 psp->boot_time_tmr = false; in psp_early_init()
210 psp_v12_0_set_psp_funcs(psp); in psp_early_init()
211 psp->autoload_supported = false; in psp_early_init()
212 psp->boot_time_tmr = false; in psp_early_init()
215 psp->boot_time_tmr = false; in psp_early_init()
219 psp_v13_0_set_psp_funcs(psp); in psp_early_init()
220 psp->autoload_supported = false; in psp_early_init()
224 psp_v13_0_set_psp_funcs(psp); in psp_early_init()
225 psp->autoload_supported = false; in psp_early_init()
226 adev->psp.sup_ifwi_up = !amdgpu_sriov_vf(adev); in psp_early_init()
236 psp_v13_0_set_psp_funcs(psp); in psp_early_init()
237 psp->boot_time_tmr = false; in psp_early_init()
241 psp_v11_0_8_set_psp_funcs(psp); in psp_early_init()
243 psp->autoload_supported = false; in psp_early_init()
244 psp->boot_time_tmr = false; in psp_early_init()
249 psp_v13_0_set_psp_funcs(psp); in psp_early_init()
250 adev->psp.sup_ifwi_up = !amdgpu_sriov_vf(adev); in psp_early_init()
251 psp->boot_time_tmr = false; in psp_early_init()
254 psp_v13_0_4_set_psp_funcs(psp); in psp_early_init()
255 psp->boot_time_tmr = false; in psp_early_init()
259 adev->psp.sup_ifwi_up = !amdgpu_sriov_vf(adev); in psp_early_init()
260 psp_v14_0_set_psp_funcs(psp); in psp_early_init()
263 psp_v14_0_set_psp_funcs(psp); in psp_early_init()
264 psp->boot_time_tmr = false; in psp_early_init()
267 psp_v15_0_0_set_psp_funcs(psp); in psp_early_init()
268 psp->boot_time_tmr = false; in psp_early_init()
271 psp_v15_0_8_set_psp_funcs(psp); in psp_early_init()
277 psp->adev = adev; in psp_early_init()
281 psp_check_pmfw_centralized_cstate_management(psp); in psp_early_init()
284 return psp_init_sriov_microcode(psp); in psp_early_init()
286 return psp_init_microcode(psp); in psp_early_init()
296 static void psp_free_shared_bufs(struct psp_context *psp) in psp_free_shared_bufs() argument
302 pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL; in psp_free_shared_bufs()
303 amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, pptr); in psp_free_shared_bufs()
304 psp->tmr_bo = NULL; in psp_free_shared_bufs()
307 psp_ta_free_shared_buf(&psp->xgmi_context.context.mem_context); in psp_free_shared_bufs()
310 psp_ta_free_shared_buf(&psp->ras_context.context.mem_context); in psp_free_shared_bufs()
313 psp_ta_free_shared_buf(&psp->hdcp_context.context.mem_context); in psp_free_shared_bufs()
316 psp_ta_free_shared_buf(&psp->dtm_context.context.mem_context); in psp_free_shared_bufs()
319 psp_ta_free_shared_buf(&psp->rap_context.context.mem_context); in psp_free_shared_bufs()
322 psp_ta_free_shared_buf(&psp->securedisplay_context.context.mem_context); in psp_free_shared_bufs()
327 static void psp_memory_training_fini(struct psp_context *psp) in psp_memory_training_fini() argument
329 struct psp_memory_training_context *ctx = &psp->mem_train_ctx; in psp_memory_training_fini()
336 static int psp_memory_training_init(struct psp_context *psp) in psp_memory_training_init() argument
339 struct psp_memory_training_context *ctx = &psp->mem_train_ctx; in psp_memory_training_init()
342 dev_dbg(psp->adev->dev, "memory training is not supported!\n"); in psp_memory_training_init()
348 dev_err(psp->adev->dev, "alloc mem_train_ctx.sys_cache failed!\n"); in psp_memory_training_init()
353 dev_dbg(psp->adev->dev, in psp_memory_training_init()
362 psp_memory_training_fini(psp); in psp_memory_training_init()
367 * Helper funciton to query psp runtime database entry
370 * @entry_type: the type of psp runtime database entry
401 dev_dbg(adev->dev, "PSP runtime database doesn't exist\n"); in psp_get_runtime_db_entry()
411 dev_warn(adev->dev, "Invalid PSP runtime database entry count\n"); in psp_get_runtime_db_entry()
422 dev_warn(adev->dev, "Invalid PSP runtime database boot cfg entry size\n"); in psp_get_runtime_db_entry()
433 dev_warn(adev->dev, "Invalid PSP runtime database scpm entry size\n"); in psp_get_runtime_db_entry()
454 struct psp_context *psp = &adev->psp; in psp_sw_init() local
457 struct psp_memory_training_context *mem_training_ctx = &psp->mem_train_ctx; in psp_sw_init()
460 psp->cmd = kzalloc_obj(struct psp_gfx_cmd_resp); in psp_sw_init()
461 if (!psp->cmd) { in psp_sw_init()
466 adev->psp.xgmi_context.supports_extended_data = in psp_sw_init()
488 psp->boot_cfg_bitmask = boot_cfg_entry.boot_cfg_bitmask; in psp_sw_init()
489 if ((psp->boot_cfg_bitmask) & in psp_sw_init()
491 /* If psp runtime database exists, then in psp_sw_init()
500 /* If psp runtime database doesn't exist or is in psp_sw_init()
507 ret = psp_memory_training_init(psp); in psp_sw_init()
513 ret = psp_mem_training(psp, PSP_MEM_TRAIN_COLD_BOOT); in psp_sw_init()
523 &psp->fw_pri_bo, in psp_sw_init()
524 &psp->fw_pri_mc_addr, in psp_sw_init()
525 &psp->fw_pri_buf); in psp_sw_init()
532 &psp->fence_buf_bo, in psp_sw_init()
533 &psp->fence_buf_mc_addr, in psp_sw_init()
534 &psp->fence_buf); in psp_sw_init()
541 &psp->cmd_buf_bo, &psp->cmd_buf_mc_addr, in psp_sw_init()
542 (void **)&psp->cmd_buf_mem); in psp_sw_init()
549 amdgpu_bo_free_kernel(&psp->fence_buf_bo, in psp_sw_init()
550 &psp->fence_buf_mc_addr, &psp->fence_buf); in psp_sw_init()
552 amdgpu_bo_free_kernel(&psp->fw_pri_bo, in psp_sw_init()
553 &psp->fw_pri_mc_addr, &psp->fw_pri_buf); in psp_sw_init()
560 struct psp_context *psp = &adev->psp; in psp_sw_fini() local
562 psp_memory_training_fini(psp); in psp_sw_fini()
564 amdgpu_ucode_release(&psp->sos_fw); in psp_sw_fini()
565 amdgpu_ucode_release(&psp->asd_fw); in psp_sw_fini()
566 amdgpu_ucode_release(&psp->ta_fw); in psp_sw_fini()
567 amdgpu_ucode_release(&psp->cap_fw); in psp_sw_fini()
568 amdgpu_ucode_release(&psp->toc_fw); in psp_sw_fini()
570 kfree(psp->cmd); in psp_sw_fini()
571 psp->cmd = NULL; in psp_sw_fini()
573 psp_free_shared_bufs(psp); in psp_sw_fini()
575 if (psp->km_ring.ring_mem) in psp_sw_fini()
577 &psp->km_ring.ring_mem_mc_addr, in psp_sw_fini()
578 (void **)&psp->km_ring.ring_mem); in psp_sw_fini()
580 amdgpu_bo_free_kernel(&psp->fw_pri_bo, in psp_sw_fini()
581 &psp->fw_pri_mc_addr, &psp->fw_pri_buf); in psp_sw_fini()
582 amdgpu_bo_free_kernel(&psp->fence_buf_bo, in psp_sw_fini()
583 &psp->fence_buf_mc_addr, &psp->fence_buf); in psp_sw_fini()
584 amdgpu_bo_free_kernel(&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr, in psp_sw_fini()
585 (void **)&psp->cmd_buf_mem); in psp_sw_fini()
590 int psp_wait_for(struct psp_context *psp, uint32_t reg_index, uint32_t reg_val, in psp_wait_for() argument
597 struct amdgpu_device *adev = psp->adev; in psp_wait_for()
599 if (psp->adev->no_hw_access) in psp_wait_for()
616 "psp reg (0x%x) wait timed out, mask: %x, read: %x exp: %x", in psp_wait_for()
622 int psp_wait_for_spirom_update(struct psp_context *psp, uint32_t reg_index, in psp_wait_for_spirom_update() argument
627 struct amdgpu_device *adev = psp->adev; in psp_wait_for_spirom_update()
629 if (psp->adev->no_hw_access) in psp_wait_for_spirom_update()
690 static bool psp_err_warn(struct psp_context *psp) in psp_err_warn() argument
692 struct psp_gfx_cmd_resp *cmd = psp->cmd_buf_mem; in psp_err_warn()
695 if (amdgpu_ip_version(psp->adev, MP0_HWIP, 0) == IP_VERSION(13, 0, 2) && in psp_err_warn()
705 psp_cmd_submit_buf(struct psp_context *psp, in psp_cmd_submit_buf() argument
711 int timeout = psp->adev->psp_timeout; in psp_cmd_submit_buf()
715 if (psp->adev->no_hw_access) in psp_cmd_submit_buf()
718 memset(psp->cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE); in psp_cmd_submit_buf()
720 memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp)); in psp_cmd_submit_buf()
722 index = atomic_inc_return(&psp->fence_value); in psp_cmd_submit_buf()
723 ret = psp_ring_cmd_submit(psp, psp->cmd_buf_mc_addr, fence_mc_addr, index); in psp_cmd_submit_buf()
725 atomic_dec(&psp->fence_value); in psp_cmd_submit_buf()
729 amdgpu_device_invalidate_hdp(psp->adev, NULL); in psp_cmd_submit_buf()
730 while (*((unsigned int *)psp->fence_buf) != index) { in psp_cmd_submit_buf()
736 * be released for psp resume sequence. in psp_cmd_submit_buf()
742 amdgpu_device_invalidate_hdp(psp->adev, NULL); in psp_cmd_submit_buf()
746 skip_unsupport = (psp->cmd_buf_mem->resp.status == TEE_ERROR_NOT_SUPPORTED || in psp_cmd_submit_buf()
747 psp->cmd_buf_mem->resp.status == PSP_ERR_UNKNOWN_COMMAND) && amdgpu_sriov_vf(psp->adev); in psp_cmd_submit_buf()
749 memcpy(&cmd->resp, &psp->cmd_buf_mem->resp, sizeof(struct psp_gfx_resp)); in psp_cmd_submit_buf()
751 /* In some cases, psp response status is not 0 even there is no in psp_cmd_submit_buf()
752 * problem while the command is submitted. Some version of PSP FW in psp_cmd_submit_buf()
755 * during psp initialization to avoid breaking hw_init and it doesn't in psp_cmd_submit_buf()
758 if (!skip_unsupport && (psp->cmd_buf_mem->resp.status || !timeout) && !ras_intr) { in psp_cmd_submit_buf()
760 dev_warn(psp->adev->dev, in psp_cmd_submit_buf()
763 if (psp_err_warn(psp)) in psp_cmd_submit_buf()
765 psp->adev->dev, in psp_cmd_submit_buf()
766 "psp gfx command %s(0x%X) failed and response status is (0x%X)\n", in psp_cmd_submit_buf()
767 psp_gfx_cmd_name(psp->cmd_buf_mem->cmd_id), in psp_cmd_submit_buf()
768 psp->cmd_buf_mem->cmd_id, in psp_cmd_submit_buf()
769 psp->cmd_buf_mem->resp.status); in psp_cmd_submit_buf()
774 if ((ucode && amdgpu_sriov_vf(psp->adev)) || !timeout) { in psp_cmd_submit_buf()
781 ucode->tmr_mc_addr_lo = psp->cmd_buf_mem->resp.fw_addr_lo; in psp_cmd_submit_buf()
782 ucode->tmr_mc_addr_hi = psp->cmd_buf_mem->resp.fw_addr_hi; in psp_cmd_submit_buf()
789 static struct psp_gfx_cmd_resp *acquire_psp_cmd_buf(struct psp_context *psp) in acquire_psp_cmd_buf() argument
791 struct psp_gfx_cmd_resp *cmd = psp->cmd; in acquire_psp_cmd_buf()
793 mutex_lock(&psp->mutex); in acquire_psp_cmd_buf()
800 static void release_psp_cmd_buf(struct psp_context *psp) in release_psp_cmd_buf() argument
802 mutex_unlock(&psp->mutex); in release_psp_cmd_buf()
805 static void psp_prep_tmr_cmd_buf(struct psp_context *psp, in psp_prep_tmr_cmd_buf() argument
809 struct amdgpu_device *adev = psp->adev; in psp_prep_tmr_cmd_buf()
818 if (amdgpu_sriov_vf(psp->adev)) in psp_prep_tmr_cmd_buf()
839 /* Issue LOAD TOC cmd to PSP to part toc and calculate tmr size needed */
840 static int psp_load_toc(struct psp_context *psp, in psp_load_toc() argument
844 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_load_toc()
846 /* Copy toc to psp firmware private buffer */ in psp_load_toc()
847 psp_copy_fw(psp, psp->toc.start_addr, psp->toc.size_bytes); in psp_load_toc()
849 psp_prep_load_toc_cmd_buf(cmd, psp->fw_pri_mc_addr, psp->toc.size_bytes); in psp_load_toc()
851 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_load_toc()
852 psp->fence_buf_mc_addr); in psp_load_toc()
854 *tmr_size = psp->cmd_buf_mem->resp.tmr_size; in psp_load_toc()
856 release_psp_cmd_buf(psp); in psp_load_toc()
862 static int psp_tmr_init(struct psp_context *psp) in psp_tmr_init() argument
876 tmr_size = PSP_TMR_SIZE(psp->adev); in psp_tmr_init()
878 /* For ASICs support RLC autoload, psp will parse the toc in psp_tmr_init()
881 if (!amdgpu_sriov_vf(psp->adev) && in psp_tmr_init()
882 psp->toc.start_addr && in psp_tmr_init()
883 psp->toc.size_bytes && in psp_tmr_init()
884 psp->fw_pri_buf) { in psp_tmr_init()
885 ret = psp_load_toc(psp, &tmr_size); in psp_tmr_init()
887 dev_err(psp->adev->dev, "Failed to load toc\n"); in psp_tmr_init()
892 if (!psp->tmr_bo && !psp->boot_time_tmr) { in psp_tmr_init()
893 pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL; in psp_tmr_init()
894 ret = amdgpu_bo_create_kernel(psp->adev, tmr_size, in psp_tmr_init()
897 &psp->tmr_bo, &psp->tmr_mc_addr, in psp_tmr_init()
900 if (amdgpu_virt_xgmi_migrate_enabled(psp->adev) && psp->tmr_bo) in psp_tmr_init()
901 psp->tmr_mc_addr = amdgpu_bo_fb_aper_addr(psp->tmr_bo); in psp_tmr_init()
906 static bool psp_skip_tmr(struct psp_context *psp) in psp_skip_tmr() argument
908 u32 ip_version = amdgpu_ip_version(psp->adev, MP0_HWIP, 0); in psp_skip_tmr()
910 if (amdgpu_sriov_vf(psp->adev)) in psp_skip_tmr()
913 return (!psp->boot_time_tmr || !psp->autoload_supported) ? false : true; in psp_skip_tmr()
916 static int psp_tmr_load(struct psp_context *psp) in psp_tmr_load() argument
921 if (psp_skip_tmr(psp)) in psp_tmr_load()
924 cmd = acquire_psp_cmd_buf(psp); in psp_tmr_load()
926 psp_prep_tmr_cmd_buf(psp, cmd, psp->tmr_mc_addr, psp->tmr_bo); in psp_tmr_load()
927 if (psp->tmr_bo) in psp_tmr_load()
928 dev_info(psp->adev->dev, "reserve 0x%lx from 0x%llx for PSP TMR\n", in psp_tmr_load()
929 amdgpu_bo_size(psp->tmr_bo), psp->tmr_mc_addr); in psp_tmr_load()
931 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_tmr_load()
932 psp->fence_buf_mc_addr); in psp_tmr_load()
934 release_psp_cmd_buf(psp); in psp_tmr_load()
939 static void psp_prep_tmr_unload_cmd_buf(struct psp_context *psp, in psp_prep_tmr_unload_cmd_buf() argument
942 if (amdgpu_sriov_vf(psp->adev)) in psp_prep_tmr_unload_cmd_buf()
948 static int psp_tmr_unload(struct psp_context *psp) in psp_tmr_unload() argument
953 if (psp_skip_tmr(psp)) in psp_tmr_unload()
956 cmd = acquire_psp_cmd_buf(psp); in psp_tmr_unload()
958 psp_prep_tmr_unload_cmd_buf(psp, cmd); in psp_tmr_unload()
959 dev_dbg(psp->adev->dev, "free PSP TMR buffer\n"); in psp_tmr_unload()
961 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_tmr_unload()
962 psp->fence_buf_mc_addr); in psp_tmr_unload()
964 release_psp_cmd_buf(psp); in psp_tmr_unload()
969 static int psp_tmr_terminate(struct psp_context *psp) in psp_tmr_terminate() argument
971 return psp_tmr_unload(psp); in psp_tmr_terminate()
974 int psp_get_fw_attestation_records_addr(struct psp_context *psp, in psp_get_fw_attestation_records_addr() argument
983 if (amdgpu_sriov_vf(psp->adev)) in psp_get_fw_attestation_records_addr()
986 cmd = acquire_psp_cmd_buf(psp); in psp_get_fw_attestation_records_addr()
990 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_get_fw_attestation_records_addr()
991 psp->fence_buf_mc_addr); in psp_get_fw_attestation_records_addr()
998 release_psp_cmd_buf(psp); in psp_get_fw_attestation_records_addr()
1003 static int psp_get_fw_reservation_info(struct psp_context *psp, in psp_get_fw_reservation_info() argument
1012 cmd = acquire_psp_cmd_buf(psp); in psp_get_fw_reservation_info()
1016 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_get_fw_reservation_info()
1017 psp->fence_buf_mc_addr); in psp_get_fw_reservation_info()
1019 release_psp_cmd_buf(psp); in psp_get_fw_reservation_info()
1025 release_psp_cmd_buf(psp); in psp_get_fw_reservation_info()
1035 release_psp_cmd_buf(psp); in psp_get_fw_reservation_info()
1040 int psp_update_fw_reservation(struct psp_context *psp) in psp_update_fw_reservation() argument
1045 struct amdgpu_device *adev = psp->adev; in psp_update_fw_reservation()
1049 if (amdgpu_sriov_vf(psp->adev)) in psp_update_fw_reservation()
1054 if (adev->psp.sos.fw_version < 0x3b0e0d) in psp_update_fw_reservation()
1059 if (adev->psp.sos.fw_version < 0x3a0e14) in psp_update_fw_reservation()
1067 ret = psp_get_fw_reservation_info(psp, GFX_CMD_ID_FB_FW_RESERV_ADDR, &reserv_addr, &reserv_size); in psp_update_fw_reservation()
1070 …ret = psp_get_fw_reservation_info(psp, GFX_CMD_ID_FB_FW_RESERV_EXT_ADDR, &reserv_addr_ext, &reserv… in psp_update_fw_reservation()
1105 struct psp_context *psp = &adev->psp; in psp_boot_config_get() local
1112 cmd = acquire_psp_cmd_buf(psp); in psp_boot_config_get()
1117 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_boot_config_get()
1123 release_psp_cmd_buf(psp); in psp_boot_config_get()
1131 struct psp_context *psp = &adev->psp; in psp_boot_config_set() local
1137 cmd = acquire_psp_cmd_buf(psp); in psp_boot_config_set()
1144 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_boot_config_set()
1146 release_psp_cmd_buf(psp); in psp_boot_config_set()
1154 struct psp_context *psp = &adev->psp; in psp_rl_load() local
1157 if (!is_psp_fw_valid(psp->rl)) in psp_rl_load()
1160 cmd = acquire_psp_cmd_buf(psp); in psp_rl_load()
1162 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_rl_load()
1163 memcpy(psp->fw_pri_buf, psp->rl.start_addr, psp->rl.size_bytes); in psp_rl_load()
1166 cmd->cmd.cmd_load_ip_fw.fw_phy_addr_lo = lower_32_bits(psp->fw_pri_mc_addr); in psp_rl_load()
1167 cmd->cmd.cmd_load_ip_fw.fw_phy_addr_hi = upper_32_bits(psp->fw_pri_mc_addr); in psp_rl_load()
1168 cmd->cmd.cmd_load_ip_fw.fw_size = psp->rl.size_bytes; in psp_rl_load()
1171 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_rl_load()
1173 release_psp_cmd_buf(psp); in psp_rl_load()
1178 int psp_memory_partition(struct psp_context *psp, int mode) in psp_memory_partition() argument
1183 if (amdgpu_sriov_vf(psp->adev)) in psp_memory_partition()
1186 cmd = acquire_psp_cmd_buf(psp); in psp_memory_partition()
1191 dev_info(psp->adev->dev, in psp_memory_partition()
1192 "Requesting %d memory partition change through PSP", mode); in psp_memory_partition()
1193 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_memory_partition()
1195 dev_err(psp->adev->dev, in psp_memory_partition()
1196 "PSP request failed to change to NPS%d mode\n", mode); in psp_memory_partition()
1198 release_psp_cmd_buf(psp); in psp_memory_partition()
1203 int psp_spatial_partition(struct psp_context *psp, int mode) in psp_spatial_partition() argument
1208 if (amdgpu_sriov_vf(psp->adev)) in psp_spatial_partition()
1211 cmd = acquire_psp_cmd_buf(psp); in psp_spatial_partition()
1216 dev_info(psp->adev->dev, "Requesting %d partitions through PSP", mode); in psp_spatial_partition()
1217 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_spatial_partition()
1219 release_psp_cmd_buf(psp); in psp_spatial_partition()
1224 static int psp_asd_initialize(struct psp_context *psp) in psp_asd_initialize() argument
1228 /* If PSP version doesn't match ASD version, asd loading will be failed. in psp_asd_initialize()
1232 if (amdgpu_sriov_vf(psp->adev) || !psp->asd_context.bin_desc.size_bytes) in psp_asd_initialize()
1236 if (!amdgpu_device_has_display_hardware(psp->adev) && in psp_asd_initialize()
1237 amdgpu_ip_version(psp->adev, MP0_HWIP, 0) >= IP_VERSION(13, 0, 10)) in psp_asd_initialize()
1240 psp->asd_context.mem_context.shared_mc_addr = 0; in psp_asd_initialize()
1241 psp->asd_context.mem_context.shared_mem_size = PSP_ASD_SHARED_MEM_SIZE; in psp_asd_initialize()
1242 psp->asd_context.ta_load_type = GFX_CMD_ID_LOAD_ASD; in psp_asd_initialize()
1244 ret = psp_ta_load(psp, &psp->asd_context); in psp_asd_initialize()
1246 psp->asd_context.initialized = true; in psp_asd_initialize()
1258 int psp_ta_unload(struct psp_context *psp, struct ta_context *context) in psp_ta_unload() argument
1261 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_ta_unload()
1265 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_ta_unload()
1269 release_psp_cmd_buf(psp); in psp_ta_unload()
1274 static int psp_asd_terminate(struct psp_context *psp) in psp_asd_terminate() argument
1278 if (amdgpu_sriov_vf(psp->adev)) in psp_asd_terminate()
1281 if (!psp->asd_context.initialized) in psp_asd_terminate()
1284 ret = psp_ta_unload(psp, &psp->asd_context); in psp_asd_terminate()
1286 psp->asd_context.initialized = false; in psp_asd_terminate()
1299 int psp_reg_program(struct psp_context *psp, enum psp_reg_prog_id reg, in psp_reg_program() argument
1308 cmd = acquire_psp_cmd_buf(psp); in psp_reg_program()
1311 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_reg_program()
1313 dev_err(psp->adev->dev, "PSP failed to program reg id %d\n", reg); in psp_reg_program()
1315 release_psp_cmd_buf(psp); in psp_reg_program()
1336 int psp_ta_init_shared_buf(struct psp_context *psp, in psp_ta_init_shared_buf() argument
1343 return amdgpu_bo_create_kernel(psp->adev, mem_ctx->shared_mem_size, in psp_ta_init_shared_buf()
1360 int psp_ta_invoke(struct psp_context *psp, in psp_ta_invoke() argument
1365 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_ta_invoke()
1369 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_ta_invoke()
1370 psp->fence_buf_mc_addr); in psp_ta_invoke()
1374 release_psp_cmd_buf(psp); in psp_ta_invoke()
1379 int psp_ta_load(struct psp_context *psp, struct ta_context *context) in psp_ta_load() argument
1384 cmd = acquire_psp_cmd_buf(psp); in psp_ta_load()
1386 psp_copy_fw(psp, context->bin_desc.start_addr, in psp_ta_load()
1389 if (amdgpu_virt_xgmi_migrate_enabled(psp->adev) && in psp_ta_load()
1394 psp_prep_ta_load_cmd_buf(cmd, psp->fw_pri_mc_addr, context); in psp_ta_load()
1396 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_ta_load()
1397 psp->fence_buf_mc_addr); in psp_ta_load()
1404 release_psp_cmd_buf(psp); in psp_ta_load()
1409 int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_xgmi_invoke() argument
1411 return psp_ta_invoke(psp, ta_cmd_id, &psp->xgmi_context.context); in psp_xgmi_invoke()
1414 int psp_xgmi_terminate(struct psp_context *psp) in psp_xgmi_terminate() argument
1417 struct amdgpu_device *adev = psp->adev; in psp_xgmi_terminate()
1425 if (!psp->xgmi_context.context.initialized) in psp_xgmi_terminate()
1428 ret = psp_ta_unload(psp, &psp->xgmi_context.context); in psp_xgmi_terminate()
1430 psp->xgmi_context.context.initialized = false; in psp_xgmi_terminate()
1435 int psp_xgmi_initialize(struct psp_context *psp, bool set_extended_data, bool load_ta) in psp_xgmi_initialize() argument
1440 if (!psp->ta_fw || in psp_xgmi_initialize()
1441 !psp->xgmi_context.context.bin_desc.size_bytes || in psp_xgmi_initialize()
1442 !psp->xgmi_context.context.bin_desc.start_addr) in psp_xgmi_initialize()
1448 psp->xgmi_context.context.mem_context.shared_mem_size = PSP_XGMI_SHARED_MEM_SIZE; in psp_xgmi_initialize()
1449 psp->xgmi_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_xgmi_initialize()
1451 if (!psp->xgmi_context.context.mem_context.shared_buf) { in psp_xgmi_initialize()
1452 ret = psp_ta_init_shared_buf(psp, &psp->xgmi_context.context.mem_context); in psp_xgmi_initialize()
1458 ret = psp_ta_load(psp, &psp->xgmi_context.context); in psp_xgmi_initialize()
1460 psp->xgmi_context.context.initialized = true; in psp_xgmi_initialize()
1466 xgmi_cmd = (struct ta_xgmi_shared_memory *)(psp->xgmi_context.context.mem_context.shared_buf); in psp_xgmi_initialize()
1471 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_initialize()
1473 psp->xgmi_context.xgmi_ta_caps = xgmi_cmd->caps_flag; in psp_xgmi_initialize()
1478 int psp_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id) in psp_xgmi_get_hive_id() argument
1483 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_get_hive_id()
1489 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_get_hive_id()
1498 int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id) in psp_xgmi_get_node_id() argument
1503 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_get_node_id()
1509 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_get_node_id()
1518 static bool psp_xgmi_peer_link_info_supported(struct psp_context *psp) in psp_xgmi_peer_link_info_supported() argument
1520 return (amdgpu_ip_version(psp->adev, MP0_HWIP, 0) == in psp_xgmi_peer_link_info_supported()
1522 psp->xgmi_context.context.bin_desc.fw_version >= 0x2000000b) || in psp_xgmi_peer_link_info_supported()
1523 amdgpu_ip_version(psp->adev, MP0_HWIP, 0) >= in psp_xgmi_peer_link_info_supported()
1534 static void psp_xgmi_reflect_topology_info(struct psp_context *psp, in psp_xgmi_reflect_topology_info() argument
1539 uint64_t src_node_id = psp->adev->gmc.xgmi.node_id; in psp_xgmi_reflect_topology_info()
1545 hive = amdgpu_get_xgmi_hive(psp->adev); in psp_xgmi_reflect_topology_info()
1556 mirror_top_info = &mirror_adev->psp.xgmi_context.top_info; in psp_xgmi_reflect_topology_info()
1586 int psp_xgmi_get_topology_info(struct psp_context *psp, in psp_xgmi_get_topology_info() argument
1600 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_get_topology_info()
1617 ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_TOPOLOGY_INFO); in psp_xgmi_get_topology_info()
1641 if (psp_xgmi_peer_link_info_supported(psp)) { in psp_xgmi_get_topology_info()
1645 (psp->xgmi_context.supports_extended_data && in psp_xgmi_get_topology_info()
1647 amdgpu_ip_version(psp->adev, MP0_HWIP, 0) == in psp_xgmi_get_topology_info()
1649 amdgpu_ip_version(psp->adev, MP0_HWIP, 0) == in psp_xgmi_get_topology_info()
1651 amdgpu_sriov_vf(psp->adev); in psp_xgmi_get_topology_info()
1652 bool ta_port_num_support = psp->xgmi_context.xgmi_ta_caps & EXTEND_PEER_LINK_INFO_CMD_FLAG || in psp_xgmi_get_topology_info()
1653 amdgpu_sriov_xgmi_ta_ext_peer_link_en(psp->adev); in psp_xgmi_get_topology_info()
1678 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_get_topology_info()
1700 psp_xgmi_reflect_topology_info(psp, topology->nodes[i]); in psp_xgmi_get_topology_info()
1707 int psp_xgmi_set_topology_info(struct psp_context *psp, in psp_xgmi_set_topology_info() argument
1718 xgmi_cmd = (struct ta_xgmi_shared_memory *)psp->xgmi_context.context.mem_context.shared_buf; in psp_xgmi_set_topology_info()
1733 return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO); in psp_xgmi_set_topology_info()
1737 static void psp_ras_ta_check_status(struct psp_context *psp) in psp_ras_ta_check_status() argument
1740 (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_ta_check_status()
1744 dev_warn(psp->adev->dev, in psp_ras_ta_check_status()
1748 dev_warn(psp->adev->dev, in psp_ras_ta_check_status()
1755 dev_warn(psp->adev->dev, in psp_ras_ta_check_status()
1759 dev_warn(psp->adev->dev, in psp_ras_ta_check_status()
1765 static int psp_ras_send_cmd(struct psp_context *psp, in psp_ras_send_cmd() argument
1775 mutex_lock(&psp->ras_context.mutex); in psp_ras_send_cmd()
1776 ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_send_cmd()
1794 dev_err(psp->adev->dev, "Invalid ras cmd id: %u\n", cmd); in psp_ras_send_cmd()
1800 ret = psp_ras_invoke(psp, ras_cmd->cmd_id); in psp_ras_send_cmd()
1808 if (ret || ras_cmd->ras_status || psp->cmd_buf_mem->resp.status) in psp_ras_send_cmd()
1820 mutex_unlock(&psp->ras_context.mutex); in psp_ras_send_cmd()
1825 int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_ras_invoke() argument
1830 ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_invoke()
1835 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_invoke()
1838 ret = psp_ta_invoke(psp, ta_cmd_id, &psp->ras_context.context); in psp_ras_invoke()
1844 dev_warn(psp->adev->dev, "RAS: Unsupported Interface\n"); in psp_ras_invoke()
1850 dev_warn(psp->adev->dev, "ECC switch disabled\n"); in psp_ras_invoke()
1854 dev_warn(psp->adev->dev, in psp_ras_invoke()
1857 psp_ras_ta_check_status(psp); in psp_ras_invoke()
1863 int psp_ras_enable_features(struct psp_context *psp, in psp_ras_enable_features() argument
1869 if (!psp->ras_context.context.initialized || !info) in psp_ras_enable_features()
1874 ret = psp_ras_send_cmd(psp, cmd_id, info, NULL); in psp_ras_enable_features()
1881 int psp_ras_terminate(struct psp_context *psp) in psp_ras_terminate() argument
1888 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_terminate()
1891 if (!psp->ras_context.context.initialized) in psp_ras_terminate()
1894 ret = psp_ta_unload(psp, &psp->ras_context.context); in psp_ras_terminate()
1896 psp->ras_context.context.initialized = false; in psp_ras_terminate()
1898 mutex_destroy(&psp->ras_context.mutex); in psp_ras_terminate()
1903 int psp_ras_initialize(struct psp_context *psp) in psp_ras_initialize() argument
1907 struct amdgpu_device *adev = psp->adev; in psp_ras_initialize()
1916 if (!adev->psp.ras_context.context.bin_desc.size_bytes || in psp_ras_initialize()
1917 !adev->psp.ras_context.context.bin_desc.start_addr) { in psp_ras_initialize()
1928 dev_warn(adev->dev, "PSP get boot config failed\n"); in psp_ras_initialize()
1947 dev_warn(adev->dev, "PSP set boot config failed\n"); in psp_ras_initialize()
1967 dev_warn(adev->dev, "PSP set boot config failed\n"); in psp_ras_initialize()
1975 psp->ras_context.context.mem_context.shared_mem_size = PSP_RAS_SHARED_MEM_SIZE; in psp_ras_initialize()
1976 psp->ras_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_ras_initialize()
1978 if (!psp->ras_context.context.mem_context.shared_buf) { in psp_ras_initialize()
1979 ret = psp_ta_init_shared_buf(psp, &psp->ras_context.context.mem_context); in psp_ras_initialize()
1984 ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf; in psp_ras_initialize()
2000 ret = psp_ta_load(psp, &psp->ras_context.context); in psp_ras_initialize()
2003 psp->ras_context.context.initialized = true; in psp_ras_initialize()
2004 mutex_init(&psp->ras_context.mutex); in psp_ras_initialize()
2010 psp->ras_context.context.initialized = false; in psp_ras_initialize()
2016 int psp_ras_trigger_error(struct psp_context *psp, in psp_ras_trigger_error() argument
2019 struct amdgpu_device *adev = psp->adev; in psp_ras_trigger_error()
2024 if (!psp->ras_context.context.initialized || !info) in psp_ras_trigger_error()
2048 ret = psp_ras_send_cmd(psp, in psp_ras_trigger_error()
2067 int psp_ras_query_address(struct psp_context *psp, in psp_ras_query_address() argument
2073 if (!psp->ras_context.context.initialized || in psp_ras_query_address()
2077 ret = psp_ras_send_cmd(psp, in psp_ras_query_address()
2085 static int psp_hdcp_initialize(struct psp_context *psp) in psp_hdcp_initialize() argument
2092 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_initialize()
2096 if (!amdgpu_device_has_display_hardware(psp->adev)) in psp_hdcp_initialize()
2099 if (!psp->hdcp_context.context.bin_desc.size_bytes || in psp_hdcp_initialize()
2100 !psp->hdcp_context.context.bin_desc.start_addr) { in psp_hdcp_initialize()
2101 dev_info(psp->adev->dev, "HDCP: optional hdcp ta ucode is not available\n"); in psp_hdcp_initialize()
2105 psp->hdcp_context.context.mem_context.shared_mem_size = PSP_HDCP_SHARED_MEM_SIZE; in psp_hdcp_initialize()
2106 psp->hdcp_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_hdcp_initialize()
2108 if (!psp->hdcp_context.context.mem_context.shared_buf) { in psp_hdcp_initialize()
2109 ret = psp_ta_init_shared_buf(psp, &psp->hdcp_context.context.mem_context); in psp_hdcp_initialize()
2114 ret = psp_ta_load(psp, &psp->hdcp_context.context); in psp_hdcp_initialize()
2116 psp->hdcp_context.context.initialized = true; in psp_hdcp_initialize()
2117 mutex_init(&psp->hdcp_context.mutex); in psp_hdcp_initialize()
2123 int psp_hdcp_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_hdcp_invoke() argument
2128 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_invoke()
2131 if (!psp->hdcp_context.context.initialized) in psp_hdcp_invoke()
2134 return psp_ta_invoke(psp, ta_cmd_id, &psp->hdcp_context.context); in psp_hdcp_invoke()
2137 static int psp_hdcp_terminate(struct psp_context *psp) in psp_hdcp_terminate() argument
2144 if (amdgpu_sriov_vf(psp->adev)) in psp_hdcp_terminate()
2147 if (!psp->hdcp_context.context.initialized) in psp_hdcp_terminate()
2150 ret = psp_ta_unload(psp, &psp->hdcp_context.context); in psp_hdcp_terminate()
2152 psp->hdcp_context.context.initialized = false; in psp_hdcp_terminate()
2159 static int psp_dtm_initialize(struct psp_context *psp) in psp_dtm_initialize() argument
2166 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_initialize()
2170 if (!amdgpu_device_has_display_hardware(psp->adev)) in psp_dtm_initialize()
2173 if (!psp->dtm_context.context.bin_desc.size_bytes || in psp_dtm_initialize()
2174 !psp->dtm_context.context.bin_desc.start_addr) { in psp_dtm_initialize()
2175 dev_info(psp->adev->dev, "DTM: optional dtm ta ucode is not available\n"); in psp_dtm_initialize()
2179 psp->dtm_context.context.mem_context.shared_mem_size = PSP_DTM_SHARED_MEM_SIZE; in psp_dtm_initialize()
2180 psp->dtm_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_dtm_initialize()
2182 if (!psp->dtm_context.context.mem_context.shared_buf) { in psp_dtm_initialize()
2183 ret = psp_ta_init_shared_buf(psp, &psp->dtm_context.context.mem_context); in psp_dtm_initialize()
2188 ret = psp_ta_load(psp, &psp->dtm_context.context); in psp_dtm_initialize()
2190 psp->dtm_context.context.initialized = true; in psp_dtm_initialize()
2191 mutex_init(&psp->dtm_context.mutex); in psp_dtm_initialize()
2197 int psp_dtm_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_dtm_invoke() argument
2202 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_invoke()
2205 if (!psp->dtm_context.context.initialized) in psp_dtm_invoke()
2208 return psp_ta_invoke(psp, ta_cmd_id, &psp->dtm_context.context); in psp_dtm_invoke()
2211 static int psp_dtm_terminate(struct psp_context *psp) in psp_dtm_terminate() argument
2218 if (amdgpu_sriov_vf(psp->adev)) in psp_dtm_terminate()
2221 if (!psp->dtm_context.context.initialized) in psp_dtm_terminate()
2224 ret = psp_ta_unload(psp, &psp->dtm_context.context); in psp_dtm_terminate()
2226 psp->dtm_context.context.initialized = false; in psp_dtm_terminate()
2233 static int psp_rap_initialize(struct psp_context *psp) in psp_rap_initialize() argument
2241 if (amdgpu_sriov_vf(psp->adev)) in psp_rap_initialize()
2244 if (!psp->rap_context.context.bin_desc.size_bytes || in psp_rap_initialize()
2245 !psp->rap_context.context.bin_desc.start_addr) { in psp_rap_initialize()
2246 dev_info(psp->adev->dev, "RAP: optional rap ta ucode is not available\n"); in psp_rap_initialize()
2250 psp->rap_context.context.mem_context.shared_mem_size = PSP_RAP_SHARED_MEM_SIZE; in psp_rap_initialize()
2251 psp->rap_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_rap_initialize()
2253 if (!psp->rap_context.context.mem_context.shared_buf) { in psp_rap_initialize()
2254 ret = psp_ta_init_shared_buf(psp, &psp->rap_context.context.mem_context); in psp_rap_initialize()
2259 ret = psp_ta_load(psp, &psp->rap_context.context); in psp_rap_initialize()
2261 psp->rap_context.context.initialized = true; in psp_rap_initialize()
2262 mutex_init(&psp->rap_context.mutex); in psp_rap_initialize()
2266 ret = psp_rap_invoke(psp, TA_CMD_RAP__INITIALIZE, &status); in psp_rap_initialize()
2268 psp_rap_terminate(psp); in psp_rap_initialize()
2270 psp_ta_free_shared_buf(&psp->rap_context.context.mem_context); in psp_rap_initialize()
2272 dev_warn(psp->adev->dev, "RAP TA initialize fail (%d) status %d.\n", in psp_rap_initialize()
2281 static int psp_rap_terminate(struct psp_context *psp) in psp_rap_terminate() argument
2285 if (!psp->rap_context.context.initialized) in psp_rap_terminate()
2288 ret = psp_ta_unload(psp, &psp->rap_context.context); in psp_rap_terminate()
2290 psp->rap_context.context.initialized = false; in psp_rap_terminate()
2295 int psp_rap_invoke(struct psp_context *psp, uint32_t ta_cmd_id, enum ta_rap_status *status) in psp_rap_invoke() argument
2300 if (!psp->rap_context.context.initialized) in psp_rap_invoke()
2307 mutex_lock(&psp->rap_context.mutex); in psp_rap_invoke()
2310 psp->rap_context.context.mem_context.shared_buf; in psp_rap_invoke()
2316 ret = psp_ta_invoke(psp, rap_cmd->cmd_id, &psp->rap_context.context); in psp_rap_invoke()
2324 mutex_unlock(&psp->rap_context.mutex); in psp_rap_invoke()
2331 static int psp_securedisplay_initialize(struct psp_context *psp) in psp_securedisplay_initialize() argument
2339 if (amdgpu_sriov_vf(psp->adev)) in psp_securedisplay_initialize()
2343 if (!amdgpu_device_has_display_hardware(psp->adev)) in psp_securedisplay_initialize()
2346 if (!psp->securedisplay_context.context.bin_desc.size_bytes || in psp_securedisplay_initialize()
2347 !psp->securedisplay_context.context.bin_desc.start_addr) { in psp_securedisplay_initialize()
2348 dev_info(psp->adev->dev, in psp_securedisplay_initialize()
2353 psp->securedisplay_context.context.mem_context.shared_mem_size = in psp_securedisplay_initialize()
2355 psp->securedisplay_context.context.ta_load_type = GFX_CMD_ID_LOAD_TA; in psp_securedisplay_initialize()
2357 if (!psp->securedisplay_context.context.initialized) { in psp_securedisplay_initialize()
2358 ret = psp_ta_init_shared_buf(psp, in psp_securedisplay_initialize()
2359 &psp->securedisplay_context.context.mem_context); in psp_securedisplay_initialize()
2364 ret = psp_ta_load(psp, &psp->securedisplay_context.context); in psp_securedisplay_initialize()
2365 if (!ret && !psp->securedisplay_context.context.resp_status) { in psp_securedisplay_initialize()
2366 psp->securedisplay_context.context.initialized = true; in psp_securedisplay_initialize()
2367 mutex_init(&psp->securedisplay_context.mutex); in psp_securedisplay_initialize()
2370 psp->securedisplay_context.context.bin_desc.size_bytes = 0; in psp_securedisplay_initialize()
2374 mutex_lock(&psp->securedisplay_context.mutex); in psp_securedisplay_initialize()
2376 psp_prep_securedisplay_cmd_buf(psp, &securedisplay_cmd, in psp_securedisplay_initialize()
2379 ret = psp_securedisplay_invoke(psp, TA_SECUREDISPLAY_COMMAND__QUERY_TA); in psp_securedisplay_initialize()
2381 mutex_unlock(&psp->securedisplay_context.mutex); in psp_securedisplay_initialize()
2384 psp_securedisplay_terminate(psp); in psp_securedisplay_initialize()
2386 psp_ta_free_shared_buf(&psp->securedisplay_context.context.mem_context); in psp_securedisplay_initialize()
2387 dev_err(psp->adev->dev, "SECUREDISPLAY TA initialize fail.\n"); in psp_securedisplay_initialize()
2392 psp_securedisplay_parse_resp_status(psp, securedisplay_cmd->status); in psp_securedisplay_initialize()
2393 dev_err(psp->adev->dev, "SECUREDISPLAY: query securedisplay TA failed. ret 0x%x\n", in psp_securedisplay_initialize()
2396 psp->securedisplay_context.context.bin_desc.size_bytes = 0; in psp_securedisplay_initialize()
2402 static int psp_securedisplay_terminate(struct psp_context *psp) in psp_securedisplay_terminate() argument
2409 if (amdgpu_sriov_vf(psp->adev)) in psp_securedisplay_terminate()
2412 if (!psp->securedisplay_context.context.initialized) in psp_securedisplay_terminate()
2415 ret = psp_ta_unload(psp, &psp->securedisplay_context.context); in psp_securedisplay_terminate()
2417 psp->securedisplay_context.context.initialized = false; in psp_securedisplay_terminate()
2422 int psp_securedisplay_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_securedisplay_invoke() argument
2426 if (!psp->securedisplay_context.context.initialized) in psp_securedisplay_invoke()
2434 ret = psp_ta_invoke(psp, ta_cmd_id, &psp->securedisplay_context.context); in psp_securedisplay_invoke()
2442 struct psp_context *psp = &adev->psp; in amdgpu_psp_wait_for_bootloader() local
2445 if (!amdgpu_sriov_vf(adev) && psp->funcs && psp->funcs->wait_for_bootloader != NULL) in amdgpu_psp_wait_for_bootloader()
2446 ret = psp->funcs->wait_for_bootloader(psp); in amdgpu_psp_wait_for_bootloader()
2451 bool amdgpu_psp_get_ras_capability(struct psp_context *psp) in amdgpu_psp_get_ras_capability() argument
2453 if (psp->funcs && in amdgpu_psp_get_ras_capability()
2454 psp->funcs->get_ras_capability) { in amdgpu_psp_get_ras_capability()
2455 return psp->funcs->get_ras_capability(psp); in amdgpu_psp_get_ras_capability()
2463 struct psp_context *psp = &adev->psp; in amdgpu_psp_tos_reload_needed() local
2468 if (psp->funcs && psp->funcs->is_reload_needed) in amdgpu_psp_tos_reload_needed()
2469 return psp->funcs->is_reload_needed(psp); in amdgpu_psp_tos_reload_needed()
2476 struct psp_context *psp = &adev->psp; in psp_update_gpu_addresses() local
2478 if (psp->cmd_buf_bo && psp->cmd_buf_mem) { in psp_update_gpu_addresses()
2479 psp->fw_pri_mc_addr = amdgpu_bo_fb_aper_addr(psp->fw_pri_bo); in psp_update_gpu_addresses()
2480 psp->fence_buf_mc_addr = amdgpu_bo_fb_aper_addr(psp->fence_buf_bo); in psp_update_gpu_addresses()
2481 psp->cmd_buf_mc_addr = amdgpu_bo_fb_aper_addr(psp->cmd_buf_bo); in psp_update_gpu_addresses()
2483 if (adev->firmware.rbuf && psp->km_ring.ring_mem) in psp_update_gpu_addresses()
2484 psp->km_ring.ring_mem_mc_addr = amdgpu_bo_fb_aper_addr(adev->firmware.rbuf); in psp_update_gpu_addresses()
2487 static int psp_hw_start(struct psp_context *psp) in psp_hw_start() argument
2489 struct amdgpu_device *adev = psp->adev; in psp_hw_start()
2496 if ((is_psp_fw_valid(psp->kdb)) && in psp_hw_start()
2497 (psp->funcs->bootloader_load_kdb != NULL)) { in psp_hw_start()
2498 ret = psp_bootloader_load_kdb(psp); in psp_hw_start()
2500 dev_err(adev->dev, "PSP load kdb failed!\n"); in psp_hw_start()
2505 if ((is_psp_fw_valid(psp->spl)) && in psp_hw_start()
2506 (psp->funcs->bootloader_load_spl != NULL)) { in psp_hw_start()
2507 ret = psp_bootloader_load_spl(psp); in psp_hw_start()
2509 dev_err(adev->dev, "PSP load spl failed!\n"); in psp_hw_start()
2514 if ((is_psp_fw_valid(psp->sys)) && in psp_hw_start()
2515 (psp->funcs->bootloader_load_sysdrv != NULL)) { in psp_hw_start()
2516 ret = psp_bootloader_load_sysdrv(psp); in psp_hw_start()
2518 dev_err(adev->dev, "PSP load sys drv failed!\n"); in psp_hw_start()
2523 if ((is_psp_fw_valid(psp->soc_drv)) && in psp_hw_start()
2524 (psp->funcs->bootloader_load_soc_drv != NULL)) { in psp_hw_start()
2525 ret = psp_bootloader_load_soc_drv(psp); in psp_hw_start()
2527 dev_err(adev->dev, "PSP load soc drv failed!\n"); in psp_hw_start()
2532 if ((is_psp_fw_valid(psp->intf_drv)) && in psp_hw_start()
2533 (psp->funcs->bootloader_load_intf_drv != NULL)) { in psp_hw_start()
2534 ret = psp_bootloader_load_intf_drv(psp); in psp_hw_start()
2536 dev_err(adev->dev, "PSP load intf drv failed!\n"); in psp_hw_start()
2541 if ((is_psp_fw_valid(psp->dbg_drv)) && in psp_hw_start()
2542 (psp->funcs->bootloader_load_dbg_drv != NULL)) { in psp_hw_start()
2543 ret = psp_bootloader_load_dbg_drv(psp); in psp_hw_start()
2545 dev_err(adev->dev, "PSP load dbg drv failed!\n"); in psp_hw_start()
2550 if ((is_psp_fw_valid(psp->ras_drv)) && in psp_hw_start()
2551 (psp->funcs->bootloader_load_ras_drv != NULL)) { in psp_hw_start()
2552 ret = psp_bootloader_load_ras_drv(psp); in psp_hw_start()
2554 dev_err(adev->dev, "PSP load ras_drv failed!\n"); in psp_hw_start()
2559 if ((is_psp_fw_valid(psp->ipkeymgr_drv)) && in psp_hw_start()
2560 (psp->funcs->bootloader_load_ipkeymgr_drv != NULL)) { in psp_hw_start()
2561 ret = psp_bootloader_load_ipkeymgr_drv(psp); in psp_hw_start()
2563 dev_err(adev->dev, "PSP load ipkeymgr_drv failed!\n"); in psp_hw_start()
2568 if ((is_psp_fw_valid(psp->spdm_drv)) && in psp_hw_start()
2569 (psp->funcs->bootloader_load_spdm_drv != NULL)) { in psp_hw_start()
2570 ret = psp_bootloader_load_spdm_drv(psp); in psp_hw_start()
2572 dev_err(adev->dev, "PSP load spdm_drv failed!\n"); in psp_hw_start()
2577 if ((is_psp_fw_valid(psp->sos)) && in psp_hw_start()
2578 (psp->funcs->bootloader_load_sos != NULL)) { in psp_hw_start()
2579 ret = psp_bootloader_load_sos(psp); in psp_hw_start()
2581 dev_err(adev->dev, "PSP load sos failed!\n"); in psp_hw_start()
2587 ret = psp_ring_create(psp, PSP_RING_TYPE__KM); in psp_hw_start()
2589 dev_err(adev->dev, "PSP create ring failed!\n"); in psp_hw_start()
2594 ret = psp_update_fw_reservation(psp); in psp_hw_start()
2604 if (!psp->boot_time_tmr || psp->autoload_supported) { in psp_hw_start()
2605 ret = psp_tmr_init(psp); in psp_hw_start()
2607 dev_err(adev->dev, "PSP tmr init failed!\n"); in psp_hw_start()
2616 * loaded and before other non-psp firmware loaded. in psp_hw_start()
2618 if (psp->pmfw_centralized_cstate_management) { in psp_hw_start()
2619 ret = psp_load_smu_fw(psp); in psp_hw_start()
2624 ret = psp_tmr_load(psp); in psp_hw_start()
2626 dev_err(adev->dev, "PSP load tmr failed!\n"); in psp_hw_start()
2859 static void psp_print_fw_hdr(struct psp_context *psp, in psp_print_fw_hdr() argument
2862 struct amdgpu_device *adev = psp->adev; in psp_print_fw_hdr()
2909 static int psp_prep_load_ip_fw_cmd_buf(struct psp_context *psp, in psp_prep_load_ip_fw_cmd_buf() argument
2921 ret = psp_get_fw_type(psp, ucode, &cmd->cmd.cmd_load_ip_fw.fw_type); in psp_prep_load_ip_fw_cmd_buf()
2923 dev_err(psp->adev->dev, "Unknown firmware type %d\n", ucode->ucode_id); in psp_prep_load_ip_fw_cmd_buf()
2927 int psp_execute_ip_fw_load(struct psp_context *psp, in psp_execute_ip_fw_load() argument
2931 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_execute_ip_fw_load()
2933 ret = psp_prep_load_ip_fw_cmd_buf(psp, ucode, cmd); in psp_execute_ip_fw_load()
2935 ret = psp_cmd_submit_buf(psp, ucode, cmd, in psp_execute_ip_fw_load()
2936 psp->fence_buf_mc_addr); in psp_execute_ip_fw_load()
2939 release_psp_cmd_buf(psp); in psp_execute_ip_fw_load()
2944 static int psp_load_p2s_table(struct psp_context *psp) in psp_load_p2s_table() argument
2947 struct amdgpu_device *adev = psp->adev; in psp_load_p2s_table()
2959 if (psp->sos.fw_version < supp_vers) in psp_load_p2s_table()
2963 if (!ucode->fw || amdgpu_sriov_vf(psp->adev)) in psp_load_p2s_table()
2966 ret = psp_execute_ip_fw_load(psp, ucode); in psp_load_p2s_table()
2971 static int psp_load_smu_fw(struct psp_context *psp) in psp_load_smu_fw() argument
2974 struct amdgpu_device *adev = psp->adev; in psp_load_smu_fw()
2977 struct amdgpu_ras *ras = psp->ras_context.ras; in psp_load_smu_fw()
2987 if (!ucode->fw || amdgpu_sriov_vf(psp->adev)) in psp_load_smu_fw()
2998 ret = psp_execute_ip_fw_load(psp, ucode); in psp_load_smu_fw()
3001 dev_err(adev->dev, "PSP load smu failed!\n"); in psp_load_smu_fw()
3006 static bool fw_load_skip_check(struct psp_context *psp, in fw_load_skip_check() argument
3016 (psp_smu_reload_quirk(psp) || in fw_load_skip_check()
3017 psp->autoload_supported || in fw_load_skip_check()
3018 psp->pmfw_centralized_cstate_management)) in fw_load_skip_check()
3021 if (amdgpu_sriov_vf(psp->adev) && in fw_load_skip_check()
3022 amdgpu_virt_fw_load_skip_check(psp->adev, ucode->ucode_id)) in fw_load_skip_check()
3025 if (psp->autoload_supported && in fw_load_skip_check()
3034 int psp_load_fw_list(struct psp_context *psp, in psp_load_fw_list() argument
3042 psp_print_fw_hdr(psp, ucode); in psp_load_fw_list()
3043 ret = psp_execute_ip_fw_load(psp, ucode); in psp_load_fw_list()
3050 static int psp_load_non_psp_fw(struct psp_context *psp) in psp_load_non_psp_fw() argument
3054 struct amdgpu_device *adev = psp->adev; in psp_load_non_psp_fw()
3056 if (psp->autoload_supported && in psp_load_non_psp_fw()
3057 !psp->pmfw_centralized_cstate_management) { in psp_load_non_psp_fw()
3058 ret = psp_load_smu_fw(psp); in psp_load_non_psp_fw()
3064 psp_load_p2s_table(psp); in psp_load_non_psp_fw()
3070 !fw_load_skip_check(psp, ucode)) { in psp_load_non_psp_fw()
3071 ret = psp_load_smu_fw(psp); in psp_load_non_psp_fw()
3077 if (fw_load_skip_check(psp, ucode)) in psp_load_non_psp_fw()
3080 if (psp->autoload_supported && in psp_load_non_psp_fw()
3094 /* PSP only receive one SDMA fw for sienna_cichlid, in psp_load_non_psp_fw()
3099 psp_print_fw_hdr(psp, ucode); in psp_load_non_psp_fw()
3101 ret = psp_execute_ip_fw_load(psp, ucode); in psp_load_non_psp_fw()
3105 /* Start rlc autoload after psp received all the gfx firmware */ in psp_load_non_psp_fw()
3106 if (psp->autoload_supported && ucode->ucode_id == (amdgpu_sriov_vf(adev) ? in psp_load_non_psp_fw()
3108 ret = psp_rlc_autoload_start(psp); in psp_load_non_psp_fw()
3122 struct psp_context *psp = &adev->psp; in psp_load_fw() local
3126 psp_ring_stop(psp, PSP_RING_TYPE__KM); in psp_load_fw()
3128 memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE); in psp_load_fw()
3130 ret = psp_ring_init(psp, PSP_RING_TYPE__KM); in psp_load_fw()
3132 dev_err(adev->dev, "PSP ring init failed!\n"); in psp_load_fw()
3137 ret = psp_hw_start(psp); in psp_load_fw()
3141 ret = psp_load_non_psp_fw(psp); in psp_load_fw()
3145 ret = psp_asd_initialize(psp); in psp_load_fw()
3147 dev_err(adev->dev, "PSP load asd failed!\n"); in psp_load_fw()
3153 dev_err(adev->dev, "PSP load RL failed!\n"); in psp_load_fw()
3159 ret = psp_xgmi_initialize(psp, false, true); in psp_load_fw()
3164 dev_err(psp->adev->dev, in psp_load_fw()
3169 if (psp->ta_fw) { in psp_load_fw()
3170 ret = psp_ras_initialize(psp); in psp_load_fw()
3172 dev_err(psp->adev->dev, in psp_load_fw()
3175 ret = psp_hdcp_initialize(psp); in psp_load_fw()
3177 dev_err(psp->adev->dev, in psp_load_fw()
3180 ret = psp_dtm_initialize(psp); in psp_load_fw()
3182 dev_err(psp->adev->dev, in psp_load_fw()
3185 ret = psp_rap_initialize(psp); in psp_load_fw()
3187 dev_err(psp->adev->dev, in psp_load_fw()
3190 ret = psp_securedisplay_initialize(psp); in psp_load_fw()
3192 dev_err(psp->adev->dev, in psp_load_fw()
3199 psp_free_shared_bufs(psp); in psp_load_fw()
3204 * psp->cmd destory) are delayed to psp_hw_fini in psp_load_fw()
3206 psp_ring_destroy(psp, PSP_RING_TYPE__KM); in psp_load_fw()
3223 dev_err(adev->dev, "PSP firmware loading failed\n"); in psp_hw_init()
3239 struct psp_context *psp = &adev->psp; in psp_hw_fini() local
3241 if (psp->ta_fw) { in psp_hw_fini()
3242 psp_ras_terminate(psp); in psp_hw_fini()
3243 psp_securedisplay_terminate(psp); in psp_hw_fini()
3244 psp_rap_terminate(psp); in psp_hw_fini()
3245 psp_dtm_terminate(psp); in psp_hw_fini()
3246 psp_hdcp_terminate(psp); in psp_hw_fini()
3249 psp_xgmi_terminate(psp); in psp_hw_fini()
3252 psp_asd_terminate(psp); in psp_hw_fini()
3253 psp_tmr_terminate(psp); in psp_hw_fini()
3255 psp_ring_destroy(psp, PSP_RING_TYPE__KM); in psp_hw_fini()
3264 struct psp_context *psp = &adev->psp; in psp_suspend() local
3267 psp->xgmi_context.context.initialized) { in psp_suspend()
3268 ret = psp_xgmi_terminate(psp); in psp_suspend()
3275 if (psp->ta_fw) { in psp_suspend()
3276 ret = psp_ras_terminate(psp); in psp_suspend()
3281 ret = psp_hdcp_terminate(psp); in psp_suspend()
3286 ret = psp_dtm_terminate(psp); in psp_suspend()
3291 ret = psp_rap_terminate(psp); in psp_suspend()
3296 ret = psp_securedisplay_terminate(psp); in psp_suspend()
3303 ret = psp_asd_terminate(psp); in psp_suspend()
3309 ret = psp_tmr_terminate(psp); in psp_suspend()
3315 ret = psp_ring_stop(psp, PSP_RING_TYPE__KM); in psp_suspend()
3317 dev_err(adev->dev, "PSP ring stop failed\n"); in psp_suspend()
3327 struct psp_context *psp = &adev->psp; in psp_resume() local
3329 dev_info(adev->dev, "PSP is resuming...\n"); in psp_resume()
3331 if (psp->mem_train_ctx.enable_mem_training) { in psp_resume()
3332 ret = psp_mem_training(psp, PSP_MEM_TRAIN_RESUME); in psp_resume()
3345 ret = psp_hw_start(psp); in psp_resume()
3349 ret = psp_load_non_psp_fw(psp); in psp_resume()
3353 ret = psp_asd_initialize(psp); in psp_resume()
3355 dev_err(adev->dev, "PSP load asd failed!\n"); in psp_resume()
3361 dev_err(adev->dev, "PSP load RL failed!\n"); in psp_resume()
3366 ret = psp_xgmi_initialize(psp, false, true); in psp_resume()
3371 dev_err(psp->adev->dev, in psp_resume()
3375 if (psp->ta_fw) { in psp_resume()
3376 ret = psp_ras_initialize(psp); in psp_resume()
3378 dev_err(psp->adev->dev, in psp_resume()
3381 ret = psp_hdcp_initialize(psp); in psp_resume()
3383 dev_err(psp->adev->dev, in psp_resume()
3386 ret = psp_dtm_initialize(psp); in psp_resume()
3388 dev_err(psp->adev->dev, in psp_resume()
3391 ret = psp_rap_initialize(psp); in psp_resume()
3393 dev_err(psp->adev->dev, in psp_resume()
3396 ret = psp_securedisplay_initialize(psp); in psp_resume()
3398 dev_err(psp->adev->dev, in psp_resume()
3407 dev_err(adev->dev, "PSP resume failed\n"); in psp_resume()
3419 mutex_lock(&adev->psp.mutex); in psp_gpu_reset()
3420 ret = psp_mode1_reset(&adev->psp); in psp_gpu_reset()
3421 mutex_unlock(&adev->psp.mutex); in psp_gpu_reset()
3426 int psp_rlc_autoload_start(struct psp_context *psp) in psp_rlc_autoload_start() argument
3429 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_rlc_autoload_start()
3433 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_rlc_autoload_start()
3434 psp->fence_buf_mc_addr); in psp_rlc_autoload_start()
3436 release_psp_cmd_buf(psp); in psp_rlc_autoload_start()
3441 int psp_ring_cmd_submit(struct psp_context *psp, in psp_ring_cmd_submit() argument
3448 struct psp_ring *ring = &psp->km_ring; in psp_ring_cmd_submit()
3452 struct amdgpu_device *adev = psp->adev; in psp_ring_cmd_submit()
3457 psp_write_ptr_reg = psp_ring_get_wptr(psp); in psp_ring_cmd_submit()
3489 psp_ring_set_wptr(psp, psp_write_ptr_reg); in psp_ring_cmd_submit()
3493 int psp_init_asd_microcode(struct psp_context *psp, const char *chip_name) in psp_init_asd_microcode() argument
3495 struct amdgpu_device *adev = psp->adev; in psp_init_asd_microcode()
3499 err = amdgpu_ucode_request(adev, &adev->psp.asd_fw, AMDGPU_UCODE_REQUIRED, in psp_init_asd_microcode()
3504 asd_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data; in psp_init_asd_microcode()
3505 adev->psp.asd_context.bin_desc.fw_version = le32_to_cpu(asd_hdr->header.ucode_version); in psp_init_asd_microcode()
3506 adev->psp.asd_context.bin_desc.feature_version = le32_to_cpu(asd_hdr->sos.fw_version); in psp_init_asd_microcode()
3507 adev->psp.asd_context.bin_desc.size_bytes = le32_to_cpu(asd_hdr->header.ucode_size_bytes); in psp_init_asd_microcode()
3508 adev->psp.asd_context.bin_desc.start_addr = (uint8_t *)asd_hdr + in psp_init_asd_microcode()
3512 amdgpu_ucode_release(&adev->psp.asd_fw); in psp_init_asd_microcode()
3516 int psp_init_toc_microcode(struct psp_context *psp, const char *chip_name) in psp_init_toc_microcode() argument
3518 struct amdgpu_device *adev = psp->adev; in psp_init_toc_microcode()
3522 err = amdgpu_ucode_request(adev, &adev->psp.toc_fw, AMDGPU_UCODE_REQUIRED, in psp_init_toc_microcode()
3527 toc_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.toc_fw->data; in psp_init_toc_microcode()
3528 adev->psp.toc.fw_version = le32_to_cpu(toc_hdr->header.ucode_version); in psp_init_toc_microcode()
3529 adev->psp.toc.feature_version = le32_to_cpu(toc_hdr->sos.fw_version); in psp_init_toc_microcode()
3530 adev->psp.toc.size_bytes = le32_to_cpu(toc_hdr->header.ucode_size_bytes); in psp_init_toc_microcode()
3531 adev->psp.toc.start_addr = (uint8_t *)toc_hdr + in psp_init_toc_microcode()
3535 amdgpu_ucode_release(&adev->psp.toc_fw); in psp_init_toc_microcode()
3539 static int parse_sos_bin_descriptor(struct psp_context *psp, in parse_sos_bin_descriptor() argument
3545 if (!psp || !desc || !sos_hdr) in parse_sos_bin_descriptor()
3554 psp->sos.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3555 psp->sos.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3556 psp->sos.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3557 psp->sos.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3560 psp->sys.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3561 psp->sys.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3562 psp->sys.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3563 psp->sys.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3566 psp->kdb.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3567 psp->kdb.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3568 psp->kdb.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3569 psp->kdb.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3572 psp->toc.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3573 psp->toc.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3574 psp->toc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3575 psp->toc.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3578 psp->spl.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3579 psp->spl.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3580 psp->spl.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3581 psp->spl.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3584 psp->rl.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3585 psp->rl.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3586 psp->rl.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3587 psp->rl.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3590 psp->soc_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3591 psp->soc_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3592 psp->soc_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3593 psp->soc_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3596 psp->intf_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3597 psp->intf_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3598 psp->intf_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3599 psp->intf_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3602 psp->dbg_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3603 psp->dbg_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3604 psp->dbg_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3605 psp->dbg_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3608 psp->ras_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3609 psp->ras_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3610 psp->ras_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3611 psp->ras_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3614 psp->ipkeymgr_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3615 psp->ipkeymgr_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3616 psp->ipkeymgr_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3617 psp->ipkeymgr_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3620 psp->spdm_drv.fw_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3621 psp->spdm_drv.feature_version = le32_to_cpu(desc->fw_version); in parse_sos_bin_descriptor()
3622 psp->spdm_drv.size_bytes = le32_to_cpu(desc->size_bytes); in parse_sos_bin_descriptor()
3623 psp->spdm_drv.start_addr = ucode_start_addr; in parse_sos_bin_descriptor()
3626 dev_warn(psp->adev->dev, "Unsupported PSP FW type: %d\n", desc->fw_type); in parse_sos_bin_descriptor()
3639 sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data; in psp_init_sos_base_fw()
3645 adev->psp.sos.fw_version = le32_to_cpu(sos_hdr->header.ucode_version); in psp_init_sos_base_fw()
3646 adev->psp.sos.feature_version = le32_to_cpu(sos_hdr->sos.fw_version); in psp_init_sos_base_fw()
3648 adev->psp.sys.size_bytes = le32_to_cpu(sos_hdr->sos.offset_bytes); in psp_init_sos_base_fw()
3649 adev->psp.sys.start_addr = ucode_array_start_addr; in psp_init_sos_base_fw()
3651 adev->psp.sos.size_bytes = le32_to_cpu(sos_hdr->sos.size_bytes); in psp_init_sos_base_fw()
3652 adev->psp.sos.start_addr = ucode_array_start_addr + in psp_init_sos_base_fw()
3655 /* Load alternate PSP SOS FW */ in psp_init_sos_base_fw()
3656 sos_hdr_v1_3 = (const struct psp_firmware_header_v1_3 *)adev->psp.sos_fw->data; in psp_init_sos_base_fw()
3658 adev->psp.sos.fw_version = le32_to_cpu(sos_hdr_v1_3->sos_aux.fw_version); in psp_init_sos_base_fw()
3659 adev->psp.sos.feature_version = le32_to_cpu(sos_hdr_v1_3->sos_aux.fw_version); in psp_init_sos_base_fw()
3661 adev->psp.sys.size_bytes = le32_to_cpu(sos_hdr_v1_3->sys_drv_aux.size_bytes); in psp_init_sos_base_fw()
3662 adev->psp.sys.start_addr = ucode_array_start_addr + in psp_init_sos_base_fw()
3665 adev->psp.sos.size_bytes = le32_to_cpu(sos_hdr_v1_3->sos_aux.size_bytes); in psp_init_sos_base_fw()
3666 adev->psp.sos.start_addr = ucode_array_start_addr + in psp_init_sos_base_fw()
3670 if ((adev->psp.sys.size_bytes == 0) || (adev->psp.sos.size_bytes == 0)) { in psp_init_sos_base_fw()
3671 dev_warn(adev->dev, "PSP SOS FW not available"); in psp_init_sos_base_fw()
3678 int psp_init_sos_microcode(struct psp_context *psp, const char *chip_name) in psp_init_sos_microcode() argument
3680 struct amdgpu_device *adev = psp->adev; in psp_init_sos_microcode()
3693 err = amdgpu_ucode_request(adev, &adev->psp.sos_fw, AMDGPU_UCODE_REQUIRED, in psp_init_sos_microcode()
3696 err = amdgpu_ucode_request(adev, &adev->psp.sos_fw, AMDGPU_UCODE_REQUIRED, in psp_init_sos_microcode()
3701 sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3713 sos_hdr_v1_1 = (const struct psp_firmware_header_v1_1 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3714 adev->psp.toc.size_bytes = le32_to_cpu(sos_hdr_v1_1->toc.size_bytes); in psp_init_sos_microcode()
3715 adev->psp.toc.start_addr = (uint8_t *)adev->psp.sys.start_addr + in psp_init_sos_microcode()
3717 adev->psp.kdb.size_bytes = le32_to_cpu(sos_hdr_v1_1->kdb.size_bytes); in psp_init_sos_microcode()
3718 adev->psp.kdb.start_addr = (uint8_t *)adev->psp.sys.start_addr + in psp_init_sos_microcode()
3722 sos_hdr_v1_2 = (const struct psp_firmware_header_v1_2 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3723 adev->psp.kdb.size_bytes = le32_to_cpu(sos_hdr_v1_2->kdb.size_bytes); in psp_init_sos_microcode()
3724 adev->psp.kdb.start_addr = (uint8_t *)adev->psp.sys.start_addr + in psp_init_sos_microcode()
3728 sos_hdr_v1_3 = (const struct psp_firmware_header_v1_3 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3729 adev->psp.toc.size_bytes = le32_to_cpu(sos_hdr_v1_3->v1_1.toc.size_bytes); in psp_init_sos_microcode()
3730 adev->psp.toc.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3732 adev->psp.kdb.size_bytes = le32_to_cpu(sos_hdr_v1_3->v1_1.kdb.size_bytes); in psp_init_sos_microcode()
3733 adev->psp.kdb.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3735 adev->psp.spl.size_bytes = le32_to_cpu(sos_hdr_v1_3->spl.size_bytes); in psp_init_sos_microcode()
3736 adev->psp.spl.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3738 adev->psp.rl.size_bytes = le32_to_cpu(sos_hdr_v1_3->rl.size_bytes); in psp_init_sos_microcode()
3739 adev->psp.rl.start_addr = ucode_array_start_addr + in psp_init_sos_microcode()
3744 sos_hdr_v2_0 = (const struct psp_firmware_header_v2_0 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3755 sos_hdr_v2_1 = (const struct psp_firmware_header_v2_1 *)adev->psp.sos_fw->data; in psp_init_sos_microcode()
3759 if (psp_is_aux_sos_load_required(psp)) in psp_init_sos_microcode()
3769 err = parse_sos_bin_descriptor(psp, fw_bin + fw_index, in psp_init_sos_microcode()
3777 "unsupported psp sos firmware\n"); in psp_init_sos_microcode()
3784 amdgpu_ucode_release(&adev->psp.sos_fw); in psp_init_sos_microcode()
3789 static bool is_ta_fw_applicable(struct psp_context *psp, in is_ta_fw_applicable() argument
3792 struct amdgpu_device *adev = psp->adev; in is_ta_fw_applicable()
3819 static int parse_ta_bin_descriptor(struct psp_context *psp, in parse_ta_bin_descriptor() argument
3825 if (!psp || !desc || !ta_hdr) in parse_ta_bin_descriptor()
3828 if (!is_ta_fw_applicable(psp, desc)) in parse_ta_bin_descriptor()
3837 psp->asd_context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3838 psp->asd_context.bin_desc.feature_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3839 psp->asd_context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3840 psp->asd_context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3844 psp->xgmi_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3845 psp->xgmi_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3846 psp->xgmi_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3849 psp->ras_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3850 psp->ras_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3851 psp->ras_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3854 psp->hdcp_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3855 psp->hdcp_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3856 psp->hdcp_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3859 psp->dtm_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3860 psp->dtm_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3861 psp->dtm_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3864 psp->rap_context.context.bin_desc.fw_version = le32_to_cpu(desc->fw_version); in parse_ta_bin_descriptor()
3865 psp->rap_context.context.bin_desc.size_bytes = le32_to_cpu(desc->size_bytes); in parse_ta_bin_descriptor()
3866 psp->rap_context.context.bin_desc.start_addr = ucode_start_addr; in parse_ta_bin_descriptor()
3869 psp->securedisplay_context.context.bin_desc.fw_version = in parse_ta_bin_descriptor()
3871 psp->securedisplay_context.context.bin_desc.size_bytes = in parse_ta_bin_descriptor()
3873 psp->securedisplay_context.context.bin_desc.start_addr = in parse_ta_bin_descriptor()
3877 dev_warn(psp->adev->dev, "Unsupported TA type: %d\n", desc->fw_type); in parse_ta_bin_descriptor()
3884 static int parse_ta_v1_microcode(struct psp_context *psp) in parse_ta_v1_microcode() argument
3887 struct amdgpu_device *adev = psp->adev; in parse_ta_v1_microcode()
3889 ta_hdr = (const struct ta_firmware_header_v1_0 *) adev->psp.ta_fw->data; in parse_ta_v1_microcode()
3894 adev->psp.xgmi_context.context.bin_desc.fw_version = in parse_ta_v1_microcode()
3896 adev->psp.xgmi_context.context.bin_desc.size_bytes = in parse_ta_v1_microcode()
3898 adev->psp.xgmi_context.context.bin_desc.start_addr = in parse_ta_v1_microcode()
3902 adev->psp.ras_context.context.bin_desc.fw_version = in parse_ta_v1_microcode()
3904 adev->psp.ras_context.context.bin_desc.size_bytes = in parse_ta_v1_microcode()
3906 adev->psp.ras_context.context.bin_desc.start_addr = in parse_ta_v1_microcode()
3907 (uint8_t *)adev->psp.xgmi_context.context.bin_desc.start_addr + in parse_ta_v1_microcode()
3910 adev->psp.hdcp_context.context.bin_desc.fw_version = in parse_ta_v1_microcode()
3912 adev->psp.hdcp_context.context.bin_desc.size_bytes = in parse_ta_v1_microcode()
3914 adev->psp.hdcp_context.context.bin_desc.start_addr = in parse_ta_v1_microcode()
3918 adev->psp.dtm_context.context.bin_desc.fw_version = in parse_ta_v1_microcode()
3920 adev->psp.dtm_context.context.bin_desc.size_bytes = in parse_ta_v1_microcode()
3922 adev->psp.dtm_context.context.bin_desc.start_addr = in parse_ta_v1_microcode()
3923 (uint8_t *)adev->psp.hdcp_context.context.bin_desc.start_addr + in parse_ta_v1_microcode()
3926 adev->psp.securedisplay_context.context.bin_desc.fw_version = in parse_ta_v1_microcode()
3928 adev->psp.securedisplay_context.context.bin_desc.size_bytes = in parse_ta_v1_microcode()
3930 adev->psp.securedisplay_context.context.bin_desc.start_addr = in parse_ta_v1_microcode()
3931 (uint8_t *)adev->psp.hdcp_context.context.bin_desc.start_addr + in parse_ta_v1_microcode()
3934 adev->psp.ta_fw_version = le32_to_cpu(ta_hdr->header.ucode_version); in parse_ta_v1_microcode()
3939 static int parse_ta_v2_microcode(struct psp_context *psp) in parse_ta_v2_microcode() argument
3942 struct amdgpu_device *adev = psp->adev; in parse_ta_v2_microcode()
3946 ta_hdr = (const struct ta_firmware_header_v2_0 *)adev->psp.ta_fw->data; in parse_ta_v2_microcode()
3957 err = parse_ta_bin_descriptor(psp, in parse_ta_v2_microcode()
3967 int psp_init_ta_microcode(struct psp_context *psp, const char *chip_name) in psp_init_ta_microcode() argument
3970 struct amdgpu_device *adev = psp->adev; in psp_init_ta_microcode()
3974 err = amdgpu_ucode_request(adev, &adev->psp.ta_fw, AMDGPU_UCODE_REQUIRED, in psp_init_ta_microcode()
3977 err = amdgpu_ucode_request(adev, &adev->psp.ta_fw, AMDGPU_UCODE_REQUIRED, in psp_init_ta_microcode()
3982 hdr = (const struct common_firmware_header *)adev->psp.ta_fw->data; in psp_init_ta_microcode()
3985 err = parse_ta_v1_microcode(psp); in psp_init_ta_microcode()
3988 err = parse_ta_v2_microcode(psp); in psp_init_ta_microcode()
3996 amdgpu_ucode_release(&adev->psp.ta_fw); in psp_init_ta_microcode()
4001 int psp_init_cap_microcode(struct psp_context *psp, const char *chip_name) in psp_init_cap_microcode() argument
4003 struct amdgpu_device *adev = psp->adev; in psp_init_cap_microcode()
4013 err = amdgpu_ucode_request(adev, &adev->psp.cap_fw, AMDGPU_UCODE_OPTIONAL, in psp_init_cap_microcode()
4027 info->fw = adev->psp.cap_fw; in psp_init_cap_microcode()
4029 adev->psp.cap_fw->data; in psp_init_cap_microcode()
4032 adev->psp.cap_fw_version = le32_to_cpu(cap_hdr_v1_0->header.ucode_version); in psp_init_cap_microcode()
4033 adev->psp.cap_feature_version = le32_to_cpu(cap_hdr_v1_0->sos.fw_version); in psp_init_cap_microcode()
4034 adev->psp.cap_ucode_size = le32_to_cpu(cap_hdr_v1_0->header.ucode_size_bytes); in psp_init_cap_microcode()
4039 amdgpu_ucode_release(&adev->psp.cap_fw); in psp_init_cap_microcode()
4043 int psp_config_sq_perfmon(struct psp_context *psp, in psp_config_sq_perfmon() argument
4049 if (amdgpu_sriov_vf(psp->adev)) in psp_config_sq_perfmon()
4053 dev_err(psp->adev->dev, "invalid xcp_id %d\n", xcp_id); in psp_config_sq_perfmon()
4057 if (amdgpu_ip_version(psp->adev, MP0_HWIP, 0) != IP_VERSION(13, 0, 6)) { in psp_config_sq_perfmon()
4058 dev_err(psp->adev->dev, "Unsupported MP0 version 0x%x for CONFIG_SQ_PERFMON command\n", in psp_config_sq_perfmon()
4059 amdgpu_ip_version(psp->adev, MP0_HWIP, 0)); in psp_config_sq_perfmon()
4062 struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); in psp_config_sq_perfmon()
4070 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_config_sq_perfmon()
4072 dev_warn(psp->adev->dev, "PSP failed to config sq: xcp%d core%d reg%d perfmon%d\n", in psp_config_sq_perfmon()
4075 release_psp_cmd_buf(psp); in psp_config_sq_perfmon()
4103 dev_info(adev->dev, "PSP block is not ready yet\n."); in psp_usbc_pd_fw_sysfs_read()
4107 mutex_lock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_read()
4108 ret = psp_read_usbc_pd_fw(&adev->psp, &fw_ver); in psp_usbc_pd_fw_sysfs_read()
4109 mutex_unlock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_read()
4135 dev_err(adev->dev, "PSP block is not ready yet."); in psp_usbc_pd_fw_sysfs_write()
4147 /* LFB address which is aligned to 1MB boundary per PSP request */ in psp_usbc_pd_fw_sysfs_write()
4158 mutex_lock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_write()
4159 ret = psp_load_usbc_pd_fw(&adev->psp, fw_pri_mc_addr); in psp_usbc_pd_fw_sysfs_write()
4160 mutex_unlock(&adev->psp.mutex); in psp_usbc_pd_fw_sysfs_write()
4176 void psp_copy_fw(struct psp_context *psp, uint8_t *start_addr, uint32_t bin_size) in psp_copy_fw() argument
4180 if (!drm_dev_enter(adev_to_drm(psp->adev), &idx)) in psp_copy_fw()
4183 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_copy_fw()
4184 memcpy(psp->fw_pri_buf, start_addr, bin_size); in psp_copy_fw()
4211 adev->psp.vbflash_done = false; in amdgpu_psp_vbflash_write()
4214 if (adev->psp.vbflash_image_size > AMD_VBIOS_FILE_MAX_SIZE_B) { in amdgpu_psp_vbflash_write()
4216 kvfree(adev->psp.vbflash_tmp_buf); in amdgpu_psp_vbflash_write()
4217 adev->psp.vbflash_tmp_buf = NULL; in amdgpu_psp_vbflash_write()
4218 adev->psp.vbflash_image_size = 0; in amdgpu_psp_vbflash_write()
4223 if (!adev->psp.vbflash_tmp_buf) { in amdgpu_psp_vbflash_write()
4224 adev->psp.vbflash_tmp_buf = kvmalloc(AMD_VBIOS_FILE_MAX_SIZE_B, GFP_KERNEL); in amdgpu_psp_vbflash_write()
4225 if (!adev->psp.vbflash_tmp_buf) in amdgpu_psp_vbflash_write()
4229 mutex_lock(&adev->psp.mutex); in amdgpu_psp_vbflash_write()
4230 memcpy(adev->psp.vbflash_tmp_buf + pos, buffer, count); in amdgpu_psp_vbflash_write()
4231 adev->psp.vbflash_image_size += count; in amdgpu_psp_vbflash_write()
4232 mutex_unlock(&adev->psp.mutex); in amdgpu_psp_vbflash_write()
4251 if (adev->psp.vbflash_image_size == 0) in amdgpu_psp_vbflash_read()
4254 dev_dbg(adev->dev, "PSP IFWI flash process initiated\n"); in amdgpu_psp_vbflash_read()
4256 ret = amdgpu_bo_create_kernel(adev, adev->psp.vbflash_image_size, in amdgpu_psp_vbflash_read()
4265 memcpy_toio(fw_pri_cpu_addr, adev->psp.vbflash_tmp_buf, adev->psp.vbflash_image_size); in amdgpu_psp_vbflash_read()
4267 mutex_lock(&adev->psp.mutex); in amdgpu_psp_vbflash_read()
4268 ret = psp_update_spirom(&adev->psp, fw_pri_mc_addr); in amdgpu_psp_vbflash_read()
4269 mutex_unlock(&adev->psp.mutex); in amdgpu_psp_vbflash_read()
4274 kvfree(adev->psp.vbflash_tmp_buf); in amdgpu_psp_vbflash_read()
4275 adev->psp.vbflash_tmp_buf = NULL; in amdgpu_psp_vbflash_read()
4276 adev->psp.vbflash_image_size = 0; in amdgpu_psp_vbflash_read()
4283 dev_dbg(adev->dev, "PSP IFWI flash process done\n"); in amdgpu_psp_vbflash_read()
4313 vbflash_status = psp_vbflash_status(&adev->psp); in amdgpu_psp_vbflash_status()
4314 if (!adev->psp.vbflash_done) in amdgpu_psp_vbflash_status()
4316 else if (adev->psp.vbflash_done && !(vbflash_status & 0x80000000)) in amdgpu_psp_vbflash_status()
4341 return adev->psp.sup_pd_fw_up ? 0660 : 0; in amdgpu_flash_attr_is_visible()
4343 return adev->psp.sup_ifwi_up ? 0440 : 0; in amdgpu_flash_attr_is_visible()
4354 return adev->psp.sup_ifwi_up ? 0660 : 0; in amdgpu_bin_flash_attr_is_visible()
4372 if (!mutex_trylock(&adev->psp.mutex)) in psp_read_spirom_debugfs_open()
4382 if (adev->psp.spirom_dump_trip) { in psp_read_spirom_debugfs_open()
4383 mutex_unlock(&adev->psp.mutex); in psp_read_spirom_debugfs_open()
4389 mutex_unlock(&adev->psp.mutex); in psp_read_spirom_debugfs_open()
4402 ret = psp_dump_spirom(&adev->psp, bo_triplet->mc_addr); in psp_read_spirom_debugfs_open()
4406 adev->psp.spirom_dump_trip = bo_triplet; in psp_read_spirom_debugfs_open()
4407 mutex_unlock(&adev->psp.mutex); in psp_read_spirom_debugfs_open()
4414 mutex_unlock(&adev->psp.mutex); in psp_read_spirom_debugfs_open()
4423 struct spirom_bo *bo_triplet = adev->psp.spirom_dump_trip; in psp_read_spirom_debugfs_read()
4437 struct spirom_bo *bo_triplet = adev->psp.spirom_dump_trip; in psp_read_spirom_debugfs_release()
4445 adev->psp.spirom_dump_trip = NULL; in psp_read_spirom_debugfs_release()
4469 .name = "psp",