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