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