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