c625c5d8ed89052b002e8fb0b79f42d063c20d27
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / amdgpu / nv.c
1 /*
2  * Copyright 2019 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 <linux/slab.h>
25 #include <linux/module.h>
26 #include <linux/pci.h>
27
28 #include "amdgpu.h"
29 #include "amdgpu_atombios.h"
30 #include "amdgpu_ih.h"
31 #include "amdgpu_uvd.h"
32 #include "amdgpu_vce.h"
33 #include "amdgpu_ucode.h"
34 #include "amdgpu_psp.h"
35 #include "amdgpu_smu.h"
36 #include "atom.h"
37 #include "amd_pcie.h"
38
39 #include "gc/gc_10_1_0_offset.h"
40 #include "gc/gc_10_1_0_sh_mask.h"
41 #include "mp/mp_11_0_offset.h"
42
43 #include "soc15.h"
44 #include "soc15_common.h"
45 #include "gmc_v10_0.h"
46 #include "gfxhub_v2_0.h"
47 #include "mmhub_v2_0.h"
48 #include "nbio_v2_3.h"
49 #include "nbio_v7_2.h"
50 #include "hdp_v5_0.h"
51 #include "nv.h"
52 #include "navi10_ih.h"
53 #include "gfx_v10_0.h"
54 #include "sdma_v5_0.h"
55 #include "sdma_v5_2.h"
56 #include "vcn_v2_0.h"
57 #include "jpeg_v2_0.h"
58 #include "vcn_v3_0.h"
59 #include "jpeg_v3_0.h"
60 #include "dce_virtual.h"
61 #include "mes_v10_1.h"
62 #include "mxgpu_nv.h"
63 #include "smuio_v11_0.h"
64 #include "smuio_v11_0_6.h"
65
66 static const struct amd_ip_funcs nv_common_ip_funcs;
67
68 /*
69  * Indirect registers accessor
70  */
71 static u32 nv_pcie_rreg(struct amdgpu_device *adev, u32 reg)
72 {
73         unsigned long address, data;
74         address = adev->nbio.funcs->get_pcie_index_offset(adev);
75         data = adev->nbio.funcs->get_pcie_data_offset(adev);
76
77         return amdgpu_device_indirect_rreg(adev, address, data, reg);
78 }
79
80 static void nv_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
81 {
82         unsigned long address, data;
83
84         address = adev->nbio.funcs->get_pcie_index_offset(adev);
85         data = adev->nbio.funcs->get_pcie_data_offset(adev);
86
87         amdgpu_device_indirect_wreg(adev, address, data, reg, v);
88 }
89
90 static u64 nv_pcie_rreg64(struct amdgpu_device *adev, u32 reg)
91 {
92         unsigned long address, data;
93         address = adev->nbio.funcs->get_pcie_index_offset(adev);
94         data = adev->nbio.funcs->get_pcie_data_offset(adev);
95
96         return amdgpu_device_indirect_rreg64(adev, address, data, reg);
97 }
98
99 static u32 nv_pcie_port_rreg(struct amdgpu_device *adev, u32 reg)
100 {
101         unsigned long flags, address, data;
102         u32 r;
103         address = adev->nbio.funcs->get_pcie_port_index_offset(adev);
104         data = adev->nbio.funcs->get_pcie_port_data_offset(adev);
105
106         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
107         WREG32(address, reg * 4);
108         (void)RREG32(address);
109         r = RREG32(data);
110         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
111         return r;
112 }
113
114 static void nv_pcie_wreg64(struct amdgpu_device *adev, u32 reg, u64 v)
115 {
116         unsigned long address, data;
117
118         address = adev->nbio.funcs->get_pcie_index_offset(adev);
119         data = adev->nbio.funcs->get_pcie_data_offset(adev);
120
121         amdgpu_device_indirect_wreg64(adev, address, data, reg, v);
122 }
123
124 static void nv_pcie_port_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
125 {
126         unsigned long flags, address, data;
127
128         address = adev->nbio.funcs->get_pcie_port_index_offset(adev);
129         data = adev->nbio.funcs->get_pcie_port_data_offset(adev);
130
131         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
132         WREG32(address, reg * 4);
133         (void)RREG32(address);
134         WREG32(data, v);
135         (void)RREG32(data);
136         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
137 }
138
139 static u32 nv_didt_rreg(struct amdgpu_device *adev, u32 reg)
140 {
141         unsigned long flags, address, data;
142         u32 r;
143
144         address = SOC15_REG_OFFSET(GC, 0, mmDIDT_IND_INDEX);
145         data = SOC15_REG_OFFSET(GC, 0, mmDIDT_IND_DATA);
146
147         spin_lock_irqsave(&adev->didt_idx_lock, flags);
148         WREG32(address, (reg));
149         r = RREG32(data);
150         spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
151         return r;
152 }
153
154 static void nv_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
155 {
156         unsigned long flags, address, data;
157
158         address = SOC15_REG_OFFSET(GC, 0, mmDIDT_IND_INDEX);
159         data = SOC15_REG_OFFSET(GC, 0, mmDIDT_IND_DATA);
160
161         spin_lock_irqsave(&adev->didt_idx_lock, flags);
162         WREG32(address, (reg));
163         WREG32(data, (v));
164         spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
165 }
166
167 static u32 nv_get_config_memsize(struct amdgpu_device *adev)
168 {
169         return adev->nbio.funcs->get_memsize(adev);
170 }
171
172 static u32 nv_get_xclk(struct amdgpu_device *adev)
173 {
174         return adev->clock.spll.reference_freq;
175 }
176
177
178 void nv_grbm_select(struct amdgpu_device *adev,
179                      u32 me, u32 pipe, u32 queue, u32 vmid)
180 {
181         u32 grbm_gfx_cntl = 0;
182         grbm_gfx_cntl = REG_SET_FIELD(grbm_gfx_cntl, GRBM_GFX_CNTL, PIPEID, pipe);
183         grbm_gfx_cntl = REG_SET_FIELD(grbm_gfx_cntl, GRBM_GFX_CNTL, MEID, me);
184         grbm_gfx_cntl = REG_SET_FIELD(grbm_gfx_cntl, GRBM_GFX_CNTL, VMID, vmid);
185         grbm_gfx_cntl = REG_SET_FIELD(grbm_gfx_cntl, GRBM_GFX_CNTL, QUEUEID, queue);
186
187         WREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_GFX_CNTL), grbm_gfx_cntl);
188 }
189
190 static void nv_vga_set_state(struct amdgpu_device *adev, bool state)
191 {
192         /* todo */
193 }
194
195 static bool nv_read_disabled_bios(struct amdgpu_device *adev)
196 {
197         /* todo */
198         return false;
199 }
200
201 static bool nv_read_bios_from_rom(struct amdgpu_device *adev,
202                                   u8 *bios, u32 length_bytes)
203 {
204         u32 *dw_ptr;
205         u32 i, length_dw;
206         u32 rom_index_offset, rom_data_offset;
207
208         if (bios == NULL)
209                 return false;
210         if (length_bytes == 0)
211                 return false;
212         /* APU vbios image is part of sbios image */
213         if (adev->flags & AMD_IS_APU)
214                 return false;
215
216         dw_ptr = (u32 *)bios;
217         length_dw = ALIGN(length_bytes, 4) / 4;
218
219         rom_index_offset =
220                 adev->smuio.funcs->get_rom_index_offset(adev);
221         rom_data_offset =
222                 adev->smuio.funcs->get_rom_data_offset(adev);
223
224         /* set rom index to 0 */
225         WREG32(rom_index_offset, 0);
226         /* read out the rom data */
227         for (i = 0; i < length_dw; i++)
228                 dw_ptr[i] = RREG32(rom_data_offset);
229
230         return true;
231 }
232
233 static struct soc15_allowed_register_entry nv_allowed_read_registers[] = {
234         { SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS)},
235         { SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS2)},
236         { SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS_SE0)},
237         { SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS_SE1)},
238         { SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS_SE2)},
239         { SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS_SE3)},
240         { SOC15_REG_ENTRY(SDMA0, 0, mmSDMA0_STATUS_REG)},
241         { SOC15_REG_ENTRY(SDMA1, 0, mmSDMA1_STATUS_REG)},
242         { SOC15_REG_ENTRY(GC, 0, mmCP_STAT)},
243         { SOC15_REG_ENTRY(GC, 0, mmCP_STALLED_STAT1)},
244         { SOC15_REG_ENTRY(GC, 0, mmCP_STALLED_STAT2)},
245         { SOC15_REG_ENTRY(GC, 0, mmCP_STALLED_STAT3)},
246         { SOC15_REG_ENTRY(GC, 0, mmCP_CPF_BUSY_STAT)},
247         { SOC15_REG_ENTRY(GC, 0, mmCP_CPF_STALLED_STAT1)},
248         { SOC15_REG_ENTRY(GC, 0, mmCP_CPF_STATUS)},
249         { SOC15_REG_ENTRY(GC, 0, mmCP_CPC_BUSY_STAT)},
250         { SOC15_REG_ENTRY(GC, 0, mmCP_CPC_STALLED_STAT1)},
251         { SOC15_REG_ENTRY(GC, 0, mmCP_CPC_STATUS)},
252         { SOC15_REG_ENTRY(GC, 0, mmGB_ADDR_CONFIG)},
253 };
254
255 static uint32_t nv_read_indexed_register(struct amdgpu_device *adev, u32 se_num,
256                                          u32 sh_num, u32 reg_offset)
257 {
258         uint32_t val;
259
260         mutex_lock(&adev->grbm_idx_mutex);
261         if (se_num != 0xffffffff || sh_num != 0xffffffff)
262                 amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
263
264         val = RREG32(reg_offset);
265
266         if (se_num != 0xffffffff || sh_num != 0xffffffff)
267                 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
268         mutex_unlock(&adev->grbm_idx_mutex);
269         return val;
270 }
271
272 static uint32_t nv_get_register_value(struct amdgpu_device *adev,
273                                       bool indexed, u32 se_num,
274                                       u32 sh_num, u32 reg_offset)
275 {
276         if (indexed) {
277                 return nv_read_indexed_register(adev, se_num, sh_num, reg_offset);
278         } else {
279                 if (reg_offset == SOC15_REG_OFFSET(GC, 0, mmGB_ADDR_CONFIG))
280                         return adev->gfx.config.gb_addr_config;
281                 return RREG32(reg_offset);
282         }
283 }
284
285 static int nv_read_register(struct amdgpu_device *adev, u32 se_num,
286                             u32 sh_num, u32 reg_offset, u32 *value)
287 {
288         uint32_t i;
289         struct soc15_allowed_register_entry  *en;
290
291         *value = 0;
292         for (i = 0; i < ARRAY_SIZE(nv_allowed_read_registers); i++) {
293                 en = &nv_allowed_read_registers[i];
294                 if ((i == 7 && (adev->sdma.num_instances == 1)) || /* some asics don't have SDMA1 */
295                     reg_offset !=
296                     (adev->reg_offset[en->hwip][en->inst][en->seg] + en->reg_offset))
297                         continue;
298
299                 *value = nv_get_register_value(adev,
300                                                nv_allowed_read_registers[i].grbm_indexed,
301                                                se_num, sh_num, reg_offset);
302                 return 0;
303         }
304         return -EINVAL;
305 }
306
307 static int nv_asic_mode1_reset(struct amdgpu_device *adev)
308 {
309         u32 i;
310         int ret = 0;
311
312         amdgpu_atombios_scratch_regs_engine_hung(adev, true);
313
314         /* disable BM */
315         pci_clear_master(adev->pdev);
316
317         amdgpu_device_cache_pci_state(adev->pdev);
318
319         if (amdgpu_dpm_is_mode1_reset_supported(adev)) {
320                 dev_info(adev->dev, "GPU smu mode1 reset\n");
321                 ret = amdgpu_dpm_mode1_reset(adev);
322         } else {
323                 dev_info(adev->dev, "GPU psp mode1 reset\n");
324                 ret = psp_gpu_reset(adev);
325         }
326
327         if (ret)
328                 dev_err(adev->dev, "GPU mode1 reset failed\n");
329         amdgpu_device_load_pci_state(adev->pdev);
330
331         /* wait for asic to come out of reset */
332         for (i = 0; i < adev->usec_timeout; i++) {
333                 u32 memsize = adev->nbio.funcs->get_memsize(adev);
334
335                 if (memsize != 0xffffffff)
336                         break;
337                 udelay(1);
338         }
339
340         amdgpu_atombios_scratch_regs_engine_hung(adev, false);
341
342         return ret;
343 }
344
345 static int nv_asic_mode2_reset(struct amdgpu_device *adev)
346 {
347         u32 i;
348         int ret = 0;
349
350         amdgpu_atombios_scratch_regs_engine_hung(adev, true);
351
352         /* disable BM */
353         pci_clear_master(adev->pdev);
354
355         amdgpu_device_cache_pci_state(adev->pdev);
356
357         ret = amdgpu_dpm_mode2_reset(adev);
358         if (ret)
359                 dev_err(adev->dev, "GPU mode2 reset failed\n");
360
361         amdgpu_device_load_pci_state(adev->pdev);
362
363         /* wait for asic to come out of reset */
364         for (i = 0; i < adev->usec_timeout; i++) {
365                 u32 memsize = adev->nbio.funcs->get_memsize(adev);
366
367                 if (memsize != 0xffffffff)
368                         break;
369                 udelay(1);
370         }
371
372         amdgpu_atombios_scratch_regs_engine_hung(adev, false);
373
374         return ret;
375 }
376
377 static bool nv_asic_supports_baco(struct amdgpu_device *adev)
378 {
379         struct smu_context *smu = &adev->smu;
380
381         if (smu_baco_is_support(smu))
382                 return true;
383         else
384                 return false;
385 }
386
387 static enum amd_reset_method
388 nv_asic_reset_method(struct amdgpu_device *adev)
389 {
390         struct smu_context *smu = &adev->smu;
391
392         if (amdgpu_reset_method == AMD_RESET_METHOD_MODE1 ||
393             amdgpu_reset_method == AMD_RESET_METHOD_MODE2 ||
394             amdgpu_reset_method == AMD_RESET_METHOD_BACO ||
395             amdgpu_reset_method == AMD_RESET_METHOD_PCI)
396                 return amdgpu_reset_method;
397
398         if (amdgpu_reset_method != -1)
399                 dev_warn(adev->dev, "Specified reset method:%d isn't supported, using AUTO instead.\n",
400                                   amdgpu_reset_method);
401
402         switch (adev->asic_type) {
403         case CHIP_VANGOGH:
404                 return AMD_RESET_METHOD_MODE2;
405         case CHIP_SIENNA_CICHLID:
406         case CHIP_NAVY_FLOUNDER:
407         case CHIP_DIMGREY_CAVEFISH:
408                 return AMD_RESET_METHOD_MODE1;
409         default:
410                 if (smu_baco_is_support(smu))
411                         return AMD_RESET_METHOD_BACO;
412                 else
413                         return AMD_RESET_METHOD_MODE1;
414         }
415 }
416
417 static int nv_asic_reset(struct amdgpu_device *adev)
418 {
419         int ret = 0;
420         struct smu_context *smu = &adev->smu;
421
422         /* skip reset on vangogh for now */
423         if (adev->asic_type == CHIP_VANGOGH)
424                 return 0;
425
426         switch (nv_asic_reset_method(adev)) {
427         case AMD_RESET_METHOD_PCI:
428                 dev_info(adev->dev, "PCI reset\n");
429                 ret = amdgpu_device_pci_reset(adev);
430                 break;
431         case AMD_RESET_METHOD_BACO:
432                 dev_info(adev->dev, "BACO reset\n");
433
434                 ret = smu_baco_enter(smu);
435                 if (ret)
436                         return ret;
437                 ret = smu_baco_exit(smu);
438                 if (ret)
439                         return ret;
440                 break;
441         case AMD_RESET_METHOD_MODE2:
442                 dev_info(adev->dev, "MODE2 reset\n");
443                 ret = nv_asic_mode2_reset(adev);
444                 break;
445         default:
446                 dev_info(adev->dev, "MODE1 reset\n");
447                 ret = nv_asic_mode1_reset(adev);
448                 break;
449         }
450
451         return ret;
452 }
453
454 static int nv_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
455 {
456         /* todo */
457         return 0;
458 }
459
460 static int nv_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
461 {
462         /* todo */
463         return 0;
464 }
465
466 static void nv_pcie_gen3_enable(struct amdgpu_device *adev)
467 {
468         if (pci_is_root_bus(adev->pdev->bus))
469                 return;
470
471         if (amdgpu_pcie_gen2 == 0)
472                 return;
473
474         if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
475                                         CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
476                 return;
477
478         /* todo */
479 }
480
481 static void nv_program_aspm(struct amdgpu_device *adev)
482 {
483         if (amdgpu_aspm != 1)
484                 return;
485
486         if ((adev->asic_type >= CHIP_SIENNA_CICHLID) &&
487             !(adev->flags & AMD_IS_APU) &&
488             (adev->nbio.funcs->program_aspm))
489                 adev->nbio.funcs->program_aspm(adev);
490
491 }
492
493 static void nv_enable_doorbell_aperture(struct amdgpu_device *adev,
494                                         bool enable)
495 {
496         adev->nbio.funcs->enable_doorbell_aperture(adev, enable);
497         adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, enable);
498 }
499
500 static const struct amdgpu_ip_block_version nv_common_ip_block =
501 {
502         .type = AMD_IP_BLOCK_TYPE_COMMON,
503         .major = 1,
504         .minor = 0,
505         .rev = 0,
506         .funcs = &nv_common_ip_funcs,
507 };
508
509 static int nv_reg_base_init(struct amdgpu_device *adev)
510 {
511         int r;
512
513         if (amdgpu_discovery) {
514                 r = amdgpu_discovery_reg_base_init(adev);
515                 if (r) {
516                         DRM_WARN("failed to init reg base from ip discovery table, "
517                                         "fallback to legacy init method\n");
518                         goto legacy_init;
519                 }
520
521                 return 0;
522         }
523
524 legacy_init:
525         switch (adev->asic_type) {
526         case CHIP_NAVI10:
527                 navi10_reg_base_init(adev);
528                 break;
529         case CHIP_NAVI14:
530                 navi14_reg_base_init(adev);
531                 break;
532         case CHIP_NAVI12:
533                 navi12_reg_base_init(adev);
534                 break;
535         case CHIP_SIENNA_CICHLID:
536         case CHIP_NAVY_FLOUNDER:
537                 sienna_cichlid_reg_base_init(adev);
538                 break;
539         case CHIP_VANGOGH:
540                 vangogh_reg_base_init(adev);
541                 break;
542         case CHIP_DIMGREY_CAVEFISH:
543                 dimgrey_cavefish_reg_base_init(adev);
544                 break;
545         default:
546                 return -EINVAL;
547         }
548
549         return 0;
550 }
551
552 void nv_set_virt_ops(struct amdgpu_device *adev)
553 {
554         adev->virt.ops = &xgpu_nv_virt_ops;
555 }
556
557 static bool nv_is_headless_sku(struct pci_dev *pdev)
558 {
559         if ((pdev->device == 0x731E &&
560             (pdev->revision == 0xC6 || pdev->revision == 0xC7)) ||
561             (pdev->device == 0x7340 && pdev->revision == 0xC9)  ||
562             (pdev->device == 0x7360 && pdev->revision == 0xC7))
563                 return true;
564         return false;
565 }
566
567 int nv_set_ip_blocks(struct amdgpu_device *adev)
568 {
569         int r;
570
571         if (adev->flags & AMD_IS_APU) {
572                 adev->nbio.funcs = &nbio_v7_2_funcs;
573                 adev->nbio.hdp_flush_reg = &nbio_v7_2_hdp_flush_reg;
574         } else {
575                 adev->nbio.funcs = &nbio_v2_3_funcs;
576                 adev->nbio.hdp_flush_reg = &nbio_v2_3_hdp_flush_reg;
577         }
578         adev->hdp.funcs = &hdp_v5_0_funcs;
579
580         if (adev->asic_type >= CHIP_SIENNA_CICHLID)
581                 adev->smuio.funcs = &smuio_v11_0_6_funcs;
582         else
583                 adev->smuio.funcs = &smuio_v11_0_funcs;
584
585         if (adev->asic_type == CHIP_SIENNA_CICHLID)
586                 adev->gmc.xgmi.supported = true;
587
588         /* Set IP register base before any HW register access */
589         r = nv_reg_base_init(adev);
590         if (r)
591                 return r;
592
593         switch (adev->asic_type) {
594         case CHIP_NAVI10:
595         case CHIP_NAVI14:
596                 amdgpu_device_ip_block_add(adev, &nv_common_ip_block);
597                 amdgpu_device_ip_block_add(adev, &gmc_v10_0_ip_block);
598                 amdgpu_device_ip_block_add(adev, &navi10_ih_ip_block);
599                 amdgpu_device_ip_block_add(adev, &psp_v11_0_ip_block);
600                 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP &&
601                     !amdgpu_sriov_vf(adev))
602                         amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
603                 if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
604                         amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
605 #if defined(CONFIG_DRM_AMD_DC)
606                 else if (amdgpu_device_has_dc_support(adev))
607                         amdgpu_device_ip_block_add(adev, &dm_ip_block);
608 #endif
609                 amdgpu_device_ip_block_add(adev, &gfx_v10_0_ip_block);
610                 amdgpu_device_ip_block_add(adev, &sdma_v5_0_ip_block);
611                 if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT &&
612                     !amdgpu_sriov_vf(adev))
613                         amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
614                 if (!nv_is_headless_sku(adev->pdev))
615                         amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block);
616                 amdgpu_device_ip_block_add(adev, &jpeg_v2_0_ip_block);
617                 if (adev->enable_mes)
618                         amdgpu_device_ip_block_add(adev, &mes_v10_1_ip_block);
619                 break;
620         case CHIP_NAVI12:
621                 amdgpu_device_ip_block_add(adev, &nv_common_ip_block);
622                 amdgpu_device_ip_block_add(adev, &gmc_v10_0_ip_block);
623                 amdgpu_device_ip_block_add(adev, &navi10_ih_ip_block);
624                 amdgpu_device_ip_block_add(adev, &psp_v11_0_ip_block);
625                 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP)
626                         amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
627                 if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
628                         amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
629 #if defined(CONFIG_DRM_AMD_DC)
630                 else if (amdgpu_device_has_dc_support(adev))
631                         amdgpu_device_ip_block_add(adev, &dm_ip_block);
632 #endif
633                 amdgpu_device_ip_block_add(adev, &gfx_v10_0_ip_block);
634                 amdgpu_device_ip_block_add(adev, &sdma_v5_0_ip_block);
635                 if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT &&
636                     !amdgpu_sriov_vf(adev))
637                         amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
638                 if (!nv_is_headless_sku(adev->pdev))
639                         amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block);
640                 if (!amdgpu_sriov_vf(adev))
641                         amdgpu_device_ip_block_add(adev, &jpeg_v2_0_ip_block);
642                 break;
643         case CHIP_SIENNA_CICHLID:
644                 amdgpu_device_ip_block_add(adev, &nv_common_ip_block);
645                 amdgpu_device_ip_block_add(adev, &gmc_v10_0_ip_block);
646                 amdgpu_device_ip_block_add(adev, &navi10_ih_ip_block);
647                 if (likely(adev->firmware.load_type == AMDGPU_FW_LOAD_PSP))
648                         amdgpu_device_ip_block_add(adev, &psp_v11_0_ip_block);
649                 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP &&
650                     is_support_sw_smu(adev))
651                         amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
652                 if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
653                         amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
654 #if defined(CONFIG_DRM_AMD_DC)
655                 else if (amdgpu_device_has_dc_support(adev))
656                         amdgpu_device_ip_block_add(adev, &dm_ip_block);
657 #endif
658                 amdgpu_device_ip_block_add(adev, &gfx_v10_0_ip_block);
659                 amdgpu_device_ip_block_add(adev, &sdma_v5_2_ip_block);
660                 amdgpu_device_ip_block_add(adev, &vcn_v3_0_ip_block);
661                 if (!amdgpu_sriov_vf(adev))
662                         amdgpu_device_ip_block_add(adev, &jpeg_v3_0_ip_block);
663
664                 if (adev->enable_mes)
665                         amdgpu_device_ip_block_add(adev, &mes_v10_1_ip_block);
666                 break;
667         case CHIP_NAVY_FLOUNDER:
668                 amdgpu_device_ip_block_add(adev, &nv_common_ip_block);
669                 amdgpu_device_ip_block_add(adev, &gmc_v10_0_ip_block);
670                 amdgpu_device_ip_block_add(adev, &navi10_ih_ip_block);
671                 if (likely(adev->firmware.load_type == AMDGPU_FW_LOAD_PSP))
672                         amdgpu_device_ip_block_add(adev, &psp_v11_0_ip_block);
673                 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP &&
674                     is_support_sw_smu(adev))
675                         amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
676                 if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
677                         amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
678 #if defined(CONFIG_DRM_AMD_DC)
679                 else if (amdgpu_device_has_dc_support(adev))
680                         amdgpu_device_ip_block_add(adev, &dm_ip_block);
681 #endif
682                 amdgpu_device_ip_block_add(adev, &gfx_v10_0_ip_block);
683                 amdgpu_device_ip_block_add(adev, &sdma_v5_2_ip_block);
684                 amdgpu_device_ip_block_add(adev, &vcn_v3_0_ip_block);
685                 amdgpu_device_ip_block_add(adev, &jpeg_v3_0_ip_block);
686                 if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT &&
687                     is_support_sw_smu(adev))
688                         amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
689                 break;
690         case CHIP_VANGOGH:
691                 amdgpu_device_ip_block_add(adev, &nv_common_ip_block);
692                 amdgpu_device_ip_block_add(adev, &gmc_v10_0_ip_block);
693                 amdgpu_device_ip_block_add(adev, &navi10_ih_ip_block);
694                 if (likely(adev->firmware.load_type == AMDGPU_FW_LOAD_PSP))
695                         amdgpu_device_ip_block_add(adev, &psp_v11_0_ip_block);
696                 amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
697                 if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
698                         amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
699 #if defined(CONFIG_DRM_AMD_DC)
700                 else if (amdgpu_device_has_dc_support(adev))
701                         amdgpu_device_ip_block_add(adev, &dm_ip_block);
702 #endif
703                 amdgpu_device_ip_block_add(adev, &gfx_v10_0_ip_block);
704                 amdgpu_device_ip_block_add(adev, &sdma_v5_2_ip_block);
705                 amdgpu_device_ip_block_add(adev, &vcn_v3_0_ip_block);
706                 amdgpu_device_ip_block_add(adev, &jpeg_v3_0_ip_block);
707                 break;
708         case CHIP_DIMGREY_CAVEFISH:
709                 amdgpu_device_ip_block_add(adev, &nv_common_ip_block);
710                 amdgpu_device_ip_block_add(adev, &gmc_v10_0_ip_block);
711                 amdgpu_device_ip_block_add(adev, &navi10_ih_ip_block);
712                 if (likely(adev->firmware.load_type == AMDGPU_FW_LOAD_PSP))
713                         amdgpu_device_ip_block_add(adev, &psp_v11_0_ip_block);
714                 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP &&
715                     is_support_sw_smu(adev))
716                         amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
717                 if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
718                         amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
719 #if defined(CONFIG_DRM_AMD_DC)
720                 else if (amdgpu_device_has_dc_support(adev))
721                         amdgpu_device_ip_block_add(adev, &dm_ip_block);
722 #endif
723                 amdgpu_device_ip_block_add(adev, &gfx_v10_0_ip_block);
724                 amdgpu_device_ip_block_add(adev, &sdma_v5_2_ip_block);
725                 amdgpu_device_ip_block_add(adev, &vcn_v3_0_ip_block);
726                 amdgpu_device_ip_block_add(adev, &jpeg_v3_0_ip_block);
727                 break;
728         default:
729                 return -EINVAL;
730         }
731
732         return 0;
733 }
734
735 static uint32_t nv_get_rev_id(struct amdgpu_device *adev)
736 {
737         return adev->nbio.funcs->get_rev_id(adev);
738 }
739
740 static bool nv_need_full_reset(struct amdgpu_device *adev)
741 {
742         return true;
743 }
744
745 static bool nv_need_reset_on_init(struct amdgpu_device *adev)
746 {
747         u32 sol_reg;
748
749         if (adev->flags & AMD_IS_APU)
750                 return false;
751
752         /* Check sOS sign of life register to confirm sys driver and sOS
753          * are already been loaded.
754          */
755         sol_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81);
756         if (sol_reg)
757                 return true;
758
759         return false;
760 }
761
762 static uint64_t nv_get_pcie_replay_count(struct amdgpu_device *adev)
763 {
764
765         /* TODO
766          * dummy implement for pcie_replay_count sysfs interface
767          * */
768
769         return 0;
770 }
771
772 static void nv_init_doorbell_index(struct amdgpu_device *adev)
773 {
774         adev->doorbell_index.kiq = AMDGPU_NAVI10_DOORBELL_KIQ;
775         adev->doorbell_index.mec_ring0 = AMDGPU_NAVI10_DOORBELL_MEC_RING0;
776         adev->doorbell_index.mec_ring1 = AMDGPU_NAVI10_DOORBELL_MEC_RING1;
777         adev->doorbell_index.mec_ring2 = AMDGPU_NAVI10_DOORBELL_MEC_RING2;
778         adev->doorbell_index.mec_ring3 = AMDGPU_NAVI10_DOORBELL_MEC_RING3;
779         adev->doorbell_index.mec_ring4 = AMDGPU_NAVI10_DOORBELL_MEC_RING4;
780         adev->doorbell_index.mec_ring5 = AMDGPU_NAVI10_DOORBELL_MEC_RING5;
781         adev->doorbell_index.mec_ring6 = AMDGPU_NAVI10_DOORBELL_MEC_RING6;
782         adev->doorbell_index.mec_ring7 = AMDGPU_NAVI10_DOORBELL_MEC_RING7;
783         adev->doorbell_index.userqueue_start = AMDGPU_NAVI10_DOORBELL_USERQUEUE_START;
784         adev->doorbell_index.userqueue_end = AMDGPU_NAVI10_DOORBELL_USERQUEUE_END;
785         adev->doorbell_index.gfx_ring0 = AMDGPU_NAVI10_DOORBELL_GFX_RING0;
786         adev->doorbell_index.gfx_ring1 = AMDGPU_NAVI10_DOORBELL_GFX_RING1;
787         adev->doorbell_index.mes_ring = AMDGPU_NAVI10_DOORBELL_MES_RING;
788         adev->doorbell_index.sdma_engine[0] = AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE0;
789         adev->doorbell_index.sdma_engine[1] = AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE1;
790         adev->doorbell_index.sdma_engine[2] = AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE2;
791         adev->doorbell_index.sdma_engine[3] = AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE3;
792         adev->doorbell_index.ih = AMDGPU_NAVI10_DOORBELL_IH;
793         adev->doorbell_index.vcn.vcn_ring0_1 = AMDGPU_NAVI10_DOORBELL64_VCN0_1;
794         adev->doorbell_index.vcn.vcn_ring2_3 = AMDGPU_NAVI10_DOORBELL64_VCN2_3;
795         adev->doorbell_index.vcn.vcn_ring4_5 = AMDGPU_NAVI10_DOORBELL64_VCN4_5;
796         adev->doorbell_index.vcn.vcn_ring6_7 = AMDGPU_NAVI10_DOORBELL64_VCN6_7;
797         adev->doorbell_index.first_non_cp = AMDGPU_NAVI10_DOORBELL64_FIRST_NON_CP;
798         adev->doorbell_index.last_non_cp = AMDGPU_NAVI10_DOORBELL64_LAST_NON_CP;
799
800         adev->doorbell_index.max_assignment = AMDGPU_NAVI10_DOORBELL_MAX_ASSIGNMENT << 1;
801         adev->doorbell_index.sdma_doorbell_range = 20;
802 }
803
804 static void nv_pre_asic_init(struct amdgpu_device *adev)
805 {
806 }
807
808 static int nv_update_umd_stable_pstate(struct amdgpu_device *adev,
809                                        bool enter)
810 {
811         if (enter)
812                 amdgpu_gfx_rlc_enter_safe_mode(adev);
813         else
814                 amdgpu_gfx_rlc_exit_safe_mode(adev);
815
816         if (adev->gfx.funcs->update_perfmon_mgcg)
817                 adev->gfx.funcs->update_perfmon_mgcg(adev, !enter);
818
819         /*
820          * The ASPM function is not fully enabled and verified on
821          * Navi yet. Temporarily skip this until ASPM enabled.
822          */
823         if ((adev->asic_type >= CHIP_SIENNA_CICHLID) &&
824             !(adev->flags & AMD_IS_APU) &&
825             (adev->nbio.funcs->enable_aspm))
826                 adev->nbio.funcs->enable_aspm(adev, !enter);
827
828         return 0;
829 }
830
831 static const struct amdgpu_asic_funcs nv_asic_funcs =
832 {
833         .read_disabled_bios = &nv_read_disabled_bios,
834         .read_bios_from_rom = &nv_read_bios_from_rom,
835         .read_register = &nv_read_register,
836         .reset = &nv_asic_reset,
837         .reset_method = &nv_asic_reset_method,
838         .set_vga_state = &nv_vga_set_state,
839         .get_xclk = &nv_get_xclk,
840         .set_uvd_clocks = &nv_set_uvd_clocks,
841         .set_vce_clocks = &nv_set_vce_clocks,
842         .get_config_memsize = &nv_get_config_memsize,
843         .init_doorbell_index = &nv_init_doorbell_index,
844         .need_full_reset = &nv_need_full_reset,
845         .need_reset_on_init = &nv_need_reset_on_init,
846         .get_pcie_replay_count = &nv_get_pcie_replay_count,
847         .supports_baco = &nv_asic_supports_baco,
848         .pre_asic_init = &nv_pre_asic_init,
849         .update_umd_stable_pstate = &nv_update_umd_stable_pstate,
850 };
851
852 static int nv_common_early_init(void *handle)
853 {
854 #define MMIO_REG_HOLE_OFFSET (0x80000 - PAGE_SIZE)
855         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
856
857         adev->rmmio_remap.reg_offset = MMIO_REG_HOLE_OFFSET;
858         adev->rmmio_remap.bus_addr = adev->rmmio_base + MMIO_REG_HOLE_OFFSET;
859         adev->smc_rreg = NULL;
860         adev->smc_wreg = NULL;
861         adev->pcie_rreg = &nv_pcie_rreg;
862         adev->pcie_wreg = &nv_pcie_wreg;
863         adev->pcie_rreg64 = &nv_pcie_rreg64;
864         adev->pcie_wreg64 = &nv_pcie_wreg64;
865         adev->pciep_rreg = &nv_pcie_port_rreg;
866         adev->pciep_wreg = &nv_pcie_port_wreg;
867
868         /* TODO: will add them during VCN v2 implementation */
869         adev->uvd_ctx_rreg = NULL;
870         adev->uvd_ctx_wreg = NULL;
871
872         adev->didt_rreg = &nv_didt_rreg;
873         adev->didt_wreg = &nv_didt_wreg;
874
875         adev->asic_funcs = &nv_asic_funcs;
876
877         adev->rev_id = nv_get_rev_id(adev);
878         adev->external_rev_id = 0xff;
879         switch (adev->asic_type) {
880         case CHIP_NAVI10:
881                 adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
882                         AMD_CG_SUPPORT_GFX_CGCG |
883                         AMD_CG_SUPPORT_IH_CG |
884                         AMD_CG_SUPPORT_HDP_MGCG |
885                         AMD_CG_SUPPORT_HDP_LS |
886                         AMD_CG_SUPPORT_SDMA_MGCG |
887                         AMD_CG_SUPPORT_SDMA_LS |
888                         AMD_CG_SUPPORT_MC_MGCG |
889                         AMD_CG_SUPPORT_MC_LS |
890                         AMD_CG_SUPPORT_ATHUB_MGCG |
891                         AMD_CG_SUPPORT_ATHUB_LS |
892                         AMD_CG_SUPPORT_VCN_MGCG |
893                         AMD_CG_SUPPORT_JPEG_MGCG |
894                         AMD_CG_SUPPORT_BIF_MGCG |
895                         AMD_CG_SUPPORT_BIF_LS;
896                 adev->pg_flags = AMD_PG_SUPPORT_VCN |
897                         AMD_PG_SUPPORT_VCN_DPG |
898                         AMD_PG_SUPPORT_JPEG |
899                         AMD_PG_SUPPORT_ATHUB;
900                 adev->external_rev_id = adev->rev_id + 0x1;
901                 break;
902         case CHIP_NAVI14:
903                 adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
904                         AMD_CG_SUPPORT_GFX_CGCG |
905                         AMD_CG_SUPPORT_IH_CG |
906                         AMD_CG_SUPPORT_HDP_MGCG |
907                         AMD_CG_SUPPORT_HDP_LS |
908                         AMD_CG_SUPPORT_SDMA_MGCG |
909                         AMD_CG_SUPPORT_SDMA_LS |
910                         AMD_CG_SUPPORT_MC_MGCG |
911                         AMD_CG_SUPPORT_MC_LS |
912                         AMD_CG_SUPPORT_ATHUB_MGCG |
913                         AMD_CG_SUPPORT_ATHUB_LS |
914                         AMD_CG_SUPPORT_VCN_MGCG |
915                         AMD_CG_SUPPORT_JPEG_MGCG |
916                         AMD_CG_SUPPORT_BIF_MGCG |
917                         AMD_CG_SUPPORT_BIF_LS;
918                 adev->pg_flags = AMD_PG_SUPPORT_VCN |
919                         AMD_PG_SUPPORT_JPEG |
920                         AMD_PG_SUPPORT_VCN_DPG;
921                 adev->external_rev_id = adev->rev_id + 20;
922                 break;
923         case CHIP_NAVI12:
924                 adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
925                         AMD_CG_SUPPORT_GFX_MGLS |
926                         AMD_CG_SUPPORT_GFX_CGCG |
927                         AMD_CG_SUPPORT_GFX_CP_LS |
928                         AMD_CG_SUPPORT_GFX_RLC_LS |
929                         AMD_CG_SUPPORT_IH_CG |
930                         AMD_CG_SUPPORT_HDP_MGCG |
931                         AMD_CG_SUPPORT_HDP_LS |
932                         AMD_CG_SUPPORT_SDMA_MGCG |
933                         AMD_CG_SUPPORT_SDMA_LS |
934                         AMD_CG_SUPPORT_MC_MGCG |
935                         AMD_CG_SUPPORT_MC_LS |
936                         AMD_CG_SUPPORT_ATHUB_MGCG |
937                         AMD_CG_SUPPORT_ATHUB_LS |
938                         AMD_CG_SUPPORT_VCN_MGCG |
939                         AMD_CG_SUPPORT_JPEG_MGCG;
940                 adev->pg_flags = AMD_PG_SUPPORT_VCN |
941                         AMD_PG_SUPPORT_VCN_DPG |
942                         AMD_PG_SUPPORT_JPEG |
943                         AMD_PG_SUPPORT_ATHUB;
944                 /* guest vm gets 0xffffffff when reading RCC_DEV0_EPF0_STRAP0,
945                  * as a consequence, the rev_id and external_rev_id are wrong.
946                  * workaround it by hardcoding rev_id to 0 (default value).
947                  */
948                 if (amdgpu_sriov_vf(adev))
949                         adev->rev_id = 0;
950                 adev->external_rev_id = adev->rev_id + 0xa;
951                 break;
952         case CHIP_SIENNA_CICHLID:
953                 adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
954                         AMD_CG_SUPPORT_GFX_CGCG |
955                         AMD_CG_SUPPORT_GFX_3D_CGCG |
956                         AMD_CG_SUPPORT_MC_MGCG |
957                         AMD_CG_SUPPORT_VCN_MGCG |
958                         AMD_CG_SUPPORT_JPEG_MGCG |
959                         AMD_CG_SUPPORT_HDP_MGCG |
960                         AMD_CG_SUPPORT_HDP_LS |
961                         AMD_CG_SUPPORT_IH_CG |
962                         AMD_CG_SUPPORT_MC_LS;
963                 adev->pg_flags = AMD_PG_SUPPORT_VCN |
964                         AMD_PG_SUPPORT_VCN_DPG |
965                         AMD_PG_SUPPORT_JPEG |
966                         AMD_PG_SUPPORT_ATHUB |
967                         AMD_PG_SUPPORT_MMHUB;
968                 if (amdgpu_sriov_vf(adev)) {
969                         /* hypervisor control CG and PG enablement */
970                         adev->cg_flags = 0;
971                         adev->pg_flags = 0;
972                 }
973                 adev->external_rev_id = adev->rev_id + 0x28;
974                 break;
975         case CHIP_NAVY_FLOUNDER:
976                 adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
977                         AMD_CG_SUPPORT_GFX_CGCG |
978                         AMD_CG_SUPPORT_GFX_3D_CGCG |
979                         AMD_CG_SUPPORT_VCN_MGCG |
980                         AMD_CG_SUPPORT_JPEG_MGCG |
981                         AMD_CG_SUPPORT_MC_MGCG |
982                         AMD_CG_SUPPORT_MC_LS |
983                         AMD_CG_SUPPORT_HDP_MGCG |
984                         AMD_CG_SUPPORT_HDP_LS |
985                         AMD_CG_SUPPORT_IH_CG;
986                 adev->pg_flags = AMD_PG_SUPPORT_VCN |
987                         AMD_PG_SUPPORT_VCN_DPG |
988                         AMD_PG_SUPPORT_JPEG |
989                         AMD_PG_SUPPORT_ATHUB |
990                         AMD_PG_SUPPORT_MMHUB;
991                 adev->external_rev_id = adev->rev_id + 0x32;
992                 break;
993
994         case CHIP_VANGOGH:
995                 adev->apu_flags |= AMD_APU_IS_VANGOGH;
996                 adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
997                         AMD_CG_SUPPORT_GFX_MGLS |
998                         AMD_CG_SUPPORT_GFX_CP_LS |
999                         AMD_CG_SUPPORT_GFX_RLC_LS |
1000                         AMD_CG_SUPPORT_GFX_CGCG |
1001                         AMD_CG_SUPPORT_GFX_CGLS |
1002                         AMD_CG_SUPPORT_GFX_3D_CGCG |
1003                         AMD_CG_SUPPORT_GFX_3D_CGLS |
1004                         AMD_CG_SUPPORT_MC_MGCG |
1005                         AMD_CG_SUPPORT_MC_LS |
1006                         AMD_CG_SUPPORT_GFX_FGCG |
1007                         AMD_CG_SUPPORT_VCN_MGCG |
1008                         AMD_CG_SUPPORT_JPEG_MGCG;
1009                 adev->pg_flags = AMD_PG_SUPPORT_GFX_PG |
1010                         AMD_PG_SUPPORT_VCN |
1011                         AMD_PG_SUPPORT_VCN_DPG |
1012                         AMD_PG_SUPPORT_JPEG;
1013                 if (adev->apu_flags & AMD_APU_IS_VANGOGH)
1014                         adev->external_rev_id = adev->rev_id + 0x01;
1015                 break;
1016         case CHIP_DIMGREY_CAVEFISH:
1017                 adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
1018                         AMD_CG_SUPPORT_GFX_CGCG |
1019                         AMD_CG_SUPPORT_GFX_3D_CGCG |
1020                         AMD_CG_SUPPORT_VCN_MGCG |
1021                         AMD_CG_SUPPORT_JPEG_MGCG |
1022                         AMD_CG_SUPPORT_MC_MGCG |
1023                         AMD_CG_SUPPORT_MC_LS |
1024                         AMD_CG_SUPPORT_HDP_MGCG |
1025                         AMD_CG_SUPPORT_HDP_LS |
1026                         AMD_CG_SUPPORT_IH_CG;
1027                 adev->pg_flags = AMD_PG_SUPPORT_VCN |
1028                         AMD_PG_SUPPORT_VCN_DPG |
1029                         AMD_PG_SUPPORT_JPEG |
1030                         AMD_PG_SUPPORT_ATHUB |
1031                         AMD_PG_SUPPORT_MMHUB;
1032                 adev->external_rev_id = adev->rev_id + 0x3c;
1033                 break;
1034         default:
1035                 /* FIXME: not supported yet */
1036                 return -EINVAL;
1037         }
1038
1039         if (amdgpu_sriov_vf(adev)) {
1040                 amdgpu_virt_init_setting(adev);
1041                 xgpu_nv_mailbox_set_irq_funcs(adev);
1042         }
1043
1044         return 0;
1045 }
1046
1047 static int nv_common_late_init(void *handle)
1048 {
1049         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1050
1051         if (amdgpu_sriov_vf(adev))
1052                 xgpu_nv_mailbox_get_irq(adev);
1053
1054         return 0;
1055 }
1056
1057 static int nv_common_sw_init(void *handle)
1058 {
1059         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1060
1061         if (amdgpu_sriov_vf(adev))
1062                 xgpu_nv_mailbox_add_irq_id(adev);
1063
1064         return 0;
1065 }
1066
1067 static int nv_common_sw_fini(void *handle)
1068 {
1069         return 0;
1070 }
1071
1072 static int nv_common_hw_init(void *handle)
1073 {
1074         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1075
1076         /* enable pcie gen2/3 link */
1077         nv_pcie_gen3_enable(adev);
1078         /* enable aspm */
1079         nv_program_aspm(adev);
1080         /* setup nbio registers */
1081         adev->nbio.funcs->init_registers(adev);
1082         /* remap HDP registers to a hole in mmio space,
1083          * for the purpose of expose those registers
1084          * to process space
1085          */
1086         if (adev->nbio.funcs->remap_hdp_registers)
1087                 adev->nbio.funcs->remap_hdp_registers(adev);
1088         /* enable the doorbell aperture */
1089         nv_enable_doorbell_aperture(adev, true);
1090
1091         return 0;
1092 }
1093
1094 static int nv_common_hw_fini(void *handle)
1095 {
1096         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1097
1098         /* disable the doorbell aperture */
1099         nv_enable_doorbell_aperture(adev, false);
1100
1101         return 0;
1102 }
1103
1104 static int nv_common_suspend(void *handle)
1105 {
1106         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1107
1108         return nv_common_hw_fini(adev);
1109 }
1110
1111 static int nv_common_resume(void *handle)
1112 {
1113         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1114
1115         return nv_common_hw_init(adev);
1116 }
1117
1118 static bool nv_common_is_idle(void *handle)
1119 {
1120         return true;
1121 }
1122
1123 static int nv_common_wait_for_idle(void *handle)
1124 {
1125         return 0;
1126 }
1127
1128 static int nv_common_soft_reset(void *handle)
1129 {
1130         return 0;
1131 }
1132
1133 static int nv_common_set_clockgating_state(void *handle,
1134                                            enum amd_clockgating_state state)
1135 {
1136         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1137
1138         if (amdgpu_sriov_vf(adev))
1139                 return 0;
1140
1141         switch (adev->asic_type) {
1142         case CHIP_NAVI10:
1143         case CHIP_NAVI14:
1144         case CHIP_NAVI12:
1145         case CHIP_SIENNA_CICHLID:
1146         case CHIP_NAVY_FLOUNDER:
1147         case CHIP_DIMGREY_CAVEFISH:
1148                 adev->nbio.funcs->update_medium_grain_clock_gating(adev,
1149                                 state == AMD_CG_STATE_GATE);
1150                 adev->nbio.funcs->update_medium_grain_light_sleep(adev,
1151                                 state == AMD_CG_STATE_GATE);
1152                 adev->hdp.funcs->update_clock_gating(adev,
1153                                 state == AMD_CG_STATE_GATE);
1154                 adev->smuio.funcs->update_rom_clock_gating(adev,
1155                                 state == AMD_CG_STATE_GATE);
1156                 break;
1157         default:
1158                 break;
1159         }
1160         return 0;
1161 }
1162
1163 static int nv_common_set_powergating_state(void *handle,
1164                                            enum amd_powergating_state state)
1165 {
1166         /* TODO */
1167         return 0;
1168 }
1169
1170 static void nv_common_get_clockgating_state(void *handle, u32 *flags)
1171 {
1172         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1173
1174         if (amdgpu_sriov_vf(adev))
1175                 *flags = 0;
1176
1177         adev->nbio.funcs->get_clockgating_state(adev, flags);
1178
1179         adev->hdp.funcs->get_clock_gating_state(adev, flags);
1180
1181         adev->smuio.funcs->get_clock_gating_state(adev, flags);
1182
1183         return;
1184 }
1185
1186 static const struct amd_ip_funcs nv_common_ip_funcs = {
1187         .name = "nv_common",
1188         .early_init = nv_common_early_init,
1189         .late_init = nv_common_late_init,
1190         .sw_init = nv_common_sw_init,
1191         .sw_fini = nv_common_sw_fini,
1192         .hw_init = nv_common_hw_init,
1193         .hw_fini = nv_common_hw_fini,
1194         .suspend = nv_common_suspend,
1195         .resume = nv_common_resume,
1196         .is_idle = nv_common_is_idle,
1197         .wait_for_idle = nv_common_wait_for_idle,
1198         .soft_reset = nv_common_soft_reset,
1199         .set_clockgating_state = nv_common_set_clockgating_state,
1200         .set_powergating_state = nv_common_set_powergating_state,
1201         .get_clockgating_state = nv_common_get_clockgating_state,
1202 };