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