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