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