]> git.ipfire.org Git - thirdparty/kernel/stable.git/blame - drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drm/amdgpu/virt: implement VI virt operation interfaces
[thirdparty/kernel/stable.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_device.c
CommitLineData
d38ceaf9
AD
1/*
2 * Copyright 2008 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 *
24 * Authors: Dave Airlie
25 * Alex Deucher
26 * Jerome Glisse
27 */
0875dc9e 28#include <linux/kthread.h>
d38ceaf9
AD
29#include <linux/console.h>
30#include <linux/slab.h>
31#include <linux/debugfs.h>
32#include <drm/drmP.h>
33#include <drm/drm_crtc_helper.h>
34#include <drm/amdgpu_drm.h>
35#include <linux/vgaarb.h>
36#include <linux/vga_switcheroo.h>
37#include <linux/efi.h>
38#include "amdgpu.h"
f4b373f4 39#include "amdgpu_trace.h"
d38ceaf9
AD
40#include "amdgpu_i2c.h"
41#include "atom.h"
42#include "amdgpu_atombios.h"
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
d38ceaf9
AD
1348 for (i = 0; i < adev->num_ip_blocks; i++) {
1349 if ((amdgpu_ip_block_mask & (1 << i)) == 0) {
1350 DRM_ERROR("disabled ip block: %d\n", i);
a1255107 1351 adev->ip_blocks[i].status.valid = false;
d38ceaf9 1352 } else {
a1255107
AD
1353 if (adev->ip_blocks[i].version->funcs->early_init) {
1354 r = adev->ip_blocks[i].version->funcs->early_init((void *)adev);
2c1a2784 1355 if (r == -ENOENT) {
a1255107 1356 adev->ip_blocks[i].status.valid = false;
2c1a2784 1357 } else if (r) {
a1255107
AD
1358 DRM_ERROR("early_init of IP block <%s> failed %d\n",
1359 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1360 return r;
2c1a2784 1361 } else {
a1255107 1362 adev->ip_blocks[i].status.valid = true;
2c1a2784 1363 }
974e6b64 1364 } else {
a1255107 1365 adev->ip_blocks[i].status.valid = true;
d38ceaf9 1366 }
d38ceaf9
AD
1367 }
1368 }
1369
395d1fb9
NH
1370 adev->cg_flags &= amdgpu_cg_mask;
1371 adev->pg_flags &= amdgpu_pg_mask;
1372
d38ceaf9
AD
1373 return 0;
1374}
1375
1376static int amdgpu_init(struct amdgpu_device *adev)
1377{
1378 int i, r;
1379
1380 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1381 if (!adev->ip_blocks[i].status.valid)
d38ceaf9 1382 continue;
a1255107 1383 r = adev->ip_blocks[i].version->funcs->sw_init((void *)adev);
2c1a2784 1384 if (r) {
a1255107
AD
1385 DRM_ERROR("sw_init of IP block <%s> failed %d\n",
1386 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1387 return r;
2c1a2784 1388 }
a1255107 1389 adev->ip_blocks[i].status.sw = true;
d38ceaf9 1390 /* need to do gmc hw init early so we can allocate gpu mem */
a1255107 1391 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
d38ceaf9 1392 r = amdgpu_vram_scratch_init(adev);
2c1a2784
AD
1393 if (r) {
1394 DRM_ERROR("amdgpu_vram_scratch_init failed %d\n", r);
d38ceaf9 1395 return r;
2c1a2784 1396 }
a1255107 1397 r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev);
2c1a2784
AD
1398 if (r) {
1399 DRM_ERROR("hw_init %d failed %d\n", i, r);
d38ceaf9 1400 return r;
2c1a2784 1401 }
d38ceaf9 1402 r = amdgpu_wb_init(adev);
2c1a2784
AD
1403 if (r) {
1404 DRM_ERROR("amdgpu_wb_init failed %d\n", r);
d38ceaf9 1405 return r;
2c1a2784 1406 }
a1255107 1407 adev->ip_blocks[i].status.hw = true;
2493664f
ML
1408
1409 /* right after GMC hw init, we create CSA */
1410 if (amdgpu_sriov_vf(adev)) {
1411 r = amdgpu_allocate_static_csa(adev);
1412 if (r) {
1413 DRM_ERROR("allocate CSA failed %d\n", r);
1414 return r;
1415 }
1416 }
d38ceaf9
AD
1417 }
1418 }
1419
1420 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1421 if (!adev->ip_blocks[i].status.sw)
d38ceaf9
AD
1422 continue;
1423 /* gmc hw init is done early */
a1255107 1424 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC)
d38ceaf9 1425 continue;
a1255107 1426 r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev);
2c1a2784 1427 if (r) {
a1255107
AD
1428 DRM_ERROR("hw_init of IP block <%s> failed %d\n",
1429 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1430 return r;
2c1a2784 1431 }
a1255107 1432 adev->ip_blocks[i].status.hw = true;
d38ceaf9
AD
1433 }
1434
1435 return 0;
1436}
1437
1438static int amdgpu_late_init(struct amdgpu_device *adev)
1439{
1440 int i = 0, r;
1441
1442 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1443 if (!adev->ip_blocks[i].status.valid)
d38ceaf9 1444 continue;
a1255107
AD
1445 if (adev->ip_blocks[i].version->funcs->late_init) {
1446 r = adev->ip_blocks[i].version->funcs->late_init((void *)adev);
2c1a2784 1447 if (r) {
a1255107
AD
1448 DRM_ERROR("late_init of IP block <%s> failed %d\n",
1449 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1450 return r;
2c1a2784 1451 }
a1255107 1452 adev->ip_blocks[i].status.late_initialized = true;
d38ceaf9 1453 }
4a446d55 1454 /* skip CG for VCE/UVD, it's handled specially */
a1255107
AD
1455 if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
1456 adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE) {
4a446d55 1457 /* enable clockgating to save power */
a1255107
AD
1458 r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
1459 AMD_CG_STATE_GATE);
4a446d55
AD
1460 if (r) {
1461 DRM_ERROR("set_clockgating_state(gate) of IP block <%s> failed %d\n",
a1255107 1462 adev->ip_blocks[i].version->funcs->name, r);
4a446d55
AD
1463 return r;
1464 }
b0b00ff1 1465 }
d38ceaf9
AD
1466 }
1467
1468 return 0;
1469}
1470
1471static int amdgpu_fini(struct amdgpu_device *adev)
1472{
1473 int i, r;
1474
3e96dbfd
AD
1475 /* need to disable SMC first */
1476 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1477 if (!adev->ip_blocks[i].status.hw)
3e96dbfd 1478 continue;
a1255107 1479 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) {
3e96dbfd 1480 /* ungate blocks before hw fini so that we can shutdown the blocks safely */
a1255107
AD
1481 r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
1482 AMD_CG_STATE_UNGATE);
3e96dbfd
AD
1483 if (r) {
1484 DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n",
a1255107 1485 adev->ip_blocks[i].version->funcs->name, r);
3e96dbfd
AD
1486 return r;
1487 }
a1255107 1488 r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev);
3e96dbfd
AD
1489 /* XXX handle errors */
1490 if (r) {
1491 DRM_DEBUG("hw_fini of IP block <%s> failed %d\n",
a1255107 1492 adev->ip_blocks[i].version->funcs->name, r);
3e96dbfd 1493 }
a1255107 1494 adev->ip_blocks[i].status.hw = false;
3e96dbfd
AD
1495 break;
1496 }
1497 }
1498
d38ceaf9 1499 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1500 if (!adev->ip_blocks[i].status.hw)
d38ceaf9 1501 continue;
a1255107 1502 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
d38ceaf9
AD
1503 amdgpu_wb_fini(adev);
1504 amdgpu_vram_scratch_fini(adev);
1505 }
8201a67a
RZ
1506
1507 if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
1508 adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE) {
1509 /* ungate blocks before hw fini so that we can shutdown the blocks safely */
1510 r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
1511 AMD_CG_STATE_UNGATE);
1512 if (r) {
1513 DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n",
1514 adev->ip_blocks[i].version->funcs->name, r);
1515 return r;
1516 }
2c1a2784 1517 }
8201a67a 1518
a1255107 1519 r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev);
d38ceaf9 1520 /* XXX handle errors */
2c1a2784 1521 if (r) {
a1255107
AD
1522 DRM_DEBUG("hw_fini of IP block <%s> failed %d\n",
1523 adev->ip_blocks[i].version->funcs->name, r);
2c1a2784 1524 }
8201a67a 1525
a1255107 1526 adev->ip_blocks[i].status.hw = false;
d38ceaf9
AD
1527 }
1528
1529 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1530 if (!adev->ip_blocks[i].status.sw)
d38ceaf9 1531 continue;
a1255107 1532 r = adev->ip_blocks[i].version->funcs->sw_fini((void *)adev);
d38ceaf9 1533 /* XXX handle errors */
2c1a2784 1534 if (r) {
a1255107
AD
1535 DRM_DEBUG("sw_fini of IP block <%s> failed %d\n",
1536 adev->ip_blocks[i].version->funcs->name, r);
2c1a2784 1537 }
a1255107
AD
1538 adev->ip_blocks[i].status.sw = false;
1539 adev->ip_blocks[i].status.valid = false;
d38ceaf9
AD
1540 }
1541
a6dcfd9c 1542 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1543 if (!adev->ip_blocks[i].status.late_initialized)
8a2eef1d 1544 continue;
a1255107
AD
1545 if (adev->ip_blocks[i].version->funcs->late_fini)
1546 adev->ip_blocks[i].version->funcs->late_fini((void *)adev);
1547 adev->ip_blocks[i].status.late_initialized = false;
a6dcfd9c
ML
1548 }
1549
2493664f
ML
1550 if (amdgpu_sriov_vf(adev))
1551 amdgpu_bo_free_kernel(&adev->virt.csa_obj, &adev->virt.csa_vmid0_addr, NULL);
1552
d38ceaf9
AD
1553 return 0;
1554}
1555
faefba95 1556int amdgpu_suspend(struct amdgpu_device *adev)
d38ceaf9
AD
1557{
1558 int i, r;
1559
c5a93a28
FC
1560 /* ungate SMC block first */
1561 r = amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_SMC,
1562 AMD_CG_STATE_UNGATE);
1563 if (r) {
1564 DRM_ERROR("set_clockgating_state(ungate) SMC failed %d\n",r);
1565 }
1566
d38ceaf9 1567 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1568 if (!adev->ip_blocks[i].status.valid)
d38ceaf9
AD
1569 continue;
1570 /* ungate blocks so that suspend can properly shut them down */
c5a93a28 1571 if (i != AMD_IP_BLOCK_TYPE_SMC) {
a1255107
AD
1572 r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
1573 AMD_CG_STATE_UNGATE);
c5a93a28 1574 if (r) {
a1255107
AD
1575 DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n",
1576 adev->ip_blocks[i].version->funcs->name, r);
c5a93a28 1577 }
2c1a2784 1578 }
d38ceaf9 1579 /* XXX handle errors */
a1255107 1580 r = adev->ip_blocks[i].version->funcs->suspend(adev);
d38ceaf9 1581 /* XXX handle errors */
2c1a2784 1582 if (r) {
a1255107
AD
1583 DRM_ERROR("suspend of IP block <%s> failed %d\n",
1584 adev->ip_blocks[i].version->funcs->name, r);
2c1a2784 1585 }
d38ceaf9
AD
1586 }
1587
1588 return 0;
1589}
1590
1591static int amdgpu_resume(struct amdgpu_device *adev)
1592{
1593 int i, r;
1594
1595 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1596 if (!adev->ip_blocks[i].status.valid)
d38ceaf9 1597 continue;
a1255107 1598 r = adev->ip_blocks[i].version->funcs->resume(adev);
2c1a2784 1599 if (r) {
a1255107
AD
1600 DRM_ERROR("resume of IP block <%s> failed %d\n",
1601 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1602 return r;
2c1a2784 1603 }
d38ceaf9
AD
1604 }
1605
1606 return 0;
1607}
1608
4e99a44e 1609static void amdgpu_device_detect_sriov_bios(struct amdgpu_device *adev)
048765ad 1610{
4e99a44e 1611 if (amdgpu_atombios_has_gpu_virtualization_table(adev))
5a5099cb 1612 adev->virt.caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;
048765ad
AR
1613}
1614
d38ceaf9
AD
1615/**
1616 * amdgpu_device_init - initialize the driver
1617 *
1618 * @adev: amdgpu_device pointer
1619 * @pdev: drm dev pointer
1620 * @pdev: pci dev pointer
1621 * @flags: driver flags
1622 *
1623 * Initializes the driver info and hw (all asics).
1624 * Returns 0 for success or an error on failure.
1625 * Called at driver startup.
1626 */
1627int amdgpu_device_init(struct amdgpu_device *adev,
1628 struct drm_device *ddev,
1629 struct pci_dev *pdev,
1630 uint32_t flags)
1631{
1632 int r, i;
1633 bool runtime = false;
95844d20 1634 u32 max_MBps;
d38ceaf9
AD
1635
1636 adev->shutdown = false;
1637 adev->dev = &pdev->dev;
1638 adev->ddev = ddev;
1639 adev->pdev = pdev;
1640 adev->flags = flags;
2f7d10b3 1641 adev->asic_type = flags & AMD_ASIC_MASK;
d38ceaf9
AD
1642 adev->usec_timeout = AMDGPU_MAX_USEC_TIMEOUT;
1643 adev->mc.gtt_size = 512 * 1024 * 1024;
1644 adev->accel_working = false;
1645 adev->num_rings = 0;
1646 adev->mman.buffer_funcs = NULL;
1647 adev->mman.buffer_funcs_ring = NULL;
1648 adev->vm_manager.vm_pte_funcs = NULL;
2d55e45a 1649 adev->vm_manager.vm_pte_num_rings = 0;
d38ceaf9 1650 adev->gart.gart_funcs = NULL;
f54d1867 1651 adev->fence_context = dma_fence_context_alloc(AMDGPU_MAX_RINGS);
d38ceaf9
AD
1652
1653 adev->smc_rreg = &amdgpu_invalid_rreg;
1654 adev->smc_wreg = &amdgpu_invalid_wreg;
1655 adev->pcie_rreg = &amdgpu_invalid_rreg;
1656 adev->pcie_wreg = &amdgpu_invalid_wreg;
36b9a952
HR
1657 adev->pciep_rreg = &amdgpu_invalid_rreg;
1658 adev->pciep_wreg = &amdgpu_invalid_wreg;
d38ceaf9
AD
1659 adev->uvd_ctx_rreg = &amdgpu_invalid_rreg;
1660 adev->uvd_ctx_wreg = &amdgpu_invalid_wreg;
1661 adev->didt_rreg = &amdgpu_invalid_rreg;
1662 adev->didt_wreg = &amdgpu_invalid_wreg;
ccdbb20a
RZ
1663 adev->gc_cac_rreg = &amdgpu_invalid_rreg;
1664 adev->gc_cac_wreg = &amdgpu_invalid_wreg;
d38ceaf9
AD
1665 adev->audio_endpt_rreg = &amdgpu_block_invalid_rreg;
1666 adev->audio_endpt_wreg = &amdgpu_block_invalid_wreg;
1667
ccdbb20a 1668
3e39ab90
AD
1669 DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X 0x%02X).\n",
1670 amdgpu_asic_name[adev->asic_type], pdev->vendor, pdev->device,
1671 pdev->subsystem_vendor, pdev->subsystem_device, pdev->revision);
d38ceaf9
AD
1672
1673 /* mutex initialization are all done here so we
1674 * can recall function without having locking issues */
8d0a7cea 1675 mutex_init(&adev->vm_manager.lock);
d38ceaf9 1676 atomic_set(&adev->irq.ih.lock, 0);
d38ceaf9
AD
1677 mutex_init(&adev->pm.mutex);
1678 mutex_init(&adev->gfx.gpu_clock_mutex);
1679 mutex_init(&adev->srbm_mutex);
1680 mutex_init(&adev->grbm_idx_mutex);
d38ceaf9
AD
1681 mutex_init(&adev->mn_lock);
1682 hash_init(adev->mn_hash);
1683
1684 amdgpu_check_arguments(adev);
1685
1686 /* Registers mapping */
1687 /* TODO: block userspace mapping of io register */
1688 spin_lock_init(&adev->mmio_idx_lock);
1689 spin_lock_init(&adev->smc_idx_lock);
1690 spin_lock_init(&adev->pcie_idx_lock);
1691 spin_lock_init(&adev->uvd_ctx_idx_lock);
1692 spin_lock_init(&adev->didt_idx_lock);
ccdbb20a 1693 spin_lock_init(&adev->gc_cac_idx_lock);
d38ceaf9 1694 spin_lock_init(&adev->audio_endpt_idx_lock);
95844d20 1695 spin_lock_init(&adev->mm_stats.lock);
d38ceaf9 1696
0c4e7fa5
CZ
1697 INIT_LIST_HEAD(&adev->shadow_list);
1698 mutex_init(&adev->shadow_list_lock);
1699
5c1354bd
CZ
1700 INIT_LIST_HEAD(&adev->gtt_list);
1701 spin_lock_init(&adev->gtt_list_lock);
1702
da69c161
KW
1703 if (adev->asic_type >= CHIP_BONAIRE) {
1704 adev->rmmio_base = pci_resource_start(adev->pdev, 5);
1705 adev->rmmio_size = pci_resource_len(adev->pdev, 5);
1706 } else {
1707 adev->rmmio_base = pci_resource_start(adev->pdev, 2);
1708 adev->rmmio_size = pci_resource_len(adev->pdev, 2);
1709 }
d38ceaf9 1710
d38ceaf9
AD
1711 adev->rmmio = ioremap(adev->rmmio_base, adev->rmmio_size);
1712 if (adev->rmmio == NULL) {
1713 return -ENOMEM;
1714 }
1715 DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)adev->rmmio_base);
1716 DRM_INFO("register mmio size: %u\n", (unsigned)adev->rmmio_size);
1717
da69c161
KW
1718 if (adev->asic_type >= CHIP_BONAIRE)
1719 /* doorbell bar mapping */
1720 amdgpu_doorbell_init(adev);
d38ceaf9
AD
1721
1722 /* io port mapping */
1723 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
1724 if (pci_resource_flags(adev->pdev, i) & IORESOURCE_IO) {
1725 adev->rio_mem_size = pci_resource_len(adev->pdev, i);
1726 adev->rio_mem = pci_iomap(adev->pdev, i, adev->rio_mem_size);
1727 break;
1728 }
1729 }
1730 if (adev->rio_mem == NULL)
b64a18c5 1731 DRM_INFO("PCI I/O BAR is not found.\n");
d38ceaf9
AD
1732
1733 /* early init functions */
1734 r = amdgpu_early_init(adev);
1735 if (r)
1736 return r;
1737
1738 /* if we have > 1 VGA cards, then disable the amdgpu VGA resources */
1739 /* this will fail for cards that aren't VGA class devices, just
1740 * ignore it */
1741 vga_client_register(adev->pdev, adev, NULL, amdgpu_vga_set_decode);
1742
1743 if (amdgpu_runtime_pm == 1)
1744 runtime = true;
e9bef455 1745 if (amdgpu_device_is_px(ddev))
d38ceaf9
AD
1746 runtime = true;
1747 vga_switcheroo_register_client(adev->pdev, &amdgpu_switcheroo_ops, runtime);
1748 if (runtime)
1749 vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain);
1750
1751 /* Read BIOS */
83ba126a
AD
1752 if (!amdgpu_get_bios(adev)) {
1753 r = -EINVAL;
1754 goto failed;
1755 }
f7e9e9fe 1756
d38ceaf9 1757 r = amdgpu_atombios_init(adev);
2c1a2784
AD
1758 if (r) {
1759 dev_err(adev->dev, "amdgpu_atombios_init failed\n");
83ba126a 1760 goto failed;
2c1a2784 1761 }
d38ceaf9 1762
4e99a44e
ML
1763 /* detect if we are with an SRIOV vbios */
1764 amdgpu_device_detect_sriov_bios(adev);
048765ad 1765
d38ceaf9 1766 /* Post card if necessary */
bec86378 1767 if (amdgpu_vpost_needed(adev)) {
d38ceaf9 1768 if (!adev->bios) {
bec86378 1769 dev_err(adev->dev, "no vBIOS found\n");
83ba126a
AD
1770 r = -EINVAL;
1771 goto failed;
d38ceaf9 1772 }
bec86378 1773 DRM_INFO("GPU posting now...\n");
4e99a44e
ML
1774 r = amdgpu_atom_asic_init(adev->mode_info.atom_context);
1775 if (r) {
1776 dev_err(adev->dev, "gpu post error!\n");
1777 goto failed;
1778 }
1779 } else {
1780 DRM_INFO("GPU post is not needed\n");
d38ceaf9
AD
1781 }
1782
1783 /* Initialize clocks */
1784 r = amdgpu_atombios_get_clock_info(adev);
2c1a2784
AD
1785 if (r) {
1786 dev_err(adev->dev, "amdgpu_atombios_get_clock_info failed\n");
83ba126a 1787 goto failed;
2c1a2784 1788 }
d38ceaf9
AD
1789 /* init i2c buses */
1790 amdgpu_atombios_i2c_init(adev);
1791
1792 /* Fence driver */
1793 r = amdgpu_fence_driver_init(adev);
2c1a2784
AD
1794 if (r) {
1795 dev_err(adev->dev, "amdgpu_fence_driver_init failed\n");
83ba126a 1796 goto failed;
2c1a2784 1797 }
d38ceaf9
AD
1798
1799 /* init the mode config */
1800 drm_mode_config_init(adev->ddev);
1801
1802 r = amdgpu_init(adev);
1803 if (r) {
2c1a2784 1804 dev_err(adev->dev, "amdgpu_init failed\n");
d38ceaf9 1805 amdgpu_fini(adev);
83ba126a 1806 goto failed;
d38ceaf9
AD
1807 }
1808
1809 adev->accel_working = true;
1810
95844d20
MO
1811 /* Initialize the buffer migration limit. */
1812 if (amdgpu_moverate >= 0)
1813 max_MBps = amdgpu_moverate;
1814 else
1815 max_MBps = 8; /* Allow 8 MB/s. */
1816 /* Get a log2 for easy divisions. */
1817 adev->mm_stats.log2_max_MBps = ilog2(max(1u, max_MBps));
1818
d38ceaf9
AD
1819 amdgpu_fbdev_init(adev);
1820
1821 r = amdgpu_ib_pool_init(adev);
1822 if (r) {
1823 dev_err(adev->dev, "IB initialization failed (%d).\n", r);
83ba126a 1824 goto failed;
d38ceaf9
AD
1825 }
1826
1827 r = amdgpu_ib_ring_tests(adev);
1828 if (r)
1829 DRM_ERROR("ib ring test failed (%d).\n", r);
1830
1831 r = amdgpu_gem_debugfs_init(adev);
1832 if (r) {
1833 DRM_ERROR("registering gem debugfs failed (%d).\n", r);
1834 }
1835
1836 r = amdgpu_debugfs_regs_init(adev);
1837 if (r) {
1838 DRM_ERROR("registering register debugfs failed (%d).\n", r);
1839 }
1840
50ab2533
HR
1841 r = amdgpu_debugfs_firmware_init(adev);
1842 if (r) {
1843 DRM_ERROR("registering firmware debugfs failed (%d).\n", r);
1844 return r;
1845 }
1846
d38ceaf9
AD
1847 if ((amdgpu_testing & 1)) {
1848 if (adev->accel_working)
1849 amdgpu_test_moves(adev);
1850 else
1851 DRM_INFO("amdgpu: acceleration disabled, skipping move tests\n");
1852 }
1853 if ((amdgpu_testing & 2)) {
1854 if (adev->accel_working)
1855 amdgpu_test_syncing(adev);
1856 else
1857 DRM_INFO("amdgpu: acceleration disabled, skipping sync tests\n");
1858 }
1859 if (amdgpu_benchmarking) {
1860 if (adev->accel_working)
1861 amdgpu_benchmark(adev, amdgpu_benchmarking);
1862 else
1863 DRM_INFO("amdgpu: acceleration disabled, skipping benchmarks\n");
1864 }
1865
1866 /* enable clockgating, etc. after ib tests, etc. since some blocks require
1867 * explicit gating rather than handling it automatically.
1868 */
1869 r = amdgpu_late_init(adev);
2c1a2784
AD
1870 if (r) {
1871 dev_err(adev->dev, "amdgpu_late_init failed\n");
83ba126a 1872 goto failed;
2c1a2784 1873 }
d38ceaf9
AD
1874
1875 return 0;
83ba126a
AD
1876
1877failed:
1878 if (runtime)
1879 vga_switcheroo_fini_domain_pm_ops(adev->dev);
1880 return r;
d38ceaf9
AD
1881}
1882
1883static void amdgpu_debugfs_remove_files(struct amdgpu_device *adev);
1884
1885/**
1886 * amdgpu_device_fini - tear down the driver
1887 *
1888 * @adev: amdgpu_device pointer
1889 *
1890 * Tear down the driver info (all asics).
1891 * Called at driver shutdown.
1892 */
1893void amdgpu_device_fini(struct amdgpu_device *adev)
1894{
1895 int r;
1896
1897 DRM_INFO("amdgpu: finishing device.\n");
1898 adev->shutdown = true;
a951ed85 1899 drm_crtc_force_disable_all(adev->ddev);
d38ceaf9
AD
1900 /* evict vram memory */
1901 amdgpu_bo_evict_vram(adev);
1902 amdgpu_ib_pool_fini(adev);
1903 amdgpu_fence_driver_fini(adev);
1904 amdgpu_fbdev_fini(adev);
1905 r = amdgpu_fini(adev);
d38ceaf9
AD
1906 adev->accel_working = false;
1907 /* free i2c buses */
1908 amdgpu_i2c_fini(adev);
1909 amdgpu_atombios_fini(adev);
1910 kfree(adev->bios);
1911 adev->bios = NULL;
1912 vga_switcheroo_unregister_client(adev->pdev);
83ba126a
AD
1913 if (adev->flags & AMD_IS_PX)
1914 vga_switcheroo_fini_domain_pm_ops(adev->dev);
d38ceaf9
AD
1915 vga_client_register(adev->pdev, NULL, NULL, NULL);
1916 if (adev->rio_mem)
1917 pci_iounmap(adev->pdev, adev->rio_mem);
1918 adev->rio_mem = NULL;
1919 iounmap(adev->rmmio);
1920 adev->rmmio = NULL;
da69c161
KW
1921 if (adev->asic_type >= CHIP_BONAIRE)
1922 amdgpu_doorbell_fini(adev);
d38ceaf9
AD
1923 amdgpu_debugfs_regs_cleanup(adev);
1924 amdgpu_debugfs_remove_files(adev);
1925}
1926
1927
1928/*
1929 * Suspend & resume.
1930 */
1931/**
810ddc3a 1932 * amdgpu_device_suspend - initiate device suspend
d38ceaf9
AD
1933 *
1934 * @pdev: drm dev pointer
1935 * @state: suspend state
1936 *
1937 * Puts the hw in the suspend state (all asics).
1938 * Returns 0 for success or an error on failure.
1939 * Called at driver suspend.
1940 */
810ddc3a 1941int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
d38ceaf9
AD
1942{
1943 struct amdgpu_device *adev;
1944 struct drm_crtc *crtc;
1945 struct drm_connector *connector;
5ceb54c6 1946 int r;
d38ceaf9
AD
1947
1948 if (dev == NULL || dev->dev_private == NULL) {
1949 return -ENODEV;
1950 }
1951
1952 adev = dev->dev_private;
1953
1954 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
1955 return 0;
1956
1957 drm_kms_helper_poll_disable(dev);
1958
1959 /* turn off display hw */
4c7fbc39 1960 drm_modeset_lock_all(dev);
d38ceaf9
AD
1961 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1962 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
1963 }
4c7fbc39 1964 drm_modeset_unlock_all(dev);
d38ceaf9 1965
756e6880 1966 /* unpin the front buffers and cursors */
d38ceaf9 1967 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
756e6880 1968 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
d38ceaf9
AD
1969 struct amdgpu_framebuffer *rfb = to_amdgpu_framebuffer(crtc->primary->fb);
1970 struct amdgpu_bo *robj;
1971
756e6880
AD
1972 if (amdgpu_crtc->cursor_bo) {
1973 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
1974 r = amdgpu_bo_reserve(aobj, false);
1975 if (r == 0) {
1976 amdgpu_bo_unpin(aobj);
1977 amdgpu_bo_unreserve(aobj);
1978 }
1979 }
1980
d38ceaf9
AD
1981 if (rfb == NULL || rfb->obj == NULL) {
1982 continue;
1983 }
1984 robj = gem_to_amdgpu_bo(rfb->obj);
1985 /* don't unpin kernel fb objects */
1986 if (!amdgpu_fbdev_robj_is_fb(adev, robj)) {
1987 r = amdgpu_bo_reserve(robj, false);
1988 if (r == 0) {
1989 amdgpu_bo_unpin(robj);
1990 amdgpu_bo_unreserve(robj);
1991 }
1992 }
1993 }
1994 /* evict vram memory */
1995 amdgpu_bo_evict_vram(adev);
1996
5ceb54c6 1997 amdgpu_fence_driver_suspend(adev);
d38ceaf9
AD
1998
1999 r = amdgpu_suspend(adev);
2000
a0a71e49
AD
2001 /* evict remaining vram memory
2002 * This second call to evict vram is to evict the gart page table
2003 * using the CPU.
2004 */
d38ceaf9
AD
2005 amdgpu_bo_evict_vram(adev);
2006
e695e77c 2007 amdgpu_atombios_scratch_regs_save(adev);
d38ceaf9
AD
2008 pci_save_state(dev->pdev);
2009 if (suspend) {
2010 /* Shut down the device */
2011 pci_disable_device(dev->pdev);
2012 pci_set_power_state(dev->pdev, PCI_D3hot);
74b0b157 2013 } else {
2014 r = amdgpu_asic_reset(adev);
2015 if (r)
2016 DRM_ERROR("amdgpu asic reset failed\n");
d38ceaf9
AD
2017 }
2018
2019 if (fbcon) {
2020 console_lock();
2021 amdgpu_fbdev_set_suspend(adev, 1);
2022 console_unlock();
2023 }
2024 return 0;
2025}
2026
2027/**
810ddc3a 2028 * amdgpu_device_resume - initiate device resume
d38ceaf9
AD
2029 *
2030 * @pdev: drm dev pointer
2031 *
2032 * Bring the hw back to operating state (all asics).
2033 * Returns 0 for success or an error on failure.
2034 * Called at driver resume.
2035 */
810ddc3a 2036int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
d38ceaf9
AD
2037{
2038 struct drm_connector *connector;
2039 struct amdgpu_device *adev = dev->dev_private;
756e6880 2040 struct drm_crtc *crtc;
d38ceaf9
AD
2041 int r;
2042
2043 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
2044 return 0;
2045
74b0b157 2046 if (fbcon)
d38ceaf9 2047 console_lock();
74b0b157 2048
d38ceaf9
AD
2049 if (resume) {
2050 pci_set_power_state(dev->pdev, PCI_D0);
2051 pci_restore_state(dev->pdev);
74b0b157 2052 r = pci_enable_device(dev->pdev);
2053 if (r) {
d38ceaf9
AD
2054 if (fbcon)
2055 console_unlock();
74b0b157 2056 return r;
d38ceaf9
AD
2057 }
2058 }
e695e77c 2059 amdgpu_atombios_scratch_regs_restore(adev);
d38ceaf9
AD
2060
2061 /* post card */
74b0b157 2062 if (!amdgpu_card_posted(adev) || !resume) {
2063 r = amdgpu_atom_asic_init(adev->mode_info.atom_context);
2064 if (r)
2065 DRM_ERROR("amdgpu asic init failed\n");
2066 }
d38ceaf9
AD
2067
2068 r = amdgpu_resume(adev);
ca198528
FC
2069 if (r)
2070 DRM_ERROR("amdgpu_resume failed (%d).\n", r);
d38ceaf9 2071
5ceb54c6
AD
2072 amdgpu_fence_driver_resume(adev);
2073
ca198528
FC
2074 if (resume) {
2075 r = amdgpu_ib_ring_tests(adev);
2076 if (r)
2077 DRM_ERROR("ib ring test failed (%d).\n", r);
2078 }
d38ceaf9
AD
2079
2080 r = amdgpu_late_init(adev);
2081 if (r)
2082 return r;
2083
756e6880
AD
2084 /* pin cursors */
2085 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
2086 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2087
2088 if (amdgpu_crtc->cursor_bo) {
2089 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2090 r = amdgpu_bo_reserve(aobj, false);
2091 if (r == 0) {
2092 r = amdgpu_bo_pin(aobj,
2093 AMDGPU_GEM_DOMAIN_VRAM,
2094 &amdgpu_crtc->cursor_addr);
2095 if (r != 0)
2096 DRM_ERROR("Failed to pin cursor BO (%d)\n", r);
2097 amdgpu_bo_unreserve(aobj);
2098 }
2099 }
2100 }
2101
d38ceaf9
AD
2102 /* blat the mode back in */
2103 if (fbcon) {
2104 drm_helper_resume_force_mode(dev);
2105 /* turn on display hw */
4c7fbc39 2106 drm_modeset_lock_all(dev);
d38ceaf9
AD
2107 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
2108 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
2109 }
4c7fbc39 2110 drm_modeset_unlock_all(dev);
d38ceaf9
AD
2111 }
2112
2113 drm_kms_helper_poll_enable(dev);
23a1a9e5
L
2114
2115 /*
2116 * Most of the connector probing functions try to acquire runtime pm
2117 * refs to ensure that the GPU is powered on when connector polling is
2118 * performed. Since we're calling this from a runtime PM callback,
2119 * trying to acquire rpm refs will cause us to deadlock.
2120 *
2121 * Since we're guaranteed to be holding the rpm lock, it's safe to
2122 * temporarily disable the rpm helpers so this doesn't deadlock us.
2123 */
2124#ifdef CONFIG_PM
2125 dev->dev->power.disable_depth++;
2126#endif
54fb2a5c 2127 drm_helper_hpd_irq_event(dev);
23a1a9e5
L
2128#ifdef CONFIG_PM
2129 dev->dev->power.disable_depth--;
2130#endif
d38ceaf9
AD
2131
2132 if (fbcon) {
2133 amdgpu_fbdev_set_suspend(adev, 0);
2134 console_unlock();
2135 }
2136
2137 return 0;
2138}
2139
63fbf42f
CZ
2140static bool amdgpu_check_soft_reset(struct amdgpu_device *adev)
2141{
2142 int i;
2143 bool asic_hang = false;
2144
2145 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2146 if (!adev->ip_blocks[i].status.valid)
63fbf42f 2147 continue;
a1255107
AD
2148 if (adev->ip_blocks[i].version->funcs->check_soft_reset)
2149 adev->ip_blocks[i].status.hang =
2150 adev->ip_blocks[i].version->funcs->check_soft_reset(adev);
2151 if (adev->ip_blocks[i].status.hang) {
2152 DRM_INFO("IP block:%s is hung!\n", adev->ip_blocks[i].version->funcs->name);
63fbf42f
CZ
2153 asic_hang = true;
2154 }
2155 }
2156 return asic_hang;
2157}
2158
4d446656 2159static int amdgpu_pre_soft_reset(struct amdgpu_device *adev)
d31a501e
CZ
2160{
2161 int i, r = 0;
2162
2163 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2164 if (!adev->ip_blocks[i].status.valid)
d31a501e 2165 continue;
a1255107
AD
2166 if (adev->ip_blocks[i].status.hang &&
2167 adev->ip_blocks[i].version->funcs->pre_soft_reset) {
2168 r = adev->ip_blocks[i].version->funcs->pre_soft_reset(adev);
d31a501e
CZ
2169 if (r)
2170 return r;
2171 }
2172 }
2173
2174 return 0;
2175}
2176
35d782fe
CZ
2177static bool amdgpu_need_full_reset(struct amdgpu_device *adev)
2178{
da146d3b
AD
2179 int i;
2180
2181 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2182 if (!adev->ip_blocks[i].status.valid)
da146d3b 2183 continue;
a1255107
AD
2184 if ((adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) ||
2185 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) ||
2186 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_ACP) ||
2187 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE)) {
2188 if (adev->ip_blocks[i].status.hang) {
da146d3b
AD
2189 DRM_INFO("Some block need full reset!\n");
2190 return true;
2191 }
2192 }
35d782fe
CZ
2193 }
2194 return false;
2195}
2196
2197static int amdgpu_soft_reset(struct amdgpu_device *adev)
2198{
2199 int i, r = 0;
2200
2201 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2202 if (!adev->ip_blocks[i].status.valid)
35d782fe 2203 continue;
a1255107
AD
2204 if (adev->ip_blocks[i].status.hang &&
2205 adev->ip_blocks[i].version->funcs->soft_reset) {
2206 r = adev->ip_blocks[i].version->funcs->soft_reset(adev);
35d782fe
CZ
2207 if (r)
2208 return r;
2209 }
2210 }
2211
2212 return 0;
2213}
2214
2215static int amdgpu_post_soft_reset(struct amdgpu_device *adev)
2216{
2217 int i, r = 0;
2218
2219 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2220 if (!adev->ip_blocks[i].status.valid)
35d782fe 2221 continue;
a1255107
AD
2222 if (adev->ip_blocks[i].status.hang &&
2223 adev->ip_blocks[i].version->funcs->post_soft_reset)
2224 r = adev->ip_blocks[i].version->funcs->post_soft_reset(adev);
35d782fe
CZ
2225 if (r)
2226 return r;
2227 }
2228
2229 return 0;
2230}
2231
3ad81f16
CZ
2232bool amdgpu_need_backup(struct amdgpu_device *adev)
2233{
2234 if (adev->flags & AMD_IS_APU)
2235 return false;
2236
2237 return amdgpu_lockup_timeout > 0 ? true : false;
2238}
2239
53cdccd5
CZ
2240static int amdgpu_recover_vram_from_shadow(struct amdgpu_device *adev,
2241 struct amdgpu_ring *ring,
2242 struct amdgpu_bo *bo,
f54d1867 2243 struct dma_fence **fence)
53cdccd5
CZ
2244{
2245 uint32_t domain;
2246 int r;
2247
2248 if (!bo->shadow)
2249 return 0;
2250
2251 r = amdgpu_bo_reserve(bo, false);
2252 if (r)
2253 return r;
2254 domain = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type);
2255 /* if bo has been evicted, then no need to recover */
2256 if (domain == AMDGPU_GEM_DOMAIN_VRAM) {
2257 r = amdgpu_bo_restore_from_shadow(adev, ring, bo,
2258 NULL, fence, true);
2259 if (r) {
2260 DRM_ERROR("recover page table failed!\n");
2261 goto err;
2262 }
2263 }
2264err:
2265 amdgpu_bo_unreserve(bo);
2266 return r;
2267}
2268
d38ceaf9
AD
2269/**
2270 * amdgpu_gpu_reset - reset the asic
2271 *
2272 * @adev: amdgpu device pointer
2273 *
2274 * Attempt the reset the GPU if it has hung (all asics).
2275 * Returns 0 for success or an error on failure.
2276 */
2277int amdgpu_gpu_reset(struct amdgpu_device *adev)
2278{
d38ceaf9
AD
2279 int i, r;
2280 int resched;
35d782fe 2281 bool need_full_reset;
d38ceaf9 2282
63fbf42f
CZ
2283 if (!amdgpu_check_soft_reset(adev)) {
2284 DRM_INFO("No hardware hang detected. Did some blocks stall?\n");
2285 return 0;
2286 }
d38ceaf9 2287
d94aed5a 2288 atomic_inc(&adev->gpu_reset_counter);
d38ceaf9 2289
a3c47d6b
CZ
2290 /* block TTM */
2291 resched = ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
2292
0875dc9e
CZ
2293 /* block scheduler */
2294 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2295 struct amdgpu_ring *ring = adev->rings[i];
2296
2297 if (!ring)
2298 continue;
2299 kthread_park(ring->sched.thread);
aa1c8900 2300 amd_sched_hw_job_reset(&ring->sched);
0875dc9e 2301 }
2200edac
CZ
2302 /* after all hw jobs are reset, hw fence is meaningless, so force_completion */
2303 amdgpu_fence_driver_force_completion(adev);
d38ceaf9 2304
35d782fe 2305 need_full_reset = amdgpu_need_full_reset(adev);
d38ceaf9 2306
35d782fe
CZ
2307 if (!need_full_reset) {
2308 amdgpu_pre_soft_reset(adev);
2309 r = amdgpu_soft_reset(adev);
2310 amdgpu_post_soft_reset(adev);
2311 if (r || amdgpu_check_soft_reset(adev)) {
2312 DRM_INFO("soft reset failed, will fallback to full reset!\n");
2313 need_full_reset = true;
2314 }
f1aa7e08
CZ
2315 }
2316
35d782fe 2317 if (need_full_reset) {
35d782fe 2318 r = amdgpu_suspend(adev);
bfa99269 2319
35d782fe
CZ
2320retry:
2321 /* Disable fb access */
2322 if (adev->mode_info.num_crtc) {
2323 struct amdgpu_mode_mc_save save;
2324 amdgpu_display_stop_mc_access(adev, &save);
2325 amdgpu_wait_for_idle(adev, AMD_IP_BLOCK_TYPE_GMC);
2326 }
e695e77c 2327 amdgpu_atombios_scratch_regs_save(adev);
35d782fe 2328 r = amdgpu_asic_reset(adev);
e695e77c 2329 amdgpu_atombios_scratch_regs_restore(adev);
35d782fe
CZ
2330 /* post card */
2331 amdgpu_atom_asic_init(adev->mode_info.atom_context);
2332
2333 if (!r) {
2334 dev_info(adev->dev, "GPU reset succeeded, trying to resume\n");
2335 r = amdgpu_resume(adev);
2336 }
d38ceaf9 2337 }
d38ceaf9 2338 if (!r) {
e72cfd58 2339 amdgpu_irq_gpu_reset_resume_helper(adev);
2c0d7318
CZ
2340 if (need_full_reset && amdgpu_need_backup(adev)) {
2341 r = amdgpu_ttm_recover_gart(adev);
2342 if (r)
2343 DRM_ERROR("gart recovery failed!!!\n");
2344 }
1f465087
CZ
2345 r = amdgpu_ib_ring_tests(adev);
2346 if (r) {
2347 dev_err(adev->dev, "ib ring test failed (%d).\n", r);
40019dc4 2348 r = amdgpu_suspend(adev);
53cdccd5 2349 need_full_reset = true;
40019dc4 2350 goto retry;
1f465087 2351 }
53cdccd5
CZ
2352 /**
2353 * recovery vm page tables, since we cannot depend on VRAM is
2354 * consistent after gpu full reset.
2355 */
2356 if (need_full_reset && amdgpu_need_backup(adev)) {
2357 struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
2358 struct amdgpu_bo *bo, *tmp;
f54d1867 2359 struct dma_fence *fence = NULL, *next = NULL;
53cdccd5
CZ
2360
2361 DRM_INFO("recover vram bo from shadow\n");
2362 mutex_lock(&adev->shadow_list_lock);
2363 list_for_each_entry_safe(bo, tmp, &adev->shadow_list, shadow_list) {
2364 amdgpu_recover_vram_from_shadow(adev, ring, bo, &next);
2365 if (fence) {
f54d1867 2366 r = dma_fence_wait(fence, false);
53cdccd5
CZ
2367 if (r) {
2368 WARN(r, "recovery from shadow isn't comleted\n");
2369 break;
2370 }
2371 }
1f465087 2372
f54d1867 2373 dma_fence_put(fence);
53cdccd5
CZ
2374 fence = next;
2375 }
2376 mutex_unlock(&adev->shadow_list_lock);
2377 if (fence) {
f54d1867 2378 r = dma_fence_wait(fence, false);
53cdccd5
CZ
2379 if (r)
2380 WARN(r, "recovery from shadow isn't comleted\n");
2381 }
f54d1867 2382 dma_fence_put(fence);
53cdccd5 2383 }
d38ceaf9
AD
2384 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2385 struct amdgpu_ring *ring = adev->rings[i];
2386 if (!ring)
2387 continue;
53cdccd5 2388
aa1c8900 2389 amd_sched_job_recovery(&ring->sched);
0875dc9e 2390 kthread_unpark(ring->sched.thread);
d38ceaf9 2391 }
d38ceaf9 2392 } else {
2200edac 2393 dev_err(adev->dev, "asic resume failed (%d).\n", r);
d38ceaf9 2394 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
0875dc9e
CZ
2395 if (adev->rings[i]) {
2396 kthread_unpark(adev->rings[i]->sched.thread);
0875dc9e 2397 }
d38ceaf9
AD
2398 }
2399 }
2400
2401 drm_helper_resume_force_mode(adev->ddev);
2402
2403 ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched);
2404 if (r) {
2405 /* bad news, how to tell it to userspace ? */
2406 dev_info(adev->dev, "GPU reset failed\n");
2407 }
2408
d38ceaf9
AD
2409 return r;
2410}
2411
d0dd7f0c
AD
2412void amdgpu_get_pcie_info(struct amdgpu_device *adev)
2413{
2414 u32 mask;
2415 int ret;
2416
cd474ba0
AD
2417 if (amdgpu_pcie_gen_cap)
2418 adev->pm.pcie_gen_mask = amdgpu_pcie_gen_cap;
d0dd7f0c 2419
cd474ba0
AD
2420 if (amdgpu_pcie_lane_cap)
2421 adev->pm.pcie_mlw_mask = amdgpu_pcie_lane_cap;
d0dd7f0c 2422
cd474ba0
AD
2423 /* covers APUs as well */
2424 if (pci_is_root_bus(adev->pdev->bus)) {
2425 if (adev->pm.pcie_gen_mask == 0)
2426 adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK;
2427 if (adev->pm.pcie_mlw_mask == 0)
2428 adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;
d0dd7f0c 2429 return;
cd474ba0 2430 }
d0dd7f0c 2431
cd474ba0
AD
2432 if (adev->pm.pcie_gen_mask == 0) {
2433 ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
2434 if (!ret) {
2435 adev->pm.pcie_gen_mask = (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
2436 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
2437 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3);
2438
2439 if (mask & DRM_PCIE_SPEED_25)
2440 adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1;
2441 if (mask & DRM_PCIE_SPEED_50)
2442 adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2;
2443 if (mask & DRM_PCIE_SPEED_80)
2444 adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3;
2445 } else {
2446 adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK;
2447 }
2448 }
2449 if (adev->pm.pcie_mlw_mask == 0) {
2450 ret = drm_pcie_get_max_link_width(adev->ddev, &mask);
2451 if (!ret) {
2452 switch (mask) {
2453 case 32:
2454 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |
2455 CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
2456 CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
2457 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
2458 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
2459 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
2460 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
2461 break;
2462 case 16:
2463 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
2464 CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
2465 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
2466 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
2467 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
2468 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
2469 break;
2470 case 12:
2471 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
2472 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
2473 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
2474 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
2475 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
2476 break;
2477 case 8:
2478 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
2479 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
2480 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
2481 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
2482 break;
2483 case 4:
2484 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
2485 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
2486 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
2487 break;
2488 case 2:
2489 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
2490 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
2491 break;
2492 case 1:
2493 adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1;
2494 break;
2495 default:
2496 break;
2497 }
2498 } else {
2499 adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;
d0dd7f0c
AD
2500 }
2501 }
2502}
d38ceaf9
AD
2503
2504/*
2505 * Debugfs
2506 */
2507int amdgpu_debugfs_add_files(struct amdgpu_device *adev,
06ab6832 2508 const struct drm_info_list *files,
d38ceaf9
AD
2509 unsigned nfiles)
2510{
2511 unsigned i;
2512
2513 for (i = 0; i < adev->debugfs_count; i++) {
2514 if (adev->debugfs[i].files == files) {
2515 /* Already registered */
2516 return 0;
2517 }
2518 }
2519
2520 i = adev->debugfs_count + 1;
2521 if (i > AMDGPU_DEBUGFS_MAX_COMPONENTS) {
2522 DRM_ERROR("Reached maximum number of debugfs components.\n");
2523 DRM_ERROR("Report so we increase "
2524 "AMDGPU_DEBUGFS_MAX_COMPONENTS.\n");
2525 return -EINVAL;
2526 }
2527 adev->debugfs[adev->debugfs_count].files = files;
2528 adev->debugfs[adev->debugfs_count].num_files = nfiles;
2529 adev->debugfs_count = i;
2530#if defined(CONFIG_DEBUG_FS)
d38ceaf9
AD
2531 drm_debugfs_create_files(files, nfiles,
2532 adev->ddev->primary->debugfs_root,
2533 adev->ddev->primary);
2534#endif
2535 return 0;
2536}
2537
2538static void amdgpu_debugfs_remove_files(struct amdgpu_device *adev)
2539{
2540#if defined(CONFIG_DEBUG_FS)
2541 unsigned i;
2542
2543 for (i = 0; i < adev->debugfs_count; i++) {
d38ceaf9
AD
2544 drm_debugfs_remove_files(adev->debugfs[i].files,
2545 adev->debugfs[i].num_files,
2546 adev->ddev->primary);
2547 }
2548#endif
2549}
2550
2551#if defined(CONFIG_DEBUG_FS)
2552
2553static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
2554 size_t size, loff_t *pos)
2555{
45063097 2556 struct amdgpu_device *adev = file_inode(f)->i_private;
d38ceaf9
AD
2557 ssize_t result = 0;
2558 int r;
bd12267d 2559 bool pm_pg_lock, use_bank;
56628159 2560 unsigned instance_bank, sh_bank, se_bank;
d38ceaf9
AD
2561
2562 if (size & 0x3 || *pos & 0x3)
2563 return -EINVAL;
2564
bd12267d
TSD
2565 /* are we reading registers for which a PG lock is necessary? */
2566 pm_pg_lock = (*pos >> 23) & 1;
2567
56628159
TSD
2568 if (*pos & (1ULL << 62)) {
2569 se_bank = (*pos >> 24) & 0x3FF;
2570 sh_bank = (*pos >> 34) & 0x3FF;
2571 instance_bank = (*pos >> 44) & 0x3FF;
32977f93
TSD
2572
2573 if (se_bank == 0x3FF)
2574 se_bank = 0xFFFFFFFF;
2575 if (sh_bank == 0x3FF)
2576 sh_bank = 0xFFFFFFFF;
2577 if (instance_bank == 0x3FF)
2578 instance_bank = 0xFFFFFFFF;
56628159 2579 use_bank = 1;
56628159
TSD
2580 } else {
2581 use_bank = 0;
2582 }
2583
bd12267d
TSD
2584 *pos &= 0x3FFFF;
2585
56628159 2586 if (use_bank) {
32977f93
TSD
2587 if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||
2588 (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines))
56628159
TSD
2589 return -EINVAL;
2590 mutex_lock(&adev->grbm_idx_mutex);
2591 amdgpu_gfx_select_se_sh(adev, se_bank,
2592 sh_bank, instance_bank);
2593 }
2594
bd12267d
TSD
2595 if (pm_pg_lock)
2596 mutex_lock(&adev->pm.mutex);
2597
d38ceaf9
AD
2598 while (size) {
2599 uint32_t value;
2600
2601 if (*pos > adev->rmmio_size)
56628159 2602 goto end;
d38ceaf9
AD
2603
2604 value = RREG32(*pos >> 2);
2605 r = put_user(value, (uint32_t *)buf);
56628159
TSD
2606 if (r) {
2607 result = r;
2608 goto end;
2609 }
d38ceaf9
AD
2610
2611 result += 4;
2612 buf += 4;
2613 *pos += 4;
2614 size -= 4;
2615 }
2616
56628159
TSD
2617end:
2618 if (use_bank) {
2619 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
2620 mutex_unlock(&adev->grbm_idx_mutex);
2621 }
2622
bd12267d
TSD
2623 if (pm_pg_lock)
2624 mutex_unlock(&adev->pm.mutex);
2625
d38ceaf9
AD
2626 return result;
2627}
2628
2629static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf,
2630 size_t size, loff_t *pos)
2631{
45063097 2632 struct amdgpu_device *adev = file_inode(f)->i_private;
d38ceaf9
AD
2633 ssize_t result = 0;
2634 int r;
394fdde2
TSD
2635 bool pm_pg_lock, use_bank;
2636 unsigned instance_bank, sh_bank, se_bank;
d38ceaf9
AD
2637
2638 if (size & 0x3 || *pos & 0x3)
2639 return -EINVAL;
2640
394fdde2
TSD
2641 /* are we reading registers for which a PG lock is necessary? */
2642 pm_pg_lock = (*pos >> 23) & 1;
2643
2644 if (*pos & (1ULL << 62)) {
2645 se_bank = (*pos >> 24) & 0x3FF;
2646 sh_bank = (*pos >> 34) & 0x3FF;
2647 instance_bank = (*pos >> 44) & 0x3FF;
2648
2649 if (se_bank == 0x3FF)
2650 se_bank = 0xFFFFFFFF;
2651 if (sh_bank == 0x3FF)
2652 sh_bank = 0xFFFFFFFF;
2653 if (instance_bank == 0x3FF)
2654 instance_bank = 0xFFFFFFFF;
2655 use_bank = 1;
2656 } else {
2657 use_bank = 0;
2658 }
2659
2660 *pos &= 0x3FFFF;
2661
2662 if (use_bank) {
2663 if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||
2664 (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines))
2665 return -EINVAL;
2666 mutex_lock(&adev->grbm_idx_mutex);
2667 amdgpu_gfx_select_se_sh(adev, se_bank,
2668 sh_bank, instance_bank);
2669 }
2670
2671 if (pm_pg_lock)
2672 mutex_lock(&adev->pm.mutex);
2673
d38ceaf9
AD
2674 while (size) {
2675 uint32_t value;
2676
2677 if (*pos > adev->rmmio_size)
2678 return result;
2679
2680 r = get_user(value, (uint32_t *)buf);
2681 if (r)
2682 return r;
2683
2684 WREG32(*pos >> 2, value);
2685
2686 result += 4;
2687 buf += 4;
2688 *pos += 4;
2689 size -= 4;
2690 }
2691
394fdde2
TSD
2692 if (use_bank) {
2693 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
2694 mutex_unlock(&adev->grbm_idx_mutex);
2695 }
2696
2697 if (pm_pg_lock)
2698 mutex_unlock(&adev->pm.mutex);
2699
d38ceaf9
AD
2700 return result;
2701}
2702
adcec288
TSD
2703static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
2704 size_t size, loff_t *pos)
2705{
45063097 2706 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
2707 ssize_t result = 0;
2708 int r;
2709
2710 if (size & 0x3 || *pos & 0x3)
2711 return -EINVAL;
2712
2713 while (size) {
2714 uint32_t value;
2715
2716 value = RREG32_PCIE(*pos >> 2);
2717 r = put_user(value, (uint32_t *)buf);
2718 if (r)
2719 return r;
2720
2721 result += 4;
2722 buf += 4;
2723 *pos += 4;
2724 size -= 4;
2725 }
2726
2727 return result;
2728}
2729
2730static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user *buf,
2731 size_t size, loff_t *pos)
2732{
45063097 2733 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
2734 ssize_t result = 0;
2735 int r;
2736
2737 if (size & 0x3 || *pos & 0x3)
2738 return -EINVAL;
2739
2740 while (size) {
2741 uint32_t value;
2742
2743 r = get_user(value, (uint32_t *)buf);
2744 if (r)
2745 return r;
2746
2747 WREG32_PCIE(*pos >> 2, value);
2748
2749 result += 4;
2750 buf += 4;
2751 *pos += 4;
2752 size -= 4;
2753 }
2754
2755 return result;
2756}
2757
2758static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,
2759 size_t size, loff_t *pos)
2760{
45063097 2761 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
2762 ssize_t result = 0;
2763 int r;
2764
2765 if (size & 0x3 || *pos & 0x3)
2766 return -EINVAL;
2767
2768 while (size) {
2769 uint32_t value;
2770
2771 value = RREG32_DIDT(*pos >> 2);
2772 r = put_user(value, (uint32_t *)buf);
2773 if (r)
2774 return r;
2775
2776 result += 4;
2777 buf += 4;
2778 *pos += 4;
2779 size -= 4;
2780 }
2781
2782 return result;
2783}
2784
2785static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user *buf,
2786 size_t size, loff_t *pos)
2787{
45063097 2788 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
2789 ssize_t result = 0;
2790 int r;
2791
2792 if (size & 0x3 || *pos & 0x3)
2793 return -EINVAL;
2794
2795 while (size) {
2796 uint32_t value;
2797
2798 r = get_user(value, (uint32_t *)buf);
2799 if (r)
2800 return r;
2801
2802 WREG32_DIDT(*pos >> 2, value);
2803
2804 result += 4;
2805 buf += 4;
2806 *pos += 4;
2807 size -= 4;
2808 }
2809
2810 return result;
2811}
2812
2813static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,
2814 size_t size, loff_t *pos)
2815{
45063097 2816 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
2817 ssize_t result = 0;
2818 int r;
2819
2820 if (size & 0x3 || *pos & 0x3)
2821 return -EINVAL;
2822
2823 while (size) {
2824 uint32_t value;
2825
6fc0deaf 2826 value = RREG32_SMC(*pos);
adcec288
TSD
2827 r = put_user(value, (uint32_t *)buf);
2828 if (r)
2829 return r;
2830
2831 result += 4;
2832 buf += 4;
2833 *pos += 4;
2834 size -= 4;
2835 }
2836
2837 return result;
2838}
2839
2840static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *buf,
2841 size_t size, loff_t *pos)
2842{
45063097 2843 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
2844 ssize_t result = 0;
2845 int r;
2846
2847 if (size & 0x3 || *pos & 0x3)
2848 return -EINVAL;
2849
2850 while (size) {
2851 uint32_t value;
2852
2853 r = get_user(value, (uint32_t *)buf);
2854 if (r)
2855 return r;
2856
6fc0deaf 2857 WREG32_SMC(*pos, value);
adcec288
TSD
2858
2859 result += 4;
2860 buf += 4;
2861 *pos += 4;
2862 size -= 4;
2863 }
2864
2865 return result;
2866}
2867
1e051413
TSD
2868static ssize_t amdgpu_debugfs_gca_config_read(struct file *f, char __user *buf,
2869 size_t size, loff_t *pos)
2870{
45063097 2871 struct amdgpu_device *adev = file_inode(f)->i_private;
1e051413
TSD
2872 ssize_t result = 0;
2873 int r;
2874 uint32_t *config, no_regs = 0;
2875
2876 if (size & 0x3 || *pos & 0x3)
2877 return -EINVAL;
2878
ecab7668 2879 config = kmalloc_array(256, sizeof(*config), GFP_KERNEL);
1e051413
TSD
2880 if (!config)
2881 return -ENOMEM;
2882
2883 /* version, increment each time something is added */
e9f11dc8 2884 config[no_regs++] = 2;
1e051413
TSD
2885 config[no_regs++] = adev->gfx.config.max_shader_engines;
2886 config[no_regs++] = adev->gfx.config.max_tile_pipes;
2887 config[no_regs++] = adev->gfx.config.max_cu_per_sh;
2888 config[no_regs++] = adev->gfx.config.max_sh_per_se;
2889 config[no_regs++] = adev->gfx.config.max_backends_per_se;
2890 config[no_regs++] = adev->gfx.config.max_texture_channel_caches;
2891 config[no_regs++] = adev->gfx.config.max_gprs;
2892 config[no_regs++] = adev->gfx.config.max_gs_threads;
2893 config[no_regs++] = adev->gfx.config.max_hw_contexts;
2894 config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_frontend;
2895 config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_backend;
2896 config[no_regs++] = adev->gfx.config.sc_hiz_tile_fifo_size;
2897 config[no_regs++] = adev->gfx.config.sc_earlyz_tile_fifo_size;
2898 config[no_regs++] = adev->gfx.config.num_tile_pipes;
2899 config[no_regs++] = adev->gfx.config.backend_enable_mask;
2900 config[no_regs++] = adev->gfx.config.mem_max_burst_length_bytes;
2901 config[no_regs++] = adev->gfx.config.mem_row_size_in_kb;
2902 config[no_regs++] = adev->gfx.config.shader_engine_tile_size;
2903 config[no_regs++] = adev->gfx.config.num_gpus;
2904 config[no_regs++] = adev->gfx.config.multi_gpu_tile_size;
2905 config[no_regs++] = adev->gfx.config.mc_arb_ramcfg;
2906 config[no_regs++] = adev->gfx.config.gb_addr_config;
2907 config[no_regs++] = adev->gfx.config.num_rbs;
2908
89a8f309
TSD
2909 /* rev==1 */
2910 config[no_regs++] = adev->rev_id;
2911 config[no_regs++] = adev->pg_flags;
2912 config[no_regs++] = adev->cg_flags;
2913
e9f11dc8
TSD
2914 /* rev==2 */
2915 config[no_regs++] = adev->family;
2916 config[no_regs++] = adev->external_rev_id;
2917
1e051413
TSD
2918 while (size && (*pos < no_regs * 4)) {
2919 uint32_t value;
2920
2921 value = config[*pos >> 2];
2922 r = put_user(value, (uint32_t *)buf);
2923 if (r) {
2924 kfree(config);
2925 return r;
2926 }
2927
2928 result += 4;
2929 buf += 4;
2930 *pos += 4;
2931 size -= 4;
2932 }
2933
2934 kfree(config);
2935 return result;
2936}
2937
f2cdaf20
TSD
2938static ssize_t amdgpu_debugfs_sensor_read(struct file *f, char __user *buf,
2939 size_t size, loff_t *pos)
2940{
45063097 2941 struct amdgpu_device *adev = file_inode(f)->i_private;
f2cdaf20
TSD
2942 int idx, r;
2943 int32_t value;
2944
2945 if (size != 4 || *pos & 0x3)
2946 return -EINVAL;
2947
2948 /* convert offset to sensor number */
2949 idx = *pos >> 2;
2950
2951 if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->read_sensor)
2952 r = adev->powerplay.pp_funcs->read_sensor(adev->powerplay.pp_handle, idx, &value);
2953 else
2954 return -EINVAL;
2955
2956 if (!r)
2957 r = put_user(value, (int32_t *)buf);
2958
2959 return !r ? 4 : r;
2960}
1e051413 2961
273d7aa1
TSD
2962static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf,
2963 size_t size, loff_t *pos)
2964{
2965 struct amdgpu_device *adev = f->f_inode->i_private;
2966 int r, x;
2967 ssize_t result=0;
472259f0 2968 uint32_t offset, se, sh, cu, wave, simd, data[32];
273d7aa1
TSD
2969
2970 if (size & 3 || *pos & 3)
2971 return -EINVAL;
2972
2973 /* decode offset */
2974 offset = (*pos & 0x7F);
2975 se = ((*pos >> 7) & 0xFF);
2976 sh = ((*pos >> 15) & 0xFF);
2977 cu = ((*pos >> 23) & 0xFF);
2978 wave = ((*pos >> 31) & 0xFF);
2979 simd = ((*pos >> 37) & 0xFF);
273d7aa1
TSD
2980
2981 /* switch to the specific se/sh/cu */
2982 mutex_lock(&adev->grbm_idx_mutex);
2983 amdgpu_gfx_select_se_sh(adev, se, sh, cu);
2984
2985 x = 0;
472259f0
TSD
2986 if (adev->gfx.funcs->read_wave_data)
2987 adev->gfx.funcs->read_wave_data(adev, simd, wave, data, &x);
273d7aa1
TSD
2988
2989 amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
2990 mutex_unlock(&adev->grbm_idx_mutex);
2991
5ecfb3b8
TSD
2992 if (!x)
2993 return -EINVAL;
2994
472259f0 2995 while (size && (offset < x * 4)) {
273d7aa1
TSD
2996 uint32_t value;
2997
472259f0 2998 value = data[offset >> 2];
273d7aa1
TSD
2999 r = put_user(value, (uint32_t *)buf);
3000 if (r)
3001 return r;
3002
3003 result += 4;
3004 buf += 4;
472259f0 3005 offset += 4;
273d7aa1
TSD
3006 size -= 4;
3007 }
3008
3009 return result;
3010}
3011
c5a60ce8
TSD
3012static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,
3013 size_t size, loff_t *pos)
3014{
3015 struct amdgpu_device *adev = f->f_inode->i_private;
3016 int r;
3017 ssize_t result = 0;
3018 uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data;
3019
3020 if (size & 3 || *pos & 3)
3021 return -EINVAL;
3022
3023 /* decode offset */
3024 offset = (*pos & 0xFFF); /* in dwords */
3025 se = ((*pos >> 12) & 0xFF);
3026 sh = ((*pos >> 20) & 0xFF);
3027 cu = ((*pos >> 28) & 0xFF);
3028 wave = ((*pos >> 36) & 0xFF);
3029 simd = ((*pos >> 44) & 0xFF);
3030 thread = ((*pos >> 52) & 0xFF);
3031 bank = ((*pos >> 60) & 1);
3032
3033 data = kmalloc_array(1024, sizeof(*data), GFP_KERNEL);
3034 if (!data)
3035 return -ENOMEM;
3036
3037 /* switch to the specific se/sh/cu */
3038 mutex_lock(&adev->grbm_idx_mutex);
3039 amdgpu_gfx_select_se_sh(adev, se, sh, cu);
3040
3041 if (bank == 0) {
3042 if (adev->gfx.funcs->read_wave_vgprs)
3043 adev->gfx.funcs->read_wave_vgprs(adev, simd, wave, thread, offset, size>>2, data);
3044 } else {
3045 if (adev->gfx.funcs->read_wave_sgprs)
3046 adev->gfx.funcs->read_wave_sgprs(adev, simd, wave, offset, size>>2, data);
3047 }
3048
3049 amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
3050 mutex_unlock(&adev->grbm_idx_mutex);
3051
3052 while (size) {
3053 uint32_t value;
3054
3055 value = data[offset++];
3056 r = put_user(value, (uint32_t *)buf);
3057 if (r) {
3058 result = r;
3059 goto err;
3060 }
3061
3062 result += 4;
3063 buf += 4;
3064 size -= 4;
3065 }
3066
3067err:
3068 kfree(data);
3069 return result;
3070}
3071
d38ceaf9
AD
3072static const struct file_operations amdgpu_debugfs_regs_fops = {
3073 .owner = THIS_MODULE,
3074 .read = amdgpu_debugfs_regs_read,
3075 .write = amdgpu_debugfs_regs_write,
3076 .llseek = default_llseek
3077};
adcec288
TSD
3078static const struct file_operations amdgpu_debugfs_regs_didt_fops = {
3079 .owner = THIS_MODULE,
3080 .read = amdgpu_debugfs_regs_didt_read,
3081 .write = amdgpu_debugfs_regs_didt_write,
3082 .llseek = default_llseek
3083};
3084static const struct file_operations amdgpu_debugfs_regs_pcie_fops = {
3085 .owner = THIS_MODULE,
3086 .read = amdgpu_debugfs_regs_pcie_read,
3087 .write = amdgpu_debugfs_regs_pcie_write,
3088 .llseek = default_llseek
3089};
3090static const struct file_operations amdgpu_debugfs_regs_smc_fops = {
3091 .owner = THIS_MODULE,
3092 .read = amdgpu_debugfs_regs_smc_read,
3093 .write = amdgpu_debugfs_regs_smc_write,
3094 .llseek = default_llseek
3095};
3096
1e051413
TSD
3097static const struct file_operations amdgpu_debugfs_gca_config_fops = {
3098 .owner = THIS_MODULE,
3099 .read = amdgpu_debugfs_gca_config_read,
3100 .llseek = default_llseek
3101};
3102
f2cdaf20
TSD
3103static const struct file_operations amdgpu_debugfs_sensors_fops = {
3104 .owner = THIS_MODULE,
3105 .read = amdgpu_debugfs_sensor_read,
3106 .llseek = default_llseek
3107};
3108
273d7aa1
TSD
3109static const struct file_operations amdgpu_debugfs_wave_fops = {
3110 .owner = THIS_MODULE,
3111 .read = amdgpu_debugfs_wave_read,
3112 .llseek = default_llseek
3113};
c5a60ce8
TSD
3114static const struct file_operations amdgpu_debugfs_gpr_fops = {
3115 .owner = THIS_MODULE,
3116 .read = amdgpu_debugfs_gpr_read,
3117 .llseek = default_llseek
3118};
273d7aa1 3119
adcec288
TSD
3120static const struct file_operations *debugfs_regs[] = {
3121 &amdgpu_debugfs_regs_fops,
3122 &amdgpu_debugfs_regs_didt_fops,
3123 &amdgpu_debugfs_regs_pcie_fops,
3124 &amdgpu_debugfs_regs_smc_fops,
1e051413 3125 &amdgpu_debugfs_gca_config_fops,
f2cdaf20 3126 &amdgpu_debugfs_sensors_fops,
273d7aa1 3127 &amdgpu_debugfs_wave_fops,
c5a60ce8 3128 &amdgpu_debugfs_gpr_fops,
adcec288
TSD
3129};
3130
3131static const char *debugfs_regs_names[] = {
3132 "amdgpu_regs",
3133 "amdgpu_regs_didt",
3134 "amdgpu_regs_pcie",
3135 "amdgpu_regs_smc",
1e051413 3136 "amdgpu_gca_config",
f2cdaf20 3137 "amdgpu_sensors",
273d7aa1 3138 "amdgpu_wave",
c5a60ce8 3139 "amdgpu_gpr",
adcec288 3140};
d38ceaf9
AD
3141
3142static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
3143{
3144 struct drm_minor *minor = adev->ddev->primary;
3145 struct dentry *ent, *root = minor->debugfs_root;
adcec288
TSD
3146 unsigned i, j;
3147
3148 for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
3149 ent = debugfs_create_file(debugfs_regs_names[i],
3150 S_IFREG | S_IRUGO, root,
3151 adev, debugfs_regs[i]);
3152 if (IS_ERR(ent)) {
3153 for (j = 0; j < i; j++) {
3154 debugfs_remove(adev->debugfs_regs[i]);
3155 adev->debugfs_regs[i] = NULL;
3156 }
3157 return PTR_ERR(ent);
3158 }
d38ceaf9 3159
adcec288
TSD
3160 if (!i)
3161 i_size_write(ent->d_inode, adev->rmmio_size);
3162 adev->debugfs_regs[i] = ent;
3163 }
d38ceaf9
AD
3164
3165 return 0;
3166}
3167
3168static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev)
3169{
adcec288
TSD
3170 unsigned i;
3171
3172 for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
3173 if (adev->debugfs_regs[i]) {
3174 debugfs_remove(adev->debugfs_regs[i]);
3175 adev->debugfs_regs[i] = NULL;
3176 }
3177 }
d38ceaf9
AD
3178}
3179
3180int amdgpu_debugfs_init(struct drm_minor *minor)
3181{
3182 return 0;
3183}
3184
3185void amdgpu_debugfs_cleanup(struct drm_minor *minor)
3186{
3187}
7cebc728
AK
3188#else
3189static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
3190{
3191 return 0;
3192}
3193static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev) { }
d38ceaf9 3194#endif