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