0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 #include "amdgpu.h"
0024 #include "amdgpu_psp.h"
0025 #include "amdgpu_ucode.h"
0026 #include "soc15_common.h"
0027 #include "psp_v13_0_4.h"
0028
0029 #include "mp/mp_13_0_4_offset.h"
0030 #include "mp/mp_13_0_4_sh_mask.h"
0031
0032 MODULE_FIRMWARE("amdgpu/psp_13_0_4_toc.bin");
0033 MODULE_FIRMWARE("amdgpu/psp_13_0_4_ta.bin");
0034
0035 static int psp_v13_0_4_init_microcode(struct psp_context *psp)
0036 {
0037 struct amdgpu_device *adev = psp->adev;
0038 const char *chip_name;
0039 char ucode_prefix[30];
0040 int err = 0;
0041
0042 switch (adev->ip_versions[MP0_HWIP][0]) {
0043 case IP_VERSION(13, 0, 4):
0044 amdgpu_ucode_ip_version_decode(adev, MP0_HWIP, ucode_prefix, sizeof(ucode_prefix));
0045 chip_name = ucode_prefix;
0046 break;
0047 default:
0048 BUG();
0049 }
0050
0051 switch (adev->ip_versions[MP0_HWIP][0]) {
0052 case IP_VERSION(13, 0, 4):
0053 err = psp_init_toc_microcode(psp, chip_name);
0054 if (err)
0055 return err;
0056 err = psp_init_ta_microcode(psp, chip_name);
0057 if (err)
0058 return err;
0059 break;
0060 default:
0061 BUG();
0062 }
0063
0064 return 0;
0065 }
0066
0067 static bool psp_v13_0_4_is_sos_alive(struct psp_context *psp)
0068 {
0069 struct amdgpu_device *adev = psp->adev;
0070 uint32_t sol_reg;
0071
0072 sol_reg = RREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_81);
0073
0074 return sol_reg != 0x0;
0075 }
0076
0077 static int psp_v13_0_4_wait_for_bootloader(struct psp_context *psp)
0078 {
0079 struct amdgpu_device *adev = psp->adev;
0080
0081 int ret;
0082 int retry_loop;
0083
0084 for (retry_loop = 0; retry_loop < 10; retry_loop++) {
0085
0086
0087 ret = psp_wait_for(psp,
0088 SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_35),
0089 0x80000000,
0090 0x80000000,
0091 false);
0092
0093 if (ret == 0)
0094 return 0;
0095 }
0096
0097 return ret;
0098 }
0099
0100 static int psp_v13_0_4_bootloader_load_component(struct psp_context *psp,
0101 struct psp_bin_desc *bin_desc,
0102 enum psp_bootloader_cmd bl_cmd)
0103 {
0104 int ret;
0105 uint32_t psp_gfxdrv_command_reg = 0;
0106 struct amdgpu_device *adev = psp->adev;
0107
0108
0109
0110
0111 if (psp_v13_0_4_is_sos_alive(psp))
0112 return 0;
0113
0114 ret = psp_v13_0_4_wait_for_bootloader(psp);
0115 if (ret)
0116 return ret;
0117
0118 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
0119
0120
0121 memcpy(psp->fw_pri_buf, bin_desc->start_addr, bin_desc->size_bytes);
0122
0123
0124 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_36,
0125 (uint32_t)(psp->fw_pri_mc_addr >> 20));
0126 psp_gfxdrv_command_reg = bl_cmd;
0127 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_35,
0128 psp_gfxdrv_command_reg);
0129
0130 ret = psp_v13_0_4_wait_for_bootloader(psp);
0131
0132 return ret;
0133 }
0134
0135 static int psp_v13_0_4_bootloader_load_kdb(struct psp_context *psp)
0136 {
0137 return psp_v13_0_4_bootloader_load_component(psp, &psp->kdb, PSP_BL__LOAD_KEY_DATABASE);
0138 }
0139
0140 static int psp_v13_0_4_bootloader_load_spl(struct psp_context *psp)
0141 {
0142 return psp_v13_0_4_bootloader_load_component(psp, &psp->kdb, PSP_BL__LOAD_TOS_SPL_TABLE);
0143 }
0144
0145 static int psp_v13_0_4_bootloader_load_sysdrv(struct psp_context *psp)
0146 {
0147 return psp_v13_0_4_bootloader_load_component(psp, &psp->sys, PSP_BL__LOAD_SYSDRV);
0148 }
0149
0150 static int psp_v13_0_4_bootloader_load_soc_drv(struct psp_context *psp)
0151 {
0152 return psp_v13_0_4_bootloader_load_component(psp, &psp->soc_drv, PSP_BL__LOAD_SOCDRV);
0153 }
0154
0155 static int psp_v13_0_4_bootloader_load_intf_drv(struct psp_context *psp)
0156 {
0157 return psp_v13_0_4_bootloader_load_component(psp, &psp->intf_drv, PSP_BL__LOAD_INTFDRV);
0158 }
0159
0160 static int psp_v13_0_4_bootloader_load_dbg_drv(struct psp_context *psp)
0161 {
0162 return psp_v13_0_4_bootloader_load_component(psp, &psp->dbg_drv, PSP_BL__LOAD_DBGDRV);
0163 }
0164
0165 static int psp_v13_0_4_bootloader_load_sos(struct psp_context *psp)
0166 {
0167 int ret;
0168 unsigned int psp_gfxdrv_command_reg = 0;
0169 struct amdgpu_device *adev = psp->adev;
0170
0171
0172
0173
0174 if (psp_v13_0_4_is_sos_alive(psp))
0175 return 0;
0176
0177 ret = psp_v13_0_4_wait_for_bootloader(psp);
0178 if (ret)
0179 return ret;
0180
0181 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
0182
0183
0184 memcpy(psp->fw_pri_buf, psp->sos.start_addr, psp->sos.size_bytes);
0185
0186
0187 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_36,
0188 (uint32_t)(psp->fw_pri_mc_addr >> 20));
0189 psp_gfxdrv_command_reg = PSP_BL__LOAD_SOSDRV;
0190 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_35,
0191 psp_gfxdrv_command_reg);
0192
0193
0194 mdelay(20);
0195 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_81),
0196 RREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_81),
0197 0, true);
0198
0199 return ret;
0200 }
0201
0202 static int psp_v13_0_4_ring_init(struct psp_context *psp,
0203 enum psp_ring_type ring_type)
0204 {
0205 int ret = 0;
0206 struct psp_ring *ring;
0207 struct amdgpu_device *adev = psp->adev;
0208
0209 ring = &psp->km_ring;
0210
0211 ring->ring_type = ring_type;
0212
0213
0214 ring->ring_size = 0x1000;
0215 ret = amdgpu_bo_create_kernel(adev, ring->ring_size, PAGE_SIZE,
0216 AMDGPU_GEM_DOMAIN_VRAM,
0217 &adev->firmware.rbuf,
0218 &ring->ring_mem_mc_addr,
0219 (void **)&ring->ring_mem);
0220 if (ret) {
0221 ring->ring_size = 0;
0222 return ret;
0223 }
0224
0225 return 0;
0226 }
0227
0228 static int psp_v13_0_4_ring_stop(struct psp_context *psp,
0229 enum psp_ring_type ring_type)
0230 {
0231 int ret = 0;
0232 struct amdgpu_device *adev = psp->adev;
0233
0234 if (amdgpu_sriov_vf(adev)) {
0235
0236 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_101,
0237 GFX_CTRL_CMD_ID_DESTROY_GPCOM_RING);
0238
0239 mdelay(20);
0240
0241 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_101),
0242 0x80000000, 0x80000000, false);
0243 } else {
0244
0245 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_64,
0246 GFX_CTRL_CMD_ID_DESTROY_RINGS);
0247
0248 mdelay(20);
0249
0250 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_64),
0251 0x80000000, 0x80000000, false);
0252 }
0253
0254 return ret;
0255 }
0256
0257 static int psp_v13_0_4_ring_create(struct psp_context *psp,
0258 enum psp_ring_type ring_type)
0259 {
0260 int ret = 0;
0261 unsigned int psp_ring_reg = 0;
0262 struct psp_ring *ring = &psp->km_ring;
0263 struct amdgpu_device *adev = psp->adev;
0264
0265 if (amdgpu_sriov_vf(adev)) {
0266 ret = psp_v13_0_4_ring_stop(psp, ring_type);
0267 if (ret) {
0268 DRM_ERROR("psp_v13_0_ring_stop_sriov failed!\n");
0269 return ret;
0270 }
0271
0272
0273 psp_ring_reg = lower_32_bits(ring->ring_mem_mc_addr);
0274 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_102, psp_ring_reg);
0275
0276 psp_ring_reg = upper_32_bits(ring->ring_mem_mc_addr);
0277 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_103, psp_ring_reg);
0278
0279
0280 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_101,
0281 GFX_CTRL_CMD_ID_INIT_GPCOM_RING);
0282
0283
0284 mdelay(20);
0285
0286
0287 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_101),
0288 0x80000000, 0x8000FFFF, false);
0289
0290 } else {
0291
0292 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_64),
0293 0x80000000, 0x80000000, false);
0294 if (ret) {
0295 DRM_ERROR("Failed to wait for trust OS ready for ring creation\n");
0296 return ret;
0297 }
0298
0299
0300 psp_ring_reg = lower_32_bits(ring->ring_mem_mc_addr);
0301 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_69, psp_ring_reg);
0302
0303 psp_ring_reg = upper_32_bits(ring->ring_mem_mc_addr);
0304 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_70, psp_ring_reg);
0305
0306 psp_ring_reg = ring->ring_size;
0307 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_71, psp_ring_reg);
0308
0309 psp_ring_reg = ring_type;
0310 psp_ring_reg = psp_ring_reg << 16;
0311 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_64, psp_ring_reg);
0312
0313
0314 mdelay(20);
0315
0316
0317 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_64),
0318 0x80000000, 0x8000FFFF, false);
0319 }
0320
0321 return ret;
0322 }
0323
0324 static int psp_v13_0_4_ring_destroy(struct psp_context *psp,
0325 enum psp_ring_type ring_type)
0326 {
0327 int ret = 0;
0328 struct psp_ring *ring = &psp->km_ring;
0329 struct amdgpu_device *adev = psp->adev;
0330
0331 ret = psp_v13_0_4_ring_stop(psp, ring_type);
0332 if (ret)
0333 DRM_ERROR("Fail to stop psp ring\n");
0334
0335 amdgpu_bo_free_kernel(&adev->firmware.rbuf,
0336 &ring->ring_mem_mc_addr,
0337 (void **)&ring->ring_mem);
0338
0339 return ret;
0340 }
0341
0342 static uint32_t psp_v13_0_4_ring_get_wptr(struct psp_context *psp)
0343 {
0344 uint32_t data;
0345 struct amdgpu_device *adev = psp->adev;
0346
0347 if (amdgpu_sriov_vf(adev))
0348 data = RREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_102);
0349 else
0350 data = RREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_67);
0351
0352 return data;
0353 }
0354
0355 static void psp_v13_0_4_ring_set_wptr(struct psp_context *psp, uint32_t value)
0356 {
0357 struct amdgpu_device *adev = psp->adev;
0358
0359 if (amdgpu_sriov_vf(adev)) {
0360 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_102, value);
0361 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_101,
0362 GFX_CTRL_CMD_ID_CONSUME_CMD);
0363 } else
0364 WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_67, value);
0365 }
0366
0367 static const struct psp_funcs psp_v13_0_4_funcs = {
0368 .init_microcode = psp_v13_0_4_init_microcode,
0369 .bootloader_load_kdb = psp_v13_0_4_bootloader_load_kdb,
0370 .bootloader_load_spl = psp_v13_0_4_bootloader_load_spl,
0371 .bootloader_load_sysdrv = psp_v13_0_4_bootloader_load_sysdrv,
0372 .bootloader_load_soc_drv = psp_v13_0_4_bootloader_load_soc_drv,
0373 .bootloader_load_intf_drv = psp_v13_0_4_bootloader_load_intf_drv,
0374 .bootloader_load_dbg_drv = psp_v13_0_4_bootloader_load_dbg_drv,
0375 .bootloader_load_sos = psp_v13_0_4_bootloader_load_sos,
0376 .ring_init = psp_v13_0_4_ring_init,
0377 .ring_create = psp_v13_0_4_ring_create,
0378 .ring_stop = psp_v13_0_4_ring_stop,
0379 .ring_destroy = psp_v13_0_4_ring_destroy,
0380 .ring_get_wptr = psp_v13_0_4_ring_get_wptr,
0381 .ring_set_wptr = psp_v13_0_4_ring_set_wptr,
0382 };
0383
0384 void psp_v13_0_4_set_psp_funcs(struct psp_context *psp)
0385 {
0386 psp->funcs = &psp_v13_0_4_funcs;
0387 }