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