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