]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drm/amd/display: Enable Vega by default.
[mirror_ubuntu-bionic-kernel.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_device.c
CommitLineData
d38ceaf9
AD
1/*
2 * Copyright 2008 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 *
24 * Authors: Dave Airlie
25 * Alex Deucher
26 * Jerome Glisse
27 */
0875dc9e 28#include <linux/kthread.h>
d38ceaf9
AD
29#include <linux/console.h>
30#include <linux/slab.h>
31#include <linux/debugfs.h>
32#include <drm/drmP.h>
33#include <drm/drm_crtc_helper.h>
4562236b 34#include <drm/drm_atomic_helper.h>
d38ceaf9
AD
35#include <drm/amdgpu_drm.h>
36#include <linux/vgaarb.h>
37#include <linux/vga_switcheroo.h>
38#include <linux/efi.h>
39#include "amdgpu.h"
f4b373f4 40#include "amdgpu_trace.h"
d38ceaf9
AD
41#include "amdgpu_i2c.h"
42#include "atom.h"
43#include "amdgpu_atombios.h"
a5bde2f9 44#include "amdgpu_atomfirmware.h"
d0dd7f0c 45#include "amd_pcie.h"
33f34802
KW
46#ifdef CONFIG_DRM_AMDGPU_SI
47#include "si.h"
48#endif
a2e73f56
AD
49#ifdef CONFIG_DRM_AMDGPU_CIK
50#include "cik.h"
51#endif
aaa36a97 52#include "vi.h"
460826e6 53#include "soc15.h"
d38ceaf9 54#include "bif/bif_4_1_d.h"
9accf2fd 55#include <linux/pci.h>
bec86378 56#include <linux/firmware.h>
89041940 57#include "amdgpu_vf_error.h"
d38ceaf9 58
ba997709 59#include "amdgpu_amdkfd.h"
d38ceaf9 60
e2a75f88 61MODULE_FIRMWARE("amdgpu/vega10_gpu_info.bin");
2d2e5e7e 62MODULE_FIRMWARE("amdgpu/raven_gpu_info.bin");
e2a75f88 63
2dc80b00
S
64#define AMDGPU_RESUME_MS 2000
65
d38ceaf9
AD
66static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev);
67static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev);
4f0955fc 68static int amdgpu_debugfs_test_ib_ring_init(struct amdgpu_device *adev);
db95e218 69static int amdgpu_debugfs_vbios_dump_init(struct amdgpu_device *adev);
d38ceaf9
AD
70
71static const char *amdgpu_asic_name[] = {
da69c161
KW
72 "TAHITI",
73 "PITCAIRN",
74 "VERDE",
75 "OLAND",
76 "HAINAN",
d38ceaf9
AD
77 "BONAIRE",
78 "KAVERI",
79 "KABINI",
80 "HAWAII",
81 "MULLINS",
82 "TOPAZ",
83 "TONGA",
48299f95 84 "FIJI",
d38ceaf9 85 "CARRIZO",
139f4917 86 "STONEY",
2cc0c0b5
FC
87 "POLARIS10",
88 "POLARIS11",
c4642a47 89 "POLARIS12",
d4196f01 90 "VEGA10",
2ca8a5d2 91 "RAVEN",
d38ceaf9
AD
92 "LAST",
93};
94
95bool amdgpu_device_is_px(struct drm_device *dev)
96{
97 struct amdgpu_device *adev = dev->dev_private;
98
2f7d10b3 99 if (adev->flags & AMD_IS_PX)
d38ceaf9
AD
100 return true;
101 return false;
102}
103
104/*
105 * MMIO register access helper functions.
106 */
107uint32_t amdgpu_mm_rreg(struct amdgpu_device *adev, uint32_t reg,
15d72fd7 108 uint32_t acc_flags)
d38ceaf9 109{
f4b373f4
TSD
110 uint32_t ret;
111
15d72fd7 112 if (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev)) {
bc992ba5
XY
113 BUG_ON(in_interrupt());
114 return amdgpu_virt_kiq_rreg(adev, reg);
115 }
116
15d72fd7 117 if ((reg * 4) < adev->rmmio_size && !(acc_flags & AMDGPU_REGS_IDX))
f4b373f4 118 ret = readl(((void __iomem *)adev->rmmio) + (reg * 4));
d38ceaf9
AD
119 else {
120 unsigned long flags;
d38ceaf9
AD
121
122 spin_lock_irqsave(&adev->mmio_idx_lock, flags);
123 writel((reg * 4), ((void __iomem *)adev->rmmio) + (mmMM_INDEX * 4));
124 ret = readl(((void __iomem *)adev->rmmio) + (mmMM_DATA * 4));
125 spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
d38ceaf9 126 }
f4b373f4
TSD
127 trace_amdgpu_mm_rreg(adev->pdev->device, reg, ret);
128 return ret;
d38ceaf9
AD
129}
130
131void amdgpu_mm_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v,
15d72fd7 132 uint32_t acc_flags)
d38ceaf9 133{
f4b373f4 134 trace_amdgpu_mm_wreg(adev->pdev->device, reg, v);
4e99a44e 135
47ed4e1c
KW
136 if (adev->asic_type >= CHIP_VEGA10 && reg == 0) {
137 adev->last_mm_index = v;
138 }
139
15d72fd7 140 if (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev)) {
bc992ba5
XY
141 BUG_ON(in_interrupt());
142 return amdgpu_virt_kiq_wreg(adev, reg, v);
143 }
144
15d72fd7 145 if ((reg * 4) < adev->rmmio_size && !(acc_flags & AMDGPU_REGS_IDX))
d38ceaf9
AD
146 writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
147 else {
148 unsigned long flags;
149
150 spin_lock_irqsave(&adev->mmio_idx_lock, flags);
151 writel((reg * 4), ((void __iomem *)adev->rmmio) + (mmMM_INDEX * 4));
152 writel(v, ((void __iomem *)adev->rmmio) + (mmMM_DATA * 4));
153 spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
154 }
47ed4e1c
KW
155
156 if (adev->asic_type >= CHIP_VEGA10 && reg == 1 && adev->last_mm_index == 0x5702C) {
157 udelay(500);
158 }
d38ceaf9
AD
159}
160
161u32 amdgpu_io_rreg(struct amdgpu_device *adev, u32 reg)
162{
163 if ((reg * 4) < adev->rio_mem_size)
164 return ioread32(adev->rio_mem + (reg * 4));
165 else {
166 iowrite32((reg * 4), adev->rio_mem + (mmMM_INDEX * 4));
167 return ioread32(adev->rio_mem + (mmMM_DATA * 4));
168 }
169}
170
171void amdgpu_io_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
172{
47ed4e1c
KW
173 if (adev->asic_type >= CHIP_VEGA10 && reg == 0) {
174 adev->last_mm_index = v;
175 }
d38ceaf9
AD
176
177 if ((reg * 4) < adev->rio_mem_size)
178 iowrite32(v, adev->rio_mem + (reg * 4));
179 else {
180 iowrite32((reg * 4), adev->rio_mem + (mmMM_INDEX * 4));
181 iowrite32(v, adev->rio_mem + (mmMM_DATA * 4));
182 }
47ed4e1c
KW
183
184 if (adev->asic_type >= CHIP_VEGA10 && reg == 1 && adev->last_mm_index == 0x5702C) {
185 udelay(500);
186 }
d38ceaf9
AD
187}
188
189/**
190 * amdgpu_mm_rdoorbell - read a doorbell dword
191 *
192 * @adev: amdgpu_device pointer
193 * @index: doorbell index
194 *
195 * Returns the value in the doorbell aperture at the
196 * requested doorbell index (CIK).
197 */
198u32 amdgpu_mm_rdoorbell(struct amdgpu_device *adev, u32 index)
199{
200 if (index < adev->doorbell.num_doorbells) {
201 return readl(adev->doorbell.ptr + index);
202 } else {
203 DRM_ERROR("reading beyond doorbell aperture: 0x%08x!\n", index);
204 return 0;
205 }
206}
207
208/**
209 * amdgpu_mm_wdoorbell - write a doorbell dword
210 *
211 * @adev: amdgpu_device pointer
212 * @index: doorbell index
213 * @v: value to write
214 *
215 * Writes @v to the doorbell aperture at the
216 * requested doorbell index (CIK).
217 */
218void amdgpu_mm_wdoorbell(struct amdgpu_device *adev, u32 index, u32 v)
219{
220 if (index < adev->doorbell.num_doorbells) {
221 writel(v, adev->doorbell.ptr + index);
222 } else {
223 DRM_ERROR("writing beyond doorbell aperture: 0x%08x!\n", index);
224 }
225}
226
832be404
KW
227/**
228 * amdgpu_mm_rdoorbell64 - read a doorbell Qword
229 *
230 * @adev: amdgpu_device pointer
231 * @index: doorbell index
232 *
233 * Returns the value in the doorbell aperture at the
234 * requested doorbell index (VEGA10+).
235 */
236u64 amdgpu_mm_rdoorbell64(struct amdgpu_device *adev, u32 index)
237{
238 if (index < adev->doorbell.num_doorbells) {
239 return atomic64_read((atomic64_t *)(adev->doorbell.ptr + index));
240 } else {
241 DRM_ERROR("reading beyond doorbell aperture: 0x%08x!\n", index);
242 return 0;
243 }
244}
245
246/**
247 * amdgpu_mm_wdoorbell64 - write a doorbell Qword
248 *
249 * @adev: amdgpu_device pointer
250 * @index: doorbell index
251 * @v: value to write
252 *
253 * Writes @v to the doorbell aperture at the
254 * requested doorbell index (VEGA10+).
255 */
256void amdgpu_mm_wdoorbell64(struct amdgpu_device *adev, u32 index, u64 v)
257{
258 if (index < adev->doorbell.num_doorbells) {
259 atomic64_set((atomic64_t *)(adev->doorbell.ptr + index), v);
260 } else {
261 DRM_ERROR("writing beyond doorbell aperture: 0x%08x!\n", index);
262 }
263}
264
d38ceaf9
AD
265/**
266 * amdgpu_invalid_rreg - dummy reg read function
267 *
268 * @adev: amdgpu device pointer
269 * @reg: offset of register
270 *
271 * Dummy register read function. Used for register blocks
272 * that certain asics don't have (all asics).
273 * Returns the value in the register.
274 */
275static uint32_t amdgpu_invalid_rreg(struct amdgpu_device *adev, uint32_t reg)
276{
277 DRM_ERROR("Invalid callback to read register 0x%04X\n", reg);
278 BUG();
279 return 0;
280}
281
282/**
283 * amdgpu_invalid_wreg - dummy reg write function
284 *
285 * @adev: amdgpu device pointer
286 * @reg: offset of register
287 * @v: value to write to the register
288 *
289 * Dummy register read function. Used for register blocks
290 * that certain asics don't have (all asics).
291 */
292static void amdgpu_invalid_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v)
293{
294 DRM_ERROR("Invalid callback to write register 0x%04X with 0x%08X\n",
295 reg, v);
296 BUG();
297}
298
299/**
300 * amdgpu_block_invalid_rreg - dummy reg read function
301 *
302 * @adev: amdgpu device pointer
303 * @block: offset of instance
304 * @reg: offset of register
305 *
306 * Dummy register read function. Used for register blocks
307 * that certain asics don't have (all asics).
308 * Returns the value in the register.
309 */
310static uint32_t amdgpu_block_invalid_rreg(struct amdgpu_device *adev,
311 uint32_t block, uint32_t reg)
312{
313 DRM_ERROR("Invalid callback to read register 0x%04X in block 0x%04X\n",
314 reg, block);
315 BUG();
316 return 0;
317}
318
319/**
320 * amdgpu_block_invalid_wreg - dummy reg write function
321 *
322 * @adev: amdgpu device pointer
323 * @block: offset of instance
324 * @reg: offset of register
325 * @v: value to write to the register
326 *
327 * Dummy register read function. Used for register blocks
328 * that certain asics don't have (all asics).
329 */
330static void amdgpu_block_invalid_wreg(struct amdgpu_device *adev,
331 uint32_t block,
332 uint32_t reg, uint32_t v)
333{
334 DRM_ERROR("Invalid block callback to write register 0x%04X in block 0x%04X with 0x%08X\n",
335 reg, block, v);
336 BUG();
337}
338
339static int amdgpu_vram_scratch_init(struct amdgpu_device *adev)
340{
a4a02777
CK
341 return amdgpu_bo_create_kernel(adev, AMDGPU_GPU_PAGE_SIZE,
342 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
343 &adev->vram_scratch.robj,
344 &adev->vram_scratch.gpu_addr,
345 (void **)&adev->vram_scratch.ptr);
d38ceaf9
AD
346}
347
348static void amdgpu_vram_scratch_fini(struct amdgpu_device *adev)
349{
078af1a3 350 amdgpu_bo_free_kernel(&adev->vram_scratch.robj, NULL, NULL);
d38ceaf9
AD
351}
352
353/**
354 * amdgpu_program_register_sequence - program an array of registers.
355 *
356 * @adev: amdgpu_device pointer
357 * @registers: pointer to the register array
358 * @array_size: size of the register array
359 *
360 * Programs an array or registers with and and or masks.
361 * This is a helper for setting golden registers.
362 */
363void amdgpu_program_register_sequence(struct amdgpu_device *adev,
364 const u32 *registers,
365 const u32 array_size)
366{
367 u32 tmp, reg, and_mask, or_mask;
368 int i;
369
370 if (array_size % 3)
371 return;
372
373 for (i = 0; i < array_size; i +=3) {
374 reg = registers[i + 0];
375 and_mask = registers[i + 1];
376 or_mask = registers[i + 2];
377
378 if (and_mask == 0xffffffff) {
379 tmp = or_mask;
380 } else {
381 tmp = RREG32(reg);
382 tmp &= ~and_mask;
383 tmp |= or_mask;
384 }
385 WREG32(reg, tmp);
386 }
387}
388
389void amdgpu_pci_config_reset(struct amdgpu_device *adev)
390{
391 pci_write_config_dword(adev->pdev, 0x7c, AMDGPU_ASIC_RESET_DATA);
392}
393
394/*
395 * GPU doorbell aperture helpers function.
396 */
397/**
398 * amdgpu_doorbell_init - Init doorbell driver information.
399 *
400 * @adev: amdgpu_device pointer
401 *
402 * Init doorbell driver information (CIK)
403 * Returns 0 on success, error on failure.
404 */
405static int amdgpu_doorbell_init(struct amdgpu_device *adev)
406{
705e519e
CK
407 /* No doorbell on SI hardware generation */
408 if (adev->asic_type < CHIP_BONAIRE) {
409 adev->doorbell.base = 0;
410 adev->doorbell.size = 0;
411 adev->doorbell.num_doorbells = 0;
412 adev->doorbell.ptr = NULL;
413 return 0;
414 }
415
d38ceaf9
AD
416 /* doorbell bar mapping */
417 adev->doorbell.base = pci_resource_start(adev->pdev, 2);
418 adev->doorbell.size = pci_resource_len(adev->pdev, 2);
419
edf600da 420 adev->doorbell.num_doorbells = min_t(u32, adev->doorbell.size / sizeof(u32),
d38ceaf9
AD
421 AMDGPU_DOORBELL_MAX_ASSIGNMENT+1);
422 if (adev->doorbell.num_doorbells == 0)
423 return -EINVAL;
424
8972e5d2
CK
425 adev->doorbell.ptr = ioremap(adev->doorbell.base,
426 adev->doorbell.num_doorbells *
427 sizeof(u32));
428 if (adev->doorbell.ptr == NULL)
d38ceaf9 429 return -ENOMEM;
d38ceaf9
AD
430
431 return 0;
432}
433
434/**
435 * amdgpu_doorbell_fini - Tear down doorbell driver information.
436 *
437 * @adev: amdgpu_device pointer
438 *
439 * Tear down doorbell driver information (CIK)
440 */
441static void amdgpu_doorbell_fini(struct amdgpu_device *adev)
442{
443 iounmap(adev->doorbell.ptr);
444 adev->doorbell.ptr = NULL;
445}
446
447/**
448 * amdgpu_doorbell_get_kfd_info - Report doorbell configuration required to
449 * setup amdkfd
450 *
451 * @adev: amdgpu_device pointer
452 * @aperture_base: output returning doorbell aperture base physical address
453 * @aperture_size: output returning doorbell aperture size in bytes
454 * @start_offset: output returning # of doorbell bytes reserved for amdgpu.
455 *
456 * amdgpu and amdkfd share the doorbell aperture. amdgpu sets it up,
457 * takes doorbells required for its own rings and reports the setup to amdkfd.
458 * amdgpu reserved doorbells are at the start of the doorbell aperture.
459 */
460void amdgpu_doorbell_get_kfd_info(struct amdgpu_device *adev,
461 phys_addr_t *aperture_base,
462 size_t *aperture_size,
463 size_t *start_offset)
464{
465 /*
466 * The first num_doorbells are used by amdgpu.
467 * amdkfd takes whatever's left in the aperture.
468 */
469 if (adev->doorbell.size > adev->doorbell.num_doorbells * sizeof(u32)) {
470 *aperture_base = adev->doorbell.base;
471 *aperture_size = adev->doorbell.size;
472 *start_offset = adev->doorbell.num_doorbells * sizeof(u32);
473 } else {
474 *aperture_base = 0;
475 *aperture_size = 0;
476 *start_offset = 0;
477 }
478}
479
480/*
481 * amdgpu_wb_*()
455a7bc2 482 * Writeback is the method by which the GPU updates special pages in memory
ea81a173 483 * with the status of certain GPU events (fences, ring pointers,etc.).
d38ceaf9
AD
484 */
485
486/**
487 * amdgpu_wb_fini - Disable Writeback and free memory
488 *
489 * @adev: amdgpu_device pointer
490 *
491 * Disables Writeback and frees the Writeback memory (all asics).
492 * Used at driver shutdown.
493 */
494static void amdgpu_wb_fini(struct amdgpu_device *adev)
495{
496 if (adev->wb.wb_obj) {
a76ed485
AD
497 amdgpu_bo_free_kernel(&adev->wb.wb_obj,
498 &adev->wb.gpu_addr,
499 (void **)&adev->wb.wb);
d38ceaf9
AD
500 adev->wb.wb_obj = NULL;
501 }
502}
503
504/**
505 * amdgpu_wb_init- Init Writeback driver info and allocate memory
506 *
507 * @adev: amdgpu_device pointer
508 *
455a7bc2 509 * Initializes writeback and allocates writeback memory (all asics).
d38ceaf9
AD
510 * Used at driver startup.
511 * Returns 0 on success or an -error on failure.
512 */
513static int amdgpu_wb_init(struct amdgpu_device *adev)
514{
515 int r;
516
517 if (adev->wb.wb_obj == NULL) {
97407b63
AD
518 /* AMDGPU_MAX_WB * sizeof(uint32_t) * 8 = AMDGPU_MAX_WB 256bit slots */
519 r = amdgpu_bo_create_kernel(adev, AMDGPU_MAX_WB * sizeof(uint32_t) * 8,
a76ed485
AD
520 PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT,
521 &adev->wb.wb_obj, &adev->wb.gpu_addr,
522 (void **)&adev->wb.wb);
d38ceaf9
AD
523 if (r) {
524 dev_warn(adev->dev, "(%d) create WB bo failed\n", r);
525 return r;
526 }
d38ceaf9
AD
527
528 adev->wb.num_wb = AMDGPU_MAX_WB;
529 memset(&adev->wb.used, 0, sizeof(adev->wb.used));
530
531 /* clear wb memory */
60a970a6 532 memset((char *)adev->wb.wb, 0, AMDGPU_MAX_WB * sizeof(uint32_t));
d38ceaf9
AD
533 }
534
535 return 0;
536}
537
538/**
539 * amdgpu_wb_get - Allocate a wb entry
540 *
541 * @adev: amdgpu_device pointer
542 * @wb: wb index
543 *
544 * Allocate a wb slot for use by the driver (all asics).
545 * Returns 0 on success or -EINVAL on failure.
546 */
547int amdgpu_wb_get(struct amdgpu_device *adev, u32 *wb)
548{
549 unsigned long offset = find_first_zero_bit(adev->wb.used, adev->wb.num_wb);
d38ceaf9 550
97407b63 551 if (offset < adev->wb.num_wb) {
7014285a 552 __set_bit(offset, adev->wb.used);
97407b63 553 *wb = offset * 8; /* convert to dw offset */
0915fdbc
ML
554 return 0;
555 } else {
556 return -EINVAL;
557 }
558}
559
d38ceaf9
AD
560/**
561 * amdgpu_wb_free - Free a wb entry
562 *
563 * @adev: amdgpu_device pointer
564 * @wb: wb index
565 *
566 * Free a wb slot allocated for use by the driver (all asics)
567 */
568void amdgpu_wb_free(struct amdgpu_device *adev, u32 wb)
569{
570 if (wb < adev->wb.num_wb)
571 __clear_bit(wb, adev->wb.used);
572}
573
574/**
575 * amdgpu_vram_location - try to find VRAM location
576 * @adev: amdgpu device structure holding all necessary informations
577 * @mc: memory controller structure holding memory informations
578 * @base: base address at which to put VRAM
579 *
455a7bc2 580 * Function will try to place VRAM at base address provided
d38ceaf9
AD
581 * as parameter (which is so far either PCI aperture address or
582 * for IGP TOM base address).
583 *
584 * If there is not enough space to fit the unvisible VRAM in the 32bits
585 * address space then we limit the VRAM size to the aperture.
586 *
587 * Note: We don't explicitly enforce VRAM start to be aligned on VRAM size,
588 * this shouldn't be a problem as we are using the PCI aperture as a reference.
589 * Otherwise this would be needed for rv280, all r3xx, and all r4xx, but
590 * not IGP.
591 *
592 * Note: we use mc_vram_size as on some board we need to program the mc to
593 * cover the whole aperture even if VRAM size is inferior to aperture size
594 * Novell bug 204882 + along with lots of ubuntu ones
595 *
596 * Note: when limiting vram it's safe to overwritte real_vram_size because
597 * we are not in case where real_vram_size is inferior to mc_vram_size (ie
598 * note afected by bogus hw of Novell bug 204882 + along with lots of ubuntu
599 * ones)
600 *
601 * Note: IGP TOM addr should be the same as the aperture addr, we don't
455a7bc2 602 * explicitly check for that though.
d38ceaf9
AD
603 *
604 * FIXME: when reducing VRAM size align new size on power of 2.
605 */
606void amdgpu_vram_location(struct amdgpu_device *adev, struct amdgpu_mc *mc, u64 base)
607{
608 uint64_t limit = (uint64_t)amdgpu_vram_limit << 20;
609
610 mc->vram_start = base;
611 if (mc->mc_vram_size > (adev->mc.mc_mask - base + 1)) {
612 dev_warn(adev->dev, "limiting VRAM to PCI aperture size\n");
613 mc->real_vram_size = mc->aper_size;
614 mc->mc_vram_size = mc->aper_size;
615 }
616 mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
617 if (limit && limit < mc->real_vram_size)
618 mc->real_vram_size = limit;
619 dev_info(adev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n",
620 mc->mc_vram_size >> 20, mc->vram_start,
621 mc->vram_end, mc->real_vram_size >> 20);
622}
623
624/**
6f02a696 625 * amdgpu_gart_location - try to find GTT location
d38ceaf9
AD
626 * @adev: amdgpu device structure holding all necessary informations
627 * @mc: memory controller structure holding memory informations
628 *
629 * Function will place try to place GTT before or after VRAM.
630 *
631 * If GTT size is bigger than space left then we ajust GTT size.
632 * Thus function will never fails.
633 *
634 * FIXME: when reducing GTT size align new size on power of 2.
635 */
6f02a696 636void amdgpu_gart_location(struct amdgpu_device *adev, struct amdgpu_mc *mc)
d38ceaf9
AD
637{
638 u64 size_af, size_bf;
639
ed21c047
CK
640 size_af = adev->mc.mc_mask - mc->vram_end;
641 size_bf = mc->vram_start;
d38ceaf9 642 if (size_bf > size_af) {
6f02a696 643 if (mc->gart_size > size_bf) {
d38ceaf9 644 dev_warn(adev->dev, "limiting GTT\n");
6f02a696 645 mc->gart_size = size_bf;
d38ceaf9 646 }
6f02a696 647 mc->gart_start = 0;
d38ceaf9 648 } else {
6f02a696 649 if (mc->gart_size > size_af) {
d38ceaf9 650 dev_warn(adev->dev, "limiting GTT\n");
6f02a696 651 mc->gart_size = size_af;
d38ceaf9 652 }
6f02a696 653 mc->gart_start = mc->vram_end + 1;
d38ceaf9 654 }
6f02a696 655 mc->gart_end = mc->gart_start + mc->gart_size - 1;
d38ceaf9 656 dev_info(adev->dev, "GTT: %lluM 0x%016llX - 0x%016llX\n",
6f02a696 657 mc->gart_size >> 20, mc->gart_start, mc->gart_end);
d38ceaf9
AD
658}
659
660/*
661 * GPU helpers function.
662 */
663/**
c836fec5 664 * amdgpu_need_post - check if the hw need post or not
d38ceaf9
AD
665 *
666 * @adev: amdgpu_device pointer
667 *
c836fec5
JQ
668 * Check if the asic has been initialized (all asics) at driver startup
669 * or post is needed if hw reset is performed.
670 * Returns true if need or false if not.
d38ceaf9 671 */
c836fec5 672bool amdgpu_need_post(struct amdgpu_device *adev)
d38ceaf9
AD
673{
674 uint32_t reg;
675
c836fec5
JQ
676 if (adev->has_hw_reset) {
677 adev->has_hw_reset = false;
678 return true;
679 }
70d17a25
AD
680
681 /* bios scratch used on CIK+ */
682 if (adev->asic_type >= CHIP_BONAIRE)
683 return amdgpu_atombios_scratch_need_asic_init(adev);
684
685 /* check MEM_SIZE for older asics */
bbf282d8 686 reg = amdgpu_asic_get_config_memsize(adev);
d38ceaf9 687
f2713e8c 688 if ((reg != 0) && (reg != 0xffffffff))
c836fec5 689 return false;
d38ceaf9 690
c836fec5 691 return true;
d38ceaf9
AD
692
693}
694
bec86378
ML
695static bool amdgpu_vpost_needed(struct amdgpu_device *adev)
696{
697 if (amdgpu_sriov_vf(adev))
698 return false;
699
700 if (amdgpu_passthrough(adev)) {
1da2c326
ML
701 /* for FIJI: In whole GPU pass-through virtualization case, after VM reboot
702 * some old smc fw still need driver do vPost otherwise gpu hang, while
703 * those smc fw version above 22.15 doesn't have this flaw, so we force
704 * vpost executed for smc version below 22.15
bec86378
ML
705 */
706 if (adev->asic_type == CHIP_FIJI) {
707 int err;
708 uint32_t fw_ver;
709 err = request_firmware(&adev->pm.fw, "amdgpu/fiji_smc.bin", adev->dev);
710 /* force vPost if error occured */
711 if (err)
712 return true;
713
714 fw_ver = *((uint32_t *)adev->pm.fw->data + 69);
1da2c326
ML
715 if (fw_ver < 0x00160e00)
716 return true;
bec86378 717 }
bec86378 718 }
c836fec5 719 return amdgpu_need_post(adev);
bec86378
ML
720}
721
d38ceaf9
AD
722/**
723 * amdgpu_dummy_page_init - init dummy page used by the driver
724 *
725 * @adev: amdgpu_device pointer
726 *
727 * Allocate the dummy page used by the driver (all asics).
728 * This dummy page is used by the driver as a filler for gart entries
729 * when pages are taken out of the GART
730 * Returns 0 on sucess, -ENOMEM on failure.
731 */
732int amdgpu_dummy_page_init(struct amdgpu_device *adev)
733{
734 if (adev->dummy_page.page)
735 return 0;
736 adev->dummy_page.page = alloc_page(GFP_DMA32 | GFP_KERNEL | __GFP_ZERO);
737 if (adev->dummy_page.page == NULL)
738 return -ENOMEM;
739 adev->dummy_page.addr = pci_map_page(adev->pdev, adev->dummy_page.page,
740 0, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
741 if (pci_dma_mapping_error(adev->pdev, adev->dummy_page.addr)) {
742 dev_err(&adev->pdev->dev, "Failed to DMA MAP the dummy page\n");
743 __free_page(adev->dummy_page.page);
744 adev->dummy_page.page = NULL;
745 return -ENOMEM;
746 }
747 return 0;
748}
749
750/**
751 * amdgpu_dummy_page_fini - free dummy page used by the driver
752 *
753 * @adev: amdgpu_device pointer
754 *
755 * Frees the dummy page used by the driver (all asics).
756 */
757void amdgpu_dummy_page_fini(struct amdgpu_device *adev)
758{
759 if (adev->dummy_page.page == NULL)
760 return;
761 pci_unmap_page(adev->pdev, adev->dummy_page.addr,
762 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
763 __free_page(adev->dummy_page.page);
764 adev->dummy_page.page = NULL;
765}
766
767
768/* ATOM accessor methods */
769/*
770 * ATOM is an interpreted byte code stored in tables in the vbios. The
771 * driver registers callbacks to access registers and the interpreter
772 * in the driver parses the tables and executes then to program specific
773 * actions (set display modes, asic init, etc.). See amdgpu_atombios.c,
774 * atombios.h, and atom.c
775 */
776
777/**
778 * cail_pll_read - read PLL register
779 *
780 * @info: atom card_info pointer
781 * @reg: PLL register offset
782 *
783 * Provides a PLL register accessor for the atom interpreter (r4xx+).
784 * Returns the value of the PLL register.
785 */
786static uint32_t cail_pll_read(struct card_info *info, uint32_t reg)
787{
788 return 0;
789}
790
791/**
792 * cail_pll_write - write PLL register
793 *
794 * @info: atom card_info pointer
795 * @reg: PLL register offset
796 * @val: value to write to the pll register
797 *
798 * Provides a PLL register accessor for the atom interpreter (r4xx+).
799 */
800static void cail_pll_write(struct card_info *info, uint32_t reg, uint32_t val)
801{
802
803}
804
805/**
806 * cail_mc_read - read MC (Memory Controller) register
807 *
808 * @info: atom card_info pointer
809 * @reg: MC register offset
810 *
811 * Provides an MC register accessor for the atom interpreter (r4xx+).
812 * Returns the value of the MC register.
813 */
814static uint32_t cail_mc_read(struct card_info *info, uint32_t reg)
815{
816 return 0;
817}
818
819/**
820 * cail_mc_write - write MC (Memory Controller) register
821 *
822 * @info: atom card_info pointer
823 * @reg: MC register offset
824 * @val: value to write to the pll register
825 *
826 * Provides a MC register accessor for the atom interpreter (r4xx+).
827 */
828static void cail_mc_write(struct card_info *info, uint32_t reg, uint32_t val)
829{
830
831}
832
833/**
834 * cail_reg_write - write MMIO register
835 *
836 * @info: atom card_info pointer
837 * @reg: MMIO register offset
838 * @val: value to write to the pll register
839 *
840 * Provides a MMIO register accessor for the atom interpreter (r4xx+).
841 */
842static void cail_reg_write(struct card_info *info, uint32_t reg, uint32_t val)
843{
844 struct amdgpu_device *adev = info->dev->dev_private;
845
846 WREG32(reg, val);
847}
848
849/**
850 * cail_reg_read - read MMIO register
851 *
852 * @info: atom card_info pointer
853 * @reg: MMIO register offset
854 *
855 * Provides an MMIO register accessor for the atom interpreter (r4xx+).
856 * Returns the value of the MMIO register.
857 */
858static uint32_t cail_reg_read(struct card_info *info, uint32_t reg)
859{
860 struct amdgpu_device *adev = info->dev->dev_private;
861 uint32_t r;
862
863 r = RREG32(reg);
864 return r;
865}
866
867/**
868 * cail_ioreg_write - write IO register
869 *
870 * @info: atom card_info pointer
871 * @reg: IO register offset
872 * @val: value to write to the pll register
873 *
874 * Provides a IO register accessor for the atom interpreter (r4xx+).
875 */
876static void cail_ioreg_write(struct card_info *info, uint32_t reg, uint32_t val)
877{
878 struct amdgpu_device *adev = info->dev->dev_private;
879
880 WREG32_IO(reg, val);
881}
882
883/**
884 * cail_ioreg_read - read IO register
885 *
886 * @info: atom card_info pointer
887 * @reg: IO register offset
888 *
889 * Provides an IO register accessor for the atom interpreter (r4xx+).
890 * Returns the value of the IO register.
891 */
892static uint32_t cail_ioreg_read(struct card_info *info, uint32_t reg)
893{
894 struct amdgpu_device *adev = info->dev->dev_private;
895 uint32_t r;
896
897 r = RREG32_IO(reg);
898 return r;
899}
900
5b41d94c
KR
901static ssize_t amdgpu_atombios_get_vbios_version(struct device *dev,
902 struct device_attribute *attr,
903 char *buf)
904{
905 struct drm_device *ddev = dev_get_drvdata(dev);
906 struct amdgpu_device *adev = ddev->dev_private;
907 struct atom_context *ctx = adev->mode_info.atom_context;
908
909 return snprintf(buf, PAGE_SIZE, "%s\n", ctx->vbios_version);
910}
911
912static DEVICE_ATTR(vbios_version, 0444, amdgpu_atombios_get_vbios_version,
913 NULL);
914
d38ceaf9
AD
915/**
916 * amdgpu_atombios_fini - free the driver info and callbacks for atombios
917 *
918 * @adev: amdgpu_device pointer
919 *
920 * Frees the driver info and register access callbacks for the ATOM
921 * interpreter (r4xx+).
922 * Called at driver shutdown.
923 */
924static void amdgpu_atombios_fini(struct amdgpu_device *adev)
925{
89e0ec9f 926 if (adev->mode_info.atom_context) {
d38ceaf9 927 kfree(adev->mode_info.atom_context->scratch);
89e0ec9f
ML
928 kfree(adev->mode_info.atom_context->iio);
929 }
d38ceaf9
AD
930 kfree(adev->mode_info.atom_context);
931 adev->mode_info.atom_context = NULL;
932 kfree(adev->mode_info.atom_card_info);
933 adev->mode_info.atom_card_info = NULL;
5b41d94c 934 device_remove_file(adev->dev, &dev_attr_vbios_version);
d38ceaf9
AD
935}
936
937/**
938 * amdgpu_atombios_init - init the driver info and callbacks for atombios
939 *
940 * @adev: amdgpu_device pointer
941 *
942 * Initializes the driver info and register access callbacks for the
943 * ATOM interpreter (r4xx+).
944 * Returns 0 on sucess, -ENOMEM on failure.
945 * Called at driver startup.
946 */
947static int amdgpu_atombios_init(struct amdgpu_device *adev)
948{
949 struct card_info *atom_card_info =
950 kzalloc(sizeof(struct card_info), GFP_KERNEL);
5b41d94c 951 int ret;
d38ceaf9
AD
952
953 if (!atom_card_info)
954 return -ENOMEM;
955
956 adev->mode_info.atom_card_info = atom_card_info;
957 atom_card_info->dev = adev->ddev;
958 atom_card_info->reg_read = cail_reg_read;
959 atom_card_info->reg_write = cail_reg_write;
960 /* needed for iio ops */
961 if (adev->rio_mem) {
962 atom_card_info->ioreg_read = cail_ioreg_read;
963 atom_card_info->ioreg_write = cail_ioreg_write;
964 } else {
b64a18c5 965 DRM_INFO("PCI I/O BAR is not found. Using MMIO to access ATOM BIOS\n");
d38ceaf9
AD
966 atom_card_info->ioreg_read = cail_reg_read;
967 atom_card_info->ioreg_write = cail_reg_write;
968 }
969 atom_card_info->mc_read = cail_mc_read;
970 atom_card_info->mc_write = cail_mc_write;
971 atom_card_info->pll_read = cail_pll_read;
972 atom_card_info->pll_write = cail_pll_write;
973
974 adev->mode_info.atom_context = amdgpu_atom_parse(atom_card_info, adev->bios);
975 if (!adev->mode_info.atom_context) {
976 amdgpu_atombios_fini(adev);
977 return -ENOMEM;
978 }
979
980 mutex_init(&adev->mode_info.atom_context->mutex);
a5bde2f9
AD
981 if (adev->is_atom_fw) {
982 amdgpu_atomfirmware_scratch_regs_init(adev);
983 amdgpu_atomfirmware_allocate_fb_scratch(adev);
984 } else {
985 amdgpu_atombios_scratch_regs_init(adev);
986 amdgpu_atombios_allocate_fb_scratch(adev);
987 }
5b41d94c
KR
988
989 ret = device_create_file(adev->dev, &dev_attr_vbios_version);
990 if (ret) {
991 DRM_ERROR("Failed to create device file for VBIOS version\n");
992 return ret;
993 }
994
d38ceaf9
AD
995 return 0;
996}
997
998/* if we get transitioned to only one device, take VGA back */
999/**
1000 * amdgpu_vga_set_decode - enable/disable vga decode
1001 *
1002 * @cookie: amdgpu_device pointer
1003 * @state: enable/disable vga decode
1004 *
1005 * Enable/disable vga decode (all asics).
1006 * Returns VGA resource flags.
1007 */
1008static unsigned int amdgpu_vga_set_decode(void *cookie, bool state)
1009{
1010 struct amdgpu_device *adev = cookie;
1011 amdgpu_asic_set_vga_state(adev, state);
1012 if (state)
1013 return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
1014 VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
1015 else
1016 return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
1017}
1018
bab4fee7 1019static void amdgpu_check_block_size(struct amdgpu_device *adev)
a1adf8be
CZ
1020{
1021 /* defines number of bits in page table versus page directory,
1022 * a page is 4KB so we have 12 bits offset, minimum 9 bits in the
1023 * page table and the remaining bits are in the page directory */
bab4fee7
JZ
1024 if (amdgpu_vm_block_size == -1)
1025 return;
a1adf8be 1026
bab4fee7 1027 if (amdgpu_vm_block_size < 9) {
a1adf8be
CZ
1028 dev_warn(adev->dev, "VM page table size (%d) too small\n",
1029 amdgpu_vm_block_size);
bab4fee7 1030 goto def_value;
a1adf8be
CZ
1031 }
1032
1033 if (amdgpu_vm_block_size > 24 ||
1034 (amdgpu_vm_size * 1024) < (1ull << amdgpu_vm_block_size)) {
1035 dev_warn(adev->dev, "VM page table size (%d) too large\n",
1036 amdgpu_vm_block_size);
bab4fee7 1037 goto def_value;
a1adf8be 1038 }
bab4fee7
JZ
1039
1040 return;
1041
1042def_value:
1043 amdgpu_vm_block_size = -1;
a1adf8be
CZ
1044}
1045
83ca145d
ZJ
1046static void amdgpu_check_vm_size(struct amdgpu_device *adev)
1047{
64dab074
AD
1048 /* no need to check the default value */
1049 if (amdgpu_vm_size == -1)
1050 return;
1051
76117507 1052 if (!is_power_of_2(amdgpu_vm_size)) {
83ca145d
ZJ
1053 dev_warn(adev->dev, "VM size (%d) must be a power of 2\n",
1054 amdgpu_vm_size);
1055 goto def_value;
1056 }
1057
1058 if (amdgpu_vm_size < 1) {
1059 dev_warn(adev->dev, "VM size (%d) too small, min is 1GB\n",
1060 amdgpu_vm_size);
1061 goto def_value;
1062 }
1063
1064 /*
1065 * Max GPUVM size for Cayman, SI, CI VI are 40 bits.
1066 */
1067 if (amdgpu_vm_size > 1024) {
1068 dev_warn(adev->dev, "VM size (%d) too large, max is 1TB\n",
1069 amdgpu_vm_size);
1070 goto def_value;
1071 }
1072
1073 return;
1074
1075def_value:
bab4fee7 1076 amdgpu_vm_size = -1;
83ca145d
ZJ
1077}
1078
d38ceaf9
AD
1079/**
1080 * amdgpu_check_arguments - validate module params
1081 *
1082 * @adev: amdgpu_device pointer
1083 *
1084 * Validates certain module parameters and updates
1085 * the associated values used by the driver (all asics).
1086 */
1087static void amdgpu_check_arguments(struct amdgpu_device *adev)
1088{
5b011235
CZ
1089 if (amdgpu_sched_jobs < 4) {
1090 dev_warn(adev->dev, "sched jobs (%d) must be at least 4\n",
1091 amdgpu_sched_jobs);
1092 amdgpu_sched_jobs = 4;
76117507 1093 } else if (!is_power_of_2(amdgpu_sched_jobs)){
5b011235
CZ
1094 dev_warn(adev->dev, "sched jobs (%d) must be a power of 2\n",
1095 amdgpu_sched_jobs);
1096 amdgpu_sched_jobs = roundup_pow_of_two(amdgpu_sched_jobs);
1097 }
d38ceaf9 1098
83e74db6 1099 if (amdgpu_gart_size != -1 && amdgpu_gart_size < 32) {
f9321cc4
CK
1100 /* gart size must be greater or equal to 32M */
1101 dev_warn(adev->dev, "gart size (%d) too small\n",
1102 amdgpu_gart_size);
83e74db6 1103 amdgpu_gart_size = -1;
d38ceaf9
AD
1104 }
1105
36d38372 1106 if (amdgpu_gtt_size != -1 && amdgpu_gtt_size < 32) {
c4e1a13a 1107 /* gtt size must be greater or equal to 32M */
36d38372
CK
1108 dev_warn(adev->dev, "gtt size (%d) too small\n",
1109 amdgpu_gtt_size);
1110 amdgpu_gtt_size = -1;
d38ceaf9
AD
1111 }
1112
d07f14be
RH
1113 /* valid range is between 4 and 9 inclusive */
1114 if (amdgpu_vm_fragment_size != -1 &&
1115 (amdgpu_vm_fragment_size > 9 || amdgpu_vm_fragment_size < 4)) {
1116 dev_warn(adev->dev, "valid range is between 4 and 9\n");
1117 amdgpu_vm_fragment_size = -1;
1118 }
1119
83ca145d 1120 amdgpu_check_vm_size(adev);
d38ceaf9 1121
bab4fee7 1122 amdgpu_check_block_size(adev);
6a7f76e7 1123
526bae37 1124 if (amdgpu_vram_page_split != -1 && (amdgpu_vram_page_split < 16 ||
76117507 1125 !is_power_of_2(amdgpu_vram_page_split))) {
6a7f76e7
CK
1126 dev_warn(adev->dev, "invalid VRAM page split (%d)\n",
1127 amdgpu_vram_page_split);
1128 amdgpu_vram_page_split = 1024;
1129 }
d38ceaf9
AD
1130}
1131
1132/**
1133 * amdgpu_switcheroo_set_state - set switcheroo state
1134 *
1135 * @pdev: pci dev pointer
1694467b 1136 * @state: vga_switcheroo state
d38ceaf9
AD
1137 *
1138 * Callback for the switcheroo driver. Suspends or resumes the
1139 * the asics before or after it is powered up using ACPI methods.
1140 */
1141static void amdgpu_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state)
1142{
1143 struct drm_device *dev = pci_get_drvdata(pdev);
1144
1145 if (amdgpu_device_is_px(dev) && state == VGA_SWITCHEROO_OFF)
1146 return;
1147
1148 if (state == VGA_SWITCHEROO_ON) {
7ca85295 1149 pr_info("amdgpu: switched on\n");
d38ceaf9
AD
1150 /* don't suspend or resume card normally */
1151 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
1152
810ddc3a 1153 amdgpu_device_resume(dev, true, true);
d38ceaf9 1154
d38ceaf9
AD
1155 dev->switch_power_state = DRM_SWITCH_POWER_ON;
1156 drm_kms_helper_poll_enable(dev);
1157 } else {
7ca85295 1158 pr_info("amdgpu: switched off\n");
d38ceaf9
AD
1159 drm_kms_helper_poll_disable(dev);
1160 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
810ddc3a 1161 amdgpu_device_suspend(dev, true, true);
d38ceaf9
AD
1162 dev->switch_power_state = DRM_SWITCH_POWER_OFF;
1163 }
1164}
1165
1166/**
1167 * amdgpu_switcheroo_can_switch - see if switcheroo state can change
1168 *
1169 * @pdev: pci dev pointer
1170 *
1171 * Callback for the switcheroo driver. Check of the switcheroo
1172 * state can be changed.
1173 * Returns true if the state can be changed, false if not.
1174 */
1175static bool amdgpu_switcheroo_can_switch(struct pci_dev *pdev)
1176{
1177 struct drm_device *dev = pci_get_drvdata(pdev);
1178
1179 /*
1180 * FIXME: open_count is protected by drm_global_mutex but that would lead to
1181 * locking inversion with the driver load path. And the access here is
1182 * completely racy anyway. So don't bother with locking for now.
1183 */
1184 return dev->open_count == 0;
1185}
1186
1187static const struct vga_switcheroo_client_ops amdgpu_switcheroo_ops = {
1188 .set_gpu_state = amdgpu_switcheroo_set_state,
1189 .reprobe = NULL,
1190 .can_switch = amdgpu_switcheroo_can_switch,
1191};
1192
1193int amdgpu_set_clockgating_state(struct amdgpu_device *adev,
5fc3aeeb 1194 enum amd_ip_block_type block_type,
1195 enum amd_clockgating_state state)
d38ceaf9
AD
1196{
1197 int i, r = 0;
1198
1199 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1200 if (!adev->ip_blocks[i].status.valid)
9ecbe7f5 1201 continue;
c722865a
RZ
1202 if (adev->ip_blocks[i].version->type != block_type)
1203 continue;
1204 if (!adev->ip_blocks[i].version->funcs->set_clockgating_state)
1205 continue;
1206 r = adev->ip_blocks[i].version->funcs->set_clockgating_state(
1207 (void *)adev, state);
1208 if (r)
1209 DRM_ERROR("set_clockgating_state of IP block <%s> failed %d\n",
1210 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9
AD
1211 }
1212 return r;
1213}
1214
1215int amdgpu_set_powergating_state(struct amdgpu_device *adev,
5fc3aeeb 1216 enum amd_ip_block_type block_type,
1217 enum amd_powergating_state state)
d38ceaf9
AD
1218{
1219 int i, r = 0;
1220
1221 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1222 if (!adev->ip_blocks[i].status.valid)
9ecbe7f5 1223 continue;
c722865a
RZ
1224 if (adev->ip_blocks[i].version->type != block_type)
1225 continue;
1226 if (!adev->ip_blocks[i].version->funcs->set_powergating_state)
1227 continue;
1228 r = adev->ip_blocks[i].version->funcs->set_powergating_state(
1229 (void *)adev, state);
1230 if (r)
1231 DRM_ERROR("set_powergating_state of IP block <%s> failed %d\n",
1232 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9
AD
1233 }
1234 return r;
1235}
1236
6cb2d4e4
HR
1237void amdgpu_get_clockgating_state(struct amdgpu_device *adev, u32 *flags)
1238{
1239 int i;
1240
1241 for (i = 0; i < adev->num_ip_blocks; i++) {
1242 if (!adev->ip_blocks[i].status.valid)
1243 continue;
1244 if (adev->ip_blocks[i].version->funcs->get_clockgating_state)
1245 adev->ip_blocks[i].version->funcs->get_clockgating_state((void *)adev, flags);
1246 }
1247}
1248
5dbbb60b
AD
1249int amdgpu_wait_for_idle(struct amdgpu_device *adev,
1250 enum amd_ip_block_type block_type)
1251{
1252 int i, r;
1253
1254 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1255 if (!adev->ip_blocks[i].status.valid)
9ecbe7f5 1256 continue;
a1255107
AD
1257 if (adev->ip_blocks[i].version->type == block_type) {
1258 r = adev->ip_blocks[i].version->funcs->wait_for_idle((void *)adev);
5dbbb60b
AD
1259 if (r)
1260 return r;
1261 break;
1262 }
1263 }
1264 return 0;
1265
1266}
1267
1268bool amdgpu_is_idle(struct amdgpu_device *adev,
1269 enum amd_ip_block_type block_type)
1270{
1271 int i;
1272
1273 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1274 if (!adev->ip_blocks[i].status.valid)
9ecbe7f5 1275 continue;
a1255107
AD
1276 if (adev->ip_blocks[i].version->type == block_type)
1277 return adev->ip_blocks[i].version->funcs->is_idle((void *)adev);
5dbbb60b
AD
1278 }
1279 return true;
1280
1281}
1282
a1255107
AD
1283struct amdgpu_ip_block * amdgpu_get_ip_block(struct amdgpu_device *adev,
1284 enum amd_ip_block_type type)
d38ceaf9
AD
1285{
1286 int i;
1287
1288 for (i = 0; i < adev->num_ip_blocks; i++)
a1255107 1289 if (adev->ip_blocks[i].version->type == type)
d38ceaf9
AD
1290 return &adev->ip_blocks[i];
1291
1292 return NULL;
1293}
1294
1295/**
1296 * amdgpu_ip_block_version_cmp
1297 *
1298 * @adev: amdgpu_device pointer
5fc3aeeb 1299 * @type: enum amd_ip_block_type
d38ceaf9
AD
1300 * @major: major version
1301 * @minor: minor version
1302 *
1303 * return 0 if equal or greater
1304 * return 1 if smaller or the ip_block doesn't exist
1305 */
1306int amdgpu_ip_block_version_cmp(struct amdgpu_device *adev,
5fc3aeeb 1307 enum amd_ip_block_type type,
d38ceaf9
AD
1308 u32 major, u32 minor)
1309{
a1255107 1310 struct amdgpu_ip_block *ip_block = amdgpu_get_ip_block(adev, type);
d38ceaf9 1311
a1255107
AD
1312 if (ip_block && ((ip_block->version->major > major) ||
1313 ((ip_block->version->major == major) &&
1314 (ip_block->version->minor >= minor))))
d38ceaf9
AD
1315 return 0;
1316
1317 return 1;
1318}
1319
a1255107
AD
1320/**
1321 * amdgpu_ip_block_add
1322 *
1323 * @adev: amdgpu_device pointer
1324 * @ip_block_version: pointer to the IP to add
1325 *
1326 * Adds the IP block driver information to the collection of IPs
1327 * on the asic.
1328 */
1329int amdgpu_ip_block_add(struct amdgpu_device *adev,
1330 const struct amdgpu_ip_block_version *ip_block_version)
1331{
1332 if (!ip_block_version)
1333 return -EINVAL;
1334
a0bae357
HR
1335 DRM_DEBUG("add ip block number %d <%s>\n", adev->num_ip_blocks,
1336 ip_block_version->funcs->name);
1337
a1255107
AD
1338 adev->ip_blocks[adev->num_ip_blocks++].version = ip_block_version;
1339
1340 return 0;
1341}
1342
483ef985 1343static void amdgpu_device_enable_virtual_display(struct amdgpu_device *adev)
9accf2fd
ED
1344{
1345 adev->enable_virtual_display = false;
1346
1347 if (amdgpu_virtual_display) {
1348 struct drm_device *ddev = adev->ddev;
1349 const char *pci_address_name = pci_name(ddev->pdev);
0f66356d 1350 char *pciaddstr, *pciaddstr_tmp, *pciaddname_tmp, *pciaddname;
9accf2fd
ED
1351
1352 pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL);
1353 pciaddstr_tmp = pciaddstr;
0f66356d
ED
1354 while ((pciaddname_tmp = strsep(&pciaddstr_tmp, ";"))) {
1355 pciaddname = strsep(&pciaddname_tmp, ",");
967de2a9
YT
1356 if (!strcmp("all", pciaddname)
1357 || !strcmp(pci_address_name, pciaddname)) {
0f66356d
ED
1358 long num_crtc;
1359 int res = -1;
1360
9accf2fd 1361 adev->enable_virtual_display = true;
0f66356d
ED
1362
1363 if (pciaddname_tmp)
1364 res = kstrtol(pciaddname_tmp, 10,
1365 &num_crtc);
1366
1367 if (!res) {
1368 if (num_crtc < 1)
1369 num_crtc = 1;
1370 if (num_crtc > 6)
1371 num_crtc = 6;
1372 adev->mode_info.num_crtc = num_crtc;
1373 } else {
1374 adev->mode_info.num_crtc = 1;
1375 }
9accf2fd
ED
1376 break;
1377 }
1378 }
1379
0f66356d
ED
1380 DRM_INFO("virtual display string:%s, %s:virtual_display:%d, num_crtc:%d\n",
1381 amdgpu_virtual_display, pci_address_name,
1382 adev->enable_virtual_display, adev->mode_info.num_crtc);
9accf2fd
ED
1383
1384 kfree(pciaddstr);
1385 }
1386}
1387
e2a75f88
AD
1388static int amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)
1389{
e2a75f88
AD
1390 const char *chip_name;
1391 char fw_name[30];
1392 int err;
1393 const struct gpu_info_firmware_header_v1_0 *hdr;
1394
ab4fe3e1
HR
1395 adev->firmware.gpu_info_fw = NULL;
1396
e2a75f88
AD
1397 switch (adev->asic_type) {
1398 case CHIP_TOPAZ:
1399 case CHIP_TONGA:
1400 case CHIP_FIJI:
1401 case CHIP_POLARIS11:
1402 case CHIP_POLARIS10:
1403 case CHIP_POLARIS12:
1404 case CHIP_CARRIZO:
1405 case CHIP_STONEY:
1406#ifdef CONFIG_DRM_AMDGPU_SI
1407 case CHIP_VERDE:
1408 case CHIP_TAHITI:
1409 case CHIP_PITCAIRN:
1410 case CHIP_OLAND:
1411 case CHIP_HAINAN:
1412#endif
1413#ifdef CONFIG_DRM_AMDGPU_CIK
1414 case CHIP_BONAIRE:
1415 case CHIP_HAWAII:
1416 case CHIP_KAVERI:
1417 case CHIP_KABINI:
1418 case CHIP_MULLINS:
1419#endif
1420 default:
1421 return 0;
1422 case CHIP_VEGA10:
1423 chip_name = "vega10";
1424 break;
2d2e5e7e
AD
1425 case CHIP_RAVEN:
1426 chip_name = "raven";
1427 break;
e2a75f88
AD
1428 }
1429
1430 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_gpu_info.bin", chip_name);
ab4fe3e1 1431 err = request_firmware(&adev->firmware.gpu_info_fw, fw_name, adev->dev);
e2a75f88
AD
1432 if (err) {
1433 dev_err(adev->dev,
1434 "Failed to load gpu_info firmware \"%s\"\n",
1435 fw_name);
1436 goto out;
1437 }
ab4fe3e1 1438 err = amdgpu_ucode_validate(adev->firmware.gpu_info_fw);
e2a75f88
AD
1439 if (err) {
1440 dev_err(adev->dev,
1441 "Failed to validate gpu_info firmware \"%s\"\n",
1442 fw_name);
1443 goto out;
1444 }
1445
ab4fe3e1 1446 hdr = (const struct gpu_info_firmware_header_v1_0 *)adev->firmware.gpu_info_fw->data;
e2a75f88
AD
1447 amdgpu_ucode_print_gpu_info_hdr(&hdr->header);
1448
1449 switch (hdr->version_major) {
1450 case 1:
1451 {
1452 const struct gpu_info_firmware_v1_0 *gpu_info_fw =
ab4fe3e1 1453 (const struct gpu_info_firmware_v1_0 *)(adev->firmware.gpu_info_fw->data +
e2a75f88
AD
1454 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1455
b5ab16bf
AD
1456 adev->gfx.config.max_shader_engines = le32_to_cpu(gpu_info_fw->gc_num_se);
1457 adev->gfx.config.max_cu_per_sh = le32_to_cpu(gpu_info_fw->gc_num_cu_per_sh);
1458 adev->gfx.config.max_sh_per_se = le32_to_cpu(gpu_info_fw->gc_num_sh_per_se);
1459 adev->gfx.config.max_backends_per_se = le32_to_cpu(gpu_info_fw->gc_num_rb_per_se);
e2a75f88 1460 adev->gfx.config.max_texture_channel_caches =
b5ab16bf
AD
1461 le32_to_cpu(gpu_info_fw->gc_num_tccs);
1462 adev->gfx.config.max_gprs = le32_to_cpu(gpu_info_fw->gc_num_gprs);
1463 adev->gfx.config.max_gs_threads = le32_to_cpu(gpu_info_fw->gc_num_max_gs_thds);
1464 adev->gfx.config.gs_vgt_table_depth = le32_to_cpu(gpu_info_fw->gc_gs_table_depth);
1465 adev->gfx.config.gs_prim_buffer_depth = le32_to_cpu(gpu_info_fw->gc_gsprim_buff_depth);
e2a75f88 1466 adev->gfx.config.double_offchip_lds_buf =
b5ab16bf
AD
1467 le32_to_cpu(gpu_info_fw->gc_double_offchip_lds_buffer);
1468 adev->gfx.cu_info.wave_front_size = le32_to_cpu(gpu_info_fw->gc_wave_size);
51fd0370
HZ
1469 adev->gfx.cu_info.max_waves_per_simd =
1470 le32_to_cpu(gpu_info_fw->gc_max_waves_per_simd);
1471 adev->gfx.cu_info.max_scratch_slots_per_cu =
1472 le32_to_cpu(gpu_info_fw->gc_max_scratch_slots_per_cu);
1473 adev->gfx.cu_info.lds_size = le32_to_cpu(gpu_info_fw->gc_lds_size);
e2a75f88
AD
1474 break;
1475 }
1476 default:
1477 dev_err(adev->dev,
1478 "Unsupported gpu_info table %d\n", hdr->header.ucode_version);
1479 err = -EINVAL;
1480 goto out;
1481 }
1482out:
e2a75f88
AD
1483 return err;
1484}
1485
d38ceaf9
AD
1486static int amdgpu_early_init(struct amdgpu_device *adev)
1487{
aaa36a97 1488 int i, r;
d38ceaf9 1489
483ef985 1490 amdgpu_device_enable_virtual_display(adev);
a6be7570 1491
d38ceaf9 1492 switch (adev->asic_type) {
aaa36a97
AD
1493 case CHIP_TOPAZ:
1494 case CHIP_TONGA:
48299f95 1495 case CHIP_FIJI:
2cc0c0b5
FC
1496 case CHIP_POLARIS11:
1497 case CHIP_POLARIS10:
c4642a47 1498 case CHIP_POLARIS12:
aaa36a97 1499 case CHIP_CARRIZO:
39bb0c92
SL
1500 case CHIP_STONEY:
1501 if (adev->asic_type == CHIP_CARRIZO || adev->asic_type == CHIP_STONEY)
aaa36a97
AD
1502 adev->family = AMDGPU_FAMILY_CZ;
1503 else
1504 adev->family = AMDGPU_FAMILY_VI;
1505
1506 r = vi_set_ip_blocks(adev);
1507 if (r)
1508 return r;
1509 break;
33f34802
KW
1510#ifdef CONFIG_DRM_AMDGPU_SI
1511 case CHIP_VERDE:
1512 case CHIP_TAHITI:
1513 case CHIP_PITCAIRN:
1514 case CHIP_OLAND:
1515 case CHIP_HAINAN:
295d0daf 1516 adev->family = AMDGPU_FAMILY_SI;
33f34802
KW
1517 r = si_set_ip_blocks(adev);
1518 if (r)
1519 return r;
1520 break;
1521#endif
a2e73f56
AD
1522#ifdef CONFIG_DRM_AMDGPU_CIK
1523 case CHIP_BONAIRE:
1524 case CHIP_HAWAII:
1525 case CHIP_KAVERI:
1526 case CHIP_KABINI:
1527 case CHIP_MULLINS:
1528 if ((adev->asic_type == CHIP_BONAIRE) || (adev->asic_type == CHIP_HAWAII))
1529 adev->family = AMDGPU_FAMILY_CI;
1530 else
1531 adev->family = AMDGPU_FAMILY_KV;
1532
1533 r = cik_set_ip_blocks(adev);
1534 if (r)
1535 return r;
1536 break;
1537#endif
2ca8a5d2
CZ
1538 case CHIP_VEGA10:
1539 case CHIP_RAVEN:
1540 if (adev->asic_type == CHIP_RAVEN)
1541 adev->family = AMDGPU_FAMILY_RV;
1542 else
1543 adev->family = AMDGPU_FAMILY_AI;
460826e6
KW
1544
1545 r = soc15_set_ip_blocks(adev);
1546 if (r)
1547 return r;
1548 break;
d38ceaf9
AD
1549 default:
1550 /* FIXME: not supported yet */
1551 return -EINVAL;
1552 }
1553
e2a75f88
AD
1554 r = amdgpu_device_parse_gpu_info_fw(adev);
1555 if (r)
1556 return r;
1557
3149d9da
XY
1558 if (amdgpu_sriov_vf(adev)) {
1559 r = amdgpu_virt_request_full_gpu(adev, true);
1560 if (r)
1561 return r;
1562 }
1563
d38ceaf9
AD
1564 for (i = 0; i < adev->num_ip_blocks; i++) {
1565 if ((amdgpu_ip_block_mask & (1 << i)) == 0) {
ed8cf00c
HR
1566 DRM_ERROR("disabled ip block: %d <%s>\n",
1567 i, adev->ip_blocks[i].version->funcs->name);
a1255107 1568 adev->ip_blocks[i].status.valid = false;
d38ceaf9 1569 } else {
a1255107
AD
1570 if (adev->ip_blocks[i].version->funcs->early_init) {
1571 r = adev->ip_blocks[i].version->funcs->early_init((void *)adev);
2c1a2784 1572 if (r == -ENOENT) {
a1255107 1573 adev->ip_blocks[i].status.valid = false;
2c1a2784 1574 } else if (r) {
a1255107
AD
1575 DRM_ERROR("early_init of IP block <%s> failed %d\n",
1576 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1577 return r;
2c1a2784 1578 } else {
a1255107 1579 adev->ip_blocks[i].status.valid = true;
2c1a2784 1580 }
974e6b64 1581 } else {
a1255107 1582 adev->ip_blocks[i].status.valid = true;
d38ceaf9 1583 }
d38ceaf9
AD
1584 }
1585 }
1586
395d1fb9
NH
1587 adev->cg_flags &= amdgpu_cg_mask;
1588 adev->pg_flags &= amdgpu_pg_mask;
1589
d38ceaf9
AD
1590 return 0;
1591}
1592
1593static int amdgpu_init(struct amdgpu_device *adev)
1594{
1595 int i, r;
1596
1597 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1598 if (!adev->ip_blocks[i].status.valid)
d38ceaf9 1599 continue;
a1255107 1600 r = adev->ip_blocks[i].version->funcs->sw_init((void *)adev);
2c1a2784 1601 if (r) {
a1255107
AD
1602 DRM_ERROR("sw_init of IP block <%s> failed %d\n",
1603 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1604 return r;
2c1a2784 1605 }
a1255107 1606 adev->ip_blocks[i].status.sw = true;
d38ceaf9 1607 /* need to do gmc hw init early so we can allocate gpu mem */
a1255107 1608 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
d38ceaf9 1609 r = amdgpu_vram_scratch_init(adev);
2c1a2784
AD
1610 if (r) {
1611 DRM_ERROR("amdgpu_vram_scratch_init failed %d\n", r);
d38ceaf9 1612 return r;
2c1a2784 1613 }
a1255107 1614 r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev);
2c1a2784
AD
1615 if (r) {
1616 DRM_ERROR("hw_init %d failed %d\n", i, r);
d38ceaf9 1617 return r;
2c1a2784 1618 }
d38ceaf9 1619 r = amdgpu_wb_init(adev);
2c1a2784
AD
1620 if (r) {
1621 DRM_ERROR("amdgpu_wb_init failed %d\n", r);
d38ceaf9 1622 return r;
2c1a2784 1623 }
a1255107 1624 adev->ip_blocks[i].status.hw = true;
2493664f
ML
1625
1626 /* right after GMC hw init, we create CSA */
1627 if (amdgpu_sriov_vf(adev)) {
1628 r = amdgpu_allocate_static_csa(adev);
1629 if (r) {
1630 DRM_ERROR("allocate CSA failed %d\n", r);
1631 return r;
1632 }
1633 }
d38ceaf9
AD
1634 }
1635 }
1636
1637 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1638 if (!adev->ip_blocks[i].status.sw)
d38ceaf9
AD
1639 continue;
1640 /* gmc hw init is done early */
a1255107 1641 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC)
d38ceaf9 1642 continue;
a1255107 1643 r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev);
2c1a2784 1644 if (r) {
a1255107
AD
1645 DRM_ERROR("hw_init of IP block <%s> failed %d\n",
1646 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1647 return r;
2c1a2784 1648 }
a1255107 1649 adev->ip_blocks[i].status.hw = true;
d38ceaf9
AD
1650 }
1651
1652 return 0;
1653}
1654
0c49e0b8
CZ
1655static void amdgpu_fill_reset_magic(struct amdgpu_device *adev)
1656{
1657 memcpy(adev->reset_magic, adev->gart.ptr, AMDGPU_RESET_MAGIC_NUM);
1658}
1659
1660static bool amdgpu_check_vram_lost(struct amdgpu_device *adev)
1661{
1662 return !!memcmp(adev->gart.ptr, adev->reset_magic,
1663 AMDGPU_RESET_MAGIC_NUM);
1664}
1665
2dc80b00 1666static int amdgpu_late_set_cg_state(struct amdgpu_device *adev)
d38ceaf9
AD
1667{
1668 int i = 0, r;
1669
1670 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1671 if (!adev->ip_blocks[i].status.valid)
d38ceaf9 1672 continue;
4a446d55 1673 /* skip CG for VCE/UVD, it's handled specially */
a1255107
AD
1674 if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
1675 adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE) {
4a446d55 1676 /* enable clockgating to save power */
a1255107
AD
1677 r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
1678 AMD_CG_STATE_GATE);
4a446d55
AD
1679 if (r) {
1680 DRM_ERROR("set_clockgating_state(gate) of IP block <%s> failed %d\n",
a1255107 1681 adev->ip_blocks[i].version->funcs->name, r);
4a446d55
AD
1682 return r;
1683 }
b0b00ff1 1684 }
d38ceaf9 1685 }
2dc80b00
S
1686 return 0;
1687}
1688
1689static int amdgpu_late_init(struct amdgpu_device *adev)
1690{
1691 int i = 0, r;
1692
1693 for (i = 0; i < adev->num_ip_blocks; i++) {
1694 if (!adev->ip_blocks[i].status.valid)
1695 continue;
1696 if (adev->ip_blocks[i].version->funcs->late_init) {
1697 r = adev->ip_blocks[i].version->funcs->late_init((void *)adev);
1698 if (r) {
1699 DRM_ERROR("late_init of IP block <%s> failed %d\n",
1700 adev->ip_blocks[i].version->funcs->name, r);
1701 return r;
1702 }
1703 adev->ip_blocks[i].status.late_initialized = true;
1704 }
1705 }
1706
1707 mod_delayed_work(system_wq, &adev->late_init_work,
1708 msecs_to_jiffies(AMDGPU_RESUME_MS));
d38ceaf9 1709
0c49e0b8 1710 amdgpu_fill_reset_magic(adev);
d38ceaf9
AD
1711
1712 return 0;
1713}
1714
1715static int amdgpu_fini(struct amdgpu_device *adev)
1716{
1717 int i, r;
1718
3e96dbfd
AD
1719 /* need to disable SMC first */
1720 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1721 if (!adev->ip_blocks[i].status.hw)
3e96dbfd 1722 continue;
a1255107 1723 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) {
3e96dbfd 1724 /* ungate blocks before hw fini so that we can shutdown the blocks safely */
a1255107
AD
1725 r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
1726 AMD_CG_STATE_UNGATE);
3e96dbfd
AD
1727 if (r) {
1728 DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n",
a1255107 1729 adev->ip_blocks[i].version->funcs->name, r);
3e96dbfd
AD
1730 return r;
1731 }
a1255107 1732 r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev);
3e96dbfd
AD
1733 /* XXX handle errors */
1734 if (r) {
1735 DRM_DEBUG("hw_fini of IP block <%s> failed %d\n",
a1255107 1736 adev->ip_blocks[i].version->funcs->name, r);
3e96dbfd 1737 }
a1255107 1738 adev->ip_blocks[i].status.hw = false;
3e96dbfd
AD
1739 break;
1740 }
1741 }
1742
d38ceaf9 1743 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1744 if (!adev->ip_blocks[i].status.hw)
d38ceaf9 1745 continue;
a1255107 1746 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
d38ceaf9
AD
1747 amdgpu_wb_fini(adev);
1748 amdgpu_vram_scratch_fini(adev);
1749 }
8201a67a
RZ
1750
1751 if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
1752 adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE) {
1753 /* ungate blocks before hw fini so that we can shutdown the blocks safely */
1754 r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
1755 AMD_CG_STATE_UNGATE);
1756 if (r) {
1757 DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n",
1758 adev->ip_blocks[i].version->funcs->name, r);
1759 return r;
1760 }
2c1a2784 1761 }
8201a67a 1762
a1255107 1763 r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev);
d38ceaf9 1764 /* XXX handle errors */
2c1a2784 1765 if (r) {
a1255107
AD
1766 DRM_DEBUG("hw_fini of IP block <%s> failed %d\n",
1767 adev->ip_blocks[i].version->funcs->name, r);
2c1a2784 1768 }
8201a67a 1769
a1255107 1770 adev->ip_blocks[i].status.hw = false;
d38ceaf9
AD
1771 }
1772
1773 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1774 if (!adev->ip_blocks[i].status.sw)
d38ceaf9 1775 continue;
a1255107 1776 r = adev->ip_blocks[i].version->funcs->sw_fini((void *)adev);
d38ceaf9 1777 /* XXX handle errors */
2c1a2784 1778 if (r) {
a1255107
AD
1779 DRM_DEBUG("sw_fini of IP block <%s> failed %d\n",
1780 adev->ip_blocks[i].version->funcs->name, r);
2c1a2784 1781 }
a1255107
AD
1782 adev->ip_blocks[i].status.sw = false;
1783 adev->ip_blocks[i].status.valid = false;
d38ceaf9
AD
1784 }
1785
a6dcfd9c 1786 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1787 if (!adev->ip_blocks[i].status.late_initialized)
8a2eef1d 1788 continue;
a1255107
AD
1789 if (adev->ip_blocks[i].version->funcs->late_fini)
1790 adev->ip_blocks[i].version->funcs->late_fini((void *)adev);
1791 adev->ip_blocks[i].status.late_initialized = false;
a6dcfd9c
ML
1792 }
1793
030308fc 1794 if (amdgpu_sriov_vf(adev))
3149d9da 1795 amdgpu_virt_release_full_gpu(adev, false);
2493664f 1796
d38ceaf9
AD
1797 return 0;
1798}
1799
2dc80b00
S
1800static void amdgpu_late_init_func_handler(struct work_struct *work)
1801{
1802 struct amdgpu_device *adev =
1803 container_of(work, struct amdgpu_device, late_init_work.work);
1804 amdgpu_late_set_cg_state(adev);
1805}
1806
faefba95 1807int amdgpu_suspend(struct amdgpu_device *adev)
d38ceaf9
AD
1808{
1809 int i, r;
1810
e941ea99
XY
1811 if (amdgpu_sriov_vf(adev))
1812 amdgpu_virt_request_full_gpu(adev, false);
1813
c5a93a28
FC
1814 /* ungate SMC block first */
1815 r = amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_SMC,
1816 AMD_CG_STATE_UNGATE);
1817 if (r) {
1818 DRM_ERROR("set_clockgating_state(ungate) SMC failed %d\n",r);
1819 }
1820
d38ceaf9 1821 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1822 if (!adev->ip_blocks[i].status.valid)
d38ceaf9
AD
1823 continue;
1824 /* ungate blocks so that suspend can properly shut them down */
c5a93a28 1825 if (i != AMD_IP_BLOCK_TYPE_SMC) {
a1255107
AD
1826 r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
1827 AMD_CG_STATE_UNGATE);
c5a93a28 1828 if (r) {
a1255107
AD
1829 DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n",
1830 adev->ip_blocks[i].version->funcs->name, r);
c5a93a28 1831 }
2c1a2784 1832 }
d38ceaf9 1833 /* XXX handle errors */
a1255107 1834 r = adev->ip_blocks[i].version->funcs->suspend(adev);
d38ceaf9 1835 /* XXX handle errors */
2c1a2784 1836 if (r) {
a1255107
AD
1837 DRM_ERROR("suspend of IP block <%s> failed %d\n",
1838 adev->ip_blocks[i].version->funcs->name, r);
2c1a2784 1839 }
d38ceaf9
AD
1840 }
1841
e941ea99
XY
1842 if (amdgpu_sriov_vf(adev))
1843 amdgpu_virt_release_full_gpu(adev, false);
1844
d38ceaf9
AD
1845 return 0;
1846}
1847
e4f0fdcc 1848static int amdgpu_sriov_reinit_early(struct amdgpu_device *adev)
a90ad3c2
ML
1849{
1850 int i, r;
1851
2cb681b6
ML
1852 static enum amd_ip_block_type ip_order[] = {
1853 AMD_IP_BLOCK_TYPE_GMC,
1854 AMD_IP_BLOCK_TYPE_COMMON,
2cb681b6
ML
1855 AMD_IP_BLOCK_TYPE_IH,
1856 };
a90ad3c2 1857
2cb681b6
ML
1858 for (i = 0; i < ARRAY_SIZE(ip_order); i++) {
1859 int j;
1860 struct amdgpu_ip_block *block;
a90ad3c2 1861
2cb681b6
ML
1862 for (j = 0; j < adev->num_ip_blocks; j++) {
1863 block = &adev->ip_blocks[j];
1864
1865 if (block->version->type != ip_order[i] ||
1866 !block->status.valid)
1867 continue;
1868
1869 r = block->version->funcs->hw_init(adev);
1870 DRM_INFO("RE-INIT: %s %s\n", block->version->funcs->name, r?"failed":"successed");
a90ad3c2
ML
1871 }
1872 }
1873
1874 return 0;
1875}
1876
e4f0fdcc 1877static int amdgpu_sriov_reinit_late(struct amdgpu_device *adev)
a90ad3c2
ML
1878{
1879 int i, r;
1880
2cb681b6
ML
1881 static enum amd_ip_block_type ip_order[] = {
1882 AMD_IP_BLOCK_TYPE_SMC,
1883 AMD_IP_BLOCK_TYPE_DCE,
1884 AMD_IP_BLOCK_TYPE_GFX,
1885 AMD_IP_BLOCK_TYPE_SDMA,
257deb8c
FM
1886 AMD_IP_BLOCK_TYPE_UVD,
1887 AMD_IP_BLOCK_TYPE_VCE
2cb681b6 1888 };
a90ad3c2 1889
2cb681b6
ML
1890 for (i = 0; i < ARRAY_SIZE(ip_order); i++) {
1891 int j;
1892 struct amdgpu_ip_block *block;
a90ad3c2 1893
2cb681b6
ML
1894 for (j = 0; j < adev->num_ip_blocks; j++) {
1895 block = &adev->ip_blocks[j];
1896
1897 if (block->version->type != ip_order[i] ||
1898 !block->status.valid)
1899 continue;
1900
1901 r = block->version->funcs->hw_init(adev);
1902 DRM_INFO("RE-INIT: %s %s\n", block->version->funcs->name, r?"failed":"successed");
a90ad3c2
ML
1903 }
1904 }
1905
1906 return 0;
1907}
1908
fcf0649f 1909static int amdgpu_resume_phase1(struct amdgpu_device *adev)
d38ceaf9
AD
1910{
1911 int i, r;
1912
a90ad3c2
ML
1913 for (i = 0; i < adev->num_ip_blocks; i++) {
1914 if (!adev->ip_blocks[i].status.valid)
1915 continue;
a90ad3c2
ML
1916 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||
1917 adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||
fcf0649f
CZ
1918 adev->ip_blocks[i].version->type ==
1919 AMD_IP_BLOCK_TYPE_IH) {
1920 r = adev->ip_blocks[i].version->funcs->resume(adev);
1921 if (r) {
1922 DRM_ERROR("resume of IP block <%s> failed %d\n",
1923 adev->ip_blocks[i].version->funcs->name, r);
1924 return r;
1925 }
a90ad3c2
ML
1926 }
1927 }
1928
1929 return 0;
1930}
1931
fcf0649f 1932static int amdgpu_resume_phase2(struct amdgpu_device *adev)
d38ceaf9
AD
1933{
1934 int i, r;
1935
1936 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1937 if (!adev->ip_blocks[i].status.valid)
d38ceaf9 1938 continue;
fcf0649f
CZ
1939 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||
1940 adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||
1941 adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH )
1942 continue;
a1255107 1943 r = adev->ip_blocks[i].version->funcs->resume(adev);
2c1a2784 1944 if (r) {
a1255107
AD
1945 DRM_ERROR("resume of IP block <%s> failed %d\n",
1946 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1947 return r;
2c1a2784 1948 }
d38ceaf9
AD
1949 }
1950
1951 return 0;
1952}
1953
fcf0649f
CZ
1954static int amdgpu_resume(struct amdgpu_device *adev)
1955{
1956 int r;
1957
1958 r = amdgpu_resume_phase1(adev);
1959 if (r)
1960 return r;
1961 r = amdgpu_resume_phase2(adev);
1962
1963 return r;
1964}
1965
4e99a44e 1966static void amdgpu_device_detect_sriov_bios(struct amdgpu_device *adev)
048765ad 1967{
a5bde2f9
AD
1968 if (adev->is_atom_fw) {
1969 if (amdgpu_atomfirmware_gpu_supports_virtualization(adev))
1970 adev->virt.caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;
1971 } else {
1972 if (amdgpu_atombios_has_gpu_virtualization_table(adev))
1973 adev->virt.caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;
1974 }
048765ad
AR
1975}
1976
4562236b
HW
1977bool amdgpu_device_asic_has_dc_support(enum amd_asic_type asic_type)
1978{
1979 switch (asic_type) {
1980#if defined(CONFIG_DRM_AMD_DC)
1981 case CHIP_BONAIRE:
1982 case CHIP_HAWAII:
0d6fbccb 1983 case CHIP_KAVERI:
4562236b
HW
1984 case CHIP_CARRIZO:
1985 case CHIP_STONEY:
1986 case CHIP_POLARIS11:
1987 case CHIP_POLARIS10:
2c8ad2d5 1988 case CHIP_POLARIS12:
4562236b
HW
1989 case CHIP_TONGA:
1990 case CHIP_FIJI:
1991#if defined(CONFIG_DRM_AMD_DC_PRE_VEGA)
1992 return amdgpu_dc != 0;
4562236b 1993#endif
17b7cf8c
AD
1994 case CHIP_KABINI:
1995 case CHIP_MULLINS:
1996 return amdgpu_dc > 0;
42f8ffa1
HW
1997 case CHIP_VEGA10:
1998#if defined(CONFIG_DRM_AMD_DC_DCN1_0)
fd187853 1999 case CHIP_RAVEN:
42f8ffa1 2000#endif
fd187853 2001 return amdgpu_dc != 0;
4562236b
HW
2002#endif
2003 default:
2004 return false;
2005 }
2006}
2007
2008/**
2009 * amdgpu_device_has_dc_support - check if dc is supported
2010 *
2011 * @adev: amdgpu_device_pointer
2012 *
2013 * Returns true for supported, false for not supported
2014 */
2015bool amdgpu_device_has_dc_support(struct amdgpu_device *adev)
2016{
2555039d
XY
2017 if (amdgpu_sriov_vf(adev))
2018 return false;
2019
4562236b
HW
2020 return amdgpu_device_asic_has_dc_support(adev->asic_type);
2021}
2022
d38ceaf9
AD
2023/**
2024 * amdgpu_device_init - initialize the driver
2025 *
2026 * @adev: amdgpu_device pointer
2027 * @pdev: drm dev pointer
2028 * @pdev: pci dev pointer
2029 * @flags: driver flags
2030 *
2031 * Initializes the driver info and hw (all asics).
2032 * Returns 0 for success or an error on failure.
2033 * Called at driver startup.
2034 */
2035int amdgpu_device_init(struct amdgpu_device *adev,
2036 struct drm_device *ddev,
2037 struct pci_dev *pdev,
2038 uint32_t flags)
2039{
2040 int r, i;
2041 bool runtime = false;
95844d20 2042 u32 max_MBps;
d38ceaf9
AD
2043
2044 adev->shutdown = false;
2045 adev->dev = &pdev->dev;
2046 adev->ddev = ddev;
2047 adev->pdev = pdev;
2048 adev->flags = flags;
2f7d10b3 2049 adev->asic_type = flags & AMD_ASIC_MASK;
d38ceaf9 2050 adev->usec_timeout = AMDGPU_MAX_USEC_TIMEOUT;
6f02a696 2051 adev->mc.gart_size = 512 * 1024 * 1024;
d38ceaf9
AD
2052 adev->accel_working = false;
2053 adev->num_rings = 0;
2054 adev->mman.buffer_funcs = NULL;
2055 adev->mman.buffer_funcs_ring = NULL;
2056 adev->vm_manager.vm_pte_funcs = NULL;
2d55e45a 2057 adev->vm_manager.vm_pte_num_rings = 0;
d38ceaf9 2058 adev->gart.gart_funcs = NULL;
f54d1867 2059 adev->fence_context = dma_fence_context_alloc(AMDGPU_MAX_RINGS);
d38ceaf9
AD
2060
2061 adev->smc_rreg = &amdgpu_invalid_rreg;
2062 adev->smc_wreg = &amdgpu_invalid_wreg;
2063 adev->pcie_rreg = &amdgpu_invalid_rreg;
2064 adev->pcie_wreg = &amdgpu_invalid_wreg;
36b9a952
HR
2065 adev->pciep_rreg = &amdgpu_invalid_rreg;
2066 adev->pciep_wreg = &amdgpu_invalid_wreg;
d38ceaf9
AD
2067 adev->uvd_ctx_rreg = &amdgpu_invalid_rreg;
2068 adev->uvd_ctx_wreg = &amdgpu_invalid_wreg;
2069 adev->didt_rreg = &amdgpu_invalid_rreg;
2070 adev->didt_wreg = &amdgpu_invalid_wreg;
ccdbb20a
RZ
2071 adev->gc_cac_rreg = &amdgpu_invalid_rreg;
2072 adev->gc_cac_wreg = &amdgpu_invalid_wreg;
d38ceaf9
AD
2073 adev->audio_endpt_rreg = &amdgpu_block_invalid_rreg;
2074 adev->audio_endpt_wreg = &amdgpu_block_invalid_wreg;
2075
3e39ab90
AD
2076 DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X 0x%02X).\n",
2077 amdgpu_asic_name[adev->asic_type], pdev->vendor, pdev->device,
2078 pdev->subsystem_vendor, pdev->subsystem_device, pdev->revision);
d38ceaf9
AD
2079
2080 /* mutex initialization are all done here so we
2081 * can recall function without having locking issues */
d38ceaf9 2082 atomic_set(&adev->irq.ih.lock, 0);
0e5ca0d1 2083 mutex_init(&adev->firmware.mutex);
d38ceaf9
AD
2084 mutex_init(&adev->pm.mutex);
2085 mutex_init(&adev->gfx.gpu_clock_mutex);
2086 mutex_init(&adev->srbm_mutex);
2087 mutex_init(&adev->grbm_idx_mutex);
d38ceaf9
AD
2088 mutex_init(&adev->mn_lock);
2089 hash_init(adev->mn_hash);
2090
2091 amdgpu_check_arguments(adev);
2092
d38ceaf9
AD
2093 spin_lock_init(&adev->mmio_idx_lock);
2094 spin_lock_init(&adev->smc_idx_lock);
2095 spin_lock_init(&adev->pcie_idx_lock);
2096 spin_lock_init(&adev->uvd_ctx_idx_lock);
2097 spin_lock_init(&adev->didt_idx_lock);
ccdbb20a 2098 spin_lock_init(&adev->gc_cac_idx_lock);
16abb5d2 2099 spin_lock_init(&adev->se_cac_idx_lock);
d38ceaf9 2100 spin_lock_init(&adev->audio_endpt_idx_lock);
95844d20 2101 spin_lock_init(&adev->mm_stats.lock);
d38ceaf9 2102
0c4e7fa5
CZ
2103 INIT_LIST_HEAD(&adev->shadow_list);
2104 mutex_init(&adev->shadow_list_lock);
2105
5c1354bd
CZ
2106 INIT_LIST_HEAD(&adev->gtt_list);
2107 spin_lock_init(&adev->gtt_list_lock);
2108
795f2813
AR
2109 INIT_LIST_HEAD(&adev->ring_lru_list);
2110 spin_lock_init(&adev->ring_lru_list_lock);
2111
2dc80b00
S
2112 INIT_DELAYED_WORK(&adev->late_init_work, amdgpu_late_init_func_handler);
2113
0fa49558
AX
2114 /* Registers mapping */
2115 /* TODO: block userspace mapping of io register */
da69c161
KW
2116 if (adev->asic_type >= CHIP_BONAIRE) {
2117 adev->rmmio_base = pci_resource_start(adev->pdev, 5);
2118 adev->rmmio_size = pci_resource_len(adev->pdev, 5);
2119 } else {
2120 adev->rmmio_base = pci_resource_start(adev->pdev, 2);
2121 adev->rmmio_size = pci_resource_len(adev->pdev, 2);
2122 }
d38ceaf9 2123
d38ceaf9
AD
2124 adev->rmmio = ioremap(adev->rmmio_base, adev->rmmio_size);
2125 if (adev->rmmio == NULL) {
2126 return -ENOMEM;
2127 }
2128 DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)adev->rmmio_base);
2129 DRM_INFO("register mmio size: %u\n", (unsigned)adev->rmmio_size);
2130
705e519e
CK
2131 /* doorbell bar mapping */
2132 amdgpu_doorbell_init(adev);
d38ceaf9
AD
2133
2134 /* io port mapping */
2135 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
2136 if (pci_resource_flags(adev->pdev, i) & IORESOURCE_IO) {
2137 adev->rio_mem_size = pci_resource_len(adev->pdev, i);
2138 adev->rio_mem = pci_iomap(adev->pdev, i, adev->rio_mem_size);
2139 break;
2140 }
2141 }
2142 if (adev->rio_mem == NULL)
b64a18c5 2143 DRM_INFO("PCI I/O BAR is not found.\n");
d38ceaf9
AD
2144
2145 /* early init functions */
2146 r = amdgpu_early_init(adev);
2147 if (r)
2148 return r;
2149
2150 /* if we have > 1 VGA cards, then disable the amdgpu VGA resources */
2151 /* this will fail for cards that aren't VGA class devices, just
2152 * ignore it */
2153 vga_client_register(adev->pdev, adev, NULL, amdgpu_vga_set_decode);
2154
2155 if (amdgpu_runtime_pm == 1)
2156 runtime = true;
e9bef455 2157 if (amdgpu_device_is_px(ddev))
d38ceaf9 2158 runtime = true;
84c8b22e
LW
2159 if (!pci_is_thunderbolt_attached(adev->pdev))
2160 vga_switcheroo_register_client(adev->pdev,
2161 &amdgpu_switcheroo_ops, runtime);
d38ceaf9
AD
2162 if (runtime)
2163 vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain);
2164
2165 /* Read BIOS */
83ba126a
AD
2166 if (!amdgpu_get_bios(adev)) {
2167 r = -EINVAL;
2168 goto failed;
2169 }
f7e9e9fe 2170
d38ceaf9 2171 r = amdgpu_atombios_init(adev);
2c1a2784
AD
2172 if (r) {
2173 dev_err(adev->dev, "amdgpu_atombios_init failed\n");
89041940 2174 amdgpu_vf_error_put(AMDGIM_ERROR_VF_ATOMBIOS_INIT_FAIL, 0, 0);
83ba126a 2175 goto failed;
2c1a2784 2176 }
d38ceaf9 2177
4e99a44e
ML
2178 /* detect if we are with an SRIOV vbios */
2179 amdgpu_device_detect_sriov_bios(adev);
048765ad 2180
d38ceaf9 2181 /* Post card if necessary */
bec86378 2182 if (amdgpu_vpost_needed(adev)) {
d38ceaf9 2183 if (!adev->bios) {
bec86378 2184 dev_err(adev->dev, "no vBIOS found\n");
89041940 2185 amdgpu_vf_error_put(AMDGIM_ERROR_VF_NO_VBIOS, 0, 0);
83ba126a
AD
2186 r = -EINVAL;
2187 goto failed;
d38ceaf9 2188 }
bec86378 2189 DRM_INFO("GPU posting now...\n");
4e99a44e
ML
2190 r = amdgpu_atom_asic_init(adev->mode_info.atom_context);
2191 if (r) {
2192 dev_err(adev->dev, "gpu post error!\n");
89041940 2193 amdgpu_vf_error_put(AMDGIM_ERROR_VF_GPU_POST_ERROR, 0, 0);
4e99a44e
ML
2194 goto failed;
2195 }
2196 } else {
2197 DRM_INFO("GPU post is not needed\n");
d38ceaf9
AD
2198 }
2199
88b64e95
AD
2200 if (adev->is_atom_fw) {
2201 /* Initialize clocks */
2202 r = amdgpu_atomfirmware_get_clock_info(adev);
2203 if (r) {
2204 dev_err(adev->dev, "amdgpu_atomfirmware_get_clock_info failed\n");
2205 amdgpu_vf_error_put(AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0);
2206 goto failed;
2207 }
2208 } else {
a5bde2f9
AD
2209 /* Initialize clocks */
2210 r = amdgpu_atombios_get_clock_info(adev);
2211 if (r) {
2212 dev_err(adev->dev, "amdgpu_atombios_get_clock_info failed\n");
89041940
GW
2213 amdgpu_vf_error_put(AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0);
2214 goto failed;
a5bde2f9
AD
2215 }
2216 /* init i2c buses */
4562236b
HW
2217 if (!amdgpu_device_has_dc_support(adev))
2218 amdgpu_atombios_i2c_init(adev);
2c1a2784 2219 }
d38ceaf9
AD
2220
2221 /* Fence driver */
2222 r = amdgpu_fence_driver_init(adev);
2c1a2784
AD
2223 if (r) {
2224 dev_err(adev->dev, "amdgpu_fence_driver_init failed\n");
89041940 2225 amdgpu_vf_error_put(AMDGIM_ERROR_VF_FENCE_INIT_FAIL, 0, 0);
83ba126a 2226 goto failed;
2c1a2784 2227 }
d38ceaf9
AD
2228
2229 /* init the mode config */
2230 drm_mode_config_init(adev->ddev);
2231
2232 r = amdgpu_init(adev);
2233 if (r) {
2c1a2784 2234 dev_err(adev->dev, "amdgpu_init failed\n");
89041940 2235 amdgpu_vf_error_put(AMDGIM_ERROR_VF_AMDGPU_INIT_FAIL, 0, 0);
d38ceaf9 2236 amdgpu_fini(adev);
83ba126a 2237 goto failed;
d38ceaf9
AD
2238 }
2239
2240 adev->accel_working = true;
2241
e59c0205
AX
2242 amdgpu_vm_check_compute_bug(adev);
2243
95844d20
MO
2244 /* Initialize the buffer migration limit. */
2245 if (amdgpu_moverate >= 0)
2246 max_MBps = amdgpu_moverate;
2247 else
2248 max_MBps = 8; /* Allow 8 MB/s. */
2249 /* Get a log2 for easy divisions. */
2250 adev->mm_stats.log2_max_MBps = ilog2(max(1u, max_MBps));
2251
d38ceaf9
AD
2252 r = amdgpu_ib_pool_init(adev);
2253 if (r) {
2254 dev_err(adev->dev, "IB initialization failed (%d).\n", r);
89041940 2255 amdgpu_vf_error_put(AMDGIM_ERROR_VF_IB_INIT_FAIL, 0, r);
83ba126a 2256 goto failed;
d38ceaf9
AD
2257 }
2258
2259 r = amdgpu_ib_ring_tests(adev);
2260 if (r)
2261 DRM_ERROR("ib ring test failed (%d).\n", r);
2262
9bc92b9c
ML
2263 amdgpu_fbdev_init(adev);
2264
d38ceaf9 2265 r = amdgpu_gem_debugfs_init(adev);
3f14e623 2266 if (r)
d38ceaf9 2267 DRM_ERROR("registering gem debugfs failed (%d).\n", r);
d38ceaf9
AD
2268
2269 r = amdgpu_debugfs_regs_init(adev);
3f14e623 2270 if (r)
d38ceaf9 2271 DRM_ERROR("registering register debugfs failed (%d).\n", r);
d38ceaf9 2272
4f0955fc
HR
2273 r = amdgpu_debugfs_test_ib_ring_init(adev);
2274 if (r)
2275 DRM_ERROR("registering register test ib ring debugfs failed (%d).\n", r);
2276
50ab2533 2277 r = amdgpu_debugfs_firmware_init(adev);
3f14e623 2278 if (r)
50ab2533 2279 DRM_ERROR("registering firmware debugfs failed (%d).\n", r);
50ab2533 2280
db95e218
KR
2281 r = amdgpu_debugfs_vbios_dump_init(adev);
2282 if (r)
2283 DRM_ERROR("Creating vbios dump debugfs failed (%d).\n", r);
2284
d38ceaf9
AD
2285 if ((amdgpu_testing & 1)) {
2286 if (adev->accel_working)
2287 amdgpu_test_moves(adev);
2288 else
2289 DRM_INFO("amdgpu: acceleration disabled, skipping move tests\n");
2290 }
d38ceaf9
AD
2291 if (amdgpu_benchmarking) {
2292 if (adev->accel_working)
2293 amdgpu_benchmark(adev, amdgpu_benchmarking);
2294 else
2295 DRM_INFO("amdgpu: acceleration disabled, skipping benchmarks\n");
2296 }
2297
2298 /* enable clockgating, etc. after ib tests, etc. since some blocks require
2299 * explicit gating rather than handling it automatically.
2300 */
2301 r = amdgpu_late_init(adev);
2c1a2784
AD
2302 if (r) {
2303 dev_err(adev->dev, "amdgpu_late_init failed\n");
89041940 2304 amdgpu_vf_error_put(AMDGIM_ERROR_VF_AMDGPU_LATE_INIT_FAIL, 0, r);
83ba126a 2305 goto failed;
2c1a2784 2306 }
d38ceaf9
AD
2307
2308 return 0;
83ba126a
AD
2309
2310failed:
89041940 2311 amdgpu_vf_error_trans_all(adev);
83ba126a
AD
2312 if (runtime)
2313 vga_switcheroo_fini_domain_pm_ops(adev->dev);
2314 return r;
d38ceaf9
AD
2315}
2316
d38ceaf9
AD
2317/**
2318 * amdgpu_device_fini - tear down the driver
2319 *
2320 * @adev: amdgpu_device pointer
2321 *
2322 * Tear down the driver info (all asics).
2323 * Called at driver shutdown.
2324 */
2325void amdgpu_device_fini(struct amdgpu_device *adev)
2326{
2327 int r;
2328
2329 DRM_INFO("amdgpu: finishing device.\n");
2330 adev->shutdown = true;
db2c2a97
PD
2331 if (adev->mode_info.mode_config_initialized)
2332 drm_crtc_force_disable_all(adev->ddev);
d38ceaf9
AD
2333 /* evict vram memory */
2334 amdgpu_bo_evict_vram(adev);
2335 amdgpu_ib_pool_fini(adev);
2336 amdgpu_fence_driver_fini(adev);
2337 amdgpu_fbdev_fini(adev);
2338 r = amdgpu_fini(adev);
ab4fe3e1
HR
2339 if (adev->firmware.gpu_info_fw) {
2340 release_firmware(adev->firmware.gpu_info_fw);
2341 adev->firmware.gpu_info_fw = NULL;
2342 }
d38ceaf9 2343 adev->accel_working = false;
2dc80b00 2344 cancel_delayed_work_sync(&adev->late_init_work);
d38ceaf9 2345 /* free i2c buses */
4562236b
HW
2346 if (!amdgpu_device_has_dc_support(adev))
2347 amdgpu_i2c_fini(adev);
d38ceaf9
AD
2348 amdgpu_atombios_fini(adev);
2349 kfree(adev->bios);
2350 adev->bios = NULL;
84c8b22e
LW
2351 if (!pci_is_thunderbolt_attached(adev->pdev))
2352 vga_switcheroo_unregister_client(adev->pdev);
83ba126a
AD
2353 if (adev->flags & AMD_IS_PX)
2354 vga_switcheroo_fini_domain_pm_ops(adev->dev);
d38ceaf9
AD
2355 vga_client_register(adev->pdev, NULL, NULL, NULL);
2356 if (adev->rio_mem)
2357 pci_iounmap(adev->pdev, adev->rio_mem);
2358 adev->rio_mem = NULL;
2359 iounmap(adev->rmmio);
2360 adev->rmmio = NULL;
705e519e 2361 amdgpu_doorbell_fini(adev);
d38ceaf9 2362 amdgpu_debugfs_regs_cleanup(adev);
d38ceaf9
AD
2363}
2364
2365
2366/*
2367 * Suspend & resume.
2368 */
2369/**
810ddc3a 2370 * amdgpu_device_suspend - initiate device suspend
d38ceaf9
AD
2371 *
2372 * @pdev: drm dev pointer
2373 * @state: suspend state
2374 *
2375 * Puts the hw in the suspend state (all asics).
2376 * Returns 0 for success or an error on failure.
2377 * Called at driver suspend.
2378 */
810ddc3a 2379int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
d38ceaf9
AD
2380{
2381 struct amdgpu_device *adev;
2382 struct drm_crtc *crtc;
2383 struct drm_connector *connector;
5ceb54c6 2384 int r;
d38ceaf9
AD
2385
2386 if (dev == NULL || dev->dev_private == NULL) {
2387 return -ENODEV;
2388 }
2389
2390 adev = dev->dev_private;
2391
2392 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
2393 return 0;
2394
2395 drm_kms_helper_poll_disable(dev);
2396
4562236b
HW
2397 if (!amdgpu_device_has_dc_support(adev)) {
2398 /* turn off display hw */
2399 drm_modeset_lock_all(dev);
2400 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
2401 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
2402 }
2403 drm_modeset_unlock_all(dev);
d38ceaf9
AD
2404 }
2405
ba997709
YZ
2406 amdgpu_amdkfd_suspend(adev);
2407
756e6880 2408 /* unpin the front buffers and cursors */
d38ceaf9 2409 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
756e6880 2410 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
d38ceaf9
AD
2411 struct amdgpu_framebuffer *rfb = to_amdgpu_framebuffer(crtc->primary->fb);
2412 struct amdgpu_bo *robj;
2413
756e6880
AD
2414 if (amdgpu_crtc->cursor_bo) {
2415 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
7a6901d7 2416 r = amdgpu_bo_reserve(aobj, true);
756e6880
AD
2417 if (r == 0) {
2418 amdgpu_bo_unpin(aobj);
2419 amdgpu_bo_unreserve(aobj);
2420 }
2421 }
2422
d38ceaf9
AD
2423 if (rfb == NULL || rfb->obj == NULL) {
2424 continue;
2425 }
2426 robj = gem_to_amdgpu_bo(rfb->obj);
2427 /* don't unpin kernel fb objects */
2428 if (!amdgpu_fbdev_robj_is_fb(adev, robj)) {
7a6901d7 2429 r = amdgpu_bo_reserve(robj, true);
d38ceaf9
AD
2430 if (r == 0) {
2431 amdgpu_bo_unpin(robj);
2432 amdgpu_bo_unreserve(robj);
2433 }
2434 }
2435 }
2436 /* evict vram memory */
2437 amdgpu_bo_evict_vram(adev);
2438
5ceb54c6 2439 amdgpu_fence_driver_suspend(adev);
d38ceaf9
AD
2440
2441 r = amdgpu_suspend(adev);
2442
a0a71e49
AD
2443 /* evict remaining vram memory
2444 * This second call to evict vram is to evict the gart page table
2445 * using the CPU.
2446 */
d38ceaf9
AD
2447 amdgpu_bo_evict_vram(adev);
2448
d05da0e2 2449 amdgpu_atombios_scratch_regs_save(adev);
d38ceaf9
AD
2450 pci_save_state(dev->pdev);
2451 if (suspend) {
2452 /* Shut down the device */
2453 pci_disable_device(dev->pdev);
2454 pci_set_power_state(dev->pdev, PCI_D3hot);
74b0b157 2455 } else {
2456 r = amdgpu_asic_reset(adev);
2457 if (r)
2458 DRM_ERROR("amdgpu asic reset failed\n");
d38ceaf9
AD
2459 }
2460
2461 if (fbcon) {
2462 console_lock();
2463 amdgpu_fbdev_set_suspend(adev, 1);
2464 console_unlock();
2465 }
2466 return 0;
2467}
2468
2469/**
810ddc3a 2470 * amdgpu_device_resume - initiate device resume
d38ceaf9
AD
2471 *
2472 * @pdev: drm dev pointer
2473 *
2474 * Bring the hw back to operating state (all asics).
2475 * Returns 0 for success or an error on failure.
2476 * Called at driver resume.
2477 */
810ddc3a 2478int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
d38ceaf9
AD
2479{
2480 struct drm_connector *connector;
2481 struct amdgpu_device *adev = dev->dev_private;
756e6880 2482 struct drm_crtc *crtc;
03161a6e 2483 int r = 0;
d38ceaf9
AD
2484
2485 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
2486 return 0;
2487
74b0b157 2488 if (fbcon)
d38ceaf9 2489 console_lock();
74b0b157 2490
d38ceaf9
AD
2491 if (resume) {
2492 pci_set_power_state(dev->pdev, PCI_D0);
2493 pci_restore_state(dev->pdev);
74b0b157 2494 r = pci_enable_device(dev->pdev);
03161a6e
HR
2495 if (r)
2496 goto unlock;
d38ceaf9 2497 }
d05da0e2 2498 amdgpu_atombios_scratch_regs_restore(adev);
d38ceaf9
AD
2499
2500 /* post card */
c836fec5 2501 if (amdgpu_need_post(adev)) {
74b0b157 2502 r = amdgpu_atom_asic_init(adev->mode_info.atom_context);
2503 if (r)
2504 DRM_ERROR("amdgpu asic init failed\n");
2505 }
d38ceaf9
AD
2506
2507 r = amdgpu_resume(adev);
e6707218 2508 if (r) {
ca198528 2509 DRM_ERROR("amdgpu_resume failed (%d).\n", r);
03161a6e 2510 goto unlock;
e6707218 2511 }
5ceb54c6
AD
2512 amdgpu_fence_driver_resume(adev);
2513
ca198528
FC
2514 if (resume) {
2515 r = amdgpu_ib_ring_tests(adev);
2516 if (r)
2517 DRM_ERROR("ib ring test failed (%d).\n", r);
2518 }
d38ceaf9
AD
2519
2520 r = amdgpu_late_init(adev);
03161a6e
HR
2521 if (r)
2522 goto unlock;
d38ceaf9 2523
756e6880
AD
2524 /* pin cursors */
2525 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
2526 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2527
2528 if (amdgpu_crtc->cursor_bo) {
2529 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
7a6901d7 2530 r = amdgpu_bo_reserve(aobj, true);
756e6880
AD
2531 if (r == 0) {
2532 r = amdgpu_bo_pin(aobj,
2533 AMDGPU_GEM_DOMAIN_VRAM,
2534 &amdgpu_crtc->cursor_addr);
2535 if (r != 0)
2536 DRM_ERROR("Failed to pin cursor BO (%d)\n", r);
2537 amdgpu_bo_unreserve(aobj);
2538 }
2539 }
2540 }
ba997709
YZ
2541 r = amdgpu_amdkfd_resume(adev);
2542 if (r)
2543 return r;
756e6880 2544
d38ceaf9
AD
2545 /* blat the mode back in */
2546 if (fbcon) {
4562236b
HW
2547 if (!amdgpu_device_has_dc_support(adev)) {
2548 /* pre DCE11 */
2549 drm_helper_resume_force_mode(dev);
2550
2551 /* turn on display hw */
2552 drm_modeset_lock_all(dev);
2553 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
2554 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
2555 }
2556 drm_modeset_unlock_all(dev);
2557 } else {
2558 /*
2559 * There is no equivalent atomic helper to turn on
2560 * display, so we defined our own function for this,
2561 * once suspend resume is supported by the atomic
2562 * framework this will be reworked
2563 */
2564 amdgpu_dm_display_resume(adev);
d38ceaf9
AD
2565 }
2566 }
2567
2568 drm_kms_helper_poll_enable(dev);
23a1a9e5
L
2569
2570 /*
2571 * Most of the connector probing functions try to acquire runtime pm
2572 * refs to ensure that the GPU is powered on when connector polling is
2573 * performed. Since we're calling this from a runtime PM callback,
2574 * trying to acquire rpm refs will cause us to deadlock.
2575 *
2576 * Since we're guaranteed to be holding the rpm lock, it's safe to
2577 * temporarily disable the rpm helpers so this doesn't deadlock us.
2578 */
2579#ifdef CONFIG_PM
2580 dev->dev->power.disable_depth++;
2581#endif
4562236b
HW
2582 if (!amdgpu_device_has_dc_support(adev))
2583 drm_helper_hpd_irq_event(dev);
2584 else
2585 drm_kms_helper_hotplug_event(dev);
23a1a9e5
L
2586#ifdef CONFIG_PM
2587 dev->dev->power.disable_depth--;
2588#endif
d38ceaf9 2589
03161a6e 2590 if (fbcon)
d38ceaf9 2591 amdgpu_fbdev_set_suspend(adev, 0);
03161a6e
HR
2592
2593unlock:
2594 if (fbcon)
d38ceaf9 2595 console_unlock();
d38ceaf9 2596
03161a6e 2597 return r;
d38ceaf9
AD
2598}
2599
63fbf42f
CZ
2600static bool amdgpu_check_soft_reset(struct amdgpu_device *adev)
2601{
2602 int i;
2603 bool asic_hang = false;
2604
2605 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2606 if (!adev->ip_blocks[i].status.valid)
63fbf42f 2607 continue;
a1255107
AD
2608 if (adev->ip_blocks[i].version->funcs->check_soft_reset)
2609 adev->ip_blocks[i].status.hang =
2610 adev->ip_blocks[i].version->funcs->check_soft_reset(adev);
2611 if (adev->ip_blocks[i].status.hang) {
2612 DRM_INFO("IP block:%s is hung!\n", adev->ip_blocks[i].version->funcs->name);
63fbf42f
CZ
2613 asic_hang = true;
2614 }
2615 }
2616 return asic_hang;
2617}
2618
4d446656 2619static int amdgpu_pre_soft_reset(struct amdgpu_device *adev)
d31a501e
CZ
2620{
2621 int i, r = 0;
2622
2623 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2624 if (!adev->ip_blocks[i].status.valid)
d31a501e 2625 continue;
a1255107
AD
2626 if (adev->ip_blocks[i].status.hang &&
2627 adev->ip_blocks[i].version->funcs->pre_soft_reset) {
2628 r = adev->ip_blocks[i].version->funcs->pre_soft_reset(adev);
d31a501e
CZ
2629 if (r)
2630 return r;
2631 }
2632 }
2633
2634 return 0;
2635}
2636
35d782fe
CZ
2637static bool amdgpu_need_full_reset(struct amdgpu_device *adev)
2638{
da146d3b
AD
2639 int i;
2640
2641 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2642 if (!adev->ip_blocks[i].status.valid)
da146d3b 2643 continue;
a1255107
AD
2644 if ((adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) ||
2645 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) ||
2646 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_ACP) ||
98512bb8
KW
2647 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE) ||
2648 adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP) {
a1255107 2649 if (adev->ip_blocks[i].status.hang) {
da146d3b
AD
2650 DRM_INFO("Some block need full reset!\n");
2651 return true;
2652 }
2653 }
35d782fe
CZ
2654 }
2655 return false;
2656}
2657
2658static int amdgpu_soft_reset(struct amdgpu_device *adev)
2659{
2660 int i, r = 0;
2661
2662 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2663 if (!adev->ip_blocks[i].status.valid)
35d782fe 2664 continue;
a1255107
AD
2665 if (adev->ip_blocks[i].status.hang &&
2666 adev->ip_blocks[i].version->funcs->soft_reset) {
2667 r = adev->ip_blocks[i].version->funcs->soft_reset(adev);
35d782fe
CZ
2668 if (r)
2669 return r;
2670 }
2671 }
2672
2673 return 0;
2674}
2675
2676static int amdgpu_post_soft_reset(struct amdgpu_device *adev)
2677{
2678 int i, r = 0;
2679
2680 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2681 if (!adev->ip_blocks[i].status.valid)
35d782fe 2682 continue;
a1255107
AD
2683 if (adev->ip_blocks[i].status.hang &&
2684 adev->ip_blocks[i].version->funcs->post_soft_reset)
2685 r = adev->ip_blocks[i].version->funcs->post_soft_reset(adev);
35d782fe
CZ
2686 if (r)
2687 return r;
2688 }
2689
2690 return 0;
2691}
2692
3ad81f16
CZ
2693bool amdgpu_need_backup(struct amdgpu_device *adev)
2694{
2695 if (adev->flags & AMD_IS_APU)
2696 return false;
2697
2698 return amdgpu_lockup_timeout > 0 ? true : false;
2699}
2700
53cdccd5
CZ
2701static int amdgpu_recover_vram_from_shadow(struct amdgpu_device *adev,
2702 struct amdgpu_ring *ring,
2703 struct amdgpu_bo *bo,
f54d1867 2704 struct dma_fence **fence)
53cdccd5
CZ
2705{
2706 uint32_t domain;
2707 int r;
2708
23d2e504
RH
2709 if (!bo->shadow)
2710 return 0;
2711
1d284797 2712 r = amdgpu_bo_reserve(bo, true);
23d2e504
RH
2713 if (r)
2714 return r;
2715 domain = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type);
2716 /* if bo has been evicted, then no need to recover */
2717 if (domain == AMDGPU_GEM_DOMAIN_VRAM) {
82521316
RH
2718 r = amdgpu_bo_validate(bo->shadow);
2719 if (r) {
2720 DRM_ERROR("bo validate failed!\n");
2721 goto err;
2722 }
2723
23d2e504 2724 r = amdgpu_bo_restore_from_shadow(adev, ring, bo,
53cdccd5 2725 NULL, fence, true);
23d2e504
RH
2726 if (r) {
2727 DRM_ERROR("recover page table failed!\n");
2728 goto err;
2729 }
2730 }
53cdccd5 2731err:
23d2e504
RH
2732 amdgpu_bo_unreserve(bo);
2733 return r;
53cdccd5
CZ
2734}
2735
a90ad3c2
ML
2736/**
2737 * amdgpu_sriov_gpu_reset - reset the asic
2738 *
2739 * @adev: amdgpu device pointer
7225f873 2740 * @job: which job trigger hang
a90ad3c2
ML
2741 *
2742 * Attempt the reset the GPU if it has hung (all asics).
2743 * for SRIOV case.
2744 * Returns 0 for success or an error on failure.
2745 */
7225f873 2746int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, struct amdgpu_job *job)
a90ad3c2 2747{
65781c78 2748 int i, j, r = 0;
a90ad3c2
ML
2749 int resched;
2750 struct amdgpu_bo *bo, *tmp;
2751 struct amdgpu_ring *ring;
2752 struct dma_fence *fence = NULL, *next = NULL;
2753
147b5983 2754 mutex_lock(&adev->virt.lock_reset);
a90ad3c2 2755 atomic_inc(&adev->gpu_reset_counter);
3224a12b 2756 adev->in_sriov_reset = true;
a90ad3c2
ML
2757
2758 /* block TTM */
2759 resched = ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
2760
65781c78
ML
2761 /* we start from the ring trigger GPU hang */
2762 j = job ? job->ring->idx : 0;
a90ad3c2 2763
65781c78
ML
2764 /* block scheduler */
2765 for (i = j; i < j + AMDGPU_MAX_RINGS; ++i) {
2766 ring = adev->rings[i % AMDGPU_MAX_RINGS];
a90ad3c2
ML
2767 if (!ring || !ring->sched.thread)
2768 continue;
2769
2770 kthread_park(ring->sched.thread);
65781c78
ML
2771
2772 if (job && j != i)
2773 continue;
2774
4f059ecd 2775 /* here give the last chance to check if job removed from mirror-list
65781c78 2776 * since we already pay some time on kthread_park */
4f059ecd 2777 if (job && list_empty(&job->base.node)) {
65781c78
ML
2778 kthread_unpark(ring->sched.thread);
2779 goto give_up_reset;
2780 }
2781
2782 if (amd_sched_invalidate_job(&job->base, amdgpu_job_hang_limit))
2783 amd_sched_job_kickout(&job->base);
2784
2785 /* only do job_reset on the hang ring if @job not NULL */
a90ad3c2 2786 amd_sched_hw_job_reset(&ring->sched);
a90ad3c2 2787
65781c78
ML
2788 /* after all hw jobs are reset, hw fence is meaningless, so force_completion */
2789 amdgpu_fence_driver_force_completion_ring(ring);
2790 }
a90ad3c2
ML
2791
2792 /* request to take full control of GPU before re-initialization */
7225f873 2793 if (job)
a90ad3c2
ML
2794 amdgpu_virt_reset_gpu(adev);
2795 else
2796 amdgpu_virt_request_full_gpu(adev, true);
2797
2798
2799 /* Resume IP prior to SMC */
e4f0fdcc 2800 amdgpu_sriov_reinit_early(adev);
a90ad3c2
ML
2801
2802 /* we need recover gart prior to run SMC/CP/SDMA resume */
2803 amdgpu_ttm_recover_gart(adev);
2804
2805 /* now we are okay to resume SMC/CP/SDMA */
e4f0fdcc 2806 amdgpu_sriov_reinit_late(adev);
a90ad3c2
ML
2807
2808 amdgpu_irq_gpu_reset_resume_helper(adev);
2809
2810 if (amdgpu_ib_ring_tests(adev))
2811 dev_err(adev->dev, "[GPU_RESET] ib ring test failed (%d).\n", r);
2812
2813 /* release full control of GPU after ib test */
2814 amdgpu_virt_release_full_gpu(adev, true);
2815
2816 DRM_INFO("recover vram bo from shadow\n");
2817
2818 ring = adev->mman.buffer_funcs_ring;
2819 mutex_lock(&adev->shadow_list_lock);
2820 list_for_each_entry_safe(bo, tmp, &adev->shadow_list, shadow_list) {
236763d3 2821 next = NULL;
a90ad3c2
ML
2822 amdgpu_recover_vram_from_shadow(adev, ring, bo, &next);
2823 if (fence) {
2824 r = dma_fence_wait(fence, false);
2825 if (r) {
2826 WARN(r, "recovery from shadow isn't completed\n");
2827 break;
2828 }
2829 }
2830
2831 dma_fence_put(fence);
2832 fence = next;
2833 }
2834 mutex_unlock(&adev->shadow_list_lock);
2835
2836 if (fence) {
2837 r = dma_fence_wait(fence, false);
2838 if (r)
2839 WARN(r, "recovery from shadow isn't completed\n");
2840 }
2841 dma_fence_put(fence);
2842
65781c78
ML
2843 for (i = j; i < j + AMDGPU_MAX_RINGS; ++i) {
2844 ring = adev->rings[i % AMDGPU_MAX_RINGS];
a90ad3c2
ML
2845 if (!ring || !ring->sched.thread)
2846 continue;
2847
65781c78
ML
2848 if (job && j != i) {
2849 kthread_unpark(ring->sched.thread);
2850 continue;
2851 }
2852
a90ad3c2
ML
2853 amd_sched_job_recovery(&ring->sched);
2854 kthread_unpark(ring->sched.thread);
2855 }
2856
2857 drm_helper_resume_force_mode(adev->ddev);
65781c78 2858give_up_reset:
a90ad3c2
ML
2859 ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched);
2860 if (r) {
2861 /* bad news, how to tell it to userspace ? */
2862 dev_info(adev->dev, "GPU reset failed\n");
65781c78
ML
2863 } else {
2864 dev_info(adev->dev, "GPU reset successed!\n");
a90ad3c2
ML
2865 }
2866
3224a12b 2867 adev->in_sriov_reset = false;
147b5983 2868 mutex_unlock(&adev->virt.lock_reset);
a90ad3c2
ML
2869 return r;
2870}
2871
d38ceaf9
AD
2872/**
2873 * amdgpu_gpu_reset - reset the asic
2874 *
2875 * @adev: amdgpu device pointer
2876 *
2877 * Attempt the reset the GPU if it has hung (all asics).
2878 * Returns 0 for success or an error on failure.
2879 */
2880int amdgpu_gpu_reset(struct amdgpu_device *adev)
2881{
4562236b 2882 struct drm_atomic_state *state = NULL;
d38ceaf9
AD
2883 int i, r;
2884 int resched;
0c49e0b8 2885 bool need_full_reset, vram_lost = false;
fb140b29 2886
63fbf42f
CZ
2887 if (!amdgpu_check_soft_reset(adev)) {
2888 DRM_INFO("No hardware hang detected. Did some blocks stall?\n");
2889 return 0;
2890 }
d38ceaf9 2891
d94aed5a 2892 atomic_inc(&adev->gpu_reset_counter);
d38ceaf9 2893
a3c47d6b
CZ
2894 /* block TTM */
2895 resched = ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
4562236b
HW
2896 /* store modesetting */
2897 if (amdgpu_device_has_dc_support(adev))
2898 state = drm_atomic_helper_suspend(adev->ddev);
a3c47d6b 2899
0875dc9e
CZ
2900 /* block scheduler */
2901 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2902 struct amdgpu_ring *ring = adev->rings[i];
2903
51687759 2904 if (!ring || !ring->sched.thread)
0875dc9e
CZ
2905 continue;
2906 kthread_park(ring->sched.thread);
aa1c8900 2907 amd_sched_hw_job_reset(&ring->sched);
0875dc9e 2908 }
2200edac
CZ
2909 /* after all hw jobs are reset, hw fence is meaningless, so force_completion */
2910 amdgpu_fence_driver_force_completion(adev);
d38ceaf9 2911
35d782fe 2912 need_full_reset = amdgpu_need_full_reset(adev);
d38ceaf9 2913
35d782fe
CZ
2914 if (!need_full_reset) {
2915 amdgpu_pre_soft_reset(adev);
2916 r = amdgpu_soft_reset(adev);
2917 amdgpu_post_soft_reset(adev);
2918 if (r || amdgpu_check_soft_reset(adev)) {
2919 DRM_INFO("soft reset failed, will fallback to full reset!\n");
2920 need_full_reset = true;
2921 }
f1aa7e08
CZ
2922 }
2923
35d782fe 2924 if (need_full_reset) {
35d782fe 2925 r = amdgpu_suspend(adev);
bfa99269 2926
35d782fe 2927retry:
d05da0e2 2928 amdgpu_atombios_scratch_regs_save(adev);
35d782fe 2929 r = amdgpu_asic_reset(adev);
d05da0e2 2930 amdgpu_atombios_scratch_regs_restore(adev);
35d782fe
CZ
2931 /* post card */
2932 amdgpu_atom_asic_init(adev->mode_info.atom_context);
2933
2934 if (!r) {
2935 dev_info(adev->dev, "GPU reset succeeded, trying to resume\n");
fcf0649f
CZ
2936 r = amdgpu_resume_phase1(adev);
2937 if (r)
2938 goto out;
0c49e0b8 2939 vram_lost = amdgpu_check_vram_lost(adev);
f1892138 2940 if (vram_lost) {
0c49e0b8 2941 DRM_ERROR("VRAM is lost!\n");
f1892138
CZ
2942 atomic_inc(&adev->vram_lost_counter);
2943 }
fcf0649f
CZ
2944 r = amdgpu_ttm_recover_gart(adev);
2945 if (r)
2946 goto out;
2947 r = amdgpu_resume_phase2(adev);
2948 if (r)
2949 goto out;
0c49e0b8
CZ
2950 if (vram_lost)
2951 amdgpu_fill_reset_magic(adev);
35d782fe 2952 }
d38ceaf9 2953 }
fcf0649f 2954out:
d38ceaf9 2955 if (!r) {
e72cfd58 2956 amdgpu_irq_gpu_reset_resume_helper(adev);
1f465087
CZ
2957 r = amdgpu_ib_ring_tests(adev);
2958 if (r) {
2959 dev_err(adev->dev, "ib ring test failed (%d).\n", r);
40019dc4 2960 r = amdgpu_suspend(adev);
53cdccd5 2961 need_full_reset = true;
40019dc4 2962 goto retry;
1f465087 2963 }
53cdccd5
CZ
2964 /**
2965 * recovery vm page tables, since we cannot depend on VRAM is
2966 * consistent after gpu full reset.
2967 */
2968 if (need_full_reset && amdgpu_need_backup(adev)) {
2969 struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
2970 struct amdgpu_bo *bo, *tmp;
f54d1867 2971 struct dma_fence *fence = NULL, *next = NULL;
53cdccd5
CZ
2972
2973 DRM_INFO("recover vram bo from shadow\n");
2974 mutex_lock(&adev->shadow_list_lock);
2975 list_for_each_entry_safe(bo, tmp, &adev->shadow_list, shadow_list) {
236763d3 2976 next = NULL;
53cdccd5
CZ
2977 amdgpu_recover_vram_from_shadow(adev, ring, bo, &next);
2978 if (fence) {
f54d1867 2979 r = dma_fence_wait(fence, false);
53cdccd5 2980 if (r) {
1d7b17b0 2981 WARN(r, "recovery from shadow isn't completed\n");
53cdccd5
CZ
2982 break;
2983 }
2984 }
1f465087 2985
f54d1867 2986 dma_fence_put(fence);
53cdccd5
CZ
2987 fence = next;
2988 }
2989 mutex_unlock(&adev->shadow_list_lock);
2990 if (fence) {
f54d1867 2991 r = dma_fence_wait(fence, false);
53cdccd5 2992 if (r)
1d7b17b0 2993 WARN(r, "recovery from shadow isn't completed\n");
53cdccd5 2994 }
f54d1867 2995 dma_fence_put(fence);
53cdccd5 2996 }
d38ceaf9
AD
2997 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2998 struct amdgpu_ring *ring = adev->rings[i];
51687759
CZ
2999
3000 if (!ring || !ring->sched.thread)
d38ceaf9 3001 continue;
53cdccd5 3002
aa1c8900 3003 amd_sched_job_recovery(&ring->sched);
0875dc9e 3004 kthread_unpark(ring->sched.thread);
d38ceaf9 3005 }
d38ceaf9 3006 } else {
2200edac 3007 dev_err(adev->dev, "asic resume failed (%d).\n", r);
89041940 3008 amdgpu_vf_error_put(AMDGIM_ERROR_VF_ASIC_RESUME_FAIL, 0, r);
d38ceaf9 3009 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
51687759 3010 if (adev->rings[i] && adev->rings[i]->sched.thread) {
0875dc9e 3011 kthread_unpark(adev->rings[i]->sched.thread);
0875dc9e 3012 }
d38ceaf9
AD
3013 }
3014 }
3015
4562236b
HW
3016 if (amdgpu_device_has_dc_support(adev)) {
3017 r = drm_atomic_helper_resume(adev->ddev, state);
3018 amdgpu_dm_display_resume(adev);
3019 } else
3020 drm_helper_resume_force_mode(adev->ddev);
d38ceaf9
AD
3021
3022 ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched);
89041940 3023 if (r) {
d38ceaf9
AD
3024 /* bad news, how to tell it to userspace ? */
3025 dev_info(adev->dev, "GPU reset failed\n");
89041940
GW
3026 amdgpu_vf_error_put(AMDGIM_ERROR_VF_GPU_RESET_FAIL, 0, r);
3027 }
3028 else {
6643be65 3029 dev_info(adev->dev, "GPU reset successed!\n");
89041940 3030 }
d38ceaf9 3031
89041940 3032 amdgpu_vf_error_trans_all(adev);
d38ceaf9
AD
3033 return r;
3034}
3035
d0dd7f0c
AD
3036void amdgpu_get_pcie_info(struct amdgpu_device *adev)
3037{
3038 u32 mask;
3039 int ret;
3040
cd474ba0
AD
3041 if (amdgpu_pcie_gen_cap)
3042 adev->pm.pcie_gen_mask = amdgpu_pcie_gen_cap;
d0dd7f0c 3043
cd474ba0
AD
3044 if (amdgpu_pcie_lane_cap)
3045 adev->pm.pcie_mlw_mask = amdgpu_pcie_lane_cap;
d0dd7f0c 3046
cd474ba0
AD
3047 /* covers APUs as well */
3048 if (pci_is_root_bus(adev->pdev->bus)) {
3049 if (adev->pm.pcie_gen_mask == 0)
3050 adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK;
3051 if (adev->pm.pcie_mlw_mask == 0)
3052 adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;
d0dd7f0c 3053 return;
cd474ba0 3054 }
d0dd7f0c 3055
cd474ba0
AD
3056 if (adev->pm.pcie_gen_mask == 0) {
3057 ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
3058 if (!ret) {
3059 adev->pm.pcie_gen_mask = (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
3060 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
3061 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3);
3062
3063 if (mask & DRM_PCIE_SPEED_25)
3064 adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1;
3065 if (mask & DRM_PCIE_SPEED_50)
3066 adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2;
3067 if (mask & DRM_PCIE_SPEED_80)
3068 adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3;
3069 } else {
3070 adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK;
3071 }
3072 }
3073 if (adev->pm.pcie_mlw_mask == 0) {
3074 ret = drm_pcie_get_max_link_width(adev->ddev, &mask);
3075 if (!ret) {
3076 switch (mask) {
3077 case 32:
3078 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |
3079 CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
3080 CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
3081 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
3082 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
3083 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3084 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3085 break;
3086 case 16:
3087 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
3088 CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
3089 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
3090 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
3091 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3092 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3093 break;
3094 case 12:
3095 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
3096 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
3097 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
3098 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3099 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3100 break;
3101 case 8:
3102 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
3103 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
3104 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3105 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3106 break;
3107 case 4:
3108 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
3109 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3110 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3111 break;
3112 case 2:
3113 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3114 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3115 break;
3116 case 1:
3117 adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1;
3118 break;
3119 default:
3120 break;
3121 }
3122 } else {
3123 adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;
d0dd7f0c
AD
3124 }
3125 }
3126}
d38ceaf9
AD
3127
3128/*
3129 * Debugfs
3130 */
3131int amdgpu_debugfs_add_files(struct amdgpu_device *adev,
06ab6832 3132 const struct drm_info_list *files,
d38ceaf9
AD
3133 unsigned nfiles)
3134{
3135 unsigned i;
3136
3137 for (i = 0; i < adev->debugfs_count; i++) {
3138 if (adev->debugfs[i].files == files) {
3139 /* Already registered */
3140 return 0;
3141 }
3142 }
3143
3144 i = adev->debugfs_count + 1;
3145 if (i > AMDGPU_DEBUGFS_MAX_COMPONENTS) {
3146 DRM_ERROR("Reached maximum number of debugfs components.\n");
3147 DRM_ERROR("Report so we increase "
3148 "AMDGPU_DEBUGFS_MAX_COMPONENTS.\n");
3149 return -EINVAL;
3150 }
3151 adev->debugfs[adev->debugfs_count].files = files;
3152 adev->debugfs[adev->debugfs_count].num_files = nfiles;
3153 adev->debugfs_count = i;
3154#if defined(CONFIG_DEBUG_FS)
d38ceaf9
AD
3155 drm_debugfs_create_files(files, nfiles,
3156 adev->ddev->primary->debugfs_root,
3157 adev->ddev->primary);
3158#endif
3159 return 0;
3160}
3161
d38ceaf9
AD
3162#if defined(CONFIG_DEBUG_FS)
3163
3164static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
3165 size_t size, loff_t *pos)
3166{
45063097 3167 struct amdgpu_device *adev = file_inode(f)->i_private;
d38ceaf9
AD
3168 ssize_t result = 0;
3169 int r;
bd12267d 3170 bool pm_pg_lock, use_bank;
56628159 3171 unsigned instance_bank, sh_bank, se_bank;
d38ceaf9
AD
3172
3173 if (size & 0x3 || *pos & 0x3)
3174 return -EINVAL;
3175
bd12267d
TSD
3176 /* are we reading registers for which a PG lock is necessary? */
3177 pm_pg_lock = (*pos >> 23) & 1;
3178
56628159
TSD
3179 if (*pos & (1ULL << 62)) {
3180 se_bank = (*pos >> 24) & 0x3FF;
3181 sh_bank = (*pos >> 34) & 0x3FF;
3182 instance_bank = (*pos >> 44) & 0x3FF;
32977f93
TSD
3183
3184 if (se_bank == 0x3FF)
3185 se_bank = 0xFFFFFFFF;
3186 if (sh_bank == 0x3FF)
3187 sh_bank = 0xFFFFFFFF;
3188 if (instance_bank == 0x3FF)
3189 instance_bank = 0xFFFFFFFF;
56628159 3190 use_bank = 1;
56628159
TSD
3191 } else {
3192 use_bank = 0;
3193 }
3194
801a6aa9 3195 *pos &= (1UL << 22) - 1;
bd12267d 3196
56628159 3197 if (use_bank) {
32977f93
TSD
3198 if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||
3199 (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines))
56628159
TSD
3200 return -EINVAL;
3201 mutex_lock(&adev->grbm_idx_mutex);
3202 amdgpu_gfx_select_se_sh(adev, se_bank,
3203 sh_bank, instance_bank);
3204 }
3205
bd12267d
TSD
3206 if (pm_pg_lock)
3207 mutex_lock(&adev->pm.mutex);
3208
d38ceaf9
AD
3209 while (size) {
3210 uint32_t value;
3211
3212 if (*pos > adev->rmmio_size)
56628159 3213 goto end;
d38ceaf9
AD
3214
3215 value = RREG32(*pos >> 2);
3216 r = put_user(value, (uint32_t *)buf);
56628159
TSD
3217 if (r) {
3218 result = r;
3219 goto end;
3220 }
d38ceaf9
AD
3221
3222 result += 4;
3223 buf += 4;
3224 *pos += 4;
3225 size -= 4;
3226 }
3227
56628159
TSD
3228end:
3229 if (use_bank) {
3230 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
3231 mutex_unlock(&adev->grbm_idx_mutex);
3232 }
3233
bd12267d
TSD
3234 if (pm_pg_lock)
3235 mutex_unlock(&adev->pm.mutex);
3236
d38ceaf9
AD
3237 return result;
3238}
3239
3240static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf,
3241 size_t size, loff_t *pos)
3242{
45063097 3243 struct amdgpu_device *adev = file_inode(f)->i_private;
d38ceaf9
AD
3244 ssize_t result = 0;
3245 int r;
394fdde2
TSD
3246 bool pm_pg_lock, use_bank;
3247 unsigned instance_bank, sh_bank, se_bank;
d38ceaf9
AD
3248
3249 if (size & 0x3 || *pos & 0x3)
3250 return -EINVAL;
3251
394fdde2
TSD
3252 /* are we reading registers for which a PG lock is necessary? */
3253 pm_pg_lock = (*pos >> 23) & 1;
3254
3255 if (*pos & (1ULL << 62)) {
3256 se_bank = (*pos >> 24) & 0x3FF;
3257 sh_bank = (*pos >> 34) & 0x3FF;
3258 instance_bank = (*pos >> 44) & 0x3FF;
3259
3260 if (se_bank == 0x3FF)
3261 se_bank = 0xFFFFFFFF;
3262 if (sh_bank == 0x3FF)
3263 sh_bank = 0xFFFFFFFF;
3264 if (instance_bank == 0x3FF)
3265 instance_bank = 0xFFFFFFFF;
3266 use_bank = 1;
3267 } else {
3268 use_bank = 0;
3269 }
3270
801a6aa9 3271 *pos &= (1UL << 22) - 1;
394fdde2
TSD
3272
3273 if (use_bank) {
3274 if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||
3275 (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines))
3276 return -EINVAL;
3277 mutex_lock(&adev->grbm_idx_mutex);
3278 amdgpu_gfx_select_se_sh(adev, se_bank,
3279 sh_bank, instance_bank);
3280 }
3281
3282 if (pm_pg_lock)
3283 mutex_lock(&adev->pm.mutex);
3284
d38ceaf9
AD
3285 while (size) {
3286 uint32_t value;
3287
3288 if (*pos > adev->rmmio_size)
3289 return result;
3290
3291 r = get_user(value, (uint32_t *)buf);
3292 if (r)
3293 return r;
3294
3295 WREG32(*pos >> 2, value);
3296
3297 result += 4;
3298 buf += 4;
3299 *pos += 4;
3300 size -= 4;
3301 }
3302
394fdde2
TSD
3303 if (use_bank) {
3304 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
3305 mutex_unlock(&adev->grbm_idx_mutex);
3306 }
3307
3308 if (pm_pg_lock)
3309 mutex_unlock(&adev->pm.mutex);
3310
d38ceaf9
AD
3311 return result;
3312}
3313
adcec288
TSD
3314static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
3315 size_t size, loff_t *pos)
3316{
45063097 3317 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3318 ssize_t result = 0;
3319 int r;
3320
3321 if (size & 0x3 || *pos & 0x3)
3322 return -EINVAL;
3323
3324 while (size) {
3325 uint32_t value;
3326
3327 value = RREG32_PCIE(*pos >> 2);
3328 r = put_user(value, (uint32_t *)buf);
3329 if (r)
3330 return r;
3331
3332 result += 4;
3333 buf += 4;
3334 *pos += 4;
3335 size -= 4;
3336 }
3337
3338 return result;
3339}
3340
3341static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user *buf,
3342 size_t size, loff_t *pos)
3343{
45063097 3344 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3345 ssize_t result = 0;
3346 int r;
3347
3348 if (size & 0x3 || *pos & 0x3)
3349 return -EINVAL;
3350
3351 while (size) {
3352 uint32_t value;
3353
3354 r = get_user(value, (uint32_t *)buf);
3355 if (r)
3356 return r;
3357
3358 WREG32_PCIE(*pos >> 2, value);
3359
3360 result += 4;
3361 buf += 4;
3362 *pos += 4;
3363 size -= 4;
3364 }
3365
3366 return result;
3367}
3368
3369static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,
3370 size_t size, loff_t *pos)
3371{
45063097 3372 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3373 ssize_t result = 0;
3374 int r;
3375
3376 if (size & 0x3 || *pos & 0x3)
3377 return -EINVAL;
3378
3379 while (size) {
3380 uint32_t value;
3381
3382 value = RREG32_DIDT(*pos >> 2);
3383 r = put_user(value, (uint32_t *)buf);
3384 if (r)
3385 return r;
3386
3387 result += 4;
3388 buf += 4;
3389 *pos += 4;
3390 size -= 4;
3391 }
3392
3393 return result;
3394}
3395
3396static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user *buf,
3397 size_t size, loff_t *pos)
3398{
45063097 3399 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3400 ssize_t result = 0;
3401 int r;
3402
3403 if (size & 0x3 || *pos & 0x3)
3404 return -EINVAL;
3405
3406 while (size) {
3407 uint32_t value;
3408
3409 r = get_user(value, (uint32_t *)buf);
3410 if (r)
3411 return r;
3412
3413 WREG32_DIDT(*pos >> 2, value);
3414
3415 result += 4;
3416 buf += 4;
3417 *pos += 4;
3418 size -= 4;
3419 }
3420
3421 return result;
3422}
3423
3424static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,
3425 size_t size, loff_t *pos)
3426{
45063097 3427 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3428 ssize_t result = 0;
3429 int r;
3430
3431 if (size & 0x3 || *pos & 0x3)
3432 return -EINVAL;
3433
3434 while (size) {
3435 uint32_t value;
3436
6fc0deaf 3437 value = RREG32_SMC(*pos);
adcec288
TSD
3438 r = put_user(value, (uint32_t *)buf);
3439 if (r)
3440 return r;
3441
3442 result += 4;
3443 buf += 4;
3444 *pos += 4;
3445 size -= 4;
3446 }
3447
3448 return result;
3449}
3450
3451static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *buf,
3452 size_t size, loff_t *pos)
3453{
45063097 3454 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3455 ssize_t result = 0;
3456 int r;
3457
3458 if (size & 0x3 || *pos & 0x3)
3459 return -EINVAL;
3460
3461 while (size) {
3462 uint32_t value;
3463
3464 r = get_user(value, (uint32_t *)buf);
3465 if (r)
3466 return r;
3467
6fc0deaf 3468 WREG32_SMC(*pos, value);
adcec288
TSD
3469
3470 result += 4;
3471 buf += 4;
3472 *pos += 4;
3473 size -= 4;
3474 }
3475
3476 return result;
3477}
3478
1e051413
TSD
3479static ssize_t amdgpu_debugfs_gca_config_read(struct file *f, char __user *buf,
3480 size_t size, loff_t *pos)
3481{
45063097 3482 struct amdgpu_device *adev = file_inode(f)->i_private;
1e051413
TSD
3483 ssize_t result = 0;
3484 int r;
3485 uint32_t *config, no_regs = 0;
3486
3487 if (size & 0x3 || *pos & 0x3)
3488 return -EINVAL;
3489
ecab7668 3490 config = kmalloc_array(256, sizeof(*config), GFP_KERNEL);
1e051413
TSD
3491 if (!config)
3492 return -ENOMEM;
3493
3494 /* version, increment each time something is added */
9a999359 3495 config[no_regs++] = 3;
1e051413
TSD
3496 config[no_regs++] = adev->gfx.config.max_shader_engines;
3497 config[no_regs++] = adev->gfx.config.max_tile_pipes;
3498 config[no_regs++] = adev->gfx.config.max_cu_per_sh;
3499 config[no_regs++] = adev->gfx.config.max_sh_per_se;
3500 config[no_regs++] = adev->gfx.config.max_backends_per_se;
3501 config[no_regs++] = adev->gfx.config.max_texture_channel_caches;
3502 config[no_regs++] = adev->gfx.config.max_gprs;
3503 config[no_regs++] = adev->gfx.config.max_gs_threads;
3504 config[no_regs++] = adev->gfx.config.max_hw_contexts;
3505 config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_frontend;
3506 config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_backend;
3507 config[no_regs++] = adev->gfx.config.sc_hiz_tile_fifo_size;
3508 config[no_regs++] = adev->gfx.config.sc_earlyz_tile_fifo_size;
3509 config[no_regs++] = adev->gfx.config.num_tile_pipes;
3510 config[no_regs++] = adev->gfx.config.backend_enable_mask;
3511 config[no_regs++] = adev->gfx.config.mem_max_burst_length_bytes;
3512 config[no_regs++] = adev->gfx.config.mem_row_size_in_kb;
3513 config[no_regs++] = adev->gfx.config.shader_engine_tile_size;
3514 config[no_regs++] = adev->gfx.config.num_gpus;
3515 config[no_regs++] = adev->gfx.config.multi_gpu_tile_size;
3516 config[no_regs++] = adev->gfx.config.mc_arb_ramcfg;
3517 config[no_regs++] = adev->gfx.config.gb_addr_config;
3518 config[no_regs++] = adev->gfx.config.num_rbs;
3519
89a8f309
TSD
3520 /* rev==1 */
3521 config[no_regs++] = adev->rev_id;
3522 config[no_regs++] = adev->pg_flags;
3523 config[no_regs++] = adev->cg_flags;
3524
e9f11dc8
TSD
3525 /* rev==2 */
3526 config[no_regs++] = adev->family;
3527 config[no_regs++] = adev->external_rev_id;
3528
9a999359
TSD
3529 /* rev==3 */
3530 config[no_regs++] = adev->pdev->device;
3531 config[no_regs++] = adev->pdev->revision;
3532 config[no_regs++] = adev->pdev->subsystem_device;
3533 config[no_regs++] = adev->pdev->subsystem_vendor;
3534
1e051413
TSD
3535 while (size && (*pos < no_regs * 4)) {
3536 uint32_t value;
3537
3538 value = config[*pos >> 2];
3539 r = put_user(value, (uint32_t *)buf);
3540 if (r) {
3541 kfree(config);
3542 return r;
3543 }
3544
3545 result += 4;
3546 buf += 4;
3547 *pos += 4;
3548 size -= 4;
3549 }
3550
3551 kfree(config);
3552 return result;
3553}
3554
f2cdaf20
TSD
3555static ssize_t amdgpu_debugfs_sensor_read(struct file *f, char __user *buf,
3556 size_t size, loff_t *pos)
3557{
45063097 3558 struct amdgpu_device *adev = file_inode(f)->i_private;
9f8df7d7
TSD
3559 int idx, x, outsize, r, valuesize;
3560 uint32_t values[16];
f2cdaf20 3561
9f8df7d7 3562 if (size & 3 || *pos & 0x3)
f2cdaf20
TSD
3563 return -EINVAL;
3564
3cbc614f
SP
3565 if (amdgpu_dpm == 0)
3566 return -EINVAL;
3567
f2cdaf20
TSD
3568 /* convert offset to sensor number */
3569 idx = *pos >> 2;
3570
9f8df7d7 3571 valuesize = sizeof(values);
f2cdaf20 3572 if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->read_sensor)
cd4d7464 3573 r = amdgpu_dpm_read_sensor(adev, idx, &values[0], &valuesize);
f2cdaf20
TSD
3574 else
3575 return -EINVAL;
3576
9f8df7d7
TSD
3577 if (size > valuesize)
3578 return -EINVAL;
3579
3580 outsize = 0;
3581 x = 0;
3582 if (!r) {
3583 while (size) {
3584 r = put_user(values[x++], (int32_t *)buf);
3585 buf += 4;
3586 size -= 4;
3587 outsize += 4;
3588 }
3589 }
f2cdaf20 3590
9f8df7d7 3591 return !r ? outsize : r;
f2cdaf20 3592}
1e051413 3593
273d7aa1
TSD
3594static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf,
3595 size_t size, loff_t *pos)
3596{
3597 struct amdgpu_device *adev = f->f_inode->i_private;
3598 int r, x;
3599 ssize_t result=0;
472259f0 3600 uint32_t offset, se, sh, cu, wave, simd, data[32];
273d7aa1
TSD
3601
3602 if (size & 3 || *pos & 3)
3603 return -EINVAL;
3604
3605 /* decode offset */
3606 offset = (*pos & 0x7F);
3607 se = ((*pos >> 7) & 0xFF);
3608 sh = ((*pos >> 15) & 0xFF);
3609 cu = ((*pos >> 23) & 0xFF);
3610 wave = ((*pos >> 31) & 0xFF);
3611 simd = ((*pos >> 37) & 0xFF);
273d7aa1
TSD
3612
3613 /* switch to the specific se/sh/cu */
3614 mutex_lock(&adev->grbm_idx_mutex);
3615 amdgpu_gfx_select_se_sh(adev, se, sh, cu);
3616
3617 x = 0;
472259f0
TSD
3618 if (adev->gfx.funcs->read_wave_data)
3619 adev->gfx.funcs->read_wave_data(adev, simd, wave, data, &x);
273d7aa1
TSD
3620
3621 amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
3622 mutex_unlock(&adev->grbm_idx_mutex);
3623
5ecfb3b8
TSD
3624 if (!x)
3625 return -EINVAL;
3626
472259f0 3627 while (size && (offset < x * 4)) {
273d7aa1
TSD
3628 uint32_t value;
3629
472259f0 3630 value = data[offset >> 2];
273d7aa1
TSD
3631 r = put_user(value, (uint32_t *)buf);
3632 if (r)
3633 return r;
3634
3635 result += 4;
3636 buf += 4;
472259f0 3637 offset += 4;
273d7aa1
TSD
3638 size -= 4;
3639 }
3640
3641 return result;
3642}
3643
c5a60ce8
TSD
3644static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,
3645 size_t size, loff_t *pos)
3646{
3647 struct amdgpu_device *adev = f->f_inode->i_private;
3648 int r;
3649 ssize_t result = 0;
3650 uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data;
3651
3652 if (size & 3 || *pos & 3)
3653 return -EINVAL;
3654
3655 /* decode offset */
3656 offset = (*pos & 0xFFF); /* in dwords */
3657 se = ((*pos >> 12) & 0xFF);
3658 sh = ((*pos >> 20) & 0xFF);
3659 cu = ((*pos >> 28) & 0xFF);
3660 wave = ((*pos >> 36) & 0xFF);
3661 simd = ((*pos >> 44) & 0xFF);
3662 thread = ((*pos >> 52) & 0xFF);
3663 bank = ((*pos >> 60) & 1);
3664
3665 data = kmalloc_array(1024, sizeof(*data), GFP_KERNEL);
3666 if (!data)
3667 return -ENOMEM;
3668
3669 /* switch to the specific se/sh/cu */
3670 mutex_lock(&adev->grbm_idx_mutex);
3671 amdgpu_gfx_select_se_sh(adev, se, sh, cu);
3672
3673 if (bank == 0) {
3674 if (adev->gfx.funcs->read_wave_vgprs)
3675 adev->gfx.funcs->read_wave_vgprs(adev, simd, wave, thread, offset, size>>2, data);
3676 } else {
3677 if (adev->gfx.funcs->read_wave_sgprs)
3678 adev->gfx.funcs->read_wave_sgprs(adev, simd, wave, offset, size>>2, data);
3679 }
3680
3681 amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
3682 mutex_unlock(&adev->grbm_idx_mutex);
3683
3684 while (size) {
3685 uint32_t value;
3686
3687 value = data[offset++];
3688 r = put_user(value, (uint32_t *)buf);
3689 if (r) {
3690 result = r;
3691 goto err;
3692 }
3693
3694 result += 4;
3695 buf += 4;
3696 size -= 4;
3697 }
3698
3699err:
3700 kfree(data);
3701 return result;
3702}
3703
d38ceaf9
AD
3704static const struct file_operations amdgpu_debugfs_regs_fops = {
3705 .owner = THIS_MODULE,
3706 .read = amdgpu_debugfs_regs_read,
3707 .write = amdgpu_debugfs_regs_write,
3708 .llseek = default_llseek
3709};
adcec288
TSD
3710static const struct file_operations amdgpu_debugfs_regs_didt_fops = {
3711 .owner = THIS_MODULE,
3712 .read = amdgpu_debugfs_regs_didt_read,
3713 .write = amdgpu_debugfs_regs_didt_write,
3714 .llseek = default_llseek
3715};
3716static const struct file_operations amdgpu_debugfs_regs_pcie_fops = {
3717 .owner = THIS_MODULE,
3718 .read = amdgpu_debugfs_regs_pcie_read,
3719 .write = amdgpu_debugfs_regs_pcie_write,
3720 .llseek = default_llseek
3721};
3722static const struct file_operations amdgpu_debugfs_regs_smc_fops = {
3723 .owner = THIS_MODULE,
3724 .read = amdgpu_debugfs_regs_smc_read,
3725 .write = amdgpu_debugfs_regs_smc_write,
3726 .llseek = default_llseek
3727};
3728
1e051413
TSD
3729static const struct file_operations amdgpu_debugfs_gca_config_fops = {
3730 .owner = THIS_MODULE,
3731 .read = amdgpu_debugfs_gca_config_read,
3732 .llseek = default_llseek
3733};
3734
f2cdaf20
TSD
3735static const struct file_operations amdgpu_debugfs_sensors_fops = {
3736 .owner = THIS_MODULE,
3737 .read = amdgpu_debugfs_sensor_read,
3738 .llseek = default_llseek
3739};
3740
273d7aa1
TSD
3741static const struct file_operations amdgpu_debugfs_wave_fops = {
3742 .owner = THIS_MODULE,
3743 .read = amdgpu_debugfs_wave_read,
3744 .llseek = default_llseek
3745};
c5a60ce8
TSD
3746static const struct file_operations amdgpu_debugfs_gpr_fops = {
3747 .owner = THIS_MODULE,
3748 .read = amdgpu_debugfs_gpr_read,
3749 .llseek = default_llseek
3750};
273d7aa1 3751
adcec288
TSD
3752static const struct file_operations *debugfs_regs[] = {
3753 &amdgpu_debugfs_regs_fops,
3754 &amdgpu_debugfs_regs_didt_fops,
3755 &amdgpu_debugfs_regs_pcie_fops,
3756 &amdgpu_debugfs_regs_smc_fops,
1e051413 3757 &amdgpu_debugfs_gca_config_fops,
f2cdaf20 3758 &amdgpu_debugfs_sensors_fops,
273d7aa1 3759 &amdgpu_debugfs_wave_fops,
c5a60ce8 3760 &amdgpu_debugfs_gpr_fops,
adcec288
TSD
3761};
3762
3763static const char *debugfs_regs_names[] = {
3764 "amdgpu_regs",
3765 "amdgpu_regs_didt",
3766 "amdgpu_regs_pcie",
3767 "amdgpu_regs_smc",
1e051413 3768 "amdgpu_gca_config",
f2cdaf20 3769 "amdgpu_sensors",
273d7aa1 3770 "amdgpu_wave",
c5a60ce8 3771 "amdgpu_gpr",
adcec288 3772};
d38ceaf9
AD
3773
3774static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
3775{
3776 struct drm_minor *minor = adev->ddev->primary;
3777 struct dentry *ent, *root = minor->debugfs_root;
adcec288
TSD
3778 unsigned i, j;
3779
3780 for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
3781 ent = debugfs_create_file(debugfs_regs_names[i],
3782 S_IFREG | S_IRUGO, root,
3783 adev, debugfs_regs[i]);
3784 if (IS_ERR(ent)) {
3785 for (j = 0; j < i; j++) {
3786 debugfs_remove(adev->debugfs_regs[i]);
3787 adev->debugfs_regs[i] = NULL;
3788 }
3789 return PTR_ERR(ent);
3790 }
d38ceaf9 3791
adcec288
TSD
3792 if (!i)
3793 i_size_write(ent->d_inode, adev->rmmio_size);
3794 adev->debugfs_regs[i] = ent;
3795 }
d38ceaf9
AD
3796
3797 return 0;
3798}
3799
3800static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev)
3801{
adcec288
TSD
3802 unsigned i;
3803
3804 for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
3805 if (adev->debugfs_regs[i]) {
3806 debugfs_remove(adev->debugfs_regs[i]);
3807 adev->debugfs_regs[i] = NULL;
3808 }
3809 }
d38ceaf9
AD
3810}
3811
4f0955fc
HR
3812static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data)
3813{
3814 struct drm_info_node *node = (struct drm_info_node *) m->private;
3815 struct drm_device *dev = node->minor->dev;
3816 struct amdgpu_device *adev = dev->dev_private;
3817 int r = 0, i;
3818
3819 /* hold on the scheduler */
3820 for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
3821 struct amdgpu_ring *ring = adev->rings[i];
3822
3823 if (!ring || !ring->sched.thread)
3824 continue;
3825 kthread_park(ring->sched.thread);
3826 }
3827
3828 seq_printf(m, "run ib test:\n");
3829 r = amdgpu_ib_ring_tests(adev);
3830 if (r)
3831 seq_printf(m, "ib ring tests failed (%d).\n", r);
3832 else
3833 seq_printf(m, "ib ring tests passed.\n");
3834
3835 /* go on the scheduler */
3836 for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
3837 struct amdgpu_ring *ring = adev->rings[i];
3838
3839 if (!ring || !ring->sched.thread)
3840 continue;
3841 kthread_unpark(ring->sched.thread);
3842 }
3843
3844 return 0;
3845}
3846
3847static const struct drm_info_list amdgpu_debugfs_test_ib_ring_list[] = {
3848 {"amdgpu_test_ib", &amdgpu_debugfs_test_ib}
3849};
3850
3851static int amdgpu_debugfs_test_ib_ring_init(struct amdgpu_device *adev)
3852{
3853 return amdgpu_debugfs_add_files(adev,
3854 amdgpu_debugfs_test_ib_ring_list, 1);
3855}
3856
d38ceaf9
AD
3857int amdgpu_debugfs_init(struct drm_minor *minor)
3858{
3859 return 0;
3860}
db95e218
KR
3861
3862static int amdgpu_debugfs_get_vbios_dump(struct seq_file *m, void *data)
3863{
3864 struct drm_info_node *node = (struct drm_info_node *) m->private;
3865 struct drm_device *dev = node->minor->dev;
3866 struct amdgpu_device *adev = dev->dev_private;
3867
3868 seq_write(m, adev->bios, adev->bios_size);
3869 return 0;
3870}
3871
db95e218
KR
3872static const struct drm_info_list amdgpu_vbios_dump_list[] = {
3873 {"amdgpu_vbios",
3874 amdgpu_debugfs_get_vbios_dump,
3875 0, NULL},
3876};
3877
db95e218
KR
3878static int amdgpu_debugfs_vbios_dump_init(struct amdgpu_device *adev)
3879{
3880 return amdgpu_debugfs_add_files(adev,
3881 amdgpu_vbios_dump_list, 1);
3882}
7cebc728 3883#else
27bad5b9 3884static int amdgpu_debugfs_test_ib_ring_init(struct amdgpu_device *adev)
4f0955fc
HR
3885{
3886 return 0;
3887}
7cebc728
AK
3888static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
3889{
3890 return 0;
3891}
db95e218
KR
3892static int amdgpu_debugfs_vbios_dump_init(struct amdgpu_device *adev)
3893{
3894 return 0;
3895}
7cebc728 3896static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev) { }
d38ceaf9 3897#endif