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