]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blame - drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
drm/amdgpu: implement gmc_v7_0_emit_flush_gpu_tlb
[mirror_ubuntu-hirsute-kernel.git] / drivers / gpu / drm / amd / amdgpu / gmc_v8_0.c
CommitLineData
aaa36a97
AD
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>
248a1d6f 24#include <drm/drmP.h>
fd5fd480 25#include <drm/drm_cache.h>
aaa36a97
AD
26#include "amdgpu.h"
27#include "gmc_v8_0.h"
28#include "amdgpu_ucode.h"
29
30#include "gmc/gmc_8_1_d.h"
31#include "gmc/gmc_8_1_sh_mask.h"
32
33#include "bif/bif_5_0_d.h"
34#include "bif/bif_5_0_sh_mask.h"
35
36#include "oss/oss_3_0_d.h"
37#include "oss/oss_3_0_sh_mask.h"
38
2e2bfd90
AD
39#include "dce/dce_10_0_d.h"
40#include "dce/dce_10_0_sh_mask.h"
41
aaa36a97
AD
42#include "vid.h"
43#include "vi.h"
44
1ce65f52
HW
45#include "amdgpu_atombios.h"
46
81c59f54 47
132f34e4 48static void gmc_v8_0_set_gmc_funcs(struct amdgpu_device *adev);
aaa36a97 49static void gmc_v8_0_set_irq_funcs(struct amdgpu_device *adev);
34e3205e 50static int gmc_v8_0_wait_for_idle(void *handle);
aaa36a97 51
c65444fe 52MODULE_FIRMWARE("amdgpu/tonga_mc.bin");
2cc0c0b5
FC
53MODULE_FIRMWARE("amdgpu/polaris11_mc.bin");
54MODULE_FIRMWARE("amdgpu/polaris10_mc.bin");
c4642a47 55MODULE_FIRMWARE("amdgpu/polaris12_mc.bin");
aaa36a97
AD
56
57static const u32 golden_settings_tonga_a11[] =
58{
59 mmMC_ARB_WTM_GRPWT_RD, 0x00000003, 0x00000000,
60 mmMC_HUB_RDREQ_DMIF_LIMIT, 0x0000007f, 0x00000028,
61 mmMC_HUB_WDP_UMC, 0x00007fb6, 0x00000991,
62 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0x0fffffff,
63 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
64 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
65 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
66};
67
68static const u32 tonga_mgcg_cgcg_init[] =
69{
70 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104
71};
72
127a2628
DZ
73static const u32 golden_settings_fiji_a10[] =
74{
75 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0x0fffffff,
76 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
77 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
78 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
79};
80
81static const u32 fiji_mgcg_cgcg_init[] =
82{
83 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104
84};
85
2cc0c0b5 86static const u32 golden_settings_polaris11_a11[] =
c9778572
FC
87{
88 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0x0fffffff,
89 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
90 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
91 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff
92};
93
2cc0c0b5 94static const u32 golden_settings_polaris10_a11[] =
c9778572
FC
95{
96 mmMC_ARB_WTM_GRPWT_RD, 0x00000003, 0x00000000,
97 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0x0fffffff,
98 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
99 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
100 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff
101};
102
aaa36a97
AD
103static const u32 cz_mgcg_cgcg_init[] =
104{
105 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104
106};
107
aade2f04
SL
108static const u32 stoney_mgcg_cgcg_init[] =
109{
0711257e 110 mmATC_MISC_CG, 0xffffffff, 0x000c0200,
aade2f04
SL
111 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104
112};
113
6d51c813
HR
114static const u32 golden_settings_stoney_common[] =
115{
116 mmMC_HUB_RDREQ_UVD, MC_HUB_RDREQ_UVD__PRESCALE_MASK, 0x00000004,
117 mmMC_RD_GRP_OTH, MC_RD_GRP_OTH__UVD_MASK, 0x00600000
118};
aade2f04 119
aaa36a97
AD
120static void gmc_v8_0_init_golden_registers(struct amdgpu_device *adev)
121{
122 switch (adev->asic_type) {
127a2628 123 case CHIP_FIJI:
9c3f2b54
AD
124 amdgpu_device_program_register_sequence(adev,
125 fiji_mgcg_cgcg_init,
126 ARRAY_SIZE(fiji_mgcg_cgcg_init));
127 amdgpu_device_program_register_sequence(adev,
128 golden_settings_fiji_a10,
129 ARRAY_SIZE(golden_settings_fiji_a10));
127a2628 130 break;
aaa36a97 131 case CHIP_TONGA:
9c3f2b54
AD
132 amdgpu_device_program_register_sequence(adev,
133 tonga_mgcg_cgcg_init,
134 ARRAY_SIZE(tonga_mgcg_cgcg_init));
135 amdgpu_device_program_register_sequence(adev,
136 golden_settings_tonga_a11,
137 ARRAY_SIZE(golden_settings_tonga_a11));
aaa36a97 138 break;
2cc0c0b5 139 case CHIP_POLARIS11:
c4642a47 140 case CHIP_POLARIS12:
9c3f2b54
AD
141 amdgpu_device_program_register_sequence(adev,
142 golden_settings_polaris11_a11,
143 ARRAY_SIZE(golden_settings_polaris11_a11));
c9778572 144 break;
2cc0c0b5 145 case CHIP_POLARIS10:
9c3f2b54
AD
146 amdgpu_device_program_register_sequence(adev,
147 golden_settings_polaris10_a11,
148 ARRAY_SIZE(golden_settings_polaris10_a11));
c9778572 149 break;
aaa36a97 150 case CHIP_CARRIZO:
9c3f2b54
AD
151 amdgpu_device_program_register_sequence(adev,
152 cz_mgcg_cgcg_init,
153 ARRAY_SIZE(cz_mgcg_cgcg_init));
aaa36a97 154 break;
aade2f04 155 case CHIP_STONEY:
9c3f2b54
AD
156 amdgpu_device_program_register_sequence(adev,
157 stoney_mgcg_cgcg_init,
158 ARRAY_SIZE(stoney_mgcg_cgcg_init));
159 amdgpu_device_program_register_sequence(adev,
160 golden_settings_stoney_common,
161 ARRAY_SIZE(golden_settings_stoney_common));
aade2f04 162 break;
aaa36a97
AD
163 default:
164 break;
165 }
166}
167
e4f6b39e 168static void gmc_v8_0_mc_stop(struct amdgpu_device *adev)
aaa36a97
AD
169{
170 u32 blackout;
171
34e3205e 172 gmc_v8_0_wait_for_idle(adev);
aaa36a97
AD
173
174 blackout = RREG32(mmMC_SHARED_BLACKOUT_CNTL);
175 if (REG_GET_FIELD(blackout, MC_SHARED_BLACKOUT_CNTL, BLACKOUT_MODE) != 1) {
176 /* Block CPU access */
177 WREG32(mmBIF_FB_EN, 0);
178 /* blackout the MC */
179 blackout = REG_SET_FIELD(blackout,
180 MC_SHARED_BLACKOUT_CNTL, BLACKOUT_MODE, 1);
181 WREG32(mmMC_SHARED_BLACKOUT_CNTL, blackout);
182 }
183 /* wait for the MC to settle */
184 udelay(100);
185}
186
e4f6b39e 187static void gmc_v8_0_mc_resume(struct amdgpu_device *adev)
aaa36a97
AD
188{
189 u32 tmp;
190
191 /* unblackout the MC */
192 tmp = RREG32(mmMC_SHARED_BLACKOUT_CNTL);
193 tmp = REG_SET_FIELD(tmp, MC_SHARED_BLACKOUT_CNTL, BLACKOUT_MODE, 0);
194 WREG32(mmMC_SHARED_BLACKOUT_CNTL, tmp);
195 /* allow CPU access */
196 tmp = REG_SET_FIELD(0, BIF_FB_EN, FB_READ_EN, 1);
197 tmp = REG_SET_FIELD(tmp, BIF_FB_EN, FB_WRITE_EN, 1);
198 WREG32(mmBIF_FB_EN, tmp);
aaa36a97
AD
199}
200
201/**
202 * gmc_v8_0_init_microcode - load ucode images from disk
203 *
204 * @adev: amdgpu_device pointer
205 *
206 * Use the firmware interface to load the ucode images into
207 * the driver (not loaded into hw).
208 * Returns 0 on success, error on failure.
209 */
210static int gmc_v8_0_init_microcode(struct amdgpu_device *adev)
211{
212 const char *chip_name;
213 char fw_name[30];
214 int err;
215
216 DRM_DEBUG("\n");
217
218 switch (adev->asic_type) {
aaa36a97
AD
219 case CHIP_TONGA:
220 chip_name = "tonga";
221 break;
2cc0c0b5
FC
222 case CHIP_POLARIS11:
223 chip_name = "polaris11";
c9778572 224 break;
2cc0c0b5
FC
225 case CHIP_POLARIS10:
226 chip_name = "polaris10";
c9778572 227 break;
c4642a47
JZ
228 case CHIP_POLARIS12:
229 chip_name = "polaris12";
230 break;
127a2628 231 case CHIP_FIJI:
aaa36a97 232 case CHIP_CARRIZO:
aade2f04 233 case CHIP_STONEY:
aaa36a97
AD
234 return 0;
235 default: BUG();
236 }
237
c65444fe 238 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", chip_name);
770d13b1 239 err = request_firmware(&adev->gmc.fw, fw_name, adev->dev);
aaa36a97
AD
240 if (err)
241 goto out;
770d13b1 242 err = amdgpu_ucode_validate(adev->gmc.fw);
aaa36a97
AD
243
244out:
245 if (err) {
7ca85295 246 pr_err("mc: Failed to load firmware \"%s\"\n", fw_name);
770d13b1
CK
247 release_firmware(adev->gmc.fw);
248 adev->gmc.fw = NULL;
aaa36a97
AD
249 }
250 return err;
251}
252
253/**
0d52c6a1 254 * gmc_v8_0_tonga_mc_load_microcode - load tonga MC ucode into the hw
aaa36a97
AD
255 *
256 * @adev: amdgpu_device pointer
257 *
258 * Load the GDDR MC ucode into the hw (CIK).
259 * Returns 0 on success, error on failure.
260 */
0d52c6a1 261static int gmc_v8_0_tonga_mc_load_microcode(struct amdgpu_device *adev)
aaa36a97
AD
262{
263 const struct mc_firmware_header_v1_0 *hdr;
264 const __le32 *fw_data = NULL;
265 const __le32 *io_mc_regs = NULL;
887656f0 266 u32 running;
aaa36a97
AD
267 int i, ucode_size, regs_size;
268
c12d2871
AD
269 /* Skip MC ucode loading on SR-IOV capable boards.
270 * vbios does this for us in asic_init in that case.
4e99a44e
ML
271 * Skip MC ucode loading on VF, because hypervisor will do that
272 * for this adaptor.
c12d2871 273 */
4e99a44e 274 if (amdgpu_sriov_bios(adev))
c12d2871
AD
275 return 0;
276
770d13b1 277 if (!adev->gmc.fw)
0d52c6a1
RZ
278 return -EINVAL;
279
770d13b1 280 hdr = (const struct mc_firmware_header_v1_0 *)adev->gmc.fw->data;
aaa36a97
AD
281 amdgpu_ucode_print_mc_hdr(&hdr->header);
282
770d13b1 283 adev->gmc.fw_version = le32_to_cpu(hdr->header.ucode_version);
aaa36a97
AD
284 regs_size = le32_to_cpu(hdr->io_debug_size_bytes) / (4 * 2);
285 io_mc_regs = (const __le32 *)
770d13b1 286 (adev->gmc.fw->data + le32_to_cpu(hdr->io_debug_array_offset_bytes));
aaa36a97
AD
287 ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
288 fw_data = (const __le32 *)
770d13b1 289 (adev->gmc.fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
aaa36a97
AD
290
291 running = REG_GET_FIELD(RREG32(mmMC_SEQ_SUP_CNTL), MC_SEQ_SUP_CNTL, RUN);
292
293 if (running == 0) {
aaa36a97
AD
294 /* reset the engine and set to writable */
295 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000008);
296 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000010);
297
298 /* load mc io regs */
299 for (i = 0; i < regs_size; i++) {
300 WREG32(mmMC_SEQ_IO_DEBUG_INDEX, le32_to_cpup(io_mc_regs++));
301 WREG32(mmMC_SEQ_IO_DEBUG_DATA, le32_to_cpup(io_mc_regs++));
302 }
303 /* load the MC ucode */
304 for (i = 0; i < ucode_size; i++)
305 WREG32(mmMC_SEQ_SUP_PGM, le32_to_cpup(fw_data++));
306
307 /* put the engine back into the active state */
308 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000008);
309 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000004);
310 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000001);
311
312 /* wait for training to complete */
313 for (i = 0; i < adev->usec_timeout; i++) {
314 if (REG_GET_FIELD(RREG32(mmMC_SEQ_TRAIN_WAKEUP_CNTL),
315 MC_SEQ_TRAIN_WAKEUP_CNTL, TRAIN_DONE_D0))
316 break;
317 udelay(1);
318 }
319 for (i = 0; i < adev->usec_timeout; i++) {
320 if (REG_GET_FIELD(RREG32(mmMC_SEQ_TRAIN_WAKEUP_CNTL),
321 MC_SEQ_TRAIN_WAKEUP_CNTL, TRAIN_DONE_D1))
322 break;
323 udelay(1);
324 }
aaa36a97
AD
325 }
326
327 return 0;
328}
329
0d52c6a1
RZ
330static int gmc_v8_0_polaris_mc_load_microcode(struct amdgpu_device *adev)
331{
332 const struct mc_firmware_header_v1_0 *hdr;
333 const __le32 *fw_data = NULL;
334 const __le32 *io_mc_regs = NULL;
335 u32 data, vbios_version;
336 int i, ucode_size, regs_size;
337
338 /* Skip MC ucode loading on SR-IOV capable boards.
339 * vbios does this for us in asic_init in that case.
340 * Skip MC ucode loading on VF, because hypervisor will do that
341 * for this adaptor.
342 */
343 if (amdgpu_sriov_bios(adev))
344 return 0;
345
346 WREG32(mmMC_SEQ_IO_DEBUG_INDEX, 0x9F);
347 data = RREG32(mmMC_SEQ_IO_DEBUG_DATA);
348 vbios_version = data & 0xf;
349
350 if (vbios_version == 0)
351 return 0;
352
770d13b1 353 if (!adev->gmc.fw)
0d52c6a1
RZ
354 return -EINVAL;
355
770d13b1 356 hdr = (const struct mc_firmware_header_v1_0 *)adev->gmc.fw->data;
0d52c6a1
RZ
357 amdgpu_ucode_print_mc_hdr(&hdr->header);
358
770d13b1 359 adev->gmc.fw_version = le32_to_cpu(hdr->header.ucode_version);
0d52c6a1
RZ
360 regs_size = le32_to_cpu(hdr->io_debug_size_bytes) / (4 * 2);
361 io_mc_regs = (const __le32 *)
770d13b1 362 (adev->gmc.fw->data + le32_to_cpu(hdr->io_debug_array_offset_bytes));
0d52c6a1
RZ
363 ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
364 fw_data = (const __le32 *)
770d13b1 365 (adev->gmc.fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
0d52c6a1
RZ
366
367 data = RREG32(mmMC_SEQ_MISC0);
368 data &= ~(0x40);
369 WREG32(mmMC_SEQ_MISC0, data);
370
371 /* load mc io regs */
372 for (i = 0; i < regs_size; i++) {
373 WREG32(mmMC_SEQ_IO_DEBUG_INDEX, le32_to_cpup(io_mc_regs++));
374 WREG32(mmMC_SEQ_IO_DEBUG_DATA, le32_to_cpup(io_mc_regs++));
375 }
376
377 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000008);
378 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000010);
379
380 /* load the MC ucode */
381 for (i = 0; i < ucode_size; i++)
382 WREG32(mmMC_SEQ_SUP_PGM, le32_to_cpup(fw_data++));
383
384 /* put the engine back into the active state */
385 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000008);
386 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000004);
387 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000001);
388
389 /* wait for training to complete */
390 for (i = 0; i < adev->usec_timeout; i++) {
391 data = RREG32(mmMC_SEQ_MISC0);
392 if (data & 0x80)
393 break;
394 udelay(1);
395 }
396
397 return 0;
398}
399
aaa36a97 400static void gmc_v8_0_vram_gtt_location(struct amdgpu_device *adev,
770d13b1 401 struct amdgpu_gmc *mc)
aaa36a97 402{
e72b9912
ED
403 u64 base = 0;
404
405 if (!amdgpu_sriov_vf(adev))
406 base = RREG32(mmMC_VM_FB_LOCATION) & 0xFFFF;
9081c4cf
AD
407 base <<= 24;
408
770d13b1 409 amdgpu_device_vram_location(adev, &adev->gmc, base);
2543e28a 410 amdgpu_device_gart_location(adev, mc);
aaa36a97
AD
411}
412
413/**
414 * gmc_v8_0_mc_program - program the GPU memory controller
415 *
416 * @adev: amdgpu_device pointer
417 *
418 * Set the location of vram, gart, and AGP in the GPU's
419 * physical address space (CIK).
420 */
421static void gmc_v8_0_mc_program(struct amdgpu_device *adev)
422{
aaa36a97
AD
423 u32 tmp;
424 int i, j;
425
426 /* Initialize HDP */
427 for (i = 0, j = 0; i < 32; i++, j += 0x6) {
428 WREG32((0xb05 + j), 0x00000000);
429 WREG32((0xb06 + j), 0x00000000);
430 WREG32((0xb07 + j), 0x00000000);
431 WREG32((0xb08 + j), 0x00000000);
432 WREG32((0xb09 + j), 0x00000000);
433 }
434 WREG32(mmHDP_REG_COHERENCY_FLUSH_CNTL, 0);
435
34e3205e 436 if (gmc_v8_0_wait_for_idle((void *)adev)) {
aaa36a97
AD
437 dev_warn(adev->dev, "Wait for MC idle timedout !\n");
438 }
2e2bfd90
AD
439 if (adev->mode_info.num_crtc) {
440 /* Lockout access through VGA aperture*/
441 tmp = RREG32(mmVGA_HDP_CONTROL);
442 tmp = REG_SET_FIELD(tmp, VGA_HDP_CONTROL, VGA_MEMORY_DISABLE, 1);
443 WREG32(mmVGA_HDP_CONTROL, tmp);
444
445 /* disable VGA render */
446 tmp = RREG32(mmVGA_RENDER_CONTROL);
447 tmp = REG_SET_FIELD(tmp, VGA_RENDER_CONTROL, VGA_VSTATUS_CNTL, 0);
448 WREG32(mmVGA_RENDER_CONTROL, tmp);
449 }
aaa36a97
AD
450 /* Update configuration */
451 WREG32(mmMC_VM_SYSTEM_APERTURE_LOW_ADDR,
770d13b1 452 adev->gmc.vram_start >> 12);
aaa36a97 453 WREG32(mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR,
770d13b1 454 adev->gmc.vram_end >> 12);
aaa36a97
AD
455 WREG32(mmMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
456 adev->vram_scratch.gpu_addr >> 12);
e72b9912
ED
457
458 if (amdgpu_sriov_vf(adev)) {
770d13b1
CK
459 tmp = ((adev->gmc.vram_end >> 24) & 0xFFFF) << 16;
460 tmp |= ((adev->gmc.vram_start >> 24) & 0xFFFF);
e72b9912
ED
461 WREG32(mmMC_VM_FB_LOCATION, tmp);
462 /* XXX double check these! */
770d13b1 463 WREG32(mmHDP_NONSURFACE_BASE, (adev->gmc.vram_start >> 8));
e72b9912
ED
464 WREG32(mmHDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
465 WREG32(mmHDP_NONSURFACE_SIZE, 0x3FFFFFFF);
466 }
467
aaa36a97
AD
468 WREG32(mmMC_VM_AGP_BASE, 0);
469 WREG32(mmMC_VM_AGP_TOP, 0x0FFFFFFF);
470 WREG32(mmMC_VM_AGP_BOT, 0x0FFFFFFF);
34e3205e 471 if (gmc_v8_0_wait_for_idle((void *)adev)) {
aaa36a97
AD
472 dev_warn(adev->dev, "Wait for MC idle timedout !\n");
473 }
aaa36a97
AD
474
475 WREG32(mmBIF_FB_EN, BIF_FB_EN__FB_READ_EN_MASK | BIF_FB_EN__FB_WRITE_EN_MASK);
476
477 tmp = RREG32(mmHDP_MISC_CNTL);
13459bd0 478 tmp = REG_SET_FIELD(tmp, HDP_MISC_CNTL, FLUSH_INVALIDATE_CACHE, 0);
aaa36a97
AD
479 WREG32(mmHDP_MISC_CNTL, tmp);
480
481 tmp = RREG32(mmHDP_HOST_PATH_CNTL);
482 WREG32(mmHDP_HOST_PATH_CNTL, tmp);
483}
484
485/**
486 * gmc_v8_0_mc_init - initialize the memory controller driver params
487 *
488 * @adev: amdgpu_device pointer
489 *
490 * Look up the amount of vram, vram width, and decide how to place
491 * vram and gart within the GPU's physical address space (CIK).
492 * Returns 0 for success.
493 */
494static int gmc_v8_0_mc_init(struct amdgpu_device *adev)
495{
d6895ad3
CK
496 int r;
497
770d13b1
CK
498 adev->gmc.vram_width = amdgpu_atombios_get_vram_width(adev);
499 if (!adev->gmc.vram_width) {
1ce65f52
HW
500 u32 tmp;
501 int chansize, numchan;
502
503 /* Get VRAM informations */
504 tmp = RREG32(mmMC_ARB_RAMCFG);
505 if (REG_GET_FIELD(tmp, MC_ARB_RAMCFG, CHANSIZE)) {
506 chansize = 64;
507 } else {
508 chansize = 32;
509 }
510 tmp = RREG32(mmMC_SHARED_CHMAP);
511 switch (REG_GET_FIELD(tmp, MC_SHARED_CHMAP, NOOFCHAN)) {
512 case 0:
513 default:
514 numchan = 1;
515 break;
516 case 1:
517 numchan = 2;
518 break;
519 case 2:
520 numchan = 4;
521 break;
522 case 3:
523 numchan = 8;
524 break;
525 case 4:
526 numchan = 3;
527 break;
528 case 5:
529 numchan = 6;
530 break;
531 case 6:
532 numchan = 10;
533 break;
534 case 7:
535 numchan = 12;
536 break;
537 case 8:
538 numchan = 16;
539 break;
540 }
770d13b1 541 adev->gmc.vram_width = numchan * chansize;
aaa36a97 542 }
aaa36a97 543 /* size in MB on si */
770d13b1
CK
544 adev->gmc.mc_vram_size = RREG32(mmCONFIG_MEMSIZE) * 1024ULL * 1024ULL;
545 adev->gmc.real_vram_size = RREG32(mmCONFIG_MEMSIZE) * 1024ULL * 1024ULL;
999446a7 546
d6895ad3
CK
547 if (!(adev->flags & AMD_IS_APU)) {
548 r = amdgpu_device_resize_fb_bar(adev);
549 if (r)
550 return r;
551 }
770d13b1
CK
552 adev->gmc.aper_base = pci_resource_start(adev->pdev, 0);
553 adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);
d6895ad3 554
999446a7
CK
555#ifdef CONFIG_X86_64
556 if (adev->flags & AMD_IS_APU) {
770d13b1
CK
557 adev->gmc.aper_base = ((u64)RREG32(mmMC_VM_FB_OFFSET)) << 22;
558 adev->gmc.aper_size = adev->gmc.real_vram_size;
999446a7
CK
559 }
560#endif
aaa36a97 561
a1493cd5 562 /* In case the PCI BAR is larger than the actual amount of vram */
770d13b1
CK
563 adev->gmc.visible_vram_size = adev->gmc.aper_size;
564 if (adev->gmc.visible_vram_size > adev->gmc.real_vram_size)
565 adev->gmc.visible_vram_size = adev->gmc.real_vram_size;
a1493cd5 566
c3db7b5a
AD
567 /* set the gart size */
568 if (amdgpu_gart_size == -1) {
569 switch (adev->asic_type) {
570 case CHIP_POLARIS11: /* all engines support GPUVM */
571 case CHIP_POLARIS10: /* all engines support GPUVM */
572 case CHIP_POLARIS12: /* all engines support GPUVM */
573 default:
770d13b1 574 adev->gmc.gart_size = 256ULL << 20;
c3db7b5a
AD
575 break;
576 case CHIP_TONGA: /* UVD, VCE do not support GPUVM */
577 case CHIP_FIJI: /* UVD, VCE do not support GPUVM */
578 case CHIP_CARRIZO: /* UVD, VCE do not support GPUVM, DCE SG support */
579 case CHIP_STONEY: /* UVD does not support GPUVM, DCE SG support */
770d13b1 580 adev->gmc.gart_size = 1024ULL << 20;
c3db7b5a
AD
581 break;
582 }
583 } else {
770d13b1 584 adev->gmc.gart_size = (u64)amdgpu_gart_size << 20;
c3db7b5a
AD
585 }
586
770d13b1 587 gmc_v8_0_vram_gtt_location(adev, &adev->gmc);
aaa36a97
AD
588
589 return 0;
590}
591
592/*
593 * GART
594 * VMID 0 is the physical GPU addresses as used by the kernel.
595 * VMIDs 1-15 are used for userspace clients and are handled
596 * by the amdgpu vm/hsa code.
597 */
598
599/**
132f34e4 600 * gmc_v8_0_flush_gpu_tlb - gart tlb flush callback
aaa36a97
AD
601 *
602 * @adev: amdgpu_device pointer
603 * @vmid: vm instance to flush
604 *
605 * Flush the TLB for the requested page table (CIK).
606 */
132f34e4 607static void gmc_v8_0_flush_gpu_tlb(struct amdgpu_device *adev,
aaa36a97
AD
608 uint32_t vmid)
609{
aaa36a97
AD
610 /* bits 0-15 are the VM contexts0-15 */
611 WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
612}
613
614/**
132f34e4 615 * gmc_v8_0_set_pte_pde - update the page tables using MMIO
aaa36a97
AD
616 *
617 * @adev: amdgpu_device pointer
618 * @cpu_pt_addr: cpu address of the page table
619 * @gpu_page_idx: entry in the page table to update
620 * @addr: dst addr to write into pte/pde
621 * @flags: access flags
622 *
623 * Update the page tables using the CPU.
624 */
132f34e4
CK
625static int gmc_v8_0_set_pte_pde(struct amdgpu_device *adev, void *cpu_pt_addr,
626 uint32_t gpu_page_idx, uint64_t addr,
627 uint64_t flags)
aaa36a97
AD
628{
629 void __iomem *ptr = (void *)cpu_pt_addr;
630 uint64_t value;
631
632 /*
633 * PTE format on VI:
634 * 63:40 reserved
635 * 39:12 4k physical page base address
636 * 11:7 fragment
637 * 6 write
638 * 5 read
639 * 4 exe
640 * 3 reserved
641 * 2 snooped
642 * 1 system
643 * 0 valid
644 *
645 * PDE format on VI:
646 * 63:59 block fragment size
647 * 58:40 reserved
648 * 39:1 physical base address of PTE
649 * bits 5:1 must be 0.
650 * 0 valid
651 */
652 value = addr & 0x000000FFFFFFF000ULL;
653 value |= flags;
654 writeq(value, ptr + (gpu_page_idx * 8));
655
656 return 0;
657}
658
5463545b
AX
659static uint64_t gmc_v8_0_get_vm_pte_flags(struct amdgpu_device *adev,
660 uint32_t flags)
661{
662 uint64_t pte_flag = 0;
663
664 if (flags & AMDGPU_VM_PAGE_EXECUTABLE)
665 pte_flag |= AMDGPU_PTE_EXECUTABLE;
666 if (flags & AMDGPU_VM_PAGE_READABLE)
667 pte_flag |= AMDGPU_PTE_READABLE;
668 if (flags & AMDGPU_VM_PAGE_WRITEABLE)
669 pte_flag |= AMDGPU_PTE_WRITEABLE;
670 if (flags & AMDGPU_VM_PAGE_PRT)
671 pte_flag |= AMDGPU_PTE_PRT;
672
673 return pte_flag;
674}
675
3de676d8
CK
676static void gmc_v8_0_get_vm_pde(struct amdgpu_device *adev, int level,
677 uint64_t *addr, uint64_t *flags)
b1166325 678{
3de676d8 679 BUG_ON(*addr & 0xFFFFFF0000000FFFULL);
b1166325
CK
680}
681
d9c13156
CK
682/**
683 * gmc_v8_0_set_fault_enable_default - update VM fault handling
684 *
685 * @adev: amdgpu_device pointer
686 * @value: true redirects VM faults to the default page
687 */
688static void gmc_v8_0_set_fault_enable_default(struct amdgpu_device *adev,
689 bool value)
690{
691 u32 tmp;
692
693 tmp = RREG32(mmVM_CONTEXT1_CNTL);
694 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
695 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
696 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
697 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
698 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
699 PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, value);
700 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
701 VALID_PROTECTION_FAULT_ENABLE_DEFAULT, value);
702 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
703 READ_PROTECTION_FAULT_ENABLE_DEFAULT, value);
704 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
705 WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
706 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
707 EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
708 WREG32(mmVM_CONTEXT1_CNTL, tmp);
709}
710
603adfe8
CK
711/**
712 * gmc_v8_0_set_prt - set PRT VM fault
713 *
714 * @adev: amdgpu_device pointer
715 * @enable: enable/disable VM fault handling for PRT
716*/
717static void gmc_v8_0_set_prt(struct amdgpu_device *adev, bool enable)
718{
719 u32 tmp;
720
770d13b1 721 if (enable && !adev->gmc.prt_warning) {
603adfe8 722 dev_warn(adev->dev, "Disabling VM faults because of PRT request!\n");
770d13b1 723 adev->gmc.prt_warning = true;
603adfe8
CK
724 }
725
726 tmp = RREG32(mmVM_PRT_CNTL);
727 tmp = REG_SET_FIELD(tmp, VM_PRT_CNTL,
728 CB_DISABLE_READ_FAULT_ON_UNMAPPED_ACCESS, enable);
729 tmp = REG_SET_FIELD(tmp, VM_PRT_CNTL,
730 CB_DISABLE_WRITE_FAULT_ON_UNMAPPED_ACCESS, enable);
731 tmp = REG_SET_FIELD(tmp, VM_PRT_CNTL,
732 TC_DISABLE_READ_FAULT_ON_UNMAPPED_ACCESS, enable);
733 tmp = REG_SET_FIELD(tmp, VM_PRT_CNTL,
734 TC_DISABLE_WRITE_FAULT_ON_UNMAPPED_ACCESS, enable);
735 tmp = REG_SET_FIELD(tmp, VM_PRT_CNTL,
736 L2_CACHE_STORE_INVALID_ENTRIES, enable);
737 tmp = REG_SET_FIELD(tmp, VM_PRT_CNTL,
738 L1_TLB_STORE_INVALID_ENTRIES, enable);
739 tmp = REG_SET_FIELD(tmp, VM_PRT_CNTL,
740 MASK_PDE0_FAULT, enable);
741 WREG32(mmVM_PRT_CNTL, tmp);
742
743 if (enable) {
744 uint32_t low = AMDGPU_VA_RESERVED_SIZE >> AMDGPU_GPU_PAGE_SHIFT;
745 uint32_t high = adev->vm_manager.max_pfn;
746
747 WREG32(mmVM_PRT_APERTURE0_LOW_ADDR, low);
748 WREG32(mmVM_PRT_APERTURE1_LOW_ADDR, low);
749 WREG32(mmVM_PRT_APERTURE2_LOW_ADDR, low);
750 WREG32(mmVM_PRT_APERTURE3_LOW_ADDR, low);
751 WREG32(mmVM_PRT_APERTURE0_HIGH_ADDR, high);
752 WREG32(mmVM_PRT_APERTURE1_HIGH_ADDR, high);
753 WREG32(mmVM_PRT_APERTURE2_HIGH_ADDR, high);
754 WREG32(mmVM_PRT_APERTURE3_HIGH_ADDR, high);
755 } else {
756 WREG32(mmVM_PRT_APERTURE0_LOW_ADDR, 0xfffffff);
757 WREG32(mmVM_PRT_APERTURE1_LOW_ADDR, 0xfffffff);
758 WREG32(mmVM_PRT_APERTURE2_LOW_ADDR, 0xfffffff);
759 WREG32(mmVM_PRT_APERTURE3_LOW_ADDR, 0xfffffff);
760 WREG32(mmVM_PRT_APERTURE0_HIGH_ADDR, 0x0);
761 WREG32(mmVM_PRT_APERTURE1_HIGH_ADDR, 0x0);
762 WREG32(mmVM_PRT_APERTURE2_HIGH_ADDR, 0x0);
763 WREG32(mmVM_PRT_APERTURE3_HIGH_ADDR, 0x0);
764 }
765}
766
aaa36a97
AD
767/**
768 * gmc_v8_0_gart_enable - gart enable
769 *
770 * @adev: amdgpu_device pointer
771 *
772 * This sets up the TLBs, programs the page tables for VMID0,
773 * sets up the hw for VMIDs 1-15 which are allocated on
774 * demand, and sets up the global locations for the LDS, GDS,
775 * and GPUVM for FSA64 clients (CIK).
776 * Returns 0 for success, errors for failure.
777 */
778static int gmc_v8_0_gart_enable(struct amdgpu_device *adev)
779{
ce1b1b66 780 int r, i;
e618d306 781 u32 tmp, field;
aaa36a97
AD
782
783 if (adev->gart.robj == NULL) {
784 dev_err(adev->dev, "No VRAM object for PCIE GART.\n");
785 return -EINVAL;
786 }
ce1b1b66
ML
787 r = amdgpu_gart_table_vram_pin(adev);
788 if (r)
789 return r;
aaa36a97
AD
790 /* Setup TLB control */
791 tmp = RREG32(mmMC_VM_MX_L1_TLB_CNTL);
792 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_TLB, 1);
793 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING, 1);
794 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE, 3);
795 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ENABLE_ADVANCED_DRIVER_MODEL, 1);
796 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
797 WREG32(mmMC_VM_MX_L1_TLB_CNTL, tmp);
798 /* Setup L2 cache */
799 tmp = RREG32(mmVM_L2_CNTL);
800 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, 1);
801 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING, 1);
802 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE, 1);
803 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE, 1);
804 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, EFFECTIVE_L2_QUEUE_SIZE, 7);
805 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, CONTEXT1_IDENTITY_ACCESS_MODE, 1);
a80b3047 806 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_DEFAULT_PAGE_OUT_TO_SYSTEM_MEMORY, 1);
aaa36a97
AD
807 WREG32(mmVM_L2_CNTL, tmp);
808 tmp = RREG32(mmVM_L2_CNTL2);
809 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS, 1);
810 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL2, INVALIDATE_L2_CACHE, 1);
811 WREG32(mmVM_L2_CNTL2, tmp);
e618d306
RH
812
813 field = adev->vm_manager.fragment_size;
aaa36a97
AD
814 tmp = RREG32(mmVM_L2_CNTL3);
815 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY, 1);
e618d306
RH
816 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, field);
817 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, L2_CACHE_BIGK_FRAGMENT_SIZE, field);
aaa36a97
AD
818 WREG32(mmVM_L2_CNTL3, tmp);
819 /* XXX: set to enable PTE/PDE in system memory */
820 tmp = RREG32(mmVM_L2_CNTL4);
821 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT0_PDE_REQUEST_PHYSICAL, 0);
822 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT0_PDE_REQUEST_SHARED, 0);
823 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT0_PDE_REQUEST_SNOOP, 0);
824 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT0_PTE_REQUEST_PHYSICAL, 0);
825 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT0_PTE_REQUEST_SHARED, 0);
826 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT0_PTE_REQUEST_SNOOP, 0);
827 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT1_PDE_REQUEST_PHYSICAL, 0);
828 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT1_PDE_REQUEST_SHARED, 0);
829 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT1_PDE_REQUEST_SNOOP, 0);
830 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT1_PTE_REQUEST_PHYSICAL, 0);
831 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT1_PTE_REQUEST_SHARED, 0);
832 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT1_PTE_REQUEST_SNOOP, 0);
833 WREG32(mmVM_L2_CNTL4, tmp);
834 /* setup context0 */
770d13b1
CK
835 WREG32(mmVM_CONTEXT0_PAGE_TABLE_START_ADDR, adev->gmc.gart_start >> 12);
836 WREG32(mmVM_CONTEXT0_PAGE_TABLE_END_ADDR, adev->gmc.gart_end >> 12);
aaa36a97
AD
837 WREG32(mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR, adev->gart.table_addr >> 12);
838 WREG32(mmVM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
839 (u32)(adev->dummy_page.addr >> 12));
840 WREG32(mmVM_CONTEXT0_CNTL2, 0);
841 tmp = RREG32(mmVM_CONTEXT0_CNTL);
842 tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, ENABLE_CONTEXT, 1);
843 tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, PAGE_TABLE_DEPTH, 0);
844 tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
845 WREG32(mmVM_CONTEXT0_CNTL, tmp);
846
847 WREG32(mmVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR, 0);
848 WREG32(mmVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR, 0);
849 WREG32(mmVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET, 0);
850
851 /* empty context1-15 */
852 /* FIXME start with 4G, once using 2 level pt switch to full
853 * vm size space
854 */
855 /* set vm size, must be a multiple of 4 */
856 WREG32(mmVM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
25a595e4 857 WREG32(mmVM_CONTEXT1_PAGE_TABLE_END_ADDR, adev->vm_manager.max_pfn - 1);
aaa36a97
AD
858 for (i = 1; i < 16; i++) {
859 if (i < 8)
860 WREG32(mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR + i,
861 adev->gart.table_addr >> 12);
862 else
863 WREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + i - 8,
864 adev->gart.table_addr >> 12);
865 }
866
867 /* enable context1-15 */
868 WREG32(mmVM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
869 (u32)(adev->dummy_page.addr >> 12));
870 WREG32(mmVM_CONTEXT1_CNTL2, 4);
871 tmp = RREG32(mmVM_CONTEXT1_CNTL);
872 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, ENABLE_CONTEXT, 1);
873 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_DEPTH, 1);
aaa36a97 874 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
aaa36a97 875 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
aaa36a97 876 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
aaa36a97 877 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
aaa36a97 878 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
aaa36a97 879 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
aaa36a97
AD
880 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
881 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_BLOCK_SIZE,
36b32a68 882 adev->vm_manager.block_size - 9);
aaa36a97 883 WREG32(mmVM_CONTEXT1_CNTL, tmp);
d9c13156
CK
884 if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS)
885 gmc_v8_0_set_fault_enable_default(adev, false);
886 else
887 gmc_v8_0_set_fault_enable_default(adev, true);
aaa36a97 888
132f34e4 889 gmc_v8_0_flush_gpu_tlb(adev, 0);
aaa36a97 890 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
770d13b1 891 (unsigned)(adev->gmc.gart_size >> 20),
aaa36a97
AD
892 (unsigned long long)adev->gart.table_addr);
893 adev->gart.ready = true;
894 return 0;
895}
896
897static int gmc_v8_0_gart_init(struct amdgpu_device *adev)
898{
899 int r;
900
901 if (adev->gart.robj) {
902 WARN(1, "R600 PCIE GART already initialized\n");
903 return 0;
904 }
905 /* Initialize common gart structure */
906 r = amdgpu_gart_init(adev);
907 if (r)
908 return r;
909 adev->gart.table_size = adev->gart.num_gpu_pages * 8;
4b98e0c4 910 adev->gart.gart_pte_flags = AMDGPU_PTE_EXECUTABLE;
aaa36a97
AD
911 return amdgpu_gart_table_vram_alloc(adev);
912}
913
914/**
915 * gmc_v8_0_gart_disable - gart disable
916 *
917 * @adev: amdgpu_device pointer
918 *
919 * This disables all VM page table (CIK).
920 */
921static void gmc_v8_0_gart_disable(struct amdgpu_device *adev)
922{
923 u32 tmp;
924
925 /* Disable all tables */
926 WREG32(mmVM_CONTEXT0_CNTL, 0);
927 WREG32(mmVM_CONTEXT1_CNTL, 0);
928 /* Setup TLB control */
929 tmp = RREG32(mmMC_VM_MX_L1_TLB_CNTL);
930 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_TLB, 0);
931 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING, 0);
932 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ENABLE_ADVANCED_DRIVER_MODEL, 0);
933 WREG32(mmMC_VM_MX_L1_TLB_CNTL, tmp);
934 /* Setup L2 cache */
935 tmp = RREG32(mmVM_L2_CNTL);
936 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, 0);
937 WREG32(mmVM_L2_CNTL, tmp);
938 WREG32(mmVM_L2_CNTL2, 0);
ce1b1b66 939 amdgpu_gart_table_vram_unpin(adev);
aaa36a97
AD
940}
941
942/**
943 * gmc_v8_0_gart_fini - vm fini callback
944 *
945 * @adev: amdgpu_device pointer
946 *
947 * Tears down the driver GART/VM setup (CIK).
948 */
949static void gmc_v8_0_gart_fini(struct amdgpu_device *adev)
950{
951 amdgpu_gart_table_vram_free(adev);
952 amdgpu_gart_fini(adev);
953}
954
aaa36a97
AD
955/**
956 * gmc_v8_0_vm_decode_fault - print human readable fault info
957 *
958 * @adev: amdgpu_device pointer
959 * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
960 * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
961 *
962 * Print human readable fault information (CIK).
963 */
904a3374
CK
964static void gmc_v8_0_vm_decode_fault(struct amdgpu_device *adev, u32 status,
965 u32 addr, u32 mc_client, unsigned pasid)
aaa36a97 966{
aaa36a97
AD
967 u32 vmid = REG_GET_FIELD(status, VM_CONTEXT1_PROTECTION_FAULT_STATUS, VMID);
968 u32 protections = REG_GET_FIELD(status, VM_CONTEXT1_PROTECTION_FAULT_STATUS,
969 PROTECTIONS);
970 char block[5] = { mc_client >> 24, (mc_client >> 16) & 0xff,
971 (mc_client >> 8) & 0xff, mc_client & 0xff, 0 };
904a3374 972 u32 mc_id;
aaa36a97
AD
973
974 mc_id = REG_GET_FIELD(status, VM_CONTEXT1_PROTECTION_FAULT_STATUS,
975 MEMORY_CLIENT_ID);
976
904a3374
CK
977 dev_err(adev->dev, "VM fault (0x%02x, vmid %d, pasid %d) at page %u, %s from '%s' (0x%08x) (%d)\n",
978 protections, vmid, pasid, addr,
aaa36a97
AD
979 REG_GET_FIELD(status, VM_CONTEXT1_PROTECTION_FAULT_STATUS,
980 MEMORY_CLIENT_RW) ?
981 "write" : "read", block, mc_client, mc_id);
982}
983
81c59f54
KW
984static int gmc_v8_0_convert_vram_type(int mc_seq_vram_type)
985{
986 switch (mc_seq_vram_type) {
987 case MC_SEQ_MISC0__MT__GDDR1:
988 return AMDGPU_VRAM_TYPE_GDDR1;
989 case MC_SEQ_MISC0__MT__DDR2:
990 return AMDGPU_VRAM_TYPE_DDR2;
991 case MC_SEQ_MISC0__MT__GDDR3:
992 return AMDGPU_VRAM_TYPE_GDDR3;
993 case MC_SEQ_MISC0__MT__GDDR4:
994 return AMDGPU_VRAM_TYPE_GDDR4;
995 case MC_SEQ_MISC0__MT__GDDR5:
996 return AMDGPU_VRAM_TYPE_GDDR5;
997 case MC_SEQ_MISC0__MT__HBM:
998 return AMDGPU_VRAM_TYPE_HBM;
999 case MC_SEQ_MISC0__MT__DDR3:
1000 return AMDGPU_VRAM_TYPE_DDR3;
1001 default:
1002 return AMDGPU_VRAM_TYPE_UNKNOWN;
1003 }
1004}
1005
5fc3aeeb 1006static int gmc_v8_0_early_init(void *handle)
aaa36a97 1007{
5fc3aeeb 1008 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1009
132f34e4 1010 gmc_v8_0_set_gmc_funcs(adev);
aaa36a97
AD
1011 gmc_v8_0_set_irq_funcs(adev);
1012
770d13b1
CK
1013 adev->gmc.shared_aperture_start = 0x2000000000000000ULL;
1014 adev->gmc.shared_aperture_end =
1015 adev->gmc.shared_aperture_start + (4ULL << 30) - 1;
1016 adev->gmc.private_aperture_start =
1017 adev->gmc.shared_aperture_end + 1;
1018 adev->gmc.private_aperture_end =
1019 adev->gmc.private_aperture_start + (4ULL << 30) - 1;
8fe73328 1020
aaa36a97
AD
1021 return 0;
1022}
1023
140b519f
CK
1024static int gmc_v8_0_late_init(void *handle)
1025{
1026 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1027
afc45421 1028 if (amdgpu_vm_fault_stop != AMDGPU_VM_FAULT_STOP_ALWAYS)
770d13b1 1029 return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0);
afc45421
FC
1030 else
1031 return 0;
140b519f
CK
1032}
1033
b634de4f
AD
1034#define mmMC_SEQ_MISC0_FIJI 0xA71
1035
5fc3aeeb 1036static int gmc_v8_0_sw_init(void *handle)
aaa36a97
AD
1037{
1038 int r;
1039 int dma_bits;
5fc3aeeb 1040 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
aaa36a97 1041
d1518a1d 1042 if (adev->flags & AMD_IS_APU) {
770d13b1 1043 adev->gmc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN;
d1518a1d 1044 } else {
b634de4f
AD
1045 u32 tmp;
1046
1047 if (adev->asic_type == CHIP_FIJI)
1048 tmp = RREG32(mmMC_SEQ_MISC0_FIJI);
1049 else
1050 tmp = RREG32(mmMC_SEQ_MISC0);
d1518a1d 1051 tmp &= MC_SEQ_MISC0__MT__MASK;
770d13b1 1052 adev->gmc.vram_type = gmc_v8_0_convert_vram_type(tmp);
d1518a1d
AD
1053 }
1054
770d13b1 1055 r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 146, &adev->gmc.vm_fault);
aaa36a97
AD
1056 if (r)
1057 return r;
1058
770d13b1 1059 r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 147, &adev->gmc.vm_fault);
aaa36a97
AD
1060 if (r)
1061 return r;
1062
1063 /* Adjust VM size here.
1064 * Currently set to 4GB ((1 << 20) 4k pages).
1065 * Max GPUVM size for cayman and SI is 40 bits.
1066 */
f3368128 1067 amdgpu_vm_adjust_size(adev, 64, 9, 1, 40);
36b32a68 1068
aaa36a97
AD
1069 /* Set the internal MC address mask
1070 * This is the max address of the GPU's
1071 * internal address space.
1072 */
770d13b1 1073 adev->gmc.mc_mask = 0xffffffffffULL; /* 40 bit MC */
aaa36a97 1074
770d13b1 1075 adev->gmc.stolen_size = 256 * 1024;
916910ad 1076
aaa36a97
AD
1077 /* set DMA mask + need_dma32 flags.
1078 * PCIE - can handle 40-bits.
1079 * IGP - can handle 40-bits
1080 * PCI - dma32 for legacy pci gart, 40 bits on newer asics
1081 */
1082 adev->need_dma32 = false;
1083 dma_bits = adev->need_dma32 ? 32 : 40;
fd5fd480 1084 adev->need_swiotlb = drm_get_max_iomem() > ((u64)1 << dma_bits);
aaa36a97
AD
1085 r = pci_set_dma_mask(adev->pdev, DMA_BIT_MASK(dma_bits));
1086 if (r) {
1087 adev->need_dma32 = true;
1088 dma_bits = 32;
7ca85295 1089 pr_warn("amdgpu: No suitable DMA available\n");
aaa36a97
AD
1090 }
1091 r = pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(dma_bits));
1092 if (r) {
1093 pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(32));
7ca85295 1094 pr_warn("amdgpu: No coherent DMA available\n");
aaa36a97 1095 }
fd5fd480 1096 adev->need_swiotlb = drm_get_max_iomem() > ((u64)1 << dma_bits);
aaa36a97
AD
1097
1098 r = gmc_v8_0_init_microcode(adev);
1099 if (r) {
1100 DRM_ERROR("Failed to load mc firmware!\n");
1101 return r;
1102 }
1103
1104 r = gmc_v8_0_mc_init(adev);
1105 if (r)
1106 return r;
1107
1108 /* Memory manager */
1109 r = amdgpu_bo_init(adev);
1110 if (r)
1111 return r;
1112
1113 r = gmc_v8_0_gart_init(adev);
1114 if (r)
1115 return r;
1116
05ec3eda
CK
1117 /*
1118 * number of VMs
1119 * VMID 0 is reserved for System
1120 * amdgpu graphics/compute will use VMIDs 1-7
1121 * amdkfd will use VMIDs 8-15
1122 */
1123 adev->vm_manager.id_mgr[0].num_ids = AMDGPU_NUM_OF_VMIDS;
05ec3eda
CK
1124 amdgpu_vm_manager_init(adev);
1125
1126 /* base offset of vram pages */
1127 if (adev->flags & AMD_IS_APU) {
1128 u64 tmp = RREG32(mmMC_VM_FB_OFFSET);
1129
1130 tmp <<= 22;
1131 adev->vm_manager.vram_base_offset = tmp;
1132 } else {
1133 adev->vm_manager.vram_base_offset = 0;
aaa36a97
AD
1134 }
1135
05ec3eda 1136 return 0;
aaa36a97
AD
1137}
1138
5fc3aeeb 1139static int gmc_v8_0_sw_fini(void *handle)
aaa36a97 1140{
5fc3aeeb 1141 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
aaa36a97 1142
f59548c8 1143 amdgpu_gem_force_release(adev);
05ec3eda 1144 amdgpu_vm_manager_fini(adev);
aaa36a97 1145 gmc_v8_0_gart_fini(adev);
aaa36a97 1146 amdgpu_bo_fini(adev);
770d13b1
CK
1147 release_firmware(adev->gmc.fw);
1148 adev->gmc.fw = NULL;
aaa36a97
AD
1149
1150 return 0;
1151}
1152
5fc3aeeb 1153static int gmc_v8_0_hw_init(void *handle)
aaa36a97
AD
1154{
1155 int r;
5fc3aeeb 1156 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
aaa36a97
AD
1157
1158 gmc_v8_0_init_golden_registers(adev);
1159
1160 gmc_v8_0_mc_program(adev);
1161
8878d854 1162 if (adev->asic_type == CHIP_TONGA) {
0d52c6a1
RZ
1163 r = gmc_v8_0_tonga_mc_load_microcode(adev);
1164 if (r) {
1165 DRM_ERROR("Failed to load MC firmware!\n");
1166 return r;
1167 }
1168 } else if (adev->asic_type == CHIP_POLARIS11 ||
1169 adev->asic_type == CHIP_POLARIS10 ||
1170 adev->asic_type == CHIP_POLARIS12) {
1171 r = gmc_v8_0_polaris_mc_load_microcode(adev);
aaa36a97
AD
1172 if (r) {
1173 DRM_ERROR("Failed to load MC firmware!\n");
1174 return r;
1175 }
1176 }
1177
1178 r = gmc_v8_0_gart_enable(adev);
1179 if (r)
1180 return r;
1181
1182 return r;
1183}
1184
5fc3aeeb 1185static int gmc_v8_0_hw_fini(void *handle)
aaa36a97 1186{
5fc3aeeb 1187 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1188
770d13b1 1189 amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
aaa36a97
AD
1190 gmc_v8_0_gart_disable(adev);
1191
1192 return 0;
1193}
1194
5fc3aeeb 1195static int gmc_v8_0_suspend(void *handle)
aaa36a97 1196{
5fc3aeeb 1197 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
aaa36a97 1198
aaa36a97
AD
1199 gmc_v8_0_hw_fini(adev);
1200
1201 return 0;
1202}
1203
5fc3aeeb 1204static int gmc_v8_0_resume(void *handle)
aaa36a97
AD
1205{
1206 int r;
5fc3aeeb 1207 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
aaa36a97
AD
1208
1209 r = gmc_v8_0_hw_init(adev);
1210 if (r)
1211 return r;
1212
620f774f 1213 amdgpu_vmid_reset_all(adev);
aaa36a97 1214
b3c85a0f 1215 return 0;
aaa36a97
AD
1216}
1217
5fc3aeeb 1218static bool gmc_v8_0_is_idle(void *handle)
aaa36a97 1219{
5fc3aeeb 1220 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
aaa36a97
AD
1221 u32 tmp = RREG32(mmSRBM_STATUS);
1222
1223 if (tmp & (SRBM_STATUS__MCB_BUSY_MASK | SRBM_STATUS__MCB_NON_DISPLAY_BUSY_MASK |
1224 SRBM_STATUS__MCC_BUSY_MASK | SRBM_STATUS__MCD_BUSY_MASK | SRBM_STATUS__VMC_BUSY_MASK))
1225 return false;
1226
1227 return true;
1228}
1229
5fc3aeeb 1230static int gmc_v8_0_wait_for_idle(void *handle)
aaa36a97
AD
1231{
1232 unsigned i;
1233 u32 tmp;
5fc3aeeb 1234 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
aaa36a97
AD
1235
1236 for (i = 0; i < adev->usec_timeout; i++) {
1237 /* read MC_STATUS */
1238 tmp = RREG32(mmSRBM_STATUS) & (SRBM_STATUS__MCB_BUSY_MASK |
1239 SRBM_STATUS__MCB_NON_DISPLAY_BUSY_MASK |
1240 SRBM_STATUS__MCC_BUSY_MASK |
1241 SRBM_STATUS__MCD_BUSY_MASK |
1242 SRBM_STATUS__VMC_BUSY_MASK |
1243 SRBM_STATUS__VMC1_BUSY_MASK);
1244 if (!tmp)
1245 return 0;
1246 udelay(1);
1247 }
1248 return -ETIMEDOUT;
1249
1250}
1251
da146d3b 1252static bool gmc_v8_0_check_soft_reset(void *handle)
aaa36a97 1253{
aaa36a97 1254 u32 srbm_soft_reset = 0;
5fc3aeeb 1255 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
aaa36a97
AD
1256 u32 tmp = RREG32(mmSRBM_STATUS);
1257
1258 if (tmp & SRBM_STATUS__VMC_BUSY_MASK)
1259 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset,
1260 SRBM_SOFT_RESET, SOFT_RESET_VMC, 1);
1261
1262 if (tmp & (SRBM_STATUS__MCB_BUSY_MASK | SRBM_STATUS__MCB_NON_DISPLAY_BUSY_MASK |
1263 SRBM_STATUS__MCC_BUSY_MASK | SRBM_STATUS__MCD_BUSY_MASK)) {
2f7d10b3 1264 if (!(adev->flags & AMD_IS_APU))
aaa36a97
AD
1265 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset,
1266 SRBM_SOFT_RESET, SOFT_RESET_MC, 1);
1267 }
aaa36a97 1268 if (srbm_soft_reset) {
770d13b1 1269 adev->gmc.srbm_soft_reset = srbm_soft_reset;
da146d3b 1270 return true;
50b0197a 1271 } else {
770d13b1 1272 adev->gmc.srbm_soft_reset = 0;
da146d3b 1273 return false;
50b0197a 1274 }
50b0197a 1275}
aaa36a97 1276
50b0197a
CZ
1277static int gmc_v8_0_pre_soft_reset(void *handle)
1278{
1279 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1280
770d13b1 1281 if (!adev->gmc.srbm_soft_reset)
50b0197a
CZ
1282 return 0;
1283
e4f6b39e 1284 gmc_v8_0_mc_stop(adev);
50b0197a
CZ
1285 if (gmc_v8_0_wait_for_idle(adev)) {
1286 dev_warn(adev->dev, "Wait for GMC idle timed out !\n");
1287 }
1288
1289 return 0;
1290}
aaa36a97 1291
50b0197a
CZ
1292static int gmc_v8_0_soft_reset(void *handle)
1293{
1294 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1295 u32 srbm_soft_reset;
1296
770d13b1 1297 if (!adev->gmc.srbm_soft_reset)
50b0197a 1298 return 0;
770d13b1 1299 srbm_soft_reset = adev->gmc.srbm_soft_reset;
50b0197a
CZ
1300
1301 if (srbm_soft_reset) {
1302 u32 tmp;
aaa36a97
AD
1303
1304 tmp = RREG32(mmSRBM_SOFT_RESET);
1305 tmp |= srbm_soft_reset;
1306 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
1307 WREG32(mmSRBM_SOFT_RESET, tmp);
1308 tmp = RREG32(mmSRBM_SOFT_RESET);
1309
1310 udelay(50);
1311
1312 tmp &= ~srbm_soft_reset;
1313 WREG32(mmSRBM_SOFT_RESET, tmp);
1314 tmp = RREG32(mmSRBM_SOFT_RESET);
1315
1316 /* Wait a little for things to settle down */
1317 udelay(50);
aaa36a97
AD
1318 }
1319
1320 return 0;
1321}
1322
50b0197a
CZ
1323static int gmc_v8_0_post_soft_reset(void *handle)
1324{
1325 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1326
770d13b1 1327 if (!adev->gmc.srbm_soft_reset)
50b0197a
CZ
1328 return 0;
1329
e4f6b39e 1330 gmc_v8_0_mc_resume(adev);
50b0197a
CZ
1331 return 0;
1332}
1333
aaa36a97
AD
1334static int gmc_v8_0_vm_fault_interrupt_state(struct amdgpu_device *adev,
1335 struct amdgpu_irq_src *src,
1336 unsigned type,
1337 enum amdgpu_interrupt_state state)
1338{
1339 u32 tmp;
1340 u32 bits = (VM_CONTEXT1_CNTL__RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
1341 VM_CONTEXT1_CNTL__DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
1342 VM_CONTEXT1_CNTL__PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
1343 VM_CONTEXT1_CNTL__VALID_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
1344 VM_CONTEXT1_CNTL__READ_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
1345 VM_CONTEXT1_CNTL__WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
1346 VM_CONTEXT1_CNTL__EXECUTE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK);
1347
1348 switch (state) {
1349 case AMDGPU_IRQ_STATE_DISABLE:
1350 /* system context */
1351 tmp = RREG32(mmVM_CONTEXT0_CNTL);
1352 tmp &= ~bits;
1353 WREG32(mmVM_CONTEXT0_CNTL, tmp);
1354 /* VMs */
1355 tmp = RREG32(mmVM_CONTEXT1_CNTL);
1356 tmp &= ~bits;
1357 WREG32(mmVM_CONTEXT1_CNTL, tmp);
1358 break;
1359 case AMDGPU_IRQ_STATE_ENABLE:
1360 /* system context */
1361 tmp = RREG32(mmVM_CONTEXT0_CNTL);
1362 tmp |= bits;
1363 WREG32(mmVM_CONTEXT0_CNTL, tmp);
1364 /* VMs */
1365 tmp = RREG32(mmVM_CONTEXT1_CNTL);
1366 tmp |= bits;
1367 WREG32(mmVM_CONTEXT1_CNTL, tmp);
1368 break;
1369 default:
1370 break;
1371 }
1372
1373 return 0;
1374}
1375
1376static int gmc_v8_0_process_interrupt(struct amdgpu_device *adev,
1377 struct amdgpu_irq_src *source,
1378 struct amdgpu_iv_entry *entry)
1379{
1380 u32 addr, status, mc_client;
1381
edcafc02
PD
1382 if (amdgpu_sriov_vf(adev)) {
1383 dev_err(adev->dev, "GPU fault detected: %d 0x%08x\n",
7ccf5aa8 1384 entry->src_id, entry->src_data[0]);
edcafc02
PD
1385 dev_err(adev->dev, " Can't decode VM fault info here on SRIOV VF\n");
1386 return 0;
1387 }
1388
aaa36a97
AD
1389 addr = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_ADDR);
1390 status = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_STATUS);
1391 mc_client = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_MCCLIENT);
ce0c6bcd
CK
1392 /* reset addr and status */
1393 WREG32_P(mmVM_CONTEXT1_CNTL2, 1, ~1);
1394
1395 if (!addr && !status)
1396 return 0;
1397
d9c13156
CK
1398 if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_FIRST)
1399 gmc_v8_0_set_fault_enable_default(adev, false);
1400
01615881
EC
1401 if (printk_ratelimit()) {
1402 dev_err(adev->dev, "GPU fault detected: %d 0x%08x\n",
7ccf5aa8 1403 entry->src_id, entry->src_data[0]);
01615881
EC
1404 dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
1405 addr);
1406 dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
1407 status);
904a3374
CK
1408 gmc_v8_0_vm_decode_fault(adev, status, addr, mc_client,
1409 entry->pasid);
01615881 1410 }
aaa36a97
AD
1411
1412 return 0;
1413}
1414
a0d69786 1415static void fiji_update_mc_medium_grain_clock_gating(struct amdgpu_device *adev,
3fde56b8 1416 bool enable)
a0d69786
EH
1417{
1418 uint32_t data;
1419
3fde56b8 1420 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG)) {
a0d69786
EH
1421 data = RREG32(mmMC_HUB_MISC_HUB_CG);
1422 data |= MC_HUB_MISC_HUB_CG__ENABLE_MASK;
1423 WREG32(mmMC_HUB_MISC_HUB_CG, data);
1424
1425 data = RREG32(mmMC_HUB_MISC_SIP_CG);
1426 data |= MC_HUB_MISC_SIP_CG__ENABLE_MASK;
1427 WREG32(mmMC_HUB_MISC_SIP_CG, data);
1428
1429 data = RREG32(mmMC_HUB_MISC_VM_CG);
1430 data |= MC_HUB_MISC_VM_CG__ENABLE_MASK;
1431 WREG32(mmMC_HUB_MISC_VM_CG, data);
1432
1433 data = RREG32(mmMC_XPB_CLK_GAT);
1434 data |= MC_XPB_CLK_GAT__ENABLE_MASK;
1435 WREG32(mmMC_XPB_CLK_GAT, data);
1436
1437 data = RREG32(mmATC_MISC_CG);
1438 data |= ATC_MISC_CG__ENABLE_MASK;
1439 WREG32(mmATC_MISC_CG, data);
1440
1441 data = RREG32(mmMC_CITF_MISC_WR_CG);
1442 data |= MC_CITF_MISC_WR_CG__ENABLE_MASK;
1443 WREG32(mmMC_CITF_MISC_WR_CG, data);
1444
1445 data = RREG32(mmMC_CITF_MISC_RD_CG);
1446 data |= MC_CITF_MISC_RD_CG__ENABLE_MASK;
1447 WREG32(mmMC_CITF_MISC_RD_CG, data);
1448
1449 data = RREG32(mmMC_CITF_MISC_VM_CG);
1450 data |= MC_CITF_MISC_VM_CG__ENABLE_MASK;
1451 WREG32(mmMC_CITF_MISC_VM_CG, data);
1452
1453 data = RREG32(mmVM_L2_CG);
1454 data |= VM_L2_CG__ENABLE_MASK;
1455 WREG32(mmVM_L2_CG, data);
1456 } else {
1457 data = RREG32(mmMC_HUB_MISC_HUB_CG);
1458 data &= ~MC_HUB_MISC_HUB_CG__ENABLE_MASK;
1459 WREG32(mmMC_HUB_MISC_HUB_CG, data);
1460
1461 data = RREG32(mmMC_HUB_MISC_SIP_CG);
1462 data &= ~MC_HUB_MISC_SIP_CG__ENABLE_MASK;
1463 WREG32(mmMC_HUB_MISC_SIP_CG, data);
1464
1465 data = RREG32(mmMC_HUB_MISC_VM_CG);
1466 data &= ~MC_HUB_MISC_VM_CG__ENABLE_MASK;
1467 WREG32(mmMC_HUB_MISC_VM_CG, data);
1468
1469 data = RREG32(mmMC_XPB_CLK_GAT);
1470 data &= ~MC_XPB_CLK_GAT__ENABLE_MASK;
1471 WREG32(mmMC_XPB_CLK_GAT, data);
1472
1473 data = RREG32(mmATC_MISC_CG);
1474 data &= ~ATC_MISC_CG__ENABLE_MASK;
1475 WREG32(mmATC_MISC_CG, data);
1476
1477 data = RREG32(mmMC_CITF_MISC_WR_CG);
1478 data &= ~MC_CITF_MISC_WR_CG__ENABLE_MASK;
1479 WREG32(mmMC_CITF_MISC_WR_CG, data);
1480
1481 data = RREG32(mmMC_CITF_MISC_RD_CG);
1482 data &= ~MC_CITF_MISC_RD_CG__ENABLE_MASK;
1483 WREG32(mmMC_CITF_MISC_RD_CG, data);
1484
1485 data = RREG32(mmMC_CITF_MISC_VM_CG);
1486 data &= ~MC_CITF_MISC_VM_CG__ENABLE_MASK;
1487 WREG32(mmMC_CITF_MISC_VM_CG, data);
1488
1489 data = RREG32(mmVM_L2_CG);
1490 data &= ~VM_L2_CG__ENABLE_MASK;
1491 WREG32(mmVM_L2_CG, data);
1492 }
1493}
1494
1495static void fiji_update_mc_light_sleep(struct amdgpu_device *adev,
3fde56b8 1496 bool enable)
a0d69786
EH
1497{
1498 uint32_t data;
1499
3fde56b8 1500 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_LS)) {
a0d69786
EH
1501 data = RREG32(mmMC_HUB_MISC_HUB_CG);
1502 data |= MC_HUB_MISC_HUB_CG__MEM_LS_ENABLE_MASK;
1503 WREG32(mmMC_HUB_MISC_HUB_CG, data);
1504
1505 data = RREG32(mmMC_HUB_MISC_SIP_CG);
1506 data |= MC_HUB_MISC_SIP_CG__MEM_LS_ENABLE_MASK;
1507 WREG32(mmMC_HUB_MISC_SIP_CG, data);
1508
1509 data = RREG32(mmMC_HUB_MISC_VM_CG);
1510 data |= MC_HUB_MISC_VM_CG__MEM_LS_ENABLE_MASK;
1511 WREG32(mmMC_HUB_MISC_VM_CG, data);
1512
1513 data = RREG32(mmMC_XPB_CLK_GAT);
1514 data |= MC_XPB_CLK_GAT__MEM_LS_ENABLE_MASK;
1515 WREG32(mmMC_XPB_CLK_GAT, data);
1516
1517 data = RREG32(mmATC_MISC_CG);
1518 data |= ATC_MISC_CG__MEM_LS_ENABLE_MASK;
1519 WREG32(mmATC_MISC_CG, data);
1520
1521 data = RREG32(mmMC_CITF_MISC_WR_CG);
1522 data |= MC_CITF_MISC_WR_CG__MEM_LS_ENABLE_MASK;
1523 WREG32(mmMC_CITF_MISC_WR_CG, data);
1524
1525 data = RREG32(mmMC_CITF_MISC_RD_CG);
1526 data |= MC_CITF_MISC_RD_CG__MEM_LS_ENABLE_MASK;
1527 WREG32(mmMC_CITF_MISC_RD_CG, data);
1528
1529 data = RREG32(mmMC_CITF_MISC_VM_CG);
1530 data |= MC_CITF_MISC_VM_CG__MEM_LS_ENABLE_MASK;
1531 WREG32(mmMC_CITF_MISC_VM_CG, data);
1532
1533 data = RREG32(mmVM_L2_CG);
1534 data |= VM_L2_CG__MEM_LS_ENABLE_MASK;
1535 WREG32(mmVM_L2_CG, data);
1536 } else {
1537 data = RREG32(mmMC_HUB_MISC_HUB_CG);
1538 data &= ~MC_HUB_MISC_HUB_CG__MEM_LS_ENABLE_MASK;
1539 WREG32(mmMC_HUB_MISC_HUB_CG, data);
1540
1541 data = RREG32(mmMC_HUB_MISC_SIP_CG);
1542 data &= ~MC_HUB_MISC_SIP_CG__MEM_LS_ENABLE_MASK;
1543 WREG32(mmMC_HUB_MISC_SIP_CG, data);
1544
1545 data = RREG32(mmMC_HUB_MISC_VM_CG);
1546 data &= ~MC_HUB_MISC_VM_CG__MEM_LS_ENABLE_MASK;
1547 WREG32(mmMC_HUB_MISC_VM_CG, data);
1548
1549 data = RREG32(mmMC_XPB_CLK_GAT);
1550 data &= ~MC_XPB_CLK_GAT__MEM_LS_ENABLE_MASK;
1551 WREG32(mmMC_XPB_CLK_GAT, data);
1552
1553 data = RREG32(mmATC_MISC_CG);
1554 data &= ~ATC_MISC_CG__MEM_LS_ENABLE_MASK;
1555 WREG32(mmATC_MISC_CG, data);
1556
1557 data = RREG32(mmMC_CITF_MISC_WR_CG);
1558 data &= ~MC_CITF_MISC_WR_CG__MEM_LS_ENABLE_MASK;
1559 WREG32(mmMC_CITF_MISC_WR_CG, data);
1560
1561 data = RREG32(mmMC_CITF_MISC_RD_CG);
1562 data &= ~MC_CITF_MISC_RD_CG__MEM_LS_ENABLE_MASK;
1563 WREG32(mmMC_CITF_MISC_RD_CG, data);
1564
1565 data = RREG32(mmMC_CITF_MISC_VM_CG);
1566 data &= ~MC_CITF_MISC_VM_CG__MEM_LS_ENABLE_MASK;
1567 WREG32(mmMC_CITF_MISC_VM_CG, data);
1568
1569 data = RREG32(mmVM_L2_CG);
1570 data &= ~VM_L2_CG__MEM_LS_ENABLE_MASK;
1571 WREG32(mmVM_L2_CG, data);
1572 }
1573}
1574
5fc3aeeb 1575static int gmc_v8_0_set_clockgating_state(void *handle,
1576 enum amd_clockgating_state state)
aaa36a97 1577{
a0d69786
EH
1578 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1579
ce137c04
ML
1580 if (amdgpu_sriov_vf(adev))
1581 return 0;
1582
a0d69786
EH
1583 switch (adev->asic_type) {
1584 case CHIP_FIJI:
1585 fiji_update_mc_medium_grain_clock_gating(adev,
7e913664 1586 state == AMD_CG_STATE_GATE);
a0d69786 1587 fiji_update_mc_light_sleep(adev,
7e913664 1588 state == AMD_CG_STATE_GATE);
a0d69786
EH
1589 break;
1590 default:
1591 break;
1592 }
aaa36a97
AD
1593 return 0;
1594}
1595
5fc3aeeb 1596static int gmc_v8_0_set_powergating_state(void *handle,
1597 enum amd_powergating_state state)
aaa36a97
AD
1598{
1599 return 0;
1600}
1601
8bcab092
HR
1602static void gmc_v8_0_get_clockgating_state(void *handle, u32 *flags)
1603{
1604 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1605 int data;
1606
ce137c04
ML
1607 if (amdgpu_sriov_vf(adev))
1608 *flags = 0;
1609
8bcab092
HR
1610 /* AMD_CG_SUPPORT_MC_MGCG */
1611 data = RREG32(mmMC_HUB_MISC_HUB_CG);
1612 if (data & MC_HUB_MISC_HUB_CG__ENABLE_MASK)
1613 *flags |= AMD_CG_SUPPORT_MC_MGCG;
1614
1615 /* AMD_CG_SUPPORT_MC_LS */
1616 if (data & MC_HUB_MISC_HUB_CG__MEM_LS_ENABLE_MASK)
1617 *flags |= AMD_CG_SUPPORT_MC_LS;
1618}
1619
a1255107 1620static const struct amd_ip_funcs gmc_v8_0_ip_funcs = {
88a907d6 1621 .name = "gmc_v8_0",
aaa36a97 1622 .early_init = gmc_v8_0_early_init,
140b519f 1623 .late_init = gmc_v8_0_late_init,
aaa36a97
AD
1624 .sw_init = gmc_v8_0_sw_init,
1625 .sw_fini = gmc_v8_0_sw_fini,
1626 .hw_init = gmc_v8_0_hw_init,
1627 .hw_fini = gmc_v8_0_hw_fini,
1628 .suspend = gmc_v8_0_suspend,
1629 .resume = gmc_v8_0_resume,
1630 .is_idle = gmc_v8_0_is_idle,
1631 .wait_for_idle = gmc_v8_0_wait_for_idle,
50b0197a
CZ
1632 .check_soft_reset = gmc_v8_0_check_soft_reset,
1633 .pre_soft_reset = gmc_v8_0_pre_soft_reset,
aaa36a97 1634 .soft_reset = gmc_v8_0_soft_reset,
50b0197a 1635 .post_soft_reset = gmc_v8_0_post_soft_reset,
aaa36a97
AD
1636 .set_clockgating_state = gmc_v8_0_set_clockgating_state,
1637 .set_powergating_state = gmc_v8_0_set_powergating_state,
8bcab092 1638 .get_clockgating_state = gmc_v8_0_get_clockgating_state,
aaa36a97
AD
1639};
1640
132f34e4
CK
1641static const struct amdgpu_gmc_funcs gmc_v8_0_gmc_funcs = {
1642 .flush_gpu_tlb = gmc_v8_0_flush_gpu_tlb,
1643 .set_pte_pde = gmc_v8_0_set_pte_pde,
603adfe8 1644 .set_prt = gmc_v8_0_set_prt,
b1166325
CK
1645 .get_vm_pte_flags = gmc_v8_0_get_vm_pte_flags,
1646 .get_vm_pde = gmc_v8_0_get_vm_pde
aaa36a97
AD
1647};
1648
1649static const struct amdgpu_irq_src_funcs gmc_v8_0_irq_funcs = {
1650 .set = gmc_v8_0_vm_fault_interrupt_state,
1651 .process = gmc_v8_0_process_interrupt,
1652};
1653
132f34e4 1654static void gmc_v8_0_set_gmc_funcs(struct amdgpu_device *adev)
aaa36a97 1655{
132f34e4
CK
1656 if (adev->gmc.gmc_funcs == NULL)
1657 adev->gmc.gmc_funcs = &gmc_v8_0_gmc_funcs;
aaa36a97
AD
1658}
1659
1660static void gmc_v8_0_set_irq_funcs(struct amdgpu_device *adev)
1661{
770d13b1
CK
1662 adev->gmc.vm_fault.num_types = 1;
1663 adev->gmc.vm_fault.funcs = &gmc_v8_0_irq_funcs;
aaa36a97 1664}
a1255107
AD
1665
1666const struct amdgpu_ip_block_version gmc_v8_0_ip_block =
1667{
1668 .type = AMD_IP_BLOCK_TYPE_GMC,
1669 .major = 8,
1670 .minor = 0,
1671 .rev = 0,
1672 .funcs = &gmc_v8_0_ip_funcs,
1673};
1674
1675const struct amdgpu_ip_block_version gmc_v8_1_ip_block =
1676{
1677 .type = AMD_IP_BLOCK_TYPE_GMC,
1678 .major = 8,
1679 .minor = 1,
1680 .rev = 0,
1681 .funcs = &gmc_v8_0_ip_funcs,
1682};
1683
1684const struct amdgpu_ip_block_version gmc_v8_5_ip_block =
1685{
1686 .type = AMD_IP_BLOCK_TYPE_GMC,
1687 .major = 8,
1688 .minor = 5,
1689 .rev = 0,
1690 .funcs = &gmc_v8_0_ip_funcs,
1691};