Merge branch 'drm-next-4.2-amdgpu' of git://people.freedesktop.org/~agd5f/linux into...
[cascardo/linux.git] / drivers / gpu / drm / amd / amdgpu / gmc_v8_0.c
1 /*
2  * Copyright 2014 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 "drmP.h"
25 #include "amdgpu.h"
26 #include "gmc_v8_0.h"
27 #include "amdgpu_ucode.h"
28
29 #include "gmc/gmc_8_1_d.h"
30 #include "gmc/gmc_8_1_sh_mask.h"
31
32 #include "bif/bif_5_0_d.h"
33 #include "bif/bif_5_0_sh_mask.h"
34
35 #include "oss/oss_3_0_d.h"
36 #include "oss/oss_3_0_sh_mask.h"
37
38 #include "vid.h"
39 #include "vi.h"
40
41
42 static void gmc_v8_0_set_gart_funcs(struct amdgpu_device *adev);
43 static void gmc_v8_0_set_irq_funcs(struct amdgpu_device *adev);
44
45 MODULE_FIRMWARE("amdgpu/topaz_mc.bin");
46 MODULE_FIRMWARE("amdgpu/tonga_mc.bin");
47
48 static const u32 golden_settings_tonga_a11[] =
49 {
50         mmMC_ARB_WTM_GRPWT_RD, 0x00000003, 0x00000000,
51         mmMC_HUB_RDREQ_DMIF_LIMIT, 0x0000007f, 0x00000028,
52         mmMC_HUB_WDP_UMC, 0x00007fb6, 0x00000991,
53         mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0x0fffffff,
54         mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
55         mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
56         mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
57 };
58
59 static const u32 tonga_mgcg_cgcg_init[] =
60 {
61         mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104
62 };
63
64 static const u32 golden_settings_iceland_a11[] =
65 {
66         mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0x0fffffff,
67         mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
68         mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
69         mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff
70 };
71
72 static const u32 iceland_mgcg_cgcg_init[] =
73 {
74         mmMC_MEM_POWER_LS, 0xffffffff,        0x00000104
75 };
76
77 static const u32 cz_mgcg_cgcg_init[] =
78 {
79         mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104
80 };
81
82 static void gmc_v8_0_init_golden_registers(struct amdgpu_device *adev)
83 {
84         switch (adev->asic_type) {
85         case CHIP_TOPAZ:
86                 amdgpu_program_register_sequence(adev,
87                                                  iceland_mgcg_cgcg_init,
88                                                  (const u32)ARRAY_SIZE(iceland_mgcg_cgcg_init));
89                 amdgpu_program_register_sequence(adev,
90                                                  golden_settings_iceland_a11,
91                                                  (const u32)ARRAY_SIZE(golden_settings_iceland_a11));
92                 break;
93         case CHIP_TONGA:
94                 amdgpu_program_register_sequence(adev,
95                                                  tonga_mgcg_cgcg_init,
96                                                  (const u32)ARRAY_SIZE(tonga_mgcg_cgcg_init));
97                 amdgpu_program_register_sequence(adev,
98                                                  golden_settings_tonga_a11,
99                                                  (const u32)ARRAY_SIZE(golden_settings_tonga_a11));
100                 break;
101         case CHIP_CARRIZO:
102                 amdgpu_program_register_sequence(adev,
103                                                  cz_mgcg_cgcg_init,
104                                                  (const u32)ARRAY_SIZE(cz_mgcg_cgcg_init));
105                 break;
106         default:
107                 break;
108         }
109 }
110
111 /**
112  * gmc8_mc_wait_for_idle - wait for MC idle callback.
113  *
114  * @adev: amdgpu_device pointer
115  *
116  * Wait for the MC (memory controller) to be idle.
117  * (evergreen+).
118  * Returns 0 if the MC is idle, -1 if not.
119  */
120 int gmc_v8_0_mc_wait_for_idle(struct amdgpu_device *adev)
121 {
122         unsigned i;
123         u32 tmp;
124
125         for (i = 0; i < adev->usec_timeout; i++) {
126                 /* read MC_STATUS */
127                 tmp = RREG32(mmSRBM_STATUS) & (SRBM_STATUS__VMC_BUSY_MASK |
128                                                SRBM_STATUS__MCB_BUSY_MASK |
129                                                SRBM_STATUS__MCB_NON_DISPLAY_BUSY_MASK |
130                                                SRBM_STATUS__MCC_BUSY_MASK |
131                                                SRBM_STATUS__MCD_BUSY_MASK |
132                                                SRBM_STATUS__VMC1_BUSY_MASK);
133                 if (!tmp)
134                         return 0;
135                 udelay(1);
136         }
137         return -1;
138 }
139
140 void gmc_v8_0_mc_stop(struct amdgpu_device *adev,
141                       struct amdgpu_mode_mc_save *save)
142 {
143         u32 blackout;
144
145         if (adev->mode_info.num_crtc)
146                 amdgpu_display_stop_mc_access(adev, save);
147
148         amdgpu_asic_wait_for_mc_idle(adev);
149
150         blackout = RREG32(mmMC_SHARED_BLACKOUT_CNTL);
151         if (REG_GET_FIELD(blackout, MC_SHARED_BLACKOUT_CNTL, BLACKOUT_MODE) != 1) {
152                 /* Block CPU access */
153                 WREG32(mmBIF_FB_EN, 0);
154                 /* blackout the MC */
155                 blackout = REG_SET_FIELD(blackout,
156                                          MC_SHARED_BLACKOUT_CNTL, BLACKOUT_MODE, 1);
157                 WREG32(mmMC_SHARED_BLACKOUT_CNTL, blackout);
158         }
159         /* wait for the MC to settle */
160         udelay(100);
161 }
162
163 void gmc_v8_0_mc_resume(struct amdgpu_device *adev,
164                         struct amdgpu_mode_mc_save *save)
165 {
166         u32 tmp;
167
168         /* unblackout the MC */
169         tmp = RREG32(mmMC_SHARED_BLACKOUT_CNTL);
170         tmp = REG_SET_FIELD(tmp, MC_SHARED_BLACKOUT_CNTL, BLACKOUT_MODE, 0);
171         WREG32(mmMC_SHARED_BLACKOUT_CNTL, tmp);
172         /* allow CPU access */
173         tmp = REG_SET_FIELD(0, BIF_FB_EN, FB_READ_EN, 1);
174         tmp = REG_SET_FIELD(tmp, BIF_FB_EN, FB_WRITE_EN, 1);
175         WREG32(mmBIF_FB_EN, tmp);
176
177         if (adev->mode_info.num_crtc)
178                 amdgpu_display_resume_mc_access(adev, save);
179 }
180
181 /**
182  * gmc_v8_0_init_microcode - load ucode images from disk
183  *
184  * @adev: amdgpu_device pointer
185  *
186  * Use the firmware interface to load the ucode images into
187  * the driver (not loaded into hw).
188  * Returns 0 on success, error on failure.
189  */
190 static int gmc_v8_0_init_microcode(struct amdgpu_device *adev)
191 {
192         const char *chip_name;
193         char fw_name[30];
194         int err;
195
196         DRM_DEBUG("\n");
197
198         switch (adev->asic_type) {
199         case CHIP_TOPAZ:
200                 chip_name = "topaz";
201                 break;
202         case CHIP_TONGA:
203                 chip_name = "tonga";
204                 break;
205         case CHIP_CARRIZO:
206                 return 0;
207         default: BUG();
208         }
209
210         snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", chip_name);
211         err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
212         if (err)
213                 goto out;
214         err = amdgpu_ucode_validate(adev->mc.fw);
215
216 out:
217         if (err) {
218                 printk(KERN_ERR
219                        "mc: Failed to load firmware \"%s\"\n",
220                        fw_name);
221                 release_firmware(adev->mc.fw);
222                 adev->mc.fw = NULL;
223         }
224         return err;
225 }
226
227 /**
228  * gmc_v8_0_mc_load_microcode - load MC ucode into the hw
229  *
230  * @adev: amdgpu_device pointer
231  *
232  * Load the GDDR MC ucode into the hw (CIK).
233  * Returns 0 on success, error on failure.
234  */
235 static int gmc_v8_0_mc_load_microcode(struct amdgpu_device *adev)
236 {
237         const struct mc_firmware_header_v1_0 *hdr;
238         const __le32 *fw_data = NULL;
239         const __le32 *io_mc_regs = NULL;
240         u32 running, blackout = 0;
241         int i, ucode_size, regs_size;
242
243         if (!adev->mc.fw)
244                 return -EINVAL;
245
246         hdr = (const struct mc_firmware_header_v1_0 *)adev->mc.fw->data;
247         amdgpu_ucode_print_mc_hdr(&hdr->header);
248
249         adev->mc.fw_version = le32_to_cpu(hdr->header.ucode_version);
250         regs_size = le32_to_cpu(hdr->io_debug_size_bytes) / (4 * 2);
251         io_mc_regs = (const __le32 *)
252                 (adev->mc.fw->data + le32_to_cpu(hdr->io_debug_array_offset_bytes));
253         ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
254         fw_data = (const __le32 *)
255                 (adev->mc.fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
256
257         running = REG_GET_FIELD(RREG32(mmMC_SEQ_SUP_CNTL), MC_SEQ_SUP_CNTL, RUN);
258
259         if (running == 0) {
260                 if (running) {
261                         blackout = RREG32(mmMC_SHARED_BLACKOUT_CNTL);
262                         WREG32(mmMC_SHARED_BLACKOUT_CNTL, blackout | 1);
263                 }
264
265                 /* reset the engine and set to writable */
266                 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000008);
267                 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000010);
268
269                 /* load mc io regs */
270                 for (i = 0; i < regs_size; i++) {
271                         WREG32(mmMC_SEQ_IO_DEBUG_INDEX, le32_to_cpup(io_mc_regs++));
272                         WREG32(mmMC_SEQ_IO_DEBUG_DATA, le32_to_cpup(io_mc_regs++));
273                 }
274                 /* load the MC ucode */
275                 for (i = 0; i < ucode_size; i++)
276                         WREG32(mmMC_SEQ_SUP_PGM, le32_to_cpup(fw_data++));
277
278                 /* put the engine back into the active state */
279                 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000008);
280                 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000004);
281                 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000001);
282
283                 /* wait for training to complete */
284                 for (i = 0; i < adev->usec_timeout; i++) {
285                         if (REG_GET_FIELD(RREG32(mmMC_SEQ_TRAIN_WAKEUP_CNTL),
286                                           MC_SEQ_TRAIN_WAKEUP_CNTL, TRAIN_DONE_D0))
287                                 break;
288                         udelay(1);
289                 }
290                 for (i = 0; i < adev->usec_timeout; i++) {
291                         if (REG_GET_FIELD(RREG32(mmMC_SEQ_TRAIN_WAKEUP_CNTL),
292                                           MC_SEQ_TRAIN_WAKEUP_CNTL, TRAIN_DONE_D1))
293                                 break;
294                         udelay(1);
295                 }
296
297                 if (running)
298                         WREG32(mmMC_SHARED_BLACKOUT_CNTL, blackout);
299         }
300
301         return 0;
302 }
303
304 static void gmc_v8_0_vram_gtt_location(struct amdgpu_device *adev,
305                                        struct amdgpu_mc *mc)
306 {
307         if (mc->mc_vram_size > 0xFFC0000000ULL) {
308                 /* leave room for at least 1024M GTT */
309                 dev_warn(adev->dev, "limiting VRAM\n");
310                 mc->real_vram_size = 0xFFC0000000ULL;
311                 mc->mc_vram_size = 0xFFC0000000ULL;
312         }
313         amdgpu_vram_location(adev, &adev->mc, 0);
314         adev->mc.gtt_base_align = 0;
315         amdgpu_gtt_location(adev, mc);
316 }
317
318 /**
319  * gmc_v8_0_mc_program - program the GPU memory controller
320  *
321  * @adev: amdgpu_device pointer
322  *
323  * Set the location of vram, gart, and AGP in the GPU's
324  * physical address space (CIK).
325  */
326 static void gmc_v8_0_mc_program(struct amdgpu_device *adev)
327 {
328         struct amdgpu_mode_mc_save save;
329         u32 tmp;
330         int i, j;
331
332         /* Initialize HDP */
333         for (i = 0, j = 0; i < 32; i++, j += 0x6) {
334                 WREG32((0xb05 + j), 0x00000000);
335                 WREG32((0xb06 + j), 0x00000000);
336                 WREG32((0xb07 + j), 0x00000000);
337                 WREG32((0xb08 + j), 0x00000000);
338                 WREG32((0xb09 + j), 0x00000000);
339         }
340         WREG32(mmHDP_REG_COHERENCY_FLUSH_CNTL, 0);
341
342         if (adev->mode_info.num_crtc)
343                 amdgpu_display_set_vga_render_state(adev, false);
344
345         gmc_v8_0_mc_stop(adev, &save);
346         if (amdgpu_asic_wait_for_mc_idle(adev)) {
347                 dev_warn(adev->dev, "Wait for MC idle timedout !\n");
348         }
349         /* Update configuration */
350         WREG32(mmMC_VM_SYSTEM_APERTURE_LOW_ADDR,
351                adev->mc.vram_start >> 12);
352         WREG32(mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR,
353                adev->mc.vram_end >> 12);
354         WREG32(mmMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
355                adev->vram_scratch.gpu_addr >> 12);
356         tmp = ((adev->mc.vram_end >> 24) & 0xFFFF) << 16;
357         tmp |= ((adev->mc.vram_start >> 24) & 0xFFFF);
358         WREG32(mmMC_VM_FB_LOCATION, tmp);
359         /* XXX double check these! */
360         WREG32(mmHDP_NONSURFACE_BASE, (adev->mc.vram_start >> 8));
361         WREG32(mmHDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
362         WREG32(mmHDP_NONSURFACE_SIZE, 0x3FFFFFFF);
363         WREG32(mmMC_VM_AGP_BASE, 0);
364         WREG32(mmMC_VM_AGP_TOP, 0x0FFFFFFF);
365         WREG32(mmMC_VM_AGP_BOT, 0x0FFFFFFF);
366         if (amdgpu_asic_wait_for_mc_idle(adev)) {
367                 dev_warn(adev->dev, "Wait for MC idle timedout !\n");
368         }
369         gmc_v8_0_mc_resume(adev, &save);
370
371         WREG32(mmBIF_FB_EN, BIF_FB_EN__FB_READ_EN_MASK | BIF_FB_EN__FB_WRITE_EN_MASK);
372
373         tmp = RREG32(mmHDP_MISC_CNTL);
374         tmp = REG_SET_FIELD(tmp, HDP_MISC_CNTL, FLUSH_INVALIDATE_CACHE, 1);
375         WREG32(mmHDP_MISC_CNTL, tmp);
376
377         tmp = RREG32(mmHDP_HOST_PATH_CNTL);
378         WREG32(mmHDP_HOST_PATH_CNTL, tmp);
379 }
380
381 /**
382  * gmc_v8_0_mc_init - initialize the memory controller driver params
383  *
384  * @adev: amdgpu_device pointer
385  *
386  * Look up the amount of vram, vram width, and decide how to place
387  * vram and gart within the GPU's physical address space (CIK).
388  * Returns 0 for success.
389  */
390 static int gmc_v8_0_mc_init(struct amdgpu_device *adev)
391 {
392         u32 tmp;
393         int chansize, numchan;
394
395         /* Get VRAM informations */
396         tmp = RREG32(mmMC_ARB_RAMCFG);
397         if (REG_GET_FIELD(tmp, MC_ARB_RAMCFG, CHANSIZE)) {
398                 chansize = 64;
399         } else {
400                 chansize = 32;
401         }
402         tmp = RREG32(mmMC_SHARED_CHMAP);
403         switch (REG_GET_FIELD(tmp, MC_SHARED_CHMAP, NOOFCHAN)) {
404         case 0:
405         default:
406                 numchan = 1;
407                 break;
408         case 1:
409                 numchan = 2;
410                 break;
411         case 2:
412                 numchan = 4;
413                 break;
414         case 3:
415                 numchan = 8;
416                 break;
417         case 4:
418                 numchan = 3;
419                 break;
420         case 5:
421                 numchan = 6;
422                 break;
423         case 6:
424                 numchan = 10;
425                 break;
426         case 7:
427                 numchan = 12;
428                 break;
429         case 8:
430                 numchan = 16;
431                 break;
432         }
433         adev->mc.vram_width = numchan * chansize;
434         /* Could aper size report 0 ? */
435         adev->mc.aper_base = pci_resource_start(adev->pdev, 0);
436         adev->mc.aper_size = pci_resource_len(adev->pdev, 0);
437         /* size in MB on si */
438         adev->mc.mc_vram_size = RREG32(mmCONFIG_MEMSIZE) * 1024ULL * 1024ULL;
439         adev->mc.real_vram_size = RREG32(mmCONFIG_MEMSIZE) * 1024ULL * 1024ULL;
440         adev->mc.visible_vram_size = adev->mc.aper_size;
441
442         /* unless the user had overridden it, set the gart
443          * size equal to the 1024 or vram, whichever is larger.
444          */
445         if (amdgpu_gart_size == -1)
446                 adev->mc.gtt_size = max((1024ULL << 20), adev->mc.mc_vram_size);
447         else
448                 adev->mc.gtt_size = (uint64_t)amdgpu_gart_size << 20;
449
450         gmc_v8_0_vram_gtt_location(adev, &adev->mc);
451
452         return 0;
453 }
454
455 /*
456  * GART
457  * VMID 0 is the physical GPU addresses as used by the kernel.
458  * VMIDs 1-15 are used for userspace clients and are handled
459  * by the amdgpu vm/hsa code.
460  */
461
462 /**
463  * gmc_v8_0_gart_flush_gpu_tlb - gart tlb flush callback
464  *
465  * @adev: amdgpu_device pointer
466  * @vmid: vm instance to flush
467  *
468  * Flush the TLB for the requested page table (CIK).
469  */
470 static void gmc_v8_0_gart_flush_gpu_tlb(struct amdgpu_device *adev,
471                                         uint32_t vmid)
472 {
473         /* flush hdp cache */
474         WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 0);
475
476         /* bits 0-15 are the VM contexts0-15 */
477         WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
478 }
479
480 /**
481  * gmc_v8_0_gart_set_pte_pde - update the page tables using MMIO
482  *
483  * @adev: amdgpu_device pointer
484  * @cpu_pt_addr: cpu address of the page table
485  * @gpu_page_idx: entry in the page table to update
486  * @addr: dst addr to write into pte/pde
487  * @flags: access flags
488  *
489  * Update the page tables using the CPU.
490  */
491 static int gmc_v8_0_gart_set_pte_pde(struct amdgpu_device *adev,
492                                      void *cpu_pt_addr,
493                                      uint32_t gpu_page_idx,
494                                      uint64_t addr,
495                                      uint32_t flags)
496 {
497         void __iomem *ptr = (void *)cpu_pt_addr;
498         uint64_t value;
499
500         /*
501          * PTE format on VI:
502          * 63:40 reserved
503          * 39:12 4k physical page base address
504          * 11:7 fragment
505          * 6 write
506          * 5 read
507          * 4 exe
508          * 3 reserved
509          * 2 snooped
510          * 1 system
511          * 0 valid
512          *
513          * PDE format on VI:
514          * 63:59 block fragment size
515          * 58:40 reserved
516          * 39:1 physical base address of PTE
517          * bits 5:1 must be 0.
518          * 0 valid
519          */
520         value = addr & 0x000000FFFFFFF000ULL;
521         value |= flags;
522         writeq(value, ptr + (gpu_page_idx * 8));
523
524         return 0;
525 }
526
527 /**
528  * gmc_v8_0_gart_enable - gart enable
529  *
530  * @adev: amdgpu_device pointer
531  *
532  * This sets up the TLBs, programs the page tables for VMID0,
533  * sets up the hw for VMIDs 1-15 which are allocated on
534  * demand, and sets up the global locations for the LDS, GDS,
535  * and GPUVM for FSA64 clients (CIK).
536  * Returns 0 for success, errors for failure.
537  */
538 static int gmc_v8_0_gart_enable(struct amdgpu_device *adev)
539 {
540         int r, i;
541         u32 tmp;
542
543         if (adev->gart.robj == NULL) {
544                 dev_err(adev->dev, "No VRAM object for PCIE GART.\n");
545                 return -EINVAL;
546         }
547         r = amdgpu_gart_table_vram_pin(adev);
548         if (r)
549                 return r;
550         /* Setup TLB control */
551         tmp = RREG32(mmMC_VM_MX_L1_TLB_CNTL);
552         tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_TLB, 1);
553         tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING, 1);
554         tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE, 3);
555         tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ENABLE_ADVANCED_DRIVER_MODEL, 1);
556         tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
557         WREG32(mmMC_VM_MX_L1_TLB_CNTL, tmp);
558         /* Setup L2 cache */
559         tmp = RREG32(mmVM_L2_CNTL);
560         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, 1);
561         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING, 1);
562         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE, 1);
563         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE, 1);
564         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, EFFECTIVE_L2_QUEUE_SIZE, 7);
565         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, CONTEXT1_IDENTITY_ACCESS_MODE, 1);
566         WREG32(mmVM_L2_CNTL, tmp);
567         tmp = RREG32(mmVM_L2_CNTL2);
568         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS, 1);
569         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL2, INVALIDATE_L2_CACHE, 1);
570         WREG32(mmVM_L2_CNTL2, tmp);
571         tmp = RREG32(mmVM_L2_CNTL3);
572         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY, 1);
573         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 4);
574         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, L2_CACHE_BIGK_FRAGMENT_SIZE, 4);
575         WREG32(mmVM_L2_CNTL3, tmp);
576         /* XXX: set to enable PTE/PDE in system memory */
577         tmp = RREG32(mmVM_L2_CNTL4);
578         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT0_PDE_REQUEST_PHYSICAL, 0);
579         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT0_PDE_REQUEST_SHARED, 0);
580         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT0_PDE_REQUEST_SNOOP, 0);
581         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT0_PTE_REQUEST_PHYSICAL, 0);
582         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT0_PTE_REQUEST_SHARED, 0);
583         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT0_PTE_REQUEST_SNOOP, 0);
584         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT1_PDE_REQUEST_PHYSICAL, 0);
585         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT1_PDE_REQUEST_SHARED, 0);
586         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT1_PDE_REQUEST_SNOOP, 0);
587         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT1_PTE_REQUEST_PHYSICAL, 0);
588         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT1_PTE_REQUEST_SHARED, 0);
589         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT1_PTE_REQUEST_SNOOP, 0);
590         WREG32(mmVM_L2_CNTL4, tmp);
591         /* setup context0 */
592         WREG32(mmVM_CONTEXT0_PAGE_TABLE_START_ADDR, adev->mc.gtt_start >> 12);
593         WREG32(mmVM_CONTEXT0_PAGE_TABLE_END_ADDR, (adev->mc.gtt_end >> 12) - 1);
594         WREG32(mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR, adev->gart.table_addr >> 12);
595         WREG32(mmVM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
596                         (u32)(adev->dummy_page.addr >> 12));
597         WREG32(mmVM_CONTEXT0_CNTL2, 0);
598         tmp = RREG32(mmVM_CONTEXT0_CNTL);
599         tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, ENABLE_CONTEXT, 1);
600         tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, PAGE_TABLE_DEPTH, 0);
601         tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
602         WREG32(mmVM_CONTEXT0_CNTL, tmp);
603
604         WREG32(mmVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR, 0);
605         WREG32(mmVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR, 0);
606         WREG32(mmVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET, 0);
607
608         /* empty context1-15 */
609         /* FIXME start with 4G, once using 2 level pt switch to full
610          * vm size space
611          */
612         /* set vm size, must be a multiple of 4 */
613         WREG32(mmVM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
614         WREG32(mmVM_CONTEXT1_PAGE_TABLE_END_ADDR, adev->vm_manager.max_pfn - 1);
615         for (i = 1; i < 16; i++) {
616                 if (i < 8)
617                         WREG32(mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR + i,
618                                adev->gart.table_addr >> 12);
619                 else
620                         WREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + i - 8,
621                                adev->gart.table_addr >> 12);
622         }
623
624         /* enable context1-15 */
625         WREG32(mmVM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
626                (u32)(adev->dummy_page.addr >> 12));
627         WREG32(mmVM_CONTEXT1_CNTL2, 4);
628         tmp = RREG32(mmVM_CONTEXT1_CNTL);
629         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, ENABLE_CONTEXT, 1);
630         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_DEPTH, 1);
631         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT, 1);
632         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
633         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT, 1);
634         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
635         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT, 1);
636         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
637         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, VALID_PROTECTION_FAULT_ENABLE_INTERRUPT, 1);
638         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
639         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, READ_PROTECTION_FAULT_ENABLE_INTERRUPT, 1);
640         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
641         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT, 1);
642         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
643         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, EXECUTE_PROTECTION_FAULT_ENABLE_INTERRUPT, 1);
644         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
645         tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_BLOCK_SIZE,
646                             amdgpu_vm_block_size - 9);
647         WREG32(mmVM_CONTEXT1_CNTL, tmp);
648
649         gmc_v8_0_gart_flush_gpu_tlb(adev, 0);
650         DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
651                  (unsigned)(adev->mc.gtt_size >> 20),
652                  (unsigned long long)adev->gart.table_addr);
653         adev->gart.ready = true;
654         return 0;
655 }
656
657 static int gmc_v8_0_gart_init(struct amdgpu_device *adev)
658 {
659         int r;
660
661         if (adev->gart.robj) {
662                 WARN(1, "R600 PCIE GART already initialized\n");
663                 return 0;
664         }
665         /* Initialize common gart structure */
666         r = amdgpu_gart_init(adev);
667         if (r)
668                 return r;
669         adev->gart.table_size = adev->gart.num_gpu_pages * 8;
670         return amdgpu_gart_table_vram_alloc(adev);
671 }
672
673 /**
674  * gmc_v8_0_gart_disable - gart disable
675  *
676  * @adev: amdgpu_device pointer
677  *
678  * This disables all VM page table (CIK).
679  */
680 static void gmc_v8_0_gart_disable(struct amdgpu_device *adev)
681 {
682         u32 tmp;
683
684         /* Disable all tables */
685         WREG32(mmVM_CONTEXT0_CNTL, 0);
686         WREG32(mmVM_CONTEXT1_CNTL, 0);
687         /* Setup TLB control */
688         tmp = RREG32(mmMC_VM_MX_L1_TLB_CNTL);
689         tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_TLB, 0);
690         tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING, 0);
691         tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ENABLE_ADVANCED_DRIVER_MODEL, 0);
692         WREG32(mmMC_VM_MX_L1_TLB_CNTL, tmp);
693         /* Setup L2 cache */
694         tmp = RREG32(mmVM_L2_CNTL);
695         tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, 0);
696         WREG32(mmVM_L2_CNTL, tmp);
697         WREG32(mmVM_L2_CNTL2, 0);
698         amdgpu_gart_table_vram_unpin(adev);
699 }
700
701 /**
702  * gmc_v8_0_gart_fini - vm fini callback
703  *
704  * @adev: amdgpu_device pointer
705  *
706  * Tears down the driver GART/VM setup (CIK).
707  */
708 static void gmc_v8_0_gart_fini(struct amdgpu_device *adev)
709 {
710         amdgpu_gart_table_vram_free(adev);
711         amdgpu_gart_fini(adev);
712 }
713
714 /*
715  * vm
716  * VMID 0 is the physical GPU addresses as used by the kernel.
717  * VMIDs 1-15 are used for userspace clients and are handled
718  * by the amdgpu vm/hsa code.
719  */
720 /**
721  * gmc_v8_0_vm_init - cik vm init callback
722  *
723  * @adev: amdgpu_device pointer
724  *
725  * Inits cik specific vm parameters (number of VMs, base of vram for
726  * VMIDs 1-15) (CIK).
727  * Returns 0 for success.
728  */
729 static int gmc_v8_0_vm_init(struct amdgpu_device *adev)
730 {
731         /*
732          * number of VMs
733          * VMID 0 is reserved for System
734          * amdgpu graphics/compute will use VMIDs 1-7
735          * amdkfd will use VMIDs 8-15
736          */
737         adev->vm_manager.nvm = AMDGPU_NUM_OF_VMIDS;
738
739         /* base offset of vram pages */
740         if (adev->flags & AMDGPU_IS_APU) {
741                 u64 tmp = RREG32(mmMC_VM_FB_OFFSET);
742                 tmp <<= 22;
743                 adev->vm_manager.vram_base_offset = tmp;
744         } else
745                 adev->vm_manager.vram_base_offset = 0;
746
747         return 0;
748 }
749
750 /**
751  * gmc_v8_0_vm_fini - cik vm fini callback
752  *
753  * @adev: amdgpu_device pointer
754  *
755  * Tear down any asic specific VM setup (CIK).
756  */
757 static void gmc_v8_0_vm_fini(struct amdgpu_device *adev)
758 {
759 }
760
761 /**
762  * gmc_v8_0_vm_decode_fault - print human readable fault info
763  *
764  * @adev: amdgpu_device pointer
765  * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
766  * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
767  *
768  * Print human readable fault information (CIK).
769  */
770 static void gmc_v8_0_vm_decode_fault(struct amdgpu_device *adev,
771                                      u32 status, u32 addr, u32 mc_client)
772 {
773         u32 mc_id;
774         u32 vmid = REG_GET_FIELD(status, VM_CONTEXT1_PROTECTION_FAULT_STATUS, VMID);
775         u32 protections = REG_GET_FIELD(status, VM_CONTEXT1_PROTECTION_FAULT_STATUS,
776                                         PROTECTIONS);
777         char block[5] = { mc_client >> 24, (mc_client >> 16) & 0xff,
778                 (mc_client >> 8) & 0xff, mc_client & 0xff, 0 };
779
780         mc_id = REG_GET_FIELD(status, VM_CONTEXT1_PROTECTION_FAULT_STATUS,
781                               MEMORY_CLIENT_ID);
782
783         printk("VM fault (0x%02x, vmid %d) at page %u, %s from '%s' (0x%08x) (%d)\n",
784                protections, vmid, addr,
785                REG_GET_FIELD(status, VM_CONTEXT1_PROTECTION_FAULT_STATUS,
786                              MEMORY_CLIENT_RW) ?
787                "write" : "read", block, mc_client, mc_id);
788 }
789
790 static int gmc_v8_0_convert_vram_type(int mc_seq_vram_type)
791 {
792         switch (mc_seq_vram_type) {
793         case MC_SEQ_MISC0__MT__GDDR1:
794                 return AMDGPU_VRAM_TYPE_GDDR1;
795         case MC_SEQ_MISC0__MT__DDR2:
796                 return AMDGPU_VRAM_TYPE_DDR2;
797         case MC_SEQ_MISC0__MT__GDDR3:
798                 return AMDGPU_VRAM_TYPE_GDDR3;
799         case MC_SEQ_MISC0__MT__GDDR4:
800                 return AMDGPU_VRAM_TYPE_GDDR4;
801         case MC_SEQ_MISC0__MT__GDDR5:
802                 return AMDGPU_VRAM_TYPE_GDDR5;
803         case MC_SEQ_MISC0__MT__HBM:
804                 return AMDGPU_VRAM_TYPE_HBM;
805         case MC_SEQ_MISC0__MT__DDR3:
806                 return AMDGPU_VRAM_TYPE_DDR3;
807         default:
808                 return AMDGPU_VRAM_TYPE_UNKNOWN;
809         }
810 }
811
812 static int gmc_v8_0_early_init(void *handle)
813 {
814         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
815
816         gmc_v8_0_set_gart_funcs(adev);
817         gmc_v8_0_set_irq_funcs(adev);
818
819         if (adev->flags & AMDGPU_IS_APU) {
820                 adev->mc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN;
821         } else {
822                 u32 tmp = RREG32(mmMC_SEQ_MISC0);
823                 tmp &= MC_SEQ_MISC0__MT__MASK;
824                 adev->mc.vram_type = gmc_v8_0_convert_vram_type(tmp);
825         }
826
827         return 0;
828 }
829
830 static int gmc_v8_0_sw_init(void *handle)
831 {
832         int r;
833         int dma_bits;
834         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
835
836         r = amdgpu_gem_init(adev);
837         if (r)
838                 return r;
839
840         r = amdgpu_irq_add_id(adev, 146, &adev->mc.vm_fault);
841         if (r)
842                 return r;
843
844         r = amdgpu_irq_add_id(adev, 147, &adev->mc.vm_fault);
845         if (r)
846                 return r;
847
848         /* Adjust VM size here.
849          * Currently set to 4GB ((1 << 20) 4k pages).
850          * Max GPUVM size for cayman and SI is 40 bits.
851          */
852         adev->vm_manager.max_pfn = amdgpu_vm_size << 18;
853
854         /* Set the internal MC address mask
855          * This is the max address of the GPU's
856          * internal address space.
857          */
858         adev->mc.mc_mask = 0xffffffffffULL; /* 40 bit MC */
859
860         /* set DMA mask + need_dma32 flags.
861          * PCIE - can handle 40-bits.
862          * IGP - can handle 40-bits
863          * PCI - dma32 for legacy pci gart, 40 bits on newer asics
864          */
865         adev->need_dma32 = false;
866         dma_bits = adev->need_dma32 ? 32 : 40;
867         r = pci_set_dma_mask(adev->pdev, DMA_BIT_MASK(dma_bits));
868         if (r) {
869                 adev->need_dma32 = true;
870                 dma_bits = 32;
871                 printk(KERN_WARNING "amdgpu: No suitable DMA available.\n");
872         }
873         r = pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(dma_bits));
874         if (r) {
875                 pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(32));
876                 printk(KERN_WARNING "amdgpu: No coherent DMA available.\n");
877         }
878
879         r = gmc_v8_0_init_microcode(adev);
880         if (r) {
881                 DRM_ERROR("Failed to load mc firmware!\n");
882                 return r;
883         }
884
885         r = gmc_v8_0_mc_init(adev);
886         if (r)
887                 return r;
888
889         /* Memory manager */
890         r = amdgpu_bo_init(adev);
891         if (r)
892                 return r;
893
894         r = gmc_v8_0_gart_init(adev);
895         if (r)
896                 return r;
897
898         if (!adev->vm_manager.enabled) {
899                 r = gmc_v8_0_vm_init(adev);
900                 if (r) {
901                         dev_err(adev->dev, "vm manager initialization failed (%d).\n", r);
902                         return r;
903                 }
904                 adev->vm_manager.enabled = true;
905         }
906
907         return r;
908 }
909
910 static int gmc_v8_0_sw_fini(void *handle)
911 {
912         int i;
913         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
914
915         if (adev->vm_manager.enabled) {
916                 for (i = 0; i < AMDGPU_NUM_VM; ++i)
917                         amdgpu_fence_unref(&adev->vm_manager.active[i]);
918                 gmc_v8_0_vm_fini(adev);
919                 adev->vm_manager.enabled = false;
920         }
921         gmc_v8_0_gart_fini(adev);
922         amdgpu_gem_fini(adev);
923         amdgpu_bo_fini(adev);
924
925         return 0;
926 }
927
928 static int gmc_v8_0_hw_init(void *handle)
929 {
930         int r;
931         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
932
933         gmc_v8_0_init_golden_registers(adev);
934
935         gmc_v8_0_mc_program(adev);
936
937         if (!(adev->flags & AMDGPU_IS_APU)) {
938                 r = gmc_v8_0_mc_load_microcode(adev);
939                 if (r) {
940                         DRM_ERROR("Failed to load MC firmware!\n");
941                         return r;
942                 }
943         }
944
945         r = gmc_v8_0_gart_enable(adev);
946         if (r)
947                 return r;
948
949         return r;
950 }
951
952 static int gmc_v8_0_hw_fini(void *handle)
953 {
954         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
955
956         gmc_v8_0_gart_disable(adev);
957
958         return 0;
959 }
960
961 static int gmc_v8_0_suspend(void *handle)
962 {
963         int i;
964         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
965
966         if (adev->vm_manager.enabled) {
967                 for (i = 0; i < AMDGPU_NUM_VM; ++i)
968                         amdgpu_fence_unref(&adev->vm_manager.active[i]);
969                 gmc_v8_0_vm_fini(adev);
970                 adev->vm_manager.enabled = false;
971         }
972         gmc_v8_0_hw_fini(adev);
973
974         return 0;
975 }
976
977 static int gmc_v8_0_resume(void *handle)
978 {
979         int r;
980         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
981
982         r = gmc_v8_0_hw_init(adev);
983         if (r)
984                 return r;
985
986         if (!adev->vm_manager.enabled) {
987                 r = gmc_v8_0_vm_init(adev);
988                 if (r) {
989                         dev_err(adev->dev, "vm manager initialization failed (%d).\n", r);
990                         return r;
991                 }
992                 adev->vm_manager.enabled = true;
993         }
994
995         return r;
996 }
997
998 static bool gmc_v8_0_is_idle(void *handle)
999 {
1000         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1001         u32 tmp = RREG32(mmSRBM_STATUS);
1002
1003         if (tmp & (SRBM_STATUS__MCB_BUSY_MASK | SRBM_STATUS__MCB_NON_DISPLAY_BUSY_MASK |
1004                    SRBM_STATUS__MCC_BUSY_MASK | SRBM_STATUS__MCD_BUSY_MASK | SRBM_STATUS__VMC_BUSY_MASK))
1005                 return false;
1006
1007         return true;
1008 }
1009
1010 static int gmc_v8_0_wait_for_idle(void *handle)
1011 {
1012         unsigned i;
1013         u32 tmp;
1014         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1015
1016         for (i = 0; i < adev->usec_timeout; i++) {
1017                 /* read MC_STATUS */
1018                 tmp = RREG32(mmSRBM_STATUS) & (SRBM_STATUS__MCB_BUSY_MASK |
1019                                                SRBM_STATUS__MCB_NON_DISPLAY_BUSY_MASK |
1020                                                SRBM_STATUS__MCC_BUSY_MASK |
1021                                                SRBM_STATUS__MCD_BUSY_MASK |
1022                                                SRBM_STATUS__VMC_BUSY_MASK |
1023                                                SRBM_STATUS__VMC1_BUSY_MASK);
1024                 if (!tmp)
1025                         return 0;
1026                 udelay(1);
1027         }
1028         return -ETIMEDOUT;
1029
1030 }
1031
1032 static void gmc_v8_0_print_status(void *handle)
1033 {
1034         int i, j;
1035         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1036
1037         dev_info(adev->dev, "GMC 8.x registers\n");
1038         dev_info(adev->dev, "  SRBM_STATUS=0x%08X\n",
1039                 RREG32(mmSRBM_STATUS));
1040         dev_info(adev->dev, "  SRBM_STATUS2=0x%08X\n",
1041                 RREG32(mmSRBM_STATUS2));
1042
1043         dev_info(adev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
1044                  RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_ADDR));
1045         dev_info(adev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
1046                  RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_STATUS));
1047         dev_info(adev->dev, "  MC_VM_MX_L1_TLB_CNTL=0x%08X\n",
1048                  RREG32(mmMC_VM_MX_L1_TLB_CNTL));
1049         dev_info(adev->dev, "  VM_L2_CNTL=0x%08X\n",
1050                  RREG32(mmVM_L2_CNTL));
1051         dev_info(adev->dev, "  VM_L2_CNTL2=0x%08X\n",
1052                  RREG32(mmVM_L2_CNTL2));
1053         dev_info(adev->dev, "  VM_L2_CNTL3=0x%08X\n",
1054                  RREG32(mmVM_L2_CNTL3));
1055         dev_info(adev->dev, "  VM_L2_CNTL4=0x%08X\n",
1056                  RREG32(mmVM_L2_CNTL4));
1057         dev_info(adev->dev, "  VM_CONTEXT0_PAGE_TABLE_START_ADDR=0x%08X\n",
1058                  RREG32(mmVM_CONTEXT0_PAGE_TABLE_START_ADDR));
1059         dev_info(adev->dev, "  VM_CONTEXT0_PAGE_TABLE_END_ADDR=0x%08X\n",
1060                  RREG32(mmVM_CONTEXT0_PAGE_TABLE_END_ADDR));
1061         dev_info(adev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR=0x%08X\n",
1062                  RREG32(mmVM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR));
1063         dev_info(adev->dev, "  VM_CONTEXT0_CNTL2=0x%08X\n",
1064                  RREG32(mmVM_CONTEXT0_CNTL2));
1065         dev_info(adev->dev, "  VM_CONTEXT0_CNTL=0x%08X\n",
1066                  RREG32(mmVM_CONTEXT0_CNTL));
1067         dev_info(adev->dev, "  VM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR=0x%08X\n",
1068                  RREG32(mmVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR));
1069         dev_info(adev->dev, "  VM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR=0x%08X\n",
1070                  RREG32(mmVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR));
1071         dev_info(adev->dev, "  mmVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET=0x%08X\n",
1072                  RREG32(mmVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET));
1073         dev_info(adev->dev, "  VM_CONTEXT1_PAGE_TABLE_START_ADDR=0x%08X\n",
1074                  RREG32(mmVM_CONTEXT1_PAGE_TABLE_START_ADDR));
1075         dev_info(adev->dev, "  VM_CONTEXT1_PAGE_TABLE_END_ADDR=0x%08X\n",
1076                  RREG32(mmVM_CONTEXT1_PAGE_TABLE_END_ADDR));
1077         dev_info(adev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR=0x%08X\n",
1078                  RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR));
1079         dev_info(adev->dev, "  VM_CONTEXT1_CNTL2=0x%08X\n",
1080                  RREG32(mmVM_CONTEXT1_CNTL2));
1081         dev_info(adev->dev, "  VM_CONTEXT1_CNTL=0x%08X\n",
1082                  RREG32(mmVM_CONTEXT1_CNTL));
1083         for (i = 0; i < 16; i++) {
1084                 if (i < 8)
1085                         dev_info(adev->dev, "  VM_CONTEXT%d_PAGE_TABLE_BASE_ADDR=0x%08X\n",
1086                                  i, RREG32(mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR + i));
1087                 else
1088                         dev_info(adev->dev, "  VM_CONTEXT%d_PAGE_TABLE_BASE_ADDR=0x%08X\n",
1089                                  i, RREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + i - 8));
1090         }
1091         dev_info(adev->dev, "  MC_VM_SYSTEM_APERTURE_LOW_ADDR=0x%08X\n",
1092                  RREG32(mmMC_VM_SYSTEM_APERTURE_LOW_ADDR));
1093         dev_info(adev->dev, "  MC_VM_SYSTEM_APERTURE_HIGH_ADDR=0x%08X\n",
1094                  RREG32(mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR));
1095         dev_info(adev->dev, "  MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR=0x%08X\n",
1096                  RREG32(mmMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR));
1097         dev_info(adev->dev, "  MC_VM_FB_LOCATION=0x%08X\n",
1098                  RREG32(mmMC_VM_FB_LOCATION));
1099         dev_info(adev->dev, "  MC_VM_AGP_BASE=0x%08X\n",
1100                  RREG32(mmMC_VM_AGP_BASE));
1101         dev_info(adev->dev, "  MC_VM_AGP_TOP=0x%08X\n",
1102                  RREG32(mmMC_VM_AGP_TOP));
1103         dev_info(adev->dev, "  MC_VM_AGP_BOT=0x%08X\n",
1104                  RREG32(mmMC_VM_AGP_BOT));
1105
1106         dev_info(adev->dev, "  HDP_REG_COHERENCY_FLUSH_CNTL=0x%08X\n",
1107                  RREG32(mmHDP_REG_COHERENCY_FLUSH_CNTL));
1108         dev_info(adev->dev, "  HDP_NONSURFACE_BASE=0x%08X\n",
1109                  RREG32(mmHDP_NONSURFACE_BASE));
1110         dev_info(adev->dev, "  HDP_NONSURFACE_INFO=0x%08X\n",
1111                  RREG32(mmHDP_NONSURFACE_INFO));
1112         dev_info(adev->dev, "  HDP_NONSURFACE_SIZE=0x%08X\n",
1113                  RREG32(mmHDP_NONSURFACE_SIZE));
1114         dev_info(adev->dev, "  HDP_MISC_CNTL=0x%08X\n",
1115                  RREG32(mmHDP_MISC_CNTL));
1116         dev_info(adev->dev, "  HDP_HOST_PATH_CNTL=0x%08X\n",
1117                  RREG32(mmHDP_HOST_PATH_CNTL));
1118
1119         for (i = 0, j = 0; i < 32; i++, j += 0x6) {
1120                 dev_info(adev->dev, "  %d:\n", i);
1121                 dev_info(adev->dev, "  0x%04X=0x%08X\n",
1122                          0xb05 + j, RREG32(0xb05 + j));
1123                 dev_info(adev->dev, "  0x%04X=0x%08X\n",
1124                          0xb06 + j, RREG32(0xb06 + j));
1125                 dev_info(adev->dev, "  0x%04X=0x%08X\n",
1126                          0xb07 + j, RREG32(0xb07 + j));
1127                 dev_info(adev->dev, "  0x%04X=0x%08X\n",
1128                          0xb08 + j, RREG32(0xb08 + j));
1129                 dev_info(adev->dev, "  0x%04X=0x%08X\n",
1130                          0xb09 + j, RREG32(0xb09 + j));
1131         }
1132
1133         dev_info(adev->dev, "  BIF_FB_EN=0x%08X\n",
1134                  RREG32(mmBIF_FB_EN));
1135 }
1136
1137 static int gmc_v8_0_soft_reset(void *handle)
1138 {
1139         struct amdgpu_mode_mc_save save;
1140         u32 srbm_soft_reset = 0;
1141         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1142         u32 tmp = RREG32(mmSRBM_STATUS);
1143
1144         if (tmp & SRBM_STATUS__VMC_BUSY_MASK)
1145                 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset,
1146                                                 SRBM_SOFT_RESET, SOFT_RESET_VMC, 1);
1147
1148         if (tmp & (SRBM_STATUS__MCB_BUSY_MASK | SRBM_STATUS__MCB_NON_DISPLAY_BUSY_MASK |
1149                    SRBM_STATUS__MCC_BUSY_MASK | SRBM_STATUS__MCD_BUSY_MASK)) {
1150                 if (!(adev->flags & AMDGPU_IS_APU))
1151                         srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset,
1152                                                         SRBM_SOFT_RESET, SOFT_RESET_MC, 1);
1153         }
1154
1155         if (srbm_soft_reset) {
1156                 gmc_v8_0_print_status((void *)adev);
1157
1158                 gmc_v8_0_mc_stop(adev, &save);
1159                 if (gmc_v8_0_wait_for_idle(adev)) {
1160                         dev_warn(adev->dev, "Wait for GMC idle timed out !\n");
1161                 }
1162
1163
1164                 tmp = RREG32(mmSRBM_SOFT_RESET);
1165                 tmp |= srbm_soft_reset;
1166                 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
1167                 WREG32(mmSRBM_SOFT_RESET, tmp);
1168                 tmp = RREG32(mmSRBM_SOFT_RESET);
1169
1170                 udelay(50);
1171
1172                 tmp &= ~srbm_soft_reset;
1173                 WREG32(mmSRBM_SOFT_RESET, tmp);
1174                 tmp = RREG32(mmSRBM_SOFT_RESET);
1175
1176                 /* Wait a little for things to settle down */
1177                 udelay(50);
1178
1179                 gmc_v8_0_mc_resume(adev, &save);
1180                 udelay(50);
1181
1182                 gmc_v8_0_print_status((void *)adev);
1183         }
1184
1185         return 0;
1186 }
1187
1188 static int gmc_v8_0_vm_fault_interrupt_state(struct amdgpu_device *adev,
1189                                              struct amdgpu_irq_src *src,
1190                                              unsigned type,
1191                                              enum amdgpu_interrupt_state state)
1192 {
1193         u32 tmp;
1194         u32 bits = (VM_CONTEXT1_CNTL__RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
1195                     VM_CONTEXT1_CNTL__DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
1196                     VM_CONTEXT1_CNTL__PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
1197                     VM_CONTEXT1_CNTL__VALID_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
1198                     VM_CONTEXT1_CNTL__READ_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
1199                     VM_CONTEXT1_CNTL__WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
1200                     VM_CONTEXT1_CNTL__EXECUTE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK);
1201
1202         switch (state) {
1203         case AMDGPU_IRQ_STATE_DISABLE:
1204                 /* system context */
1205                 tmp = RREG32(mmVM_CONTEXT0_CNTL);
1206                 tmp &= ~bits;
1207                 WREG32(mmVM_CONTEXT0_CNTL, tmp);
1208                 /* VMs */
1209                 tmp = RREG32(mmVM_CONTEXT1_CNTL);
1210                 tmp &= ~bits;
1211                 WREG32(mmVM_CONTEXT1_CNTL, tmp);
1212                 break;
1213         case AMDGPU_IRQ_STATE_ENABLE:
1214                 /* system context */
1215                 tmp = RREG32(mmVM_CONTEXT0_CNTL);
1216                 tmp |= bits;
1217                 WREG32(mmVM_CONTEXT0_CNTL, tmp);
1218                 /* VMs */
1219                 tmp = RREG32(mmVM_CONTEXT1_CNTL);
1220                 tmp |= bits;
1221                 WREG32(mmVM_CONTEXT1_CNTL, tmp);
1222                 break;
1223         default:
1224                 break;
1225         }
1226
1227         return 0;
1228 }
1229
1230 static int gmc_v8_0_process_interrupt(struct amdgpu_device *adev,
1231                                       struct amdgpu_irq_src *source,
1232                                       struct amdgpu_iv_entry *entry)
1233 {
1234         u32 addr, status, mc_client;
1235
1236         addr = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_ADDR);
1237         status = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_STATUS);
1238         mc_client = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_MCCLIENT);
1239         dev_err(adev->dev, "GPU fault detected: %d 0x%08x\n",
1240                 entry->src_id, entry->src_data);
1241         dev_err(adev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
1242                 addr);
1243         dev_err(adev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
1244                 status);
1245         gmc_v8_0_vm_decode_fault(adev, status, addr, mc_client);
1246         /* reset addr and status */
1247         WREG32_P(mmVM_CONTEXT1_CNTL2, 1, ~1);
1248
1249         return 0;
1250 }
1251
1252 static int gmc_v8_0_set_clockgating_state(void *handle,
1253                                           enum amd_clockgating_state state)
1254 {
1255         return 0;
1256 }
1257
1258 static int gmc_v8_0_set_powergating_state(void *handle,
1259                                           enum amd_powergating_state state)
1260 {
1261         return 0;
1262 }
1263
1264 const struct amd_ip_funcs gmc_v8_0_ip_funcs = {
1265         .early_init = gmc_v8_0_early_init,
1266         .late_init = NULL,
1267         .sw_init = gmc_v8_0_sw_init,
1268         .sw_fini = gmc_v8_0_sw_fini,
1269         .hw_init = gmc_v8_0_hw_init,
1270         .hw_fini = gmc_v8_0_hw_fini,
1271         .suspend = gmc_v8_0_suspend,
1272         .resume = gmc_v8_0_resume,
1273         .is_idle = gmc_v8_0_is_idle,
1274         .wait_for_idle = gmc_v8_0_wait_for_idle,
1275         .soft_reset = gmc_v8_0_soft_reset,
1276         .print_status = gmc_v8_0_print_status,
1277         .set_clockgating_state = gmc_v8_0_set_clockgating_state,
1278         .set_powergating_state = gmc_v8_0_set_powergating_state,
1279 };
1280
1281 static const struct amdgpu_gart_funcs gmc_v8_0_gart_funcs = {
1282         .flush_gpu_tlb = gmc_v8_0_gart_flush_gpu_tlb,
1283         .set_pte_pde = gmc_v8_0_gart_set_pte_pde,
1284 };
1285
1286 static const struct amdgpu_irq_src_funcs gmc_v8_0_irq_funcs = {
1287         .set = gmc_v8_0_vm_fault_interrupt_state,
1288         .process = gmc_v8_0_process_interrupt,
1289 };
1290
1291 static void gmc_v8_0_set_gart_funcs(struct amdgpu_device *adev)
1292 {
1293         if (adev->gart.gart_funcs == NULL)
1294                 adev->gart.gart_funcs = &gmc_v8_0_gart_funcs;
1295 }
1296
1297 static void gmc_v8_0_set_irq_funcs(struct amdgpu_device *adev)
1298 {
1299         adev->mc.vm_fault.num_types = 1;
1300         adev->mc.vm_fault.funcs = &gmc_v8_0_irq_funcs;
1301 }