brintos

brintos / linux-shallow public Read only

0
0
Text · 178.6 KiB · c2394c8 Raw
6607 lines · 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 a7 * copy of this software and associated documentation files (the "Software"),8 * to deal in the Software without restriction, including without limitation9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,10 * and/or sell copies of the Software, and to permit persons to whom the11 * Software is furnished to do so, subject to the following conditions:12 *13 * The above copyright notice and this permission notice shall be included in14 * all copies or substantial portions of the Software.15 *16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR20 * 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 OR22 * OTHER DEALINGS IN THE SOFTWARE.23 *24 * Authors: Dave Airlie25 *          Alex Deucher26 *          Jerome Glisse27 */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_SI56#include "si.h"57#endif58#ifdef CONFIG_DRM_AMDGPU_CIK59#include "cik.h"60#endif61#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#endif88 89MODULE_FIRMWARE("amdgpu/vega10_gpu_info.bin");90MODULE_FIRMWARE("amdgpu/vega12_gpu_info.bin");91MODULE_FIRMWARE("amdgpu/raven_gpu_info.bin");92MODULE_FIRMWARE("amdgpu/picasso_gpu_info.bin");93MODULE_FIRMWARE("amdgpu/raven2_gpu_info.bin");94MODULE_FIRMWARE("amdgpu/arcturus_gpu_info.bin");95MODULE_FIRMWARE("amdgpu/navi12_gpu_info.bin");96 97#define AMDGPU_RESUME_MS		200098#define AMDGPU_MAX_RETRY_LIMIT		299#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 104static const struct drm_driver amdgpu_kms_driver;105 106const 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 147static inline void amdgpu_device_stop_pending_resets(struct amdgpu_device *adev);148 149/**150 * DOC: pcie_replay_count151 *152 * The amdgpu driver provides a sysfs API for reporting the total number153 * of PCIe replays (NAKs)154 * The file pcie_replay_count is used for this and returns the total155 * number of replays as a sum of the NAKs generated and NAKs received156 */157 158static 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 168static DEVICE_ATTR(pcie_replay_count, 0444,169		amdgpu_device_get_pcie_replay_count, NULL);170 171static 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 208BIN_ATTR(reg_state, 0444, amdgpu_sysfs_reg_state_get, NULL,209	 AMDGPU_SYS_REG_STATE_END);210 211int 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 223void 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_info232 *233 * The amdgpu driver provides a sysfs API for giving board related information.234 * It provides the form factor information in the format235 *236 *   type : form factor237 *238 * Possible form factor values239 *240 * - "cem"		- PCIE CEM card241 * - "oam"		- Open Compute Accelerator Module242 * - "unknown"	- Not known243 *244 */245 246static 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 273static DEVICE_ATTR(board_info, 0444, amdgpu_device_get_board_info, NULL);274 275static struct attribute *amdgpu_board_attrs[] = {276	&dev_attr_board_info.attr,277	NULL,278};279 280static 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 293static const struct attribute_group amdgpu_board_attrs_group = {294	.attrs = amdgpu_board_attrs,295	.is_visible = amdgpu_board_attrs_is_visible296};297 298static 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 control303 *304 * @dev: drm_device pointer305 *306 * Returns true if the device is a dGPU with ATPX power control,307 * otherwise return false.308 */309bool 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 resources320 *321 * @dev: drm_device pointer322 *323 * Returns true if the device is a dGPU with ACPI power control,324 * otherwise return false.325 */326bool 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 BACO338 *339 * @dev: drm_device pointer340 *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 */346int 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 353void 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 424no_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 with430 * smart shift support431 *432 * @dev: drm_device pointer433 *434 * Returns true if the device is a dGPU with Smart Shift support,435 * otherwise returns false.436 */437bool 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 functions445 */446 447/**448 * amdgpu_device_mm_access - access vram by MM_INDEX/MM_DATA449 *450 * @adev: amdgpu_device pointer451 * @pos: offset of the buffer in vram452 * @buf: virtual address of the buffer in system memory453 * @size: read/write size, sizeof(@buf) must > @size454 * @write: true - write to vram, otherwise - read from vram455 */456void 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		else482			*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 aperature491 *492 * @adev: amdgpu_device pointer493 * @pos: offset of the buffer in vram494 * @buf: virtual address of the buffer in system memory495 * @size: read/write size, sizeof(@buf) must > @size496 * @write: true - write to vram, otherwise - read from vram497 *498 * The return value means how many bytes have been transferred.499 */500size_t amdgpu_device_aper_access(struct amdgpu_device *adev, loff_t pos,501				 void *buf, size_t size, bool write)502{503#ifdef CONFIG_64BIT504	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 reordering519			 * after the system memory contents are sent over PCIe device520			 */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 read526			 * to the PCIe device527			 */528			mb();529			memcpy_fromio(buf, addr, count);530		}531 532	}533 534	return count;535#else536	return 0;537#endif538}539 540/**541 * amdgpu_device_vram_access - read/write a buffer in vram542 *543 * @adev: amdgpu_device pointer544 * @pos: offset of the buffer in vram545 * @buf: virtual address of the buffer in system memory546 * @size: read/write size, sizeof(@buf) must > @size547 * @write: true - write to vram, otherwise - read from vram548 */549void 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 */570bool amdgpu_device_skip_hw_access(struct amdgpu_device *adev)571{572	if (adev->no_hw_access)573		return true;574 575#ifdef CONFIG_LOCKDEP576	/*577	 * This is a bit complicated to understand, so worth a comment. What we assert578	 * 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 succeeds581	 * 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 read584	 * side of the lock or are the reset thread itself and hold the write side of585	 * the lock.586	 */587	if (in_task()) {588		if (down_read_trylock(&adev->reset_domain->sem))589			up_read(&adev->reset_domain->sem);590		else591			lockdep_assert_held(&adev->reset_domain->sem);592	}593#endif594	return false;595}596 597/**598 * amdgpu_device_rreg - read a memory mapped IO or indirect register599 *600 * @adev: amdgpu_device pointer601 * @reg: dword aligned register offset602 * @acc_flags: access flags which require special behavior603 *604 * Returns the 32 bit value from the offset specified.605 */606uint32_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 functions634 * @offset:bytes offset from MMIO start635 */636 637/**638 * amdgpu_mm_rreg8 - read a memory mapped IO register639 *640 * @adev: amdgpu_device pointer641 * @offset: byte aligned register offset642 *643 * Returns the 8 bit value from the offset specified.644 */645uint8_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 XCC658 *659 * @adev: amdgpu_device pointer660 * @reg: dword aligned register offset661 * @acc_flags: access flags which require special behavior662 * @xcc_id: xcc accelerated compute core id663 *664 * Returns the 32 bit value from the offset specified.665 */666uint32_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 functions700 * @offset:bytes offset from MMIO start701 * @value: the value want to be written to the register702 */703 704/**705 * amdgpu_mm_wreg8 - read a memory mapped IO register706 *707 * @adev: amdgpu_device pointer708 * @offset: byte aligned register offset709 * @value: 8 bit value to write710 *711 * Writes the value specified to the offset specified.712 */713void 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	else721		BUG();722}723 724/**725 * amdgpu_device_wreg - write to a memory mapped IO or indirect register726 *727 * @adev: amdgpu_device pointer728 * @reg: dword aligned register offset729 * @v: 32 bit value to write to the register730 * @acc_flags: access flags which require special behavior731 *732 * Writes the value specified to the offset specified.733 */734void 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 range759 *760 * @adev: amdgpu_device pointer761 * @reg: mmio/rlc register762 * @v: value to write763 * @xcc_id: xcc accelerated compute core id764 *765 * this function is invoked only for the debugfs register access766 */767void 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 XCC788 *789 * @adev: amdgpu_device pointer790 * @reg: dword aligned register offset791 * @v: 32 bit value to write to the register792 * @acc_flags: access flags which require special behavior793 * @xcc_id: xcc accelerated compute core id794 *795 * Writes the value specified to the offset specified.796 */797void 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 register829 *830 * @adev: amdgpu_device pointer831 * @reg_addr: indirect register address to read from832 *833 * Returns the value of indirect register @reg_addr834 */835u32 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 858u32 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		else879			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 register912 *913 * @adev: amdgpu_device pointer914 * @reg_addr: indirect register address to read from915 *916 * Returns the value of indirect register @reg_addr917 */918u64 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 946u64 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 address998 *999 * @adev: amdgpu_device pointer1000 * @reg_addr: indirect register offset1001 * @reg_data: indirect register data1002 *1003 */1004void 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 1025void 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	else1038		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 address1067 *1068 * @adev: amdgpu_device pointer1069 * @reg_addr: indirect register offset1070 * @reg_data: indirect register data1071 *1072 */1073void 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 1100void 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_id1151 *1152 * @adev: amdgpu_device pointer1153 *1154 * Return device rev_id1155 */1156u32 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 function1163 *1164 * @adev: amdgpu_device pointer1165 * @reg: offset of register1166 *1167 * Dummy register read function.  Used for register blocks1168 * that certain asics don't have (all asics).1169 * Returns the value in the register.1170 */1171static 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 1178static 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 function1187 *1188 * @adev: amdgpu_device pointer1189 * @reg: offset of register1190 * @v: value to write to the register1191 *1192 * Dummy register read function.  Used for register blocks1193 * that certain asics don't have (all asics).1194 */1195static 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 1202static 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 function1211 *1212 * @adev: amdgpu_device pointer1213 * @reg: offset of register1214 *1215 * Dummy register read function.  Used for register blocks1216 * that certain asics don't have (all asics).1217 * Returns the value in the register.1218 */1219static 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 1226static 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 function1235 *1236 * @adev: amdgpu_device pointer1237 * @reg: offset of register1238 * @v: value to write to the register1239 *1240 * Dummy register read function.  Used for register blocks1241 * that certain asics don't have (all asics).1242 */1243static 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 1250static 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 function1259 *1260 * @adev: amdgpu_device pointer1261 * @block: offset of instance1262 * @reg: offset of register1263 *1264 * Dummy register read function.  Used for register blocks1265 * that certain asics don't have (all asics).1266 * Returns the value in the register.1267 */1268static 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 function1279 *1280 * @adev: amdgpu_device pointer1281 * @block: offset of instance1282 * @reg: offset of register1283 * @v: value to write to the register1284 *1285 * Dummy register read function.  Used for register blocks1286 * that certain asics don't have (all asics).1287 */1288static 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_init1299 *1300 * @adev: amdgpu_device pointer1301 *1302 * Does any asic specific work and then calls atom asic init.1303 */1304static 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 page1325 *1326 * @adev: amdgpu_device pointer1327 *1328 * Allocates a scratch page of VRAM for use by various things in the1329 * driver.1330 */1331static 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 page1343 *1344 * @adev: amdgpu_device pointer1345 *1346 * Frees the VRAM scratch page.1347 */1348static 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 pointer1357 * @registers: pointer to the register array1358 * @array_size: size of the register array1359 *1360 * Programs an array or registers with and or masks.1361 * This is a helper for setting golden registers.1362 */1363void 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			else1386				tmp |= or_mask;1387		}1388		WREG32(reg, tmp);1389	}1390}1391 1392/**1393 * amdgpu_device_pci_config_reset - reset the GPU1394 *1395 * @adev: amdgpu_device pointer1396 *1397 * Resets the GPU using the pci config reset sequence.1398 * Only applicable to asics prior to vega10.1399 */1400void 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 means1407 *1408 * @adev: amdgpu_device pointer1409 *1410 * Resets the GPU using generic pci reset interfaces (FLR, SBR, etc.).1411 */1412int 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 memory1420 * with the status of certain GPU events (fences, ring pointers,etc.).1421 */1422 1423/**1424 * amdgpu_device_wb_fini - Disable Writeback and free memory1425 *1426 * @adev: amdgpu_device pointer1427 *1428 * Disables Writeback and frees the Writeback memory (all asics).1429 * Used at driver shutdown.1430 */1431static 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 memory1443 *1444 * @adev: amdgpu_device pointer1445 *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 */1450static 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 entry1477 *1478 * @adev: amdgpu_device pointer1479 * @wb: wb index1480 *1481 * Allocate a wb slot for use by the driver (all asics).1482 * Returns 0 on success or -EINVAL on failure.1483 */1484int 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 entry1503 *1504 * @adev: amdgpu_device pointer1505 * @wb: wb index1506 *1507 * Free a wb slot allocated for use by the driver (all asics)1508 */1509void 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 BAR1522 *1523 * @adev: amdgpu_device pointer1524 *1525 * Try to resize FB BAR to make all VRAM CPU accessible. We try very hard not1526 * to fail, but if any of the BARs is not accessible after the size we abort1527 * driver loading by returning -ENODEV.1528 */1529int 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 of1594	 * 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 1605static 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 not1618 *1619 * @adev: amdgpu_device pointer1620 *1621 * Check if the asic has been initialized (all asics) at driver startup1622 * or post is needed if  hw reset is performed.1623 * Returns true if need or false if not.1624 */1625bool 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 reboot1637		 * some old smc fw still need driver do vPost otherwise gpu hang, while1638		 * those smc fw version above 22.15 doesn't have this flaw, so we force1639		 * vpost executed for smc version below 22.151640		 */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 may1684 * loosen this.1685 */1686bool 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 Rapids1712 * don't support dynamic speed switching. Until we have confirmation from Intel1713 * 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/26631717 */1718static 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#endif1730	return true;1731}1732 1733/**1734 * amdgpu_device_should_use_aspm - check if the device should program ASPM1735 *1736 * @adev: amdgpu_device pointer1737 *1738 * Confirm whether the module parameter and pcie bridge agree that ASPM should1739 * be set for this device.1740 *1741 * Returns true if it should be used or false if not.1742 */1743bool 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 decode1765 *1766 * @pdev: PCI device pointer1767 * @state: enable/disable vga decode1768 *1769 * Enable/disable vga decode (all asics).1770 * Returns VGA resource flags.1771 */1772static 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	else1782		return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;1783}1784 1785/**1786 * amdgpu_device_check_block_size - validate the vm block size1787 *1788 * @adev: amdgpu_device pointer1789 *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 the1793 * page table and the remaining bits are in the page directory.1794 */1795static 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 the1799	 * page table and the remaining bits are in the page directory1800	 */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 size1813 *1814 * @adev: amdgpu_device pointer1815 *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 */1819static 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 1832static 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 1866def_value1:1867	DRM_WARN("No enough system memory\n");1868def_value:1869	adev->pm.smu_prv_buffer_size = 0;1870}1871 1872static 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		else1890			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 params1911 *1912 * @adev: amdgpu_device pointer1913 *1914 * Validates certain module parameters and updates1915 * the associated values used by the driver (all asics).1916 */1917static int amdgpu_device_check_arguments(struct amdgpu_device *adev)1918{1919	int i;1920 1921	if (amdgpu_sched_jobs < 4) {1922		dev_warn(adev->dev, "sched jobs (%d) must be at least 4\n",1923			 amdgpu_sched_jobs);1924		amdgpu_sched_jobs = 4;1925	} else if (!is_power_of_2(amdgpu_sched_jobs)) {1926		dev_warn(adev->dev, "sched jobs (%d) must be a power of 2\n",1927			 amdgpu_sched_jobs);1928		amdgpu_sched_jobs = roundup_pow_of_two(amdgpu_sched_jobs);1929	}1930 1931	if (amdgpu_gart_size != -1 && amdgpu_gart_size < 32) {1932		/* gart size must be greater or equal to 32M */1933		dev_warn(adev->dev, "gart size (%d) too small\n",1934			 amdgpu_gart_size);1935		amdgpu_gart_size = -1;1936	}1937 1938	if (amdgpu_gtt_size != -1 && amdgpu_gtt_size < 32) {1939		/* gtt size must be greater or equal to 32M */1940		dev_warn(adev->dev, "gtt size (%d) too small\n",1941				 amdgpu_gtt_size);1942		amdgpu_gtt_size = -1;1943	}1944 1945	/* valid range is between 4 and 9 inclusive */1946	if (amdgpu_vm_fragment_size != -1 &&1947	    (amdgpu_vm_fragment_size > 9 || amdgpu_vm_fragment_size < 4)) {1948		dev_warn(adev->dev, "valid range is between 4 and 9\n");1949		amdgpu_vm_fragment_size = -1;1950	}1951 1952	if (amdgpu_sched_hw_submission < 2) {1953		dev_warn(adev->dev, "sched hw submission jobs (%d) must be at least 2\n",1954			 amdgpu_sched_hw_submission);1955		amdgpu_sched_hw_submission = 2;1956	} else if (!is_power_of_2(amdgpu_sched_hw_submission)) {1957		dev_warn(adev->dev, "sched hw submission jobs (%d) must be a power of 2\n",1958			 amdgpu_sched_hw_submission);1959		amdgpu_sched_hw_submission = roundup_pow_of_two(amdgpu_sched_hw_submission);1960	}1961 1962	if (amdgpu_reset_method < -1 || amdgpu_reset_method > 4) {1963		dev_warn(adev->dev, "invalid option for reset method, reverting to default\n");1964		amdgpu_reset_method = -1;1965	}1966 1967	amdgpu_device_check_smu_prv_buffer_size(adev);1968 1969	amdgpu_device_check_vm_size(adev);1970 1971	amdgpu_device_check_block_size(adev);1972 1973	adev->firmware.load_type = amdgpu_ucode_get_load_type(adev, amdgpu_fw_load_type);1974 1975	for (i = 0; i < MAX_XCP; i++)1976		adev->enforce_isolation[i] = !!enforce_isolation;1977 1978	return 0;1979}1980 1981/**1982 * amdgpu_switcheroo_set_state - set switcheroo state1983 *1984 * @pdev: pci dev pointer1985 * @state: vga_switcheroo state1986 *1987 * Callback for the switcheroo driver.  Suspends or resumes1988 * the asics before or after it is powered up using ACPI methods.1989 */1990static void amdgpu_switcheroo_set_state(struct pci_dev *pdev,1991					enum vga_switcheroo_state state)1992{1993	struct drm_device *dev = pci_get_drvdata(pdev);1994	int r;1995 1996	if (amdgpu_device_supports_px(dev) && state == VGA_SWITCHEROO_OFF)1997		return;1998 1999	if (state == VGA_SWITCHEROO_ON) {2000		pr_info("switched on\n");2001		/* don't suspend or resume card normally */2002		dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;2003 2004		pci_set_power_state(pdev, PCI_D0);2005		amdgpu_device_load_pci_state(pdev);2006		r = pci_enable_device(pdev);2007		if (r)2008			DRM_WARN("pci_enable_device failed (%d)\n", r);2009		amdgpu_device_resume(dev, true);2010 2011		dev->switch_power_state = DRM_SWITCH_POWER_ON;2012	} else {2013		pr_info("switched off\n");2014		dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;2015		amdgpu_device_prepare(dev);2016		amdgpu_device_suspend(dev, true);2017		amdgpu_device_cache_pci_state(pdev);2018		/* Shut down the device */2019		pci_disable_device(pdev);2020		pci_set_power_state(pdev, PCI_D3cold);2021		dev->switch_power_state = DRM_SWITCH_POWER_OFF;2022	}2023}2024 2025/**2026 * amdgpu_switcheroo_can_switch - see if switcheroo state can change2027 *2028 * @pdev: pci dev pointer2029 *2030 * Callback for the switcheroo driver.  Check of the switcheroo2031 * state can be changed.2032 * Returns true if the state can be changed, false if not.2033 */2034static bool amdgpu_switcheroo_can_switch(struct pci_dev *pdev)2035{2036	struct drm_device *dev = pci_get_drvdata(pdev);2037 2038       /*2039	* FIXME: open_count is protected by drm_global_mutex but that would lead to2040	* locking inversion with the driver load path. And the access here is2041	* completely racy anyway. So don't bother with locking for now.2042	*/2043	return atomic_read(&dev->open_count) == 0;2044}2045 2046static const struct vga_switcheroo_client_ops amdgpu_switcheroo_ops = {2047	.set_gpu_state = amdgpu_switcheroo_set_state,2048	.reprobe = NULL,2049	.can_switch = amdgpu_switcheroo_can_switch,2050};2051 2052/**2053 * amdgpu_device_ip_set_clockgating_state - set the CG state2054 *2055 * @dev: amdgpu_device pointer2056 * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.)2057 * @state: clockgating state (gate or ungate)2058 *2059 * Sets the requested clockgating state for all instances of2060 * the hardware IP specified.2061 * Returns the error code from the last instance.2062 */2063int amdgpu_device_ip_set_clockgating_state(void *dev,2064					   enum amd_ip_block_type block_type,2065					   enum amd_clockgating_state state)2066{2067	struct amdgpu_device *adev = dev;2068	int i, r = 0;2069 2070	for (i = 0; i < adev->num_ip_blocks; i++) {2071		if (!adev->ip_blocks[i].status.valid)2072			continue;2073		if (adev->ip_blocks[i].version->type != block_type)2074			continue;2075		if (!adev->ip_blocks[i].version->funcs->set_clockgating_state)2076			continue;2077		r = adev->ip_blocks[i].version->funcs->set_clockgating_state(2078			(void *)adev, state);2079		if (r)2080			DRM_ERROR("set_clockgating_state of IP block <%s> failed %d\n",2081				  adev->ip_blocks[i].version->funcs->name, r);2082	}2083	return r;2084}2085 2086/**2087 * amdgpu_device_ip_set_powergating_state - set the PG state2088 *2089 * @dev: amdgpu_device pointer2090 * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.)2091 * @state: powergating state (gate or ungate)2092 *2093 * Sets the requested powergating state for all instances of2094 * the hardware IP specified.2095 * Returns the error code from the last instance.2096 */2097int amdgpu_device_ip_set_powergating_state(void *dev,2098					   enum amd_ip_block_type block_type,2099					   enum amd_powergating_state state)2100{2101	struct amdgpu_device *adev = dev;2102	int i, r = 0;2103 2104	for (i = 0; i < adev->num_ip_blocks; i++) {2105		if (!adev->ip_blocks[i].status.valid)2106			continue;2107		if (adev->ip_blocks[i].version->type != block_type)2108			continue;2109		if (!adev->ip_blocks[i].version->funcs->set_powergating_state)2110			continue;2111		r = adev->ip_blocks[i].version->funcs->set_powergating_state(2112			(void *)adev, state);2113		if (r)2114			DRM_ERROR("set_powergating_state of IP block <%s> failed %d\n",2115				  adev->ip_blocks[i].version->funcs->name, r);2116	}2117	return r;2118}2119 2120/**2121 * amdgpu_device_ip_get_clockgating_state - get the CG state2122 *2123 * @adev: amdgpu_device pointer2124 * @flags: clockgating feature flags2125 *2126 * Walks the list of IPs on the device and updates the clockgating2127 * flags for each IP.2128 * Updates @flags with the feature flags for each hardware IP where2129 * clockgating is enabled.2130 */2131void amdgpu_device_ip_get_clockgating_state(struct amdgpu_device *adev,2132					    u64 *flags)2133{2134	int i;2135 2136	for (i = 0; i < adev->num_ip_blocks; i++) {2137		if (!adev->ip_blocks[i].status.valid)2138			continue;2139		if (adev->ip_blocks[i].version->funcs->get_clockgating_state)2140			adev->ip_blocks[i].version->funcs->get_clockgating_state((void *)adev, flags);2141	}2142}2143 2144/**2145 * amdgpu_device_ip_wait_for_idle - wait for idle2146 *2147 * @adev: amdgpu_device pointer2148 * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.)2149 *2150 * Waits for the request hardware IP to be idle.2151 * Returns 0 for success or a negative error code on failure.2152 */2153int amdgpu_device_ip_wait_for_idle(struct amdgpu_device *adev,2154				   enum amd_ip_block_type block_type)2155{2156	int i, r;2157 2158	for (i = 0; i < adev->num_ip_blocks; i++) {2159		if (!adev->ip_blocks[i].status.valid)2160			continue;2161		if (adev->ip_blocks[i].version->type == block_type) {2162			r = adev->ip_blocks[i].version->funcs->wait_for_idle((void *)adev);2163			if (r)2164				return r;2165			break;2166		}2167	}2168	return 0;2169 2170}2171 2172/**2173 * amdgpu_device_ip_is_idle - is the hardware IP idle2174 *2175 * @adev: amdgpu_device pointer2176 * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.)2177 *2178 * Check if the hardware IP is idle or not.2179 * Returns true if it the IP is idle, false if not.2180 */2181bool amdgpu_device_ip_is_idle(struct amdgpu_device *adev,2182			      enum amd_ip_block_type block_type)2183{2184	int i;2185 2186	for (i = 0; i < adev->num_ip_blocks; i++) {2187		if (!adev->ip_blocks[i].status.valid)2188			continue;2189		if (adev->ip_blocks[i].version->type == block_type)2190			return adev->ip_blocks[i].version->funcs->is_idle((void *)adev);2191	}2192	return true;2193 2194}2195 2196/**2197 * amdgpu_device_ip_get_ip_block - get a hw IP pointer2198 *2199 * @adev: amdgpu_device pointer2200 * @type: Type of hardware IP (SMU, GFX, UVD, etc.)2201 *2202 * Returns a pointer to the hardware IP block structure2203 * if it exists for the asic, otherwise NULL.2204 */2205struct amdgpu_ip_block *2206amdgpu_device_ip_get_ip_block(struct amdgpu_device *adev,2207			      enum amd_ip_block_type type)2208{2209	int i;2210 2211	for (i = 0; i < adev->num_ip_blocks; i++)2212		if (adev->ip_blocks[i].version->type == type)2213			return &adev->ip_blocks[i];2214 2215	return NULL;2216}2217 2218/**2219 * amdgpu_device_ip_block_version_cmp2220 *2221 * @adev: amdgpu_device pointer2222 * @type: enum amd_ip_block_type2223 * @major: major version2224 * @minor: minor version2225 *2226 * return 0 if equal or greater2227 * return 1 if smaller or the ip_block doesn't exist2228 */2229int amdgpu_device_ip_block_version_cmp(struct amdgpu_device *adev,2230				       enum amd_ip_block_type type,2231				       u32 major, u32 minor)2232{2233	struct amdgpu_ip_block *ip_block = amdgpu_device_ip_get_ip_block(adev, type);2234 2235	if (ip_block && ((ip_block->version->major > major) ||2236			((ip_block->version->major == major) &&2237			(ip_block->version->minor >= minor))))2238		return 0;2239 2240	return 1;2241}2242 2243/**2244 * amdgpu_device_ip_block_add2245 *2246 * @adev: amdgpu_device pointer2247 * @ip_block_version: pointer to the IP to add2248 *2249 * Adds the IP block driver information to the collection of IPs2250 * on the asic.2251 */2252int amdgpu_device_ip_block_add(struct amdgpu_device *adev,2253			       const struct amdgpu_ip_block_version *ip_block_version)2254{2255	if (!ip_block_version)2256		return -EINVAL;2257 2258	switch (ip_block_version->type) {2259	case AMD_IP_BLOCK_TYPE_VCN:2260		if (adev->harvest_ip_mask & AMD_HARVEST_IP_VCN_MASK)2261			return 0;2262		break;2263	case AMD_IP_BLOCK_TYPE_JPEG:2264		if (adev->harvest_ip_mask & AMD_HARVEST_IP_JPEG_MASK)2265			return 0;2266		break;2267	default:2268		break;2269	}2270 2271	DRM_INFO("add ip block number %d <%s>\n", adev->num_ip_blocks,2272		  ip_block_version->funcs->name);2273 2274	adev->ip_blocks[adev->num_ip_blocks++].version = ip_block_version;2275 2276	return 0;2277}2278 2279/**2280 * amdgpu_device_enable_virtual_display - enable virtual display feature2281 *2282 * @adev: amdgpu_device pointer2283 *2284 * Enabled the virtual display feature if the user has enabled it via2285 * the module parameter virtual_display.  This feature provides a virtual2286 * display hardware on headless boards or in virtualized environments.2287 * This function parses and validates the configuration string specified by2288 * the user and configues the virtual display configuration (number of2289 * virtual connectors, crtcs, etc.) specified.2290 */2291static void amdgpu_device_enable_virtual_display(struct amdgpu_device *adev)2292{2293	adev->enable_virtual_display = false;2294 2295	if (amdgpu_virtual_display) {2296		const char *pci_address_name = pci_name(adev->pdev);2297		char *pciaddstr, *pciaddstr_tmp, *pciaddname_tmp, *pciaddname;2298 2299		pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL);2300		pciaddstr_tmp = pciaddstr;2301		while ((pciaddname_tmp = strsep(&pciaddstr_tmp, ";"))) {2302			pciaddname = strsep(&pciaddname_tmp, ",");2303			if (!strcmp("all", pciaddname)2304			    || !strcmp(pci_address_name, pciaddname)) {2305				long num_crtc;2306				int res = -1;2307 2308				adev->enable_virtual_display = true;2309 2310				if (pciaddname_tmp)2311					res = kstrtol(pciaddname_tmp, 10,2312						      &num_crtc);2313 2314				if (!res) {2315					if (num_crtc < 1)2316						num_crtc = 1;2317					if (num_crtc > 6)2318						num_crtc = 6;2319					adev->mode_info.num_crtc = num_crtc;2320				} else {2321					adev->mode_info.num_crtc = 1;2322				}2323				break;2324			}2325		}2326 2327		DRM_INFO("virtual display string:%s, %s:virtual_display:%d, num_crtc:%d\n",2328			 amdgpu_virtual_display, pci_address_name,2329			 adev->enable_virtual_display, adev->mode_info.num_crtc);2330 2331		kfree(pciaddstr);2332	}2333}2334 2335void amdgpu_device_set_sriov_virtual_display(struct amdgpu_device *adev)2336{2337	if (amdgpu_sriov_vf(adev) && !adev->enable_virtual_display) {2338		adev->mode_info.num_crtc = 1;2339		adev->enable_virtual_display = true;2340		DRM_INFO("virtual_display:%d, num_crtc:%d\n",2341			 adev->enable_virtual_display, adev->mode_info.num_crtc);2342	}2343}2344 2345/**2346 * amdgpu_device_parse_gpu_info_fw - parse gpu info firmware2347 *2348 * @adev: amdgpu_device pointer2349 *2350 * Parses the asic configuration parameters specified in the gpu info2351 * firmware and makes them availale to the driver for use in configuring2352 * the asic.2353 * Returns 0 on success, -EINVAL on failure.2354 */2355static int amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)2356{2357	const char *chip_name;2358	int err;2359	const struct gpu_info_firmware_header_v1_0 *hdr;2360 2361	adev->firmware.gpu_info_fw = NULL;2362 2363	if (adev->mman.discovery_bin)2364		return 0;2365 2366	switch (adev->asic_type) {2367	default:2368		return 0;2369	case CHIP_VEGA10:2370		chip_name = "vega10";2371		break;2372	case CHIP_VEGA12:2373		chip_name = "vega12";2374		break;2375	case CHIP_RAVEN:2376		if (adev->apu_flags & AMD_APU_IS_RAVEN2)2377			chip_name = "raven2";2378		else if (adev->apu_flags & AMD_APU_IS_PICASSO)2379			chip_name = "picasso";2380		else2381			chip_name = "raven";2382		break;2383	case CHIP_ARCTURUS:2384		chip_name = "arcturus";2385		break;2386	case CHIP_NAVI12:2387		chip_name = "navi12";2388		break;2389	}2390 2391	err = amdgpu_ucode_request(adev, &adev->firmware.gpu_info_fw,2392				   "amdgpu/%s_gpu_info.bin", chip_name);2393	if (err) {2394		dev_err(adev->dev,2395			"Failed to get gpu_info firmware \"%s_gpu_info.bin\"\n",2396			chip_name);2397		goto out;2398	}2399 2400	hdr = (const struct gpu_info_firmware_header_v1_0 *)adev->firmware.gpu_info_fw->data;2401	amdgpu_ucode_print_gpu_info_hdr(&hdr->header);2402 2403	switch (hdr->version_major) {2404	case 1:2405	{2406		const struct gpu_info_firmware_v1_0 *gpu_info_fw =2407			(const struct gpu_info_firmware_v1_0 *)(adev->firmware.gpu_info_fw->data +2408								le32_to_cpu(hdr->header.ucode_array_offset_bytes));2409 2410		/*2411		 * Should be droped when DAL no longer needs it.2412		 */2413		if (adev->asic_type == CHIP_NAVI12)2414			goto parse_soc_bounding_box;2415 2416		adev->gfx.config.max_shader_engines = le32_to_cpu(gpu_info_fw->gc_num_se);2417		adev->gfx.config.max_cu_per_sh = le32_to_cpu(gpu_info_fw->gc_num_cu_per_sh);2418		adev->gfx.config.max_sh_per_se = le32_to_cpu(gpu_info_fw->gc_num_sh_per_se);2419		adev->gfx.config.max_backends_per_se = le32_to_cpu(gpu_info_fw->gc_num_rb_per_se);2420		adev->gfx.config.max_texture_channel_caches =2421			le32_to_cpu(gpu_info_fw->gc_num_tccs);2422		adev->gfx.config.max_gprs = le32_to_cpu(gpu_info_fw->gc_num_gprs);2423		adev->gfx.config.max_gs_threads = le32_to_cpu(gpu_info_fw->gc_num_max_gs_thds);2424		adev->gfx.config.gs_vgt_table_depth = le32_to_cpu(gpu_info_fw->gc_gs_table_depth);2425		adev->gfx.config.gs_prim_buffer_depth = le32_to_cpu(gpu_info_fw->gc_gsprim_buff_depth);2426		adev->gfx.config.double_offchip_lds_buf =2427			le32_to_cpu(gpu_info_fw->gc_double_offchip_lds_buffer);2428		adev->gfx.cu_info.wave_front_size = le32_to_cpu(gpu_info_fw->gc_wave_size);2429		adev->gfx.cu_info.max_waves_per_simd =2430			le32_to_cpu(gpu_info_fw->gc_max_waves_per_simd);2431		adev->gfx.cu_info.max_scratch_slots_per_cu =2432			le32_to_cpu(gpu_info_fw->gc_max_scratch_slots_per_cu);2433		adev->gfx.cu_info.lds_size = le32_to_cpu(gpu_info_fw->gc_lds_size);2434		if (hdr->version_minor >= 1) {2435			const struct gpu_info_firmware_v1_1 *gpu_info_fw =2436				(const struct gpu_info_firmware_v1_1 *)(adev->firmware.gpu_info_fw->data +2437									le32_to_cpu(hdr->header.ucode_array_offset_bytes));2438			adev->gfx.config.num_sc_per_sh =2439				le32_to_cpu(gpu_info_fw->num_sc_per_sh);2440			adev->gfx.config.num_packer_per_sc =2441				le32_to_cpu(gpu_info_fw->num_packer_per_sc);2442		}2443 2444parse_soc_bounding_box:2445		/*2446		 * soc bounding box info is not integrated in disocovery table,2447		 * we always need to parse it from gpu info firmware if needed.2448		 */2449		if (hdr->version_minor == 2) {2450			const struct gpu_info_firmware_v1_2 *gpu_info_fw =2451				(const struct gpu_info_firmware_v1_2 *)(adev->firmware.gpu_info_fw->data +2452									le32_to_cpu(hdr->header.ucode_array_offset_bytes));2453			adev->dm.soc_bounding_box = &gpu_info_fw->soc_bounding_box;2454		}2455		break;2456	}2457	default:2458		dev_err(adev->dev,2459			"Unsupported gpu_info table %d\n", hdr->header.ucode_version);2460		err = -EINVAL;2461		goto out;2462	}2463out:2464	return err;2465}2466 2467/**2468 * amdgpu_device_ip_early_init - run early init for hardware IPs2469 *2470 * @adev: amdgpu_device pointer2471 *2472 * Early initialization pass for hardware IPs.  The hardware IPs that make2473 * up each asic are discovered each IP's early_init callback is run.  This2474 * is the first stage in initializing the asic.2475 * Returns 0 on success, negative error code on failure.2476 */2477static int amdgpu_device_ip_early_init(struct amdgpu_device *adev)2478{2479	struct amdgpu_ip_block *ip_block;2480	struct pci_dev *parent;2481	int i, r;2482	bool total;2483 2484	amdgpu_device_enable_virtual_display(adev);2485 2486	if (amdgpu_sriov_vf(adev)) {2487		r = amdgpu_virt_request_full_gpu(adev, true);2488		if (r)2489			return r;2490	}2491 2492	switch (adev->asic_type) {2493#ifdef CONFIG_DRM_AMDGPU_SI2494	case CHIP_VERDE:2495	case CHIP_TAHITI:2496	case CHIP_PITCAIRN:2497	case CHIP_OLAND:2498	case CHIP_HAINAN:2499		adev->family = AMDGPU_FAMILY_SI;2500		r = si_set_ip_blocks(adev);2501		if (r)2502			return r;2503		break;2504#endif2505#ifdef CONFIG_DRM_AMDGPU_CIK2506	case CHIP_BONAIRE:2507	case CHIP_HAWAII:2508	case CHIP_KAVERI:2509	case CHIP_KABINI:2510	case CHIP_MULLINS:2511		if (adev->flags & AMD_IS_APU)2512			adev->family = AMDGPU_FAMILY_KV;2513		else2514			adev->family = AMDGPU_FAMILY_CI;2515 2516		r = cik_set_ip_blocks(adev);2517		if (r)2518			return r;2519		break;2520#endif2521	case CHIP_TOPAZ:2522	case CHIP_TONGA:2523	case CHIP_FIJI:2524	case CHIP_POLARIS10:2525	case CHIP_POLARIS11:2526	case CHIP_POLARIS12:2527	case CHIP_VEGAM:2528	case CHIP_CARRIZO:2529	case CHIP_STONEY:2530		if (adev->flags & AMD_IS_APU)2531			adev->family = AMDGPU_FAMILY_CZ;2532		else2533			adev->family = AMDGPU_FAMILY_VI;2534 2535		r = vi_set_ip_blocks(adev);2536		if (r)2537			return r;2538		break;2539	default:2540		r = amdgpu_discovery_set_ip_blocks(adev);2541		if (r)2542			return r;2543		break;2544	}2545 2546	if (amdgpu_has_atpx() &&2547	    (amdgpu_is_atpx_hybrid() ||2548	     amdgpu_has_atpx_dgpu_power_cntl()) &&2549	    ((adev->flags & AMD_IS_APU) == 0) &&2550	    !dev_is_removable(&adev->pdev->dev))2551		adev->flags |= AMD_IS_PX;2552 2553	if (!(adev->flags & AMD_IS_APU)) {2554		parent = pcie_find_root_port(adev->pdev);2555		adev->has_pr3 = parent ? pci_pr3_present(parent) : false;2556	}2557 2558 2559	adev->pm.pp_feature = amdgpu_pp_feature_mask;2560	if (amdgpu_sriov_vf(adev) || sched_policy == KFD_SCHED_POLICY_NO_HWS)2561		adev->pm.pp_feature &= ~PP_GFXOFF_MASK;2562	if (amdgpu_sriov_vf(adev) && adev->asic_type == CHIP_SIENNA_CICHLID)2563		adev->pm.pp_feature &= ~PP_OVERDRIVE_MASK;2564	if (!amdgpu_device_pcie_dynamic_switching_supported(adev))2565		adev->pm.pp_feature &= ~PP_PCIE_DPM_MASK;2566 2567	total = true;2568	for (i = 0; i < adev->num_ip_blocks; i++) {2569		if ((amdgpu_ip_block_mask & (1 << i)) == 0) {2570			DRM_WARN("disabled ip block: %d <%s>\n",2571				  i, adev->ip_blocks[i].version->funcs->name);2572			adev->ip_blocks[i].status.valid = false;2573		} else {2574			if (adev->ip_blocks[i].version->funcs->early_init) {2575				r = adev->ip_blocks[i].version->funcs->early_init((void *)adev);2576				if (r == -ENOENT) {2577					adev->ip_blocks[i].status.valid = false;2578				} else if (r) {2579					DRM_ERROR("early_init of IP block <%s> failed %d\n",2580						  adev->ip_blocks[i].version->funcs->name, r);2581					total = false;2582				} else {2583					adev->ip_blocks[i].status.valid = true;2584				}2585			} else {2586				adev->ip_blocks[i].status.valid = true;2587			}2588		}2589		/* get the vbios after the asic_funcs are set up */2590		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON) {2591			r = amdgpu_device_parse_gpu_info_fw(adev);2592			if (r)2593				return r;2594 2595			/* Read BIOS */2596			if (amdgpu_device_read_bios(adev)) {2597				if (!amdgpu_get_bios(adev))2598					return -EINVAL;2599 2600				r = amdgpu_atombios_init(adev);2601				if (r) {2602					dev_err(adev->dev, "amdgpu_atombios_init failed\n");2603					amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_INIT_FAIL, 0, 0);2604					return r;2605				}2606			}2607 2608			/*get pf2vf msg info at it's earliest time*/2609			if (amdgpu_sriov_vf(adev))2610				amdgpu_virt_init_data_exchange(adev);2611 2612		}2613	}2614	if (!total)2615		return -ENODEV;2616 2617	ip_block = amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_GFX);2618	if (ip_block->status.valid != false)2619		amdgpu_amdkfd_device_probe(adev);2620 2621	adev->cg_flags &= amdgpu_cg_mask;2622	adev->pg_flags &= amdgpu_pg_mask;2623 2624	return 0;2625}2626 2627static int amdgpu_device_ip_hw_init_phase1(struct amdgpu_device *adev)2628{2629	int i, r;2630 2631	for (i = 0; i < adev->num_ip_blocks; i++) {2632		if (!adev->ip_blocks[i].status.sw)2633			continue;2634		if (adev->ip_blocks[i].status.hw)2635			continue;2636		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||2637		    (amdgpu_sriov_vf(adev) && (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP)) ||2638		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH) {2639			r = adev->ip_blocks[i].version->funcs->hw_init(adev);2640			if (r) {2641				DRM_ERROR("hw_init of IP block <%s> failed %d\n",2642					  adev->ip_blocks[i].version->funcs->name, r);2643				return r;2644			}2645			adev->ip_blocks[i].status.hw = true;2646		}2647	}2648 2649	return 0;2650}2651 2652static int amdgpu_device_ip_hw_init_phase2(struct amdgpu_device *adev)2653{2654	int i, r;2655 2656	for (i = 0; i < adev->num_ip_blocks; i++) {2657		if (!adev->ip_blocks[i].status.sw)2658			continue;2659		if (adev->ip_blocks[i].status.hw)2660			continue;2661		r = adev->ip_blocks[i].version->funcs->hw_init(adev);2662		if (r) {2663			DRM_ERROR("hw_init of IP block <%s> failed %d\n",2664				  adev->ip_blocks[i].version->funcs->name, r);2665			return r;2666		}2667		adev->ip_blocks[i].status.hw = true;2668	}2669 2670	return 0;2671}2672 2673static int amdgpu_device_fw_loading(struct amdgpu_device *adev)2674{2675	int r = 0;2676	int i;2677	uint32_t smu_version;2678 2679	if (adev->asic_type >= CHIP_VEGA10) {2680		for (i = 0; i < adev->num_ip_blocks; i++) {2681			if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_PSP)2682				continue;2683 2684			if (!adev->ip_blocks[i].status.sw)2685				continue;2686 2687			/* no need to do the fw loading again if already done*/2688			if (adev->ip_blocks[i].status.hw == true)2689				break;2690 2691			if (amdgpu_in_reset(adev) || adev->in_suspend) {2692				r = adev->ip_blocks[i].version->funcs->resume(adev);2693				if (r) {2694					DRM_ERROR("resume of IP block <%s> failed %d\n",2695							  adev->ip_blocks[i].version->funcs->name, r);2696					return r;2697				}2698			} else {2699				r = adev->ip_blocks[i].version->funcs->hw_init(adev);2700				if (r) {2701					DRM_ERROR("hw_init of IP block <%s> failed %d\n",2702							  adev->ip_blocks[i].version->funcs->name, r);2703					return r;2704				}2705			}2706 2707			adev->ip_blocks[i].status.hw = true;2708			break;2709		}2710	}2711 2712	if (!amdgpu_sriov_vf(adev) || adev->asic_type == CHIP_TONGA)2713		r = amdgpu_pm_load_smu_firmware(adev, &smu_version);2714 2715	return r;2716}2717 2718static int amdgpu_device_init_schedulers(struct amdgpu_device *adev)2719{2720	long timeout;2721	int r, i;2722 2723	for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {2724		struct amdgpu_ring *ring = adev->rings[i];2725 2726		/* No need to setup the GPU scheduler for rings that don't need it */2727		if (!ring || ring->no_scheduler)2728			continue;2729 2730		switch (ring->funcs->type) {2731		case AMDGPU_RING_TYPE_GFX:2732			timeout = adev->gfx_timeout;2733			break;2734		case AMDGPU_RING_TYPE_COMPUTE:2735			timeout = adev->compute_timeout;2736			break;2737		case AMDGPU_RING_TYPE_SDMA:2738			timeout = adev->sdma_timeout;2739			break;2740		default:2741			timeout = adev->video_timeout;2742			break;2743		}2744 2745		r = drm_sched_init(&ring->sched, &amdgpu_sched_ops, NULL,2746				   DRM_SCHED_PRIORITY_COUNT,2747				   ring->num_hw_submission, 0,2748				   timeout, adev->reset_domain->wq,2749				   ring->sched_score, ring->name,2750				   adev->dev);2751		if (r) {2752			DRM_ERROR("Failed to create scheduler on ring %s.\n",2753				  ring->name);2754			return r;2755		}2756		r = amdgpu_uvd_entity_init(adev, ring);2757		if (r) {2758			DRM_ERROR("Failed to create UVD scheduling entity on ring %s.\n",2759				  ring->name);2760			return r;2761		}2762		r = amdgpu_vce_entity_init(adev, ring);2763		if (r) {2764			DRM_ERROR("Failed to create VCE scheduling entity on ring %s.\n",2765				  ring->name);2766			return r;2767		}2768	}2769 2770	amdgpu_xcp_update_partition_sched_list(adev);2771 2772	return 0;2773}2774 2775 2776/**2777 * amdgpu_device_ip_init - run init for hardware IPs2778 *2779 * @adev: amdgpu_device pointer2780 *2781 * Main initialization pass for hardware IPs.  The list of all the hardware2782 * IPs that make up the asic is walked and the sw_init and hw_init callbacks2783 * are run.  sw_init initializes the software state associated with each IP2784 * and hw_init initializes the hardware associated with each IP.2785 * Returns 0 on success, negative error code on failure.2786 */2787static int amdgpu_device_ip_init(struct amdgpu_device *adev)2788{2789	int i, r;2790 2791	r = amdgpu_ras_init(adev);2792	if (r)2793		return r;2794 2795	for (i = 0; i < adev->num_ip_blocks; i++) {2796		if (!adev->ip_blocks[i].status.valid)2797			continue;2798		r = adev->ip_blocks[i].version->funcs->sw_init((void *)adev);2799		if (r) {2800			DRM_ERROR("sw_init of IP block <%s> failed %d\n",2801				  adev->ip_blocks[i].version->funcs->name, r);2802			goto init_failed;2803		}2804		adev->ip_blocks[i].status.sw = true;2805 2806		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON) {2807			/* need to do common hw init early so everything is set up for gmc */2808			r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev);2809			if (r) {2810				DRM_ERROR("hw_init %d failed %d\n", i, r);2811				goto init_failed;2812			}2813			adev->ip_blocks[i].status.hw = true;2814		} else if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {2815			/* need to do gmc hw init early so we can allocate gpu mem */2816			/* Try to reserve bad pages early */2817			if (amdgpu_sriov_vf(adev))2818				amdgpu_virt_exchange_data(adev);2819 2820			r = amdgpu_device_mem_scratch_init(adev);2821			if (r) {2822				DRM_ERROR("amdgpu_mem_scratch_init failed %d\n", r);2823				goto init_failed;2824			}2825			r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev);2826			if (r) {2827				DRM_ERROR("hw_init %d failed %d\n", i, r);2828				goto init_failed;2829			}2830			r = amdgpu_device_wb_init(adev);2831			if (r) {2832				DRM_ERROR("amdgpu_device_wb_init failed %d\n", r);2833				goto init_failed;2834			}2835			adev->ip_blocks[i].status.hw = true;2836 2837			/* right after GMC hw init, we create CSA */2838			if (adev->gfx.mcbp) {2839				r = amdgpu_allocate_static_csa(adev, &adev->virt.csa_obj,2840							       AMDGPU_GEM_DOMAIN_VRAM |2841							       AMDGPU_GEM_DOMAIN_GTT,2842							       AMDGPU_CSA_SIZE);2843				if (r) {2844					DRM_ERROR("allocate CSA failed %d\n", r);2845					goto init_failed;2846				}2847			}2848 2849			r = amdgpu_seq64_init(adev);2850			if (r) {2851				DRM_ERROR("allocate seq64 failed %d\n", r);2852				goto init_failed;2853			}2854		}2855	}2856 2857	if (amdgpu_sriov_vf(adev))2858		amdgpu_virt_init_data_exchange(adev);2859 2860	r = amdgpu_ib_pool_init(adev);2861	if (r) {2862		dev_err(adev->dev, "IB initialization failed (%d).\n", r);2863		amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_IB_INIT_FAIL, 0, r);2864		goto init_failed;2865	}2866 2867	r = amdgpu_ucode_create_bo(adev); /* create ucode bo when sw_init complete*/2868	if (r)2869		goto init_failed;2870 2871	r = amdgpu_device_ip_hw_init_phase1(adev);2872	if (r)2873		goto init_failed;2874 2875	r = amdgpu_device_fw_loading(adev);2876	if (r)2877		goto init_failed;2878 2879	r = amdgpu_device_ip_hw_init_phase2(adev);2880	if (r)2881		goto init_failed;2882 2883	/*2884	 * retired pages will be loaded from eeprom and reserved here,2885	 * it should be called after amdgpu_device_ip_hw_init_phase2  since2886	 * for some ASICs the RAS EEPROM code relies on SMU fully functioning2887	 * for I2C communication which only true at this point.2888	 *2889	 * amdgpu_ras_recovery_init may fail, but the upper only cares the2890	 * failure from bad gpu situation and stop amdgpu init process2891	 * accordingly. For other failed cases, it will still release all2892	 * the resource and print error message, rather than returning one2893	 * negative value to upper level.2894	 *2895	 * Note: theoretically, this should be called before all vram allocations2896	 * to protect retired page from abusing2897	 */2898	r = amdgpu_ras_recovery_init(adev);2899	if (r)2900		goto init_failed;2901 2902	/**2903	 * In case of XGMI grab extra reference for reset domain for this device2904	 */2905	if (adev->gmc.xgmi.num_physical_nodes > 1) {2906		if (amdgpu_xgmi_add_device(adev) == 0) {2907			if (!amdgpu_sriov_vf(adev)) {2908				struct amdgpu_hive_info *hive = amdgpu_get_xgmi_hive(adev);2909 2910				if (WARN_ON(!hive)) {2911					r = -ENOENT;2912					goto init_failed;2913				}2914 2915				if (!hive->reset_domain ||2916				    !amdgpu_reset_get_reset_domain(hive->reset_domain)) {2917					r = -ENOENT;2918					amdgpu_put_xgmi_hive(hive);2919					goto init_failed;2920				}2921 2922				/* Drop the early temporary reset domain we created for device */2923				amdgpu_reset_put_reset_domain(adev->reset_domain);2924				adev->reset_domain = hive->reset_domain;2925				amdgpu_put_xgmi_hive(hive);2926			}2927		}2928	}2929 2930	r = amdgpu_device_init_schedulers(adev);2931	if (r)2932		goto init_failed;2933 2934	if (adev->mman.buffer_funcs_ring->sched.ready)2935		amdgpu_ttm_set_buffer_funcs_status(adev, true);2936 2937	/* Don't init kfd if whole hive need to be reset during init */2938	if (!adev->gmc.xgmi.pending_reset) {2939		kgd2kfd_init_zone_device(adev);2940		amdgpu_amdkfd_device_init(adev);2941	}2942 2943	amdgpu_fru_get_product_info(adev);2944 2945init_failed:2946 2947	return r;2948}2949 2950/**2951 * amdgpu_device_fill_reset_magic - writes reset magic to gart pointer2952 *2953 * @adev: amdgpu_device pointer2954 *2955 * Writes a reset magic value to the gart pointer in VRAM.  The driver calls2956 * this function before a GPU reset.  If the value is retained after a2957 * GPU reset, VRAM has not been lost.  Some GPU resets may destry VRAM contents.2958 */2959static void amdgpu_device_fill_reset_magic(struct amdgpu_device *adev)2960{2961	memcpy(adev->reset_magic, adev->gart.ptr, AMDGPU_RESET_MAGIC_NUM);2962}2963 2964/**2965 * amdgpu_device_check_vram_lost - check if vram is valid2966 *2967 * @adev: amdgpu_device pointer2968 *2969 * Checks the reset magic value written to the gart pointer in VRAM.2970 * The driver calls this after a GPU reset to see if the contents of2971 * VRAM is lost or now.2972 * returns true if vram is lost, false if not.2973 */2974static bool amdgpu_device_check_vram_lost(struct amdgpu_device *adev)2975{2976	if (memcmp(adev->gart.ptr, adev->reset_magic,2977			AMDGPU_RESET_MAGIC_NUM))2978		return true;2979 2980	if (!amdgpu_in_reset(adev))2981		return false;2982 2983	/*2984	 * For all ASICs with baco/mode1 reset, the VRAM is2985	 * always assumed to be lost.2986	 */2987	switch (amdgpu_asic_reset_method(adev)) {2988	case AMD_RESET_METHOD_BACO:2989	case AMD_RESET_METHOD_MODE1:2990		return true;2991	default:2992		return false;2993	}2994}2995 2996/**2997 * amdgpu_device_set_cg_state - set clockgating for amdgpu device2998 *2999 * @adev: amdgpu_device pointer3000 * @state: clockgating state (gate or ungate)3001 *3002 * The list of all the hardware IPs that make up the asic is walked and the3003 * set_clockgating_state callbacks are run.3004 * Late initialization pass enabling clockgating for hardware IPs.3005 * Fini or suspend, pass disabling clockgating for hardware IPs.3006 * Returns 0 on success, negative error code on failure.3007 */3008 3009int amdgpu_device_set_cg_state(struct amdgpu_device *adev,3010			       enum amd_clockgating_state state)3011{3012	int i, j, r;3013 3014	if (amdgpu_emu_mode == 1)3015		return 0;3016 3017	for (j = 0; j < adev->num_ip_blocks; j++) {3018		i = state == AMD_CG_STATE_GATE ? j : adev->num_ip_blocks - j - 1;3019		if (!adev->ip_blocks[i].status.late_initialized)3020			continue;3021		/* skip CG for GFX, SDMA on S0ix */3022		if (adev->in_s0ix &&3023		    (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX ||3024		     adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SDMA))3025			continue;3026		/* skip CG for VCE/UVD, it's handled specially */3027		if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&3028		    adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE &&3029		    adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCN &&3030		    adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_JPEG &&3031		    adev->ip_blocks[i].version->funcs->set_clockgating_state) {3032			/* enable clockgating to save power */3033			r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,3034										     state);3035			if (r) {3036				DRM_ERROR("set_clockgating_state(gate) of IP block <%s> failed %d\n",3037					  adev->ip_blocks[i].version->funcs->name, r);3038				return r;3039			}3040		}3041	}3042 3043	return 0;3044}3045 3046int amdgpu_device_set_pg_state(struct amdgpu_device *adev,3047			       enum amd_powergating_state state)3048{3049	int i, j, r;3050 3051	if (amdgpu_emu_mode == 1)3052		return 0;3053 3054	for (j = 0; j < adev->num_ip_blocks; j++) {3055		i = state == AMD_PG_STATE_GATE ? j : adev->num_ip_blocks - j - 1;3056		if (!adev->ip_blocks[i].status.late_initialized)3057			continue;3058		/* skip PG for GFX, SDMA on S0ix */3059		if (adev->in_s0ix &&3060		    (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX ||3061		     adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SDMA))3062			continue;3063		/* skip CG for VCE/UVD, it's handled specially */3064		if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&3065		    adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE &&3066		    adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCN &&3067		    adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_JPEG &&3068		    adev->ip_blocks[i].version->funcs->set_powergating_state) {3069			/* enable powergating to save power */3070			r = adev->ip_blocks[i].version->funcs->set_powergating_state((void *)adev,3071											state);3072			if (r) {3073				DRM_ERROR("set_powergating_state(gate) of IP block <%s> failed %d\n",3074					  adev->ip_blocks[i].version->funcs->name, r);3075				return r;3076			}3077		}3078	}3079	return 0;3080}3081 3082static int amdgpu_device_enable_mgpu_fan_boost(void)3083{3084	struct amdgpu_gpu_instance *gpu_ins;3085	struct amdgpu_device *adev;3086	int i, ret = 0;3087 3088	mutex_lock(&mgpu_info.mutex);3089 3090	/*3091	 * MGPU fan boost feature should be enabled3092	 * only when there are two or more dGPUs in3093	 * the system3094	 */3095	if (mgpu_info.num_dgpu < 2)3096		goto out;3097 3098	for (i = 0; i < mgpu_info.num_dgpu; i++) {3099		gpu_ins = &(mgpu_info.gpu_ins[i]);3100		adev = gpu_ins->adev;3101		if (!(adev->flags & AMD_IS_APU) &&3102		    !gpu_ins->mgpu_fan_enabled) {3103			ret = amdgpu_dpm_enable_mgpu_fan_boost(adev);3104			if (ret)3105				break;3106 3107			gpu_ins->mgpu_fan_enabled = 1;3108		}3109	}3110 3111out:3112	mutex_unlock(&mgpu_info.mutex);3113 3114	return ret;3115}3116 3117/**3118 * amdgpu_device_ip_late_init - run late init for hardware IPs3119 *3120 * @adev: amdgpu_device pointer3121 *3122 * Late initialization pass for hardware IPs.  The list of all the hardware3123 * IPs that make up the asic is walked and the late_init callbacks are run.3124 * late_init covers any special initialization that an IP requires3125 * after all of the have been initialized or something that needs to happen3126 * late in the init process.3127 * Returns 0 on success, negative error code on failure.3128 */3129static int amdgpu_device_ip_late_init(struct amdgpu_device *adev)3130{3131	struct amdgpu_gpu_instance *gpu_instance;3132	int i = 0, r;3133 3134	for (i = 0; i < adev->num_ip_blocks; i++) {3135		if (!adev->ip_blocks[i].status.hw)3136			continue;3137		if (adev->ip_blocks[i].version->funcs->late_init) {3138			r = adev->ip_blocks[i].version->funcs->late_init((void *)adev);3139			if (r) {3140				DRM_ERROR("late_init of IP block <%s> failed %d\n",3141					  adev->ip_blocks[i].version->funcs->name, r);3142				return r;3143			}3144		}3145		adev->ip_blocks[i].status.late_initialized = true;3146	}3147 3148	r = amdgpu_ras_late_init(adev);3149	if (r) {3150		DRM_ERROR("amdgpu_ras_late_init failed %d", r);3151		return r;3152	}3153 3154	if (!amdgpu_in_reset(adev))3155		amdgpu_ras_set_error_query_ready(adev, true);3156 3157	amdgpu_device_set_cg_state(adev, AMD_CG_STATE_GATE);3158	amdgpu_device_set_pg_state(adev, AMD_PG_STATE_GATE);3159 3160	amdgpu_device_fill_reset_magic(adev);3161 3162	r = amdgpu_device_enable_mgpu_fan_boost();3163	if (r)3164		DRM_ERROR("enable mgpu fan boost failed (%d).\n", r);3165 3166	/* For passthrough configuration on arcturus and aldebaran, enable special handling SBR */3167	if (amdgpu_passthrough(adev) &&3168	    ((adev->asic_type == CHIP_ARCTURUS && adev->gmc.xgmi.num_physical_nodes > 1) ||3169	     adev->asic_type == CHIP_ALDEBARAN))3170		amdgpu_dpm_handle_passthrough_sbr(adev, true);3171 3172	if (adev->gmc.xgmi.num_physical_nodes > 1) {3173		mutex_lock(&mgpu_info.mutex);3174 3175		/*3176		 * Reset device p-state to low as this was booted with high.3177		 *3178		 * This should be performed only after all devices from the same3179		 * hive get initialized.3180		 *3181		 * However, it's unknown how many device in the hive in advance.3182		 * As this is counted one by one during devices initializations.3183		 *3184		 * So, we wait for all XGMI interlinked devices initialized.3185		 * This may bring some delays as those devices may come from3186		 * different hives. But that should be OK.3187		 */3188		if (mgpu_info.num_dgpu == adev->gmc.xgmi.num_physical_nodes) {3189			for (i = 0; i < mgpu_info.num_gpu; i++) {3190				gpu_instance = &(mgpu_info.gpu_ins[i]);3191				if (gpu_instance->adev->flags & AMD_IS_APU)3192					continue;3193 3194				r = amdgpu_xgmi_set_pstate(gpu_instance->adev,3195						AMDGPU_XGMI_PSTATE_MIN);3196				if (r) {3197					DRM_ERROR("pstate setting failed (%d).\n", r);3198					break;3199				}3200			}3201		}3202 3203		mutex_unlock(&mgpu_info.mutex);3204	}3205 3206	return 0;3207}3208 3209/**3210 * amdgpu_device_smu_fini_early - smu hw_fini wrapper3211 *3212 * @adev: amdgpu_device pointer3213 *3214 * For ASICs need to disable SMC first3215 */3216static void amdgpu_device_smu_fini_early(struct amdgpu_device *adev)3217{3218	int i, r;3219 3220	if (amdgpu_ip_version(adev, GC_HWIP, 0) > IP_VERSION(9, 0, 0))3221		return;3222 3223	for (i = 0; i < adev->num_ip_blocks; i++) {3224		if (!adev->ip_blocks[i].status.hw)3225			continue;3226		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) {3227			r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev);3228			/* XXX handle errors */3229			if (r) {3230				DRM_DEBUG("hw_fini of IP block <%s> failed %d\n",3231					  adev->ip_blocks[i].version->funcs->name, r);3232			}3233			adev->ip_blocks[i].status.hw = false;3234			break;3235		}3236	}3237}3238 3239static int amdgpu_device_ip_fini_early(struct amdgpu_device *adev)3240{3241	int i, r;3242 3243	for (i = 0; i < adev->num_ip_blocks; i++) {3244		if (!adev->ip_blocks[i].version->funcs->early_fini)3245			continue;3246 3247		r = adev->ip_blocks[i].version->funcs->early_fini((void *)adev);3248		if (r) {3249			DRM_DEBUG("early_fini of IP block <%s> failed %d\n",3250				  adev->ip_blocks[i].version->funcs->name, r);3251		}3252	}3253 3254	amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE);3255	amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE);3256 3257	amdgpu_amdkfd_suspend(adev, false);3258 3259	/* Workaroud for ASICs need to disable SMC first */3260	amdgpu_device_smu_fini_early(adev);3261 3262	for (i = adev->num_ip_blocks - 1; i >= 0; i--) {3263		if (!adev->ip_blocks[i].status.hw)3264			continue;3265 3266		r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev);3267		/* XXX handle errors */3268		if (r) {3269			DRM_DEBUG("hw_fini of IP block <%s> failed %d\n",3270				  adev->ip_blocks[i].version->funcs->name, r);3271		}3272 3273		adev->ip_blocks[i].status.hw = false;3274	}3275 3276	if (amdgpu_sriov_vf(adev)) {3277		if (amdgpu_virt_release_full_gpu(adev, false))3278			DRM_ERROR("failed to release exclusive mode on fini\n");3279	}3280 3281	return 0;3282}3283 3284/**3285 * amdgpu_device_ip_fini - run fini for hardware IPs3286 *3287 * @adev: amdgpu_device pointer3288 *3289 * Main teardown pass for hardware IPs.  The list of all the hardware3290 * IPs that make up the asic is walked and the hw_fini and sw_fini callbacks3291 * are run.  hw_fini tears down the hardware associated with each IP3292 * and sw_fini tears down any software state associated with each IP.3293 * Returns 0 on success, negative error code on failure.3294 */3295static int amdgpu_device_ip_fini(struct amdgpu_device *adev)3296{3297	int i, r;3298 3299	if (amdgpu_sriov_vf(adev) && adev->virt.ras_init_done)3300		amdgpu_virt_release_ras_err_handler_data(adev);3301 3302	if (adev->gmc.xgmi.num_physical_nodes > 1)3303		amdgpu_xgmi_remove_device(adev);3304 3305	amdgpu_amdkfd_device_fini_sw(adev);3306 3307	for (i = adev->num_ip_blocks - 1; i >= 0; i--) {3308		if (!adev->ip_blocks[i].status.sw)3309			continue;3310 3311		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {3312			amdgpu_ucode_free_bo(adev);3313			amdgpu_free_static_csa(&adev->virt.csa_obj);3314			amdgpu_device_wb_fini(adev);3315			amdgpu_device_mem_scratch_fini(adev);3316			amdgpu_ib_pool_fini(adev);3317			amdgpu_seq64_fini(adev);3318		}3319 3320		r = adev->ip_blocks[i].version->funcs->sw_fini((void *)adev);3321		/* XXX handle errors */3322		if (r) {3323			DRM_DEBUG("sw_fini of IP block <%s> failed %d\n",3324				  adev->ip_blocks[i].version->funcs->name, r);3325		}3326		adev->ip_blocks[i].status.sw = false;3327		adev->ip_blocks[i].status.valid = false;3328	}3329 3330	for (i = adev->num_ip_blocks - 1; i >= 0; i--) {3331		if (!adev->ip_blocks[i].status.late_initialized)3332			continue;3333		if (adev->ip_blocks[i].version->funcs->late_fini)3334			adev->ip_blocks[i].version->funcs->late_fini((void *)adev);3335		adev->ip_blocks[i].status.late_initialized = false;3336	}3337 3338	amdgpu_ras_fini(adev);3339 3340	return 0;3341}3342 3343/**3344 * amdgpu_device_delayed_init_work_handler - work handler for IB tests3345 *3346 * @work: work_struct.3347 */3348static void amdgpu_device_delayed_init_work_handler(struct work_struct *work)3349{3350	struct amdgpu_device *adev =3351		container_of(work, struct amdgpu_device, delayed_init_work.work);3352	int r;3353 3354	r = amdgpu_ib_ring_tests(adev);3355	if (r)3356		DRM_ERROR("ib ring test failed (%d).\n", r);3357}3358 3359static void amdgpu_device_delay_enable_gfx_off(struct work_struct *work)3360{3361	struct amdgpu_device *adev =3362		container_of(work, struct amdgpu_device, gfx.gfx_off_delay_work.work);3363 3364	WARN_ON_ONCE(adev->gfx.gfx_off_state);3365	WARN_ON_ONCE(adev->gfx.gfx_off_req_count);3366 3367	if (!amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, true))3368		adev->gfx.gfx_off_state = true;3369}3370 3371/**3372 * amdgpu_device_ip_suspend_phase1 - run suspend for hardware IPs (phase 1)3373 *3374 * @adev: amdgpu_device pointer3375 *3376 * Main suspend function for hardware IPs.  The list of all the hardware3377 * IPs that make up the asic is walked, clockgating is disabled and the3378 * suspend callbacks are run.  suspend puts the hardware and software state3379 * in each IP into a state suitable for suspend.3380 * Returns 0 on success, negative error code on failure.3381 */3382static int amdgpu_device_ip_suspend_phase1(struct amdgpu_device *adev)3383{3384	int i, r;3385 3386	amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE);3387	amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE);3388 3389	/*3390	 * Per PMFW team's suggestion, driver needs to handle gfxoff3391	 * and df cstate features disablement for gpu reset(e.g. Mode1Reset)3392	 * scenario. Add the missing df cstate disablement here.3393	 */3394	if (amdgpu_dpm_set_df_cstate(adev, DF_CSTATE_DISALLOW))3395		dev_warn(adev->dev, "Failed to disallow df cstate");3396 3397	for (i = adev->num_ip_blocks - 1; i >= 0; i--) {3398		if (!adev->ip_blocks[i].status.valid)3399			continue;3400 3401		/* displays are handled separately */3402		if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_DCE)3403			continue;3404 3405		/* XXX handle errors */3406		r = adev->ip_blocks[i].version->funcs->suspend(adev);3407		/* XXX handle errors */3408		if (r) {3409			DRM_ERROR("suspend of IP block <%s> failed %d\n",3410				  adev->ip_blocks[i].version->funcs->name, r);3411			return r;3412		}3413 3414		adev->ip_blocks[i].status.hw = false;3415	}3416 3417	return 0;3418}3419 3420/**3421 * amdgpu_device_ip_suspend_phase2 - run suspend for hardware IPs (phase 2)3422 *3423 * @adev: amdgpu_device pointer3424 *3425 * Main suspend function for hardware IPs.  The list of all the hardware3426 * IPs that make up the asic is walked, clockgating is disabled and the3427 * suspend callbacks are run.  suspend puts the hardware and software state3428 * in each IP into a state suitable for suspend.3429 * Returns 0 on success, negative error code on failure.3430 */3431static int amdgpu_device_ip_suspend_phase2(struct amdgpu_device *adev)3432{3433	int i, r;3434 3435	if (adev->in_s0ix)3436		amdgpu_dpm_gfx_state_change(adev, sGpuChangeState_D3Entry);3437 3438	for (i = adev->num_ip_blocks - 1; i >= 0; i--) {3439		if (!adev->ip_blocks[i].status.valid)3440			continue;3441		/* displays are handled in phase1 */3442		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE)3443			continue;3444		/* PSP lost connection when err_event_athub occurs */3445		if (amdgpu_ras_intr_triggered() &&3446		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP) {3447			adev->ip_blocks[i].status.hw = false;3448			continue;3449		}3450 3451		/* skip unnecessary suspend if we do not initialize them yet */3452		if (adev->gmc.xgmi.pending_reset &&3453		    !(adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||3454		      adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC ||3455		      adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||3456		      adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH)) {3457			adev->ip_blocks[i].status.hw = false;3458			continue;3459		}3460 3461		/* skip suspend of gfx/mes and psp for S0ix3462		 * gfx is in gfxoff state, so on resume it will exit gfxoff just3463		 * like at runtime. PSP is also part of the always on hardware3464		 * so no need to suspend it.3465		 */3466		if (adev->in_s0ix &&3467		    (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP ||3468		     adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX ||3469		     adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_MES))3470			continue;3471 3472		/* SDMA 5.x+ is part of GFX power domain so it's covered by GFXOFF */3473		if (adev->in_s0ix &&3474		    (amdgpu_ip_version(adev, SDMA0_HWIP, 0) >=3475		     IP_VERSION(5, 0, 0)) &&3476		    (adev->ip_blocks[i].version->type ==3477		     AMD_IP_BLOCK_TYPE_SDMA))3478			continue;3479 3480		/* Once swPSP provides the IMU, RLC FW binaries to TOS during cold-boot.3481		 * These are in TMR, hence are expected to be reused by PSP-TOS to reload3482		 * from this location and RLC Autoload automatically also gets loaded3483		 * from here based on PMFW -> PSP message during re-init sequence.3484		 * Therefore, the psp suspend & resume should be skipped to avoid destroy3485		 * the TMR and reload FWs again for IMU enabled APU ASICs.3486		 */3487		if (amdgpu_in_reset(adev) &&3488		    (adev->flags & AMD_IS_APU) && adev->gfx.imu.funcs &&3489		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP)3490			continue;3491 3492		/* XXX handle errors */3493		r = adev->ip_blocks[i].version->funcs->suspend(adev);3494		/* XXX handle errors */3495		if (r) {3496			DRM_ERROR("suspend of IP block <%s> failed %d\n",3497				  adev->ip_blocks[i].version->funcs->name, r);3498		}3499		adev->ip_blocks[i].status.hw = false;3500		/* handle putting the SMC in the appropriate state */3501		if (!amdgpu_sriov_vf(adev)) {3502			if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) {3503				r = amdgpu_dpm_set_mp1_state(adev, adev->mp1_state);3504				if (r) {3505					DRM_ERROR("SMC failed to set mp1 state %d, %d\n",3506							adev->mp1_state, r);3507					return r;3508				}3509			}3510		}3511	}3512 3513	return 0;3514}3515 3516/**3517 * amdgpu_device_ip_suspend - run suspend for hardware IPs3518 *3519 * @adev: amdgpu_device pointer3520 *3521 * Main suspend function for hardware IPs.  The list of all the hardware3522 * IPs that make up the asic is walked, clockgating is disabled and the3523 * suspend callbacks are run.  suspend puts the hardware and software state3524 * in each IP into a state suitable for suspend.3525 * Returns 0 on success, negative error code on failure.3526 */3527int amdgpu_device_ip_suspend(struct amdgpu_device *adev)3528{3529	int r;3530 3531	if (amdgpu_sriov_vf(adev)) {3532		amdgpu_virt_fini_data_exchange(adev);3533		amdgpu_virt_request_full_gpu(adev, false);3534	}3535 3536	amdgpu_ttm_set_buffer_funcs_status(adev, false);3537 3538	r = amdgpu_device_ip_suspend_phase1(adev);3539	if (r)3540		return r;3541	r = amdgpu_device_ip_suspend_phase2(adev);3542 3543	if (amdgpu_sriov_vf(adev))3544		amdgpu_virt_release_full_gpu(adev, false);3545 3546	return r;3547}3548 3549static int amdgpu_device_ip_reinit_early_sriov(struct amdgpu_device *adev)3550{3551	int i, r;3552 3553	static enum amd_ip_block_type ip_order[] = {3554		AMD_IP_BLOCK_TYPE_COMMON,3555		AMD_IP_BLOCK_TYPE_GMC,3556		AMD_IP_BLOCK_TYPE_PSP,3557		AMD_IP_BLOCK_TYPE_IH,3558	};3559 3560	for (i = 0; i < adev->num_ip_blocks; i++) {3561		int j;3562		struct amdgpu_ip_block *block;3563 3564		block = &adev->ip_blocks[i];3565		block->status.hw = false;3566 3567		for (j = 0; j < ARRAY_SIZE(ip_order); j++) {3568 3569			if (block->version->type != ip_order[j] ||3570				!block->status.valid)3571				continue;3572 3573			r = block->version->funcs->hw_init(adev);3574			DRM_INFO("RE-INIT-early: %s %s\n", block->version->funcs->name, r?"failed":"succeeded");3575			if (r)3576				return r;3577			block->status.hw = true;3578		}3579	}3580 3581	return 0;3582}3583 3584static int amdgpu_device_ip_reinit_late_sriov(struct amdgpu_device *adev)3585{3586	int i, r;3587 3588	static enum amd_ip_block_type ip_order[] = {3589		AMD_IP_BLOCK_TYPE_SMC,3590		AMD_IP_BLOCK_TYPE_DCE,3591		AMD_IP_BLOCK_TYPE_GFX,3592		AMD_IP_BLOCK_TYPE_SDMA,3593		AMD_IP_BLOCK_TYPE_MES,3594		AMD_IP_BLOCK_TYPE_UVD,3595		AMD_IP_BLOCK_TYPE_VCE,3596		AMD_IP_BLOCK_TYPE_VCN,3597		AMD_IP_BLOCK_TYPE_JPEG3598	};3599 3600	for (i = 0; i < ARRAY_SIZE(ip_order); i++) {3601		int j;3602		struct amdgpu_ip_block *block;3603 3604		for (j = 0; j < adev->num_ip_blocks; j++) {3605			block = &adev->ip_blocks[j];3606 3607			if (block->version->type != ip_order[i] ||3608				!block->status.valid ||3609				block->status.hw)3610				continue;3611 3612			if (block->version->type == AMD_IP_BLOCK_TYPE_SMC)3613				r = block->version->funcs->resume(adev);3614			else3615				r = block->version->funcs->hw_init(adev);3616 3617			DRM_INFO("RE-INIT-late: %s %s\n", block->version->funcs->name, r?"failed":"succeeded");3618			if (r)3619				return r;3620			block->status.hw = true;3621		}3622	}3623 3624	return 0;3625}3626 3627/**3628 * amdgpu_device_ip_resume_phase1 - run resume for hardware IPs3629 *3630 * @adev: amdgpu_device pointer3631 *3632 * First resume function for hardware IPs.  The list of all the hardware3633 * IPs that make up the asic is walked and the resume callbacks are run for3634 * COMMON, GMC, and IH.  resume puts the hardware into a functional state3635 * after a suspend and updates the software state as necessary.  This3636 * function is also used for restoring the GPU after a GPU reset.3637 * Returns 0 on success, negative error code on failure.3638 */3639static int amdgpu_device_ip_resume_phase1(struct amdgpu_device *adev)3640{3641	int i, r;3642 3643	for (i = 0; i < adev->num_ip_blocks; i++) {3644		if (!adev->ip_blocks[i].status.valid || adev->ip_blocks[i].status.hw)3645			continue;3646		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||3647		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||3648		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH ||3649		    (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP && amdgpu_sriov_vf(adev))) {3650 3651			r = adev->ip_blocks[i].version->funcs->resume(adev);3652			if (r) {3653				DRM_ERROR("resume of IP block <%s> failed %d\n",3654					  adev->ip_blocks[i].version->funcs->name, r);3655				return r;3656			}3657			adev->ip_blocks[i].status.hw = true;3658		}3659	}3660 3661	return 0;3662}3663 3664/**3665 * amdgpu_device_ip_resume_phase2 - run resume for hardware IPs3666 *3667 * @adev: amdgpu_device pointer3668 *3669 * First resume function for hardware IPs.  The list of all the hardware3670 * IPs that make up the asic is walked and the resume callbacks are run for3671 * all blocks except COMMON, GMC, and IH.  resume puts the hardware into a3672 * functional state after a suspend and updates the software state as3673 * necessary.  This function is also used for restoring the GPU after a GPU3674 * reset.3675 * Returns 0 on success, negative error code on failure.3676 */3677static int amdgpu_device_ip_resume_phase2(struct amdgpu_device *adev)3678{3679	int i, r;3680 3681	for (i = 0; i < adev->num_ip_blocks; i++) {3682		if (!adev->ip_blocks[i].status.valid || adev->ip_blocks[i].status.hw)3683			continue;3684		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||3685		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||3686		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH ||3687		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP)3688			continue;3689		r = adev->ip_blocks[i].version->funcs->resume(adev);3690		if (r) {3691			DRM_ERROR("resume of IP block <%s> failed %d\n",3692				  adev->ip_blocks[i].version->funcs->name, r);3693			return r;3694		}3695		adev->ip_blocks[i].status.hw = true;3696	}3697 3698	return 0;3699}3700 3701/**3702 * amdgpu_device_ip_resume - run resume for hardware IPs3703 *3704 * @adev: amdgpu_device pointer3705 *3706 * Main resume function for hardware IPs.  The hardware IPs3707 * are split into two resume functions because they are3708 * also used in recovering from a GPU reset and some additional3709 * steps need to be take between them.  In this case (S3/S4) they are3710 * run sequentially.3711 * Returns 0 on success, negative error code on failure.3712 */3713static int amdgpu_device_ip_resume(struct amdgpu_device *adev)3714{3715	int r;3716 3717	r = amdgpu_device_ip_resume_phase1(adev);3718	if (r)3719		return r;3720 3721	r = amdgpu_device_fw_loading(adev);3722	if (r)3723		return r;3724 3725	r = amdgpu_device_ip_resume_phase2(adev);3726 3727	if (adev->mman.buffer_funcs_ring->sched.ready)3728		amdgpu_ttm_set_buffer_funcs_status(adev, true);3729 3730	return r;3731}3732 3733/**3734 * amdgpu_device_detect_sriov_bios - determine if the board supports SR-IOV3735 *3736 * @adev: amdgpu_device pointer3737 *3738 * Query the VBIOS data tables to determine if the board supports SR-IOV.3739 */3740static void amdgpu_device_detect_sriov_bios(struct amdgpu_device *adev)3741{3742	if (amdgpu_sriov_vf(adev)) {3743		if (adev->is_atom_fw) {3744			if (amdgpu_atomfirmware_gpu_virtualization_supported(adev))3745				adev->virt.caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;3746		} else {3747			if (amdgpu_atombios_has_gpu_virtualization_table(adev))3748				adev->virt.caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;3749		}3750 3751		if (!(adev->virt.caps & AMDGPU_SRIOV_CAPS_SRIOV_VBIOS))3752			amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_NO_VBIOS, 0, 0);3753	}3754}3755 3756/**3757 * amdgpu_device_asic_has_dc_support - determine if DC supports the asic3758 *3759 * @asic_type: AMD asic type3760 *3761 * Check if there is DC (new modesetting infrastructre) support for an asic.3762 * returns true if DC has support, false if not.3763 */3764bool amdgpu_device_asic_has_dc_support(enum amd_asic_type asic_type)3765{3766	switch (asic_type) {3767#ifdef CONFIG_DRM_AMDGPU_SI3768	case CHIP_HAINAN:3769#endif3770	case CHIP_TOPAZ:3771		/* chips with no display hardware */3772		return false;3773#if defined(CONFIG_DRM_AMD_DC)3774	case CHIP_TAHITI:3775	case CHIP_PITCAIRN:3776	case CHIP_VERDE:3777	case CHIP_OLAND:3778		/*3779		 * We have systems in the wild with these ASICs that require3780		 * LVDS and VGA support which is not supported with DC.3781		 *3782		 * Fallback to the non-DC driver here by default so as not to3783		 * cause regressions.3784		 */3785#if defined(CONFIG_DRM_AMD_DC_SI)3786		return amdgpu_dc > 0;3787#else3788		return false;3789#endif3790	case CHIP_BONAIRE:3791	case CHIP_KAVERI:3792	case CHIP_KABINI:3793	case CHIP_MULLINS:3794		/*3795		 * We have systems in the wild with these ASICs that require3796		 * VGA support which is not supported with DC.3797		 *3798		 * Fallback to the non-DC driver here by default so as not to3799		 * cause regressions.3800		 */3801		return amdgpu_dc > 0;3802	default:3803		return amdgpu_dc != 0;3804#else3805	default:3806		if (amdgpu_dc > 0)3807			DRM_INFO_ONCE("Display Core has been requested via kernel parameter but isn't supported by ASIC, ignoring\n");3808		return false;3809#endif3810	}3811}3812 3813/**3814 * amdgpu_device_has_dc_support - check if dc is supported3815 *3816 * @adev: amdgpu_device pointer3817 *3818 * Returns true for supported, false for not supported3819 */3820bool amdgpu_device_has_dc_support(struct amdgpu_device *adev)3821{3822	if (adev->enable_virtual_display ||3823	    (adev->harvest_ip_mask & AMD_HARVEST_IP_DMU_MASK))3824		return false;3825 3826	return amdgpu_device_asic_has_dc_support(adev->asic_type);3827}3828 3829static void amdgpu_device_xgmi_reset_func(struct work_struct *__work)3830{3831	struct amdgpu_device *adev =3832		container_of(__work, struct amdgpu_device, xgmi_reset_work);3833	struct amdgpu_hive_info *hive = amdgpu_get_xgmi_hive(adev);3834 3835	/* It's a bug to not have a hive within this function */3836	if (WARN_ON(!hive))3837		return;3838 3839	/*3840	 * Use task barrier to synchronize all xgmi reset works across the3841	 * hive. task_barrier_enter and task_barrier_exit will block3842	 * until all the threads running the xgmi reset works reach3843	 * those points. task_barrier_full will do both blocks.3844	 */3845	if (amdgpu_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {3846 3847		task_barrier_enter(&hive->tb);3848		adev->asic_reset_res = amdgpu_device_baco_enter(adev_to_drm(adev));3849 3850		if (adev->asic_reset_res)3851			goto fail;3852 3853		task_barrier_exit(&hive->tb);3854		adev->asic_reset_res = amdgpu_device_baco_exit(adev_to_drm(adev));3855 3856		if (adev->asic_reset_res)3857			goto fail;3858 3859		amdgpu_ras_reset_error_count(adev, AMDGPU_RAS_BLOCK__MMHUB);3860	} else {3861 3862		task_barrier_full(&hive->tb);3863		adev->asic_reset_res =  amdgpu_asic_reset(adev);3864	}3865 3866fail:3867	if (adev->asic_reset_res)3868		DRM_WARN("ASIC reset failed with error, %d for drm dev, %s",3869			 adev->asic_reset_res, adev_to_drm(adev)->unique);3870	amdgpu_put_xgmi_hive(hive);3871}3872 3873static int amdgpu_device_get_job_timeout_settings(struct amdgpu_device *adev)3874{3875	char *input = amdgpu_lockup_timeout;3876	char *timeout_setting = NULL;3877	int index = 0;3878	long timeout;3879	int ret = 0;3880 3881	/*3882	 * By default timeout for non compute jobs is 100003883	 * and 60000 for compute jobs.3884	 * In SR-IOV or passthrough mode, timeout for compute3885	 * jobs are 60000 by default.3886	 */3887	adev->gfx_timeout = msecs_to_jiffies(10000);3888	adev->sdma_timeout = adev->video_timeout = adev->gfx_timeout;3889	if (amdgpu_sriov_vf(adev))3890		adev->compute_timeout = amdgpu_sriov_is_pp_one_vf(adev) ?3891					msecs_to_jiffies(60000) : msecs_to_jiffies(10000);3892	else3893		adev->compute_timeout =  msecs_to_jiffies(60000);3894 3895	if (strnlen(input, AMDGPU_MAX_TIMEOUT_PARAM_LENGTH)) {3896		while ((timeout_setting = strsep(&input, ",")) &&3897				strnlen(timeout_setting, AMDGPU_MAX_TIMEOUT_PARAM_LENGTH)) {3898			ret = kstrtol(timeout_setting, 0, &timeout);3899			if (ret)3900				return ret;3901 3902			if (timeout == 0) {3903				index++;3904				continue;3905			} else if (timeout < 0) {3906				timeout = MAX_SCHEDULE_TIMEOUT;3907				dev_warn(adev->dev, "lockup timeout disabled");3908				add_taint(TAINT_SOFTLOCKUP, LOCKDEP_STILL_OK);3909			} else {3910				timeout = msecs_to_jiffies(timeout);3911			}3912 3913			switch (index++) {3914			case 0:3915				adev->gfx_timeout = timeout;3916				break;3917			case 1:3918				adev->compute_timeout = timeout;3919				break;3920			case 2:3921				adev->sdma_timeout = timeout;3922				break;3923			case 3:3924				adev->video_timeout = timeout;3925				break;3926			default:3927				break;3928			}3929		}3930		/*3931		 * There is only one value specified and3932		 * it should apply to all non-compute jobs.3933		 */3934		if (index == 1) {3935			adev->sdma_timeout = adev->video_timeout = adev->gfx_timeout;3936			if (amdgpu_sriov_vf(adev) || amdgpu_passthrough(adev))3937				adev->compute_timeout = adev->gfx_timeout;3938		}3939	}3940 3941	return ret;3942}3943 3944/**3945 * amdgpu_device_check_iommu_direct_map - check if RAM direct mapped to GPU3946 *3947 * @adev: amdgpu_device pointer3948 *3949 * RAM direct mapped to GPU if IOMMU is not enabled or is pass through mode3950 */3951static void amdgpu_device_check_iommu_direct_map(struct amdgpu_device *adev)3952{3953	struct iommu_domain *domain;3954 3955	domain = iommu_get_domain_for_dev(adev->dev);3956	if (!domain || domain->type == IOMMU_DOMAIN_IDENTITY)3957		adev->ram_is_direct_mapped = true;3958}3959 3960#if defined(CONFIG_HSA_AMD_P2P)3961/**3962 * amdgpu_device_check_iommu_remap - Check if DMA remapping is enabled.3963 *3964 * @adev: amdgpu_device pointer3965 *3966 * return if IOMMU remapping bar address3967 */3968static bool amdgpu_device_check_iommu_remap(struct amdgpu_device *adev)3969{3970	struct iommu_domain *domain;3971 3972	domain = iommu_get_domain_for_dev(adev->dev);3973	if (domain && (domain->type == IOMMU_DOMAIN_DMA ||3974		domain->type ==	IOMMU_DOMAIN_DMA_FQ))3975		return true;3976 3977	return false;3978}3979#endif3980 3981static const struct attribute *amdgpu_dev_attributes[] = {3982	&dev_attr_pcie_replay_count.attr,3983	NULL3984};3985 3986static void amdgpu_device_set_mcbp(struct amdgpu_device *adev)3987{3988	if (amdgpu_mcbp == 1)3989		adev->gfx.mcbp = true;3990	else if (amdgpu_mcbp == 0)3991		adev->gfx.mcbp = false;3992 3993	if (amdgpu_sriov_vf(adev))3994		adev->gfx.mcbp = true;3995 3996	if (adev->gfx.mcbp)3997		DRM_INFO("MCBP is enabled\n");3998}3999 4000/**4001 * amdgpu_device_init - initialize the driver4002 *4003 * @adev: amdgpu_device pointer4004 * @flags: driver flags4005 *4006 * Initializes the driver info and hw (all asics).4007 * Returns 0 for success or an error on failure.4008 * Called at driver startup.4009 */4010int amdgpu_device_init(struct amdgpu_device *adev,4011		       uint32_t flags)4012{4013	struct drm_device *ddev = adev_to_drm(adev);4014	struct pci_dev *pdev = adev->pdev;4015	int r, i;4016	bool px = false;4017	u32 max_MBps;4018	int tmp;4019 4020	adev->shutdown = false;4021	adev->flags = flags;4022 4023	if (amdgpu_force_asic_type >= 0 && amdgpu_force_asic_type < CHIP_LAST)4024		adev->asic_type = amdgpu_force_asic_type;4025	else4026		adev->asic_type = flags & AMD_ASIC_MASK;4027 4028	adev->usec_timeout = AMDGPU_MAX_USEC_TIMEOUT;4029	if (amdgpu_emu_mode == 1)4030		adev->usec_timeout *= 10;4031	adev->gmc.gart_size = 512 * 1024 * 1024;4032	adev->accel_working = false;4033	adev->num_rings = 0;4034	RCU_INIT_POINTER(adev->gang_submit, dma_fence_get_stub());4035	adev->mman.buffer_funcs = NULL;4036	adev->mman.buffer_funcs_ring = NULL;4037	adev->vm_manager.vm_pte_funcs = NULL;4038	adev->vm_manager.vm_pte_num_scheds = 0;4039	adev->gmc.gmc_funcs = NULL;4040	adev->harvest_ip_mask = 0x0;4041	adev->fence_context = dma_fence_context_alloc(AMDGPU_MAX_RINGS);4042	bitmap_zero(adev->gfx.pipe_reserve_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);4043 4044	adev->smc_rreg = &amdgpu_invalid_rreg;4045	adev->smc_wreg = &amdgpu_invalid_wreg;4046	adev->pcie_rreg = &amdgpu_invalid_rreg;4047	adev->pcie_wreg = &amdgpu_invalid_wreg;4048	adev->pcie_rreg_ext = &amdgpu_invalid_rreg_ext;4049	adev->pcie_wreg_ext = &amdgpu_invalid_wreg_ext;4050	adev->pciep_rreg = &amdgpu_invalid_rreg;4051	adev->pciep_wreg = &amdgpu_invalid_wreg;4052	adev->pcie_rreg64 = &amdgpu_invalid_rreg64;4053	adev->pcie_wreg64 = &amdgpu_invalid_wreg64;4054	adev->pcie_rreg64_ext = &amdgpu_invalid_rreg64_ext;4055	adev->pcie_wreg64_ext = &amdgpu_invalid_wreg64_ext;4056	adev->uvd_ctx_rreg = &amdgpu_invalid_rreg;4057	adev->uvd_ctx_wreg = &amdgpu_invalid_wreg;4058	adev->didt_rreg = &amdgpu_invalid_rreg;4059	adev->didt_wreg = &amdgpu_invalid_wreg;4060	adev->gc_cac_rreg = &amdgpu_invalid_rreg;4061	adev->gc_cac_wreg = &amdgpu_invalid_wreg;4062	adev->audio_endpt_rreg = &amdgpu_block_invalid_rreg;4063	adev->audio_endpt_wreg = &amdgpu_block_invalid_wreg;4064 4065	DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X 0x%02X).\n",4066		 amdgpu_asic_name[adev->asic_type], pdev->vendor, pdev->device,4067		 pdev->subsystem_vendor, pdev->subsystem_device, pdev->revision);4068 4069	/* mutex initialization are all done here so we4070	 * can recall function without having locking issues4071	 */4072	mutex_init(&adev->firmware.mutex);4073	mutex_init(&adev->pm.mutex);4074	mutex_init(&adev->gfx.gpu_clock_mutex);4075	mutex_init(&adev->srbm_mutex);4076	mutex_init(&adev->gfx.pipe_reserve_mutex);4077	mutex_init(&adev->gfx.gfx_off_mutex);4078	mutex_init(&adev->gfx.partition_mutex);4079	mutex_init(&adev->grbm_idx_mutex);4080	mutex_init(&adev->mn_lock);4081	mutex_init(&adev->virt.vf_errors.lock);4082	mutex_init(&adev->virt.rlcg_reg_lock);4083	hash_init(adev->mn_hash);4084	mutex_init(&adev->psp.mutex);4085	mutex_init(&adev->notifier_lock);4086	mutex_init(&adev->pm.stable_pstate_ctx_lock);4087	mutex_init(&adev->benchmark_mutex);4088	mutex_init(&adev->gfx.reset_sem_mutex);4089	/* Initialize the mutex for cleaner shader isolation between GFX and compute processes */4090	mutex_init(&adev->enforce_isolation_mutex);4091	mutex_init(&adev->gfx.kfd_sch_mutex);4092 4093	amdgpu_device_init_apu_flags(adev);4094 4095	r = amdgpu_device_check_arguments(adev);4096	if (r)4097		return r;4098 4099	spin_lock_init(&adev->mmio_idx_lock);4100	spin_lock_init(&adev->smc_idx_lock);4101	spin_lock_init(&adev->pcie_idx_lock);4102	spin_lock_init(&adev->uvd_ctx_idx_lock);4103	spin_lock_init(&adev->didt_idx_lock);4104	spin_lock_init(&adev->gc_cac_idx_lock);4105	spin_lock_init(&adev->se_cac_idx_lock);4106	spin_lock_init(&adev->audio_endpt_idx_lock);4107	spin_lock_init(&adev->mm_stats.lock);4108	spin_lock_init(&adev->wb.lock);4109 4110	INIT_LIST_HEAD(&adev->reset_list);4111 4112	INIT_LIST_HEAD(&adev->ras_list);4113 4114	INIT_LIST_HEAD(&adev->pm.od_kobj_list);4115 4116	INIT_DELAYED_WORK(&adev->delayed_init_work,4117			  amdgpu_device_delayed_init_work_handler);4118	INIT_DELAYED_WORK(&adev->gfx.gfx_off_delay_work,4119			  amdgpu_device_delay_enable_gfx_off);4120	/*4121	 * Initialize the enforce_isolation work structures for each XCP4122	 * partition.  This work handler is responsible for enforcing shader4123	 * isolation on AMD GPUs.  It counts the number of emitted fences for4124	 * each GFX and compute ring.  If there are any fences, it schedules4125	 * the `enforce_isolation_work` to be run after a delay.  If there are4126	 * no fences, it signals the Kernel Fusion Driver (KFD) to resume the4127	 * runqueue.4128	 */4129	for (i = 0; i < MAX_XCP; i++) {4130		INIT_DELAYED_WORK(&adev->gfx.enforce_isolation[i].work,4131				  amdgpu_gfx_enforce_isolation_handler);4132		adev->gfx.enforce_isolation[i].adev = adev;4133		adev->gfx.enforce_isolation[i].xcp_id = i;4134	}4135 4136	INIT_WORK(&adev->xgmi_reset_work, amdgpu_device_xgmi_reset_func);4137 4138	adev->gfx.gfx_off_req_count = 1;4139	adev->gfx.gfx_off_residency = 0;4140	adev->gfx.gfx_off_entrycount = 0;4141	adev->pm.ac_power = power_supply_is_system_supplied() > 0;4142 4143	atomic_set(&adev->throttling_logging_enabled, 1);4144	/*4145	 * If throttling continues, logging will be performed every minute4146	 * to avoid log flooding. "-1" is subtracted since the thermal4147	 * throttling interrupt comes every second. Thus, the total logging4148	 * interval is 59 seconds(retelimited printk interval) + 1(waiting4149	 * for throttling interrupt) = 60 seconds.4150	 */4151	ratelimit_state_init(&adev->throttling_logging_rs, (60 - 1) * HZ, 1);4152	ratelimit_set_flags(&adev->throttling_logging_rs, RATELIMIT_MSG_ON_RELEASE);4153 4154	/* Registers mapping */4155	/* TODO: block userspace mapping of io register */4156	if (adev->asic_type >= CHIP_BONAIRE) {4157		adev->rmmio_base = pci_resource_start(adev->pdev, 5);4158		adev->rmmio_size = pci_resource_len(adev->pdev, 5);4159	} else {4160		adev->rmmio_base = pci_resource_start(adev->pdev, 2);4161		adev->rmmio_size = pci_resource_len(adev->pdev, 2);4162	}4163 4164	for (i = 0; i < AMD_IP_BLOCK_TYPE_NUM; i++)4165		atomic_set(&adev->pm.pwr_state[i], POWER_STATE_UNKNOWN);4166 4167	adev->rmmio = ioremap(adev->rmmio_base, adev->rmmio_size);4168	if (!adev->rmmio)4169		return -ENOMEM;4170 4171	DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)adev->rmmio_base);4172	DRM_INFO("register mmio size: %u\n", (unsigned int)adev->rmmio_size);4173 4174	/*4175	 * Reset domain needs to be present early, before XGMI hive discovered4176	 * (if any) and intitialized to use reset sem and in_gpu reset flag4177	 * early on during init and before calling to RREG32.4178	 */4179	adev->reset_domain = amdgpu_reset_create_reset_domain(SINGLE_DEVICE, "amdgpu-reset-dev");4180	if (!adev->reset_domain)4181		return -ENOMEM;4182 4183	/* detect hw virtualization here */4184	amdgpu_detect_virtualization(adev);4185 4186	amdgpu_device_get_pcie_info(adev);4187 4188	r = amdgpu_device_get_job_timeout_settings(adev);4189	if (r) {4190		dev_err(adev->dev, "invalid lockup_timeout parameter syntax\n");4191		return r;4192	}4193 4194	amdgpu_device_set_mcbp(adev);4195 4196	/* early init functions */4197	r = amdgpu_device_ip_early_init(adev);4198	if (r)4199		return r;4200 4201	/* Get rid of things like offb */4202	r = drm_aperture_remove_conflicting_pci_framebuffers(adev->pdev, &amdgpu_kms_driver);4203	if (r)4204		return r;4205 4206	/* Enable TMZ based on IP_VERSION */4207	amdgpu_gmc_tmz_set(adev);4208 4209	if (amdgpu_sriov_vf(adev) &&4210	    amdgpu_ip_version(adev, GC_HWIP, 0) >= IP_VERSION(10, 3, 0))4211		/* VF MMIO access (except mailbox range) from CPU4212		 * will be blocked during sriov runtime4213		 */4214		adev->virt.caps |= AMDGPU_VF_MMIO_ACCESS_PROTECT;4215 4216	amdgpu_gmc_noretry_set(adev);4217	/* Need to get xgmi info early to decide the reset behavior*/4218	if (adev->gmc.xgmi.supported) {4219		r = adev->gfxhub.funcs->get_xgmi_info(adev);4220		if (r)4221			return r;4222	}4223 4224	/* enable PCIE atomic ops */4225	if (amdgpu_sriov_vf(adev)) {4226		if (adev->virt.fw_reserve.p_pf2vf)4227			adev->have_atomics_support = ((struct amd_sriov_msg_pf2vf_info *)4228						      adev->virt.fw_reserve.p_pf2vf)->pcie_atomic_ops_support_flags ==4229				(PCI_EXP_DEVCAP2_ATOMIC_COMP32 | PCI_EXP_DEVCAP2_ATOMIC_COMP64);4230	/* APUs w/ gfx9 onwards doesn't reply on PCIe atomics, rather it is a4231	 * internal path natively support atomics, set have_atomics_support to true.4232	 */4233	} else if ((adev->flags & AMD_IS_APU) &&4234		   (amdgpu_ip_version(adev, GC_HWIP, 0) >4235		    IP_VERSION(9, 0, 0))) {4236		adev->have_atomics_support = true;4237	} else {4238		adev->have_atomics_support =4239			!pci_enable_atomic_ops_to_root(adev->pdev,4240					  PCI_EXP_DEVCAP2_ATOMIC_COMP32 |4241					  PCI_EXP_DEVCAP2_ATOMIC_COMP64);4242	}4243 4244	if (!adev->have_atomics_support)4245		dev_info(adev->dev, "PCIE atomic ops is not supported\n");4246 4247	/* doorbell bar mapping and doorbell index init*/4248	amdgpu_doorbell_init(adev);4249 4250	if (amdgpu_emu_mode == 1) {4251		/* post the asic on emulation mode */4252		emu_soc_asic_init(adev);4253		goto fence_driver_init;4254	}4255 4256	amdgpu_reset_init(adev);4257 4258	/* detect if we are with an SRIOV vbios */4259	if (adev->bios)4260		amdgpu_device_detect_sriov_bios(adev);4261 4262	/* check if we need to reset the asic4263	 *  E.g., driver was not cleanly unloaded previously, etc.4264	 */4265	if (!amdgpu_sriov_vf(adev) && amdgpu_asic_need_reset_on_init(adev)) {4266		if (adev->gmc.xgmi.num_physical_nodes) {4267			dev_info(adev->dev, "Pending hive reset.\n");4268			adev->gmc.xgmi.pending_reset = true;4269			/* Only need to init necessary block for SMU to handle the reset */4270			for (i = 0; i < adev->num_ip_blocks; i++) {4271				if (!adev->ip_blocks[i].status.valid)4272					continue;4273				if (!(adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||4274				      adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||4275				      adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH ||4276				      adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC)) {4277					DRM_DEBUG("IP %s disabled for hw_init.\n",4278						adev->ip_blocks[i].version->funcs->name);4279					adev->ip_blocks[i].status.hw = true;4280				}4281			}4282		} else if (amdgpu_ip_version(adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 10) &&4283				   !amdgpu_device_has_display_hardware(adev)) {4284					r = psp_gpu_reset(adev);4285		} else {4286				tmp = amdgpu_reset_method;4287				/* It should do a default reset when loading or reloading the driver,4288				 * regardless of the module parameter reset_method.4289				 */4290				amdgpu_reset_method = AMD_RESET_METHOD_NONE;4291				r = amdgpu_asic_reset(adev);4292				amdgpu_reset_method = tmp;4293		}4294 4295		if (r) {4296		  dev_err(adev->dev, "asic reset on init failed\n");4297		  goto failed;4298		}4299	}4300 4301	/* Post card if necessary */4302	if (amdgpu_device_need_post(adev)) {4303		if (!adev->bios) {4304			dev_err(adev->dev, "no vBIOS found\n");4305			r = -EINVAL;4306			goto failed;4307		}4308		DRM_INFO("GPU posting now...\n");4309		r = amdgpu_device_asic_init(adev);4310		if (r) {4311			dev_err(adev->dev, "gpu post error!\n");4312			goto failed;4313		}4314	}4315 4316	if (adev->bios) {4317		if (adev->is_atom_fw) {4318			/* Initialize clocks */4319			r = amdgpu_atomfirmware_get_clock_info(adev);4320			if (r) {4321				dev_err(adev->dev, "amdgpu_atomfirmware_get_clock_info failed\n");4322				amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0);4323				goto failed;4324			}4325		} else {4326			/* Initialize clocks */4327			r = amdgpu_atombios_get_clock_info(adev);4328			if (r) {4329				dev_err(adev->dev, "amdgpu_atombios_get_clock_info failed\n");4330				amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0);4331				goto failed;4332			}4333			/* init i2c buses */4334			if (!amdgpu_device_has_dc_support(adev))4335				amdgpu_atombios_i2c_init(adev);4336		}4337	}4338 4339fence_driver_init:4340	/* Fence driver */4341	r = amdgpu_fence_driver_sw_init(adev);4342	if (r) {4343		dev_err(adev->dev, "amdgpu_fence_driver_sw_init failed\n");4344		amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_FENCE_INIT_FAIL, 0, 0);4345		goto failed;4346	}4347 4348	/* init the mode config */4349	drm_mode_config_init(adev_to_drm(adev));4350 4351	r = amdgpu_device_ip_init(adev);4352	if (r) {4353		dev_err(adev->dev, "amdgpu_device_ip_init failed\n");4354		amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_AMDGPU_INIT_FAIL, 0, 0);4355		goto release_ras_con;4356	}4357 4358	amdgpu_fence_driver_hw_init(adev);4359 4360	dev_info(adev->dev,4361		"SE %d, SH per SE %d, CU per SH %d, active_cu_number %d\n",4362			adev->gfx.config.max_shader_engines,4363			adev->gfx.config.max_sh_per_se,4364			adev->gfx.config.max_cu_per_sh,4365			adev->gfx.cu_info.number);4366 4367	adev->accel_working = true;4368 4369	amdgpu_vm_check_compute_bug(adev);4370 4371	/* Initialize the buffer migration limit. */4372	if (amdgpu_moverate >= 0)4373		max_MBps = amdgpu_moverate;4374	else4375		max_MBps = 8; /* Allow 8 MB/s. */4376	/* Get a log2 for easy divisions. */4377	adev->mm_stats.log2_max_MBps = ilog2(max(1u, max_MBps));4378 4379	/*4380	 * Register gpu instance before amdgpu_device_enable_mgpu_fan_boost.4381	 * Otherwise the mgpu fan boost feature will be skipped due to the4382	 * gpu instance is counted less.4383	 */4384	amdgpu_register_gpu_instance(adev);4385 4386	/* enable clockgating, etc. after ib tests, etc. since some blocks require4387	 * explicit gating rather than handling it automatically.4388	 */4389	if (!adev->gmc.xgmi.pending_reset) {4390		r = amdgpu_device_ip_late_init(adev);4391		if (r) {4392			dev_err(adev->dev, "amdgpu_device_ip_late_init failed\n");4393			amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_AMDGPU_LATE_INIT_FAIL, 0, r);4394			goto release_ras_con;4395		}4396		/* must succeed. */4397		amdgpu_ras_resume(adev);4398		queue_delayed_work(system_wq, &adev->delayed_init_work,4399				   msecs_to_jiffies(AMDGPU_RESUME_MS));4400	}4401 4402	if (amdgpu_sriov_vf(adev)) {4403		amdgpu_virt_release_full_gpu(adev, true);4404		flush_delayed_work(&adev->delayed_init_work);4405	}4406 4407	/*4408	 * Place those sysfs registering after `late_init`. As some of those4409	 * operations performed in `late_init` might affect the sysfs4410	 * interfaces creating.4411	 */4412	r = amdgpu_atombios_sysfs_init(adev);4413	if (r)4414		drm_err(&adev->ddev,4415			"registering atombios sysfs failed (%d).\n", r);4416 4417	r = amdgpu_pm_sysfs_init(adev);4418	if (r)4419		DRM_ERROR("registering pm sysfs failed (%d).\n", r);4420 4421	r = amdgpu_ucode_sysfs_init(adev);4422	if (r) {4423		adev->ucode_sysfs_en = false;4424		DRM_ERROR("Creating firmware sysfs failed (%d).\n", r);4425	} else4426		adev->ucode_sysfs_en = true;4427 4428	r = sysfs_create_files(&adev->dev->kobj, amdgpu_dev_attributes);4429	if (r)4430		dev_err(adev->dev, "Could not create amdgpu device attr\n");4431 4432	r = devm_device_add_group(adev->dev, &amdgpu_board_attrs_group);4433	if (r)4434		dev_err(adev->dev,4435			"Could not create amdgpu board attributes\n");4436 4437	amdgpu_fru_sysfs_init(adev);4438	amdgpu_reg_state_sysfs_init(adev);4439 4440	if (IS_ENABLED(CONFIG_PERF_EVENTS))4441		r = amdgpu_pmu_init(adev);4442	if (r)4443		dev_err(adev->dev, "amdgpu_pmu_init failed\n");4444 4445	/* Have stored pci confspace at hand for restore in sudden PCI error */4446	if (amdgpu_device_cache_pci_state(adev->pdev))4447		pci_restore_state(pdev);4448 4449	/* if we have > 1 VGA cards, then disable the amdgpu VGA resources */4450	/* this will fail for cards that aren't VGA class devices, just4451	 * ignore it4452	 */4453	if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)4454		vga_client_register(adev->pdev, amdgpu_device_vga_set_decode);4455 4456	px = amdgpu_device_supports_px(ddev);4457 4458	if (px || (!dev_is_removable(&adev->pdev->dev) &&4459				apple_gmux_detect(NULL, NULL)))4460		vga_switcheroo_register_client(adev->pdev,4461					       &amdgpu_switcheroo_ops, px);4462 4463	if (px)4464		vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain);4465 4466	if (adev->gmc.xgmi.pending_reset)4467		queue_delayed_work(system_wq, &mgpu_info.delayed_reset_work,4468				   msecs_to_jiffies(AMDGPU_RESUME_MS));4469 4470	amdgpu_device_check_iommu_direct_map(adev);4471 4472	return 0;4473 4474release_ras_con:4475	if (amdgpu_sriov_vf(adev))4476		amdgpu_virt_release_full_gpu(adev, true);4477 4478	/* failed in exclusive mode due to timeout */4479	if (amdgpu_sriov_vf(adev) &&4480		!amdgpu_sriov_runtime(adev) &&4481		amdgpu_virt_mmio_blocked(adev) &&4482		!amdgpu_virt_wait_reset(adev)) {4483		dev_err(adev->dev, "VF exclusive mode timeout\n");4484		/* Don't send request since VF is inactive. */4485		adev->virt.caps &= ~AMDGPU_SRIOV_CAPS_RUNTIME;4486		adev->virt.ops = NULL;4487		r = -EAGAIN;4488	}4489	amdgpu_release_ras_context(adev);4490 4491failed:4492	amdgpu_vf_error_trans_all(adev);4493 4494	return r;4495}4496 4497static void amdgpu_device_unmap_mmio(struct amdgpu_device *adev)4498{4499 4500	/* Clear all CPU mappings pointing to this device */4501	unmap_mapping_range(adev->ddev.anon_inode->i_mapping, 0, 0, 1);4502 4503	/* Unmap all mapped bars - Doorbell, registers and VRAM */4504	amdgpu_doorbell_fini(adev);4505 4506	iounmap(adev->rmmio);4507	adev->rmmio = NULL;4508	if (adev->mman.aper_base_kaddr)4509		iounmap(adev->mman.aper_base_kaddr);4510	adev->mman.aper_base_kaddr = NULL;4511 4512	/* Memory manager related */4513	if (!adev->gmc.xgmi.connected_to_cpu && !adev->gmc.is_app_apu) {4514		arch_phys_wc_del(adev->gmc.vram_mtrr);4515		arch_io_free_memtype_wc(adev->gmc.aper_base, adev->gmc.aper_size);4516	}4517}4518 4519/**4520 * amdgpu_device_fini_hw - tear down the driver4521 *4522 * @adev: amdgpu_device pointer4523 *4524 * Tear down the driver info (all asics).4525 * Called at driver shutdown.4526 */4527void amdgpu_device_fini_hw(struct amdgpu_device *adev)4528{4529	dev_info(adev->dev, "amdgpu: finishing device.\n");4530	flush_delayed_work(&adev->delayed_init_work);4531 4532	if (adev->mman.initialized)4533		drain_workqueue(adev->mman.bdev.wq);4534	adev->shutdown = true;4535 4536	/* make sure IB test finished before entering exclusive mode4537	 * to avoid preemption on IB test4538	 */4539	if (amdgpu_sriov_vf(adev)) {4540		amdgpu_virt_request_full_gpu(adev, false);4541		amdgpu_virt_fini_data_exchange(adev);4542	}4543 4544	/* disable all interrupts */4545	amdgpu_irq_disable_all(adev);4546	if (adev->mode_info.mode_config_initialized) {4547		if (!drm_drv_uses_atomic_modeset(adev_to_drm(adev)))4548			drm_helper_force_disable_all(adev_to_drm(adev));4549		else4550			drm_atomic_helper_shutdown(adev_to_drm(adev));4551	}4552	amdgpu_fence_driver_hw_fini(adev);4553 4554	if (adev->pm.sysfs_initialized)4555		amdgpu_pm_sysfs_fini(adev);4556	if (adev->ucode_sysfs_en)4557		amdgpu_ucode_sysfs_fini(adev);4558	sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes);4559	amdgpu_fru_sysfs_fini(adev);4560 4561	amdgpu_reg_state_sysfs_fini(adev);4562 4563	/* disable ras feature must before hw fini */4564	amdgpu_ras_pre_fini(adev);4565 4566	amdgpu_ttm_set_buffer_funcs_status(adev, false);4567 4568	amdgpu_device_ip_fini_early(adev);4569 4570	amdgpu_irq_fini_hw(adev);4571 4572	if (adev->mman.initialized)4573		ttm_device_clear_dma_mappings(&adev->mman.bdev);4574 4575	amdgpu_gart_dummy_page_fini(adev);4576 4577	if (drm_dev_is_unplugged(adev_to_drm(adev)))4578		amdgpu_device_unmap_mmio(adev);4579 4580}4581 4582void amdgpu_device_fini_sw(struct amdgpu_device *adev)4583{4584	int idx;4585	bool px;4586 4587	amdgpu_fence_driver_sw_fini(adev);4588	amdgpu_device_ip_fini(adev);4589	amdgpu_ucode_release(&adev->firmware.gpu_info_fw);4590	adev->accel_working = false;4591	dma_fence_put(rcu_dereference_protected(adev->gang_submit, true));4592 4593	amdgpu_reset_fini(adev);4594 4595	/* free i2c buses */4596	if (!amdgpu_device_has_dc_support(adev))4597		amdgpu_i2c_fini(adev);4598 4599	if (amdgpu_emu_mode != 1)4600		amdgpu_atombios_fini(adev);4601 4602	kfree(adev->bios);4603	adev->bios = NULL;4604 4605	kfree(adev->fru_info);4606	adev->fru_info = NULL;4607 4608	px = amdgpu_device_supports_px(adev_to_drm(adev));4609 4610	if (px || (!dev_is_removable(&adev->pdev->dev) &&4611				apple_gmux_detect(NULL, NULL)))4612		vga_switcheroo_unregister_client(adev->pdev);4613 4614	if (px)4615		vga_switcheroo_fini_domain_pm_ops(adev->dev);4616 4617	if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)4618		vga_client_unregister(adev->pdev);4619 4620	if (drm_dev_enter(adev_to_drm(adev), &idx)) {4621 4622		iounmap(adev->rmmio);4623		adev->rmmio = NULL;4624		amdgpu_doorbell_fini(adev);4625		drm_dev_exit(idx);4626	}4627 4628	if (IS_ENABLED(CONFIG_PERF_EVENTS))4629		amdgpu_pmu_fini(adev);4630	if (adev->mman.discovery_bin)4631		amdgpu_discovery_fini(adev);4632 4633	amdgpu_reset_put_reset_domain(adev->reset_domain);4634	adev->reset_domain = NULL;4635 4636	kfree(adev->pci_state);4637 4638}4639 4640/**4641 * amdgpu_device_evict_resources - evict device resources4642 * @adev: amdgpu device object4643 *4644 * Evicts all ttm device resources(vram BOs, gart table) from the lru list4645 * of the vram memory type. Mainly used for evicting device resources4646 * at suspend time.4647 *4648 */4649static int amdgpu_device_evict_resources(struct amdgpu_device *adev)4650{4651	int ret;4652 4653	/* No need to evict vram on APUs for suspend to ram or s2idle */4654	if ((adev->in_s3 || adev->in_s0ix) && (adev->flags & AMD_IS_APU))4655		return 0;4656 4657	ret = amdgpu_ttm_evict_resources(adev, TTM_PL_VRAM);4658	if (ret)4659		DRM_WARN("evicting device resources failed\n");4660	return ret;4661}4662 4663/*4664 * Suspend & resume.4665 */4666/**4667 * amdgpu_device_prepare - prepare for device suspend4668 *4669 * @dev: drm dev pointer4670 *4671 * Prepare to put the hw in the suspend state (all asics).4672 * Returns 0 for success or an error on failure.4673 * Called at driver suspend.4674 */4675int amdgpu_device_prepare(struct drm_device *dev)4676{4677	struct amdgpu_device *adev = drm_to_adev(dev);4678	int i, r;4679 4680	amdgpu_choose_low_power_state(adev);4681 4682	if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)4683		return 0;4684 4685	/* Evict the majority of BOs before starting suspend sequence */4686	r = amdgpu_device_evict_resources(adev);4687	if (r)4688		goto unprepare;4689 4690	flush_delayed_work(&adev->gfx.gfx_off_delay_work);4691 4692	for (i = 0; i < adev->num_ip_blocks; i++) {4693		if (!adev->ip_blocks[i].status.valid)4694			continue;4695		if (!adev->ip_blocks[i].version->funcs->prepare_suspend)4696			continue;4697		r = adev->ip_blocks[i].version->funcs->prepare_suspend((void *)adev);4698		if (r)4699			goto unprepare;4700	}4701 4702	return 0;4703 4704unprepare:4705	adev->in_s0ix = adev->in_s3 = false;4706 4707	return r;4708}4709 4710/**4711 * amdgpu_device_suspend - initiate device suspend4712 *4713 * @dev: drm dev pointer4714 * @fbcon : notify the fbdev of suspend4715 *4716 * Puts the hw in the suspend state (all asics).4717 * Returns 0 for success or an error on failure.4718 * Called at driver suspend.4719 */4720int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)4721{4722	struct amdgpu_device *adev = drm_to_adev(dev);4723	int r = 0;4724 4725	if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)4726		return 0;4727 4728	adev->in_suspend = true;4729 4730	if (amdgpu_sriov_vf(adev)) {4731		amdgpu_virt_fini_data_exchange(adev);4732		r = amdgpu_virt_request_full_gpu(adev, false);4733		if (r)4734			return r;4735	}4736 4737	if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D3))4738		DRM_WARN("smart shift update failed\n");4739 4740	if (fbcon)4741		drm_fb_helper_set_suspend_unlocked(adev_to_drm(adev)->fb_helper, true);4742 4743	cancel_delayed_work_sync(&adev->delayed_init_work);4744 4745	amdgpu_ras_suspend(adev);4746 4747	amdgpu_device_ip_suspend_phase1(adev);4748 4749	if (!adev->in_s0ix)4750		amdgpu_amdkfd_suspend(adev, adev->in_runpm);4751 4752	r = amdgpu_device_evict_resources(adev);4753	if (r)4754		return r;4755 4756	amdgpu_ttm_set_buffer_funcs_status(adev, false);4757 4758	amdgpu_fence_driver_hw_fini(adev);4759 4760	amdgpu_device_ip_suspend_phase2(adev);4761 4762	if (amdgpu_sriov_vf(adev))4763		amdgpu_virt_release_full_gpu(adev, false);4764 4765	r = amdgpu_dpm_notify_rlc_state(adev, false);4766	if (r)4767		return r;4768 4769	return 0;4770}4771 4772/**4773 * amdgpu_device_resume - initiate device resume4774 *4775 * @dev: drm dev pointer4776 * @fbcon : notify the fbdev of resume4777 *4778 * Bring the hw back to operating state (all asics).4779 * Returns 0 for success or an error on failure.4780 * Called at driver resume.4781 */4782int amdgpu_device_resume(struct drm_device *dev, bool fbcon)4783{4784	struct amdgpu_device *adev = drm_to_adev(dev);4785	int r = 0;4786 4787	if (amdgpu_sriov_vf(adev)) {4788		r = amdgpu_virt_request_full_gpu(adev, true);4789		if (r)4790			return r;4791	}4792 4793	if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)4794		return 0;4795 4796	if (adev->in_s0ix)4797		amdgpu_dpm_gfx_state_change(adev, sGpuChangeState_D0Entry);4798 4799	/* post card */4800	if (amdgpu_device_need_post(adev)) {4801		r = amdgpu_device_asic_init(adev);4802		if (r)4803			dev_err(adev->dev, "amdgpu asic init failed\n");4804	}4805 4806	r = amdgpu_device_ip_resume(adev);4807 4808	if (r) {4809		dev_err(adev->dev, "amdgpu_device_ip_resume failed (%d).\n", r);4810		goto exit;4811	}4812	amdgpu_fence_driver_hw_init(adev);4813 4814	if (!adev->in_s0ix) {4815		r = amdgpu_amdkfd_resume(adev, adev->in_runpm);4816		if (r)4817			goto exit;4818	}4819 4820	r = amdgpu_device_ip_late_init(adev);4821	if (r)4822		goto exit;4823 4824	queue_delayed_work(system_wq, &adev->delayed_init_work,4825			   msecs_to_jiffies(AMDGPU_RESUME_MS));4826exit:4827	if (amdgpu_sriov_vf(adev)) {4828		amdgpu_virt_init_data_exchange(adev);4829		amdgpu_virt_release_full_gpu(adev, true);4830	}4831 4832	if (r)4833		return r;4834 4835	/* Make sure IB tests flushed */4836	flush_delayed_work(&adev->delayed_init_work);4837 4838	if (fbcon)4839		drm_fb_helper_set_suspend_unlocked(adev_to_drm(adev)->fb_helper, false);4840 4841	amdgpu_ras_resume(adev);4842 4843	if (adev->mode_info.num_crtc) {4844		/*4845		 * Most of the connector probing functions try to acquire runtime pm4846		 * refs to ensure that the GPU is powered on when connector polling is4847		 * performed. Since we're calling this from a runtime PM callback,4848		 * trying to acquire rpm refs will cause us to deadlock.4849		 *4850		 * Since we're guaranteed to be holding the rpm lock, it's safe to4851		 * temporarily disable the rpm helpers so this doesn't deadlock us.4852		 */4853#ifdef CONFIG_PM4854		dev->dev->power.disable_depth++;4855#endif4856		if (!adev->dc_enabled)4857			drm_helper_hpd_irq_event(dev);4858		else4859			drm_kms_helper_hotplug_event(dev);4860#ifdef CONFIG_PM4861		dev->dev->power.disable_depth--;4862#endif4863	}4864	adev->in_suspend = false;4865 4866	if (adev->enable_mes)4867		amdgpu_mes_self_test(adev);4868 4869	if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D0))4870		DRM_WARN("smart shift update failed\n");4871 4872	return 0;4873}4874 4875/**4876 * amdgpu_device_ip_check_soft_reset - did soft reset succeed4877 *4878 * @adev: amdgpu_device pointer4879 *4880 * The list of all the hardware IPs that make up the asic is walked and4881 * the check_soft_reset callbacks are run.  check_soft_reset determines4882 * if the asic is still hung or not.4883 * Returns true if any of the IPs are still in a hung state, false if not.4884 */4885static bool amdgpu_device_ip_check_soft_reset(struct amdgpu_device *adev)4886{4887	int i;4888	bool asic_hang = false;4889 4890	if (amdgpu_sriov_vf(adev))4891		return true;4892 4893	if (amdgpu_asic_need_full_reset(adev))4894		return true;4895 4896	for (i = 0; i < adev->num_ip_blocks; i++) {4897		if (!adev->ip_blocks[i].status.valid)4898			continue;4899		if (adev->ip_blocks[i].version->funcs->check_soft_reset)4900			adev->ip_blocks[i].status.hang =4901				adev->ip_blocks[i].version->funcs->check_soft_reset(adev);4902		if (adev->ip_blocks[i].status.hang) {4903			dev_info(adev->dev, "IP block:%s is hung!\n", adev->ip_blocks[i].version->funcs->name);4904			asic_hang = true;4905		}4906	}4907	return asic_hang;4908}4909 4910/**4911 * amdgpu_device_ip_pre_soft_reset - prepare for soft reset4912 *4913 * @adev: amdgpu_device pointer4914 *4915 * The list of all the hardware IPs that make up the asic is walked and the4916 * pre_soft_reset callbacks are run if the block is hung.  pre_soft_reset4917 * handles any IP specific hardware or software state changes that are4918 * necessary for a soft reset to succeed.4919 * Returns 0 on success, negative error code on failure.4920 */4921static int amdgpu_device_ip_pre_soft_reset(struct amdgpu_device *adev)4922{4923	int i, r = 0;4924 4925	for (i = 0; i < adev->num_ip_blocks; i++) {4926		if (!adev->ip_blocks[i].status.valid)4927			continue;4928		if (adev->ip_blocks[i].status.hang &&4929		    adev->ip_blocks[i].version->funcs->pre_soft_reset) {4930			r = adev->ip_blocks[i].version->funcs->pre_soft_reset(adev);4931			if (r)4932				return r;4933		}4934	}4935 4936	return 0;4937}4938 4939/**4940 * amdgpu_device_ip_need_full_reset - check if a full asic reset is needed4941 *4942 * @adev: amdgpu_device pointer4943 *4944 * Some hardware IPs cannot be soft reset.  If they are hung, a full gpu4945 * reset is necessary to recover.4946 * Returns true if a full asic reset is required, false if not.4947 */4948static bool amdgpu_device_ip_need_full_reset(struct amdgpu_device *adev)4949{4950	int i;4951 4952	if (amdgpu_asic_need_full_reset(adev))4953		return true;4954 4955	for (i = 0; i < adev->num_ip_blocks; i++) {4956		if (!adev->ip_blocks[i].status.valid)4957			continue;4958		if ((adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) ||4959		    (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) ||4960		    (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_ACP) ||4961		    (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE) ||4962		     adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP) {4963			if (adev->ip_blocks[i].status.hang) {4964				dev_info(adev->dev, "Some block need full reset!\n");4965				return true;4966			}4967		}4968	}4969	return false;4970}4971 4972/**4973 * amdgpu_device_ip_soft_reset - do a soft reset4974 *4975 * @adev: amdgpu_device pointer4976 *4977 * The list of all the hardware IPs that make up the asic is walked and the4978 * soft_reset callbacks are run if the block is hung.  soft_reset handles any4979 * IP specific hardware or software state changes that are necessary to soft4980 * reset the IP.4981 * Returns 0 on success, negative error code on failure.4982 */4983static int amdgpu_device_ip_soft_reset(struct amdgpu_device *adev)4984{4985	int i, r = 0;4986 4987	for (i = 0; i < adev->num_ip_blocks; i++) {4988		if (!adev->ip_blocks[i].status.valid)4989			continue;4990		if (adev->ip_blocks[i].status.hang &&4991		    adev->ip_blocks[i].version->funcs->soft_reset) {4992			r = adev->ip_blocks[i].version->funcs->soft_reset(adev);4993			if (r)4994				return r;4995		}4996	}4997 4998	return 0;4999}5000 5001/**5002 * amdgpu_device_ip_post_soft_reset - clean up from soft reset5003 *5004 * @adev: amdgpu_device pointer5005 *5006 * The list of all the hardware IPs that make up the asic is walked and the5007 * post_soft_reset callbacks are run if the asic was hung.  post_soft_reset5008 * handles any IP specific hardware or software state changes that are5009 * necessary after the IP has been soft reset.5010 * Returns 0 on success, negative error code on failure.5011 */5012static int amdgpu_device_ip_post_soft_reset(struct amdgpu_device *adev)5013{5014	int i, r = 0;5015 5016	for (i = 0; i < adev->num_ip_blocks; i++) {5017		if (!adev->ip_blocks[i].status.valid)5018			continue;5019		if (adev->ip_blocks[i].status.hang &&5020		    adev->ip_blocks[i].version->funcs->post_soft_reset)5021			r = adev->ip_blocks[i].version->funcs->post_soft_reset(adev);5022		if (r)5023			return r;5024	}5025 5026	return 0;5027}5028 5029/**5030 * amdgpu_device_reset_sriov - reset ASIC for SR-IOV vf5031 *5032 * @adev: amdgpu_device pointer5033 * @reset_context: amdgpu reset context pointer5034 *5035 * do VF FLR and reinitialize Asic5036 * return 0 means succeeded otherwise failed5037 */5038static int amdgpu_device_reset_sriov(struct amdgpu_device *adev,5039				     struct amdgpu_reset_context *reset_context)5040{5041	int r;5042	struct amdgpu_hive_info *hive = NULL;5043 5044	if (test_bit(AMDGPU_HOST_FLR, &reset_context->flags)) {5045		if (!amdgpu_ras_get_fed_status(adev))5046			amdgpu_virt_ready_to_reset(adev);5047		amdgpu_virt_wait_reset(adev);5048		clear_bit(AMDGPU_HOST_FLR, &reset_context->flags);5049		r = amdgpu_virt_request_full_gpu(adev, true);5050	} else {5051		r = amdgpu_virt_reset_gpu(adev);5052	}5053	if (r)5054		return r;5055 5056	amdgpu_ras_set_fed(adev, false);5057	amdgpu_irq_gpu_reset_resume_helper(adev);5058 5059	/* some sw clean up VF needs to do before recover */5060	amdgpu_virt_post_reset(adev);5061 5062	/* Resume IP prior to SMC */5063	r = amdgpu_device_ip_reinit_early_sriov(adev);5064	if (r)5065		return r;5066 5067	amdgpu_virt_init_data_exchange(adev);5068 5069	r = amdgpu_device_fw_loading(adev);5070	if (r)5071		return r;5072 5073	/* now we are okay to resume SMC/CP/SDMA */5074	r = amdgpu_device_ip_reinit_late_sriov(adev);5075	if (r)5076		return r;5077 5078	hive = amdgpu_get_xgmi_hive(adev);5079	/* Update PSP FW topology after reset */5080	if (hive && adev->gmc.xgmi.num_physical_nodes > 1)5081		r = amdgpu_xgmi_update_topology(hive, adev);5082	if (hive)5083		amdgpu_put_xgmi_hive(hive);5084	if (r)5085		return r;5086 5087	r = amdgpu_ib_ring_tests(adev);5088	if (r)5089		return r;5090 5091	if (adev->virt.gim_feature & AMDGIM_FEATURE_GIM_FLR_VRAMLOST)5092		amdgpu_inc_vram_lost(adev);5093 5094	/* need to be called during full access so we can't do it later like5095	 * bare-metal does.5096	 */5097	amdgpu_amdkfd_post_reset(adev);5098	amdgpu_virt_release_full_gpu(adev, true);5099 5100	/* Aldebaran and gfx_11_0_3 support ras in SRIOV, so need resume ras during reset */5101	if (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 2) ||5102	    amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3) ||5103	    amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4) ||5104	    amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(11, 0, 3))5105		amdgpu_ras_resume(adev);5106	return 0;5107}5108 5109/**5110 * amdgpu_device_has_job_running - check if there is any job in mirror list5111 *5112 * @adev: amdgpu_device pointer5113 *5114 * check if there is any job in mirror list5115 */5116bool amdgpu_device_has_job_running(struct amdgpu_device *adev)5117{5118	int i;5119	struct drm_sched_job *job;5120 5121	for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {5122		struct amdgpu_ring *ring = adev->rings[i];5123 5124		if (!amdgpu_ring_sched_ready(ring))5125			continue;5126 5127		spin_lock(&ring->sched.job_list_lock);5128		job = list_first_entry_or_null(&ring->sched.pending_list,5129					       struct drm_sched_job, list);5130		spin_unlock(&ring->sched.job_list_lock);5131		if (job)5132			return true;5133	}5134	return false;5135}5136 5137/**5138 * amdgpu_device_should_recover_gpu - check if we should try GPU recovery5139 *5140 * @adev: amdgpu_device pointer5141 *5142 * Check amdgpu_gpu_recovery and SRIOV status to see if we should try to recover5143 * a hung GPU.5144 */5145bool amdgpu_device_should_recover_gpu(struct amdgpu_device *adev)5146{5147 5148	if (amdgpu_gpu_recovery == 0)5149		goto disabled;5150 5151	/* Skip soft reset check in fatal error mode */5152	if (!amdgpu_ras_is_poison_mode_supported(adev))5153		return true;5154 5155	if (amdgpu_sriov_vf(adev))5156		return true;5157 5158	if (amdgpu_gpu_recovery == -1) {5159		switch (adev->asic_type) {5160#ifdef CONFIG_DRM_AMDGPU_SI5161		case CHIP_VERDE:5162		case CHIP_TAHITI:5163		case CHIP_PITCAIRN:5164		case CHIP_OLAND:5165		case CHIP_HAINAN:5166#endif5167#ifdef CONFIG_DRM_AMDGPU_CIK5168		case CHIP_KAVERI:5169		case CHIP_KABINI:5170		case CHIP_MULLINS:5171#endif5172		case CHIP_CARRIZO:5173		case CHIP_STONEY:5174		case CHIP_CYAN_SKILLFISH:5175			goto disabled;5176		default:5177			break;5178		}5179	}5180 5181	return true;5182 5183disabled:5184		dev_info(adev->dev, "GPU recovery disabled.\n");5185		return false;5186}5187 5188int amdgpu_device_mode1_reset(struct amdgpu_device *adev)5189{5190	u32 i;5191	int ret = 0;5192 5193	amdgpu_atombios_scratch_regs_engine_hung(adev, true);5194 5195	dev_info(adev->dev, "GPU mode1 reset\n");5196 5197	/* Cache the state before bus master disable. The saved config space5198	 * values are used in other cases like restore after mode-2 reset.5199	 */5200	amdgpu_device_cache_pci_state(adev->pdev);5201 5202	/* disable BM */5203	pci_clear_master(adev->pdev);5204 5205	if (amdgpu_dpm_is_mode1_reset_supported(adev)) {5206		dev_info(adev->dev, "GPU smu mode1 reset\n");5207		ret = amdgpu_dpm_mode1_reset(adev);5208	} else {5209		dev_info(adev->dev, "GPU psp mode1 reset\n");5210		ret = psp_gpu_reset(adev);5211	}5212 5213	if (ret)5214		goto mode1_reset_failed;5215 5216	amdgpu_device_load_pci_state(adev->pdev);5217	ret = amdgpu_psp_wait_for_bootloader(adev);5218	if (ret)5219		goto mode1_reset_failed;5220 5221	/* wait for asic to come out of reset */5222	for (i = 0; i < adev->usec_timeout; i++) {5223		u32 memsize = adev->nbio.funcs->get_memsize(adev);5224 5225		if (memsize != 0xffffffff)5226			break;5227		udelay(1);5228	}5229 5230	if (i >= adev->usec_timeout) {5231		ret = -ETIMEDOUT;5232		goto mode1_reset_failed;5233	}5234 5235	amdgpu_atombios_scratch_regs_engine_hung(adev, false);5236 5237	return 0;5238 5239mode1_reset_failed:5240	dev_err(adev->dev, "GPU mode1 reset failed\n");5241	return ret;5242}5243 5244int amdgpu_device_pre_asic_reset(struct amdgpu_device *adev,5245				 struct amdgpu_reset_context *reset_context)5246{5247	int i, r = 0;5248	struct amdgpu_job *job = NULL;5249	struct amdgpu_device *tmp_adev = reset_context->reset_req_dev;5250	bool need_full_reset =5251		test_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);5252 5253	if (reset_context->reset_req_dev == adev)5254		job = reset_context->job;5255 5256	if (amdgpu_sriov_vf(adev))5257		amdgpu_virt_pre_reset(adev);5258 5259	amdgpu_fence_driver_isr_toggle(adev, true);5260 5261	/* block all schedulers and reset given job's ring */5262	for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {5263		struct amdgpu_ring *ring = adev->rings[i];5264 5265		if (!amdgpu_ring_sched_ready(ring))5266			continue;5267 5268		/* Clear job fence from fence drv to avoid force_completion5269		 * leave NULL and vm flush fence in fence drv5270		 */5271		amdgpu_fence_driver_clear_job_fences(ring);5272 5273		/* after all hw jobs are reset, hw fence is meaningless, so force_completion */5274		amdgpu_fence_driver_force_completion(ring);5275	}5276 5277	amdgpu_fence_driver_isr_toggle(adev, false);5278 5279	if (job && job->vm)5280		drm_sched_increase_karma(&job->base);5281 5282	r = amdgpu_reset_prepare_hwcontext(adev, reset_context);5283	/* If reset handler not implemented, continue; otherwise return */5284	if (r == -EOPNOTSUPP)5285		r = 0;5286	else5287		return r;5288 5289	/* Don't suspend on bare metal if we are not going to HW reset the ASIC */5290	if (!amdgpu_sriov_vf(adev)) {5291 5292		if (!need_full_reset)5293			need_full_reset = amdgpu_device_ip_need_full_reset(adev);5294 5295		if (!need_full_reset && amdgpu_gpu_recovery &&5296		    amdgpu_device_ip_check_soft_reset(adev)) {5297			amdgpu_device_ip_pre_soft_reset(adev);5298			r = amdgpu_device_ip_soft_reset(adev);5299			amdgpu_device_ip_post_soft_reset(adev);5300			if (r || amdgpu_device_ip_check_soft_reset(adev)) {5301				dev_info(adev->dev, "soft reset failed, will fallback to full reset!\n");5302				need_full_reset = true;5303			}5304		}5305 5306		if (!test_bit(AMDGPU_SKIP_COREDUMP, &reset_context->flags)) {5307			dev_info(tmp_adev->dev, "Dumping IP State\n");5308			/* Trigger ip dump before we reset the asic */5309			for (i = 0; i < tmp_adev->num_ip_blocks; i++)5310				if (tmp_adev->ip_blocks[i].version->funcs->dump_ip_state)5311					tmp_adev->ip_blocks[i].version->funcs5312						->dump_ip_state((void *)tmp_adev);5313			dev_info(tmp_adev->dev, "Dumping IP State Completed\n");5314		}5315 5316		if (need_full_reset)5317			r = amdgpu_device_ip_suspend(adev);5318		if (need_full_reset)5319			set_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);5320		else5321			clear_bit(AMDGPU_NEED_FULL_RESET,5322				  &reset_context->flags);5323	}5324 5325	return r;5326}5327 5328int amdgpu_do_asic_reset(struct list_head *device_list_handle,5329			 struct amdgpu_reset_context *reset_context)5330{5331	struct amdgpu_device *tmp_adev = NULL;5332	bool need_full_reset, skip_hw_reset, vram_lost = false;5333	int r = 0;5334 5335	/* Try reset handler method first */5336	tmp_adev = list_first_entry(device_list_handle, struct amdgpu_device,5337				    reset_list);5338 5339	reset_context->reset_device_list = device_list_handle;5340	r = amdgpu_reset_perform_reset(tmp_adev, reset_context);5341	/* If reset handler not implemented, continue; otherwise return */5342	if (r == -EOPNOTSUPP)5343		r = 0;5344	else5345		return r;5346 5347	/* Reset handler not implemented, use the default method */5348	need_full_reset =5349		test_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);5350	skip_hw_reset = test_bit(AMDGPU_SKIP_HW_RESET, &reset_context->flags);5351 5352	/*5353	 * ASIC reset has to be done on all XGMI hive nodes ASAP5354	 * to allow proper links negotiation in FW (within 1 sec)5355	 */5356	if (!skip_hw_reset && need_full_reset) {5357		list_for_each_entry(tmp_adev, device_list_handle, reset_list) {5358			/* For XGMI run all resets in parallel to speed up the process */5359			if (tmp_adev->gmc.xgmi.num_physical_nodes > 1) {5360				tmp_adev->gmc.xgmi.pending_reset = false;5361				if (!queue_work(system_unbound_wq, &tmp_adev->xgmi_reset_work))5362					r = -EALREADY;5363			} else5364				r = amdgpu_asic_reset(tmp_adev);5365 5366			if (r) {5367				dev_err(tmp_adev->dev, "ASIC reset failed with error, %d for drm dev, %s",5368					 r, adev_to_drm(tmp_adev)->unique);5369				goto out;5370			}5371		}5372 5373		/* For XGMI wait for all resets to complete before proceed */5374		if (!r) {5375			list_for_each_entry(tmp_adev, device_list_handle, reset_list) {5376				if (tmp_adev->gmc.xgmi.num_physical_nodes > 1) {5377					flush_work(&tmp_adev->xgmi_reset_work);5378					r = tmp_adev->asic_reset_res;5379					if (r)5380						break;5381				}5382			}5383		}5384	}5385 5386	if (!r && amdgpu_ras_intr_triggered()) {5387		list_for_each_entry(tmp_adev, device_list_handle, reset_list) {5388			amdgpu_ras_reset_error_count(tmp_adev, AMDGPU_RAS_BLOCK__MMHUB);5389		}5390 5391		amdgpu_ras_intr_cleared();5392	}5393 5394	list_for_each_entry(tmp_adev, device_list_handle, reset_list) {5395		if (need_full_reset) {5396			/* post card */5397			amdgpu_ras_set_fed(tmp_adev, false);5398			r = amdgpu_device_asic_init(tmp_adev);5399			if (r) {5400				dev_warn(tmp_adev->dev, "asic atom init failed!");5401			} else {5402				dev_info(tmp_adev->dev, "GPU reset succeeded, trying to resume\n");5403 5404				r = amdgpu_device_ip_resume_phase1(tmp_adev);5405				if (r)5406					goto out;5407 5408				vram_lost = amdgpu_device_check_vram_lost(tmp_adev);5409 5410				if (!test_bit(AMDGPU_SKIP_COREDUMP, &reset_context->flags))5411					amdgpu_coredump(tmp_adev, false, vram_lost, reset_context->job);5412 5413				if (vram_lost) {5414					DRM_INFO("VRAM is lost due to GPU reset!\n");5415					amdgpu_inc_vram_lost(tmp_adev);5416				}5417 5418				r = amdgpu_device_fw_loading(tmp_adev);5419				if (r)5420					return r;5421 5422				r = amdgpu_xcp_restore_partition_mode(5423					tmp_adev->xcp_mgr);5424				if (r)5425					goto out;5426 5427				r = amdgpu_device_ip_resume_phase2(tmp_adev);5428				if (r)5429					goto out;5430 5431				if (tmp_adev->mman.buffer_funcs_ring->sched.ready)5432					amdgpu_ttm_set_buffer_funcs_status(tmp_adev, true);5433 5434				if (vram_lost)5435					amdgpu_device_fill_reset_magic(tmp_adev);5436 5437				/*5438				 * Add this ASIC as tracked as reset was already5439				 * complete successfully.5440				 */5441				amdgpu_register_gpu_instance(tmp_adev);5442 5443				if (!reset_context->hive &&5444				    tmp_adev->gmc.xgmi.num_physical_nodes > 1)5445					amdgpu_xgmi_add_device(tmp_adev);5446 5447				r = amdgpu_device_ip_late_init(tmp_adev);5448				if (r)5449					goto out;5450 5451				drm_fb_helper_set_suspend_unlocked(adev_to_drm(tmp_adev)->fb_helper, false);5452 5453				/*5454				 * The GPU enters bad state once faulty pages5455				 * by ECC has reached the threshold, and ras5456				 * recovery is scheduled next. So add one check5457				 * here to break recovery if it indeed exceeds5458				 * bad page threshold, and remind user to5459				 * retire this GPU or setting one bigger5460				 * bad_page_threshold value to fix this once5461				 * probing driver again.5462				 */5463				if (!amdgpu_ras_is_rma(tmp_adev)) {5464					/* must succeed. */5465					amdgpu_ras_resume(tmp_adev);5466				} else {5467					r = -EINVAL;5468					goto out;5469				}5470 5471				/* Update PSP FW topology after reset */5472				if (reset_context->hive &&5473				    tmp_adev->gmc.xgmi.num_physical_nodes > 1)5474					r = amdgpu_xgmi_update_topology(5475						reset_context->hive, tmp_adev);5476			}5477		}5478 5479out:5480		if (!r) {5481			amdgpu_irq_gpu_reset_resume_helper(tmp_adev);5482			r = amdgpu_ib_ring_tests(tmp_adev);5483			if (r) {5484				dev_err(tmp_adev->dev, "ib ring test failed (%d).\n", r);5485				need_full_reset = true;5486				r = -EAGAIN;5487				goto end;5488			}5489		}5490 5491		if (r)5492			tmp_adev->asic_reset_res = r;5493	}5494 5495end:5496	if (need_full_reset)5497		set_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);5498	else5499		clear_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);5500	return r;5501}5502 5503static void amdgpu_device_set_mp1_state(struct amdgpu_device *adev)5504{5505 5506	switch (amdgpu_asic_reset_method(adev)) {5507	case AMD_RESET_METHOD_MODE1:5508		adev->mp1_state = PP_MP1_STATE_SHUTDOWN;5509		break;5510	case AMD_RESET_METHOD_MODE2:5511		adev->mp1_state = PP_MP1_STATE_RESET;5512		break;5513	default:5514		adev->mp1_state = PP_MP1_STATE_NONE;5515		break;5516	}5517}5518 5519static void amdgpu_device_unset_mp1_state(struct amdgpu_device *adev)5520{5521	amdgpu_vf_error_trans_all(adev);5522	adev->mp1_state = PP_MP1_STATE_NONE;5523}5524 5525static void amdgpu_device_resume_display_audio(struct amdgpu_device *adev)5526{5527	struct pci_dev *p = NULL;5528 5529	p = pci_get_domain_bus_and_slot(pci_domain_nr(adev->pdev->bus),5530			adev->pdev->bus->number, 1);5531	if (p) {5532		pm_runtime_enable(&(p->dev));5533		pm_runtime_resume(&(p->dev));5534	}5535 5536	pci_dev_put(p);5537}5538 5539static int amdgpu_device_suspend_display_audio(struct amdgpu_device *adev)5540{5541	enum amd_reset_method reset_method;5542	struct pci_dev *p = NULL;5543	u64 expires;5544 5545	/*5546	 * For now, only BACO and mode1 reset are confirmed5547	 * to suffer the audio issue without proper suspended.5548	 */5549	reset_method = amdgpu_asic_reset_method(adev);5550	if ((reset_method != AMD_RESET_METHOD_BACO) &&5551	     (reset_method != AMD_RESET_METHOD_MODE1))5552		return -EINVAL;5553 5554	p = pci_get_domain_bus_and_slot(pci_domain_nr(adev->pdev->bus),5555			adev->pdev->bus->number, 1);5556	if (!p)5557		return -ENODEV;5558 5559	expires = pm_runtime_autosuspend_expiration(&(p->dev));5560	if (!expires)5561		/*5562		 * If we cannot get the audio device autosuspend delay,5563		 * a fixed 4S interval will be used. Considering 3S is5564		 * the audio controller default autosuspend delay setting.5565		 * 4S used here is guaranteed to cover that.5566		 */5567		expires = ktime_get_mono_fast_ns() + NSEC_PER_SEC * 4ULL;5568 5569	while (!pm_runtime_status_suspended(&(p->dev))) {5570		if (!pm_runtime_suspend(&(p->dev)))5571			break;5572 5573		if (expires < ktime_get_mono_fast_ns()) {5574			dev_warn(adev->dev, "failed to suspend display audio\n");5575			pci_dev_put(p);5576			/* TODO: abort the succeeding gpu reset? */5577			return -ETIMEDOUT;5578		}5579	}5580 5581	pm_runtime_disable(&(p->dev));5582 5583	pci_dev_put(p);5584	return 0;5585}5586 5587static inline void amdgpu_device_stop_pending_resets(struct amdgpu_device *adev)5588{5589	struct amdgpu_ras *con = amdgpu_ras_get_context(adev);5590 5591#if defined(CONFIG_DEBUG_FS)5592	if (!amdgpu_sriov_vf(adev))5593		cancel_work(&adev->reset_work);5594#endif5595 5596	if (adev->kfd.dev)5597		cancel_work(&adev->kfd.reset_work);5598 5599	if (amdgpu_sriov_vf(adev))5600		cancel_work(&adev->virt.flr_work);5601 5602	if (con && adev->ras_enabled)5603		cancel_work(&con->recovery_work);5604 5605}5606 5607static int amdgpu_device_health_check(struct list_head *device_list_handle)5608{5609	struct amdgpu_device *tmp_adev;5610	int ret = 0;5611	u32 status;5612 5613	list_for_each_entry(tmp_adev, device_list_handle, reset_list) {5614		pci_read_config_dword(tmp_adev->pdev, PCI_COMMAND, &status);5615		if (PCI_POSSIBLE_ERROR(status)) {5616			dev_err(tmp_adev->dev, "device lost from bus!");5617			ret = -ENODEV;5618		}5619	}5620 5621	return ret;5622}5623 5624/**5625 * amdgpu_device_gpu_recover - reset the asic and recover scheduler5626 *5627 * @adev: amdgpu_device pointer5628 * @job: which job trigger hang5629 * @reset_context: amdgpu reset context pointer5630 *5631 * Attempt to reset the GPU if it has hung (all asics).5632 * Attempt to do soft-reset or full-reset and reinitialize Asic5633 * Returns 0 for success or an error on failure.5634 */5635 5636int amdgpu_device_gpu_recover(struct amdgpu_device *adev,5637			      struct amdgpu_job *job,5638			      struct amdgpu_reset_context *reset_context)5639{5640	struct list_head device_list, *device_list_handle =  NULL;5641	bool job_signaled = false;5642	struct amdgpu_hive_info *hive = NULL;5643	struct amdgpu_device *tmp_adev = NULL;5644	int i, r = 0;5645	bool need_emergency_restart = false;5646	bool audio_suspended = false;5647	int retry_limit = AMDGPU_MAX_RETRY_LIMIT;5648 5649	/*5650	 * Special case: RAS triggered and full reset isn't supported5651	 */5652	need_emergency_restart = amdgpu_ras_need_emergency_restart(adev);5653 5654	/*5655	 * Flush RAM to disk so that after reboot5656	 * the user can read log and see why the system rebooted.5657	 */5658	if (need_emergency_restart && amdgpu_ras_get_context(adev) &&5659		amdgpu_ras_get_context(adev)->reboot) {5660		DRM_WARN("Emergency reboot.");5661 5662		ksys_sync_helper();5663		emergency_restart();5664	}5665 5666	dev_info(adev->dev, "GPU %s begin!\n",5667		need_emergency_restart ? "jobs stop":"reset");5668 5669	if (!amdgpu_sriov_vf(adev))5670		hive = amdgpu_get_xgmi_hive(adev);5671	if (hive)5672		mutex_lock(&hive->hive_lock);5673 5674	reset_context->job = job;5675	reset_context->hive = hive;5676	/*5677	 * Build list of devices to reset.5678	 * In case we are in XGMI hive mode, resort the device list5679	 * to put adev in the 1st position.5680	 */5681	INIT_LIST_HEAD(&device_list);5682	if (!amdgpu_sriov_vf(adev) && (adev->gmc.xgmi.num_physical_nodes > 1) && hive) {5683		list_for_each_entry(tmp_adev, &hive->device_list, gmc.xgmi.head) {5684			list_add_tail(&tmp_adev->reset_list, &device_list);5685			if (adev->shutdown)5686				tmp_adev->shutdown = true;5687		}5688		if (!list_is_first(&adev->reset_list, &device_list))5689			list_rotate_to_front(&adev->reset_list, &device_list);5690		device_list_handle = &device_list;5691	} else {5692		list_add_tail(&adev->reset_list, &device_list);5693		device_list_handle = &device_list;5694	}5695 5696	if (!amdgpu_sriov_vf(adev)) {5697		r = amdgpu_device_health_check(device_list_handle);5698		if (r)5699			goto end_reset;5700	}5701 5702	/* We need to lock reset domain only once both for XGMI and single device */5703	tmp_adev = list_first_entry(device_list_handle, struct amdgpu_device,5704				    reset_list);5705	amdgpu_device_lock_reset_domain(tmp_adev->reset_domain);5706 5707	/* block all schedulers and reset given job's ring */5708	list_for_each_entry(tmp_adev, device_list_handle, reset_list) {5709 5710		amdgpu_device_set_mp1_state(tmp_adev);5711 5712		/*5713		 * Try to put the audio codec into suspend state5714		 * before gpu reset started.5715		 *5716		 * Due to the power domain of the graphics device5717		 * is shared with AZ power domain. Without this,5718		 * we may change the audio hardware from behind5719		 * the audio driver's back. That will trigger5720		 * some audio codec errors.5721		 */5722		if (!amdgpu_device_suspend_display_audio(tmp_adev))5723			audio_suspended = true;5724 5725		amdgpu_ras_set_error_query_ready(tmp_adev, false);5726 5727		cancel_delayed_work_sync(&tmp_adev->delayed_init_work);5728 5729		amdgpu_amdkfd_pre_reset(tmp_adev, reset_context);5730 5731		/*5732		 * Mark these ASICs to be reseted as untracked first5733		 * And add them back after reset completed5734		 */5735		amdgpu_unregister_gpu_instance(tmp_adev);5736 5737		drm_fb_helper_set_suspend_unlocked(adev_to_drm(tmp_adev)->fb_helper, true);5738 5739		/* disable ras on ALL IPs */5740		if (!need_emergency_restart &&5741		      amdgpu_device_ip_need_full_reset(tmp_adev))5742			amdgpu_ras_suspend(tmp_adev);5743 5744		for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {5745			struct amdgpu_ring *ring = tmp_adev->rings[i];5746 5747			if (!amdgpu_ring_sched_ready(ring))5748				continue;5749 5750			drm_sched_stop(&ring->sched, job ? &job->base : NULL);5751 5752			if (need_emergency_restart)5753				amdgpu_job_stop_all_jobs_on_sched(&ring->sched);5754		}5755		atomic_inc(&tmp_adev->gpu_reset_counter);5756	}5757 5758	if (need_emergency_restart)5759		goto skip_sched_resume;5760 5761	/*5762	 * Must check guilty signal here since after this point all old5763	 * HW fences are force signaled.5764	 *5765	 * job->base holds a reference to parent fence5766	 */5767	if (job && dma_fence_is_signaled(&job->hw_fence)) {5768		job_signaled = true;5769		dev_info(adev->dev, "Guilty job already signaled, skipping HW reset");5770		goto skip_hw_reset;5771	}5772 5773retry:	/* Rest of adevs pre asic reset from XGMI hive. */5774	list_for_each_entry(tmp_adev, device_list_handle, reset_list) {5775		r = amdgpu_device_pre_asic_reset(tmp_adev, reset_context);5776		/*TODO Should we stop ?*/5777		if (r) {5778			dev_err(tmp_adev->dev, "GPU pre asic reset failed with err, %d for drm dev, %s ",5779				  r, adev_to_drm(tmp_adev)->unique);5780			tmp_adev->asic_reset_res = r;5781		}5782	}5783 5784	/* Actual ASIC resets if needed.*/5785	/* Host driver will handle XGMI hive reset for SRIOV */5786	if (amdgpu_sriov_vf(adev)) {5787		if (amdgpu_ras_get_fed_status(adev) || amdgpu_virt_rcvd_ras_interrupt(adev)) {5788			dev_dbg(adev->dev, "Detected RAS error, wait for FLR completion\n");5789			amdgpu_ras_set_fed(adev, true);5790			set_bit(AMDGPU_HOST_FLR, &reset_context->flags);5791		}5792 5793		r = amdgpu_device_reset_sriov(adev, reset_context);5794		if (AMDGPU_RETRY_SRIOV_RESET(r) && (retry_limit--) > 0) {5795			amdgpu_virt_release_full_gpu(adev, true);5796			goto retry;5797		}5798		if (r)5799			adev->asic_reset_res = r;5800	} else {5801		r = amdgpu_do_asic_reset(device_list_handle, reset_context);5802		if (r && r == -EAGAIN)5803			goto retry;5804	}5805 5806	list_for_each_entry(tmp_adev, device_list_handle, reset_list) {5807		/*5808		 * Drop any pending non scheduler resets queued before reset is done.5809		 * Any reset scheduled after this point would be valid. Scheduler resets5810		 * were already dropped during drm_sched_stop and no new ones can come5811		 * in before drm_sched_start.5812		 */5813		amdgpu_device_stop_pending_resets(tmp_adev);5814	}5815 5816skip_hw_reset:5817 5818	/* Post ASIC reset for all devs .*/5819	list_for_each_entry(tmp_adev, device_list_handle, reset_list) {5820 5821		for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {5822			struct amdgpu_ring *ring = tmp_adev->rings[i];5823 5824			if (!amdgpu_ring_sched_ready(ring))5825				continue;5826 5827			drm_sched_start(&ring->sched);5828		}5829 5830		if (!drm_drv_uses_atomic_modeset(adev_to_drm(tmp_adev)) && !job_signaled)5831			drm_helper_resume_force_mode(adev_to_drm(tmp_adev));5832 5833		if (tmp_adev->asic_reset_res)5834			r = tmp_adev->asic_reset_res;5835 5836		tmp_adev->asic_reset_res = 0;5837 5838		if (r) {5839			/* bad news, how to tell it to userspace ?5840			 * for ras error, we should report GPU bad status instead of5841			 * reset failure5842			 */5843			if (reset_context->src != AMDGPU_RESET_SRC_RAS ||5844			    !amdgpu_ras_eeprom_check_err_threshold(tmp_adev))5845				dev_info(tmp_adev->dev, "GPU reset(%d) failed\n",5846					atomic_read(&tmp_adev->gpu_reset_counter));5847			amdgpu_vf_error_put(tmp_adev, AMDGIM_ERROR_VF_GPU_RESET_FAIL, 0, r);5848		} else {5849			dev_info(tmp_adev->dev, "GPU reset(%d) succeeded!\n", atomic_read(&tmp_adev->gpu_reset_counter));5850			if (amdgpu_acpi_smart_shift_update(adev_to_drm(tmp_adev), AMDGPU_SS_DEV_D0))5851				DRM_WARN("smart shift update failed\n");5852		}5853	}5854 5855skip_sched_resume:5856	list_for_each_entry(tmp_adev, device_list_handle, reset_list) {5857		/* unlock kfd: SRIOV would do it separately */5858		if (!need_emergency_restart && !amdgpu_sriov_vf(tmp_adev))5859			amdgpu_amdkfd_post_reset(tmp_adev);5860 5861		/* kfd_post_reset will do nothing if kfd device is not initialized,5862		 * need to bring up kfd here if it's not be initialized before5863		 */5864		if (!adev->kfd.init_complete)5865			amdgpu_amdkfd_device_init(adev);5866 5867		if (audio_suspended)5868			amdgpu_device_resume_display_audio(tmp_adev);5869 5870		amdgpu_device_unset_mp1_state(tmp_adev);5871 5872		amdgpu_ras_set_error_query_ready(tmp_adev, true);5873	}5874 5875	tmp_adev = list_first_entry(device_list_handle, struct amdgpu_device,5876					    reset_list);5877	amdgpu_device_unlock_reset_domain(tmp_adev->reset_domain);5878 5879end_reset:5880	if (hive) {5881		mutex_unlock(&hive->hive_lock);5882		amdgpu_put_xgmi_hive(hive);5883	}5884 5885	if (r)5886		dev_info(adev->dev, "GPU reset end with ret = %d\n", r);5887 5888	atomic_set(&adev->reset_domain->reset_res, r);5889	return r;5890}5891 5892/**5893 * amdgpu_device_partner_bandwidth - find the bandwidth of appropriate partner5894 *5895 * @adev: amdgpu_device pointer5896 * @speed: pointer to the speed of the link5897 * @width: pointer to the width of the link5898 *5899 * Evaluate the hierarchy to find the speed and bandwidth capabilities of the5900 * first physical partner to an AMD dGPU.5901 * This will exclude any virtual switches and links.5902 */5903static void amdgpu_device_partner_bandwidth(struct amdgpu_device *adev,5904					    enum pci_bus_speed *speed,5905					    enum pcie_link_width *width)5906{5907	struct pci_dev *parent = adev->pdev;5908 5909	if (!speed || !width)5910		return;5911 5912	*speed = PCI_SPEED_UNKNOWN;5913	*width = PCIE_LNK_WIDTH_UNKNOWN;5914 5915	if (amdgpu_device_pcie_dynamic_switching_supported(adev)) {5916		while ((parent = pci_upstream_bridge(parent))) {5917			/* skip upstream/downstream switches internal to dGPU*/5918			if (parent->vendor == PCI_VENDOR_ID_ATI)5919				continue;5920			*speed = pcie_get_speed_cap(parent);5921			*width = pcie_get_width_cap(parent);5922			break;5923		}5924	} else {5925		/* use the current speeds rather than max if switching is not supported */5926		pcie_bandwidth_available(adev->pdev, NULL, speed, width);5927	}5928}5929 5930/**5931 * amdgpu_device_get_pcie_info - fence pcie info about the PCIE slot5932 *5933 * @adev: amdgpu_device pointer5934 *5935 * Fetchs and stores in the driver the PCIE capabilities (gen speed5936 * and lanes) of the slot the device is in. Handles APUs and5937 * virtualized environments where PCIE config space may not be available.5938 */5939static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev)5940{5941	struct pci_dev *pdev;5942	enum pci_bus_speed speed_cap, platform_speed_cap;5943	enum pcie_link_width platform_link_width;5944 5945	if (amdgpu_pcie_gen_cap)5946		adev->pm.pcie_gen_mask = amdgpu_pcie_gen_cap;5947 5948	if (amdgpu_pcie_lane_cap)5949		adev->pm.pcie_mlw_mask = amdgpu_pcie_lane_cap;5950 5951	/* covers APUs as well */5952	if (pci_is_root_bus(adev->pdev->bus) && !amdgpu_passthrough(adev)) {5953		if (adev->pm.pcie_gen_mask == 0)5954			adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK;5955		if (adev->pm.pcie_mlw_mask == 0)5956			adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;5957		return;5958	}5959 5960	if (adev->pm.pcie_gen_mask && adev->pm.pcie_mlw_mask)5961		return;5962 5963	amdgpu_device_partner_bandwidth(adev, &platform_speed_cap,5964					&platform_link_width);5965 5966	if (adev->pm.pcie_gen_mask == 0) {5967		/* asic caps */5968		pdev = adev->pdev;5969		speed_cap = pcie_get_speed_cap(pdev);5970		if (speed_cap == PCI_SPEED_UNKNOWN) {5971			adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |5972						  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |5973						  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3);5974		} else {5975			if (speed_cap == PCIE_SPEED_32_0GT)5976				adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |5977							  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |5978							  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3 |5979							  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN4 |5980							  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN5);5981			else if (speed_cap == PCIE_SPEED_16_0GT)5982				adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |5983							  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |5984							  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3 |5985							  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN4);5986			else if (speed_cap == PCIE_SPEED_8_0GT)5987				adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |5988							  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |5989							  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3);5990			else if (speed_cap == PCIE_SPEED_5_0GT)5991				adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |5992							  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2);5993			else5994				adev->pm.pcie_gen_mask |= CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1;5995		}5996		/* platform caps */5997		if (platform_speed_cap == PCI_SPEED_UNKNOWN) {5998			adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |5999						   CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2);6000		} else {6001			if (platform_speed_cap == PCIE_SPEED_32_0GT)6002				adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |6003							   CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |6004							   CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3 |6005							   CAIL_PCIE_LINK_SPEED_SUPPORT_GEN4 |6006							   CAIL_PCIE_LINK_SPEED_SUPPORT_GEN5);6007			else if (platform_speed_cap == PCIE_SPEED_16_0GT)6008				adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |6009							   CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |6010							   CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3 |6011							   CAIL_PCIE_LINK_SPEED_SUPPORT_GEN4);6012			else if (platform_speed_cap == PCIE_SPEED_8_0GT)6013				adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |6014							   CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |6015							   CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3);6016			else if (platform_speed_cap == PCIE_SPEED_5_0GT)6017				adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |6018							   CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2);6019			else6020				adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1;6021 6022		}6023	}6024	if (adev->pm.pcie_mlw_mask == 0) {6025		if (platform_link_width == PCIE_LNK_WIDTH_UNKNOWN) {6026			adev->pm.pcie_mlw_mask |= AMDGPU_DEFAULT_PCIE_MLW_MASK;6027		} else {6028			switch (platform_link_width) {6029			case PCIE_LNK_X32:6030				adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |6031							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |6032							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |6033							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |6034							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |6035							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |6036							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);6037				break;6038			case PCIE_LNK_X16:6039				adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |6040							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |6041							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |6042							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |6043							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |6044							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);6045				break;6046			case PCIE_LNK_X12:6047				adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |6048							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |6049							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |6050							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |6051							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);6052				break;6053			case PCIE_LNK_X8:6054				adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |6055							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |6056							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |6057							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);6058				break;6059			case PCIE_LNK_X4:6060				adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |6061							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |6062							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);6063				break;6064			case PCIE_LNK_X2:6065				adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |6066							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);6067				break;6068			case PCIE_LNK_X1:6069				adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1;6070				break;6071			default:6072				break;6073			}6074		}6075	}6076}6077 6078/**6079 * amdgpu_device_is_peer_accessible - Check peer access through PCIe BAR6080 *6081 * @adev: amdgpu_device pointer6082 * @peer_adev: amdgpu_device pointer for peer device trying to access @adev6083 *6084 * Return true if @peer_adev can access (DMA) @adev through the PCIe6085 * BAR, i.e. @adev is "large BAR" and the BAR matches the DMA mask of6086 * @peer_adev.6087 */6088bool amdgpu_device_is_peer_accessible(struct amdgpu_device *adev,6089				      struct amdgpu_device *peer_adev)6090{6091#ifdef CONFIG_HSA_AMD_P2P6092	bool p2p_access =6093		!adev->gmc.xgmi.connected_to_cpu &&6094		!(pci_p2pdma_distance(adev->pdev, peer_adev->dev, false) < 0);6095 6096	bool is_large_bar = adev->gmc.visible_vram_size &&6097		adev->gmc.real_vram_size == adev->gmc.visible_vram_size;6098	bool p2p_addressable = amdgpu_device_check_iommu_remap(peer_adev);6099 6100	if (!p2p_addressable) {6101		uint64_t address_mask = peer_adev->dev->dma_mask ?6102			~*peer_adev->dev->dma_mask : ~((1ULL << 32) - 1);6103		resource_size_t aper_limit =6104			adev->gmc.aper_base + adev->gmc.aper_size - 1;6105 6106		p2p_addressable = !(adev->gmc.aper_base & address_mask ||6107				     aper_limit & address_mask);6108	}6109	return pcie_p2p && is_large_bar && p2p_access && p2p_addressable;6110#else6111	return false;6112#endif6113}6114 6115int amdgpu_device_baco_enter(struct drm_device *dev)6116{6117	struct amdgpu_device *adev = drm_to_adev(dev);6118	struct amdgpu_ras *ras = amdgpu_ras_get_context(adev);6119 6120	if (!amdgpu_device_supports_baco(dev))6121		return -ENOTSUPP;6122 6123	if (ras && adev->ras_enabled &&6124	    adev->nbio.funcs->enable_doorbell_interrupt)6125		adev->nbio.funcs->enable_doorbell_interrupt(adev, false);6126 6127	return amdgpu_dpm_baco_enter(adev);6128}6129 6130int amdgpu_device_baco_exit(struct drm_device *dev)6131{6132	struct amdgpu_device *adev = drm_to_adev(dev);6133	struct amdgpu_ras *ras = amdgpu_ras_get_context(adev);6134	int ret = 0;6135 6136	if (!amdgpu_device_supports_baco(dev))6137		return -ENOTSUPP;6138 6139	ret = amdgpu_dpm_baco_exit(adev);6140	if (ret)6141		return ret;6142 6143	if (ras && adev->ras_enabled &&6144	    adev->nbio.funcs->enable_doorbell_interrupt)6145		adev->nbio.funcs->enable_doorbell_interrupt(adev, true);6146 6147	if (amdgpu_passthrough(adev) && adev->nbio.funcs &&6148	    adev->nbio.funcs->clear_doorbell_interrupt)6149		adev->nbio.funcs->clear_doorbell_interrupt(adev);6150 6151	return 0;6152}6153 6154/**6155 * amdgpu_pci_error_detected - Called when a PCI error is detected.6156 * @pdev: PCI device struct6157 * @state: PCI channel state6158 *6159 * Description: Called when a PCI error is detected.6160 *6161 * Return: PCI_ERS_RESULT_NEED_RESET or PCI_ERS_RESULT_DISCONNECT.6162 */6163pci_ers_result_t amdgpu_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)6164{6165	struct drm_device *dev = pci_get_drvdata(pdev);6166	struct amdgpu_device *adev = drm_to_adev(dev);6167	int i;6168 6169	DRM_INFO("PCI error: detected callback, state(%d)!!\n", state);6170 6171	if (adev->gmc.xgmi.num_physical_nodes > 1) {6172		DRM_WARN("No support for XGMI hive yet...");6173		return PCI_ERS_RESULT_DISCONNECT;6174	}6175 6176	adev->pci_channel_state = state;6177 6178	switch (state) {6179	case pci_channel_io_normal:6180		return PCI_ERS_RESULT_CAN_RECOVER;6181	/* Fatal error, prepare for slot reset */6182	case pci_channel_io_frozen:6183		/*6184		 * Locking adev->reset_domain->sem will prevent any external access6185		 * to GPU during PCI error recovery6186		 */6187		amdgpu_device_lock_reset_domain(adev->reset_domain);6188		amdgpu_device_set_mp1_state(adev);6189 6190		/*6191		 * Block any work scheduling as we do for regular GPU reset6192		 * for the duration of the recovery6193		 */6194		for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {6195			struct amdgpu_ring *ring = adev->rings[i];6196 6197			if (!amdgpu_ring_sched_ready(ring))6198				continue;6199 6200			drm_sched_stop(&ring->sched, NULL);6201		}6202		atomic_inc(&adev->gpu_reset_counter);6203		return PCI_ERS_RESULT_NEED_RESET;6204	case pci_channel_io_perm_failure:6205		/* Permanent error, prepare for device removal */6206		return PCI_ERS_RESULT_DISCONNECT;6207	}6208 6209	return PCI_ERS_RESULT_NEED_RESET;6210}6211 6212/**6213 * amdgpu_pci_mmio_enabled - Enable MMIO and dump debug registers6214 * @pdev: pointer to PCI device6215 */6216pci_ers_result_t amdgpu_pci_mmio_enabled(struct pci_dev *pdev)6217{6218 6219	DRM_INFO("PCI error: mmio enabled callback!!\n");6220 6221	/* TODO - dump whatever for debugging purposes */6222 6223	/* This called only if amdgpu_pci_error_detected returns6224	 * PCI_ERS_RESULT_CAN_RECOVER. Read/write to the device still6225	 * works, no need to reset slot.6226	 */6227 6228	return PCI_ERS_RESULT_RECOVERED;6229}6230 6231/**6232 * amdgpu_pci_slot_reset - Called when PCI slot has been reset.6233 * @pdev: PCI device struct6234 *6235 * Description: This routine is called by the pci error recovery6236 * code after the PCI slot has been reset, just before we6237 * should resume normal operations.6238 */6239pci_ers_result_t amdgpu_pci_slot_reset(struct pci_dev *pdev)6240{6241	struct drm_device *dev = pci_get_drvdata(pdev);6242	struct amdgpu_device *adev = drm_to_adev(dev);6243	int r, i;6244	struct amdgpu_reset_context reset_context;6245	u32 memsize;6246	struct list_head device_list;6247 6248	/* PCI error slot reset should be skipped During RAS recovery */6249	if ((amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3) ||6250	    amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4)) &&6251	    amdgpu_ras_in_recovery(adev))6252		return PCI_ERS_RESULT_RECOVERED;6253 6254	DRM_INFO("PCI error: slot reset callback!!\n");6255 6256	memset(&reset_context, 0, sizeof(reset_context));6257 6258	INIT_LIST_HEAD(&device_list);6259	list_add_tail(&adev->reset_list, &device_list);6260 6261	/* wait for asic to come out of reset */6262	msleep(500);6263 6264	/* Restore PCI confspace */6265	amdgpu_device_load_pci_state(pdev);6266 6267	/* confirm  ASIC came out of reset */6268	for (i = 0; i < adev->usec_timeout; i++) {6269		memsize = amdgpu_asic_get_config_memsize(adev);6270 6271		if (memsize != 0xffffffff)6272			break;6273		udelay(1);6274	}6275	if (memsize == 0xffffffff) {6276		r = -ETIME;6277		goto out;6278	}6279 6280	reset_context.method = AMD_RESET_METHOD_NONE;6281	reset_context.reset_req_dev = adev;6282	set_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags);6283	set_bit(AMDGPU_SKIP_HW_RESET, &reset_context.flags);6284 6285	adev->no_hw_access = true;6286	r = amdgpu_device_pre_asic_reset(adev, &reset_context);6287	adev->no_hw_access = false;6288	if (r)6289		goto out;6290 6291	r = amdgpu_do_asic_reset(&device_list, &reset_context);6292 6293out:6294	if (!r) {6295		if (amdgpu_device_cache_pci_state(adev->pdev))6296			pci_restore_state(adev->pdev);6297 6298		DRM_INFO("PCIe error recovery succeeded\n");6299	} else {6300		DRM_ERROR("PCIe error recovery failed, err:%d", r);6301		amdgpu_device_unset_mp1_state(adev);6302		amdgpu_device_unlock_reset_domain(adev->reset_domain);6303	}6304 6305	return r ? PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_RECOVERED;6306}6307 6308/**6309 * amdgpu_pci_resume() - resume normal ops after PCI reset6310 * @pdev: pointer to PCI device6311 *6312 * Called when the error recovery driver tells us that its6313 * OK to resume normal operation.6314 */6315void amdgpu_pci_resume(struct pci_dev *pdev)6316{6317	struct drm_device *dev = pci_get_drvdata(pdev);6318	struct amdgpu_device *adev = drm_to_adev(dev);6319	int i;6320 6321 6322	DRM_INFO("PCI error: resume callback!!\n");6323 6324	/* Only continue execution for the case of pci_channel_io_frozen */6325	if (adev->pci_channel_state != pci_channel_io_frozen)6326		return;6327 6328	for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {6329		struct amdgpu_ring *ring = adev->rings[i];6330 6331		if (!amdgpu_ring_sched_ready(ring))6332			continue;6333 6334		drm_sched_start(&ring->sched);6335	}6336 6337	amdgpu_device_unset_mp1_state(adev);6338	amdgpu_device_unlock_reset_domain(adev->reset_domain);6339}6340 6341bool amdgpu_device_cache_pci_state(struct pci_dev *pdev)6342{6343	struct drm_device *dev = pci_get_drvdata(pdev);6344	struct amdgpu_device *adev = drm_to_adev(dev);6345	int r;6346 6347	r = pci_save_state(pdev);6348	if (!r) {6349		kfree(adev->pci_state);6350 6351		adev->pci_state = pci_store_saved_state(pdev);6352 6353		if (!adev->pci_state) {6354			DRM_ERROR("Failed to store PCI saved state");6355			return false;6356		}6357	} else {6358		DRM_WARN("Failed to save PCI state, err:%d\n", r);6359		return false;6360	}6361 6362	return true;6363}6364 6365bool amdgpu_device_load_pci_state(struct pci_dev *pdev)6366{6367	struct drm_device *dev = pci_get_drvdata(pdev);6368	struct amdgpu_device *adev = drm_to_adev(dev);6369	int r;6370 6371	if (!adev->pci_state)6372		return false;6373 6374	r = pci_load_saved_state(pdev, adev->pci_state);6375 6376	if (!r) {6377		pci_restore_state(pdev);6378	} else {6379		DRM_WARN("Failed to load PCI state, err:%d\n", r);6380		return false;6381	}6382 6383	return true;6384}6385 6386void amdgpu_device_flush_hdp(struct amdgpu_device *adev,6387		struct amdgpu_ring *ring)6388{6389#ifdef CONFIG_X86_646390	if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev))6391		return;6392#endif6393	if (adev->gmc.xgmi.connected_to_cpu)6394		return;6395 6396	if (ring && ring->funcs->emit_hdp_flush)6397		amdgpu_ring_emit_hdp_flush(ring);6398	else6399		amdgpu_asic_flush_hdp(adev, ring);6400}6401 6402void amdgpu_device_invalidate_hdp(struct amdgpu_device *adev,6403		struct amdgpu_ring *ring)6404{6405#ifdef CONFIG_X86_646406	if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev))6407		return;6408#endif6409	if (adev->gmc.xgmi.connected_to_cpu)6410		return;6411 6412	amdgpu_asic_invalidate_hdp(adev, ring);6413}6414 6415int amdgpu_in_reset(struct amdgpu_device *adev)6416{6417	return atomic_read(&adev->reset_domain->in_gpu_reset);6418}6419 6420/**6421 * amdgpu_device_halt() - bring hardware to some kind of halt state6422 *6423 * @adev: amdgpu_device pointer6424 *6425 * Bring hardware to some kind of halt state so that no one can touch it6426 * any more. It will help to maintain error context when error occurred.6427 * Compare to a simple hang, the system will keep stable at least for SSH6428 * access. Then it should be trivial to inspect the hardware state and6429 * see what's going on. Implemented as following:6430 *6431 * 1. drm_dev_unplug() makes device inaccessible to user space(IOCTLs, etc),6432 *    clears all CPU mappings to device, disallows remappings through page faults6433 * 2. amdgpu_irq_disable_all() disables all interrupts6434 * 3. amdgpu_fence_driver_hw_fini() signals all HW fences6435 * 4. set adev->no_hw_access to avoid potential crashes after setp 56436 * 5. amdgpu_device_unmap_mmio() clears all MMIO mappings6437 * 6. pci_disable_device() and pci_wait_for_pending_transaction()6438 *    flush any in flight DMA operations6439 */6440void amdgpu_device_halt(struct amdgpu_device *adev)6441{6442	struct pci_dev *pdev = adev->pdev;6443	struct drm_device *ddev = adev_to_drm(adev);6444 6445	amdgpu_xcp_dev_unplug(adev);6446	drm_dev_unplug(ddev);6447 6448	amdgpu_irq_disable_all(adev);6449 6450	amdgpu_fence_driver_hw_fini(adev);6451 6452	adev->no_hw_access = true;6453 6454	amdgpu_device_unmap_mmio(adev);6455 6456	pci_disable_device(pdev);6457	pci_wait_for_pending_transaction(pdev);6458}6459 6460u32 amdgpu_device_pcie_port_rreg(struct amdgpu_device *adev,6461				u32 reg)6462{6463	unsigned long flags, address, data;6464	u32 r;6465 6466	address = adev->nbio.funcs->get_pcie_port_index_offset(adev);6467	data = adev->nbio.funcs->get_pcie_port_data_offset(adev);6468 6469	spin_lock_irqsave(&adev->pcie_idx_lock, flags);6470	WREG32(address, reg * 4);6471	(void)RREG32(address);6472	r = RREG32(data);6473	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);6474	return r;6475}6476 6477void amdgpu_device_pcie_port_wreg(struct amdgpu_device *adev,6478				u32 reg, u32 v)6479{6480	unsigned long flags, address, data;6481 6482	address = adev->nbio.funcs->get_pcie_port_index_offset(adev);6483	data = adev->nbio.funcs->get_pcie_port_data_offset(adev);6484 6485	spin_lock_irqsave(&adev->pcie_idx_lock, flags);6486	WREG32(address, reg * 4);6487	(void)RREG32(address);6488	WREG32(data, v);6489	(void)RREG32(data);6490	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);6491}6492 6493/**6494 * amdgpu_device_get_gang - return a reference to the current gang6495 * @adev: amdgpu_device pointer6496 *6497 * Returns: A new reference to the current gang leader.6498 */6499struct dma_fence *amdgpu_device_get_gang(struct amdgpu_device *adev)6500{6501	struct dma_fence *fence;6502 6503	rcu_read_lock();6504	fence = dma_fence_get_rcu_safe(&adev->gang_submit);6505	rcu_read_unlock();6506	return fence;6507}6508 6509/**6510 * amdgpu_device_switch_gang - switch to a new gang6511 * @adev: amdgpu_device pointer6512 * @gang: the gang to switch to6513 *6514 * Try to switch to a new gang.6515 * Returns: NULL if we switched to the new gang or a reference to the current6516 * gang leader.6517 */6518struct dma_fence *amdgpu_device_switch_gang(struct amdgpu_device *adev,6519					    struct dma_fence *gang)6520{6521	struct dma_fence *old = NULL;6522 6523	do {6524		dma_fence_put(old);6525		old = amdgpu_device_get_gang(adev);6526		if (old == gang)6527			break;6528 6529		if (!dma_fence_is_signaled(old))6530			return old;6531 6532	} while (cmpxchg((struct dma_fence __force **)&adev->gang_submit,6533			 old, gang) != old);6534 6535	dma_fence_put(old);6536	return NULL;6537}6538 6539bool amdgpu_device_has_display_hardware(struct amdgpu_device *adev)6540{6541	switch (adev->asic_type) {6542#ifdef CONFIG_DRM_AMDGPU_SI6543	case CHIP_HAINAN:6544#endif6545	case CHIP_TOPAZ:6546		/* chips with no display hardware */6547		return false;6548#ifdef CONFIG_DRM_AMDGPU_SI6549	case CHIP_TAHITI:6550	case CHIP_PITCAIRN:6551	case CHIP_VERDE:6552	case CHIP_OLAND:6553#endif6554#ifdef CONFIG_DRM_AMDGPU_CIK6555	case CHIP_BONAIRE:6556	case CHIP_HAWAII:6557	case CHIP_KAVERI:6558	case CHIP_KABINI:6559	case CHIP_MULLINS:6560#endif6561	case CHIP_TONGA:6562	case CHIP_FIJI:6563	case CHIP_POLARIS10:6564	case CHIP_POLARIS11:6565	case CHIP_POLARIS12:6566	case CHIP_VEGAM:6567	case CHIP_CARRIZO:6568	case CHIP_STONEY:6569		/* chips with display hardware */6570		return true;6571	default:6572		/* IP discovery */6573		if (!amdgpu_ip_version(adev, DCE_HWIP, 0) ||6574		    (adev->harvest_ip_mask & AMD_HARVEST_IP_DMU_MASK))6575			return false;6576		return true;6577	}6578}6579 6580uint32_t amdgpu_device_wait_on_rreg(struct amdgpu_device *adev,6581		uint32_t inst, uint32_t reg_addr, char reg_name[],6582		uint32_t expected_value, uint32_t mask)6583{6584	uint32_t ret = 0;6585	uint32_t old_ = 0;6586	uint32_t tmp_ = RREG32(reg_addr);6587	uint32_t loop = adev->usec_timeout;6588 6589	while ((tmp_ & (mask)) != (expected_value)) {6590		if (old_ != tmp_) {6591			loop = adev->usec_timeout;6592			old_ = tmp_;6593		} else6594			udelay(1);6595		tmp_ = RREG32(reg_addr);6596		loop--;6597		if (!loop) {6598			DRM_WARN("Register(%d) [%s] failed to reach value 0x%08x != 0x%08xn",6599				  inst, reg_name, (uint32_t)expected_value,6600				  (uint32_t)(tmp_ & (mask)));6601			ret = -ETIMEDOUT;6602			break;6603		}6604	}6605	return ret;6606}6607