drm/amdgpu: add alloc/free for multi level PDs V2
[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>
d1aff8ec 56#include "amdgpu_pm.h"
d38ceaf9
AD
57
58static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev);
59static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev);
60
61static const char *amdgpu_asic_name[] = {
da69c161
KW
62 "TAHITI",
63 "PITCAIRN",
64 "VERDE",
65 "OLAND",
66 "HAINAN",
d38ceaf9
AD
67 "BONAIRE",
68 "KAVERI",
69 "KABINI",
70 "HAWAII",
71 "MULLINS",
72 "TOPAZ",
73 "TONGA",
48299f95 74 "FIJI",
d38ceaf9 75 "CARRIZO",
139f4917 76 "STONEY",
2cc0c0b5
FC
77 "POLARIS10",
78 "POLARIS11",
c4642a47 79 "POLARIS12",
d4196f01 80 "VEGA10",
d38ceaf9
AD
81 "LAST",
82};
83
84bool amdgpu_device_is_px(struct drm_device *dev)
85{
86 struct amdgpu_device *adev = dev->dev_private;
87
2f7d10b3 88 if (adev->flags & AMD_IS_PX)
d38ceaf9
AD
89 return true;
90 return false;
91}
92
93/*
94 * MMIO register access helper functions.
95 */
96uint32_t amdgpu_mm_rreg(struct amdgpu_device *adev, uint32_t reg,
15d72fd7 97 uint32_t acc_flags)
d38ceaf9 98{
f4b373f4
TSD
99 uint32_t ret;
100
15d72fd7 101 if (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev)) {
bc992ba5
XY
102 BUG_ON(in_interrupt());
103 return amdgpu_virt_kiq_rreg(adev, reg);
104 }
105
15d72fd7 106 if ((reg * 4) < adev->rmmio_size && !(acc_flags & AMDGPU_REGS_IDX))
f4b373f4 107 ret = readl(((void __iomem *)adev->rmmio) + (reg * 4));
d38ceaf9
AD
108 else {
109 unsigned long flags;
d38ceaf9
AD
110
111 spin_lock_irqsave(&adev->mmio_idx_lock, flags);
112 writel((reg * 4), ((void __iomem *)adev->rmmio) + (mmMM_INDEX * 4));
113 ret = readl(((void __iomem *)adev->rmmio) + (mmMM_DATA * 4));
114 spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
d38ceaf9 115 }
f4b373f4
TSD
116 trace_amdgpu_mm_rreg(adev->pdev->device, reg, ret);
117 return ret;
d38ceaf9
AD
118}
119
120void amdgpu_mm_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v,
15d72fd7 121 uint32_t acc_flags)
d38ceaf9 122{
f4b373f4 123 trace_amdgpu_mm_wreg(adev->pdev->device, reg, v);
4e99a44e 124
15d72fd7 125 if (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev)) {
bc992ba5
XY
126 BUG_ON(in_interrupt());
127 return amdgpu_virt_kiq_wreg(adev, reg, v);
128 }
129
15d72fd7 130 if ((reg * 4) < adev->rmmio_size && !(acc_flags & AMDGPU_REGS_IDX))
d38ceaf9
AD
131 writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
132 else {
133 unsigned long flags;
134
135 spin_lock_irqsave(&adev->mmio_idx_lock, flags);
136 writel((reg * 4), ((void __iomem *)adev->rmmio) + (mmMM_INDEX * 4));
137 writel(v, ((void __iomem *)adev->rmmio) + (mmMM_DATA * 4));
138 spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
139 }
140}
141
142u32 amdgpu_io_rreg(struct amdgpu_device *adev, u32 reg)
143{
144 if ((reg * 4) < adev->rio_mem_size)
145 return ioread32(adev->rio_mem + (reg * 4));
146 else {
147 iowrite32((reg * 4), adev->rio_mem + (mmMM_INDEX * 4));
148 return ioread32(adev->rio_mem + (mmMM_DATA * 4));
149 }
150}
151
152void amdgpu_io_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
153{
154
155 if ((reg * 4) < adev->rio_mem_size)
156 iowrite32(v, adev->rio_mem + (reg * 4));
157 else {
158 iowrite32((reg * 4), adev->rio_mem + (mmMM_INDEX * 4));
159 iowrite32(v, adev->rio_mem + (mmMM_DATA * 4));
160 }
161}
162
163/**
164 * amdgpu_mm_rdoorbell - read a doorbell dword
165 *
166 * @adev: amdgpu_device pointer
167 * @index: doorbell index
168 *
169 * Returns the value in the doorbell aperture at the
170 * requested doorbell index (CIK).
171 */
172u32 amdgpu_mm_rdoorbell(struct amdgpu_device *adev, u32 index)
173{
174 if (index < adev->doorbell.num_doorbells) {
175 return readl(adev->doorbell.ptr + index);
176 } else {
177 DRM_ERROR("reading beyond doorbell aperture: 0x%08x!\n", index);
178 return 0;
179 }
180}
181
182/**
183 * amdgpu_mm_wdoorbell - write a doorbell dword
184 *
185 * @adev: amdgpu_device pointer
186 * @index: doorbell index
187 * @v: value to write
188 *
189 * Writes @v to the doorbell aperture at the
190 * requested doorbell index (CIK).
191 */
192void amdgpu_mm_wdoorbell(struct amdgpu_device *adev, u32 index, u32 v)
193{
194 if (index < adev->doorbell.num_doorbells) {
195 writel(v, adev->doorbell.ptr + index);
196 } else {
197 DRM_ERROR("writing beyond doorbell aperture: 0x%08x!\n", index);
198 }
199}
200
832be404
KW
201/**
202 * amdgpu_mm_rdoorbell64 - read a doorbell Qword
203 *
204 * @adev: amdgpu_device pointer
205 * @index: doorbell index
206 *
207 * Returns the value in the doorbell aperture at the
208 * requested doorbell index (VEGA10+).
209 */
210u64 amdgpu_mm_rdoorbell64(struct amdgpu_device *adev, u32 index)
211{
212 if (index < adev->doorbell.num_doorbells) {
213 return atomic64_read((atomic64_t *)(adev->doorbell.ptr + index));
214 } else {
215 DRM_ERROR("reading beyond doorbell aperture: 0x%08x!\n", index);
216 return 0;
217 }
218}
219
220/**
221 * amdgpu_mm_wdoorbell64 - write a doorbell Qword
222 *
223 * @adev: amdgpu_device pointer
224 * @index: doorbell index
225 * @v: value to write
226 *
227 * Writes @v to the doorbell aperture at the
228 * requested doorbell index (VEGA10+).
229 */
230void amdgpu_mm_wdoorbell64(struct amdgpu_device *adev, u32 index, u64 v)
231{
232 if (index < adev->doorbell.num_doorbells) {
233 atomic64_set((atomic64_t *)(adev->doorbell.ptr + index), v);
234 } else {
235 DRM_ERROR("writing beyond doorbell aperture: 0x%08x!\n", index);
236 }
237}
238
d38ceaf9
AD
239/**
240 * amdgpu_invalid_rreg - dummy reg read function
241 *
242 * @adev: amdgpu device pointer
243 * @reg: offset of register
244 *
245 * Dummy register read function. Used for register blocks
246 * that certain asics don't have (all asics).
247 * Returns the value in the register.
248 */
249static uint32_t amdgpu_invalid_rreg(struct amdgpu_device *adev, uint32_t reg)
250{
251 DRM_ERROR("Invalid callback to read register 0x%04X\n", reg);
252 BUG();
253 return 0;
254}
255
256/**
257 * amdgpu_invalid_wreg - dummy reg write function
258 *
259 * @adev: amdgpu device pointer
260 * @reg: offset of register
261 * @v: value to write to the register
262 *
263 * Dummy register read function. Used for register blocks
264 * that certain asics don't have (all asics).
265 */
266static void amdgpu_invalid_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v)
267{
268 DRM_ERROR("Invalid callback to write register 0x%04X with 0x%08X\n",
269 reg, v);
270 BUG();
271}
272
273/**
274 * amdgpu_block_invalid_rreg - dummy reg read function
275 *
276 * @adev: amdgpu device pointer
277 * @block: offset of instance
278 * @reg: offset of register
279 *
280 * Dummy register read function. Used for register blocks
281 * that certain asics don't have (all asics).
282 * Returns the value in the register.
283 */
284static uint32_t amdgpu_block_invalid_rreg(struct amdgpu_device *adev,
285 uint32_t block, uint32_t reg)
286{
287 DRM_ERROR("Invalid callback to read register 0x%04X in block 0x%04X\n",
288 reg, block);
289 BUG();
290 return 0;
291}
292
293/**
294 * amdgpu_block_invalid_wreg - dummy reg write function
295 *
296 * @adev: amdgpu device pointer
297 * @block: offset of instance
298 * @reg: offset of register
299 * @v: value to write to the register
300 *
301 * Dummy register read function. Used for register blocks
302 * that certain asics don't have (all asics).
303 */
304static void amdgpu_block_invalid_wreg(struct amdgpu_device *adev,
305 uint32_t block,
306 uint32_t reg, uint32_t v)
307{
308 DRM_ERROR("Invalid block callback to write register 0x%04X in block 0x%04X with 0x%08X\n",
309 reg, block, v);
310 BUG();
311}
312
313static int amdgpu_vram_scratch_init(struct amdgpu_device *adev)
314{
315 int r;
316
317 if (adev->vram_scratch.robj == NULL) {
318 r = amdgpu_bo_create(adev, AMDGPU_GPU_PAGE_SIZE,
857d913d 319 PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM,
03f48dd5
CK
320 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
321 AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS,
72d7668b 322 NULL, NULL, &adev->vram_scratch.robj);
d38ceaf9
AD
323 if (r) {
324 return r;
325 }
326 }
327
328 r = amdgpu_bo_reserve(adev->vram_scratch.robj, false);
329 if (unlikely(r != 0))
330 return r;
331 r = amdgpu_bo_pin(adev->vram_scratch.robj,
332 AMDGPU_GEM_DOMAIN_VRAM, &adev->vram_scratch.gpu_addr);
333 if (r) {
334 amdgpu_bo_unreserve(adev->vram_scratch.robj);
335 return r;
336 }
337 r = amdgpu_bo_kmap(adev->vram_scratch.robj,
338 (void **)&adev->vram_scratch.ptr);
339 if (r)
340 amdgpu_bo_unpin(adev->vram_scratch.robj);
341 amdgpu_bo_unreserve(adev->vram_scratch.robj);
342
343 return r;
344}
345
346static void amdgpu_vram_scratch_fini(struct amdgpu_device *adev)
347{
348 int r;
349
350 if (adev->vram_scratch.robj == NULL) {
351 return;
352 }
353 r = amdgpu_bo_reserve(adev->vram_scratch.robj, false);
354 if (likely(r == 0)) {
355 amdgpu_bo_kunmap(adev->vram_scratch.robj);
356 amdgpu_bo_unpin(adev->vram_scratch.robj);
357 amdgpu_bo_unreserve(adev->vram_scratch.robj);
358 }
359 amdgpu_bo_unref(&adev->vram_scratch.robj);
360}
361
362/**
363 * amdgpu_program_register_sequence - program an array of registers.
364 *
365 * @adev: amdgpu_device pointer
366 * @registers: pointer to the register array
367 * @array_size: size of the register array
368 *
369 * Programs an array or registers with and and or masks.
370 * This is a helper for setting golden registers.
371 */
372void amdgpu_program_register_sequence(struct amdgpu_device *adev,
373 const u32 *registers,
374 const u32 array_size)
375{
376 u32 tmp, reg, and_mask, or_mask;
377 int i;
378
379 if (array_size % 3)
380 return;
381
382 for (i = 0; i < array_size; i +=3) {
383 reg = registers[i + 0];
384 and_mask = registers[i + 1];
385 or_mask = registers[i + 2];
386
387 if (and_mask == 0xffffffff) {
388 tmp = or_mask;
389 } else {
390 tmp = RREG32(reg);
391 tmp &= ~and_mask;
392 tmp |= or_mask;
393 }
394 WREG32(reg, tmp);
395 }
396}
397
398void amdgpu_pci_config_reset(struct amdgpu_device *adev)
399{
400 pci_write_config_dword(adev->pdev, 0x7c, AMDGPU_ASIC_RESET_DATA);
401}
402
403/*
404 * GPU doorbell aperture helpers function.
405 */
406/**
407 * amdgpu_doorbell_init - Init doorbell driver information.
408 *
409 * @adev: amdgpu_device pointer
410 *
411 * Init doorbell driver information (CIK)
412 * Returns 0 on success, error on failure.
413 */
414static int amdgpu_doorbell_init(struct amdgpu_device *adev)
415{
416 /* doorbell bar mapping */
417 adev->doorbell.base = pci_resource_start(adev->pdev, 2);
418 adev->doorbell.size = pci_resource_len(adev->pdev, 2);
419
edf600da 420 adev->doorbell.num_doorbells = min_t(u32, adev->doorbell.size / sizeof(u32),
d38ceaf9
AD
421 AMDGPU_DOORBELL_MAX_ASSIGNMENT+1);
422 if (adev->doorbell.num_doorbells == 0)
423 return -EINVAL;
424
425 adev->doorbell.ptr = ioremap(adev->doorbell.base, adev->doorbell.num_doorbells * sizeof(u32));
426 if (adev->doorbell.ptr == NULL) {
427 return -ENOMEM;
428 }
429 DRM_INFO("doorbell mmio base: 0x%08X\n", (uint32_t)adev->doorbell.base);
430 DRM_INFO("doorbell mmio size: %u\n", (unsigned)adev->doorbell.size);
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
AD
721
722 if (reg)
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
1043/**
1044 * amdgpu_check_arguments - validate module params
1045 *
1046 * @adev: amdgpu_device pointer
1047 *
1048 * Validates certain module parameters and updates
1049 * the associated values used by the driver (all asics).
1050 */
1051static void amdgpu_check_arguments(struct amdgpu_device *adev)
1052{
5b011235
CZ
1053 if (amdgpu_sched_jobs < 4) {
1054 dev_warn(adev->dev, "sched jobs (%d) must be at least 4\n",
1055 amdgpu_sched_jobs);
1056 amdgpu_sched_jobs = 4;
1057 } else if (!amdgpu_check_pot_argument(amdgpu_sched_jobs)){
1058 dev_warn(adev->dev, "sched jobs (%d) must be a power of 2\n",
1059 amdgpu_sched_jobs);
1060 amdgpu_sched_jobs = roundup_pow_of_two(amdgpu_sched_jobs);
1061 }
d38ceaf9
AD
1062
1063 if (amdgpu_gart_size != -1) {
c4e1a13a 1064 /* gtt size must be greater or equal to 32M */
d38ceaf9
AD
1065 if (amdgpu_gart_size < 32) {
1066 dev_warn(adev->dev, "gart size (%d) too small\n",
1067 amdgpu_gart_size);
1068 amdgpu_gart_size = -1;
d38ceaf9
AD
1069 }
1070 }
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);
8dacc127 1075 amdgpu_vm_size = 8;
d38ceaf9
AD
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);
8dacc127 1081 amdgpu_vm_size = 8;
d38ceaf9
AD
1082 }
1083
1084 /*
1085 * Max GPUVM size for Cayman, SI and CI 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);
8dacc127 1090 amdgpu_vm_size = 8;
d38ceaf9
AD
1091 }
1092
1093 /* defines number of bits in page table versus page directory,
1094 * a page is 4KB so we have 12 bits offset, minimum 9 bits in the
1095 * page table and the remaining bits are in the page directory */
1096 if (amdgpu_vm_block_size == -1) {
1097
1098 /* Total bits covered by PD + PTs */
1099 unsigned bits = ilog2(amdgpu_vm_size) + 18;
1100
1101 /* Make sure the PD is 4K in size up to 8GB address space.
1102 Above that split equal between PD and PTs */
1103 if (amdgpu_vm_size <= 8)
1104 amdgpu_vm_block_size = bits - 9;
1105 else
1106 amdgpu_vm_block_size = (bits + 3) / 2;
1107
1108 } else if (amdgpu_vm_block_size < 9) {
1109 dev_warn(adev->dev, "VM page table size (%d) too small\n",
1110 amdgpu_vm_block_size);
1111 amdgpu_vm_block_size = 9;
1112 }
1113
1114 if (amdgpu_vm_block_size > 24 ||
1115 (amdgpu_vm_size * 1024) < (1ull << amdgpu_vm_block_size)) {
1116 dev_warn(adev->dev, "VM page table size (%d) too large\n",
1117 amdgpu_vm_block_size);
1118 amdgpu_vm_block_size = 9;
1119 }
6a7f76e7 1120
526bae37 1121 if (amdgpu_vram_page_split != -1 && (amdgpu_vram_page_split < 16 ||
1122 !amdgpu_check_pot_argument(amdgpu_vram_page_split))) {
6a7f76e7
CK
1123 dev_warn(adev->dev, "invalid VRAM page split (%d)\n",
1124 amdgpu_vram_page_split);
1125 amdgpu_vram_page_split = 1024;
1126 }
d38ceaf9
AD
1127}
1128
1129/**
1130 * amdgpu_switcheroo_set_state - set switcheroo state
1131 *
1132 * @pdev: pci dev pointer
1694467b 1133 * @state: vga_switcheroo state
d38ceaf9
AD
1134 *
1135 * Callback for the switcheroo driver. Suspends or resumes the
1136 * the asics before or after it is powered up using ACPI methods.
1137 */
1138static void amdgpu_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state)
1139{
1140 struct drm_device *dev = pci_get_drvdata(pdev);
1141
1142 if (amdgpu_device_is_px(dev) && state == VGA_SWITCHEROO_OFF)
1143 return;
1144
1145 if (state == VGA_SWITCHEROO_ON) {
1146 unsigned d3_delay = dev->pdev->d3_delay;
1147
7ca85295 1148 pr_info("amdgpu: switched on\n");
d38ceaf9
AD
1149 /* don't suspend or resume card normally */
1150 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
1151
810ddc3a 1152 amdgpu_device_resume(dev, true, true);
d38ceaf9
AD
1153
1154 dev->pdev->d3_delay = d3_delay;
1155
1156 dev->switch_power_state = DRM_SWITCH_POWER_ON;
1157 drm_kms_helper_poll_enable(dev);
1158 } else {
7ca85295 1159 pr_info("amdgpu: switched off\n");
d38ceaf9
AD
1160 drm_kms_helper_poll_disable(dev);
1161 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
810ddc3a 1162 amdgpu_device_suspend(dev, true, true);
d38ceaf9
AD
1163 dev->switch_power_state = DRM_SWITCH_POWER_OFF;
1164 }
1165}
1166
1167/**
1168 * amdgpu_switcheroo_can_switch - see if switcheroo state can change
1169 *
1170 * @pdev: pci dev pointer
1171 *
1172 * Callback for the switcheroo driver. Check of the switcheroo
1173 * state can be changed.
1174 * Returns true if the state can be changed, false if not.
1175 */
1176static bool amdgpu_switcheroo_can_switch(struct pci_dev *pdev)
1177{
1178 struct drm_device *dev = pci_get_drvdata(pdev);
1179
1180 /*
1181 * FIXME: open_count is protected by drm_global_mutex but that would lead to
1182 * locking inversion with the driver load path. And the access here is
1183 * completely racy anyway. So don't bother with locking for now.
1184 */
1185 return dev->open_count == 0;
1186}
1187
1188static const struct vga_switcheroo_client_ops amdgpu_switcheroo_ops = {
1189 .set_gpu_state = amdgpu_switcheroo_set_state,
1190 .reprobe = NULL,
1191 .can_switch = amdgpu_switcheroo_can_switch,
1192};
1193
1194int amdgpu_set_clockgating_state(struct amdgpu_device *adev,
5fc3aeeb 1195 enum amd_ip_block_type block_type,
1196 enum amd_clockgating_state state)
d38ceaf9
AD
1197{
1198 int i, r = 0;
1199
1200 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1201 if (!adev->ip_blocks[i].status.valid)
9ecbe7f5 1202 continue;
c722865a
RZ
1203 if (adev->ip_blocks[i].version->type != block_type)
1204 continue;
1205 if (!adev->ip_blocks[i].version->funcs->set_clockgating_state)
1206 continue;
1207 r = adev->ip_blocks[i].version->funcs->set_clockgating_state(
1208 (void *)adev, state);
1209 if (r)
1210 DRM_ERROR("set_clockgating_state of IP block <%s> failed %d\n",
1211 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9
AD
1212 }
1213 return r;
1214}
1215
1216int amdgpu_set_powergating_state(struct amdgpu_device *adev,
5fc3aeeb 1217 enum amd_ip_block_type block_type,
1218 enum amd_powergating_state state)
d38ceaf9
AD
1219{
1220 int i, r = 0;
1221
1222 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1223 if (!adev->ip_blocks[i].status.valid)
9ecbe7f5 1224 continue;
c722865a
RZ
1225 if (adev->ip_blocks[i].version->type != block_type)
1226 continue;
1227 if (!adev->ip_blocks[i].version->funcs->set_powergating_state)
1228 continue;
1229 r = adev->ip_blocks[i].version->funcs->set_powergating_state(
1230 (void *)adev, state);
1231 if (r)
1232 DRM_ERROR("set_powergating_state of IP block <%s> failed %d\n",
1233 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9
AD
1234 }
1235 return r;
1236}
1237
6cb2d4e4
HR
1238void amdgpu_get_clockgating_state(struct amdgpu_device *adev, u32 *flags)
1239{
1240 int i;
1241
1242 for (i = 0; i < adev->num_ip_blocks; i++) {
1243 if (!adev->ip_blocks[i].status.valid)
1244 continue;
1245 if (adev->ip_blocks[i].version->funcs->get_clockgating_state)
1246 adev->ip_blocks[i].version->funcs->get_clockgating_state((void *)adev, flags);
1247 }
1248}
1249
5dbbb60b
AD
1250int amdgpu_wait_for_idle(struct amdgpu_device *adev,
1251 enum amd_ip_block_type block_type)
1252{
1253 int i, r;
1254
1255 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1256 if (!adev->ip_blocks[i].status.valid)
9ecbe7f5 1257 continue;
a1255107
AD
1258 if (adev->ip_blocks[i].version->type == block_type) {
1259 r = adev->ip_blocks[i].version->funcs->wait_for_idle((void *)adev);
5dbbb60b
AD
1260 if (r)
1261 return r;
1262 break;
1263 }
1264 }
1265 return 0;
1266
1267}
1268
1269bool amdgpu_is_idle(struct amdgpu_device *adev,
1270 enum amd_ip_block_type block_type)
1271{
1272 int i;
1273
1274 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1275 if (!adev->ip_blocks[i].status.valid)
9ecbe7f5 1276 continue;
a1255107
AD
1277 if (adev->ip_blocks[i].version->type == block_type)
1278 return adev->ip_blocks[i].version->funcs->is_idle((void *)adev);
5dbbb60b
AD
1279 }
1280 return true;
1281
1282}
1283
a1255107
AD
1284struct amdgpu_ip_block * amdgpu_get_ip_block(struct amdgpu_device *adev,
1285 enum amd_ip_block_type type)
d38ceaf9
AD
1286{
1287 int i;
1288
1289 for (i = 0; i < adev->num_ip_blocks; i++)
a1255107 1290 if (adev->ip_blocks[i].version->type == type)
d38ceaf9
AD
1291 return &adev->ip_blocks[i];
1292
1293 return NULL;
1294}
1295
1296/**
1297 * amdgpu_ip_block_version_cmp
1298 *
1299 * @adev: amdgpu_device pointer
5fc3aeeb 1300 * @type: enum amd_ip_block_type
d38ceaf9
AD
1301 * @major: major version
1302 * @minor: minor version
1303 *
1304 * return 0 if equal or greater
1305 * return 1 if smaller or the ip_block doesn't exist
1306 */
1307int amdgpu_ip_block_version_cmp(struct amdgpu_device *adev,
5fc3aeeb 1308 enum amd_ip_block_type type,
d38ceaf9
AD
1309 u32 major, u32 minor)
1310{
a1255107 1311 struct amdgpu_ip_block *ip_block = amdgpu_get_ip_block(adev, type);
d38ceaf9 1312
a1255107
AD
1313 if (ip_block && ((ip_block->version->major > major) ||
1314 ((ip_block->version->major == major) &&
1315 (ip_block->version->minor >= minor))))
d38ceaf9
AD
1316 return 0;
1317
1318 return 1;
1319}
1320
a1255107
AD
1321/**
1322 * amdgpu_ip_block_add
1323 *
1324 * @adev: amdgpu_device pointer
1325 * @ip_block_version: pointer to the IP to add
1326 *
1327 * Adds the IP block driver information to the collection of IPs
1328 * on the asic.
1329 */
1330int amdgpu_ip_block_add(struct amdgpu_device *adev,
1331 const struct amdgpu_ip_block_version *ip_block_version)
1332{
1333 if (!ip_block_version)
1334 return -EINVAL;
1335
1336 adev->ip_blocks[adev->num_ip_blocks++].version = ip_block_version;
1337
1338 return 0;
1339}
1340
483ef985 1341static void amdgpu_device_enable_virtual_display(struct amdgpu_device *adev)
9accf2fd
ED
1342{
1343 adev->enable_virtual_display = false;
1344
1345 if (amdgpu_virtual_display) {
1346 struct drm_device *ddev = adev->ddev;
1347 const char *pci_address_name = pci_name(ddev->pdev);
0f66356d 1348 char *pciaddstr, *pciaddstr_tmp, *pciaddname_tmp, *pciaddname;
9accf2fd
ED
1349
1350 pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL);
1351 pciaddstr_tmp = pciaddstr;
0f66356d
ED
1352 while ((pciaddname_tmp = strsep(&pciaddstr_tmp, ";"))) {
1353 pciaddname = strsep(&pciaddname_tmp, ",");
967de2a9
YT
1354 if (!strcmp("all", pciaddname)
1355 || !strcmp(pci_address_name, pciaddname)) {
0f66356d
ED
1356 long num_crtc;
1357 int res = -1;
1358
9accf2fd 1359 adev->enable_virtual_display = true;
0f66356d
ED
1360
1361 if (pciaddname_tmp)
1362 res = kstrtol(pciaddname_tmp, 10,
1363 &num_crtc);
1364
1365 if (!res) {
1366 if (num_crtc < 1)
1367 num_crtc = 1;
1368 if (num_crtc > 6)
1369 num_crtc = 6;
1370 adev->mode_info.num_crtc = num_crtc;
1371 } else {
1372 adev->mode_info.num_crtc = 1;
1373 }
9accf2fd
ED
1374 break;
1375 }
1376 }
1377
0f66356d
ED
1378 DRM_INFO("virtual display string:%s, %s:virtual_display:%d, num_crtc:%d\n",
1379 amdgpu_virtual_display, pci_address_name,
1380 adev->enable_virtual_display, adev->mode_info.num_crtc);
9accf2fd
ED
1381
1382 kfree(pciaddstr);
1383 }
1384}
1385
d38ceaf9
AD
1386static int amdgpu_early_init(struct amdgpu_device *adev)
1387{
aaa36a97 1388 int i, r;
d38ceaf9 1389
483ef985 1390 amdgpu_device_enable_virtual_display(adev);
a6be7570 1391
d38ceaf9 1392 switch (adev->asic_type) {
aaa36a97
AD
1393 case CHIP_TOPAZ:
1394 case CHIP_TONGA:
48299f95 1395 case CHIP_FIJI:
2cc0c0b5
FC
1396 case CHIP_POLARIS11:
1397 case CHIP_POLARIS10:
c4642a47 1398 case CHIP_POLARIS12:
aaa36a97 1399 case CHIP_CARRIZO:
39bb0c92
SL
1400 case CHIP_STONEY:
1401 if (adev->asic_type == CHIP_CARRIZO || adev->asic_type == CHIP_STONEY)
aaa36a97
AD
1402 adev->family = AMDGPU_FAMILY_CZ;
1403 else
1404 adev->family = AMDGPU_FAMILY_VI;
1405
1406 r = vi_set_ip_blocks(adev);
1407 if (r)
1408 return r;
1409 break;
33f34802
KW
1410#ifdef CONFIG_DRM_AMDGPU_SI
1411 case CHIP_VERDE:
1412 case CHIP_TAHITI:
1413 case CHIP_PITCAIRN:
1414 case CHIP_OLAND:
1415 case CHIP_HAINAN:
295d0daf 1416 adev->family = AMDGPU_FAMILY_SI;
33f34802
KW
1417 r = si_set_ip_blocks(adev);
1418 if (r)
1419 return r;
1420 break;
1421#endif
a2e73f56
AD
1422#ifdef CONFIG_DRM_AMDGPU_CIK
1423 case CHIP_BONAIRE:
1424 case CHIP_HAWAII:
1425 case CHIP_KAVERI:
1426 case CHIP_KABINI:
1427 case CHIP_MULLINS:
1428 if ((adev->asic_type == CHIP_BONAIRE) || (adev->asic_type == CHIP_HAWAII))
1429 adev->family = AMDGPU_FAMILY_CI;
1430 else
1431 adev->family = AMDGPU_FAMILY_KV;
1432
1433 r = cik_set_ip_blocks(adev);
1434 if (r)
1435 return r;
1436 break;
1437#endif
460826e6
KW
1438 case CHIP_VEGA10:
1439 adev->family = AMDGPU_FAMILY_AI;
1440
1441 r = soc15_set_ip_blocks(adev);
1442 if (r)
1443 return r;
1444 break;
d38ceaf9
AD
1445 default:
1446 /* FIXME: not supported yet */
1447 return -EINVAL;
1448 }
1449
3149d9da
XY
1450 if (amdgpu_sriov_vf(adev)) {
1451 r = amdgpu_virt_request_full_gpu(adev, true);
1452 if (r)
1453 return r;
1454 }
1455
d38ceaf9
AD
1456 for (i = 0; i < adev->num_ip_blocks; i++) {
1457 if ((amdgpu_ip_block_mask & (1 << i)) == 0) {
1458 DRM_ERROR("disabled ip block: %d\n", i);
a1255107 1459 adev->ip_blocks[i].status.valid = false;
d38ceaf9 1460 } else {
a1255107
AD
1461 if (adev->ip_blocks[i].version->funcs->early_init) {
1462 r = adev->ip_blocks[i].version->funcs->early_init((void *)adev);
2c1a2784 1463 if (r == -ENOENT) {
a1255107 1464 adev->ip_blocks[i].status.valid = false;
2c1a2784 1465 } else if (r) {
a1255107
AD
1466 DRM_ERROR("early_init of IP block <%s> failed %d\n",
1467 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1468 return r;
2c1a2784 1469 } else {
a1255107 1470 adev->ip_blocks[i].status.valid = true;
2c1a2784 1471 }
974e6b64 1472 } else {
a1255107 1473 adev->ip_blocks[i].status.valid = true;
d38ceaf9 1474 }
d38ceaf9
AD
1475 }
1476 }
1477
395d1fb9
NH
1478 adev->cg_flags &= amdgpu_cg_mask;
1479 adev->pg_flags &= amdgpu_pg_mask;
1480
d38ceaf9
AD
1481 return 0;
1482}
1483
1484static int amdgpu_init(struct amdgpu_device *adev)
1485{
1486 int i, r;
1487
1488 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1489 if (!adev->ip_blocks[i].status.valid)
d38ceaf9 1490 continue;
a1255107 1491 r = adev->ip_blocks[i].version->funcs->sw_init((void *)adev);
2c1a2784 1492 if (r) {
a1255107
AD
1493 DRM_ERROR("sw_init of IP block <%s> failed %d\n",
1494 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1495 return r;
2c1a2784 1496 }
a1255107 1497 adev->ip_blocks[i].status.sw = true;
d38ceaf9 1498 /* need to do gmc hw init early so we can allocate gpu mem */
a1255107 1499 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
d38ceaf9 1500 r = amdgpu_vram_scratch_init(adev);
2c1a2784
AD
1501 if (r) {
1502 DRM_ERROR("amdgpu_vram_scratch_init failed %d\n", r);
d38ceaf9 1503 return r;
2c1a2784 1504 }
a1255107 1505 r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev);
2c1a2784
AD
1506 if (r) {
1507 DRM_ERROR("hw_init %d failed %d\n", i, r);
d38ceaf9 1508 return r;
2c1a2784 1509 }
d38ceaf9 1510 r = amdgpu_wb_init(adev);
2c1a2784
AD
1511 if (r) {
1512 DRM_ERROR("amdgpu_wb_init failed %d\n", r);
d38ceaf9 1513 return r;
2c1a2784 1514 }
a1255107 1515 adev->ip_blocks[i].status.hw = true;
2493664f
ML
1516
1517 /* right after GMC hw init, we create CSA */
1518 if (amdgpu_sriov_vf(adev)) {
1519 r = amdgpu_allocate_static_csa(adev);
1520 if (r) {
1521 DRM_ERROR("allocate CSA failed %d\n", r);
1522 return r;
1523 }
1524 }
d38ceaf9
AD
1525 }
1526 }
1527
1528 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1529 if (!adev->ip_blocks[i].status.sw)
d38ceaf9
AD
1530 continue;
1531 /* gmc hw init is done early */
a1255107 1532 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC)
d38ceaf9 1533 continue;
a1255107 1534 r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev);
2c1a2784 1535 if (r) {
a1255107
AD
1536 DRM_ERROR("hw_init of IP block <%s> failed %d\n",
1537 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1538 return r;
2c1a2784 1539 }
a1255107 1540 adev->ip_blocks[i].status.hw = true;
d38ceaf9
AD
1541 }
1542
1543 return 0;
1544}
1545
1546static int amdgpu_late_init(struct amdgpu_device *adev)
1547{
1548 int i = 0, r;
1549
1550 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1551 if (!adev->ip_blocks[i].status.valid)
d38ceaf9 1552 continue;
a1255107
AD
1553 if (adev->ip_blocks[i].version->funcs->late_init) {
1554 r = adev->ip_blocks[i].version->funcs->late_init((void *)adev);
2c1a2784 1555 if (r) {
a1255107
AD
1556 DRM_ERROR("late_init of IP block <%s> failed %d\n",
1557 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1558 return r;
2c1a2784 1559 }
a1255107 1560 adev->ip_blocks[i].status.late_initialized = true;
d38ceaf9 1561 }
4a446d55 1562 /* skip CG for VCE/UVD, it's handled specially */
a1255107
AD
1563 if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
1564 adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE) {
4a446d55 1565 /* enable clockgating to save power */
a1255107
AD
1566 r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
1567 AMD_CG_STATE_GATE);
4a446d55
AD
1568 if (r) {
1569 DRM_ERROR("set_clockgating_state(gate) of IP block <%s> failed %d\n",
a1255107 1570 adev->ip_blocks[i].version->funcs->name, r);
4a446d55
AD
1571 return r;
1572 }
b0b00ff1 1573 }
d38ceaf9
AD
1574 }
1575
d1aff8ec
TSD
1576 amdgpu_dpm_enable_uvd(adev, false);
1577 amdgpu_dpm_enable_vce(adev, false);
1578
d38ceaf9
AD
1579 return 0;
1580}
1581
1582static int amdgpu_fini(struct amdgpu_device *adev)
1583{
1584 int i, r;
1585
3e96dbfd
AD
1586 /* need to disable SMC first */
1587 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1588 if (!adev->ip_blocks[i].status.hw)
3e96dbfd 1589 continue;
a1255107 1590 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) {
3e96dbfd 1591 /* ungate blocks before hw fini so that we can shutdown the blocks safely */
a1255107
AD
1592 r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
1593 AMD_CG_STATE_UNGATE);
3e96dbfd
AD
1594 if (r) {
1595 DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n",
a1255107 1596 adev->ip_blocks[i].version->funcs->name, r);
3e96dbfd
AD
1597 return r;
1598 }
a1255107 1599 r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev);
3e96dbfd
AD
1600 /* XXX handle errors */
1601 if (r) {
1602 DRM_DEBUG("hw_fini of IP block <%s> failed %d\n",
a1255107 1603 adev->ip_blocks[i].version->funcs->name, r);
3e96dbfd 1604 }
a1255107 1605 adev->ip_blocks[i].status.hw = false;
3e96dbfd
AD
1606 break;
1607 }
1608 }
1609
d38ceaf9 1610 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1611 if (!adev->ip_blocks[i].status.hw)
d38ceaf9 1612 continue;
a1255107 1613 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
d38ceaf9
AD
1614 amdgpu_wb_fini(adev);
1615 amdgpu_vram_scratch_fini(adev);
1616 }
8201a67a
RZ
1617
1618 if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
1619 adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE) {
1620 /* ungate blocks before hw fini so that we can shutdown the blocks safely */
1621 r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
1622 AMD_CG_STATE_UNGATE);
1623 if (r) {
1624 DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n",
1625 adev->ip_blocks[i].version->funcs->name, r);
1626 return r;
1627 }
2c1a2784 1628 }
8201a67a 1629
a1255107 1630 r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev);
d38ceaf9 1631 /* XXX handle errors */
2c1a2784 1632 if (r) {
a1255107
AD
1633 DRM_DEBUG("hw_fini of IP block <%s> failed %d\n",
1634 adev->ip_blocks[i].version->funcs->name, r);
2c1a2784 1635 }
8201a67a 1636
a1255107 1637 adev->ip_blocks[i].status.hw = false;
d38ceaf9
AD
1638 }
1639
1640 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1641 if (!adev->ip_blocks[i].status.sw)
d38ceaf9 1642 continue;
a1255107 1643 r = adev->ip_blocks[i].version->funcs->sw_fini((void *)adev);
d38ceaf9 1644 /* XXX handle errors */
2c1a2784 1645 if (r) {
a1255107
AD
1646 DRM_DEBUG("sw_fini of IP block <%s> failed %d\n",
1647 adev->ip_blocks[i].version->funcs->name, r);
2c1a2784 1648 }
a1255107
AD
1649 adev->ip_blocks[i].status.sw = false;
1650 adev->ip_blocks[i].status.valid = false;
d38ceaf9
AD
1651 }
1652
a6dcfd9c 1653 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1654 if (!adev->ip_blocks[i].status.late_initialized)
8a2eef1d 1655 continue;
a1255107
AD
1656 if (adev->ip_blocks[i].version->funcs->late_fini)
1657 adev->ip_blocks[i].version->funcs->late_fini((void *)adev);
1658 adev->ip_blocks[i].status.late_initialized = false;
a6dcfd9c
ML
1659 }
1660
3149d9da 1661 if (amdgpu_sriov_vf(adev)) {
2493664f 1662 amdgpu_bo_free_kernel(&adev->virt.csa_obj, &adev->virt.csa_vmid0_addr, NULL);
3149d9da
XY
1663 amdgpu_virt_release_full_gpu(adev, false);
1664 }
2493664f 1665
d38ceaf9
AD
1666 return 0;
1667}
1668
faefba95 1669int amdgpu_suspend(struct amdgpu_device *adev)
d38ceaf9
AD
1670{
1671 int i, r;
1672
e941ea99
XY
1673 if (amdgpu_sriov_vf(adev))
1674 amdgpu_virt_request_full_gpu(adev, false);
1675
c5a93a28
FC
1676 /* ungate SMC block first */
1677 r = amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_SMC,
1678 AMD_CG_STATE_UNGATE);
1679 if (r) {
1680 DRM_ERROR("set_clockgating_state(ungate) SMC failed %d\n",r);
1681 }
1682
d38ceaf9 1683 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1684 if (!adev->ip_blocks[i].status.valid)
d38ceaf9
AD
1685 continue;
1686 /* ungate blocks so that suspend can properly shut them down */
c5a93a28 1687 if (i != AMD_IP_BLOCK_TYPE_SMC) {
a1255107
AD
1688 r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
1689 AMD_CG_STATE_UNGATE);
c5a93a28 1690 if (r) {
a1255107
AD
1691 DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n",
1692 adev->ip_blocks[i].version->funcs->name, r);
c5a93a28 1693 }
2c1a2784 1694 }
d38ceaf9 1695 /* XXX handle errors */
a1255107 1696 r = adev->ip_blocks[i].version->funcs->suspend(adev);
d38ceaf9 1697 /* XXX handle errors */
2c1a2784 1698 if (r) {
a1255107
AD
1699 DRM_ERROR("suspend of IP block <%s> failed %d\n",
1700 adev->ip_blocks[i].version->funcs->name, r);
2c1a2784 1701 }
d38ceaf9
AD
1702 }
1703
e941ea99
XY
1704 if (amdgpu_sriov_vf(adev))
1705 amdgpu_virt_release_full_gpu(adev, false);
1706
d38ceaf9
AD
1707 return 0;
1708}
1709
e4f0fdcc 1710static int amdgpu_sriov_reinit_early(struct amdgpu_device *adev)
a90ad3c2
ML
1711{
1712 int i, r;
1713
1714 for (i = 0; i < adev->num_ip_blocks; i++) {
1715 if (!adev->ip_blocks[i].status.valid)
1716 continue;
1717
1718 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||
1719 adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||
1720 adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH)
e4f0fdcc 1721 r = adev->ip_blocks[i].version->funcs->hw_init(adev);
a90ad3c2
ML
1722
1723 if (r) {
1724 DRM_ERROR("resume of IP block <%s> failed %d\n",
1725 adev->ip_blocks[i].version->funcs->name, r);
1726 return r;
1727 }
1728 }
1729
1730 return 0;
1731}
1732
e4f0fdcc 1733static int amdgpu_sriov_reinit_late(struct amdgpu_device *adev)
a90ad3c2
ML
1734{
1735 int i, r;
1736
1737 for (i = 0; i < adev->num_ip_blocks; i++) {
1738 if (!adev->ip_blocks[i].status.valid)
1739 continue;
1740
1741 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||
1742 adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||
1743 adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH )
1744 continue;
1745
e4f0fdcc 1746 r = adev->ip_blocks[i].version->funcs->hw_init(adev);
a90ad3c2
ML
1747 if (r) {
1748 DRM_ERROR("resume of IP block <%s> failed %d\n",
1749 adev->ip_blocks[i].version->funcs->name, r);
1750 return r;
1751 }
1752 }
1753
1754 return 0;
1755}
1756
d38ceaf9
AD
1757static int amdgpu_resume(struct amdgpu_device *adev)
1758{
1759 int i, r;
1760
1761 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1762 if (!adev->ip_blocks[i].status.valid)
d38ceaf9 1763 continue;
a1255107 1764 r = adev->ip_blocks[i].version->funcs->resume(adev);
2c1a2784 1765 if (r) {
a1255107
AD
1766 DRM_ERROR("resume of IP block <%s> failed %d\n",
1767 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1768 return r;
2c1a2784 1769 }
d38ceaf9
AD
1770 }
1771
1772 return 0;
1773}
1774
4e99a44e 1775static void amdgpu_device_detect_sriov_bios(struct amdgpu_device *adev)
048765ad 1776{
a5bde2f9
AD
1777 if (adev->is_atom_fw) {
1778 if (amdgpu_atomfirmware_gpu_supports_virtualization(adev))
1779 adev->virt.caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;
1780 } else {
1781 if (amdgpu_atombios_has_gpu_virtualization_table(adev))
1782 adev->virt.caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;
1783 }
048765ad
AR
1784}
1785
d38ceaf9
AD
1786/**
1787 * amdgpu_device_init - initialize the driver
1788 *
1789 * @adev: amdgpu_device pointer
1790 * @pdev: drm dev pointer
1791 * @pdev: pci dev pointer
1792 * @flags: driver flags
1793 *
1794 * Initializes the driver info and hw (all asics).
1795 * Returns 0 for success or an error on failure.
1796 * Called at driver startup.
1797 */
1798int amdgpu_device_init(struct amdgpu_device *adev,
1799 struct drm_device *ddev,
1800 struct pci_dev *pdev,
1801 uint32_t flags)
1802{
1803 int r, i;
1804 bool runtime = false;
95844d20 1805 u32 max_MBps;
d38ceaf9
AD
1806
1807 adev->shutdown = false;
1808 adev->dev = &pdev->dev;
1809 adev->ddev = ddev;
1810 adev->pdev = pdev;
1811 adev->flags = flags;
2f7d10b3 1812 adev->asic_type = flags & AMD_ASIC_MASK;
d38ceaf9
AD
1813 adev->usec_timeout = AMDGPU_MAX_USEC_TIMEOUT;
1814 adev->mc.gtt_size = 512 * 1024 * 1024;
1815 adev->accel_working = false;
1816 adev->num_rings = 0;
1817 adev->mman.buffer_funcs = NULL;
1818 adev->mman.buffer_funcs_ring = NULL;
1819 adev->vm_manager.vm_pte_funcs = NULL;
2d55e45a 1820 adev->vm_manager.vm_pte_num_rings = 0;
d38ceaf9 1821 adev->gart.gart_funcs = NULL;
f54d1867 1822 adev->fence_context = dma_fence_context_alloc(AMDGPU_MAX_RINGS);
d38ceaf9
AD
1823
1824 adev->smc_rreg = &amdgpu_invalid_rreg;
1825 adev->smc_wreg = &amdgpu_invalid_wreg;
1826 adev->pcie_rreg = &amdgpu_invalid_rreg;
1827 adev->pcie_wreg = &amdgpu_invalid_wreg;
36b9a952
HR
1828 adev->pciep_rreg = &amdgpu_invalid_rreg;
1829 adev->pciep_wreg = &amdgpu_invalid_wreg;
d38ceaf9
AD
1830 adev->uvd_ctx_rreg = &amdgpu_invalid_rreg;
1831 adev->uvd_ctx_wreg = &amdgpu_invalid_wreg;
1832 adev->didt_rreg = &amdgpu_invalid_rreg;
1833 adev->didt_wreg = &amdgpu_invalid_wreg;
ccdbb20a
RZ
1834 adev->gc_cac_rreg = &amdgpu_invalid_rreg;
1835 adev->gc_cac_wreg = &amdgpu_invalid_wreg;
d38ceaf9
AD
1836 adev->audio_endpt_rreg = &amdgpu_block_invalid_rreg;
1837 adev->audio_endpt_wreg = &amdgpu_block_invalid_wreg;
1838
ccdbb20a 1839
3e39ab90
AD
1840 DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X 0x%02X).\n",
1841 amdgpu_asic_name[adev->asic_type], pdev->vendor, pdev->device,
1842 pdev->subsystem_vendor, pdev->subsystem_device, pdev->revision);
d38ceaf9
AD
1843
1844 /* mutex initialization are all done here so we
1845 * can recall function without having locking issues */
8d0a7cea 1846 mutex_init(&adev->vm_manager.lock);
d38ceaf9 1847 atomic_set(&adev->irq.ih.lock, 0);
0e5ca0d1 1848 mutex_init(&adev->firmware.mutex);
d38ceaf9
AD
1849 mutex_init(&adev->pm.mutex);
1850 mutex_init(&adev->gfx.gpu_clock_mutex);
1851 mutex_init(&adev->srbm_mutex);
1852 mutex_init(&adev->grbm_idx_mutex);
d38ceaf9
AD
1853 mutex_init(&adev->mn_lock);
1854 hash_init(adev->mn_hash);
1855
1856 amdgpu_check_arguments(adev);
1857
1858 /* Registers mapping */
1859 /* TODO: block userspace mapping of io register */
1860 spin_lock_init(&adev->mmio_idx_lock);
1861 spin_lock_init(&adev->smc_idx_lock);
1862 spin_lock_init(&adev->pcie_idx_lock);
1863 spin_lock_init(&adev->uvd_ctx_idx_lock);
1864 spin_lock_init(&adev->didt_idx_lock);
ccdbb20a 1865 spin_lock_init(&adev->gc_cac_idx_lock);
d38ceaf9 1866 spin_lock_init(&adev->audio_endpt_idx_lock);
95844d20 1867 spin_lock_init(&adev->mm_stats.lock);
d38ceaf9 1868
0c4e7fa5
CZ
1869 INIT_LIST_HEAD(&adev->shadow_list);
1870 mutex_init(&adev->shadow_list_lock);
1871
5c1354bd
CZ
1872 INIT_LIST_HEAD(&adev->gtt_list);
1873 spin_lock_init(&adev->gtt_list_lock);
1874
da69c161
KW
1875 if (adev->asic_type >= CHIP_BONAIRE) {
1876 adev->rmmio_base = pci_resource_start(adev->pdev, 5);
1877 adev->rmmio_size = pci_resource_len(adev->pdev, 5);
1878 } else {
1879 adev->rmmio_base = pci_resource_start(adev->pdev, 2);
1880 adev->rmmio_size = pci_resource_len(adev->pdev, 2);
1881 }
d38ceaf9 1882
d38ceaf9
AD
1883 adev->rmmio = ioremap(adev->rmmio_base, adev->rmmio_size);
1884 if (adev->rmmio == NULL) {
1885 return -ENOMEM;
1886 }
1887 DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)adev->rmmio_base);
1888 DRM_INFO("register mmio size: %u\n", (unsigned)adev->rmmio_size);
1889
da69c161
KW
1890 if (adev->asic_type >= CHIP_BONAIRE)
1891 /* doorbell bar mapping */
1892 amdgpu_doorbell_init(adev);
d38ceaf9
AD
1893
1894 /* io port mapping */
1895 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
1896 if (pci_resource_flags(adev->pdev, i) & IORESOURCE_IO) {
1897 adev->rio_mem_size = pci_resource_len(adev->pdev, i);
1898 adev->rio_mem = pci_iomap(adev->pdev, i, adev->rio_mem_size);
1899 break;
1900 }
1901 }
1902 if (adev->rio_mem == NULL)
b64a18c5 1903 DRM_INFO("PCI I/O BAR is not found.\n");
d38ceaf9
AD
1904
1905 /* early init functions */
1906 r = amdgpu_early_init(adev);
1907 if (r)
1908 return r;
1909
1910 /* if we have > 1 VGA cards, then disable the amdgpu VGA resources */
1911 /* this will fail for cards that aren't VGA class devices, just
1912 * ignore it */
1913 vga_client_register(adev->pdev, adev, NULL, amdgpu_vga_set_decode);
1914
1915 if (amdgpu_runtime_pm == 1)
1916 runtime = true;
e9bef455 1917 if (amdgpu_device_is_px(ddev))
d38ceaf9
AD
1918 runtime = true;
1919 vga_switcheroo_register_client(adev->pdev, &amdgpu_switcheroo_ops, runtime);
1920 if (runtime)
1921 vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain);
1922
1923 /* Read BIOS */
83ba126a
AD
1924 if (!amdgpu_get_bios(adev)) {
1925 r = -EINVAL;
1926 goto failed;
1927 }
f7e9e9fe 1928
d38ceaf9 1929 r = amdgpu_atombios_init(adev);
2c1a2784
AD
1930 if (r) {
1931 dev_err(adev->dev, "amdgpu_atombios_init failed\n");
83ba126a 1932 goto failed;
2c1a2784 1933 }
d38ceaf9 1934
4e99a44e
ML
1935 /* detect if we are with an SRIOV vbios */
1936 amdgpu_device_detect_sriov_bios(adev);
048765ad 1937
d38ceaf9 1938 /* Post card if necessary */
bec86378 1939 if (amdgpu_vpost_needed(adev)) {
d38ceaf9 1940 if (!adev->bios) {
bec86378 1941 dev_err(adev->dev, "no vBIOS found\n");
83ba126a
AD
1942 r = -EINVAL;
1943 goto failed;
d38ceaf9 1944 }
bec86378 1945 DRM_INFO("GPU posting now...\n");
4e99a44e
ML
1946 r = amdgpu_atom_asic_init(adev->mode_info.atom_context);
1947 if (r) {
1948 dev_err(adev->dev, "gpu post error!\n");
1949 goto failed;
1950 }
1951 } else {
1952 DRM_INFO("GPU post is not needed\n");
d38ceaf9
AD
1953 }
1954
a5bde2f9
AD
1955 if (!adev->is_atom_fw) {
1956 /* Initialize clocks */
1957 r = amdgpu_atombios_get_clock_info(adev);
1958 if (r) {
1959 dev_err(adev->dev, "amdgpu_atombios_get_clock_info failed\n");
1960 return r;
1961 }
1962 /* init i2c buses */
1963 amdgpu_atombios_i2c_init(adev);
2c1a2784 1964 }
d38ceaf9
AD
1965
1966 /* Fence driver */
1967 r = amdgpu_fence_driver_init(adev);
2c1a2784
AD
1968 if (r) {
1969 dev_err(adev->dev, "amdgpu_fence_driver_init failed\n");
83ba126a 1970 goto failed;
2c1a2784 1971 }
d38ceaf9
AD
1972
1973 /* init the mode config */
1974 drm_mode_config_init(adev->ddev);
1975
1976 r = amdgpu_init(adev);
1977 if (r) {
2c1a2784 1978 dev_err(adev->dev, "amdgpu_init failed\n");
d38ceaf9 1979 amdgpu_fini(adev);
83ba126a 1980 goto failed;
d38ceaf9
AD
1981 }
1982
1983 adev->accel_working = true;
1984
95844d20
MO
1985 /* Initialize the buffer migration limit. */
1986 if (amdgpu_moverate >= 0)
1987 max_MBps = amdgpu_moverate;
1988 else
1989 max_MBps = 8; /* Allow 8 MB/s. */
1990 /* Get a log2 for easy divisions. */
1991 adev->mm_stats.log2_max_MBps = ilog2(max(1u, max_MBps));
1992
d38ceaf9
AD
1993 r = amdgpu_ib_pool_init(adev);
1994 if (r) {
1995 dev_err(adev->dev, "IB initialization failed (%d).\n", r);
83ba126a 1996 goto failed;
d38ceaf9
AD
1997 }
1998
1999 r = amdgpu_ib_ring_tests(adev);
2000 if (r)
2001 DRM_ERROR("ib ring test failed (%d).\n", r);
2002
9bc92b9c
ML
2003 amdgpu_fbdev_init(adev);
2004
d38ceaf9 2005 r = amdgpu_gem_debugfs_init(adev);
3f14e623 2006 if (r)
d38ceaf9 2007 DRM_ERROR("registering gem debugfs failed (%d).\n", r);
d38ceaf9
AD
2008
2009 r = amdgpu_debugfs_regs_init(adev);
3f14e623 2010 if (r)
d38ceaf9 2011 DRM_ERROR("registering register debugfs failed (%d).\n", r);
d38ceaf9 2012
50ab2533 2013 r = amdgpu_debugfs_firmware_init(adev);
3f14e623 2014 if (r)
50ab2533 2015 DRM_ERROR("registering firmware debugfs failed (%d).\n", r);
50ab2533 2016
d38ceaf9
AD
2017 if ((amdgpu_testing & 1)) {
2018 if (adev->accel_working)
2019 amdgpu_test_moves(adev);
2020 else
2021 DRM_INFO("amdgpu: acceleration disabled, skipping move tests\n");
2022 }
d38ceaf9
AD
2023 if (amdgpu_benchmarking) {
2024 if (adev->accel_working)
2025 amdgpu_benchmark(adev, amdgpu_benchmarking);
2026 else
2027 DRM_INFO("amdgpu: acceleration disabled, skipping benchmarks\n");
2028 }
2029
2030 /* enable clockgating, etc. after ib tests, etc. since some blocks require
2031 * explicit gating rather than handling it automatically.
2032 */
2033 r = amdgpu_late_init(adev);
2c1a2784
AD
2034 if (r) {
2035 dev_err(adev->dev, "amdgpu_late_init failed\n");
83ba126a 2036 goto failed;
2c1a2784 2037 }
d38ceaf9
AD
2038
2039 return 0;
83ba126a
AD
2040
2041failed:
2042 if (runtime)
2043 vga_switcheroo_fini_domain_pm_ops(adev->dev);
2044 return r;
d38ceaf9
AD
2045}
2046
d38ceaf9
AD
2047/**
2048 * amdgpu_device_fini - tear down the driver
2049 *
2050 * @adev: amdgpu_device pointer
2051 *
2052 * Tear down the driver info (all asics).
2053 * Called at driver shutdown.
2054 */
2055void amdgpu_device_fini(struct amdgpu_device *adev)
2056{
2057 int r;
2058
2059 DRM_INFO("amdgpu: finishing device.\n");
2060 adev->shutdown = true;
a951ed85 2061 drm_crtc_force_disable_all(adev->ddev);
d38ceaf9
AD
2062 /* evict vram memory */
2063 amdgpu_bo_evict_vram(adev);
2064 amdgpu_ib_pool_fini(adev);
2065 amdgpu_fence_driver_fini(adev);
2066 amdgpu_fbdev_fini(adev);
2067 r = amdgpu_fini(adev);
d38ceaf9
AD
2068 adev->accel_working = false;
2069 /* free i2c buses */
2070 amdgpu_i2c_fini(adev);
2071 amdgpu_atombios_fini(adev);
2072 kfree(adev->bios);
2073 adev->bios = NULL;
2074 vga_switcheroo_unregister_client(adev->pdev);
83ba126a
AD
2075 if (adev->flags & AMD_IS_PX)
2076 vga_switcheroo_fini_domain_pm_ops(adev->dev);
d38ceaf9
AD
2077 vga_client_register(adev->pdev, NULL, NULL, NULL);
2078 if (adev->rio_mem)
2079 pci_iounmap(adev->pdev, adev->rio_mem);
2080 adev->rio_mem = NULL;
2081 iounmap(adev->rmmio);
2082 adev->rmmio = NULL;
da69c161
KW
2083 if (adev->asic_type >= CHIP_BONAIRE)
2084 amdgpu_doorbell_fini(adev);
d38ceaf9 2085 amdgpu_debugfs_regs_cleanup(adev);
d38ceaf9
AD
2086}
2087
2088
2089/*
2090 * Suspend & resume.
2091 */
2092/**
810ddc3a 2093 * amdgpu_device_suspend - initiate device suspend
d38ceaf9
AD
2094 *
2095 * @pdev: drm dev pointer
2096 * @state: suspend state
2097 *
2098 * Puts the hw in the suspend state (all asics).
2099 * Returns 0 for success or an error on failure.
2100 * Called at driver suspend.
2101 */
810ddc3a 2102int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
d38ceaf9
AD
2103{
2104 struct amdgpu_device *adev;
2105 struct drm_crtc *crtc;
2106 struct drm_connector *connector;
5ceb54c6 2107 int r;
d38ceaf9
AD
2108
2109 if (dev == NULL || dev->dev_private == NULL) {
2110 return -ENODEV;
2111 }
2112
2113 adev = dev->dev_private;
2114
2115 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
2116 return 0;
2117
2118 drm_kms_helper_poll_disable(dev);
2119
2120 /* turn off display hw */
4c7fbc39 2121 drm_modeset_lock_all(dev);
d38ceaf9
AD
2122 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
2123 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
2124 }
4c7fbc39 2125 drm_modeset_unlock_all(dev);
d38ceaf9 2126
756e6880 2127 /* unpin the front buffers and cursors */
d38ceaf9 2128 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
756e6880 2129 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
d38ceaf9
AD
2130 struct amdgpu_framebuffer *rfb = to_amdgpu_framebuffer(crtc->primary->fb);
2131 struct amdgpu_bo *robj;
2132
756e6880
AD
2133 if (amdgpu_crtc->cursor_bo) {
2134 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2135 r = amdgpu_bo_reserve(aobj, false);
2136 if (r == 0) {
2137 amdgpu_bo_unpin(aobj);
2138 amdgpu_bo_unreserve(aobj);
2139 }
2140 }
2141
d38ceaf9
AD
2142 if (rfb == NULL || rfb->obj == NULL) {
2143 continue;
2144 }
2145 robj = gem_to_amdgpu_bo(rfb->obj);
2146 /* don't unpin kernel fb objects */
2147 if (!amdgpu_fbdev_robj_is_fb(adev, robj)) {
2148 r = amdgpu_bo_reserve(robj, false);
2149 if (r == 0) {
2150 amdgpu_bo_unpin(robj);
2151 amdgpu_bo_unreserve(robj);
2152 }
2153 }
2154 }
2155 /* evict vram memory */
2156 amdgpu_bo_evict_vram(adev);
2157
5ceb54c6 2158 amdgpu_fence_driver_suspend(adev);
d38ceaf9
AD
2159
2160 r = amdgpu_suspend(adev);
2161
a0a71e49
AD
2162 /* evict remaining vram memory
2163 * This second call to evict vram is to evict the gart page table
2164 * using the CPU.
2165 */
d38ceaf9
AD
2166 amdgpu_bo_evict_vram(adev);
2167
be34d3bf
AD
2168 if (adev->is_atom_fw)
2169 amdgpu_atomfirmware_scratch_regs_save(adev);
2170 else
2171 amdgpu_atombios_scratch_regs_save(adev);
d38ceaf9
AD
2172 pci_save_state(dev->pdev);
2173 if (suspend) {
2174 /* Shut down the device */
2175 pci_disable_device(dev->pdev);
2176 pci_set_power_state(dev->pdev, PCI_D3hot);
74b0b157 2177 } else {
2178 r = amdgpu_asic_reset(adev);
2179 if (r)
2180 DRM_ERROR("amdgpu asic reset failed\n");
d38ceaf9
AD
2181 }
2182
2183 if (fbcon) {
2184 console_lock();
2185 amdgpu_fbdev_set_suspend(adev, 1);
2186 console_unlock();
2187 }
2188 return 0;
2189}
2190
2191/**
810ddc3a 2192 * amdgpu_device_resume - initiate device resume
d38ceaf9
AD
2193 *
2194 * @pdev: drm dev pointer
2195 *
2196 * Bring the hw back to operating state (all asics).
2197 * Returns 0 for success or an error on failure.
2198 * Called at driver resume.
2199 */
810ddc3a 2200int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
d38ceaf9
AD
2201{
2202 struct drm_connector *connector;
2203 struct amdgpu_device *adev = dev->dev_private;
756e6880 2204 struct drm_crtc *crtc;
d38ceaf9
AD
2205 int r;
2206
2207 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
2208 return 0;
2209
74b0b157 2210 if (fbcon)
d38ceaf9 2211 console_lock();
74b0b157 2212
d38ceaf9
AD
2213 if (resume) {
2214 pci_set_power_state(dev->pdev, PCI_D0);
2215 pci_restore_state(dev->pdev);
74b0b157 2216 r = pci_enable_device(dev->pdev);
2217 if (r) {
d38ceaf9
AD
2218 if (fbcon)
2219 console_unlock();
74b0b157 2220 return r;
d38ceaf9
AD
2221 }
2222 }
be34d3bf
AD
2223 if (adev->is_atom_fw)
2224 amdgpu_atomfirmware_scratch_regs_restore(adev);
2225 else
2226 amdgpu_atombios_scratch_regs_restore(adev);
d38ceaf9
AD
2227
2228 /* post card */
c836fec5 2229 if (amdgpu_need_post(adev)) {
74b0b157 2230 r = amdgpu_atom_asic_init(adev->mode_info.atom_context);
2231 if (r)
2232 DRM_ERROR("amdgpu asic init failed\n");
2233 }
d38ceaf9
AD
2234
2235 r = amdgpu_resume(adev);
ca198528
FC
2236 if (r)
2237 DRM_ERROR("amdgpu_resume failed (%d).\n", r);
d38ceaf9 2238
5ceb54c6
AD
2239 amdgpu_fence_driver_resume(adev);
2240
ca198528
FC
2241 if (resume) {
2242 r = amdgpu_ib_ring_tests(adev);
2243 if (r)
2244 DRM_ERROR("ib ring test failed (%d).\n", r);
2245 }
d38ceaf9
AD
2246
2247 r = amdgpu_late_init(adev);
c085bd51
JQ
2248 if (r) {
2249 if (fbcon)
2250 console_unlock();
d38ceaf9 2251 return r;
c085bd51 2252 }
d38ceaf9 2253
756e6880
AD
2254 /* pin cursors */
2255 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
2256 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2257
2258 if (amdgpu_crtc->cursor_bo) {
2259 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2260 r = amdgpu_bo_reserve(aobj, false);
2261 if (r == 0) {
2262 r = amdgpu_bo_pin(aobj,
2263 AMDGPU_GEM_DOMAIN_VRAM,
2264 &amdgpu_crtc->cursor_addr);
2265 if (r != 0)
2266 DRM_ERROR("Failed to pin cursor BO (%d)\n", r);
2267 amdgpu_bo_unreserve(aobj);
2268 }
2269 }
2270 }
2271
d38ceaf9
AD
2272 /* blat the mode back in */
2273 if (fbcon) {
2274 drm_helper_resume_force_mode(dev);
2275 /* turn on display hw */
4c7fbc39 2276 drm_modeset_lock_all(dev);
d38ceaf9
AD
2277 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
2278 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
2279 }
4c7fbc39 2280 drm_modeset_unlock_all(dev);
d38ceaf9
AD
2281 }
2282
2283 drm_kms_helper_poll_enable(dev);
23a1a9e5
L
2284
2285 /*
2286 * Most of the connector probing functions try to acquire runtime pm
2287 * refs to ensure that the GPU is powered on when connector polling is
2288 * performed. Since we're calling this from a runtime PM callback,
2289 * trying to acquire rpm refs will cause us to deadlock.
2290 *
2291 * Since we're guaranteed to be holding the rpm lock, it's safe to
2292 * temporarily disable the rpm helpers so this doesn't deadlock us.
2293 */
2294#ifdef CONFIG_PM
2295 dev->dev->power.disable_depth++;
2296#endif
54fb2a5c 2297 drm_helper_hpd_irq_event(dev);
23a1a9e5
L
2298#ifdef CONFIG_PM
2299 dev->dev->power.disable_depth--;
2300#endif
d38ceaf9
AD
2301
2302 if (fbcon) {
2303 amdgpu_fbdev_set_suspend(adev, 0);
2304 console_unlock();
2305 }
2306
2307 return 0;
2308}
2309
63fbf42f
CZ
2310static bool amdgpu_check_soft_reset(struct amdgpu_device *adev)
2311{
2312 int i;
2313 bool asic_hang = false;
2314
2315 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2316 if (!adev->ip_blocks[i].status.valid)
63fbf42f 2317 continue;
a1255107
AD
2318 if (adev->ip_blocks[i].version->funcs->check_soft_reset)
2319 adev->ip_blocks[i].status.hang =
2320 adev->ip_blocks[i].version->funcs->check_soft_reset(adev);
2321 if (adev->ip_blocks[i].status.hang) {
2322 DRM_INFO("IP block:%s is hung!\n", adev->ip_blocks[i].version->funcs->name);
63fbf42f
CZ
2323 asic_hang = true;
2324 }
2325 }
2326 return asic_hang;
2327}
2328
4d446656 2329static int amdgpu_pre_soft_reset(struct amdgpu_device *adev)
d31a501e
CZ
2330{
2331 int i, r = 0;
2332
2333 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2334 if (!adev->ip_blocks[i].status.valid)
d31a501e 2335 continue;
a1255107
AD
2336 if (adev->ip_blocks[i].status.hang &&
2337 adev->ip_blocks[i].version->funcs->pre_soft_reset) {
2338 r = adev->ip_blocks[i].version->funcs->pre_soft_reset(adev);
d31a501e
CZ
2339 if (r)
2340 return r;
2341 }
2342 }
2343
2344 return 0;
2345}
2346
35d782fe
CZ
2347static bool amdgpu_need_full_reset(struct amdgpu_device *adev)
2348{
da146d3b
AD
2349 int i;
2350
2351 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2352 if (!adev->ip_blocks[i].status.valid)
da146d3b 2353 continue;
a1255107
AD
2354 if ((adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) ||
2355 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) ||
2356 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_ACP) ||
2357 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE)) {
2358 if (adev->ip_blocks[i].status.hang) {
da146d3b
AD
2359 DRM_INFO("Some block need full reset!\n");
2360 return true;
2361 }
2362 }
35d782fe
CZ
2363 }
2364 return false;
2365}
2366
2367static int amdgpu_soft_reset(struct amdgpu_device *adev)
2368{
2369 int i, r = 0;
2370
2371 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2372 if (!adev->ip_blocks[i].status.valid)
35d782fe 2373 continue;
a1255107
AD
2374 if (adev->ip_blocks[i].status.hang &&
2375 adev->ip_blocks[i].version->funcs->soft_reset) {
2376 r = adev->ip_blocks[i].version->funcs->soft_reset(adev);
35d782fe
CZ
2377 if (r)
2378 return r;
2379 }
2380 }
2381
2382 return 0;
2383}
2384
2385static int amdgpu_post_soft_reset(struct amdgpu_device *adev)
2386{
2387 int i, r = 0;
2388
2389 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2390 if (!adev->ip_blocks[i].status.valid)
35d782fe 2391 continue;
a1255107
AD
2392 if (adev->ip_blocks[i].status.hang &&
2393 adev->ip_blocks[i].version->funcs->post_soft_reset)
2394 r = adev->ip_blocks[i].version->funcs->post_soft_reset(adev);
35d782fe
CZ
2395 if (r)
2396 return r;
2397 }
2398
2399 return 0;
2400}
2401
3ad81f16
CZ
2402bool amdgpu_need_backup(struct amdgpu_device *adev)
2403{
2404 if (adev->flags & AMD_IS_APU)
2405 return false;
2406
2407 return amdgpu_lockup_timeout > 0 ? true : false;
2408}
2409
53cdccd5
CZ
2410static int amdgpu_recover_vram_from_shadow(struct amdgpu_device *adev,
2411 struct amdgpu_ring *ring,
2412 struct amdgpu_bo *bo,
f54d1867 2413 struct dma_fence **fence)
53cdccd5
CZ
2414{
2415 uint32_t domain;
2416 int r;
2417
2418 if (!bo->shadow)
2419 return 0;
2420
2421 r = amdgpu_bo_reserve(bo, false);
2422 if (r)
2423 return r;
2424 domain = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type);
2425 /* if bo has been evicted, then no need to recover */
2426 if (domain == AMDGPU_GEM_DOMAIN_VRAM) {
2427 r = amdgpu_bo_restore_from_shadow(adev, ring, bo,
2428 NULL, fence, true);
2429 if (r) {
2430 DRM_ERROR("recover page table failed!\n");
2431 goto err;
2432 }
2433 }
2434err:
2435 amdgpu_bo_unreserve(bo);
2436 return r;
2437}
2438
a90ad3c2
ML
2439/**
2440 * amdgpu_sriov_gpu_reset - reset the asic
2441 *
2442 * @adev: amdgpu device pointer
2443 * @voluntary: if this reset is requested by guest.
2444 * (true means by guest and false means by HYPERVISOR )
2445 *
2446 * Attempt the reset the GPU if it has hung (all asics).
2447 * for SRIOV case.
2448 * Returns 0 for success or an error on failure.
2449 */
2450int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, bool voluntary)
2451{
2452 int i, r = 0;
2453 int resched;
2454 struct amdgpu_bo *bo, *tmp;
2455 struct amdgpu_ring *ring;
2456 struct dma_fence *fence = NULL, *next = NULL;
2457
147b5983 2458 mutex_lock(&adev->virt.lock_reset);
a90ad3c2 2459 atomic_inc(&adev->gpu_reset_counter);
1fb37a3d 2460 adev->gfx.in_reset = true;
a90ad3c2
ML
2461
2462 /* block TTM */
2463 resched = ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
2464
2465 /* block scheduler */
2466 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2467 ring = adev->rings[i];
2468
2469 if (!ring || !ring->sched.thread)
2470 continue;
2471
2472 kthread_park(ring->sched.thread);
2473 amd_sched_hw_job_reset(&ring->sched);
2474 }
2475
2476 /* after all hw jobs are reset, hw fence is meaningless, so force_completion */
2477 amdgpu_fence_driver_force_completion(adev);
2478
2479 /* request to take full control of GPU before re-initialization */
2480 if (voluntary)
2481 amdgpu_virt_reset_gpu(adev);
2482 else
2483 amdgpu_virt_request_full_gpu(adev, true);
2484
2485
2486 /* Resume IP prior to SMC */
e4f0fdcc 2487 amdgpu_sriov_reinit_early(adev);
a90ad3c2
ML
2488
2489 /* we need recover gart prior to run SMC/CP/SDMA resume */
2490 amdgpu_ttm_recover_gart(adev);
2491
2492 /* now we are okay to resume SMC/CP/SDMA */
e4f0fdcc 2493 amdgpu_sriov_reinit_late(adev);
a90ad3c2
ML
2494
2495 amdgpu_irq_gpu_reset_resume_helper(adev);
2496
2497 if (amdgpu_ib_ring_tests(adev))
2498 dev_err(adev->dev, "[GPU_RESET] ib ring test failed (%d).\n", r);
2499
2500 /* release full control of GPU after ib test */
2501 amdgpu_virt_release_full_gpu(adev, true);
2502
2503 DRM_INFO("recover vram bo from shadow\n");
2504
2505 ring = adev->mman.buffer_funcs_ring;
2506 mutex_lock(&adev->shadow_list_lock);
2507 list_for_each_entry_safe(bo, tmp, &adev->shadow_list, shadow_list) {
2508 amdgpu_recover_vram_from_shadow(adev, ring, bo, &next);
2509 if (fence) {
2510 r = dma_fence_wait(fence, false);
2511 if (r) {
2512 WARN(r, "recovery from shadow isn't completed\n");
2513 break;
2514 }
2515 }
2516
2517 dma_fence_put(fence);
2518 fence = next;
2519 }
2520 mutex_unlock(&adev->shadow_list_lock);
2521
2522 if (fence) {
2523 r = dma_fence_wait(fence, false);
2524 if (r)
2525 WARN(r, "recovery from shadow isn't completed\n");
2526 }
2527 dma_fence_put(fence);
2528
2529 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2530 struct amdgpu_ring *ring = adev->rings[i];
2531 if (!ring || !ring->sched.thread)
2532 continue;
2533
2534 amd_sched_job_recovery(&ring->sched);
2535 kthread_unpark(ring->sched.thread);
2536 }
2537
2538 drm_helper_resume_force_mode(adev->ddev);
2539 ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched);
2540 if (r) {
2541 /* bad news, how to tell it to userspace ? */
2542 dev_info(adev->dev, "GPU reset failed\n");
2543 }
2544
1fb37a3d 2545 adev->gfx.in_reset = false;
147b5983 2546 mutex_unlock(&adev->virt.lock_reset);
a90ad3c2
ML
2547 return r;
2548}
2549
d38ceaf9
AD
2550/**
2551 * amdgpu_gpu_reset - reset the asic
2552 *
2553 * @adev: amdgpu device pointer
2554 *
2555 * Attempt the reset the GPU if it has hung (all asics).
2556 * Returns 0 for success or an error on failure.
2557 */
2558int amdgpu_gpu_reset(struct amdgpu_device *adev)
2559{
d38ceaf9
AD
2560 int i, r;
2561 int resched;
35d782fe 2562 bool need_full_reset;
d38ceaf9 2563
fb140b29 2564 if (amdgpu_sriov_vf(adev))
a90ad3c2 2565 return amdgpu_sriov_gpu_reset(adev, true);
fb140b29 2566
63fbf42f
CZ
2567 if (!amdgpu_check_soft_reset(adev)) {
2568 DRM_INFO("No hardware hang detected. Did some blocks stall?\n");
2569 return 0;
2570 }
d38ceaf9 2571
d94aed5a 2572 atomic_inc(&adev->gpu_reset_counter);
d38ceaf9 2573
a3c47d6b
CZ
2574 /* block TTM */
2575 resched = ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
2576
0875dc9e
CZ
2577 /* block scheduler */
2578 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2579 struct amdgpu_ring *ring = adev->rings[i];
2580
2581 if (!ring)
2582 continue;
2583 kthread_park(ring->sched.thread);
aa1c8900 2584 amd_sched_hw_job_reset(&ring->sched);
0875dc9e 2585 }
2200edac
CZ
2586 /* after all hw jobs are reset, hw fence is meaningless, so force_completion */
2587 amdgpu_fence_driver_force_completion(adev);
d38ceaf9 2588
35d782fe 2589 need_full_reset = amdgpu_need_full_reset(adev);
d38ceaf9 2590
35d782fe
CZ
2591 if (!need_full_reset) {
2592 amdgpu_pre_soft_reset(adev);
2593 r = amdgpu_soft_reset(adev);
2594 amdgpu_post_soft_reset(adev);
2595 if (r || amdgpu_check_soft_reset(adev)) {
2596 DRM_INFO("soft reset failed, will fallback to full reset!\n");
2597 need_full_reset = true;
2598 }
f1aa7e08
CZ
2599 }
2600
35d782fe 2601 if (need_full_reset) {
35d782fe 2602 r = amdgpu_suspend(adev);
bfa99269 2603
35d782fe
CZ
2604retry:
2605 /* Disable fb access */
2606 if (adev->mode_info.num_crtc) {
2607 struct amdgpu_mode_mc_save save;
2608 amdgpu_display_stop_mc_access(adev, &save);
2609 amdgpu_wait_for_idle(adev, AMD_IP_BLOCK_TYPE_GMC);
2610 }
be34d3bf
AD
2611 if (adev->is_atom_fw)
2612 amdgpu_atomfirmware_scratch_regs_save(adev);
2613 else
2614 amdgpu_atombios_scratch_regs_save(adev);
35d782fe 2615 r = amdgpu_asic_reset(adev);
be34d3bf
AD
2616 if (adev->is_atom_fw)
2617 amdgpu_atomfirmware_scratch_regs_restore(adev);
2618 else
2619 amdgpu_atombios_scratch_regs_restore(adev);
35d782fe
CZ
2620 /* post card */
2621 amdgpu_atom_asic_init(adev->mode_info.atom_context);
2622
2623 if (!r) {
2624 dev_info(adev->dev, "GPU reset succeeded, trying to resume\n");
2625 r = amdgpu_resume(adev);
2626 }
d38ceaf9 2627 }
d38ceaf9 2628 if (!r) {
e72cfd58 2629 amdgpu_irq_gpu_reset_resume_helper(adev);
2c0d7318
CZ
2630 if (need_full_reset && amdgpu_need_backup(adev)) {
2631 r = amdgpu_ttm_recover_gart(adev);
2632 if (r)
2633 DRM_ERROR("gart recovery failed!!!\n");
2634 }
1f465087
CZ
2635 r = amdgpu_ib_ring_tests(adev);
2636 if (r) {
2637 dev_err(adev->dev, "ib ring test failed (%d).\n", r);
40019dc4 2638 r = amdgpu_suspend(adev);
53cdccd5 2639 need_full_reset = true;
40019dc4 2640 goto retry;
1f465087 2641 }
53cdccd5
CZ
2642 /**
2643 * recovery vm page tables, since we cannot depend on VRAM is
2644 * consistent after gpu full reset.
2645 */
2646 if (need_full_reset && amdgpu_need_backup(adev)) {
2647 struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
2648 struct amdgpu_bo *bo, *tmp;
f54d1867 2649 struct dma_fence *fence = NULL, *next = NULL;
53cdccd5
CZ
2650
2651 DRM_INFO("recover vram bo from shadow\n");
2652 mutex_lock(&adev->shadow_list_lock);
2653 list_for_each_entry_safe(bo, tmp, &adev->shadow_list, shadow_list) {
2654 amdgpu_recover_vram_from_shadow(adev, ring, bo, &next);
2655 if (fence) {
f54d1867 2656 r = dma_fence_wait(fence, false);
53cdccd5 2657 if (r) {
1d7b17b0 2658 WARN(r, "recovery from shadow isn't completed\n");
53cdccd5
CZ
2659 break;
2660 }
2661 }
1f465087 2662
f54d1867 2663 dma_fence_put(fence);
53cdccd5
CZ
2664 fence = next;
2665 }
2666 mutex_unlock(&adev->shadow_list_lock);
2667 if (fence) {
f54d1867 2668 r = dma_fence_wait(fence, false);
53cdccd5 2669 if (r)
1d7b17b0 2670 WARN(r, "recovery from shadow isn't completed\n");
53cdccd5 2671 }
f54d1867 2672 dma_fence_put(fence);
53cdccd5 2673 }
d38ceaf9
AD
2674 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2675 struct amdgpu_ring *ring = adev->rings[i];
2676 if (!ring)
2677 continue;
53cdccd5 2678
aa1c8900 2679 amd_sched_job_recovery(&ring->sched);
0875dc9e 2680 kthread_unpark(ring->sched.thread);
d38ceaf9 2681 }
d38ceaf9 2682 } else {
2200edac 2683 dev_err(adev->dev, "asic resume failed (%d).\n", r);
d38ceaf9 2684 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
0875dc9e
CZ
2685 if (adev->rings[i]) {
2686 kthread_unpark(adev->rings[i]->sched.thread);
0875dc9e 2687 }
d38ceaf9
AD
2688 }
2689 }
2690
2691 drm_helper_resume_force_mode(adev->ddev);
2692
2693 ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched);
2694 if (r) {
2695 /* bad news, how to tell it to userspace ? */
2696 dev_info(adev->dev, "GPU reset failed\n");
2697 }
2698
d38ceaf9
AD
2699 return r;
2700}
2701
d0dd7f0c
AD
2702void amdgpu_get_pcie_info(struct amdgpu_device *adev)
2703{
2704 u32 mask;
2705 int ret;
2706
cd474ba0
AD
2707 if (amdgpu_pcie_gen_cap)
2708 adev->pm.pcie_gen_mask = amdgpu_pcie_gen_cap;
d0dd7f0c 2709
cd474ba0
AD
2710 if (amdgpu_pcie_lane_cap)
2711 adev->pm.pcie_mlw_mask = amdgpu_pcie_lane_cap;
d0dd7f0c 2712
cd474ba0
AD
2713 /* covers APUs as well */
2714 if (pci_is_root_bus(adev->pdev->bus)) {
2715 if (adev->pm.pcie_gen_mask == 0)
2716 adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK;
2717 if (adev->pm.pcie_mlw_mask == 0)
2718 adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;
d0dd7f0c 2719 return;
cd474ba0 2720 }
d0dd7f0c 2721
cd474ba0
AD
2722 if (adev->pm.pcie_gen_mask == 0) {
2723 ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
2724 if (!ret) {
2725 adev->pm.pcie_gen_mask = (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
2726 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
2727 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3);
2728
2729 if (mask & DRM_PCIE_SPEED_25)
2730 adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1;
2731 if (mask & DRM_PCIE_SPEED_50)
2732 adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2;
2733 if (mask & DRM_PCIE_SPEED_80)
2734 adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3;
2735 } else {
2736 adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK;
2737 }
2738 }
2739 if (adev->pm.pcie_mlw_mask == 0) {
2740 ret = drm_pcie_get_max_link_width(adev->ddev, &mask);
2741 if (!ret) {
2742 switch (mask) {
2743 case 32:
2744 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |
2745 CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
2746 CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
2747 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
2748 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
2749 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
2750 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
2751 break;
2752 case 16:
2753 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
2754 CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
2755 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
2756 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
2757 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
2758 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
2759 break;
2760 case 12:
2761 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
2762 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
2763 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
2764 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
2765 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
2766 break;
2767 case 8:
2768 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
2769 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
2770 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
2771 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
2772 break;
2773 case 4:
2774 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
2775 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
2776 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
2777 break;
2778 case 2:
2779 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
2780 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
2781 break;
2782 case 1:
2783 adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1;
2784 break;
2785 default:
2786 break;
2787 }
2788 } else {
2789 adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;
d0dd7f0c
AD
2790 }
2791 }
2792}
d38ceaf9
AD
2793
2794/*
2795 * Debugfs
2796 */
2797int amdgpu_debugfs_add_files(struct amdgpu_device *adev,
06ab6832 2798 const struct drm_info_list *files,
d38ceaf9
AD
2799 unsigned nfiles)
2800{
2801 unsigned i;
2802
2803 for (i = 0; i < adev->debugfs_count; i++) {
2804 if (adev->debugfs[i].files == files) {
2805 /* Already registered */
2806 return 0;
2807 }
2808 }
2809
2810 i = adev->debugfs_count + 1;
2811 if (i > AMDGPU_DEBUGFS_MAX_COMPONENTS) {
2812 DRM_ERROR("Reached maximum number of debugfs components.\n");
2813 DRM_ERROR("Report so we increase "
2814 "AMDGPU_DEBUGFS_MAX_COMPONENTS.\n");
2815 return -EINVAL;
2816 }
2817 adev->debugfs[adev->debugfs_count].files = files;
2818 adev->debugfs[adev->debugfs_count].num_files = nfiles;
2819 adev->debugfs_count = i;
2820#if defined(CONFIG_DEBUG_FS)
d38ceaf9
AD
2821 drm_debugfs_create_files(files, nfiles,
2822 adev->ddev->primary->debugfs_root,
2823 adev->ddev->primary);
2824#endif
2825 return 0;
2826}
2827
d38ceaf9
AD
2828#if defined(CONFIG_DEBUG_FS)
2829
2830static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
2831 size_t size, loff_t *pos)
2832{
45063097 2833 struct amdgpu_device *adev = file_inode(f)->i_private;
d38ceaf9
AD
2834 ssize_t result = 0;
2835 int r;
bd12267d 2836 bool pm_pg_lock, use_bank;
56628159 2837 unsigned instance_bank, sh_bank, se_bank;
d38ceaf9
AD
2838
2839 if (size & 0x3 || *pos & 0x3)
2840 return -EINVAL;
2841
bd12267d
TSD
2842 /* are we reading registers for which a PG lock is necessary? */
2843 pm_pg_lock = (*pos >> 23) & 1;
2844
56628159
TSD
2845 if (*pos & (1ULL << 62)) {
2846 se_bank = (*pos >> 24) & 0x3FF;
2847 sh_bank = (*pos >> 34) & 0x3FF;
2848 instance_bank = (*pos >> 44) & 0x3FF;
32977f93
TSD
2849
2850 if (se_bank == 0x3FF)
2851 se_bank = 0xFFFFFFFF;
2852 if (sh_bank == 0x3FF)
2853 sh_bank = 0xFFFFFFFF;
2854 if (instance_bank == 0x3FF)
2855 instance_bank = 0xFFFFFFFF;
56628159 2856 use_bank = 1;
56628159
TSD
2857 } else {
2858 use_bank = 0;
2859 }
2860
801a6aa9 2861 *pos &= (1UL << 22) - 1;
bd12267d 2862
56628159 2863 if (use_bank) {
32977f93
TSD
2864 if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||
2865 (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines))
56628159
TSD
2866 return -EINVAL;
2867 mutex_lock(&adev->grbm_idx_mutex);
2868 amdgpu_gfx_select_se_sh(adev, se_bank,
2869 sh_bank, instance_bank);
2870 }
2871
bd12267d
TSD
2872 if (pm_pg_lock)
2873 mutex_lock(&adev->pm.mutex);
2874
d38ceaf9
AD
2875 while (size) {
2876 uint32_t value;
2877
2878 if (*pos > adev->rmmio_size)
56628159 2879 goto end;
d38ceaf9
AD
2880
2881 value = RREG32(*pos >> 2);
2882 r = put_user(value, (uint32_t *)buf);
56628159
TSD
2883 if (r) {
2884 result = r;
2885 goto end;
2886 }
d38ceaf9
AD
2887
2888 result += 4;
2889 buf += 4;
2890 *pos += 4;
2891 size -= 4;
2892 }
2893
56628159
TSD
2894end:
2895 if (use_bank) {
2896 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
2897 mutex_unlock(&adev->grbm_idx_mutex);
2898 }
2899
bd12267d
TSD
2900 if (pm_pg_lock)
2901 mutex_unlock(&adev->pm.mutex);
2902
d38ceaf9
AD
2903 return result;
2904}
2905
2906static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf,
2907 size_t size, loff_t *pos)
2908{
45063097 2909 struct amdgpu_device *adev = file_inode(f)->i_private;
d38ceaf9
AD
2910 ssize_t result = 0;
2911 int r;
394fdde2
TSD
2912 bool pm_pg_lock, use_bank;
2913 unsigned instance_bank, sh_bank, se_bank;
d38ceaf9
AD
2914
2915 if (size & 0x3 || *pos & 0x3)
2916 return -EINVAL;
2917
394fdde2
TSD
2918 /* are we reading registers for which a PG lock is necessary? */
2919 pm_pg_lock = (*pos >> 23) & 1;
2920
2921 if (*pos & (1ULL << 62)) {
2922 se_bank = (*pos >> 24) & 0x3FF;
2923 sh_bank = (*pos >> 34) & 0x3FF;
2924 instance_bank = (*pos >> 44) & 0x3FF;
2925
2926 if (se_bank == 0x3FF)
2927 se_bank = 0xFFFFFFFF;
2928 if (sh_bank == 0x3FF)
2929 sh_bank = 0xFFFFFFFF;
2930 if (instance_bank == 0x3FF)
2931 instance_bank = 0xFFFFFFFF;
2932 use_bank = 1;
2933 } else {
2934 use_bank = 0;
2935 }
2936
801a6aa9 2937 *pos &= (1UL << 22) - 1;
394fdde2
TSD
2938
2939 if (use_bank) {
2940 if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||
2941 (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines))
2942 return -EINVAL;
2943 mutex_lock(&adev->grbm_idx_mutex);
2944 amdgpu_gfx_select_se_sh(adev, se_bank,
2945 sh_bank, instance_bank);
2946 }
2947
2948 if (pm_pg_lock)
2949 mutex_lock(&adev->pm.mutex);
2950
d38ceaf9
AD
2951 while (size) {
2952 uint32_t value;
2953
2954 if (*pos > adev->rmmio_size)
2955 return result;
2956
2957 r = get_user(value, (uint32_t *)buf);
2958 if (r)
2959 return r;
2960
2961 WREG32(*pos >> 2, value);
2962
2963 result += 4;
2964 buf += 4;
2965 *pos += 4;
2966 size -= 4;
2967 }
2968
394fdde2
TSD
2969 if (use_bank) {
2970 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
2971 mutex_unlock(&adev->grbm_idx_mutex);
2972 }
2973
2974 if (pm_pg_lock)
2975 mutex_unlock(&adev->pm.mutex);
2976
d38ceaf9
AD
2977 return result;
2978}
2979
adcec288
TSD
2980static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
2981 size_t size, loff_t *pos)
2982{
45063097 2983 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
2984 ssize_t result = 0;
2985 int r;
2986
2987 if (size & 0x3 || *pos & 0x3)
2988 return -EINVAL;
2989
2990 while (size) {
2991 uint32_t value;
2992
2993 value = RREG32_PCIE(*pos >> 2);
2994 r = put_user(value, (uint32_t *)buf);
2995 if (r)
2996 return r;
2997
2998 result += 4;
2999 buf += 4;
3000 *pos += 4;
3001 size -= 4;
3002 }
3003
3004 return result;
3005}
3006
3007static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user *buf,
3008 size_t size, loff_t *pos)
3009{
45063097 3010 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3011 ssize_t result = 0;
3012 int r;
3013
3014 if (size & 0x3 || *pos & 0x3)
3015 return -EINVAL;
3016
3017 while (size) {
3018 uint32_t value;
3019
3020 r = get_user(value, (uint32_t *)buf);
3021 if (r)
3022 return r;
3023
3024 WREG32_PCIE(*pos >> 2, value);
3025
3026 result += 4;
3027 buf += 4;
3028 *pos += 4;
3029 size -= 4;
3030 }
3031
3032 return result;
3033}
3034
3035static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,
3036 size_t size, loff_t *pos)
3037{
45063097 3038 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3039 ssize_t result = 0;
3040 int r;
3041
3042 if (size & 0x3 || *pos & 0x3)
3043 return -EINVAL;
3044
3045 while (size) {
3046 uint32_t value;
3047
3048 value = RREG32_DIDT(*pos >> 2);
3049 r = put_user(value, (uint32_t *)buf);
3050 if (r)
3051 return r;
3052
3053 result += 4;
3054 buf += 4;
3055 *pos += 4;
3056 size -= 4;
3057 }
3058
3059 return result;
3060}
3061
3062static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user *buf,
3063 size_t size, loff_t *pos)
3064{
45063097 3065 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3066 ssize_t result = 0;
3067 int r;
3068
3069 if (size & 0x3 || *pos & 0x3)
3070 return -EINVAL;
3071
3072 while (size) {
3073 uint32_t value;
3074
3075 r = get_user(value, (uint32_t *)buf);
3076 if (r)
3077 return r;
3078
3079 WREG32_DIDT(*pos >> 2, value);
3080
3081 result += 4;
3082 buf += 4;
3083 *pos += 4;
3084 size -= 4;
3085 }
3086
3087 return result;
3088}
3089
3090static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,
3091 size_t size, loff_t *pos)
3092{
45063097 3093 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3094 ssize_t result = 0;
3095 int r;
3096
3097 if (size & 0x3 || *pos & 0x3)
3098 return -EINVAL;
3099
3100 while (size) {
3101 uint32_t value;
3102
6fc0deaf 3103 value = RREG32_SMC(*pos);
adcec288
TSD
3104 r = put_user(value, (uint32_t *)buf);
3105 if (r)
3106 return r;
3107
3108 result += 4;
3109 buf += 4;
3110 *pos += 4;
3111 size -= 4;
3112 }
3113
3114 return result;
3115}
3116
3117static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *buf,
3118 size_t size, loff_t *pos)
3119{
45063097 3120 struct amdgpu_device *adev = file_inode(f)->i_private;
adcec288
TSD
3121 ssize_t result = 0;
3122 int r;
3123
3124 if (size & 0x3 || *pos & 0x3)
3125 return -EINVAL;
3126
3127 while (size) {
3128 uint32_t value;
3129
3130 r = get_user(value, (uint32_t *)buf);
3131 if (r)
3132 return r;
3133
6fc0deaf 3134 WREG32_SMC(*pos, value);
adcec288
TSD
3135
3136 result += 4;
3137 buf += 4;
3138 *pos += 4;
3139 size -= 4;
3140 }
3141
3142 return result;
3143}
3144
1e051413
TSD
3145static ssize_t amdgpu_debugfs_gca_config_read(struct file *f, char __user *buf,
3146 size_t size, loff_t *pos)
3147{
45063097 3148 struct amdgpu_device *adev = file_inode(f)->i_private;
1e051413
TSD
3149 ssize_t result = 0;
3150 int r;
3151 uint32_t *config, no_regs = 0;
3152
3153 if (size & 0x3 || *pos & 0x3)
3154 return -EINVAL;
3155
ecab7668 3156 config = kmalloc_array(256, sizeof(*config), GFP_KERNEL);
1e051413
TSD
3157 if (!config)
3158 return -ENOMEM;
3159
3160 /* version, increment each time something is added */
9a999359 3161 config[no_regs++] = 3;
1e051413
TSD
3162 config[no_regs++] = adev->gfx.config.max_shader_engines;
3163 config[no_regs++] = adev->gfx.config.max_tile_pipes;
3164 config[no_regs++] = adev->gfx.config.max_cu_per_sh;
3165 config[no_regs++] = adev->gfx.config.max_sh_per_se;
3166 config[no_regs++] = adev->gfx.config.max_backends_per_se;
3167 config[no_regs++] = adev->gfx.config.max_texture_channel_caches;
3168 config[no_regs++] = adev->gfx.config.max_gprs;
3169 config[no_regs++] = adev->gfx.config.max_gs_threads;
3170 config[no_regs++] = adev->gfx.config.max_hw_contexts;
3171 config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_frontend;
3172 config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_backend;
3173 config[no_regs++] = adev->gfx.config.sc_hiz_tile_fifo_size;
3174 config[no_regs++] = adev->gfx.config.sc_earlyz_tile_fifo_size;
3175 config[no_regs++] = adev->gfx.config.num_tile_pipes;
3176 config[no_regs++] = adev->gfx.config.backend_enable_mask;
3177 config[no_regs++] = adev->gfx.config.mem_max_burst_length_bytes;
3178 config[no_regs++] = adev->gfx.config.mem_row_size_in_kb;
3179 config[no_regs++] = adev->gfx.config.shader_engine_tile_size;
3180 config[no_regs++] = adev->gfx.config.num_gpus;
3181 config[no_regs++] = adev->gfx.config.multi_gpu_tile_size;
3182 config[no_regs++] = adev->gfx.config.mc_arb_ramcfg;
3183 config[no_regs++] = adev->gfx.config.gb_addr_config;
3184 config[no_regs++] = adev->gfx.config.num_rbs;
3185
89a8f309
TSD
3186 /* rev==1 */
3187 config[no_regs++] = adev->rev_id;
3188 config[no_regs++] = adev->pg_flags;
3189 config[no_regs++] = adev->cg_flags;
3190
e9f11dc8
TSD
3191 /* rev==2 */
3192 config[no_regs++] = adev->family;
3193 config[no_regs++] = adev->external_rev_id;
3194
9a999359
TSD
3195 /* rev==3 */
3196 config[no_regs++] = adev->pdev->device;
3197 config[no_regs++] = adev->pdev->revision;
3198 config[no_regs++] = adev->pdev->subsystem_device;
3199 config[no_regs++] = adev->pdev->subsystem_vendor;
3200
1e051413
TSD
3201 while (size && (*pos < no_regs * 4)) {
3202 uint32_t value;
3203
3204 value = config[*pos >> 2];
3205 r = put_user(value, (uint32_t *)buf);
3206 if (r) {
3207 kfree(config);
3208 return r;
3209 }
3210
3211 result += 4;
3212 buf += 4;
3213 *pos += 4;
3214 size -= 4;
3215 }
3216
3217 kfree(config);
3218 return result;
3219}
3220
f2cdaf20
TSD
3221static ssize_t amdgpu_debugfs_sensor_read(struct file *f, char __user *buf,
3222 size_t size, loff_t *pos)
3223{
45063097 3224 struct amdgpu_device *adev = file_inode(f)->i_private;
9f8df7d7
TSD
3225 int idx, x, outsize, r, valuesize;
3226 uint32_t values[16];
f2cdaf20 3227
9f8df7d7 3228 if (size & 3 || *pos & 0x3)
f2cdaf20
TSD
3229 return -EINVAL;
3230
3cbc614f
SP
3231 if (amdgpu_dpm == 0)
3232 return -EINVAL;
3233
f2cdaf20
TSD
3234 /* convert offset to sensor number */
3235 idx = *pos >> 2;
3236
9f8df7d7 3237 valuesize = sizeof(values);
f2cdaf20 3238 if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->read_sensor)
9f8df7d7 3239 r = adev->powerplay.pp_funcs->read_sensor(adev->powerplay.pp_handle, idx, &values[0], &valuesize);
3cbc614f
SP
3240 else if (adev->pm.funcs && adev->pm.funcs->read_sensor)
3241 r = adev->pm.funcs->read_sensor(adev, idx, &values[0],
3242 &valuesize);
f2cdaf20
TSD
3243 else
3244 return -EINVAL;
3245
9f8df7d7
TSD
3246 if (size > valuesize)
3247 return -EINVAL;
3248
3249 outsize = 0;
3250 x = 0;
3251 if (!r) {
3252 while (size) {
3253 r = put_user(values[x++], (int32_t *)buf);
3254 buf += 4;
3255 size -= 4;
3256 outsize += 4;
3257 }
3258 }
f2cdaf20 3259
9f8df7d7 3260 return !r ? outsize : r;
f2cdaf20 3261}
1e051413 3262
273d7aa1
TSD
3263static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf,
3264 size_t size, loff_t *pos)
3265{
3266 struct amdgpu_device *adev = f->f_inode->i_private;
3267 int r, x;
3268 ssize_t result=0;
472259f0 3269 uint32_t offset, se, sh, cu, wave, simd, data[32];
273d7aa1
TSD
3270
3271 if (size & 3 || *pos & 3)
3272 return -EINVAL;
3273
3274 /* decode offset */
3275 offset = (*pos & 0x7F);
3276 se = ((*pos >> 7) & 0xFF);
3277 sh = ((*pos >> 15) & 0xFF);
3278 cu = ((*pos >> 23) & 0xFF);
3279 wave = ((*pos >> 31) & 0xFF);
3280 simd = ((*pos >> 37) & 0xFF);
273d7aa1
TSD
3281
3282 /* switch to the specific se/sh/cu */
3283 mutex_lock(&adev->grbm_idx_mutex);
3284 amdgpu_gfx_select_se_sh(adev, se, sh, cu);
3285
3286 x = 0;
472259f0
TSD
3287 if (adev->gfx.funcs->read_wave_data)
3288 adev->gfx.funcs->read_wave_data(adev, simd, wave, data, &x);
273d7aa1
TSD
3289
3290 amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
3291 mutex_unlock(&adev->grbm_idx_mutex);
3292
5ecfb3b8
TSD
3293 if (!x)
3294 return -EINVAL;
3295
472259f0 3296 while (size && (offset < x * 4)) {
273d7aa1
TSD
3297 uint32_t value;
3298
472259f0 3299 value = data[offset >> 2];
273d7aa1
TSD
3300 r = put_user(value, (uint32_t *)buf);
3301 if (r)
3302 return r;
3303
3304 result += 4;
3305 buf += 4;
472259f0 3306 offset += 4;
273d7aa1
TSD
3307 size -= 4;
3308 }
3309
3310 return result;
3311}
3312
c5a60ce8
TSD
3313static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,
3314 size_t size, loff_t *pos)
3315{
3316 struct amdgpu_device *adev = f->f_inode->i_private;
3317 int r;
3318 ssize_t result = 0;
3319 uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data;
3320
3321 if (size & 3 || *pos & 3)
3322 return -EINVAL;
3323
3324 /* decode offset */
3325 offset = (*pos & 0xFFF); /* in dwords */
3326 se = ((*pos >> 12) & 0xFF);
3327 sh = ((*pos >> 20) & 0xFF);
3328 cu = ((*pos >> 28) & 0xFF);
3329 wave = ((*pos >> 36) & 0xFF);
3330 simd = ((*pos >> 44) & 0xFF);
3331 thread = ((*pos >> 52) & 0xFF);
3332 bank = ((*pos >> 60) & 1);
3333
3334 data = kmalloc_array(1024, sizeof(*data), GFP_KERNEL);
3335 if (!data)
3336 return -ENOMEM;
3337
3338 /* switch to the specific se/sh/cu */
3339 mutex_lock(&adev->grbm_idx_mutex);
3340 amdgpu_gfx_select_se_sh(adev, se, sh, cu);
3341
3342 if (bank == 0) {
3343 if (adev->gfx.funcs->read_wave_vgprs)
3344 adev->gfx.funcs->read_wave_vgprs(adev, simd, wave, thread, offset, size>>2, data);
3345 } else {
3346 if (adev->gfx.funcs->read_wave_sgprs)
3347 adev->gfx.funcs->read_wave_sgprs(adev, simd, wave, offset, size>>2, data);
3348 }
3349
3350 amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
3351 mutex_unlock(&adev->grbm_idx_mutex);
3352
3353 while (size) {
3354 uint32_t value;
3355
3356 value = data[offset++];
3357 r = put_user(value, (uint32_t *)buf);
3358 if (r) {
3359 result = r;
3360 goto err;
3361 }
3362
3363 result += 4;
3364 buf += 4;
3365 size -= 4;
3366 }
3367
3368err:
3369 kfree(data);
3370 return result;
3371}
3372
d38ceaf9
AD
3373static const struct file_operations amdgpu_debugfs_regs_fops = {
3374 .owner = THIS_MODULE,
3375 .read = amdgpu_debugfs_regs_read,
3376 .write = amdgpu_debugfs_regs_write,
3377 .llseek = default_llseek
3378};
adcec288
TSD
3379static const struct file_operations amdgpu_debugfs_regs_didt_fops = {
3380 .owner = THIS_MODULE,
3381 .read = amdgpu_debugfs_regs_didt_read,
3382 .write = amdgpu_debugfs_regs_didt_write,
3383 .llseek = default_llseek
3384};
3385static const struct file_operations amdgpu_debugfs_regs_pcie_fops = {
3386 .owner = THIS_MODULE,
3387 .read = amdgpu_debugfs_regs_pcie_read,
3388 .write = amdgpu_debugfs_regs_pcie_write,
3389 .llseek = default_llseek
3390};
3391static const struct file_operations amdgpu_debugfs_regs_smc_fops = {
3392 .owner = THIS_MODULE,
3393 .read = amdgpu_debugfs_regs_smc_read,
3394 .write = amdgpu_debugfs_regs_smc_write,
3395 .llseek = default_llseek
3396};
3397
1e051413
TSD
3398static const struct file_operations amdgpu_debugfs_gca_config_fops = {
3399 .owner = THIS_MODULE,
3400 .read = amdgpu_debugfs_gca_config_read,
3401 .llseek = default_llseek
3402};
3403
f2cdaf20
TSD
3404static const struct file_operations amdgpu_debugfs_sensors_fops = {
3405 .owner = THIS_MODULE,
3406 .read = amdgpu_debugfs_sensor_read,
3407 .llseek = default_llseek
3408};
3409
273d7aa1
TSD
3410static const struct file_operations amdgpu_debugfs_wave_fops = {
3411 .owner = THIS_MODULE,
3412 .read = amdgpu_debugfs_wave_read,
3413 .llseek = default_llseek
3414};
c5a60ce8
TSD
3415static const struct file_operations amdgpu_debugfs_gpr_fops = {
3416 .owner = THIS_MODULE,
3417 .read = amdgpu_debugfs_gpr_read,
3418 .llseek = default_llseek
3419};
273d7aa1 3420
adcec288
TSD
3421static const struct file_operations *debugfs_regs[] = {
3422 &amdgpu_debugfs_regs_fops,
3423 &amdgpu_debugfs_regs_didt_fops,
3424 &amdgpu_debugfs_regs_pcie_fops,
3425 &amdgpu_debugfs_regs_smc_fops,
1e051413 3426 &amdgpu_debugfs_gca_config_fops,
f2cdaf20 3427 &amdgpu_debugfs_sensors_fops,
273d7aa1 3428 &amdgpu_debugfs_wave_fops,
c5a60ce8 3429 &amdgpu_debugfs_gpr_fops,
adcec288
TSD
3430};
3431
3432static const char *debugfs_regs_names[] = {
3433 "amdgpu_regs",
3434 "amdgpu_regs_didt",
3435 "amdgpu_regs_pcie",
3436 "amdgpu_regs_smc",
1e051413 3437 "amdgpu_gca_config",
f2cdaf20 3438 "amdgpu_sensors",
273d7aa1 3439 "amdgpu_wave",
c5a60ce8 3440 "amdgpu_gpr",
adcec288 3441};
d38ceaf9
AD
3442
3443static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
3444{
3445 struct drm_minor *minor = adev->ddev->primary;
3446 struct dentry *ent, *root = minor->debugfs_root;
adcec288
TSD
3447 unsigned i, j;
3448
3449 for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
3450 ent = debugfs_create_file(debugfs_regs_names[i],
3451 S_IFREG | S_IRUGO, root,
3452 adev, debugfs_regs[i]);
3453 if (IS_ERR(ent)) {
3454 for (j = 0; j < i; j++) {
3455 debugfs_remove(adev->debugfs_regs[i]);
3456 adev->debugfs_regs[i] = NULL;
3457 }
3458 return PTR_ERR(ent);
3459 }
d38ceaf9 3460
adcec288
TSD
3461 if (!i)
3462 i_size_write(ent->d_inode, adev->rmmio_size);
3463 adev->debugfs_regs[i] = ent;
3464 }
d38ceaf9
AD
3465
3466 return 0;
3467}
3468
3469static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev)
3470{
adcec288
TSD
3471 unsigned i;
3472
3473 for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
3474 if (adev->debugfs_regs[i]) {
3475 debugfs_remove(adev->debugfs_regs[i]);
3476 adev->debugfs_regs[i] = NULL;
3477 }
3478 }
d38ceaf9
AD
3479}
3480
3481int amdgpu_debugfs_init(struct drm_minor *minor)
3482{
3483 return 0;
3484}
7cebc728
AK
3485#else
3486static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
3487{
3488 return 0;
3489}
3490static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev) { }
d38ceaf9 3491#endif