]> Git Repo - linux.git/blob - drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
Merge tag 'amd-drm-next-6.11-2024-06-07' of https://gitlab.freedesktop.org/agd5f...
[linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_device.c
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/power_supply.h>
29 #include <linux/kthread.h>
30 #include <linux/module.h>
31 #include <linux/console.h>
32 #include <linux/slab.h>
33 #include <linux/iommu.h>
34 #include <linux/pci.h>
35 #include <linux/pci-p2pdma.h>
36 #include <linux/apple-gmux.h>
37
38 #include <drm/drm_aperture.h>
39 #include <drm/drm_atomic_helper.h>
40 #include <drm/drm_crtc_helper.h>
41 #include <drm/drm_fb_helper.h>
42 #include <drm/drm_probe_helper.h>
43 #include <drm/amdgpu_drm.h>
44 #include <linux/device.h>
45 #include <linux/vgaarb.h>
46 #include <linux/vga_switcheroo.h>
47 #include <linux/efi.h>
48 #include "amdgpu.h"
49 #include "amdgpu_trace.h"
50 #include "amdgpu_i2c.h"
51 #include "atom.h"
52 #include "amdgpu_atombios.h"
53 #include "amdgpu_atomfirmware.h"
54 #include "amd_pcie.h"
55 #ifdef CONFIG_DRM_AMDGPU_SI
56 #include "si.h"
57 #endif
58 #ifdef CONFIG_DRM_AMDGPU_CIK
59 #include "cik.h"
60 #endif
61 #include "vi.h"
62 #include "soc15.h"
63 #include "nv.h"
64 #include "bif/bif_4_1_d.h"
65 #include <linux/firmware.h>
66 #include "amdgpu_vf_error.h"
67
68 #include "amdgpu_amdkfd.h"
69 #include "amdgpu_pm.h"
70
71 #include "amdgpu_xgmi.h"
72 #include "amdgpu_ras.h"
73 #include "amdgpu_pmu.h"
74 #include "amdgpu_fru_eeprom.h"
75 #include "amdgpu_reset.h"
76 #include "amdgpu_virt.h"
77 #include "amdgpu_dev_coredump.h"
78
79 #include <linux/suspend.h>
80 #include <drm/task_barrier.h>
81 #include <linux/pm_runtime.h>
82
83 #include <drm/drm_drv.h>
84
85 #if IS_ENABLED(CONFIG_X86)
86 #include <asm/intel-family.h>
87 #endif
88
89 MODULE_FIRMWARE("amdgpu/vega10_gpu_info.bin");
90 MODULE_FIRMWARE("amdgpu/vega12_gpu_info.bin");
91 MODULE_FIRMWARE("amdgpu/raven_gpu_info.bin");
92 MODULE_FIRMWARE("amdgpu/picasso_gpu_info.bin");
93 MODULE_FIRMWARE("amdgpu/raven2_gpu_info.bin");
94 MODULE_FIRMWARE("amdgpu/arcturus_gpu_info.bin");
95 MODULE_FIRMWARE("amdgpu/navi12_gpu_info.bin");
96
97 #define AMDGPU_RESUME_MS                2000
98 #define AMDGPU_MAX_RETRY_LIMIT          2
99 #define AMDGPU_RETRY_SRIOV_RESET(r) ((r) == -EBUSY || (r) == -ETIMEDOUT || (r) == -EINVAL)
100 #define AMDGPU_PCIE_INDEX_FALLBACK (0x38 >> 2)
101 #define AMDGPU_PCIE_INDEX_HI_FALLBACK (0x44 >> 2)
102 #define AMDGPU_PCIE_DATA_FALLBACK (0x3C >> 2)
103
104 static const struct drm_driver amdgpu_kms_driver;
105
106 const char *amdgpu_asic_name[] = {
107         "TAHITI",
108         "PITCAIRN",
109         "VERDE",
110         "OLAND",
111         "HAINAN",
112         "BONAIRE",
113         "KAVERI",
114         "KABINI",
115         "HAWAII",
116         "MULLINS",
117         "TOPAZ",
118         "TONGA",
119         "FIJI",
120         "CARRIZO",
121         "STONEY",
122         "POLARIS10",
123         "POLARIS11",
124         "POLARIS12",
125         "VEGAM",
126         "VEGA10",
127         "VEGA12",
128         "VEGA20",
129         "RAVEN",
130         "ARCTURUS",
131         "RENOIR",
132         "ALDEBARAN",
133         "NAVI10",
134         "CYAN_SKILLFISH",
135         "NAVI14",
136         "NAVI12",
137         "SIENNA_CICHLID",
138         "NAVY_FLOUNDER",
139         "VANGOGH",
140         "DIMGREY_CAVEFISH",
141         "BEIGE_GOBY",
142         "YELLOW_CARP",
143         "IP DISCOVERY",
144         "LAST",
145 };
146
147 static inline void amdgpu_device_stop_pending_resets(struct amdgpu_device *adev);
148
149 /**
150  * DOC: pcie_replay_count
151  *
152  * The amdgpu driver provides a sysfs API for reporting the total number
153  * of PCIe replays (NAKs)
154  * The file pcie_replay_count is used for this and returns the total
155  * number of replays as a sum of the NAKs generated and NAKs received
156  */
157
158 static ssize_t amdgpu_device_get_pcie_replay_count(struct device *dev,
159                 struct device_attribute *attr, char *buf)
160 {
161         struct drm_device *ddev = dev_get_drvdata(dev);
162         struct amdgpu_device *adev = drm_to_adev(ddev);
163         uint64_t cnt = amdgpu_asic_get_pcie_replay_count(adev);
164
165         return sysfs_emit(buf, "%llu\n", cnt);
166 }
167
168 static DEVICE_ATTR(pcie_replay_count, 0444,
169                 amdgpu_device_get_pcie_replay_count, NULL);
170
171 static ssize_t amdgpu_sysfs_reg_state_get(struct file *f, struct kobject *kobj,
172                                           struct bin_attribute *attr, char *buf,
173                                           loff_t ppos, size_t count)
174 {
175         struct device *dev = kobj_to_dev(kobj);
176         struct drm_device *ddev = dev_get_drvdata(dev);
177         struct amdgpu_device *adev = drm_to_adev(ddev);
178         ssize_t bytes_read;
179
180         switch (ppos) {
181         case AMDGPU_SYS_REG_STATE_XGMI:
182                 bytes_read = amdgpu_asic_get_reg_state(
183                         adev, AMDGPU_REG_STATE_TYPE_XGMI, buf, count);
184                 break;
185         case AMDGPU_SYS_REG_STATE_WAFL:
186                 bytes_read = amdgpu_asic_get_reg_state(
187                         adev, AMDGPU_REG_STATE_TYPE_WAFL, buf, count);
188                 break;
189         case AMDGPU_SYS_REG_STATE_PCIE:
190                 bytes_read = amdgpu_asic_get_reg_state(
191                         adev, AMDGPU_REG_STATE_TYPE_PCIE, buf, count);
192                 break;
193         case AMDGPU_SYS_REG_STATE_USR:
194                 bytes_read = amdgpu_asic_get_reg_state(
195                         adev, AMDGPU_REG_STATE_TYPE_USR, buf, count);
196                 break;
197         case AMDGPU_SYS_REG_STATE_USR_1:
198                 bytes_read = amdgpu_asic_get_reg_state(
199                         adev, AMDGPU_REG_STATE_TYPE_USR_1, buf, count);
200                 break;
201         default:
202                 return -EINVAL;
203         }
204
205         return bytes_read;
206 }
207
208 BIN_ATTR(reg_state, 0444, amdgpu_sysfs_reg_state_get, NULL,
209          AMDGPU_SYS_REG_STATE_END);
210
211 int amdgpu_reg_state_sysfs_init(struct amdgpu_device *adev)
212 {
213         int ret;
214
215         if (!amdgpu_asic_get_reg_state_supported(adev))
216                 return 0;
217
218         ret = sysfs_create_bin_file(&adev->dev->kobj, &bin_attr_reg_state);
219
220         return ret;
221 }
222
223 void amdgpu_reg_state_sysfs_fini(struct amdgpu_device *adev)
224 {
225         if (!amdgpu_asic_get_reg_state_supported(adev))
226                 return;
227         sysfs_remove_bin_file(&adev->dev->kobj, &bin_attr_reg_state);
228 }
229
230 /**
231  * DOC: board_info
232  *
233  * The amdgpu driver provides a sysfs API for giving board related information.
234  * It provides the form factor information in the format
235  *
236  *   type : form factor
237  *
238  * Possible form factor values
239  *
240  * - "cem"              - PCIE CEM card
241  * - "oam"              - Open Compute Accelerator Module
242  * - "unknown"  - Not known
243  *
244  */
245
246 static ssize_t amdgpu_device_get_board_info(struct device *dev,
247                                             struct device_attribute *attr,
248                                             char *buf)
249 {
250         struct drm_device *ddev = dev_get_drvdata(dev);
251         struct amdgpu_device *adev = drm_to_adev(ddev);
252         enum amdgpu_pkg_type pkg_type = AMDGPU_PKG_TYPE_CEM;
253         const char *pkg;
254
255         if (adev->smuio.funcs && adev->smuio.funcs->get_pkg_type)
256                 pkg_type = adev->smuio.funcs->get_pkg_type(adev);
257
258         switch (pkg_type) {
259         case AMDGPU_PKG_TYPE_CEM:
260                 pkg = "cem";
261                 break;
262         case AMDGPU_PKG_TYPE_OAM:
263                 pkg = "oam";
264                 break;
265         default:
266                 pkg = "unknown";
267                 break;
268         }
269
270         return sysfs_emit(buf, "%s : %s\n", "type", pkg);
271 }
272
273 static DEVICE_ATTR(board_info, 0444, amdgpu_device_get_board_info, NULL);
274
275 static struct attribute *amdgpu_board_attrs[] = {
276         &dev_attr_board_info.attr,
277         NULL,
278 };
279
280 static umode_t amdgpu_board_attrs_is_visible(struct kobject *kobj,
281                                              struct attribute *attr, int n)
282 {
283         struct device *dev = kobj_to_dev(kobj);
284         struct drm_device *ddev = dev_get_drvdata(dev);
285         struct amdgpu_device *adev = drm_to_adev(ddev);
286
287         if (adev->flags & AMD_IS_APU)
288                 return 0;
289
290         return attr->mode;
291 }
292
293 static const struct attribute_group amdgpu_board_attrs_group = {
294         .attrs = amdgpu_board_attrs,
295         .is_visible = amdgpu_board_attrs_is_visible
296 };
297
298 static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev);
299
300
301 /**
302  * amdgpu_device_supports_px - Is the device a dGPU with ATPX power control
303  *
304  * @dev: drm_device pointer
305  *
306  * Returns true if the device is a dGPU with ATPX power control,
307  * otherwise return false.
308  */
309 bool amdgpu_device_supports_px(struct drm_device *dev)
310 {
311         struct amdgpu_device *adev = drm_to_adev(dev);
312
313         if ((adev->flags & AMD_IS_PX) && !amdgpu_is_atpx_hybrid())
314                 return true;
315         return false;
316 }
317
318 /**
319  * amdgpu_device_supports_boco - Is the device a dGPU with ACPI power resources
320  *
321  * @dev: drm_device pointer
322  *
323  * Returns true if the device is a dGPU with ACPI power control,
324  * otherwise return false.
325  */
326 bool amdgpu_device_supports_boco(struct drm_device *dev)
327 {
328         struct amdgpu_device *adev = drm_to_adev(dev);
329
330         if (adev->has_pr3 ||
331             ((adev->flags & AMD_IS_PX) && amdgpu_is_atpx_hybrid()))
332                 return true;
333         return false;
334 }
335
336 /**
337  * amdgpu_device_supports_baco - Does the device support BACO
338  *
339  * @dev: drm_device pointer
340  *
341  * Return:
342  * 1 if the device supporte BACO;
343  * 3 if the device support MACO (only works if BACO is supported)
344  * otherwise return 0.
345  */
346 int amdgpu_device_supports_baco(struct drm_device *dev)
347 {
348         struct amdgpu_device *adev = drm_to_adev(dev);
349
350         return amdgpu_asic_supports_baco(adev);
351 }
352
353 void amdgpu_device_detect_runtime_pm_mode(struct amdgpu_device *adev)
354 {
355         struct drm_device *dev;
356         int bamaco_support;
357
358         dev = adev_to_drm(adev);
359
360         adev->pm.rpm_mode = AMDGPU_RUNPM_NONE;
361         bamaco_support = amdgpu_device_supports_baco(dev);
362
363         switch (amdgpu_runtime_pm) {
364         case 2:
365                 if (bamaco_support & MACO_SUPPORT) {
366                         adev->pm.rpm_mode = AMDGPU_RUNPM_BAMACO;
367                         dev_info(adev->dev, "Forcing BAMACO for runtime pm\n");
368                 } else if (bamaco_support == BACO_SUPPORT) {
369                         adev->pm.rpm_mode = AMDGPU_RUNPM_BACO;
370                         dev_info(adev->dev, "Requested mode BAMACO not available,fallback to use BACO\n");
371                 }
372                 break;
373         case 1:
374                 if (bamaco_support & BACO_SUPPORT) {
375                         adev->pm.rpm_mode = AMDGPU_RUNPM_BACO;
376                         dev_info(adev->dev, "Forcing BACO for runtime pm\n");
377                 }
378                 break;
379         case -1:
380         case -2:
381                 if (amdgpu_device_supports_px(dev)) { /* enable PX as runtime mode */
382                         adev->pm.rpm_mode = AMDGPU_RUNPM_PX;
383                         dev_info(adev->dev, "Using ATPX for runtime pm\n");
384                 } else if (amdgpu_device_supports_boco(dev)) { /* enable boco as runtime mode */
385                         adev->pm.rpm_mode = AMDGPU_RUNPM_BOCO;
386                         dev_info(adev->dev, "Using BOCO for runtime pm\n");
387                 } else {
388                         if (!bamaco_support)
389                                 goto no_runtime_pm;
390
391                         switch (adev->asic_type) {
392                         case CHIP_VEGA20:
393                         case CHIP_ARCTURUS:
394                                 /* BACO are not supported on vega20 and arctrus */
395                                 break;
396                         case CHIP_VEGA10:
397                                 /* enable BACO as runpm mode if noretry=0 */
398                                 if (!adev->gmc.noretry)
399                                         adev->pm.rpm_mode = AMDGPU_RUNPM_BACO;
400                                 break;
401                         default:
402                                 /* enable BACO as runpm mode on CI+ */
403                                 adev->pm.rpm_mode = AMDGPU_RUNPM_BACO;
404                                 break;
405                         }
406
407                         if (adev->pm.rpm_mode == AMDGPU_RUNPM_BACO) {
408                                 if (bamaco_support & MACO_SUPPORT) {
409                                         adev->pm.rpm_mode = AMDGPU_RUNPM_BAMACO;
410                                         dev_info(adev->dev, "Using BAMACO for runtime pm\n");
411                                 } else {
412                                         dev_info(adev->dev, "Using BACO for runtime pm\n");
413                                 }
414                         }
415                 }
416                 break;
417         case 0:
418                 dev_info(adev->dev, "runtime pm is manually disabled\n");
419                 break;
420         default:
421                 break;
422         }
423
424 no_runtime_pm:
425         if (adev->pm.rpm_mode == AMDGPU_RUNPM_NONE)
426                 dev_info(adev->dev, "Runtime PM not available\n");
427 }
428 /**
429  * amdgpu_device_supports_smart_shift - Is the device dGPU with
430  * smart shift support
431  *
432  * @dev: drm_device pointer
433  *
434  * Returns true if the device is a dGPU with Smart Shift support,
435  * otherwise returns false.
436  */
437 bool amdgpu_device_supports_smart_shift(struct drm_device *dev)
438 {
439         return (amdgpu_device_supports_boco(dev) &&
440                 amdgpu_acpi_is_power_shift_control_supported());
441 }
442
443 /*
444  * VRAM access helper functions
445  */
446
447 /**
448  * amdgpu_device_mm_access - access vram by MM_INDEX/MM_DATA
449  *
450  * @adev: amdgpu_device pointer
451  * @pos: offset of the buffer in vram
452  * @buf: virtual address of the buffer in system memory
453  * @size: read/write size, sizeof(@buf) must > @size
454  * @write: true - write to vram, otherwise - read from vram
455  */
456 void amdgpu_device_mm_access(struct amdgpu_device *adev, loff_t pos,
457                              void *buf, size_t size, bool write)
458 {
459         unsigned long flags;
460         uint32_t hi = ~0, tmp = 0;
461         uint32_t *data = buf;
462         uint64_t last;
463         int idx;
464
465         if (!drm_dev_enter(adev_to_drm(adev), &idx))
466                 return;
467
468         BUG_ON(!IS_ALIGNED(pos, 4) || !IS_ALIGNED(size, 4));
469
470         spin_lock_irqsave(&adev->mmio_idx_lock, flags);
471         for (last = pos + size; pos < last; pos += 4) {
472                 tmp = pos >> 31;
473
474                 WREG32_NO_KIQ(mmMM_INDEX, ((uint32_t)pos) | 0x80000000);
475                 if (tmp != hi) {
476                         WREG32_NO_KIQ(mmMM_INDEX_HI, tmp);
477                         hi = tmp;
478                 }
479                 if (write)
480                         WREG32_NO_KIQ(mmMM_DATA, *data++);
481                 else
482                         *data++ = RREG32_NO_KIQ(mmMM_DATA);
483         }
484
485         spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
486         drm_dev_exit(idx);
487 }
488
489 /**
490  * amdgpu_device_aper_access - access vram by vram aperature
491  *
492  * @adev: amdgpu_device pointer
493  * @pos: offset of the buffer in vram
494  * @buf: virtual address of the buffer in system memory
495  * @size: read/write size, sizeof(@buf) must > @size
496  * @write: true - write to vram, otherwise - read from vram
497  *
498  * The return value means how many bytes have been transferred.
499  */
500 size_t amdgpu_device_aper_access(struct amdgpu_device *adev, loff_t pos,
501                                  void *buf, size_t size, bool write)
502 {
503 #ifdef CONFIG_64BIT
504         void __iomem *addr;
505         size_t count = 0;
506         uint64_t last;
507
508         if (!adev->mman.aper_base_kaddr)
509                 return 0;
510
511         last = min(pos + size, adev->gmc.visible_vram_size);
512         if (last > pos) {
513                 addr = adev->mman.aper_base_kaddr + pos;
514                 count = last - pos;
515
516                 if (write) {
517                         memcpy_toio(addr, buf, count);
518                         /* Make sure HDP write cache flush happens without any reordering
519                          * after the system memory contents are sent over PCIe device
520                          */
521                         mb();
522                         amdgpu_device_flush_hdp(adev, NULL);
523                 } else {
524                         amdgpu_device_invalidate_hdp(adev, NULL);
525                         /* Make sure HDP read cache is invalidated before issuing a read
526                          * to the PCIe device
527                          */
528                         mb();
529                         memcpy_fromio(buf, addr, count);
530                 }
531
532         }
533
534         return count;
535 #else
536         return 0;
537 #endif
538 }
539
540 /**
541  * amdgpu_device_vram_access - read/write a buffer in vram
542  *
543  * @adev: amdgpu_device pointer
544  * @pos: offset of the buffer in vram
545  * @buf: virtual address of the buffer in system memory
546  * @size: read/write size, sizeof(@buf) must > @size
547  * @write: true - write to vram, otherwise - read from vram
548  */
549 void amdgpu_device_vram_access(struct amdgpu_device *adev, loff_t pos,
550                                void *buf, size_t size, bool write)
551 {
552         size_t count;
553
554         /* try to using vram apreature to access vram first */
555         count = amdgpu_device_aper_access(adev, pos, buf, size, write);
556         size -= count;
557         if (size) {
558                 /* using MM to access rest vram */
559                 pos += count;
560                 buf += count;
561                 amdgpu_device_mm_access(adev, pos, buf, size, write);
562         }
563 }
564
565 /*
566  * register access helper functions.
567  */
568
569 /* Check if hw access should be skipped because of hotplug or device error */
570 bool amdgpu_device_skip_hw_access(struct amdgpu_device *adev)
571 {
572         if (adev->no_hw_access)
573                 return true;
574
575 #ifdef CONFIG_LOCKDEP
576         /*
577          * This is a bit complicated to understand, so worth a comment. What we assert
578          * here is that the GPU reset is not running on another thread in parallel.
579          *
580          * For this we trylock the read side of the reset semaphore, if that succeeds
581          * we know that the reset is not running in paralell.
582          *
583          * If the trylock fails we assert that we are either already holding the read
584          * side of the lock or are the reset thread itself and hold the write side of
585          * the lock.
586          */
587         if (in_task()) {
588                 if (down_read_trylock(&adev->reset_domain->sem))
589                         up_read(&adev->reset_domain->sem);
590                 else
591                         lockdep_assert_held(&adev->reset_domain->sem);
592         }
593 #endif
594         return false;
595 }
596
597 /**
598  * amdgpu_device_rreg - read a memory mapped IO or indirect register
599  *
600  * @adev: amdgpu_device pointer
601  * @reg: dword aligned register offset
602  * @acc_flags: access flags which require special behavior
603  *
604  * Returns the 32 bit value from the offset specified.
605  */
606 uint32_t amdgpu_device_rreg(struct amdgpu_device *adev,
607                             uint32_t reg, uint32_t acc_flags)
608 {
609         uint32_t ret;
610
611         if (amdgpu_device_skip_hw_access(adev))
612                 return 0;
613
614         if ((reg * 4) < adev->rmmio_size) {
615                 if (!(acc_flags & AMDGPU_REGS_NO_KIQ) &&
616                     amdgpu_sriov_runtime(adev) &&
617                     down_read_trylock(&adev->reset_domain->sem)) {
618                         ret = amdgpu_kiq_rreg(adev, reg, 0);
619                         up_read(&adev->reset_domain->sem);
620                 } else {
621                         ret = readl(((void __iomem *)adev->rmmio) + (reg * 4));
622                 }
623         } else {
624                 ret = adev->pcie_rreg(adev, reg * 4);
625         }
626
627         trace_amdgpu_device_rreg(adev->pdev->device, reg, ret);
628
629         return ret;
630 }
631
632 /*
633  * MMIO register read with bytes helper functions
634  * @offset:bytes offset from MMIO start
635  */
636
637 /**
638  * amdgpu_mm_rreg8 - read a memory mapped IO register
639  *
640  * @adev: amdgpu_device pointer
641  * @offset: byte aligned register offset
642  *
643  * Returns the 8 bit value from the offset specified.
644  */
645 uint8_t amdgpu_mm_rreg8(struct amdgpu_device *adev, uint32_t offset)
646 {
647         if (amdgpu_device_skip_hw_access(adev))
648                 return 0;
649
650         if (offset < adev->rmmio_size)
651                 return (readb(adev->rmmio + offset));
652         BUG();
653 }
654
655
656 /**
657  * amdgpu_device_xcc_rreg - read a memory mapped IO or indirect register with specific XCC
658  *
659  * @adev: amdgpu_device pointer
660  * @reg: dword aligned register offset
661  * @acc_flags: access flags which require special behavior
662  * @xcc_id: xcc accelerated compute core id
663  *
664  * Returns the 32 bit value from the offset specified.
665  */
666 uint32_t amdgpu_device_xcc_rreg(struct amdgpu_device *adev,
667                                 uint32_t reg, uint32_t acc_flags,
668                                 uint32_t xcc_id)
669 {
670         uint32_t ret, rlcg_flag;
671
672         if (amdgpu_device_skip_hw_access(adev))
673                 return 0;
674
675         if ((reg * 4) < adev->rmmio_size) {
676                 if (amdgpu_sriov_vf(adev) &&
677                     !amdgpu_sriov_runtime(adev) &&
678                     adev->gfx.rlc.rlcg_reg_access_supported &&
679                     amdgpu_virt_get_rlcg_reg_access_flag(adev, acc_flags,
680                                                          GC_HWIP, false,
681                                                          &rlcg_flag)) {
682                         ret = amdgpu_virt_rlcg_reg_rw(adev, reg, 0, rlcg_flag, GET_INST(GC, xcc_id));
683                 } else if (!(acc_flags & AMDGPU_REGS_NO_KIQ) &&
684                     amdgpu_sriov_runtime(adev) &&
685                     down_read_trylock(&adev->reset_domain->sem)) {
686                         ret = amdgpu_kiq_rreg(adev, reg, xcc_id);
687                         up_read(&adev->reset_domain->sem);
688                 } else {
689                         ret = readl(((void __iomem *)adev->rmmio) + (reg * 4));
690                 }
691         } else {
692                 ret = adev->pcie_rreg(adev, reg * 4);
693         }
694
695         return ret;
696 }
697
698 /*
699  * MMIO register write with bytes helper functions
700  * @offset:bytes offset from MMIO start
701  * @value: the value want to be written to the register
702  */
703
704 /**
705  * amdgpu_mm_wreg8 - read a memory mapped IO register
706  *
707  * @adev: amdgpu_device pointer
708  * @offset: byte aligned register offset
709  * @value: 8 bit value to write
710  *
711  * Writes the value specified to the offset specified.
712  */
713 void amdgpu_mm_wreg8(struct amdgpu_device *adev, uint32_t offset, uint8_t value)
714 {
715         if (amdgpu_device_skip_hw_access(adev))
716                 return;
717
718         if (offset < adev->rmmio_size)
719                 writeb(value, adev->rmmio + offset);
720         else
721                 BUG();
722 }
723
724 /**
725  * amdgpu_device_wreg - write to a memory mapped IO or indirect register
726  *
727  * @adev: amdgpu_device pointer
728  * @reg: dword aligned register offset
729  * @v: 32 bit value to write to the register
730  * @acc_flags: access flags which require special behavior
731  *
732  * Writes the value specified to the offset specified.
733  */
734 void amdgpu_device_wreg(struct amdgpu_device *adev,
735                         uint32_t reg, uint32_t v,
736                         uint32_t acc_flags)
737 {
738         if (amdgpu_device_skip_hw_access(adev))
739                 return;
740
741         if ((reg * 4) < adev->rmmio_size) {
742                 if (!(acc_flags & AMDGPU_REGS_NO_KIQ) &&
743                     amdgpu_sriov_runtime(adev) &&
744                     down_read_trylock(&adev->reset_domain->sem)) {
745                         amdgpu_kiq_wreg(adev, reg, v, 0);
746                         up_read(&adev->reset_domain->sem);
747                 } else {
748                         writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
749                 }
750         } else {
751                 adev->pcie_wreg(adev, reg * 4, v);
752         }
753
754         trace_amdgpu_device_wreg(adev->pdev->device, reg, v);
755 }
756
757 /**
758  * amdgpu_mm_wreg_mmio_rlc -  write register either with direct/indirect mmio or with RLC path if in range
759  *
760  * @adev: amdgpu_device pointer
761  * @reg: mmio/rlc register
762  * @v: value to write
763  * @xcc_id: xcc accelerated compute core id
764  *
765  * this function is invoked only for the debugfs register access
766  */
767 void amdgpu_mm_wreg_mmio_rlc(struct amdgpu_device *adev,
768                              uint32_t reg, uint32_t v,
769                              uint32_t xcc_id)
770 {
771         if (amdgpu_device_skip_hw_access(adev))
772                 return;
773
774         if (amdgpu_sriov_fullaccess(adev) &&
775             adev->gfx.rlc.funcs &&
776             adev->gfx.rlc.funcs->is_rlcg_access_range) {
777                 if (adev->gfx.rlc.funcs->is_rlcg_access_range(adev, reg))
778                         return amdgpu_sriov_wreg(adev, reg, v, 0, 0, xcc_id);
779         } else if ((reg * 4) >= adev->rmmio_size) {
780                 adev->pcie_wreg(adev, reg * 4, v);
781         } else {
782                 writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
783         }
784 }
785
786 /**
787  * amdgpu_device_xcc_wreg - write to a memory mapped IO or indirect register with specific XCC
788  *
789  * @adev: amdgpu_device pointer
790  * @reg: dword aligned register offset
791  * @v: 32 bit value to write to the register
792  * @acc_flags: access flags which require special behavior
793  * @xcc_id: xcc accelerated compute core id
794  *
795  * Writes the value specified to the offset specified.
796  */
797 void amdgpu_device_xcc_wreg(struct amdgpu_device *adev,
798                         uint32_t reg, uint32_t v,
799                         uint32_t acc_flags, uint32_t xcc_id)
800 {
801         uint32_t rlcg_flag;
802
803         if (amdgpu_device_skip_hw_access(adev))
804                 return;
805
806         if ((reg * 4) < adev->rmmio_size) {
807                 if (amdgpu_sriov_vf(adev) &&
808                     !amdgpu_sriov_runtime(adev) &&
809                     adev->gfx.rlc.rlcg_reg_access_supported &&
810                     amdgpu_virt_get_rlcg_reg_access_flag(adev, acc_flags,
811                                                          GC_HWIP, true,
812                                                          &rlcg_flag)) {
813                         amdgpu_virt_rlcg_reg_rw(adev, reg, v, rlcg_flag, GET_INST(GC, xcc_id));
814                 } else if (!(acc_flags & AMDGPU_REGS_NO_KIQ) &&
815                     amdgpu_sriov_runtime(adev) &&
816                     down_read_trylock(&adev->reset_domain->sem)) {
817                         amdgpu_kiq_wreg(adev, reg, v, xcc_id);
818                         up_read(&adev->reset_domain->sem);
819                 } else {
820                         writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
821                 }
822         } else {
823                 adev->pcie_wreg(adev, reg * 4, v);
824         }
825 }
826
827 /**
828  * amdgpu_device_indirect_rreg - read an indirect register
829  *
830  * @adev: amdgpu_device pointer
831  * @reg_addr: indirect register address to read from
832  *
833  * Returns the value of indirect register @reg_addr
834  */
835 u32 amdgpu_device_indirect_rreg(struct amdgpu_device *adev,
836                                 u32 reg_addr)
837 {
838         unsigned long flags, pcie_index, pcie_data;
839         void __iomem *pcie_index_offset;
840         void __iomem *pcie_data_offset;
841         u32 r;
842
843         pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
844         pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
845
846         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
847         pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
848         pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
849
850         writel(reg_addr, pcie_index_offset);
851         readl(pcie_index_offset);
852         r = readl(pcie_data_offset);
853         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
854
855         return r;
856 }
857
858 u32 amdgpu_device_indirect_rreg_ext(struct amdgpu_device *adev,
859                                     u64 reg_addr)
860 {
861         unsigned long flags, pcie_index, pcie_index_hi, pcie_data;
862         u32 r;
863         void __iomem *pcie_index_offset;
864         void __iomem *pcie_index_hi_offset;
865         void __iomem *pcie_data_offset;
866
867         if (unlikely(!adev->nbio.funcs)) {
868                 pcie_index = AMDGPU_PCIE_INDEX_FALLBACK;
869                 pcie_data = AMDGPU_PCIE_DATA_FALLBACK;
870         } else {
871                 pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
872                 pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
873         }
874
875         if (reg_addr >> 32) {
876                 if (unlikely(!adev->nbio.funcs))
877                         pcie_index_hi = AMDGPU_PCIE_INDEX_HI_FALLBACK;
878                 else
879                         pcie_index_hi = adev->nbio.funcs->get_pcie_index_hi_offset(adev);
880         } else {
881                 pcie_index_hi = 0;
882         }
883
884         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
885         pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
886         pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
887         if (pcie_index_hi != 0)
888                 pcie_index_hi_offset = (void __iomem *)adev->rmmio +
889                                 pcie_index_hi * 4;
890
891         writel(reg_addr, pcie_index_offset);
892         readl(pcie_index_offset);
893         if (pcie_index_hi != 0) {
894                 writel((reg_addr >> 32) & 0xff, pcie_index_hi_offset);
895                 readl(pcie_index_hi_offset);
896         }
897         r = readl(pcie_data_offset);
898
899         /* clear the high bits */
900         if (pcie_index_hi != 0) {
901                 writel(0, pcie_index_hi_offset);
902                 readl(pcie_index_hi_offset);
903         }
904
905         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
906
907         return r;
908 }
909
910 /**
911  * amdgpu_device_indirect_rreg64 - read a 64bits indirect register
912  *
913  * @adev: amdgpu_device pointer
914  * @reg_addr: indirect register address to read from
915  *
916  * Returns the value of indirect register @reg_addr
917  */
918 u64 amdgpu_device_indirect_rreg64(struct amdgpu_device *adev,
919                                   u32 reg_addr)
920 {
921         unsigned long flags, pcie_index, pcie_data;
922         void __iomem *pcie_index_offset;
923         void __iomem *pcie_data_offset;
924         u64 r;
925
926         pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
927         pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
928
929         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
930         pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
931         pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
932
933         /* read low 32 bits */
934         writel(reg_addr, pcie_index_offset);
935         readl(pcie_index_offset);
936         r = readl(pcie_data_offset);
937         /* read high 32 bits */
938         writel(reg_addr + 4, pcie_index_offset);
939         readl(pcie_index_offset);
940         r |= ((u64)readl(pcie_data_offset) << 32);
941         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
942
943         return r;
944 }
945
946 u64 amdgpu_device_indirect_rreg64_ext(struct amdgpu_device *adev,
947                                   u64 reg_addr)
948 {
949         unsigned long flags, pcie_index, pcie_data;
950         unsigned long pcie_index_hi = 0;
951         void __iomem *pcie_index_offset;
952         void __iomem *pcie_index_hi_offset;
953         void __iomem *pcie_data_offset;
954         u64 r;
955
956         pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
957         pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
958         if ((reg_addr >> 32) && (adev->nbio.funcs->get_pcie_index_hi_offset))
959                 pcie_index_hi = adev->nbio.funcs->get_pcie_index_hi_offset(adev);
960
961         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
962         pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
963         pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
964         if (pcie_index_hi != 0)
965                 pcie_index_hi_offset = (void __iomem *)adev->rmmio +
966                         pcie_index_hi * 4;
967
968         /* read low 32 bits */
969         writel(reg_addr, pcie_index_offset);
970         readl(pcie_index_offset);
971         if (pcie_index_hi != 0) {
972                 writel((reg_addr >> 32) & 0xff, pcie_index_hi_offset);
973                 readl(pcie_index_hi_offset);
974         }
975         r = readl(pcie_data_offset);
976         /* read high 32 bits */
977         writel(reg_addr + 4, pcie_index_offset);
978         readl(pcie_index_offset);
979         if (pcie_index_hi != 0) {
980                 writel((reg_addr >> 32) & 0xff, pcie_index_hi_offset);
981                 readl(pcie_index_hi_offset);
982         }
983         r |= ((u64)readl(pcie_data_offset) << 32);
984
985         /* clear the high bits */
986         if (pcie_index_hi != 0) {
987                 writel(0, pcie_index_hi_offset);
988                 readl(pcie_index_hi_offset);
989         }
990
991         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
992
993         return r;
994 }
995
996 /**
997  * amdgpu_device_indirect_wreg - write an indirect register address
998  *
999  * @adev: amdgpu_device pointer
1000  * @reg_addr: indirect register offset
1001  * @reg_data: indirect register data
1002  *
1003  */
1004 void amdgpu_device_indirect_wreg(struct amdgpu_device *adev,
1005                                  u32 reg_addr, u32 reg_data)
1006 {
1007         unsigned long flags, pcie_index, pcie_data;
1008         void __iomem *pcie_index_offset;
1009         void __iomem *pcie_data_offset;
1010
1011         pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
1012         pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
1013
1014         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1015         pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
1016         pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
1017
1018         writel(reg_addr, pcie_index_offset);
1019         readl(pcie_index_offset);
1020         writel(reg_data, pcie_data_offset);
1021         readl(pcie_data_offset);
1022         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1023 }
1024
1025 void amdgpu_device_indirect_wreg_ext(struct amdgpu_device *adev,
1026                                      u64 reg_addr, u32 reg_data)
1027 {
1028         unsigned long flags, pcie_index, pcie_index_hi, pcie_data;
1029         void __iomem *pcie_index_offset;
1030         void __iomem *pcie_index_hi_offset;
1031         void __iomem *pcie_data_offset;
1032
1033         pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
1034         pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
1035         if ((reg_addr >> 32) && (adev->nbio.funcs->get_pcie_index_hi_offset))
1036                 pcie_index_hi = adev->nbio.funcs->get_pcie_index_hi_offset(adev);
1037         else
1038                 pcie_index_hi = 0;
1039
1040         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1041         pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
1042         pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
1043         if (pcie_index_hi != 0)
1044                 pcie_index_hi_offset = (void __iomem *)adev->rmmio +
1045                                 pcie_index_hi * 4;
1046
1047         writel(reg_addr, pcie_index_offset);
1048         readl(pcie_index_offset);
1049         if (pcie_index_hi != 0) {
1050                 writel((reg_addr >> 32) & 0xff, pcie_index_hi_offset);
1051                 readl(pcie_index_hi_offset);
1052         }
1053         writel(reg_data, pcie_data_offset);
1054         readl(pcie_data_offset);
1055
1056         /* clear the high bits */
1057         if (pcie_index_hi != 0) {
1058                 writel(0, pcie_index_hi_offset);
1059                 readl(pcie_index_hi_offset);
1060         }
1061
1062         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1063 }
1064
1065 /**
1066  * amdgpu_device_indirect_wreg64 - write a 64bits indirect register address
1067  *
1068  * @adev: amdgpu_device pointer
1069  * @reg_addr: indirect register offset
1070  * @reg_data: indirect register data
1071  *
1072  */
1073 void amdgpu_device_indirect_wreg64(struct amdgpu_device *adev,
1074                                    u32 reg_addr, u64 reg_data)
1075 {
1076         unsigned long flags, pcie_index, pcie_data;
1077         void __iomem *pcie_index_offset;
1078         void __iomem *pcie_data_offset;
1079
1080         pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
1081         pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
1082
1083         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1084         pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
1085         pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
1086
1087         /* write low 32 bits */
1088         writel(reg_addr, pcie_index_offset);
1089         readl(pcie_index_offset);
1090         writel((u32)(reg_data & 0xffffffffULL), pcie_data_offset);
1091         readl(pcie_data_offset);
1092         /* write high 32 bits */
1093         writel(reg_addr + 4, pcie_index_offset);
1094         readl(pcie_index_offset);
1095         writel((u32)(reg_data >> 32), pcie_data_offset);
1096         readl(pcie_data_offset);
1097         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1098 }
1099
1100 void amdgpu_device_indirect_wreg64_ext(struct amdgpu_device *adev,
1101                                    u64 reg_addr, u64 reg_data)
1102 {
1103         unsigned long flags, pcie_index, pcie_data;
1104         unsigned long pcie_index_hi = 0;
1105         void __iomem *pcie_index_offset;
1106         void __iomem *pcie_index_hi_offset;
1107         void __iomem *pcie_data_offset;
1108
1109         pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
1110         pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
1111         if ((reg_addr >> 32) && (adev->nbio.funcs->get_pcie_index_hi_offset))
1112                 pcie_index_hi = adev->nbio.funcs->get_pcie_index_hi_offset(adev);
1113
1114         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1115         pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
1116         pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
1117         if (pcie_index_hi != 0)
1118                 pcie_index_hi_offset = (void __iomem *)adev->rmmio +
1119                                 pcie_index_hi * 4;
1120
1121         /* write low 32 bits */
1122         writel(reg_addr, pcie_index_offset);
1123         readl(pcie_index_offset);
1124         if (pcie_index_hi != 0) {
1125                 writel((reg_addr >> 32) & 0xff, pcie_index_hi_offset);
1126                 readl(pcie_index_hi_offset);
1127         }
1128         writel((u32)(reg_data & 0xffffffffULL), pcie_data_offset);
1129         readl(pcie_data_offset);
1130         /* write high 32 bits */
1131         writel(reg_addr + 4, pcie_index_offset);
1132         readl(pcie_index_offset);
1133         if (pcie_index_hi != 0) {
1134                 writel((reg_addr >> 32) & 0xff, pcie_index_hi_offset);
1135                 readl(pcie_index_hi_offset);
1136         }
1137         writel((u32)(reg_data >> 32), pcie_data_offset);
1138         readl(pcie_data_offset);
1139
1140         /* clear the high bits */
1141         if (pcie_index_hi != 0) {
1142                 writel(0, pcie_index_hi_offset);
1143                 readl(pcie_index_hi_offset);
1144         }
1145
1146         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1147 }
1148
1149 /**
1150  * amdgpu_device_get_rev_id - query device rev_id
1151  *
1152  * @adev: amdgpu_device pointer
1153  *
1154  * Return device rev_id
1155  */
1156 u32 amdgpu_device_get_rev_id(struct amdgpu_device *adev)
1157 {
1158         return adev->nbio.funcs->get_rev_id(adev);
1159 }
1160
1161 /**
1162  * amdgpu_invalid_rreg - dummy reg read function
1163  *
1164  * @adev: amdgpu_device pointer
1165  * @reg: offset of register
1166  *
1167  * Dummy register read function.  Used for register blocks
1168  * that certain asics don't have (all asics).
1169  * Returns the value in the register.
1170  */
1171 static uint32_t amdgpu_invalid_rreg(struct amdgpu_device *adev, uint32_t reg)
1172 {
1173         DRM_ERROR("Invalid callback to read register 0x%04X\n", reg);
1174         BUG();
1175         return 0;
1176 }
1177
1178 static uint32_t amdgpu_invalid_rreg_ext(struct amdgpu_device *adev, uint64_t reg)
1179 {
1180         DRM_ERROR("Invalid callback to read register 0x%llX\n", reg);
1181         BUG();
1182         return 0;
1183 }
1184
1185 /**
1186  * amdgpu_invalid_wreg - dummy reg write function
1187  *
1188  * @adev: amdgpu_device pointer
1189  * @reg: offset of register
1190  * @v: value to write to the register
1191  *
1192  * Dummy register read function.  Used for register blocks
1193  * that certain asics don't have (all asics).
1194  */
1195 static void amdgpu_invalid_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v)
1196 {
1197         DRM_ERROR("Invalid callback to write register 0x%04X with 0x%08X\n",
1198                   reg, v);
1199         BUG();
1200 }
1201
1202 static void amdgpu_invalid_wreg_ext(struct amdgpu_device *adev, uint64_t reg, uint32_t v)
1203 {
1204         DRM_ERROR("Invalid callback to write register 0x%llX with 0x%08X\n",
1205                   reg, v);
1206         BUG();
1207 }
1208
1209 /**
1210  * amdgpu_invalid_rreg64 - dummy 64 bit reg read function
1211  *
1212  * @adev: amdgpu_device pointer
1213  * @reg: offset of register
1214  *
1215  * Dummy register read function.  Used for register blocks
1216  * that certain asics don't have (all asics).
1217  * Returns the value in the register.
1218  */
1219 static uint64_t amdgpu_invalid_rreg64(struct amdgpu_device *adev, uint32_t reg)
1220 {
1221         DRM_ERROR("Invalid callback to read 64 bit register 0x%04X\n", reg);
1222         BUG();
1223         return 0;
1224 }
1225
1226 static uint64_t amdgpu_invalid_rreg64_ext(struct amdgpu_device *adev, uint64_t reg)
1227 {
1228         DRM_ERROR("Invalid callback to read register 0x%llX\n", reg);
1229         BUG();
1230         return 0;
1231 }
1232
1233 /**
1234  * amdgpu_invalid_wreg64 - dummy reg write function
1235  *
1236  * @adev: amdgpu_device pointer
1237  * @reg: offset of register
1238  * @v: value to write to the register
1239  *
1240  * Dummy register read function.  Used for register blocks
1241  * that certain asics don't have (all asics).
1242  */
1243 static void amdgpu_invalid_wreg64(struct amdgpu_device *adev, uint32_t reg, uint64_t v)
1244 {
1245         DRM_ERROR("Invalid callback to write 64 bit register 0x%04X with 0x%08llX\n",
1246                   reg, v);
1247         BUG();
1248 }
1249
1250 static void amdgpu_invalid_wreg64_ext(struct amdgpu_device *adev, uint64_t reg, uint64_t v)
1251 {
1252         DRM_ERROR("Invalid callback to write 64 bit register 0x%llX with 0x%08llX\n",
1253                   reg, v);
1254         BUG();
1255 }
1256
1257 /**
1258  * amdgpu_block_invalid_rreg - dummy reg read function
1259  *
1260  * @adev: amdgpu_device pointer
1261  * @block: offset of instance
1262  * @reg: offset of register
1263  *
1264  * Dummy register read function.  Used for register blocks
1265  * that certain asics don't have (all asics).
1266  * Returns the value in the register.
1267  */
1268 static uint32_t amdgpu_block_invalid_rreg(struct amdgpu_device *adev,
1269                                           uint32_t block, uint32_t reg)
1270 {
1271         DRM_ERROR("Invalid callback to read register 0x%04X in block 0x%04X\n",
1272                   reg, block);
1273         BUG();
1274         return 0;
1275 }
1276
1277 /**
1278  * amdgpu_block_invalid_wreg - dummy reg write function
1279  *
1280  * @adev: amdgpu_device pointer
1281  * @block: offset of instance
1282  * @reg: offset of register
1283  * @v: value to write to the register
1284  *
1285  * Dummy register read function.  Used for register blocks
1286  * that certain asics don't have (all asics).
1287  */
1288 static void amdgpu_block_invalid_wreg(struct amdgpu_device *adev,
1289                                       uint32_t block,
1290                                       uint32_t reg, uint32_t v)
1291 {
1292         DRM_ERROR("Invalid block callback to write register 0x%04X in block 0x%04X with 0x%08X\n",
1293                   reg, block, v);
1294         BUG();
1295 }
1296
1297 /**
1298  * amdgpu_device_asic_init - Wrapper for atom asic_init
1299  *
1300  * @adev: amdgpu_device pointer
1301  *
1302  * Does any asic specific work and then calls atom asic init.
1303  */
1304 static int amdgpu_device_asic_init(struct amdgpu_device *adev)
1305 {
1306         int ret;
1307
1308         amdgpu_asic_pre_asic_init(adev);
1309
1310         if (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3) ||
1311             amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4) ||
1312             amdgpu_ip_version(adev, GC_HWIP, 0) >= IP_VERSION(11, 0, 0)) {
1313                 amdgpu_psp_wait_for_bootloader(adev);
1314                 ret = amdgpu_atomfirmware_asic_init(adev, true);
1315                 return ret;
1316         } else {
1317                 return amdgpu_atom_asic_init(adev->mode_info.atom_context);
1318         }
1319
1320         return 0;
1321 }
1322
1323 /**
1324  * amdgpu_device_mem_scratch_init - allocate the VRAM scratch page
1325  *
1326  * @adev: amdgpu_device pointer
1327  *
1328  * Allocates a scratch page of VRAM for use by various things in the
1329  * driver.
1330  */
1331 static int amdgpu_device_mem_scratch_init(struct amdgpu_device *adev)
1332 {
1333         return amdgpu_bo_create_kernel(adev, AMDGPU_GPU_PAGE_SIZE, PAGE_SIZE,
1334                                        AMDGPU_GEM_DOMAIN_VRAM |
1335                                        AMDGPU_GEM_DOMAIN_GTT,
1336                                        &adev->mem_scratch.robj,
1337                                        &adev->mem_scratch.gpu_addr,
1338                                        (void **)&adev->mem_scratch.ptr);
1339 }
1340
1341 /**
1342  * amdgpu_device_mem_scratch_fini - Free the VRAM scratch page
1343  *
1344  * @adev: amdgpu_device pointer
1345  *
1346  * Frees the VRAM scratch page.
1347  */
1348 static void amdgpu_device_mem_scratch_fini(struct amdgpu_device *adev)
1349 {
1350         amdgpu_bo_free_kernel(&adev->mem_scratch.robj, NULL, NULL);
1351 }
1352
1353 /**
1354  * amdgpu_device_program_register_sequence - program an array of registers.
1355  *
1356  * @adev: amdgpu_device pointer
1357  * @registers: pointer to the register array
1358  * @array_size: size of the register array
1359  *
1360  * Programs an array or registers with and or masks.
1361  * This is a helper for setting golden registers.
1362  */
1363 void amdgpu_device_program_register_sequence(struct amdgpu_device *adev,
1364                                              const u32 *registers,
1365                                              const u32 array_size)
1366 {
1367         u32 tmp, reg, and_mask, or_mask;
1368         int i;
1369
1370         if (array_size % 3)
1371                 return;
1372
1373         for (i = 0; i < array_size; i += 3) {
1374                 reg = registers[i + 0];
1375                 and_mask = registers[i + 1];
1376                 or_mask = registers[i + 2];
1377
1378                 if (and_mask == 0xffffffff) {
1379                         tmp = or_mask;
1380                 } else {
1381                         tmp = RREG32(reg);
1382                         tmp &= ~and_mask;
1383                         if (adev->family >= AMDGPU_FAMILY_AI)
1384                                 tmp |= (or_mask & and_mask);
1385                         else
1386                                 tmp |= or_mask;
1387                 }
1388                 WREG32(reg, tmp);
1389         }
1390 }
1391
1392 /**
1393  * amdgpu_device_pci_config_reset - reset the GPU
1394  *
1395  * @adev: amdgpu_device pointer
1396  *
1397  * Resets the GPU using the pci config reset sequence.
1398  * Only applicable to asics prior to vega10.
1399  */
1400 void amdgpu_device_pci_config_reset(struct amdgpu_device *adev)
1401 {
1402         pci_write_config_dword(adev->pdev, 0x7c, AMDGPU_ASIC_RESET_DATA);
1403 }
1404
1405 /**
1406  * amdgpu_device_pci_reset - reset the GPU using generic PCI means
1407  *
1408  * @adev: amdgpu_device pointer
1409  *
1410  * Resets the GPU using generic pci reset interfaces (FLR, SBR, etc.).
1411  */
1412 int amdgpu_device_pci_reset(struct amdgpu_device *adev)
1413 {
1414         return pci_reset_function(adev->pdev);
1415 }
1416
1417 /*
1418  * amdgpu_device_wb_*()
1419  * Writeback is the method by which the GPU updates special pages in memory
1420  * with the status of certain GPU events (fences, ring pointers,etc.).
1421  */
1422
1423 /**
1424  * amdgpu_device_wb_fini - Disable Writeback and free memory
1425  *
1426  * @adev: amdgpu_device pointer
1427  *
1428  * Disables Writeback and frees the Writeback memory (all asics).
1429  * Used at driver shutdown.
1430  */
1431 static void amdgpu_device_wb_fini(struct amdgpu_device *adev)
1432 {
1433         if (adev->wb.wb_obj) {
1434                 amdgpu_bo_free_kernel(&adev->wb.wb_obj,
1435                                       &adev->wb.gpu_addr,
1436                                       (void **)&adev->wb.wb);
1437                 adev->wb.wb_obj = NULL;
1438         }
1439 }
1440
1441 /**
1442  * amdgpu_device_wb_init - Init Writeback driver info and allocate memory
1443  *
1444  * @adev: amdgpu_device pointer
1445  *
1446  * Initializes writeback and allocates writeback memory (all asics).
1447  * Used at driver startup.
1448  * Returns 0 on success or an -error on failure.
1449  */
1450 static int amdgpu_device_wb_init(struct amdgpu_device *adev)
1451 {
1452         int r;
1453
1454         if (adev->wb.wb_obj == NULL) {
1455                 /* AMDGPU_MAX_WB * sizeof(uint32_t) * 8 = AMDGPU_MAX_WB 256bit slots */
1456                 r = amdgpu_bo_create_kernel(adev, AMDGPU_MAX_WB * sizeof(uint32_t) * 8,
1457                                             PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT,
1458                                             &adev->wb.wb_obj, &adev->wb.gpu_addr,
1459                                             (void **)&adev->wb.wb);
1460                 if (r) {
1461                         dev_warn(adev->dev, "(%d) create WB bo failed\n", r);
1462                         return r;
1463                 }
1464
1465                 adev->wb.num_wb = AMDGPU_MAX_WB;
1466                 memset(&adev->wb.used, 0, sizeof(adev->wb.used));
1467
1468                 /* clear wb memory */
1469                 memset((char *)adev->wb.wb, 0, AMDGPU_MAX_WB * sizeof(uint32_t) * 8);
1470         }
1471
1472         return 0;
1473 }
1474
1475 /**
1476  * amdgpu_device_wb_get - Allocate a wb entry
1477  *
1478  * @adev: amdgpu_device pointer
1479  * @wb: wb index
1480  *
1481  * Allocate a wb slot for use by the driver (all asics).
1482  * Returns 0 on success or -EINVAL on failure.
1483  */
1484 int amdgpu_device_wb_get(struct amdgpu_device *adev, u32 *wb)
1485 {
1486         unsigned long flags, offset;
1487
1488         spin_lock_irqsave(&adev->wb.lock, flags);
1489         offset = find_first_zero_bit(adev->wb.used, adev->wb.num_wb);
1490         if (offset < adev->wb.num_wb) {
1491                 __set_bit(offset, adev->wb.used);
1492                 spin_unlock_irqrestore(&adev->wb.lock, flags);
1493                 *wb = offset << 3; /* convert to dw offset */
1494                 return 0;
1495         } else {
1496                 spin_unlock_irqrestore(&adev->wb.lock, flags);
1497                 return -EINVAL;
1498         }
1499 }
1500
1501 /**
1502  * amdgpu_device_wb_free - Free a wb entry
1503  *
1504  * @adev: amdgpu_device pointer
1505  * @wb: wb index
1506  *
1507  * Free a wb slot allocated for use by the driver (all asics)
1508  */
1509 void amdgpu_device_wb_free(struct amdgpu_device *adev, u32 wb)
1510 {
1511         unsigned long flags;
1512
1513         wb >>= 3;
1514         spin_lock_irqsave(&adev->wb.lock, flags);
1515         if (wb < adev->wb.num_wb)
1516                 __clear_bit(wb, adev->wb.used);
1517         spin_unlock_irqrestore(&adev->wb.lock, flags);
1518 }
1519
1520 /**
1521  * amdgpu_device_resize_fb_bar - try to resize FB BAR
1522  *
1523  * @adev: amdgpu_device pointer
1524  *
1525  * Try to resize FB BAR to make all VRAM CPU accessible. We try very hard not
1526  * to fail, but if any of the BARs is not accessible after the size we abort
1527  * driver loading by returning -ENODEV.
1528  */
1529 int amdgpu_device_resize_fb_bar(struct amdgpu_device *adev)
1530 {
1531         int rbar_size = pci_rebar_bytes_to_size(adev->gmc.real_vram_size);
1532         struct pci_bus *root;
1533         struct resource *res;
1534         unsigned int i;
1535         u16 cmd;
1536         int r;
1537
1538         if (!IS_ENABLED(CONFIG_PHYS_ADDR_T_64BIT))
1539                 return 0;
1540
1541         /* Bypass for VF */
1542         if (amdgpu_sriov_vf(adev))
1543                 return 0;
1544
1545         /* PCI_EXT_CAP_ID_VNDR extended capability is located at 0x100 */
1546         if (!pci_find_ext_capability(adev->pdev, PCI_EXT_CAP_ID_VNDR))
1547                 DRM_WARN("System can't access extended configuration space, please check!!\n");
1548
1549         /* skip if the bios has already enabled large BAR */
1550         if (adev->gmc.real_vram_size &&
1551             (pci_resource_len(adev->pdev, 0) >= adev->gmc.real_vram_size))
1552                 return 0;
1553
1554         /* Check if the root BUS has 64bit memory resources */
1555         root = adev->pdev->bus;
1556         while (root->parent)
1557                 root = root->parent;
1558
1559         pci_bus_for_each_resource(root, res, i) {
1560                 if (res && res->flags & (IORESOURCE_MEM | IORESOURCE_MEM_64) &&
1561                     res->start > 0x100000000ull)
1562                         break;
1563         }
1564
1565         /* Trying to resize is pointless without a root hub window above 4GB */
1566         if (!res)
1567                 return 0;
1568
1569         /* Limit the BAR size to what is available */
1570         rbar_size = min(fls(pci_rebar_get_possible_sizes(adev->pdev, 0)) - 1,
1571                         rbar_size);
1572
1573         /* Disable memory decoding while we change the BAR addresses and size */
1574         pci_read_config_word(adev->pdev, PCI_COMMAND, &cmd);
1575         pci_write_config_word(adev->pdev, PCI_COMMAND,
1576                               cmd & ~PCI_COMMAND_MEMORY);
1577
1578         /* Free the VRAM and doorbell BAR, we most likely need to move both. */
1579         amdgpu_doorbell_fini(adev);
1580         if (adev->asic_type >= CHIP_BONAIRE)
1581                 pci_release_resource(adev->pdev, 2);
1582
1583         pci_release_resource(adev->pdev, 0);
1584
1585         r = pci_resize_resource(adev->pdev, 0, rbar_size);
1586         if (r == -ENOSPC)
1587                 DRM_INFO("Not enough PCI address space for a large BAR.");
1588         else if (r && r != -ENOTSUPP)
1589                 DRM_ERROR("Problem resizing BAR0 (%d).", r);
1590
1591         pci_assign_unassigned_bus_resources(adev->pdev->bus);
1592
1593         /* When the doorbell or fb BAR isn't available we have no chance of
1594          * using the device.
1595          */
1596         r = amdgpu_doorbell_init(adev);
1597         if (r || (pci_resource_flags(adev->pdev, 0) & IORESOURCE_UNSET))
1598                 return -ENODEV;
1599
1600         pci_write_config_word(adev->pdev, PCI_COMMAND, cmd);
1601
1602         return 0;
1603 }
1604
1605 static bool amdgpu_device_read_bios(struct amdgpu_device *adev)
1606 {
1607         if (hweight32(adev->aid_mask) && (adev->flags & AMD_IS_APU))
1608                 return false;
1609
1610         return true;
1611 }
1612
1613 /*
1614  * GPU helpers function.
1615  */
1616 /**
1617  * amdgpu_device_need_post - check if the hw need post or not
1618  *
1619  * @adev: amdgpu_device pointer
1620  *
1621  * Check if the asic has been initialized (all asics) at driver startup
1622  * or post is needed if  hw reset is performed.
1623  * Returns true if need or false if not.
1624  */
1625 bool amdgpu_device_need_post(struct amdgpu_device *adev)
1626 {
1627         uint32_t reg;
1628
1629         if (amdgpu_sriov_vf(adev))
1630                 return false;
1631
1632         if (!amdgpu_device_read_bios(adev))
1633                 return false;
1634
1635         if (amdgpu_passthrough(adev)) {
1636                 /* for FIJI: In whole GPU pass-through virtualization case, after VM reboot
1637                  * some old smc fw still need driver do vPost otherwise gpu hang, while
1638                  * those smc fw version above 22.15 doesn't have this flaw, so we force
1639                  * vpost executed for smc version below 22.15
1640                  */
1641                 if (adev->asic_type == CHIP_FIJI) {
1642                         int err;
1643                         uint32_t fw_ver;
1644
1645                         err = request_firmware(&adev->pm.fw, "amdgpu/fiji_smc.bin", adev->dev);
1646                         /* force vPost if error occured */
1647                         if (err)
1648                                 return true;
1649
1650                         fw_ver = *((uint32_t *)adev->pm.fw->data + 69);
1651                         release_firmware(adev->pm.fw);
1652                         if (fw_ver < 0x00160e00)
1653                                 return true;
1654                 }
1655         }
1656
1657         /* Don't post if we need to reset whole hive on init */
1658         if (adev->gmc.xgmi.pending_reset)
1659                 return false;
1660
1661         if (adev->has_hw_reset) {
1662                 adev->has_hw_reset = false;
1663                 return true;
1664         }
1665
1666         /* bios scratch used on CIK+ */
1667         if (adev->asic_type >= CHIP_BONAIRE)
1668                 return amdgpu_atombios_scratch_need_asic_init(adev);
1669
1670         /* check MEM_SIZE for older asics */
1671         reg = amdgpu_asic_get_config_memsize(adev);
1672
1673         if ((reg != 0) && (reg != 0xffffffff))
1674                 return false;
1675
1676         return true;
1677 }
1678
1679 /*
1680  * Check whether seamless boot is supported.
1681  *
1682  * So far we only support seamless boot on DCE 3.0 or later.
1683  * If users report that it works on older ASICS as well, we may
1684  * loosen this.
1685  */
1686 bool amdgpu_device_seamless_boot_supported(struct amdgpu_device *adev)
1687 {
1688         switch (amdgpu_seamless) {
1689         case -1:
1690                 break;
1691         case 1:
1692                 return true;
1693         case 0:
1694                 return false;
1695         default:
1696                 DRM_ERROR("Invalid value for amdgpu.seamless: %d\n",
1697                           amdgpu_seamless);
1698                 return false;
1699         }
1700
1701         if (!(adev->flags & AMD_IS_APU))
1702                 return false;
1703
1704         if (adev->mman.keep_stolen_vga_memory)
1705                 return false;
1706
1707         return amdgpu_ip_version(adev, DCE_HWIP, 0) >= IP_VERSION(3, 0, 0);
1708 }
1709
1710 /*
1711  * Intel hosts such as Rocket Lake, Alder Lake, Raptor Lake and Sapphire Rapids
1712  * don't support dynamic speed switching. Until we have confirmation from Intel
1713  * that a specific host supports it, it's safer that we keep it disabled for all.
1714  *
1715  * https://edc.intel.com/content/www/us/en/design/products/platforms/details/raptor-lake-s/13th-generation-core-processors-datasheet-volume-1-of-2/005/pci-express-support/
1716  * https://gitlab.freedesktop.org/drm/amd/-/issues/2663
1717  */
1718 static bool amdgpu_device_pcie_dynamic_switching_supported(struct amdgpu_device *adev)
1719 {
1720 #if IS_ENABLED(CONFIG_X86)
1721         struct cpuinfo_x86 *c = &cpu_data(0);
1722
1723         /* eGPU change speeds based on USB4 fabric conditions */
1724         if (dev_is_removable(adev->dev))
1725                 return true;
1726
1727         if (c->x86_vendor == X86_VENDOR_INTEL)
1728                 return false;
1729 #endif
1730         return true;
1731 }
1732
1733 /**
1734  * amdgpu_device_should_use_aspm - check if the device should program ASPM
1735  *
1736  * @adev: amdgpu_device pointer
1737  *
1738  * Confirm whether the module parameter and pcie bridge agree that ASPM should
1739  * be set for this device.
1740  *
1741  * Returns true if it should be used or false if not.
1742  */
1743 bool amdgpu_device_should_use_aspm(struct amdgpu_device *adev)
1744 {
1745         switch (amdgpu_aspm) {
1746         case -1:
1747                 break;
1748         case 0:
1749                 return false;
1750         case 1:
1751                 return true;
1752         default:
1753                 return false;
1754         }
1755         if (adev->flags & AMD_IS_APU)
1756                 return false;
1757         if (!(adev->pm.pp_feature & PP_PCIE_DPM_MASK))
1758                 return false;
1759         return pcie_aspm_enabled(adev->pdev);
1760 }
1761
1762 /* if we get transitioned to only one device, take VGA back */
1763 /**
1764  * amdgpu_device_vga_set_decode - enable/disable vga decode
1765  *
1766  * @pdev: PCI device pointer
1767  * @state: enable/disable vga decode
1768  *
1769  * Enable/disable vga decode (all asics).
1770  * Returns VGA resource flags.
1771  */
1772 static unsigned int amdgpu_device_vga_set_decode(struct pci_dev *pdev,
1773                 bool state)
1774 {
1775         struct amdgpu_device *adev = drm_to_adev(pci_get_drvdata(pdev));
1776
1777         amdgpu_asic_set_vga_state(adev, state);
1778         if (state)
1779                 return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
1780                        VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
1781         else
1782                 return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
1783 }
1784
1785 /**
1786  * amdgpu_device_check_block_size - validate the vm block size
1787  *
1788  * @adev: amdgpu_device pointer
1789  *
1790  * Validates the vm block size specified via module parameter.
1791  * The vm block size defines number of bits in page table versus page directory,
1792  * a page is 4KB so we have 12 bits offset, minimum 9 bits in the
1793  * page table and the remaining bits are in the page directory.
1794  */
1795 static void amdgpu_device_check_block_size(struct amdgpu_device *adev)
1796 {
1797         /* defines number of bits in page table versus page directory,
1798          * a page is 4KB so we have 12 bits offset, minimum 9 bits in the
1799          * page table and the remaining bits are in the page directory
1800          */
1801         if (amdgpu_vm_block_size == -1)
1802                 return;
1803
1804         if (amdgpu_vm_block_size < 9) {
1805                 dev_warn(adev->dev, "VM page table size (%d) too small\n",
1806                          amdgpu_vm_block_size);
1807                 amdgpu_vm_block_size = -1;
1808         }
1809 }
1810
1811 /**
1812  * amdgpu_device_check_vm_size - validate the vm size
1813  *
1814  * @adev: amdgpu_device pointer
1815  *
1816  * Validates the vm size in GB specified via module parameter.
1817  * The VM size is the size of the GPU virtual memory space in GB.
1818  */
1819 static void amdgpu_device_check_vm_size(struct amdgpu_device *adev)
1820 {
1821         /* no need to check the default value */
1822         if (amdgpu_vm_size == -1)
1823                 return;
1824
1825         if (amdgpu_vm_size < 1) {
1826                 dev_warn(adev->dev, "VM size (%d) too small, min is 1GB\n",
1827                          amdgpu_vm_size);
1828                 amdgpu_vm_size = -1;
1829         }
1830 }
1831
1832 static void amdgpu_device_check_smu_prv_buffer_size(struct amdgpu_device *adev)
1833 {
1834         struct sysinfo si;
1835         bool is_os_64 = (sizeof(void *) == 8);
1836         uint64_t total_memory;
1837         uint64_t dram_size_seven_GB = 0x1B8000000;
1838         uint64_t dram_size_three_GB = 0xB8000000;
1839
1840         if (amdgpu_smu_memory_pool_size == 0)
1841                 return;
1842
1843         if (!is_os_64) {
1844                 DRM_WARN("Not 64-bit OS, feature not supported\n");
1845                 goto def_value;
1846         }
1847         si_meminfo(&si);
1848         total_memory = (uint64_t)si.totalram * si.mem_unit;
1849
1850         if ((amdgpu_smu_memory_pool_size == 1) ||
1851                 (amdgpu_smu_memory_pool_size == 2)) {
1852                 if (total_memory < dram_size_three_GB)
1853                         goto def_value1;
1854         } else if ((amdgpu_smu_memory_pool_size == 4) ||
1855                 (amdgpu_smu_memory_pool_size == 8)) {
1856                 if (total_memory < dram_size_seven_GB)
1857                         goto def_value1;
1858         } else {
1859                 DRM_WARN("Smu memory pool size not supported\n");
1860                 goto def_value;
1861         }
1862         adev->pm.smu_prv_buffer_size = amdgpu_smu_memory_pool_size << 28;
1863
1864         return;
1865
1866 def_value1:
1867         DRM_WARN("No enough system memory\n");
1868 def_value:
1869         adev->pm.smu_prv_buffer_size = 0;
1870 }
1871
1872 static int amdgpu_device_init_apu_flags(struct amdgpu_device *adev)
1873 {
1874         if (!(adev->flags & AMD_IS_APU) ||
1875             adev->asic_type < CHIP_RAVEN)
1876                 return 0;
1877
1878         switch (adev->asic_type) {
1879         case CHIP_RAVEN:
1880                 if (adev->pdev->device == 0x15dd)
1881                         adev->apu_flags |= AMD_APU_IS_RAVEN;
1882                 if (adev->pdev->device == 0x15d8)
1883                         adev->apu_flags |= AMD_APU_IS_PICASSO;
1884                 break;
1885         case CHIP_RENOIR:
1886                 if ((adev->pdev->device == 0x1636) ||
1887                     (adev->pdev->device == 0x164c))
1888                         adev->apu_flags |= AMD_APU_IS_RENOIR;
1889                 else
1890                         adev->apu_flags |= AMD_APU_IS_GREEN_SARDINE;
1891                 break;
1892         case CHIP_VANGOGH:
1893                 adev->apu_flags |= AMD_APU_IS_VANGOGH;
1894                 break;
1895         case CHIP_YELLOW_CARP:
1896                 break;
1897         case CHIP_CYAN_SKILLFISH:
1898                 if ((adev->pdev->device == 0x13FE) ||
1899                     (adev->pdev->device == 0x143F))
1900                         adev->apu_flags |= AMD_APU_IS_CYAN_SKILLFISH2;
1901                 break;
1902         default:
1903                 break;
1904         }
1905
1906         return 0;
1907 }
1908
1909 /**
1910  * amdgpu_device_check_arguments - validate module params
1911  *
1912  * @adev: amdgpu_device pointer
1913  *
1914  * Validates certain module parameters and updates
1915  * the associated values used by the driver (all asics).
1916  */
1917 static int amdgpu_device_check_arguments(struct amdgpu_device *adev)
1918 {
1919         if (amdgpu_sched_jobs < 4) {
1920                 dev_warn(adev->dev, "sched jobs (%d) must be at least 4\n",
1921                          amdgpu_sched_jobs);
1922                 amdgpu_sched_jobs = 4;
1923         } else if (!is_power_of_2(amdgpu_sched_jobs)) {
1924                 dev_warn(adev->dev, "sched jobs (%d) must be a power of 2\n",
1925                          amdgpu_sched_jobs);
1926                 amdgpu_sched_jobs = roundup_pow_of_two(amdgpu_sched_jobs);
1927         }
1928
1929         if (amdgpu_gart_size != -1 && amdgpu_gart_size < 32) {
1930                 /* gart size must be greater or equal to 32M */
1931                 dev_warn(adev->dev, "gart size (%d) too small\n",
1932                          amdgpu_gart_size);
1933                 amdgpu_gart_size = -1;
1934         }
1935
1936         if (amdgpu_gtt_size != -1 && amdgpu_gtt_size < 32) {
1937                 /* gtt size must be greater or equal to 32M */
1938                 dev_warn(adev->dev, "gtt size (%d) too small\n",
1939                                  amdgpu_gtt_size);
1940                 amdgpu_gtt_size = -1;
1941         }
1942
1943         /* valid range is between 4 and 9 inclusive */
1944         if (amdgpu_vm_fragment_size != -1 &&
1945             (amdgpu_vm_fragment_size > 9 || amdgpu_vm_fragment_size < 4)) {
1946                 dev_warn(adev->dev, "valid range is between 4 and 9\n");
1947                 amdgpu_vm_fragment_size = -1;
1948         }
1949
1950         if (amdgpu_sched_hw_submission < 2) {
1951                 dev_warn(adev->dev, "sched hw submission jobs (%d) must be at least 2\n",
1952                          amdgpu_sched_hw_submission);
1953                 amdgpu_sched_hw_submission = 2;
1954         } else if (!is_power_of_2(amdgpu_sched_hw_submission)) {
1955                 dev_warn(adev->dev, "sched hw submission jobs (%d) must be a power of 2\n",
1956                          amdgpu_sched_hw_submission);
1957                 amdgpu_sched_hw_submission = roundup_pow_of_two(amdgpu_sched_hw_submission);
1958         }
1959
1960         if (amdgpu_reset_method < -1 || amdgpu_reset_method > 4) {
1961                 dev_warn(adev->dev, "invalid option for reset method, reverting to default\n");
1962                 amdgpu_reset_method = -1;
1963         }
1964
1965         amdgpu_device_check_smu_prv_buffer_size(adev);
1966
1967         amdgpu_device_check_vm_size(adev);
1968
1969         amdgpu_device_check_block_size(adev);
1970
1971         adev->firmware.load_type = amdgpu_ucode_get_load_type(adev, amdgpu_fw_load_type);
1972
1973         return 0;
1974 }
1975
1976 /**
1977  * amdgpu_switcheroo_set_state - set switcheroo state
1978  *
1979  * @pdev: pci dev pointer
1980  * @state: vga_switcheroo state
1981  *
1982  * Callback for the switcheroo driver.  Suspends or resumes
1983  * the asics before or after it is powered up using ACPI methods.
1984  */
1985 static void amdgpu_switcheroo_set_state(struct pci_dev *pdev,
1986                                         enum vga_switcheroo_state state)
1987 {
1988         struct drm_device *dev = pci_get_drvdata(pdev);
1989         int r;
1990
1991         if (amdgpu_device_supports_px(dev) && state == VGA_SWITCHEROO_OFF)
1992                 return;
1993
1994         if (state == VGA_SWITCHEROO_ON) {
1995                 pr_info("switched on\n");
1996                 /* don't suspend or resume card normally */
1997                 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
1998
1999                 pci_set_power_state(pdev, PCI_D0);
2000                 amdgpu_device_load_pci_state(pdev);
2001                 r = pci_enable_device(pdev);
2002                 if (r)
2003                         DRM_WARN("pci_enable_device failed (%d)\n", r);
2004                 amdgpu_device_resume(dev, true);
2005
2006                 dev->switch_power_state = DRM_SWITCH_POWER_ON;
2007         } else {
2008                 pr_info("switched off\n");
2009                 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
2010                 amdgpu_device_prepare(dev);
2011                 amdgpu_device_suspend(dev, true);
2012                 amdgpu_device_cache_pci_state(pdev);
2013                 /* Shut down the device */
2014                 pci_disable_device(pdev);
2015                 pci_set_power_state(pdev, PCI_D3cold);
2016                 dev->switch_power_state = DRM_SWITCH_POWER_OFF;
2017         }
2018 }
2019
2020 /**
2021  * amdgpu_switcheroo_can_switch - see if switcheroo state can change
2022  *
2023  * @pdev: pci dev pointer
2024  *
2025  * Callback for the switcheroo driver.  Check of the switcheroo
2026  * state can be changed.
2027  * Returns true if the state can be changed, false if not.
2028  */
2029 static bool amdgpu_switcheroo_can_switch(struct pci_dev *pdev)
2030 {
2031         struct drm_device *dev = pci_get_drvdata(pdev);
2032
2033        /*
2034         * FIXME: open_count is protected by drm_global_mutex but that would lead to
2035         * locking inversion with the driver load path. And the access here is
2036         * completely racy anyway. So don't bother with locking for now.
2037         */
2038         return atomic_read(&dev->open_count) == 0;
2039 }
2040
2041 static const struct vga_switcheroo_client_ops amdgpu_switcheroo_ops = {
2042         .set_gpu_state = amdgpu_switcheroo_set_state,
2043         .reprobe = NULL,
2044         .can_switch = amdgpu_switcheroo_can_switch,
2045 };
2046
2047 /**
2048  * amdgpu_device_ip_set_clockgating_state - set the CG state
2049  *
2050  * @dev: amdgpu_device pointer
2051  * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.)
2052  * @state: clockgating state (gate or ungate)
2053  *
2054  * Sets the requested clockgating state for all instances of
2055  * the hardware IP specified.
2056  * Returns the error code from the last instance.
2057  */
2058 int amdgpu_device_ip_set_clockgating_state(void *dev,
2059                                            enum amd_ip_block_type block_type,
2060                                            enum amd_clockgating_state state)
2061 {
2062         struct amdgpu_device *adev = dev;
2063         int i, r = 0;
2064
2065         for (i = 0; i < adev->num_ip_blocks; i++) {
2066                 if (!adev->ip_blocks[i].status.valid)
2067                         continue;
2068                 if (adev->ip_blocks[i].version->type != block_type)
2069                         continue;
2070                 if (!adev->ip_blocks[i].version->funcs->set_clockgating_state)
2071                         continue;
2072                 r = adev->ip_blocks[i].version->funcs->set_clockgating_state(
2073                         (void *)adev, state);
2074                 if (r)
2075                         DRM_ERROR("set_clockgating_state of IP block <%s> failed %d\n",
2076                                   adev->ip_blocks[i].version->funcs->name, r);
2077         }
2078         return r;
2079 }
2080
2081 /**
2082  * amdgpu_device_ip_set_powergating_state - set the PG state
2083  *
2084  * @dev: amdgpu_device pointer
2085  * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.)
2086  * @state: powergating state (gate or ungate)
2087  *
2088  * Sets the requested powergating state for all instances of
2089  * the hardware IP specified.
2090  * Returns the error code from the last instance.
2091  */
2092 int amdgpu_device_ip_set_powergating_state(void *dev,
2093                                            enum amd_ip_block_type block_type,
2094                                            enum amd_powergating_state state)
2095 {
2096         struct amdgpu_device *adev = dev;
2097         int i, r = 0;
2098
2099         for (i = 0; i < adev->num_ip_blocks; i++) {
2100                 if (!adev->ip_blocks[i].status.valid)
2101                         continue;
2102                 if (adev->ip_blocks[i].version->type != block_type)
2103                         continue;
2104                 if (!adev->ip_blocks[i].version->funcs->set_powergating_state)
2105                         continue;
2106                 r = adev->ip_blocks[i].version->funcs->set_powergating_state(
2107                         (void *)adev, state);
2108                 if (r)
2109                         DRM_ERROR("set_powergating_state of IP block <%s> failed %d\n",
2110                                   adev->ip_blocks[i].version->funcs->name, r);
2111         }
2112         return r;
2113 }
2114
2115 /**
2116  * amdgpu_device_ip_get_clockgating_state - get the CG state
2117  *
2118  * @adev: amdgpu_device pointer
2119  * @flags: clockgating feature flags
2120  *
2121  * Walks the list of IPs on the device and updates the clockgating
2122  * flags for each IP.
2123  * Updates @flags with the feature flags for each hardware IP where
2124  * clockgating is enabled.
2125  */
2126 void amdgpu_device_ip_get_clockgating_state(struct amdgpu_device *adev,
2127                                             u64 *flags)
2128 {
2129         int i;
2130
2131         for (i = 0; i < adev->num_ip_blocks; i++) {
2132                 if (!adev->ip_blocks[i].status.valid)
2133                         continue;
2134                 if (adev->ip_blocks[i].version->funcs->get_clockgating_state)
2135                         adev->ip_blocks[i].version->funcs->get_clockgating_state((void *)adev, flags);
2136         }
2137 }
2138
2139 /**
2140  * amdgpu_device_ip_wait_for_idle - wait for idle
2141  *
2142  * @adev: amdgpu_device pointer
2143  * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.)
2144  *
2145  * Waits for the request hardware IP to be idle.
2146  * Returns 0 for success or a negative error code on failure.
2147  */
2148 int amdgpu_device_ip_wait_for_idle(struct amdgpu_device *adev,
2149                                    enum amd_ip_block_type block_type)
2150 {
2151         int i, r;
2152
2153         for (i = 0; i < adev->num_ip_blocks; i++) {
2154                 if (!adev->ip_blocks[i].status.valid)
2155                         continue;
2156                 if (adev->ip_blocks[i].version->type == block_type) {
2157                         r = adev->ip_blocks[i].version->funcs->wait_for_idle((void *)adev);
2158                         if (r)
2159                                 return r;
2160                         break;
2161                 }
2162         }
2163         return 0;
2164
2165 }
2166
2167 /**
2168  * amdgpu_device_ip_is_idle - is the hardware IP idle
2169  *
2170  * @adev: amdgpu_device pointer
2171  * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.)
2172  *
2173  * Check if the hardware IP is idle or not.
2174  * Returns true if it the IP is idle, false if not.
2175  */
2176 bool amdgpu_device_ip_is_idle(struct amdgpu_device *adev,
2177                               enum amd_ip_block_type block_type)
2178 {
2179         int i;
2180
2181         for (i = 0; i < adev->num_ip_blocks; i++) {
2182                 if (!adev->ip_blocks[i].status.valid)
2183                         continue;
2184                 if (adev->ip_blocks[i].version->type == block_type)
2185                         return adev->ip_blocks[i].version->funcs->is_idle((void *)adev);
2186         }
2187         return true;
2188
2189 }
2190
2191 /**
2192  * amdgpu_device_ip_get_ip_block - get a hw IP pointer
2193  *
2194  * @adev: amdgpu_device pointer
2195  * @type: Type of hardware IP (SMU, GFX, UVD, etc.)
2196  *
2197  * Returns a pointer to the hardware IP block structure
2198  * if it exists for the asic, otherwise NULL.
2199  */
2200 struct amdgpu_ip_block *
2201 amdgpu_device_ip_get_ip_block(struct amdgpu_device *adev,
2202                               enum amd_ip_block_type type)
2203 {
2204         int i;
2205
2206         for (i = 0; i < adev->num_ip_blocks; i++)
2207                 if (adev->ip_blocks[i].version->type == type)
2208                         return &adev->ip_blocks[i];
2209
2210         return NULL;
2211 }
2212
2213 /**
2214  * amdgpu_device_ip_block_version_cmp
2215  *
2216  * @adev: amdgpu_device pointer
2217  * @type: enum amd_ip_block_type
2218  * @major: major version
2219  * @minor: minor version
2220  *
2221  * return 0 if equal or greater
2222  * return 1 if smaller or the ip_block doesn't exist
2223  */
2224 int amdgpu_device_ip_block_version_cmp(struct amdgpu_device *adev,
2225                                        enum amd_ip_block_type type,
2226                                        u32 major, u32 minor)
2227 {
2228         struct amdgpu_ip_block *ip_block = amdgpu_device_ip_get_ip_block(adev, type);
2229
2230         if (ip_block && ((ip_block->version->major > major) ||
2231                         ((ip_block->version->major == major) &&
2232                         (ip_block->version->minor >= minor))))
2233                 return 0;
2234
2235         return 1;
2236 }
2237
2238 /**
2239  * amdgpu_device_ip_block_add
2240  *
2241  * @adev: amdgpu_device pointer
2242  * @ip_block_version: pointer to the IP to add
2243  *
2244  * Adds the IP block driver information to the collection of IPs
2245  * on the asic.
2246  */
2247 int amdgpu_device_ip_block_add(struct amdgpu_device *adev,
2248                                const struct amdgpu_ip_block_version *ip_block_version)
2249 {
2250         if (!ip_block_version)
2251                 return -EINVAL;
2252
2253         switch (ip_block_version->type) {
2254         case AMD_IP_BLOCK_TYPE_VCN:
2255                 if (adev->harvest_ip_mask & AMD_HARVEST_IP_VCN_MASK)
2256                         return 0;
2257                 break;
2258         case AMD_IP_BLOCK_TYPE_JPEG:
2259                 if (adev->harvest_ip_mask & AMD_HARVEST_IP_JPEG_MASK)
2260                         return 0;
2261                 break;
2262         default:
2263                 break;
2264         }
2265
2266         DRM_INFO("add ip block number %d <%s>\n", adev->num_ip_blocks,
2267                   ip_block_version->funcs->name);
2268
2269         adev->ip_blocks[adev->num_ip_blocks++].version = ip_block_version;
2270
2271         return 0;
2272 }
2273
2274 /**
2275  * amdgpu_device_enable_virtual_display - enable virtual display feature
2276  *
2277  * @adev: amdgpu_device pointer
2278  *
2279  * Enabled the virtual display feature if the user has enabled it via
2280  * the module parameter virtual_display.  This feature provides a virtual
2281  * display hardware on headless boards or in virtualized environments.
2282  * This function parses and validates the configuration string specified by
2283  * the user and configues the virtual display configuration (number of
2284  * virtual connectors, crtcs, etc.) specified.
2285  */
2286 static void amdgpu_device_enable_virtual_display(struct amdgpu_device *adev)
2287 {
2288         adev->enable_virtual_display = false;
2289
2290         if (amdgpu_virtual_display) {
2291                 const char *pci_address_name = pci_name(adev->pdev);
2292                 char *pciaddstr, *pciaddstr_tmp, *pciaddname_tmp, *pciaddname;
2293
2294                 pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL);
2295                 pciaddstr_tmp = pciaddstr;
2296                 while ((pciaddname_tmp = strsep(&pciaddstr_tmp, ";"))) {
2297                         pciaddname = strsep(&pciaddname_tmp, ",");
2298                         if (!strcmp("all", pciaddname)
2299                             || !strcmp(pci_address_name, pciaddname)) {
2300                                 long num_crtc;
2301                                 int res = -1;
2302
2303                                 adev->enable_virtual_display = true;
2304
2305                                 if (pciaddname_tmp)
2306                                         res = kstrtol(pciaddname_tmp, 10,
2307                                                       &num_crtc);
2308
2309                                 if (!res) {
2310                                         if (num_crtc < 1)
2311                                                 num_crtc = 1;
2312                                         if (num_crtc > 6)
2313                                                 num_crtc = 6;
2314                                         adev->mode_info.num_crtc = num_crtc;
2315                                 } else {
2316                                         adev->mode_info.num_crtc = 1;
2317                                 }
2318                                 break;
2319                         }
2320                 }
2321
2322                 DRM_INFO("virtual display string:%s, %s:virtual_display:%d, num_crtc:%d\n",
2323                          amdgpu_virtual_display, pci_address_name,
2324                          adev->enable_virtual_display, adev->mode_info.num_crtc);
2325
2326                 kfree(pciaddstr);
2327         }
2328 }
2329
2330 void amdgpu_device_set_sriov_virtual_display(struct amdgpu_device *adev)
2331 {
2332         if (amdgpu_sriov_vf(adev) && !adev->enable_virtual_display) {
2333                 adev->mode_info.num_crtc = 1;
2334                 adev->enable_virtual_display = true;
2335                 DRM_INFO("virtual_display:%d, num_crtc:%d\n",
2336                          adev->enable_virtual_display, adev->mode_info.num_crtc);
2337         }
2338 }
2339
2340 /**
2341  * amdgpu_device_parse_gpu_info_fw - parse gpu info firmware
2342  *
2343  * @adev: amdgpu_device pointer
2344  *
2345  * Parses the asic configuration parameters specified in the gpu info
2346  * firmware and makes them availale to the driver for use in configuring
2347  * the asic.
2348  * Returns 0 on success, -EINVAL on failure.
2349  */
2350 static int amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)
2351 {
2352         const char *chip_name;
2353         char fw_name[40];
2354         int err;
2355         const struct gpu_info_firmware_header_v1_0 *hdr;
2356
2357         adev->firmware.gpu_info_fw = NULL;
2358
2359         if (adev->mman.discovery_bin)
2360                 return 0;
2361
2362         switch (adev->asic_type) {
2363         default:
2364                 return 0;
2365         case CHIP_VEGA10:
2366                 chip_name = "vega10";
2367                 break;
2368         case CHIP_VEGA12:
2369                 chip_name = "vega12";
2370                 break;
2371         case CHIP_RAVEN:
2372                 if (adev->apu_flags & AMD_APU_IS_RAVEN2)
2373                         chip_name = "raven2";
2374                 else if (adev->apu_flags & AMD_APU_IS_PICASSO)
2375                         chip_name = "picasso";
2376                 else
2377                         chip_name = "raven";
2378                 break;
2379         case CHIP_ARCTURUS:
2380                 chip_name = "arcturus";
2381                 break;
2382         case CHIP_NAVI12:
2383                 chip_name = "navi12";
2384                 break;
2385         }
2386
2387         snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_gpu_info.bin", chip_name);
2388         err = amdgpu_ucode_request(adev, &adev->firmware.gpu_info_fw, fw_name);
2389         if (err) {
2390                 dev_err(adev->dev,
2391                         "Failed to get gpu_info firmware \"%s\"\n",
2392                         fw_name);
2393                 goto out;
2394         }
2395
2396         hdr = (const struct gpu_info_firmware_header_v1_0 *)adev->firmware.gpu_info_fw->data;
2397         amdgpu_ucode_print_gpu_info_hdr(&hdr->header);
2398
2399         switch (hdr->version_major) {
2400         case 1:
2401         {
2402                 const struct gpu_info_firmware_v1_0 *gpu_info_fw =
2403                         (const struct gpu_info_firmware_v1_0 *)(adev->firmware.gpu_info_fw->data +
2404                                                                 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
2405
2406                 /*
2407                  * Should be droped when DAL no longer needs it.
2408                  */
2409                 if (adev->asic_type == CHIP_NAVI12)
2410                         goto parse_soc_bounding_box;
2411
2412                 adev->gfx.config.max_shader_engines = le32_to_cpu(gpu_info_fw->gc_num_se);
2413                 adev->gfx.config.max_cu_per_sh = le32_to_cpu(gpu_info_fw->gc_num_cu_per_sh);
2414                 adev->gfx.config.max_sh_per_se = le32_to_cpu(gpu_info_fw->gc_num_sh_per_se);
2415                 adev->gfx.config.max_backends_per_se = le32_to_cpu(gpu_info_fw->gc_num_rb_per_se);
2416                 adev->gfx.config.max_texture_channel_caches =
2417                         le32_to_cpu(gpu_info_fw->gc_num_tccs);
2418                 adev->gfx.config.max_gprs = le32_to_cpu(gpu_info_fw->gc_num_gprs);
2419                 adev->gfx.config.max_gs_threads = le32_to_cpu(gpu_info_fw->gc_num_max_gs_thds);
2420                 adev->gfx.config.gs_vgt_table_depth = le32_to_cpu(gpu_info_fw->gc_gs_table_depth);
2421                 adev->gfx.config.gs_prim_buffer_depth = le32_to_cpu(gpu_info_fw->gc_gsprim_buff_depth);
2422                 adev->gfx.config.double_offchip_lds_buf =
2423                         le32_to_cpu(gpu_info_fw->gc_double_offchip_lds_buffer);
2424                 adev->gfx.cu_info.wave_front_size = le32_to_cpu(gpu_info_fw->gc_wave_size);
2425                 adev->gfx.cu_info.max_waves_per_simd =
2426                         le32_to_cpu(gpu_info_fw->gc_max_waves_per_simd);
2427                 adev->gfx.cu_info.max_scratch_slots_per_cu =
2428                         le32_to_cpu(gpu_info_fw->gc_max_scratch_slots_per_cu);
2429                 adev->gfx.cu_info.lds_size = le32_to_cpu(gpu_info_fw->gc_lds_size);
2430                 if (hdr->version_minor >= 1) {
2431                         const struct gpu_info_firmware_v1_1 *gpu_info_fw =
2432                                 (const struct gpu_info_firmware_v1_1 *)(adev->firmware.gpu_info_fw->data +
2433                                                                         le32_to_cpu(hdr->header.ucode_array_offset_bytes));
2434                         adev->gfx.config.num_sc_per_sh =
2435                                 le32_to_cpu(gpu_info_fw->num_sc_per_sh);
2436                         adev->gfx.config.num_packer_per_sc =
2437                                 le32_to_cpu(gpu_info_fw->num_packer_per_sc);
2438                 }
2439
2440 parse_soc_bounding_box:
2441                 /*
2442                  * soc bounding box info is not integrated in disocovery table,
2443                  * we always need to parse it from gpu info firmware if needed.
2444                  */
2445                 if (hdr->version_minor == 2) {
2446                         const struct gpu_info_firmware_v1_2 *gpu_info_fw =
2447                                 (const struct gpu_info_firmware_v1_2 *)(adev->firmware.gpu_info_fw->data +
2448                                                                         le32_to_cpu(hdr->header.ucode_array_offset_bytes));
2449                         adev->dm.soc_bounding_box = &gpu_info_fw->soc_bounding_box;
2450                 }
2451                 break;
2452         }
2453         default:
2454                 dev_err(adev->dev,
2455                         "Unsupported gpu_info table %d\n", hdr->header.ucode_version);
2456                 err = -EINVAL;
2457                 goto out;
2458         }
2459 out:
2460         return err;
2461 }
2462
2463 /**
2464  * amdgpu_device_ip_early_init - run early init for hardware IPs
2465  *
2466  * @adev: amdgpu_device pointer
2467  *
2468  * Early initialization pass for hardware IPs.  The hardware IPs that make
2469  * up each asic are discovered each IP's early_init callback is run.  This
2470  * is the first stage in initializing the asic.
2471  * Returns 0 on success, negative error code on failure.
2472  */
2473 static int amdgpu_device_ip_early_init(struct amdgpu_device *adev)
2474 {
2475         struct pci_dev *parent;
2476         int i, r;
2477         bool total;
2478
2479         amdgpu_device_enable_virtual_display(adev);
2480
2481         if (amdgpu_sriov_vf(adev)) {
2482                 r = amdgpu_virt_request_full_gpu(adev, true);
2483                 if (r)
2484                         return r;
2485         }
2486
2487         switch (adev->asic_type) {
2488 #ifdef CONFIG_DRM_AMDGPU_SI
2489         case CHIP_VERDE:
2490         case CHIP_TAHITI:
2491         case CHIP_PITCAIRN:
2492         case CHIP_OLAND:
2493         case CHIP_HAINAN:
2494                 adev->family = AMDGPU_FAMILY_SI;
2495                 r = si_set_ip_blocks(adev);
2496                 if (r)
2497                         return r;
2498                 break;
2499 #endif
2500 #ifdef CONFIG_DRM_AMDGPU_CIK
2501         case CHIP_BONAIRE:
2502         case CHIP_HAWAII:
2503         case CHIP_KAVERI:
2504         case CHIP_KABINI:
2505         case CHIP_MULLINS:
2506                 if (adev->flags & AMD_IS_APU)
2507                         adev->family = AMDGPU_FAMILY_KV;
2508                 else
2509                         adev->family = AMDGPU_FAMILY_CI;
2510
2511                 r = cik_set_ip_blocks(adev);
2512                 if (r)
2513                         return r;
2514                 break;
2515 #endif
2516         case CHIP_TOPAZ:
2517         case CHIP_TONGA:
2518         case CHIP_FIJI:
2519         case CHIP_POLARIS10:
2520         case CHIP_POLARIS11:
2521         case CHIP_POLARIS12:
2522         case CHIP_VEGAM:
2523         case CHIP_CARRIZO:
2524         case CHIP_STONEY:
2525                 if (adev->flags & AMD_IS_APU)
2526                         adev->family = AMDGPU_FAMILY_CZ;
2527                 else
2528                         adev->family = AMDGPU_FAMILY_VI;
2529
2530                 r = vi_set_ip_blocks(adev);
2531                 if (r)
2532                         return r;
2533                 break;
2534         default:
2535                 r = amdgpu_discovery_set_ip_blocks(adev);
2536                 if (r)
2537                         return r;
2538                 break;
2539         }
2540
2541         if (amdgpu_has_atpx() &&
2542             (amdgpu_is_atpx_hybrid() ||
2543              amdgpu_has_atpx_dgpu_power_cntl()) &&
2544             ((adev->flags & AMD_IS_APU) == 0) &&
2545             !dev_is_removable(&adev->pdev->dev))
2546                 adev->flags |= AMD_IS_PX;
2547
2548         if (!(adev->flags & AMD_IS_APU)) {
2549                 parent = pcie_find_root_port(adev->pdev);
2550                 adev->has_pr3 = parent ? pci_pr3_present(parent) : false;
2551         }
2552
2553
2554         adev->pm.pp_feature = amdgpu_pp_feature_mask;
2555         if (amdgpu_sriov_vf(adev) || sched_policy == KFD_SCHED_POLICY_NO_HWS)
2556                 adev->pm.pp_feature &= ~PP_GFXOFF_MASK;
2557         if (amdgpu_sriov_vf(adev) && adev->asic_type == CHIP_SIENNA_CICHLID)
2558                 adev->pm.pp_feature &= ~PP_OVERDRIVE_MASK;
2559         if (!amdgpu_device_pcie_dynamic_switching_supported(adev))
2560                 adev->pm.pp_feature &= ~PP_PCIE_DPM_MASK;
2561
2562         total = true;
2563         for (i = 0; i < adev->num_ip_blocks; i++) {
2564                 if ((amdgpu_ip_block_mask & (1 << i)) == 0) {
2565                         DRM_WARN("disabled ip block: %d <%s>\n",
2566                                   i, adev->ip_blocks[i].version->funcs->name);
2567                         adev->ip_blocks[i].status.valid = false;
2568                 } else {
2569                         if (adev->ip_blocks[i].version->funcs->early_init) {
2570                                 r = adev->ip_blocks[i].version->funcs->early_init((void *)adev);
2571                                 if (r == -ENOENT) {
2572                                         adev->ip_blocks[i].status.valid = false;
2573                                 } else if (r) {
2574                                         DRM_ERROR("early_init of IP block <%s> failed %d\n",
2575                                                   adev->ip_blocks[i].version->funcs->name, r);
2576                                         total = false;
2577                                 } else {
2578                                         adev->ip_blocks[i].status.valid = true;
2579                                 }
2580                         } else {
2581                                 adev->ip_blocks[i].status.valid = true;
2582                         }
2583                 }
2584                 /* get the vbios after the asic_funcs are set up */
2585                 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON) {
2586                         r = amdgpu_device_parse_gpu_info_fw(adev);
2587                         if (r)
2588                                 return r;
2589
2590                         /* Read BIOS */
2591                         if (amdgpu_device_read_bios(adev)) {
2592                                 if (!amdgpu_get_bios(adev))
2593                                         return -EINVAL;
2594
2595                                 r = amdgpu_atombios_init(adev);
2596                                 if (r) {
2597                                         dev_err(adev->dev, "amdgpu_atombios_init failed\n");
2598                                         amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_INIT_FAIL, 0, 0);
2599                                         return r;
2600                                 }
2601                         }
2602
2603                         /*get pf2vf msg info at it's earliest time*/
2604                         if (amdgpu_sriov_vf(adev))
2605                                 amdgpu_virt_init_data_exchange(adev);
2606
2607                 }
2608         }
2609         if (!total)
2610                 return -ENODEV;
2611
2612         amdgpu_amdkfd_device_probe(adev);
2613         adev->cg_flags &= amdgpu_cg_mask;
2614         adev->pg_flags &= amdgpu_pg_mask;
2615
2616         return 0;
2617 }
2618
2619 static int amdgpu_device_ip_hw_init_phase1(struct amdgpu_device *adev)
2620 {
2621         int i, r;
2622
2623         for (i = 0; i < adev->num_ip_blocks; i++) {
2624                 if (!adev->ip_blocks[i].status.sw)
2625                         continue;
2626                 if (adev->ip_blocks[i].status.hw)
2627                         continue;
2628                 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||
2629                     (amdgpu_sriov_vf(adev) && (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP)) ||
2630                     adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH) {
2631                         r = adev->ip_blocks[i].version->funcs->hw_init(adev);
2632                         if (r) {
2633                                 DRM_ERROR("hw_init of IP block <%s> failed %d\n",
2634                                           adev->ip_blocks[i].version->funcs->name, r);
2635                                 return r;
2636                         }
2637                         adev->ip_blocks[i].status.hw = true;
2638                 }
2639         }
2640
2641         return 0;
2642 }
2643
2644 static int amdgpu_device_ip_hw_init_phase2(struct amdgpu_device *adev)
2645 {
2646         int i, r;
2647
2648         for (i = 0; i < adev->num_ip_blocks; i++) {
2649                 if (!adev->ip_blocks[i].status.sw)
2650                         continue;
2651                 if (adev->ip_blocks[i].status.hw)
2652                         continue;
2653                 r = adev->ip_blocks[i].version->funcs->hw_init(adev);
2654                 if (r) {
2655                         DRM_ERROR("hw_init of IP block <%s> failed %d\n",
2656                                   adev->ip_blocks[i].version->funcs->name, r);
2657                         return r;
2658                 }
2659                 adev->ip_blocks[i].status.hw = true;
2660         }
2661
2662         return 0;
2663 }
2664
2665 static int amdgpu_device_fw_loading(struct amdgpu_device *adev)
2666 {
2667         int r = 0;
2668         int i;
2669         uint32_t smu_version;
2670
2671         if (adev->asic_type >= CHIP_VEGA10) {
2672                 for (i = 0; i < adev->num_ip_blocks; i++) {
2673                         if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_PSP)
2674                                 continue;
2675
2676                         if (!adev->ip_blocks[i].status.sw)
2677                                 continue;
2678
2679                         /* no need to do the fw loading again if already done*/
2680                         if (adev->ip_blocks[i].status.hw == true)
2681                                 break;
2682
2683                         if (amdgpu_in_reset(adev) || adev->in_suspend) {
2684                                 r = adev->ip_blocks[i].version->funcs->resume(adev);
2685                                 if (r) {
2686                                         DRM_ERROR("resume of IP block <%s> failed %d\n",
2687                                                           adev->ip_blocks[i].version->funcs->name, r);
2688                                         return r;
2689                                 }
2690                         } else {
2691                                 r = adev->ip_blocks[i].version->funcs->hw_init(adev);
2692                                 if (r) {
2693                                         DRM_ERROR("hw_init of IP block <%s> failed %d\n",
2694                                                           adev->ip_blocks[i].version->funcs->name, r);
2695                                         return r;
2696                                 }
2697                         }
2698
2699                         adev->ip_blocks[i].status.hw = true;
2700                         break;
2701                 }
2702         }
2703
2704         if (!amdgpu_sriov_vf(adev) || adev->asic_type == CHIP_TONGA)
2705                 r = amdgpu_pm_load_smu_firmware(adev, &smu_version);
2706
2707         return r;
2708 }
2709
2710 static int amdgpu_device_init_schedulers(struct amdgpu_device *adev)
2711 {
2712         long timeout;
2713         int r, i;
2714
2715         for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2716                 struct amdgpu_ring *ring = adev->rings[i];
2717
2718                 /* No need to setup the GPU scheduler for rings that don't need it */
2719                 if (!ring || ring->no_scheduler)
2720                         continue;
2721
2722                 switch (ring->funcs->type) {
2723                 case AMDGPU_RING_TYPE_GFX:
2724                         timeout = adev->gfx_timeout;
2725                         break;
2726                 case AMDGPU_RING_TYPE_COMPUTE:
2727                         timeout = adev->compute_timeout;
2728                         break;
2729                 case AMDGPU_RING_TYPE_SDMA:
2730                         timeout = adev->sdma_timeout;
2731                         break;
2732                 default:
2733                         timeout = adev->video_timeout;
2734                         break;
2735                 }
2736
2737                 r = drm_sched_init(&ring->sched, &amdgpu_sched_ops, NULL,
2738                                    DRM_SCHED_PRIORITY_COUNT,
2739                                    ring->num_hw_submission, 0,
2740                                    timeout, adev->reset_domain->wq,
2741                                    ring->sched_score, ring->name,
2742                                    adev->dev);
2743                 if (r) {
2744                         DRM_ERROR("Failed to create scheduler on ring %s.\n",
2745                                   ring->name);
2746                         return r;
2747                 }
2748                 r = amdgpu_uvd_entity_init(adev, ring);
2749                 if (r) {
2750                         DRM_ERROR("Failed to create UVD scheduling entity on ring %s.\n",
2751                                   ring->name);
2752                         return r;
2753                 }
2754                 r = amdgpu_vce_entity_init(adev, ring);
2755                 if (r) {
2756                         DRM_ERROR("Failed to create VCE scheduling entity on ring %s.\n",
2757                                   ring->name);
2758                         return r;
2759                 }
2760         }
2761
2762         amdgpu_xcp_update_partition_sched_list(adev);
2763
2764         return 0;
2765 }
2766
2767
2768 /**
2769  * amdgpu_device_ip_init - run init for hardware IPs
2770  *
2771  * @adev: amdgpu_device pointer
2772  *
2773  * Main initialization pass for hardware IPs.  The list of all the hardware
2774  * IPs that make up the asic is walked and the sw_init and hw_init callbacks
2775  * are run.  sw_init initializes the software state associated with each IP
2776  * and hw_init initializes the hardware associated with each IP.
2777  * Returns 0 on success, negative error code on failure.
2778  */
2779 static int amdgpu_device_ip_init(struct amdgpu_device *adev)
2780 {
2781         int i, r;
2782
2783         r = amdgpu_ras_init(adev);
2784         if (r)
2785                 return r;
2786
2787         for (i = 0; i < adev->num_ip_blocks; i++) {
2788                 if (!adev->ip_blocks[i].status.valid)
2789                         continue;
2790                 r = adev->ip_blocks[i].version->funcs->sw_init((void *)adev);
2791                 if (r) {
2792                         DRM_ERROR("sw_init of IP block <%s> failed %d\n",
2793                                   adev->ip_blocks[i].version->funcs->name, r);
2794                         goto init_failed;
2795                 }
2796                 adev->ip_blocks[i].status.sw = true;
2797
2798                 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON) {
2799                         /* need to do common hw init early so everything is set up for gmc */
2800                         r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev);
2801                         if (r) {
2802                                 DRM_ERROR("hw_init %d failed %d\n", i, r);
2803                                 goto init_failed;
2804                         }
2805                         adev->ip_blocks[i].status.hw = true;
2806                 } else if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
2807                         /* need to do gmc hw init early so we can allocate gpu mem */
2808                         /* Try to reserve bad pages early */
2809                         if (amdgpu_sriov_vf(adev))
2810                                 amdgpu_virt_exchange_data(adev);
2811
2812                         r = amdgpu_device_mem_scratch_init(adev);
2813                         if (r) {
2814                                 DRM_ERROR("amdgpu_mem_scratch_init failed %d\n", r);
2815                                 goto init_failed;
2816                         }
2817                         r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev);
2818                         if (r) {
2819                                 DRM_ERROR("hw_init %d failed %d\n", i, r);
2820                                 goto init_failed;
2821                         }
2822                         r = amdgpu_device_wb_init(adev);
2823                         if (r) {
2824                                 DRM_ERROR("amdgpu_device_wb_init failed %d\n", r);
2825                                 goto init_failed;
2826                         }
2827                         adev->ip_blocks[i].status.hw = true;
2828
2829                         /* right after GMC hw init, we create CSA */
2830                         if (adev->gfx.mcbp) {
2831                                 r = amdgpu_allocate_static_csa(adev, &adev->virt.csa_obj,
2832                                                                AMDGPU_GEM_DOMAIN_VRAM |
2833                                                                AMDGPU_GEM_DOMAIN_GTT,
2834                                                                AMDGPU_CSA_SIZE);
2835                                 if (r) {
2836                                         DRM_ERROR("allocate CSA failed %d\n", r);
2837                                         goto init_failed;
2838                                 }
2839                         }
2840
2841                         r = amdgpu_seq64_init(adev);
2842                         if (r) {
2843                                 DRM_ERROR("allocate seq64 failed %d\n", r);
2844                                 goto init_failed;
2845                         }
2846                 }
2847         }
2848
2849         if (amdgpu_sriov_vf(adev))
2850                 amdgpu_virt_init_data_exchange(adev);
2851
2852         r = amdgpu_ib_pool_init(adev);
2853         if (r) {
2854                 dev_err(adev->dev, "IB initialization failed (%d).\n", r);
2855                 amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_IB_INIT_FAIL, 0, r);
2856                 goto init_failed;
2857         }
2858
2859         r = amdgpu_ucode_create_bo(adev); /* create ucode bo when sw_init complete*/
2860         if (r)
2861                 goto init_failed;
2862
2863         r = amdgpu_device_ip_hw_init_phase1(adev);
2864         if (r)
2865                 goto init_failed;
2866
2867         r = amdgpu_device_fw_loading(adev);
2868         if (r)
2869                 goto init_failed;
2870
2871         r = amdgpu_device_ip_hw_init_phase2(adev);
2872         if (r)
2873                 goto init_failed;
2874
2875         /*
2876          * retired pages will be loaded from eeprom and reserved here,
2877          * it should be called after amdgpu_device_ip_hw_init_phase2  since
2878          * for some ASICs the RAS EEPROM code relies on SMU fully functioning
2879          * for I2C communication which only true at this point.
2880          *
2881          * amdgpu_ras_recovery_init may fail, but the upper only cares the
2882          * failure from bad gpu situation and stop amdgpu init process
2883          * accordingly. For other failed cases, it will still release all
2884          * the resource and print error message, rather than returning one
2885          * negative value to upper level.
2886          *
2887          * Note: theoretically, this should be called before all vram allocations
2888          * to protect retired page from abusing
2889          */
2890         r = amdgpu_ras_recovery_init(adev);
2891         if (r)
2892                 goto init_failed;
2893
2894         /**
2895          * In case of XGMI grab extra reference for reset domain for this device
2896          */
2897         if (adev->gmc.xgmi.num_physical_nodes > 1) {
2898                 if (amdgpu_xgmi_add_device(adev) == 0) {
2899                         if (!amdgpu_sriov_vf(adev)) {
2900                                 struct amdgpu_hive_info *hive = amdgpu_get_xgmi_hive(adev);
2901
2902                                 if (WARN_ON(!hive)) {
2903                                         r = -ENOENT;
2904                                         goto init_failed;
2905                                 }
2906
2907                                 if (!hive->reset_domain ||
2908                                     !amdgpu_reset_get_reset_domain(hive->reset_domain)) {
2909                                         r = -ENOENT;
2910                                         amdgpu_put_xgmi_hive(hive);
2911                                         goto init_failed;
2912                                 }
2913
2914                                 /* Drop the early temporary reset domain we created for device */
2915                                 amdgpu_reset_put_reset_domain(adev->reset_domain);
2916                                 adev->reset_domain = hive->reset_domain;
2917                                 amdgpu_put_xgmi_hive(hive);
2918                         }
2919                 }
2920         }
2921
2922         r = amdgpu_device_init_schedulers(adev);
2923         if (r)
2924                 goto init_failed;
2925
2926         if (adev->mman.buffer_funcs_ring->sched.ready)
2927                 amdgpu_ttm_set_buffer_funcs_status(adev, true);
2928
2929         /* Don't init kfd if whole hive need to be reset during init */
2930         if (!adev->gmc.xgmi.pending_reset) {
2931                 kgd2kfd_init_zone_device(adev);
2932                 amdgpu_amdkfd_device_init(adev);
2933         }
2934
2935         amdgpu_fru_get_product_info(adev);
2936
2937 init_failed:
2938
2939         return r;
2940 }
2941
2942 /**
2943  * amdgpu_device_fill_reset_magic - writes reset magic to gart pointer
2944  *
2945  * @adev: amdgpu_device pointer
2946  *
2947  * Writes a reset magic value to the gart pointer in VRAM.  The driver calls
2948  * this function before a GPU reset.  If the value is retained after a
2949  * GPU reset, VRAM has not been lost.  Some GPU resets may destry VRAM contents.
2950  */
2951 static void amdgpu_device_fill_reset_magic(struct amdgpu_device *adev)
2952 {
2953         memcpy(adev->reset_magic, adev->gart.ptr, AMDGPU_RESET_MAGIC_NUM);
2954 }
2955
2956 /**
2957  * amdgpu_device_check_vram_lost - check if vram is valid
2958  *
2959  * @adev: amdgpu_device pointer
2960  *
2961  * Checks the reset magic value written to the gart pointer in VRAM.
2962  * The driver calls this after a GPU reset to see if the contents of
2963  * VRAM is lost or now.
2964  * returns true if vram is lost, false if not.
2965  */
2966 static bool amdgpu_device_check_vram_lost(struct amdgpu_device *adev)
2967 {
2968         if (memcmp(adev->gart.ptr, adev->reset_magic,
2969                         AMDGPU_RESET_MAGIC_NUM))
2970                 return true;
2971
2972         if (!amdgpu_in_reset(adev))
2973                 return false;
2974
2975         /*
2976          * For all ASICs with baco/mode1 reset, the VRAM is
2977          * always assumed to be lost.
2978          */
2979         switch (amdgpu_asic_reset_method(adev)) {
2980         case AMD_RESET_METHOD_BACO:
2981         case AMD_RESET_METHOD_MODE1:
2982                 return true;
2983         default:
2984                 return false;
2985         }
2986 }
2987
2988 /**
2989  * amdgpu_device_set_cg_state - set clockgating for amdgpu device
2990  *
2991  * @adev: amdgpu_device pointer
2992  * @state: clockgating state (gate or ungate)
2993  *
2994  * The list of all the hardware IPs that make up the asic is walked and the
2995  * set_clockgating_state callbacks are run.
2996  * Late initialization pass enabling clockgating for hardware IPs.
2997  * Fini or suspend, pass disabling clockgating for hardware IPs.
2998  * Returns 0 on success, negative error code on failure.
2999  */
3000
3001 int amdgpu_device_set_cg_state(struct amdgpu_device *adev,
3002                                enum amd_clockgating_state state)
3003 {
3004         int i, j, r;
3005
3006         if (amdgpu_emu_mode == 1)
3007                 return 0;
3008
3009         for (j = 0; j < adev->num_ip_blocks; j++) {
3010                 i = state == AMD_CG_STATE_GATE ? j : adev->num_ip_blocks - j - 1;
3011                 if (!adev->ip_blocks[i].status.late_initialized)
3012                         continue;
3013                 /* skip CG for GFX, SDMA on S0ix */
3014                 if (adev->in_s0ix &&
3015                     (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX ||
3016                      adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SDMA))
3017                         continue;
3018                 /* skip CG for VCE/UVD, it's handled specially */
3019                 if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
3020                     adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE &&
3021                     adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCN &&
3022                     adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_JPEG &&
3023                     adev->ip_blocks[i].version->funcs->set_clockgating_state) {
3024                         /* enable clockgating to save power */
3025                         r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
3026                                                                                      state);
3027                         if (r) {
3028                                 DRM_ERROR("set_clockgating_state(gate) of IP block <%s> failed %d\n",
3029                                           adev->ip_blocks[i].version->funcs->name, r);
3030                                 return r;
3031                         }
3032                 }
3033         }
3034
3035         return 0;
3036 }
3037
3038 int amdgpu_device_set_pg_state(struct amdgpu_device *adev,
3039                                enum amd_powergating_state state)
3040 {
3041         int i, j, r;
3042
3043         if (amdgpu_emu_mode == 1)
3044                 return 0;
3045
3046         for (j = 0; j < adev->num_ip_blocks; j++) {
3047                 i = state == AMD_PG_STATE_GATE ? j : adev->num_ip_blocks - j - 1;
3048                 if (!adev->ip_blocks[i].status.late_initialized)
3049                         continue;
3050                 /* skip PG for GFX, SDMA on S0ix */
3051                 if (adev->in_s0ix &&
3052                     (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX ||
3053                      adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SDMA))
3054                         continue;
3055                 /* skip CG for VCE/UVD, it's handled specially */
3056                 if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
3057                     adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE &&
3058                     adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCN &&
3059                     adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_JPEG &&
3060                     adev->ip_blocks[i].version->funcs->set_powergating_state) {
3061                         /* enable powergating to save power */
3062                         r = adev->ip_blocks[i].version->funcs->set_powergating_state((void *)adev,
3063                                                                                         state);
3064                         if (r) {
3065                                 DRM_ERROR("set_powergating_state(gate) of IP block <%s> failed %d\n",
3066                                           adev->ip_blocks[i].version->funcs->name, r);
3067                                 return r;
3068                         }
3069                 }
3070         }
3071         return 0;
3072 }
3073
3074 static int amdgpu_device_enable_mgpu_fan_boost(void)
3075 {
3076         struct amdgpu_gpu_instance *gpu_ins;
3077         struct amdgpu_device *adev;
3078         int i, ret = 0;
3079
3080         mutex_lock(&mgpu_info.mutex);
3081
3082         /*
3083          * MGPU fan boost feature should be enabled
3084          * only when there are two or more dGPUs in
3085          * the system
3086          */
3087         if (mgpu_info.num_dgpu < 2)
3088                 goto out;
3089
3090         for (i = 0; i < mgpu_info.num_dgpu; i++) {
3091                 gpu_ins = &(mgpu_info.gpu_ins[i]);
3092                 adev = gpu_ins->adev;
3093                 if (!(adev->flags & AMD_IS_APU) &&
3094                     !gpu_ins->mgpu_fan_enabled) {
3095                         ret = amdgpu_dpm_enable_mgpu_fan_boost(adev);
3096                         if (ret)
3097                                 break;
3098
3099                         gpu_ins->mgpu_fan_enabled = 1;
3100                 }
3101         }
3102
3103 out:
3104         mutex_unlock(&mgpu_info.mutex);
3105
3106         return ret;
3107 }
3108
3109 /**
3110  * amdgpu_device_ip_late_init - run late init for hardware IPs
3111  *
3112  * @adev: amdgpu_device pointer
3113  *
3114  * Late initialization pass for hardware IPs.  The list of all the hardware
3115  * IPs that make up the asic is walked and the late_init callbacks are run.
3116  * late_init covers any special initialization that an IP requires
3117  * after all of the have been initialized or something that needs to happen
3118  * late in the init process.
3119  * Returns 0 on success, negative error code on failure.
3120  */
3121 static int amdgpu_device_ip_late_init(struct amdgpu_device *adev)
3122 {
3123         struct amdgpu_gpu_instance *gpu_instance;
3124         int i = 0, r;
3125
3126         for (i = 0; i < adev->num_ip_blocks; i++) {
3127                 if (!adev->ip_blocks[i].status.hw)
3128                         continue;
3129                 if (adev->ip_blocks[i].version->funcs->late_init) {
3130                         r = adev->ip_blocks[i].version->funcs->late_init((void *)adev);
3131                         if (r) {
3132                                 DRM_ERROR("late_init of IP block <%s> failed %d\n",
3133                                           adev->ip_blocks[i].version->funcs->name, r);
3134                                 return r;
3135                         }
3136                 }
3137                 adev->ip_blocks[i].status.late_initialized = true;
3138         }
3139
3140         r = amdgpu_ras_late_init(adev);
3141         if (r) {
3142                 DRM_ERROR("amdgpu_ras_late_init failed %d", r);
3143                 return r;
3144         }
3145
3146         amdgpu_ras_set_error_query_ready(adev, true);
3147
3148         amdgpu_device_set_cg_state(adev, AMD_CG_STATE_GATE);
3149         amdgpu_device_set_pg_state(adev, AMD_PG_STATE_GATE);
3150
3151         amdgpu_device_fill_reset_magic(adev);
3152
3153         r = amdgpu_device_enable_mgpu_fan_boost();
3154         if (r)
3155                 DRM_ERROR("enable mgpu fan boost failed (%d).\n", r);
3156
3157         /* For passthrough configuration on arcturus and aldebaran, enable special handling SBR */
3158         if (amdgpu_passthrough(adev) &&
3159             ((adev->asic_type == CHIP_ARCTURUS && adev->gmc.xgmi.num_physical_nodes > 1) ||
3160              adev->asic_type == CHIP_ALDEBARAN))
3161                 amdgpu_dpm_handle_passthrough_sbr(adev, true);
3162
3163         if (adev->gmc.xgmi.num_physical_nodes > 1) {
3164                 mutex_lock(&mgpu_info.mutex);
3165
3166                 /*
3167                  * Reset device p-state to low as this was booted with high.
3168                  *
3169                  * This should be performed only after all devices from the same
3170                  * hive get initialized.
3171                  *
3172                  * However, it's unknown how many device in the hive in advance.
3173                  * As this is counted one by one during devices initializations.
3174                  *
3175                  * So, we wait for all XGMI interlinked devices initialized.
3176                  * This may bring some delays as those devices may come from
3177                  * different hives. But that should be OK.
3178                  */
3179                 if (mgpu_info.num_dgpu == adev->gmc.xgmi.num_physical_nodes) {
3180                         for (i = 0; i < mgpu_info.num_gpu; i++) {
3181                                 gpu_instance = &(mgpu_info.gpu_ins[i]);
3182                                 if (gpu_instance->adev->flags & AMD_IS_APU)
3183                                         continue;
3184
3185                                 r = amdgpu_xgmi_set_pstate(gpu_instance->adev,
3186                                                 AMDGPU_XGMI_PSTATE_MIN);
3187                                 if (r) {
3188                                         DRM_ERROR("pstate setting failed (%d).\n", r);
3189                                         break;
3190                                 }
3191                         }
3192                 }
3193
3194                 mutex_unlock(&mgpu_info.mutex);
3195         }
3196
3197         return 0;
3198 }
3199
3200 /**
3201  * amdgpu_device_smu_fini_early - smu hw_fini wrapper
3202  *
3203  * @adev: amdgpu_device pointer
3204  *
3205  * For ASICs need to disable SMC first
3206  */
3207 static void amdgpu_device_smu_fini_early(struct amdgpu_device *adev)
3208 {
3209         int i, r;
3210
3211         if (amdgpu_ip_version(adev, GC_HWIP, 0) > IP_VERSION(9, 0, 0))
3212                 return;
3213
3214         for (i = 0; i < adev->num_ip_blocks; i++) {
3215                 if (!adev->ip_blocks[i].status.hw)
3216                         continue;
3217                 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) {
3218                         r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev);
3219                         /* XXX handle errors */
3220                         if (r) {
3221                                 DRM_DEBUG("hw_fini of IP block <%s> failed %d\n",
3222                                           adev->ip_blocks[i].version->funcs->name, r);
3223                         }
3224                         adev->ip_blocks[i].status.hw = false;
3225                         break;
3226                 }
3227         }
3228 }
3229
3230 static int amdgpu_device_ip_fini_early(struct amdgpu_device *adev)
3231 {
3232         int i, r;
3233
3234         for (i = 0; i < adev->num_ip_blocks; i++) {
3235                 if (!adev->ip_blocks[i].version->funcs->early_fini)
3236                         continue;
3237
3238                 r = adev->ip_blocks[i].version->funcs->early_fini((void *)adev);
3239                 if (r) {
3240                         DRM_DEBUG("early_fini of IP block <%s> failed %d\n",
3241                                   adev->ip_blocks[i].version->funcs->name, r);
3242                 }
3243         }
3244
3245         amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE);
3246         amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE);
3247
3248         amdgpu_amdkfd_suspend(adev, false);
3249
3250         /* Workaroud for ASICs need to disable SMC first */
3251         amdgpu_device_smu_fini_early(adev);
3252
3253         for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
3254                 if (!adev->ip_blocks[i].status.hw)
3255                         continue;
3256
3257                 r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev);
3258                 /* XXX handle errors */
3259                 if (r) {
3260                         DRM_DEBUG("hw_fini of IP block <%s> failed %d\n",
3261                                   adev->ip_blocks[i].version->funcs->name, r);
3262                 }
3263
3264                 adev->ip_blocks[i].status.hw = false;
3265         }
3266
3267         if (amdgpu_sriov_vf(adev)) {
3268                 if (amdgpu_virt_release_full_gpu(adev, false))
3269                         DRM_ERROR("failed to release exclusive mode on fini\n");
3270         }
3271
3272         return 0;
3273 }
3274
3275 /**
3276  * amdgpu_device_ip_fini - run fini for hardware IPs
3277  *
3278  * @adev: amdgpu_device pointer
3279  *
3280  * Main teardown pass for hardware IPs.  The list of all the hardware
3281  * IPs that make up the asic is walked and the hw_fini and sw_fini callbacks
3282  * are run.  hw_fini tears down the hardware associated with each IP
3283  * and sw_fini tears down any software state associated with each IP.
3284  * Returns 0 on success, negative error code on failure.
3285  */
3286 static int amdgpu_device_ip_fini(struct amdgpu_device *adev)
3287 {
3288         int i, r;
3289
3290         if (amdgpu_sriov_vf(adev) && adev->virt.ras_init_done)
3291                 amdgpu_virt_release_ras_err_handler_data(adev);
3292
3293         if (adev->gmc.xgmi.num_physical_nodes > 1)
3294                 amdgpu_xgmi_remove_device(adev);
3295
3296         amdgpu_amdkfd_device_fini_sw(adev);
3297
3298         for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
3299                 if (!adev->ip_blocks[i].status.sw)
3300                         continue;
3301
3302                 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
3303                         amdgpu_ucode_free_bo(adev);
3304                         amdgpu_free_static_csa(&adev->virt.csa_obj);
3305                         amdgpu_device_wb_fini(adev);
3306                         amdgpu_device_mem_scratch_fini(adev);
3307                         amdgpu_ib_pool_fini(adev);
3308                         amdgpu_seq64_fini(adev);
3309                 }
3310
3311                 r = adev->ip_blocks[i].version->funcs->sw_fini((void *)adev);
3312                 /* XXX handle errors */
3313                 if (r) {
3314                         DRM_DEBUG("sw_fini of IP block <%s> failed %d\n",
3315                                   adev->ip_blocks[i].version->funcs->name, r);
3316                 }
3317                 adev->ip_blocks[i].status.sw = false;
3318                 adev->ip_blocks[i].status.valid = false;
3319         }
3320
3321         for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
3322                 if (!adev->ip_blocks[i].status.late_initialized)
3323                         continue;
3324                 if (adev->ip_blocks[i].version->funcs->late_fini)
3325                         adev->ip_blocks[i].version->funcs->late_fini((void *)adev);
3326                 adev->ip_blocks[i].status.late_initialized = false;
3327         }
3328
3329         amdgpu_ras_fini(adev);
3330
3331         return 0;
3332 }
3333
3334 /**
3335  * amdgpu_device_delayed_init_work_handler - work handler for IB tests
3336  *
3337  * @work: work_struct.
3338  */
3339 static void amdgpu_device_delayed_init_work_handler(struct work_struct *work)
3340 {
3341         struct amdgpu_device *adev =
3342                 container_of(work, struct amdgpu_device, delayed_init_work.work);
3343         int r;
3344
3345         r = amdgpu_ib_ring_tests(adev);
3346         if (r)
3347                 DRM_ERROR("ib ring test failed (%d).\n", r);
3348 }
3349
3350 static void amdgpu_device_delay_enable_gfx_off(struct work_struct *work)
3351 {
3352         struct amdgpu_device *adev =
3353                 container_of(work, struct amdgpu_device, gfx.gfx_off_delay_work.work);
3354
3355         WARN_ON_ONCE(adev->gfx.gfx_off_state);
3356         WARN_ON_ONCE(adev->gfx.gfx_off_req_count);
3357
3358         if (!amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, true))
3359                 adev->gfx.gfx_off_state = true;
3360 }
3361
3362 /**
3363  * amdgpu_device_ip_suspend_phase1 - run suspend for hardware IPs (phase 1)
3364  *
3365  * @adev: amdgpu_device pointer
3366  *
3367  * Main suspend function for hardware IPs.  The list of all the hardware
3368  * IPs that make up the asic is walked, clockgating is disabled and the
3369  * suspend callbacks are run.  suspend puts the hardware and software state
3370  * in each IP into a state suitable for suspend.
3371  * Returns 0 on success, negative error code on failure.
3372  */
3373 static int amdgpu_device_ip_suspend_phase1(struct amdgpu_device *adev)
3374 {
3375         int i, r;
3376
3377         amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE);
3378         amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE);
3379
3380         /*
3381          * Per PMFW team's suggestion, driver needs to handle gfxoff
3382          * and df cstate features disablement for gpu reset(e.g. Mode1Reset)
3383          * scenario. Add the missing df cstate disablement here.
3384          */
3385         if (amdgpu_dpm_set_df_cstate(adev, DF_CSTATE_DISALLOW))
3386                 dev_warn(adev->dev, "Failed to disallow df cstate");
3387
3388         for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
3389                 if (!adev->ip_blocks[i].status.valid)
3390                         continue;
3391
3392                 /* displays are handled separately */
3393                 if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_DCE)
3394                         continue;
3395
3396                 /* XXX handle errors */
3397                 r = adev->ip_blocks[i].version->funcs->suspend(adev);
3398                 /* XXX handle errors */
3399                 if (r) {
3400                         DRM_ERROR("suspend of IP block <%s> failed %d\n",
3401                                   adev->ip_blocks[i].version->funcs->name, r);
3402                         return r;
3403                 }
3404
3405                 adev->ip_blocks[i].status.hw = false;
3406         }
3407
3408         return 0;
3409 }
3410
3411 /**
3412  * amdgpu_device_ip_suspend_phase2 - run suspend for hardware IPs (phase 2)
3413  *
3414  * @adev: amdgpu_device pointer
3415  *
3416  * Main suspend function for hardware IPs.  The list of all the hardware
3417  * IPs that make up the asic is walked, clockgating is disabled and the
3418  * suspend callbacks are run.  suspend puts the hardware and software state
3419  * in each IP into a state suitable for suspend.
3420  * Returns 0 on success, negative error code on failure.
3421  */
3422 static int amdgpu_device_ip_suspend_phase2(struct amdgpu_device *adev)
3423 {
3424         int i, r;
3425
3426         if (adev->in_s0ix)
3427                 amdgpu_dpm_gfx_state_change(adev, sGpuChangeState_D3Entry);
3428
3429         for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
3430                 if (!adev->ip_blocks[i].status.valid)
3431                         continue;
3432                 /* displays are handled in phase1 */
3433                 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE)
3434                         continue;
3435                 /* PSP lost connection when err_event_athub occurs */
3436                 if (amdgpu_ras_intr_triggered() &&
3437                     adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP) {
3438                         adev->ip_blocks[i].status.hw = false;
3439                         continue;
3440                 }
3441
3442                 /* skip unnecessary suspend if we do not initialize them yet */
3443                 if (adev->gmc.xgmi.pending_reset &&
3444                     !(adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||
3445                       adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC ||
3446                       adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||
3447                       adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH)) {
3448                         adev->ip_blocks[i].status.hw = false;
3449                         continue;
3450                 }
3451
3452                 /* skip suspend of gfx/mes and psp for S0ix
3453                  * gfx is in gfxoff state, so on resume it will exit gfxoff just
3454                  * like at runtime. PSP is also part of the always on hardware
3455                  * so no need to suspend it.
3456                  */
3457                 if (adev->in_s0ix &&
3458                     (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP ||
3459                      adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX ||
3460                      adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_MES))
3461                         continue;
3462
3463                 /* SDMA 5.x+ is part of GFX power domain so it's covered by GFXOFF */
3464                 if (adev->in_s0ix &&
3465                     (amdgpu_ip_version(adev, SDMA0_HWIP, 0) >=
3466                      IP_VERSION(5, 0, 0)) &&
3467                     (adev->ip_blocks[i].version->type ==
3468                      AMD_IP_BLOCK_TYPE_SDMA))
3469                         continue;
3470
3471                 /* Once swPSP provides the IMU, RLC FW binaries to TOS during cold-boot.
3472                  * These are in TMR, hence are expected to be reused by PSP-TOS to reload
3473                  * from this location and RLC Autoload automatically also gets loaded
3474                  * from here based on PMFW -> PSP message during re-init sequence.
3475                  * Therefore, the psp suspend & resume should be skipped to avoid destroy
3476                  * the TMR and reload FWs again for IMU enabled APU ASICs.
3477                  */
3478                 if (amdgpu_in_reset(adev) &&
3479                     (adev->flags & AMD_IS_APU) && adev->gfx.imu.funcs &&
3480                     adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP)
3481                         continue;
3482
3483                 /* XXX handle errors */
3484                 r = adev->ip_blocks[i].version->funcs->suspend(adev);
3485                 /* XXX handle errors */
3486                 if (r) {
3487                         DRM_ERROR("suspend of IP block <%s> failed %d\n",
3488                                   adev->ip_blocks[i].version->funcs->name, r);
3489                 }
3490                 adev->ip_blocks[i].status.hw = false;
3491                 /* handle putting the SMC in the appropriate state */
3492                 if (!amdgpu_sriov_vf(adev)) {
3493                         if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) {
3494                                 r = amdgpu_dpm_set_mp1_state(adev, adev->mp1_state);
3495                                 if (r) {
3496                                         DRM_ERROR("SMC failed to set mp1 state %d, %d\n",
3497                                                         adev->mp1_state, r);
3498                                         return r;
3499                                 }
3500                         }
3501                 }
3502         }
3503
3504         return 0;
3505 }
3506
3507 /**
3508  * amdgpu_device_ip_suspend - run suspend for hardware IPs
3509  *
3510  * @adev: amdgpu_device pointer
3511  *
3512  * Main suspend function for hardware IPs.  The list of all the hardware
3513  * IPs that make up the asic is walked, clockgating is disabled and the
3514  * suspend callbacks are run.  suspend puts the hardware and software state
3515  * in each IP into a state suitable for suspend.
3516  * Returns 0 on success, negative error code on failure.
3517  */
3518 int amdgpu_device_ip_suspend(struct amdgpu_device *adev)
3519 {
3520         int r;
3521
3522         if (amdgpu_sriov_vf(adev)) {
3523                 amdgpu_virt_fini_data_exchange(adev);
3524                 amdgpu_virt_request_full_gpu(adev, false);
3525         }
3526
3527         amdgpu_ttm_set_buffer_funcs_status(adev, false);
3528
3529         r = amdgpu_device_ip_suspend_phase1(adev);
3530         if (r)
3531                 return r;
3532         r = amdgpu_device_ip_suspend_phase2(adev);
3533
3534         if (amdgpu_sriov_vf(adev))
3535                 amdgpu_virt_release_full_gpu(adev, false);
3536
3537         return r;
3538 }
3539
3540 static int amdgpu_device_ip_reinit_early_sriov(struct amdgpu_device *adev)
3541 {
3542         int i, r;
3543
3544         static enum amd_ip_block_type ip_order[] = {
3545                 AMD_IP_BLOCK_TYPE_COMMON,
3546                 AMD_IP_BLOCK_TYPE_GMC,
3547                 AMD_IP_BLOCK_TYPE_PSP,
3548                 AMD_IP_BLOCK_TYPE_IH,
3549         };
3550
3551         for (i = 0; i < adev->num_ip_blocks; i++) {
3552                 int j;
3553                 struct amdgpu_ip_block *block;
3554
3555                 block = &adev->ip_blocks[i];
3556                 block->status.hw = false;
3557
3558                 for (j = 0; j < ARRAY_SIZE(ip_order); j++) {
3559
3560                         if (block->version->type != ip_order[j] ||
3561                                 !block->status.valid)
3562                                 continue;
3563
3564                         r = block->version->funcs->hw_init(adev);
3565                         DRM_INFO("RE-INIT-early: %s %s\n", block->version->funcs->name, r?"failed":"succeeded");
3566                         if (r)
3567                                 return r;
3568                         block->status.hw = true;
3569                 }
3570         }
3571
3572         return 0;
3573 }
3574
3575 static int amdgpu_device_ip_reinit_late_sriov(struct amdgpu_device *adev)
3576 {
3577         int i, r;
3578
3579         static enum amd_ip_block_type ip_order[] = {
3580                 AMD_IP_BLOCK_TYPE_SMC,
3581                 AMD_IP_BLOCK_TYPE_DCE,
3582                 AMD_IP_BLOCK_TYPE_GFX,
3583                 AMD_IP_BLOCK_TYPE_SDMA,
3584                 AMD_IP_BLOCK_TYPE_MES,
3585                 AMD_IP_BLOCK_TYPE_UVD,
3586                 AMD_IP_BLOCK_TYPE_VCE,
3587                 AMD_IP_BLOCK_TYPE_VCN,
3588                 AMD_IP_BLOCK_TYPE_JPEG
3589         };
3590
3591         for (i = 0; i < ARRAY_SIZE(ip_order); i++) {
3592                 int j;
3593                 struct amdgpu_ip_block *block;
3594
3595                 for (j = 0; j < adev->num_ip_blocks; j++) {
3596                         block = &adev->ip_blocks[j];
3597
3598                         if (block->version->type != ip_order[i] ||
3599                                 !block->status.valid ||
3600                                 block->status.hw)
3601                                 continue;
3602
3603                         if (block->version->type == AMD_IP_BLOCK_TYPE_SMC)
3604                                 r = block->version->funcs->resume(adev);
3605                         else
3606                                 r = block->version->funcs->hw_init(adev);
3607
3608                         DRM_INFO("RE-INIT-late: %s %s\n", block->version->funcs->name, r?"failed":"succeeded");
3609                         if (r)
3610                                 return r;
3611                         block->status.hw = true;
3612                 }
3613         }
3614
3615         return 0;
3616 }
3617
3618 /**
3619  * amdgpu_device_ip_resume_phase1 - run resume for hardware IPs
3620  *
3621  * @adev: amdgpu_device pointer
3622  *
3623  * First resume function for hardware IPs.  The list of all the hardware
3624  * IPs that make up the asic is walked and the resume callbacks are run for
3625  * COMMON, GMC, and IH.  resume puts the hardware into a functional state
3626  * after a suspend and updates the software state as necessary.  This
3627  * function is also used for restoring the GPU after a GPU reset.
3628  * Returns 0 on success, negative error code on failure.
3629  */
3630 static int amdgpu_device_ip_resume_phase1(struct amdgpu_device *adev)
3631 {
3632         int i, r;
3633
3634         for (i = 0; i < adev->num_ip_blocks; i++) {
3635                 if (!adev->ip_blocks[i].status.valid || adev->ip_blocks[i].status.hw)
3636                         continue;
3637                 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||
3638                     adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||
3639                     adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH ||
3640                     (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP && amdgpu_sriov_vf(adev))) {
3641
3642                         r = adev->ip_blocks[i].version->funcs->resume(adev);
3643                         if (r) {
3644                                 DRM_ERROR("resume of IP block <%s> failed %d\n",
3645                                           adev->ip_blocks[i].version->funcs->name, r);
3646                                 return r;
3647                         }
3648                         adev->ip_blocks[i].status.hw = true;
3649                 }
3650         }
3651
3652         return 0;
3653 }
3654
3655 /**
3656  * amdgpu_device_ip_resume_phase2 - run resume for hardware IPs
3657  *
3658  * @adev: amdgpu_device pointer
3659  *
3660  * First resume function for hardware IPs.  The list of all the hardware
3661  * IPs that make up the asic is walked and the resume callbacks are run for
3662  * all blocks except COMMON, GMC, and IH.  resume puts the hardware into a
3663  * functional state after a suspend and updates the software state as
3664  * necessary.  This function is also used for restoring the GPU after a GPU
3665  * reset.
3666  * Returns 0 on success, negative error code on failure.
3667  */
3668 static int amdgpu_device_ip_resume_phase2(struct amdgpu_device *adev)
3669 {
3670         int i, r;
3671
3672         for (i = 0; i < adev->num_ip_blocks; i++) {
3673                 if (!adev->ip_blocks[i].status.valid || adev->ip_blocks[i].status.hw)
3674                         continue;
3675                 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||
3676                     adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||
3677                     adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH ||
3678                     adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP)
3679                         continue;
3680                 r = adev->ip_blocks[i].version->funcs->resume(adev);
3681                 if (r) {
3682                         DRM_ERROR("resume of IP block <%s> failed %d\n",
3683                                   adev->ip_blocks[i].version->funcs->name, r);
3684                         return r;
3685                 }
3686                 adev->ip_blocks[i].status.hw = true;
3687         }
3688
3689         return 0;
3690 }
3691
3692 /**
3693  * amdgpu_device_ip_resume - run resume for hardware IPs
3694  *
3695  * @adev: amdgpu_device pointer
3696  *
3697  * Main resume function for hardware IPs.  The hardware IPs
3698  * are split into two resume functions because they are
3699  * also used in recovering from a GPU reset and some additional
3700  * steps need to be take between them.  In this case (S3/S4) they are
3701  * run sequentially.
3702  * Returns 0 on success, negative error code on failure.
3703  */
3704 static int amdgpu_device_ip_resume(struct amdgpu_device *adev)
3705 {
3706         int r;
3707
3708         r = amdgpu_device_ip_resume_phase1(adev);
3709         if (r)
3710                 return r;
3711
3712         r = amdgpu_device_fw_loading(adev);
3713         if (r)
3714                 return r;
3715
3716         r = amdgpu_device_ip_resume_phase2(adev);
3717
3718         if (adev->mman.buffer_funcs_ring->sched.ready)
3719                 amdgpu_ttm_set_buffer_funcs_status(adev, true);
3720
3721         return r;
3722 }
3723
3724 /**
3725  * amdgpu_device_detect_sriov_bios - determine if the board supports SR-IOV
3726  *
3727  * @adev: amdgpu_device pointer
3728  *
3729  * Query the VBIOS data tables to determine if the board supports SR-IOV.
3730  */
3731 static void amdgpu_device_detect_sriov_bios(struct amdgpu_device *adev)
3732 {
3733         if (amdgpu_sriov_vf(adev)) {
3734                 if (adev->is_atom_fw) {
3735                         if (amdgpu_atomfirmware_gpu_virtualization_supported(adev))
3736                                 adev->virt.caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;
3737                 } else {
3738                         if (amdgpu_atombios_has_gpu_virtualization_table(adev))
3739                                 adev->virt.caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;
3740                 }
3741
3742                 if (!(adev->virt.caps & AMDGPU_SRIOV_CAPS_SRIOV_VBIOS))
3743                         amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_NO_VBIOS, 0, 0);
3744         }
3745 }
3746
3747 /**
3748  * amdgpu_device_asic_has_dc_support - determine if DC supports the asic
3749  *
3750  * @asic_type: AMD asic type
3751  *
3752  * Check if there is DC (new modesetting infrastructre) support for an asic.
3753  * returns true if DC has support, false if not.
3754  */
3755 bool amdgpu_device_asic_has_dc_support(enum amd_asic_type asic_type)
3756 {
3757         switch (asic_type) {
3758 #ifdef CONFIG_DRM_AMDGPU_SI
3759         case CHIP_HAINAN:
3760 #endif
3761         case CHIP_TOPAZ:
3762                 /* chips with no display hardware */
3763                 return false;
3764 #if defined(CONFIG_DRM_AMD_DC)
3765         case CHIP_TAHITI:
3766         case CHIP_PITCAIRN:
3767         case CHIP_VERDE:
3768         case CHIP_OLAND:
3769                 /*
3770                  * We have systems in the wild with these ASICs that require
3771                  * LVDS and VGA support which is not supported with DC.
3772                  *
3773                  * Fallback to the non-DC driver here by default so as not to
3774                  * cause regressions.
3775                  */
3776 #if defined(CONFIG_DRM_AMD_DC_SI)
3777                 return amdgpu_dc > 0;
3778 #else
3779                 return false;
3780 #endif
3781         case CHIP_BONAIRE:
3782         case CHIP_KAVERI:
3783         case CHIP_KABINI:
3784         case CHIP_MULLINS:
3785                 /*
3786                  * We have systems in the wild with these ASICs that require
3787                  * VGA support which is not supported with DC.
3788                  *
3789                  * Fallback to the non-DC driver here by default so as not to
3790                  * cause regressions.
3791                  */
3792                 return amdgpu_dc > 0;
3793         default:
3794                 return amdgpu_dc != 0;
3795 #else
3796         default:
3797                 if (amdgpu_dc > 0)
3798                         DRM_INFO_ONCE("Display Core has been requested via kernel parameter but isn't supported by ASIC, ignoring\n");
3799                 return false;
3800 #endif
3801         }
3802 }
3803
3804 /**
3805  * amdgpu_device_has_dc_support - check if dc is supported
3806  *
3807  * @adev: amdgpu_device pointer
3808  *
3809  * Returns true for supported, false for not supported
3810  */
3811 bool amdgpu_device_has_dc_support(struct amdgpu_device *adev)
3812 {
3813         if (adev->enable_virtual_display ||
3814             (adev->harvest_ip_mask & AMD_HARVEST_IP_DMU_MASK))
3815                 return false;
3816
3817         return amdgpu_device_asic_has_dc_support(adev->asic_type);
3818 }
3819
3820 static void amdgpu_device_xgmi_reset_func(struct work_struct *__work)
3821 {
3822         struct amdgpu_device *adev =
3823                 container_of(__work, struct amdgpu_device, xgmi_reset_work);
3824         struct amdgpu_hive_info *hive = amdgpu_get_xgmi_hive(adev);
3825
3826         /* It's a bug to not have a hive within this function */
3827         if (WARN_ON(!hive))
3828                 return;
3829
3830         /*
3831          * Use task barrier to synchronize all xgmi reset works across the
3832          * hive. task_barrier_enter and task_barrier_exit will block
3833          * until all the threads running the xgmi reset works reach
3834          * those points. task_barrier_full will do both blocks.
3835          */
3836         if (amdgpu_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {
3837
3838                 task_barrier_enter(&hive->tb);
3839                 adev->asic_reset_res = amdgpu_device_baco_enter(adev_to_drm(adev));
3840
3841                 if (adev->asic_reset_res)
3842                         goto fail;
3843
3844                 task_barrier_exit(&hive->tb);
3845                 adev->asic_reset_res = amdgpu_device_baco_exit(adev_to_drm(adev));
3846
3847                 if (adev->asic_reset_res)
3848                         goto fail;
3849
3850                 amdgpu_ras_reset_error_count(adev, AMDGPU_RAS_BLOCK__MMHUB);
3851         } else {
3852
3853                 task_barrier_full(&hive->tb);
3854                 adev->asic_reset_res =  amdgpu_asic_reset(adev);
3855         }
3856
3857 fail:
3858         if (adev->asic_reset_res)
3859                 DRM_WARN("ASIC reset failed with error, %d for drm dev, %s",
3860                          adev->asic_reset_res, adev_to_drm(adev)->unique);
3861         amdgpu_put_xgmi_hive(hive);
3862 }
3863
3864 static int amdgpu_device_get_job_timeout_settings(struct amdgpu_device *adev)
3865 {
3866         char *input = amdgpu_lockup_timeout;
3867         char *timeout_setting = NULL;
3868         int index = 0;
3869         long timeout;
3870         int ret = 0;
3871
3872         /*
3873          * By default timeout for non compute jobs is 10000
3874          * and 60000 for compute jobs.
3875          * In SR-IOV or passthrough mode, timeout for compute
3876          * jobs are 60000 by default.
3877          */
3878         adev->gfx_timeout = msecs_to_jiffies(10000);
3879         adev->sdma_timeout = adev->video_timeout = adev->gfx_timeout;
3880         if (amdgpu_sriov_vf(adev))
3881                 adev->compute_timeout = amdgpu_sriov_is_pp_one_vf(adev) ?
3882                                         msecs_to_jiffies(60000) : msecs_to_jiffies(10000);
3883         else
3884                 adev->compute_timeout =  msecs_to_jiffies(60000);
3885
3886         if (strnlen(input, AMDGPU_MAX_TIMEOUT_PARAM_LENGTH)) {
3887                 while ((timeout_setting = strsep(&input, ",")) &&
3888                                 strnlen(timeout_setting, AMDGPU_MAX_TIMEOUT_PARAM_LENGTH)) {
3889                         ret = kstrtol(timeout_setting, 0, &timeout);
3890                         if (ret)
3891                                 return ret;
3892
3893                         if (timeout == 0) {
3894                                 index++;
3895                                 continue;
3896                         } else if (timeout < 0) {
3897                                 timeout = MAX_SCHEDULE_TIMEOUT;
3898                                 dev_warn(adev->dev, "lockup timeout disabled");
3899                                 add_taint(TAINT_SOFTLOCKUP, LOCKDEP_STILL_OK);
3900                         } else {
3901                                 timeout = msecs_to_jiffies(timeout);
3902                         }
3903
3904                         switch (index++) {
3905                         case 0:
3906                                 adev->gfx_timeout = timeout;
3907                                 break;
3908                         case 1:
3909                                 adev->compute_timeout = timeout;
3910                                 break;
3911                         case 2:
3912                                 adev->sdma_timeout = timeout;
3913                                 break;
3914                         case 3:
3915                                 adev->video_timeout = timeout;
3916                                 break;
3917                         default:
3918                                 break;
3919                         }
3920                 }
3921                 /*
3922                  * There is only one value specified and
3923                  * it should apply to all non-compute jobs.
3924                  */
3925                 if (index == 1) {
3926                         adev->sdma_timeout = adev->video_timeout = adev->gfx_timeout;
3927                         if (amdgpu_sriov_vf(adev) || amdgpu_passthrough(adev))
3928                                 adev->compute_timeout = adev->gfx_timeout;
3929                 }
3930         }
3931
3932         return ret;
3933 }
3934
3935 /**
3936  * amdgpu_device_check_iommu_direct_map - check if RAM direct mapped to GPU
3937  *
3938  * @adev: amdgpu_device pointer
3939  *
3940  * RAM direct mapped to GPU if IOMMU is not enabled or is pass through mode
3941  */
3942 static void amdgpu_device_check_iommu_direct_map(struct amdgpu_device *adev)
3943 {
3944         struct iommu_domain *domain;
3945
3946         domain = iommu_get_domain_for_dev(adev->dev);
3947         if (!domain || domain->type == IOMMU_DOMAIN_IDENTITY)
3948                 adev->ram_is_direct_mapped = true;
3949 }
3950
3951 static const struct attribute *amdgpu_dev_attributes[] = {
3952         &dev_attr_pcie_replay_count.attr,
3953         NULL
3954 };
3955
3956 static void amdgpu_device_set_mcbp(struct amdgpu_device *adev)
3957 {
3958         if (amdgpu_mcbp == 1)
3959                 adev->gfx.mcbp = true;
3960         else if (amdgpu_mcbp == 0)
3961                 adev->gfx.mcbp = false;
3962
3963         if (amdgpu_sriov_vf(adev))
3964                 adev->gfx.mcbp = true;
3965
3966         if (adev->gfx.mcbp)
3967                 DRM_INFO("MCBP is enabled\n");
3968 }
3969
3970 /**
3971  * amdgpu_device_init - initialize the driver
3972  *
3973  * @adev: amdgpu_device pointer
3974  * @flags: driver flags
3975  *
3976  * Initializes the driver info and hw (all asics).
3977  * Returns 0 for success or an error on failure.
3978  * Called at driver startup.
3979  */
3980 int amdgpu_device_init(struct amdgpu_device *adev,
3981                        uint32_t flags)
3982 {
3983         struct drm_device *ddev = adev_to_drm(adev);
3984         struct pci_dev *pdev = adev->pdev;
3985         int r, i;
3986         bool px = false;
3987         u32 max_MBps;
3988         int tmp;
3989
3990         adev->shutdown = false;
3991         adev->flags = flags;
3992
3993         if (amdgpu_force_asic_type >= 0 && amdgpu_force_asic_type < CHIP_LAST)
3994                 adev->asic_type = amdgpu_force_asic_type;
3995         else
3996                 adev->asic_type = flags & AMD_ASIC_MASK;
3997
3998         adev->usec_timeout = AMDGPU_MAX_USEC_TIMEOUT;
3999         if (amdgpu_emu_mode == 1)
4000                 adev->usec_timeout *= 10;
4001         adev->gmc.gart_size = 512 * 1024 * 1024;
4002         adev->accel_working = false;
4003         adev->num_rings = 0;
4004         RCU_INIT_POINTER(adev->gang_submit, dma_fence_get_stub());
4005         adev->mman.buffer_funcs = NULL;
4006         adev->mman.buffer_funcs_ring = NULL;
4007         adev->vm_manager.vm_pte_funcs = NULL;
4008         adev->vm_manager.vm_pte_num_scheds = 0;
4009         adev->gmc.gmc_funcs = NULL;
4010         adev->harvest_ip_mask = 0x0;
4011         adev->fence_context = dma_fence_context_alloc(AMDGPU_MAX_RINGS);
4012         bitmap_zero(adev->gfx.pipe_reserve_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);
4013
4014         adev->smc_rreg = &amdgpu_invalid_rreg;
4015         adev->smc_wreg = &amdgpu_invalid_wreg;
4016         adev->pcie_rreg = &amdgpu_invalid_rreg;
4017         adev->pcie_wreg = &amdgpu_invalid_wreg;
4018         adev->pcie_rreg_ext = &amdgpu_invalid_rreg_ext;
4019         adev->pcie_wreg_ext = &amdgpu_invalid_wreg_ext;
4020         adev->pciep_rreg = &amdgpu_invalid_rreg;
4021         adev->pciep_wreg = &amdgpu_invalid_wreg;
4022         adev->pcie_rreg64 = &amdgpu_invalid_rreg64;
4023         adev->pcie_wreg64 = &amdgpu_invalid_wreg64;
4024         adev->pcie_rreg64_ext = &amdgpu_invalid_rreg64_ext;
4025         adev->pcie_wreg64_ext = &amdgpu_invalid_wreg64_ext;
4026         adev->uvd_ctx_rreg = &amdgpu_invalid_rreg;
4027         adev->uvd_ctx_wreg = &amdgpu_invalid_wreg;
4028         adev->didt_rreg = &amdgpu_invalid_rreg;
4029         adev->didt_wreg = &amdgpu_invalid_wreg;
4030         adev->gc_cac_rreg = &amdgpu_invalid_rreg;
4031         adev->gc_cac_wreg = &amdgpu_invalid_wreg;
4032         adev->audio_endpt_rreg = &amdgpu_block_invalid_rreg;
4033         adev->audio_endpt_wreg = &amdgpu_block_invalid_wreg;
4034
4035         DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X 0x%02X).\n",
4036                  amdgpu_asic_name[adev->asic_type], pdev->vendor, pdev->device,
4037                  pdev->subsystem_vendor, pdev->subsystem_device, pdev->revision);
4038
4039         /* mutex initialization are all done here so we
4040          * can recall function without having locking issues
4041          */
4042         mutex_init(&adev->firmware.mutex);
4043         mutex_init(&adev->pm.mutex);
4044         mutex_init(&adev->gfx.gpu_clock_mutex);
4045         mutex_init(&adev->srbm_mutex);
4046         mutex_init(&adev->gfx.pipe_reserve_mutex);
4047         mutex_init(&adev->gfx.gfx_off_mutex);
4048         mutex_init(&adev->gfx.partition_mutex);
4049         mutex_init(&adev->grbm_idx_mutex);
4050         mutex_init(&adev->mn_lock);
4051         mutex_init(&adev->virt.vf_errors.lock);
4052         mutex_init(&adev->virt.rlcg_reg_lock);
4053         hash_init(adev->mn_hash);
4054         mutex_init(&adev->psp.mutex);
4055         mutex_init(&adev->notifier_lock);
4056         mutex_init(&adev->pm.stable_pstate_ctx_lock);
4057         mutex_init(&adev->benchmark_mutex);
4058
4059         amdgpu_device_init_apu_flags(adev);
4060
4061         r = amdgpu_device_check_arguments(adev);
4062         if (r)
4063                 return r;
4064
4065         spin_lock_init(&adev->mmio_idx_lock);
4066         spin_lock_init(&adev->smc_idx_lock);
4067         spin_lock_init(&adev->pcie_idx_lock);
4068         spin_lock_init(&adev->uvd_ctx_idx_lock);
4069         spin_lock_init(&adev->didt_idx_lock);
4070         spin_lock_init(&adev->gc_cac_idx_lock);
4071         spin_lock_init(&adev->se_cac_idx_lock);
4072         spin_lock_init(&adev->audio_endpt_idx_lock);
4073         spin_lock_init(&adev->mm_stats.lock);
4074         spin_lock_init(&adev->wb.lock);
4075
4076         INIT_LIST_HEAD(&adev->shadow_list);
4077         mutex_init(&adev->shadow_list_lock);
4078
4079         INIT_LIST_HEAD(&adev->reset_list);
4080
4081         INIT_LIST_HEAD(&adev->ras_list);
4082
4083         INIT_LIST_HEAD(&adev->pm.od_kobj_list);
4084
4085         INIT_DELAYED_WORK(&adev->delayed_init_work,
4086                           amdgpu_device_delayed_init_work_handler);
4087         INIT_DELAYED_WORK(&adev->gfx.gfx_off_delay_work,
4088                           amdgpu_device_delay_enable_gfx_off);
4089
4090         INIT_WORK(&adev->xgmi_reset_work, amdgpu_device_xgmi_reset_func);
4091
4092         adev->gfx.gfx_off_req_count = 1;
4093         adev->gfx.gfx_off_residency = 0;
4094         adev->gfx.gfx_off_entrycount = 0;
4095         adev->pm.ac_power = power_supply_is_system_supplied() > 0;
4096
4097         atomic_set(&adev->throttling_logging_enabled, 1);
4098         /*
4099          * If throttling continues, logging will be performed every minute
4100          * to avoid log flooding. "-1" is subtracted since the thermal
4101          * throttling interrupt comes every second. Thus, the total logging
4102          * interval is 59 seconds(retelimited printk interval) + 1(waiting
4103          * for throttling interrupt) = 60 seconds.
4104          */
4105         ratelimit_state_init(&adev->throttling_logging_rs, (60 - 1) * HZ, 1);
4106         ratelimit_set_flags(&adev->throttling_logging_rs, RATELIMIT_MSG_ON_RELEASE);
4107
4108         /* Registers mapping */
4109         /* TODO: block userspace mapping of io register */
4110         if (adev->asic_type >= CHIP_BONAIRE) {
4111                 adev->rmmio_base = pci_resource_start(adev->pdev, 5);
4112                 adev->rmmio_size = pci_resource_len(adev->pdev, 5);
4113         } else {
4114                 adev->rmmio_base = pci_resource_start(adev->pdev, 2);
4115                 adev->rmmio_size = pci_resource_len(adev->pdev, 2);
4116         }
4117
4118         for (i = 0; i < AMD_IP_BLOCK_TYPE_NUM; i++)
4119                 atomic_set(&adev->pm.pwr_state[i], POWER_STATE_UNKNOWN);
4120
4121         adev->rmmio = ioremap(adev->rmmio_base, adev->rmmio_size);
4122         if (!adev->rmmio)
4123                 return -ENOMEM;
4124
4125         DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)adev->rmmio_base);
4126         DRM_INFO("register mmio size: %u\n", (unsigned int)adev->rmmio_size);
4127
4128         /*
4129          * Reset domain needs to be present early, before XGMI hive discovered
4130          * (if any) and intitialized to use reset sem and in_gpu reset flag
4131          * early on during init and before calling to RREG32.
4132          */
4133         adev->reset_domain = amdgpu_reset_create_reset_domain(SINGLE_DEVICE, "amdgpu-reset-dev");
4134         if (!adev->reset_domain)
4135                 return -ENOMEM;
4136
4137         /* detect hw virtualization here */
4138         amdgpu_detect_virtualization(adev);
4139
4140         amdgpu_device_get_pcie_info(adev);
4141
4142         r = amdgpu_device_get_job_timeout_settings(adev);
4143         if (r) {
4144                 dev_err(adev->dev, "invalid lockup_timeout parameter syntax\n");
4145                 return r;
4146         }
4147
4148         amdgpu_device_set_mcbp(adev);
4149
4150         /* early init functions */
4151         r = amdgpu_device_ip_early_init(adev);
4152         if (r)
4153                 return r;
4154
4155         /* Get rid of things like offb */
4156         r = drm_aperture_remove_conflicting_pci_framebuffers(adev->pdev, &amdgpu_kms_driver);
4157         if (r)
4158                 return r;
4159
4160         /* Enable TMZ based on IP_VERSION */
4161         amdgpu_gmc_tmz_set(adev);
4162
4163         if (amdgpu_sriov_vf(adev) &&
4164             amdgpu_ip_version(adev, GC_HWIP, 0) >= IP_VERSION(10, 3, 0))
4165                 /* VF MMIO access (except mailbox range) from CPU
4166                  * will be blocked during sriov runtime
4167                  */
4168                 adev->virt.caps |= AMDGPU_VF_MMIO_ACCESS_PROTECT;
4169
4170         amdgpu_gmc_noretry_set(adev);
4171         /* Need to get xgmi info early to decide the reset behavior*/
4172         if (adev->gmc.xgmi.supported) {
4173                 r = adev->gfxhub.funcs->get_xgmi_info(adev);
4174                 if (r)
4175                         return r;
4176         }
4177
4178         /* enable PCIE atomic ops */
4179         if (amdgpu_sriov_vf(adev)) {
4180                 if (adev->virt.fw_reserve.p_pf2vf)
4181                         adev->have_atomics_support = ((struct amd_sriov_msg_pf2vf_info *)
4182                                                       adev->virt.fw_reserve.p_pf2vf)->pcie_atomic_ops_support_flags ==
4183                                 (PCI_EXP_DEVCAP2_ATOMIC_COMP32 | PCI_EXP_DEVCAP2_ATOMIC_COMP64);
4184         /* APUs w/ gfx9 onwards doesn't reply on PCIe atomics, rather it is a
4185          * internal path natively support atomics, set have_atomics_support to true.
4186          */
4187         } else if ((adev->flags & AMD_IS_APU) &&
4188                    (amdgpu_ip_version(adev, GC_HWIP, 0) >
4189                     IP_VERSION(9, 0, 0))) {
4190                 adev->have_atomics_support = true;
4191         } else {
4192                 adev->have_atomics_support =
4193                         !pci_enable_atomic_ops_to_root(adev->pdev,
4194                                           PCI_EXP_DEVCAP2_ATOMIC_COMP32 |
4195                                           PCI_EXP_DEVCAP2_ATOMIC_COMP64);
4196         }
4197
4198         if (!adev->have_atomics_support)
4199                 dev_info(adev->dev, "PCIE atomic ops is not supported\n");
4200
4201         /* doorbell bar mapping and doorbell index init*/
4202         amdgpu_doorbell_init(adev);
4203
4204         if (amdgpu_emu_mode == 1) {
4205                 /* post the asic on emulation mode */
4206                 emu_soc_asic_init(adev);
4207                 goto fence_driver_init;
4208         }
4209
4210         amdgpu_reset_init(adev);
4211
4212         /* detect if we are with an SRIOV vbios */
4213         if (adev->bios)
4214                 amdgpu_device_detect_sriov_bios(adev);
4215
4216         /* check if we need to reset the asic
4217          *  E.g., driver was not cleanly unloaded previously, etc.
4218          */
4219         if (!amdgpu_sriov_vf(adev) && amdgpu_asic_need_reset_on_init(adev)) {
4220                 if (adev->gmc.xgmi.num_physical_nodes) {
4221                         dev_info(adev->dev, "Pending hive reset.\n");
4222                         adev->gmc.xgmi.pending_reset = true;
4223                         /* Only need to init necessary block for SMU to handle the reset */
4224                         for (i = 0; i < adev->num_ip_blocks; i++) {
4225                                 if (!adev->ip_blocks[i].status.valid)
4226                                         continue;
4227                                 if (!(adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||
4228                                       adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||
4229                                       adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH ||
4230                                       adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC)) {
4231                                         DRM_DEBUG("IP %s disabled for hw_init.\n",
4232                                                 adev->ip_blocks[i].version->funcs->name);
4233                                         adev->ip_blocks[i].status.hw = true;
4234                                 }
4235                         }
4236                 } else if (amdgpu_ip_version(adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 10) &&
4237                                    !amdgpu_device_has_display_hardware(adev)) {
4238                                         r = psp_gpu_reset(adev);
4239                 } else {
4240                                 tmp = amdgpu_reset_method;
4241                                 /* It should do a default reset when loading or reloading the driver,
4242                                  * regardless of the module parameter reset_method.
4243                                  */
4244                                 amdgpu_reset_method = AMD_RESET_METHOD_NONE;
4245                                 r = amdgpu_asic_reset(adev);
4246                                 amdgpu_reset_method = tmp;
4247                 }
4248
4249                 if (r) {
4250                   dev_err(adev->dev, "asic reset on init failed\n");
4251                   goto failed;
4252                 }
4253         }
4254
4255         /* Post card if necessary */
4256         if (amdgpu_device_need_post(adev)) {
4257                 if (!adev->bios) {
4258                         dev_err(adev->dev, "no vBIOS found\n");
4259                         r = -EINVAL;
4260                         goto failed;
4261                 }
4262                 DRM_INFO("GPU posting now...\n");
4263                 r = amdgpu_device_asic_init(adev);
4264                 if (r) {
4265                         dev_err(adev->dev, "gpu post error!\n");
4266                         goto failed;
4267                 }
4268         }
4269
4270         if (adev->bios) {
4271                 if (adev->is_atom_fw) {
4272                         /* Initialize clocks */
4273                         r = amdgpu_atomfirmware_get_clock_info(adev);
4274                         if (r) {
4275                                 dev_err(adev->dev, "amdgpu_atomfirmware_get_clock_info failed\n");
4276                                 amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0);
4277                                 goto failed;
4278                         }
4279                 } else {
4280                         /* Initialize clocks */
4281                         r = amdgpu_atombios_get_clock_info(adev);
4282                         if (r) {
4283                                 dev_err(adev->dev, "amdgpu_atombios_get_clock_info failed\n");
4284                                 amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0);
4285                                 goto failed;
4286                         }
4287                         /* init i2c buses */
4288                         if (!amdgpu_device_has_dc_support(adev))
4289                                 amdgpu_atombios_i2c_init(adev);
4290                 }
4291         }
4292
4293 fence_driver_init:
4294         /* Fence driver */
4295         r = amdgpu_fence_driver_sw_init(adev);
4296         if (r) {
4297                 dev_err(adev->dev, "amdgpu_fence_driver_sw_init failed\n");
4298                 amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_FENCE_INIT_FAIL, 0, 0);
4299                 goto failed;
4300         }
4301
4302         /* init the mode config */
4303         drm_mode_config_init(adev_to_drm(adev));
4304
4305         r = amdgpu_device_ip_init(adev);
4306         if (r) {
4307                 dev_err(adev->dev, "amdgpu_device_ip_init failed\n");
4308                 amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_AMDGPU_INIT_FAIL, 0, 0);
4309                 goto release_ras_con;
4310         }
4311
4312         amdgpu_fence_driver_hw_init(adev);
4313
4314         dev_info(adev->dev,
4315                 "SE %d, SH per SE %d, CU per SH %d, active_cu_number %d\n",
4316                         adev->gfx.config.max_shader_engines,
4317                         adev->gfx.config.max_sh_per_se,
4318                         adev->gfx.config.max_cu_per_sh,
4319                         adev->gfx.cu_info.number);
4320
4321         adev->accel_working = true;
4322
4323         amdgpu_vm_check_compute_bug(adev);
4324
4325         /* Initialize the buffer migration limit. */
4326         if (amdgpu_moverate >= 0)
4327                 max_MBps = amdgpu_moverate;
4328         else
4329                 max_MBps = 8; /* Allow 8 MB/s. */
4330         /* Get a log2 for easy divisions. */
4331         adev->mm_stats.log2_max_MBps = ilog2(max(1u, max_MBps));
4332
4333         /*
4334          * Register gpu instance before amdgpu_device_enable_mgpu_fan_boost.
4335          * Otherwise the mgpu fan boost feature will be skipped due to the
4336          * gpu instance is counted less.
4337          */
4338         amdgpu_register_gpu_instance(adev);
4339
4340         /* enable clockgating, etc. after ib tests, etc. since some blocks require
4341          * explicit gating rather than handling it automatically.
4342          */
4343         if (!adev->gmc.xgmi.pending_reset) {
4344                 r = amdgpu_device_ip_late_init(adev);
4345                 if (r) {
4346                         dev_err(adev->dev, "amdgpu_device_ip_late_init failed\n");
4347                         amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_AMDGPU_LATE_INIT_FAIL, 0, r);
4348                         goto release_ras_con;
4349                 }
4350                 /* must succeed. */
4351                 amdgpu_ras_resume(adev);
4352                 queue_delayed_work(system_wq, &adev->delayed_init_work,
4353                                    msecs_to_jiffies(AMDGPU_RESUME_MS));
4354         }
4355
4356         if (amdgpu_sriov_vf(adev)) {
4357                 amdgpu_virt_release_full_gpu(adev, true);
4358                 flush_delayed_work(&adev->delayed_init_work);
4359         }
4360
4361         /*
4362          * Place those sysfs registering after `late_init`. As some of those
4363          * operations performed in `late_init` might affect the sysfs
4364          * interfaces creating.
4365          */
4366         r = amdgpu_atombios_sysfs_init(adev);
4367         if (r)
4368                 drm_err(&adev->ddev,
4369                         "registering atombios sysfs failed (%d).\n", r);
4370
4371         r = amdgpu_pm_sysfs_init(adev);
4372         if (r)
4373                 DRM_ERROR("registering pm sysfs failed (%d).\n", r);
4374
4375         r = amdgpu_ucode_sysfs_init(adev);
4376         if (r) {
4377                 adev->ucode_sysfs_en = false;
4378                 DRM_ERROR("Creating firmware sysfs failed (%d).\n", r);
4379         } else
4380                 adev->ucode_sysfs_en = true;
4381
4382         r = sysfs_create_files(&adev->dev->kobj, amdgpu_dev_attributes);
4383         if (r)
4384                 dev_err(adev->dev, "Could not create amdgpu device attr\n");
4385
4386         r = devm_device_add_group(adev->dev, &amdgpu_board_attrs_group);
4387         if (r)
4388                 dev_err(adev->dev,
4389                         "Could not create amdgpu board attributes\n");
4390
4391         amdgpu_fru_sysfs_init(adev);
4392         amdgpu_reg_state_sysfs_init(adev);
4393
4394         if (IS_ENABLED(CONFIG_PERF_EVENTS))
4395                 r = amdgpu_pmu_init(adev);
4396         if (r)
4397                 dev_err(adev->dev, "amdgpu_pmu_init failed\n");
4398
4399         /* Have stored pci confspace at hand for restore in sudden PCI error */
4400         if (amdgpu_device_cache_pci_state(adev->pdev))
4401                 pci_restore_state(pdev);
4402
4403         /* if we have > 1 VGA cards, then disable the amdgpu VGA resources */
4404         /* this will fail for cards that aren't VGA class devices, just
4405          * ignore it
4406          */
4407         if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
4408                 vga_client_register(adev->pdev, amdgpu_device_vga_set_decode);
4409
4410         px = amdgpu_device_supports_px(ddev);
4411
4412         if (px || (!dev_is_removable(&adev->pdev->dev) &&
4413                                 apple_gmux_detect(NULL, NULL)))
4414                 vga_switcheroo_register_client(adev->pdev,
4415                                                &amdgpu_switcheroo_ops, px);
4416
4417         if (px)
4418                 vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain);
4419
4420         if (adev->gmc.xgmi.pending_reset)
4421                 queue_delayed_work(system_wq, &mgpu_info.delayed_reset_work,
4422                                    msecs_to_jiffies(AMDGPU_RESUME_MS));
4423
4424         amdgpu_device_check_iommu_direct_map(adev);
4425
4426         return 0;
4427
4428 release_ras_con:
4429         if (amdgpu_sriov_vf(adev))
4430                 amdgpu_virt_release_full_gpu(adev, true);
4431
4432         /* failed in exclusive mode due to timeout */
4433         if (amdgpu_sriov_vf(adev) &&
4434                 !amdgpu_sriov_runtime(adev) &&
4435                 amdgpu_virt_mmio_blocked(adev) &&
4436                 !amdgpu_virt_wait_reset(adev)) {
4437                 dev_err(adev->dev, "VF exclusive mode timeout\n");
4438                 /* Don't send request since VF is inactive. */
4439                 adev->virt.caps &= ~AMDGPU_SRIOV_CAPS_RUNTIME;
4440                 adev->virt.ops = NULL;
4441                 r = -EAGAIN;
4442         }
4443         amdgpu_release_ras_context(adev);
4444
4445 failed:
4446         amdgpu_vf_error_trans_all(adev);
4447
4448         return r;
4449 }
4450
4451 static void amdgpu_device_unmap_mmio(struct amdgpu_device *adev)
4452 {
4453
4454         /* Clear all CPU mappings pointing to this device */
4455         unmap_mapping_range(adev->ddev.anon_inode->i_mapping, 0, 0, 1);
4456
4457         /* Unmap all mapped bars - Doorbell, registers and VRAM */
4458         amdgpu_doorbell_fini(adev);
4459
4460         iounmap(adev->rmmio);
4461         adev->rmmio = NULL;
4462         if (adev->mman.aper_base_kaddr)
4463                 iounmap(adev->mman.aper_base_kaddr);
4464         adev->mman.aper_base_kaddr = NULL;
4465
4466         /* Memory manager related */
4467         if (!adev->gmc.xgmi.connected_to_cpu && !adev->gmc.is_app_apu) {
4468                 arch_phys_wc_del(adev->gmc.vram_mtrr);
4469                 arch_io_free_memtype_wc(adev->gmc.aper_base, adev->gmc.aper_size);
4470         }
4471 }
4472
4473 /**
4474  * amdgpu_device_fini_hw - tear down the driver
4475  *
4476  * @adev: amdgpu_device pointer
4477  *
4478  * Tear down the driver info (all asics).
4479  * Called at driver shutdown.
4480  */
4481 void amdgpu_device_fini_hw(struct amdgpu_device *adev)
4482 {
4483         dev_info(adev->dev, "amdgpu: finishing device.\n");
4484         flush_delayed_work(&adev->delayed_init_work);
4485         adev->shutdown = true;
4486
4487         /* make sure IB test finished before entering exclusive mode
4488          * to avoid preemption on IB test
4489          */
4490         if (amdgpu_sriov_vf(adev)) {
4491                 amdgpu_virt_request_full_gpu(adev, false);
4492                 amdgpu_virt_fini_data_exchange(adev);
4493         }
4494
4495         /* disable all interrupts */
4496         amdgpu_irq_disable_all(adev);
4497         if (adev->mode_info.mode_config_initialized) {
4498                 if (!drm_drv_uses_atomic_modeset(adev_to_drm(adev)))
4499                         drm_helper_force_disable_all(adev_to_drm(adev));
4500                 else
4501                         drm_atomic_helper_shutdown(adev_to_drm(adev));
4502         }
4503         amdgpu_fence_driver_hw_fini(adev);
4504
4505         if (adev->mman.initialized)
4506                 drain_workqueue(adev->mman.bdev.wq);
4507
4508         if (adev->pm.sysfs_initialized)
4509                 amdgpu_pm_sysfs_fini(adev);
4510         if (adev->ucode_sysfs_en)
4511                 amdgpu_ucode_sysfs_fini(adev);
4512         sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes);
4513         amdgpu_fru_sysfs_fini(adev);
4514
4515         amdgpu_reg_state_sysfs_fini(adev);
4516
4517         /* disable ras feature must before hw fini */
4518         amdgpu_ras_pre_fini(adev);
4519
4520         amdgpu_ttm_set_buffer_funcs_status(adev, false);
4521
4522         amdgpu_device_ip_fini_early(adev);
4523
4524         amdgpu_irq_fini_hw(adev);
4525
4526         if (adev->mman.initialized)
4527                 ttm_device_clear_dma_mappings(&adev->mman.bdev);
4528
4529         amdgpu_gart_dummy_page_fini(adev);
4530
4531         if (drm_dev_is_unplugged(adev_to_drm(adev)))
4532                 amdgpu_device_unmap_mmio(adev);
4533
4534 }
4535
4536 void amdgpu_device_fini_sw(struct amdgpu_device *adev)
4537 {
4538         int idx;
4539         bool px;
4540
4541         amdgpu_fence_driver_sw_fini(adev);
4542         amdgpu_device_ip_fini(adev);
4543         amdgpu_ucode_release(&adev->firmware.gpu_info_fw);
4544         adev->accel_working = false;
4545         dma_fence_put(rcu_dereference_protected(adev->gang_submit, true));
4546
4547         amdgpu_reset_fini(adev);
4548
4549         /* free i2c buses */
4550         if (!amdgpu_device_has_dc_support(adev))
4551                 amdgpu_i2c_fini(adev);
4552
4553         if (amdgpu_emu_mode != 1)
4554                 amdgpu_atombios_fini(adev);
4555
4556         kfree(adev->bios);
4557         adev->bios = NULL;
4558
4559         kfree(adev->fru_info);
4560         adev->fru_info = NULL;
4561
4562         px = amdgpu_device_supports_px(adev_to_drm(adev));
4563
4564         if (px || (!dev_is_removable(&adev->pdev->dev) &&
4565                                 apple_gmux_detect(NULL, NULL)))
4566                 vga_switcheroo_unregister_client(adev->pdev);
4567
4568         if (px)
4569                 vga_switcheroo_fini_domain_pm_ops(adev->dev);
4570
4571         if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
4572                 vga_client_unregister(adev->pdev);
4573
4574         if (drm_dev_enter(adev_to_drm(adev), &idx)) {
4575
4576                 iounmap(adev->rmmio);
4577                 adev->rmmio = NULL;
4578                 amdgpu_doorbell_fini(adev);
4579                 drm_dev_exit(idx);
4580         }
4581
4582         if (IS_ENABLED(CONFIG_PERF_EVENTS))
4583                 amdgpu_pmu_fini(adev);
4584         if (adev->mman.discovery_bin)
4585                 amdgpu_discovery_fini(adev);
4586
4587         amdgpu_reset_put_reset_domain(adev->reset_domain);
4588         adev->reset_domain = NULL;
4589
4590         kfree(adev->pci_state);
4591
4592 }
4593
4594 /**
4595  * amdgpu_device_evict_resources - evict device resources
4596  * @adev: amdgpu device object
4597  *
4598  * Evicts all ttm device resources(vram BOs, gart table) from the lru list
4599  * of the vram memory type. Mainly used for evicting device resources
4600  * at suspend time.
4601  *
4602  */
4603 static int amdgpu_device_evict_resources(struct amdgpu_device *adev)
4604 {
4605         int ret;
4606
4607         /* No need to evict vram on APUs for suspend to ram or s2idle */
4608         if ((adev->in_s3 || adev->in_s0ix) && (adev->flags & AMD_IS_APU))
4609                 return 0;
4610
4611         ret = amdgpu_ttm_evict_resources(adev, TTM_PL_VRAM);
4612         if (ret)
4613                 DRM_WARN("evicting device resources failed\n");
4614         return ret;
4615 }
4616
4617 /*
4618  * Suspend & resume.
4619  */
4620 /**
4621  * amdgpu_device_prepare - prepare for device suspend
4622  *
4623  * @dev: drm dev pointer
4624  *
4625  * Prepare to put the hw in the suspend state (all asics).
4626  * Returns 0 for success or an error on failure.
4627  * Called at driver suspend.
4628  */
4629 int amdgpu_device_prepare(struct drm_device *dev)
4630 {
4631         struct amdgpu_device *adev = drm_to_adev(dev);
4632         int i, r;
4633
4634         amdgpu_choose_low_power_state(adev);
4635
4636         if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
4637                 return 0;
4638
4639         /* Evict the majority of BOs before starting suspend sequence */
4640         r = amdgpu_device_evict_resources(adev);
4641         if (r)
4642                 goto unprepare;
4643
4644         flush_delayed_work(&adev->gfx.gfx_off_delay_work);
4645
4646         for (i = 0; i < adev->num_ip_blocks; i++) {
4647                 if (!adev->ip_blocks[i].status.valid)
4648                         continue;
4649                 if (!adev->ip_blocks[i].version->funcs->prepare_suspend)
4650                         continue;
4651                 r = adev->ip_blocks[i].version->funcs->prepare_suspend((void *)adev);
4652                 if (r)
4653                         goto unprepare;
4654         }
4655
4656         return 0;
4657
4658 unprepare:
4659         adev->in_s0ix = adev->in_s3 = false;
4660
4661         return r;
4662 }
4663
4664 /**
4665  * amdgpu_device_suspend - initiate device suspend
4666  *
4667  * @dev: drm dev pointer
4668  * @fbcon : notify the fbdev of suspend
4669  *
4670  * Puts the hw in the suspend state (all asics).
4671  * Returns 0 for success or an error on failure.
4672  * Called at driver suspend.
4673  */
4674 int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)
4675 {
4676         struct amdgpu_device *adev = drm_to_adev(dev);
4677         int r = 0;
4678
4679         if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
4680                 return 0;
4681
4682         adev->in_suspend = true;
4683
4684         if (amdgpu_sriov_vf(adev)) {
4685                 amdgpu_virt_fini_data_exchange(adev);
4686                 r = amdgpu_virt_request_full_gpu(adev, false);
4687                 if (r)
4688                         return r;
4689         }
4690
4691         if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D3))
4692                 DRM_WARN("smart shift update failed\n");
4693
4694         if (fbcon)
4695                 drm_fb_helper_set_suspend_unlocked(adev_to_drm(adev)->fb_helper, true);
4696
4697         cancel_delayed_work_sync(&adev->delayed_init_work);
4698
4699         amdgpu_ras_suspend(adev);
4700
4701         amdgpu_device_ip_suspend_phase1(adev);
4702
4703         if (!adev->in_s0ix)
4704                 amdgpu_amdkfd_suspend(adev, adev->in_runpm);
4705
4706         r = amdgpu_device_evict_resources(adev);
4707         if (r)
4708                 return r;
4709
4710         amdgpu_ttm_set_buffer_funcs_status(adev, false);
4711
4712         amdgpu_fence_driver_hw_fini(adev);
4713
4714         amdgpu_device_ip_suspend_phase2(adev);
4715
4716         if (amdgpu_sriov_vf(adev))
4717                 amdgpu_virt_release_full_gpu(adev, false);
4718
4719         r = amdgpu_dpm_notify_rlc_state(adev, false);
4720         if (r)
4721                 return r;
4722
4723         return 0;
4724 }
4725
4726 /**
4727  * amdgpu_device_resume - initiate device resume
4728  *
4729  * @dev: drm dev pointer
4730  * @fbcon : notify the fbdev of resume
4731  *
4732  * Bring the hw back to operating state (all asics).
4733  * Returns 0 for success or an error on failure.
4734  * Called at driver resume.
4735  */
4736 int amdgpu_device_resume(struct drm_device *dev, bool fbcon)
4737 {
4738         struct amdgpu_device *adev = drm_to_adev(dev);
4739         int r = 0;
4740
4741         if (amdgpu_sriov_vf(adev)) {
4742                 r = amdgpu_virt_request_full_gpu(adev, true);
4743                 if (r)
4744                         return r;
4745         }
4746
4747         if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
4748                 return 0;
4749
4750         if (adev->in_s0ix)
4751                 amdgpu_dpm_gfx_state_change(adev, sGpuChangeState_D0Entry);
4752
4753         /* post card */
4754         if (amdgpu_device_need_post(adev)) {
4755                 r = amdgpu_device_asic_init(adev);
4756                 if (r)
4757                         dev_err(adev->dev, "amdgpu asic init failed\n");
4758         }
4759
4760         r = amdgpu_device_ip_resume(adev);
4761
4762         if (r) {
4763                 dev_err(adev->dev, "amdgpu_device_ip_resume failed (%d).\n", r);
4764                 goto exit;
4765         }
4766         amdgpu_fence_driver_hw_init(adev);
4767
4768         if (!adev->in_s0ix) {
4769                 r = amdgpu_amdkfd_resume(adev, adev->in_runpm);
4770                 if (r)
4771                         goto exit;
4772         }
4773
4774         r = amdgpu_device_ip_late_init(adev);
4775         if (r)
4776                 goto exit;
4777
4778         queue_delayed_work(system_wq, &adev->delayed_init_work,
4779                            msecs_to_jiffies(AMDGPU_RESUME_MS));
4780 exit:
4781         if (amdgpu_sriov_vf(adev)) {
4782                 amdgpu_virt_init_data_exchange(adev);
4783                 amdgpu_virt_release_full_gpu(adev, true);
4784         }
4785
4786         if (r)
4787                 return r;
4788
4789         /* Make sure IB tests flushed */
4790         flush_delayed_work(&adev->delayed_init_work);
4791
4792         if (fbcon)
4793                 drm_fb_helper_set_suspend_unlocked(adev_to_drm(adev)->fb_helper, false);
4794
4795         amdgpu_ras_resume(adev);
4796
4797         if (adev->mode_info.num_crtc) {
4798                 /*
4799                  * Most of the connector probing functions try to acquire runtime pm
4800                  * refs to ensure that the GPU is powered on when connector polling is
4801                  * performed. Since we're calling this from a runtime PM callback,
4802                  * trying to acquire rpm refs will cause us to deadlock.
4803                  *
4804                  * Since we're guaranteed to be holding the rpm lock, it's safe to
4805                  * temporarily disable the rpm helpers so this doesn't deadlock us.
4806                  */
4807 #ifdef CONFIG_PM
4808                 dev->dev->power.disable_depth++;
4809 #endif
4810                 if (!adev->dc_enabled)
4811                         drm_helper_hpd_irq_event(dev);
4812                 else
4813                         drm_kms_helper_hotplug_event(dev);
4814 #ifdef CONFIG_PM
4815                 dev->dev->power.disable_depth--;
4816 #endif
4817         }
4818         adev->in_suspend = false;
4819
4820         if (adev->enable_mes)
4821                 amdgpu_mes_self_test(adev);
4822
4823         if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D0))
4824                 DRM_WARN("smart shift update failed\n");
4825
4826         return 0;
4827 }
4828
4829 /**
4830  * amdgpu_device_ip_check_soft_reset - did soft reset succeed
4831  *
4832  * @adev: amdgpu_device pointer
4833  *
4834  * The list of all the hardware IPs that make up the asic is walked and
4835  * the check_soft_reset callbacks are run.  check_soft_reset determines
4836  * if the asic is still hung or not.
4837  * Returns true if any of the IPs are still in a hung state, false if not.
4838  */
4839 static bool amdgpu_device_ip_check_soft_reset(struct amdgpu_device *adev)
4840 {
4841         int i;
4842         bool asic_hang = false;
4843
4844         if (amdgpu_sriov_vf(adev))
4845                 return true;
4846
4847         if (amdgpu_asic_need_full_reset(adev))
4848                 return true;
4849
4850         for (i = 0; i < adev->num_ip_blocks; i++) {
4851                 if (!adev->ip_blocks[i].status.valid)
4852                         continue;
4853                 if (adev->ip_blocks[i].version->funcs->check_soft_reset)
4854                         adev->ip_blocks[i].status.hang =
4855                                 adev->ip_blocks[i].version->funcs->check_soft_reset(adev);
4856                 if (adev->ip_blocks[i].status.hang) {
4857                         dev_info(adev->dev, "IP block:%s is hung!\n", adev->ip_blocks[i].version->funcs->name);
4858                         asic_hang = true;
4859                 }
4860         }
4861         return asic_hang;
4862 }
4863
4864 /**
4865  * amdgpu_device_ip_pre_soft_reset - prepare for soft reset
4866  *
4867  * @adev: amdgpu_device pointer
4868  *
4869  * The list of all the hardware IPs that make up the asic is walked and the
4870  * pre_soft_reset callbacks are run if the block is hung.  pre_soft_reset
4871  * handles any IP specific hardware or software state changes that are
4872  * necessary for a soft reset to succeed.
4873  * Returns 0 on success, negative error code on failure.
4874  */
4875 static int amdgpu_device_ip_pre_soft_reset(struct amdgpu_device *adev)
4876 {
4877         int i, r = 0;
4878
4879         for (i = 0; i < adev->num_ip_blocks; i++) {
4880                 if (!adev->ip_blocks[i].status.valid)
4881                         continue;
4882                 if (adev->ip_blocks[i].status.hang &&
4883                     adev->ip_blocks[i].version->funcs->pre_soft_reset) {
4884                         r = adev->ip_blocks[i].version->funcs->pre_soft_reset(adev);
4885                         if (r)
4886                                 return r;
4887                 }
4888         }
4889
4890         return 0;
4891 }
4892
4893 /**
4894  * amdgpu_device_ip_need_full_reset - check if a full asic reset is needed
4895  *
4896  * @adev: amdgpu_device pointer
4897  *
4898  * Some hardware IPs cannot be soft reset.  If they are hung, a full gpu
4899  * reset is necessary to recover.
4900  * Returns true if a full asic reset is required, false if not.
4901  */
4902 static bool amdgpu_device_ip_need_full_reset(struct amdgpu_device *adev)
4903 {
4904         int i;
4905
4906         if (amdgpu_asic_need_full_reset(adev))
4907                 return true;
4908
4909         for (i = 0; i < adev->num_ip_blocks; i++) {
4910                 if (!adev->ip_blocks[i].status.valid)
4911                         continue;
4912                 if ((adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) ||
4913                     (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) ||
4914                     (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_ACP) ||
4915                     (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE) ||
4916                      adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP) {
4917                         if (adev->ip_blocks[i].status.hang) {
4918                                 dev_info(adev->dev, "Some block need full reset!\n");
4919                                 return true;
4920                         }
4921                 }
4922         }
4923         return false;
4924 }
4925
4926 /**
4927  * amdgpu_device_ip_soft_reset - do a soft reset
4928  *
4929  * @adev: amdgpu_device pointer
4930  *
4931  * The list of all the hardware IPs that make up the asic is walked and the
4932  * soft_reset callbacks are run if the block is hung.  soft_reset handles any
4933  * IP specific hardware or software state changes that are necessary to soft
4934  * reset the IP.
4935  * Returns 0 on success, negative error code on failure.
4936  */
4937 static int amdgpu_device_ip_soft_reset(struct amdgpu_device *adev)
4938 {
4939         int i, r = 0;
4940
4941         for (i = 0; i < adev->num_ip_blocks; i++) {
4942                 if (!adev->ip_blocks[i].status.valid)
4943                         continue;
4944                 if (adev->ip_blocks[i].status.hang &&
4945                     adev->ip_blocks[i].version->funcs->soft_reset) {
4946                         r = adev->ip_blocks[i].version->funcs->soft_reset(adev);
4947                         if (r)
4948                                 return r;
4949                 }
4950         }
4951
4952         return 0;
4953 }
4954
4955 /**
4956  * amdgpu_device_ip_post_soft_reset - clean up from soft reset
4957  *
4958  * @adev: amdgpu_device pointer
4959  *
4960  * The list of all the hardware IPs that make up the asic is walked and the
4961  * post_soft_reset callbacks are run if the asic was hung.  post_soft_reset
4962  * handles any IP specific hardware or software state changes that are
4963  * necessary after the IP has been soft reset.
4964  * Returns 0 on success, negative error code on failure.
4965  */
4966 static int amdgpu_device_ip_post_soft_reset(struct amdgpu_device *adev)
4967 {
4968         int i, r = 0;
4969
4970         for (i = 0; i < adev->num_ip_blocks; i++) {
4971                 if (!adev->ip_blocks[i].status.valid)
4972                         continue;
4973                 if (adev->ip_blocks[i].status.hang &&
4974                     adev->ip_blocks[i].version->funcs->post_soft_reset)
4975                         r = adev->ip_blocks[i].version->funcs->post_soft_reset(adev);
4976                 if (r)
4977                         return r;
4978         }
4979
4980         return 0;
4981 }
4982
4983 /**
4984  * amdgpu_device_recover_vram - Recover some VRAM contents
4985  *
4986  * @adev: amdgpu_device pointer
4987  *
4988  * Restores the contents of VRAM buffers from the shadows in GTT.  Used to
4989  * restore things like GPUVM page tables after a GPU reset where
4990  * the contents of VRAM might be lost.
4991  *
4992  * Returns:
4993  * 0 on success, negative error code on failure.
4994  */
4995 static int amdgpu_device_recover_vram(struct amdgpu_device *adev)
4996 {
4997         struct dma_fence *fence = NULL, *next = NULL;
4998         struct amdgpu_bo *shadow;
4999         struct amdgpu_bo_vm *vmbo;
5000         long r = 1, tmo;
5001
5002         if (amdgpu_sriov_runtime(adev))
5003                 tmo = msecs_to_jiffies(8000);
5004         else
5005                 tmo = msecs_to_jiffies(100);
5006
5007         dev_info(adev->dev, "recover vram bo from shadow start\n");
5008         mutex_lock(&adev->shadow_list_lock);
5009         list_for_each_entry(vmbo, &adev->shadow_list, shadow_list) {
5010                 /* If vm is compute context or adev is APU, shadow will be NULL */
5011                 if (!vmbo->shadow)
5012                         continue;
5013                 shadow = vmbo->shadow;
5014
5015                 /* No need to recover an evicted BO */
5016                 if (!shadow->tbo.resource ||
5017                     shadow->tbo.resource->mem_type != TTM_PL_TT ||
5018                     shadow->tbo.resource->start == AMDGPU_BO_INVALID_OFFSET ||
5019                     shadow->parent->tbo.resource->mem_type != TTM_PL_VRAM)
5020                         continue;
5021
5022                 r = amdgpu_bo_restore_shadow(shadow, &next);
5023                 if (r)
5024                         break;
5025
5026                 if (fence) {
5027                         tmo = dma_fence_wait_timeout(fence, false, tmo);
5028                         dma_fence_put(fence);
5029                         fence = next;
5030                         if (tmo == 0) {
5031                                 r = -ETIMEDOUT;
5032                                 break;
5033                         } else if (tmo < 0) {
5034                                 r = tmo;
5035                                 break;
5036                         }
5037                 } else {
5038                         fence = next;
5039                 }
5040         }
5041         mutex_unlock(&adev->shadow_list_lock);
5042
5043         if (fence)
5044                 tmo = dma_fence_wait_timeout(fence, false, tmo);
5045         dma_fence_put(fence);
5046
5047         if (r < 0 || tmo <= 0) {
5048                 dev_err(adev->dev, "recover vram bo from shadow failed, r is %ld, tmo is %ld\n", r, tmo);
5049                 return -EIO;
5050         }
5051
5052         dev_info(adev->dev, "recover vram bo from shadow done\n");
5053         return 0;
5054 }
5055
5056
5057 /**
5058  * amdgpu_device_reset_sriov - reset ASIC for SR-IOV vf
5059  *
5060  * @adev: amdgpu_device pointer
5061  * @reset_context: amdgpu reset context pointer
5062  *
5063  * do VF FLR and reinitialize Asic
5064  * return 0 means succeeded otherwise failed
5065  */
5066 static int amdgpu_device_reset_sriov(struct amdgpu_device *adev,
5067                                      struct amdgpu_reset_context *reset_context)
5068 {
5069         int r;
5070         struct amdgpu_hive_info *hive = NULL;
5071
5072         if (test_bit(AMDGPU_HOST_FLR, &reset_context->flags)) {
5073                 clear_bit(AMDGPU_HOST_FLR, &reset_context->flags);
5074                 r = amdgpu_virt_request_full_gpu(adev, true);
5075         } else {
5076                 r = amdgpu_virt_reset_gpu(adev);
5077         }
5078         if (r)
5079                 return r;
5080
5081         amdgpu_ras_set_fed(adev, false);
5082         amdgpu_irq_gpu_reset_resume_helper(adev);
5083
5084         /* some sw clean up VF needs to do before recover */
5085         amdgpu_virt_post_reset(adev);
5086
5087         /* Resume IP prior to SMC */
5088         r = amdgpu_device_ip_reinit_early_sriov(adev);
5089         if (r)
5090                 return r;
5091
5092         amdgpu_virt_init_data_exchange(adev);
5093
5094         r = amdgpu_device_fw_loading(adev);
5095         if (r)
5096                 return r;
5097
5098         /* now we are okay to resume SMC/CP/SDMA */
5099         r = amdgpu_device_ip_reinit_late_sriov(adev);
5100         if (r)
5101                 return r;
5102
5103         hive = amdgpu_get_xgmi_hive(adev);
5104         /* Update PSP FW topology after reset */
5105         if (hive && adev->gmc.xgmi.num_physical_nodes > 1)
5106                 r = amdgpu_xgmi_update_topology(hive, adev);
5107         if (hive)
5108                 amdgpu_put_xgmi_hive(hive);
5109         if (r)
5110                 return r;
5111
5112         r = amdgpu_ib_ring_tests(adev);
5113         if (r)
5114                 return r;
5115
5116         if (adev->virt.gim_feature & AMDGIM_FEATURE_GIM_FLR_VRAMLOST) {
5117                 amdgpu_inc_vram_lost(adev);
5118                 r = amdgpu_device_recover_vram(adev);
5119         }
5120         if (r)
5121                 return r;
5122
5123         /* need to be called during full access so we can't do it later like
5124          * bare-metal does.
5125          */
5126         amdgpu_amdkfd_post_reset(adev);
5127         amdgpu_virt_release_full_gpu(adev, true);
5128
5129         /* Aldebaran and gfx_11_0_3 support ras in SRIOV, so need resume ras during reset */
5130         if (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 2) ||
5131             amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3) ||
5132             amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4) ||
5133             amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(11, 0, 3))
5134                 amdgpu_ras_resume(adev);
5135         return 0;
5136 }
5137
5138 /**
5139  * amdgpu_device_has_job_running - check if there is any job in mirror list
5140  *
5141  * @adev: amdgpu_device pointer
5142  *
5143  * check if there is any job in mirror list
5144  */
5145 bool amdgpu_device_has_job_running(struct amdgpu_device *adev)
5146 {
5147         int i;
5148         struct drm_sched_job *job;
5149
5150         for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
5151                 struct amdgpu_ring *ring = adev->rings[i];
5152
5153                 if (!amdgpu_ring_sched_ready(ring))
5154                         continue;
5155
5156                 spin_lock(&ring->sched.job_list_lock);
5157                 job = list_first_entry_or_null(&ring->sched.pending_list,
5158                                                struct drm_sched_job, list);
5159                 spin_unlock(&ring->sched.job_list_lock);
5160                 if (job)
5161                         return true;
5162         }
5163         return false;
5164 }
5165
5166 /**
5167  * amdgpu_device_should_recover_gpu - check if we should try GPU recovery
5168  *
5169  * @adev: amdgpu_device pointer
5170  *
5171  * Check amdgpu_gpu_recovery and SRIOV status to see if we should try to recover
5172  * a hung GPU.
5173  */
5174 bool amdgpu_device_should_recover_gpu(struct amdgpu_device *adev)
5175 {
5176
5177         if (amdgpu_gpu_recovery == 0)
5178                 goto disabled;
5179
5180         /* Skip soft reset check in fatal error mode */
5181         if (!amdgpu_ras_is_poison_mode_supported(adev))
5182                 return true;
5183
5184         if (amdgpu_sriov_vf(adev))
5185                 return true;
5186
5187         if (amdgpu_gpu_recovery == -1) {
5188                 switch (adev->asic_type) {
5189 #ifdef CONFIG_DRM_AMDGPU_SI
5190                 case CHIP_VERDE:
5191                 case CHIP_TAHITI:
5192                 case CHIP_PITCAIRN:
5193                 case CHIP_OLAND:
5194                 case CHIP_HAINAN:
5195 #endif
5196 #ifdef CONFIG_DRM_AMDGPU_CIK
5197                 case CHIP_KAVERI:
5198                 case CHIP_KABINI:
5199                 case CHIP_MULLINS:
5200 #endif
5201                 case CHIP_CARRIZO:
5202                 case CHIP_STONEY:
5203                 case CHIP_CYAN_SKILLFISH:
5204                         goto disabled;
5205                 default:
5206                         break;
5207                 }
5208         }
5209
5210         return true;
5211
5212 disabled:
5213                 dev_info(adev->dev, "GPU recovery disabled.\n");
5214                 return false;
5215 }
5216
5217 int amdgpu_device_mode1_reset(struct amdgpu_device *adev)
5218 {
5219         u32 i;
5220         int ret = 0;
5221
5222         amdgpu_atombios_scratch_regs_engine_hung(adev, true);
5223
5224         dev_info(adev->dev, "GPU mode1 reset\n");
5225
5226         /* disable BM */
5227         pci_clear_master(adev->pdev);
5228
5229         amdgpu_device_cache_pci_state(adev->pdev);
5230
5231         if (amdgpu_dpm_is_mode1_reset_supported(adev)) {
5232                 dev_info(adev->dev, "GPU smu mode1 reset\n");
5233                 ret = amdgpu_dpm_mode1_reset(adev);
5234         } else {
5235                 dev_info(adev->dev, "GPU psp mode1 reset\n");
5236                 ret = psp_gpu_reset(adev);
5237         }
5238
5239         if (ret)
5240                 goto mode1_reset_failed;
5241
5242         amdgpu_device_load_pci_state(adev->pdev);
5243         ret = amdgpu_psp_wait_for_bootloader(adev);
5244         if (ret)
5245                 goto mode1_reset_failed;
5246
5247         /* wait for asic to come out of reset */
5248         for (i = 0; i < adev->usec_timeout; i++) {
5249                 u32 memsize = adev->nbio.funcs->get_memsize(adev);
5250
5251                 if (memsize != 0xffffffff)
5252                         break;
5253                 udelay(1);
5254         }
5255
5256         if (i >= adev->usec_timeout) {
5257                 ret = -ETIMEDOUT;
5258                 goto mode1_reset_failed;
5259         }
5260
5261         amdgpu_atombios_scratch_regs_engine_hung(adev, false);
5262
5263         return 0;
5264
5265 mode1_reset_failed:
5266         dev_err(adev->dev, "GPU mode1 reset failed\n");
5267         return ret;
5268 }
5269
5270 int amdgpu_device_pre_asic_reset(struct amdgpu_device *adev,
5271                                  struct amdgpu_reset_context *reset_context)
5272 {
5273         int i, r = 0;
5274         struct amdgpu_job *job = NULL;
5275         bool need_full_reset =
5276                 test_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);
5277
5278         if (reset_context->reset_req_dev == adev)
5279                 job = reset_context->job;
5280
5281         if (amdgpu_sriov_vf(adev)) {
5282                 /* stop the data exchange thread */
5283                 amdgpu_virt_fini_data_exchange(adev);
5284         }
5285
5286         amdgpu_fence_driver_isr_toggle(adev, true);
5287
5288         /* block all schedulers and reset given job's ring */
5289         for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
5290                 struct amdgpu_ring *ring = adev->rings[i];
5291
5292                 if (!amdgpu_ring_sched_ready(ring))
5293                         continue;
5294
5295                 /* Clear job fence from fence drv to avoid force_completion
5296                  * leave NULL and vm flush fence in fence drv
5297                  */
5298                 amdgpu_fence_driver_clear_job_fences(ring);
5299
5300                 /* after all hw jobs are reset, hw fence is meaningless, so force_completion */
5301                 amdgpu_fence_driver_force_completion(ring);
5302         }
5303
5304         amdgpu_fence_driver_isr_toggle(adev, false);
5305
5306         if (job && job->vm)
5307                 drm_sched_increase_karma(&job->base);
5308
5309         r = amdgpu_reset_prepare_hwcontext(adev, reset_context);
5310         /* If reset handler not implemented, continue; otherwise return */
5311         if (r == -EOPNOTSUPP)
5312                 r = 0;
5313         else
5314                 return r;
5315
5316         /* Don't suspend on bare metal if we are not going to HW reset the ASIC */
5317         if (!amdgpu_sriov_vf(adev)) {
5318
5319                 if (!need_full_reset)
5320                         need_full_reset = amdgpu_device_ip_need_full_reset(adev);
5321
5322                 if (!need_full_reset && amdgpu_gpu_recovery &&
5323                     amdgpu_device_ip_check_soft_reset(adev)) {
5324                         amdgpu_device_ip_pre_soft_reset(adev);
5325                         r = amdgpu_device_ip_soft_reset(adev);
5326                         amdgpu_device_ip_post_soft_reset(adev);
5327                         if (r || amdgpu_device_ip_check_soft_reset(adev)) {
5328                                 dev_info(adev->dev, "soft reset failed, will fallback to full reset!\n");
5329                                 need_full_reset = true;
5330                         }
5331                 }
5332
5333                 if (need_full_reset)
5334                         r = amdgpu_device_ip_suspend(adev);
5335                 if (need_full_reset)
5336                         set_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);
5337                 else
5338                         clear_bit(AMDGPU_NEED_FULL_RESET,
5339                                   &reset_context->flags);
5340         }
5341
5342         return r;
5343 }
5344
5345 static int amdgpu_reset_reg_dumps(struct amdgpu_device *adev)
5346 {
5347         int i;
5348
5349         lockdep_assert_held(&adev->reset_domain->sem);
5350
5351         for (i = 0; i < adev->reset_info.num_regs; i++) {
5352                 adev->reset_info.reset_dump_reg_value[i] =
5353                         RREG32(adev->reset_info.reset_dump_reg_list[i]);
5354
5355                 trace_amdgpu_reset_reg_dumps(adev->reset_info.reset_dump_reg_list[i],
5356                                              adev->reset_info.reset_dump_reg_value[i]);
5357         }
5358
5359         return 0;
5360 }
5361
5362 int amdgpu_do_asic_reset(struct list_head *device_list_handle,
5363                          struct amdgpu_reset_context *reset_context)
5364 {
5365         struct amdgpu_device *tmp_adev = NULL;
5366         bool need_full_reset, skip_hw_reset, vram_lost = false;
5367         int r = 0;
5368         uint32_t i;
5369
5370         /* Try reset handler method first */
5371         tmp_adev = list_first_entry(device_list_handle, struct amdgpu_device,
5372                                     reset_list);
5373
5374         if (!test_bit(AMDGPU_SKIP_COREDUMP, &reset_context->flags)) {
5375                 amdgpu_reset_reg_dumps(tmp_adev);
5376
5377                 dev_info(tmp_adev->dev, "Dumping IP State\n");
5378                 /* Trigger ip dump before we reset the asic */
5379                 for (i = 0; i < tmp_adev->num_ip_blocks; i++)
5380                         if (tmp_adev->ip_blocks[i].version->funcs->dump_ip_state)
5381                                 tmp_adev->ip_blocks[i].version->funcs
5382                                 ->dump_ip_state((void *)tmp_adev);
5383                 dev_info(tmp_adev->dev, "Dumping IP State Completed\n");
5384         }
5385
5386         reset_context->reset_device_list = device_list_handle;
5387         r = amdgpu_reset_perform_reset(tmp_adev, reset_context);
5388         /* If reset handler not implemented, continue; otherwise return */
5389         if (r == -EOPNOTSUPP)
5390                 r = 0;
5391         else
5392                 return r;
5393
5394         /* Reset handler not implemented, use the default method */
5395         need_full_reset =
5396                 test_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);
5397         skip_hw_reset = test_bit(AMDGPU_SKIP_HW_RESET, &reset_context->flags);
5398
5399         /*
5400          * ASIC reset has to be done on all XGMI hive nodes ASAP
5401          * to allow proper links negotiation in FW (within 1 sec)
5402          */
5403         if (!skip_hw_reset && need_full_reset) {
5404                 list_for_each_entry(tmp_adev, device_list_handle, reset_list) {
5405                         /* For XGMI run all resets in parallel to speed up the process */
5406                         if (tmp_adev->gmc.xgmi.num_physical_nodes > 1) {
5407                                 tmp_adev->gmc.xgmi.pending_reset = false;
5408                                 if (!queue_work(system_unbound_wq, &tmp_adev->xgmi_reset_work))
5409                                         r = -EALREADY;
5410                         } else
5411                                 r = amdgpu_asic_reset(tmp_adev);
5412
5413                         if (r) {
5414                                 dev_err(tmp_adev->dev, "ASIC reset failed with error, %d for drm dev, %s",
5415                                          r, adev_to_drm(tmp_adev)->unique);
5416                                 goto out;
5417                         }
5418                 }
5419
5420                 /* For XGMI wait for all resets to complete before proceed */
5421                 if (!r) {
5422                         list_for_each_entry(tmp_adev, device_list_handle, reset_list) {
5423                                 if (tmp_adev->gmc.xgmi.num_physical_nodes > 1) {
5424                                         flush_work(&tmp_adev->xgmi_reset_work);
5425                                         r = tmp_adev->asic_reset_res;
5426                                         if (r)
5427                                                 break;
5428                                 }
5429                         }
5430                 }
5431         }
5432
5433         if (!r && amdgpu_ras_intr_triggered()) {
5434                 list_for_each_entry(tmp_adev, device_list_handle, reset_list) {
5435                         amdgpu_ras_reset_error_count(tmp_adev, AMDGPU_RAS_BLOCK__MMHUB);
5436                 }
5437
5438                 amdgpu_ras_intr_cleared();
5439         }
5440
5441         list_for_each_entry(tmp_adev, device_list_handle, reset_list) {
5442                 if (need_full_reset) {
5443                         /* post card */
5444                         amdgpu_ras_set_fed(tmp_adev, false);
5445                         r = amdgpu_device_asic_init(tmp_adev);
5446                         if (r) {
5447                                 dev_warn(tmp_adev->dev, "asic atom init failed!");
5448                         } else {
5449                                 dev_info(tmp_adev->dev, "GPU reset succeeded, trying to resume\n");
5450
5451                                 r = amdgpu_device_ip_resume_phase1(tmp_adev);
5452                                 if (r)
5453                                         goto out;
5454
5455                                 vram_lost = amdgpu_device_check_vram_lost(tmp_adev);
5456
5457                                 if (!test_bit(AMDGPU_SKIP_COREDUMP, &reset_context->flags))
5458                                         amdgpu_coredump(tmp_adev, vram_lost, reset_context);
5459
5460                                 if (vram_lost) {
5461                                         DRM_INFO("VRAM is lost due to GPU reset!\n");
5462                                         amdgpu_inc_vram_lost(tmp_adev);
5463                                 }
5464
5465                                 r = amdgpu_device_fw_loading(tmp_adev);
5466                                 if (r)
5467                                         return r;
5468
5469                                 r = amdgpu_xcp_restore_partition_mode(
5470                                         tmp_adev->xcp_mgr);
5471                                 if (r)
5472                                         goto out;
5473
5474                                 r = amdgpu_device_ip_resume_phase2(tmp_adev);
5475                                 if (r)
5476                                         goto out;
5477
5478                                 if (tmp_adev->mman.buffer_funcs_ring->sched.ready)
5479                                         amdgpu_ttm_set_buffer_funcs_status(tmp_adev, true);
5480
5481                                 if (vram_lost)
5482                                         amdgpu_device_fill_reset_magic(tmp_adev);
5483
5484                                 /*
5485                                  * Add this ASIC as tracked as reset was already
5486                                  * complete successfully.
5487                                  */
5488                                 amdgpu_register_gpu_instance(tmp_adev);
5489
5490                                 if (!reset_context->hive &&
5491                                     tmp_adev->gmc.xgmi.num_physical_nodes > 1)
5492                                         amdgpu_xgmi_add_device(tmp_adev);
5493
5494                                 r = amdgpu_device_ip_late_init(tmp_adev);
5495                                 if (r)
5496                                         goto out;
5497
5498                                 drm_fb_helper_set_suspend_unlocked(adev_to_drm(tmp_adev)->fb_helper, false);
5499
5500                                 /*
5501                                  * The GPU enters bad state once faulty pages
5502                                  * by ECC has reached the threshold, and ras
5503                                  * recovery is scheduled next. So add one check
5504                                  * here to break recovery if it indeed exceeds
5505                                  * bad page threshold, and remind user to
5506                                  * retire this GPU or setting one bigger
5507                                  * bad_page_threshold value to fix this once
5508                                  * probing driver again.
5509                                  */
5510                                 if (!amdgpu_ras_eeprom_check_err_threshold(tmp_adev)) {
5511                                         /* must succeed. */
5512                                         amdgpu_ras_resume(tmp_adev);
5513                                 } else {
5514                                         r = -EINVAL;
5515                                         goto out;
5516                                 }
5517
5518                                 /* Update PSP FW topology after reset */
5519                                 if (reset_context->hive &&
5520                                     tmp_adev->gmc.xgmi.num_physical_nodes > 1)
5521                                         r = amdgpu_xgmi_update_topology(
5522                                                 reset_context->hive, tmp_adev);
5523                         }
5524                 }
5525
5526 out:
5527                 if (!r) {
5528                         amdgpu_irq_gpu_reset_resume_helper(tmp_adev);
5529                         r = amdgpu_ib_ring_tests(tmp_adev);
5530                         if (r) {
5531                                 dev_err(tmp_adev->dev, "ib ring test failed (%d).\n", r);
5532                                 need_full_reset = true;
5533                                 r = -EAGAIN;
5534                                 goto end;
5535                         }
5536                 }
5537
5538                 if (!r)
5539                         r = amdgpu_device_recover_vram(tmp_adev);
5540                 else
5541                         tmp_adev->asic_reset_res = r;
5542         }
5543
5544 end:
5545         if (need_full_reset)
5546                 set_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);
5547         else
5548                 clear_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);
5549         return r;
5550 }
5551
5552 static void amdgpu_device_set_mp1_state(struct amdgpu_device *adev)
5553 {
5554
5555         switch (amdgpu_asic_reset_method(adev)) {
5556         case AMD_RESET_METHOD_MODE1:
5557                 adev->mp1_state = PP_MP1_STATE_SHUTDOWN;
5558                 break;
5559         case AMD_RESET_METHOD_MODE2:
5560                 adev->mp1_state = PP_MP1_STATE_RESET;
5561                 break;
5562         default:
5563                 adev->mp1_state = PP_MP1_STATE_NONE;
5564                 break;
5565         }
5566 }
5567
5568 static void amdgpu_device_unset_mp1_state(struct amdgpu_device *adev)
5569 {
5570         amdgpu_vf_error_trans_all(adev);
5571         adev->mp1_state = PP_MP1_STATE_NONE;
5572 }
5573
5574 static void amdgpu_device_resume_display_audio(struct amdgpu_device *adev)
5575 {
5576         struct pci_dev *p = NULL;
5577
5578         p = pci_get_domain_bus_and_slot(pci_domain_nr(adev->pdev->bus),
5579                         adev->pdev->bus->number, 1);
5580         if (p) {
5581                 pm_runtime_enable(&(p->dev));
5582                 pm_runtime_resume(&(p->dev));
5583         }
5584
5585         pci_dev_put(p);
5586 }
5587
5588 static int amdgpu_device_suspend_display_audio(struct amdgpu_device *adev)
5589 {
5590         enum amd_reset_method reset_method;
5591         struct pci_dev *p = NULL;
5592         u64 expires;
5593
5594         /*
5595          * For now, only BACO and mode1 reset are confirmed
5596          * to suffer the audio issue without proper suspended.
5597          */
5598         reset_method = amdgpu_asic_reset_method(adev);
5599         if ((reset_method != AMD_RESET_METHOD_BACO) &&
5600              (reset_method != AMD_RESET_METHOD_MODE1))
5601                 return -EINVAL;
5602
5603         p = pci_get_domain_bus_and_slot(pci_domain_nr(adev->pdev->bus),
5604                         adev->pdev->bus->number, 1);
5605         if (!p)
5606                 return -ENODEV;
5607
5608         expires = pm_runtime_autosuspend_expiration(&(p->dev));
5609         if (!expires)
5610                 /*
5611                  * If we cannot get the audio device autosuspend delay,
5612                  * a fixed 4S interval will be used. Considering 3S is
5613                  * the audio controller default autosuspend delay setting.
5614                  * 4S used here is guaranteed to cover that.
5615                  */
5616                 expires = ktime_get_mono_fast_ns() + NSEC_PER_SEC * 4ULL;
5617
5618         while (!pm_runtime_status_suspended(&(p->dev))) {
5619                 if (!pm_runtime_suspend(&(p->dev)))
5620                         break;
5621
5622                 if (expires < ktime_get_mono_fast_ns()) {
5623                         dev_warn(adev->dev, "failed to suspend display audio\n");
5624                         pci_dev_put(p);
5625                         /* TODO: abort the succeeding gpu reset? */
5626                         return -ETIMEDOUT;
5627                 }
5628         }
5629
5630         pm_runtime_disable(&(p->dev));
5631
5632         pci_dev_put(p);
5633         return 0;
5634 }
5635
5636 static inline void amdgpu_device_stop_pending_resets(struct amdgpu_device *adev)
5637 {
5638         struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
5639
5640 #if defined(CONFIG_DEBUG_FS)
5641         if (!amdgpu_sriov_vf(adev))
5642                 cancel_work(&adev->reset_work);
5643 #endif
5644
5645         if (adev->kfd.dev)
5646                 cancel_work(&adev->kfd.reset_work);
5647
5648         if (amdgpu_sriov_vf(adev))
5649                 cancel_work(&adev->virt.flr_work);
5650
5651         if (con && adev->ras_enabled)
5652                 cancel_work(&con->recovery_work);
5653
5654 }
5655
5656 static int amdgpu_device_health_check(struct list_head *device_list_handle)
5657 {
5658         struct amdgpu_device *tmp_adev;
5659         int ret = 0;
5660         u32 status;
5661
5662         list_for_each_entry(tmp_adev, device_list_handle, reset_list) {
5663                 pci_read_config_dword(tmp_adev->pdev, PCI_COMMAND, &status);
5664                 if (PCI_POSSIBLE_ERROR(status)) {
5665                         dev_err(tmp_adev->dev, "device lost from bus!");
5666                         ret = -ENODEV;
5667                 }
5668         }
5669
5670         return ret;
5671 }
5672
5673 /**
5674  * amdgpu_device_gpu_recover - reset the asic and recover scheduler
5675  *
5676  * @adev: amdgpu_device pointer
5677  * @job: which job trigger hang
5678  * @reset_context: amdgpu reset context pointer
5679  *
5680  * Attempt to reset the GPU if it has hung (all asics).
5681  * Attempt to do soft-reset or full-reset and reinitialize Asic
5682  * Returns 0 for success or an error on failure.
5683  */
5684
5685 int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
5686                               struct amdgpu_job *job,
5687                               struct amdgpu_reset_context *reset_context)
5688 {
5689         struct list_head device_list, *device_list_handle =  NULL;
5690         bool job_signaled = false;
5691         struct amdgpu_hive_info *hive = NULL;
5692         struct amdgpu_device *tmp_adev = NULL;
5693         int i, r = 0;
5694         bool need_emergency_restart = false;
5695         bool audio_suspended = false;
5696         int retry_limit = AMDGPU_MAX_RETRY_LIMIT;
5697
5698         /*
5699          * Special case: RAS triggered and full reset isn't supported
5700          */
5701         need_emergency_restart = amdgpu_ras_need_emergency_restart(adev);
5702
5703         /*
5704          * Flush RAM to disk so that after reboot
5705          * the user can read log and see why the system rebooted.
5706          */
5707         if (need_emergency_restart && amdgpu_ras_get_context(adev) &&
5708                 amdgpu_ras_get_context(adev)->reboot) {
5709                 DRM_WARN("Emergency reboot.");
5710
5711                 ksys_sync_helper();
5712                 emergency_restart();
5713         }
5714
5715         dev_info(adev->dev, "GPU %s begin!\n",
5716                 need_emergency_restart ? "jobs stop":"reset");
5717
5718         if (!amdgpu_sriov_vf(adev))
5719                 hive = amdgpu_get_xgmi_hive(adev);
5720         if (hive)
5721                 mutex_lock(&hive->hive_lock);
5722
5723         reset_context->job = job;
5724         reset_context->hive = hive;
5725         /*
5726          * Build list of devices to reset.
5727          * In case we are in XGMI hive mode, resort the device list
5728          * to put adev in the 1st position.
5729          */
5730         INIT_LIST_HEAD(&device_list);
5731         if (!amdgpu_sriov_vf(adev) && (adev->gmc.xgmi.num_physical_nodes > 1) && hive) {
5732                 list_for_each_entry(tmp_adev, &hive->device_list, gmc.xgmi.head) {
5733                         list_add_tail(&tmp_adev->reset_list, &device_list);
5734                         if (adev->shutdown)
5735                                 tmp_adev->shutdown = true;
5736                 }
5737                 if (!list_is_first(&adev->reset_list, &device_list))
5738                         list_rotate_to_front(&adev->reset_list, &device_list);
5739                 device_list_handle = &device_list;
5740         } else {
5741                 list_add_tail(&adev->reset_list, &device_list);
5742                 device_list_handle = &device_list;
5743         }
5744
5745         if (!amdgpu_sriov_vf(adev)) {
5746                 r = amdgpu_device_health_check(device_list_handle);
5747                 if (r)
5748                         goto end_reset;
5749         }
5750
5751         /* We need to lock reset domain only once both for XGMI and single device */
5752         tmp_adev = list_first_entry(device_list_handle, struct amdgpu_device,
5753                                     reset_list);
5754         amdgpu_device_lock_reset_domain(tmp_adev->reset_domain);
5755
5756         /* block all schedulers and reset given job's ring */
5757         list_for_each_entry(tmp_adev, device_list_handle, reset_list) {
5758
5759                 amdgpu_device_set_mp1_state(tmp_adev);
5760
5761                 /*
5762                  * Try to put the audio codec into suspend state
5763                  * before gpu reset started.
5764                  *
5765                  * Due to the power domain of the graphics device
5766                  * is shared with AZ power domain. Without this,
5767                  * we may change the audio hardware from behind
5768                  * the audio driver's back. That will trigger
5769                  * some audio codec errors.
5770                  */
5771                 if (!amdgpu_device_suspend_display_audio(tmp_adev))
5772                         audio_suspended = true;
5773
5774                 amdgpu_ras_set_error_query_ready(tmp_adev, false);
5775
5776                 cancel_delayed_work_sync(&tmp_adev->delayed_init_work);
5777
5778                 amdgpu_amdkfd_pre_reset(tmp_adev, reset_context);
5779
5780                 /*
5781                  * Mark these ASICs to be reseted as untracked first
5782                  * And add them back after reset completed
5783                  */
5784                 amdgpu_unregister_gpu_instance(tmp_adev);
5785
5786                 drm_fb_helper_set_suspend_unlocked(adev_to_drm(tmp_adev)->fb_helper, true);
5787
5788                 /* disable ras on ALL IPs */
5789                 if (!need_emergency_restart &&
5790                       amdgpu_device_ip_need_full_reset(tmp_adev))
5791                         amdgpu_ras_suspend(tmp_adev);
5792
5793                 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
5794                         struct amdgpu_ring *ring = tmp_adev->rings[i];
5795
5796                         if (!amdgpu_ring_sched_ready(ring))
5797                                 continue;
5798
5799                         drm_sched_stop(&ring->sched, job ? &job->base : NULL);
5800
5801                         if (need_emergency_restart)
5802                                 amdgpu_job_stop_all_jobs_on_sched(&ring->sched);
5803                 }
5804                 atomic_inc(&tmp_adev->gpu_reset_counter);
5805         }
5806
5807         if (need_emergency_restart)
5808                 goto skip_sched_resume;
5809
5810         /*
5811          * Must check guilty signal here since after this point all old
5812          * HW fences are force signaled.
5813          *
5814          * job->base holds a reference to parent fence
5815          */
5816         if (job && dma_fence_is_signaled(&job->hw_fence)) {
5817                 job_signaled = true;
5818                 dev_info(adev->dev, "Guilty job already signaled, skipping HW reset");
5819                 goto skip_hw_reset;
5820         }
5821
5822 retry:  /* Rest of adevs pre asic reset from XGMI hive. */
5823         list_for_each_entry(tmp_adev, device_list_handle, reset_list) {
5824                 r = amdgpu_device_pre_asic_reset(tmp_adev, reset_context);
5825                 /*TODO Should we stop ?*/
5826                 if (r) {
5827                         dev_err(tmp_adev->dev, "GPU pre asic reset failed with err, %d for drm dev, %s ",
5828                                   r, adev_to_drm(tmp_adev)->unique);
5829                         tmp_adev->asic_reset_res = r;
5830                 }
5831         }
5832
5833         /* Actual ASIC resets if needed.*/
5834         /* Host driver will handle XGMI hive reset for SRIOV */
5835         if (amdgpu_sriov_vf(adev)) {
5836                 r = amdgpu_device_reset_sriov(adev, reset_context);
5837                 if (AMDGPU_RETRY_SRIOV_RESET(r) && (retry_limit--) > 0) {
5838                         amdgpu_virt_release_full_gpu(adev, true);
5839                         goto retry;
5840                 }
5841                 if (r)
5842                         adev->asic_reset_res = r;
5843         } else {
5844                 r = amdgpu_do_asic_reset(device_list_handle, reset_context);
5845                 if (r && r == -EAGAIN)
5846                         goto retry;
5847         }
5848
5849         list_for_each_entry(tmp_adev, device_list_handle, reset_list) {
5850                 /*
5851                  * Drop any pending non scheduler resets queued before reset is done.
5852                  * Any reset scheduled after this point would be valid. Scheduler resets
5853                  * were already dropped during drm_sched_stop and no new ones can come
5854                  * in before drm_sched_start.
5855                  */
5856                 amdgpu_device_stop_pending_resets(tmp_adev);
5857         }
5858
5859 skip_hw_reset:
5860
5861         /* Post ASIC reset for all devs .*/
5862         list_for_each_entry(tmp_adev, device_list_handle, reset_list) {
5863
5864                 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
5865                         struct amdgpu_ring *ring = tmp_adev->rings[i];
5866
5867                         if (!amdgpu_ring_sched_ready(ring))
5868                                 continue;
5869
5870                         drm_sched_start(&ring->sched, true);
5871                 }
5872
5873                 if (!drm_drv_uses_atomic_modeset(adev_to_drm(tmp_adev)) && !job_signaled)
5874                         drm_helper_resume_force_mode(adev_to_drm(tmp_adev));
5875
5876                 if (tmp_adev->asic_reset_res)
5877                         r = tmp_adev->asic_reset_res;
5878
5879                 tmp_adev->asic_reset_res = 0;
5880
5881                 if (r) {
5882                         /* bad news, how to tell it to userspace ? */
5883                         dev_info(tmp_adev->dev, "GPU reset(%d) failed\n", atomic_read(&tmp_adev->gpu_reset_counter));
5884                         amdgpu_vf_error_put(tmp_adev, AMDGIM_ERROR_VF_GPU_RESET_FAIL, 0, r);
5885                 } else {
5886                         dev_info(tmp_adev->dev, "GPU reset(%d) succeeded!\n", atomic_read(&tmp_adev->gpu_reset_counter));
5887                         if (amdgpu_acpi_smart_shift_update(adev_to_drm(tmp_adev), AMDGPU_SS_DEV_D0))
5888                                 DRM_WARN("smart shift update failed\n");
5889                 }
5890         }
5891
5892 skip_sched_resume:
5893         list_for_each_entry(tmp_adev, device_list_handle, reset_list) {
5894                 /* unlock kfd: SRIOV would do it separately */
5895                 if (!need_emergency_restart && !amdgpu_sriov_vf(tmp_adev))
5896                         amdgpu_amdkfd_post_reset(tmp_adev);
5897
5898                 /* kfd_post_reset will do nothing if kfd device is not initialized,
5899                  * need to bring up kfd here if it's not be initialized before
5900                  */
5901                 if (!adev->kfd.init_complete)
5902                         amdgpu_amdkfd_device_init(adev);
5903
5904                 if (audio_suspended)
5905                         amdgpu_device_resume_display_audio(tmp_adev);
5906
5907                 amdgpu_device_unset_mp1_state(tmp_adev);
5908
5909                 amdgpu_ras_set_error_query_ready(tmp_adev, true);
5910         }
5911
5912         tmp_adev = list_first_entry(device_list_handle, struct amdgpu_device,
5913                                             reset_list);
5914         amdgpu_device_unlock_reset_domain(tmp_adev->reset_domain);
5915
5916 end_reset:
5917         if (hive) {
5918                 mutex_unlock(&hive->hive_lock);
5919                 amdgpu_put_xgmi_hive(hive);
5920         }
5921
5922         if (r)
5923                 dev_info(adev->dev, "GPU reset end with ret = %d\n", r);
5924
5925         atomic_set(&adev->reset_domain->reset_res, r);
5926         return r;
5927 }
5928
5929 /**
5930  * amdgpu_device_partner_bandwidth - find the bandwidth of appropriate partner
5931  *
5932  * @adev: amdgpu_device pointer
5933  * @speed: pointer to the speed of the link
5934  * @width: pointer to the width of the link
5935  *
5936  * Evaluate the hierarchy to find the speed and bandwidth capabilities of the
5937  * first physical partner to an AMD dGPU.
5938  * This will exclude any virtual switches and links.
5939  */
5940 static void amdgpu_device_partner_bandwidth(struct amdgpu_device *adev,
5941                                             enum pci_bus_speed *speed,
5942                                             enum pcie_link_width *width)
5943 {
5944         struct pci_dev *parent = adev->pdev;
5945
5946         if (!speed || !width)
5947                 return;
5948
5949         *speed = PCI_SPEED_UNKNOWN;
5950         *width = PCIE_LNK_WIDTH_UNKNOWN;
5951
5952         if (amdgpu_device_pcie_dynamic_switching_supported(adev)) {
5953                 while ((parent = pci_upstream_bridge(parent))) {
5954                         /* skip upstream/downstream switches internal to dGPU*/
5955                         if (parent->vendor == PCI_VENDOR_ID_ATI)
5956                                 continue;
5957                         *speed = pcie_get_speed_cap(parent);
5958                         *width = pcie_get_width_cap(parent);
5959                         break;
5960                 }
5961         } else {
5962                 /* use the current speeds rather than max if switching is not supported */
5963                 pcie_bandwidth_available(adev->pdev, NULL, speed, width);
5964         }
5965 }
5966
5967 /**
5968  * amdgpu_device_get_pcie_info - fence pcie info about the PCIE slot
5969  *
5970  * @adev: amdgpu_device pointer
5971  *
5972  * Fetchs and stores in the driver the PCIE capabilities (gen speed
5973  * and lanes) of the slot the device is in. Handles APUs and
5974  * virtualized environments where PCIE config space may not be available.
5975  */
5976 static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev)
5977 {
5978         struct pci_dev *pdev;
5979         enum pci_bus_speed speed_cap, platform_speed_cap;
5980         enum pcie_link_width platform_link_width;
5981
5982         if (amdgpu_pcie_gen_cap)
5983                 adev->pm.pcie_gen_mask = amdgpu_pcie_gen_cap;
5984
5985         if (amdgpu_pcie_lane_cap)
5986                 adev->pm.pcie_mlw_mask = amdgpu_pcie_lane_cap;
5987
5988         /* covers APUs as well */
5989         if (pci_is_root_bus(adev->pdev->bus) && !amdgpu_passthrough(adev)) {
5990                 if (adev->pm.pcie_gen_mask == 0)
5991                         adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK;
5992                 if (adev->pm.pcie_mlw_mask == 0)
5993                         adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;
5994                 return;
5995         }
5996
5997         if (adev->pm.pcie_gen_mask && adev->pm.pcie_mlw_mask)
5998                 return;
5999
6000         amdgpu_device_partner_bandwidth(adev, &platform_speed_cap,
6001                                         &platform_link_width);
6002
6003         if (adev->pm.pcie_gen_mask == 0) {
6004                 /* asic caps */
6005                 pdev = adev->pdev;
6006                 speed_cap = pcie_get_speed_cap(pdev);
6007                 if (speed_cap == PCI_SPEED_UNKNOWN) {
6008                         adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
6009                                                   CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
6010                                                   CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3);
6011                 } else {
6012                         if (speed_cap == PCIE_SPEED_32_0GT)
6013                                 adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
6014                                                           CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
6015                                                           CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3 |
6016                                                           CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN4 |
6017                                                           CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN5);
6018                         else if (speed_cap == PCIE_SPEED_16_0GT)
6019                                 adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
6020                                                           CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
6021                                                           CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3 |
6022                                                           CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN4);
6023                         else if (speed_cap == PCIE_SPEED_8_0GT)
6024                                 adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
6025                                                           CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
6026                                                           CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3);
6027                         else if (speed_cap == PCIE_SPEED_5_0GT)
6028                                 adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
6029                                                           CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2);
6030                         else
6031                                 adev->pm.pcie_gen_mask |= CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1;
6032                 }
6033                 /* platform caps */
6034                 if (platform_speed_cap == PCI_SPEED_UNKNOWN) {
6035                         adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |
6036                                                    CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2);
6037                 } else {
6038                         if (platform_speed_cap == PCIE_SPEED_32_0GT)
6039                                 adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |
6040                                                            CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
6041                                                            CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3 |
6042                                                            CAIL_PCIE_LINK_SPEED_SUPPORT_GEN4 |
6043                                                            CAIL_PCIE_LINK_SPEED_SUPPORT_GEN5);
6044                         else if (platform_speed_cap == PCIE_SPEED_16_0GT)
6045                                 adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |
6046                                                            CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
6047                                                            CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3 |
6048                                                            CAIL_PCIE_LINK_SPEED_SUPPORT_GEN4);
6049                         else if (platform_speed_cap == PCIE_SPEED_8_0GT)
6050                                 adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |
6051                                                            CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
6052                                                            CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3);
6053                         else if (platform_speed_cap == PCIE_SPEED_5_0GT)
6054                                 adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |
6055                                                            CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2);
6056                         else
6057                                 adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1;
6058
6059                 }
6060         }
6061         if (adev->pm.pcie_mlw_mask == 0) {
6062                 if (platform_link_width == PCIE_LNK_WIDTH_UNKNOWN) {
6063                         adev->pm.pcie_mlw_mask |= AMDGPU_DEFAULT_PCIE_MLW_MASK;
6064                 } else {
6065                         switch (platform_link_width) {
6066                         case PCIE_LNK_X32:
6067                                 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |
6068                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
6069                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
6070                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
6071                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
6072                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6073                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
6074                                 break;
6075                         case PCIE_LNK_X16:
6076                                 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
6077                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
6078                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
6079                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
6080                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6081                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
6082                                 break;
6083                         case PCIE_LNK_X12:
6084                                 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
6085                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
6086                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
6087                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6088                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
6089                                 break;
6090                         case PCIE_LNK_X8:
6091                                 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
6092                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
6093                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6094                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
6095                                 break;
6096                         case PCIE_LNK_X4:
6097                                 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
6098                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6099                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
6100                                 break;
6101                         case PCIE_LNK_X2:
6102                                 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6103                                                           CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
6104                                 break;
6105                         case PCIE_LNK_X1:
6106                                 adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1;
6107                                 break;
6108                         default:
6109                                 break;
6110                         }
6111                 }
6112         }
6113 }
6114
6115 /**
6116  * amdgpu_device_is_peer_accessible - Check peer access through PCIe BAR
6117  *
6118  * @adev: amdgpu_device pointer
6119  * @peer_adev: amdgpu_device pointer for peer device trying to access @adev
6120  *
6121  * Return true if @peer_adev can access (DMA) @adev through the PCIe
6122  * BAR, i.e. @adev is "large BAR" and the BAR matches the DMA mask of
6123  * @peer_adev.
6124  */
6125 bool amdgpu_device_is_peer_accessible(struct amdgpu_device *adev,
6126                                       struct amdgpu_device *peer_adev)
6127 {
6128 #ifdef CONFIG_HSA_AMD_P2P
6129         uint64_t address_mask = peer_adev->dev->dma_mask ?
6130                 ~*peer_adev->dev->dma_mask : ~((1ULL << 32) - 1);
6131         resource_size_t aper_limit =
6132                 adev->gmc.aper_base + adev->gmc.aper_size - 1;
6133         bool p2p_access =
6134                 !adev->gmc.xgmi.connected_to_cpu &&
6135                 !(pci_p2pdma_distance(adev->pdev, peer_adev->dev, false) < 0);
6136
6137         return pcie_p2p && p2p_access && (adev->gmc.visible_vram_size &&
6138                 adev->gmc.real_vram_size == adev->gmc.visible_vram_size &&
6139                 !(adev->gmc.aper_base & address_mask ||
6140                   aper_limit & address_mask));
6141 #else
6142         return false;
6143 #endif
6144 }
6145
6146 int amdgpu_device_baco_enter(struct drm_device *dev)
6147 {
6148         struct amdgpu_device *adev = drm_to_adev(dev);
6149         struct amdgpu_ras *ras = amdgpu_ras_get_context(adev);
6150
6151         if (!amdgpu_device_supports_baco(dev))
6152                 return -ENOTSUPP;
6153
6154         if (ras && adev->ras_enabled &&
6155             adev->nbio.funcs->enable_doorbell_interrupt)
6156                 adev->nbio.funcs->enable_doorbell_interrupt(adev, false);
6157
6158         return amdgpu_dpm_baco_enter(adev);
6159 }
6160
6161 int amdgpu_device_baco_exit(struct drm_device *dev)
6162 {
6163         struct amdgpu_device *adev = drm_to_adev(dev);
6164         struct amdgpu_ras *ras = amdgpu_ras_get_context(adev);
6165         int ret = 0;
6166
6167         if (!amdgpu_device_supports_baco(dev))
6168                 return -ENOTSUPP;
6169
6170         ret = amdgpu_dpm_baco_exit(adev);
6171         if (ret)
6172                 return ret;
6173
6174         if (ras && adev->ras_enabled &&
6175             adev->nbio.funcs->enable_doorbell_interrupt)
6176                 adev->nbio.funcs->enable_doorbell_interrupt(adev, true);
6177
6178         if (amdgpu_passthrough(adev) && adev->nbio.funcs &&
6179             adev->nbio.funcs->clear_doorbell_interrupt)
6180                 adev->nbio.funcs->clear_doorbell_interrupt(adev);
6181
6182         return 0;
6183 }
6184
6185 /**
6186  * amdgpu_pci_error_detected - Called when a PCI error is detected.
6187  * @pdev: PCI device struct
6188  * @state: PCI channel state
6189  *
6190  * Description: Called when a PCI error is detected.
6191  *
6192  * Return: PCI_ERS_RESULT_NEED_RESET or PCI_ERS_RESULT_DISCONNECT.
6193  */
6194 pci_ers_result_t amdgpu_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
6195 {
6196         struct drm_device *dev = pci_get_drvdata(pdev);
6197         struct amdgpu_device *adev = drm_to_adev(dev);
6198         int i;
6199
6200         DRM_INFO("PCI error: detected callback, state(%d)!!\n", state);
6201
6202         if (adev->gmc.xgmi.num_physical_nodes > 1) {
6203                 DRM_WARN("No support for XGMI hive yet...");
6204                 return PCI_ERS_RESULT_DISCONNECT;
6205         }
6206
6207         adev->pci_channel_state = state;
6208
6209         switch (state) {
6210         case pci_channel_io_normal:
6211                 return PCI_ERS_RESULT_CAN_RECOVER;
6212         /* Fatal error, prepare for slot reset */
6213         case pci_channel_io_frozen:
6214                 /*
6215                  * Locking adev->reset_domain->sem will prevent any external access
6216                  * to GPU during PCI error recovery
6217                  */
6218                 amdgpu_device_lock_reset_domain(adev->reset_domain);
6219                 amdgpu_device_set_mp1_state(adev);
6220
6221                 /*
6222                  * Block any work scheduling as we do for regular GPU reset
6223                  * for the duration of the recovery
6224                  */
6225                 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
6226                         struct amdgpu_ring *ring = adev->rings[i];
6227
6228                         if (!amdgpu_ring_sched_ready(ring))
6229                                 continue;
6230
6231                         drm_sched_stop(&ring->sched, NULL);
6232                 }
6233                 atomic_inc(&adev->gpu_reset_counter);
6234                 return PCI_ERS_RESULT_NEED_RESET;
6235         case pci_channel_io_perm_failure:
6236                 /* Permanent error, prepare for device removal */
6237                 return PCI_ERS_RESULT_DISCONNECT;
6238         }
6239
6240         return PCI_ERS_RESULT_NEED_RESET;
6241 }
6242
6243 /**
6244  * amdgpu_pci_mmio_enabled - Enable MMIO and dump debug registers
6245  * @pdev: pointer to PCI device
6246  */
6247 pci_ers_result_t amdgpu_pci_mmio_enabled(struct pci_dev *pdev)
6248 {
6249
6250         DRM_INFO("PCI error: mmio enabled callback!!\n");
6251
6252         /* TODO - dump whatever for debugging purposes */
6253
6254         /* This called only if amdgpu_pci_error_detected returns
6255          * PCI_ERS_RESULT_CAN_RECOVER. Read/write to the device still
6256          * works, no need to reset slot.
6257          */
6258
6259         return PCI_ERS_RESULT_RECOVERED;
6260 }
6261
6262 /**
6263  * amdgpu_pci_slot_reset - Called when PCI slot has been reset.
6264  * @pdev: PCI device struct
6265  *
6266  * Description: This routine is called by the pci error recovery
6267  * code after the PCI slot has been reset, just before we
6268  * should resume normal operations.
6269  */
6270 pci_ers_result_t amdgpu_pci_slot_reset(struct pci_dev *pdev)
6271 {
6272         struct drm_device *dev = pci_get_drvdata(pdev);
6273         struct amdgpu_device *adev = drm_to_adev(dev);
6274         int r, i;
6275         struct amdgpu_reset_context reset_context;
6276         u32 memsize;
6277         struct list_head device_list;
6278         struct amdgpu_hive_info *hive;
6279         int hive_ras_recovery = 0;
6280         struct amdgpu_ras *ras;
6281
6282         /* PCI error slot reset should be skipped During RAS recovery */
6283         hive = amdgpu_get_xgmi_hive(adev);
6284         if (hive) {
6285                 hive_ras_recovery = atomic_read(&hive->ras_recovery);
6286                 amdgpu_put_xgmi_hive(hive);
6287         }
6288         ras = amdgpu_ras_get_context(adev);
6289         if ((amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3) ||
6290              amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4)) &&
6291             ras && (atomic_read(&ras->in_recovery) || hive_ras_recovery))
6292                 return PCI_ERS_RESULT_RECOVERED;
6293
6294         DRM_INFO("PCI error: slot reset callback!!\n");
6295
6296         memset(&reset_context, 0, sizeof(reset_context));
6297
6298         INIT_LIST_HEAD(&device_list);
6299         list_add_tail(&adev->reset_list, &device_list);
6300
6301         /* wait for asic to come out of reset */
6302         msleep(500);
6303
6304         /* Restore PCI confspace */
6305         amdgpu_device_load_pci_state(pdev);
6306
6307         /* confirm  ASIC came out of reset */
6308         for (i = 0; i < adev->usec_timeout; i++) {
6309                 memsize = amdgpu_asic_get_config_memsize(adev);
6310
6311                 if (memsize != 0xffffffff)
6312                         break;
6313                 udelay(1);
6314         }
6315         if (memsize == 0xffffffff) {
6316                 r = -ETIME;
6317                 goto out;
6318         }
6319
6320         reset_context.method = AMD_RESET_METHOD_NONE;
6321         reset_context.reset_req_dev = adev;
6322         set_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags);
6323         set_bit(AMDGPU_SKIP_HW_RESET, &reset_context.flags);
6324
6325         adev->no_hw_access = true;
6326         r = amdgpu_device_pre_asic_reset(adev, &reset_context);
6327         adev->no_hw_access = false;
6328         if (r)
6329                 goto out;
6330
6331         r = amdgpu_do_asic_reset(&device_list, &reset_context);
6332
6333 out:
6334         if (!r) {
6335                 if (amdgpu_device_cache_pci_state(adev->pdev))
6336                         pci_restore_state(adev->pdev);
6337
6338                 DRM_INFO("PCIe error recovery succeeded\n");
6339         } else {
6340                 DRM_ERROR("PCIe error recovery failed, err:%d", r);
6341                 amdgpu_device_unset_mp1_state(adev);
6342                 amdgpu_device_unlock_reset_domain(adev->reset_domain);
6343         }
6344
6345         return r ? PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_RECOVERED;
6346 }
6347
6348 /**
6349  * amdgpu_pci_resume() - resume normal ops after PCI reset
6350  * @pdev: pointer to PCI device
6351  *
6352  * Called when the error recovery driver tells us that its
6353  * OK to resume normal operation.
6354  */
6355 void amdgpu_pci_resume(struct pci_dev *pdev)
6356 {
6357         struct drm_device *dev = pci_get_drvdata(pdev);
6358         struct amdgpu_device *adev = drm_to_adev(dev);
6359         int i;
6360
6361
6362         DRM_INFO("PCI error: resume callback!!\n");
6363
6364         /* Only continue execution for the case of pci_channel_io_frozen */
6365         if (adev->pci_channel_state != pci_channel_io_frozen)
6366                 return;
6367
6368         for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
6369                 struct amdgpu_ring *ring = adev->rings[i];
6370
6371                 if (!amdgpu_ring_sched_ready(ring))
6372                         continue;
6373
6374                 drm_sched_start(&ring->sched, true);
6375         }
6376
6377         amdgpu_device_unset_mp1_state(adev);
6378         amdgpu_device_unlock_reset_domain(adev->reset_domain);
6379 }
6380
6381 bool amdgpu_device_cache_pci_state(struct pci_dev *pdev)
6382 {
6383         struct drm_device *dev = pci_get_drvdata(pdev);
6384         struct amdgpu_device *adev = drm_to_adev(dev);
6385         int r;
6386
6387         r = pci_save_state(pdev);
6388         if (!r) {
6389                 kfree(adev->pci_state);
6390
6391                 adev->pci_state = pci_store_saved_state(pdev);
6392
6393                 if (!adev->pci_state) {
6394                         DRM_ERROR("Failed to store PCI saved state");
6395                         return false;
6396                 }
6397         } else {
6398                 DRM_WARN("Failed to save PCI state, err:%d\n", r);
6399                 return false;
6400         }
6401
6402         return true;
6403 }
6404
6405 bool amdgpu_device_load_pci_state(struct pci_dev *pdev)
6406 {
6407         struct drm_device *dev = pci_get_drvdata(pdev);
6408         struct amdgpu_device *adev = drm_to_adev(dev);
6409         int r;
6410
6411         if (!adev->pci_state)
6412                 return false;
6413
6414         r = pci_load_saved_state(pdev, adev->pci_state);
6415
6416         if (!r) {
6417                 pci_restore_state(pdev);
6418         } else {
6419                 DRM_WARN("Failed to load PCI state, err:%d\n", r);
6420                 return false;
6421         }
6422
6423         return true;
6424 }
6425
6426 void amdgpu_device_flush_hdp(struct amdgpu_device *adev,
6427                 struct amdgpu_ring *ring)
6428 {
6429 #ifdef CONFIG_X86_64
6430         if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev))
6431                 return;
6432 #endif
6433         if (adev->gmc.xgmi.connected_to_cpu)
6434                 return;
6435
6436         if (ring && ring->funcs->emit_hdp_flush)
6437                 amdgpu_ring_emit_hdp_flush(ring);
6438         else
6439                 amdgpu_asic_flush_hdp(adev, ring);
6440 }
6441
6442 void amdgpu_device_invalidate_hdp(struct amdgpu_device *adev,
6443                 struct amdgpu_ring *ring)
6444 {
6445 #ifdef CONFIG_X86_64
6446         if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev))
6447                 return;
6448 #endif
6449         if (adev->gmc.xgmi.connected_to_cpu)
6450                 return;
6451
6452         amdgpu_asic_invalidate_hdp(adev, ring);
6453 }
6454
6455 int amdgpu_in_reset(struct amdgpu_device *adev)
6456 {
6457         return atomic_read(&adev->reset_domain->in_gpu_reset);
6458 }
6459
6460 /**
6461  * amdgpu_device_halt() - bring hardware to some kind of halt state
6462  *
6463  * @adev: amdgpu_device pointer
6464  *
6465  * Bring hardware to some kind of halt state so that no one can touch it
6466  * any more. It will help to maintain error context when error occurred.
6467  * Compare to a simple hang, the system will keep stable at least for SSH
6468  * access. Then it should be trivial to inspect the hardware state and
6469  * see what's going on. Implemented as following:
6470  *
6471  * 1. drm_dev_unplug() makes device inaccessible to user space(IOCTLs, etc),
6472  *    clears all CPU mappings to device, disallows remappings through page faults
6473  * 2. amdgpu_irq_disable_all() disables all interrupts
6474  * 3. amdgpu_fence_driver_hw_fini() signals all HW fences
6475  * 4. set adev->no_hw_access to avoid potential crashes after setp 5
6476  * 5. amdgpu_device_unmap_mmio() clears all MMIO mappings
6477  * 6. pci_disable_device() and pci_wait_for_pending_transaction()
6478  *    flush any in flight DMA operations
6479  */
6480 void amdgpu_device_halt(struct amdgpu_device *adev)
6481 {
6482         struct pci_dev *pdev = adev->pdev;
6483         struct drm_device *ddev = adev_to_drm(adev);
6484
6485         amdgpu_xcp_dev_unplug(adev);
6486         drm_dev_unplug(ddev);
6487
6488         amdgpu_irq_disable_all(adev);
6489
6490         amdgpu_fence_driver_hw_fini(adev);
6491
6492         adev->no_hw_access = true;
6493
6494         amdgpu_device_unmap_mmio(adev);
6495
6496         pci_disable_device(pdev);
6497         pci_wait_for_pending_transaction(pdev);
6498 }
6499
6500 u32 amdgpu_device_pcie_port_rreg(struct amdgpu_device *adev,
6501                                 u32 reg)
6502 {
6503         unsigned long flags, address, data;
6504         u32 r;
6505
6506         address = adev->nbio.funcs->get_pcie_port_index_offset(adev);
6507         data = adev->nbio.funcs->get_pcie_port_data_offset(adev);
6508
6509         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
6510         WREG32(address, reg * 4);
6511         (void)RREG32(address);
6512         r = RREG32(data);
6513         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
6514         return r;
6515 }
6516
6517 void amdgpu_device_pcie_port_wreg(struct amdgpu_device *adev,
6518                                 u32 reg, u32 v)
6519 {
6520         unsigned long flags, address, data;
6521
6522         address = adev->nbio.funcs->get_pcie_port_index_offset(adev);
6523         data = adev->nbio.funcs->get_pcie_port_data_offset(adev);
6524
6525         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
6526         WREG32(address, reg * 4);
6527         (void)RREG32(address);
6528         WREG32(data, v);
6529         (void)RREG32(data);
6530         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
6531 }
6532
6533 /**
6534  * amdgpu_device_switch_gang - switch to a new gang
6535  * @adev: amdgpu_device pointer
6536  * @gang: the gang to switch to
6537  *
6538  * Try to switch to a new gang.
6539  * Returns: NULL if we switched to the new gang or a reference to the current
6540  * gang leader.
6541  */
6542 struct dma_fence *amdgpu_device_switch_gang(struct amdgpu_device *adev,
6543                                             struct dma_fence *gang)
6544 {
6545         struct dma_fence *old = NULL;
6546
6547         do {
6548                 dma_fence_put(old);
6549                 rcu_read_lock();
6550                 old = dma_fence_get_rcu_safe(&adev->gang_submit);
6551                 rcu_read_unlock();
6552
6553                 if (old == gang)
6554                         break;
6555
6556                 if (!dma_fence_is_signaled(old))
6557                         return old;
6558
6559         } while (cmpxchg((struct dma_fence __force **)&adev->gang_submit,
6560                          old, gang) != old);
6561
6562         dma_fence_put(old);
6563         return NULL;
6564 }
6565
6566 bool amdgpu_device_has_display_hardware(struct amdgpu_device *adev)
6567 {
6568         switch (adev->asic_type) {
6569 #ifdef CONFIG_DRM_AMDGPU_SI
6570         case CHIP_HAINAN:
6571 #endif
6572         case CHIP_TOPAZ:
6573                 /* chips with no display hardware */
6574                 return false;
6575 #ifdef CONFIG_DRM_AMDGPU_SI
6576         case CHIP_TAHITI:
6577         case CHIP_PITCAIRN:
6578         case CHIP_VERDE:
6579         case CHIP_OLAND:
6580 #endif
6581 #ifdef CONFIG_DRM_AMDGPU_CIK
6582         case CHIP_BONAIRE:
6583         case CHIP_HAWAII:
6584         case CHIP_KAVERI:
6585         case CHIP_KABINI:
6586         case CHIP_MULLINS:
6587 #endif
6588         case CHIP_TONGA:
6589         case CHIP_FIJI:
6590         case CHIP_POLARIS10:
6591         case CHIP_POLARIS11:
6592         case CHIP_POLARIS12:
6593         case CHIP_VEGAM:
6594         case CHIP_CARRIZO:
6595         case CHIP_STONEY:
6596                 /* chips with display hardware */
6597                 return true;
6598         default:
6599                 /* IP discovery */
6600                 if (!amdgpu_ip_version(adev, DCE_HWIP, 0) ||
6601                     (adev->harvest_ip_mask & AMD_HARVEST_IP_DMU_MASK))
6602                         return false;
6603                 return true;
6604         }
6605 }
6606
6607 uint32_t amdgpu_device_wait_on_rreg(struct amdgpu_device *adev,
6608                 uint32_t inst, uint32_t reg_addr, char reg_name[],
6609                 uint32_t expected_value, uint32_t mask)
6610 {
6611         uint32_t ret = 0;
6612         uint32_t old_ = 0;
6613         uint32_t tmp_ = RREG32(reg_addr);
6614         uint32_t loop = adev->usec_timeout;
6615
6616         while ((tmp_ & (mask)) != (expected_value)) {
6617                 if (old_ != tmp_) {
6618                         loop = adev->usec_timeout;
6619                         old_ = tmp_;
6620                 } else
6621                         udelay(1);
6622                 tmp_ = RREG32(reg_addr);
6623                 loop--;
6624                 if (!loop) {
6625                         DRM_WARN("Register(%d) [%s] failed to reach value 0x%08x != 0x%08xn",
6626                                   inst, reg_name, (uint32_t)expected_value,
6627                                   (uint32_t)(tmp_ & (mask)));
6628                         ret = -ETIMEDOUT;
6629                         break;
6630                 }
6631         }
6632         return ret;
6633 }
This page took 0.439519 seconds and 4 git commands to generate.