Lines Matching refs:psp

42 	struct psp_context *psp = &adev->psp;  in psp_early_init()  local
49 psp_v3_1_set_psp_funcs(psp); in psp_early_init()
50 psp->autoload_supported = false; in psp_early_init()
53 psp_v10_0_set_psp_funcs(psp); in psp_early_init()
54 psp->autoload_supported = false; in psp_early_init()
58 psp_v11_0_set_psp_funcs(psp); in psp_early_init()
59 psp->autoload_supported = false; in psp_early_init()
64 psp_v11_0_set_psp_funcs(psp); in psp_early_init()
65 psp->autoload_supported = true; in psp_early_init()
68 psp_v12_0_set_psp_funcs(psp); in psp_early_init()
74 psp->adev = adev; in psp_early_init()
82 struct psp_context *psp = &adev->psp; in psp_sw_init() local
85 ret = psp_init_microcode(psp); in psp_sw_init()
98 release_firmware(adev->psp.sos_fw); in psp_sw_fini()
99 adev->psp.sos_fw = NULL; in psp_sw_fini()
100 release_firmware(adev->psp.asd_fw); in psp_sw_fini()
101 adev->psp.asd_fw = NULL; in psp_sw_fini()
102 if (adev->psp.ta_fw) { in psp_sw_fini()
103 release_firmware(adev->psp.ta_fw); in psp_sw_fini()
104 adev->psp.ta_fw = NULL; in psp_sw_fini()
109 int psp_wait_for(struct psp_context *psp, uint32_t reg_index, in psp_wait_for() argument
114 struct amdgpu_device *adev = psp->adev; in psp_wait_for()
132 psp_cmd_submit_buf(struct psp_context *psp, in psp_cmd_submit_buf() argument
140 mutex_lock(&psp->mutex); in psp_cmd_submit_buf()
142 memset(psp->cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE); in psp_cmd_submit_buf()
144 memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp)); in psp_cmd_submit_buf()
146 index = atomic_inc_return(&psp->fence_value); in psp_cmd_submit_buf()
147 ret = psp_cmd_submit(psp, psp->cmd_buf_mc_addr, fence_mc_addr, index); in psp_cmd_submit_buf()
149 atomic_dec(&psp->fence_value); in psp_cmd_submit_buf()
150 mutex_unlock(&psp->mutex); in psp_cmd_submit_buf()
154 while (*((unsigned int *)psp->fence_buf) != index) { in psp_cmd_submit_buf()
167 if (psp->cmd_buf_mem->resp.status || !timeout) { in psp_cmd_submit_buf()
172 psp->cmd_buf_mem->resp.status & GFX_CMD_STATUS_MASK); in psp_cmd_submit_buf()
174 mutex_unlock(&psp->mutex); in psp_cmd_submit_buf()
180 cmd->resp.session_id = psp->cmd_buf_mem->resp.session_id; in psp_cmd_submit_buf()
183 ucode->tmr_mc_addr_lo = psp->cmd_buf_mem->resp.fw_addr_lo; in psp_cmd_submit_buf()
184 ucode->tmr_mc_addr_hi = psp->cmd_buf_mem->resp.fw_addr_hi; in psp_cmd_submit_buf()
186 mutex_unlock(&psp->mutex); in psp_cmd_submit_buf()
191 static void psp_prep_tmr_cmd_buf(struct psp_context *psp, in psp_prep_tmr_cmd_buf() argument
195 if (psp_support_vmr_ring(psp)) in psp_prep_tmr_cmd_buf()
214 static int psp_load_toc(struct psp_context *psp, in psp_load_toc() argument
224 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_load_toc()
225 memcpy(psp->fw_pri_buf, psp->toc_start_addr, psp->toc_bin_size); in psp_load_toc()
227 psp_prep_load_toc_cmd_buf(cmd, psp->fw_pri_mc_addr, psp->toc_bin_size); in psp_load_toc()
229 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_load_toc()
230 psp->fence_buf_mc_addr); in psp_load_toc()
232 *tmr_size = psp->cmd_buf_mem->resp.tmr_size; in psp_load_toc()
238 static int psp_tmr_init(struct psp_context *psp) in psp_tmr_init() argument
256 if (psp->toc_start_addr && in psp_tmr_init()
257 psp->toc_bin_size && in psp_tmr_init()
258 psp->fw_pri_buf) { in psp_tmr_init()
259 ret = psp_load_toc(psp, &tmr_size); in psp_tmr_init()
266 pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL; in psp_tmr_init()
267 ret = amdgpu_bo_create_kernel(psp->adev, tmr_size, PSP_TMR_SIZE, in psp_tmr_init()
269 &psp->tmr_bo, &psp->tmr_mc_addr, pptr); in psp_tmr_init()
274 static int psp_tmr_load(struct psp_context *psp) in psp_tmr_load() argument
283 psp_prep_tmr_cmd_buf(psp, cmd, psp->tmr_mc_addr, in psp_tmr_load()
284 amdgpu_bo_size(psp->tmr_bo)); in psp_tmr_load()
286 amdgpu_bo_size(psp->tmr_bo), psp->tmr_mc_addr); in psp_tmr_load()
288 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_tmr_load()
289 psp->fence_buf_mc_addr); in psp_tmr_load()
316 static int psp_asd_init(struct psp_context *psp) in psp_asd_init() argument
324 ret = amdgpu_bo_create_kernel(psp->adev, PSP_ASD_SHARED_MEM_SIZE, in psp_asd_init()
326 &psp->asd_shared_bo, in psp_asd_init()
327 &psp->asd_shared_mc_addr, in psp_asd_init()
328 &psp->asd_shared_buf); in psp_asd_init()
333 static int psp_asd_load(struct psp_context *psp) in psp_asd_load() argument
342 if (amdgpu_sriov_vf(psp->adev)) in psp_asd_load()
349 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_asd_load()
350 memcpy(psp->fw_pri_buf, psp->asd_start_addr, psp->asd_ucode_size); in psp_asd_load()
352 psp_prep_asd_cmd_buf(cmd, psp->fw_pri_mc_addr, psp->asd_shared_mc_addr, in psp_asd_load()
353 psp->asd_ucode_size, PSP_ASD_SHARED_MEM_SIZE); in psp_asd_load()
355 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_asd_load()
356 psp->fence_buf_mc_addr); in psp_asd_load()
371 int psp_reg_program(struct psp_context *psp, enum psp_reg_prog_id reg, in psp_reg_program() argument
385 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); in psp_reg_program()
405 static int psp_xgmi_init_shared_buf(struct psp_context *psp) in psp_xgmi_init_shared_buf() argument
413 ret = amdgpu_bo_create_kernel(psp->adev, PSP_XGMI_SHARED_MEM_SIZE, in psp_xgmi_init_shared_buf()
415 &psp->xgmi_context.xgmi_shared_bo, in psp_xgmi_init_shared_buf()
416 &psp->xgmi_context.xgmi_shared_mc_addr, in psp_xgmi_init_shared_buf()
417 &psp->xgmi_context.xgmi_shared_buf); in psp_xgmi_init_shared_buf()
422 static int psp_xgmi_load(struct psp_context *psp) in psp_xgmi_load() argument
430 if (amdgpu_sriov_vf(psp->adev)) in psp_xgmi_load()
437 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_xgmi_load()
438 memcpy(psp->fw_pri_buf, psp->ta_xgmi_start_addr, psp->ta_xgmi_ucode_size); in psp_xgmi_load()
440 psp_prep_xgmi_ta_load_cmd_buf(cmd, psp->fw_pri_mc_addr, in psp_xgmi_load()
441 psp->xgmi_context.xgmi_shared_mc_addr, in psp_xgmi_load()
442 psp->ta_xgmi_ucode_size, PSP_XGMI_SHARED_MEM_SIZE); in psp_xgmi_load()
444 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_xgmi_load()
445 psp->fence_buf_mc_addr); in psp_xgmi_load()
448 psp->xgmi_context.initialized = 1; in psp_xgmi_load()
449 psp->xgmi_context.session_id = cmd->resp.session_id; in psp_xgmi_load()
464 static int psp_xgmi_unload(struct psp_context *psp) in psp_xgmi_unload() argument
472 if (amdgpu_sriov_vf(psp->adev)) in psp_xgmi_unload()
479 psp_prep_xgmi_ta_unload_cmd_buf(cmd, psp->xgmi_context.session_id); in psp_xgmi_unload()
481 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_xgmi_unload()
482 psp->fence_buf_mc_addr); in psp_xgmi_unload()
499 int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_xgmi_invoke() argument
507 if (amdgpu_sriov_vf(psp->adev)) in psp_xgmi_invoke()
515 psp->xgmi_context.session_id); in psp_xgmi_invoke()
517 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_xgmi_invoke()
518 psp->fence_buf_mc_addr); in psp_xgmi_invoke()
525 static int psp_xgmi_terminate(struct psp_context *psp) in psp_xgmi_terminate() argument
529 if (!psp->xgmi_context.initialized) in psp_xgmi_terminate()
532 ret = psp_xgmi_unload(psp); in psp_xgmi_terminate()
536 psp->xgmi_context.initialized = 0; in psp_xgmi_terminate()
539 amdgpu_bo_free_kernel(&psp->xgmi_context.xgmi_shared_bo, in psp_xgmi_terminate()
540 &psp->xgmi_context.xgmi_shared_mc_addr, in psp_xgmi_terminate()
541 &psp->xgmi_context.xgmi_shared_buf); in psp_xgmi_terminate()
546 static int psp_xgmi_initialize(struct psp_context *psp) in psp_xgmi_initialize() argument
551 if (!psp->adev->psp.ta_fw) in psp_xgmi_initialize()
554 if (!psp->xgmi_context.initialized) { in psp_xgmi_initialize()
555 ret = psp_xgmi_init_shared_buf(psp); in psp_xgmi_initialize()
561 ret = psp_xgmi_load(psp); in psp_xgmi_initialize()
566 xgmi_cmd = (struct ta_xgmi_shared_memory *)(psp->xgmi_context.xgmi_shared_buf); in psp_xgmi_initialize()
570 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); in psp_xgmi_initialize()
590 static int psp_ras_init_shared_buf(struct psp_context *psp) in psp_ras_init_shared_buf() argument
598 ret = amdgpu_bo_create_kernel(psp->adev, PSP_RAS_SHARED_MEM_SIZE, in psp_ras_init_shared_buf()
600 &psp->ras.ras_shared_bo, in psp_ras_init_shared_buf()
601 &psp->ras.ras_shared_mc_addr, in psp_ras_init_shared_buf()
602 &psp->ras.ras_shared_buf); in psp_ras_init_shared_buf()
607 static int psp_ras_load(struct psp_context *psp) in psp_ras_load() argument
615 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_load()
622 memset(psp->fw_pri_buf, 0, PSP_1_MEG); in psp_ras_load()
623 memcpy(psp->fw_pri_buf, psp->ta_ras_start_addr, psp->ta_ras_ucode_size); in psp_ras_load()
625 psp_prep_ras_ta_load_cmd_buf(cmd, psp->fw_pri_mc_addr, in psp_ras_load()
626 psp->ras.ras_shared_mc_addr, in psp_ras_load()
627 psp->ta_ras_ucode_size, PSP_RAS_SHARED_MEM_SIZE); in psp_ras_load()
629 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_ras_load()
630 psp->fence_buf_mc_addr); in psp_ras_load()
633 psp->ras.ras_initialized = 1; in psp_ras_load()
634 psp->ras.session_id = cmd->resp.session_id; in psp_ras_load()
649 static int psp_ras_unload(struct psp_context *psp) in psp_ras_unload() argument
657 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_unload()
664 psp_prep_ras_ta_unload_cmd_buf(cmd, psp->ras.session_id); in psp_ras_unload()
666 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_ras_unload()
667 psp->fence_buf_mc_addr); in psp_ras_unload()
684 int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id) in psp_ras_invoke() argument
692 if (amdgpu_sriov_vf(psp->adev)) in psp_ras_invoke()
700 psp->ras.session_id); in psp_ras_invoke()
702 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_ras_invoke()
703 psp->fence_buf_mc_addr); in psp_ras_invoke()
710 int psp_ras_enable_features(struct psp_context *psp, in psp_ras_enable_features() argument
716 if (!psp->ras.ras_initialized) in psp_ras_enable_features()
719 ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf; in psp_ras_enable_features()
729 ret = psp_ras_invoke(psp, ras_cmd->cmd_id); in psp_ras_enable_features()
736 static int psp_ras_terminate(struct psp_context *psp) in psp_ras_terminate() argument
740 if (!psp->ras.ras_initialized) in psp_ras_terminate()
743 ret = psp_ras_unload(psp); in psp_ras_terminate()
747 psp->ras.ras_initialized = 0; in psp_ras_terminate()
750 amdgpu_bo_free_kernel(&psp->ras.ras_shared_bo, in psp_ras_terminate()
751 &psp->ras.ras_shared_mc_addr, in psp_ras_terminate()
752 &psp->ras.ras_shared_buf); in psp_ras_terminate()
757 static int psp_ras_initialize(struct psp_context *psp) in psp_ras_initialize() argument
761 if (!psp->ras.ras_initialized) { in psp_ras_initialize()
762 ret = psp_ras_init_shared_buf(psp); in psp_ras_initialize()
767 ret = psp_ras_load(psp); in psp_ras_initialize()
775 static int psp_hw_start(struct psp_context *psp) in psp_hw_start() argument
777 struct amdgpu_device *adev = psp->adev; in psp_hw_start()
781 if (psp->kdb_bin_size && in psp_hw_start()
782 (psp->funcs->bootloader_load_kdb != NULL)) { in psp_hw_start()
783 ret = psp_bootloader_load_kdb(psp); in psp_hw_start()
790 ret = psp_bootloader_load_sysdrv(psp); in psp_hw_start()
796 ret = psp_bootloader_load_sos(psp); in psp_hw_start()
803 ret = psp_ring_create(psp, PSP_RING_TYPE__KM); in psp_hw_start()
809 ret = psp_tmr_init(psp); in psp_hw_start()
815 ret = psp_tmr_load(psp); in psp_hw_start()
821 ret = psp_asd_init(psp); in psp_hw_start()
827 ret = psp_asd_load(psp); in psp_hw_start()
834 ret = psp_xgmi_initialize(psp); in psp_hw_start()
839 dev_err(psp->adev->dev, in psp_hw_start()
843 if (psp->adev->psp.ta_fw) { in psp_hw_start()
844 ret = psp_ras_initialize(psp); in psp_hw_start()
846 dev_err(psp->adev->dev, in psp_hw_start()
949 static void psp_print_fw_hdr(struct psp_context *psp, in psp_print_fw_hdr() argument
952 struct amdgpu_device *adev = psp->adev; in psp_print_fw_hdr()
1017 static int psp_execute_np_fw_load(struct psp_context *psp, in psp_execute_np_fw_load() argument
1022 ret = psp_prep_load_ip_fw_cmd_buf(ucode, psp->cmd); in psp_execute_np_fw_load()
1026 ret = psp_cmd_submit_buf(psp, ucode, psp->cmd, in psp_execute_np_fw_load()
1027 psp->fence_buf_mc_addr); in psp_execute_np_fw_load()
1032 static int psp_np_fw_load(struct psp_context *psp) in psp_np_fw_load() argument
1036 struct amdgpu_device* adev = psp->adev; in psp_np_fw_load()
1038 if (psp->autoload_supported) { in psp_np_fw_load()
1043 ret = psp_execute_np_fw_load(psp, ucode); in psp_np_fw_load()
1055 (psp_smu_reload_quirk(psp) || psp->autoload_supported)) in psp_np_fw_load()
1071 if (psp->autoload_supported && in psp_np_fw_load()
1081 psp_print_fw_hdr(psp, ucode); in psp_np_fw_load()
1083 ret = psp_execute_np_fw_load(psp, ucode); in psp_np_fw_load()
1089 ret = psp_rlc_autoload(psp); in psp_np_fw_load()
1108 struct psp_context *psp = &adev->psp; in psp_load_fw() local
1111 psp_ring_stop(psp, PSP_RING_TYPE__KM); /* should not destroy ring, only stop */ in psp_load_fw()
1115 psp->cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL); in psp_load_fw()
1116 if (!psp->cmd) in psp_load_fw()
1120 if (!amdgpu_sriov_vf(psp->adev)) { in psp_load_fw()
1123 &psp->fw_pri_bo, in psp_load_fw()
1124 &psp->fw_pri_mc_addr, in psp_load_fw()
1125 &psp->fw_pri_buf); in psp_load_fw()
1132 &psp->fence_buf_bo, in psp_load_fw()
1133 &psp->fence_buf_mc_addr, in psp_load_fw()
1134 &psp->fence_buf); in psp_load_fw()
1140 &psp->cmd_buf_bo, &psp->cmd_buf_mc_addr, in psp_load_fw()
1141 (void **)&psp->cmd_buf_mem); in psp_load_fw()
1145 memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE); in psp_load_fw()
1147 ret = psp_ring_init(psp, PSP_RING_TYPE__KM); in psp_load_fw()
1154 ret = psp_hw_start(psp); in psp_load_fw()
1158 ret = psp_np_fw_load(psp); in psp_load_fw()
1205 struct psp_context *psp = &adev->psp; in psp_hw_fini() local
1210 psp->xgmi_context.initialized == 1) in psp_hw_fini()
1211 psp_xgmi_terminate(psp); in psp_hw_fini()
1213 if (psp->adev->psp.ta_fw) in psp_hw_fini()
1214 psp_ras_terminate(psp); in psp_hw_fini()
1216 psp_ring_destroy(psp, PSP_RING_TYPE__KM); in psp_hw_fini()
1218 pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL; in psp_hw_fini()
1219 amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, pptr); in psp_hw_fini()
1220 amdgpu_bo_free_kernel(&psp->fw_pri_bo, in psp_hw_fini()
1221 &psp->fw_pri_mc_addr, &psp->fw_pri_buf); in psp_hw_fini()
1222 amdgpu_bo_free_kernel(&psp->fence_buf_bo, in psp_hw_fini()
1223 &psp->fence_buf_mc_addr, &psp->fence_buf); in psp_hw_fini()
1224 amdgpu_bo_free_kernel(&psp->asd_shared_bo, &psp->asd_shared_mc_addr, in psp_hw_fini()
1225 &psp->asd_shared_buf); in psp_hw_fini()
1226 amdgpu_bo_free_kernel(&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr, in psp_hw_fini()
1227 (void **)&psp->cmd_buf_mem); in psp_hw_fini()
1229 kfree(psp->cmd); in psp_hw_fini()
1230 psp->cmd = NULL; in psp_hw_fini()
1239 struct psp_context *psp = &adev->psp; in psp_suspend() local
1242 psp->xgmi_context.initialized == 1) { in psp_suspend()
1243 ret = psp_xgmi_terminate(psp); in psp_suspend()
1250 if (psp->adev->psp.ta_fw) { in psp_suspend()
1251 ret = psp_ras_terminate(psp); in psp_suspend()
1258 ret = psp_ring_stop(psp, PSP_RING_TYPE__KM); in psp_suspend()
1271 struct psp_context *psp = &adev->psp; in psp_resume() local
1277 ret = psp_hw_start(psp); in psp_resume()
1281 ret = psp_np_fw_load(psp); in psp_resume()
1302 mutex_lock(&adev->psp.mutex); in psp_gpu_reset()
1303 ret = psp_mode1_reset(&adev->psp); in psp_gpu_reset()
1304 mutex_unlock(&adev->psp.mutex); in psp_gpu_reset()
1309 int psp_rlc_autoload_start(struct psp_context *psp) in psp_rlc_autoload_start() argument
1314 if (amdgpu_sriov_vf(psp->adev)) in psp_rlc_autoload_start()
1323 ret = psp_cmd_submit_buf(psp, NULL, cmd, in psp_rlc_autoload_start()
1324 psp->fence_buf_mc_addr); in psp_rlc_autoload_start()
1339 return psp_execute_np_fw_load(&adev->psp, &ucode); in psp_update_vcn_sram()
1354 return psp_compare_sram_data(&adev->psp, ucode, ucode_type); in psp_check_fw_loading_status()