drm/amd/display: Don't fail validation for SIGNAL_TYPE_VIRTUAL
[linux-2.6-block.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:
1983 case CHIP_CARRIZO:
1984 case CHIP_STONEY:
1985 case CHIP_POLARIS11:
1986 case CHIP_POLARIS10:
1987 case CHIP_TONGA:
1988 case CHIP_FIJI:
1989#if defined(CONFIG_DRM_AMD_DC_PRE_VEGA)
1990 return amdgpu_dc != 0;
1991#else
1992 return amdgpu_dc > 0;
1993#endif
1994#endif
1995 default:
1996 return false;
1997 }
1998}
1999
2000/**
2001 * amdgpu_device_has_dc_support - check if dc is supported
2002 *
2003 * @adev: amdgpu_device_pointer
2004 *
2005 * Returns true for supported, false for not supported
2006 */
2007bool amdgpu_device_has_dc_support(struct amdgpu_device *adev)
2008{
2009 return amdgpu_device_asic_has_dc_support(adev->asic_type);
2010}
2011
d38ceaf9
AD
2012/**
2013 * amdgpu_device_init - initialize the driver
2014 *
2015 * @adev: amdgpu_device pointer
2016 * @pdev: drm dev pointer
2017 * @pdev: pci dev pointer
2018 * @flags: driver flags
2019 *
2020 * Initializes the driver info and hw (all asics).
2021 * Returns 0 for success or an error on failure.
2022 * Called at driver startup.
2023 */
2024int amdgpu_device_init(struct amdgpu_device *adev,
2025 struct drm_device *ddev,
2026 struct pci_dev *pdev,
2027 uint32_t flags)
2028{
2029 int r, i;
2030 bool runtime = false;
95844d20 2031 u32 max_MBps;
d38ceaf9
AD
2032
2033 adev->shutdown = false;
2034 adev->dev = &pdev->dev;
2035 adev->ddev = ddev;
2036 adev->pdev = pdev;
2037 adev->flags = flags;
2f7d10b3 2038 adev->asic_type = flags & AMD_ASIC_MASK;
d38ceaf9 2039 adev->usec_timeout = AMDGPU_MAX_USEC_TIMEOUT;
6f02a696 2040 adev->mc.gart_size = 512 * 1024 * 1024;
d38ceaf9
AD
2041 adev->accel_working = false;
2042 adev->num_rings = 0;
2043 adev->mman.buffer_funcs = NULL;
2044 adev->mman.buffer_funcs_ring = NULL;
2045 adev->vm_manager.vm_pte_funcs = NULL;
2d55e45a 2046 adev->vm_manager.vm_pte_num_rings = 0;
d38ceaf9 2047 adev->gart.gart_funcs = NULL;
f54d1867 2048 adev->fence_context = dma_fence_context_alloc(AMDGPU_MAX_RINGS);
d38ceaf9
AD
2049
2050 adev->smc_rreg = &amdgpu_invalid_rreg;
2051 adev->smc_wreg = &amdgpu_invalid_wreg;
2052 adev->pcie_rreg = &amdgpu_invalid_rreg;
2053 adev->pcie_wreg = &amdgpu_invalid_wreg;
36b9a952
HR
2054 adev->pciep_rreg = &amdgpu_invalid_rreg;
2055 adev->pciep_wreg = &amdgpu_invalid_wreg;
d38ceaf9
AD
2056 adev->uvd_ctx_rreg = &amdgpu_invalid_rreg;
2057 adev->uvd_ctx_wreg = &amdgpu_invalid_wreg;
2058 adev->didt_rreg = &amdgpu_invalid_rreg;
2059 adev->didt_wreg = &amdgpu_invalid_wreg;
ccdbb20a
RZ
2060 adev->gc_cac_rreg = &amdgpu_invalid_rreg;
2061 adev->gc_cac_wreg = &amdgpu_invalid_wreg;
d38ceaf9
AD
2062 adev->audio_endpt_rreg = &amdgpu_block_invalid_rreg;
2063 adev->audio_endpt_wreg = &amdgpu_block_invalid_wreg;
2064
ccdbb20a 2065
3e39ab90
AD
2066 DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X 0x%02X).\n",
2067 amdgpu_asic_name[adev->asic_type], pdev->vendor, pdev->device,
2068 pdev->subsystem_vendor, pdev->subsystem_device, pdev->revision);
d38ceaf9
AD
2069
2070 /* mutex initialization are all done here so we
2071 * can recall function without having locking issues */
d38ceaf9 2072 atomic_set(&adev->irq.ih.lock, 0);
0e5ca0d1 2073 mutex_init(&adev->firmware.mutex);
d38ceaf9
AD
2074 mutex_init(&adev->pm.mutex);
2075 mutex_init(&adev->gfx.gpu_clock_mutex);
2076 mutex_init(&adev->srbm_mutex);
2077 mutex_init(&adev->grbm_idx_mutex);
d38ceaf9
AD
2078 mutex_init(&adev->mn_lock);
2079 hash_init(adev->mn_hash);
2080
2081 amdgpu_check_arguments(adev);
2082
d38ceaf9
AD
2083 spin_lock_init(&adev->mmio_idx_lock);
2084 spin_lock_init(&adev->smc_idx_lock);
2085 spin_lock_init(&adev->pcie_idx_lock);
2086 spin_lock_init(&adev->uvd_ctx_idx_lock);
2087 spin_lock_init(&adev->didt_idx_lock);
ccdbb20a 2088 spin_lock_init(&adev->gc_cac_idx_lock);
16abb5d2 2089 spin_lock_init(&adev->se_cac_idx_lock);
d38ceaf9 2090 spin_lock_init(&adev->audio_endpt_idx_lock);
95844d20 2091 spin_lock_init(&adev->mm_stats.lock);
d38ceaf9 2092
0c4e7fa5
CZ
2093 INIT_LIST_HEAD(&adev->shadow_list);
2094 mutex_init(&adev->shadow_list_lock);
2095
5c1354bd
CZ
2096 INIT_LIST_HEAD(&adev->gtt_list);
2097 spin_lock_init(&adev->gtt_list_lock);
2098
795f2813
AR
2099 INIT_LIST_HEAD(&adev->ring_lru_list);
2100 spin_lock_init(&adev->ring_lru_list_lock);
2101
2dc80b00
S
2102 INIT_DELAYED_WORK(&adev->late_init_work, amdgpu_late_init_func_handler);
2103
0fa49558
AX
2104 /* Registers mapping */
2105 /* TODO: block userspace mapping of io register */
da69c161
KW
2106 if (adev->asic_type >= CHIP_BONAIRE) {
2107 adev->rmmio_base = pci_resource_start(adev->pdev, 5);
2108 adev->rmmio_size = pci_resource_len(adev->pdev, 5);
2109 } else {
2110 adev->rmmio_base = pci_resource_start(adev->pdev, 2);
2111 adev->rmmio_size = pci_resource_len(adev->pdev, 2);
2112 }
d38ceaf9 2113
d38ceaf9
AD
2114 adev->rmmio = ioremap(adev->rmmio_base, adev->rmmio_size);
2115 if (adev->rmmio == NULL) {
2116 return -ENOMEM;
2117 }
2118 DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)adev->rmmio_base);
2119 DRM_INFO("register mmio size: %u\n", (unsigned)adev->rmmio_size);
2120
705e519e
CK
2121 /* doorbell bar mapping */
2122 amdgpu_doorbell_init(adev);
d38ceaf9
AD
2123
2124 /* io port mapping */
2125 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
2126 if (pci_resource_flags(adev->pdev, i) & IORESOURCE_IO) {
2127 adev->rio_mem_size = pci_resource_len(adev->pdev, i);
2128 adev->rio_mem = pci_iomap(adev->pdev, i, adev->rio_mem_size);
2129 break;
2130 }
2131 }
2132 if (adev->rio_mem == NULL)
b64a18c5 2133 DRM_INFO("PCI I/O BAR is not found.\n");
d38ceaf9
AD
2134
2135 /* early init functions */
2136 r = amdgpu_early_init(adev);
2137 if (r)
2138 return r;
2139
2140 /* if we have > 1 VGA cards, then disable the amdgpu VGA resources */
2141 /* this will fail for cards that aren't VGA class devices, just
2142 * ignore it */
2143 vga_client_register(adev->pdev, adev, NULL, amdgpu_vga_set_decode);
2144
2145 if (amdgpu_runtime_pm == 1)
2146 runtime = true;
e9bef455 2147 if (amdgpu_device_is_px(ddev))
d38ceaf9 2148 runtime = true;
84c8b22e
LW
2149 if (!pci_is_thunderbolt_attached(adev->pdev))
2150 vga_switcheroo_register_client(adev->pdev,
2151 &amdgpu_switcheroo_ops, runtime);
d38ceaf9
AD
2152 if (runtime)
2153 vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain);
2154
2155 /* Read BIOS */
83ba126a
AD
2156 if (!amdgpu_get_bios(adev)) {
2157 r = -EINVAL;
2158 goto failed;
2159 }
f7e9e9fe 2160
d38ceaf9 2161 r = amdgpu_atombios_init(adev);
2c1a2784
AD
2162 if (r) {
2163 dev_err(adev->dev, "amdgpu_atombios_init failed\n");
89041940 2164 amdgpu_vf_error_put(AMDGIM_ERROR_VF_ATOMBIOS_INIT_FAIL, 0, 0);
83ba126a 2165 goto failed;
2c1a2784 2166 }
d38ceaf9 2167
4e99a44e
ML
2168 /* detect if we are with an SRIOV vbios */
2169 amdgpu_device_detect_sriov_bios(adev);
048765ad 2170
d38ceaf9 2171 /* Post card if necessary */
bec86378 2172 if (amdgpu_vpost_needed(adev)) {
d38ceaf9 2173 if (!adev->bios) {
bec86378 2174 dev_err(adev->dev, "no vBIOS found\n");
89041940 2175 amdgpu_vf_error_put(AMDGIM_ERROR_VF_NO_VBIOS, 0, 0);
83ba126a
AD
2176 r = -EINVAL;
2177 goto failed;
d38ceaf9 2178 }
bec86378 2179 DRM_INFO("GPU posting now...\n");
4e99a44e
ML
2180 r = amdgpu_atom_asic_init(adev->mode_info.atom_context);
2181 if (r) {
2182 dev_err(adev->dev, "gpu post error!\n");
89041940 2183 amdgpu_vf_error_put(AMDGIM_ERROR_VF_GPU_POST_ERROR, 0, 0);
4e99a44e
ML
2184 goto failed;
2185 }
2186 } else {
2187 DRM_INFO("GPU post is not needed\n");
d38ceaf9
AD
2188 }
2189
88b64e95
AD
2190 if (adev->is_atom_fw) {
2191 /* Initialize clocks */
2192 r = amdgpu_atomfirmware_get_clock_info(adev);
2193 if (r) {
2194 dev_err(adev->dev, "amdgpu_atomfirmware_get_clock_info failed\n");
2195 amdgpu_vf_error_put(AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0);
2196 goto failed;
2197 }
2198 } else {
a5bde2f9
AD
2199 /* Initialize clocks */
2200 r = amdgpu_atombios_get_clock_info(adev);
2201 if (r) {
2202 dev_err(adev->dev, "amdgpu_atombios_get_clock_info failed\n");
89041940
GW
2203 amdgpu_vf_error_put(AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0);
2204 goto failed;
a5bde2f9
AD
2205 }
2206 /* init i2c buses */
4562236b
HW
2207 if (!amdgpu_device_has_dc_support(adev))
2208 amdgpu_atombios_i2c_init(adev);
2c1a2784 2209 }
d38ceaf9
AD
2210
2211 /* Fence driver */
2212 r = amdgpu_fence_driver_init(adev);
2c1a2784
AD
2213 if (r) {
2214 dev_err(adev->dev, "amdgpu_fence_driver_init failed\n");
89041940 2215 amdgpu_vf_error_put(AMDGIM_ERROR_VF_FENCE_INIT_FAIL, 0, 0);
83ba126a 2216 goto failed;
2c1a2784 2217 }
d38ceaf9
AD
2218
2219 /* init the mode config */
2220 drm_mode_config_init(adev->ddev);
2221
2222 r = amdgpu_init(adev);
2223 if (r) {
2c1a2784 2224 dev_err(adev->dev, "amdgpu_init failed\n");
89041940 2225 amdgpu_vf_error_put(AMDGIM_ERROR_VF_AMDGPU_INIT_FAIL, 0, 0);
d38ceaf9 2226 amdgpu_fini(adev);
83ba126a 2227 goto failed;
d38ceaf9
AD
2228 }
2229
2230 adev->accel_working = true;
2231
e59c0205
AX
2232 amdgpu_vm_check_compute_bug(adev);
2233
95844d20
MO
2234 /* Initialize the buffer migration limit. */
2235 if (amdgpu_moverate >= 0)
2236 max_MBps = amdgpu_moverate;
2237 else
2238 max_MBps = 8; /* Allow 8 MB/s. */
2239 /* Get a log2 for easy divisions. */
2240 adev->mm_stats.log2_max_MBps = ilog2(max(1u, max_MBps));
2241
d38ceaf9
AD
2242 r = amdgpu_ib_pool_init(adev);
2243 if (r) {
2244 dev_err(adev->dev, "IB initialization failed (%d).\n", r);
89041940 2245 amdgpu_vf_error_put(AMDGIM_ERROR_VF_IB_INIT_FAIL, 0, r);
83ba126a 2246 goto failed;
d38ceaf9
AD
2247 }
2248
2249 r = amdgpu_ib_ring_tests(adev);
2250 if (r)
2251 DRM_ERROR("ib ring test failed (%d).\n", r);
2252
9bc92b9c
ML
2253 amdgpu_fbdev_init(adev);
2254
d38ceaf9 2255 r = amdgpu_gem_debugfs_init(adev);
3f14e623 2256 if (r)
d38ceaf9 2257 DRM_ERROR("registering gem debugfs failed (%d).\n", r);
d38ceaf9
AD
2258
2259 r = amdgpu_debugfs_regs_init(adev);
3f14e623 2260 if (r)
d38ceaf9 2261 DRM_ERROR("registering register debugfs failed (%d).\n", r);
d38ceaf9 2262
4f0955fc
HR
2263 r = amdgpu_debugfs_test_ib_ring_init(adev);
2264 if (r)
2265 DRM_ERROR("registering register test ib ring debugfs failed (%d).\n", r);
2266
50ab2533 2267 r = amdgpu_debugfs_firmware_init(adev);
3f14e623 2268 if (r)
50ab2533 2269 DRM_ERROR("registering firmware debugfs failed (%d).\n", r);
50ab2533 2270
db95e218
KR
2271 r = amdgpu_debugfs_vbios_dump_init(adev);
2272 if (r)
2273 DRM_ERROR("Creating vbios dump debugfs failed (%d).\n", r);
2274
d38ceaf9
AD
2275 if ((amdgpu_testing & 1)) {
2276 if (adev->accel_working)
2277 amdgpu_test_moves(adev);
2278 else
2279 DRM_INFO("amdgpu: acceleration disabled, skipping move tests\n");
2280 }
d38ceaf9
AD
2281 if (amdgpu_benchmarking) {
2282 if (adev->accel_working)
2283 amdgpu_benchmark(adev, amdgpu_benchmarking);
2284 else
2285 DRM_INFO("amdgpu: acceleration disabled, skipping benchmarks\n");
2286 }
2287
2288 /* enable clockgating, etc. after ib tests, etc. since some blocks require
2289 * explicit gating rather than handling it automatically.
2290 */
2291 r = amdgpu_late_init(adev);
2c1a2784
AD
2292 if (r) {
2293 dev_err(adev->dev, "amdgpu_late_init failed\n");
89041940 2294 amdgpu_vf_error_put(AMDGIM_ERROR_VF_AMDGPU_LATE_INIT_FAIL, 0, r);
83ba126a 2295 goto failed;
2c1a2784 2296 }
d38ceaf9
AD
2297
2298 return 0;
83ba126a
AD
2299
2300failed:
89041940 2301 amdgpu_vf_error_trans_all(adev);
83ba126a
AD
2302 if (runtime)
2303 vga_switcheroo_fini_domain_pm_ops(adev->dev);
2304 return r;
d38ceaf9
AD
2305}
2306
d38ceaf9
AD
2307/**
2308 * amdgpu_device_fini - tear down the driver
2309 *
2310 * @adev: amdgpu_device pointer
2311 *
2312 * Tear down the driver info (all asics).
2313 * Called at driver shutdown.
2314 */
2315void amdgpu_device_fini(struct amdgpu_device *adev)
2316{
2317 int r;
2318
2319 DRM_INFO("amdgpu: finishing device.\n");
2320 adev->shutdown = true;
db2c2a97
PD
2321 if (adev->mode_info.mode_config_initialized)
2322 drm_crtc_force_disable_all(adev->ddev);
d38ceaf9
AD
2323 /* evict vram memory */
2324 amdgpu_bo_evict_vram(adev);
2325 amdgpu_ib_pool_fini(adev);
2326 amdgpu_fence_driver_fini(adev);
2327 amdgpu_fbdev_fini(adev);
2328 r = amdgpu_fini(adev);
ab4fe3e1
HR
2329 if (adev->firmware.gpu_info_fw) {
2330 release_firmware(adev->firmware.gpu_info_fw);
2331 adev->firmware.gpu_info_fw = NULL;
2332 }
d38ceaf9 2333 adev->accel_working = false;
2dc80b00 2334 cancel_delayed_work_sync(&adev->late_init_work);
d38ceaf9 2335 /* free i2c buses */
4562236b
HW
2336 if (!amdgpu_device_has_dc_support(adev))
2337 amdgpu_i2c_fini(adev);
d38ceaf9
AD
2338 amdgpu_atombios_fini(adev);
2339 kfree(adev->bios);
2340 adev->bios = NULL;
84c8b22e
LW
2341 if (!pci_is_thunderbolt_attached(adev->pdev))
2342 vga_switcheroo_unregister_client(adev->pdev);
83ba126a
AD
2343 if (adev->flags & AMD_IS_PX)
2344 vga_switcheroo_fini_domain_pm_ops(adev->dev);
d38ceaf9
AD
2345 vga_client_register(adev->pdev, NULL, NULL, NULL);
2346 if (adev->rio_mem)
2347 pci_iounmap(adev->pdev, adev->rio_mem);
2348 adev->rio_mem = NULL;
2349 iounmap(adev->rmmio);
2350 adev->rmmio = NULL;
705e519e 2351 amdgpu_doorbell_fini(adev);
d38ceaf9 2352 amdgpu_debugfs_regs_cleanup(adev);
d38ceaf9
AD
2353}
2354
2355
2356/*
2357 * Suspend & resume.
2358 */
2359/**
810ddc3a 2360 * amdgpu_device_suspend - initiate device suspend
d38ceaf9
AD
2361 *
2362 * @pdev: drm dev pointer
2363 * @state: suspend state
2364 *
2365 * Puts the hw in the suspend state (all asics).
2366 * Returns 0 for success or an error on failure.
2367 * Called at driver suspend.
2368 */
810ddc3a 2369int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
d38ceaf9
AD
2370{
2371 struct amdgpu_device *adev;
2372 struct drm_crtc *crtc;
2373 struct drm_connector *connector;
5ceb54c6 2374 int r;
d38ceaf9
AD
2375
2376 if (dev == NULL || dev->dev_private == NULL) {
2377 return -ENODEV;
2378 }
2379
2380 adev = dev->dev_private;
2381
2382 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
2383 return 0;
2384
2385 drm_kms_helper_poll_disable(dev);
2386
4562236b
HW
2387 if (!amdgpu_device_has_dc_support(adev)) {
2388 /* turn off display hw */
2389 drm_modeset_lock_all(dev);
2390 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
2391 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
2392 }
2393 drm_modeset_unlock_all(dev);
d38ceaf9
AD
2394 }
2395
ba997709
YZ
2396 amdgpu_amdkfd_suspend(adev);
2397
756e6880 2398 /* unpin the front buffers and cursors */
d38ceaf9 2399 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
756e6880 2400 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
d38ceaf9
AD
2401 struct amdgpu_framebuffer *rfb = to_amdgpu_framebuffer(crtc->primary->fb);
2402 struct amdgpu_bo *robj;
2403
756e6880
AD
2404 if (amdgpu_crtc->cursor_bo) {
2405 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
7a6901d7 2406 r = amdgpu_bo_reserve(aobj, true);
756e6880
AD
2407 if (r == 0) {
2408 amdgpu_bo_unpin(aobj);
2409 amdgpu_bo_unreserve(aobj);
2410 }
2411 }
2412
d38ceaf9
AD
2413 if (rfb == NULL || rfb->obj == NULL) {
2414 continue;
2415 }
2416 robj = gem_to_amdgpu_bo(rfb->obj);
2417 /* don't unpin kernel fb objects */
2418 if (!amdgpu_fbdev_robj_is_fb(adev, robj)) {
7a6901d7 2419 r = amdgpu_bo_reserve(robj, true);
d38ceaf9
AD
2420 if (r == 0) {
2421 amdgpu_bo_unpin(robj);
2422 amdgpu_bo_unreserve(robj);
2423 }
2424 }
2425 }
2426 /* evict vram memory */
2427 amdgpu_bo_evict_vram(adev);
2428
5ceb54c6 2429 amdgpu_fence_driver_suspend(adev);
d38ceaf9
AD
2430
2431 r = amdgpu_suspend(adev);
2432
a0a71e49
AD
2433 /* evict remaining vram memory
2434 * This second call to evict vram is to evict the gart page table
2435 * using the CPU.
2436 */
d38ceaf9
AD
2437 amdgpu_bo_evict_vram(adev);
2438
d05da0e2 2439 amdgpu_atombios_scratch_regs_save(adev);
d38ceaf9
AD
2440 pci_save_state(dev->pdev);
2441 if (suspend) {
2442 /* Shut down the device */
2443 pci_disable_device(dev->pdev);
2444 pci_set_power_state(dev->pdev, PCI_D3hot);
74b0b157 2445 } else {
2446 r = amdgpu_asic_reset(adev);
2447 if (r)
2448 DRM_ERROR("amdgpu asic reset failed\n");
d38ceaf9
AD
2449 }
2450
2451 if (fbcon) {
2452 console_lock();
2453 amdgpu_fbdev_set_suspend(adev, 1);
2454 console_unlock();
2455 }
2456 return 0;
2457}
2458
2459/**
810ddc3a 2460 * amdgpu_device_resume - initiate device resume
d38ceaf9
AD
2461 *
2462 * @pdev: drm dev pointer
2463 *
2464 * Bring the hw back to operating state (all asics).
2465 * Returns 0 for success or an error on failure.
2466 * Called at driver resume.
2467 */
810ddc3a 2468int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
d38ceaf9
AD
2469{
2470 struct drm_connector *connector;
2471 struct amdgpu_device *adev = dev->dev_private;
756e6880 2472 struct drm_crtc *crtc;
03161a6e 2473 int r = 0;
d38ceaf9
AD
2474
2475 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
2476 return 0;
2477
74b0b157 2478 if (fbcon)
d38ceaf9 2479 console_lock();
74b0b157 2480
d38ceaf9
AD
2481 if (resume) {
2482 pci_set_power_state(dev->pdev, PCI_D0);
2483 pci_restore_state(dev->pdev);
74b0b157 2484 r = pci_enable_device(dev->pdev);
03161a6e
HR
2485 if (r)
2486 goto unlock;
d38ceaf9 2487 }
d05da0e2 2488 amdgpu_atombios_scratch_regs_restore(adev);
d38ceaf9
AD
2489
2490 /* post card */
c836fec5 2491 if (amdgpu_need_post(adev)) {
74b0b157 2492 r = amdgpu_atom_asic_init(adev->mode_info.atom_context);
2493 if (r)
2494 DRM_ERROR("amdgpu asic init failed\n");
2495 }
d38ceaf9
AD
2496
2497 r = amdgpu_resume(adev);
e6707218 2498 if (r) {
ca198528 2499 DRM_ERROR("amdgpu_resume failed (%d).\n", r);
03161a6e 2500 goto unlock;
e6707218 2501 }
5ceb54c6
AD
2502 amdgpu_fence_driver_resume(adev);
2503
ca198528
FC
2504 if (resume) {
2505 r = amdgpu_ib_ring_tests(adev);
2506 if (r)
2507 DRM_ERROR("ib ring test failed (%d).\n", r);
2508 }
d38ceaf9
AD
2509
2510 r = amdgpu_late_init(adev);
03161a6e
HR
2511 if (r)
2512 goto unlock;
d38ceaf9 2513
756e6880
AD
2514 /* pin cursors */
2515 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
2516 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2517
2518 if (amdgpu_crtc->cursor_bo) {
2519 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
7a6901d7 2520 r = amdgpu_bo_reserve(aobj, true);
756e6880
AD
2521 if (r == 0) {
2522 r = amdgpu_bo_pin(aobj,
2523 AMDGPU_GEM_DOMAIN_VRAM,
2524 &amdgpu_crtc->cursor_addr);
2525 if (r != 0)
2526 DRM_ERROR("Failed to pin cursor BO (%d)\n", r);
2527 amdgpu_bo_unreserve(aobj);
2528 }
2529 }
2530 }
ba997709
YZ
2531 r = amdgpu_amdkfd_resume(adev);
2532 if (r)
2533 return r;
756e6880 2534
d38ceaf9
AD
2535 /* blat the mode back in */
2536 if (fbcon) {
4562236b
HW
2537 if (!amdgpu_device_has_dc_support(adev)) {
2538 /* pre DCE11 */
2539 drm_helper_resume_force_mode(dev);
2540
2541 /* turn on display hw */
2542 drm_modeset_lock_all(dev);
2543 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
2544 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
2545 }
2546 drm_modeset_unlock_all(dev);
2547 } else {
2548 /*
2549 * There is no equivalent atomic helper to turn on
2550 * display, so we defined our own function for this,
2551 * once suspend resume is supported by the atomic
2552 * framework this will be reworked
2553 */
2554 amdgpu_dm_display_resume(adev);
d38ceaf9
AD
2555 }
2556 }
2557
2558 drm_kms_helper_poll_enable(dev);
23a1a9e5
L
2559
2560 /*
2561 * Most of the connector probing functions try to acquire runtime pm
2562 * refs to ensure that the GPU is powered on when connector polling is
2563 * performed. Since we're calling this from a runtime PM callback,
2564 * trying to acquire rpm refs will cause us to deadlock.
2565 *
2566 * Since we're guaranteed to be holding the rpm lock, it's safe to
2567 * temporarily disable the rpm helpers so this doesn't deadlock us.
2568 */
2569#ifdef CONFIG_PM
2570 dev->dev->power.disable_depth++;
2571#endif
4562236b
HW
2572 if (!amdgpu_device_has_dc_support(adev))
2573 drm_helper_hpd_irq_event(dev);
2574 else
2575 drm_kms_helper_hotplug_event(dev);
23a1a9e5
L
2576#ifdef CONFIG_PM
2577 dev->dev->power.disable_depth--;
2578#endif
d38ceaf9 2579
03161a6e 2580 if (fbcon)
d38ceaf9 2581 amdgpu_fbdev_set_suspend(adev, 0);
03161a6e
HR
2582
2583unlock:
2584 if (fbcon)
d38ceaf9 2585 console_unlock();
d38ceaf9 2586
03161a6e 2587 return r;
d38ceaf9
AD
2588}
2589
63fbf42f
CZ
2590static bool amdgpu_check_soft_reset(struct amdgpu_device *adev)
2591{
2592 int i;
2593 bool asic_hang = false;
2594
2595 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2596 if (!adev->ip_blocks[i].status.valid)
63fbf42f 2597 continue;
a1255107
AD
2598 if (adev->ip_blocks[i].version->funcs->check_soft_reset)
2599 adev->ip_blocks[i].status.hang =
2600 adev->ip_blocks[i].version->funcs->check_soft_reset(adev);
2601 if (adev->ip_blocks[i].status.hang) {
2602 DRM_INFO("IP block:%s is hung!\n", adev->ip_blocks[i].version->funcs->name);
63fbf42f
CZ
2603 asic_hang = true;
2604 }
2605 }
2606 return asic_hang;
2607}
2608
4d446656 2609static int amdgpu_pre_soft_reset(struct amdgpu_device *adev)
d31a501e
CZ
2610{
2611 int i, r = 0;
2612
2613 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2614 if (!adev->ip_blocks[i].status.valid)
d31a501e 2615 continue;
a1255107
AD
2616 if (adev->ip_blocks[i].status.hang &&
2617 adev->ip_blocks[i].version->funcs->pre_soft_reset) {
2618 r = adev->ip_blocks[i].version->funcs->pre_soft_reset(adev);
d31a501e
CZ
2619 if (r)
2620 return r;
2621 }
2622 }
2623
2624 return 0;
2625}
2626
35d782fe
CZ
2627static bool amdgpu_need_full_reset(struct amdgpu_device *adev)
2628{
da146d3b
AD
2629 int i;
2630
2631 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2632 if (!adev->ip_blocks[i].status.valid)
da146d3b 2633 continue;
a1255107
AD
2634 if ((adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) ||
2635 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) ||
2636 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_ACP) ||
98512bb8
KW
2637 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE) ||
2638 adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP) {
a1255107 2639 if (adev->ip_blocks[i].status.hang) {
da146d3b
AD
2640 DRM_INFO("Some block need full reset!\n");
2641 return true;
2642 }
2643 }
35d782fe
CZ
2644 }
2645 return false;
2646}
2647
2648static int amdgpu_soft_reset(struct amdgpu_device *adev)
2649{
2650 int i, r = 0;
2651
2652 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2653 if (!adev->ip_blocks[i].status.valid)
35d782fe 2654 continue;
a1255107
AD
2655 if (adev->ip_blocks[i].status.hang &&
2656 adev->ip_blocks[i].version->funcs->soft_reset) {
2657 r = adev->ip_blocks[i].version->funcs->soft_reset(adev);
35d782fe
CZ
2658 if (r)
2659 return r;
2660 }
2661 }
2662
2663 return 0;
2664}
2665
2666static int amdgpu_post_soft_reset(struct amdgpu_device *adev)
2667{
2668 int i, r = 0;
2669
2670 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2671 if (!adev->ip_blocks[i].status.valid)
35d782fe 2672 continue;
a1255107
AD
2673 if (adev->ip_blocks[i].status.hang &&
2674 adev->ip_blocks[i].version->funcs->post_soft_reset)
2675 r = adev->ip_blocks[i].version->funcs->post_soft_reset(adev);
35d782fe
CZ
2676 if (r)
2677 return r;
2678 }
2679
2680 return 0;
2681}
2682
3ad81f16
CZ
2683bool amdgpu_need_backup(struct amdgpu_device *adev)
2684{
2685 if (adev->flags & AMD_IS_APU)
2686 return false;
2687
2688 return amdgpu_lockup_timeout > 0 ? true : false;
2689}
2690
53cdccd5
CZ
2691static int amdgpu_recover_vram_from_shadow(struct amdgpu_device *adev,
2692 struct amdgpu_ring *ring,
2693 struct amdgpu_bo *bo,
f54d1867 2694 struct dma_fence **fence)
53cdccd5
CZ
2695{
2696 uint32_t domain;
2697 int r;
2698
23d2e504
RH
2699 if (!bo->shadow)
2700 return 0;
2701
1d284797 2702 r = amdgpu_bo_reserve(bo, true);
23d2e504
RH
2703 if (r)
2704 return r;
2705 domain = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type);
2706 /* if bo has been evicted, then no need to recover */
2707 if (domain == AMDGPU_GEM_DOMAIN_VRAM) {
82521316
RH
2708 r = amdgpu_bo_validate(bo->shadow);
2709 if (r) {
2710 DRM_ERROR("bo validate failed!\n");
2711 goto err;
2712 }
2713
23d2e504 2714 r = amdgpu_bo_restore_from_shadow(adev, ring, bo,
53cdccd5 2715 NULL, fence, true);
23d2e504
RH
2716 if (r) {
2717 DRM_ERROR("recover page table failed!\n");
2718 goto err;
2719 }
2720 }
53cdccd5 2721err:
23d2e504
RH
2722 amdgpu_bo_unreserve(bo);
2723 return r;
53cdccd5
CZ
2724}
2725
a90ad3c2
ML
2726/**
2727 * amdgpu_sriov_gpu_reset - reset the asic
2728 *
2729 * @adev: amdgpu device pointer
7225f873 2730 * @job: which job trigger hang
a90ad3c2
ML
2731 *
2732 * Attempt the reset the GPU if it has hung (all asics).
2733 * for SRIOV case.
2734 * Returns 0 for success or an error on failure.
2735 */
7225f873 2736int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, struct amdgpu_job *job)
a90ad3c2 2737{
65781c78 2738 int i, j, r = 0;
a90ad3c2
ML
2739 int resched;
2740 struct amdgpu_bo *bo, *tmp;
2741 struct amdgpu_ring *ring;
2742 struct dma_fence *fence = NULL, *next = NULL;
2743
147b5983 2744 mutex_lock(&adev->virt.lock_reset);
a90ad3c2 2745 atomic_inc(&adev->gpu_reset_counter);
3224a12b 2746 adev->in_sriov_reset = true;
a90ad3c2
ML
2747
2748 /* block TTM */
2749 resched = ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
2750
65781c78
ML
2751 /* we start from the ring trigger GPU hang */
2752 j = job ? job->ring->idx : 0;
a90ad3c2 2753
65781c78
ML
2754 /* block scheduler */
2755 for (i = j; i < j + AMDGPU_MAX_RINGS; ++i) {
2756 ring = adev->rings[i % AMDGPU_MAX_RINGS];
a90ad3c2
ML
2757 if (!ring || !ring->sched.thread)
2758 continue;
2759
2760 kthread_park(ring->sched.thread);
65781c78
ML
2761
2762 if (job && j != i)
2763 continue;
2764
4f059ecd 2765 /* here give the last chance to check if job removed from mirror-list
65781c78 2766 * since we already pay some time on kthread_park */
4f059ecd 2767 if (job && list_empty(&job->base.node)) {
65781c78
ML
2768 kthread_unpark(ring->sched.thread);
2769 goto give_up_reset;
2770 }
2771
2772 if (amd_sched_invalidate_job(&job->base, amdgpu_job_hang_limit))
2773 amd_sched_job_kickout(&job->base);
2774
2775 /* only do job_reset on the hang ring if @job not NULL */
a90ad3c2 2776 amd_sched_hw_job_reset(&ring->sched);
a90ad3c2 2777
65781c78
ML
2778 /* after all hw jobs are reset, hw fence is meaningless, so force_completion */
2779 amdgpu_fence_driver_force_completion_ring(ring);
2780 }
a90ad3c2
ML
2781
2782 /* request to take full control of GPU before re-initialization */
7225f873 2783 if (job)
a90ad3c2
ML
2784 amdgpu_virt_reset_gpu(adev);
2785 else
2786 amdgpu_virt_request_full_gpu(adev, true);
2787
2788
2789 /* Resume IP prior to SMC */
e4f0fdcc 2790 amdgpu_sriov_reinit_early(adev);
a90ad3c2
ML
2791
2792 /* we need recover gart prior to run SMC/CP/SDMA resume */
2793 amdgpu_ttm_recover_gart(adev);
2794
2795 /* now we are okay to resume SMC/CP/SDMA */
e4f0fdcc 2796 amdgpu_sriov_reinit_late(adev);
a90ad3c2
ML
2797
2798 amdgpu_irq_gpu_reset_resume_helper(adev);
2799
2800 if (amdgpu_ib_ring_tests(adev))
2801 dev_err(adev->dev, "[GPU_RESET] ib ring test failed (%d).\n", r);
2802
2803 /* release full control of GPU after ib test */
2804 amdgpu_virt_release_full_gpu(adev, true);
2805
2806 DRM_INFO("recover vram bo from shadow\n");
2807
2808 ring = adev->mman.buffer_funcs_ring;
2809 mutex_lock(&adev->shadow_list_lock);
2810 list_for_each_entry_safe(bo, tmp, &adev->shadow_list, shadow_list) {
236763d3 2811 next = NULL;
a90ad3c2
ML
2812 amdgpu_recover_vram_from_shadow(adev, ring, bo, &next);
2813 if (fence) {
2814 r = dma_fence_wait(fence, false);
2815 if (r) {
2816 WARN(r, "recovery from shadow isn't completed\n");
2817 break;
2818 }
2819 }
2820
2821 dma_fence_put(fence);
2822 fence = next;
2823 }
2824 mutex_unlock(&adev->shadow_list_lock);
2825
2826 if (fence) {
2827 r = dma_fence_wait(fence, false);
2828 if (r)
2829 WARN(r, "recovery from shadow isn't completed\n");
2830 }
2831 dma_fence_put(fence);
2832
65781c78
ML
2833 for (i = j; i < j + AMDGPU_MAX_RINGS; ++i) {
2834 ring = adev->rings[i % AMDGPU_MAX_RINGS];
a90ad3c2
ML
2835 if (!ring || !ring->sched.thread)
2836 continue;
2837
65781c78
ML
2838 if (job && j != i) {
2839 kthread_unpark(ring->sched.thread);
2840 continue;
2841 }
2842
a90ad3c2
ML
2843 amd_sched_job_recovery(&ring->sched);
2844 kthread_unpark(ring->sched.thread);
2845 }
2846
2847 drm_helper_resume_force_mode(adev->ddev);
65781c78 2848give_up_reset:
a90ad3c2
ML
2849 ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched);
2850 if (r) {
2851 /* bad news, how to tell it to userspace ? */
2852 dev_info(adev->dev, "GPU reset failed\n");
65781c78
ML
2853 } else {
2854 dev_info(adev->dev, "GPU reset successed!\n");
a90ad3c2
ML
2855 }
2856
3224a12b 2857 adev->in_sriov_reset = false;
147b5983 2858 mutex_unlock(&adev->virt.lock_reset);
a90ad3c2
ML
2859 return r;
2860}
2861
d38ceaf9
AD
2862/**
2863 * amdgpu_gpu_reset - reset the asic
2864 *
2865 * @adev: amdgpu device pointer
2866 *
2867 * Attempt the reset the GPU if it has hung (all asics).
2868 * Returns 0 for success or an error on failure.
2869 */
2870int amdgpu_gpu_reset(struct amdgpu_device *adev)
2871{
4562236b 2872 struct drm_atomic_state *state = NULL;
d38ceaf9
AD
2873 int i, r;
2874 int resched;
0c49e0b8 2875 bool need_full_reset, vram_lost = false;
fb140b29 2876
63fbf42f
CZ
2877 if (!amdgpu_check_soft_reset(adev)) {
2878 DRM_INFO("No hardware hang detected. Did some blocks stall?\n");
2879 return 0;
2880 }
d38ceaf9 2881
d94aed5a 2882 atomic_inc(&adev->gpu_reset_counter);
d38ceaf9 2883
a3c47d6b
CZ
2884 /* block TTM */
2885 resched = ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
4562236b
HW
2886 /* store modesetting */
2887 if (amdgpu_device_has_dc_support(adev))
2888 state = drm_atomic_helper_suspend(adev->ddev);
a3c47d6b 2889
0875dc9e
CZ
2890 /* block scheduler */
2891 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2892 struct amdgpu_ring *ring = adev->rings[i];
2893
51687759 2894 if (!ring || !ring->sched.thread)
0875dc9e
CZ
2895 continue;
2896 kthread_park(ring->sched.thread);
aa1c8900 2897 amd_sched_hw_job_reset(&ring->sched);
0875dc9e 2898 }
2200edac
CZ
2899 /* after all hw jobs are reset, hw fence is meaningless, so force_completion */
2900 amdgpu_fence_driver_force_completion(adev);
d38ceaf9 2901
35d782fe 2902 need_full_reset = amdgpu_need_full_reset(adev);
d38ceaf9 2903
35d782fe
CZ
2904 if (!need_full_reset) {
2905 amdgpu_pre_soft_reset(adev);
2906 r = amdgpu_soft_reset(adev);
2907 amdgpu_post_soft_reset(adev);
2908 if (r || amdgpu_check_soft_reset(adev)) {
2909 DRM_INFO("soft reset failed, will fallback to full reset!\n");
2910 need_full_reset = true;
2911 }
f1aa7e08
CZ
2912 }
2913
35d782fe 2914 if (need_full_reset) {
35d782fe 2915 r = amdgpu_suspend(adev);
bfa99269 2916
35d782fe 2917retry:
d05da0e2 2918 amdgpu_atombios_scratch_regs_save(adev);
35d782fe 2919 r = amdgpu_asic_reset(adev);
d05da0e2 2920 amdgpu_atombios_scratch_regs_restore(adev);
35d782fe
CZ
2921 /* post card */
2922 amdgpu_atom_asic_init(adev->mode_info.atom_context);
2923
2924 if (!r) {
2925 dev_info(adev->dev, "GPU reset succeeded, trying to resume\n");
fcf0649f
CZ
2926 r = amdgpu_resume_phase1(adev);
2927 if (r)
2928 goto out;
0c49e0b8 2929 vram_lost = amdgpu_check_vram_lost(adev);
f1892138 2930 if (vram_lost) {
0c49e0b8 2931 DRM_ERROR("VRAM is lost!\n");
f1892138
CZ
2932 atomic_inc(&adev->vram_lost_counter);
2933 }
fcf0649f
CZ
2934 r = amdgpu_ttm_recover_gart(adev);
2935 if (r)
2936 goto out;
2937 r = amdgpu_resume_phase2(adev);
2938 if (r)
2939 goto out;
0c49e0b8
CZ
2940 if (vram_lost)
2941 amdgpu_fill_reset_magic(adev);
35d782fe 2942 }
d38ceaf9 2943 }
fcf0649f 2944out:
d38ceaf9 2945 if (!r) {
e72cfd58 2946 amdgpu_irq_gpu_reset_resume_helper(adev);
1f465087
CZ
2947 r = amdgpu_ib_ring_tests(adev);
2948 if (r) {
2949 dev_err(adev->dev, "ib ring test failed (%d).\n", r);
40019dc4 2950 r = amdgpu_suspend(adev);
53cdccd5 2951 need_full_reset = true;
40019dc4 2952 goto retry;
1f465087 2953 }
53cdccd5
CZ
2954 /**
2955 * recovery vm page tables, since we cannot depend on VRAM is
2956 * consistent after gpu full reset.
2957 */
2958 if (need_full_reset && amdgpu_need_backup(adev)) {
2959 struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
2960 struct amdgpu_bo *bo, *tmp;
f54d1867 2961 struct dma_fence *fence = NULL, *next = NULL;
53cdccd5
CZ
2962
2963 DRM_INFO("recover vram bo from shadow\n");
2964 mutex_lock(&adev->shadow_list_lock);
2965 list_for_each_entry_safe(bo, tmp, &adev->shadow_list, shadow_list) {
236763d3 2966 next = NULL;
53cdccd5
CZ
2967 amdgpu_recover_vram_from_shadow(adev, ring, bo, &next);
2968 if (fence) {
f54d1867 2969 r = dma_fence_wait(fence, false);
53cdccd5 2970 if (r) {
1d7b17b0 2971 WARN(r, "recovery from shadow isn't completed\n");
53cdccd5
CZ
2972 break;
2973 }
2974 }
1f465087 2975
f54d1867 2976 dma_fence_put(fence);
53cdccd5
CZ
2977 fence = next;
2978 }
2979 mutex_unlock(&adev->shadow_list_lock);
2980 if (fence) {
f54d1867 2981 r = dma_fence_wait(fence, false);
53cdccd5 2982 if (r)
1d7b17b0 2983 WARN(r, "recovery from shadow isn't completed\n");
53cdccd5 2984 }
f54d1867 2985 dma_fence_put(fence);
53cdccd5 2986 }
d38ceaf9
AD
2987 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2988 struct amdgpu_ring *ring = adev->rings[i];
51687759
CZ
2989
2990 if (!ring || !ring->sched.thread)
d38ceaf9 2991 continue;
53cdccd5 2992
aa1c8900 2993 amd_sched_job_recovery(&ring->sched);
0875dc9e 2994 kthread_unpark(ring->sched.thread);
d38ceaf9 2995 }
d38ceaf9 2996 } else {
2200edac 2997 dev_err(adev->dev, "asic resume failed (%d).\n", r);
89041940 2998 amdgpu_vf_error_put(AMDGIM_ERROR_VF_ASIC_RESUME_FAIL, 0, r);
d38ceaf9 2999 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
51687759 3000 if (adev->rings[i] && adev->rings[i]->sched.thread) {
0875dc9e 3001 kthread_unpark(adev->rings[i]->sched.thread);
0875dc9e 3002 }
d38ceaf9
AD
3003 }
3004 }
3005
4562236b
HW
3006 if (amdgpu_device_has_dc_support(adev)) {
3007 r = drm_atomic_helper_resume(adev->ddev, state);
3008 amdgpu_dm_display_resume(adev);
3009 } else
3010 drm_helper_resume_force_mode(adev->ddev);
d38ceaf9
AD
3011
3012 ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched);
89041940 3013 if (r) {
d38ceaf9
AD
3014 /* bad news, how to tell it to userspace ? */
3015 dev_info(adev->dev, "GPU reset failed\n");
89041940
GW
3016 amdgpu_vf_error_put(AMDGIM_ERROR_VF_GPU_RESET_FAIL, 0, r);
3017 }
3018 else {
6643be65 3019 dev_info(adev->dev, "GPU reset successed!\n");
89041940 3020 }
d38ceaf9 3021
89041940 3022 amdgpu_vf_error_trans_all(adev);
d38ceaf9
AD
3023 return r;
3024}
3025
d0dd7f0c
AD
3026void amdgpu_get_pcie_info(struct amdgpu_device *adev)
3027{
3028 u32 mask;
3029 int ret;
3030
cd474ba0
AD
3031 if (amdgpu_pcie_gen_cap)
3032 adev->pm.pcie_gen_mask = amdgpu_pcie_gen_cap;
d0dd7f0c 3033
cd474ba0
AD
3034 if (amdgpu_pcie_lane_cap)
3035 adev->pm.pcie_mlw_mask = amdgpu_pcie_lane_cap;
d0dd7f0c 3036
cd474ba0
AD
3037 /* covers APUs as well */
3038 if (pci_is_root_bus(adev->pdev->bus)) {
3039 if (adev->pm.pcie_gen_mask == 0)
3040 adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK;
3041 if (adev->pm.pcie_mlw_mask == 0)
3042 adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;
d0dd7f0c 3043 return;
cd474ba0 3044 }
d0dd7f0c 3045
cd474ba0
AD
3046 if (adev->pm.pcie_gen_mask == 0) {
3047 ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
3048 if (!ret) {
3049 adev->pm.pcie_gen_mask = (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
3050 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
3051 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3);
3052
3053 if (mask & DRM_PCIE_SPEED_25)
3054 adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1;
3055 if (mask & DRM_PCIE_SPEED_50)
3056 adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2;
3057 if (mask & DRM_PCIE_SPEED_80)
3058 adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3;
3059 } else {
3060 adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK;
3061 }
3062 }
3063 if (adev->pm.pcie_mlw_mask == 0) {
3064 ret = drm_pcie_get_max_link_width(adev->ddev, &mask);
3065 if (!ret) {
3066 switch (mask) {
3067 case 32:
3068 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |
3069 CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
3070 CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
3071 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
3072 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
3073 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3074 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3075 break;
3076 case 16:
3077 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
3078 CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
3079 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
3080 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
3081 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3082 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3083 break;
3084 case 12:
3085 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
3086 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
3087 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
3088 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3089 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3090 break;
3091 case 8:
3092 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
3093 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
3094 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3095 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3096 break;
3097 case 4:
3098 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
3099 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3100 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3101 break;
3102 case 2:
3103 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3104 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3105 break;
3106 case 1:
3107 adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1;
3108 break;
3109 default:
3110 break;
3111 }
3112 } else {
3113 adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;
d0dd7f0c
AD
3114 }
3115 }
3116}
d38ceaf9
AD
3117
3118/*
3119 * Debugfs
3120 */
3121int amdgpu_debugfs_add_files(struct amdgpu_device *adev,
06ab6832 3122 const struct drm_info_list *files,
d38ceaf9
AD
3123 unsigned nfiles)
3124{
3125 unsigned i;
3126
3127 for (i = 0; i < adev->debugfs_count; i++) {
3128 if (adev->debugfs[i].files == files) {
3129 /* Already registered */
3130 return 0;
3131 }
3132 }
3133
3134 i = adev->debugfs_count + 1;
3135 if (i > AMDGPU_DEBUGFS_MAX_COMPONENTS) {
3136 DRM_ERROR("Reached maximum number of debugfs components.\n");
3137 DRM_ERROR("Report so we increase "
3138 "AMDGPU_DEBUGFS_MAX_COMPONENTS.\n");
3139 return -EINVAL;
3140 }
3141 adev->debugfs[adev->debugfs_count].files = files;
3142 adev->debugfs[adev->debugfs_count].num_files = nfiles;
3143 adev->debugfs_count = i;
3144#if defined(CONFIG_DEBUG_FS)
d38ceaf9
AD
3145 drm_debugfs_create_files(files, nfiles,
3146 adev->ddev->primary->debugfs_root,
3147 adev->ddev->primary);
3148#endif
3149 return 0;
3150}
3151
d38ceaf9
AD
3152#if defined(CONFIG_DEBUG_FS)
3153
3154static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
3155 size_t size, loff_t *pos)
3156{
45063097 3157 struct amdgpu_device *adev = file_inode(f)->i_private;
d38ceaf9
AD
3158 ssize_t result = 0;
3159 int r;
bd12267d 3160 bool pm_pg_lock, use_bank;
56628159 3161 unsigned instance_bank, sh_bank, se_bank;
d38ceaf9
AD
3162
3163 if (size & 0x3 || *pos & 0x3)
3164 return -EINVAL;
3165
bd12267d
TSD
3166 /* are we reading registers for which a PG lock is necessary? */
3167 pm_pg_lock = (*pos >> 23) & 1;
3168
56628159
TSD
3169 if (*pos & (1ULL << 62)) {
3170 se_bank = (*pos >> 24) & 0x3FF;
3171 sh_bank = (*pos >> 34) & 0x3FF;
3172 instance_bank = (*pos >> 44) & 0x3FF;
32977f93
TSD
3173
3174 if (se_bank == 0x3FF)
3175 se_bank = 0xFFFFFFFF;
3176 if (sh_bank == 0x3FF)
3177 sh_bank = 0xFFFFFFFF;
3178 if (instance_bank == 0x3FF)
3179 instance_bank = 0xFFFFFFFF;
56628159 3180 use_bank = 1;
56628159
TSD
3181 } else {
3182 use_bank = 0;
3183 }
3184
801a6aa9 3185 *pos &= (1UL << 22) - 1;
bd12267d 3186
56628159 3187 if (use_bank) {
32977f93
TSD
3188 if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||
3189 (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines))
56628159
TSD
3190 return -EINVAL;
3191 mutex_lock(&adev->grbm_idx_mutex);
3192 amdgpu_gfx_select_se_sh(adev, se_bank,
3193 sh_bank, instance_bank);
3194 }
3195
bd12267d
TSD
3196 if (pm_pg_lock)
3197 mutex_lock(&adev->pm.mutex);
3198
d38ceaf9
AD
3199 while (size) {
3200 uint32_t value;
3201
3202 if (*pos > adev->rmmio_size)
56628159 3203 goto end;
d38ceaf9
AD
3204
3205 value = RREG32(*pos >> 2);
3206 r = put_user(value, (uint32_t *)buf);
56628159
TSD
3207 if (r) {
3208 result = r;
3209 goto end;
3210 }
d38ceaf9
AD
3211
3212 result += 4;
3213 buf += 4;
3214 *pos += 4;
3215 size -= 4;
3216 }
3217
56628159
TSD
3218end:
3219 if (use_bank) {
3220 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
3221 mutex_unlock(&adev->grbm_idx_mutex);
3222 }
3223
bd12267d
TSD
3224 if (pm_pg_lock)
3225 mutex_unlock(&adev->pm.mutex);
3226
d38ceaf9
AD
3227 return result;
3228}
3229
3230static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf,
3231 size_t size, loff_t *pos)
3232{
45063097 3233 struct amdgpu_device *adev = file_inode(f)->i_private;
d38ceaf9
AD
3234 ssize_t result = 0;
3235 int r;
394fdde2
TSD
3236 bool pm_pg_lock, use_bank;
3237 unsigned instance_bank, sh_bank, se_bank;
d38ceaf9
AD
3238
3239 if (size & 0x3 || *pos & 0x3)
3240 return -EINVAL;
3241
394fdde2
TSD
3242 /* are we reading registers for which a PG lock is necessary? */
3243 pm_pg_lock = (*pos >> 23) & 1;
3244
3245 if (*pos & (1ULL << 62)) {
3246 se_bank = (*pos >> 24) & 0x3FF;
3247 sh_bank = (*pos >> 34) & 0x3FF;
3248 instance_bank = (*pos >> 44) & 0x3FF;
3249
3250 if (se_bank == 0x3FF)
3251 se_bank = 0xFFFFFFFF;
3252 if (sh_bank == 0x3FF)
3253 sh_bank = 0xFFFFFFFF;
3254 if (instance_bank == 0x3FF)
3255 instance_bank = 0xFFFFFFFF;
3256 use_bank = 1;
3257 } else {
3258 use_bank = 0;
3259 }
3260
801a6aa9 3261 *pos &= (1UL << 22) - 1;
394fdde2
TSD
3262
3263 if (use_bank) {
3264 if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||
3265 (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines))
3266 return -EINVAL;
3267 mutex_lock(&adev->grbm_idx_mutex);
3268 amdgpu_gfx_select_se_sh(adev, se_bank,
3269 sh_bank, instance_bank);
3270 }
3271
3272 if (pm_pg_lock)
3273 mutex_lock(&adev->pm.mutex);
3274
d38ceaf9
AD
3275 while (size) {
3276 uint32_t value;
3277
3278 if (*pos > adev->rmmio_size)
3279 return result;
3280
3281 r = get_user(value, (uint32_t *)buf);
3282 if (r)
3283 return r;
3284
3285 WREG32(*pos >> 2, value);
3286
3287 result += 4;
3288 buf += 4;
3289 *pos += 4;
3290 size -= 4;
3291 }
3292
394fdde2
TSD
3293 if (use_bank) {
3294 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
3295 mutex_unlock(&adev->grbm_idx_mutex);
3296 }
3297
3298 if (pm_pg_lock)
3299 mutex_unlock(&adev->pm.mutex);
3300
d38ceaf9
AD
3301 return result;
3302}
3303
adcec288
TSD
3304static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
3305 size_t size, loff_t *pos)
3306{
45063097 3307 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3308 ssize_t result = 0;
3309 int r;
3310
3311 if (size & 0x3 || *pos & 0x3)
3312 return -EINVAL;
3313
3314 while (size) {
3315 uint32_t value;
3316
3317 value = RREG32_PCIE(*pos >> 2);
3318 r = put_user(value, (uint32_t *)buf);
3319 if (r)
3320 return r;
3321
3322 result += 4;
3323 buf += 4;
3324 *pos += 4;
3325 size -= 4;
3326 }
3327
3328 return result;
3329}
3330
3331static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user *buf,
3332 size_t size, loff_t *pos)
3333{
45063097 3334 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3335 ssize_t result = 0;
3336 int r;
3337
3338 if (size & 0x3 || *pos & 0x3)
3339 return -EINVAL;
3340
3341 while (size) {
3342 uint32_t value;
3343
3344 r = get_user(value, (uint32_t *)buf);
3345 if (r)
3346 return r;
3347
3348 WREG32_PCIE(*pos >> 2, value);
3349
3350 result += 4;
3351 buf += 4;
3352 *pos += 4;
3353 size -= 4;
3354 }
3355
3356 return result;
3357}
3358
3359static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,
3360 size_t size, loff_t *pos)
3361{
45063097 3362 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3363 ssize_t result = 0;
3364 int r;
3365
3366 if (size & 0x3 || *pos & 0x3)
3367 return -EINVAL;
3368
3369 while (size) {
3370 uint32_t value;
3371
3372 value = RREG32_DIDT(*pos >> 2);
3373 r = put_user(value, (uint32_t *)buf);
3374 if (r)
3375 return r;
3376
3377 result += 4;
3378 buf += 4;
3379 *pos += 4;
3380 size -= 4;
3381 }
3382
3383 return result;
3384}
3385
3386static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user *buf,
3387 size_t size, loff_t *pos)
3388{
45063097 3389 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3390 ssize_t result = 0;
3391 int r;
3392
3393 if (size & 0x3 || *pos & 0x3)
3394 return -EINVAL;
3395
3396 while (size) {
3397 uint32_t value;
3398
3399 r = get_user(value, (uint32_t *)buf);
3400 if (r)
3401 return r;
3402
3403 WREG32_DIDT(*pos >> 2, value);
3404
3405 result += 4;
3406 buf += 4;
3407 *pos += 4;
3408 size -= 4;
3409 }
3410
3411 return result;
3412}
3413
3414static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,
3415 size_t size, loff_t *pos)
3416{
45063097 3417 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3418 ssize_t result = 0;
3419 int r;
3420
3421 if (size & 0x3 || *pos & 0x3)
3422 return -EINVAL;
3423
3424 while (size) {
3425 uint32_t value;
3426
6fc0deaf 3427 value = RREG32_SMC(*pos);
adcec288
TSD
3428 r = put_user(value, (uint32_t *)buf);
3429 if (r)
3430 return r;
3431
3432 result += 4;
3433 buf += 4;
3434 *pos += 4;
3435 size -= 4;
3436 }
3437
3438 return result;
3439}
3440
3441static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *buf,
3442 size_t size, loff_t *pos)
3443{
45063097 3444 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3445 ssize_t result = 0;
3446 int r;
3447
3448 if (size & 0x3 || *pos & 0x3)
3449 return -EINVAL;
3450
3451 while (size) {
3452 uint32_t value;
3453
3454 r = get_user(value, (uint32_t *)buf);
3455 if (r)
3456 return r;
3457
6fc0deaf 3458 WREG32_SMC(*pos, value);
adcec288
TSD
3459
3460 result += 4;
3461 buf += 4;
3462 *pos += 4;
3463 size -= 4;
3464 }
3465
3466 return result;
3467}
3468
1e051413
TSD
3469static ssize_t amdgpu_debugfs_gca_config_read(struct file *f, char __user *buf,
3470 size_t size, loff_t *pos)
3471{
45063097 3472 struct amdgpu_device *adev = file_inode(f)->i_private;
1e051413
TSD
3473 ssize_t result = 0;
3474 int r;
3475 uint32_t *config, no_regs = 0;
3476
3477 if (size & 0x3 || *pos & 0x3)
3478 return -EINVAL;
3479
ecab7668 3480 config = kmalloc_array(256, sizeof(*config), GFP_KERNEL);
1e051413
TSD
3481 if (!config)
3482 return -ENOMEM;
3483
3484 /* version, increment each time something is added */
9a999359 3485 config[no_regs++] = 3;
1e051413
TSD
3486 config[no_regs++] = adev->gfx.config.max_shader_engines;
3487 config[no_regs++] = adev->gfx.config.max_tile_pipes;
3488 config[no_regs++] = adev->gfx.config.max_cu_per_sh;
3489 config[no_regs++] = adev->gfx.config.max_sh_per_se;
3490 config[no_regs++] = adev->gfx.config.max_backends_per_se;
3491 config[no_regs++] = adev->gfx.config.max_texture_channel_caches;
3492 config[no_regs++] = adev->gfx.config.max_gprs;
3493 config[no_regs++] = adev->gfx.config.max_gs_threads;
3494 config[no_regs++] = adev->gfx.config.max_hw_contexts;
3495 config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_frontend;
3496 config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_backend;
3497 config[no_regs++] = adev->gfx.config.sc_hiz_tile_fifo_size;
3498 config[no_regs++] = adev->gfx.config.sc_earlyz_tile_fifo_size;
3499 config[no_regs++] = adev->gfx.config.num_tile_pipes;
3500 config[no_regs++] = adev->gfx.config.backend_enable_mask;
3501 config[no_regs++] = adev->gfx.config.mem_max_burst_length_bytes;
3502 config[no_regs++] = adev->gfx.config.mem_row_size_in_kb;
3503 config[no_regs++] = adev->gfx.config.shader_engine_tile_size;
3504 config[no_regs++] = adev->gfx.config.num_gpus;
3505 config[no_regs++] = adev->gfx.config.multi_gpu_tile_size;
3506 config[no_regs++] = adev->gfx.config.mc_arb_ramcfg;
3507 config[no_regs++] = adev->gfx.config.gb_addr_config;
3508 config[no_regs++] = adev->gfx.config.num_rbs;
3509
89a8f309
TSD
3510 /* rev==1 */
3511 config[no_regs++] = adev->rev_id;
3512 config[no_regs++] = adev->pg_flags;
3513 config[no_regs++] = adev->cg_flags;
3514
e9f11dc8
TSD
3515 /* rev==2 */
3516 config[no_regs++] = adev->family;
3517 config[no_regs++] = adev->external_rev_id;
3518
9a999359
TSD
3519 /* rev==3 */
3520 config[no_regs++] = adev->pdev->device;
3521 config[no_regs++] = adev->pdev->revision;
3522 config[no_regs++] = adev->pdev->subsystem_device;
3523 config[no_regs++] = adev->pdev->subsystem_vendor;
3524
1e051413
TSD
3525 while (size && (*pos < no_regs * 4)) {
3526 uint32_t value;
3527
3528 value = config[*pos >> 2];
3529 r = put_user(value, (uint32_t *)buf);
3530 if (r) {
3531 kfree(config);
3532 return r;
3533 }
3534
3535 result += 4;
3536 buf += 4;
3537 *pos += 4;
3538 size -= 4;
3539 }
3540
3541 kfree(config);
3542 return result;
3543}
3544
f2cdaf20
TSD
3545static ssize_t amdgpu_debugfs_sensor_read(struct file *f, char __user *buf,
3546 size_t size, loff_t *pos)
3547{
45063097 3548 struct amdgpu_device *adev = file_inode(f)->i_private;
9f8df7d7
TSD
3549 int idx, x, outsize, r, valuesize;
3550 uint32_t values[16];
f2cdaf20 3551
9f8df7d7 3552 if (size & 3 || *pos & 0x3)
f2cdaf20
TSD
3553 return -EINVAL;
3554
3cbc614f
SP
3555 if (amdgpu_dpm == 0)
3556 return -EINVAL;
3557
f2cdaf20
TSD
3558 /* convert offset to sensor number */
3559 idx = *pos >> 2;
3560
9f8df7d7 3561 valuesize = sizeof(values);
f2cdaf20 3562 if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->read_sensor)
cd4d7464 3563 r = amdgpu_dpm_read_sensor(adev, idx, &values[0], &valuesize);
f2cdaf20
TSD
3564 else
3565 return -EINVAL;
3566
9f8df7d7
TSD
3567 if (size > valuesize)
3568 return -EINVAL;
3569
3570 outsize = 0;
3571 x = 0;
3572 if (!r) {
3573 while (size) {
3574 r = put_user(values[x++], (int32_t *)buf);
3575 buf += 4;
3576 size -= 4;
3577 outsize += 4;
3578 }
3579 }
f2cdaf20 3580
9f8df7d7 3581 return !r ? outsize : r;
f2cdaf20 3582}
1e051413 3583
273d7aa1
TSD
3584static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf,
3585 size_t size, loff_t *pos)
3586{
3587 struct amdgpu_device *adev = f->f_inode->i_private;
3588 int r, x;
3589 ssize_t result=0;
472259f0 3590 uint32_t offset, se, sh, cu, wave, simd, data[32];
273d7aa1
TSD
3591
3592 if (size & 3 || *pos & 3)
3593 return -EINVAL;
3594
3595 /* decode offset */
3596 offset = (*pos & 0x7F);
3597 se = ((*pos >> 7) & 0xFF);
3598 sh = ((*pos >> 15) & 0xFF);
3599 cu = ((*pos >> 23) & 0xFF);
3600 wave = ((*pos >> 31) & 0xFF);
3601 simd = ((*pos >> 37) & 0xFF);
273d7aa1
TSD
3602
3603 /* switch to the specific se/sh/cu */
3604 mutex_lock(&adev->grbm_idx_mutex);
3605 amdgpu_gfx_select_se_sh(adev, se, sh, cu);
3606
3607 x = 0;
472259f0
TSD
3608 if (adev->gfx.funcs->read_wave_data)
3609 adev->gfx.funcs->read_wave_data(adev, simd, wave, data, &x);
273d7aa1
TSD
3610
3611 amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
3612 mutex_unlock(&adev->grbm_idx_mutex);
3613
5ecfb3b8
TSD
3614 if (!x)
3615 return -EINVAL;
3616
472259f0 3617 while (size && (offset < x * 4)) {
273d7aa1
TSD
3618 uint32_t value;
3619
472259f0 3620 value = data[offset >> 2];
273d7aa1
TSD
3621 r = put_user(value, (uint32_t *)buf);
3622 if (r)
3623 return r;
3624
3625 result += 4;
3626 buf += 4;
472259f0 3627 offset += 4;
273d7aa1
TSD
3628 size -= 4;
3629 }
3630
3631 return result;
3632}
3633
c5a60ce8
TSD
3634static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,
3635 size_t size, loff_t *pos)
3636{
3637 struct amdgpu_device *adev = f->f_inode->i_private;
3638 int r;
3639 ssize_t result = 0;
3640 uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data;
3641
3642 if (size & 3 || *pos & 3)
3643 return -EINVAL;
3644
3645 /* decode offset */
3646 offset = (*pos & 0xFFF); /* in dwords */
3647 se = ((*pos >> 12) & 0xFF);
3648 sh = ((*pos >> 20) & 0xFF);
3649 cu = ((*pos >> 28) & 0xFF);
3650 wave = ((*pos >> 36) & 0xFF);
3651 simd = ((*pos >> 44) & 0xFF);
3652 thread = ((*pos >> 52) & 0xFF);
3653 bank = ((*pos >> 60) & 1);
3654
3655 data = kmalloc_array(1024, sizeof(*data), GFP_KERNEL);
3656 if (!data)
3657 return -ENOMEM;
3658
3659 /* switch to the specific se/sh/cu */
3660 mutex_lock(&adev->grbm_idx_mutex);
3661 amdgpu_gfx_select_se_sh(adev, se, sh, cu);
3662
3663 if (bank == 0) {
3664 if (adev->gfx.funcs->read_wave_vgprs)
3665 adev->gfx.funcs->read_wave_vgprs(adev, simd, wave, thread, offset, size>>2, data);
3666 } else {
3667 if (adev->gfx.funcs->read_wave_sgprs)
3668 adev->gfx.funcs->read_wave_sgprs(adev, simd, wave, offset, size>>2, data);
3669 }
3670
3671 amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
3672 mutex_unlock(&adev->grbm_idx_mutex);
3673
3674 while (size) {
3675 uint32_t value;
3676
3677 value = data[offset++];
3678 r = put_user(value, (uint32_t *)buf);
3679 if (r) {
3680 result = r;
3681 goto err;
3682 }
3683
3684 result += 4;
3685 buf += 4;
3686 size -= 4;
3687 }
3688
3689err:
3690 kfree(data);
3691 return result;
3692}
3693
d38ceaf9
AD
3694static const struct file_operations amdgpu_debugfs_regs_fops = {
3695 .owner = THIS_MODULE,
3696 .read = amdgpu_debugfs_regs_read,
3697 .write = amdgpu_debugfs_regs_write,
3698 .llseek = default_llseek
3699};
adcec288
TSD
3700static const struct file_operations amdgpu_debugfs_regs_didt_fops = {
3701 .owner = THIS_MODULE,
3702 .read = amdgpu_debugfs_regs_didt_read,
3703 .write = amdgpu_debugfs_regs_didt_write,
3704 .llseek = default_llseek
3705};
3706static const struct file_operations amdgpu_debugfs_regs_pcie_fops = {
3707 .owner = THIS_MODULE,
3708 .read = amdgpu_debugfs_regs_pcie_read,
3709 .write = amdgpu_debugfs_regs_pcie_write,
3710 .llseek = default_llseek
3711};
3712static const struct file_operations amdgpu_debugfs_regs_smc_fops = {
3713 .owner = THIS_MODULE,
3714 .read = amdgpu_debugfs_regs_smc_read,
3715 .write = amdgpu_debugfs_regs_smc_write,
3716 .llseek = default_llseek
3717};
3718
1e051413
TSD
3719static const struct file_operations amdgpu_debugfs_gca_config_fops = {
3720 .owner = THIS_MODULE,
3721 .read = amdgpu_debugfs_gca_config_read,
3722 .llseek = default_llseek
3723};
3724
f2cdaf20
TSD
3725static const struct file_operations amdgpu_debugfs_sensors_fops = {
3726 .owner = THIS_MODULE,
3727 .read = amdgpu_debugfs_sensor_read,
3728 .llseek = default_llseek
3729};
3730
273d7aa1
TSD
3731static const struct file_operations amdgpu_debugfs_wave_fops = {
3732 .owner = THIS_MODULE,
3733 .read = amdgpu_debugfs_wave_read,
3734 .llseek = default_llseek
3735};
c5a60ce8
TSD
3736static const struct file_operations amdgpu_debugfs_gpr_fops = {
3737 .owner = THIS_MODULE,
3738 .read = amdgpu_debugfs_gpr_read,
3739 .llseek = default_llseek
3740};
273d7aa1 3741
adcec288
TSD
3742static const struct file_operations *debugfs_regs[] = {
3743 &amdgpu_debugfs_regs_fops,
3744 &amdgpu_debugfs_regs_didt_fops,
3745 &amdgpu_debugfs_regs_pcie_fops,
3746 &amdgpu_debugfs_regs_smc_fops,
1e051413 3747 &amdgpu_debugfs_gca_config_fops,
f2cdaf20 3748 &amdgpu_debugfs_sensors_fops,
273d7aa1 3749 &amdgpu_debugfs_wave_fops,
c5a60ce8 3750 &amdgpu_debugfs_gpr_fops,
adcec288
TSD
3751};
3752
3753static const char *debugfs_regs_names[] = {
3754 "amdgpu_regs",
3755 "amdgpu_regs_didt",
3756 "amdgpu_regs_pcie",
3757 "amdgpu_regs_smc",
1e051413 3758 "amdgpu_gca_config",
f2cdaf20 3759 "amdgpu_sensors",
273d7aa1 3760 "amdgpu_wave",
c5a60ce8 3761 "amdgpu_gpr",
adcec288 3762};
d38ceaf9
AD
3763
3764static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
3765{
3766 struct drm_minor *minor = adev->ddev->primary;
3767 struct dentry *ent, *root = minor->debugfs_root;
adcec288
TSD
3768 unsigned i, j;
3769
3770 for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
3771 ent = debugfs_create_file(debugfs_regs_names[i],
3772 S_IFREG | S_IRUGO, root,
3773 adev, debugfs_regs[i]);
3774 if (IS_ERR(ent)) {
3775 for (j = 0; j < i; j++) {
3776 debugfs_remove(adev->debugfs_regs[i]);
3777 adev->debugfs_regs[i] = NULL;
3778 }
3779 return PTR_ERR(ent);
3780 }
d38ceaf9 3781
adcec288
TSD
3782 if (!i)
3783 i_size_write(ent->d_inode, adev->rmmio_size);
3784 adev->debugfs_regs[i] = ent;
3785 }
d38ceaf9
AD
3786
3787 return 0;
3788}
3789
3790static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev)
3791{
adcec288
TSD
3792 unsigned i;
3793
3794 for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
3795 if (adev->debugfs_regs[i]) {
3796 debugfs_remove(adev->debugfs_regs[i]);
3797 adev->debugfs_regs[i] = NULL;
3798 }
3799 }
d38ceaf9
AD
3800}
3801
4f0955fc
HR
3802static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data)
3803{
3804 struct drm_info_node *node = (struct drm_info_node *) m->private;
3805 struct drm_device *dev = node->minor->dev;
3806 struct amdgpu_device *adev = dev->dev_private;
3807 int r = 0, i;
3808
3809 /* hold on the scheduler */
3810 for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
3811 struct amdgpu_ring *ring = adev->rings[i];
3812
3813 if (!ring || !ring->sched.thread)
3814 continue;
3815 kthread_park(ring->sched.thread);
3816 }
3817
3818 seq_printf(m, "run ib test:\n");
3819 r = amdgpu_ib_ring_tests(adev);
3820 if (r)
3821 seq_printf(m, "ib ring tests failed (%d).\n", r);
3822 else
3823 seq_printf(m, "ib ring tests passed.\n");
3824
3825 /* go on the scheduler */
3826 for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
3827 struct amdgpu_ring *ring = adev->rings[i];
3828
3829 if (!ring || !ring->sched.thread)
3830 continue;
3831 kthread_unpark(ring->sched.thread);
3832 }
3833
3834 return 0;
3835}
3836
3837static const struct drm_info_list amdgpu_debugfs_test_ib_ring_list[] = {
3838 {"amdgpu_test_ib", &amdgpu_debugfs_test_ib}
3839};
3840
3841static int amdgpu_debugfs_test_ib_ring_init(struct amdgpu_device *adev)
3842{
3843 return amdgpu_debugfs_add_files(adev,
3844 amdgpu_debugfs_test_ib_ring_list, 1);
3845}
3846
d38ceaf9
AD
3847int amdgpu_debugfs_init(struct drm_minor *minor)
3848{
3849 return 0;
3850}
db95e218
KR
3851
3852static int amdgpu_debugfs_get_vbios_dump(struct seq_file *m, void *data)
3853{
3854 struct drm_info_node *node = (struct drm_info_node *) m->private;
3855 struct drm_device *dev = node->minor->dev;
3856 struct amdgpu_device *adev = dev->dev_private;
3857
3858 seq_write(m, adev->bios, adev->bios_size);
3859 return 0;
3860}
3861
db95e218
KR
3862static const struct drm_info_list amdgpu_vbios_dump_list[] = {
3863 {"amdgpu_vbios",
3864 amdgpu_debugfs_get_vbios_dump,
3865 0, NULL},
3866};
3867
db95e218
KR
3868static int amdgpu_debugfs_vbios_dump_init(struct amdgpu_device *adev)
3869{
3870 return amdgpu_debugfs_add_files(adev,
3871 amdgpu_vbios_dump_list, 1);
3872}
7cebc728 3873#else
27bad5b9 3874static int amdgpu_debugfs_test_ib_ring_init(struct amdgpu_device *adev)
4f0955fc
HR
3875{
3876 return 0;
3877}
7cebc728
AK
3878static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
3879{
3880 return 0;
3881}
db95e218
KR
3882static int amdgpu_debugfs_vbios_dump_init(struct amdgpu_device *adev)
3883{
3884 return 0;
3885}
7cebc728 3886static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev) { }
d38ceaf9 3887#endif