drm/amdgpu: Change AI gfx/sdma/smu init sequence
[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 */
b1ddf548 28#include <linux/power_supply.h>
0875dc9e 29#include <linux/kthread.h>
d38ceaf9
AD
30#include <linux/console.h>
31#include <linux/slab.h>
d38ceaf9
AD
32#include <drm/drmP.h>
33#include <drm/drm_crtc_helper.h>
4562236b 34#include <drm/drm_atomic_helper.h>
d38ceaf9
AD
35#include <drm/amdgpu_drm.h>
36#include <linux/vgaarb.h>
37#include <linux/vga_switcheroo.h>
38#include <linux/efi.h>
39#include "amdgpu.h"
f4b373f4 40#include "amdgpu_trace.h"
d38ceaf9
AD
41#include "amdgpu_i2c.h"
42#include "atom.h"
43#include "amdgpu_atombios.h"
a5bde2f9 44#include "amdgpu_atomfirmware.h"
d0dd7f0c 45#include "amd_pcie.h"
33f34802
KW
46#ifdef CONFIG_DRM_AMDGPU_SI
47#include "si.h"
48#endif
a2e73f56
AD
49#ifdef CONFIG_DRM_AMDGPU_CIK
50#include "cik.h"
51#endif
aaa36a97 52#include "vi.h"
460826e6 53#include "soc15.h"
d38ceaf9 54#include "bif/bif_4_1_d.h"
9accf2fd 55#include <linux/pci.h>
bec86378 56#include <linux/firmware.h>
89041940 57#include "amdgpu_vf_error.h"
d38ceaf9 58
ba997709 59#include "amdgpu_amdkfd.h"
d2f52ac8 60#include "amdgpu_pm.h"
d38ceaf9 61
e2a75f88 62MODULE_FIRMWARE("amdgpu/vega10_gpu_info.bin");
3f76dced 63MODULE_FIRMWARE("amdgpu/vega12_gpu_info.bin");
2d2e5e7e 64MODULE_FIRMWARE("amdgpu/raven_gpu_info.bin");
ad5a67a7 65MODULE_FIRMWARE("amdgpu/picasso_gpu_info.bin");
54c4d17e 66MODULE_FIRMWARE("amdgpu/raven2_gpu_info.bin");
e2a75f88 67
2dc80b00
S
68#define AMDGPU_RESUME_MS 2000
69
d38ceaf9 70static const char *amdgpu_asic_name[] = {
da69c161
KW
71 "TAHITI",
72 "PITCAIRN",
73 "VERDE",
74 "OLAND",
75 "HAINAN",
d38ceaf9
AD
76 "BONAIRE",
77 "KAVERI",
78 "KABINI",
79 "HAWAII",
80 "MULLINS",
81 "TOPAZ",
82 "TONGA",
48299f95 83 "FIJI",
d38ceaf9 84 "CARRIZO",
139f4917 85 "STONEY",
2cc0c0b5
FC
86 "POLARIS10",
87 "POLARIS11",
c4642a47 88 "POLARIS12",
48ff108d 89 "VEGAM",
d4196f01 90 "VEGA10",
8fab806a 91 "VEGA12",
956fcddc 92 "VEGA20",
2ca8a5d2 93 "RAVEN",
d38ceaf9
AD
94 "LAST",
95};
96
5494d864
AD
97static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev);
98
e3ecdffa
AD
99/**
100 * amdgpu_device_is_px - Is the device is a dGPU with HG/PX power control
101 *
102 * @dev: drm_device pointer
103 *
104 * Returns true if the device is a dGPU with HG/PX power control,
105 * otherwise return false.
106 */
d38ceaf9
AD
107bool amdgpu_device_is_px(struct drm_device *dev)
108{
109 struct amdgpu_device *adev = dev->dev_private;
110
2f7d10b3 111 if (adev->flags & AMD_IS_PX)
d38ceaf9
AD
112 return true;
113 return false;
114}
115
116/*
117 * MMIO register access helper functions.
118 */
e3ecdffa
AD
119/**
120 * amdgpu_mm_rreg - read a memory mapped IO register
121 *
122 * @adev: amdgpu_device pointer
123 * @reg: dword aligned register offset
124 * @acc_flags: access flags which require special behavior
125 *
126 * Returns the 32 bit value from the offset specified.
127 */
d38ceaf9 128uint32_t amdgpu_mm_rreg(struct amdgpu_device *adev, uint32_t reg,
15d72fd7 129 uint32_t acc_flags)
d38ceaf9 130{
f4b373f4
TSD
131 uint32_t ret;
132
43ca8efa 133 if (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev))
bc992ba5 134 return amdgpu_virt_kiq_rreg(adev, reg);
bc992ba5 135
15d72fd7 136 if ((reg * 4) < adev->rmmio_size && !(acc_flags & AMDGPU_REGS_IDX))
f4b373f4 137 ret = readl(((void __iomem *)adev->rmmio) + (reg * 4));
d38ceaf9
AD
138 else {
139 unsigned long flags;
d38ceaf9
AD
140
141 spin_lock_irqsave(&adev->mmio_idx_lock, flags);
142 writel((reg * 4), ((void __iomem *)adev->rmmio) + (mmMM_INDEX * 4));
143 ret = readl(((void __iomem *)adev->rmmio) + (mmMM_DATA * 4));
144 spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
d38ceaf9 145 }
f4b373f4
TSD
146 trace_amdgpu_mm_rreg(adev->pdev->device, reg, ret);
147 return ret;
d38ceaf9
AD
148}
149
421a2a30
ML
150/*
151 * MMIO register read with bytes helper functions
152 * @offset:bytes offset from MMIO start
153 *
154*/
155
e3ecdffa
AD
156/**
157 * amdgpu_mm_rreg8 - read a memory mapped IO register
158 *
159 * @adev: amdgpu_device pointer
160 * @offset: byte aligned register offset
161 *
162 * Returns the 8 bit value from the offset specified.
163 */
421a2a30
ML
164uint8_t amdgpu_mm_rreg8(struct amdgpu_device *adev, uint32_t offset) {
165 if (offset < adev->rmmio_size)
166 return (readb(adev->rmmio + offset));
167 BUG();
168}
169
170/*
171 * MMIO register write with bytes helper functions
172 * @offset:bytes offset from MMIO start
173 * @value: the value want to be written to the register
174 *
175*/
e3ecdffa
AD
176/**
177 * amdgpu_mm_wreg8 - read a memory mapped IO register
178 *
179 * @adev: amdgpu_device pointer
180 * @offset: byte aligned register offset
181 * @value: 8 bit value to write
182 *
183 * Writes the value specified to the offset specified.
184 */
421a2a30
ML
185void amdgpu_mm_wreg8(struct amdgpu_device *adev, uint32_t offset, uint8_t value) {
186 if (offset < adev->rmmio_size)
187 writeb(value, adev->rmmio + offset);
188 else
189 BUG();
190}
191
e3ecdffa
AD
192/**
193 * amdgpu_mm_wreg - write to a memory mapped IO register
194 *
195 * @adev: amdgpu_device pointer
196 * @reg: dword aligned register offset
197 * @v: 32 bit value to write to the register
198 * @acc_flags: access flags which require special behavior
199 *
200 * Writes the value specified to the offset specified.
201 */
d38ceaf9 202void amdgpu_mm_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v,
15d72fd7 203 uint32_t acc_flags)
d38ceaf9 204{
f4b373f4 205 trace_amdgpu_mm_wreg(adev->pdev->device, reg, v);
4e99a44e 206
47ed4e1c
KW
207 if (adev->asic_type >= CHIP_VEGA10 && reg == 0) {
208 adev->last_mm_index = v;
209 }
210
43ca8efa 211 if (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev))
bc992ba5 212 return amdgpu_virt_kiq_wreg(adev, reg, v);
bc992ba5 213
15d72fd7 214 if ((reg * 4) < adev->rmmio_size && !(acc_flags & AMDGPU_REGS_IDX))
d38ceaf9
AD
215 writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
216 else {
217 unsigned long flags;
218
219 spin_lock_irqsave(&adev->mmio_idx_lock, flags);
220 writel((reg * 4), ((void __iomem *)adev->rmmio) + (mmMM_INDEX * 4));
221 writel(v, ((void __iomem *)adev->rmmio) + (mmMM_DATA * 4));
222 spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
223 }
47ed4e1c
KW
224
225 if (adev->asic_type >= CHIP_VEGA10 && reg == 1 && adev->last_mm_index == 0x5702C) {
226 udelay(500);
227 }
d38ceaf9
AD
228}
229
e3ecdffa
AD
230/**
231 * amdgpu_io_rreg - read an IO register
232 *
233 * @adev: amdgpu_device pointer
234 * @reg: dword aligned register offset
235 *
236 * Returns the 32 bit value from the offset specified.
237 */
d38ceaf9
AD
238u32 amdgpu_io_rreg(struct amdgpu_device *adev, u32 reg)
239{
240 if ((reg * 4) < adev->rio_mem_size)
241 return ioread32(adev->rio_mem + (reg * 4));
242 else {
243 iowrite32((reg * 4), adev->rio_mem + (mmMM_INDEX * 4));
244 return ioread32(adev->rio_mem + (mmMM_DATA * 4));
245 }
246}
247
e3ecdffa
AD
248/**
249 * amdgpu_io_wreg - write to an IO register
250 *
251 * @adev: amdgpu_device pointer
252 * @reg: dword aligned register offset
253 * @v: 32 bit value to write to the register
254 *
255 * Writes the value specified to the offset specified.
256 */
d38ceaf9
AD
257void amdgpu_io_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
258{
47ed4e1c
KW
259 if (adev->asic_type >= CHIP_VEGA10 && reg == 0) {
260 adev->last_mm_index = v;
261 }
d38ceaf9
AD
262
263 if ((reg * 4) < adev->rio_mem_size)
264 iowrite32(v, adev->rio_mem + (reg * 4));
265 else {
266 iowrite32((reg * 4), adev->rio_mem + (mmMM_INDEX * 4));
267 iowrite32(v, adev->rio_mem + (mmMM_DATA * 4));
268 }
47ed4e1c
KW
269
270 if (adev->asic_type >= CHIP_VEGA10 && reg == 1 && adev->last_mm_index == 0x5702C) {
271 udelay(500);
272 }
d38ceaf9
AD
273}
274
275/**
276 * amdgpu_mm_rdoorbell - read a doorbell dword
277 *
278 * @adev: amdgpu_device pointer
279 * @index: doorbell index
280 *
281 * Returns the value in the doorbell aperture at the
282 * requested doorbell index (CIK).
283 */
284u32 amdgpu_mm_rdoorbell(struct amdgpu_device *adev, u32 index)
285{
286 if (index < adev->doorbell.num_doorbells) {
287 return readl(adev->doorbell.ptr + index);
288 } else {
289 DRM_ERROR("reading beyond doorbell aperture: 0x%08x!\n", index);
290 return 0;
291 }
292}
293
294/**
295 * amdgpu_mm_wdoorbell - write a doorbell dword
296 *
297 * @adev: amdgpu_device pointer
298 * @index: doorbell index
299 * @v: value to write
300 *
301 * Writes @v to the doorbell aperture at the
302 * requested doorbell index (CIK).
303 */
304void amdgpu_mm_wdoorbell(struct amdgpu_device *adev, u32 index, u32 v)
305{
306 if (index < adev->doorbell.num_doorbells) {
307 writel(v, adev->doorbell.ptr + index);
308 } else {
309 DRM_ERROR("writing beyond doorbell aperture: 0x%08x!\n", index);
310 }
311}
312
832be404
KW
313/**
314 * amdgpu_mm_rdoorbell64 - read a doorbell Qword
315 *
316 * @adev: amdgpu_device pointer
317 * @index: doorbell index
318 *
319 * Returns the value in the doorbell aperture at the
320 * requested doorbell index (VEGA10+).
321 */
322u64 amdgpu_mm_rdoorbell64(struct amdgpu_device *adev, u32 index)
323{
324 if (index < adev->doorbell.num_doorbells) {
325 return atomic64_read((atomic64_t *)(adev->doorbell.ptr + index));
326 } else {
327 DRM_ERROR("reading beyond doorbell aperture: 0x%08x!\n", index);
328 return 0;
329 }
330}
331
332/**
333 * amdgpu_mm_wdoorbell64 - write a doorbell Qword
334 *
335 * @adev: amdgpu_device pointer
336 * @index: doorbell index
337 * @v: value to write
338 *
339 * Writes @v to the doorbell aperture at the
340 * requested doorbell index (VEGA10+).
341 */
342void amdgpu_mm_wdoorbell64(struct amdgpu_device *adev, u32 index, u64 v)
343{
344 if (index < adev->doorbell.num_doorbells) {
345 atomic64_set((atomic64_t *)(adev->doorbell.ptr + index), v);
346 } else {
347 DRM_ERROR("writing beyond doorbell aperture: 0x%08x!\n", index);
348 }
349}
350
d38ceaf9
AD
351/**
352 * amdgpu_invalid_rreg - dummy reg read function
353 *
354 * @adev: amdgpu device pointer
355 * @reg: offset of register
356 *
357 * Dummy register read function. Used for register blocks
358 * that certain asics don't have (all asics).
359 * Returns the value in the register.
360 */
361static uint32_t amdgpu_invalid_rreg(struct amdgpu_device *adev, uint32_t reg)
362{
363 DRM_ERROR("Invalid callback to read register 0x%04X\n", reg);
364 BUG();
365 return 0;
366}
367
368/**
369 * amdgpu_invalid_wreg - dummy reg write function
370 *
371 * @adev: amdgpu device pointer
372 * @reg: offset of register
373 * @v: value to write to the register
374 *
375 * Dummy register read function. Used for register blocks
376 * that certain asics don't have (all asics).
377 */
378static void amdgpu_invalid_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v)
379{
380 DRM_ERROR("Invalid callback to write register 0x%04X with 0x%08X\n",
381 reg, v);
382 BUG();
383}
384
385/**
386 * amdgpu_block_invalid_rreg - dummy reg read function
387 *
388 * @adev: amdgpu device pointer
389 * @block: offset of instance
390 * @reg: offset of register
391 *
392 * Dummy register read function. Used for register blocks
393 * that certain asics don't have (all asics).
394 * Returns the value in the register.
395 */
396static uint32_t amdgpu_block_invalid_rreg(struct amdgpu_device *adev,
397 uint32_t block, uint32_t reg)
398{
399 DRM_ERROR("Invalid callback to read register 0x%04X in block 0x%04X\n",
400 reg, block);
401 BUG();
402 return 0;
403}
404
405/**
406 * amdgpu_block_invalid_wreg - dummy reg write function
407 *
408 * @adev: amdgpu device pointer
409 * @block: offset of instance
410 * @reg: offset of register
411 * @v: value to write to the register
412 *
413 * Dummy register read function. Used for register blocks
414 * that certain asics don't have (all asics).
415 */
416static void amdgpu_block_invalid_wreg(struct amdgpu_device *adev,
417 uint32_t block,
418 uint32_t reg, uint32_t v)
419{
420 DRM_ERROR("Invalid block callback to write register 0x%04X in block 0x%04X with 0x%08X\n",
421 reg, block, v);
422 BUG();
423}
424
e3ecdffa
AD
425/**
426 * amdgpu_device_vram_scratch_init - allocate the VRAM scratch page
427 *
428 * @adev: amdgpu device pointer
429 *
430 * Allocates a scratch page of VRAM for use by various things in the
431 * driver.
432 */
06ec9070 433static int amdgpu_device_vram_scratch_init(struct amdgpu_device *adev)
d38ceaf9 434{
a4a02777
CK
435 return amdgpu_bo_create_kernel(adev, AMDGPU_GPU_PAGE_SIZE,
436 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
437 &adev->vram_scratch.robj,
438 &adev->vram_scratch.gpu_addr,
439 (void **)&adev->vram_scratch.ptr);
d38ceaf9
AD
440}
441
e3ecdffa
AD
442/**
443 * amdgpu_device_vram_scratch_fini - Free the VRAM scratch page
444 *
445 * @adev: amdgpu device pointer
446 *
447 * Frees the VRAM scratch page.
448 */
06ec9070 449static void amdgpu_device_vram_scratch_fini(struct amdgpu_device *adev)
d38ceaf9 450{
078af1a3 451 amdgpu_bo_free_kernel(&adev->vram_scratch.robj, NULL, NULL);
d38ceaf9
AD
452}
453
454/**
9c3f2b54 455 * amdgpu_device_program_register_sequence - program an array of registers.
d38ceaf9
AD
456 *
457 * @adev: amdgpu_device pointer
458 * @registers: pointer to the register array
459 * @array_size: size of the register array
460 *
461 * Programs an array or registers with and and or masks.
462 * This is a helper for setting golden registers.
463 */
9c3f2b54
AD
464void amdgpu_device_program_register_sequence(struct amdgpu_device *adev,
465 const u32 *registers,
466 const u32 array_size)
d38ceaf9
AD
467{
468 u32 tmp, reg, and_mask, or_mask;
469 int i;
470
471 if (array_size % 3)
472 return;
473
474 for (i = 0; i < array_size; i +=3) {
475 reg = registers[i + 0];
476 and_mask = registers[i + 1];
477 or_mask = registers[i + 2];
478
479 if (and_mask == 0xffffffff) {
480 tmp = or_mask;
481 } else {
482 tmp = RREG32(reg);
483 tmp &= ~and_mask;
484 tmp |= or_mask;
485 }
486 WREG32(reg, tmp);
487 }
488}
489
e3ecdffa
AD
490/**
491 * amdgpu_device_pci_config_reset - reset the GPU
492 *
493 * @adev: amdgpu_device pointer
494 *
495 * Resets the GPU using the pci config reset sequence.
496 * Only applicable to asics prior to vega10.
497 */
8111c387 498void amdgpu_device_pci_config_reset(struct amdgpu_device *adev)
d38ceaf9
AD
499{
500 pci_write_config_dword(adev->pdev, 0x7c, AMDGPU_ASIC_RESET_DATA);
501}
502
503/*
504 * GPU doorbell aperture helpers function.
505 */
506/**
06ec9070 507 * amdgpu_device_doorbell_init - Init doorbell driver information.
d38ceaf9
AD
508 *
509 * @adev: amdgpu_device pointer
510 *
511 * Init doorbell driver information (CIK)
512 * Returns 0 on success, error on failure.
513 */
06ec9070 514static int amdgpu_device_doorbell_init(struct amdgpu_device *adev)
d38ceaf9 515{
705e519e
CK
516 /* No doorbell on SI hardware generation */
517 if (adev->asic_type < CHIP_BONAIRE) {
518 adev->doorbell.base = 0;
519 adev->doorbell.size = 0;
520 adev->doorbell.num_doorbells = 0;
521 adev->doorbell.ptr = NULL;
522 return 0;
523 }
524
d6895ad3
CK
525 if (pci_resource_flags(adev->pdev, 2) & IORESOURCE_UNSET)
526 return -EINVAL;
527
d38ceaf9
AD
528 /* doorbell bar mapping */
529 adev->doorbell.base = pci_resource_start(adev->pdev, 2);
530 adev->doorbell.size = pci_resource_len(adev->pdev, 2);
531
edf600da 532 adev->doorbell.num_doorbells = min_t(u32, adev->doorbell.size / sizeof(u32),
d38ceaf9
AD
533 AMDGPU_DOORBELL_MAX_ASSIGNMENT+1);
534 if (adev->doorbell.num_doorbells == 0)
535 return -EINVAL;
536
8972e5d2
CK
537 adev->doorbell.ptr = ioremap(adev->doorbell.base,
538 adev->doorbell.num_doorbells *
539 sizeof(u32));
540 if (adev->doorbell.ptr == NULL)
d38ceaf9 541 return -ENOMEM;
d38ceaf9
AD
542
543 return 0;
544}
545
546/**
06ec9070 547 * amdgpu_device_doorbell_fini - Tear down doorbell driver information.
d38ceaf9
AD
548 *
549 * @adev: amdgpu_device pointer
550 *
551 * Tear down doorbell driver information (CIK)
552 */
06ec9070 553static void amdgpu_device_doorbell_fini(struct amdgpu_device *adev)
d38ceaf9
AD
554{
555 iounmap(adev->doorbell.ptr);
556 adev->doorbell.ptr = NULL;
557}
558
22cb0164 559
d38ceaf9
AD
560
561/*
06ec9070 562 * amdgpu_device_wb_*()
455a7bc2 563 * Writeback is the method by which the GPU updates special pages in memory
ea81a173 564 * with the status of certain GPU events (fences, ring pointers,etc.).
d38ceaf9
AD
565 */
566
567/**
06ec9070 568 * amdgpu_device_wb_fini - Disable Writeback and free memory
d38ceaf9
AD
569 *
570 * @adev: amdgpu_device pointer
571 *
572 * Disables Writeback and frees the Writeback memory (all asics).
573 * Used at driver shutdown.
574 */
06ec9070 575static void amdgpu_device_wb_fini(struct amdgpu_device *adev)
d38ceaf9
AD
576{
577 if (adev->wb.wb_obj) {
a76ed485
AD
578 amdgpu_bo_free_kernel(&adev->wb.wb_obj,
579 &adev->wb.gpu_addr,
580 (void **)&adev->wb.wb);
d38ceaf9
AD
581 adev->wb.wb_obj = NULL;
582 }
583}
584
585/**
06ec9070 586 * amdgpu_device_wb_init- Init Writeback driver info and allocate memory
d38ceaf9
AD
587 *
588 * @adev: amdgpu_device pointer
589 *
455a7bc2 590 * Initializes writeback and allocates writeback memory (all asics).
d38ceaf9
AD
591 * Used at driver startup.
592 * Returns 0 on success or an -error on failure.
593 */
06ec9070 594static int amdgpu_device_wb_init(struct amdgpu_device *adev)
d38ceaf9
AD
595{
596 int r;
597
598 if (adev->wb.wb_obj == NULL) {
97407b63
AD
599 /* AMDGPU_MAX_WB * sizeof(uint32_t) * 8 = AMDGPU_MAX_WB 256bit slots */
600 r = amdgpu_bo_create_kernel(adev, AMDGPU_MAX_WB * sizeof(uint32_t) * 8,
a76ed485
AD
601 PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT,
602 &adev->wb.wb_obj, &adev->wb.gpu_addr,
603 (void **)&adev->wb.wb);
d38ceaf9
AD
604 if (r) {
605 dev_warn(adev->dev, "(%d) create WB bo failed\n", r);
606 return r;
607 }
d38ceaf9
AD
608
609 adev->wb.num_wb = AMDGPU_MAX_WB;
610 memset(&adev->wb.used, 0, sizeof(adev->wb.used));
611
612 /* clear wb memory */
73469585 613 memset((char *)adev->wb.wb, 0, AMDGPU_MAX_WB * sizeof(uint32_t) * 8);
d38ceaf9
AD
614 }
615
616 return 0;
617}
618
619/**
131b4b36 620 * amdgpu_device_wb_get - Allocate a wb entry
d38ceaf9
AD
621 *
622 * @adev: amdgpu_device pointer
623 * @wb: wb index
624 *
625 * Allocate a wb slot for use by the driver (all asics).
626 * Returns 0 on success or -EINVAL on failure.
627 */
131b4b36 628int amdgpu_device_wb_get(struct amdgpu_device *adev, u32 *wb)
d38ceaf9
AD
629{
630 unsigned long offset = find_first_zero_bit(adev->wb.used, adev->wb.num_wb);
d38ceaf9 631
97407b63 632 if (offset < adev->wb.num_wb) {
7014285a 633 __set_bit(offset, adev->wb.used);
63ae07ca 634 *wb = offset << 3; /* convert to dw offset */
0915fdbc
ML
635 return 0;
636 } else {
637 return -EINVAL;
638 }
639}
640
d38ceaf9 641/**
131b4b36 642 * amdgpu_device_wb_free - Free a wb entry
d38ceaf9
AD
643 *
644 * @adev: amdgpu_device pointer
645 * @wb: wb index
646 *
647 * Free a wb slot allocated for use by the driver (all asics)
648 */
131b4b36 649void amdgpu_device_wb_free(struct amdgpu_device *adev, u32 wb)
d38ceaf9 650{
73469585 651 wb >>= 3;
d38ceaf9 652 if (wb < adev->wb.num_wb)
73469585 653 __clear_bit(wb, adev->wb.used);
d38ceaf9
AD
654}
655
d6895ad3
CK
656/**
657 * amdgpu_device_resize_fb_bar - try to resize FB BAR
658 *
659 * @adev: amdgpu_device pointer
660 *
661 * Try to resize FB BAR to make all VRAM CPU accessible. We try very hard not
662 * to fail, but if any of the BARs is not accessible after the size we abort
663 * driver loading by returning -ENODEV.
664 */
665int amdgpu_device_resize_fb_bar(struct amdgpu_device *adev)
666{
770d13b1 667 u64 space_needed = roundup_pow_of_two(adev->gmc.real_vram_size);
d6895ad3 668 u32 rbar_size = order_base_2(((space_needed >> 20) | 1)) - 1;
31b8adab
CK
669 struct pci_bus *root;
670 struct resource *res;
671 unsigned i;
d6895ad3
CK
672 u16 cmd;
673 int r;
674
0c03b912 675 /* Bypass for VF */
676 if (amdgpu_sriov_vf(adev))
677 return 0;
678
31b8adab
CK
679 /* Check if the root BUS has 64bit memory resources */
680 root = adev->pdev->bus;
681 while (root->parent)
682 root = root->parent;
683
684 pci_bus_for_each_resource(root, res, i) {
0ebb7c54 685 if (res && res->flags & (IORESOURCE_MEM | IORESOURCE_MEM_64) &&
31b8adab
CK
686 res->start > 0x100000000ull)
687 break;
688 }
689
690 /* Trying to resize is pointless without a root hub window above 4GB */
691 if (!res)
692 return 0;
693
d6895ad3
CK
694 /* Disable memory decoding while we change the BAR addresses and size */
695 pci_read_config_word(adev->pdev, PCI_COMMAND, &cmd);
696 pci_write_config_word(adev->pdev, PCI_COMMAND,
697 cmd & ~PCI_COMMAND_MEMORY);
698
699 /* Free the VRAM and doorbell BAR, we most likely need to move both. */
06ec9070 700 amdgpu_device_doorbell_fini(adev);
d6895ad3
CK
701 if (adev->asic_type >= CHIP_BONAIRE)
702 pci_release_resource(adev->pdev, 2);
703
704 pci_release_resource(adev->pdev, 0);
705
706 r = pci_resize_resource(adev->pdev, 0, rbar_size);
707 if (r == -ENOSPC)
708 DRM_INFO("Not enough PCI address space for a large BAR.");
709 else if (r && r != -ENOTSUPP)
710 DRM_ERROR("Problem resizing BAR0 (%d).", r);
711
712 pci_assign_unassigned_bus_resources(adev->pdev->bus);
713
714 /* When the doorbell or fb BAR isn't available we have no chance of
715 * using the device.
716 */
06ec9070 717 r = amdgpu_device_doorbell_init(adev);
d6895ad3
CK
718 if (r || (pci_resource_flags(adev->pdev, 0) & IORESOURCE_UNSET))
719 return -ENODEV;
720
721 pci_write_config_word(adev->pdev, PCI_COMMAND, cmd);
722
723 return 0;
724}
a05502e5 725
d38ceaf9
AD
726/*
727 * GPU helpers function.
728 */
729/**
39c640c0 730 * amdgpu_device_need_post - check if the hw need post or not
d38ceaf9
AD
731 *
732 * @adev: amdgpu_device pointer
733 *
c836fec5
JQ
734 * Check if the asic has been initialized (all asics) at driver startup
735 * or post is needed if hw reset is performed.
736 * Returns true if need or false if not.
d38ceaf9 737 */
39c640c0 738bool amdgpu_device_need_post(struct amdgpu_device *adev)
d38ceaf9
AD
739{
740 uint32_t reg;
741
bec86378
ML
742 if (amdgpu_sriov_vf(adev))
743 return false;
744
745 if (amdgpu_passthrough(adev)) {
1da2c326
ML
746 /* for FIJI: In whole GPU pass-through virtualization case, after VM reboot
747 * some old smc fw still need driver do vPost otherwise gpu hang, while
748 * those smc fw version above 22.15 doesn't have this flaw, so we force
749 * vpost executed for smc version below 22.15
bec86378
ML
750 */
751 if (adev->asic_type == CHIP_FIJI) {
752 int err;
753 uint32_t fw_ver;
754 err = request_firmware(&adev->pm.fw, "amdgpu/fiji_smc.bin", adev->dev);
755 /* force vPost if error occured */
756 if (err)
757 return true;
758
759 fw_ver = *((uint32_t *)adev->pm.fw->data + 69);
1da2c326
ML
760 if (fw_ver < 0x00160e00)
761 return true;
bec86378 762 }
bec86378 763 }
91fe77eb 764
765 if (adev->has_hw_reset) {
766 adev->has_hw_reset = false;
767 return true;
768 }
769
770 /* bios scratch used on CIK+ */
771 if (adev->asic_type >= CHIP_BONAIRE)
772 return amdgpu_atombios_scratch_need_asic_init(adev);
773
774 /* check MEM_SIZE for older asics */
775 reg = amdgpu_asic_get_config_memsize(adev);
776
777 if ((reg != 0) && (reg != 0xffffffff))
778 return false;
779
780 return true;
bec86378
ML
781}
782
d38ceaf9
AD
783/* if we get transitioned to only one device, take VGA back */
784/**
06ec9070 785 * amdgpu_device_vga_set_decode - enable/disable vga decode
d38ceaf9
AD
786 *
787 * @cookie: amdgpu_device pointer
788 * @state: enable/disable vga decode
789 *
790 * Enable/disable vga decode (all asics).
791 * Returns VGA resource flags.
792 */
06ec9070 793static unsigned int amdgpu_device_vga_set_decode(void *cookie, bool state)
d38ceaf9
AD
794{
795 struct amdgpu_device *adev = cookie;
796 amdgpu_asic_set_vga_state(adev, state);
797 if (state)
798 return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
799 VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
800 else
801 return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
802}
803
e3ecdffa
AD
804/**
805 * amdgpu_device_check_block_size - validate the vm block size
806 *
807 * @adev: amdgpu_device pointer
808 *
809 * Validates the vm block size specified via module parameter.
810 * The vm block size defines number of bits in page table versus page directory,
811 * a page is 4KB so we have 12 bits offset, minimum 9 bits in the
812 * page table and the remaining bits are in the page directory.
813 */
06ec9070 814static void amdgpu_device_check_block_size(struct amdgpu_device *adev)
a1adf8be
CZ
815{
816 /* defines number of bits in page table versus page directory,
817 * a page is 4KB so we have 12 bits offset, minimum 9 bits in the
818 * page table and the remaining bits are in the page directory */
bab4fee7
JZ
819 if (amdgpu_vm_block_size == -1)
820 return;
a1adf8be 821
bab4fee7 822 if (amdgpu_vm_block_size < 9) {
a1adf8be
CZ
823 dev_warn(adev->dev, "VM page table size (%d) too small\n",
824 amdgpu_vm_block_size);
97489129 825 amdgpu_vm_block_size = -1;
a1adf8be 826 }
a1adf8be
CZ
827}
828
e3ecdffa
AD
829/**
830 * amdgpu_device_check_vm_size - validate the vm size
831 *
832 * @adev: amdgpu_device pointer
833 *
834 * Validates the vm size in GB specified via module parameter.
835 * The VM size is the size of the GPU virtual memory space in GB.
836 */
06ec9070 837static void amdgpu_device_check_vm_size(struct amdgpu_device *adev)
83ca145d 838{
64dab074
AD
839 /* no need to check the default value */
840 if (amdgpu_vm_size == -1)
841 return;
842
83ca145d
ZJ
843 if (amdgpu_vm_size < 1) {
844 dev_warn(adev->dev, "VM size (%d) too small, min is 1GB\n",
845 amdgpu_vm_size);
f3368128 846 amdgpu_vm_size = -1;
83ca145d 847 }
83ca145d
ZJ
848}
849
7951e376
RZ
850static void amdgpu_device_check_smu_prv_buffer_size(struct amdgpu_device *adev)
851{
852 struct sysinfo si;
853 bool is_os_64 = (sizeof(void *) == 8) ? true : false;
854 uint64_t total_memory;
855 uint64_t dram_size_seven_GB = 0x1B8000000;
856 uint64_t dram_size_three_GB = 0xB8000000;
857
858 if (amdgpu_smu_memory_pool_size == 0)
859 return;
860
861 if (!is_os_64) {
862 DRM_WARN("Not 64-bit OS, feature not supported\n");
863 goto def_value;
864 }
865 si_meminfo(&si);
866 total_memory = (uint64_t)si.totalram * si.mem_unit;
867
868 if ((amdgpu_smu_memory_pool_size == 1) ||
869 (amdgpu_smu_memory_pool_size == 2)) {
870 if (total_memory < dram_size_three_GB)
871 goto def_value1;
872 } else if ((amdgpu_smu_memory_pool_size == 4) ||
873 (amdgpu_smu_memory_pool_size == 8)) {
874 if (total_memory < dram_size_seven_GB)
875 goto def_value1;
876 } else {
877 DRM_WARN("Smu memory pool size not supported\n");
878 goto def_value;
879 }
880 adev->pm.smu_prv_buffer_size = amdgpu_smu_memory_pool_size << 28;
881
882 return;
883
884def_value1:
885 DRM_WARN("No enough system memory\n");
886def_value:
887 adev->pm.smu_prv_buffer_size = 0;
888}
889
d38ceaf9 890/**
06ec9070 891 * amdgpu_device_check_arguments - validate module params
d38ceaf9
AD
892 *
893 * @adev: amdgpu_device pointer
894 *
895 * Validates certain module parameters and updates
896 * the associated values used by the driver (all asics).
897 */
06ec9070 898static void amdgpu_device_check_arguments(struct amdgpu_device *adev)
d38ceaf9 899{
5b011235
CZ
900 if (amdgpu_sched_jobs < 4) {
901 dev_warn(adev->dev, "sched jobs (%d) must be at least 4\n",
902 amdgpu_sched_jobs);
903 amdgpu_sched_jobs = 4;
76117507 904 } else if (!is_power_of_2(amdgpu_sched_jobs)){
5b011235
CZ
905 dev_warn(adev->dev, "sched jobs (%d) must be a power of 2\n",
906 amdgpu_sched_jobs);
907 amdgpu_sched_jobs = roundup_pow_of_two(amdgpu_sched_jobs);
908 }
d38ceaf9 909
83e74db6 910 if (amdgpu_gart_size != -1 && amdgpu_gart_size < 32) {
f9321cc4
CK
911 /* gart size must be greater or equal to 32M */
912 dev_warn(adev->dev, "gart size (%d) too small\n",
913 amdgpu_gart_size);
83e74db6 914 amdgpu_gart_size = -1;
d38ceaf9
AD
915 }
916
36d38372 917 if (amdgpu_gtt_size != -1 && amdgpu_gtt_size < 32) {
c4e1a13a 918 /* gtt size must be greater or equal to 32M */
36d38372
CK
919 dev_warn(adev->dev, "gtt size (%d) too small\n",
920 amdgpu_gtt_size);
921 amdgpu_gtt_size = -1;
d38ceaf9
AD
922 }
923
d07f14be
RH
924 /* valid range is between 4 and 9 inclusive */
925 if (amdgpu_vm_fragment_size != -1 &&
926 (amdgpu_vm_fragment_size > 9 || amdgpu_vm_fragment_size < 4)) {
927 dev_warn(adev->dev, "valid range is between 4 and 9\n");
928 amdgpu_vm_fragment_size = -1;
929 }
930
7951e376
RZ
931 amdgpu_device_check_smu_prv_buffer_size(adev);
932
06ec9070 933 amdgpu_device_check_vm_size(adev);
d38ceaf9 934
06ec9070 935 amdgpu_device_check_block_size(adev);
6a7f76e7 936
526bae37 937 if (amdgpu_vram_page_split != -1 && (amdgpu_vram_page_split < 16 ||
76117507 938 !is_power_of_2(amdgpu_vram_page_split))) {
6a7f76e7
CK
939 dev_warn(adev->dev, "invalid VRAM page split (%d)\n",
940 amdgpu_vram_page_split);
941 amdgpu_vram_page_split = 1024;
942 }
8854695a
AG
943
944 if (amdgpu_lockup_timeout == 0) {
945 dev_warn(adev->dev, "lockup_timeout msut be > 0, adjusting to 10000\n");
946 amdgpu_lockup_timeout = 10000;
947 }
19aede77
AD
948
949 adev->firmware.load_type = amdgpu_ucode_get_load_type(adev, amdgpu_fw_load_type);
d38ceaf9
AD
950}
951
952/**
953 * amdgpu_switcheroo_set_state - set switcheroo state
954 *
955 * @pdev: pci dev pointer
1694467b 956 * @state: vga_switcheroo state
d38ceaf9
AD
957 *
958 * Callback for the switcheroo driver. Suspends or resumes the
959 * the asics before or after it is powered up using ACPI methods.
960 */
961static void amdgpu_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state)
962{
963 struct drm_device *dev = pci_get_drvdata(pdev);
964
965 if (amdgpu_device_is_px(dev) && state == VGA_SWITCHEROO_OFF)
966 return;
967
968 if (state == VGA_SWITCHEROO_ON) {
7ca85295 969 pr_info("amdgpu: switched on\n");
d38ceaf9
AD
970 /* don't suspend or resume card normally */
971 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
972
810ddc3a 973 amdgpu_device_resume(dev, true, true);
d38ceaf9 974
d38ceaf9
AD
975 dev->switch_power_state = DRM_SWITCH_POWER_ON;
976 drm_kms_helper_poll_enable(dev);
977 } else {
7ca85295 978 pr_info("amdgpu: switched off\n");
d38ceaf9
AD
979 drm_kms_helper_poll_disable(dev);
980 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
810ddc3a 981 amdgpu_device_suspend(dev, true, true);
d38ceaf9
AD
982 dev->switch_power_state = DRM_SWITCH_POWER_OFF;
983 }
984}
985
986/**
987 * amdgpu_switcheroo_can_switch - see if switcheroo state can change
988 *
989 * @pdev: pci dev pointer
990 *
991 * Callback for the switcheroo driver. Check of the switcheroo
992 * state can be changed.
993 * Returns true if the state can be changed, false if not.
994 */
995static bool amdgpu_switcheroo_can_switch(struct pci_dev *pdev)
996{
997 struct drm_device *dev = pci_get_drvdata(pdev);
998
999 /*
1000 * FIXME: open_count is protected by drm_global_mutex but that would lead to
1001 * locking inversion with the driver load path. And the access here is
1002 * completely racy anyway. So don't bother with locking for now.
1003 */
1004 return dev->open_count == 0;
1005}
1006
1007static const struct vga_switcheroo_client_ops amdgpu_switcheroo_ops = {
1008 .set_gpu_state = amdgpu_switcheroo_set_state,
1009 .reprobe = NULL,
1010 .can_switch = amdgpu_switcheroo_can_switch,
1011};
1012
e3ecdffa
AD
1013/**
1014 * amdgpu_device_ip_set_clockgating_state - set the CG state
1015 *
87e3f136 1016 * @dev: amdgpu_device pointer
e3ecdffa
AD
1017 * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.)
1018 * @state: clockgating state (gate or ungate)
1019 *
1020 * Sets the requested clockgating state for all instances of
1021 * the hardware IP specified.
1022 * Returns the error code from the last instance.
1023 */
43fa561f 1024int amdgpu_device_ip_set_clockgating_state(void *dev,
2990a1fc
AD
1025 enum amd_ip_block_type block_type,
1026 enum amd_clockgating_state state)
d38ceaf9 1027{
43fa561f 1028 struct amdgpu_device *adev = dev;
d38ceaf9
AD
1029 int i, r = 0;
1030
1031 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1032 if (!adev->ip_blocks[i].status.valid)
9ecbe7f5 1033 continue;
c722865a
RZ
1034 if (adev->ip_blocks[i].version->type != block_type)
1035 continue;
1036 if (!adev->ip_blocks[i].version->funcs->set_clockgating_state)
1037 continue;
1038 r = adev->ip_blocks[i].version->funcs->set_clockgating_state(
1039 (void *)adev, state);
1040 if (r)
1041 DRM_ERROR("set_clockgating_state of IP block <%s> failed %d\n",
1042 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9
AD
1043 }
1044 return r;
1045}
1046
e3ecdffa
AD
1047/**
1048 * amdgpu_device_ip_set_powergating_state - set the PG state
1049 *
87e3f136 1050 * @dev: amdgpu_device pointer
e3ecdffa
AD
1051 * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.)
1052 * @state: powergating state (gate or ungate)
1053 *
1054 * Sets the requested powergating state for all instances of
1055 * the hardware IP specified.
1056 * Returns the error code from the last instance.
1057 */
43fa561f 1058int amdgpu_device_ip_set_powergating_state(void *dev,
2990a1fc
AD
1059 enum amd_ip_block_type block_type,
1060 enum amd_powergating_state state)
d38ceaf9 1061{
43fa561f 1062 struct amdgpu_device *adev = dev;
d38ceaf9
AD
1063 int i, r = 0;
1064
1065 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1066 if (!adev->ip_blocks[i].status.valid)
9ecbe7f5 1067 continue;
c722865a
RZ
1068 if (adev->ip_blocks[i].version->type != block_type)
1069 continue;
1070 if (!adev->ip_blocks[i].version->funcs->set_powergating_state)
1071 continue;
1072 r = adev->ip_blocks[i].version->funcs->set_powergating_state(
1073 (void *)adev, state);
1074 if (r)
1075 DRM_ERROR("set_powergating_state of IP block <%s> failed %d\n",
1076 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9
AD
1077 }
1078 return r;
1079}
1080
e3ecdffa
AD
1081/**
1082 * amdgpu_device_ip_get_clockgating_state - get the CG state
1083 *
1084 * @adev: amdgpu_device pointer
1085 * @flags: clockgating feature flags
1086 *
1087 * Walks the list of IPs on the device and updates the clockgating
1088 * flags for each IP.
1089 * Updates @flags with the feature flags for each hardware IP where
1090 * clockgating is enabled.
1091 */
2990a1fc
AD
1092void amdgpu_device_ip_get_clockgating_state(struct amdgpu_device *adev,
1093 u32 *flags)
6cb2d4e4
HR
1094{
1095 int i;
1096
1097 for (i = 0; i < adev->num_ip_blocks; i++) {
1098 if (!adev->ip_blocks[i].status.valid)
1099 continue;
1100 if (adev->ip_blocks[i].version->funcs->get_clockgating_state)
1101 adev->ip_blocks[i].version->funcs->get_clockgating_state((void *)adev, flags);
1102 }
1103}
1104
e3ecdffa
AD
1105/**
1106 * amdgpu_device_ip_wait_for_idle - wait for idle
1107 *
1108 * @adev: amdgpu_device pointer
1109 * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.)
1110 *
1111 * Waits for the request hardware IP to be idle.
1112 * Returns 0 for success or a negative error code on failure.
1113 */
2990a1fc
AD
1114int amdgpu_device_ip_wait_for_idle(struct amdgpu_device *adev,
1115 enum amd_ip_block_type block_type)
5dbbb60b
AD
1116{
1117 int i, r;
1118
1119 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1120 if (!adev->ip_blocks[i].status.valid)
9ecbe7f5 1121 continue;
a1255107
AD
1122 if (adev->ip_blocks[i].version->type == block_type) {
1123 r = adev->ip_blocks[i].version->funcs->wait_for_idle((void *)adev);
5dbbb60b
AD
1124 if (r)
1125 return r;
1126 break;
1127 }
1128 }
1129 return 0;
1130
1131}
1132
e3ecdffa
AD
1133/**
1134 * amdgpu_device_ip_is_idle - is the hardware IP idle
1135 *
1136 * @adev: amdgpu_device pointer
1137 * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.)
1138 *
1139 * Check if the hardware IP is idle or not.
1140 * Returns true if it the IP is idle, false if not.
1141 */
2990a1fc
AD
1142bool amdgpu_device_ip_is_idle(struct amdgpu_device *adev,
1143 enum amd_ip_block_type block_type)
5dbbb60b
AD
1144{
1145 int i;
1146
1147 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1148 if (!adev->ip_blocks[i].status.valid)
9ecbe7f5 1149 continue;
a1255107
AD
1150 if (adev->ip_blocks[i].version->type == block_type)
1151 return adev->ip_blocks[i].version->funcs->is_idle((void *)adev);
5dbbb60b
AD
1152 }
1153 return true;
1154
1155}
1156
e3ecdffa
AD
1157/**
1158 * amdgpu_device_ip_get_ip_block - get a hw IP pointer
1159 *
1160 * @adev: amdgpu_device pointer
87e3f136 1161 * @type: Type of hardware IP (SMU, GFX, UVD, etc.)
e3ecdffa
AD
1162 *
1163 * Returns a pointer to the hardware IP block structure
1164 * if it exists for the asic, otherwise NULL.
1165 */
2990a1fc
AD
1166struct amdgpu_ip_block *
1167amdgpu_device_ip_get_ip_block(struct amdgpu_device *adev,
1168 enum amd_ip_block_type type)
d38ceaf9
AD
1169{
1170 int i;
1171
1172 for (i = 0; i < adev->num_ip_blocks; i++)
a1255107 1173 if (adev->ip_blocks[i].version->type == type)
d38ceaf9
AD
1174 return &adev->ip_blocks[i];
1175
1176 return NULL;
1177}
1178
1179/**
2990a1fc 1180 * amdgpu_device_ip_block_version_cmp
d38ceaf9
AD
1181 *
1182 * @adev: amdgpu_device pointer
5fc3aeeb 1183 * @type: enum amd_ip_block_type
d38ceaf9
AD
1184 * @major: major version
1185 * @minor: minor version
1186 *
1187 * return 0 if equal or greater
1188 * return 1 if smaller or the ip_block doesn't exist
1189 */
2990a1fc
AD
1190int amdgpu_device_ip_block_version_cmp(struct amdgpu_device *adev,
1191 enum amd_ip_block_type type,
1192 u32 major, u32 minor)
d38ceaf9 1193{
2990a1fc 1194 struct amdgpu_ip_block *ip_block = amdgpu_device_ip_get_ip_block(adev, type);
d38ceaf9 1195
a1255107
AD
1196 if (ip_block && ((ip_block->version->major > major) ||
1197 ((ip_block->version->major == major) &&
1198 (ip_block->version->minor >= minor))))
d38ceaf9
AD
1199 return 0;
1200
1201 return 1;
1202}
1203
a1255107 1204/**
2990a1fc 1205 * amdgpu_device_ip_block_add
a1255107
AD
1206 *
1207 * @adev: amdgpu_device pointer
1208 * @ip_block_version: pointer to the IP to add
1209 *
1210 * Adds the IP block driver information to the collection of IPs
1211 * on the asic.
1212 */
2990a1fc
AD
1213int amdgpu_device_ip_block_add(struct amdgpu_device *adev,
1214 const struct amdgpu_ip_block_version *ip_block_version)
a1255107
AD
1215{
1216 if (!ip_block_version)
1217 return -EINVAL;
1218
e966a725 1219 DRM_INFO("add ip block number %d <%s>\n", adev->num_ip_blocks,
a0bae357
HR
1220 ip_block_version->funcs->name);
1221
a1255107
AD
1222 adev->ip_blocks[adev->num_ip_blocks++].version = ip_block_version;
1223
1224 return 0;
1225}
1226
e3ecdffa
AD
1227/**
1228 * amdgpu_device_enable_virtual_display - enable virtual display feature
1229 *
1230 * @adev: amdgpu_device pointer
1231 *
1232 * Enabled the virtual display feature if the user has enabled it via
1233 * the module parameter virtual_display. This feature provides a virtual
1234 * display hardware on headless boards or in virtualized environments.
1235 * This function parses and validates the configuration string specified by
1236 * the user and configues the virtual display configuration (number of
1237 * virtual connectors, crtcs, etc.) specified.
1238 */
483ef985 1239static void amdgpu_device_enable_virtual_display(struct amdgpu_device *adev)
9accf2fd
ED
1240{
1241 adev->enable_virtual_display = false;
1242
1243 if (amdgpu_virtual_display) {
1244 struct drm_device *ddev = adev->ddev;
1245 const char *pci_address_name = pci_name(ddev->pdev);
0f66356d 1246 char *pciaddstr, *pciaddstr_tmp, *pciaddname_tmp, *pciaddname;
9accf2fd
ED
1247
1248 pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL);
1249 pciaddstr_tmp = pciaddstr;
0f66356d
ED
1250 while ((pciaddname_tmp = strsep(&pciaddstr_tmp, ";"))) {
1251 pciaddname = strsep(&pciaddname_tmp, ",");
967de2a9
YT
1252 if (!strcmp("all", pciaddname)
1253 || !strcmp(pci_address_name, pciaddname)) {
0f66356d
ED
1254 long num_crtc;
1255 int res = -1;
1256
9accf2fd 1257 adev->enable_virtual_display = true;
0f66356d
ED
1258
1259 if (pciaddname_tmp)
1260 res = kstrtol(pciaddname_tmp, 10,
1261 &num_crtc);
1262
1263 if (!res) {
1264 if (num_crtc < 1)
1265 num_crtc = 1;
1266 if (num_crtc > 6)
1267 num_crtc = 6;
1268 adev->mode_info.num_crtc = num_crtc;
1269 } else {
1270 adev->mode_info.num_crtc = 1;
1271 }
9accf2fd
ED
1272 break;
1273 }
1274 }
1275
0f66356d
ED
1276 DRM_INFO("virtual display string:%s, %s:virtual_display:%d, num_crtc:%d\n",
1277 amdgpu_virtual_display, pci_address_name,
1278 adev->enable_virtual_display, adev->mode_info.num_crtc);
9accf2fd
ED
1279
1280 kfree(pciaddstr);
1281 }
1282}
1283
e3ecdffa
AD
1284/**
1285 * amdgpu_device_parse_gpu_info_fw - parse gpu info firmware
1286 *
1287 * @adev: amdgpu_device pointer
1288 *
1289 * Parses the asic configuration parameters specified in the gpu info
1290 * firmware and makes them availale to the driver for use in configuring
1291 * the asic.
1292 * Returns 0 on success, -EINVAL on failure.
1293 */
e2a75f88
AD
1294static int amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)
1295{
e2a75f88
AD
1296 const char *chip_name;
1297 char fw_name[30];
1298 int err;
1299 const struct gpu_info_firmware_header_v1_0 *hdr;
1300
ab4fe3e1
HR
1301 adev->firmware.gpu_info_fw = NULL;
1302
e2a75f88
AD
1303 switch (adev->asic_type) {
1304 case CHIP_TOPAZ:
1305 case CHIP_TONGA:
1306 case CHIP_FIJI:
e2a75f88 1307 case CHIP_POLARIS10:
cc07f18d 1308 case CHIP_POLARIS11:
e2a75f88 1309 case CHIP_POLARIS12:
cc07f18d 1310 case CHIP_VEGAM:
e2a75f88
AD
1311 case CHIP_CARRIZO:
1312 case CHIP_STONEY:
1313#ifdef CONFIG_DRM_AMDGPU_SI
1314 case CHIP_VERDE:
1315 case CHIP_TAHITI:
1316 case CHIP_PITCAIRN:
1317 case CHIP_OLAND:
1318 case CHIP_HAINAN:
1319#endif
1320#ifdef CONFIG_DRM_AMDGPU_CIK
1321 case CHIP_BONAIRE:
1322 case CHIP_HAWAII:
1323 case CHIP_KAVERI:
1324 case CHIP_KABINI:
1325 case CHIP_MULLINS:
1326#endif
27c0bc71 1327 case CHIP_VEGA20:
e2a75f88
AD
1328 default:
1329 return 0;
1330 case CHIP_VEGA10:
1331 chip_name = "vega10";
1332 break;
3f76dced
AD
1333 case CHIP_VEGA12:
1334 chip_name = "vega12";
1335 break;
2d2e5e7e 1336 case CHIP_RAVEN:
54c4d17e
FX
1337 if (adev->rev_id >= 8)
1338 chip_name = "raven2";
741deade
AD
1339 else if (adev->pdev->device == 0x15d8)
1340 chip_name = "picasso";
54c4d17e
FX
1341 else
1342 chip_name = "raven";
2d2e5e7e 1343 break;
e2a75f88
AD
1344 }
1345
1346 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_gpu_info.bin", chip_name);
ab4fe3e1 1347 err = request_firmware(&adev->firmware.gpu_info_fw, fw_name, adev->dev);
e2a75f88
AD
1348 if (err) {
1349 dev_err(adev->dev,
1350 "Failed to load gpu_info firmware \"%s\"\n",
1351 fw_name);
1352 goto out;
1353 }
ab4fe3e1 1354 err = amdgpu_ucode_validate(adev->firmware.gpu_info_fw);
e2a75f88
AD
1355 if (err) {
1356 dev_err(adev->dev,
1357 "Failed to validate gpu_info firmware \"%s\"\n",
1358 fw_name);
1359 goto out;
1360 }
1361
ab4fe3e1 1362 hdr = (const struct gpu_info_firmware_header_v1_0 *)adev->firmware.gpu_info_fw->data;
e2a75f88
AD
1363 amdgpu_ucode_print_gpu_info_hdr(&hdr->header);
1364
1365 switch (hdr->version_major) {
1366 case 1:
1367 {
1368 const struct gpu_info_firmware_v1_0 *gpu_info_fw =
ab4fe3e1 1369 (const struct gpu_info_firmware_v1_0 *)(adev->firmware.gpu_info_fw->data +
e2a75f88
AD
1370 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1371
b5ab16bf
AD
1372 adev->gfx.config.max_shader_engines = le32_to_cpu(gpu_info_fw->gc_num_se);
1373 adev->gfx.config.max_cu_per_sh = le32_to_cpu(gpu_info_fw->gc_num_cu_per_sh);
1374 adev->gfx.config.max_sh_per_se = le32_to_cpu(gpu_info_fw->gc_num_sh_per_se);
1375 adev->gfx.config.max_backends_per_se = le32_to_cpu(gpu_info_fw->gc_num_rb_per_se);
e2a75f88 1376 adev->gfx.config.max_texture_channel_caches =
b5ab16bf
AD
1377 le32_to_cpu(gpu_info_fw->gc_num_tccs);
1378 adev->gfx.config.max_gprs = le32_to_cpu(gpu_info_fw->gc_num_gprs);
1379 adev->gfx.config.max_gs_threads = le32_to_cpu(gpu_info_fw->gc_num_max_gs_thds);
1380 adev->gfx.config.gs_vgt_table_depth = le32_to_cpu(gpu_info_fw->gc_gs_table_depth);
1381 adev->gfx.config.gs_prim_buffer_depth = le32_to_cpu(gpu_info_fw->gc_gsprim_buff_depth);
e2a75f88 1382 adev->gfx.config.double_offchip_lds_buf =
b5ab16bf
AD
1383 le32_to_cpu(gpu_info_fw->gc_double_offchip_lds_buffer);
1384 adev->gfx.cu_info.wave_front_size = le32_to_cpu(gpu_info_fw->gc_wave_size);
51fd0370
HZ
1385 adev->gfx.cu_info.max_waves_per_simd =
1386 le32_to_cpu(gpu_info_fw->gc_max_waves_per_simd);
1387 adev->gfx.cu_info.max_scratch_slots_per_cu =
1388 le32_to_cpu(gpu_info_fw->gc_max_scratch_slots_per_cu);
1389 adev->gfx.cu_info.lds_size = le32_to_cpu(gpu_info_fw->gc_lds_size);
e2a75f88
AD
1390 break;
1391 }
1392 default:
1393 dev_err(adev->dev,
1394 "Unsupported gpu_info table %d\n", hdr->header.ucode_version);
1395 err = -EINVAL;
1396 goto out;
1397 }
1398out:
e2a75f88
AD
1399 return err;
1400}
1401
e3ecdffa
AD
1402/**
1403 * amdgpu_device_ip_early_init - run early init for hardware IPs
1404 *
1405 * @adev: amdgpu_device pointer
1406 *
1407 * Early initialization pass for hardware IPs. The hardware IPs that make
1408 * up each asic are discovered each IP's early_init callback is run. This
1409 * is the first stage in initializing the asic.
1410 * Returns 0 on success, negative error code on failure.
1411 */
06ec9070 1412static int amdgpu_device_ip_early_init(struct amdgpu_device *adev)
d38ceaf9 1413{
aaa36a97 1414 int i, r;
d38ceaf9 1415
483ef985 1416 amdgpu_device_enable_virtual_display(adev);
a6be7570 1417
d38ceaf9 1418 switch (adev->asic_type) {
aaa36a97
AD
1419 case CHIP_TOPAZ:
1420 case CHIP_TONGA:
48299f95 1421 case CHIP_FIJI:
2cc0c0b5 1422 case CHIP_POLARIS10:
32cc7e53 1423 case CHIP_POLARIS11:
c4642a47 1424 case CHIP_POLARIS12:
32cc7e53 1425 case CHIP_VEGAM:
aaa36a97 1426 case CHIP_CARRIZO:
39bb0c92
SL
1427 case CHIP_STONEY:
1428 if (adev->asic_type == CHIP_CARRIZO || adev->asic_type == CHIP_STONEY)
aaa36a97
AD
1429 adev->family = AMDGPU_FAMILY_CZ;
1430 else
1431 adev->family = AMDGPU_FAMILY_VI;
1432
1433 r = vi_set_ip_blocks(adev);
1434 if (r)
1435 return r;
1436 break;
33f34802
KW
1437#ifdef CONFIG_DRM_AMDGPU_SI
1438 case CHIP_VERDE:
1439 case CHIP_TAHITI:
1440 case CHIP_PITCAIRN:
1441 case CHIP_OLAND:
1442 case CHIP_HAINAN:
295d0daf 1443 adev->family = AMDGPU_FAMILY_SI;
33f34802
KW
1444 r = si_set_ip_blocks(adev);
1445 if (r)
1446 return r;
1447 break;
1448#endif
a2e73f56
AD
1449#ifdef CONFIG_DRM_AMDGPU_CIK
1450 case CHIP_BONAIRE:
1451 case CHIP_HAWAII:
1452 case CHIP_KAVERI:
1453 case CHIP_KABINI:
1454 case CHIP_MULLINS:
1455 if ((adev->asic_type == CHIP_BONAIRE) || (adev->asic_type == CHIP_HAWAII))
1456 adev->family = AMDGPU_FAMILY_CI;
1457 else
1458 adev->family = AMDGPU_FAMILY_KV;
1459
1460 r = cik_set_ip_blocks(adev);
1461 if (r)
1462 return r;
1463 break;
1464#endif
e48a3cd9
AD
1465 case CHIP_VEGA10:
1466 case CHIP_VEGA12:
e4bd8170 1467 case CHIP_VEGA20:
e48a3cd9 1468 case CHIP_RAVEN:
741deade 1469 if (adev->asic_type == CHIP_RAVEN)
2ca8a5d2
CZ
1470 adev->family = AMDGPU_FAMILY_RV;
1471 else
1472 adev->family = AMDGPU_FAMILY_AI;
460826e6
KW
1473
1474 r = soc15_set_ip_blocks(adev);
1475 if (r)
1476 return r;
1477 break;
d38ceaf9
AD
1478 default:
1479 /* FIXME: not supported yet */
1480 return -EINVAL;
1481 }
1482
e2a75f88
AD
1483 r = amdgpu_device_parse_gpu_info_fw(adev);
1484 if (r)
1485 return r;
1486
1884734a 1487 amdgpu_amdkfd_device_probe(adev);
1488
3149d9da
XY
1489 if (amdgpu_sriov_vf(adev)) {
1490 r = amdgpu_virt_request_full_gpu(adev, true);
1491 if (r)
5ffa61c1 1492 return -EAGAIN;
3149d9da
XY
1493 }
1494
00f54b97 1495 adev->powerplay.pp_feature = amdgpu_pp_feature_mask;
a06c3ee0
KF
1496 if (amdgpu_sriov_vf(adev))
1497 adev->powerplay.pp_feature &= ~PP_GFXOFF_MASK;
00f54b97 1498
d38ceaf9
AD
1499 for (i = 0; i < adev->num_ip_blocks; i++) {
1500 if ((amdgpu_ip_block_mask & (1 << i)) == 0) {
ed8cf00c
HR
1501 DRM_ERROR("disabled ip block: %d <%s>\n",
1502 i, adev->ip_blocks[i].version->funcs->name);
a1255107 1503 adev->ip_blocks[i].status.valid = false;
d38ceaf9 1504 } else {
a1255107
AD
1505 if (adev->ip_blocks[i].version->funcs->early_init) {
1506 r = adev->ip_blocks[i].version->funcs->early_init((void *)adev);
2c1a2784 1507 if (r == -ENOENT) {
a1255107 1508 adev->ip_blocks[i].status.valid = false;
2c1a2784 1509 } else if (r) {
a1255107
AD
1510 DRM_ERROR("early_init of IP block <%s> failed %d\n",
1511 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1512 return r;
2c1a2784 1513 } else {
a1255107 1514 adev->ip_blocks[i].status.valid = true;
2c1a2784 1515 }
974e6b64 1516 } else {
a1255107 1517 adev->ip_blocks[i].status.valid = true;
d38ceaf9 1518 }
d38ceaf9
AD
1519 }
1520 }
1521
395d1fb9
NH
1522 adev->cg_flags &= amdgpu_cg_mask;
1523 adev->pg_flags &= amdgpu_pg_mask;
1524
d38ceaf9
AD
1525 return 0;
1526}
1527
e3ecdffa
AD
1528/**
1529 * amdgpu_device_ip_init - run init for hardware IPs
1530 *
1531 * @adev: amdgpu_device pointer
1532 *
1533 * Main initialization pass for hardware IPs. The list of all the hardware
1534 * IPs that make up the asic is walked and the sw_init and hw_init callbacks
1535 * are run. sw_init initializes the software state associated with each IP
1536 * and hw_init initializes the hardware associated with each IP.
1537 * Returns 0 on success, negative error code on failure.
1538 */
06ec9070 1539static int amdgpu_device_ip_init(struct amdgpu_device *adev)
d38ceaf9
AD
1540{
1541 int i, r;
1542
1543 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1544 if (!adev->ip_blocks[i].status.valid)
d38ceaf9 1545 continue;
a1255107 1546 r = adev->ip_blocks[i].version->funcs->sw_init((void *)adev);
2c1a2784 1547 if (r) {
a1255107
AD
1548 DRM_ERROR("sw_init of IP block <%s> failed %d\n",
1549 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1550 return r;
2c1a2784 1551 }
a1255107 1552 adev->ip_blocks[i].status.sw = true;
bfca0289 1553
d38ceaf9 1554 /* need to do gmc hw init early so we can allocate gpu mem */
a1255107 1555 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
06ec9070 1556 r = amdgpu_device_vram_scratch_init(adev);
2c1a2784
AD
1557 if (r) {
1558 DRM_ERROR("amdgpu_vram_scratch_init failed %d\n", r);
d38ceaf9 1559 return r;
2c1a2784 1560 }
a1255107 1561 r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev);
2c1a2784
AD
1562 if (r) {
1563 DRM_ERROR("hw_init %d failed %d\n", i, r);
d38ceaf9 1564 return r;
2c1a2784 1565 }
06ec9070 1566 r = amdgpu_device_wb_init(adev);
2c1a2784 1567 if (r) {
06ec9070 1568 DRM_ERROR("amdgpu_device_wb_init failed %d\n", r);
d38ceaf9 1569 return r;
2c1a2784 1570 }
a1255107 1571 adev->ip_blocks[i].status.hw = true;
2493664f
ML
1572
1573 /* right after GMC hw init, we create CSA */
1574 if (amdgpu_sriov_vf(adev)) {
1575 r = amdgpu_allocate_static_csa(adev);
1576 if (r) {
1577 DRM_ERROR("allocate CSA failed %d\n", r);
1578 return r;
1579 }
1580 }
d38ceaf9
AD
1581 }
1582 }
1583
1584 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1585 if (!adev->ip_blocks[i].status.sw)
d38ceaf9 1586 continue;
bfca0289 1587 if (adev->ip_blocks[i].status.hw)
d38ceaf9 1588 continue;
a1255107 1589 r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev);
2c1a2784 1590 if (r) {
a1255107
AD
1591 DRM_ERROR("hw_init of IP block <%s> failed %d\n",
1592 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 1593 return r;
2c1a2784 1594 }
a1255107 1595 adev->ip_blocks[i].status.hw = true;
d38ceaf9
AD
1596 }
1597
fb30fc59 1598 amdgpu_xgmi_add_device(adev);
1884734a 1599 amdgpu_amdkfd_device_init(adev);
c6332b97 1600
1601 if (amdgpu_sriov_vf(adev))
1602 amdgpu_virt_release_full_gpu(adev, true);
1603
d38ceaf9
AD
1604 return 0;
1605}
1606
e3ecdffa
AD
1607/**
1608 * amdgpu_device_fill_reset_magic - writes reset magic to gart pointer
1609 *
1610 * @adev: amdgpu_device pointer
1611 *
1612 * Writes a reset magic value to the gart pointer in VRAM. The driver calls
1613 * this function before a GPU reset. If the value is retained after a
1614 * GPU reset, VRAM has not been lost. Some GPU resets may destry VRAM contents.
1615 */
06ec9070 1616static void amdgpu_device_fill_reset_magic(struct amdgpu_device *adev)
0c49e0b8
CZ
1617{
1618 memcpy(adev->reset_magic, adev->gart.ptr, AMDGPU_RESET_MAGIC_NUM);
1619}
1620
e3ecdffa
AD
1621/**
1622 * amdgpu_device_check_vram_lost - check if vram is valid
1623 *
1624 * @adev: amdgpu_device pointer
1625 *
1626 * Checks the reset magic value written to the gart pointer in VRAM.
1627 * The driver calls this after a GPU reset to see if the contents of
1628 * VRAM is lost or now.
1629 * returns true if vram is lost, false if not.
1630 */
06ec9070 1631static bool amdgpu_device_check_vram_lost(struct amdgpu_device *adev)
0c49e0b8
CZ
1632{
1633 return !!memcmp(adev->gart.ptr, adev->reset_magic,
1634 AMDGPU_RESET_MAGIC_NUM);
1635}
1636
e3ecdffa 1637/**
1112a46b 1638 * amdgpu_device_set_cg_state - set clockgating for amdgpu device
e3ecdffa
AD
1639 *
1640 * @adev: amdgpu_device pointer
1641 *
e3ecdffa 1642 * The list of all the hardware IPs that make up the asic is walked and the
1112a46b
RZ
1643 * set_clockgating_state callbacks are run.
1644 * Late initialization pass enabling clockgating for hardware IPs.
1645 * Fini or suspend, pass disabling clockgating for hardware IPs.
e3ecdffa
AD
1646 * Returns 0 on success, negative error code on failure.
1647 */
fdd34271 1648
1112a46b
RZ
1649static int amdgpu_device_set_cg_state(struct amdgpu_device *adev,
1650 enum amd_clockgating_state state)
d38ceaf9 1651{
1112a46b 1652 int i, j, r;
d38ceaf9 1653
4a2ba394
SL
1654 if (amdgpu_emu_mode == 1)
1655 return 0;
1656
1112a46b
RZ
1657 for (j = 0; j < adev->num_ip_blocks; j++) {
1658 i = state == AMD_CG_STATE_GATE ? j : adev->num_ip_blocks - j - 1;
a1255107 1659 if (!adev->ip_blocks[i].status.valid)
d38ceaf9 1660 continue;
4a446d55 1661 /* skip CG for VCE/UVD, it's handled specially */
a1255107 1662 if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
57716327 1663 adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE &&
34319b32 1664 adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCN &&
57716327 1665 adev->ip_blocks[i].version->funcs->set_clockgating_state) {
4a446d55 1666 /* enable clockgating to save power */
a1255107 1667 r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
1112a46b 1668 state);
4a446d55
AD
1669 if (r) {
1670 DRM_ERROR("set_clockgating_state(gate) of IP block <%s> failed %d\n",
a1255107 1671 adev->ip_blocks[i].version->funcs->name, r);
4a446d55
AD
1672 return r;
1673 }
b0b00ff1 1674 }
d38ceaf9 1675 }
06b18f61 1676
c9f96fd5
RZ
1677 return 0;
1678}
1679
1112a46b 1680static int amdgpu_device_set_pg_state(struct amdgpu_device *adev, enum amd_powergating_state state)
c9f96fd5 1681{
1112a46b 1682 int i, j, r;
06b18f61 1683
c9f96fd5
RZ
1684 if (amdgpu_emu_mode == 1)
1685 return 0;
1686
1112a46b
RZ
1687 for (j = 0; j < adev->num_ip_blocks; j++) {
1688 i = state == AMD_PG_STATE_GATE ? j : adev->num_ip_blocks - j - 1;
c9f96fd5
RZ
1689 if (!adev->ip_blocks[i].status.valid)
1690 continue;
1691 /* skip CG for VCE/UVD, it's handled specially */
1692 if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
1693 adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE &&
1694 adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCN &&
1695 adev->ip_blocks[i].version->funcs->set_powergating_state) {
1696 /* enable powergating to save power */
1697 r = adev->ip_blocks[i].version->funcs->set_powergating_state((void *)adev,
1112a46b 1698 state);
c9f96fd5
RZ
1699 if (r) {
1700 DRM_ERROR("set_powergating_state(gate) of IP block <%s> failed %d\n",
1701 adev->ip_blocks[i].version->funcs->name, r);
1702 return r;
1703 }
1704 }
1705 }
2dc80b00
S
1706 return 0;
1707}
1708
e3ecdffa
AD
1709/**
1710 * amdgpu_device_ip_late_init - run late init for hardware IPs
1711 *
1712 * @adev: amdgpu_device pointer
1713 *
1714 * Late initialization pass for hardware IPs. The list of all the hardware
1715 * IPs that make up the asic is walked and the late_init callbacks are run.
1716 * late_init covers any special initialization that an IP requires
1717 * after all of the have been initialized or something that needs to happen
1718 * late in the init process.
1719 * Returns 0 on success, negative error code on failure.
1720 */
06ec9070 1721static int amdgpu_device_ip_late_init(struct amdgpu_device *adev)
2dc80b00
S
1722{
1723 int i = 0, r;
1724
1725 for (i = 0; i < adev->num_ip_blocks; i++) {
1726 if (!adev->ip_blocks[i].status.valid)
1727 continue;
1728 if (adev->ip_blocks[i].version->funcs->late_init) {
1729 r = adev->ip_blocks[i].version->funcs->late_init((void *)adev);
1730 if (r) {
1731 DRM_ERROR("late_init of IP block <%s> failed %d\n",
1732 adev->ip_blocks[i].version->funcs->name, r);
1733 return r;
1734 }
1735 adev->ip_blocks[i].status.late_initialized = true;
1736 }
1737 }
1738
1112a46b
RZ
1739 amdgpu_device_set_cg_state(adev, AMD_CG_STATE_GATE);
1740 amdgpu_device_set_pg_state(adev, AMD_PG_STATE_GATE);
916ac57f 1741
2c773de2
S
1742 queue_delayed_work(system_wq, &adev->late_init_work,
1743 msecs_to_jiffies(AMDGPU_RESUME_MS));
d38ceaf9 1744
06ec9070 1745 amdgpu_device_fill_reset_magic(adev);
d38ceaf9
AD
1746
1747 return 0;
1748}
1749
e3ecdffa
AD
1750/**
1751 * amdgpu_device_ip_fini - run fini for hardware IPs
1752 *
1753 * @adev: amdgpu_device pointer
1754 *
1755 * Main teardown pass for hardware IPs. The list of all the hardware
1756 * IPs that make up the asic is walked and the hw_fini and sw_fini callbacks
1757 * are run. hw_fini tears down the hardware associated with each IP
1758 * and sw_fini tears down any software state associated with each IP.
1759 * Returns 0 on success, negative error code on failure.
1760 */
06ec9070 1761static int amdgpu_device_ip_fini(struct amdgpu_device *adev)
d38ceaf9
AD
1762{
1763 int i, r;
1764
1884734a 1765 amdgpu_amdkfd_device_fini(adev);
05df1f01
RZ
1766
1767 amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE);
fdd34271
RZ
1768 amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE);
1769
3e96dbfd
AD
1770 /* need to disable SMC first */
1771 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 1772 if (!adev->ip_blocks[i].status.hw)
3e96dbfd 1773 continue;
fdd34271 1774 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) {
a1255107 1775 r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev);
3e96dbfd
AD
1776 /* XXX handle errors */
1777 if (r) {
1778 DRM_DEBUG("hw_fini of IP block <%s> failed %d\n",
a1255107 1779 adev->ip_blocks[i].version->funcs->name, r);
3e96dbfd 1780 }
a1255107 1781 adev->ip_blocks[i].status.hw = false;
3e96dbfd
AD
1782 break;
1783 }
1784 }
1785
d38ceaf9 1786 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1787 if (!adev->ip_blocks[i].status.hw)
d38ceaf9 1788 continue;
8201a67a 1789
a1255107 1790 r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev);
d38ceaf9 1791 /* XXX handle errors */
2c1a2784 1792 if (r) {
a1255107
AD
1793 DRM_DEBUG("hw_fini of IP block <%s> failed %d\n",
1794 adev->ip_blocks[i].version->funcs->name, r);
2c1a2784 1795 }
8201a67a 1796
a1255107 1797 adev->ip_blocks[i].status.hw = false;
d38ceaf9
AD
1798 }
1799
9950cda2 1800
d38ceaf9 1801 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1802 if (!adev->ip_blocks[i].status.sw)
d38ceaf9 1803 continue;
c12aba3a
ML
1804
1805 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
1806 amdgpu_free_static_csa(adev);
1807 amdgpu_device_wb_fini(adev);
1808 amdgpu_device_vram_scratch_fini(adev);
1809 }
1810
a1255107 1811 r = adev->ip_blocks[i].version->funcs->sw_fini((void *)adev);
d38ceaf9 1812 /* XXX handle errors */
2c1a2784 1813 if (r) {
a1255107
AD
1814 DRM_DEBUG("sw_fini of IP block <%s> failed %d\n",
1815 adev->ip_blocks[i].version->funcs->name, r);
2c1a2784 1816 }
a1255107
AD
1817 adev->ip_blocks[i].status.sw = false;
1818 adev->ip_blocks[i].status.valid = false;
d38ceaf9
AD
1819 }
1820
a6dcfd9c 1821 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1822 if (!adev->ip_blocks[i].status.late_initialized)
8a2eef1d 1823 continue;
a1255107
AD
1824 if (adev->ip_blocks[i].version->funcs->late_fini)
1825 adev->ip_blocks[i].version->funcs->late_fini((void *)adev);
1826 adev->ip_blocks[i].status.late_initialized = false;
a6dcfd9c
ML
1827 }
1828
030308fc 1829 if (amdgpu_sriov_vf(adev))
24136135
ML
1830 if (amdgpu_virt_release_full_gpu(adev, false))
1831 DRM_ERROR("failed to release exclusive mode on fini\n");
2493664f 1832
d38ceaf9
AD
1833 return 0;
1834}
1835
b55c9e7a
EQ
1836static int amdgpu_device_enable_mgpu_fan_boost(void)
1837{
1838 struct amdgpu_gpu_instance *gpu_ins;
1839 struct amdgpu_device *adev;
1840 int i, ret = 0;
1841
1842 mutex_lock(&mgpu_info.mutex);
1843
1844 /*
1845 * MGPU fan boost feature should be enabled
1846 * only when there are two or more dGPUs in
1847 * the system
1848 */
1849 if (mgpu_info.num_dgpu < 2)
1850 goto out;
1851
1852 for (i = 0; i < mgpu_info.num_dgpu; i++) {
1853 gpu_ins = &(mgpu_info.gpu_ins[i]);
1854 adev = gpu_ins->adev;
1855 if (!(adev->flags & AMD_IS_APU) &&
1856 !gpu_ins->mgpu_fan_enabled &&
1857 adev->powerplay.pp_funcs &&
1858 adev->powerplay.pp_funcs->enable_mgpu_fan_boost) {
1859 ret = amdgpu_dpm_enable_mgpu_fan_boost(adev);
1860 if (ret)
1861 break;
1862
1863 gpu_ins->mgpu_fan_enabled = 1;
1864 }
1865 }
1866
1867out:
1868 mutex_unlock(&mgpu_info.mutex);
1869
1870 return ret;
1871}
1872
e3ecdffa 1873/**
1112a46b 1874 * amdgpu_device_ip_late_init_func_handler - work handler for ib test
e3ecdffa 1875 *
1112a46b 1876 * @work: work_struct.
e3ecdffa 1877 */
06ec9070 1878static void amdgpu_device_ip_late_init_func_handler(struct work_struct *work)
2dc80b00
S
1879{
1880 struct amdgpu_device *adev =
1881 container_of(work, struct amdgpu_device, late_init_work.work);
916ac57f
RZ
1882 int r;
1883
1884 r = amdgpu_ib_ring_tests(adev);
1885 if (r)
1886 DRM_ERROR("ib ring test failed (%d).\n", r);
b55c9e7a
EQ
1887
1888 r = amdgpu_device_enable_mgpu_fan_boost();
1889 if (r)
1890 DRM_ERROR("enable mgpu fan boost failed (%d).\n", r);
2dc80b00
S
1891}
1892
1e317b99
RZ
1893static void amdgpu_device_delay_enable_gfx_off(struct work_struct *work)
1894{
1895 struct amdgpu_device *adev =
1896 container_of(work, struct amdgpu_device, gfx.gfx_off_delay_work.work);
1897
1898 mutex_lock(&adev->gfx.gfx_off_mutex);
1899 if (!adev->gfx.gfx_off_state && !adev->gfx.gfx_off_req_count) {
1900 if (!amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, true))
1901 adev->gfx.gfx_off_state = true;
1902 }
1903 mutex_unlock(&adev->gfx.gfx_off_mutex);
1904}
1905
e3ecdffa 1906/**
e7854a03 1907 * amdgpu_device_ip_suspend_phase1 - run suspend for hardware IPs (phase 1)
e3ecdffa
AD
1908 *
1909 * @adev: amdgpu_device pointer
1910 *
1911 * Main suspend function for hardware IPs. The list of all the hardware
1912 * IPs that make up the asic is walked, clockgating is disabled and the
1913 * suspend callbacks are run. suspend puts the hardware and software state
1914 * in each IP into a state suitable for suspend.
1915 * Returns 0 on success, negative error code on failure.
1916 */
e7854a03
AD
1917static int amdgpu_device_ip_suspend_phase1(struct amdgpu_device *adev)
1918{
1919 int i, r;
1920
05df1f01 1921 amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE);
fdd34271 1922 amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE);
05df1f01 1923
e7854a03
AD
1924 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
1925 if (!adev->ip_blocks[i].status.valid)
1926 continue;
1927 /* displays are handled separately */
1928 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE) {
e7854a03
AD
1929 /* XXX handle errors */
1930 r = adev->ip_blocks[i].version->funcs->suspend(adev);
1931 /* XXX handle errors */
1932 if (r) {
1933 DRM_ERROR("suspend of IP block <%s> failed %d\n",
1934 adev->ip_blocks[i].version->funcs->name, r);
1935 }
1936 }
1937 }
1938
e7854a03
AD
1939 return 0;
1940}
1941
1942/**
1943 * amdgpu_device_ip_suspend_phase2 - run suspend for hardware IPs (phase 2)
1944 *
1945 * @adev: amdgpu_device pointer
1946 *
1947 * Main suspend function for hardware IPs. The list of all the hardware
1948 * IPs that make up the asic is walked, clockgating is disabled and the
1949 * suspend callbacks are run. suspend puts the hardware and software state
1950 * in each IP into a state suitable for suspend.
1951 * Returns 0 on success, negative error code on failure.
1952 */
1953static int amdgpu_device_ip_suspend_phase2(struct amdgpu_device *adev)
d38ceaf9
AD
1954{
1955 int i, r;
1956
1957 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
a1255107 1958 if (!adev->ip_blocks[i].status.valid)
d38ceaf9 1959 continue;
e7854a03
AD
1960 /* displays are handled in phase1 */
1961 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE)
1962 continue;
d38ceaf9 1963 /* XXX handle errors */
a1255107 1964 r = adev->ip_blocks[i].version->funcs->suspend(adev);
d38ceaf9 1965 /* XXX handle errors */
2c1a2784 1966 if (r) {
a1255107
AD
1967 DRM_ERROR("suspend of IP block <%s> failed %d\n",
1968 adev->ip_blocks[i].version->funcs->name, r);
2c1a2784 1969 }
d38ceaf9
AD
1970 }
1971
1972 return 0;
1973}
1974
e7854a03
AD
1975/**
1976 * amdgpu_device_ip_suspend - run suspend for hardware IPs
1977 *
1978 * @adev: amdgpu_device pointer
1979 *
1980 * Main suspend function for hardware IPs. The list of all the hardware
1981 * IPs that make up the asic is walked, clockgating is disabled and the
1982 * suspend callbacks are run. suspend puts the hardware and software state
1983 * in each IP into a state suitable for suspend.
1984 * Returns 0 on success, negative error code on failure.
1985 */
1986int amdgpu_device_ip_suspend(struct amdgpu_device *adev)
1987{
1988 int r;
1989
e7819644
YT
1990 if (amdgpu_sriov_vf(adev))
1991 amdgpu_virt_request_full_gpu(adev, false);
1992
e7854a03
AD
1993 r = amdgpu_device_ip_suspend_phase1(adev);
1994 if (r)
1995 return r;
1996 r = amdgpu_device_ip_suspend_phase2(adev);
1997
e7819644
YT
1998 if (amdgpu_sriov_vf(adev))
1999 amdgpu_virt_release_full_gpu(adev, false);
2000
e7854a03
AD
2001 return r;
2002}
2003
06ec9070 2004static int amdgpu_device_ip_reinit_early_sriov(struct amdgpu_device *adev)
a90ad3c2
ML
2005{
2006 int i, r;
2007
2cb681b6
ML
2008 static enum amd_ip_block_type ip_order[] = {
2009 AMD_IP_BLOCK_TYPE_GMC,
2010 AMD_IP_BLOCK_TYPE_COMMON,
39186aef 2011 AMD_IP_BLOCK_TYPE_PSP,
2cb681b6
ML
2012 AMD_IP_BLOCK_TYPE_IH,
2013 };
a90ad3c2 2014
2cb681b6
ML
2015 for (i = 0; i < ARRAY_SIZE(ip_order); i++) {
2016 int j;
2017 struct amdgpu_ip_block *block;
a90ad3c2 2018
2cb681b6
ML
2019 for (j = 0; j < adev->num_ip_blocks; j++) {
2020 block = &adev->ip_blocks[j];
2021
2022 if (block->version->type != ip_order[i] ||
2023 !block->status.valid)
2024 continue;
2025
2026 r = block->version->funcs->hw_init(adev);
3f48c681 2027 DRM_INFO("RE-INIT: %s %s\n", block->version->funcs->name, r?"failed":"succeeded");
c41d1cf6
ML
2028 if (r)
2029 return r;
a90ad3c2
ML
2030 }
2031 }
2032
2033 return 0;
2034}
2035
06ec9070 2036static int amdgpu_device_ip_reinit_late_sriov(struct amdgpu_device *adev)
a90ad3c2
ML
2037{
2038 int i, r;
2039
2cb681b6
ML
2040 static enum amd_ip_block_type ip_order[] = {
2041 AMD_IP_BLOCK_TYPE_SMC,
2042 AMD_IP_BLOCK_TYPE_DCE,
2043 AMD_IP_BLOCK_TYPE_GFX,
2044 AMD_IP_BLOCK_TYPE_SDMA,
257deb8c
FM
2045 AMD_IP_BLOCK_TYPE_UVD,
2046 AMD_IP_BLOCK_TYPE_VCE
2cb681b6 2047 };
a90ad3c2 2048
2cb681b6
ML
2049 for (i = 0; i < ARRAY_SIZE(ip_order); i++) {
2050 int j;
2051 struct amdgpu_ip_block *block;
a90ad3c2 2052
2cb681b6
ML
2053 for (j = 0; j < adev->num_ip_blocks; j++) {
2054 block = &adev->ip_blocks[j];
2055
2056 if (block->version->type != ip_order[i] ||
2057 !block->status.valid)
2058 continue;
2059
2060 r = block->version->funcs->hw_init(adev);
3f48c681 2061 DRM_INFO("RE-INIT: %s %s\n", block->version->funcs->name, r?"failed":"succeeded");
c41d1cf6
ML
2062 if (r)
2063 return r;
a90ad3c2
ML
2064 }
2065 }
2066
2067 return 0;
2068}
2069
e3ecdffa
AD
2070/**
2071 * amdgpu_device_ip_resume_phase1 - run resume for hardware IPs
2072 *
2073 * @adev: amdgpu_device pointer
2074 *
2075 * First resume function for hardware IPs. The list of all the hardware
2076 * IPs that make up the asic is walked and the resume callbacks are run for
2077 * COMMON, GMC, and IH. resume puts the hardware into a functional state
2078 * after a suspend and updates the software state as necessary. This
2079 * function is also used for restoring the GPU after a GPU reset.
2080 * Returns 0 on success, negative error code on failure.
2081 */
06ec9070 2082static int amdgpu_device_ip_resume_phase1(struct amdgpu_device *adev)
d38ceaf9
AD
2083{
2084 int i, r;
2085
a90ad3c2
ML
2086 for (i = 0; i < adev->num_ip_blocks; i++) {
2087 if (!adev->ip_blocks[i].status.valid)
2088 continue;
a90ad3c2 2089 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||
e3ecdffa
AD
2090 adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||
2091 adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH) {
fcf0649f
CZ
2092 r = adev->ip_blocks[i].version->funcs->resume(adev);
2093 if (r) {
2094 DRM_ERROR("resume of IP block <%s> failed %d\n",
2095 adev->ip_blocks[i].version->funcs->name, r);
2096 return r;
2097 }
a90ad3c2
ML
2098 }
2099 }
2100
2101 return 0;
2102}
2103
e3ecdffa
AD
2104/**
2105 * amdgpu_device_ip_resume_phase2 - run resume for hardware IPs
2106 *
2107 * @adev: amdgpu_device pointer
2108 *
2109 * First resume function for hardware IPs. The list of all the hardware
2110 * IPs that make up the asic is walked and the resume callbacks are run for
2111 * all blocks except COMMON, GMC, and IH. resume puts the hardware into a
2112 * functional state after a suspend and updates the software state as
2113 * necessary. This function is also used for restoring the GPU after a GPU
2114 * reset.
2115 * Returns 0 on success, negative error code on failure.
2116 */
06ec9070 2117static int amdgpu_device_ip_resume_phase2(struct amdgpu_device *adev)
d38ceaf9
AD
2118{
2119 int i, r;
2120
2121 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2122 if (!adev->ip_blocks[i].status.valid)
d38ceaf9 2123 continue;
fcf0649f 2124 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||
e3ecdffa
AD
2125 adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||
2126 adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH)
fcf0649f 2127 continue;
a1255107 2128 r = adev->ip_blocks[i].version->funcs->resume(adev);
2c1a2784 2129 if (r) {
a1255107
AD
2130 DRM_ERROR("resume of IP block <%s> failed %d\n",
2131 adev->ip_blocks[i].version->funcs->name, r);
d38ceaf9 2132 return r;
2c1a2784 2133 }
d38ceaf9
AD
2134 }
2135
2136 return 0;
2137}
2138
e3ecdffa
AD
2139/**
2140 * amdgpu_device_ip_resume - run resume for hardware IPs
2141 *
2142 * @adev: amdgpu_device pointer
2143 *
2144 * Main resume function for hardware IPs. The hardware IPs
2145 * are split into two resume functions because they are
2146 * are also used in in recovering from a GPU reset and some additional
2147 * steps need to be take between them. In this case (S3/S4) they are
2148 * run sequentially.
2149 * Returns 0 on success, negative error code on failure.
2150 */
06ec9070 2151static int amdgpu_device_ip_resume(struct amdgpu_device *adev)
fcf0649f
CZ
2152{
2153 int r;
2154
06ec9070 2155 r = amdgpu_device_ip_resume_phase1(adev);
fcf0649f
CZ
2156 if (r)
2157 return r;
06ec9070 2158 r = amdgpu_device_ip_resume_phase2(adev);
fcf0649f
CZ
2159
2160 return r;
2161}
2162
e3ecdffa
AD
2163/**
2164 * amdgpu_device_detect_sriov_bios - determine if the board supports SR-IOV
2165 *
2166 * @adev: amdgpu_device pointer
2167 *
2168 * Query the VBIOS data tables to determine if the board supports SR-IOV.
2169 */
4e99a44e 2170static void amdgpu_device_detect_sriov_bios(struct amdgpu_device *adev)
048765ad 2171{
6867e1b5
ML
2172 if (amdgpu_sriov_vf(adev)) {
2173 if (adev->is_atom_fw) {
2174 if (amdgpu_atomfirmware_gpu_supports_virtualization(adev))
2175 adev->virt.caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;
2176 } else {
2177 if (amdgpu_atombios_has_gpu_virtualization_table(adev))
2178 adev->virt.caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;
2179 }
2180
2181 if (!(adev->virt.caps & AMDGPU_SRIOV_CAPS_SRIOV_VBIOS))
2182 amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_NO_VBIOS, 0, 0);
a5bde2f9 2183 }
048765ad
AR
2184}
2185
e3ecdffa
AD
2186/**
2187 * amdgpu_device_asic_has_dc_support - determine if DC supports the asic
2188 *
2189 * @asic_type: AMD asic type
2190 *
2191 * Check if there is DC (new modesetting infrastructre) support for an asic.
2192 * returns true if DC has support, false if not.
2193 */
4562236b
HW
2194bool amdgpu_device_asic_has_dc_support(enum amd_asic_type asic_type)
2195{
2196 switch (asic_type) {
2197#if defined(CONFIG_DRM_AMD_DC)
2198 case CHIP_BONAIRE:
0d6fbccb 2199 case CHIP_KAVERI:
367e6687
AD
2200 case CHIP_KABINI:
2201 case CHIP_MULLINS:
d9fda248
HW
2202 /*
2203 * We have systems in the wild with these ASICs that require
2204 * LVDS and VGA support which is not supported with DC.
2205 *
2206 * Fallback to the non-DC driver here by default so as not to
2207 * cause regressions.
2208 */
2209 return amdgpu_dc > 0;
2210 case CHIP_HAWAII:
4562236b
HW
2211 case CHIP_CARRIZO:
2212 case CHIP_STONEY:
4562236b 2213 case CHIP_POLARIS10:
675fd32b 2214 case CHIP_POLARIS11:
2c8ad2d5 2215 case CHIP_POLARIS12:
675fd32b 2216 case CHIP_VEGAM:
4562236b
HW
2217 case CHIP_TONGA:
2218 case CHIP_FIJI:
42f8ffa1 2219 case CHIP_VEGA10:
dca7b401 2220 case CHIP_VEGA12:
c6034aa2 2221 case CHIP_VEGA20:
dc37a9a0 2222#if defined(CONFIG_DRM_AMD_DC_DCN1_0)
fd187853 2223 case CHIP_RAVEN:
42f8ffa1 2224#endif
fd187853 2225 return amdgpu_dc != 0;
4562236b
HW
2226#endif
2227 default:
2228 return false;
2229 }
2230}
2231
2232/**
2233 * amdgpu_device_has_dc_support - check if dc is supported
2234 *
2235 * @adev: amdgpu_device_pointer
2236 *
2237 * Returns true for supported, false for not supported
2238 */
2239bool amdgpu_device_has_dc_support(struct amdgpu_device *adev)
2240{
2555039d
XY
2241 if (amdgpu_sriov_vf(adev))
2242 return false;
2243
4562236b
HW
2244 return amdgpu_device_asic_has_dc_support(adev->asic_type);
2245}
2246
d38ceaf9
AD
2247/**
2248 * amdgpu_device_init - initialize the driver
2249 *
2250 * @adev: amdgpu_device pointer
87e3f136 2251 * @ddev: drm dev pointer
d38ceaf9
AD
2252 * @pdev: pci dev pointer
2253 * @flags: driver flags
2254 *
2255 * Initializes the driver info and hw (all asics).
2256 * Returns 0 for success or an error on failure.
2257 * Called at driver startup.
2258 */
2259int amdgpu_device_init(struct amdgpu_device *adev,
2260 struct drm_device *ddev,
2261 struct pci_dev *pdev,
2262 uint32_t flags)
2263{
2264 int r, i;
2265 bool runtime = false;
95844d20 2266 u32 max_MBps;
d38ceaf9
AD
2267
2268 adev->shutdown = false;
2269 adev->dev = &pdev->dev;
2270 adev->ddev = ddev;
2271 adev->pdev = pdev;
2272 adev->flags = flags;
2f7d10b3 2273 adev->asic_type = flags & AMD_ASIC_MASK;
d38ceaf9 2274 adev->usec_timeout = AMDGPU_MAX_USEC_TIMEOUT;
593aa2d2
SL
2275 if (amdgpu_emu_mode == 1)
2276 adev->usec_timeout *= 2;
770d13b1 2277 adev->gmc.gart_size = 512 * 1024 * 1024;
d38ceaf9
AD
2278 adev->accel_working = false;
2279 adev->num_rings = 0;
2280 adev->mman.buffer_funcs = NULL;
2281 adev->mman.buffer_funcs_ring = NULL;
2282 adev->vm_manager.vm_pte_funcs = NULL;
3798e9a6 2283 adev->vm_manager.vm_pte_num_rqs = 0;
132f34e4 2284 adev->gmc.gmc_funcs = NULL;
f54d1867 2285 adev->fence_context = dma_fence_context_alloc(AMDGPU_MAX_RINGS);
b8866c26 2286 bitmap_zero(adev->gfx.pipe_reserve_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);
d38ceaf9
AD
2287
2288 adev->smc_rreg = &amdgpu_invalid_rreg;
2289 adev->smc_wreg = &amdgpu_invalid_wreg;
2290 adev->pcie_rreg = &amdgpu_invalid_rreg;
2291 adev->pcie_wreg = &amdgpu_invalid_wreg;
36b9a952
HR
2292 adev->pciep_rreg = &amdgpu_invalid_rreg;
2293 adev->pciep_wreg = &amdgpu_invalid_wreg;
d38ceaf9
AD
2294 adev->uvd_ctx_rreg = &amdgpu_invalid_rreg;
2295 adev->uvd_ctx_wreg = &amdgpu_invalid_wreg;
2296 adev->didt_rreg = &amdgpu_invalid_rreg;
2297 adev->didt_wreg = &amdgpu_invalid_wreg;
ccdbb20a
RZ
2298 adev->gc_cac_rreg = &amdgpu_invalid_rreg;
2299 adev->gc_cac_wreg = &amdgpu_invalid_wreg;
d38ceaf9
AD
2300 adev->audio_endpt_rreg = &amdgpu_block_invalid_rreg;
2301 adev->audio_endpt_wreg = &amdgpu_block_invalid_wreg;
2302
3e39ab90
AD
2303 DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X 0x%02X).\n",
2304 amdgpu_asic_name[adev->asic_type], pdev->vendor, pdev->device,
2305 pdev->subsystem_vendor, pdev->subsystem_device, pdev->revision);
d38ceaf9
AD
2306
2307 /* mutex initialization are all done here so we
2308 * can recall function without having locking issues */
d38ceaf9 2309 atomic_set(&adev->irq.ih.lock, 0);
0e5ca0d1 2310 mutex_init(&adev->firmware.mutex);
d38ceaf9
AD
2311 mutex_init(&adev->pm.mutex);
2312 mutex_init(&adev->gfx.gpu_clock_mutex);
2313 mutex_init(&adev->srbm_mutex);
b8866c26 2314 mutex_init(&adev->gfx.pipe_reserve_mutex);
d23ee13f 2315 mutex_init(&adev->gfx.gfx_off_mutex);
d38ceaf9 2316 mutex_init(&adev->grbm_idx_mutex);
d38ceaf9 2317 mutex_init(&adev->mn_lock);
e23b74aa 2318 mutex_init(&adev->virt.vf_errors.lock);
d38ceaf9 2319 hash_init(adev->mn_hash);
13a752e3 2320 mutex_init(&adev->lock_reset);
d38ceaf9 2321
06ec9070 2322 amdgpu_device_check_arguments(adev);
d38ceaf9 2323
d38ceaf9
AD
2324 spin_lock_init(&adev->mmio_idx_lock);
2325 spin_lock_init(&adev->smc_idx_lock);
2326 spin_lock_init(&adev->pcie_idx_lock);
2327 spin_lock_init(&adev->uvd_ctx_idx_lock);
2328 spin_lock_init(&adev->didt_idx_lock);
ccdbb20a 2329 spin_lock_init(&adev->gc_cac_idx_lock);
16abb5d2 2330 spin_lock_init(&adev->se_cac_idx_lock);
d38ceaf9 2331 spin_lock_init(&adev->audio_endpt_idx_lock);
95844d20 2332 spin_lock_init(&adev->mm_stats.lock);
d38ceaf9 2333
0c4e7fa5
CZ
2334 INIT_LIST_HEAD(&adev->shadow_list);
2335 mutex_init(&adev->shadow_list_lock);
2336
795f2813
AR
2337 INIT_LIST_HEAD(&adev->ring_lru_list);
2338 spin_lock_init(&adev->ring_lru_list_lock);
2339
06ec9070
AD
2340 INIT_DELAYED_WORK(&adev->late_init_work,
2341 amdgpu_device_ip_late_init_func_handler);
1e317b99
RZ
2342 INIT_DELAYED_WORK(&adev->gfx.gfx_off_delay_work,
2343 amdgpu_device_delay_enable_gfx_off);
2dc80b00 2344
d23ee13f 2345 adev->gfx.gfx_off_req_count = 1;
b1ddf548
RZ
2346 adev->pm.ac_power = power_supply_is_system_supplied() > 0 ? true : false;
2347
0fa49558
AX
2348 /* Registers mapping */
2349 /* TODO: block userspace mapping of io register */
da69c161
KW
2350 if (adev->asic_type >= CHIP_BONAIRE) {
2351 adev->rmmio_base = pci_resource_start(adev->pdev, 5);
2352 adev->rmmio_size = pci_resource_len(adev->pdev, 5);
2353 } else {
2354 adev->rmmio_base = pci_resource_start(adev->pdev, 2);
2355 adev->rmmio_size = pci_resource_len(adev->pdev, 2);
2356 }
d38ceaf9 2357
d38ceaf9
AD
2358 adev->rmmio = ioremap(adev->rmmio_base, adev->rmmio_size);
2359 if (adev->rmmio == NULL) {
2360 return -ENOMEM;
2361 }
2362 DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)adev->rmmio_base);
2363 DRM_INFO("register mmio size: %u\n", (unsigned)adev->rmmio_size);
2364
705e519e 2365 /* doorbell bar mapping */
06ec9070 2366 amdgpu_device_doorbell_init(adev);
d38ceaf9
AD
2367
2368 /* io port mapping */
2369 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
2370 if (pci_resource_flags(adev->pdev, i) & IORESOURCE_IO) {
2371 adev->rio_mem_size = pci_resource_len(adev->pdev, i);
2372 adev->rio_mem = pci_iomap(adev->pdev, i, adev->rio_mem_size);
2373 break;
2374 }
2375 }
2376 if (adev->rio_mem == NULL)
b64a18c5 2377 DRM_INFO("PCI I/O BAR is not found.\n");
d38ceaf9 2378
5494d864
AD
2379 amdgpu_device_get_pcie_info(adev);
2380
d38ceaf9 2381 /* early init functions */
06ec9070 2382 r = amdgpu_device_ip_early_init(adev);
d38ceaf9
AD
2383 if (r)
2384 return r;
2385
2386 /* if we have > 1 VGA cards, then disable the amdgpu VGA resources */
2387 /* this will fail for cards that aren't VGA class devices, just
2388 * ignore it */
06ec9070 2389 vga_client_register(adev->pdev, adev, NULL, amdgpu_device_vga_set_decode);
d38ceaf9 2390
e9bef455 2391 if (amdgpu_device_is_px(ddev))
d38ceaf9 2392 runtime = true;
84c8b22e
LW
2393 if (!pci_is_thunderbolt_attached(adev->pdev))
2394 vga_switcheroo_register_client(adev->pdev,
2395 &amdgpu_switcheroo_ops, runtime);
d38ceaf9
AD
2396 if (runtime)
2397 vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain);
2398
9475a943
SL
2399 if (amdgpu_emu_mode == 1) {
2400 /* post the asic on emulation mode */
2401 emu_soc_asic_init(adev);
bfca0289 2402 goto fence_driver_init;
9475a943 2403 }
bfca0289 2404
d38ceaf9 2405 /* Read BIOS */
83ba126a
AD
2406 if (!amdgpu_get_bios(adev)) {
2407 r = -EINVAL;
2408 goto failed;
2409 }
f7e9e9fe 2410
d38ceaf9 2411 r = amdgpu_atombios_init(adev);
2c1a2784
AD
2412 if (r) {
2413 dev_err(adev->dev, "amdgpu_atombios_init failed\n");
e23b74aa 2414 amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_INIT_FAIL, 0, 0);
83ba126a 2415 goto failed;
2c1a2784 2416 }
d38ceaf9 2417
4e99a44e
ML
2418 /* detect if we are with an SRIOV vbios */
2419 amdgpu_device_detect_sriov_bios(adev);
048765ad 2420
d38ceaf9 2421 /* Post card if necessary */
39c640c0 2422 if (amdgpu_device_need_post(adev)) {
d38ceaf9 2423 if (!adev->bios) {
bec86378 2424 dev_err(adev->dev, "no vBIOS found\n");
83ba126a
AD
2425 r = -EINVAL;
2426 goto failed;
d38ceaf9 2427 }
bec86378 2428 DRM_INFO("GPU posting now...\n");
4e99a44e
ML
2429 r = amdgpu_atom_asic_init(adev->mode_info.atom_context);
2430 if (r) {
2431 dev_err(adev->dev, "gpu post error!\n");
2432 goto failed;
2433 }
d38ceaf9
AD
2434 }
2435
88b64e95
AD
2436 if (adev->is_atom_fw) {
2437 /* Initialize clocks */
2438 r = amdgpu_atomfirmware_get_clock_info(adev);
2439 if (r) {
2440 dev_err(adev->dev, "amdgpu_atomfirmware_get_clock_info failed\n");
e23b74aa 2441 amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0);
88b64e95
AD
2442 goto failed;
2443 }
2444 } else {
a5bde2f9
AD
2445 /* Initialize clocks */
2446 r = amdgpu_atombios_get_clock_info(adev);
2447 if (r) {
2448 dev_err(adev->dev, "amdgpu_atombios_get_clock_info failed\n");
e23b74aa 2449 amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0);
89041940 2450 goto failed;
a5bde2f9
AD
2451 }
2452 /* init i2c buses */
4562236b
HW
2453 if (!amdgpu_device_has_dc_support(adev))
2454 amdgpu_atombios_i2c_init(adev);
2c1a2784 2455 }
d38ceaf9 2456
bfca0289 2457fence_driver_init:
d38ceaf9
AD
2458 /* Fence driver */
2459 r = amdgpu_fence_driver_init(adev);
2c1a2784
AD
2460 if (r) {
2461 dev_err(adev->dev, "amdgpu_fence_driver_init failed\n");
e23b74aa 2462 amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_FENCE_INIT_FAIL, 0, 0);
83ba126a 2463 goto failed;
2c1a2784 2464 }
d38ceaf9
AD
2465
2466 /* init the mode config */
2467 drm_mode_config_init(adev->ddev);
2468
06ec9070 2469 r = amdgpu_device_ip_init(adev);
d38ceaf9 2470 if (r) {
8840a387 2471 /* failed in exclusive mode due to timeout */
2472 if (amdgpu_sriov_vf(adev) &&
2473 !amdgpu_sriov_runtime(adev) &&
2474 amdgpu_virt_mmio_blocked(adev) &&
2475 !amdgpu_virt_wait_reset(adev)) {
2476 dev_err(adev->dev, "VF exclusive mode timeout\n");
1daee8b4
PD
2477 /* Don't send request since VF is inactive. */
2478 adev->virt.caps &= ~AMDGPU_SRIOV_CAPS_RUNTIME;
2479 adev->virt.ops = NULL;
8840a387 2480 r = -EAGAIN;
2481 goto failed;
2482 }
06ec9070 2483 dev_err(adev->dev, "amdgpu_device_ip_init failed\n");
e23b74aa 2484 amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_AMDGPU_INIT_FAIL, 0, 0);
83ba126a 2485 goto failed;
d38ceaf9
AD
2486 }
2487
2488 adev->accel_working = true;
2489
e59c0205
AX
2490 amdgpu_vm_check_compute_bug(adev);
2491
95844d20
MO
2492 /* Initialize the buffer migration limit. */
2493 if (amdgpu_moverate >= 0)
2494 max_MBps = amdgpu_moverate;
2495 else
2496 max_MBps = 8; /* Allow 8 MB/s. */
2497 /* Get a log2 for easy divisions. */
2498 adev->mm_stats.log2_max_MBps = ilog2(max(1u, max_MBps));
2499
d38ceaf9
AD
2500 r = amdgpu_ib_pool_init(adev);
2501 if (r) {
2502 dev_err(adev->dev, "IB initialization failed (%d).\n", r);
e23b74aa 2503 amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_IB_INIT_FAIL, 0, r);
83ba126a 2504 goto failed;
d38ceaf9
AD
2505 }
2506
2dc8f81e
HC
2507 if (amdgpu_sriov_vf(adev))
2508 amdgpu_virt_init_data_exchange(adev);
2509
9bc92b9c
ML
2510 amdgpu_fbdev_init(adev);
2511
d2f52ac8
RZ
2512 r = amdgpu_pm_sysfs_init(adev);
2513 if (r)
2514 DRM_ERROR("registering pm debugfs failed (%d).\n", r);
2515
75758255 2516 r = amdgpu_debugfs_gem_init(adev);
3f14e623 2517 if (r)
d38ceaf9 2518 DRM_ERROR("registering gem debugfs failed (%d).\n", r);
d38ceaf9
AD
2519
2520 r = amdgpu_debugfs_regs_init(adev);
3f14e623 2521 if (r)
d38ceaf9 2522 DRM_ERROR("registering register debugfs failed (%d).\n", r);
d38ceaf9 2523
50ab2533 2524 r = amdgpu_debugfs_firmware_init(adev);
3f14e623 2525 if (r)
50ab2533 2526 DRM_ERROR("registering firmware debugfs failed (%d).\n", r);
50ab2533 2527
763efb6c 2528 r = amdgpu_debugfs_init(adev);
db95e218 2529 if (r)
763efb6c 2530 DRM_ERROR("Creating debugfs files failed (%d).\n", r);
db95e218 2531
d38ceaf9
AD
2532 if ((amdgpu_testing & 1)) {
2533 if (adev->accel_working)
2534 amdgpu_test_moves(adev);
2535 else
2536 DRM_INFO("amdgpu: acceleration disabled, skipping move tests\n");
2537 }
d38ceaf9
AD
2538 if (amdgpu_benchmarking) {
2539 if (adev->accel_working)
2540 amdgpu_benchmark(adev, amdgpu_benchmarking);
2541 else
2542 DRM_INFO("amdgpu: acceleration disabled, skipping benchmarks\n");
2543 }
2544
2545 /* enable clockgating, etc. after ib tests, etc. since some blocks require
2546 * explicit gating rather than handling it automatically.
2547 */
06ec9070 2548 r = amdgpu_device_ip_late_init(adev);
2c1a2784 2549 if (r) {
06ec9070 2550 dev_err(adev->dev, "amdgpu_device_ip_late_init failed\n");
e23b74aa 2551 amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_AMDGPU_LATE_INIT_FAIL, 0, r);
83ba126a 2552 goto failed;
2c1a2784 2553 }
d38ceaf9
AD
2554
2555 return 0;
83ba126a
AD
2556
2557failed:
89041940 2558 amdgpu_vf_error_trans_all(adev);
83ba126a
AD
2559 if (runtime)
2560 vga_switcheroo_fini_domain_pm_ops(adev->dev);
8840a387 2561
83ba126a 2562 return r;
d38ceaf9
AD
2563}
2564
d38ceaf9
AD
2565/**
2566 * amdgpu_device_fini - tear down the driver
2567 *
2568 * @adev: amdgpu_device pointer
2569 *
2570 * Tear down the driver info (all asics).
2571 * Called at driver shutdown.
2572 */
2573void amdgpu_device_fini(struct amdgpu_device *adev)
2574{
2575 int r;
2576
2577 DRM_INFO("amdgpu: finishing device.\n");
2578 adev->shutdown = true;
e5b03032
ML
2579 /* disable all interrupts */
2580 amdgpu_irq_disable_all(adev);
ff97cba8
ML
2581 if (adev->mode_info.mode_config_initialized){
2582 if (!amdgpu_device_has_dc_support(adev))
2583 drm_crtc_force_disable_all(adev->ddev);
2584 else
2585 drm_atomic_helper_shutdown(adev->ddev);
2586 }
d38ceaf9
AD
2587 amdgpu_ib_pool_fini(adev);
2588 amdgpu_fence_driver_fini(adev);
58e955d9 2589 amdgpu_pm_sysfs_fini(adev);
d38ceaf9 2590 amdgpu_fbdev_fini(adev);
06ec9070 2591 r = amdgpu_device_ip_fini(adev);
ab4fe3e1
HR
2592 if (adev->firmware.gpu_info_fw) {
2593 release_firmware(adev->firmware.gpu_info_fw);
2594 adev->firmware.gpu_info_fw = NULL;
2595 }
d38ceaf9 2596 adev->accel_working = false;
2dc80b00 2597 cancel_delayed_work_sync(&adev->late_init_work);
d38ceaf9 2598 /* free i2c buses */
4562236b
HW
2599 if (!amdgpu_device_has_dc_support(adev))
2600 amdgpu_i2c_fini(adev);
bfca0289
SL
2601
2602 if (amdgpu_emu_mode != 1)
2603 amdgpu_atombios_fini(adev);
2604
d38ceaf9
AD
2605 kfree(adev->bios);
2606 adev->bios = NULL;
84c8b22e
LW
2607 if (!pci_is_thunderbolt_attached(adev->pdev))
2608 vga_switcheroo_unregister_client(adev->pdev);
83ba126a
AD
2609 if (adev->flags & AMD_IS_PX)
2610 vga_switcheroo_fini_domain_pm_ops(adev->dev);
d38ceaf9
AD
2611 vga_client_register(adev->pdev, NULL, NULL, NULL);
2612 if (adev->rio_mem)
2613 pci_iounmap(adev->pdev, adev->rio_mem);
2614 adev->rio_mem = NULL;
2615 iounmap(adev->rmmio);
2616 adev->rmmio = NULL;
06ec9070 2617 amdgpu_device_doorbell_fini(adev);
d38ceaf9 2618 amdgpu_debugfs_regs_cleanup(adev);
d38ceaf9
AD
2619}
2620
2621
2622/*
2623 * Suspend & resume.
2624 */
2625/**
810ddc3a 2626 * amdgpu_device_suspend - initiate device suspend
d38ceaf9 2627 *
87e3f136
DP
2628 * @dev: drm dev pointer
2629 * @suspend: suspend state
2630 * @fbcon : notify the fbdev of suspend
d38ceaf9
AD
2631 *
2632 * Puts the hw in the suspend state (all asics).
2633 * Returns 0 for success or an error on failure.
2634 * Called at driver suspend.
2635 */
810ddc3a 2636int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
d38ceaf9
AD
2637{
2638 struct amdgpu_device *adev;
2639 struct drm_crtc *crtc;
2640 struct drm_connector *connector;
5ceb54c6 2641 int r;
d38ceaf9
AD
2642
2643 if (dev == NULL || dev->dev_private == NULL) {
2644 return -ENODEV;
2645 }
2646
2647 adev = dev->dev_private;
2648
2649 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
2650 return 0;
2651
44779b43 2652 adev->in_suspend = true;
d38ceaf9
AD
2653 drm_kms_helper_poll_disable(dev);
2654
5f818173
S
2655 if (fbcon)
2656 amdgpu_fbdev_set_suspend(adev, 1);
2657
a5459475
RZ
2658 cancel_delayed_work_sync(&adev->late_init_work);
2659
4562236b
HW
2660 if (!amdgpu_device_has_dc_support(adev)) {
2661 /* turn off display hw */
2662 drm_modeset_lock_all(dev);
2663 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
2664 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
2665 }
2666 drm_modeset_unlock_all(dev);
fe1053b7
AD
2667 /* unpin the front buffers and cursors */
2668 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
2669 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2670 struct drm_framebuffer *fb = crtc->primary->fb;
2671 struct amdgpu_bo *robj;
2672
2673 if (amdgpu_crtc->cursor_bo) {
2674 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2675 r = amdgpu_bo_reserve(aobj, true);
2676 if (r == 0) {
2677 amdgpu_bo_unpin(aobj);
2678 amdgpu_bo_unreserve(aobj);
2679 }
756e6880 2680 }
756e6880 2681
fe1053b7
AD
2682 if (fb == NULL || fb->obj[0] == NULL) {
2683 continue;
2684 }
2685 robj = gem_to_amdgpu_bo(fb->obj[0]);
2686 /* don't unpin kernel fb objects */
2687 if (!amdgpu_fbdev_robj_is_fb(adev, robj)) {
2688 r = amdgpu_bo_reserve(robj, true);
2689 if (r == 0) {
2690 amdgpu_bo_unpin(robj);
2691 amdgpu_bo_unreserve(robj);
2692 }
d38ceaf9
AD
2693 }
2694 }
2695 }
fe1053b7
AD
2696
2697 amdgpu_amdkfd_suspend(adev);
2698
2699 r = amdgpu_device_ip_suspend_phase1(adev);
2700
d38ceaf9
AD
2701 /* evict vram memory */
2702 amdgpu_bo_evict_vram(adev);
2703
5ceb54c6 2704 amdgpu_fence_driver_suspend(adev);
d38ceaf9 2705
fe1053b7 2706 r = amdgpu_device_ip_suspend_phase2(adev);
d38ceaf9 2707
a0a71e49
AD
2708 /* evict remaining vram memory
2709 * This second call to evict vram is to evict the gart page table
2710 * using the CPU.
2711 */
d38ceaf9
AD
2712 amdgpu_bo_evict_vram(adev);
2713
2714 pci_save_state(dev->pdev);
2715 if (suspend) {
2716 /* Shut down the device */
2717 pci_disable_device(dev->pdev);
2718 pci_set_power_state(dev->pdev, PCI_D3hot);
74b0b157 2719 } else {
2720 r = amdgpu_asic_reset(adev);
2721 if (r)
2722 DRM_ERROR("amdgpu asic reset failed\n");
d38ceaf9
AD
2723 }
2724
d38ceaf9
AD
2725 return 0;
2726}
2727
2728/**
810ddc3a 2729 * amdgpu_device_resume - initiate device resume
d38ceaf9 2730 *
87e3f136
DP
2731 * @dev: drm dev pointer
2732 * @resume: resume state
2733 * @fbcon : notify the fbdev of resume
d38ceaf9
AD
2734 *
2735 * Bring the hw back to operating state (all asics).
2736 * Returns 0 for success or an error on failure.
2737 * Called at driver resume.
2738 */
810ddc3a 2739int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
d38ceaf9
AD
2740{
2741 struct drm_connector *connector;
2742 struct amdgpu_device *adev = dev->dev_private;
756e6880 2743 struct drm_crtc *crtc;
03161a6e 2744 int r = 0;
d38ceaf9
AD
2745
2746 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
2747 return 0;
2748
d38ceaf9
AD
2749 if (resume) {
2750 pci_set_power_state(dev->pdev, PCI_D0);
2751 pci_restore_state(dev->pdev);
74b0b157 2752 r = pci_enable_device(dev->pdev);
03161a6e 2753 if (r)
4d3b9ae5 2754 return r;
d38ceaf9
AD
2755 }
2756
2757 /* post card */
39c640c0 2758 if (amdgpu_device_need_post(adev)) {
74b0b157 2759 r = amdgpu_atom_asic_init(adev->mode_info.atom_context);
2760 if (r)
2761 DRM_ERROR("amdgpu asic init failed\n");
2762 }
d38ceaf9 2763
06ec9070 2764 r = amdgpu_device_ip_resume(adev);
e6707218 2765 if (r) {
06ec9070 2766 DRM_ERROR("amdgpu_device_ip_resume failed (%d).\n", r);
4d3b9ae5 2767 return r;
e6707218 2768 }
5ceb54c6
AD
2769 amdgpu_fence_driver_resume(adev);
2770
d38ceaf9 2771
06ec9070 2772 r = amdgpu_device_ip_late_init(adev);
03161a6e 2773 if (r)
4d3b9ae5 2774 return r;
d38ceaf9 2775
fe1053b7
AD
2776 if (!amdgpu_device_has_dc_support(adev)) {
2777 /* pin cursors */
2778 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
2779 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2780
2781 if (amdgpu_crtc->cursor_bo) {
2782 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2783 r = amdgpu_bo_reserve(aobj, true);
2784 if (r == 0) {
2785 r = amdgpu_bo_pin(aobj, AMDGPU_GEM_DOMAIN_VRAM);
2786 if (r != 0)
2787 DRM_ERROR("Failed to pin cursor BO (%d)\n", r);
2788 amdgpu_crtc->cursor_addr = amdgpu_bo_gpu_offset(aobj);
2789 amdgpu_bo_unreserve(aobj);
2790 }
756e6880
AD
2791 }
2792 }
2793 }
ba997709
YZ
2794 r = amdgpu_amdkfd_resume(adev);
2795 if (r)
2796 return r;
756e6880 2797
96a5d8d4
LL
2798 /* Make sure IB tests flushed */
2799 flush_delayed_work(&adev->late_init_work);
2800
d38ceaf9
AD
2801 /* blat the mode back in */
2802 if (fbcon) {
4562236b
HW
2803 if (!amdgpu_device_has_dc_support(adev)) {
2804 /* pre DCE11 */
2805 drm_helper_resume_force_mode(dev);
2806
2807 /* turn on display hw */
2808 drm_modeset_lock_all(dev);
2809 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
2810 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
2811 }
2812 drm_modeset_unlock_all(dev);
d38ceaf9 2813 }
4d3b9ae5 2814 amdgpu_fbdev_set_suspend(adev, 0);
d38ceaf9
AD
2815 }
2816
2817 drm_kms_helper_poll_enable(dev);
23a1a9e5
L
2818
2819 /*
2820 * Most of the connector probing functions try to acquire runtime pm
2821 * refs to ensure that the GPU is powered on when connector polling is
2822 * performed. Since we're calling this from a runtime PM callback,
2823 * trying to acquire rpm refs will cause us to deadlock.
2824 *
2825 * Since we're guaranteed to be holding the rpm lock, it's safe to
2826 * temporarily disable the rpm helpers so this doesn't deadlock us.
2827 */
2828#ifdef CONFIG_PM
2829 dev->dev->power.disable_depth++;
2830#endif
4562236b
HW
2831 if (!amdgpu_device_has_dc_support(adev))
2832 drm_helper_hpd_irq_event(dev);
2833 else
2834 drm_kms_helper_hotplug_event(dev);
23a1a9e5
L
2835#ifdef CONFIG_PM
2836 dev->dev->power.disable_depth--;
2837#endif
44779b43
RZ
2838 adev->in_suspend = false;
2839
4d3b9ae5 2840 return 0;
d38ceaf9
AD
2841}
2842
e3ecdffa
AD
2843/**
2844 * amdgpu_device_ip_check_soft_reset - did soft reset succeed
2845 *
2846 * @adev: amdgpu_device pointer
2847 *
2848 * The list of all the hardware IPs that make up the asic is walked and
2849 * the check_soft_reset callbacks are run. check_soft_reset determines
2850 * if the asic is still hung or not.
2851 * Returns true if any of the IPs are still in a hung state, false if not.
2852 */
06ec9070 2853static bool amdgpu_device_ip_check_soft_reset(struct amdgpu_device *adev)
63fbf42f
CZ
2854{
2855 int i;
2856 bool asic_hang = false;
2857
f993d628
ML
2858 if (amdgpu_sriov_vf(adev))
2859 return true;
2860
8bc04c29
AD
2861 if (amdgpu_asic_need_full_reset(adev))
2862 return true;
2863
63fbf42f 2864 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2865 if (!adev->ip_blocks[i].status.valid)
63fbf42f 2866 continue;
a1255107
AD
2867 if (adev->ip_blocks[i].version->funcs->check_soft_reset)
2868 adev->ip_blocks[i].status.hang =
2869 adev->ip_blocks[i].version->funcs->check_soft_reset(adev);
2870 if (adev->ip_blocks[i].status.hang) {
2871 DRM_INFO("IP block:%s is hung!\n", adev->ip_blocks[i].version->funcs->name);
63fbf42f
CZ
2872 asic_hang = true;
2873 }
2874 }
2875 return asic_hang;
2876}
2877
e3ecdffa
AD
2878/**
2879 * amdgpu_device_ip_pre_soft_reset - prepare for soft reset
2880 *
2881 * @adev: amdgpu_device pointer
2882 *
2883 * The list of all the hardware IPs that make up the asic is walked and the
2884 * pre_soft_reset callbacks are run if the block is hung. pre_soft_reset
2885 * handles any IP specific hardware or software state changes that are
2886 * necessary for a soft reset to succeed.
2887 * Returns 0 on success, negative error code on failure.
2888 */
06ec9070 2889static int amdgpu_device_ip_pre_soft_reset(struct amdgpu_device *adev)
d31a501e
CZ
2890{
2891 int i, r = 0;
2892
2893 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2894 if (!adev->ip_blocks[i].status.valid)
d31a501e 2895 continue;
a1255107
AD
2896 if (adev->ip_blocks[i].status.hang &&
2897 adev->ip_blocks[i].version->funcs->pre_soft_reset) {
2898 r = adev->ip_blocks[i].version->funcs->pre_soft_reset(adev);
d31a501e
CZ
2899 if (r)
2900 return r;
2901 }
2902 }
2903
2904 return 0;
2905}
2906
e3ecdffa
AD
2907/**
2908 * amdgpu_device_ip_need_full_reset - check if a full asic reset is needed
2909 *
2910 * @adev: amdgpu_device pointer
2911 *
2912 * Some hardware IPs cannot be soft reset. If they are hung, a full gpu
2913 * reset is necessary to recover.
2914 * Returns true if a full asic reset is required, false if not.
2915 */
06ec9070 2916static bool amdgpu_device_ip_need_full_reset(struct amdgpu_device *adev)
35d782fe 2917{
da146d3b
AD
2918 int i;
2919
8bc04c29
AD
2920 if (amdgpu_asic_need_full_reset(adev))
2921 return true;
2922
da146d3b 2923 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2924 if (!adev->ip_blocks[i].status.valid)
da146d3b 2925 continue;
a1255107
AD
2926 if ((adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) ||
2927 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) ||
2928 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_ACP) ||
98512bb8
KW
2929 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE) ||
2930 adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP) {
a1255107 2931 if (adev->ip_blocks[i].status.hang) {
da146d3b
AD
2932 DRM_INFO("Some block need full reset!\n");
2933 return true;
2934 }
2935 }
35d782fe
CZ
2936 }
2937 return false;
2938}
2939
e3ecdffa
AD
2940/**
2941 * amdgpu_device_ip_soft_reset - do a soft reset
2942 *
2943 * @adev: amdgpu_device pointer
2944 *
2945 * The list of all the hardware IPs that make up the asic is walked and the
2946 * soft_reset callbacks are run if the block is hung. soft_reset handles any
2947 * IP specific hardware or software state changes that are necessary to soft
2948 * reset the IP.
2949 * Returns 0 on success, negative error code on failure.
2950 */
06ec9070 2951static int amdgpu_device_ip_soft_reset(struct amdgpu_device *adev)
35d782fe
CZ
2952{
2953 int i, r = 0;
2954
2955 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2956 if (!adev->ip_blocks[i].status.valid)
35d782fe 2957 continue;
a1255107
AD
2958 if (adev->ip_blocks[i].status.hang &&
2959 adev->ip_blocks[i].version->funcs->soft_reset) {
2960 r = adev->ip_blocks[i].version->funcs->soft_reset(adev);
35d782fe
CZ
2961 if (r)
2962 return r;
2963 }
2964 }
2965
2966 return 0;
2967}
2968
e3ecdffa
AD
2969/**
2970 * amdgpu_device_ip_post_soft_reset - clean up from soft reset
2971 *
2972 * @adev: amdgpu_device pointer
2973 *
2974 * The list of all the hardware IPs that make up the asic is walked and the
2975 * post_soft_reset callbacks are run if the asic was hung. post_soft_reset
2976 * handles any IP specific hardware or software state changes that are
2977 * necessary after the IP has been soft reset.
2978 * Returns 0 on success, negative error code on failure.
2979 */
06ec9070 2980static int amdgpu_device_ip_post_soft_reset(struct amdgpu_device *adev)
35d782fe
CZ
2981{
2982 int i, r = 0;
2983
2984 for (i = 0; i < adev->num_ip_blocks; i++) {
a1255107 2985 if (!adev->ip_blocks[i].status.valid)
35d782fe 2986 continue;
a1255107
AD
2987 if (adev->ip_blocks[i].status.hang &&
2988 adev->ip_blocks[i].version->funcs->post_soft_reset)
2989 r = adev->ip_blocks[i].version->funcs->post_soft_reset(adev);
35d782fe
CZ
2990 if (r)
2991 return r;
2992 }
2993
2994 return 0;
2995}
2996
e3ecdffa 2997/**
c33adbc7 2998 * amdgpu_device_recover_vram - Recover some VRAM contents
e3ecdffa
AD
2999 *
3000 * @adev: amdgpu_device pointer
3001 *
3002 * Restores the contents of VRAM buffers from the shadows in GTT. Used to
3003 * restore things like GPUVM page tables after a GPU reset where
3004 * the contents of VRAM might be lost.
403009bf
CK
3005 *
3006 * Returns:
3007 * 0 on success, negative error code on failure.
e3ecdffa 3008 */
c33adbc7 3009static int amdgpu_device_recover_vram(struct amdgpu_device *adev)
c41d1cf6 3010{
c41d1cf6 3011 struct dma_fence *fence = NULL, *next = NULL;
403009bf
CK
3012 struct amdgpu_bo *shadow;
3013 long r = 1, tmo;
c41d1cf6
ML
3014
3015 if (amdgpu_sriov_runtime(adev))
b045d3af 3016 tmo = msecs_to_jiffies(8000);
c41d1cf6
ML
3017 else
3018 tmo = msecs_to_jiffies(100);
3019
3020 DRM_INFO("recover vram bo from shadow start\n");
3021 mutex_lock(&adev->shadow_list_lock);
403009bf
CK
3022 list_for_each_entry(shadow, &adev->shadow_list, shadow_list) {
3023
3024 /* No need to recover an evicted BO */
3025 if (shadow->tbo.mem.mem_type != TTM_PL_TT ||
3026 shadow->parent->tbo.mem.mem_type != TTM_PL_VRAM)
3027 continue;
3028
3029 r = amdgpu_bo_restore_shadow(shadow, &next);
3030 if (r)
3031 break;
3032
c41d1cf6
ML
3033 if (fence) {
3034 r = dma_fence_wait_timeout(fence, false, tmo);
403009bf
CK
3035 dma_fence_put(fence);
3036 fence = next;
3037 if (r <= 0)
c41d1cf6 3038 break;
403009bf
CK
3039 } else {
3040 fence = next;
c41d1cf6 3041 }
c41d1cf6
ML
3042 }
3043 mutex_unlock(&adev->shadow_list_lock);
3044
403009bf
CK
3045 if (fence)
3046 tmo = dma_fence_wait_timeout(fence, false, tmo);
c41d1cf6
ML
3047 dma_fence_put(fence);
3048
403009bf 3049 if (r <= 0 || tmo <= 0) {
c41d1cf6 3050 DRM_ERROR("recover vram bo from shadow failed\n");
403009bf
CK
3051 return -EIO;
3052 }
c41d1cf6 3053
403009bf
CK
3054 DRM_INFO("recover vram bo from shadow done\n");
3055 return 0;
c41d1cf6
ML
3056}
3057
e3ecdffa 3058/**
06ec9070 3059 * amdgpu_device_reset - reset ASIC/GPU for bare-metal or passthrough
a90ad3c2
ML
3060 *
3061 * @adev: amdgpu device pointer
a90ad3c2 3062 *
5740682e 3063 * attempt to do soft-reset or full-reset and reinitialize Asic
3f48c681 3064 * return 0 means succeeded otherwise failed
e3ecdffa 3065 */
c41d1cf6 3066static int amdgpu_device_reset(struct amdgpu_device *adev)
a90ad3c2 3067{
5740682e
ML
3068 bool need_full_reset, vram_lost = 0;
3069 int r;
a90ad3c2 3070
06ec9070 3071 need_full_reset = amdgpu_device_ip_need_full_reset(adev);
a90ad3c2 3072
5740682e 3073 if (!need_full_reset) {
06ec9070
AD
3074 amdgpu_device_ip_pre_soft_reset(adev);
3075 r = amdgpu_device_ip_soft_reset(adev);
3076 amdgpu_device_ip_post_soft_reset(adev);
3077 if (r || amdgpu_device_ip_check_soft_reset(adev)) {
5740682e
ML
3078 DRM_INFO("soft reset failed, will fallback to full reset!\n");
3079 need_full_reset = true;
3080 }
5740682e 3081 }
a90ad3c2 3082
5740682e 3083 if (need_full_reset) {
cdd61df6 3084 r = amdgpu_device_ip_suspend(adev);
a90ad3c2 3085
5740682e 3086retry:
5740682e 3087 r = amdgpu_asic_reset(adev);
5740682e
ML
3088 /* post card */
3089 amdgpu_atom_asic_init(adev->mode_info.atom_context);
65781c78 3090
5740682e
ML
3091 if (!r) {
3092 dev_info(adev->dev, "GPU reset succeeded, trying to resume\n");
06ec9070 3093 r = amdgpu_device_ip_resume_phase1(adev);
5740682e
ML
3094 if (r)
3095 goto out;
65781c78 3096
06ec9070 3097 vram_lost = amdgpu_device_check_vram_lost(adev);
5740682e
ML
3098 if (vram_lost) {
3099 DRM_ERROR("VRAM is lost!\n");
3100 atomic_inc(&adev->vram_lost_counter);
3101 }
3102
c1c7ce8f
CK
3103 r = amdgpu_gtt_mgr_recover(
3104 &adev->mman.bdev.man[TTM_PL_TT]);
5740682e
ML
3105 if (r)
3106 goto out;
3107
06ec9070 3108 r = amdgpu_device_ip_resume_phase2(adev);
5740682e
ML
3109 if (r)
3110 goto out;
3111
3112 if (vram_lost)
06ec9070 3113 amdgpu_device_fill_reset_magic(adev);
65781c78 3114 }
5740682e 3115 }
65781c78 3116
5740682e
ML
3117out:
3118 if (!r) {
3119 amdgpu_irq_gpu_reset_resume_helper(adev);
3120 r = amdgpu_ib_ring_tests(adev);
3121 if (r) {
3122 dev_err(adev->dev, "ib ring test failed (%d).\n", r);
cdd61df6 3123 r = amdgpu_device_ip_suspend(adev);
5740682e
ML
3124 need_full_reset = true;
3125 goto retry;
3126 }
3127 }
65781c78 3128
c33adbc7
CK
3129 if (!r)
3130 r = amdgpu_device_recover_vram(adev);
a90ad3c2 3131
5740682e
ML
3132 return r;
3133}
a90ad3c2 3134
e3ecdffa 3135/**
06ec9070 3136 * amdgpu_device_reset_sriov - reset ASIC for SR-IOV vf
5740682e
ML
3137 *
3138 * @adev: amdgpu device pointer
87e3f136 3139 * @from_hypervisor: request from hypervisor
5740682e
ML
3140 *
3141 * do VF FLR and reinitialize Asic
3f48c681 3142 * return 0 means succeeded otherwise failed
e3ecdffa
AD
3143 */
3144static int amdgpu_device_reset_sriov(struct amdgpu_device *adev,
3145 bool from_hypervisor)
5740682e
ML
3146{
3147 int r;
3148
3149 if (from_hypervisor)
3150 r = amdgpu_virt_request_full_gpu(adev, true);
3151 else
3152 r = amdgpu_virt_reset_gpu(adev);
3153 if (r)
3154 return r;
a90ad3c2
ML
3155
3156 /* Resume IP prior to SMC */
06ec9070 3157 r = amdgpu_device_ip_reinit_early_sriov(adev);
5740682e
ML
3158 if (r)
3159 goto error;
a90ad3c2
ML
3160
3161 /* we need recover gart prior to run SMC/CP/SDMA resume */
c1c7ce8f 3162 amdgpu_gtt_mgr_recover(&adev->mman.bdev.man[TTM_PL_TT]);
a90ad3c2
ML
3163
3164 /* now we are okay to resume SMC/CP/SDMA */
06ec9070 3165 r = amdgpu_device_ip_reinit_late_sriov(adev);
5740682e
ML
3166 if (r)
3167 goto error;
a90ad3c2
ML
3168
3169 amdgpu_irq_gpu_reset_resume_helper(adev);
5740682e 3170 r = amdgpu_ib_ring_tests(adev);
a90ad3c2 3171
abc34253
ED
3172error:
3173 amdgpu_virt_release_full_gpu(adev, true);
c41d1cf6
ML
3174 if (!r && adev->virt.gim_feature & AMDGIM_FEATURE_GIM_FLR_VRAMLOST) {
3175 atomic_inc(&adev->vram_lost_counter);
c33adbc7 3176 r = amdgpu_device_recover_vram(adev);
a90ad3c2
ML
3177 }
3178
3179 return r;
3180}
3181
12938fad
CK
3182/**
3183 * amdgpu_device_should_recover_gpu - check if we should try GPU recovery
3184 *
3185 * @adev: amdgpu device pointer
3186 *
3187 * Check amdgpu_gpu_recovery and SRIOV status to see if we should try to recover
3188 * a hung GPU.
3189 */
3190bool amdgpu_device_should_recover_gpu(struct amdgpu_device *adev)
3191{
3192 if (!amdgpu_device_ip_check_soft_reset(adev)) {
3193 DRM_INFO("Timeout, but no hardware hang detected.\n");
3194 return false;
3195 }
3196
3197 if (amdgpu_gpu_recovery == 0 || (amdgpu_gpu_recovery == -1 &&
3198 !amdgpu_sriov_vf(adev))) {
3199 DRM_INFO("GPU recovery disabled.\n");
3200 return false;
3201 }
3202
3203 return true;
3204}
3205
d38ceaf9 3206/**
5f152b5e 3207 * amdgpu_device_gpu_recover - reset the asic and recover scheduler
d38ceaf9
AD
3208 *
3209 * @adev: amdgpu device pointer
5740682e 3210 * @job: which job trigger hang
d38ceaf9 3211 *
5740682e 3212 * Attempt to reset the GPU if it has hung (all asics).
d38ceaf9
AD
3213 * Returns 0 for success or an error on failure.
3214 */
5f152b5e 3215int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
12938fad 3216 struct amdgpu_job *job)
d38ceaf9 3217{
5740682e 3218 int i, r, resched;
fb140b29 3219
5740682e
ML
3220 dev_info(adev->dev, "GPU reset begin!\n");
3221
13a752e3 3222 mutex_lock(&adev->lock_reset);
d94aed5a 3223 atomic_inc(&adev->gpu_reset_counter);
13a752e3 3224 adev->in_gpu_reset = 1;
d38ceaf9 3225
5c6dd71e
SL
3226 /* Block kfd */
3227 amdgpu_amdkfd_pre_reset(adev);
3228
a3c47d6b
CZ
3229 /* block TTM */
3230 resched = ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
71182665 3231
71182665 3232 /* block all schedulers and reset given job's ring */
0875dc9e
CZ
3233 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
3234 struct amdgpu_ring *ring = adev->rings[i];
3235
51687759 3236 if (!ring || !ring->sched.thread)
0875dc9e 3237 continue;
5740682e 3238
71182665
ML
3239 kthread_park(ring->sched.thread);
3240
3320b8d2 3241 if (job && job->base.sched == &ring->sched)
5740682e
ML
3242 continue;
3243
67ccea60 3244 drm_sched_hw_job_reset(&ring->sched, job ? &job->base : NULL);
5740682e 3245
2f9d4084
ML
3246 /* after all hw jobs are reset, hw fence is meaningless, so force_completion */
3247 amdgpu_fence_driver_force_completion(ring);
0875dc9e 3248 }
d38ceaf9 3249
5740682e 3250 if (amdgpu_sriov_vf(adev))
c41d1cf6 3251 r = amdgpu_device_reset_sriov(adev, job ? false : true);
5740682e 3252 else
c41d1cf6 3253 r = amdgpu_device_reset(adev);
5740682e 3254
71182665
ML
3255 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
3256 struct amdgpu_ring *ring = adev->rings[i];
53cdccd5 3257
71182665
ML
3258 if (!ring || !ring->sched.thread)
3259 continue;
5740682e 3260
71182665
ML
3261 /* only need recovery sched of the given job's ring
3262 * or all rings (in the case @job is NULL)
3263 * after above amdgpu_reset accomplished
3264 */
3320b8d2 3265 if ((!job || job->base.sched == &ring->sched) && !r)
1b1f42d8 3266 drm_sched_job_recovery(&ring->sched);
5740682e 3267
71182665 3268 kthread_unpark(ring->sched.thread);
d38ceaf9
AD
3269 }
3270
bf830604 3271 if (!amdgpu_device_has_dc_support(adev)) {
4562236b 3272 drm_helper_resume_force_mode(adev->ddev);
5740682e 3273 }
d38ceaf9
AD
3274
3275 ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched);
5740682e 3276
89041940 3277 if (r) {
d38ceaf9 3278 /* bad news, how to tell it to userspace ? */
5740682e
ML
3279 dev_info(adev->dev, "GPU reset(%d) failed\n", atomic_read(&adev->gpu_reset_counter));
3280 amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_GPU_RESET_FAIL, 0, r);
3281 } else {
3f48c681 3282 dev_info(adev->dev, "GPU reset(%d) succeeded!\n",atomic_read(&adev->gpu_reset_counter));
89041940 3283 }
d38ceaf9 3284
5c6dd71e
SL
3285 /*unlock kfd */
3286 amdgpu_amdkfd_post_reset(adev);
89041940 3287 amdgpu_vf_error_trans_all(adev);
13a752e3
ML
3288 adev->in_gpu_reset = 0;
3289 mutex_unlock(&adev->lock_reset);
d38ceaf9
AD
3290 return r;
3291}
3292
e3ecdffa
AD
3293/**
3294 * amdgpu_device_get_pcie_info - fence pcie info about the PCIE slot
3295 *
3296 * @adev: amdgpu_device pointer
3297 *
3298 * Fetchs and stores in the driver the PCIE capabilities (gen speed
3299 * and lanes) of the slot the device is in. Handles APUs and
3300 * virtualized environments where PCIE config space may not be available.
3301 */
5494d864 3302static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev)
d0dd7f0c 3303{
5d9a6330
AD
3304 struct pci_dev *pdev;
3305 enum pci_bus_speed speed_cap;
3306 enum pcie_link_width link_width;
d0dd7f0c 3307
cd474ba0
AD
3308 if (amdgpu_pcie_gen_cap)
3309 adev->pm.pcie_gen_mask = amdgpu_pcie_gen_cap;
d0dd7f0c 3310
cd474ba0
AD
3311 if (amdgpu_pcie_lane_cap)
3312 adev->pm.pcie_mlw_mask = amdgpu_pcie_lane_cap;
d0dd7f0c 3313
cd474ba0
AD
3314 /* covers APUs as well */
3315 if (pci_is_root_bus(adev->pdev->bus)) {
3316 if (adev->pm.pcie_gen_mask == 0)
3317 adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK;
3318 if (adev->pm.pcie_mlw_mask == 0)
3319 adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;
d0dd7f0c 3320 return;
cd474ba0 3321 }
d0dd7f0c 3322
cd474ba0 3323 if (adev->pm.pcie_gen_mask == 0) {
5d9a6330
AD
3324 /* asic caps */
3325 pdev = adev->pdev;
3326 speed_cap = pcie_get_speed_cap(pdev);
3327 if (speed_cap == PCI_SPEED_UNKNOWN) {
3328 adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
cd474ba0
AD
3329 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
3330 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3);
cd474ba0 3331 } else {
5d9a6330
AD
3332 if (speed_cap == PCIE_SPEED_16_0GT)
3333 adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
3334 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
3335 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3 |
3336 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN4);
3337 else if (speed_cap == PCIE_SPEED_8_0GT)
3338 adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
3339 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
3340 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3);
3341 else if (speed_cap == PCIE_SPEED_5_0GT)
3342 adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
3343 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2);
3344 else
3345 adev->pm.pcie_gen_mask |= CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1;
3346 }
3347 /* platform caps */
3348 pdev = adev->ddev->pdev->bus->self;
3349 speed_cap = pcie_get_speed_cap(pdev);
3350 if (speed_cap == PCI_SPEED_UNKNOWN) {
3351 adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |
3352 CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2);
3353 } else {
3354 if (speed_cap == PCIE_SPEED_16_0GT)
3355 adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |
3356 CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
3357 CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3 |
3358 CAIL_PCIE_LINK_SPEED_SUPPORT_GEN4);
3359 else if (speed_cap == PCIE_SPEED_8_0GT)
3360 adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |
3361 CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
3362 CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3);
3363 else if (speed_cap == PCIE_SPEED_5_0GT)
3364 adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |
3365 CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2);
3366 else
3367 adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1;
3368
cd474ba0
AD
3369 }
3370 }
3371 if (adev->pm.pcie_mlw_mask == 0) {
5d9a6330
AD
3372 pdev = adev->ddev->pdev->bus->self;
3373 link_width = pcie_get_width_cap(pdev);
3374 if (link_width == PCIE_LNK_WIDTH_UNKNOWN) {
3375 adev->pm.pcie_mlw_mask |= AMDGPU_DEFAULT_PCIE_MLW_MASK;
3376 } else {
3377 switch (link_width) {
3378 case PCIE_LNK_X32:
cd474ba0
AD
3379 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |
3380 CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
3381 CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
3382 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
3383 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
3384 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3385 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3386 break;
5d9a6330 3387 case PCIE_LNK_X16:
cd474ba0
AD
3388 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
3389 CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
3390 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
3391 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
3392 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3393 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3394 break;
5d9a6330 3395 case PCIE_LNK_X12:
cd474ba0
AD
3396 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
3397 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
3398 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
3399 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3400 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3401 break;
5d9a6330 3402 case PCIE_LNK_X8:
cd474ba0
AD
3403 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
3404 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
3405 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3406 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3407 break;
5d9a6330 3408 case PCIE_LNK_X4:
cd474ba0
AD
3409 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
3410 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3411 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3412 break;
5d9a6330 3413 case PCIE_LNK_X2:
cd474ba0
AD
3414 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
3415 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
3416 break;
5d9a6330 3417 case PCIE_LNK_X1:
cd474ba0
AD
3418 adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1;
3419 break;
3420 default:
3421 break;
3422 }
d0dd7f0c
AD
3423 }
3424 }
3425}
d38ceaf9 3426