Home | History | Annotate | Line # | Download | only in amdgpu
      1 /*	$NetBSD: amdgpu_psp_v11_0.c,v 1.3 2021/12/19 12:21:29 riastradh Exp $	*/
      2 
      3 /*
      4  * Copyright 2018 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 
     25 #include <sys/cdefs.h>
     26 __KERNEL_RCSID(0, "$NetBSD: amdgpu_psp_v11_0.c,v 1.3 2021/12/19 12:21:29 riastradh Exp $");
     27 
     28 #include <asm/io.h>
     29 #include <linux/firmware.h>
     30 #include <linux/module.h>
     31 #include <linux/vmalloc.h>
     32 
     33 #include "amdgpu.h"
     34 #include "amdgpu_psp.h"
     35 #include "amdgpu_ucode.h"
     36 #include "soc15_common.h"
     37 #include "psp_v11_0.h"
     38 
     39 #include "mp/mp_11_0_offset.h"
     40 #include "mp/mp_11_0_sh_mask.h"
     41 #include "gc/gc_9_0_offset.h"
     42 #include "sdma0/sdma0_4_0_offset.h"
     43 #include "nbio/nbio_7_4_offset.h"
     44 
     45 #include "oss/osssys_4_0_offset.h"
     46 #include "oss/osssys_4_0_sh_mask.h"
     47 
     48 MODULE_FIRMWARE("amdgpu/vega20_sos.bin");
     49 MODULE_FIRMWARE("amdgpu/vega20_asd.bin");
     50 MODULE_FIRMWARE("amdgpu/vega20_ta.bin");
     51 MODULE_FIRMWARE("amdgpu/navi10_sos.bin");
     52 MODULE_FIRMWARE("amdgpu/navi10_asd.bin");
     53 MODULE_FIRMWARE("amdgpu/navi10_ta.bin");
     54 MODULE_FIRMWARE("amdgpu/navi14_sos.bin");
     55 MODULE_FIRMWARE("amdgpu/navi14_asd.bin");
     56 MODULE_FIRMWARE("amdgpu/navi14_ta.bin");
     57 MODULE_FIRMWARE("amdgpu/navi12_sos.bin");
     58 MODULE_FIRMWARE("amdgpu/navi12_asd.bin");
     59 MODULE_FIRMWARE("amdgpu/navi12_ta.bin");
     60 MODULE_FIRMWARE("amdgpu/arcturus_sos.bin");
     61 MODULE_FIRMWARE("amdgpu/arcturus_asd.bin");
     62 MODULE_FIRMWARE("amdgpu/arcturus_ta.bin");
     63 
     64 /* address block */
     65 #define smnMP1_FIRMWARE_FLAGS		0x3010024
     66 /* navi10 reg offset define */
     67 #define mmRLC_GPM_UCODE_ADDR_NV10	0x5b61
     68 #define mmRLC_GPM_UCODE_DATA_NV10	0x5b62
     69 #define mmSDMA0_UCODE_ADDR_NV10		0x5880
     70 #define mmSDMA0_UCODE_DATA_NV10		0x5881
     71 /* memory training timeout define */
     72 #define MEM_TRAIN_SEND_MSG_TIMEOUT_US	3000000
     73 
     74 static int psp_v11_0_init_microcode(struct psp_context *psp)
     75 {
     76 	struct amdgpu_device *adev = psp->adev;
     77 	const char *chip_name;
     78 	char fw_name[30];
     79 	int err = 0;
     80 	const struct psp_firmware_header_v1_0 *sos_hdr;
     81 	const struct psp_firmware_header_v1_1 *sos_hdr_v1_1;
     82 	const struct psp_firmware_header_v1_2 *sos_hdr_v1_2;
     83 	const struct psp_firmware_header_v1_0 *asd_hdr;
     84 	const struct ta_firmware_header_v1_0 *ta_hdr;
     85 
     86 	DRM_DEBUG("\n");
     87 
     88 	switch (adev->asic_type) {
     89 	case CHIP_VEGA20:
     90 		chip_name = "vega20";
     91 		break;
     92 	case CHIP_NAVI10:
     93 		chip_name = "navi10";
     94 		break;
     95 	case CHIP_NAVI14:
     96 		chip_name = "navi14";
     97 		break;
     98 	case CHIP_NAVI12:
     99 		chip_name = "navi12";
    100 		break;
    101 	case CHIP_ARCTURUS:
    102 		chip_name = "arcturus";
    103 		break;
    104 	default:
    105 		BUG();
    106 	}
    107 
    108 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", chip_name);
    109 	err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev);
    110 	if (err)
    111 		goto out;
    112 
    113 	err = amdgpu_ucode_validate(adev->psp.sos_fw);
    114 	if (err)
    115 		goto out;
    116 
    117 	sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data;
    118 	amdgpu_ucode_print_psp_hdr(&sos_hdr->header);
    119 
    120 	switch (sos_hdr->header.header_version_major) {
    121 	case 1:
    122 		adev->psp.sos_fw_version = le32_to_cpu(sos_hdr->header.ucode_version);
    123 		adev->psp.sos_feature_version = le32_to_cpu(sos_hdr->ucode_feature_version);
    124 		adev->psp.sos_bin_size = le32_to_cpu(sos_hdr->sos_size_bytes);
    125 		adev->psp.sys_bin_size = le32_to_cpu(sos_hdr->sos_offset_bytes);
    126 		adev->psp.sys_start_addr = (const uint8_t *)sos_hdr +
    127 				le32_to_cpu(sos_hdr->header.ucode_array_offset_bytes);
    128 		adev->psp.sos_start_addr = (const uint8_t *)adev->psp.sys_start_addr +
    129 				le32_to_cpu(sos_hdr->sos_offset_bytes);
    130 		if (sos_hdr->header.header_version_minor == 1) {
    131 			sos_hdr_v1_1 = (const struct psp_firmware_header_v1_1 *)adev->psp.sos_fw->data;
    132 			adev->psp.toc_bin_size = le32_to_cpu(sos_hdr_v1_1->toc_size_bytes);
    133 			adev->psp.toc_start_addr = (const uint8_t *)adev->psp.sys_start_addr +
    134 					le32_to_cpu(sos_hdr_v1_1->toc_offset_bytes);
    135 			adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_1->kdb_size_bytes);
    136 			adev->psp.kdb_start_addr = (const uint8_t *)adev->psp.sys_start_addr +
    137 					le32_to_cpu(sos_hdr_v1_1->kdb_offset_bytes);
    138 		}
    139 		if (sos_hdr->header.header_version_minor == 2) {
    140 			sos_hdr_v1_2 = (const struct psp_firmware_header_v1_2 *)adev->psp.sos_fw->data;
    141 			adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_2->kdb_size_bytes);
    142 			adev->psp.kdb_start_addr = (const uint8_t *)adev->psp.sys_start_addr +
    143 						    le32_to_cpu(sos_hdr_v1_2->kdb_offset_bytes);
    144 		}
    145 		break;
    146 	default:
    147 		dev_err(adev->dev,
    148 			"Unsupported psp sos firmware\n");
    149 		err = -EINVAL;
    150 		goto out;
    151 	}
    152 
    153 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name);
    154 	err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
    155 	if (err)
    156 		goto out1;
    157 
    158 	err = amdgpu_ucode_validate(adev->psp.asd_fw);
    159 	if (err)
    160 		goto out1;
    161 
    162 	asd_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data;
    163 	adev->psp.asd_fw_version = le32_to_cpu(asd_hdr->header.ucode_version);
    164 	adev->psp.asd_feature_version = le32_to_cpu(asd_hdr->ucode_feature_version);
    165 	adev->psp.asd_ucode_size = le32_to_cpu(asd_hdr->header.ucode_size_bytes);
    166 	adev->psp.asd_start_addr = (const uint8_t *)asd_hdr +
    167 				le32_to_cpu(asd_hdr->header.ucode_array_offset_bytes);
    168 
    169 	switch (adev->asic_type) {
    170 	case CHIP_VEGA20:
    171 	case CHIP_ARCTURUS:
    172 		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name);
    173 		err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev);
    174 		if (err) {
    175 			release_firmware(adev->psp.ta_fw);
    176 			adev->psp.ta_fw = NULL;
    177 			dev_info(adev->dev,
    178 				 "psp v11.0: Failed to load firmware \"%s\"\n", fw_name);
    179 		} else {
    180 			err = amdgpu_ucode_validate(adev->psp.ta_fw);
    181 			if (err)
    182 				goto out2;
    183 
    184 			ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data;
    185 			adev->psp.ta_xgmi_ucode_version = le32_to_cpu(ta_hdr->ta_xgmi_ucode_version);
    186 			adev->psp.ta_xgmi_ucode_size = le32_to_cpu(ta_hdr->ta_xgmi_size_bytes);
    187 			adev->psp.ta_xgmi_start_addr = (const uint8_t *)ta_hdr +
    188 				le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes);
    189 			adev->psp.ta_fw_version = le32_to_cpu(ta_hdr->header.ucode_version);
    190 			adev->psp.ta_ras_ucode_version = le32_to_cpu(ta_hdr->ta_ras_ucode_version);
    191 			adev->psp.ta_ras_ucode_size = le32_to_cpu(ta_hdr->ta_ras_size_bytes);
    192 			adev->psp.ta_ras_start_addr = (const uint8_t *)adev->psp.ta_xgmi_start_addr +
    193 				le32_to_cpu(ta_hdr->ta_ras_offset_bytes);
    194 		}
    195 		break;
    196 	case CHIP_NAVI10:
    197 	case CHIP_NAVI14:
    198 	case CHIP_NAVI12:
    199 		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name);
    200 		err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev);
    201 		if (err) {
    202 			release_firmware(adev->psp.ta_fw);
    203 			adev->psp.ta_fw = NULL;
    204 			dev_info(adev->dev,
    205 				 "psp v11.0: Failed to load firmware \"%s\"\n", fw_name);
    206 		} else {
    207 			err = amdgpu_ucode_validate(adev->psp.ta_fw);
    208 			if (err)
    209 				goto out2;
    210 
    211 			ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data;
    212 			adev->psp.ta_hdcp_ucode_version = le32_to_cpu(ta_hdr->ta_hdcp_ucode_version);
    213 			adev->psp.ta_hdcp_ucode_size = le32_to_cpu(ta_hdr->ta_hdcp_size_bytes);
    214 			adev->psp.ta_hdcp_start_addr = (const uint8_t *)ta_hdr +
    215 				le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes);
    216 
    217 			adev->psp.ta_fw_version = le32_to_cpu(ta_hdr->header.ucode_version);
    218 
    219 			adev->psp.ta_dtm_ucode_version = le32_to_cpu(ta_hdr->ta_dtm_ucode_version);
    220 			adev->psp.ta_dtm_ucode_size = le32_to_cpu(ta_hdr->ta_dtm_size_bytes);
    221 			adev->psp.ta_dtm_start_addr = (const uint8_t *)adev->psp.ta_hdcp_start_addr +
    222 				le32_to_cpu(ta_hdr->ta_dtm_offset_bytes);
    223 		}
    224 		break;
    225 	default:
    226 		BUG();
    227 	}
    228 
    229 	return 0;
    230 
    231 out2:
    232 	release_firmware(adev->psp.ta_fw);
    233 	adev->psp.ta_fw = NULL;
    234 out1:
    235 	release_firmware(adev->psp.asd_fw);
    236 	adev->psp.asd_fw = NULL;
    237 out:
    238 	dev_err(adev->dev,
    239 		"psp v11.0: Failed to load firmware \"%s\"\n", fw_name);
    240 	release_firmware(adev->psp.sos_fw);
    241 	adev->psp.sos_fw = NULL;
    242 
    243 	return err;
    244 }
    245 
    246 int psp_v11_0_wait_for_bootloader(struct psp_context *psp)
    247 {
    248 	struct amdgpu_device *adev = psp->adev;
    249 
    250 	int ret;
    251 	int retry_loop;
    252 
    253 	for (retry_loop = 0; retry_loop < 10; retry_loop++) {
    254 		/* Wait for bootloader to signify that is
    255 		    ready having bit 31 of C2PMSG_35 set to 1 */
    256 		ret = psp_wait_for(psp,
    257 				   SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
    258 				   0x80000000,
    259 				   0x80000000,
    260 				   false);
    261 
    262 		if (ret == 0)
    263 			return 0;
    264 	}
    265 
    266 	return ret;
    267 }
    268 
    269 static bool psp_v11_0_is_sos_alive(struct psp_context *psp)
    270 {
    271 	struct amdgpu_device *adev = psp->adev;
    272 	uint32_t sol_reg;
    273 
    274 	sol_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81);
    275 
    276 	return sol_reg != 0x0;
    277 }
    278 
    279 static int psp_v11_0_bootloader_load_kdb(struct psp_context *psp)
    280 {
    281 	int ret;
    282 	uint32_t psp_gfxdrv_command_reg = 0;
    283 	struct amdgpu_device *adev = psp->adev;
    284 
    285 	/* Check tOS sign of life register to confirm sys driver and sOS
    286 	 * are already been loaded.
    287 	 */
    288 	if (psp_v11_0_is_sos_alive(psp)) {
    289 		psp->sos_fw_version = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_58);
    290 		dev_info(adev->dev, "sos fw version = 0x%x.\n", psp->sos_fw_version);
    291 		return 0;
    292 	}
    293 
    294 	ret = psp_v11_0_wait_for_bootloader(psp);
    295 	if (ret)
    296 		return ret;
    297 
    298 	memset(psp->fw_pri_buf, 0, PSP_1_MEG);
    299 
    300 	/* Copy PSP KDB binary to memory */
    301 	memcpy(psp->fw_pri_buf, psp->kdb_start_addr, psp->kdb_bin_size);
    302 
    303 	/* Provide the PSP KDB to bootloader */
    304 	WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36,
    305 	       (uint32_t)(psp->fw_pri_mc_addr >> 20));
    306 	psp_gfxdrv_command_reg = PSP_BL__LOAD_KEY_DATABASE;
    307 	WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_35,
    308 	       psp_gfxdrv_command_reg);
    309 
    310 	ret = psp_v11_0_wait_for_bootloader(psp);
    311 
    312 	return ret;
    313 }
    314 
    315 static int psp_v11_0_bootloader_load_sysdrv(struct psp_context *psp)
    316 {
    317 	int ret;
    318 	uint32_t psp_gfxdrv_command_reg = 0;
    319 	struct amdgpu_device *adev = psp->adev;
    320 
    321 	/* Check sOS sign of life register to confirm sys driver and sOS
    322 	 * are already been loaded.
    323 	 */
    324 	if (psp_v11_0_is_sos_alive(psp)) {
    325 		psp->sos_fw_version = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_58);
    326 		dev_info(adev->dev, "sos fw version = 0x%x.\n", psp->sos_fw_version);
    327 		return 0;
    328 	}
    329 
    330 	ret = psp_v11_0_wait_for_bootloader(psp);
    331 	if (ret)
    332 		return ret;
    333 
    334 	memset(psp->fw_pri_buf, 0, PSP_1_MEG);
    335 
    336 	/* Copy PSP System Driver binary to memory */
    337 	memcpy(psp->fw_pri_buf, psp->sys_start_addr, psp->sys_bin_size);
    338 
    339 	/* Provide the sys driver to bootloader */
    340 	WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36,
    341 	       (uint32_t)(psp->fw_pri_mc_addr >> 20));
    342 	psp_gfxdrv_command_reg = PSP_BL__LOAD_SYSDRV;
    343 	WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_35,
    344 	       psp_gfxdrv_command_reg);
    345 
    346 	/* there might be handshake issue with hardware which needs delay */
    347 	mdelay(20);
    348 
    349 	ret = psp_v11_0_wait_for_bootloader(psp);
    350 
    351 	return ret;
    352 }
    353 
    354 static int psp_v11_0_bootloader_load_sos(struct psp_context *psp)
    355 {
    356 	int ret;
    357 	unsigned int psp_gfxdrv_command_reg = 0;
    358 	struct amdgpu_device *adev = psp->adev;
    359 
    360 	/* Check sOS sign of life register to confirm sys driver and sOS
    361 	 * are already been loaded.
    362 	 */
    363 	if (psp_v11_0_is_sos_alive(psp))
    364 		return 0;
    365 
    366 	ret = psp_v11_0_wait_for_bootloader(psp);
    367 	if (ret)
    368 		return ret;
    369 
    370 	memset(psp->fw_pri_buf, 0, PSP_1_MEG);
    371 
    372 	/* Copy Secure OS binary to PSP memory */
    373 	memcpy(psp->fw_pri_buf, psp->sos_start_addr, psp->sos_bin_size);
    374 
    375 	/* Provide the PSP secure OS to bootloader */
    376 	WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36,
    377 	       (uint32_t)(psp->fw_pri_mc_addr >> 20));
    378 	psp_gfxdrv_command_reg = PSP_BL__LOAD_SOSDRV;
    379 	WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_35,
    380 	       psp_gfxdrv_command_reg);
    381 
    382 	/* there might be handshake issue with hardware which needs delay */
    383 	mdelay(20);
    384 	ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_81),
    385 			   RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81),
    386 			   0, true);
    387 
    388 	return ret;
    389 }
    390 
    391 static void psp_v11_0_reroute_ih(struct psp_context *psp)
    392 {
    393 	struct amdgpu_device *adev = psp->adev;
    394 	uint32_t tmp;
    395 
    396 	/* Change IH ring for VMC */
    397 	tmp = REG_SET_FIELD(0, IH_CLIENT_CFG_DATA, CREDIT_RETURN_ADDR, 0x1244b);
    398 	tmp = REG_SET_FIELD(tmp, IH_CLIENT_CFG_DATA, CLIENT_TYPE, 1);
    399 	tmp = REG_SET_FIELD(tmp, IH_CLIENT_CFG_DATA, RING_ID, 1);
    400 
    401 	WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_69, 3);
    402 	WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_70, tmp);
    403 	WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_64, GFX_CTRL_CMD_ID_GBR_IH_SET);
    404 
    405 	mdelay(20);
    406 	psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
    407 		     0x80000000, 0x8000FFFF, false);
    408 
    409 	/* Change IH ring for UMC */
    410 	tmp = REG_SET_FIELD(0, IH_CLIENT_CFG_DATA, CREDIT_RETURN_ADDR, 0x1216b);
    411 	tmp = REG_SET_FIELD(tmp, IH_CLIENT_CFG_DATA, RING_ID, 1);
    412 
    413 	WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_69, 4);
    414 	WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_70, tmp);
    415 	WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_64, GFX_CTRL_CMD_ID_GBR_IH_SET);
    416 
    417 	mdelay(20);
    418 	psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
    419 		     0x80000000, 0x8000FFFF, false);
    420 }
    421 
    422 static int psp_v11_0_ring_init(struct psp_context *psp,
    423 			      enum psp_ring_type ring_type)
    424 {
    425 	int ret = 0;
    426 	struct psp_ring *ring;
    427 	struct amdgpu_device *adev = psp->adev;
    428 
    429 	psp_v11_0_reroute_ih(psp);
    430 
    431 	ring = &psp->km_ring;
    432 
    433 	ring->ring_type = ring_type;
    434 
    435 	/* allocate 4k Page of Local Frame Buffer memory for ring */
    436 	ring->ring_size = 0x1000;
    437 	ret = amdgpu_bo_create_kernel(adev, ring->ring_size, PAGE_SIZE,
    438 				      AMDGPU_GEM_DOMAIN_VRAM,
    439 				      &adev->firmware.rbuf,
    440 				      &ring->ring_mem_mc_addr,
    441 				      (void **)&ring->ring_mem);
    442 	if (ret) {
    443 		ring->ring_size = 0;
    444 		return ret;
    445 	}
    446 
    447 	return 0;
    448 }
    449 
    450 static bool psp_v11_0_support_vmr_ring(struct psp_context *psp)
    451 {
    452 	if (amdgpu_sriov_vf(psp->adev) && psp->sos_fw_version > 0x80045)
    453 		return true;
    454 	return false;
    455 }
    456 
    457 static int psp_v11_0_ring_stop(struct psp_context *psp,
    458 			      enum psp_ring_type ring_type)
    459 {
    460 	int ret = 0;
    461 	struct amdgpu_device *adev = psp->adev;
    462 
    463 	/* Write the ring destroy command*/
    464 	if (psp_v11_0_support_vmr_ring(psp))
    465 		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101,
    466 				     GFX_CTRL_CMD_ID_DESTROY_GPCOM_RING);
    467 	else
    468 		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_64,
    469 				     GFX_CTRL_CMD_ID_DESTROY_RINGS);
    470 
    471 	/* there might be handshake issue with hardware which needs delay */
    472 	mdelay(20);
    473 
    474 	/* Wait for response flag (bit 31) */
    475 	if (psp_v11_0_support_vmr_ring(psp))
    476 		ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),
    477 				   0x80000000, 0x80000000, false);
    478 	else
    479 		ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
    480 				   0x80000000, 0x80000000, false);
    481 
    482 	return ret;
    483 }
    484 
    485 static int psp_v11_0_ring_create(struct psp_context *psp,
    486 				enum psp_ring_type ring_type)
    487 {
    488 	int ret = 0;
    489 	unsigned int psp_ring_reg = 0;
    490 	struct psp_ring *ring = &psp->km_ring;
    491 	struct amdgpu_device *adev = psp->adev;
    492 
    493 	if (psp_v11_0_support_vmr_ring(psp)) {
    494 		ret = psp_v11_0_ring_stop(psp, ring_type);
    495 		if (ret) {
    496 			DRM_ERROR("psp_v11_0_ring_stop_sriov failed!\n");
    497 			return ret;
    498 		}
    499 
    500 		/* Write low address of the ring to C2PMSG_102 */
    501 		psp_ring_reg = lower_32_bits(ring->ring_mem_mc_addr);
    502 		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, psp_ring_reg);
    503 		/* Write high address of the ring to C2PMSG_103 */
    504 		psp_ring_reg = upper_32_bits(ring->ring_mem_mc_addr);
    505 		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_103, psp_ring_reg);
    506 
    507 		/* Write the ring initialization command to C2PMSG_101 */
    508 		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101,
    509 					     GFX_CTRL_CMD_ID_INIT_GPCOM_RING);
    510 
    511 		/* there might be handshake issue with hardware which needs delay */
    512 		mdelay(20);
    513 
    514 		/* Wait for response flag (bit 31) in C2PMSG_101 */
    515 		ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),
    516 				   0x80000000, 0x8000FFFF, false);
    517 
    518 	} else {
    519 		/* Wait for sOS ready for ring creation */
    520 		ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
    521 				   0x80000000, 0x80000000, false);
    522 		if (ret) {
    523 			DRM_ERROR("Failed to wait for sOS ready for ring creation\n");
    524 			return ret;
    525 		}
    526 
    527 		/* Write low address of the ring to C2PMSG_69 */
    528 		psp_ring_reg = lower_32_bits(ring->ring_mem_mc_addr);
    529 		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_69, psp_ring_reg);
    530 		/* Write high address of the ring to C2PMSG_70 */
    531 		psp_ring_reg = upper_32_bits(ring->ring_mem_mc_addr);
    532 		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_70, psp_ring_reg);
    533 		/* Write size of ring to C2PMSG_71 */
    534 		psp_ring_reg = ring->ring_size;
    535 		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_71, psp_ring_reg);
    536 		/* Write the ring initialization command to C2PMSG_64 */
    537 		psp_ring_reg = ring_type;
    538 		psp_ring_reg = psp_ring_reg << 16;
    539 		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_64, psp_ring_reg);
    540 
    541 		/* there might be handshake issue with hardware which needs delay */
    542 		mdelay(20);
    543 
    544 		/* Wait for response flag (bit 31) in C2PMSG_64 */
    545 		ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
    546 				   0x80000000, 0x8000FFFF, false);
    547 	}
    548 
    549 	return ret;
    550 }
    551 
    552 
    553 static int psp_v11_0_ring_destroy(struct psp_context *psp,
    554 				 enum psp_ring_type ring_type)
    555 {
    556 	int ret = 0;
    557 	struct psp_ring *ring = &psp->km_ring;
    558 	struct amdgpu_device *adev = psp->adev;
    559 
    560 	ret = psp_v11_0_ring_stop(psp, ring_type);
    561 	if (ret)
    562 		DRM_ERROR("Fail to stop psp ring\n");
    563 
    564 	amdgpu_bo_free_kernel(&adev->firmware.rbuf,
    565 			      &ring->ring_mem_mc_addr,
    566 			      (void **)&ring->ring_mem);
    567 
    568 	return ret;
    569 }
    570 
    571 static int
    572 psp_v11_0_sram_map(struct amdgpu_device *adev,
    573 		  unsigned int *sram_offset, unsigned int *sram_addr_reg_offset,
    574 		  unsigned int *sram_data_reg_offset,
    575 		  enum AMDGPU_UCODE_ID ucode_id)
    576 {
    577 	int ret = 0;
    578 
    579 	switch (ucode_id) {
    580 /* TODO: needs to confirm */
    581 #if 0
    582 	case AMDGPU_UCODE_ID_SMC:
    583 		*sram_offset = 0;
    584 		*sram_addr_reg_offset = 0;
    585 		*sram_data_reg_offset = 0;
    586 		break;
    587 #endif
    588 
    589 	case AMDGPU_UCODE_ID_CP_CE:
    590 		*sram_offset = 0x0;
    591 		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_CE_UCODE_ADDR);
    592 		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_CE_UCODE_DATA);
    593 		break;
    594 
    595 	case AMDGPU_UCODE_ID_CP_PFP:
    596 		*sram_offset = 0x0;
    597 		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_PFP_UCODE_ADDR);
    598 		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_PFP_UCODE_DATA);
    599 		break;
    600 
    601 	case AMDGPU_UCODE_ID_CP_ME:
    602 		*sram_offset = 0x0;
    603 		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_ME_UCODE_ADDR);
    604 		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_ME_UCODE_DATA);
    605 		break;
    606 
    607 	case AMDGPU_UCODE_ID_CP_MEC1:
    608 		*sram_offset = 0x10000;
    609 		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_MEC_ME1_UCODE_ADDR);
    610 		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_MEC_ME1_UCODE_DATA);
    611 		break;
    612 
    613 	case AMDGPU_UCODE_ID_CP_MEC2:
    614 		*sram_offset = 0x10000;
    615 		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_MEC2_UCODE_ADDR);
    616 		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_MEC2_UCODE_DATA);
    617 		break;
    618 
    619 	case AMDGPU_UCODE_ID_RLC_G:
    620 		*sram_offset = 0x2000;
    621 		if (adev->asic_type < CHIP_NAVI10) {
    622 			*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UCODE_ADDR);
    623 			*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UCODE_DATA);
    624 		} else {
    625 			*sram_addr_reg_offset = adev->reg_offset[GC_HWIP][0][1] + mmRLC_GPM_UCODE_ADDR_NV10;
    626 			*sram_data_reg_offset = adev->reg_offset[GC_HWIP][0][1] + mmRLC_GPM_UCODE_DATA_NV10;
    627 		}
    628 		break;
    629 
    630 	case AMDGPU_UCODE_ID_SDMA0:
    631 		*sram_offset = 0x0;
    632 		if (adev->asic_type < CHIP_NAVI10) {
    633 			*sram_addr_reg_offset = SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_UCODE_ADDR);
    634 			*sram_data_reg_offset = SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_UCODE_DATA);
    635 		} else {
    636 			*sram_addr_reg_offset = adev->reg_offset[GC_HWIP][0][1] + mmSDMA0_UCODE_ADDR_NV10;
    637 			*sram_data_reg_offset = adev->reg_offset[GC_HWIP][0][1] + mmSDMA0_UCODE_DATA_NV10;
    638 		}
    639 		break;
    640 
    641 /* TODO: needs to confirm */
    642 #if 0
    643 	case AMDGPU_UCODE_ID_SDMA1:
    644 		*sram_offset = ;
    645 		*sram_addr_reg_offset = ;
    646 		break;
    647 
    648 	case AMDGPU_UCODE_ID_UVD:
    649 		*sram_offset = ;
    650 		*sram_addr_reg_offset = ;
    651 		break;
    652 
    653 	case AMDGPU_UCODE_ID_VCE:
    654 		*sram_offset = ;
    655 		*sram_addr_reg_offset = ;
    656 		break;
    657 #endif
    658 
    659 	case AMDGPU_UCODE_ID_MAXIMUM:
    660 	default:
    661 		ret = -EINVAL;
    662 		break;
    663 	}
    664 
    665 	return ret;
    666 }
    667 
    668 static bool psp_v11_0_compare_sram_data(struct psp_context *psp,
    669 				       struct amdgpu_firmware_info *ucode,
    670 				       enum AMDGPU_UCODE_ID ucode_type)
    671 {
    672 	int err = 0;
    673 	unsigned int fw_sram_reg_val = 0;
    674 	unsigned int fw_sram_addr_reg_offset = 0;
    675 	unsigned int fw_sram_data_reg_offset = 0;
    676 	unsigned int ucode_size;
    677 	uint32_t *ucode_mem = NULL;
    678 	struct amdgpu_device *adev = psp->adev;
    679 
    680 	err = psp_v11_0_sram_map(adev, &fw_sram_reg_val, &fw_sram_addr_reg_offset,
    681 				&fw_sram_data_reg_offset, ucode_type);
    682 	if (err)
    683 		return false;
    684 
    685 	WREG32(fw_sram_addr_reg_offset, fw_sram_reg_val);
    686 
    687 	ucode_size = ucode->ucode_size;
    688 	ucode_mem = (uint32_t *)ucode->kaddr;
    689 	while (ucode_size) {
    690 		fw_sram_reg_val = RREG32(fw_sram_data_reg_offset);
    691 
    692 		if (*ucode_mem != fw_sram_reg_val)
    693 			return false;
    694 
    695 		ucode_mem++;
    696 		/* 4 bytes */
    697 		ucode_size -= 4;
    698 	}
    699 
    700 	return true;
    701 }
    702 
    703 static int psp_v11_0_mode1_reset(struct psp_context *psp)
    704 {
    705 	int ret;
    706 	uint32_t offset;
    707 	struct amdgpu_device *adev = psp->adev;
    708 
    709 	offset = SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64);
    710 
    711 	ret = psp_wait_for(psp, offset, 0x80000000, 0x8000FFFF, false);
    712 
    713 	if (ret) {
    714 		DRM_INFO("psp is not working correctly before mode1 reset!\n");
    715 		return -EINVAL;
    716 	}
    717 
    718 	/*send the mode 1 reset command*/
    719 	WREG32(offset, GFX_CTRL_CMD_ID_MODE1_RST);
    720 
    721 	msleep(500);
    722 
    723 	offset = SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_33);
    724 
    725 	ret = psp_wait_for(psp, offset, 0x80000000, 0x80000000, false);
    726 
    727 	if (ret) {
    728 		DRM_INFO("psp mode 1 reset failed!\n");
    729 		return -EINVAL;
    730 	}
    731 
    732 	DRM_INFO("psp mode1 reset succeed \n");
    733 
    734 	return 0;
    735 }
    736 
    737 /* TODO: Fill in follow functions once PSP firmware interface for XGMI is ready.
    738  * For now, return success and hack the hive_id so high level code can
    739  * start testing
    740  */
    741 static int psp_v11_0_xgmi_get_topology_info(struct psp_context *psp,
    742 	int number_devices, struct psp_xgmi_topology_info *topology)
    743 {
    744 	struct ta_xgmi_shared_memory *xgmi_cmd;
    745 	struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
    746 	struct ta_xgmi_cmd_get_topology_info_output *topology_info_output;
    747 	int i;
    748 	int ret;
    749 
    750 	if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
    751 		return -EINVAL;
    752 
    753 	xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
    754 	memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
    755 
    756 	/* Fill in the shared memory with topology information as input */
    757 	topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
    758 	xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO;
    759 	topology_info_input->num_nodes = number_devices;
    760 
    761 	for (i = 0; i < topology_info_input->num_nodes; i++) {
    762 		topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
    763 		topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
    764 		topology_info_input->nodes[i].is_sharing_enabled = topology->nodes[i].is_sharing_enabled;
    765 		topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
    766 	}
    767 
    768 	/* Invoke xgmi ta to get the topology information */
    769 	ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO);
    770 	if (ret)
    771 		return ret;
    772 
    773 	/* Read the output topology information from the shared memory */
    774 	topology_info_output = &xgmi_cmd->xgmi_out_message.get_topology_info;
    775 	topology->num_nodes = xgmi_cmd->xgmi_out_message.get_topology_info.num_nodes;
    776 	for (i = 0; i < topology->num_nodes; i++) {
    777 		topology->nodes[i].node_id = topology_info_output->nodes[i].node_id;
    778 		topology->nodes[i].num_hops = topology_info_output->nodes[i].num_hops;
    779 		topology->nodes[i].is_sharing_enabled = topology_info_output->nodes[i].is_sharing_enabled;
    780 		topology->nodes[i].sdma_engine = topology_info_output->nodes[i].sdma_engine;
    781 	}
    782 
    783 	return 0;
    784 }
    785 
    786 static int psp_v11_0_xgmi_set_topology_info(struct psp_context *psp,
    787 	int number_devices, struct psp_xgmi_topology_info *topology)
    788 {
    789 	struct ta_xgmi_shared_memory *xgmi_cmd;
    790 	struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
    791 	int i;
    792 
    793 	if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
    794 		return -EINVAL;
    795 
    796 	xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
    797 	memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
    798 
    799 	topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
    800 	xgmi_cmd->cmd_id = TA_COMMAND_XGMI__SET_TOPOLOGY_INFO;
    801 	topology_info_input->num_nodes = number_devices;
    802 
    803 	for (i = 0; i < topology_info_input->num_nodes; i++) {
    804 		topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
    805 		topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
    806 		topology_info_input->nodes[i].is_sharing_enabled = 1;
    807 		topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
    808 	}
    809 
    810 	/* Invoke xgmi ta to set topology information */
    811 	return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO);
    812 }
    813 
    814 static int psp_v11_0_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id)
    815 {
    816 	struct ta_xgmi_shared_memory *xgmi_cmd;
    817 	int ret;
    818 
    819 	xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
    820 	memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
    821 
    822 	xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_HIVE_ID;
    823 
    824 	/* Invoke xgmi ta to get hive id */
    825 	ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
    826 	if (ret)
    827 		return ret;
    828 
    829 	*hive_id = xgmi_cmd->xgmi_out_message.get_hive_id.hive_id;
    830 
    831 	return 0;
    832 }
    833 
    834 static int psp_v11_0_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id)
    835 {
    836 	struct ta_xgmi_shared_memory *xgmi_cmd;
    837 	int ret;
    838 
    839 	xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
    840 	memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
    841 
    842 	xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_NODE_ID;
    843 
    844 	/* Invoke xgmi ta to get the node id */
    845 	ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
    846 	if (ret)
    847 		return ret;
    848 
    849 	*node_id = xgmi_cmd->xgmi_out_message.get_node_id.node_id;
    850 
    851 	return 0;
    852 }
    853 
    854 static int psp_v11_0_ras_trigger_error(struct psp_context *psp,
    855 		struct ta_ras_trigger_error_input *info)
    856 {
    857 	struct ta_ras_shared_memory *ras_cmd;
    858 	int ret;
    859 
    860 	if (!psp->ras.ras_initialized)
    861 		return -EINVAL;
    862 
    863 	ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
    864 	memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));
    865 
    866 	ras_cmd->cmd_id = TA_RAS_COMMAND__TRIGGER_ERROR;
    867 	ras_cmd->ras_in_message.trigger_error = *info;
    868 
    869 	ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
    870 	if (ret)
    871 		return -EINVAL;
    872 
    873 	return ras_cmd->ras_status;
    874 }
    875 
    876 static int psp_v11_0_ras_cure_posion(struct psp_context *psp, uint64_t *mode_ptr)
    877 {
    878 #if 0
    879 	// not support yet.
    880 	struct ta_ras_shared_memory *ras_cmd;
    881 	int ret;
    882 
    883 	if (!psp->ras.ras_initialized)
    884 		return -EINVAL;
    885 
    886 	ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
    887 	memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));
    888 
    889 	ras_cmd->cmd_id = TA_RAS_COMMAND__CURE_POISON;
    890 	ras_cmd->ras_in_message.cure_poison.mode_ptr = mode_ptr;
    891 
    892 	ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
    893 	if (ret)
    894 		return -EINVAL;
    895 
    896 	return ras_cmd->ras_status;
    897 #else
    898 	return -EINVAL;
    899 #endif
    900 }
    901 
    902 static int psp_v11_0_rlc_autoload_start(struct psp_context *psp)
    903 {
    904 	return psp_rlc_autoload_start(psp);
    905 }
    906 
    907 static int psp_v11_0_memory_training_send_msg(struct psp_context *psp, int msg)
    908 {
    909 	int ret;
    910 	int i;
    911 	uint32_t data_32;
    912 	int max_wait;
    913 	struct amdgpu_device *adev = psp->adev;
    914 
    915 	data_32 = (psp->mem_train_ctx.c2p_train_data_offset >> 20);
    916 	WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36, data_32);
    917 	WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_35, msg);
    918 
    919 	max_wait = MEM_TRAIN_SEND_MSG_TIMEOUT_US / adev->usec_timeout;
    920 	for (i = 0; i < max_wait; i++) {
    921 		ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
    922 				   0x80000000, 0x80000000, false);
    923 		if (ret == 0)
    924 			break;
    925 	}
    926 	if (i < max_wait)
    927 		ret = 0;
    928 	else
    929 		ret = -ETIME;
    930 
    931 	DRM_DEBUG("training %s %s, cost %d @ %d ms\n",
    932 		  (msg == PSP_BL__DRAM_SHORT_TRAIN) ? "short" : "long",
    933 		  (ret == 0) ? "succeed" : "failed",
    934 		  i, adev->usec_timeout/1000);
    935 	return ret;
    936 }
    937 
    938 static void psp_v11_0_memory_training_fini(struct psp_context *psp)
    939 {
    940 	struct psp_memory_training_context *ctx = &psp->mem_train_ctx;
    941 
    942 	ctx->init = PSP_MEM_TRAIN_NOT_SUPPORT;
    943 	kfree(ctx->sys_cache);
    944 	ctx->sys_cache = NULL;
    945 }
    946 
    947 static int psp_v11_0_memory_training_init(struct psp_context *psp)
    948 {
    949 	int ret;
    950 	struct psp_memory_training_context *ctx = &psp->mem_train_ctx;
    951 
    952 	if (ctx->init != PSP_MEM_TRAIN_RESERVE_SUCCESS) {
    953 		DRM_DEBUG("memory training is not supported!\n");
    954 		return 0;
    955 	}
    956 
    957 	ctx->sys_cache = kzalloc(ctx->train_data_size, GFP_KERNEL);
    958 	if (ctx->sys_cache == NULL) {
    959 		DRM_ERROR("alloc mem_train_ctx.sys_cache failed!\n");
    960 		ret = -ENOMEM;
    961 		goto Err_out;
    962 	}
    963 
    964 	DRM_DEBUG("train_data_size:%"PRIx64",p2c_train_data_offset:%"PRIx64",c2p_train_data_offset:%"PRIx64".\n",
    965 		  ctx->train_data_size,
    966 		  ctx->p2c_train_data_offset,
    967 		  ctx->c2p_train_data_offset);
    968 	ctx->init = PSP_MEM_TRAIN_INIT_SUCCESS;
    969 	return 0;
    970 
    971 Err_out:
    972 	psp_v11_0_memory_training_fini(psp);
    973 	return ret;
    974 }
    975 
    976 /*
    977  * save and restore proces
    978  */
    979 static int psp_v11_0_memory_training(struct psp_context *psp, uint32_t ops)
    980 {
    981 	struct psp_memory_training_context *ctx = &psp->mem_train_ctx;
    982 	uint32_t *pcache = (uint32_t*)ctx->sys_cache;
    983 	struct amdgpu_device *adev = psp->adev;
    984 	uint32_t p2c_header[4];
    985 	uint32_t sz;
    986 	void *buf;
    987 	int ret;
    988 
    989 	if (ctx->init == PSP_MEM_TRAIN_NOT_SUPPORT) {
    990 		DRM_DEBUG("Memory training is not supported.\n");
    991 		return 0;
    992 	} else if (ctx->init != PSP_MEM_TRAIN_INIT_SUCCESS) {
    993 		DRM_ERROR("Memory training initialization failure.\n");
    994 		return -EINVAL;
    995 	}
    996 
    997 	if (psp_v11_0_is_sos_alive(psp)) {
    998 		DRM_DEBUG("SOS is alive, skip memory training.\n");
    999 		return 0;
   1000 	}
   1001 
   1002 	amdgpu_device_vram_access(adev, ctx->p2c_train_data_offset, p2c_header, sizeof(p2c_header), false);
   1003 	DRM_DEBUG("sys_cache[%08x,%08x,%08x,%08x] p2c_header[%08x,%08x,%08x,%08x]\n",
   1004 		  pcache[0], pcache[1], pcache[2], pcache[3],
   1005 		  p2c_header[0], p2c_header[1], p2c_header[2], p2c_header[3]);
   1006 
   1007 	if (ops & PSP_MEM_TRAIN_SEND_SHORT_MSG) {
   1008 		DRM_DEBUG("Short training depends on restore.\n");
   1009 		ops |= PSP_MEM_TRAIN_RESTORE;
   1010 	}
   1011 
   1012 	if ((ops & PSP_MEM_TRAIN_RESTORE) &&
   1013 	    pcache[0] != MEM_TRAIN_SYSTEM_SIGNATURE) {
   1014 		DRM_DEBUG("sys_cache[0] is invalid, restore depends on save.\n");
   1015 		ops |= PSP_MEM_TRAIN_SAVE;
   1016 	}
   1017 
   1018 	if (p2c_header[0] == MEM_TRAIN_SYSTEM_SIGNATURE &&
   1019 	    !(pcache[0] == MEM_TRAIN_SYSTEM_SIGNATURE &&
   1020 	      pcache[3] == p2c_header[3])) {
   1021 		DRM_DEBUG("sys_cache is invalid or out-of-date, need save training data to sys_cache.\n");
   1022 		ops |= PSP_MEM_TRAIN_SAVE;
   1023 	}
   1024 
   1025 	if ((ops & PSP_MEM_TRAIN_SAVE) &&
   1026 	    p2c_header[0] != MEM_TRAIN_SYSTEM_SIGNATURE) {
   1027 		DRM_DEBUG("p2c_header[0] is invalid, save depends on long training.\n");
   1028 		ops |= PSP_MEM_TRAIN_SEND_LONG_MSG;
   1029 	}
   1030 
   1031 	if (ops & PSP_MEM_TRAIN_SEND_LONG_MSG) {
   1032 		ops &= ~PSP_MEM_TRAIN_SEND_SHORT_MSG;
   1033 		ops |= PSP_MEM_TRAIN_SAVE;
   1034 	}
   1035 
   1036 	DRM_DEBUG("Memory training ops:%x.\n", ops);
   1037 
   1038 	if (ops & PSP_MEM_TRAIN_SEND_LONG_MSG) {
   1039 		/*
   1040 		 * Long traing will encroach certain mount of bottom VRAM,
   1041 		 * saving the content of this bottom VRAM to system memory
   1042 		 * before training, and restoring it after training to avoid
   1043 		 * VRAM corruption.
   1044 		 */
   1045 		sz = GDDR6_MEM_TRAINING_ENCROACHED_SIZE;
   1046 
   1047 		if (adev->gmc.visible_vram_size < sz || !adev->mman.aper_base_kaddr) {
   1048 			DRM_ERROR("visible_vram_size %"PRIx64" or aper_base_kaddr %p is not initialized.\n",
   1049 				  adev->gmc.visible_vram_size,
   1050 				  adev->mman.aper_base_kaddr);
   1051 			return -EINVAL;
   1052 		}
   1053 
   1054 		buf = vmalloc(sz);
   1055 		if (!buf) {
   1056 			DRM_ERROR("failed to allocate system memory.\n");
   1057 			return -ENOMEM;
   1058 		}
   1059 
   1060 		memcpy_fromio(buf, adev->mman.aper_base_kaddr, sz);
   1061 		ret = psp_v11_0_memory_training_send_msg(psp, PSP_BL__DRAM_LONG_TRAIN);
   1062 		if (ret) {
   1063 			DRM_ERROR("Send long training msg failed.\n");
   1064 			vfree(buf);
   1065 			return ret;
   1066 		}
   1067 
   1068 		memcpy_toio(adev->mman.aper_base_kaddr, buf, sz);
   1069 		adev->nbio.funcs->hdp_flush(adev, NULL);
   1070 		vfree(buf);
   1071 	}
   1072 
   1073 	if (ops & PSP_MEM_TRAIN_SAVE) {
   1074 		amdgpu_device_vram_access(psp->adev, ctx->p2c_train_data_offset, ctx->sys_cache, ctx->train_data_size, false);
   1075 	}
   1076 
   1077 	if (ops & PSP_MEM_TRAIN_RESTORE) {
   1078 		amdgpu_device_vram_access(psp->adev, ctx->c2p_train_data_offset, ctx->sys_cache, ctx->train_data_size, true);
   1079 	}
   1080 
   1081 	if (ops & PSP_MEM_TRAIN_SEND_SHORT_MSG) {
   1082 		ret = psp_v11_0_memory_training_send_msg(psp, (amdgpu_force_long_training > 0) ?
   1083 							 PSP_BL__DRAM_LONG_TRAIN : PSP_BL__DRAM_SHORT_TRAIN);
   1084 		if (ret) {
   1085 			DRM_ERROR("send training msg failed.\n");
   1086 			return ret;
   1087 		}
   1088 	}
   1089 	ctx->training_cnt++;
   1090 	return 0;
   1091 }
   1092 
   1093 static uint32_t psp_v11_0_ring_get_wptr(struct psp_context *psp)
   1094 {
   1095 	uint32_t data;
   1096 	struct amdgpu_device *adev = psp->adev;
   1097 
   1098 	if (psp_v11_0_support_vmr_ring(psp))
   1099 		data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102);
   1100 	else
   1101 		data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67);
   1102 
   1103 	return data;
   1104 }
   1105 
   1106 static void psp_v11_0_ring_set_wptr(struct psp_context *psp, uint32_t value)
   1107 {
   1108 	struct amdgpu_device *adev = psp->adev;
   1109 
   1110 	if (psp_v11_0_support_vmr_ring(psp)) {
   1111 		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, value);
   1112 		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, GFX_CTRL_CMD_ID_CONSUME_CMD);
   1113 	} else
   1114 		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, value);
   1115 }
   1116 
   1117 static const struct psp_funcs psp_v11_0_funcs = {
   1118 	.init_microcode = psp_v11_0_init_microcode,
   1119 	.bootloader_load_kdb = psp_v11_0_bootloader_load_kdb,
   1120 	.bootloader_load_sysdrv = psp_v11_0_bootloader_load_sysdrv,
   1121 	.bootloader_load_sos = psp_v11_0_bootloader_load_sos,
   1122 	.ring_init = psp_v11_0_ring_init,
   1123 	.ring_create = psp_v11_0_ring_create,
   1124 	.ring_stop = psp_v11_0_ring_stop,
   1125 	.ring_destroy = psp_v11_0_ring_destroy,
   1126 	.compare_sram_data = psp_v11_0_compare_sram_data,
   1127 	.mode1_reset = psp_v11_0_mode1_reset,
   1128 	.xgmi_get_topology_info = psp_v11_0_xgmi_get_topology_info,
   1129 	.xgmi_set_topology_info = psp_v11_0_xgmi_set_topology_info,
   1130 	.xgmi_get_hive_id = psp_v11_0_xgmi_get_hive_id,
   1131 	.xgmi_get_node_id = psp_v11_0_xgmi_get_node_id,
   1132 	.support_vmr_ring = psp_v11_0_support_vmr_ring,
   1133 	.ras_trigger_error = psp_v11_0_ras_trigger_error,
   1134 	.ras_cure_posion = psp_v11_0_ras_cure_posion,
   1135 	.rlc_autoload_start = psp_v11_0_rlc_autoload_start,
   1136 	.mem_training_init = psp_v11_0_memory_training_init,
   1137 	.mem_training_fini = psp_v11_0_memory_training_fini,
   1138 	.mem_training = psp_v11_0_memory_training,
   1139 	.ring_get_wptr = psp_v11_0_ring_get_wptr,
   1140 	.ring_set_wptr = psp_v11_0_ring_set_wptr,
   1141 };
   1142 
   1143 void psp_v11_0_set_psp_funcs(struct psp_context *psp)
   1144 {
   1145 	psp->funcs = &psp_v11_0_funcs;
   1146 }
   1147