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