Merge ath-next from git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
[linux-2.6-block.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_psp.c
1 /*
2  * Copyright 2016 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  * Author: Huang Rui
23  *
24  */
25
26 #include <linux/firmware.h>
27 #include <drm/drmP.h>
28 #include "amdgpu.h"
29 #include "amdgpu_psp.h"
30 #include "amdgpu_ucode.h"
31 #include "soc15_common.h"
32 #include "psp_v3_1.h"
33 #include "psp_v10_0.h"
34 #include "psp_v11_0.h"
35
36 static void psp_set_funcs(struct amdgpu_device *adev);
37
38 static int psp_early_init(void *handle)
39 {
40         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
41
42         psp_set_funcs(adev);
43
44         return 0;
45 }
46
47 static int psp_sw_init(void *handle)
48 {
49         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
50         struct psp_context *psp = &adev->psp;
51         int ret;
52
53         switch (adev->asic_type) {
54         case CHIP_VEGA10:
55         case CHIP_VEGA12:
56                 psp_v3_1_set_psp_funcs(psp);
57                 break;
58         case CHIP_RAVEN:
59                 psp_v10_0_set_psp_funcs(psp);
60                 break;
61         case CHIP_VEGA20:
62                 psp_v11_0_set_psp_funcs(psp);
63                 break;
64         default:
65                 return -EINVAL;
66         }
67
68         psp->adev = adev;
69
70         ret = psp_init_microcode(psp);
71         if (ret) {
72                 DRM_ERROR("Failed to load psp firmware!\n");
73                 return ret;
74         }
75
76         return 0;
77 }
78
79 static int psp_sw_fini(void *handle)
80 {
81         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
82
83         release_firmware(adev->psp.sos_fw);
84         adev->psp.sos_fw = NULL;
85         release_firmware(adev->psp.asd_fw);
86         adev->psp.asd_fw = NULL;
87         if (adev->psp.ta_fw) {
88                 release_firmware(adev->psp.ta_fw);
89                 adev->psp.ta_fw = NULL;
90         }
91         return 0;
92 }
93
94 int psp_wait_for(struct psp_context *psp, uint32_t reg_index,
95                  uint32_t reg_val, uint32_t mask, bool check_changed)
96 {
97         uint32_t val;
98         int i;
99         struct amdgpu_device *adev = psp->adev;
100
101         for (i = 0; i < adev->usec_timeout; i++) {
102                 val = RREG32(reg_index);
103                 if (check_changed) {
104                         if (val != reg_val)
105                                 return 0;
106                 } else {
107                         if ((val & mask) == reg_val)
108                                 return 0;
109                 }
110                 udelay(1);
111         }
112
113         return -ETIME;
114 }
115
116 static int
117 psp_cmd_submit_buf(struct psp_context *psp,
118                    struct amdgpu_firmware_info *ucode,
119                    struct psp_gfx_cmd_resp *cmd, uint64_t fence_mc_addr)
120 {
121         int ret;
122         int index;
123
124         memset(psp->cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE);
125
126         memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp));
127
128         index = atomic_inc_return(&psp->fence_value);
129         ret = psp_cmd_submit(psp, ucode, psp->cmd_buf_mc_addr,
130                              fence_mc_addr, index);
131         if (ret) {
132                 atomic_dec(&psp->fence_value);
133                 return ret;
134         }
135
136         while (*((unsigned int *)psp->fence_buf) != index)
137                 msleep(1);
138
139         /* In some cases, psp response status is not 0 even there is no
140          * problem while the command is submitted. Some version of PSP FW
141          * doesn't write 0 to that field.
142          * So here we would like to only print a warning instead of an error
143          * during psp initialization to avoid breaking hw_init and it doesn't
144          * return -EINVAL.
145          */
146         if (psp->cmd_buf_mem->resp.status) {
147                 if (ucode)
148                         DRM_WARN("failed to load ucode id (%d) ",
149                                   ucode->ucode_id);
150                 DRM_WARN("psp command failed and response status is (%d)\n",
151                           psp->cmd_buf_mem->resp.status);
152         }
153
154         /* get xGMI session id from response buffer */
155         cmd->resp.session_id = psp->cmd_buf_mem->resp.session_id;
156
157         if (ucode) {
158                 ucode->tmr_mc_addr_lo = psp->cmd_buf_mem->resp.fw_addr_lo;
159                 ucode->tmr_mc_addr_hi = psp->cmd_buf_mem->resp.fw_addr_hi;
160         }
161
162         return ret;
163 }
164
165 static void psp_prep_tmr_cmd_buf(struct psp_context *psp,
166                                  struct psp_gfx_cmd_resp *cmd,
167                                  uint64_t tmr_mc, uint32_t size)
168 {
169         if (psp_support_vmr_ring(psp))
170                 cmd->cmd_id = GFX_CMD_ID_SETUP_VMR;
171         else
172                 cmd->cmd_id = GFX_CMD_ID_SETUP_TMR;
173         cmd->cmd.cmd_setup_tmr.buf_phy_addr_lo = lower_32_bits(tmr_mc);
174         cmd->cmd.cmd_setup_tmr.buf_phy_addr_hi = upper_32_bits(tmr_mc);
175         cmd->cmd.cmd_setup_tmr.buf_size = size;
176 }
177
178 /* Set up Trusted Memory Region */
179 static int psp_tmr_init(struct psp_context *psp)
180 {
181         int ret;
182
183         /*
184          * Allocate 3M memory aligned to 1M from Frame Buffer (local
185          * physical).
186          *
187          * Note: this memory need be reserved till the driver
188          * uninitializes.
189          */
190         ret = amdgpu_bo_create_kernel(psp->adev, PSP_TMR_SIZE, 0x100000,
191                                       AMDGPU_GEM_DOMAIN_VRAM,
192                                       &psp->tmr_bo, &psp->tmr_mc_addr, &psp->tmr_buf);
193
194         return ret;
195 }
196
197 static int psp_tmr_load(struct psp_context *psp)
198 {
199         int ret;
200         struct psp_gfx_cmd_resp *cmd;
201
202         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
203         if (!cmd)
204                 return -ENOMEM;
205
206         psp_prep_tmr_cmd_buf(psp, cmd, psp->tmr_mc_addr, PSP_TMR_SIZE);
207         DRM_INFO("reserve 0x%x from 0x%llx for PSP TMR SIZE\n",
208                         PSP_TMR_SIZE, psp->tmr_mc_addr);
209
210         ret = psp_cmd_submit_buf(psp, NULL, cmd,
211                                  psp->fence_buf_mc_addr);
212         if (ret)
213                 goto failed;
214
215         kfree(cmd);
216
217         return 0;
218
219 failed:
220         kfree(cmd);
221         return ret;
222 }
223
224 static void psp_prep_asd_cmd_buf(struct psp_gfx_cmd_resp *cmd,
225                                  uint64_t asd_mc, uint64_t asd_mc_shared,
226                                  uint32_t size, uint32_t shared_size)
227 {
228         cmd->cmd_id = GFX_CMD_ID_LOAD_ASD;
229         cmd->cmd.cmd_load_ta.app_phy_addr_lo = lower_32_bits(asd_mc);
230         cmd->cmd.cmd_load_ta.app_phy_addr_hi = upper_32_bits(asd_mc);
231         cmd->cmd.cmd_load_ta.app_len = size;
232
233         cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_lo = lower_32_bits(asd_mc_shared);
234         cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_hi = upper_32_bits(asd_mc_shared);
235         cmd->cmd.cmd_load_ta.cmd_buf_len = shared_size;
236 }
237
238 static int psp_asd_init(struct psp_context *psp)
239 {
240         int ret;
241
242         /*
243          * Allocate 16k memory aligned to 4k from Frame Buffer (local
244          * physical) for shared ASD <-> Driver
245          */
246         ret = amdgpu_bo_create_kernel(psp->adev, PSP_ASD_SHARED_MEM_SIZE,
247                                       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
248                                       &psp->asd_shared_bo,
249                                       &psp->asd_shared_mc_addr,
250                                       &psp->asd_shared_buf);
251
252         return ret;
253 }
254
255 static int psp_asd_load(struct psp_context *psp)
256 {
257         int ret;
258         struct psp_gfx_cmd_resp *cmd;
259
260         /* If PSP version doesn't match ASD version, asd loading will be failed.
261          * add workaround to bypass it for sriov now.
262          * TODO: add version check to make it common
263          */
264         if (amdgpu_sriov_vf(psp->adev))
265                 return 0;
266
267         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
268         if (!cmd)
269                 return -ENOMEM;
270
271         memset(psp->fw_pri_buf, 0, PSP_1_MEG);
272         memcpy(psp->fw_pri_buf, psp->asd_start_addr, psp->asd_ucode_size);
273
274         psp_prep_asd_cmd_buf(cmd, psp->fw_pri_mc_addr, psp->asd_shared_mc_addr,
275                              psp->asd_ucode_size, PSP_ASD_SHARED_MEM_SIZE);
276
277         ret = psp_cmd_submit_buf(psp, NULL, cmd,
278                                  psp->fence_buf_mc_addr);
279
280         kfree(cmd);
281
282         return ret;
283 }
284
285 static void psp_prep_xgmi_ta_load_cmd_buf(struct psp_gfx_cmd_resp *cmd,
286                                           uint64_t xgmi_ta_mc, uint64_t xgmi_mc_shared,
287                                           uint32_t xgmi_ta_size, uint32_t shared_size)
288 {
289         cmd->cmd_id = GFX_CMD_ID_LOAD_TA;
290         cmd->cmd.cmd_load_ta.app_phy_addr_lo = lower_32_bits(xgmi_ta_mc);
291         cmd->cmd.cmd_load_ta.app_phy_addr_hi = upper_32_bits(xgmi_ta_mc);
292         cmd->cmd.cmd_load_ta.app_len = xgmi_ta_size;
293
294         cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_lo = lower_32_bits(xgmi_mc_shared);
295         cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_hi = upper_32_bits(xgmi_mc_shared);
296         cmd->cmd.cmd_load_ta.cmd_buf_len = shared_size;
297 }
298
299 static int psp_xgmi_init_shared_buf(struct psp_context *psp)
300 {
301         int ret;
302
303         /*
304          * Allocate 16k memory aligned to 4k from Frame Buffer (local
305          * physical) for xgmi ta <-> Driver
306          */
307         ret = amdgpu_bo_create_kernel(psp->adev, PSP_XGMI_SHARED_MEM_SIZE,
308                                       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
309                                       &psp->xgmi_context.xgmi_shared_bo,
310                                       &psp->xgmi_context.xgmi_shared_mc_addr,
311                                       &psp->xgmi_context.xgmi_shared_buf);
312
313         return ret;
314 }
315
316 static int psp_xgmi_load(struct psp_context *psp)
317 {
318         int ret;
319         struct psp_gfx_cmd_resp *cmd;
320
321         /*
322          * TODO: bypass the loading in sriov for now
323          */
324         if (amdgpu_sriov_vf(psp->adev))
325                 return 0;
326
327         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
328         if (!cmd)
329                 return -ENOMEM;
330
331         memset(psp->fw_pri_buf, 0, PSP_1_MEG);
332         memcpy(psp->fw_pri_buf, psp->ta_xgmi_start_addr, psp->ta_xgmi_ucode_size);
333
334         psp_prep_xgmi_ta_load_cmd_buf(cmd, psp->fw_pri_mc_addr,
335                                       psp->xgmi_context.xgmi_shared_mc_addr,
336                                       psp->ta_xgmi_ucode_size, PSP_XGMI_SHARED_MEM_SIZE);
337
338         ret = psp_cmd_submit_buf(psp, NULL, cmd,
339                                  psp->fence_buf_mc_addr);
340
341         if (!ret) {
342                 psp->xgmi_context.initialized = 1;
343                 psp->xgmi_context.session_id = cmd->resp.session_id;
344         }
345
346         kfree(cmd);
347
348         return ret;
349 }
350
351 static void psp_prep_xgmi_ta_unload_cmd_buf(struct psp_gfx_cmd_resp *cmd,
352                                             uint32_t xgmi_session_id)
353 {
354         cmd->cmd_id = GFX_CMD_ID_UNLOAD_TA;
355         cmd->cmd.cmd_unload_ta.session_id = xgmi_session_id;
356 }
357
358 static int psp_xgmi_unload(struct psp_context *psp)
359 {
360         int ret;
361         struct psp_gfx_cmd_resp *cmd;
362
363         /*
364          * TODO: bypass the unloading in sriov for now
365          */
366         if (amdgpu_sriov_vf(psp->adev))
367                 return 0;
368
369         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
370         if (!cmd)
371                 return -ENOMEM;
372
373         psp_prep_xgmi_ta_unload_cmd_buf(cmd, psp->xgmi_context.session_id);
374
375         ret = psp_cmd_submit_buf(psp, NULL, cmd,
376                                  psp->fence_buf_mc_addr);
377
378         kfree(cmd);
379
380         return ret;
381 }
382
383 static void psp_prep_xgmi_ta_invoke_cmd_buf(struct psp_gfx_cmd_resp *cmd,
384                                             uint32_t ta_cmd_id,
385                                             uint32_t xgmi_session_id)
386 {
387         cmd->cmd_id = GFX_CMD_ID_INVOKE_CMD;
388         cmd->cmd.cmd_invoke_cmd.session_id = xgmi_session_id;
389         cmd->cmd.cmd_invoke_cmd.ta_cmd_id = ta_cmd_id;
390         /* Note: cmd_invoke_cmd.buf is not used for now */
391 }
392
393 int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
394 {
395         int ret;
396         struct psp_gfx_cmd_resp *cmd;
397
398         /*
399          * TODO: bypass the loading in sriov for now
400         */
401         if (amdgpu_sriov_vf(psp->adev))
402                 return 0;
403
404         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
405         if (!cmd)
406                 return -ENOMEM;
407
408         psp_prep_xgmi_ta_invoke_cmd_buf(cmd, ta_cmd_id,
409                                         psp->xgmi_context.session_id);
410
411         ret = psp_cmd_submit_buf(psp, NULL, cmd,
412                                  psp->fence_buf_mc_addr);
413
414         kfree(cmd);
415
416         return ret;
417 }
418
419 static int psp_xgmi_terminate(struct psp_context *psp)
420 {
421         int ret;
422
423         if (!psp->xgmi_context.initialized)
424                 return 0;
425
426         ret = psp_xgmi_unload(psp);
427         if (ret)
428                 return ret;
429
430         psp->xgmi_context.initialized = 0;
431
432         /* free xgmi shared memory */
433         amdgpu_bo_free_kernel(&psp->xgmi_context.xgmi_shared_bo,
434                         &psp->xgmi_context.xgmi_shared_mc_addr,
435                         &psp->xgmi_context.xgmi_shared_buf);
436
437         return 0;
438 }
439
440 static int psp_xgmi_initialize(struct psp_context *psp)
441 {
442         struct ta_xgmi_shared_memory *xgmi_cmd;
443         int ret;
444
445         if (!psp->adev->psp.ta_fw)
446                 return -ENOENT;
447
448         if (!psp->xgmi_context.initialized) {
449                 ret = psp_xgmi_init_shared_buf(psp);
450                 if (ret)
451                         return ret;
452         }
453
454         /* Load XGMI TA */
455         ret = psp_xgmi_load(psp);
456         if (ret)
457                 return ret;
458
459         /* Initialize XGMI session */
460         xgmi_cmd = (struct ta_xgmi_shared_memory *)(psp->xgmi_context.xgmi_shared_buf);
461         memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
462         xgmi_cmd->cmd_id = TA_COMMAND_XGMI__INITIALIZE;
463
464         ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
465
466         return ret;
467 }
468
469 static int psp_hw_start(struct psp_context *psp)
470 {
471         struct amdgpu_device *adev = psp->adev;
472         int ret;
473
474         if (!amdgpu_sriov_vf(adev) || !adev->in_gpu_reset) {
475                 ret = psp_bootloader_load_sysdrv(psp);
476                 if (ret)
477                         return ret;
478
479                 ret = psp_bootloader_load_sos(psp);
480                 if (ret)
481                         return ret;
482         }
483
484         ret = psp_ring_create(psp, PSP_RING_TYPE__KM);
485         if (ret)
486                 return ret;
487
488         ret = psp_tmr_load(psp);
489         if (ret)
490                 return ret;
491
492         ret = psp_asd_load(psp);
493         if (ret)
494                 return ret;
495
496         if (adev->gmc.xgmi.num_physical_nodes > 1) {
497                 ret = psp_xgmi_initialize(psp);
498                 /* Warning the XGMI seesion initialize failure
499                  * Instead of stop driver initialization
500                  */
501                 if (ret)
502                         dev_err(psp->adev->dev,
503                                 "XGMI: Failed to initialize XGMI session\n");
504         }
505         return 0;
506 }
507
508 static int psp_get_fw_type(struct amdgpu_firmware_info *ucode,
509                            enum psp_gfx_fw_type *type)
510 {
511         switch (ucode->ucode_id) {
512         case AMDGPU_UCODE_ID_SDMA0:
513                 *type = GFX_FW_TYPE_SDMA0;
514                 break;
515         case AMDGPU_UCODE_ID_SDMA1:
516                 *type = GFX_FW_TYPE_SDMA1;
517                 break;
518         case AMDGPU_UCODE_ID_CP_CE:
519                 *type = GFX_FW_TYPE_CP_CE;
520                 break;
521         case AMDGPU_UCODE_ID_CP_PFP:
522                 *type = GFX_FW_TYPE_CP_PFP;
523                 break;
524         case AMDGPU_UCODE_ID_CP_ME:
525                 *type = GFX_FW_TYPE_CP_ME;
526                 break;
527         case AMDGPU_UCODE_ID_CP_MEC1:
528                 *type = GFX_FW_TYPE_CP_MEC;
529                 break;
530         case AMDGPU_UCODE_ID_CP_MEC1_JT:
531                 *type = GFX_FW_TYPE_CP_MEC_ME1;
532                 break;
533         case AMDGPU_UCODE_ID_CP_MEC2:
534                 *type = GFX_FW_TYPE_CP_MEC;
535                 break;
536         case AMDGPU_UCODE_ID_CP_MEC2_JT:
537                 *type = GFX_FW_TYPE_CP_MEC_ME2;
538                 break;
539         case AMDGPU_UCODE_ID_RLC_G:
540                 *type = GFX_FW_TYPE_RLC_G;
541                 break;
542         case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL:
543                 *type = GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_CNTL;
544                 break;
545         case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM:
546                 *type = GFX_FW_TYPE_RLC_RESTORE_LIST_GPM_MEM;
547                 break;
548         case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM:
549                 *type = GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_MEM;
550                 break;
551         case AMDGPU_UCODE_ID_SMC:
552                 *type = GFX_FW_TYPE_SMU;
553                 break;
554         case AMDGPU_UCODE_ID_UVD:
555                 *type = GFX_FW_TYPE_UVD;
556                 break;
557         case AMDGPU_UCODE_ID_UVD1:
558                 *type = GFX_FW_TYPE_UVD1;
559                 break;
560         case AMDGPU_UCODE_ID_VCE:
561                 *type = GFX_FW_TYPE_VCE;
562                 break;
563         case AMDGPU_UCODE_ID_VCN:
564                 *type = GFX_FW_TYPE_VCN;
565                 break;
566         case AMDGPU_UCODE_ID_DMCU_ERAM:
567                 *type = GFX_FW_TYPE_DMCU_ERAM;
568                 break;
569         case AMDGPU_UCODE_ID_DMCU_INTV:
570                 *type = GFX_FW_TYPE_DMCU_ISR;
571                 break;
572         case AMDGPU_UCODE_ID_MAXIMUM:
573         default:
574                 return -EINVAL;
575         }
576
577         return 0;
578 }
579
580 static int psp_prep_load_ip_fw_cmd_buf(struct amdgpu_firmware_info *ucode,
581                                        struct psp_gfx_cmd_resp *cmd)
582 {
583         int ret;
584         uint64_t fw_mem_mc_addr = ucode->mc_addr;
585
586         memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp));
587
588         cmd->cmd_id = GFX_CMD_ID_LOAD_IP_FW;
589         cmd->cmd.cmd_load_ip_fw.fw_phy_addr_lo = lower_32_bits(fw_mem_mc_addr);
590         cmd->cmd.cmd_load_ip_fw.fw_phy_addr_hi = upper_32_bits(fw_mem_mc_addr);
591         cmd->cmd.cmd_load_ip_fw.fw_size = ucode->ucode_size;
592
593         ret = psp_get_fw_type(ucode, &cmd->cmd.cmd_load_ip_fw.fw_type);
594         if (ret)
595                 DRM_ERROR("Unknown firmware type\n");
596
597         return ret;
598 }
599
600 static int psp_np_fw_load(struct psp_context *psp)
601 {
602         int i, ret;
603         struct amdgpu_firmware_info *ucode;
604         struct amdgpu_device* adev = psp->adev;
605
606         for (i = 0; i < adev->firmware.max_ucodes; i++) {
607                 ucode = &adev->firmware.ucode[i];
608                 if (!ucode->fw)
609                         continue;
610
611                 if (ucode->ucode_id == AMDGPU_UCODE_ID_SMC &&
612                     psp_smu_reload_quirk(psp))
613                         continue;
614                 if (amdgpu_sriov_vf(adev) &&
615                    (ucode->ucode_id == AMDGPU_UCODE_ID_SDMA0
616                     || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA1
617                     || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_G))
618                         /*skip ucode loading in SRIOV VF */
619                         continue;
620
621                 ret = psp_prep_load_ip_fw_cmd_buf(ucode, psp->cmd);
622                 if (ret)
623                         return ret;
624
625                 ret = psp_cmd_submit_buf(psp, ucode, psp->cmd,
626                                          psp->fence_buf_mc_addr);
627                 if (ret)
628                         return ret;
629
630 #if 0
631                 /* check if firmware loaded sucessfully */
632                 if (!amdgpu_psp_check_fw_loading_status(adev, i))
633                         return -EINVAL;
634 #endif
635         }
636
637         return 0;
638 }
639
640 static int psp_load_fw(struct amdgpu_device *adev)
641 {
642         int ret;
643         struct psp_context *psp = &adev->psp;
644
645         if (amdgpu_sriov_vf(adev) && adev->in_gpu_reset) {
646                 psp_ring_stop(psp, PSP_RING_TYPE__KM); /* should not destroy ring, only stop */
647                 goto skip_memalloc;
648         }
649
650         psp->cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
651         if (!psp->cmd)
652                 return -ENOMEM;
653
654         ret = amdgpu_bo_create_kernel(adev, PSP_1_MEG, PSP_1_MEG,
655                                         AMDGPU_GEM_DOMAIN_GTT,
656                                         &psp->fw_pri_bo,
657                                         &psp->fw_pri_mc_addr,
658                                         &psp->fw_pri_buf);
659         if (ret)
660                 goto failed;
661
662         ret = amdgpu_bo_create_kernel(adev, PSP_FENCE_BUFFER_SIZE, PAGE_SIZE,
663                                         AMDGPU_GEM_DOMAIN_VRAM,
664                                         &psp->fence_buf_bo,
665                                         &psp->fence_buf_mc_addr,
666                                         &psp->fence_buf);
667         if (ret)
668                 goto failed_mem2;
669
670         ret = amdgpu_bo_create_kernel(adev, PSP_CMD_BUFFER_SIZE, PAGE_SIZE,
671                                       AMDGPU_GEM_DOMAIN_VRAM,
672                                       &psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
673                                       (void **)&psp->cmd_buf_mem);
674         if (ret)
675                 goto failed_mem1;
676
677         memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE);
678
679         ret = psp_ring_init(psp, PSP_RING_TYPE__KM);
680         if (ret)
681                 goto failed_mem;
682
683         ret = psp_tmr_init(psp);
684         if (ret)
685                 goto failed_mem;
686
687         ret = psp_asd_init(psp);
688         if (ret)
689                 goto failed_mem;
690
691 skip_memalloc:
692         ret = psp_hw_start(psp);
693         if (ret)
694                 goto failed_mem;
695
696         ret = psp_np_fw_load(psp);
697         if (ret)
698                 goto failed_mem;
699
700         return 0;
701
702 failed_mem:
703         amdgpu_bo_free_kernel(&psp->cmd_buf_bo,
704                               &psp->cmd_buf_mc_addr,
705                               (void **)&psp->cmd_buf_mem);
706 failed_mem1:
707         amdgpu_bo_free_kernel(&psp->fence_buf_bo,
708                               &psp->fence_buf_mc_addr, &psp->fence_buf);
709 failed_mem2:
710         amdgpu_bo_free_kernel(&psp->fw_pri_bo,
711                               &psp->fw_pri_mc_addr, &psp->fw_pri_buf);
712 failed:
713         kfree(psp->cmd);
714         psp->cmd = NULL;
715         return ret;
716 }
717
718 static int psp_hw_init(void *handle)
719 {
720         int ret;
721         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
722
723         mutex_lock(&adev->firmware.mutex);
724         /*
725          * This sequence is just used on hw_init only once, no need on
726          * resume.
727          */
728         ret = amdgpu_ucode_init_bo(adev);
729         if (ret)
730                 goto failed;
731
732         ret = psp_load_fw(adev);
733         if (ret) {
734                 DRM_ERROR("PSP firmware loading failed\n");
735                 goto failed;
736         }
737
738         mutex_unlock(&adev->firmware.mutex);
739         return 0;
740
741 failed:
742         adev->firmware.load_type = AMDGPU_FW_LOAD_DIRECT;
743         mutex_unlock(&adev->firmware.mutex);
744         return -EINVAL;
745 }
746
747 static int psp_hw_fini(void *handle)
748 {
749         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
750         struct psp_context *psp = &adev->psp;
751
752         if (adev->gmc.xgmi.num_physical_nodes > 1 &&
753             psp->xgmi_context.initialized == 1)
754                 psp_xgmi_terminate(psp);
755
756         psp_ring_destroy(psp, PSP_RING_TYPE__KM);
757
758         amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, &psp->tmr_buf);
759         amdgpu_bo_free_kernel(&psp->fw_pri_bo,
760                               &psp->fw_pri_mc_addr, &psp->fw_pri_buf);
761         amdgpu_bo_free_kernel(&psp->fence_buf_bo,
762                               &psp->fence_buf_mc_addr, &psp->fence_buf);
763         amdgpu_bo_free_kernel(&psp->asd_shared_bo, &psp->asd_shared_mc_addr,
764                               &psp->asd_shared_buf);
765         amdgpu_bo_free_kernel(&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
766                               (void **)&psp->cmd_buf_mem);
767
768         kfree(psp->cmd);
769         psp->cmd = NULL;
770
771         return 0;
772 }
773
774 static int psp_suspend(void *handle)
775 {
776         int ret;
777         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
778         struct psp_context *psp = &adev->psp;
779
780         if (adev->gmc.xgmi.num_physical_nodes > 1 &&
781             psp->xgmi_context.initialized == 1) {
782                 ret = psp_xgmi_terminate(psp);
783                 if (ret) {
784                         DRM_ERROR("Failed to terminate xgmi ta\n");
785                         return ret;
786                 }
787         }
788
789         ret = psp_ring_stop(psp, PSP_RING_TYPE__KM);
790         if (ret) {
791                 DRM_ERROR("PSP ring stop failed\n");
792                 return ret;
793         }
794
795         return 0;
796 }
797
798 static int psp_resume(void *handle)
799 {
800         int ret;
801         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
802         struct psp_context *psp = &adev->psp;
803
804         DRM_INFO("PSP is resuming...\n");
805
806         mutex_lock(&adev->firmware.mutex);
807
808         ret = psp_hw_start(psp);
809         if (ret)
810                 goto failed;
811
812         ret = psp_np_fw_load(psp);
813         if (ret)
814                 goto failed;
815
816         mutex_unlock(&adev->firmware.mutex);
817
818         return 0;
819
820 failed:
821         DRM_ERROR("PSP resume failed\n");
822         mutex_unlock(&adev->firmware.mutex);
823         return ret;
824 }
825
826 int psp_gpu_reset(struct amdgpu_device *adev)
827 {
828         if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
829                 return 0;
830
831         return psp_mode1_reset(&adev->psp);
832 }
833
834 static bool psp_check_fw_loading_status(struct amdgpu_device *adev,
835                                         enum AMDGPU_UCODE_ID ucode_type)
836 {
837         struct amdgpu_firmware_info *ucode = NULL;
838
839         if (!adev->firmware.fw_size)
840                 return false;
841
842         ucode = &adev->firmware.ucode[ucode_type];
843         if (!ucode->fw || !ucode->ucode_size)
844                 return false;
845
846         return psp_compare_sram_data(&adev->psp, ucode, ucode_type);
847 }
848
849 static int psp_set_clockgating_state(void *handle,
850                                      enum amd_clockgating_state state)
851 {
852         return 0;
853 }
854
855 static int psp_set_powergating_state(void *handle,
856                                      enum amd_powergating_state state)
857 {
858         return 0;
859 }
860
861 const struct amd_ip_funcs psp_ip_funcs = {
862         .name = "psp",
863         .early_init = psp_early_init,
864         .late_init = NULL,
865         .sw_init = psp_sw_init,
866         .sw_fini = psp_sw_fini,
867         .hw_init = psp_hw_init,
868         .hw_fini = psp_hw_fini,
869         .suspend = psp_suspend,
870         .resume = psp_resume,
871         .is_idle = NULL,
872         .check_soft_reset = NULL,
873         .wait_for_idle = NULL,
874         .soft_reset = NULL,
875         .set_clockgating_state = psp_set_clockgating_state,
876         .set_powergating_state = psp_set_powergating_state,
877 };
878
879 static const struct amdgpu_psp_funcs psp_funcs = {
880         .check_fw_loading_status = psp_check_fw_loading_status,
881 };
882
883 static void psp_set_funcs(struct amdgpu_device *adev)
884 {
885         if (NULL == adev->firmware.funcs)
886                 adev->firmware.funcs = &psp_funcs;
887 }
888
889 const struct amdgpu_ip_block_version psp_v3_1_ip_block =
890 {
891         .type = AMD_IP_BLOCK_TYPE_PSP,
892         .major = 3,
893         .minor = 1,
894         .rev = 0,
895         .funcs = &psp_ip_funcs,
896 };
897
898 const struct amdgpu_ip_block_version psp_v10_0_ip_block =
899 {
900         .type = AMD_IP_BLOCK_TYPE_PSP,
901         .major = 10,
902         .minor = 0,
903         .rev = 0,
904         .funcs = &psp_ip_funcs,
905 };
906
907 const struct amdgpu_ip_block_version psp_v11_0_ip_block =
908 {
909         .type = AMD_IP_BLOCK_TYPE_PSP,
910         .major = 11,
911         .minor = 0,
912         .rev = 0,
913         .funcs = &psp_ip_funcs,
914 };