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