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