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_asd_load_cmd_buf(struct psp_gfx_cmd_resp *cmd,
376 uint64_t asd_mc, uint32_t size)
378 cmd->cmd_id = GFX_CMD_ID_LOAD_ASD;
379 cmd->cmd.cmd_load_ta.app_phy_addr_lo = lower_32_bits(asd_mc);
380 cmd->cmd.cmd_load_ta.app_phy_addr_hi = upper_32_bits(asd_mc);
381 cmd->cmd.cmd_load_ta.app_len = size;
383 cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_lo = 0;
384 cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_hi = 0;
385 cmd->cmd.cmd_load_ta.cmd_buf_len = 0;
388 static int psp_asd_load(struct psp_context *psp)
391 struct psp_gfx_cmd_resp *cmd;
393 /* If PSP version doesn't match ASD version, asd loading will be failed.
394 * add workaround to bypass it for sriov now.
395 * TODO: add version check to make it common
397 if (amdgpu_sriov_vf(psp->adev))
400 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
404 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
405 memcpy(psp->fw_pri_buf, psp->asd_start_addr, psp->asd_ucode_size);
407 psp_prep_asd_load_cmd_buf(cmd, psp->fw_pri_mc_addr,
408 psp->asd_ucode_size);
410 ret = psp_cmd_submit_buf(psp, NULL, cmd,
411 psp->fence_buf_mc_addr);
413 psp->asd_context.asd_initialized = true;
414 psp->asd_context.session_id = cmd->resp.session_id;
422 static void psp_prep_ta_unload_cmd_buf(struct psp_gfx_cmd_resp *cmd,
425 cmd->cmd_id = GFX_CMD_ID_UNLOAD_TA;
426 cmd->cmd.cmd_unload_ta.session_id = session_id;
429 static int psp_asd_unload(struct psp_context *psp)
432 struct psp_gfx_cmd_resp *cmd;
434 if (amdgpu_sriov_vf(psp->adev))
437 if (!psp->asd_context.asd_initialized)
440 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
444 psp_prep_ta_unload_cmd_buf(cmd, psp->asd_context.session_id);
446 ret = psp_cmd_submit_buf(psp, NULL, cmd,
447 psp->fence_buf_mc_addr);
449 psp->asd_context.asd_initialized = false;
456 static void psp_prep_reg_prog_cmd_buf(struct psp_gfx_cmd_resp *cmd,
457 uint32_t id, uint32_t value)
459 cmd->cmd_id = GFX_CMD_ID_PROG_REG;
460 cmd->cmd.cmd_setup_reg_prog.reg_value = value;
461 cmd->cmd.cmd_setup_reg_prog.reg_id = id;
464 int psp_reg_program(struct psp_context *psp, enum psp_reg_prog_id reg,
467 struct psp_gfx_cmd_resp *cmd = NULL;
470 if (reg >= PSP_REG_LAST)
473 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
477 psp_prep_reg_prog_cmd_buf(cmd, reg, value);
478 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
484 static void psp_prep_ta_load_cmd_buf(struct psp_gfx_cmd_resp *cmd,
486 uint32_t ta_bin_size,
487 uint64_t ta_shared_mc,
488 uint32_t ta_shared_size)
490 cmd->cmd_id = GFX_CMD_ID_LOAD_TA;
491 cmd->cmd.cmd_load_ta.app_phy_addr_lo = lower_32_bits(ta_bin_mc);
492 cmd->cmd.cmd_load_ta.app_phy_addr_hi = upper_32_bits(ta_bin_mc);
493 cmd->cmd.cmd_load_ta.app_len = ta_bin_size;
495 cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_lo = lower_32_bits(ta_shared_mc);
496 cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_hi = upper_32_bits(ta_shared_mc);
497 cmd->cmd.cmd_load_ta.cmd_buf_len = ta_shared_size;
500 static int psp_xgmi_init_shared_buf(struct psp_context *psp)
505 * Allocate 16k memory aligned to 4k from Frame Buffer (local
506 * physical) for xgmi ta <-> Driver
508 ret = amdgpu_bo_create_kernel(psp->adev, PSP_XGMI_SHARED_MEM_SIZE,
509 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
510 &psp->xgmi_context.xgmi_shared_bo,
511 &psp->xgmi_context.xgmi_shared_mc_addr,
512 &psp->xgmi_context.xgmi_shared_buf);
517 static void psp_prep_ta_invoke_cmd_buf(struct psp_gfx_cmd_resp *cmd,
521 cmd->cmd_id = GFX_CMD_ID_INVOKE_CMD;
522 cmd->cmd.cmd_invoke_cmd.session_id = session_id;
523 cmd->cmd.cmd_invoke_cmd.ta_cmd_id = ta_cmd_id;
526 int psp_ta_invoke(struct psp_context *psp,
531 struct psp_gfx_cmd_resp *cmd;
533 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
537 psp_prep_ta_invoke_cmd_buf(cmd, ta_cmd_id, session_id);
539 ret = psp_cmd_submit_buf(psp, NULL, cmd,
540 psp->fence_buf_mc_addr);
547 static int psp_xgmi_load(struct psp_context *psp)
550 struct psp_gfx_cmd_resp *cmd;
553 * TODO: bypass the loading in sriov for now
556 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
560 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
561 memcpy(psp->fw_pri_buf, psp->ta_xgmi_start_addr, psp->ta_xgmi_ucode_size);
563 psp_prep_ta_load_cmd_buf(cmd,
565 psp->ta_xgmi_ucode_size,
566 psp->xgmi_context.xgmi_shared_mc_addr,
567 PSP_XGMI_SHARED_MEM_SIZE);
569 ret = psp_cmd_submit_buf(psp, NULL, cmd,
570 psp->fence_buf_mc_addr);
573 psp->xgmi_context.initialized = 1;
574 psp->xgmi_context.session_id = cmd->resp.session_id;
582 static int psp_xgmi_unload(struct psp_context *psp)
585 struct psp_gfx_cmd_resp *cmd;
586 struct amdgpu_device *adev = psp->adev;
588 /* XGMI TA unload currently is not supported on Arcturus */
589 if (adev->asic_type == CHIP_ARCTURUS)
593 * TODO: bypass the unloading in sriov for now
596 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
600 psp_prep_ta_unload_cmd_buf(cmd, psp->xgmi_context.session_id);
602 ret = psp_cmd_submit_buf(psp, NULL, cmd,
603 psp->fence_buf_mc_addr);
610 int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
612 return psp_ta_invoke(psp, ta_cmd_id, psp->xgmi_context.session_id);
615 int psp_xgmi_terminate(struct psp_context *psp)
619 if (!psp->xgmi_context.initialized)
622 ret = psp_xgmi_unload(psp);
626 psp->xgmi_context.initialized = 0;
628 /* free xgmi shared memory */
629 amdgpu_bo_free_kernel(&psp->xgmi_context.xgmi_shared_bo,
630 &psp->xgmi_context.xgmi_shared_mc_addr,
631 &psp->xgmi_context.xgmi_shared_buf);
636 int psp_xgmi_initialize(struct psp_context *psp)
638 struct ta_xgmi_shared_memory *xgmi_cmd;
641 if (!psp->adev->psp.ta_fw ||
642 !psp->adev->psp.ta_xgmi_ucode_size ||
643 !psp->adev->psp.ta_xgmi_start_addr)
646 if (!psp->xgmi_context.initialized) {
647 ret = psp_xgmi_init_shared_buf(psp);
653 ret = psp_xgmi_load(psp);
657 /* Initialize XGMI session */
658 xgmi_cmd = (struct ta_xgmi_shared_memory *)(psp->xgmi_context.xgmi_shared_buf);
659 memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
660 xgmi_cmd->cmd_id = TA_COMMAND_XGMI__INITIALIZE;
662 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
667 int psp_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id)
669 struct ta_xgmi_shared_memory *xgmi_cmd;
672 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
673 memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
675 xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_HIVE_ID;
677 /* Invoke xgmi ta to get hive id */
678 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
682 *hive_id = xgmi_cmd->xgmi_out_message.get_hive_id.hive_id;
687 int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id)
689 struct ta_xgmi_shared_memory *xgmi_cmd;
692 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
693 memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
695 xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_NODE_ID;
697 /* Invoke xgmi ta to get the node id */
698 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
702 *node_id = xgmi_cmd->xgmi_out_message.get_node_id.node_id;
707 int psp_xgmi_get_topology_info(struct psp_context *psp,
709 struct psp_xgmi_topology_info *topology)
711 struct ta_xgmi_shared_memory *xgmi_cmd;
712 struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
713 struct ta_xgmi_cmd_get_topology_info_output *topology_info_output;
717 if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
720 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
721 memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
723 /* Fill in the shared memory with topology information as input */
724 topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
725 xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO;
726 topology_info_input->num_nodes = number_devices;
728 for (i = 0; i < topology_info_input->num_nodes; i++) {
729 topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
730 topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
731 topology_info_input->nodes[i].is_sharing_enabled = topology->nodes[i].is_sharing_enabled;
732 topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
735 /* Invoke xgmi ta to get the topology information */
736 ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO);
740 /* Read the output topology information from the shared memory */
741 topology_info_output = &xgmi_cmd->xgmi_out_message.get_topology_info;
742 topology->num_nodes = xgmi_cmd->xgmi_out_message.get_topology_info.num_nodes;
743 for (i = 0; i < topology->num_nodes; i++) {
744 topology->nodes[i].node_id = topology_info_output->nodes[i].node_id;
745 topology->nodes[i].num_hops = topology_info_output->nodes[i].num_hops;
746 topology->nodes[i].is_sharing_enabled = topology_info_output->nodes[i].is_sharing_enabled;
747 topology->nodes[i].sdma_engine = topology_info_output->nodes[i].sdma_engine;
753 int psp_xgmi_set_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;
761 if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
764 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
765 memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
767 topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
768 xgmi_cmd->cmd_id = TA_COMMAND_XGMI__SET_TOPOLOGY_INFO;
769 topology_info_input->num_nodes = number_devices;
771 for (i = 0; i < topology_info_input->num_nodes; i++) {
772 topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
773 topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
774 topology_info_input->nodes[i].is_sharing_enabled = 1;
775 topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
778 /* Invoke xgmi ta to set topology information */
779 return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO);
783 static int psp_ras_init_shared_buf(struct psp_context *psp)
788 * Allocate 16k memory aligned to 4k from Frame Buffer (local
789 * physical) for ras ta <-> Driver
791 ret = amdgpu_bo_create_kernel(psp->adev, PSP_RAS_SHARED_MEM_SIZE,
792 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
793 &psp->ras.ras_shared_bo,
794 &psp->ras.ras_shared_mc_addr,
795 &psp->ras.ras_shared_buf);
800 static int psp_ras_load(struct psp_context *psp)
803 struct psp_gfx_cmd_resp *cmd;
806 * TODO: bypass the loading in sriov for now
808 if (amdgpu_sriov_vf(psp->adev))
811 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
815 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
816 memcpy(psp->fw_pri_buf, psp->ta_ras_start_addr, psp->ta_ras_ucode_size);
818 psp_prep_ta_load_cmd_buf(cmd,
820 psp->ta_ras_ucode_size,
821 psp->ras.ras_shared_mc_addr,
822 PSP_RAS_SHARED_MEM_SIZE);
824 ret = psp_cmd_submit_buf(psp, NULL, cmd,
825 psp->fence_buf_mc_addr);
828 psp->ras.ras_initialized = true;
829 psp->ras.session_id = cmd->resp.session_id;
837 static int psp_ras_unload(struct psp_context *psp)
840 struct psp_gfx_cmd_resp *cmd;
843 * TODO: bypass the unloading in sriov for now
845 if (amdgpu_sriov_vf(psp->adev))
848 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
852 psp_prep_ta_unload_cmd_buf(cmd, psp->ras.session_id);
854 ret = psp_cmd_submit_buf(psp, NULL, cmd,
855 psp->fence_buf_mc_addr);
862 int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
864 struct ta_ras_shared_memory *ras_cmd;
867 ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
870 * TODO: bypass the loading in sriov for now
872 if (amdgpu_sriov_vf(psp->adev))
875 ret = psp_ta_invoke(psp, ta_cmd_id, psp->ras.session_id);
877 if (amdgpu_ras_intr_triggered())
880 if (ras_cmd->if_version > RAS_TA_HOST_IF_VER)
882 DRM_WARN("RAS: Unsupported Interface");
887 if (ras_cmd->ras_out_message.flags.err_inject_switch_disable_flag) {
888 dev_warn(psp->adev->dev, "ECC switch disabled\n");
890 ras_cmd->ras_status = TA_RAS_STATUS__ERROR_RAS_NOT_AVAILABLE;
892 else if (ras_cmd->ras_out_message.flags.reg_access_failure_flag)
893 dev_warn(psp->adev->dev,
894 "RAS internal register access blocked\n");
900 int psp_ras_enable_features(struct psp_context *psp,
901 union ta_ras_cmd_input *info, bool enable)
903 struct ta_ras_shared_memory *ras_cmd;
906 if (!psp->ras.ras_initialized)
909 ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
910 memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));
913 ras_cmd->cmd_id = TA_RAS_COMMAND__ENABLE_FEATURES;
915 ras_cmd->cmd_id = TA_RAS_COMMAND__DISABLE_FEATURES;
917 ras_cmd->ras_in_message = *info;
919 ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
923 return ras_cmd->ras_status;
926 static int psp_ras_terminate(struct psp_context *psp)
931 * TODO: bypass the terminate in sriov for now
933 if (amdgpu_sriov_vf(psp->adev))
936 if (!psp->ras.ras_initialized)
939 ret = psp_ras_unload(psp);
943 psp->ras.ras_initialized = false;
945 /* free ras shared memory */
946 amdgpu_bo_free_kernel(&psp->ras.ras_shared_bo,
947 &psp->ras.ras_shared_mc_addr,
948 &psp->ras.ras_shared_buf);
953 static int psp_ras_initialize(struct psp_context *psp)
958 * TODO: bypass the initialize in sriov for now
960 if (amdgpu_sriov_vf(psp->adev))
963 if (!psp->adev->psp.ta_ras_ucode_size ||
964 !psp->adev->psp.ta_ras_start_addr) {
965 dev_info(psp->adev->dev, "RAS: optional ras ta ucode is not available\n");
969 if (!psp->ras.ras_initialized) {
970 ret = psp_ras_init_shared_buf(psp);
975 ret = psp_ras_load(psp);
982 int psp_ras_trigger_error(struct psp_context *psp,
983 struct ta_ras_trigger_error_input *info)
985 struct ta_ras_shared_memory *ras_cmd;
988 if (!psp->ras.ras_initialized)
991 ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
992 memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));
994 ras_cmd->cmd_id = TA_RAS_COMMAND__TRIGGER_ERROR;
995 ras_cmd->ras_in_message.trigger_error = *info;
997 ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
1001 /* If err_event_athub occurs error inject was successful, however
1002 return status from TA is no long reliable */
1003 if (amdgpu_ras_intr_triggered())
1006 return ras_cmd->ras_status;
1011 static int psp_hdcp_init_shared_buf(struct psp_context *psp)
1016 * Allocate 16k memory aligned to 4k from Frame Buffer (local
1017 * physical) for hdcp ta <-> Driver
1019 ret = amdgpu_bo_create_kernel(psp->adev, PSP_HDCP_SHARED_MEM_SIZE,
1020 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
1021 &psp->hdcp_context.hdcp_shared_bo,
1022 &psp->hdcp_context.hdcp_shared_mc_addr,
1023 &psp->hdcp_context.hdcp_shared_buf);
1028 static int psp_hdcp_load(struct psp_context *psp)
1031 struct psp_gfx_cmd_resp *cmd;
1034 * TODO: bypass the loading in sriov for now
1036 if (amdgpu_sriov_vf(psp->adev))
1039 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
1043 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
1044 memcpy(psp->fw_pri_buf, psp->ta_hdcp_start_addr,
1045 psp->ta_hdcp_ucode_size);
1047 psp_prep_ta_load_cmd_buf(cmd,
1048 psp->fw_pri_mc_addr,
1049 psp->ta_hdcp_ucode_size,
1050 psp->hdcp_context.hdcp_shared_mc_addr,
1051 PSP_HDCP_SHARED_MEM_SIZE);
1053 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
1056 psp->hdcp_context.hdcp_initialized = true;
1057 psp->hdcp_context.session_id = cmd->resp.session_id;
1058 mutex_init(&psp->hdcp_context.mutex);
1065 static int psp_hdcp_initialize(struct psp_context *psp)
1070 * TODO: bypass the initialize in sriov for now
1072 if (amdgpu_sriov_vf(psp->adev))
1075 if (!psp->adev->psp.ta_hdcp_ucode_size ||
1076 !psp->adev->psp.ta_hdcp_start_addr) {
1077 dev_info(psp->adev->dev, "HDCP: optional hdcp ta ucode is not available\n");
1081 if (!psp->hdcp_context.hdcp_initialized) {
1082 ret = psp_hdcp_init_shared_buf(psp);
1087 ret = psp_hdcp_load(psp);
1094 static int psp_hdcp_unload(struct psp_context *psp)
1097 struct psp_gfx_cmd_resp *cmd;
1100 * TODO: bypass the unloading in sriov for now
1102 if (amdgpu_sriov_vf(psp->adev))
1105 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
1109 psp_prep_ta_unload_cmd_buf(cmd, psp->hdcp_context.session_id);
1111 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
1118 int psp_hdcp_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
1121 * TODO: bypass the loading in sriov for now
1123 if (amdgpu_sriov_vf(psp->adev))
1126 return psp_ta_invoke(psp, ta_cmd_id, psp->hdcp_context.session_id);
1129 static int psp_hdcp_terminate(struct psp_context *psp)
1134 * TODO: bypass the terminate in sriov for now
1136 if (amdgpu_sriov_vf(psp->adev))
1139 if (!psp->hdcp_context.hdcp_initialized)
1142 ret = psp_hdcp_unload(psp);
1146 psp->hdcp_context.hdcp_initialized = false;
1148 /* free hdcp shared memory */
1149 amdgpu_bo_free_kernel(&psp->hdcp_context.hdcp_shared_bo,
1150 &psp->hdcp_context.hdcp_shared_mc_addr,
1151 &psp->hdcp_context.hdcp_shared_buf);
1158 static int psp_dtm_init_shared_buf(struct psp_context *psp)
1163 * Allocate 16k memory aligned to 4k from Frame Buffer (local
1164 * physical) for dtm ta <-> Driver
1166 ret = amdgpu_bo_create_kernel(psp->adev, PSP_DTM_SHARED_MEM_SIZE,
1167 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
1168 &psp->dtm_context.dtm_shared_bo,
1169 &psp->dtm_context.dtm_shared_mc_addr,
1170 &psp->dtm_context.dtm_shared_buf);
1175 static int psp_dtm_load(struct psp_context *psp)
1178 struct psp_gfx_cmd_resp *cmd;
1181 * TODO: bypass the loading in sriov for now
1183 if (amdgpu_sriov_vf(psp->adev))
1186 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
1190 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
1191 memcpy(psp->fw_pri_buf, psp->ta_dtm_start_addr, psp->ta_dtm_ucode_size);
1193 psp_prep_ta_load_cmd_buf(cmd,
1194 psp->fw_pri_mc_addr,
1195 psp->ta_dtm_ucode_size,
1196 psp->dtm_context.dtm_shared_mc_addr,
1197 PSP_DTM_SHARED_MEM_SIZE);
1199 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
1202 psp->dtm_context.dtm_initialized = true;
1203 psp->dtm_context.session_id = cmd->resp.session_id;
1204 mutex_init(&psp->dtm_context.mutex);
1212 static int psp_dtm_initialize(struct psp_context *psp)
1217 * TODO: bypass the initialize in sriov for now
1219 if (amdgpu_sriov_vf(psp->adev))
1222 if (!psp->adev->psp.ta_dtm_ucode_size ||
1223 !psp->adev->psp.ta_dtm_start_addr) {
1224 dev_info(psp->adev->dev, "DTM: optional dtm ta ucode is not available\n");
1228 if (!psp->dtm_context.dtm_initialized) {
1229 ret = psp_dtm_init_shared_buf(psp);
1234 ret = psp_dtm_load(psp);
1241 static int psp_dtm_unload(struct psp_context *psp)
1244 struct psp_gfx_cmd_resp *cmd;
1247 * TODO: bypass the unloading in sriov for now
1249 if (amdgpu_sriov_vf(psp->adev))
1252 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
1256 psp_prep_ta_unload_cmd_buf(cmd, psp->dtm_context.session_id);
1258 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
1265 int psp_dtm_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
1268 * TODO: bypass the loading in sriov for now
1270 if (amdgpu_sriov_vf(psp->adev))
1273 return psp_ta_invoke(psp, ta_cmd_id, psp->dtm_context.session_id);
1276 static int psp_dtm_terminate(struct psp_context *psp)
1281 * TODO: bypass the terminate in sriov for now
1283 if (amdgpu_sriov_vf(psp->adev))
1286 if (!psp->dtm_context.dtm_initialized)
1289 ret = psp_dtm_unload(psp);
1293 psp->dtm_context.dtm_initialized = false;
1295 /* free hdcp shared memory */
1296 amdgpu_bo_free_kernel(&psp->dtm_context.dtm_shared_bo,
1297 &psp->dtm_context.dtm_shared_mc_addr,
1298 &psp->dtm_context.dtm_shared_buf);
1304 static int psp_hw_start(struct psp_context *psp)
1306 struct amdgpu_device *adev = psp->adev;
1309 if (!amdgpu_sriov_vf(adev)) {
1310 if (psp->kdb_bin_size &&
1311 (psp->funcs->bootloader_load_kdb != NULL)) {
1312 ret = psp_bootloader_load_kdb(psp);
1314 DRM_ERROR("PSP load kdb failed!\n");
1319 ret = psp_bootloader_load_sysdrv(psp);
1321 DRM_ERROR("PSP load sysdrv failed!\n");
1325 ret = psp_bootloader_load_sos(psp);
1327 DRM_ERROR("PSP load sos failed!\n");
1332 ret = psp_ring_create(psp, PSP_RING_TYPE__KM);
1334 DRM_ERROR("PSP create ring failed!\n");
1338 ret = psp_tmr_init(psp);
1340 DRM_ERROR("PSP tmr init failed!\n");
1345 * For ASICs with DF Cstate management centralized
1346 * to PMFW, TMR setup should be performed after PMFW
1347 * loaded and before other non-psp firmware loaded.
1349 if (psp->pmfw_centralized_cstate_management) {
1350 ret = psp_load_smu_fw(psp);
1355 ret = psp_tmr_load(psp);
1357 DRM_ERROR("PSP load tmr failed!\n");
1364 static int psp_get_fw_type(struct amdgpu_firmware_info *ucode,
1365 enum psp_gfx_fw_type *type)
1367 switch (ucode->ucode_id) {
1368 case AMDGPU_UCODE_ID_SDMA0:
1369 *type = GFX_FW_TYPE_SDMA0;
1371 case AMDGPU_UCODE_ID_SDMA1:
1372 *type = GFX_FW_TYPE_SDMA1;
1374 case AMDGPU_UCODE_ID_SDMA2:
1375 *type = GFX_FW_TYPE_SDMA2;
1377 case AMDGPU_UCODE_ID_SDMA3:
1378 *type = GFX_FW_TYPE_SDMA3;
1380 case AMDGPU_UCODE_ID_SDMA4:
1381 *type = GFX_FW_TYPE_SDMA4;
1383 case AMDGPU_UCODE_ID_SDMA5:
1384 *type = GFX_FW_TYPE_SDMA5;
1386 case AMDGPU_UCODE_ID_SDMA6:
1387 *type = GFX_FW_TYPE_SDMA6;
1389 case AMDGPU_UCODE_ID_SDMA7:
1390 *type = GFX_FW_TYPE_SDMA7;
1392 case AMDGPU_UCODE_ID_CP_CE:
1393 *type = GFX_FW_TYPE_CP_CE;
1395 case AMDGPU_UCODE_ID_CP_PFP:
1396 *type = GFX_FW_TYPE_CP_PFP;
1398 case AMDGPU_UCODE_ID_CP_ME:
1399 *type = GFX_FW_TYPE_CP_ME;
1401 case AMDGPU_UCODE_ID_CP_MEC1:
1402 *type = GFX_FW_TYPE_CP_MEC;
1404 case AMDGPU_UCODE_ID_CP_MEC1_JT:
1405 *type = GFX_FW_TYPE_CP_MEC_ME1;
1407 case AMDGPU_UCODE_ID_CP_MEC2:
1408 *type = GFX_FW_TYPE_CP_MEC;
1410 case AMDGPU_UCODE_ID_CP_MEC2_JT:
1411 *type = GFX_FW_TYPE_CP_MEC_ME2;
1413 case AMDGPU_UCODE_ID_RLC_G:
1414 *type = GFX_FW_TYPE_RLC_G;
1416 case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL:
1417 *type = GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_CNTL;
1419 case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM:
1420 *type = GFX_FW_TYPE_RLC_RESTORE_LIST_GPM_MEM;
1422 case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM:
1423 *type = GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_MEM;
1425 case AMDGPU_UCODE_ID_SMC:
1426 *type = GFX_FW_TYPE_SMU;
1428 case AMDGPU_UCODE_ID_UVD:
1429 *type = GFX_FW_TYPE_UVD;
1431 case AMDGPU_UCODE_ID_UVD1:
1432 *type = GFX_FW_TYPE_UVD1;
1434 case AMDGPU_UCODE_ID_VCE:
1435 *type = GFX_FW_TYPE_VCE;
1437 case AMDGPU_UCODE_ID_VCN:
1438 *type = GFX_FW_TYPE_VCN;
1440 case AMDGPU_UCODE_ID_VCN1:
1441 *type = GFX_FW_TYPE_VCN1;
1443 case AMDGPU_UCODE_ID_DMCU_ERAM:
1444 *type = GFX_FW_TYPE_DMCU_ERAM;
1446 case AMDGPU_UCODE_ID_DMCU_INTV:
1447 *type = GFX_FW_TYPE_DMCU_ISR;
1449 case AMDGPU_UCODE_ID_VCN0_RAM:
1450 *type = GFX_FW_TYPE_VCN0_RAM;
1452 case AMDGPU_UCODE_ID_VCN1_RAM:
1453 *type = GFX_FW_TYPE_VCN1_RAM;
1455 case AMDGPU_UCODE_ID_DMCUB:
1456 *type = GFX_FW_TYPE_DMUB;
1458 case AMDGPU_UCODE_ID_MAXIMUM:
1466 static void psp_print_fw_hdr(struct psp_context *psp,
1467 struct amdgpu_firmware_info *ucode)
1469 struct amdgpu_device *adev = psp->adev;
1470 struct common_firmware_header *hdr;
1472 switch (ucode->ucode_id) {
1473 case AMDGPU_UCODE_ID_SDMA0:
1474 case AMDGPU_UCODE_ID_SDMA1:
1475 case AMDGPU_UCODE_ID_SDMA2:
1476 case AMDGPU_UCODE_ID_SDMA3:
1477 case AMDGPU_UCODE_ID_SDMA4:
1478 case AMDGPU_UCODE_ID_SDMA5:
1479 case AMDGPU_UCODE_ID_SDMA6:
1480 case AMDGPU_UCODE_ID_SDMA7:
1481 hdr = (struct common_firmware_header *)
1482 adev->sdma.instance[ucode->ucode_id - AMDGPU_UCODE_ID_SDMA0].fw->data;
1483 amdgpu_ucode_print_sdma_hdr(hdr);
1485 case AMDGPU_UCODE_ID_CP_CE:
1486 hdr = (struct common_firmware_header *)adev->gfx.ce_fw->data;
1487 amdgpu_ucode_print_gfx_hdr(hdr);
1489 case AMDGPU_UCODE_ID_CP_PFP:
1490 hdr = (struct common_firmware_header *)adev->gfx.pfp_fw->data;
1491 amdgpu_ucode_print_gfx_hdr(hdr);
1493 case AMDGPU_UCODE_ID_CP_ME:
1494 hdr = (struct common_firmware_header *)adev->gfx.me_fw->data;
1495 amdgpu_ucode_print_gfx_hdr(hdr);
1497 case AMDGPU_UCODE_ID_CP_MEC1:
1498 hdr = (struct common_firmware_header *)adev->gfx.mec_fw->data;
1499 amdgpu_ucode_print_gfx_hdr(hdr);
1501 case AMDGPU_UCODE_ID_RLC_G:
1502 hdr = (struct common_firmware_header *)adev->gfx.rlc_fw->data;
1503 amdgpu_ucode_print_rlc_hdr(hdr);
1505 case AMDGPU_UCODE_ID_SMC:
1506 hdr = (struct common_firmware_header *)adev->pm.fw->data;
1507 amdgpu_ucode_print_smc_hdr(hdr);
1514 static int psp_prep_load_ip_fw_cmd_buf(struct amdgpu_firmware_info *ucode,
1515 struct psp_gfx_cmd_resp *cmd)
1518 uint64_t fw_mem_mc_addr = ucode->mc_addr;
1520 memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp));
1522 cmd->cmd_id = GFX_CMD_ID_LOAD_IP_FW;
1523 cmd->cmd.cmd_load_ip_fw.fw_phy_addr_lo = lower_32_bits(fw_mem_mc_addr);
1524 cmd->cmd.cmd_load_ip_fw.fw_phy_addr_hi = upper_32_bits(fw_mem_mc_addr);
1525 cmd->cmd.cmd_load_ip_fw.fw_size = ucode->ucode_size;
1527 ret = psp_get_fw_type(ucode, &cmd->cmd.cmd_load_ip_fw.fw_type);
1529 DRM_ERROR("Unknown firmware type\n");
1534 static int psp_execute_np_fw_load(struct psp_context *psp,
1535 struct amdgpu_firmware_info *ucode)
1539 ret = psp_prep_load_ip_fw_cmd_buf(ucode, psp->cmd);
1543 ret = psp_cmd_submit_buf(psp, ucode, psp->cmd,
1544 psp->fence_buf_mc_addr);
1549 static int psp_load_smu_fw(struct psp_context *psp)
1552 struct amdgpu_device* adev = psp->adev;
1553 struct amdgpu_firmware_info *ucode =
1554 &adev->firmware.ucode[AMDGPU_UCODE_ID_SMC];
1555 struct amdgpu_ras *ras = psp->ras.ras;
1557 if (!ucode->fw || amdgpu_sriov_vf(psp->adev))
1561 if (adev->in_gpu_reset && ras && ras->supported) {
1562 ret = amdgpu_dpm_set_mp1_state(adev, PP_MP1_STATE_UNLOAD);
1564 DRM_WARN("Failed to set MP1 state prepare for reload\n");
1568 ret = psp_execute_np_fw_load(psp, ucode);
1571 DRM_ERROR("PSP load smu failed!\n");
1576 static bool fw_load_skip_check(struct psp_context *psp,
1577 struct amdgpu_firmware_info *ucode)
1582 if (ucode->ucode_id == AMDGPU_UCODE_ID_SMC &&
1583 (psp_smu_reload_quirk(psp) ||
1584 psp->autoload_supported ||
1585 psp->pmfw_centralized_cstate_management))
1588 if (amdgpu_sriov_vf(psp->adev) &&
1589 (ucode->ucode_id == AMDGPU_UCODE_ID_SDMA0
1590 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA1
1591 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA2
1592 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA3
1593 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA4
1594 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA5
1595 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA6
1596 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA7
1597 || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_G
1598 || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL
1599 || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM
1600 || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM
1601 || ucode->ucode_id == AMDGPU_UCODE_ID_SMC))
1602 /*skip ucode loading in SRIOV VF */
1605 if (psp->autoload_supported &&
1606 (ucode->ucode_id == AMDGPU_UCODE_ID_CP_MEC1_JT ||
1607 ucode->ucode_id == AMDGPU_UCODE_ID_CP_MEC2_JT))
1608 /* skip mec JT when autoload is enabled */
1614 static int psp_np_fw_load(struct psp_context *psp)
1617 struct amdgpu_firmware_info *ucode;
1618 struct amdgpu_device* adev = psp->adev;
1620 if (psp->autoload_supported &&
1621 !psp->pmfw_centralized_cstate_management) {
1622 ret = psp_load_smu_fw(psp);
1627 for (i = 0; i < adev->firmware.max_ucodes; i++) {
1628 ucode = &adev->firmware.ucode[i];
1630 if (ucode->ucode_id == AMDGPU_UCODE_ID_SMC &&
1631 !fw_load_skip_check(psp, ucode)) {
1632 ret = psp_load_smu_fw(psp);
1638 if (fw_load_skip_check(psp, ucode))
1641 psp_print_fw_hdr(psp, ucode);
1643 ret = psp_execute_np_fw_load(psp, ucode);
1647 /* Start rlc autoload after psp recieved all the gfx firmware */
1648 if (psp->autoload_supported && ucode->ucode_id == (amdgpu_sriov_vf(adev) ?
1649 AMDGPU_UCODE_ID_CP_MEC2 : AMDGPU_UCODE_ID_RLC_G)) {
1650 ret = psp_rlc_autoload_start(psp);
1652 DRM_ERROR("Failed to start rlc autoload\n");
1661 static int psp_load_fw(struct amdgpu_device *adev)
1664 struct psp_context *psp = &adev->psp;
1666 if (amdgpu_sriov_vf(adev) && adev->in_gpu_reset) {
1667 psp_ring_stop(psp, PSP_RING_TYPE__KM); /* should not destroy ring, only stop */
1671 psp->cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
1675 ret = amdgpu_bo_create_kernel(adev, PSP_1_MEG, PSP_1_MEG,
1676 AMDGPU_GEM_DOMAIN_GTT,
1678 &psp->fw_pri_mc_addr,
1683 ret = amdgpu_bo_create_kernel(adev, PSP_FENCE_BUFFER_SIZE, PAGE_SIZE,
1684 AMDGPU_GEM_DOMAIN_VRAM,
1686 &psp->fence_buf_mc_addr,
1691 ret = amdgpu_bo_create_kernel(adev, PSP_CMD_BUFFER_SIZE, PAGE_SIZE,
1692 AMDGPU_GEM_DOMAIN_VRAM,
1693 &psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
1694 (void **)&psp->cmd_buf_mem);
1698 memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE);
1700 ret = psp_ring_init(psp, PSP_RING_TYPE__KM);
1702 DRM_ERROR("PSP ring init failed!\n");
1707 ret = psp_hw_start(psp);
1711 ret = psp_np_fw_load(psp);
1715 ret = psp_asd_load(psp);
1717 DRM_ERROR("PSP load asd failed!\n");
1721 if (psp->adev->psp.ta_fw) {
1722 ret = psp_ras_initialize(psp);
1724 dev_err(psp->adev->dev,
1725 "RAS: Failed to initialize RAS\n");
1727 ret = psp_hdcp_initialize(psp);
1729 dev_err(psp->adev->dev,
1730 "HDCP: Failed to initialize HDCP\n");
1732 ret = psp_dtm_initialize(psp);
1734 dev_err(psp->adev->dev,
1735 "DTM: Failed to initialize DTM\n");
1742 * all cleanup jobs (xgmi terminate, ras terminate,
1743 * ring destroy, cmd/fence/fw buffers destory,
1744 * psp->cmd destory) are delayed to psp_hw_fini
1749 static int psp_hw_init(void *handle)
1752 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1754 mutex_lock(&adev->firmware.mutex);
1756 * This sequence is just used on hw_init only once, no need on
1759 ret = amdgpu_ucode_init_bo(adev);
1763 ret = psp_load_fw(adev);
1765 DRM_ERROR("PSP firmware loading failed\n");
1769 mutex_unlock(&adev->firmware.mutex);
1773 adev->firmware.load_type = AMDGPU_FW_LOAD_DIRECT;
1774 mutex_unlock(&adev->firmware.mutex);
1778 static int psp_hw_fini(void *handle)
1780 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1781 struct psp_context *psp = &adev->psp;
1785 if (psp->adev->psp.ta_fw) {
1786 psp_ras_terminate(psp);
1787 psp_dtm_terminate(psp);
1788 psp_hdcp_terminate(psp);
1791 psp_asd_unload(psp);
1793 psp_ring_destroy(psp, PSP_RING_TYPE__KM);
1795 pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL;
1796 amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, pptr);
1797 amdgpu_bo_free_kernel(&psp->fw_pri_bo,
1798 &psp->fw_pri_mc_addr, &psp->fw_pri_buf);
1799 amdgpu_bo_free_kernel(&psp->fence_buf_bo,
1800 &psp->fence_buf_mc_addr, &psp->fence_buf);
1801 amdgpu_bo_free_kernel(&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
1802 (void **)&psp->cmd_buf_mem);
1810 static int psp_suspend(void *handle)
1813 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1814 struct psp_context *psp = &adev->psp;
1816 if (adev->gmc.xgmi.num_physical_nodes > 1 &&
1817 psp->xgmi_context.initialized == 1) {
1818 ret = psp_xgmi_terminate(psp);
1820 DRM_ERROR("Failed to terminate xgmi ta\n");
1825 if (psp->adev->psp.ta_fw) {
1826 ret = psp_ras_terminate(psp);
1828 DRM_ERROR("Failed to terminate ras ta\n");
1831 ret = psp_hdcp_terminate(psp);
1833 DRM_ERROR("Failed to terminate hdcp ta\n");
1836 ret = psp_dtm_terminate(psp);
1838 DRM_ERROR("Failed to terminate dtm ta\n");
1843 ret = psp_ring_stop(psp, PSP_RING_TYPE__KM);
1845 DRM_ERROR("PSP ring stop failed\n");
1852 static int psp_resume(void *handle)
1855 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1856 struct psp_context *psp = &adev->psp;
1858 DRM_INFO("PSP is resuming...\n");
1860 ret = psp_mem_training(psp, PSP_MEM_TRAIN_RESUME);
1862 DRM_ERROR("Failed to process memory training!\n");
1866 mutex_lock(&adev->firmware.mutex);
1868 ret = psp_hw_start(psp);
1872 ret = psp_np_fw_load(psp);
1876 ret = psp_asd_load(psp);
1878 DRM_ERROR("PSP load asd failed!\n");
1882 if (adev->gmc.xgmi.num_physical_nodes > 1) {
1883 ret = psp_xgmi_initialize(psp);
1884 /* Warning the XGMI seesion initialize failure
1885 * Instead of stop driver initialization
1888 dev_err(psp->adev->dev,
1889 "XGMI: Failed to initialize XGMI session\n");
1892 if (psp->adev->psp.ta_fw) {
1893 ret = psp_ras_initialize(psp);
1895 dev_err(psp->adev->dev,
1896 "RAS: Failed to initialize RAS\n");
1898 ret = psp_hdcp_initialize(psp);
1900 dev_err(psp->adev->dev,
1901 "HDCP: Failed to initialize HDCP\n");
1903 ret = psp_dtm_initialize(psp);
1905 dev_err(psp->adev->dev,
1906 "DTM: Failed to initialize DTM\n");
1909 mutex_unlock(&adev->firmware.mutex);
1914 DRM_ERROR("PSP resume failed\n");
1915 mutex_unlock(&adev->firmware.mutex);
1919 int psp_gpu_reset(struct amdgpu_device *adev)
1923 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
1926 mutex_lock(&adev->psp.mutex);
1927 ret = psp_mode1_reset(&adev->psp);
1928 mutex_unlock(&adev->psp.mutex);
1933 int psp_rlc_autoload_start(struct psp_context *psp)
1936 struct psp_gfx_cmd_resp *cmd;
1938 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
1942 cmd->cmd_id = GFX_CMD_ID_AUTOLOAD_RLC;
1944 ret = psp_cmd_submit_buf(psp, NULL, cmd,
1945 psp->fence_buf_mc_addr);
1950 int psp_update_vcn_sram(struct amdgpu_device *adev, int inst_idx,
1951 uint64_t cmd_gpu_addr, int cmd_size)
1953 struct amdgpu_firmware_info ucode = {0};
1955 ucode.ucode_id = inst_idx ? AMDGPU_UCODE_ID_VCN1_RAM :
1956 AMDGPU_UCODE_ID_VCN0_RAM;
1957 ucode.mc_addr = cmd_gpu_addr;
1958 ucode.ucode_size = cmd_size;
1960 return psp_execute_np_fw_load(&adev->psp, &ucode);
1963 int psp_ring_cmd_submit(struct psp_context *psp,
1964 uint64_t cmd_buf_mc_addr,
1965 uint64_t fence_mc_addr,
1968 unsigned int psp_write_ptr_reg = 0;
1969 struct psp_gfx_rb_frame *write_frame;
1970 struct psp_ring *ring = &psp->km_ring;
1971 struct psp_gfx_rb_frame *ring_buffer_start = ring->ring_mem;
1972 struct psp_gfx_rb_frame *ring_buffer_end = ring_buffer_start +
1973 ring->ring_size / sizeof(struct psp_gfx_rb_frame) - 1;
1974 struct amdgpu_device *adev = psp->adev;
1975 uint32_t ring_size_dw = ring->ring_size / 4;
1976 uint32_t rb_frame_size_dw = sizeof(struct psp_gfx_rb_frame) / 4;
1978 /* KM (GPCOM) prepare write pointer */
1979 psp_write_ptr_reg = psp_ring_get_wptr(psp);
1981 /* Update KM RB frame pointer to new frame */
1982 /* write_frame ptr increments by size of rb_frame in bytes */
1983 /* psp_write_ptr_reg increments by size of rb_frame in DWORDs */
1984 if ((psp_write_ptr_reg % ring_size_dw) == 0)
1985 write_frame = ring_buffer_start;
1987 write_frame = ring_buffer_start + (psp_write_ptr_reg / rb_frame_size_dw);
1988 /* Check invalid write_frame ptr address */
1989 if ((write_frame < ring_buffer_start) || (ring_buffer_end < write_frame)) {
1990 DRM_ERROR("ring_buffer_start = %p; ring_buffer_end = %p; write_frame = %p\n",
1991 ring_buffer_start, ring_buffer_end, write_frame);
1992 DRM_ERROR("write_frame is pointing to address out of bounds\n");
1996 /* Initialize KM RB frame */
1997 memset(write_frame, 0, sizeof(struct psp_gfx_rb_frame));
1999 /* Update KM RB frame */
2000 write_frame->cmd_buf_addr_hi = upper_32_bits(cmd_buf_mc_addr);
2001 write_frame->cmd_buf_addr_lo = lower_32_bits(cmd_buf_mc_addr);
2002 write_frame->fence_addr_hi = upper_32_bits(fence_mc_addr);
2003 write_frame->fence_addr_lo = lower_32_bits(fence_mc_addr);
2004 write_frame->fence_value = index;
2005 amdgpu_asic_flush_hdp(adev, NULL);
2007 /* Update the write Pointer in DWORDs */
2008 psp_write_ptr_reg = (psp_write_ptr_reg + rb_frame_size_dw) % ring_size_dw;
2009 psp_ring_set_wptr(psp, psp_write_ptr_reg);
2013 int psp_init_asd_microcode(struct psp_context *psp,
2014 const char *chip_name)
2016 struct amdgpu_device *adev = psp->adev;
2018 const struct psp_firmware_header_v1_0 *asd_hdr;
2022 dev_err(adev->dev, "invalid chip name for asd microcode\n");
2026 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name);
2027 err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
2031 err = amdgpu_ucode_validate(adev->psp.asd_fw);
2035 asd_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data;
2036 adev->psp.asd_fw_version = le32_to_cpu(asd_hdr->header.ucode_version);
2037 adev->psp.asd_feature_version = le32_to_cpu(asd_hdr->ucode_feature_version);
2038 adev->psp.asd_ucode_size = le32_to_cpu(asd_hdr->header.ucode_size_bytes);
2039 adev->psp.asd_start_addr = (uint8_t *)asd_hdr +
2040 le32_to_cpu(asd_hdr->header.ucode_array_offset_bytes);
2043 dev_err(adev->dev, "fail to initialize asd microcode\n");
2044 release_firmware(adev->psp.asd_fw);
2045 adev->psp.asd_fw = NULL;
2049 int psp_init_sos_microcode(struct psp_context *psp,
2050 const char *chip_name)
2052 struct amdgpu_device *adev = psp->adev;
2054 const struct psp_firmware_header_v1_0 *sos_hdr;
2055 const struct psp_firmware_header_v1_1 *sos_hdr_v1_1;
2056 const struct psp_firmware_header_v1_2 *sos_hdr_v1_2;
2060 dev_err(adev->dev, "invalid chip name for sos microcode\n");
2064 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", chip_name);
2065 err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev);
2069 err = amdgpu_ucode_validate(adev->psp.sos_fw);
2073 sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data;
2074 amdgpu_ucode_print_psp_hdr(&sos_hdr->header);
2076 switch (sos_hdr->header.header_version_major) {
2078 adev->psp.sos_fw_version = le32_to_cpu(sos_hdr->header.ucode_version);
2079 adev->psp.sos_feature_version = le32_to_cpu(sos_hdr->ucode_feature_version);
2080 adev->psp.sos_bin_size = le32_to_cpu(sos_hdr->sos_size_bytes);
2081 adev->psp.sys_bin_size = le32_to_cpu(sos_hdr->sos_offset_bytes);
2082 adev->psp.sys_start_addr = (uint8_t *)sos_hdr +
2083 le32_to_cpu(sos_hdr->header.ucode_array_offset_bytes);
2084 adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr +
2085 le32_to_cpu(sos_hdr->sos_offset_bytes);
2086 if (sos_hdr->header.header_version_minor == 1) {
2087 sos_hdr_v1_1 = (const struct psp_firmware_header_v1_1 *)adev->psp.sos_fw->data;
2088 adev->psp.toc_bin_size = le32_to_cpu(sos_hdr_v1_1->toc_size_bytes);
2089 adev->psp.toc_start_addr = (uint8_t *)adev->psp.sys_start_addr +
2090 le32_to_cpu(sos_hdr_v1_1->toc_offset_bytes);
2091 adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_1->kdb_size_bytes);
2092 adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr +
2093 le32_to_cpu(sos_hdr_v1_1->kdb_offset_bytes);
2095 if (sos_hdr->header.header_version_minor == 2) {
2096 sos_hdr_v1_2 = (const struct psp_firmware_header_v1_2 *)adev->psp.sos_fw->data;
2097 adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_2->kdb_size_bytes);
2098 adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr +
2099 le32_to_cpu(sos_hdr_v1_2->kdb_offset_bytes);
2104 "unsupported psp sos firmware\n");
2112 "failed to init sos firmware\n");
2113 release_firmware(adev->psp.sos_fw);
2114 adev->psp.sos_fw = NULL;
2119 static int psp_set_clockgating_state(void *handle,
2120 enum amd_clockgating_state state)
2125 static int psp_set_powergating_state(void *handle,
2126 enum amd_powergating_state state)
2131 static ssize_t psp_usbc_pd_fw_sysfs_read(struct device *dev,
2132 struct device_attribute *attr,
2135 struct drm_device *ddev = dev_get_drvdata(dev);
2136 struct amdgpu_device *adev = ddev->dev_private;
2140 if (!adev->ip_blocks[AMD_IP_BLOCK_TYPE_PSP].status.late_initialized) {
2141 DRM_INFO("PSP block is not ready yet.");
2145 mutex_lock(&adev->psp.mutex);
2146 ret = psp_read_usbc_pd_fw(&adev->psp, &fw_ver);
2147 mutex_unlock(&adev->psp.mutex);
2150 DRM_ERROR("Failed to read USBC PD FW, err = %d", ret);
2154 return snprintf(buf, PAGE_SIZE, "%x\n", fw_ver);
2157 static ssize_t psp_usbc_pd_fw_sysfs_write(struct device *dev,
2158 struct device_attribute *attr,
2162 struct drm_device *ddev = dev_get_drvdata(dev);
2163 struct amdgpu_device *adev = ddev->dev_private;
2165 dma_addr_t dma_addr;
2168 const struct firmware *usbc_pd_fw;
2170 if (!adev->ip_blocks[AMD_IP_BLOCK_TYPE_PSP].status.late_initialized) {
2171 DRM_INFO("PSP block is not ready yet.");
2175 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s", buf);
2176 ret = request_firmware(&usbc_pd_fw, fw_name, adev->dev);
2180 /* We need contiguous physical mem to place the FW for psp to access */
2181 cpu_addr = dma_alloc_coherent(adev->dev, usbc_pd_fw->size, &dma_addr, GFP_KERNEL);
2183 ret = dma_mapping_error(adev->dev, dma_addr);
2187 memcpy_toio(cpu_addr, usbc_pd_fw->data, usbc_pd_fw->size);
2190 * x86 specific workaround.
2191 * Without it the buffer is invisible in PSP.
2193 * TODO Remove once PSP starts snooping CPU cache
2196 clflush_cache_range(cpu_addr, (usbc_pd_fw->size & ~(L1_CACHE_BYTES - 1)));
2199 mutex_lock(&adev->psp.mutex);
2200 ret = psp_load_usbc_pd_fw(&adev->psp, dma_addr);
2201 mutex_unlock(&adev->psp.mutex);
2204 dma_free_coherent(adev->dev, usbc_pd_fw->size, cpu_addr, dma_addr);
2205 release_firmware(usbc_pd_fw);
2209 DRM_ERROR("Failed to load USBC PD FW, err = %d", ret);
2216 static DEVICE_ATTR(usbc_pd_fw, S_IRUGO | S_IWUSR,
2217 psp_usbc_pd_fw_sysfs_read,
2218 psp_usbc_pd_fw_sysfs_write);
2222 const struct amd_ip_funcs psp_ip_funcs = {
2224 .early_init = psp_early_init,
2226 .sw_init = psp_sw_init,
2227 .sw_fini = psp_sw_fini,
2228 .hw_init = psp_hw_init,
2229 .hw_fini = psp_hw_fini,
2230 .suspend = psp_suspend,
2231 .resume = psp_resume,
2233 .check_soft_reset = NULL,
2234 .wait_for_idle = NULL,
2236 .set_clockgating_state = psp_set_clockgating_state,
2237 .set_powergating_state = psp_set_powergating_state,
2240 static int psp_sysfs_init(struct amdgpu_device *adev)
2242 int ret = device_create_file(adev->dev, &dev_attr_usbc_pd_fw);
2245 DRM_ERROR("Failed to create USBC PD FW control file!");
2250 static void psp_sysfs_fini(struct amdgpu_device *adev)
2252 device_remove_file(adev->dev, &dev_attr_usbc_pd_fw);
2255 const struct amdgpu_ip_block_version psp_v3_1_ip_block =
2257 .type = AMD_IP_BLOCK_TYPE_PSP,
2261 .funcs = &psp_ip_funcs,
2264 const struct amdgpu_ip_block_version psp_v10_0_ip_block =
2266 .type = AMD_IP_BLOCK_TYPE_PSP,
2270 .funcs = &psp_ip_funcs,
2273 const struct amdgpu_ip_block_version psp_v11_0_ip_block =
2275 .type = AMD_IP_BLOCK_TYPE_PSP,
2279 .funcs = &psp_ip_funcs,
2282 const struct amdgpu_ip_block_version psp_v12_0_ip_block =
2284 .type = AMD_IP_BLOCK_TYPE_PSP,
2288 .funcs = &psp_ip_funcs,