]> Git Repo - linux.git/blob - drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux.git] / drivers / gpu / drm / amd / amdgpu / psp_v11_0.c
1 /*
2  * Copyright 2018 Advanced Micro Devices, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  */
22
23 #include <linux/firmware.h>
24 #include "amdgpu.h"
25 #include "amdgpu_psp.h"
26 #include "amdgpu_ucode.h"
27 #include "soc15_common.h"
28 #include "psp_v11_0.h"
29
30 #include "mp/mp_11_0_offset.h"
31 #include "mp/mp_11_0_sh_mask.h"
32 #include "gc/gc_9_0_offset.h"
33 #include "sdma0/sdma0_4_0_offset.h"
34 #include "nbio/nbio_7_4_offset.h"
35
36 MODULE_FIRMWARE("amdgpu/vega20_sos.bin");
37 MODULE_FIRMWARE("amdgpu/vega20_ta.bin");
38
39 /* address block */
40 #define smnMP1_FIRMWARE_FLAGS           0x3010024
41
42 static int
43 psp_v11_0_get_fw_type(struct amdgpu_firmware_info *ucode, enum psp_gfx_fw_type *type)
44 {
45         switch (ucode->ucode_id) {
46         case AMDGPU_UCODE_ID_SDMA0:
47                 *type = GFX_FW_TYPE_SDMA0;
48                 break;
49         case AMDGPU_UCODE_ID_SDMA1:
50                 *type = GFX_FW_TYPE_SDMA1;
51                 break;
52         case AMDGPU_UCODE_ID_CP_CE:
53                 *type = GFX_FW_TYPE_CP_CE;
54                 break;
55         case AMDGPU_UCODE_ID_CP_PFP:
56                 *type = GFX_FW_TYPE_CP_PFP;
57                 break;
58         case AMDGPU_UCODE_ID_CP_ME:
59                 *type = GFX_FW_TYPE_CP_ME;
60                 break;
61         case AMDGPU_UCODE_ID_CP_MEC1:
62                 *type = GFX_FW_TYPE_CP_MEC;
63                 break;
64         case AMDGPU_UCODE_ID_CP_MEC1_JT:
65                 *type = GFX_FW_TYPE_CP_MEC_ME1;
66                 break;
67         case AMDGPU_UCODE_ID_CP_MEC2:
68                 *type = GFX_FW_TYPE_CP_MEC;
69                 break;
70         case AMDGPU_UCODE_ID_CP_MEC2_JT:
71                 *type = GFX_FW_TYPE_CP_MEC_ME2;
72                 break;
73         case AMDGPU_UCODE_ID_RLC_G:
74                 *type = GFX_FW_TYPE_RLC_G;
75                 break;
76         case AMDGPU_UCODE_ID_SMC:
77                 *type = GFX_FW_TYPE_SMU;
78                 break;
79         case AMDGPU_UCODE_ID_UVD:
80                 *type = GFX_FW_TYPE_UVD;
81                 break;
82         case AMDGPU_UCODE_ID_VCE:
83                 *type = GFX_FW_TYPE_VCE;
84                 break;
85         case AMDGPU_UCODE_ID_UVD1:
86                 *type = GFX_FW_TYPE_UVD1;
87                 break;
88         case AMDGPU_UCODE_ID_MAXIMUM:
89         default:
90                 return -EINVAL;
91         }
92
93         return 0;
94 }
95
96 static int psp_v11_0_init_microcode(struct psp_context *psp)
97 {
98         struct amdgpu_device *adev = psp->adev;
99         const char *chip_name;
100         char fw_name[30];
101         int err = 0;
102         const struct psp_firmware_header_v1_0 *sos_hdr;
103         const struct ta_firmware_header_v1_0 *ta_hdr;
104
105         DRM_DEBUG("\n");
106
107         switch (adev->asic_type) {
108         case CHIP_VEGA20:
109                 chip_name = "vega20";
110                 break;
111         default:
112                 BUG();
113         }
114
115         snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", chip_name);
116         err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev);
117         if (err)
118                 goto out;
119
120         err = amdgpu_ucode_validate(adev->psp.sos_fw);
121         if (err)
122                 goto out;
123
124         sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data;
125         adev->psp.sos_fw_version = le32_to_cpu(sos_hdr->header.ucode_version);
126         adev->psp.sos_feature_version = le32_to_cpu(sos_hdr->ucode_feature_version);
127         adev->psp.sos_bin_size = le32_to_cpu(sos_hdr->sos_size_bytes);
128         adev->psp.sys_bin_size = le32_to_cpu(sos_hdr->header.ucode_size_bytes) -
129                                         le32_to_cpu(sos_hdr->sos_size_bytes);
130         adev->psp.sys_start_addr = (uint8_t *)sos_hdr +
131                                 le32_to_cpu(sos_hdr->header.ucode_array_offset_bytes);
132         adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr +
133                                 le32_to_cpu(sos_hdr->sos_offset_bytes);
134
135         snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name);
136         err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev);
137         if (err)
138                 goto out;
139
140         err = amdgpu_ucode_validate(adev->psp.ta_fw);
141         if (err)
142                 goto out;
143
144         ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data;
145         adev->psp.ta_xgmi_ucode_version = le32_to_cpu(ta_hdr->ta_xgmi_ucode_version);
146         adev->psp.ta_xgmi_ucode_size = le32_to_cpu(ta_hdr->ta_xgmi_size_bytes);
147         adev->psp.ta_xgmi_start_addr = (uint8_t *)ta_hdr +
148                 le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes);
149
150         return 0;
151 out:
152         if (err) {
153                 dev_err(adev->dev,
154                         "psp v11.0: Failed to load firmware \"%s\"\n",
155                         fw_name);
156                 release_firmware(adev->psp.sos_fw);
157                 adev->psp.sos_fw = NULL;
158         }
159
160         return err;
161 }
162
163 static int psp_v11_0_bootloader_load_sysdrv(struct psp_context *psp)
164 {
165         int ret;
166         uint32_t psp_gfxdrv_command_reg = 0;
167         struct amdgpu_device *adev = psp->adev;
168         uint32_t sol_reg;
169
170         /* Check sOS sign of life register to confirm sys driver and sOS
171          * are already been loaded.
172          */
173         sol_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81);
174         if (sol_reg) {
175                 psp->sos_fw_version = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_58);
176                 printk("sos fw version = 0x%x.\n", psp->sos_fw_version);
177                 return 0;
178         }
179
180         /* Wait for bootloader to signify that is ready having bit 31 of C2PMSG_35 set to 1 */
181         ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
182                            0x80000000, 0x80000000, false);
183         if (ret)
184                 return ret;
185
186         memset(psp->fw_pri_buf, 0, PSP_1_MEG);
187
188         /* Copy PSP System Driver binary to memory */
189         memcpy(psp->fw_pri_buf, psp->sys_start_addr, psp->sys_bin_size);
190
191         /* Provide the sys driver to bootloader */
192         WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36,
193                (uint32_t)(psp->fw_pri_mc_addr >> 20));
194         psp_gfxdrv_command_reg = 1 << 16;
195         WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_35,
196                psp_gfxdrv_command_reg);
197
198         /* there might be handshake issue with hardware which needs delay */
199         mdelay(20);
200
201         ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
202                            0x80000000, 0x80000000, false);
203
204         return ret;
205 }
206
207 static int psp_v11_0_bootloader_load_sos(struct psp_context *psp)
208 {
209         int ret;
210         unsigned int psp_gfxdrv_command_reg = 0;
211         struct amdgpu_device *adev = psp->adev;
212         uint32_t sol_reg;
213
214         /* Check sOS sign of life register to confirm sys driver and sOS
215          * are already been loaded.
216          */
217         sol_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81);
218         if (sol_reg)
219                 return 0;
220
221         /* Wait for bootloader to signify that is ready having bit 31 of C2PMSG_35 set to 1 */
222         ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
223                            0x80000000, 0x80000000, false);
224         if (ret)
225                 return ret;
226
227         memset(psp->fw_pri_buf, 0, PSP_1_MEG);
228
229         /* Copy Secure OS binary to PSP memory */
230         memcpy(psp->fw_pri_buf, psp->sos_start_addr, psp->sos_bin_size);
231
232         /* Provide the PSP secure OS to bootloader */
233         WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36,
234                (uint32_t)(psp->fw_pri_mc_addr >> 20));
235         psp_gfxdrv_command_reg = 2 << 16;
236         WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_35,
237                psp_gfxdrv_command_reg);
238
239         /* there might be handshake issue with hardware which needs delay */
240         mdelay(20);
241         ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_81),
242                            RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81),
243                            0, true);
244
245         return ret;
246 }
247
248 static int psp_v11_0_prep_cmd_buf(struct amdgpu_firmware_info *ucode,
249                                  struct psp_gfx_cmd_resp *cmd)
250 {
251         int ret;
252         uint64_t fw_mem_mc_addr = ucode->mc_addr;
253
254         memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp));
255
256         cmd->cmd_id = GFX_CMD_ID_LOAD_IP_FW;
257         cmd->cmd.cmd_load_ip_fw.fw_phy_addr_lo = lower_32_bits(fw_mem_mc_addr);
258         cmd->cmd.cmd_load_ip_fw.fw_phy_addr_hi = upper_32_bits(fw_mem_mc_addr);
259         cmd->cmd.cmd_load_ip_fw.fw_size = ucode->ucode_size;
260
261         ret = psp_v11_0_get_fw_type(ucode, &cmd->cmd.cmd_load_ip_fw.fw_type);
262         if (ret)
263                 DRM_ERROR("Unknown firmware type\n");
264
265         return ret;
266 }
267
268 static int psp_v11_0_ring_init(struct psp_context *psp,
269                               enum psp_ring_type ring_type)
270 {
271         int ret = 0;
272         struct psp_ring *ring;
273         struct amdgpu_device *adev = psp->adev;
274
275         ring = &psp->km_ring;
276
277         ring->ring_type = ring_type;
278
279         /* allocate 4k Page of Local Frame Buffer memory for ring */
280         ring->ring_size = 0x1000;
281         ret = amdgpu_bo_create_kernel(adev, ring->ring_size, PAGE_SIZE,
282                                       AMDGPU_GEM_DOMAIN_VRAM,
283                                       &adev->firmware.rbuf,
284                                       &ring->ring_mem_mc_addr,
285                                       (void **)&ring->ring_mem);
286         if (ret) {
287                 ring->ring_size = 0;
288                 return ret;
289         }
290
291         return 0;
292 }
293
294 static int psp_v11_0_ring_create(struct psp_context *psp,
295                                 enum psp_ring_type ring_type)
296 {
297         int ret = 0;
298         unsigned int psp_ring_reg = 0;
299         struct psp_ring *ring = &psp->km_ring;
300         struct amdgpu_device *adev = psp->adev;
301
302         if (psp_support_vmr_ring(psp)) {
303                 /* Write low address of the ring to C2PMSG_102 */
304                 psp_ring_reg = lower_32_bits(ring->ring_mem_mc_addr);
305                 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, psp_ring_reg);
306                 /* Write high address of the ring to C2PMSG_103 */
307                 psp_ring_reg = upper_32_bits(ring->ring_mem_mc_addr);
308                 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_103, psp_ring_reg);
309
310                 /* Write the ring initialization command to C2PMSG_101 */
311                 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101,
312                                              GFX_CTRL_CMD_ID_INIT_GPCOM_RING);
313
314                 /* there might be handshake issue with hardware which needs delay */
315                 mdelay(20);
316
317                 /* Wait for response flag (bit 31) in C2PMSG_101 */
318                 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),
319                                    0x80000000, 0x8000FFFF, false);
320
321         } else {
322                 /* Write low address of the ring to C2PMSG_69 */
323                 psp_ring_reg = lower_32_bits(ring->ring_mem_mc_addr);
324                 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_69, psp_ring_reg);
325                 /* Write high address of the ring to C2PMSG_70 */
326                 psp_ring_reg = upper_32_bits(ring->ring_mem_mc_addr);
327                 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_70, psp_ring_reg);
328                 /* Write size of ring to C2PMSG_71 */
329                 psp_ring_reg = ring->ring_size;
330                 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_71, psp_ring_reg);
331                 /* Write the ring initialization command to C2PMSG_64 */
332                 psp_ring_reg = ring_type;
333                 psp_ring_reg = psp_ring_reg << 16;
334                 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_64, psp_ring_reg);
335
336                 /* there might be handshake issue with hardware which needs delay */
337                 mdelay(20);
338
339                 /* Wait for response flag (bit 31) in C2PMSG_64 */
340                 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
341                                    0x80000000, 0x8000FFFF, false);
342         }
343
344         return ret;
345 }
346
347 static int psp_v11_0_ring_stop(struct psp_context *psp,
348                               enum psp_ring_type ring_type)
349 {
350         int ret = 0;
351         struct amdgpu_device *adev = psp->adev;
352
353         /* Write the ring destroy command*/
354         if (psp_support_vmr_ring(psp))
355                 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101,
356                                      GFX_CTRL_CMD_ID_DESTROY_GPCOM_RING);
357         else
358                 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_64,
359                                      GFX_CTRL_CMD_ID_DESTROY_RINGS);
360
361         /* there might be handshake issue with hardware which needs delay */
362         mdelay(20);
363
364         /* Wait for response flag (bit 31) */
365         if (psp_support_vmr_ring(psp))
366                 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),
367                                    0x80000000, 0x80000000, false);
368         else
369                 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
370                                    0x80000000, 0x80000000, false);
371
372         return ret;
373 }
374
375 static int psp_v11_0_ring_destroy(struct psp_context *psp,
376                                  enum psp_ring_type ring_type)
377 {
378         int ret = 0;
379         struct psp_ring *ring = &psp->km_ring;
380         struct amdgpu_device *adev = psp->adev;
381
382         ret = psp_v11_0_ring_stop(psp, ring_type);
383         if (ret)
384                 DRM_ERROR("Fail to stop psp ring\n");
385
386         amdgpu_bo_free_kernel(&adev->firmware.rbuf,
387                               &ring->ring_mem_mc_addr,
388                               (void **)&ring->ring_mem);
389
390         return ret;
391 }
392
393 static int psp_v11_0_cmd_submit(struct psp_context *psp,
394                                struct amdgpu_firmware_info *ucode,
395                                uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr,
396                                int index)
397 {
398         unsigned int psp_write_ptr_reg = 0;
399         struct psp_gfx_rb_frame *write_frame = psp->km_ring.ring_mem;
400         struct psp_ring *ring = &psp->km_ring;
401         struct psp_gfx_rb_frame *ring_buffer_start = ring->ring_mem;
402         struct psp_gfx_rb_frame *ring_buffer_end = ring_buffer_start +
403                 ring->ring_size / sizeof(struct psp_gfx_rb_frame) - 1;
404         struct amdgpu_device *adev = psp->adev;
405         uint32_t ring_size_dw = ring->ring_size / 4;
406         uint32_t rb_frame_size_dw = sizeof(struct psp_gfx_rb_frame) / 4;
407
408         /* KM (GPCOM) prepare write pointer */
409         if (psp_support_vmr_ring(psp))
410                 psp_write_ptr_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102);
411         else
412                 psp_write_ptr_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67);
413
414         /* Update KM RB frame pointer to new frame */
415         /* write_frame ptr increments by size of rb_frame in bytes */
416         /* psp_write_ptr_reg increments by size of rb_frame in DWORDs */
417         if ((psp_write_ptr_reg % ring_size_dw) == 0)
418                 write_frame = ring_buffer_start;
419         else
420                 write_frame = ring_buffer_start + (psp_write_ptr_reg / rb_frame_size_dw);
421         /* Check invalid write_frame ptr address */
422         if ((write_frame < ring_buffer_start) || (ring_buffer_end < write_frame)) {
423                 DRM_ERROR("ring_buffer_start = %p; ring_buffer_end = %p; write_frame = %p\n",
424                           ring_buffer_start, ring_buffer_end, write_frame);
425                 DRM_ERROR("write_frame is pointing to address out of bounds\n");
426                 return -EINVAL;
427         }
428
429         /* Initialize KM RB frame */
430         memset(write_frame, 0, sizeof(struct psp_gfx_rb_frame));
431
432         /* Update KM RB frame */
433         write_frame->cmd_buf_addr_hi = upper_32_bits(cmd_buf_mc_addr);
434         write_frame->cmd_buf_addr_lo = lower_32_bits(cmd_buf_mc_addr);
435         write_frame->fence_addr_hi = upper_32_bits(fence_mc_addr);
436         write_frame->fence_addr_lo = lower_32_bits(fence_mc_addr);
437         write_frame->fence_value = index;
438
439         /* Update the write Pointer in DWORDs */
440         psp_write_ptr_reg = (psp_write_ptr_reg + rb_frame_size_dw) % ring_size_dw;
441         if (psp_support_vmr_ring(psp)) {
442                 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, psp_write_ptr_reg);
443                 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, GFX_CTRL_CMD_ID_CONSUME_CMD);
444         } else
445                 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, psp_write_ptr_reg);
446
447         return 0;
448 }
449
450 static int
451 psp_v11_0_sram_map(struct amdgpu_device *adev,
452                   unsigned int *sram_offset, unsigned int *sram_addr_reg_offset,
453                   unsigned int *sram_data_reg_offset,
454                   enum AMDGPU_UCODE_ID ucode_id)
455 {
456         int ret = 0;
457
458         switch (ucode_id) {
459 /* TODO: needs to confirm */
460 #if 0
461         case AMDGPU_UCODE_ID_SMC:
462                 *sram_offset = 0;
463                 *sram_addr_reg_offset = 0;
464                 *sram_data_reg_offset = 0;
465                 break;
466 #endif
467
468         case AMDGPU_UCODE_ID_CP_CE:
469                 *sram_offset = 0x0;
470                 *sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_CE_UCODE_ADDR);
471                 *sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_CE_UCODE_DATA);
472                 break;
473
474         case AMDGPU_UCODE_ID_CP_PFP:
475                 *sram_offset = 0x0;
476                 *sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_PFP_UCODE_ADDR);
477                 *sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_PFP_UCODE_DATA);
478                 break;
479
480         case AMDGPU_UCODE_ID_CP_ME:
481                 *sram_offset = 0x0;
482                 *sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_ME_UCODE_ADDR);
483                 *sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_ME_UCODE_DATA);
484                 break;
485
486         case AMDGPU_UCODE_ID_CP_MEC1:
487                 *sram_offset = 0x10000;
488                 *sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_MEC_ME1_UCODE_ADDR);
489                 *sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_MEC_ME1_UCODE_DATA);
490                 break;
491
492         case AMDGPU_UCODE_ID_CP_MEC2:
493                 *sram_offset = 0x10000;
494                 *sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_MEC2_UCODE_ADDR);
495                 *sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_MEC2_UCODE_DATA);
496                 break;
497
498         case AMDGPU_UCODE_ID_RLC_G:
499                 *sram_offset = 0x2000;
500                 *sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UCODE_ADDR);
501                 *sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UCODE_DATA);
502                 break;
503
504         case AMDGPU_UCODE_ID_SDMA0:
505                 *sram_offset = 0x0;
506                 *sram_addr_reg_offset = SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_UCODE_ADDR);
507                 *sram_data_reg_offset = SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_UCODE_DATA);
508                 break;
509
510 /* TODO: needs to confirm */
511 #if 0
512         case AMDGPU_UCODE_ID_SDMA1:
513                 *sram_offset = ;
514                 *sram_addr_reg_offset = ;
515                 break;
516
517         case AMDGPU_UCODE_ID_UVD:
518                 *sram_offset = ;
519                 *sram_addr_reg_offset = ;
520                 break;
521
522         case AMDGPU_UCODE_ID_VCE:
523                 *sram_offset = ;
524                 *sram_addr_reg_offset = ;
525                 break;
526 #endif
527
528         case AMDGPU_UCODE_ID_MAXIMUM:
529         default:
530                 ret = -EINVAL;
531                 break;
532         }
533
534         return ret;
535 }
536
537 static bool psp_v11_0_compare_sram_data(struct psp_context *psp,
538                                        struct amdgpu_firmware_info *ucode,
539                                        enum AMDGPU_UCODE_ID ucode_type)
540 {
541         int err = 0;
542         unsigned int fw_sram_reg_val = 0;
543         unsigned int fw_sram_addr_reg_offset = 0;
544         unsigned int fw_sram_data_reg_offset = 0;
545         unsigned int ucode_size;
546         uint32_t *ucode_mem = NULL;
547         struct amdgpu_device *adev = psp->adev;
548
549         err = psp_v11_0_sram_map(adev, &fw_sram_reg_val, &fw_sram_addr_reg_offset,
550                                 &fw_sram_data_reg_offset, ucode_type);
551         if (err)
552                 return false;
553
554         WREG32(fw_sram_addr_reg_offset, fw_sram_reg_val);
555
556         ucode_size = ucode->ucode_size;
557         ucode_mem = (uint32_t *)ucode->kaddr;
558         while (ucode_size) {
559                 fw_sram_reg_val = RREG32(fw_sram_data_reg_offset);
560
561                 if (*ucode_mem != fw_sram_reg_val)
562                         return false;
563
564                 ucode_mem++;
565                 /* 4 bytes */
566                 ucode_size -= 4;
567         }
568
569         return true;
570 }
571
572 static int psp_v11_0_mode1_reset(struct psp_context *psp)
573 {
574         int ret;
575         uint32_t offset;
576         struct amdgpu_device *adev = psp->adev;
577
578         offset = SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64);
579
580         ret = psp_wait_for(psp, offset, 0x80000000, 0x8000FFFF, false);
581
582         if (ret) {
583                 DRM_INFO("psp is not working correctly before mode1 reset!\n");
584                 return -EINVAL;
585         }
586
587         /*send the mode 1 reset command*/
588         WREG32(offset, GFX_CTRL_CMD_ID_MODE1_RST);
589
590         msleep(500);
591
592         offset = SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_33);
593
594         ret = psp_wait_for(psp, offset, 0x80000000, 0x80000000, false);
595
596         if (ret) {
597                 DRM_INFO("psp mode 1 reset failed!\n");
598                 return -EINVAL;
599         }
600
601         DRM_INFO("psp mode1 reset succeed \n");
602
603         return 0;
604 }
605
606 /* TODO: Fill in follow functions once PSP firmware interface for XGMI is ready.
607  * For now, return success and hack the hive_id so high level code can
608  * start testing
609  */
610 static int psp_v11_0_xgmi_get_topology_info(struct psp_context *psp,
611         int number_devices, struct psp_xgmi_topology_info *topology)
612 {
613         struct ta_xgmi_shared_memory *xgmi_cmd;
614         struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
615         struct ta_xgmi_cmd_get_topology_info_output *topology_info_output;
616         int i;
617         int ret;
618
619         if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
620                 return -EINVAL;
621
622         xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
623         memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
624
625         /* Fill in the shared memory with topology information as input */
626         topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
627         xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO;
628         topology_info_input->num_nodes = number_devices;
629
630         for (i = 0; i < topology_info_input->num_nodes; i++) {
631                 topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
632                 topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
633                 topology_info_input->nodes[i].is_sharing_enabled = topology->nodes[i].is_sharing_enabled;
634                 topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
635         }
636
637         /* Invoke xgmi ta to get the topology information */
638         ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO);
639         if (ret)
640                 return ret;
641
642         /* Read the output topology information from the shared memory */
643         topology_info_output = &xgmi_cmd->xgmi_out_message.get_topology_info;
644         topology->num_nodes = xgmi_cmd->xgmi_out_message.get_topology_info.num_nodes;
645         for (i = 0; i < topology->num_nodes; i++) {
646                 topology->nodes[i].node_id = topology_info_output->nodes[i].node_id;
647                 topology->nodes[i].num_hops = topology_info_output->nodes[i].num_hops;
648                 topology->nodes[i].is_sharing_enabled = topology_info_output->nodes[i].is_sharing_enabled;
649                 topology->nodes[i].sdma_engine = topology_info_output->nodes[i].sdma_engine;
650         }
651
652         return 0;
653 }
654
655 static int psp_v11_0_xgmi_set_topology_info(struct psp_context *psp,
656         int number_devices, struct psp_xgmi_topology_info *topology)
657 {
658         struct ta_xgmi_shared_memory *xgmi_cmd;
659         struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
660         int i;
661
662         if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
663                 return -EINVAL;
664
665         xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
666         memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
667
668         topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
669         xgmi_cmd->cmd_id = TA_COMMAND_XGMI__SET_TOPOLOGY_INFO;
670         topology_info_input->num_nodes = number_devices;
671
672         for (i = 0; i < topology_info_input->num_nodes; i++) {
673                 topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
674                 topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
675                 topology_info_input->nodes[i].is_sharing_enabled = topology->nodes[i].is_sharing_enabled;
676                 topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
677         }
678
679         /* Invoke xgmi ta to set topology information */
680         return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO);
681 }
682
683 static u64 psp_v11_0_xgmi_get_hive_id(struct psp_context *psp)
684 {
685         struct ta_xgmi_shared_memory *xgmi_cmd;
686         int ret;
687
688         xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
689         memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
690
691         xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_HIVE_ID;
692
693         /* Invoke xgmi ta to get hive id */
694         ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
695         if (ret)
696                 return 0;
697         else
698                 return xgmi_cmd->xgmi_out_message.get_hive_id.hive_id;
699 }
700
701 static u64 psp_v11_0_xgmi_get_node_id(struct psp_context *psp)
702 {
703         struct ta_xgmi_shared_memory *xgmi_cmd;
704         int ret;
705
706         xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
707         memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
708
709         xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_NODE_ID;
710
711         /* Invoke xgmi ta to get the node id */
712         ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
713         if (ret)
714                 return 0;
715         else
716                 return xgmi_cmd->xgmi_out_message.get_node_id.node_id;
717 }
718
719 static const struct psp_funcs psp_v11_0_funcs = {
720         .init_microcode = psp_v11_0_init_microcode,
721         .bootloader_load_sysdrv = psp_v11_0_bootloader_load_sysdrv,
722         .bootloader_load_sos = psp_v11_0_bootloader_load_sos,
723         .prep_cmd_buf = psp_v11_0_prep_cmd_buf,
724         .ring_init = psp_v11_0_ring_init,
725         .ring_create = psp_v11_0_ring_create,
726         .ring_stop = psp_v11_0_ring_stop,
727         .ring_destroy = psp_v11_0_ring_destroy,
728         .cmd_submit = psp_v11_0_cmd_submit,
729         .compare_sram_data = psp_v11_0_compare_sram_data,
730         .mode1_reset = psp_v11_0_mode1_reset,
731         .xgmi_get_topology_info = psp_v11_0_xgmi_get_topology_info,
732         .xgmi_set_topology_info = psp_v11_0_xgmi_set_topology_info,
733         .xgmi_get_hive_id = psp_v11_0_xgmi_get_hive_id,
734         .xgmi_get_node_id = psp_v11_0_xgmi_get_node_id,
735 };
736
737 void psp_v11_0_set_psp_funcs(struct psp_context *psp)
738 {
739         psp->funcs = &psp_v11_0_funcs;
740 }
This page took 0.075726 seconds and 4 git commands to generate.