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