2 * Copyright 2016 Advanced Micro Devices, Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
26 #include <linux/firmware.h>
27 #include <linux/dma-mapping.h>
30 #include "amdgpu_psp.h"
31 #include "amdgpu_ucode.h"
32 #include "soc15_common.h"
34 #include "psp_v10_0.h"
35 #include "psp_v11_0.h"
36 #include "psp_v12_0.h"
38 #include "amdgpu_ras.h"
40 static int psp_sysfs_init(struct amdgpu_device *adev);
41 static void psp_sysfs_fini(struct amdgpu_device *adev);
43 static int psp_load_smu_fw(struct psp_context *psp);
46 * Due to DF Cstate management centralized to PMFW, the firmware
47 * loading sequence will be updated as below:
53 * - Load other non-psp fw
55 * - Load XGMI/RAS/HDCP/DTM TA if any
57 * This new sequence is required for
59 * - Navi12 and onwards
61 static void psp_check_pmfw_centralized_cstate_management(struct psp_context *psp)
63 struct amdgpu_device *adev = psp->adev;
65 psp->pmfw_centralized_cstate_management = false;
67 if (amdgpu_sriov_vf(adev))
70 if (adev->flags & AMD_IS_APU)
73 if ((adev->asic_type == CHIP_ARCTURUS) ||
74 (adev->asic_type >= CHIP_NAVI12))
75 psp->pmfw_centralized_cstate_management = true;
78 static int psp_early_init(void *handle)
80 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
81 struct psp_context *psp = &adev->psp;
83 switch (adev->asic_type) {
86 psp_v3_1_set_psp_funcs(psp);
87 psp->autoload_supported = false;
90 psp_v10_0_set_psp_funcs(psp);
91 psp->autoload_supported = false;
95 psp_v11_0_set_psp_funcs(psp);
96 psp->autoload_supported = false;
101 psp_v11_0_set_psp_funcs(psp);
102 psp->autoload_supported = true;
105 psp_v12_0_set_psp_funcs(psp);
113 psp_check_pmfw_centralized_cstate_management(psp);
118 static int psp_sw_init(void *handle)
120 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
121 struct psp_context *psp = &adev->psp;
124 ret = psp_init_microcode(psp);
126 DRM_ERROR("Failed to load psp firmware!\n");
130 ret = psp_mem_training_init(psp);
132 DRM_ERROR("Failed to initialize memory training!\n");
135 ret = psp_mem_training(psp, PSP_MEM_TRAIN_COLD_BOOT);
137 DRM_ERROR("Failed to process memory training!\n");
141 if (adev->asic_type == CHIP_NAVI10) {
142 ret= psp_sysfs_init(adev);
151 static int psp_sw_fini(void *handle)
153 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
155 psp_mem_training_fini(&adev->psp);
156 release_firmware(adev->psp.sos_fw);
157 adev->psp.sos_fw = NULL;
158 release_firmware(adev->psp.asd_fw);
159 adev->psp.asd_fw = NULL;
160 if (adev->psp.ta_fw) {
161 release_firmware(adev->psp.ta_fw);
162 adev->psp.ta_fw = NULL;
165 if (adev->asic_type == CHIP_NAVI10)
166 psp_sysfs_fini(adev);
171 int psp_wait_for(struct psp_context *psp, uint32_t reg_index,
172 uint32_t reg_val, uint32_t mask, bool check_changed)
176 struct amdgpu_device *adev = psp->adev;
178 for (i = 0; i < adev->usec_timeout; i++) {
179 val = RREG32(reg_index);
184 if ((val & mask) == reg_val)
194 psp_cmd_submit_buf(struct psp_context *psp,
195 struct amdgpu_firmware_info *ucode,
196 struct psp_gfx_cmd_resp *cmd, uint64_t fence_mc_addr)
201 bool ras_intr = false;
202 bool skip_unsupport = false;
204 mutex_lock(&psp->mutex);
206 memset(psp->cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE);
208 memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp));
210 index = atomic_inc_return(&psp->fence_value);
211 ret = psp_ring_cmd_submit(psp, psp->cmd_buf_mc_addr, fence_mc_addr, index);
213 atomic_dec(&psp->fence_value);
214 mutex_unlock(&psp->mutex);
218 amdgpu_asic_invalidate_hdp(psp->adev, NULL);
219 while (*((unsigned int *)psp->fence_buf) != index) {
223 * Shouldn't wait for timeout when err_event_athub occurs,
224 * because gpu reset thread triggered and lock resource should
225 * be released for psp resume sequence.
227 ras_intr = amdgpu_ras_intr_triggered();
231 amdgpu_asic_invalidate_hdp(psp->adev, NULL);
234 /* We allow TEE_ERROR_NOT_SUPPORTED for VMR command in SRIOV */
235 skip_unsupport = (psp->cmd_buf_mem->resp.status == 0xffff000a) && amdgpu_sriov_vf(psp->adev);
237 /* In some cases, psp response status is not 0 even there is no
238 * problem while the command is submitted. Some version of PSP FW
239 * doesn't write 0 to that field.
240 * So here we would like to only print a warning instead of an error
241 * during psp initialization to avoid breaking hw_init and it doesn't
244 if (!skip_unsupport && (psp->cmd_buf_mem->resp.status || !timeout) && !ras_intr) {
246 DRM_WARN("failed to load ucode id (%d) ",
248 DRM_WARN("psp command (0x%X) failed and response status is (0x%X)\n",
249 psp->cmd_buf_mem->cmd_id,
250 psp->cmd_buf_mem->resp.status);
252 mutex_unlock(&psp->mutex);
257 /* get xGMI session id from response buffer */
258 cmd->resp.session_id = psp->cmd_buf_mem->resp.session_id;
261 ucode->tmr_mc_addr_lo = psp->cmd_buf_mem->resp.fw_addr_lo;
262 ucode->tmr_mc_addr_hi = psp->cmd_buf_mem->resp.fw_addr_hi;
264 mutex_unlock(&psp->mutex);
269 static void psp_prep_tmr_cmd_buf(struct psp_context *psp,
270 struct psp_gfx_cmd_resp *cmd,
271 uint64_t tmr_mc, uint32_t size)
273 if (amdgpu_sriov_vf(psp->adev))
274 cmd->cmd_id = GFX_CMD_ID_SETUP_VMR;
276 cmd->cmd_id = GFX_CMD_ID_SETUP_TMR;
277 cmd->cmd.cmd_setup_tmr.buf_phy_addr_lo = lower_32_bits(tmr_mc);
278 cmd->cmd.cmd_setup_tmr.buf_phy_addr_hi = upper_32_bits(tmr_mc);
279 cmd->cmd.cmd_setup_tmr.buf_size = size;
282 static void psp_prep_load_toc_cmd_buf(struct psp_gfx_cmd_resp *cmd,
283 uint64_t pri_buf_mc, uint32_t size)
285 cmd->cmd_id = GFX_CMD_ID_LOAD_TOC;
286 cmd->cmd.cmd_load_toc.toc_phy_addr_lo = lower_32_bits(pri_buf_mc);
287 cmd->cmd.cmd_load_toc.toc_phy_addr_hi = upper_32_bits(pri_buf_mc);
288 cmd->cmd.cmd_load_toc.toc_size = size;
291 /* Issue LOAD TOC cmd to PSP to part toc and calculate tmr size needed */
292 static int psp_load_toc(struct psp_context *psp,
296 struct psp_gfx_cmd_resp *cmd;
298 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
301 /* Copy toc to psp firmware private buffer */
302 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
303 memcpy(psp->fw_pri_buf, psp->toc_start_addr, psp->toc_bin_size);
305 psp_prep_load_toc_cmd_buf(cmd, psp->fw_pri_mc_addr, psp->toc_bin_size);
307 ret = psp_cmd_submit_buf(psp, NULL, cmd,
308 psp->fence_buf_mc_addr);
310 *tmr_size = psp->cmd_buf_mem->resp.tmr_size;
315 /* Set up Trusted Memory Region */
316 static int psp_tmr_init(struct psp_context *psp)
324 * According to HW engineer, they prefer the TMR address be "naturally
325 * aligned" , e.g. the start address be an integer divide of TMR size.
327 * Note: this memory need be reserved till the driver
330 tmr_size = PSP_TMR_SIZE;
332 /* For ASICs support RLC autoload, psp will parse the toc
333 * and calculate the total size of TMR needed */
334 if (!amdgpu_sriov_vf(psp->adev) &&
335 psp->toc_start_addr &&
338 ret = psp_load_toc(psp, &tmr_size);
340 DRM_ERROR("Failed to load toc\n");
345 pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL;
346 ret = amdgpu_bo_create_kernel(psp->adev, tmr_size, PSP_TMR_SIZE,
347 AMDGPU_GEM_DOMAIN_VRAM,
348 &psp->tmr_bo, &psp->tmr_mc_addr, pptr);
353 static int psp_tmr_load(struct psp_context *psp)
356 struct psp_gfx_cmd_resp *cmd;
358 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
362 psp_prep_tmr_cmd_buf(psp, cmd, psp->tmr_mc_addr,
363 amdgpu_bo_size(psp->tmr_bo));
364 DRM_INFO("reserve 0x%lx from 0x%llx for PSP TMR\n",
365 amdgpu_bo_size(psp->tmr_bo), psp->tmr_mc_addr);
367 ret = psp_cmd_submit_buf(psp, NULL, cmd,
368 psp->fence_buf_mc_addr);
375 static void psp_prep_tmr_unload_cmd_buf(struct psp_context *psp,
376 struct psp_gfx_cmd_resp *cmd)
378 if (amdgpu_sriov_vf(psp->adev))
379 cmd->cmd_id = GFX_CMD_ID_DESTROY_VMR;
381 cmd->cmd_id = GFX_CMD_ID_DESTROY_TMR;
384 static int psp_tmr_unload(struct psp_context *psp)
387 struct psp_gfx_cmd_resp *cmd;
389 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
393 psp_prep_tmr_unload_cmd_buf(psp, cmd);
394 DRM_INFO("free PSP TMR buffer\n");
396 ret = psp_cmd_submit_buf(psp, NULL, cmd,
397 psp->fence_buf_mc_addr);
404 static int psp_tmr_terminate(struct psp_context *psp)
410 ret = psp_tmr_unload(psp);
414 /* free TMR memory buffer */
415 pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL;
416 amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, pptr);
421 static void psp_prep_asd_load_cmd_buf(struct psp_gfx_cmd_resp *cmd,
422 uint64_t asd_mc, uint32_t size)
424 cmd->cmd_id = GFX_CMD_ID_LOAD_ASD;
425 cmd->cmd.cmd_load_ta.app_phy_addr_lo = lower_32_bits(asd_mc);
426 cmd->cmd.cmd_load_ta.app_phy_addr_hi = upper_32_bits(asd_mc);
427 cmd->cmd.cmd_load_ta.app_len = size;
429 cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_lo = 0;
430 cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_hi = 0;
431 cmd->cmd.cmd_load_ta.cmd_buf_len = 0;
434 static int psp_asd_load(struct psp_context *psp)
437 struct psp_gfx_cmd_resp *cmd;
439 /* If PSP version doesn't match ASD version, asd loading will be failed.
440 * add workaround to bypass it for sriov now.
441 * TODO: add version check to make it common
443 if (amdgpu_sriov_vf(psp->adev))
446 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
450 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
451 memcpy(psp->fw_pri_buf, psp->asd_start_addr, psp->asd_ucode_size);
453 psp_prep_asd_load_cmd_buf(cmd, psp->fw_pri_mc_addr,
454 psp->asd_ucode_size);
456 ret = psp_cmd_submit_buf(psp, NULL, cmd,
457 psp->fence_buf_mc_addr);
459 psp->asd_context.asd_initialized = true;
460 psp->asd_context.session_id = cmd->resp.session_id;
468 static void psp_prep_ta_unload_cmd_buf(struct psp_gfx_cmd_resp *cmd,
471 cmd->cmd_id = GFX_CMD_ID_UNLOAD_TA;
472 cmd->cmd.cmd_unload_ta.session_id = session_id;
475 static int psp_asd_unload(struct psp_context *psp)
478 struct psp_gfx_cmd_resp *cmd;
480 if (amdgpu_sriov_vf(psp->adev))
483 if (!psp->asd_context.asd_initialized)
486 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
490 psp_prep_ta_unload_cmd_buf(cmd, psp->asd_context.session_id);
492 ret = psp_cmd_submit_buf(psp, NULL, cmd,
493 psp->fence_buf_mc_addr);
495 psp->asd_context.asd_initialized = false;
502 static void psp_prep_reg_prog_cmd_buf(struct psp_gfx_cmd_resp *cmd,
503 uint32_t id, uint32_t value)
505 cmd->cmd_id = GFX_CMD_ID_PROG_REG;
506 cmd->cmd.cmd_setup_reg_prog.reg_value = value;
507 cmd->cmd.cmd_setup_reg_prog.reg_id = id;
510 int psp_reg_program(struct psp_context *psp, enum psp_reg_prog_id reg,
513 struct psp_gfx_cmd_resp *cmd = NULL;
516 if (reg >= PSP_REG_LAST)
519 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
523 psp_prep_reg_prog_cmd_buf(cmd, reg, value);
524 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
530 static void psp_prep_ta_load_cmd_buf(struct psp_gfx_cmd_resp *cmd,
532 uint32_t ta_bin_size,
533 uint64_t ta_shared_mc,
534 uint32_t ta_shared_size)
536 cmd->cmd_id = GFX_CMD_ID_LOAD_TA;
537 cmd->cmd.cmd_load_ta.app_phy_addr_lo = lower_32_bits(ta_bin_mc);
538 cmd->cmd.cmd_load_ta.app_phy_addr_hi = upper_32_bits(ta_bin_mc);
539 cmd->cmd.cmd_load_ta.app_len = ta_bin_size;
541 cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_lo = lower_32_bits(ta_shared_mc);
542 cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_hi = upper_32_bits(ta_shared_mc);
543 cmd->cmd.cmd_load_ta.cmd_buf_len = ta_shared_size;
546 static int psp_xgmi_init_shared_buf(struct psp_context *psp)
551 * Allocate 16k memory aligned to 4k from Frame Buffer (local
552 * physical) for xgmi ta <-> Driver
554 ret = amdgpu_bo_create_kernel(psp->adev, PSP_XGMI_SHARED_MEM_SIZE,
555 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
556 &psp->xgmi_context.xgmi_shared_bo,
557 &psp->xgmi_context.xgmi_shared_mc_addr,
558 &psp->xgmi_context.xgmi_shared_buf);
563 static void psp_prep_ta_invoke_cmd_buf(struct psp_gfx_cmd_resp *cmd,
567 cmd->cmd_id = GFX_CMD_ID_INVOKE_CMD;
568 cmd->cmd.cmd_invoke_cmd.session_id = session_id;
569 cmd->cmd.cmd_invoke_cmd.ta_cmd_id = ta_cmd_id;
572 int psp_ta_invoke(struct psp_context *psp,
577 struct psp_gfx_cmd_resp *cmd;
579 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
583 psp_prep_ta_invoke_cmd_buf(cmd, ta_cmd_id, session_id);
585 ret = psp_cmd_submit_buf(psp, NULL, cmd,
586 psp->fence_buf_mc_addr);
593 static int psp_xgmi_load(struct psp_context *psp)
596 struct psp_gfx_cmd_resp *cmd;
599 * TODO: bypass the loading in sriov for now
602 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
606 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
607 memcpy(psp->fw_pri_buf, psp->ta_xgmi_start_addr, psp->ta_xgmi_ucode_size);
609 psp_prep_ta_load_cmd_buf(cmd,
611 psp->ta_xgmi_ucode_size,
612 psp->xgmi_context.xgmi_shared_mc_addr,
613 PSP_XGMI_SHARED_MEM_SIZE);
615 ret = psp_cmd_submit_buf(psp, NULL, cmd,
616 psp->fence_buf_mc_addr);
619 psp->xgmi_context.initialized = 1;
620 psp->xgmi_context.session_id = cmd->resp.session_id;
628 static int psp_xgmi_unload(struct psp_context *psp)
631 struct psp_gfx_cmd_resp *cmd;
632 struct amdgpu_device *adev = psp->adev;
634 /* XGMI TA unload currently is not supported on Arcturus */
635 if (adev->asic_type == CHIP_ARCTURUS)
639 * TODO: bypass the unloading in sriov for now
642 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
646 psp_prep_ta_unload_cmd_buf(cmd, psp->xgmi_context.session_id);
648 ret = psp_cmd_submit_buf(psp, NULL, cmd,
649 psp->fence_buf_mc_addr);
656 int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
658 return psp_ta_invoke(psp, ta_cmd_id, psp->xgmi_context.session_id);
661 int psp_xgmi_terminate(struct psp_context *psp)
665 if (!psp->xgmi_context.initialized)
668 ret = psp_xgmi_unload(psp);
672 psp->xgmi_context.initialized = 0;
674 /* free xgmi shared memory */
675 amdgpu_bo_free_kernel(&psp->xgmi_context.xgmi_shared_bo,
676 &psp->xgmi_context.xgmi_shared_mc_addr,
677 &psp->xgmi_context.xgmi_shared_buf);
682 int psp_xgmi_initialize(struct psp_context *psp)
684 struct ta_xgmi_shared_memory *xgmi_cmd;
687 if (!psp->adev->psp.ta_fw ||
688 !psp->adev->psp.ta_xgmi_ucode_size ||
689 !psp->adev->psp.ta_xgmi_start_addr)
692 if (!psp->xgmi_context.initialized) {
693 ret = psp_xgmi_init_shared_buf(psp);
699 ret = psp_xgmi_load(psp);
703 /* Initialize XGMI session */
704 xgmi_cmd = (struct ta_xgmi_shared_memory *)(psp->xgmi_context.xgmi_shared_buf);
705 memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
706 xgmi_cmd->cmd_id = TA_COMMAND_XGMI__INITIALIZE;
708 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
713 int psp_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id)
715 struct ta_xgmi_shared_memory *xgmi_cmd;
718 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
719 memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
721 xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_HIVE_ID;
723 /* Invoke xgmi ta to get hive id */
724 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
728 *hive_id = xgmi_cmd->xgmi_out_message.get_hive_id.hive_id;
733 int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id)
735 struct ta_xgmi_shared_memory *xgmi_cmd;
738 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
739 memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
741 xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_NODE_ID;
743 /* Invoke xgmi ta to get the node id */
744 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
748 *node_id = xgmi_cmd->xgmi_out_message.get_node_id.node_id;
753 int psp_xgmi_get_topology_info(struct psp_context *psp,
755 struct psp_xgmi_topology_info *topology)
757 struct ta_xgmi_shared_memory *xgmi_cmd;
758 struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
759 struct ta_xgmi_cmd_get_topology_info_output *topology_info_output;
763 if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
766 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
767 memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
769 /* Fill in the shared memory with topology information as input */
770 topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
771 xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO;
772 topology_info_input->num_nodes = number_devices;
774 for (i = 0; i < topology_info_input->num_nodes; i++) {
775 topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
776 topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
777 topology_info_input->nodes[i].is_sharing_enabled = topology->nodes[i].is_sharing_enabled;
778 topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
781 /* Invoke xgmi ta to get the topology information */
782 ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO);
786 /* Read the output topology information from the shared memory */
787 topology_info_output = &xgmi_cmd->xgmi_out_message.get_topology_info;
788 topology->num_nodes = xgmi_cmd->xgmi_out_message.get_topology_info.num_nodes;
789 for (i = 0; i < topology->num_nodes; i++) {
790 topology->nodes[i].node_id = topology_info_output->nodes[i].node_id;
791 topology->nodes[i].num_hops = topology_info_output->nodes[i].num_hops;
792 topology->nodes[i].is_sharing_enabled = topology_info_output->nodes[i].is_sharing_enabled;
793 topology->nodes[i].sdma_engine = topology_info_output->nodes[i].sdma_engine;
799 int psp_xgmi_set_topology_info(struct psp_context *psp,
801 struct psp_xgmi_topology_info *topology)
803 struct ta_xgmi_shared_memory *xgmi_cmd;
804 struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
807 if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
810 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
811 memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
813 topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
814 xgmi_cmd->cmd_id = TA_COMMAND_XGMI__SET_TOPOLOGY_INFO;
815 topology_info_input->num_nodes = number_devices;
817 for (i = 0; i < topology_info_input->num_nodes; i++) {
818 topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
819 topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
820 topology_info_input->nodes[i].is_sharing_enabled = 1;
821 topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
824 /* Invoke xgmi ta to set topology information */
825 return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO);
829 static int psp_ras_init_shared_buf(struct psp_context *psp)
834 * Allocate 16k memory aligned to 4k from Frame Buffer (local
835 * physical) for ras ta <-> Driver
837 ret = amdgpu_bo_create_kernel(psp->adev, PSP_RAS_SHARED_MEM_SIZE,
838 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
839 &psp->ras.ras_shared_bo,
840 &psp->ras.ras_shared_mc_addr,
841 &psp->ras.ras_shared_buf);
846 static int psp_ras_load(struct psp_context *psp)
849 struct psp_gfx_cmd_resp *cmd;
852 * TODO: bypass the loading in sriov for now
854 if (amdgpu_sriov_vf(psp->adev))
857 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
861 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
862 memcpy(psp->fw_pri_buf, psp->ta_ras_start_addr, psp->ta_ras_ucode_size);
864 psp_prep_ta_load_cmd_buf(cmd,
866 psp->ta_ras_ucode_size,
867 psp->ras.ras_shared_mc_addr,
868 PSP_RAS_SHARED_MEM_SIZE);
870 ret = psp_cmd_submit_buf(psp, NULL, cmd,
871 psp->fence_buf_mc_addr);
874 psp->ras.ras_initialized = true;
875 psp->ras.session_id = cmd->resp.session_id;
883 static int psp_ras_unload(struct psp_context *psp)
886 struct psp_gfx_cmd_resp *cmd;
889 * TODO: bypass the unloading in sriov for now
891 if (amdgpu_sriov_vf(psp->adev))
894 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
898 psp_prep_ta_unload_cmd_buf(cmd, psp->ras.session_id);
900 ret = psp_cmd_submit_buf(psp, NULL, cmd,
901 psp->fence_buf_mc_addr);
908 int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
910 struct ta_ras_shared_memory *ras_cmd;
913 ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
916 * TODO: bypass the loading in sriov for now
918 if (amdgpu_sriov_vf(psp->adev))
921 ret = psp_ta_invoke(psp, ta_cmd_id, psp->ras.session_id);
923 if (amdgpu_ras_intr_triggered())
926 if (ras_cmd->if_version > RAS_TA_HOST_IF_VER)
928 DRM_WARN("RAS: Unsupported Interface");
933 if (ras_cmd->ras_out_message.flags.err_inject_switch_disable_flag) {
934 dev_warn(psp->adev->dev, "ECC switch disabled\n");
936 ras_cmd->ras_status = TA_RAS_STATUS__ERROR_RAS_NOT_AVAILABLE;
938 else if (ras_cmd->ras_out_message.flags.reg_access_failure_flag)
939 dev_warn(psp->adev->dev,
940 "RAS internal register access blocked\n");
946 int psp_ras_enable_features(struct psp_context *psp,
947 union ta_ras_cmd_input *info, bool enable)
949 struct ta_ras_shared_memory *ras_cmd;
952 if (!psp->ras.ras_initialized)
955 ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
956 memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));
959 ras_cmd->cmd_id = TA_RAS_COMMAND__ENABLE_FEATURES;
961 ras_cmd->cmd_id = TA_RAS_COMMAND__DISABLE_FEATURES;
963 ras_cmd->ras_in_message = *info;
965 ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
969 return ras_cmd->ras_status;
972 static int psp_ras_terminate(struct psp_context *psp)
977 * TODO: bypass the terminate in sriov for now
979 if (amdgpu_sriov_vf(psp->adev))
982 if (!psp->ras.ras_initialized)
985 ret = psp_ras_unload(psp);
989 psp->ras.ras_initialized = false;
991 /* free ras shared memory */
992 amdgpu_bo_free_kernel(&psp->ras.ras_shared_bo,
993 &psp->ras.ras_shared_mc_addr,
994 &psp->ras.ras_shared_buf);
999 static int psp_ras_initialize(struct psp_context *psp)
1004 * TODO: bypass the initialize in sriov for now
1006 if (amdgpu_sriov_vf(psp->adev))
1009 if (!psp->adev->psp.ta_ras_ucode_size ||
1010 !psp->adev->psp.ta_ras_start_addr) {
1011 dev_info(psp->adev->dev, "RAS: optional ras ta ucode is not available\n");
1015 if (!psp->ras.ras_initialized) {
1016 ret = psp_ras_init_shared_buf(psp);
1021 ret = psp_ras_load(psp);
1028 int psp_ras_trigger_error(struct psp_context *psp,
1029 struct ta_ras_trigger_error_input *info)
1031 struct ta_ras_shared_memory *ras_cmd;
1034 if (!psp->ras.ras_initialized)
1037 ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
1038 memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));
1040 ras_cmd->cmd_id = TA_RAS_COMMAND__TRIGGER_ERROR;
1041 ras_cmd->ras_in_message.trigger_error = *info;
1043 ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
1047 /* If err_event_athub occurs error inject was successful, however
1048 return status from TA is no long reliable */
1049 if (amdgpu_ras_intr_triggered())
1052 return ras_cmd->ras_status;
1057 static int psp_hdcp_init_shared_buf(struct psp_context *psp)
1062 * Allocate 16k memory aligned to 4k from Frame Buffer (local
1063 * physical) for hdcp ta <-> Driver
1065 ret = amdgpu_bo_create_kernel(psp->adev, PSP_HDCP_SHARED_MEM_SIZE,
1066 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
1067 &psp->hdcp_context.hdcp_shared_bo,
1068 &psp->hdcp_context.hdcp_shared_mc_addr,
1069 &psp->hdcp_context.hdcp_shared_buf);
1074 static int psp_hdcp_load(struct psp_context *psp)
1077 struct psp_gfx_cmd_resp *cmd;
1080 * TODO: bypass the loading in sriov for now
1082 if (amdgpu_sriov_vf(psp->adev))
1085 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
1089 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
1090 memcpy(psp->fw_pri_buf, psp->ta_hdcp_start_addr,
1091 psp->ta_hdcp_ucode_size);
1093 psp_prep_ta_load_cmd_buf(cmd,
1094 psp->fw_pri_mc_addr,
1095 psp->ta_hdcp_ucode_size,
1096 psp->hdcp_context.hdcp_shared_mc_addr,
1097 PSP_HDCP_SHARED_MEM_SIZE);
1099 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
1102 psp->hdcp_context.hdcp_initialized = true;
1103 psp->hdcp_context.session_id = cmd->resp.session_id;
1104 mutex_init(&psp->hdcp_context.mutex);
1111 static int psp_hdcp_initialize(struct psp_context *psp)
1116 * TODO: bypass the initialize in sriov for now
1118 if (amdgpu_sriov_vf(psp->adev))
1121 if (!psp->adev->psp.ta_hdcp_ucode_size ||
1122 !psp->adev->psp.ta_hdcp_start_addr) {
1123 dev_info(psp->adev->dev, "HDCP: optional hdcp ta ucode is not available\n");
1127 if (!psp->hdcp_context.hdcp_initialized) {
1128 ret = psp_hdcp_init_shared_buf(psp);
1133 ret = psp_hdcp_load(psp);
1140 static int psp_hdcp_unload(struct psp_context *psp)
1143 struct psp_gfx_cmd_resp *cmd;
1146 * TODO: bypass the unloading in sriov for now
1148 if (amdgpu_sriov_vf(psp->adev))
1151 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
1155 psp_prep_ta_unload_cmd_buf(cmd, psp->hdcp_context.session_id);
1157 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
1164 int psp_hdcp_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
1167 * TODO: bypass the loading in sriov for now
1169 if (amdgpu_sriov_vf(psp->adev))
1172 return psp_ta_invoke(psp, ta_cmd_id, psp->hdcp_context.session_id);
1175 static int psp_hdcp_terminate(struct psp_context *psp)
1180 * TODO: bypass the terminate in sriov for now
1182 if (amdgpu_sriov_vf(psp->adev))
1185 if (!psp->hdcp_context.hdcp_initialized)
1188 ret = psp_hdcp_unload(psp);
1192 psp->hdcp_context.hdcp_initialized = false;
1194 /* free hdcp shared memory */
1195 amdgpu_bo_free_kernel(&psp->hdcp_context.hdcp_shared_bo,
1196 &psp->hdcp_context.hdcp_shared_mc_addr,
1197 &psp->hdcp_context.hdcp_shared_buf);
1204 static int psp_dtm_init_shared_buf(struct psp_context *psp)
1209 * Allocate 16k memory aligned to 4k from Frame Buffer (local
1210 * physical) for dtm ta <-> Driver
1212 ret = amdgpu_bo_create_kernel(psp->adev, PSP_DTM_SHARED_MEM_SIZE,
1213 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
1214 &psp->dtm_context.dtm_shared_bo,
1215 &psp->dtm_context.dtm_shared_mc_addr,
1216 &psp->dtm_context.dtm_shared_buf);
1221 static int psp_dtm_load(struct psp_context *psp)
1224 struct psp_gfx_cmd_resp *cmd;
1227 * TODO: bypass the loading in sriov for now
1229 if (amdgpu_sriov_vf(psp->adev))
1232 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
1236 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
1237 memcpy(psp->fw_pri_buf, psp->ta_dtm_start_addr, psp->ta_dtm_ucode_size);
1239 psp_prep_ta_load_cmd_buf(cmd,
1240 psp->fw_pri_mc_addr,
1241 psp->ta_dtm_ucode_size,
1242 psp->dtm_context.dtm_shared_mc_addr,
1243 PSP_DTM_SHARED_MEM_SIZE);
1245 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
1248 psp->dtm_context.dtm_initialized = true;
1249 psp->dtm_context.session_id = cmd->resp.session_id;
1250 mutex_init(&psp->dtm_context.mutex);
1258 static int psp_dtm_initialize(struct psp_context *psp)
1263 * TODO: bypass the initialize in sriov for now
1265 if (amdgpu_sriov_vf(psp->adev))
1268 if (!psp->adev->psp.ta_dtm_ucode_size ||
1269 !psp->adev->psp.ta_dtm_start_addr) {
1270 dev_info(psp->adev->dev, "DTM: optional dtm ta ucode is not available\n");
1274 if (!psp->dtm_context.dtm_initialized) {
1275 ret = psp_dtm_init_shared_buf(psp);
1280 ret = psp_dtm_load(psp);
1287 static int psp_dtm_unload(struct psp_context *psp)
1290 struct psp_gfx_cmd_resp *cmd;
1293 * TODO: bypass the unloading in sriov for now
1295 if (amdgpu_sriov_vf(psp->adev))
1298 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
1302 psp_prep_ta_unload_cmd_buf(cmd, psp->dtm_context.session_id);
1304 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
1311 int psp_dtm_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
1314 * TODO: bypass the loading in sriov for now
1316 if (amdgpu_sriov_vf(psp->adev))
1319 return psp_ta_invoke(psp, ta_cmd_id, psp->dtm_context.session_id);
1322 static int psp_dtm_terminate(struct psp_context *psp)
1327 * TODO: bypass the terminate in sriov for now
1329 if (amdgpu_sriov_vf(psp->adev))
1332 if (!psp->dtm_context.dtm_initialized)
1335 ret = psp_dtm_unload(psp);
1339 psp->dtm_context.dtm_initialized = false;
1341 /* free hdcp shared memory */
1342 amdgpu_bo_free_kernel(&psp->dtm_context.dtm_shared_bo,
1343 &psp->dtm_context.dtm_shared_mc_addr,
1344 &psp->dtm_context.dtm_shared_buf);
1350 static int psp_hw_start(struct psp_context *psp)
1352 struct amdgpu_device *adev = psp->adev;
1355 if (!amdgpu_sriov_vf(adev)) {
1356 if (psp->kdb_bin_size &&
1357 (psp->funcs->bootloader_load_kdb != NULL)) {
1358 ret = psp_bootloader_load_kdb(psp);
1360 DRM_ERROR("PSP load kdb failed!\n");
1365 ret = psp_bootloader_load_sysdrv(psp);
1367 DRM_ERROR("PSP load sysdrv failed!\n");
1371 ret = psp_bootloader_load_sos(psp);
1373 DRM_ERROR("PSP load sos failed!\n");
1378 ret = psp_ring_create(psp, PSP_RING_TYPE__KM);
1380 DRM_ERROR("PSP create ring failed!\n");
1384 ret = psp_tmr_init(psp);
1386 DRM_ERROR("PSP tmr init failed!\n");
1391 * For ASICs with DF Cstate management centralized
1392 * to PMFW, TMR setup should be performed after PMFW
1393 * loaded and before other non-psp firmware loaded.
1395 if (psp->pmfw_centralized_cstate_management) {
1396 ret = psp_load_smu_fw(psp);
1401 ret = psp_tmr_load(psp);
1403 DRM_ERROR("PSP load tmr failed!\n");
1410 static int psp_get_fw_type(struct amdgpu_firmware_info *ucode,
1411 enum psp_gfx_fw_type *type)
1413 switch (ucode->ucode_id) {
1414 case AMDGPU_UCODE_ID_SDMA0:
1415 *type = GFX_FW_TYPE_SDMA0;
1417 case AMDGPU_UCODE_ID_SDMA1:
1418 *type = GFX_FW_TYPE_SDMA1;
1420 case AMDGPU_UCODE_ID_SDMA2:
1421 *type = GFX_FW_TYPE_SDMA2;
1423 case AMDGPU_UCODE_ID_SDMA3:
1424 *type = GFX_FW_TYPE_SDMA3;
1426 case AMDGPU_UCODE_ID_SDMA4:
1427 *type = GFX_FW_TYPE_SDMA4;
1429 case AMDGPU_UCODE_ID_SDMA5:
1430 *type = GFX_FW_TYPE_SDMA5;
1432 case AMDGPU_UCODE_ID_SDMA6:
1433 *type = GFX_FW_TYPE_SDMA6;
1435 case AMDGPU_UCODE_ID_SDMA7:
1436 *type = GFX_FW_TYPE_SDMA7;
1438 case AMDGPU_UCODE_ID_CP_CE:
1439 *type = GFX_FW_TYPE_CP_CE;
1441 case AMDGPU_UCODE_ID_CP_PFP:
1442 *type = GFX_FW_TYPE_CP_PFP;
1444 case AMDGPU_UCODE_ID_CP_ME:
1445 *type = GFX_FW_TYPE_CP_ME;
1447 case AMDGPU_UCODE_ID_CP_MEC1:
1448 *type = GFX_FW_TYPE_CP_MEC;
1450 case AMDGPU_UCODE_ID_CP_MEC1_JT:
1451 *type = GFX_FW_TYPE_CP_MEC_ME1;
1453 case AMDGPU_UCODE_ID_CP_MEC2:
1454 *type = GFX_FW_TYPE_CP_MEC;
1456 case AMDGPU_UCODE_ID_CP_MEC2_JT:
1457 *type = GFX_FW_TYPE_CP_MEC_ME2;
1459 case AMDGPU_UCODE_ID_RLC_G:
1460 *type = GFX_FW_TYPE_RLC_G;
1462 case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL:
1463 *type = GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_CNTL;
1465 case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM:
1466 *type = GFX_FW_TYPE_RLC_RESTORE_LIST_GPM_MEM;
1468 case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM:
1469 *type = GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_MEM;
1471 case AMDGPU_UCODE_ID_SMC:
1472 *type = GFX_FW_TYPE_SMU;
1474 case AMDGPU_UCODE_ID_UVD:
1475 *type = GFX_FW_TYPE_UVD;
1477 case AMDGPU_UCODE_ID_UVD1:
1478 *type = GFX_FW_TYPE_UVD1;
1480 case AMDGPU_UCODE_ID_VCE:
1481 *type = GFX_FW_TYPE_VCE;
1483 case AMDGPU_UCODE_ID_VCN:
1484 *type = GFX_FW_TYPE_VCN;
1486 case AMDGPU_UCODE_ID_VCN1:
1487 *type = GFX_FW_TYPE_VCN1;
1489 case AMDGPU_UCODE_ID_DMCU_ERAM:
1490 *type = GFX_FW_TYPE_DMCU_ERAM;
1492 case AMDGPU_UCODE_ID_DMCU_INTV:
1493 *type = GFX_FW_TYPE_DMCU_ISR;
1495 case AMDGPU_UCODE_ID_VCN0_RAM:
1496 *type = GFX_FW_TYPE_VCN0_RAM;
1498 case AMDGPU_UCODE_ID_VCN1_RAM:
1499 *type = GFX_FW_TYPE_VCN1_RAM;
1501 case AMDGPU_UCODE_ID_DMCUB:
1502 *type = GFX_FW_TYPE_DMUB;
1504 case AMDGPU_UCODE_ID_MAXIMUM:
1512 static void psp_print_fw_hdr(struct psp_context *psp,
1513 struct amdgpu_firmware_info *ucode)
1515 struct amdgpu_device *adev = psp->adev;
1516 struct common_firmware_header *hdr;
1518 switch (ucode->ucode_id) {
1519 case AMDGPU_UCODE_ID_SDMA0:
1520 case AMDGPU_UCODE_ID_SDMA1:
1521 case AMDGPU_UCODE_ID_SDMA2:
1522 case AMDGPU_UCODE_ID_SDMA3:
1523 case AMDGPU_UCODE_ID_SDMA4:
1524 case AMDGPU_UCODE_ID_SDMA5:
1525 case AMDGPU_UCODE_ID_SDMA6:
1526 case AMDGPU_UCODE_ID_SDMA7:
1527 hdr = (struct common_firmware_header *)
1528 adev->sdma.instance[ucode->ucode_id - AMDGPU_UCODE_ID_SDMA0].fw->data;
1529 amdgpu_ucode_print_sdma_hdr(hdr);
1531 case AMDGPU_UCODE_ID_CP_CE:
1532 hdr = (struct common_firmware_header *)adev->gfx.ce_fw->data;
1533 amdgpu_ucode_print_gfx_hdr(hdr);
1535 case AMDGPU_UCODE_ID_CP_PFP:
1536 hdr = (struct common_firmware_header *)adev->gfx.pfp_fw->data;
1537 amdgpu_ucode_print_gfx_hdr(hdr);
1539 case AMDGPU_UCODE_ID_CP_ME:
1540 hdr = (struct common_firmware_header *)adev->gfx.me_fw->data;
1541 amdgpu_ucode_print_gfx_hdr(hdr);
1543 case AMDGPU_UCODE_ID_CP_MEC1:
1544 hdr = (struct common_firmware_header *)adev->gfx.mec_fw->data;
1545 amdgpu_ucode_print_gfx_hdr(hdr);
1547 case AMDGPU_UCODE_ID_RLC_G:
1548 hdr = (struct common_firmware_header *)adev->gfx.rlc_fw->data;
1549 amdgpu_ucode_print_rlc_hdr(hdr);
1551 case AMDGPU_UCODE_ID_SMC:
1552 hdr = (struct common_firmware_header *)adev->pm.fw->data;
1553 amdgpu_ucode_print_smc_hdr(hdr);
1560 static int psp_prep_load_ip_fw_cmd_buf(struct amdgpu_firmware_info *ucode,
1561 struct psp_gfx_cmd_resp *cmd)
1564 uint64_t fw_mem_mc_addr = ucode->mc_addr;
1566 memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp));
1568 cmd->cmd_id = GFX_CMD_ID_LOAD_IP_FW;
1569 cmd->cmd.cmd_load_ip_fw.fw_phy_addr_lo = lower_32_bits(fw_mem_mc_addr);
1570 cmd->cmd.cmd_load_ip_fw.fw_phy_addr_hi = upper_32_bits(fw_mem_mc_addr);
1571 cmd->cmd.cmd_load_ip_fw.fw_size = ucode->ucode_size;
1573 ret = psp_get_fw_type(ucode, &cmd->cmd.cmd_load_ip_fw.fw_type);
1575 DRM_ERROR("Unknown firmware type\n");
1580 static int psp_execute_np_fw_load(struct psp_context *psp,
1581 struct amdgpu_firmware_info *ucode)
1585 ret = psp_prep_load_ip_fw_cmd_buf(ucode, psp->cmd);
1589 ret = psp_cmd_submit_buf(psp, ucode, psp->cmd,
1590 psp->fence_buf_mc_addr);
1595 static int psp_load_smu_fw(struct psp_context *psp)
1598 struct amdgpu_device* adev = psp->adev;
1599 struct amdgpu_firmware_info *ucode =
1600 &adev->firmware.ucode[AMDGPU_UCODE_ID_SMC];
1601 struct amdgpu_ras *ras = psp->ras.ras;
1603 if (!ucode->fw || amdgpu_sriov_vf(psp->adev))
1607 if (adev->in_gpu_reset && ras && ras->supported) {
1608 ret = amdgpu_dpm_set_mp1_state(adev, PP_MP1_STATE_UNLOAD);
1610 DRM_WARN("Failed to set MP1 state prepare for reload\n");
1614 ret = psp_execute_np_fw_load(psp, ucode);
1617 DRM_ERROR("PSP load smu failed!\n");
1622 static bool fw_load_skip_check(struct psp_context *psp,
1623 struct amdgpu_firmware_info *ucode)
1628 if (ucode->ucode_id == AMDGPU_UCODE_ID_SMC &&
1629 (psp_smu_reload_quirk(psp) ||
1630 psp->autoload_supported ||
1631 psp->pmfw_centralized_cstate_management))
1634 if (amdgpu_sriov_vf(psp->adev) &&
1635 (ucode->ucode_id == AMDGPU_UCODE_ID_SDMA0
1636 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA1
1637 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA2
1638 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA3
1639 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA4
1640 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA5
1641 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA6
1642 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA7
1643 || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_G
1644 || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL
1645 || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM
1646 || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM
1647 || ucode->ucode_id == AMDGPU_UCODE_ID_SMC))
1648 /*skip ucode loading in SRIOV VF */
1651 if (psp->autoload_supported &&
1652 (ucode->ucode_id == AMDGPU_UCODE_ID_CP_MEC1_JT ||
1653 ucode->ucode_id == AMDGPU_UCODE_ID_CP_MEC2_JT))
1654 /* skip mec JT when autoload is enabled */
1660 static int psp_np_fw_load(struct psp_context *psp)
1663 struct amdgpu_firmware_info *ucode;
1664 struct amdgpu_device* adev = psp->adev;
1666 if (psp->autoload_supported &&
1667 !psp->pmfw_centralized_cstate_management) {
1668 ret = psp_load_smu_fw(psp);
1673 for (i = 0; i < adev->firmware.max_ucodes; i++) {
1674 ucode = &adev->firmware.ucode[i];
1676 if (ucode->ucode_id == AMDGPU_UCODE_ID_SMC &&
1677 !fw_load_skip_check(psp, ucode)) {
1678 ret = psp_load_smu_fw(psp);
1684 if (fw_load_skip_check(psp, ucode))
1687 psp_print_fw_hdr(psp, ucode);
1689 ret = psp_execute_np_fw_load(psp, ucode);
1693 /* Start rlc autoload after psp recieved all the gfx firmware */
1694 if (psp->autoload_supported && ucode->ucode_id == (amdgpu_sriov_vf(adev) ?
1695 AMDGPU_UCODE_ID_CP_MEC2 : AMDGPU_UCODE_ID_RLC_G)) {
1696 ret = psp_rlc_autoload_start(psp);
1698 DRM_ERROR("Failed to start rlc autoload\n");
1707 static int psp_load_fw(struct amdgpu_device *adev)
1710 struct psp_context *psp = &adev->psp;
1712 if (amdgpu_sriov_vf(adev) && adev->in_gpu_reset) {
1713 psp_ring_stop(psp, PSP_RING_TYPE__KM); /* should not destroy ring, only stop */
1717 psp->cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
1721 ret = amdgpu_bo_create_kernel(adev, PSP_1_MEG, PSP_1_MEG,
1722 AMDGPU_GEM_DOMAIN_GTT,
1724 &psp->fw_pri_mc_addr,
1729 ret = amdgpu_bo_create_kernel(adev, PSP_FENCE_BUFFER_SIZE, PAGE_SIZE,
1730 AMDGPU_GEM_DOMAIN_VRAM,
1732 &psp->fence_buf_mc_addr,
1737 ret = amdgpu_bo_create_kernel(adev, PSP_CMD_BUFFER_SIZE, PAGE_SIZE,
1738 AMDGPU_GEM_DOMAIN_VRAM,
1739 &psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
1740 (void **)&psp->cmd_buf_mem);
1744 memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE);
1746 ret = psp_ring_init(psp, PSP_RING_TYPE__KM);
1748 DRM_ERROR("PSP ring init failed!\n");
1753 ret = psp_hw_start(psp);
1757 ret = psp_np_fw_load(psp);
1761 ret = psp_asd_load(psp);
1763 DRM_ERROR("PSP load asd failed!\n");
1767 if (psp->adev->psp.ta_fw) {
1768 ret = psp_ras_initialize(psp);
1770 dev_err(psp->adev->dev,
1771 "RAS: Failed to initialize RAS\n");
1773 ret = psp_hdcp_initialize(psp);
1775 dev_err(psp->adev->dev,
1776 "HDCP: Failed to initialize HDCP\n");
1778 ret = psp_dtm_initialize(psp);
1780 dev_err(psp->adev->dev,
1781 "DTM: Failed to initialize DTM\n");
1788 * all cleanup jobs (xgmi terminate, ras terminate,
1789 * ring destroy, cmd/fence/fw buffers destory,
1790 * psp->cmd destory) are delayed to psp_hw_fini
1795 static int psp_hw_init(void *handle)
1798 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1800 mutex_lock(&adev->firmware.mutex);
1802 * This sequence is just used on hw_init only once, no need on
1805 ret = amdgpu_ucode_init_bo(adev);
1809 ret = psp_load_fw(adev);
1811 DRM_ERROR("PSP firmware loading failed\n");
1815 mutex_unlock(&adev->firmware.mutex);
1819 adev->firmware.load_type = AMDGPU_FW_LOAD_DIRECT;
1820 mutex_unlock(&adev->firmware.mutex);
1824 static int psp_hw_fini(void *handle)
1826 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1827 struct psp_context *psp = &adev->psp;
1829 if (psp->adev->psp.ta_fw) {
1830 psp_ras_terminate(psp);
1831 psp_dtm_terminate(psp);
1832 psp_hdcp_terminate(psp);
1835 psp_asd_unload(psp);
1837 psp_tmr_terminate(psp);
1838 psp_ring_destroy(psp, PSP_RING_TYPE__KM);
1840 amdgpu_bo_free_kernel(&psp->fw_pri_bo,
1841 &psp->fw_pri_mc_addr, &psp->fw_pri_buf);
1842 amdgpu_bo_free_kernel(&psp->fence_buf_bo,
1843 &psp->fence_buf_mc_addr, &psp->fence_buf);
1844 amdgpu_bo_free_kernel(&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
1845 (void **)&psp->cmd_buf_mem);
1853 static int psp_suspend(void *handle)
1856 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1857 struct psp_context *psp = &adev->psp;
1859 if (adev->gmc.xgmi.num_physical_nodes > 1 &&
1860 psp->xgmi_context.initialized == 1) {
1861 ret = psp_xgmi_terminate(psp);
1863 DRM_ERROR("Failed to terminate xgmi ta\n");
1868 if (psp->adev->psp.ta_fw) {
1869 ret = psp_ras_terminate(psp);
1871 DRM_ERROR("Failed to terminate ras ta\n");
1874 ret = psp_hdcp_terminate(psp);
1876 DRM_ERROR("Failed to terminate hdcp ta\n");
1879 ret = psp_dtm_terminate(psp);
1881 DRM_ERROR("Failed to terminate dtm ta\n");
1886 ret = psp_asd_unload(psp);
1888 DRM_ERROR("Failed to unload asd\n");
1892 ret = psp_tmr_terminate(psp);
1894 DRM_ERROR("Falied to terminate tmr\n");
1898 ret = psp_ring_stop(psp, PSP_RING_TYPE__KM);
1900 DRM_ERROR("PSP ring stop failed\n");
1907 static int psp_resume(void *handle)
1910 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1911 struct psp_context *psp = &adev->psp;
1913 DRM_INFO("PSP is resuming...\n");
1915 ret = psp_mem_training(psp, PSP_MEM_TRAIN_RESUME);
1917 DRM_ERROR("Failed to process memory training!\n");
1921 mutex_lock(&adev->firmware.mutex);
1923 ret = psp_hw_start(psp);
1927 ret = psp_np_fw_load(psp);
1931 ret = psp_asd_load(psp);
1933 DRM_ERROR("PSP load asd failed!\n");
1937 if (adev->gmc.xgmi.num_physical_nodes > 1) {
1938 ret = psp_xgmi_initialize(psp);
1939 /* Warning the XGMI seesion initialize failure
1940 * Instead of stop driver initialization
1943 dev_err(psp->adev->dev,
1944 "XGMI: Failed to initialize XGMI session\n");
1947 if (psp->adev->psp.ta_fw) {
1948 ret = psp_ras_initialize(psp);
1950 dev_err(psp->adev->dev,
1951 "RAS: Failed to initialize RAS\n");
1953 ret = psp_hdcp_initialize(psp);
1955 dev_err(psp->adev->dev,
1956 "HDCP: Failed to initialize HDCP\n");
1958 ret = psp_dtm_initialize(psp);
1960 dev_err(psp->adev->dev,
1961 "DTM: Failed to initialize DTM\n");
1964 mutex_unlock(&adev->firmware.mutex);
1969 DRM_ERROR("PSP resume failed\n");
1970 mutex_unlock(&adev->firmware.mutex);
1974 int psp_gpu_reset(struct amdgpu_device *adev)
1978 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
1981 mutex_lock(&adev->psp.mutex);
1982 ret = psp_mode1_reset(&adev->psp);
1983 mutex_unlock(&adev->psp.mutex);
1988 int psp_rlc_autoload_start(struct psp_context *psp)
1991 struct psp_gfx_cmd_resp *cmd;
1993 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
1997 cmd->cmd_id = GFX_CMD_ID_AUTOLOAD_RLC;
1999 ret = psp_cmd_submit_buf(psp, NULL, cmd,
2000 psp->fence_buf_mc_addr);
2005 int psp_update_vcn_sram(struct amdgpu_device *adev, int inst_idx,
2006 uint64_t cmd_gpu_addr, int cmd_size)
2008 struct amdgpu_firmware_info ucode = {0};
2010 ucode.ucode_id = inst_idx ? AMDGPU_UCODE_ID_VCN1_RAM :
2011 AMDGPU_UCODE_ID_VCN0_RAM;
2012 ucode.mc_addr = cmd_gpu_addr;
2013 ucode.ucode_size = cmd_size;
2015 return psp_execute_np_fw_load(&adev->psp, &ucode);
2018 int psp_ring_cmd_submit(struct psp_context *psp,
2019 uint64_t cmd_buf_mc_addr,
2020 uint64_t fence_mc_addr,
2023 unsigned int psp_write_ptr_reg = 0;
2024 struct psp_gfx_rb_frame *write_frame;
2025 struct psp_ring *ring = &psp->km_ring;
2026 struct psp_gfx_rb_frame *ring_buffer_start = ring->ring_mem;
2027 struct psp_gfx_rb_frame *ring_buffer_end = ring_buffer_start +
2028 ring->ring_size / sizeof(struct psp_gfx_rb_frame) - 1;
2029 struct amdgpu_device *adev = psp->adev;
2030 uint32_t ring_size_dw = ring->ring_size / 4;
2031 uint32_t rb_frame_size_dw = sizeof(struct psp_gfx_rb_frame) / 4;
2033 /* KM (GPCOM) prepare write pointer */
2034 psp_write_ptr_reg = psp_ring_get_wptr(psp);
2036 /* Update KM RB frame pointer to new frame */
2037 /* write_frame ptr increments by size of rb_frame in bytes */
2038 /* psp_write_ptr_reg increments by size of rb_frame in DWORDs */
2039 if ((psp_write_ptr_reg % ring_size_dw) == 0)
2040 write_frame = ring_buffer_start;
2042 write_frame = ring_buffer_start + (psp_write_ptr_reg / rb_frame_size_dw);
2043 /* Check invalid write_frame ptr address */
2044 if ((write_frame < ring_buffer_start) || (ring_buffer_end < write_frame)) {
2045 DRM_ERROR("ring_buffer_start = %p; ring_buffer_end = %p; write_frame = %p\n",
2046 ring_buffer_start, ring_buffer_end, write_frame);
2047 DRM_ERROR("write_frame is pointing to address out of bounds\n");
2051 /* Initialize KM RB frame */
2052 memset(write_frame, 0, sizeof(struct psp_gfx_rb_frame));
2054 /* Update KM RB frame */
2055 write_frame->cmd_buf_addr_hi = upper_32_bits(cmd_buf_mc_addr);
2056 write_frame->cmd_buf_addr_lo = lower_32_bits(cmd_buf_mc_addr);
2057 write_frame->fence_addr_hi = upper_32_bits(fence_mc_addr);
2058 write_frame->fence_addr_lo = lower_32_bits(fence_mc_addr);
2059 write_frame->fence_value = index;
2060 amdgpu_asic_flush_hdp(adev, NULL);
2062 /* Update the write Pointer in DWORDs */
2063 psp_write_ptr_reg = (psp_write_ptr_reg + rb_frame_size_dw) % ring_size_dw;
2064 psp_ring_set_wptr(psp, psp_write_ptr_reg);
2068 int psp_init_asd_microcode(struct psp_context *psp,
2069 const char *chip_name)
2071 struct amdgpu_device *adev = psp->adev;
2073 const struct psp_firmware_header_v1_0 *asd_hdr;
2077 dev_err(adev->dev, "invalid chip name for asd microcode\n");
2081 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name);
2082 err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
2086 err = amdgpu_ucode_validate(adev->psp.asd_fw);
2090 asd_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data;
2091 adev->psp.asd_fw_version = le32_to_cpu(asd_hdr->header.ucode_version);
2092 adev->psp.asd_feature_version = le32_to_cpu(asd_hdr->ucode_feature_version);
2093 adev->psp.asd_ucode_size = le32_to_cpu(asd_hdr->header.ucode_size_bytes);
2094 adev->psp.asd_start_addr = (uint8_t *)asd_hdr +
2095 le32_to_cpu(asd_hdr->header.ucode_array_offset_bytes);
2098 dev_err(adev->dev, "fail to initialize asd microcode\n");
2099 release_firmware(adev->psp.asd_fw);
2100 adev->psp.asd_fw = NULL;
2104 int psp_init_sos_microcode(struct psp_context *psp,
2105 const char *chip_name)
2107 struct amdgpu_device *adev = psp->adev;
2109 const struct psp_firmware_header_v1_0 *sos_hdr;
2110 const struct psp_firmware_header_v1_1 *sos_hdr_v1_1;
2111 const struct psp_firmware_header_v1_2 *sos_hdr_v1_2;
2115 dev_err(adev->dev, "invalid chip name for sos microcode\n");
2119 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", chip_name);
2120 err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev);
2124 err = amdgpu_ucode_validate(adev->psp.sos_fw);
2128 sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data;
2129 amdgpu_ucode_print_psp_hdr(&sos_hdr->header);
2131 switch (sos_hdr->header.header_version_major) {
2133 adev->psp.sos_fw_version = le32_to_cpu(sos_hdr->header.ucode_version);
2134 adev->psp.sos_feature_version = le32_to_cpu(sos_hdr->ucode_feature_version);
2135 adev->psp.sos_bin_size = le32_to_cpu(sos_hdr->sos_size_bytes);
2136 adev->psp.sys_bin_size = le32_to_cpu(sos_hdr->sos_offset_bytes);
2137 adev->psp.sys_start_addr = (uint8_t *)sos_hdr +
2138 le32_to_cpu(sos_hdr->header.ucode_array_offset_bytes);
2139 adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr +
2140 le32_to_cpu(sos_hdr->sos_offset_bytes);
2141 if (sos_hdr->header.header_version_minor == 1) {
2142 sos_hdr_v1_1 = (const struct psp_firmware_header_v1_1 *)adev->psp.sos_fw->data;
2143 adev->psp.toc_bin_size = le32_to_cpu(sos_hdr_v1_1->toc_size_bytes);
2144 adev->psp.toc_start_addr = (uint8_t *)adev->psp.sys_start_addr +
2145 le32_to_cpu(sos_hdr_v1_1->toc_offset_bytes);
2146 adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_1->kdb_size_bytes);
2147 adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr +
2148 le32_to_cpu(sos_hdr_v1_1->kdb_offset_bytes);
2150 if (sos_hdr->header.header_version_minor == 2) {
2151 sos_hdr_v1_2 = (const struct psp_firmware_header_v1_2 *)adev->psp.sos_fw->data;
2152 adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_2->kdb_size_bytes);
2153 adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr +
2154 le32_to_cpu(sos_hdr_v1_2->kdb_offset_bytes);
2159 "unsupported psp sos firmware\n");
2167 "failed to init sos firmware\n");
2168 release_firmware(adev->psp.sos_fw);
2169 adev->psp.sos_fw = NULL;
2174 static int psp_set_clockgating_state(void *handle,
2175 enum amd_clockgating_state state)
2180 static int psp_set_powergating_state(void *handle,
2181 enum amd_powergating_state state)
2186 static ssize_t psp_usbc_pd_fw_sysfs_read(struct device *dev,
2187 struct device_attribute *attr,
2190 struct drm_device *ddev = dev_get_drvdata(dev);
2191 struct amdgpu_device *adev = ddev->dev_private;
2195 if (!adev->ip_blocks[AMD_IP_BLOCK_TYPE_PSP].status.late_initialized) {
2196 DRM_INFO("PSP block is not ready yet.");
2200 mutex_lock(&adev->psp.mutex);
2201 ret = psp_read_usbc_pd_fw(&adev->psp, &fw_ver);
2202 mutex_unlock(&adev->psp.mutex);
2205 DRM_ERROR("Failed to read USBC PD FW, err = %d", ret);
2209 return snprintf(buf, PAGE_SIZE, "%x\n", fw_ver);
2212 static ssize_t psp_usbc_pd_fw_sysfs_write(struct device *dev,
2213 struct device_attribute *attr,
2217 struct drm_device *ddev = dev_get_drvdata(dev);
2218 struct amdgpu_device *adev = ddev->dev_private;
2220 dma_addr_t dma_addr;
2223 const struct firmware *usbc_pd_fw;
2225 if (!adev->ip_blocks[AMD_IP_BLOCK_TYPE_PSP].status.late_initialized) {
2226 DRM_INFO("PSP block is not ready yet.");
2230 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s", buf);
2231 ret = request_firmware(&usbc_pd_fw, fw_name, adev->dev);
2235 /* We need contiguous physical mem to place the FW for psp to access */
2236 cpu_addr = dma_alloc_coherent(adev->dev, usbc_pd_fw->size, &dma_addr, GFP_KERNEL);
2238 ret = dma_mapping_error(adev->dev, dma_addr);
2242 memcpy_toio(cpu_addr, usbc_pd_fw->data, usbc_pd_fw->size);
2245 * x86 specific workaround.
2246 * Without it the buffer is invisible in PSP.
2248 * TODO Remove once PSP starts snooping CPU cache
2251 clflush_cache_range(cpu_addr, (usbc_pd_fw->size & ~(L1_CACHE_BYTES - 1)));
2254 mutex_lock(&adev->psp.mutex);
2255 ret = psp_load_usbc_pd_fw(&adev->psp, dma_addr);
2256 mutex_unlock(&adev->psp.mutex);
2259 dma_free_coherent(adev->dev, usbc_pd_fw->size, cpu_addr, dma_addr);
2260 release_firmware(usbc_pd_fw);
2264 DRM_ERROR("Failed to load USBC PD FW, err = %d", ret);
2271 static DEVICE_ATTR(usbc_pd_fw, S_IRUGO | S_IWUSR,
2272 psp_usbc_pd_fw_sysfs_read,
2273 psp_usbc_pd_fw_sysfs_write);
2277 const struct amd_ip_funcs psp_ip_funcs = {
2279 .early_init = psp_early_init,
2281 .sw_init = psp_sw_init,
2282 .sw_fini = psp_sw_fini,
2283 .hw_init = psp_hw_init,
2284 .hw_fini = psp_hw_fini,
2285 .suspend = psp_suspend,
2286 .resume = psp_resume,
2288 .check_soft_reset = NULL,
2289 .wait_for_idle = NULL,
2291 .set_clockgating_state = psp_set_clockgating_state,
2292 .set_powergating_state = psp_set_powergating_state,
2295 static int psp_sysfs_init(struct amdgpu_device *adev)
2297 int ret = device_create_file(adev->dev, &dev_attr_usbc_pd_fw);
2300 DRM_ERROR("Failed to create USBC PD FW control file!");
2305 static void psp_sysfs_fini(struct amdgpu_device *adev)
2307 device_remove_file(adev->dev, &dev_attr_usbc_pd_fw);
2310 const struct amdgpu_ip_block_version psp_v3_1_ip_block =
2312 .type = AMD_IP_BLOCK_TYPE_PSP,
2316 .funcs = &psp_ip_funcs,
2319 const struct amdgpu_ip_block_version psp_v10_0_ip_block =
2321 .type = AMD_IP_BLOCK_TYPE_PSP,
2325 .funcs = &psp_ip_funcs,
2328 const struct amdgpu_ip_block_version psp_v11_0_ip_block =
2330 .type = AMD_IP_BLOCK_TYPE_PSP,
2334 .funcs = &psp_ip_funcs,
2337 const struct amdgpu_ip_block_version psp_v12_0_ip_block =
2339 .type = AMD_IP_BLOCK_TYPE_PSP,
2343 .funcs = &psp_ip_funcs,