Home | History | Annotate | Line # | Download | only in amdgpu
      1 /*	$NetBSD: amdgpu_psp.c,v 1.3 2021/12/19 12:21:29 riastradh Exp $	*/
      2 
      3 /*
      4  * Copyright 2016 Advanced Micro Devices, Inc.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  * and/or sell copies of the Software, and to permit persons to whom the
     11  * Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included in
     14  * all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     20  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     22  * OTHER DEALINGS IN THE SOFTWARE.
     23  *
     24  * Author: Huang Rui
     25  *
     26  */
     27 
     28 #include <sys/cdefs.h>
     29 __KERNEL_RCSID(0, "$NetBSD: amdgpu_psp.c,v 1.3 2021/12/19 12:21:29 riastradh Exp $");
     30 
     31 #include <linux/firmware.h>
     32 
     33 #include "amdgpu.h"
     34 #include "amdgpu_psp.h"
     35 #include "amdgpu_ucode.h"
     36 #include "soc15_common.h"
     37 #include "psp_v3_1.h"
     38 #include "psp_v10_0.h"
     39 #include "psp_v11_0.h"
     40 #include "psp_v12_0.h"
     41 
     42 #include "amdgpu_ras.h"
     43 
     44 static void psp_set_funcs(struct amdgpu_device *adev);
     45 
     46 static int psp_early_init(void *handle)
     47 {
     48 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
     49 	struct psp_context *psp = &adev->psp;
     50 
     51 	psp_set_funcs(adev);
     52 
     53 	switch (adev->asic_type) {
     54 	case CHIP_VEGA10:
     55 	case CHIP_VEGA12:
     56 		psp_v3_1_set_psp_funcs(psp);
     57 		psp->autoload_supported = false;
     58 		break;
     59 	case CHIP_RAVEN:
     60 		psp_v10_0_set_psp_funcs(psp);
     61 		psp->autoload_supported = false;
     62 		break;
     63 	case CHIP_VEGA20:
     64 	case CHIP_ARCTURUS:
     65 		psp_v11_0_set_psp_funcs(psp);
     66 		psp->autoload_supported = false;
     67 		break;
     68 	case CHIP_NAVI10:
     69 	case CHIP_NAVI14:
     70 	case CHIP_NAVI12:
     71 		psp_v11_0_set_psp_funcs(psp);
     72 		psp->autoload_supported = true;
     73 		break;
     74 	case CHIP_RENOIR:
     75 		psp_v12_0_set_psp_funcs(psp);
     76 		break;
     77 	default:
     78 		return -EINVAL;
     79 	}
     80 
     81 	psp->adev = adev;
     82 
     83 	return 0;
     84 }
     85 
     86 static int psp_sw_init(void *handle)
     87 {
     88 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
     89 	struct psp_context *psp = &adev->psp;
     90 	int ret;
     91 
     92 	ret = psp_init_microcode(psp);
     93 	if (ret) {
     94 		DRM_ERROR("Failed to load psp firmware!\n");
     95 		return ret;
     96 	}
     97 
     98 	ret = psp_mem_training_init(psp);
     99 	if (ret) {
    100 		DRM_ERROR("Failed to initialize memory training!\n");
    101 		return ret;
    102 	}
    103 	ret = psp_mem_training(psp, PSP_MEM_TRAIN_COLD_BOOT);
    104 	if (ret) {
    105 		DRM_ERROR("Failed to process memory training!\n");
    106 		return ret;
    107 	}
    108 
    109 	return 0;
    110 }
    111 
    112 static int psp_sw_fini(void *handle)
    113 {
    114 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    115 
    116 	psp_mem_training_fini(&adev->psp);
    117 	release_firmware(adev->psp.sos_fw);
    118 	adev->psp.sos_fw = NULL;
    119 	release_firmware(adev->psp.asd_fw);
    120 	adev->psp.asd_fw = NULL;
    121 	if (adev->psp.ta_fw) {
    122 		release_firmware(adev->psp.ta_fw);
    123 		adev->psp.ta_fw = NULL;
    124 	}
    125 	return 0;
    126 }
    127 
    128 int psp_wait_for(struct psp_context *psp, uint32_t reg_index,
    129 		 uint32_t reg_val, uint32_t mask, bool check_changed)
    130 {
    131 	uint32_t val;
    132 	int i;
    133 	struct amdgpu_device *adev = psp->adev;
    134 
    135 	for (i = 0; i < adev->usec_timeout; i++) {
    136 		val = RREG32(reg_index);
    137 		if (check_changed) {
    138 			if (val != reg_val)
    139 				return 0;
    140 		} else {
    141 			if ((val & mask) == reg_val)
    142 				return 0;
    143 		}
    144 		udelay(1);
    145 	}
    146 
    147 	return -ETIME;
    148 }
    149 
    150 static int
    151 psp_cmd_submit_buf(struct psp_context *psp,
    152 		   struct amdgpu_firmware_info *ucode,
    153 		   struct psp_gfx_cmd_resp *cmd, uint64_t fence_mc_addr)
    154 {
    155 	int ret;
    156 	int index;
    157 	int timeout = 2000;
    158 
    159 	mutex_lock(&psp->mutex);
    160 
    161 	memset(psp->cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE);
    162 
    163 	memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp));
    164 
    165 	index = atomic_inc_return(&psp->fence_value);
    166 	ret = psp_ring_cmd_submit(psp, psp->cmd_buf_mc_addr, fence_mc_addr, index);
    167 	if (ret) {
    168 		atomic_dec(&psp->fence_value);
    169 		mutex_unlock(&psp->mutex);
    170 		return ret;
    171 	}
    172 
    173 	amdgpu_asic_invalidate_hdp(psp->adev, NULL);
    174 	while (*((unsigned int *)psp->fence_buf) != index) {
    175 		if (--timeout == 0)
    176 			break;
    177 		/*
    178 		 * Shouldn't wait for timeout when err_event_athub occurs,
    179 		 * because gpu reset thread triggered and lock resource should
    180 		 * be released for psp resume sequence.
    181 		 */
    182 		if (amdgpu_ras_intr_triggered())
    183 			break;
    184 		msleep(1);
    185 		amdgpu_asic_invalidate_hdp(psp->adev, NULL);
    186 	}
    187 
    188 	/* In some cases, psp response status is not 0 even there is no
    189 	 * problem while the command is submitted. Some version of PSP FW
    190 	 * doesn't write 0 to that field.
    191 	 * So here we would like to only print a warning instead of an error
    192 	 * during psp initialization to avoid breaking hw_init and it doesn't
    193 	 * return -EINVAL.
    194 	 */
    195 	if (psp->cmd_buf_mem->resp.status || !timeout) {
    196 		if (ucode)
    197 			DRM_WARN("failed to load ucode id (%d) ",
    198 				  ucode->ucode_id);
    199 		DRM_WARN("psp command (0x%X) failed and response status is (0x%X)\n",
    200 			 psp->cmd_buf_mem->cmd_id,
    201 			 psp->cmd_buf_mem->resp.status);
    202 		if (!timeout) {
    203 			mutex_unlock(&psp->mutex);
    204 			return -EINVAL;
    205 		}
    206 	}
    207 
    208 	/* get xGMI session id from response buffer */
    209 	cmd->resp.session_id = psp->cmd_buf_mem->resp.session_id;
    210 
    211 	if (ucode) {
    212 		ucode->tmr_mc_addr_lo = psp->cmd_buf_mem->resp.fw_addr_lo;
    213 		ucode->tmr_mc_addr_hi = psp->cmd_buf_mem->resp.fw_addr_hi;
    214 	}
    215 	mutex_unlock(&psp->mutex);
    216 
    217 	return ret;
    218 }
    219 
    220 static void psp_prep_tmr_cmd_buf(struct psp_context *psp,
    221 				 struct psp_gfx_cmd_resp *cmd,
    222 				 uint64_t tmr_mc, uint32_t size)
    223 {
    224 	if (psp_support_vmr_ring(psp))
    225 		cmd->cmd_id = GFX_CMD_ID_SETUP_VMR;
    226 	else
    227 		cmd->cmd_id = GFX_CMD_ID_SETUP_TMR;
    228 	cmd->cmd.cmd_setup_tmr.buf_phy_addr_lo = lower_32_bits(tmr_mc);
    229 	cmd->cmd.cmd_setup_tmr.buf_phy_addr_hi = upper_32_bits(tmr_mc);
    230 	cmd->cmd.cmd_setup_tmr.buf_size = size;
    231 }
    232 
    233 static void psp_prep_load_toc_cmd_buf(struct psp_gfx_cmd_resp *cmd,
    234 				      uint64_t pri_buf_mc, uint32_t size)
    235 {
    236 	cmd->cmd_id = GFX_CMD_ID_LOAD_TOC;
    237 	cmd->cmd.cmd_load_toc.toc_phy_addr_lo = lower_32_bits(pri_buf_mc);
    238 	cmd->cmd.cmd_load_toc.toc_phy_addr_hi = upper_32_bits(pri_buf_mc);
    239 	cmd->cmd.cmd_load_toc.toc_size = size;
    240 }
    241 
    242 /* Issue LOAD TOC cmd to PSP to part toc and calculate tmr size needed */
    243 static int psp_load_toc(struct psp_context *psp,
    244 			uint32_t *tmr_size)
    245 {
    246 	int ret;
    247 	struct psp_gfx_cmd_resp *cmd;
    248 
    249 	cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
    250 	if (!cmd)
    251 		return -ENOMEM;
    252 	/* Copy toc to psp firmware private buffer */
    253 	memset(psp->fw_pri_buf, 0, PSP_1_MEG);
    254 	memcpy(psp->fw_pri_buf, psp->toc_start_addr, psp->toc_bin_size);
    255 
    256 	psp_prep_load_toc_cmd_buf(cmd, psp->fw_pri_mc_addr, psp->toc_bin_size);
    257 
    258 	ret = psp_cmd_submit_buf(psp, NULL, cmd,
    259 				 psp->fence_buf_mc_addr);
    260 	if (!ret)
    261 		*tmr_size = psp->cmd_buf_mem->resp.tmr_size;
    262 	kfree(cmd);
    263 	return ret;
    264 }
    265 
    266 /* Set up Trusted Memory Region */
    267 static int psp_tmr_init(struct psp_context *psp)
    268 {
    269 	int ret;
    270 	int tmr_size;
    271 	void *tmr_buf;
    272 	void **pptr;
    273 
    274 	/*
    275 	 * According to HW engineer, they prefer the TMR address be "naturally
    276 	 * aligned" , e.g. the start address be an integer divide of TMR size.
    277 	 *
    278 	 * Note: this memory need be reserved till the driver
    279 	 * uninitializes.
    280 	 */
    281 	tmr_size = PSP_TMR_SIZE;
    282 
    283 	/* For ASICs support RLC autoload, psp will parse the toc
    284 	 * and calculate the total size of TMR needed */
    285 	if (!amdgpu_sriov_vf(psp->adev) &&
    286 	    psp->toc_start_addr &&
    287 	    psp->toc_bin_size &&
    288 	    psp->fw_pri_buf) {
    289 		ret = psp_load_toc(psp, &tmr_size);
    290 		if (ret) {
    291 			DRM_ERROR("Failed to load toc\n");
    292 			return ret;
    293 		}
    294 	}
    295 
    296 	pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL;
    297 	ret = amdgpu_bo_create_kernel(psp->adev, tmr_size, PSP_TMR_SIZE,
    298 				      AMDGPU_GEM_DOMAIN_VRAM,
    299 				      &psp->tmr_bo, &psp->tmr_mc_addr, pptr);
    300 
    301 	return ret;
    302 }
    303 
    304 static int psp_tmr_load(struct psp_context *psp)
    305 {
    306 	int ret;
    307 	struct psp_gfx_cmd_resp *cmd;
    308 
    309 	cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
    310 	if (!cmd)
    311 		return -ENOMEM;
    312 
    313 	psp_prep_tmr_cmd_buf(psp, cmd, psp->tmr_mc_addr,
    314 			     amdgpu_bo_size(psp->tmr_bo));
    315 	DRM_INFO("reserve 0x%lx from 0x%"PRIx64" for PSP TMR\n",
    316 		 amdgpu_bo_size(psp->tmr_bo), psp->tmr_mc_addr);
    317 
    318 	ret = psp_cmd_submit_buf(psp, NULL, cmd,
    319 				 psp->fence_buf_mc_addr);
    320 
    321 	kfree(cmd);
    322 
    323 	return ret;
    324 }
    325 
    326 static void psp_prep_asd_load_cmd_buf(struct psp_gfx_cmd_resp *cmd,
    327 				uint64_t asd_mc, uint32_t size)
    328 {
    329 	cmd->cmd_id = GFX_CMD_ID_LOAD_ASD;
    330 	cmd->cmd.cmd_load_ta.app_phy_addr_lo = lower_32_bits(asd_mc);
    331 	cmd->cmd.cmd_load_ta.app_phy_addr_hi = upper_32_bits(asd_mc);
    332 	cmd->cmd.cmd_load_ta.app_len = size;
    333 
    334 	cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_lo = 0;
    335 	cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_hi = 0;
    336 	cmd->cmd.cmd_load_ta.cmd_buf_len = 0;
    337 }
    338 
    339 static int psp_asd_load(struct psp_context *psp)
    340 {
    341 	int ret;
    342 	struct psp_gfx_cmd_resp *cmd;
    343 
    344 	/* If PSP version doesn't match ASD version, asd loading will be failed.
    345 	 * add workaround to bypass it for sriov now.
    346 	 * TODO: add version check to make it common
    347 	 */
    348 	if (amdgpu_sriov_vf(psp->adev))
    349 		return 0;
    350 
    351 	cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
    352 	if (!cmd)
    353 		return -ENOMEM;
    354 
    355 	memset(psp->fw_pri_buf, 0, PSP_1_MEG);
    356 	memcpy(psp->fw_pri_buf, psp->asd_start_addr, psp->asd_ucode_size);
    357 
    358 	psp_prep_asd_load_cmd_buf(cmd, psp->fw_pri_mc_addr,
    359 				  psp->asd_ucode_size);
    360 
    361 	ret = psp_cmd_submit_buf(psp, NULL, cmd,
    362 				 psp->fence_buf_mc_addr);
    363 	if (!ret) {
    364 		psp->asd_context.asd_initialized = true;
    365 		psp->asd_context.session_id = cmd->resp.session_id;
    366 	}
    367 
    368 	kfree(cmd);
    369 
    370 	return ret;
    371 }
    372 
    373 static void psp_prep_ta_unload_cmd_buf(struct psp_gfx_cmd_resp *cmd,
    374 				       uint32_t session_id)
    375 {
    376 	cmd->cmd_id = GFX_CMD_ID_UNLOAD_TA;
    377 	cmd->cmd.cmd_unload_ta.session_id = session_id;
    378 }
    379 
    380 static int psp_asd_unload(struct psp_context *psp)
    381 {
    382 	int ret;
    383 	struct psp_gfx_cmd_resp *cmd;
    384 
    385 	if (amdgpu_sriov_vf(psp->adev))
    386 		return 0;
    387 
    388 	if (!psp->asd_context.asd_initialized)
    389 		return 0;
    390 
    391 	cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
    392 	if (!cmd)
    393 		return -ENOMEM;
    394 
    395 	psp_prep_ta_unload_cmd_buf(cmd, psp->asd_context.session_id);
    396 
    397 	ret = psp_cmd_submit_buf(psp, NULL, cmd,
    398 				 psp->fence_buf_mc_addr);
    399 	if (!ret)
    400 		psp->asd_context.asd_initialized = false;
    401 
    402 	kfree(cmd);
    403 
    404 	return ret;
    405 }
    406 
    407 static void psp_prep_reg_prog_cmd_buf(struct psp_gfx_cmd_resp *cmd,
    408 		uint32_t id, uint32_t value)
    409 {
    410 	cmd->cmd_id = GFX_CMD_ID_PROG_REG;
    411 	cmd->cmd.cmd_setup_reg_prog.reg_value = value;
    412 	cmd->cmd.cmd_setup_reg_prog.reg_id = id;
    413 }
    414 
    415 int psp_reg_program(struct psp_context *psp, enum psp_reg_prog_id reg,
    416 		uint32_t value)
    417 {
    418 	struct psp_gfx_cmd_resp *cmd = NULL;
    419 	int ret = 0;
    420 
    421 	if (reg >= PSP_REG_LAST)
    422 		return -EINVAL;
    423 
    424 	cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
    425 	if (!cmd)
    426 		return -ENOMEM;
    427 
    428 	psp_prep_reg_prog_cmd_buf(cmd, reg, value);
    429 	ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
    430 
    431 	kfree(cmd);
    432 	return ret;
    433 }
    434 
    435 static void psp_prep_ta_load_cmd_buf(struct psp_gfx_cmd_resp *cmd,
    436 				     uint64_t ta_bin_mc,
    437 				     uint32_t ta_bin_size,
    438 				     uint64_t ta_shared_mc,
    439 				     uint32_t ta_shared_size)
    440 {
    441 	cmd->cmd_id 				= GFX_CMD_ID_LOAD_TA;
    442 	cmd->cmd.cmd_load_ta.app_phy_addr_lo 	= lower_32_bits(ta_bin_mc);
    443 	cmd->cmd.cmd_load_ta.app_phy_addr_hi 	= upper_32_bits(ta_bin_mc);
    444 	cmd->cmd.cmd_load_ta.app_len 		= ta_bin_size;
    445 
    446 	cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_lo = lower_32_bits(ta_shared_mc);
    447 	cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_hi = upper_32_bits(ta_shared_mc);
    448 	cmd->cmd.cmd_load_ta.cmd_buf_len 	 = ta_shared_size;
    449 }
    450 
    451 static int psp_xgmi_init_shared_buf(struct psp_context *psp)
    452 {
    453 	int ret;
    454 
    455 	/*
    456 	 * Allocate 16k memory aligned to 4k from Frame Buffer (local
    457 	 * physical) for xgmi ta <-> Driver
    458 	 */
    459 	ret = amdgpu_bo_create_kernel(psp->adev, PSP_XGMI_SHARED_MEM_SIZE,
    460 				      PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
    461 				      &psp->xgmi_context.xgmi_shared_bo,
    462 				      &psp->xgmi_context.xgmi_shared_mc_addr,
    463 				      &psp->xgmi_context.xgmi_shared_buf);
    464 
    465 	return ret;
    466 }
    467 
    468 static void psp_prep_ta_invoke_cmd_buf(struct psp_gfx_cmd_resp *cmd,
    469 				       uint32_t ta_cmd_id,
    470 				       uint32_t session_id)
    471 {
    472 	cmd->cmd_id 				= GFX_CMD_ID_INVOKE_CMD;
    473 	cmd->cmd.cmd_invoke_cmd.session_id 	= session_id;
    474 	cmd->cmd.cmd_invoke_cmd.ta_cmd_id 	= ta_cmd_id;
    475 }
    476 
    477 int psp_ta_invoke(struct psp_context *psp,
    478 		  uint32_t ta_cmd_id,
    479 		  uint32_t session_id)
    480 {
    481 	int ret;
    482 	struct psp_gfx_cmd_resp *cmd;
    483 
    484 	cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
    485 	if (!cmd)
    486 		return -ENOMEM;
    487 
    488 	psp_prep_ta_invoke_cmd_buf(cmd, ta_cmd_id, session_id);
    489 
    490 	ret = psp_cmd_submit_buf(psp, NULL, cmd,
    491 				 psp->fence_buf_mc_addr);
    492 
    493 	kfree(cmd);
    494 
    495 	return ret;
    496 }
    497 
    498 static int psp_xgmi_load(struct psp_context *psp)
    499 {
    500 	int ret;
    501 	struct psp_gfx_cmd_resp *cmd;
    502 
    503 	/*
    504 	 * TODO: bypass the loading in sriov for now
    505 	 */
    506 
    507 	cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
    508 	if (!cmd)
    509 		return -ENOMEM;
    510 
    511 	memset(psp->fw_pri_buf, 0, PSP_1_MEG);
    512 	memcpy(psp->fw_pri_buf, psp->ta_xgmi_start_addr, psp->ta_xgmi_ucode_size);
    513 
    514 	psp_prep_ta_load_cmd_buf(cmd,
    515 				 psp->fw_pri_mc_addr,
    516 				 psp->ta_xgmi_ucode_size,
    517 				 psp->xgmi_context.xgmi_shared_mc_addr,
    518 				 PSP_XGMI_SHARED_MEM_SIZE);
    519 
    520 	ret = psp_cmd_submit_buf(psp, NULL, cmd,
    521 				 psp->fence_buf_mc_addr);
    522 
    523 	if (!ret) {
    524 		psp->xgmi_context.initialized = 1;
    525 		psp->xgmi_context.session_id = cmd->resp.session_id;
    526 	}
    527 
    528 	kfree(cmd);
    529 
    530 	return ret;
    531 }
    532 
    533 static int psp_xgmi_unload(struct psp_context *psp)
    534 {
    535 	int ret;
    536 	struct psp_gfx_cmd_resp *cmd;
    537 	struct amdgpu_device *adev = psp->adev;
    538 
    539 	/* XGMI TA unload currently is not supported on Arcturus */
    540 	if (adev->asic_type == CHIP_ARCTURUS)
    541 		return 0;
    542 
    543 	/*
    544 	 * TODO: bypass the unloading in sriov for now
    545 	 */
    546 
    547 	cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
    548 	if (!cmd)
    549 		return -ENOMEM;
    550 
    551 	psp_prep_ta_unload_cmd_buf(cmd, psp->xgmi_context.session_id);
    552 
    553 	ret = psp_cmd_submit_buf(psp, NULL, cmd,
    554 				 psp->fence_buf_mc_addr);
    555 
    556 	kfree(cmd);
    557 
    558 	return ret;
    559 }
    560 
    561 int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
    562 {
    563 	return psp_ta_invoke(psp, ta_cmd_id, psp->xgmi_context.session_id);
    564 }
    565 
    566 static int psp_xgmi_terminate(struct psp_context *psp)
    567 {
    568 	int ret;
    569 
    570 	if (!psp->xgmi_context.initialized)
    571 		return 0;
    572 
    573 	ret = psp_xgmi_unload(psp);
    574 	if (ret)
    575 		return ret;
    576 
    577 	psp->xgmi_context.initialized = 0;
    578 
    579 	/* free xgmi shared memory */
    580 	amdgpu_bo_free_kernel(&psp->xgmi_context.xgmi_shared_bo,
    581 			&psp->xgmi_context.xgmi_shared_mc_addr,
    582 			&psp->xgmi_context.xgmi_shared_buf);
    583 
    584 	return 0;
    585 }
    586 
    587 static int psp_xgmi_initialize(struct psp_context *psp)
    588 {
    589 	struct ta_xgmi_shared_memory *xgmi_cmd;
    590 	int ret;
    591 
    592 	if (!psp->adev->psp.ta_fw ||
    593 	    !psp->adev->psp.ta_xgmi_ucode_size ||
    594 	    !psp->adev->psp.ta_xgmi_start_addr)
    595 		return -ENOENT;
    596 
    597 	if (!psp->xgmi_context.initialized) {
    598 		ret = psp_xgmi_init_shared_buf(psp);
    599 		if (ret)
    600 			return ret;
    601 	}
    602 
    603 	/* Load XGMI TA */
    604 	ret = psp_xgmi_load(psp);
    605 	if (ret)
    606 		return ret;
    607 
    608 	/* Initialize XGMI session */
    609 	xgmi_cmd = (struct ta_xgmi_shared_memory *)(psp->xgmi_context.xgmi_shared_buf);
    610 	memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
    611 	xgmi_cmd->cmd_id = TA_COMMAND_XGMI__INITIALIZE;
    612 
    613 	ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
    614 
    615 	return ret;
    616 }
    617 
    618 // ras begin
    619 static int psp_ras_init_shared_buf(struct psp_context *psp)
    620 {
    621 	int ret;
    622 
    623 	/*
    624 	 * Allocate 16k memory aligned to 4k from Frame Buffer (local
    625 	 * physical) for ras ta <-> Driver
    626 	 */
    627 	ret = amdgpu_bo_create_kernel(psp->adev, PSP_RAS_SHARED_MEM_SIZE,
    628 			PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
    629 			&psp->ras.ras_shared_bo,
    630 			&psp->ras.ras_shared_mc_addr,
    631 			&psp->ras.ras_shared_buf);
    632 
    633 	return ret;
    634 }
    635 
    636 static int psp_ras_load(struct psp_context *psp)
    637 {
    638 	int ret;
    639 	struct psp_gfx_cmd_resp *cmd;
    640 
    641 	/*
    642 	 * TODO: bypass the loading in sriov for now
    643 	 */
    644 	if (amdgpu_sriov_vf(psp->adev))
    645 		return 0;
    646 
    647 	cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
    648 	if (!cmd)
    649 		return -ENOMEM;
    650 
    651 	memset(psp->fw_pri_buf, 0, PSP_1_MEG);
    652 	memcpy(psp->fw_pri_buf, psp->ta_ras_start_addr, psp->ta_ras_ucode_size);
    653 
    654 	psp_prep_ta_load_cmd_buf(cmd,
    655 				 psp->fw_pri_mc_addr,
    656 				 psp->ta_ras_ucode_size,
    657 				 psp->ras.ras_shared_mc_addr,
    658 				 PSP_RAS_SHARED_MEM_SIZE);
    659 
    660 	ret = psp_cmd_submit_buf(psp, NULL, cmd,
    661 			psp->fence_buf_mc_addr);
    662 
    663 	if (!ret) {
    664 		psp->ras.ras_initialized = true;
    665 		psp->ras.session_id = cmd->resp.session_id;
    666 	}
    667 
    668 	kfree(cmd);
    669 
    670 	return ret;
    671 }
    672 
    673 static int psp_ras_unload(struct psp_context *psp)
    674 {
    675 	int ret;
    676 	struct psp_gfx_cmd_resp *cmd;
    677 
    678 	/*
    679 	 * TODO: bypass the unloading in sriov for now
    680 	 */
    681 	if (amdgpu_sriov_vf(psp->adev))
    682 		return 0;
    683 
    684 	cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
    685 	if (!cmd)
    686 		return -ENOMEM;
    687 
    688 	psp_prep_ta_unload_cmd_buf(cmd, psp->ras.session_id);
    689 
    690 	ret = psp_cmd_submit_buf(psp, NULL, cmd,
    691 			psp->fence_buf_mc_addr);
    692 
    693 	kfree(cmd);
    694 
    695 	return ret;
    696 }
    697 
    698 int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
    699 {
    700 	/*
    701 	 * TODO: bypass the loading in sriov for now
    702 	 */
    703 	if (amdgpu_sriov_vf(psp->adev))
    704 		return 0;
    705 
    706 	return psp_ta_invoke(psp, ta_cmd_id, psp->ras.session_id);
    707 }
    708 
    709 int psp_ras_enable_features(struct psp_context *psp,
    710 		union ta_ras_cmd_input *info, bool enable)
    711 {
    712 	struct ta_ras_shared_memory *ras_cmd;
    713 	int ret;
    714 
    715 	if (!psp->ras.ras_initialized)
    716 		return -EINVAL;
    717 
    718 	ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
    719 	memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));
    720 
    721 	if (enable)
    722 		ras_cmd->cmd_id = TA_RAS_COMMAND__ENABLE_FEATURES;
    723 	else
    724 		ras_cmd->cmd_id = TA_RAS_COMMAND__DISABLE_FEATURES;
    725 
    726 	ras_cmd->ras_in_message = *info;
    727 
    728 	ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
    729 	if (ret)
    730 		return -EINVAL;
    731 
    732 	return ras_cmd->ras_status;
    733 }
    734 
    735 static int psp_ras_terminate(struct psp_context *psp)
    736 {
    737 	int ret;
    738 
    739 	/*
    740 	 * TODO: bypass the terminate in sriov for now
    741 	 */
    742 	if (amdgpu_sriov_vf(psp->adev))
    743 		return 0;
    744 
    745 	if (!psp->ras.ras_initialized)
    746 		return 0;
    747 
    748 	ret = psp_ras_unload(psp);
    749 	if (ret)
    750 		return ret;
    751 
    752 	psp->ras.ras_initialized = false;
    753 
    754 	/* free ras shared memory */
    755 	amdgpu_bo_free_kernel(&psp->ras.ras_shared_bo,
    756 			&psp->ras.ras_shared_mc_addr,
    757 			&psp->ras.ras_shared_buf);
    758 
    759 	return 0;
    760 }
    761 
    762 static int psp_ras_initialize(struct psp_context *psp)
    763 {
    764 	int ret;
    765 
    766 	/*
    767 	 * TODO: bypass the initialize in sriov for now
    768 	 */
    769 	if (amdgpu_sriov_vf(psp->adev))
    770 		return 0;
    771 
    772 	if (!psp->adev->psp.ta_ras_ucode_size ||
    773 	    !psp->adev->psp.ta_ras_start_addr) {
    774 		dev_warn(psp->adev->dev, "RAS: ras ta ucode is not available\n");
    775 		return 0;
    776 	}
    777 
    778 	if (!psp->ras.ras_initialized) {
    779 		ret = psp_ras_init_shared_buf(psp);
    780 		if (ret)
    781 			return ret;
    782 	}
    783 
    784 	ret = psp_ras_load(psp);
    785 	if (ret)
    786 		return ret;
    787 
    788 	return 0;
    789 }
    790 // ras end
    791 
    792 // HDCP start
    793 static int psp_hdcp_init_shared_buf(struct psp_context *psp)
    794 {
    795 	int ret;
    796 
    797 	/*
    798 	 * Allocate 16k memory aligned to 4k from Frame Buffer (local
    799 	 * physical) for hdcp ta <-> Driver
    800 	 */
    801 	ret = amdgpu_bo_create_kernel(psp->adev, PSP_HDCP_SHARED_MEM_SIZE,
    802 				      PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
    803 				      &psp->hdcp_context.hdcp_shared_bo,
    804 				      &psp->hdcp_context.hdcp_shared_mc_addr,
    805 				      &psp->hdcp_context.hdcp_shared_buf);
    806 
    807 	return ret;
    808 }
    809 
    810 static int psp_hdcp_load(struct psp_context *psp)
    811 {
    812 	int ret;
    813 	struct psp_gfx_cmd_resp *cmd;
    814 
    815 	/*
    816 	 * TODO: bypass the loading in sriov for now
    817 	 */
    818 	if (amdgpu_sriov_vf(psp->adev))
    819 		return 0;
    820 
    821 	cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
    822 	if (!cmd)
    823 		return -ENOMEM;
    824 
    825 	memset(psp->fw_pri_buf, 0, PSP_1_MEG);
    826 	memcpy(psp->fw_pri_buf, psp->ta_hdcp_start_addr,
    827 	       psp->ta_hdcp_ucode_size);
    828 
    829 	psp_prep_ta_load_cmd_buf(cmd,
    830 				 psp->fw_pri_mc_addr,
    831 				 psp->ta_hdcp_ucode_size,
    832 				 psp->hdcp_context.hdcp_shared_mc_addr,
    833 				 PSP_HDCP_SHARED_MEM_SIZE);
    834 
    835 	ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
    836 
    837 	if (!ret) {
    838 		psp->hdcp_context.hdcp_initialized = true;
    839 		psp->hdcp_context.session_id = cmd->resp.session_id;
    840 	}
    841 
    842 	kfree(cmd);
    843 
    844 	return ret;
    845 }
    846 static int psp_hdcp_initialize(struct psp_context *psp)
    847 {
    848 	int ret;
    849 
    850 	/*
    851 	 * TODO: bypass the initialize in sriov for now
    852 	 */
    853 	if (amdgpu_sriov_vf(psp->adev))
    854 		return 0;
    855 
    856 	if (!psp->adev->psp.ta_hdcp_ucode_size ||
    857 	    !psp->adev->psp.ta_hdcp_start_addr) {
    858 		dev_warn(psp->adev->dev, "HDCP: hdcp ta ucode is not available\n");
    859 		return 0;
    860 	}
    861 
    862 	if (!psp->hdcp_context.hdcp_initialized) {
    863 		ret = psp_hdcp_init_shared_buf(psp);
    864 		if (ret)
    865 			return ret;
    866 	}
    867 
    868 	ret = psp_hdcp_load(psp);
    869 	if (ret)
    870 		return ret;
    871 
    872 	return 0;
    873 }
    874 
    875 static int psp_hdcp_unload(struct psp_context *psp)
    876 {
    877 	int ret;
    878 	struct psp_gfx_cmd_resp *cmd;
    879 
    880 	/*
    881 	 * TODO: bypass the unloading in sriov for now
    882 	 */
    883 	if (amdgpu_sriov_vf(psp->adev))
    884 		return 0;
    885 
    886 	cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
    887 	if (!cmd)
    888 		return -ENOMEM;
    889 
    890 	psp_prep_ta_unload_cmd_buf(cmd, psp->hdcp_context.session_id);
    891 
    892 	ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
    893 
    894 	kfree(cmd);
    895 
    896 	return ret;
    897 }
    898 
    899 int psp_hdcp_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
    900 {
    901 	/*
    902 	 * TODO: bypass the loading in sriov for now
    903 	 */
    904 	if (amdgpu_sriov_vf(psp->adev))
    905 		return 0;
    906 
    907 	return psp_ta_invoke(psp, ta_cmd_id, psp->hdcp_context.session_id);
    908 }
    909 
    910 static int psp_hdcp_terminate(struct psp_context *psp)
    911 {
    912 	int ret;
    913 
    914 	/*
    915 	 * TODO: bypass the terminate in sriov for now
    916 	 */
    917 	if (amdgpu_sriov_vf(psp->adev))
    918 		return 0;
    919 
    920 	if (!psp->hdcp_context.hdcp_initialized)
    921 		return 0;
    922 
    923 	ret = psp_hdcp_unload(psp);
    924 	if (ret)
    925 		return ret;
    926 
    927 	psp->hdcp_context.hdcp_initialized = false;
    928 
    929 	/* free hdcp shared memory */
    930 	amdgpu_bo_free_kernel(&psp->hdcp_context.hdcp_shared_bo,
    931 			      &psp->hdcp_context.hdcp_shared_mc_addr,
    932 			      &psp->hdcp_context.hdcp_shared_buf);
    933 
    934 	return 0;
    935 }
    936 // HDCP end
    937 
    938 // DTM start
    939 static int psp_dtm_init_shared_buf(struct psp_context *psp)
    940 {
    941 	int ret;
    942 
    943 	/*
    944 	 * Allocate 16k memory aligned to 4k from Frame Buffer (local
    945 	 * physical) for dtm ta <-> Driver
    946 	 */
    947 	ret = amdgpu_bo_create_kernel(psp->adev, PSP_DTM_SHARED_MEM_SIZE,
    948 				      PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
    949 				      &psp->dtm_context.dtm_shared_bo,
    950 				      &psp->dtm_context.dtm_shared_mc_addr,
    951 				      &psp->dtm_context.dtm_shared_buf);
    952 
    953 	return ret;
    954 }
    955 
    956 static int psp_dtm_load(struct psp_context *psp)
    957 {
    958 	int ret;
    959 	struct psp_gfx_cmd_resp *cmd;
    960 
    961 	/*
    962 	 * TODO: bypass the loading in sriov for now
    963 	 */
    964 	if (amdgpu_sriov_vf(psp->adev))
    965 		return 0;
    966 
    967 	cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
    968 	if (!cmd)
    969 		return -ENOMEM;
    970 
    971 	memset(psp->fw_pri_buf, 0, PSP_1_MEG);
    972 	memcpy(psp->fw_pri_buf, psp->ta_dtm_start_addr, psp->ta_dtm_ucode_size);
    973 
    974 	psp_prep_ta_load_cmd_buf(cmd,
    975 				 psp->fw_pri_mc_addr,
    976 				 psp->ta_dtm_ucode_size,
    977 				 psp->dtm_context.dtm_shared_mc_addr,
    978 				 PSP_DTM_SHARED_MEM_SIZE);
    979 
    980 	ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
    981 
    982 	if (!ret) {
    983 		psp->dtm_context.dtm_initialized = true;
    984 		psp->dtm_context.session_id = cmd->resp.session_id;
    985 	}
    986 
    987 	kfree(cmd);
    988 
    989 	return ret;
    990 }
    991 
    992 static int psp_dtm_initialize(struct psp_context *psp)
    993 {
    994 	int ret;
    995 
    996 	/*
    997 	 * TODO: bypass the initialize in sriov for now
    998 	 */
    999 	if (amdgpu_sriov_vf(psp->adev))
   1000 		return 0;
   1001 
   1002 	if (!psp->adev->psp.ta_dtm_ucode_size ||
   1003 	    !psp->adev->psp.ta_dtm_start_addr) {
   1004 		dev_warn(psp->adev->dev, "DTM: dtm ta ucode is not available\n");
   1005 		return 0;
   1006 	}
   1007 
   1008 	if (!psp->dtm_context.dtm_initialized) {
   1009 		ret = psp_dtm_init_shared_buf(psp);
   1010 		if (ret)
   1011 			return ret;
   1012 	}
   1013 
   1014 	ret = psp_dtm_load(psp);
   1015 	if (ret)
   1016 		return ret;
   1017 
   1018 	return 0;
   1019 }
   1020 
   1021 static int psp_dtm_unload(struct psp_context *psp)
   1022 {
   1023 	int ret;
   1024 	struct psp_gfx_cmd_resp *cmd;
   1025 
   1026 	/*
   1027 	 * TODO: bypass the unloading in sriov for now
   1028 	 */
   1029 	if (amdgpu_sriov_vf(psp->adev))
   1030 		return 0;
   1031 
   1032 	cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
   1033 	if (!cmd)
   1034 		return -ENOMEM;
   1035 
   1036 	psp_prep_ta_unload_cmd_buf(cmd, psp->dtm_context.session_id);
   1037 
   1038 	ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
   1039 
   1040 	kfree(cmd);
   1041 
   1042 	return ret;
   1043 }
   1044 
   1045 int psp_dtm_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
   1046 {
   1047 	/*
   1048 	 * TODO: bypass the loading in sriov for now
   1049 	 */
   1050 	if (amdgpu_sriov_vf(psp->adev))
   1051 		return 0;
   1052 
   1053 	return psp_ta_invoke(psp, ta_cmd_id, psp->dtm_context.session_id);
   1054 }
   1055 
   1056 static int psp_dtm_terminate(struct psp_context *psp)
   1057 {
   1058 	int ret;
   1059 
   1060 	/*
   1061 	 * TODO: bypass the terminate in sriov for now
   1062 	 */
   1063 	if (amdgpu_sriov_vf(psp->adev))
   1064 		return 0;
   1065 
   1066 	if (!psp->dtm_context.dtm_initialized)
   1067 		return 0;
   1068 
   1069 	ret = psp_dtm_unload(psp);
   1070 	if (ret)
   1071 		return ret;
   1072 
   1073 	psp->dtm_context.dtm_initialized = false;
   1074 
   1075 	/* free hdcp shared memory */
   1076 	amdgpu_bo_free_kernel(&psp->dtm_context.dtm_shared_bo,
   1077 			      &psp->dtm_context.dtm_shared_mc_addr,
   1078 			      &psp->dtm_context.dtm_shared_buf);
   1079 
   1080 	return 0;
   1081 }
   1082 // DTM end
   1083 
   1084 static int psp_hw_start(struct psp_context *psp)
   1085 {
   1086 	struct amdgpu_device *adev = psp->adev;
   1087 	int ret;
   1088 
   1089 	if (!amdgpu_sriov_vf(adev) || !adev->in_gpu_reset) {
   1090 		if (psp->kdb_bin_size &&
   1091 		    (psp->funcs->bootloader_load_kdb != NULL)) {
   1092 			ret = psp_bootloader_load_kdb(psp);
   1093 			if (ret) {
   1094 				DRM_ERROR("PSP load kdb failed!\n");
   1095 				return ret;
   1096 			}
   1097 		}
   1098 
   1099 		ret = psp_bootloader_load_sysdrv(psp);
   1100 		if (ret) {
   1101 			DRM_ERROR("PSP load sysdrv failed!\n");
   1102 			return ret;
   1103 		}
   1104 
   1105 		ret = psp_bootloader_load_sos(psp);
   1106 		if (ret) {
   1107 			DRM_ERROR("PSP load sos failed!\n");
   1108 			return ret;
   1109 		}
   1110 	}
   1111 
   1112 	ret = psp_ring_create(psp, PSP_RING_TYPE__KM);
   1113 	if (ret) {
   1114 		DRM_ERROR("PSP create ring failed!\n");
   1115 		return ret;
   1116 	}
   1117 
   1118 	ret = psp_tmr_init(psp);
   1119 	if (ret) {
   1120 		DRM_ERROR("PSP tmr init failed!\n");
   1121 		return ret;
   1122 	}
   1123 
   1124 	ret = psp_tmr_load(psp);
   1125 	if (ret) {
   1126 		DRM_ERROR("PSP load tmr failed!\n");
   1127 		return ret;
   1128 	}
   1129 
   1130 	return 0;
   1131 }
   1132 
   1133 static int psp_get_fw_type(struct amdgpu_firmware_info *ucode,
   1134 			   enum psp_gfx_fw_type *type)
   1135 {
   1136 	switch (ucode->ucode_id) {
   1137 	case AMDGPU_UCODE_ID_SDMA0:
   1138 		*type = GFX_FW_TYPE_SDMA0;
   1139 		break;
   1140 	case AMDGPU_UCODE_ID_SDMA1:
   1141 		*type = GFX_FW_TYPE_SDMA1;
   1142 		break;
   1143 	case AMDGPU_UCODE_ID_SDMA2:
   1144 		*type = GFX_FW_TYPE_SDMA2;
   1145 		break;
   1146 	case AMDGPU_UCODE_ID_SDMA3:
   1147 		*type = GFX_FW_TYPE_SDMA3;
   1148 		break;
   1149 	case AMDGPU_UCODE_ID_SDMA4:
   1150 		*type = GFX_FW_TYPE_SDMA4;
   1151 		break;
   1152 	case AMDGPU_UCODE_ID_SDMA5:
   1153 		*type = GFX_FW_TYPE_SDMA5;
   1154 		break;
   1155 	case AMDGPU_UCODE_ID_SDMA6:
   1156 		*type = GFX_FW_TYPE_SDMA6;
   1157 		break;
   1158 	case AMDGPU_UCODE_ID_SDMA7:
   1159 		*type = GFX_FW_TYPE_SDMA7;
   1160 		break;
   1161 	case AMDGPU_UCODE_ID_CP_CE:
   1162 		*type = GFX_FW_TYPE_CP_CE;
   1163 		break;
   1164 	case AMDGPU_UCODE_ID_CP_PFP:
   1165 		*type = GFX_FW_TYPE_CP_PFP;
   1166 		break;
   1167 	case AMDGPU_UCODE_ID_CP_ME:
   1168 		*type = GFX_FW_TYPE_CP_ME;
   1169 		break;
   1170 	case AMDGPU_UCODE_ID_CP_MEC1:
   1171 		*type = GFX_FW_TYPE_CP_MEC;
   1172 		break;
   1173 	case AMDGPU_UCODE_ID_CP_MEC1_JT:
   1174 		*type = GFX_FW_TYPE_CP_MEC_ME1;
   1175 		break;
   1176 	case AMDGPU_UCODE_ID_CP_MEC2:
   1177 		*type = GFX_FW_TYPE_CP_MEC;
   1178 		break;
   1179 	case AMDGPU_UCODE_ID_CP_MEC2_JT:
   1180 		*type = GFX_FW_TYPE_CP_MEC_ME2;
   1181 		break;
   1182 	case AMDGPU_UCODE_ID_RLC_G:
   1183 		*type = GFX_FW_TYPE_RLC_G;
   1184 		break;
   1185 	case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL:
   1186 		*type = GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_CNTL;
   1187 		break;
   1188 	case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM:
   1189 		*type = GFX_FW_TYPE_RLC_RESTORE_LIST_GPM_MEM;
   1190 		break;
   1191 	case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM:
   1192 		*type = GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_MEM;
   1193 		break;
   1194 	case AMDGPU_UCODE_ID_SMC:
   1195 		*type = GFX_FW_TYPE_SMU;
   1196 		break;
   1197 	case AMDGPU_UCODE_ID_UVD:
   1198 		*type = GFX_FW_TYPE_UVD;
   1199 		break;
   1200 	case AMDGPU_UCODE_ID_UVD1:
   1201 		*type = GFX_FW_TYPE_UVD1;
   1202 		break;
   1203 	case AMDGPU_UCODE_ID_VCE:
   1204 		*type = GFX_FW_TYPE_VCE;
   1205 		break;
   1206 	case AMDGPU_UCODE_ID_VCN:
   1207 		*type = GFX_FW_TYPE_VCN;
   1208 		break;
   1209 	case AMDGPU_UCODE_ID_VCN1:
   1210 		*type = GFX_FW_TYPE_VCN1;
   1211 		break;
   1212 	case AMDGPU_UCODE_ID_DMCU_ERAM:
   1213 		*type = GFX_FW_TYPE_DMCU_ERAM;
   1214 		break;
   1215 	case AMDGPU_UCODE_ID_DMCU_INTV:
   1216 		*type = GFX_FW_TYPE_DMCU_ISR;
   1217 		break;
   1218 	case AMDGPU_UCODE_ID_VCN0_RAM:
   1219 		*type = GFX_FW_TYPE_VCN0_RAM;
   1220 		break;
   1221 	case AMDGPU_UCODE_ID_VCN1_RAM:
   1222 		*type = GFX_FW_TYPE_VCN1_RAM;
   1223 		break;
   1224 	case AMDGPU_UCODE_ID_DMCUB:
   1225 		*type = GFX_FW_TYPE_DMUB;
   1226 		break;
   1227 	case AMDGPU_UCODE_ID_MAXIMUM:
   1228 	default:
   1229 		return -EINVAL;
   1230 	}
   1231 
   1232 	return 0;
   1233 }
   1234 
   1235 static void psp_print_fw_hdr(struct psp_context *psp,
   1236 			     struct amdgpu_firmware_info *ucode)
   1237 {
   1238 	struct amdgpu_device *adev = psp->adev;
   1239 	struct common_firmware_header *hdr;
   1240 
   1241 	switch (ucode->ucode_id) {
   1242 	case AMDGPU_UCODE_ID_SDMA0:
   1243 	case AMDGPU_UCODE_ID_SDMA1:
   1244 	case AMDGPU_UCODE_ID_SDMA2:
   1245 	case AMDGPU_UCODE_ID_SDMA3:
   1246 	case AMDGPU_UCODE_ID_SDMA4:
   1247 	case AMDGPU_UCODE_ID_SDMA5:
   1248 	case AMDGPU_UCODE_ID_SDMA6:
   1249 	case AMDGPU_UCODE_ID_SDMA7:
   1250 		hdr = (struct common_firmware_header *)
   1251 			adev->sdma.instance[ucode->ucode_id - AMDGPU_UCODE_ID_SDMA0].fw->data;
   1252 		amdgpu_ucode_print_sdma_hdr(hdr);
   1253 		break;
   1254 	case AMDGPU_UCODE_ID_CP_CE:
   1255 		hdr = (struct common_firmware_header *)adev->gfx.ce_fw->data;
   1256 		amdgpu_ucode_print_gfx_hdr(hdr);
   1257 		break;
   1258 	case AMDGPU_UCODE_ID_CP_PFP:
   1259 		hdr = (struct common_firmware_header *)adev->gfx.pfp_fw->data;
   1260 		amdgpu_ucode_print_gfx_hdr(hdr);
   1261 		break;
   1262 	case AMDGPU_UCODE_ID_CP_ME:
   1263 		hdr = (struct common_firmware_header *)adev->gfx.me_fw->data;
   1264 		amdgpu_ucode_print_gfx_hdr(hdr);
   1265 		break;
   1266 	case AMDGPU_UCODE_ID_CP_MEC1:
   1267 		hdr = (struct common_firmware_header *)adev->gfx.mec_fw->data;
   1268 		amdgpu_ucode_print_gfx_hdr(hdr);
   1269 		break;
   1270 	case AMDGPU_UCODE_ID_RLC_G:
   1271 		hdr = (struct common_firmware_header *)adev->gfx.rlc_fw->data;
   1272 		amdgpu_ucode_print_rlc_hdr(hdr);
   1273 		break;
   1274 	case AMDGPU_UCODE_ID_SMC:
   1275 		hdr = (struct common_firmware_header *)adev->pm.fw->data;
   1276 		amdgpu_ucode_print_smc_hdr(hdr);
   1277 		break;
   1278 	default:
   1279 		break;
   1280 	}
   1281 }
   1282 
   1283 static int psp_prep_load_ip_fw_cmd_buf(struct amdgpu_firmware_info *ucode,
   1284 				       struct psp_gfx_cmd_resp *cmd)
   1285 {
   1286 	int ret;
   1287 	uint64_t fw_mem_mc_addr = ucode->mc_addr;
   1288 
   1289 	memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp));
   1290 
   1291 	cmd->cmd_id = GFX_CMD_ID_LOAD_IP_FW;
   1292 	cmd->cmd.cmd_load_ip_fw.fw_phy_addr_lo = lower_32_bits(fw_mem_mc_addr);
   1293 	cmd->cmd.cmd_load_ip_fw.fw_phy_addr_hi = upper_32_bits(fw_mem_mc_addr);
   1294 	cmd->cmd.cmd_load_ip_fw.fw_size = ucode->ucode_size;
   1295 
   1296 	ret = psp_get_fw_type(ucode, &cmd->cmd.cmd_load_ip_fw.fw_type);
   1297 	if (ret)
   1298 		DRM_ERROR("Unknown firmware type\n");
   1299 
   1300 	return ret;
   1301 }
   1302 
   1303 static int psp_execute_np_fw_load(struct psp_context *psp,
   1304 			       struct amdgpu_firmware_info *ucode)
   1305 {
   1306 	int ret = 0;
   1307 
   1308 	ret = psp_prep_load_ip_fw_cmd_buf(ucode, psp->cmd);
   1309 	if (ret)
   1310 		return ret;
   1311 
   1312 	ret = psp_cmd_submit_buf(psp, ucode, psp->cmd,
   1313 				 psp->fence_buf_mc_addr);
   1314 
   1315 	return ret;
   1316 }
   1317 
   1318 static int psp_np_fw_load(struct psp_context *psp)
   1319 {
   1320 	int i, ret;
   1321 	struct amdgpu_firmware_info *ucode;
   1322 	struct amdgpu_device* adev = psp->adev;
   1323 
   1324 	if (psp->autoload_supported) {
   1325 		ucode = &adev->firmware.ucode[AMDGPU_UCODE_ID_SMC];
   1326 		if (!ucode->fw)
   1327 			goto out;
   1328 
   1329 		ret = psp_execute_np_fw_load(psp, ucode);
   1330 		if (ret)
   1331 			return ret;
   1332 	}
   1333 
   1334 out:
   1335 	for (i = 0; i < adev->firmware.max_ucodes; i++) {
   1336 		ucode = &adev->firmware.ucode[i];
   1337 		if (!ucode->fw)
   1338 			continue;
   1339 
   1340 		if (ucode->ucode_id == AMDGPU_UCODE_ID_SMC &&
   1341 		    (psp_smu_reload_quirk(psp) || psp->autoload_supported))
   1342 			continue;
   1343 
   1344 		if (amdgpu_sriov_vf(adev) &&
   1345 		   (ucode->ucode_id == AMDGPU_UCODE_ID_SDMA0
   1346 		    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA1
   1347 		    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA2
   1348 		    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA3
   1349 		    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA4
   1350 		    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA5
   1351 		    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA6
   1352 		    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA7
   1353                     || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_G
   1354 	            || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL
   1355 	            || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM
   1356 	            || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM
   1357 	            || ucode->ucode_id == AMDGPU_UCODE_ID_SMC))
   1358 			/*skip ucode loading in SRIOV VF */
   1359 			continue;
   1360 
   1361 		if (psp->autoload_supported &&
   1362 		    (ucode->ucode_id == AMDGPU_UCODE_ID_CP_MEC1_JT ||
   1363 		     ucode->ucode_id == AMDGPU_UCODE_ID_CP_MEC2_JT))
   1364 			/* skip mec JT when autoload is enabled */
   1365 			continue;
   1366 
   1367 		psp_print_fw_hdr(psp, ucode);
   1368 
   1369 		ret = psp_execute_np_fw_load(psp, ucode);
   1370 		if (ret)
   1371 			return ret;
   1372 
   1373 		/* Start rlc autoload after psp recieved all the gfx firmware */
   1374 		if (psp->autoload_supported && ucode->ucode_id == (amdgpu_sriov_vf(adev) ?
   1375 		    AMDGPU_UCODE_ID_CP_MEC2 : AMDGPU_UCODE_ID_RLC_G)) {
   1376 			ret = psp_rlc_autoload(psp);
   1377 			if (ret) {
   1378 				DRM_ERROR("Failed to start rlc autoload\n");
   1379 				return ret;
   1380 			}
   1381 		}
   1382 #if 0
   1383 		/* check if firmware loaded sucessfully */
   1384 		if (!amdgpu_psp_check_fw_loading_status(adev, i))
   1385 			return -EINVAL;
   1386 #endif
   1387 	}
   1388 
   1389 	return 0;
   1390 }
   1391 
   1392 static int psp_load_fw(struct amdgpu_device *adev)
   1393 {
   1394 	int ret;
   1395 	struct psp_context *psp = &adev->psp;
   1396 
   1397 	if (amdgpu_sriov_vf(adev) && adev->in_gpu_reset) {
   1398 		psp_ring_stop(psp, PSP_RING_TYPE__KM); /* should not destroy ring, only stop */
   1399 		goto skip_memalloc;
   1400 	}
   1401 
   1402 	psp->cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
   1403 	if (!psp->cmd)
   1404 		return -ENOMEM;
   1405 
   1406 	ret = amdgpu_bo_create_kernel(adev, PSP_1_MEG, PSP_1_MEG,
   1407 					AMDGPU_GEM_DOMAIN_GTT,
   1408 					&psp->fw_pri_bo,
   1409 					&psp->fw_pri_mc_addr,
   1410 					&psp->fw_pri_buf);
   1411 	if (ret)
   1412 		goto failed;
   1413 
   1414 	ret = amdgpu_bo_create_kernel(adev, PSP_FENCE_BUFFER_SIZE, PAGE_SIZE,
   1415 					AMDGPU_GEM_DOMAIN_VRAM,
   1416 					&psp->fence_buf_bo,
   1417 					&psp->fence_buf_mc_addr,
   1418 					&psp->fence_buf);
   1419 	if (ret)
   1420 		goto failed;
   1421 
   1422 	ret = amdgpu_bo_create_kernel(adev, PSP_CMD_BUFFER_SIZE, PAGE_SIZE,
   1423 				      AMDGPU_GEM_DOMAIN_VRAM,
   1424 				      &psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
   1425 				      (void **)&psp->cmd_buf_mem);
   1426 	if (ret)
   1427 		goto failed;
   1428 
   1429 	memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE);
   1430 
   1431 	ret = psp_ring_init(psp, PSP_RING_TYPE__KM);
   1432 	if (ret) {
   1433 		DRM_ERROR("PSP ring init failed!\n");
   1434 		goto failed;
   1435 	}
   1436 
   1437 skip_memalloc:
   1438 	ret = psp_hw_start(psp);
   1439 	if (ret)
   1440 		goto failed;
   1441 
   1442 	ret = psp_np_fw_load(psp);
   1443 	if (ret)
   1444 		goto failed;
   1445 
   1446 	ret = psp_asd_load(psp);
   1447 	if (ret) {
   1448 		DRM_ERROR("PSP load asd failed!\n");
   1449 		return ret;
   1450 	}
   1451 
   1452 	if (adev->gmc.xgmi.num_physical_nodes > 1) {
   1453 		ret = psp_xgmi_initialize(psp);
   1454 		/* Warning the XGMI seesion initialize failure
   1455 		 * Instead of stop driver initialization
   1456 		 */
   1457 		if (ret)
   1458 			dev_err(psp->adev->dev,
   1459 				"XGMI: Failed to initialize XGMI session\n");
   1460 	}
   1461 
   1462 	if (psp->adev->psp.ta_fw) {
   1463 		ret = psp_ras_initialize(psp);
   1464 		if (ret)
   1465 			dev_err(psp->adev->dev,
   1466 					"RAS: Failed to initialize RAS\n");
   1467 
   1468 		ret = psp_hdcp_initialize(psp);
   1469 		if (ret)
   1470 			dev_err(psp->adev->dev,
   1471 				"HDCP: Failed to initialize HDCP\n");
   1472 
   1473 		ret = psp_dtm_initialize(psp);
   1474 		if (ret)
   1475 			dev_err(psp->adev->dev,
   1476 				"DTM: Failed to initialize DTM\n");
   1477 	}
   1478 
   1479 	return 0;
   1480 
   1481 failed:
   1482 	/*
   1483 	 * all cleanup jobs (xgmi terminate, ras terminate,
   1484 	 * ring destroy, cmd/fence/fw buffers destory,
   1485 	 * psp->cmd destory) are delayed to psp_hw_fini
   1486 	 */
   1487 	return ret;
   1488 }
   1489 
   1490 static int psp_hw_init(void *handle)
   1491 {
   1492 	int ret;
   1493 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
   1494 
   1495 	mutex_lock(&adev->firmware.mutex);
   1496 	/*
   1497 	 * This sequence is just used on hw_init only once, no need on
   1498 	 * resume.
   1499 	 */
   1500 	ret = amdgpu_ucode_init_bo(adev);
   1501 	if (ret)
   1502 		goto failed;
   1503 
   1504 	ret = psp_load_fw(adev);
   1505 	if (ret) {
   1506 		DRM_ERROR("PSP firmware loading failed\n");
   1507 		goto failed;
   1508 	}
   1509 
   1510 	mutex_unlock(&adev->firmware.mutex);
   1511 	return 0;
   1512 
   1513 failed:
   1514 	adev->firmware.load_type = AMDGPU_FW_LOAD_DIRECT;
   1515 	mutex_unlock(&adev->firmware.mutex);
   1516 	return -EINVAL;
   1517 }
   1518 
   1519 static int psp_hw_fini(void *handle)
   1520 {
   1521 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
   1522 	struct psp_context *psp = &adev->psp;
   1523 	void *tmr_buf;
   1524 	void **pptr;
   1525 
   1526 	if (adev->gmc.xgmi.num_physical_nodes > 1 &&
   1527 	    psp->xgmi_context.initialized == 1)
   1528                 psp_xgmi_terminate(psp);
   1529 
   1530 	if (psp->adev->psp.ta_fw) {
   1531 		psp_ras_terminate(psp);
   1532 		psp_dtm_terminate(psp);
   1533 		psp_hdcp_terminate(psp);
   1534 	}
   1535 
   1536 	psp_asd_unload(psp);
   1537 
   1538 	psp_ring_destroy(psp, PSP_RING_TYPE__KM);
   1539 
   1540 	pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL;
   1541 	amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, pptr);
   1542 	amdgpu_bo_free_kernel(&psp->fw_pri_bo,
   1543 			      &psp->fw_pri_mc_addr, &psp->fw_pri_buf);
   1544 	amdgpu_bo_free_kernel(&psp->fence_buf_bo,
   1545 			      &psp->fence_buf_mc_addr, &psp->fence_buf);
   1546 	amdgpu_bo_free_kernel(&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
   1547 			      (void **)&psp->cmd_buf_mem);
   1548 
   1549 	kfree(psp->cmd);
   1550 	psp->cmd = NULL;
   1551 
   1552 	return 0;
   1553 }
   1554 
   1555 static int psp_suspend(void *handle)
   1556 {
   1557 	int ret;
   1558 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
   1559 	struct psp_context *psp = &adev->psp;
   1560 
   1561 	if (adev->gmc.xgmi.num_physical_nodes > 1 &&
   1562 	    psp->xgmi_context.initialized == 1) {
   1563 		ret = psp_xgmi_terminate(psp);
   1564 		if (ret) {
   1565 			DRM_ERROR("Failed to terminate xgmi ta\n");
   1566 			return ret;
   1567 		}
   1568 	}
   1569 
   1570 	if (psp->adev->psp.ta_fw) {
   1571 		ret = psp_ras_terminate(psp);
   1572 		if (ret) {
   1573 			DRM_ERROR("Failed to terminate ras ta\n");
   1574 			return ret;
   1575 		}
   1576 		ret = psp_hdcp_terminate(psp);
   1577 		if (ret) {
   1578 			DRM_ERROR("Failed to terminate hdcp ta\n");
   1579 			return ret;
   1580 		}
   1581 		ret = psp_dtm_terminate(psp);
   1582 		if (ret) {
   1583 			DRM_ERROR("Failed to terminate dtm ta\n");
   1584 			return ret;
   1585 		}
   1586 	}
   1587 
   1588 	ret = psp_ring_stop(psp, PSP_RING_TYPE__KM);
   1589 	if (ret) {
   1590 		DRM_ERROR("PSP ring stop failed\n");
   1591 		return ret;
   1592 	}
   1593 
   1594 	return 0;
   1595 }
   1596 
   1597 static int psp_resume(void *handle)
   1598 {
   1599 	int ret;
   1600 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
   1601 	struct psp_context *psp = &adev->psp;
   1602 
   1603 	DRM_INFO("PSP is resuming...\n");
   1604 
   1605 	ret = psp_mem_training(psp, PSP_MEM_TRAIN_RESUME);
   1606 	if (ret) {
   1607 		DRM_ERROR("Failed to process memory training!\n");
   1608 		return ret;
   1609 	}
   1610 
   1611 	mutex_lock(&adev->firmware.mutex);
   1612 
   1613 	ret = psp_hw_start(psp);
   1614 	if (ret)
   1615 		goto failed;
   1616 
   1617 	ret = psp_np_fw_load(psp);
   1618 	if (ret)
   1619 		goto failed;
   1620 
   1621 	ret = psp_asd_load(psp);
   1622 	if (ret) {
   1623 		DRM_ERROR("PSP load asd failed!\n");
   1624 		goto failed;
   1625 	}
   1626 
   1627 	if (adev->gmc.xgmi.num_physical_nodes > 1) {
   1628 		ret = psp_xgmi_initialize(psp);
   1629 		/* Warning the XGMI seesion initialize failure
   1630 		 * Instead of stop driver initialization
   1631 		 */
   1632 		if (ret)
   1633 			dev_err(psp->adev->dev,
   1634 				"XGMI: Failed to initialize XGMI session\n");
   1635 	}
   1636 
   1637 	if (psp->adev->psp.ta_fw) {
   1638 		ret = psp_ras_initialize(psp);
   1639 		if (ret)
   1640 			dev_err(psp->adev->dev,
   1641 					"RAS: Failed to initialize RAS\n");
   1642 
   1643 		ret = psp_hdcp_initialize(psp);
   1644 		if (ret)
   1645 			dev_err(psp->adev->dev,
   1646 				"HDCP: Failed to initialize HDCP\n");
   1647 
   1648 		ret = psp_dtm_initialize(psp);
   1649 		if (ret)
   1650 			dev_err(psp->adev->dev,
   1651 				"DTM: Failed to initialize DTM\n");
   1652 	}
   1653 
   1654 	mutex_unlock(&adev->firmware.mutex);
   1655 
   1656 	return 0;
   1657 
   1658 failed:
   1659 	DRM_ERROR("PSP resume failed\n");
   1660 	mutex_unlock(&adev->firmware.mutex);
   1661 	return ret;
   1662 }
   1663 
   1664 int psp_gpu_reset(struct amdgpu_device *adev)
   1665 {
   1666 	int ret;
   1667 
   1668 	if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
   1669 		return 0;
   1670 
   1671 	mutex_lock(&adev->psp.mutex);
   1672 	ret = psp_mode1_reset(&adev->psp);
   1673 	mutex_unlock(&adev->psp.mutex);
   1674 
   1675 	return ret;
   1676 }
   1677 
   1678 int psp_rlc_autoload_start(struct psp_context *psp)
   1679 {
   1680 	int ret;
   1681 	struct psp_gfx_cmd_resp *cmd;
   1682 
   1683 	cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
   1684 	if (!cmd)
   1685 		return -ENOMEM;
   1686 
   1687 	cmd->cmd_id = GFX_CMD_ID_AUTOLOAD_RLC;
   1688 
   1689 	ret = psp_cmd_submit_buf(psp, NULL, cmd,
   1690 				 psp->fence_buf_mc_addr);
   1691 	kfree(cmd);
   1692 	return ret;
   1693 }
   1694 
   1695 int psp_update_vcn_sram(struct amdgpu_device *adev, int inst_idx,
   1696 			uint64_t cmd_gpu_addr, int cmd_size)
   1697 {
   1698 	struct amdgpu_firmware_info ucode = {0};
   1699 
   1700 	ucode.ucode_id = inst_idx ? AMDGPU_UCODE_ID_VCN1_RAM :
   1701 		AMDGPU_UCODE_ID_VCN0_RAM;
   1702 	ucode.mc_addr = cmd_gpu_addr;
   1703 	ucode.ucode_size = cmd_size;
   1704 
   1705 	return psp_execute_np_fw_load(&adev->psp, &ucode);
   1706 }
   1707 
   1708 int psp_ring_cmd_submit(struct psp_context *psp,
   1709 			uint64_t cmd_buf_mc_addr,
   1710 			uint64_t fence_mc_addr,
   1711 			int index)
   1712 {
   1713 	unsigned int psp_write_ptr_reg = 0;
   1714 	struct psp_gfx_rb_frame *write_frame;
   1715 	struct psp_ring *ring = &psp->km_ring;
   1716 	struct psp_gfx_rb_frame *ring_buffer_start = ring->ring_mem;
   1717 	struct psp_gfx_rb_frame *ring_buffer_end = ring_buffer_start +
   1718 		ring->ring_size / sizeof(struct psp_gfx_rb_frame) - 1;
   1719 	struct amdgpu_device *adev = psp->adev;
   1720 	uint32_t ring_size_dw = ring->ring_size / 4;
   1721 	uint32_t rb_frame_size_dw = sizeof(struct psp_gfx_rb_frame) / 4;
   1722 
   1723 	/* KM (GPCOM) prepare write pointer */
   1724 	psp_write_ptr_reg = psp_ring_get_wptr(psp);
   1725 
   1726 	/* Update KM RB frame pointer to new frame */
   1727 	/* write_frame ptr increments by size of rb_frame in bytes */
   1728 	/* psp_write_ptr_reg increments by size of rb_frame in DWORDs */
   1729 	if ((psp_write_ptr_reg % ring_size_dw) == 0)
   1730 		write_frame = ring_buffer_start;
   1731 	else
   1732 		write_frame = ring_buffer_start + (psp_write_ptr_reg / rb_frame_size_dw);
   1733 	/* Check invalid write_frame ptr address */
   1734 	if ((write_frame < ring_buffer_start) || (ring_buffer_end < write_frame)) {
   1735 		DRM_ERROR("ring_buffer_start = %p; ring_buffer_end = %p; write_frame = %p\n",
   1736 			  ring_buffer_start, ring_buffer_end, write_frame);
   1737 		DRM_ERROR("write_frame is pointing to address out of bounds\n");
   1738 		return -EINVAL;
   1739 	}
   1740 
   1741 	/* Initialize KM RB frame */
   1742 	memset(write_frame, 0, sizeof(struct psp_gfx_rb_frame));
   1743 
   1744 	/* Update KM RB frame */
   1745 	write_frame->cmd_buf_addr_hi = upper_32_bits(cmd_buf_mc_addr);
   1746 	write_frame->cmd_buf_addr_lo = lower_32_bits(cmd_buf_mc_addr);
   1747 	write_frame->fence_addr_hi = upper_32_bits(fence_mc_addr);
   1748 	write_frame->fence_addr_lo = lower_32_bits(fence_mc_addr);
   1749 	write_frame->fence_value = index;
   1750 	amdgpu_asic_flush_hdp(adev, NULL);
   1751 
   1752 	/* Update the write Pointer in DWORDs */
   1753 	psp_write_ptr_reg = (psp_write_ptr_reg + rb_frame_size_dw) % ring_size_dw;
   1754 	psp_ring_set_wptr(psp, psp_write_ptr_reg);
   1755 	return 0;
   1756 }
   1757 
   1758 static bool psp_check_fw_loading_status(struct amdgpu_device *adev,
   1759 					enum AMDGPU_UCODE_ID ucode_type)
   1760 {
   1761 	struct amdgpu_firmware_info *ucode = NULL;
   1762 
   1763 	if (!adev->firmware.fw_size)
   1764 		return false;
   1765 
   1766 	ucode = &adev->firmware.ucode[ucode_type];
   1767 	if (!ucode->fw || !ucode->ucode_size)
   1768 		return false;
   1769 
   1770 	return psp_compare_sram_data(&adev->psp, ucode, ucode_type);
   1771 }
   1772 
   1773 static int psp_set_clockgating_state(void *handle,
   1774 				     enum amd_clockgating_state state)
   1775 {
   1776 	return 0;
   1777 }
   1778 
   1779 static int psp_set_powergating_state(void *handle,
   1780 				     enum amd_powergating_state state)
   1781 {
   1782 	return 0;
   1783 }
   1784 
   1785 const struct amd_ip_funcs psp_ip_funcs = {
   1786 	.name = "psp",
   1787 	.early_init = psp_early_init,
   1788 	.late_init = NULL,
   1789 	.sw_init = psp_sw_init,
   1790 	.sw_fini = psp_sw_fini,
   1791 	.hw_init = psp_hw_init,
   1792 	.hw_fini = psp_hw_fini,
   1793 	.suspend = psp_suspend,
   1794 	.resume = psp_resume,
   1795 	.is_idle = NULL,
   1796 	.check_soft_reset = NULL,
   1797 	.wait_for_idle = NULL,
   1798 	.soft_reset = NULL,
   1799 	.set_clockgating_state = psp_set_clockgating_state,
   1800 	.set_powergating_state = psp_set_powergating_state,
   1801 };
   1802 
   1803 static const struct amdgpu_psp_funcs psp_funcs = {
   1804 	.check_fw_loading_status = psp_check_fw_loading_status,
   1805 };
   1806 
   1807 static void psp_set_funcs(struct amdgpu_device *adev)
   1808 {
   1809 	if (NULL == adev->firmware.funcs)
   1810 		adev->firmware.funcs = &psp_funcs;
   1811 }
   1812 
   1813 const struct amdgpu_ip_block_version psp_v3_1_ip_block =
   1814 {
   1815 	.type = AMD_IP_BLOCK_TYPE_PSP,
   1816 	.major = 3,
   1817 	.minor = 1,
   1818 	.rev = 0,
   1819 	.funcs = &psp_ip_funcs,
   1820 };
   1821 
   1822 const struct amdgpu_ip_block_version psp_v10_0_ip_block =
   1823 {
   1824 	.type = AMD_IP_BLOCK_TYPE_PSP,
   1825 	.major = 10,
   1826 	.minor = 0,
   1827 	.rev = 0,
   1828 	.funcs = &psp_ip_funcs,
   1829 };
   1830 
   1831 const struct amdgpu_ip_block_version psp_v11_0_ip_block =
   1832 {
   1833 	.type = AMD_IP_BLOCK_TYPE_PSP,
   1834 	.major = 11,
   1835 	.minor = 0,
   1836 	.rev = 0,
   1837 	.funcs = &psp_ip_funcs,
   1838 };
   1839 
   1840 const struct amdgpu_ip_block_version psp_v12_0_ip_block =
   1841 {
   1842 	.type = AMD_IP_BLOCK_TYPE_PSP,
   1843 	.major = 12,
   1844 	.minor = 0,
   1845 	.rev = 0,
   1846 	.funcs = &psp_ip_funcs,
   1847 };
   1848