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