]> asedeno.scripts.mit.edu Git - linux.git/blob - drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
e69ad6e089c5b7b6dc0878a7ff8d0a504418a934
[linux.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
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         struct psp_context *psp = &adev->psp;
42
43         psp_set_funcs(adev);
44
45         switch (adev->asic_type) {
46         case CHIP_VEGA10:
47         case CHIP_VEGA12:
48                 psp_v3_1_set_psp_funcs(psp);
49                 psp->autoload_supported = false;
50                 break;
51         case CHIP_RAVEN:
52                 psp_v10_0_set_psp_funcs(psp);
53                 psp->autoload_supported = false;
54                 break;
55         case CHIP_VEGA20:
56                 psp_v11_0_set_psp_funcs(psp);
57                 psp->autoload_supported = false;
58                 break;
59         case CHIP_NAVI10:
60                 psp_v11_0_set_psp_funcs(psp);
61                 psp->autoload_supported = true;
62                 break;
63         default:
64                 return -EINVAL;
65         }
66
67         psp->adev = adev;
68
69         return 0;
70 }
71
72 static int psp_sw_init(void *handle)
73 {
74         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
75         struct psp_context *psp = &adev->psp;
76         int ret;
77
78         ret = psp_init_microcode(psp);
79         if (ret) {
80                 DRM_ERROR("Failed to load psp firmware!\n");
81                 return ret;
82         }
83
84         return 0;
85 }
86
87 static int psp_sw_fini(void *handle)
88 {
89         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
90
91         release_firmware(adev->psp.sos_fw);
92         adev->psp.sos_fw = NULL;
93         release_firmware(adev->psp.asd_fw);
94         adev->psp.asd_fw = NULL;
95         if (adev->psp.ta_fw) {
96                 release_firmware(adev->psp.ta_fw);
97                 adev->psp.ta_fw = NULL;
98         }
99         return 0;
100 }
101
102 int psp_wait_for(struct psp_context *psp, uint32_t reg_index,
103                  uint32_t reg_val, uint32_t mask, bool check_changed)
104 {
105         uint32_t val;
106         int i;
107         struct amdgpu_device *adev = psp->adev;
108
109         for (i = 0; i < adev->usec_timeout; i++) {
110                 val = RREG32(reg_index);
111                 if (check_changed) {
112                         if (val != reg_val)
113                                 return 0;
114                 } else {
115                         if ((val & mask) == reg_val)
116                                 return 0;
117                 }
118                 udelay(1);
119         }
120
121         return -ETIME;
122 }
123
124 static int
125 psp_cmd_submit_buf(struct psp_context *psp,
126                    struct amdgpu_firmware_info *ucode,
127                    struct psp_gfx_cmd_resp *cmd, uint64_t fence_mc_addr)
128 {
129         int ret;
130         int index;
131         int timeout = 2000;
132
133         memset(psp->cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE);
134
135         memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp));
136
137         index = atomic_inc_return(&psp->fence_value);
138         ret = psp_cmd_submit(psp, ucode, psp->cmd_buf_mc_addr,
139                              fence_mc_addr, index);
140         if (ret) {
141                 atomic_dec(&psp->fence_value);
142                 return ret;
143         }
144
145         while (*((unsigned int *)psp->fence_buf) != index) {
146                 if (--timeout == 0)
147                         break;
148                 msleep(1);
149         }
150
151         /* In some cases, psp response status is not 0 even there is no
152          * problem while the command is submitted. Some version of PSP FW
153          * doesn't write 0 to that field.
154          * So here we would like to only print a warning instead of an error
155          * during psp initialization to avoid breaking hw_init and it doesn't
156          * return -EINVAL.
157          */
158         if (psp->cmd_buf_mem->resp.status || !timeout) {
159                 if (ucode)
160                         DRM_WARN("failed to load ucode id (%d) ",
161                                   ucode->ucode_id);
162                 DRM_WARN("psp command failed and response status is (%d)\n",
163                           psp->cmd_buf_mem->resp.status);
164                 if (!timeout)
165                         return -EINVAL;
166         }
167
168         /* get xGMI session id from response buffer */
169         cmd->resp.session_id = psp->cmd_buf_mem->resp.session_id;
170
171         if (ucode) {
172                 ucode->tmr_mc_addr_lo = psp->cmd_buf_mem->resp.fw_addr_lo;
173                 ucode->tmr_mc_addr_hi = psp->cmd_buf_mem->resp.fw_addr_hi;
174         }
175
176         return ret;
177 }
178
179 static void psp_prep_tmr_cmd_buf(struct psp_context *psp,
180                                  struct psp_gfx_cmd_resp *cmd,
181                                  uint64_t tmr_mc, uint32_t size)
182 {
183         if (psp_support_vmr_ring(psp))
184                 cmd->cmd_id = GFX_CMD_ID_SETUP_VMR;
185         else
186                 cmd->cmd_id = GFX_CMD_ID_SETUP_TMR;
187         cmd->cmd.cmd_setup_tmr.buf_phy_addr_lo = lower_32_bits(tmr_mc);
188         cmd->cmd.cmd_setup_tmr.buf_phy_addr_hi = upper_32_bits(tmr_mc);
189         cmd->cmd.cmd_setup_tmr.buf_size = size;
190 }
191
192 static void psp_prep_load_toc_cmd_buf(struct psp_gfx_cmd_resp *cmd,
193                                       uint64_t pri_buf_mc, uint32_t size)
194 {
195         cmd->cmd_id = GFX_CMD_ID_LOAD_TOC;
196         cmd->cmd.cmd_load_toc.toc_phy_addr_lo = lower_32_bits(pri_buf_mc);
197         cmd->cmd.cmd_load_toc.toc_phy_addr_hi = upper_32_bits(pri_buf_mc);
198         cmd->cmd.cmd_load_toc.toc_size = size;
199 }
200
201 /* Issue LOAD TOC cmd to PSP to part toc and calculate tmr size needed */
202 static int psp_load_toc(struct psp_context *psp,
203                         uint32_t *tmr_size)
204 {
205         int ret;
206         struct psp_gfx_cmd_resp *cmd;
207
208         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
209         if (!cmd)
210                 return -ENOMEM;
211         /* Copy toc to psp firmware private buffer */
212         memset(psp->fw_pri_buf, 0, PSP_1_MEG);
213         memcpy(psp->fw_pri_buf, psp->toc_start_addr, psp->toc_bin_size);
214
215         psp_prep_load_toc_cmd_buf(cmd, psp->fw_pri_mc_addr, psp->toc_bin_size);
216
217         ret = psp_cmd_submit_buf(psp, NULL, cmd,
218                                  psp->fence_buf_mc_addr);
219         if (!ret)
220                 *tmr_size = psp->cmd_buf_mem->resp.tmr_size;
221         kfree(cmd);
222         return ret;
223 }
224
225 /* Set up Trusted Memory Region */
226 static int psp_tmr_init(struct psp_context *psp)
227 {
228         int ret;
229         int tmr_size;
230
231         /*
232          * According to HW engineer, they prefer the TMR address be "naturally
233          * aligned" , e.g. the start address be an integer divide of TMR size.
234          *
235          * Note: this memory need be reserved till the driver
236          * uninitializes.
237          */
238         tmr_size = PSP_TMR_SIZE;
239
240         /* For ASICs support RLC autoload, psp will parse the toc
241          * and calculate the total size of TMR needed */
242         if (psp->toc_start_addr &&
243             psp->toc_bin_size &&
244             psp->fw_pri_buf) {
245                 ret = psp_load_toc(psp, &tmr_size);
246                 if (ret) {
247                         DRM_ERROR("Failed to load toc\n");
248                         return ret;
249                 }
250         }
251
252         ret = amdgpu_bo_create_kernel(psp->adev, tmr_size, PSP_TMR_SIZE,
253                                       AMDGPU_GEM_DOMAIN_VRAM,
254                                       &psp->tmr_bo, &psp->tmr_mc_addr, &psp->tmr_buf);
255
256         return ret;
257 }
258
259 static int psp_tmr_load(struct psp_context *psp)
260 {
261         int ret;
262         struct psp_gfx_cmd_resp *cmd;
263
264         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
265         if (!cmd)
266                 return -ENOMEM;
267
268         psp_prep_tmr_cmd_buf(psp, cmd, psp->tmr_mc_addr,
269                              amdgpu_bo_size(psp->tmr_bo));
270         DRM_INFO("reserve 0x%lx from 0x%llx for PSP TMR\n",
271                  amdgpu_bo_size(psp->tmr_bo), psp->tmr_mc_addr);
272
273         ret = psp_cmd_submit_buf(psp, NULL, cmd,
274                                  psp->fence_buf_mc_addr);
275         if (ret)
276                 goto failed;
277
278         kfree(cmd);
279
280         return 0;
281
282 failed:
283         kfree(cmd);
284         return ret;
285 }
286
287 static void psp_prep_asd_cmd_buf(struct psp_gfx_cmd_resp *cmd,
288                                  uint64_t asd_mc, uint64_t asd_mc_shared,
289                                  uint32_t size, uint32_t shared_size)
290 {
291         cmd->cmd_id = GFX_CMD_ID_LOAD_ASD;
292         cmd->cmd.cmd_load_ta.app_phy_addr_lo = lower_32_bits(asd_mc);
293         cmd->cmd.cmd_load_ta.app_phy_addr_hi = upper_32_bits(asd_mc);
294         cmd->cmd.cmd_load_ta.app_len = size;
295
296         cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_lo = lower_32_bits(asd_mc_shared);
297         cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_hi = upper_32_bits(asd_mc_shared);
298         cmd->cmd.cmd_load_ta.cmd_buf_len = shared_size;
299 }
300
301 static int psp_asd_init(struct psp_context *psp)
302 {
303         int ret;
304
305         /*
306          * Allocate 16k memory aligned to 4k from Frame Buffer (local
307          * physical) for shared ASD <-> Driver
308          */
309         ret = amdgpu_bo_create_kernel(psp->adev, PSP_ASD_SHARED_MEM_SIZE,
310                                       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
311                                       &psp->asd_shared_bo,
312                                       &psp->asd_shared_mc_addr,
313                                       &psp->asd_shared_buf);
314
315         return ret;
316 }
317
318 static int psp_asd_load(struct psp_context *psp)
319 {
320         int ret;
321         struct psp_gfx_cmd_resp *cmd;
322
323         /* If PSP version doesn't match ASD version, asd loading will be failed.
324          * add workaround to bypass it for sriov now.
325          * TODO: add version check to make it common
326          */
327         if (amdgpu_sriov_vf(psp->adev))
328                 return 0;
329
330         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
331         if (!cmd)
332                 return -ENOMEM;
333
334         memset(psp->fw_pri_buf, 0, PSP_1_MEG);
335         memcpy(psp->fw_pri_buf, psp->asd_start_addr, psp->asd_ucode_size);
336
337         psp_prep_asd_cmd_buf(cmd, psp->fw_pri_mc_addr, psp->asd_shared_mc_addr,
338                              psp->asd_ucode_size, PSP_ASD_SHARED_MEM_SIZE);
339
340         ret = psp_cmd_submit_buf(psp, NULL, cmd,
341                                  psp->fence_buf_mc_addr);
342
343         kfree(cmd);
344
345         return ret;
346 }
347
348 static void psp_prep_reg_prog_cmd_buf(struct psp_gfx_cmd_resp *cmd,
349                 uint32_t id, uint32_t value)
350 {
351         cmd->cmd_id = GFX_CMD_ID_PROG_REG;
352         cmd->cmd.cmd_setup_reg_prog.reg_value = value;
353         cmd->cmd.cmd_setup_reg_prog.reg_id = id;
354 }
355
356 int psp_reg_program(struct psp_context *psp, enum psp_reg_prog_id reg,
357                 uint32_t value)
358 {
359         struct psp_gfx_cmd_resp *cmd = NULL;
360         int ret = 0;
361
362         if (reg >= PSP_REG_LAST)
363                 return -EINVAL;
364
365         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
366         if (!cmd)
367                 return -ENOMEM;
368
369         psp_prep_reg_prog_cmd_buf(cmd, reg, value);
370         ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
371
372         kfree(cmd);
373         return ret;
374 }
375
376 static void psp_prep_xgmi_ta_load_cmd_buf(struct psp_gfx_cmd_resp *cmd,
377                                           uint64_t xgmi_ta_mc, uint64_t xgmi_mc_shared,
378                                           uint32_t xgmi_ta_size, uint32_t shared_size)
379 {
380         cmd->cmd_id = GFX_CMD_ID_LOAD_TA;
381         cmd->cmd.cmd_load_ta.app_phy_addr_lo = lower_32_bits(xgmi_ta_mc);
382         cmd->cmd.cmd_load_ta.app_phy_addr_hi = upper_32_bits(xgmi_ta_mc);
383         cmd->cmd.cmd_load_ta.app_len = xgmi_ta_size;
384
385         cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_lo = lower_32_bits(xgmi_mc_shared);
386         cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_hi = upper_32_bits(xgmi_mc_shared);
387         cmd->cmd.cmd_load_ta.cmd_buf_len = shared_size;
388 }
389
390 static int psp_xgmi_init_shared_buf(struct psp_context *psp)
391 {
392         int ret;
393
394         /*
395          * Allocate 16k memory aligned to 4k from Frame Buffer (local
396          * physical) for xgmi ta <-> Driver
397          */
398         ret = amdgpu_bo_create_kernel(psp->adev, PSP_XGMI_SHARED_MEM_SIZE,
399                                       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
400                                       &psp->xgmi_context.xgmi_shared_bo,
401                                       &psp->xgmi_context.xgmi_shared_mc_addr,
402                                       &psp->xgmi_context.xgmi_shared_buf);
403
404         return ret;
405 }
406
407 static int psp_xgmi_load(struct psp_context *psp)
408 {
409         int ret;
410         struct psp_gfx_cmd_resp *cmd;
411
412         /*
413          * TODO: bypass the loading in sriov for now
414          */
415         if (amdgpu_sriov_vf(psp->adev))
416                 return 0;
417
418         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
419         if (!cmd)
420                 return -ENOMEM;
421
422         memset(psp->fw_pri_buf, 0, PSP_1_MEG);
423         memcpy(psp->fw_pri_buf, psp->ta_xgmi_start_addr, psp->ta_xgmi_ucode_size);
424
425         psp_prep_xgmi_ta_load_cmd_buf(cmd, psp->fw_pri_mc_addr,
426                                       psp->xgmi_context.xgmi_shared_mc_addr,
427                                       psp->ta_xgmi_ucode_size, PSP_XGMI_SHARED_MEM_SIZE);
428
429         ret = psp_cmd_submit_buf(psp, NULL, cmd,
430                                  psp->fence_buf_mc_addr);
431
432         if (!ret) {
433                 psp->xgmi_context.initialized = 1;
434                 psp->xgmi_context.session_id = cmd->resp.session_id;
435         }
436
437         kfree(cmd);
438
439         return ret;
440 }
441
442 static void psp_prep_xgmi_ta_unload_cmd_buf(struct psp_gfx_cmd_resp *cmd,
443                                             uint32_t xgmi_session_id)
444 {
445         cmd->cmd_id = GFX_CMD_ID_UNLOAD_TA;
446         cmd->cmd.cmd_unload_ta.session_id = xgmi_session_id;
447 }
448
449 static int psp_xgmi_unload(struct psp_context *psp)
450 {
451         int ret;
452         struct psp_gfx_cmd_resp *cmd;
453
454         /*
455          * TODO: bypass the unloading in sriov for now
456          */
457         if (amdgpu_sriov_vf(psp->adev))
458                 return 0;
459
460         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
461         if (!cmd)
462                 return -ENOMEM;
463
464         psp_prep_xgmi_ta_unload_cmd_buf(cmd, psp->xgmi_context.session_id);
465
466         ret = psp_cmd_submit_buf(psp, NULL, cmd,
467                                  psp->fence_buf_mc_addr);
468
469         kfree(cmd);
470
471         return ret;
472 }
473
474 static void psp_prep_xgmi_ta_invoke_cmd_buf(struct psp_gfx_cmd_resp *cmd,
475                                             uint32_t ta_cmd_id,
476                                             uint32_t xgmi_session_id)
477 {
478         cmd->cmd_id = GFX_CMD_ID_INVOKE_CMD;
479         cmd->cmd.cmd_invoke_cmd.session_id = xgmi_session_id;
480         cmd->cmd.cmd_invoke_cmd.ta_cmd_id = ta_cmd_id;
481         /* Note: cmd_invoke_cmd.buf is not used for now */
482 }
483
484 int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
485 {
486         int ret;
487         struct psp_gfx_cmd_resp *cmd;
488
489         /*
490          * TODO: bypass the loading in sriov for now
491         */
492         if (amdgpu_sriov_vf(psp->adev))
493                 return 0;
494
495         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
496         if (!cmd)
497                 return -ENOMEM;
498
499         psp_prep_xgmi_ta_invoke_cmd_buf(cmd, ta_cmd_id,
500                                         psp->xgmi_context.session_id);
501
502         ret = psp_cmd_submit_buf(psp, NULL, cmd,
503                                  psp->fence_buf_mc_addr);
504
505         kfree(cmd);
506
507         return ret;
508 }
509
510 static int psp_xgmi_terminate(struct psp_context *psp)
511 {
512         int ret;
513
514         if (!psp->xgmi_context.initialized)
515                 return 0;
516
517         ret = psp_xgmi_unload(psp);
518         if (ret)
519                 return ret;
520
521         psp->xgmi_context.initialized = 0;
522
523         /* free xgmi shared memory */
524         amdgpu_bo_free_kernel(&psp->xgmi_context.xgmi_shared_bo,
525                         &psp->xgmi_context.xgmi_shared_mc_addr,
526                         &psp->xgmi_context.xgmi_shared_buf);
527
528         return 0;
529 }
530
531 static int psp_xgmi_initialize(struct psp_context *psp)
532 {
533         struct ta_xgmi_shared_memory *xgmi_cmd;
534         int ret;
535
536         if (!psp->adev->psp.ta_fw)
537                 return -ENOENT;
538
539         if (!psp->xgmi_context.initialized) {
540                 ret = psp_xgmi_init_shared_buf(psp);
541                 if (ret)
542                         return ret;
543         }
544
545         /* Load XGMI TA */
546         ret = psp_xgmi_load(psp);
547         if (ret)
548                 return ret;
549
550         /* Initialize XGMI session */
551         xgmi_cmd = (struct ta_xgmi_shared_memory *)(psp->xgmi_context.xgmi_shared_buf);
552         memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
553         xgmi_cmd->cmd_id = TA_COMMAND_XGMI__INITIALIZE;
554
555         ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
556
557         return ret;
558 }
559
560 // ras begin
561 static void psp_prep_ras_ta_load_cmd_buf(struct psp_gfx_cmd_resp *cmd,
562                 uint64_t ras_ta_mc, uint64_t ras_mc_shared,
563                 uint32_t ras_ta_size, uint32_t shared_size)
564 {
565         cmd->cmd_id = GFX_CMD_ID_LOAD_TA;
566         cmd->cmd.cmd_load_ta.app_phy_addr_lo = lower_32_bits(ras_ta_mc);
567         cmd->cmd.cmd_load_ta.app_phy_addr_hi = upper_32_bits(ras_ta_mc);
568         cmd->cmd.cmd_load_ta.app_len = ras_ta_size;
569
570         cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_lo = lower_32_bits(ras_mc_shared);
571         cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_hi = upper_32_bits(ras_mc_shared);
572         cmd->cmd.cmd_load_ta.cmd_buf_len = shared_size;
573 }
574
575 static int psp_ras_init_shared_buf(struct psp_context *psp)
576 {
577         int ret;
578
579         /*
580          * Allocate 16k memory aligned to 4k from Frame Buffer (local
581          * physical) for ras ta <-> Driver
582          */
583         ret = amdgpu_bo_create_kernel(psp->adev, PSP_RAS_SHARED_MEM_SIZE,
584                         PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
585                         &psp->ras.ras_shared_bo,
586                         &psp->ras.ras_shared_mc_addr,
587                         &psp->ras.ras_shared_buf);
588
589         return ret;
590 }
591
592 static int psp_ras_load(struct psp_context *psp)
593 {
594         int ret;
595         struct psp_gfx_cmd_resp *cmd;
596
597         /*
598          * TODO: bypass the loading in sriov for now
599          */
600         if (amdgpu_sriov_vf(psp->adev))
601                 return 0;
602
603         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
604         if (!cmd)
605                 return -ENOMEM;
606
607         memset(psp->fw_pri_buf, 0, PSP_1_MEG);
608         memcpy(psp->fw_pri_buf, psp->ta_ras_start_addr, psp->ta_ras_ucode_size);
609
610         psp_prep_ras_ta_load_cmd_buf(cmd, psp->fw_pri_mc_addr,
611                         psp->ras.ras_shared_mc_addr,
612                         psp->ta_ras_ucode_size, PSP_RAS_SHARED_MEM_SIZE);
613
614         ret = psp_cmd_submit_buf(psp, NULL, cmd,
615                         psp->fence_buf_mc_addr);
616
617         if (!ret) {
618                 psp->ras.ras_initialized = 1;
619                 psp->ras.session_id = cmd->resp.session_id;
620         }
621
622         kfree(cmd);
623
624         return ret;
625 }
626
627 static void psp_prep_ras_ta_unload_cmd_buf(struct psp_gfx_cmd_resp *cmd,
628                                                 uint32_t ras_session_id)
629 {
630         cmd->cmd_id = GFX_CMD_ID_UNLOAD_TA;
631         cmd->cmd.cmd_unload_ta.session_id = ras_session_id;
632 }
633
634 static int psp_ras_unload(struct psp_context *psp)
635 {
636         int ret;
637         struct psp_gfx_cmd_resp *cmd;
638
639         /*
640          * TODO: bypass the unloading in sriov for now
641          */
642         if (amdgpu_sriov_vf(psp->adev))
643                 return 0;
644
645         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
646         if (!cmd)
647                 return -ENOMEM;
648
649         psp_prep_ras_ta_unload_cmd_buf(cmd, psp->ras.session_id);
650
651         ret = psp_cmd_submit_buf(psp, NULL, cmd,
652                         psp->fence_buf_mc_addr);
653
654         kfree(cmd);
655
656         return ret;
657 }
658
659 static void psp_prep_ras_ta_invoke_cmd_buf(struct psp_gfx_cmd_resp *cmd,
660                 uint32_t ta_cmd_id,
661                 uint32_t ras_session_id)
662 {
663         cmd->cmd_id = GFX_CMD_ID_INVOKE_CMD;
664         cmd->cmd.cmd_invoke_cmd.session_id = ras_session_id;
665         cmd->cmd.cmd_invoke_cmd.ta_cmd_id = ta_cmd_id;
666         /* Note: cmd_invoke_cmd.buf is not used for now */
667 }
668
669 int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
670 {
671         int ret;
672         struct psp_gfx_cmd_resp *cmd;
673
674         /*
675          * TODO: bypass the loading in sriov for now
676          */
677         if (amdgpu_sriov_vf(psp->adev))
678                 return 0;
679
680         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
681         if (!cmd)
682                 return -ENOMEM;
683
684         psp_prep_ras_ta_invoke_cmd_buf(cmd, ta_cmd_id,
685                         psp->ras.session_id);
686
687         ret = psp_cmd_submit_buf(psp, NULL, cmd,
688                         psp->fence_buf_mc_addr);
689
690         kfree(cmd);
691
692         return ret;
693 }
694
695 int psp_ras_enable_features(struct psp_context *psp,
696                 union ta_ras_cmd_input *info, bool enable)
697 {
698         struct ta_ras_shared_memory *ras_cmd;
699         int ret;
700
701         if (!psp->ras.ras_initialized)
702                 return -EINVAL;
703
704         ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
705         memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));
706
707         if (enable)
708                 ras_cmd->cmd_id = TA_RAS_COMMAND__ENABLE_FEATURES;
709         else
710                 ras_cmd->cmd_id = TA_RAS_COMMAND__DISABLE_FEATURES;
711
712         ras_cmd->ras_in_message = *info;
713
714         ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
715         if (ret)
716                 return -EINVAL;
717
718         return ras_cmd->ras_status;
719 }
720
721 static int psp_ras_terminate(struct psp_context *psp)
722 {
723         int ret;
724
725         if (!psp->ras.ras_initialized)
726                 return 0;
727
728         ret = psp_ras_unload(psp);
729         if (ret)
730                 return ret;
731
732         psp->ras.ras_initialized = 0;
733
734         /* free ras shared memory */
735         amdgpu_bo_free_kernel(&psp->ras.ras_shared_bo,
736                         &psp->ras.ras_shared_mc_addr,
737                         &psp->ras.ras_shared_buf);
738
739         return 0;
740 }
741
742 static int psp_ras_initialize(struct psp_context *psp)
743 {
744         int ret;
745
746         if (!psp->ras.ras_initialized) {
747                 ret = psp_ras_init_shared_buf(psp);
748                 if (ret)
749                         return ret;
750         }
751
752         ret = psp_ras_load(psp);
753         if (ret)
754                 return ret;
755
756         return 0;
757 }
758 // ras end
759
760 static int psp_hw_start(struct psp_context *psp)
761 {
762         struct amdgpu_device *adev = psp->adev;
763         int ret;
764
765         if (!amdgpu_sriov_vf(adev) || !adev->in_gpu_reset) {
766                 ret = psp_bootloader_load_sysdrv(psp);
767                 if (ret) {
768                         DRM_ERROR("PSP load sysdrv failed!\n");
769                         return ret;
770                 }
771
772                 ret = psp_bootloader_load_sos(psp);
773                 if (ret) {
774                         DRM_ERROR("PSP load sos failed!\n");
775                         return ret;
776                 }
777         }
778
779         ret = psp_ring_create(psp, PSP_RING_TYPE__KM);
780         if (ret) {
781                 DRM_ERROR("PSP create ring failed!\n");
782                 return ret;
783         }
784
785         ret = psp_tmr_init(psp);
786         if (ret) {
787                 DRM_ERROR("PSP tmr init failed!\n");
788                 return ret;
789         }
790
791         ret = psp_tmr_load(psp);
792         if (ret) {
793                 DRM_ERROR("PSP load tmr failed!\n");
794                 return ret;
795         }
796
797         ret = psp_asd_init(psp);
798         if (ret) {
799                 DRM_ERROR("PSP asd init failed!\n");
800                 return ret;
801         }
802
803         ret = psp_asd_load(psp);
804         if (ret) {
805                 DRM_ERROR("PSP load asd failed!\n");
806                 return ret;
807         }
808
809         if (adev->gmc.xgmi.num_physical_nodes > 1) {
810                 ret = psp_xgmi_initialize(psp);
811                 /* Warning the XGMI seesion initialize failure
812                  * Instead of stop driver initialization
813                  */
814                 if (ret)
815                         dev_err(psp->adev->dev,
816                                 "XGMI: Failed to initialize XGMI session\n");
817         }
818
819
820         if (psp->adev->psp.ta_fw) {
821                 ret = psp_ras_initialize(psp);
822                 if (ret)
823                         dev_err(psp->adev->dev,
824                                         "RAS: Failed to initialize RAS\n");
825         }
826
827         return 0;
828 }
829
830 static int psp_get_fw_type(struct amdgpu_firmware_info *ucode,
831                            enum psp_gfx_fw_type *type)
832 {
833         switch (ucode->ucode_id) {
834         case AMDGPU_UCODE_ID_SDMA0:
835                 *type = GFX_FW_TYPE_SDMA0;
836                 break;
837         case AMDGPU_UCODE_ID_SDMA1:
838                 *type = GFX_FW_TYPE_SDMA1;
839                 break;
840         case AMDGPU_UCODE_ID_CP_CE:
841                 *type = GFX_FW_TYPE_CP_CE;
842                 break;
843         case AMDGPU_UCODE_ID_CP_PFP:
844                 *type = GFX_FW_TYPE_CP_PFP;
845                 break;
846         case AMDGPU_UCODE_ID_CP_ME:
847                 *type = GFX_FW_TYPE_CP_ME;
848                 break;
849         case AMDGPU_UCODE_ID_CP_MEC1:
850                 *type = GFX_FW_TYPE_CP_MEC;
851                 break;
852         case AMDGPU_UCODE_ID_CP_MEC1_JT:
853                 *type = GFX_FW_TYPE_CP_MEC_ME1;
854                 break;
855         case AMDGPU_UCODE_ID_CP_MEC2:
856                 *type = GFX_FW_TYPE_CP_MEC;
857                 break;
858         case AMDGPU_UCODE_ID_CP_MEC2_JT:
859                 *type = GFX_FW_TYPE_CP_MEC_ME2;
860                 break;
861         case AMDGPU_UCODE_ID_RLC_G:
862                 *type = GFX_FW_TYPE_RLC_G;
863                 break;
864         case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL:
865                 *type = GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_CNTL;
866                 break;
867         case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM:
868                 *type = GFX_FW_TYPE_RLC_RESTORE_LIST_GPM_MEM;
869                 break;
870         case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM:
871                 *type = GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_MEM;
872                 break;
873         case AMDGPU_UCODE_ID_SMC:
874                 *type = GFX_FW_TYPE_SMU;
875                 break;
876         case AMDGPU_UCODE_ID_UVD:
877                 *type = GFX_FW_TYPE_UVD;
878                 break;
879         case AMDGPU_UCODE_ID_UVD1:
880                 *type = GFX_FW_TYPE_UVD1;
881                 break;
882         case AMDGPU_UCODE_ID_VCE:
883                 *type = GFX_FW_TYPE_VCE;
884                 break;
885         case AMDGPU_UCODE_ID_VCN:
886                 *type = GFX_FW_TYPE_VCN;
887                 break;
888         case AMDGPU_UCODE_ID_DMCU_ERAM:
889                 *type = GFX_FW_TYPE_DMCU_ERAM;
890                 break;
891         case AMDGPU_UCODE_ID_DMCU_INTV:
892                 *type = GFX_FW_TYPE_DMCU_ISR;
893                 break;
894         case AMDGPU_UCODE_ID_VCN0_RAM:
895                 *type = GFX_FW_TYPE_VCN0_RAM;
896                 break;
897         case AMDGPU_UCODE_ID_VCN1_RAM:
898                 *type = GFX_FW_TYPE_VCN1_RAM;
899                 break;
900         case AMDGPU_UCODE_ID_MAXIMUM:
901         default:
902                 return -EINVAL;
903         }
904
905         return 0;
906 }
907
908 static int psp_prep_load_ip_fw_cmd_buf(struct amdgpu_firmware_info *ucode,
909                                        struct psp_gfx_cmd_resp *cmd)
910 {
911         int ret;
912         uint64_t fw_mem_mc_addr = ucode->mc_addr;
913
914         memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp));
915
916         cmd->cmd_id = GFX_CMD_ID_LOAD_IP_FW;
917         cmd->cmd.cmd_load_ip_fw.fw_phy_addr_lo = lower_32_bits(fw_mem_mc_addr);
918         cmd->cmd.cmd_load_ip_fw.fw_phy_addr_hi = upper_32_bits(fw_mem_mc_addr);
919         cmd->cmd.cmd_load_ip_fw.fw_size = ucode->ucode_size;
920
921         ret = psp_get_fw_type(ucode, &cmd->cmd.cmd_load_ip_fw.fw_type);
922         if (ret)
923                 DRM_ERROR("Unknown firmware type\n");
924
925         return ret;
926 }
927
928 static int psp_execute_np_fw_load(struct psp_context *psp,
929                                struct amdgpu_firmware_info *ucode)
930 {
931         int ret = 0;
932
933         ret = psp_prep_load_ip_fw_cmd_buf(ucode, psp->cmd);
934         if (ret)
935                 return ret;
936
937         ret = psp_cmd_submit_buf(psp, ucode, psp->cmd,
938                                  psp->fence_buf_mc_addr);
939
940         return ret;
941 }
942
943 static int psp_np_fw_load(struct psp_context *psp)
944 {
945         int i, ret;
946         struct amdgpu_firmware_info *ucode;
947         struct amdgpu_device* adev = psp->adev;
948
949         if (psp->autoload_supported) {
950                 ucode = &adev->firmware.ucode[AMDGPU_UCODE_ID_SMC];
951                 if (!ucode->fw)
952                         goto out;
953
954                 ret = psp_execute_np_fw_load(psp, ucode);
955                 if (ret)
956                         return ret;
957         }
958
959 out:
960         for (i = 0; i < adev->firmware.max_ucodes; i++) {
961                 ucode = &adev->firmware.ucode[i];
962                 if (!ucode->fw)
963                         continue;
964
965                 if (ucode->ucode_id == AMDGPU_UCODE_ID_SMC &&
966                     (psp_smu_reload_quirk(psp) || psp->autoload_supported))
967                         continue;
968                 if (amdgpu_sriov_vf(adev) &&
969                    (ucode->ucode_id == AMDGPU_UCODE_ID_SDMA0
970                     || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA1
971                     || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_G))
972                         /*skip ucode loading in SRIOV VF */
973                         continue;
974                 if (psp->autoload_supported &&
975                     (ucode->ucode_id == AMDGPU_UCODE_ID_CP_MEC1_JT ||
976                      ucode->ucode_id == AMDGPU_UCODE_ID_CP_MEC2_JT))
977                         /* skip mec JT when autoload is enabled */
978                         continue;
979
980                 ret = psp_execute_np_fw_load(psp, ucode);
981                 if (ret)
982                         return ret;
983
984                 /* Start rlc autoload after psp recieved all the gfx firmware */
985                 if (ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM) {
986                         ret = psp_rlc_autoload(psp);
987                         if (ret) {
988                                 DRM_ERROR("Failed to start rlc autoload\n");
989                                 return ret;
990                         }
991                 }
992 #if 0
993                 /* check if firmware loaded sucessfully */
994                 if (!amdgpu_psp_check_fw_loading_status(adev, i))
995                         return -EINVAL;
996 #endif
997         }
998
999         return 0;
1000 }
1001
1002 static int psp_load_fw(struct amdgpu_device *adev)
1003 {
1004         int ret;
1005         struct psp_context *psp = &adev->psp;
1006
1007         if (amdgpu_sriov_vf(adev) && adev->in_gpu_reset) {
1008                 psp_ring_stop(psp, PSP_RING_TYPE__KM); /* should not destroy ring, only stop */
1009                 goto skip_memalloc;
1010         }
1011
1012         psp->cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
1013         if (!psp->cmd)
1014                 return -ENOMEM;
1015
1016         /* this fw pri bo is not used under SRIOV */
1017         if (!amdgpu_sriov_vf(psp->adev)) {
1018                 ret = amdgpu_bo_create_kernel(adev, PSP_1_MEG, PSP_1_MEG,
1019                                               AMDGPU_GEM_DOMAIN_GTT,
1020                                               &psp->fw_pri_bo,
1021                                               &psp->fw_pri_mc_addr,
1022                                               &psp->fw_pri_buf);
1023                 if (ret)
1024                         goto failed;
1025         }
1026
1027         ret = amdgpu_bo_create_kernel(adev, PSP_FENCE_BUFFER_SIZE, PAGE_SIZE,
1028                                         AMDGPU_GEM_DOMAIN_VRAM,
1029                                         &psp->fence_buf_bo,
1030                                         &psp->fence_buf_mc_addr,
1031                                         &psp->fence_buf);
1032         if (ret)
1033                 goto failed;
1034
1035         ret = amdgpu_bo_create_kernel(adev, PSP_CMD_BUFFER_SIZE, PAGE_SIZE,
1036                                       AMDGPU_GEM_DOMAIN_VRAM,
1037                                       &psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
1038                                       (void **)&psp->cmd_buf_mem);
1039         if (ret)
1040                 goto failed;
1041
1042         memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE);
1043
1044         ret = psp_ring_init(psp, PSP_RING_TYPE__KM);
1045         if (ret) {
1046                 DRM_ERROR("PSP ring init failed!\n");
1047                 goto failed;
1048         }
1049
1050 skip_memalloc:
1051         ret = psp_hw_start(psp);
1052         if (ret)
1053                 goto failed;
1054
1055         ret = psp_np_fw_load(psp);
1056         if (ret)
1057                 goto failed;
1058
1059         return 0;
1060
1061 failed:
1062         /*
1063          * all cleanup jobs (xgmi terminate, ras terminate,
1064          * ring destroy, cmd/fence/fw buffers destory,
1065          * psp->cmd destory) are delayed to psp_hw_fini
1066          */
1067         return ret;
1068 }
1069
1070 static int psp_hw_init(void *handle)
1071 {
1072         int ret;
1073         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1074
1075         mutex_lock(&adev->firmware.mutex);
1076         /*
1077          * This sequence is just used on hw_init only once, no need on
1078          * resume.
1079          */
1080         ret = amdgpu_ucode_init_bo(adev);
1081         if (ret)
1082                 goto failed;
1083
1084         ret = psp_load_fw(adev);
1085         if (ret) {
1086                 DRM_ERROR("PSP firmware loading failed\n");
1087                 goto failed;
1088         }
1089
1090         mutex_unlock(&adev->firmware.mutex);
1091         return 0;
1092
1093 failed:
1094         adev->firmware.load_type = AMDGPU_FW_LOAD_DIRECT;
1095         mutex_unlock(&adev->firmware.mutex);
1096         return -EINVAL;
1097 }
1098
1099 static int psp_hw_fini(void *handle)
1100 {
1101         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1102         struct psp_context *psp = &adev->psp;
1103
1104         if (adev->gmc.xgmi.num_physical_nodes > 1 &&
1105             psp->xgmi_context.initialized == 1)
1106                 psp_xgmi_terminate(psp);
1107
1108         if (psp->adev->psp.ta_fw)
1109                 psp_ras_terminate(psp);
1110
1111         psp_ring_destroy(psp, PSP_RING_TYPE__KM);
1112
1113         amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, &psp->tmr_buf);
1114         amdgpu_bo_free_kernel(&psp->fw_pri_bo,
1115                               &psp->fw_pri_mc_addr, &psp->fw_pri_buf);
1116         amdgpu_bo_free_kernel(&psp->fence_buf_bo,
1117                               &psp->fence_buf_mc_addr, &psp->fence_buf);
1118         amdgpu_bo_free_kernel(&psp->asd_shared_bo, &psp->asd_shared_mc_addr,
1119                               &psp->asd_shared_buf);
1120         amdgpu_bo_free_kernel(&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
1121                               (void **)&psp->cmd_buf_mem);
1122
1123         kfree(psp->cmd);
1124         psp->cmd = NULL;
1125
1126         return 0;
1127 }
1128
1129 static int psp_suspend(void *handle)
1130 {
1131         int ret;
1132         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1133         struct psp_context *psp = &adev->psp;
1134
1135         if (adev->gmc.xgmi.num_physical_nodes > 1 &&
1136             psp->xgmi_context.initialized == 1) {
1137                 ret = psp_xgmi_terminate(psp);
1138                 if (ret) {
1139                         DRM_ERROR("Failed to terminate xgmi ta\n");
1140                         return ret;
1141                 }
1142         }
1143
1144         if (psp->adev->psp.ta_fw) {
1145                 ret = psp_ras_terminate(psp);
1146                 if (ret) {
1147                         DRM_ERROR("Failed to terminate ras ta\n");
1148                         return ret;
1149                 }
1150         }
1151
1152         ret = psp_ring_stop(psp, PSP_RING_TYPE__KM);
1153         if (ret) {
1154                 DRM_ERROR("PSP ring stop failed\n");
1155                 return ret;
1156         }
1157
1158         return 0;
1159 }
1160
1161 static int psp_resume(void *handle)
1162 {
1163         int ret;
1164         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1165         struct psp_context *psp = &adev->psp;
1166
1167         DRM_INFO("PSP is resuming...\n");
1168
1169         mutex_lock(&adev->firmware.mutex);
1170
1171         ret = psp_hw_start(psp);
1172         if (ret)
1173                 goto failed;
1174
1175         ret = psp_np_fw_load(psp);
1176         if (ret)
1177                 goto failed;
1178
1179         mutex_unlock(&adev->firmware.mutex);
1180
1181         return 0;
1182
1183 failed:
1184         DRM_ERROR("PSP resume failed\n");
1185         mutex_unlock(&adev->firmware.mutex);
1186         return ret;
1187 }
1188
1189 int psp_gpu_reset(struct amdgpu_device *adev)
1190 {
1191         if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
1192                 return 0;
1193
1194         return psp_mode1_reset(&adev->psp);
1195 }
1196
1197 int psp_rlc_autoload_start(struct psp_context *psp)
1198 {
1199         int ret;
1200         struct psp_gfx_cmd_resp *cmd;
1201
1202         if (amdgpu_sriov_vf(psp->adev))
1203                 return 0;
1204
1205         cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
1206         if (!cmd)
1207                 return -ENOMEM;
1208
1209         cmd->cmd_id = GFX_CMD_ID_AUTOLOAD_RLC;
1210
1211         ret = psp_cmd_submit_buf(psp, NULL, cmd,
1212                                  psp->fence_buf_mc_addr);
1213         kfree(cmd);
1214         return ret;
1215 }
1216
1217 int psp_update_vcn_sram(struct amdgpu_device *adev, int inst_idx,
1218                         uint64_t cmd_gpu_addr, int cmd_size)
1219 {
1220         struct amdgpu_firmware_info ucode = {0};
1221
1222         ucode.ucode_id = inst_idx ? AMDGPU_UCODE_ID_VCN1_RAM :
1223                 AMDGPU_UCODE_ID_VCN0_RAM;
1224         ucode.mc_addr = cmd_gpu_addr;
1225         ucode.ucode_size = cmd_size;
1226
1227         return psp_execute_np_fw_load(&adev->psp, &ucode);
1228 }
1229
1230 static bool psp_check_fw_loading_status(struct amdgpu_device *adev,
1231                                         enum AMDGPU_UCODE_ID ucode_type)
1232 {
1233         struct amdgpu_firmware_info *ucode = NULL;
1234
1235         if (!adev->firmware.fw_size)
1236                 return false;
1237
1238         ucode = &adev->firmware.ucode[ucode_type];
1239         if (!ucode->fw || !ucode->ucode_size)
1240                 return false;
1241
1242         return psp_compare_sram_data(&adev->psp, ucode, ucode_type);
1243 }
1244
1245 static int psp_set_clockgating_state(void *handle,
1246                                      enum amd_clockgating_state state)
1247 {
1248         return 0;
1249 }
1250
1251 static int psp_set_powergating_state(void *handle,
1252                                      enum amd_powergating_state state)
1253 {
1254         return 0;
1255 }
1256
1257 const struct amd_ip_funcs psp_ip_funcs = {
1258         .name = "psp",
1259         .early_init = psp_early_init,
1260         .late_init = NULL,
1261         .sw_init = psp_sw_init,
1262         .sw_fini = psp_sw_fini,
1263         .hw_init = psp_hw_init,
1264         .hw_fini = psp_hw_fini,
1265         .suspend = psp_suspend,
1266         .resume = psp_resume,
1267         .is_idle = NULL,
1268         .check_soft_reset = NULL,
1269         .wait_for_idle = NULL,
1270         .soft_reset = NULL,
1271         .set_clockgating_state = psp_set_clockgating_state,
1272         .set_powergating_state = psp_set_powergating_state,
1273 };
1274
1275 static const struct amdgpu_psp_funcs psp_funcs = {
1276         .check_fw_loading_status = psp_check_fw_loading_status,
1277 };
1278
1279 static void psp_set_funcs(struct amdgpu_device *adev)
1280 {
1281         if (NULL == adev->firmware.funcs)
1282                 adev->firmware.funcs = &psp_funcs;
1283 }
1284
1285 const struct amdgpu_ip_block_version psp_v3_1_ip_block =
1286 {
1287         .type = AMD_IP_BLOCK_TYPE_PSP,
1288         .major = 3,
1289         .minor = 1,
1290         .rev = 0,
1291         .funcs = &psp_ip_funcs,
1292 };
1293
1294 const struct amdgpu_ip_block_version psp_v10_0_ip_block =
1295 {
1296         .type = AMD_IP_BLOCK_TYPE_PSP,
1297         .major = 10,
1298         .minor = 0,
1299         .rev = 0,
1300         .funcs = &psp_ip_funcs,
1301 };
1302
1303 const struct amdgpu_ip_block_version psp_v11_0_ip_block =
1304 {
1305         .type = AMD_IP_BLOCK_TYPE_PSP,
1306         .major = 11,
1307         .minor = 0,
1308         .rev = 0,
1309         .funcs = &psp_ip_funcs,
1310 };