18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * Copyright 2014 Advanced Micro Devices, Inc.
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
58c2ecf20Sopenharmony_ci * copy of this software and associated documentation files (the "Software"),
68c2ecf20Sopenharmony_ci * to deal in the Software without restriction, including without limitation
78c2ecf20Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
88c2ecf20Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
98c2ecf20Sopenharmony_ci * Software is furnished to do so, subject to the following conditions:
108c2ecf20Sopenharmony_ci *
118c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice shall be included in
128c2ecf20Sopenharmony_ci * all copies or substantial portions of the Software.
138c2ecf20Sopenharmony_ci *
148c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
158c2ecf20Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
168c2ecf20Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
178c2ecf20Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
188c2ecf20Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
198c2ecf20Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
208c2ecf20Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE.
218c2ecf20Sopenharmony_ci *
228c2ecf20Sopenharmony_ci */
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci#include <linux/pci.h>
258c2ecf20Sopenharmony_ci#include <linux/slab.h>
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci#include "amdgpu.h"
288c2ecf20Sopenharmony_ci#include "amdgpu_atombios.h"
298c2ecf20Sopenharmony_ci#include "amdgpu_ih.h"
308c2ecf20Sopenharmony_ci#include "amdgpu_uvd.h"
318c2ecf20Sopenharmony_ci#include "amdgpu_vce.h"
328c2ecf20Sopenharmony_ci#include "amdgpu_ucode.h"
338c2ecf20Sopenharmony_ci#include "atom.h"
348c2ecf20Sopenharmony_ci#include "amd_pcie.h"
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#include "gmc/gmc_8_1_d.h"
378c2ecf20Sopenharmony_ci#include "gmc/gmc_8_1_sh_mask.h"
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#include "oss/oss_3_0_d.h"
408c2ecf20Sopenharmony_ci#include "oss/oss_3_0_sh_mask.h"
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci#include "bif/bif_5_0_d.h"
438c2ecf20Sopenharmony_ci#include "bif/bif_5_0_sh_mask.h"
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci#include "gca/gfx_8_0_d.h"
468c2ecf20Sopenharmony_ci#include "gca/gfx_8_0_sh_mask.h"
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci#include "smu/smu_7_1_1_d.h"
498c2ecf20Sopenharmony_ci#include "smu/smu_7_1_1_sh_mask.h"
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci#include "uvd/uvd_5_0_d.h"
528c2ecf20Sopenharmony_ci#include "uvd/uvd_5_0_sh_mask.h"
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci#include "vce/vce_3_0_d.h"
558c2ecf20Sopenharmony_ci#include "vce/vce_3_0_sh_mask.h"
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#include "dce/dce_10_0_d.h"
588c2ecf20Sopenharmony_ci#include "dce/dce_10_0_sh_mask.h"
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci#include "vid.h"
618c2ecf20Sopenharmony_ci#include "vi.h"
628c2ecf20Sopenharmony_ci#include "gmc_v8_0.h"
638c2ecf20Sopenharmony_ci#include "gmc_v7_0.h"
648c2ecf20Sopenharmony_ci#include "gfx_v8_0.h"
658c2ecf20Sopenharmony_ci#include "sdma_v2_4.h"
668c2ecf20Sopenharmony_ci#include "sdma_v3_0.h"
678c2ecf20Sopenharmony_ci#include "dce_v10_0.h"
688c2ecf20Sopenharmony_ci#include "dce_v11_0.h"
698c2ecf20Sopenharmony_ci#include "iceland_ih.h"
708c2ecf20Sopenharmony_ci#include "tonga_ih.h"
718c2ecf20Sopenharmony_ci#include "cz_ih.h"
728c2ecf20Sopenharmony_ci#include "uvd_v5_0.h"
738c2ecf20Sopenharmony_ci#include "uvd_v6_0.h"
748c2ecf20Sopenharmony_ci#include "vce_v3_0.h"
758c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_ACP)
768c2ecf20Sopenharmony_ci#include "amdgpu_acp.h"
778c2ecf20Sopenharmony_ci#endif
788c2ecf20Sopenharmony_ci#include "dce_virtual.h"
798c2ecf20Sopenharmony_ci#include "mxgpu_vi.h"
808c2ecf20Sopenharmony_ci#include "amdgpu_dm.h"
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci/*
838c2ecf20Sopenharmony_ci * Indirect registers accessor
848c2ecf20Sopenharmony_ci */
858c2ecf20Sopenharmony_cistatic u32 vi_pcie_rreg(struct amdgpu_device *adev, u32 reg)
868c2ecf20Sopenharmony_ci{
878c2ecf20Sopenharmony_ci	unsigned long flags;
888c2ecf20Sopenharmony_ci	u32 r;
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
918c2ecf20Sopenharmony_ci	WREG32_NO_KIQ(mmPCIE_INDEX, reg);
928c2ecf20Sopenharmony_ci	(void)RREG32_NO_KIQ(mmPCIE_INDEX);
938c2ecf20Sopenharmony_ci	r = RREG32_NO_KIQ(mmPCIE_DATA);
948c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
958c2ecf20Sopenharmony_ci	return r;
968c2ecf20Sopenharmony_ci}
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_cistatic void vi_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
998c2ecf20Sopenharmony_ci{
1008c2ecf20Sopenharmony_ci	unsigned long flags;
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1038c2ecf20Sopenharmony_ci	WREG32_NO_KIQ(mmPCIE_INDEX, reg);
1048c2ecf20Sopenharmony_ci	(void)RREG32_NO_KIQ(mmPCIE_INDEX);
1058c2ecf20Sopenharmony_ci	WREG32_NO_KIQ(mmPCIE_DATA, v);
1068c2ecf20Sopenharmony_ci	(void)RREG32_NO_KIQ(mmPCIE_DATA);
1078c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1088c2ecf20Sopenharmony_ci}
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_cistatic u32 vi_smc_rreg(struct amdgpu_device *adev, u32 reg)
1118c2ecf20Sopenharmony_ci{
1128c2ecf20Sopenharmony_ci	unsigned long flags;
1138c2ecf20Sopenharmony_ci	u32 r;
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ci	spin_lock_irqsave(&adev->smc_idx_lock, flags);
1168c2ecf20Sopenharmony_ci	WREG32_NO_KIQ(mmSMC_IND_INDEX_11, (reg));
1178c2ecf20Sopenharmony_ci	r = RREG32_NO_KIQ(mmSMC_IND_DATA_11);
1188c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
1198c2ecf20Sopenharmony_ci	return r;
1208c2ecf20Sopenharmony_ci}
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_cistatic void vi_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1238c2ecf20Sopenharmony_ci{
1248c2ecf20Sopenharmony_ci	unsigned long flags;
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ci	spin_lock_irqsave(&adev->smc_idx_lock, flags);
1278c2ecf20Sopenharmony_ci	WREG32_NO_KIQ(mmSMC_IND_INDEX_11, (reg));
1288c2ecf20Sopenharmony_ci	WREG32_NO_KIQ(mmSMC_IND_DATA_11, (v));
1298c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
1308c2ecf20Sopenharmony_ci}
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci/* smu_8_0_d.h */
1338c2ecf20Sopenharmony_ci#define mmMP0PUB_IND_INDEX                                                      0x180
1348c2ecf20Sopenharmony_ci#define mmMP0PUB_IND_DATA                                                       0x181
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_cistatic u32 cz_smc_rreg(struct amdgpu_device *adev, u32 reg)
1378c2ecf20Sopenharmony_ci{
1388c2ecf20Sopenharmony_ci	unsigned long flags;
1398c2ecf20Sopenharmony_ci	u32 r;
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_ci	spin_lock_irqsave(&adev->smc_idx_lock, flags);
1428c2ecf20Sopenharmony_ci	WREG32(mmMP0PUB_IND_INDEX, (reg));
1438c2ecf20Sopenharmony_ci	r = RREG32(mmMP0PUB_IND_DATA);
1448c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
1458c2ecf20Sopenharmony_ci	return r;
1468c2ecf20Sopenharmony_ci}
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_cistatic void cz_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1498c2ecf20Sopenharmony_ci{
1508c2ecf20Sopenharmony_ci	unsigned long flags;
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci	spin_lock_irqsave(&adev->smc_idx_lock, flags);
1538c2ecf20Sopenharmony_ci	WREG32(mmMP0PUB_IND_INDEX, (reg));
1548c2ecf20Sopenharmony_ci	WREG32(mmMP0PUB_IND_DATA, (v));
1558c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
1568c2ecf20Sopenharmony_ci}
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_cistatic u32 vi_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
1598c2ecf20Sopenharmony_ci{
1608c2ecf20Sopenharmony_ci	unsigned long flags;
1618c2ecf20Sopenharmony_ci	u32 r;
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
1648c2ecf20Sopenharmony_ci	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
1658c2ecf20Sopenharmony_ci	r = RREG32(mmUVD_CTX_DATA);
1668c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
1678c2ecf20Sopenharmony_ci	return r;
1688c2ecf20Sopenharmony_ci}
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_cistatic void vi_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1718c2ecf20Sopenharmony_ci{
1728c2ecf20Sopenharmony_ci	unsigned long flags;
1738c2ecf20Sopenharmony_ci
1748c2ecf20Sopenharmony_ci	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
1758c2ecf20Sopenharmony_ci	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
1768c2ecf20Sopenharmony_ci	WREG32(mmUVD_CTX_DATA, (v));
1778c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
1788c2ecf20Sopenharmony_ci}
1798c2ecf20Sopenharmony_ci
1808c2ecf20Sopenharmony_cistatic u32 vi_didt_rreg(struct amdgpu_device *adev, u32 reg)
1818c2ecf20Sopenharmony_ci{
1828c2ecf20Sopenharmony_ci	unsigned long flags;
1838c2ecf20Sopenharmony_ci	u32 r;
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_ci	spin_lock_irqsave(&adev->didt_idx_lock, flags);
1868c2ecf20Sopenharmony_ci	WREG32(mmDIDT_IND_INDEX, (reg));
1878c2ecf20Sopenharmony_ci	r = RREG32(mmDIDT_IND_DATA);
1888c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
1898c2ecf20Sopenharmony_ci	return r;
1908c2ecf20Sopenharmony_ci}
1918c2ecf20Sopenharmony_ci
1928c2ecf20Sopenharmony_cistatic void vi_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1938c2ecf20Sopenharmony_ci{
1948c2ecf20Sopenharmony_ci	unsigned long flags;
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_ci	spin_lock_irqsave(&adev->didt_idx_lock, flags);
1978c2ecf20Sopenharmony_ci	WREG32(mmDIDT_IND_INDEX, (reg));
1988c2ecf20Sopenharmony_ci	WREG32(mmDIDT_IND_DATA, (v));
1998c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
2008c2ecf20Sopenharmony_ci}
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_cistatic u32 vi_gc_cac_rreg(struct amdgpu_device *adev, u32 reg)
2038c2ecf20Sopenharmony_ci{
2048c2ecf20Sopenharmony_ci	unsigned long flags;
2058c2ecf20Sopenharmony_ci	u32 r;
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci	spin_lock_irqsave(&adev->gc_cac_idx_lock, flags);
2088c2ecf20Sopenharmony_ci	WREG32(mmGC_CAC_IND_INDEX, (reg));
2098c2ecf20Sopenharmony_ci	r = RREG32(mmGC_CAC_IND_DATA);
2108c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&adev->gc_cac_idx_lock, flags);
2118c2ecf20Sopenharmony_ci	return r;
2128c2ecf20Sopenharmony_ci}
2138c2ecf20Sopenharmony_ci
2148c2ecf20Sopenharmony_cistatic void vi_gc_cac_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
2158c2ecf20Sopenharmony_ci{
2168c2ecf20Sopenharmony_ci	unsigned long flags;
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ci	spin_lock_irqsave(&adev->gc_cac_idx_lock, flags);
2198c2ecf20Sopenharmony_ci	WREG32(mmGC_CAC_IND_INDEX, (reg));
2208c2ecf20Sopenharmony_ci	WREG32(mmGC_CAC_IND_DATA, (v));
2218c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&adev->gc_cac_idx_lock, flags);
2228c2ecf20Sopenharmony_ci}
2238c2ecf20Sopenharmony_ci
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_cistatic const u32 tonga_mgcg_cgcg_init[] =
2268c2ecf20Sopenharmony_ci{
2278c2ecf20Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100,
2288c2ecf20Sopenharmony_ci	mmPCIE_INDEX, 0xffffffff, 0x0140001c,
2298c2ecf20Sopenharmony_ci	mmPCIE_DATA, 0x000f0000, 0x00000000,
2308c2ecf20Sopenharmony_ci	mmSMC_IND_INDEX_4, 0xffffffff, 0xC060000C,
2318c2ecf20Sopenharmony_ci	mmSMC_IND_DATA_4, 0xc0000fff, 0x00000100,
2328c2ecf20Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
2338c2ecf20Sopenharmony_ci	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
2348c2ecf20Sopenharmony_ci};
2358c2ecf20Sopenharmony_ci
2368c2ecf20Sopenharmony_cistatic const u32 fiji_mgcg_cgcg_init[] =
2378c2ecf20Sopenharmony_ci{
2388c2ecf20Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100,
2398c2ecf20Sopenharmony_ci	mmPCIE_INDEX, 0xffffffff, 0x0140001c,
2408c2ecf20Sopenharmony_ci	mmPCIE_DATA, 0x000f0000, 0x00000000,
2418c2ecf20Sopenharmony_ci	mmSMC_IND_INDEX_4, 0xffffffff, 0xC060000C,
2428c2ecf20Sopenharmony_ci	mmSMC_IND_DATA_4, 0xc0000fff, 0x00000100,
2438c2ecf20Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
2448c2ecf20Sopenharmony_ci	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
2458c2ecf20Sopenharmony_ci};
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_cistatic const u32 iceland_mgcg_cgcg_init[] =
2488c2ecf20Sopenharmony_ci{
2498c2ecf20Sopenharmony_ci	mmPCIE_INDEX, 0xffffffff, ixPCIE_CNTL2,
2508c2ecf20Sopenharmony_ci	mmPCIE_DATA, 0x000f0000, 0x00000000,
2518c2ecf20Sopenharmony_ci	mmSMC_IND_INDEX_4, 0xffffffff, ixCGTT_ROM_CLK_CTRL0,
2528c2ecf20Sopenharmony_ci	mmSMC_IND_DATA_4, 0xc0000fff, 0x00000100,
2538c2ecf20Sopenharmony_ci	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
2548c2ecf20Sopenharmony_ci};
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_cistatic const u32 cz_mgcg_cgcg_init[] =
2578c2ecf20Sopenharmony_ci{
2588c2ecf20Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100,
2598c2ecf20Sopenharmony_ci	mmPCIE_INDEX, 0xffffffff, 0x0140001c,
2608c2ecf20Sopenharmony_ci	mmPCIE_DATA, 0x000f0000, 0x00000000,
2618c2ecf20Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
2628c2ecf20Sopenharmony_ci	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
2638c2ecf20Sopenharmony_ci};
2648c2ecf20Sopenharmony_ci
2658c2ecf20Sopenharmony_cistatic const u32 stoney_mgcg_cgcg_init[] =
2668c2ecf20Sopenharmony_ci{
2678c2ecf20Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00000100,
2688c2ecf20Sopenharmony_ci	mmHDP_XDP_CGTT_BLK_CTRL, 0xffffffff, 0x00000104,
2698c2ecf20Sopenharmony_ci	mmHDP_HOST_PATH_CNTL, 0xffffffff, 0x0f000027,
2708c2ecf20Sopenharmony_ci};
2718c2ecf20Sopenharmony_ci
2728c2ecf20Sopenharmony_cistatic void vi_init_golden_registers(struct amdgpu_device *adev)
2738c2ecf20Sopenharmony_ci{
2748c2ecf20Sopenharmony_ci	/* Some of the registers might be dependent on GRBM_GFX_INDEX */
2758c2ecf20Sopenharmony_ci	mutex_lock(&adev->grbm_idx_mutex);
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_ci	if (amdgpu_sriov_vf(adev)) {
2788c2ecf20Sopenharmony_ci		xgpu_vi_init_golden_registers(adev);
2798c2ecf20Sopenharmony_ci		mutex_unlock(&adev->grbm_idx_mutex);
2808c2ecf20Sopenharmony_ci		return;
2818c2ecf20Sopenharmony_ci	}
2828c2ecf20Sopenharmony_ci
2838c2ecf20Sopenharmony_ci	switch (adev->asic_type) {
2848c2ecf20Sopenharmony_ci	case CHIP_TOPAZ:
2858c2ecf20Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
2868c2ecf20Sopenharmony_ci							iceland_mgcg_cgcg_init,
2878c2ecf20Sopenharmony_ci							ARRAY_SIZE(iceland_mgcg_cgcg_init));
2888c2ecf20Sopenharmony_ci		break;
2898c2ecf20Sopenharmony_ci	case CHIP_FIJI:
2908c2ecf20Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
2918c2ecf20Sopenharmony_ci							fiji_mgcg_cgcg_init,
2928c2ecf20Sopenharmony_ci							ARRAY_SIZE(fiji_mgcg_cgcg_init));
2938c2ecf20Sopenharmony_ci		break;
2948c2ecf20Sopenharmony_ci	case CHIP_TONGA:
2958c2ecf20Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
2968c2ecf20Sopenharmony_ci							tonga_mgcg_cgcg_init,
2978c2ecf20Sopenharmony_ci							ARRAY_SIZE(tonga_mgcg_cgcg_init));
2988c2ecf20Sopenharmony_ci		break;
2998c2ecf20Sopenharmony_ci	case CHIP_CARRIZO:
3008c2ecf20Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
3018c2ecf20Sopenharmony_ci							cz_mgcg_cgcg_init,
3028c2ecf20Sopenharmony_ci							ARRAY_SIZE(cz_mgcg_cgcg_init));
3038c2ecf20Sopenharmony_ci		break;
3048c2ecf20Sopenharmony_ci	case CHIP_STONEY:
3058c2ecf20Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
3068c2ecf20Sopenharmony_ci							stoney_mgcg_cgcg_init,
3078c2ecf20Sopenharmony_ci							ARRAY_SIZE(stoney_mgcg_cgcg_init));
3088c2ecf20Sopenharmony_ci		break;
3098c2ecf20Sopenharmony_ci	case CHIP_POLARIS10:
3108c2ecf20Sopenharmony_ci	case CHIP_POLARIS11:
3118c2ecf20Sopenharmony_ci	case CHIP_POLARIS12:
3128c2ecf20Sopenharmony_ci	case CHIP_VEGAM:
3138c2ecf20Sopenharmony_ci	default:
3148c2ecf20Sopenharmony_ci		break;
3158c2ecf20Sopenharmony_ci	}
3168c2ecf20Sopenharmony_ci	mutex_unlock(&adev->grbm_idx_mutex);
3178c2ecf20Sopenharmony_ci}
3188c2ecf20Sopenharmony_ci
3198c2ecf20Sopenharmony_ci/**
3208c2ecf20Sopenharmony_ci * vi_get_xclk - get the xclk
3218c2ecf20Sopenharmony_ci *
3228c2ecf20Sopenharmony_ci * @adev: amdgpu_device pointer
3238c2ecf20Sopenharmony_ci *
3248c2ecf20Sopenharmony_ci * Returns the reference clock used by the gfx engine
3258c2ecf20Sopenharmony_ci * (VI).
3268c2ecf20Sopenharmony_ci */
3278c2ecf20Sopenharmony_cistatic u32 vi_get_xclk(struct amdgpu_device *adev)
3288c2ecf20Sopenharmony_ci{
3298c2ecf20Sopenharmony_ci	u32 reference_clock = adev->clock.spll.reference_freq;
3308c2ecf20Sopenharmony_ci	u32 tmp;
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_ci	if (adev->flags & AMD_IS_APU) {
3338c2ecf20Sopenharmony_ci		switch (adev->asic_type) {
3348c2ecf20Sopenharmony_ci		case CHIP_STONEY:
3358c2ecf20Sopenharmony_ci			/* vbios says 48Mhz, but the actual freq is 100Mhz */
3368c2ecf20Sopenharmony_ci			return 10000;
3378c2ecf20Sopenharmony_ci		default:
3388c2ecf20Sopenharmony_ci			return reference_clock;
3398c2ecf20Sopenharmony_ci		}
3408c2ecf20Sopenharmony_ci	}
3418c2ecf20Sopenharmony_ci
3428c2ecf20Sopenharmony_ci	tmp = RREG32_SMC(ixCG_CLKPIN_CNTL_2);
3438c2ecf20Sopenharmony_ci	if (REG_GET_FIELD(tmp, CG_CLKPIN_CNTL_2, MUX_TCLK_TO_XCLK))
3448c2ecf20Sopenharmony_ci		return 1000;
3458c2ecf20Sopenharmony_ci
3468c2ecf20Sopenharmony_ci	tmp = RREG32_SMC(ixCG_CLKPIN_CNTL);
3478c2ecf20Sopenharmony_ci	if (REG_GET_FIELD(tmp, CG_CLKPIN_CNTL, XTALIN_DIVIDE))
3488c2ecf20Sopenharmony_ci		return reference_clock / 4;
3498c2ecf20Sopenharmony_ci
3508c2ecf20Sopenharmony_ci	return reference_clock;
3518c2ecf20Sopenharmony_ci}
3528c2ecf20Sopenharmony_ci
3538c2ecf20Sopenharmony_ci/**
3548c2ecf20Sopenharmony_ci * vi_srbm_select - select specific register instances
3558c2ecf20Sopenharmony_ci *
3568c2ecf20Sopenharmony_ci * @adev: amdgpu_device pointer
3578c2ecf20Sopenharmony_ci * @me: selected ME (micro engine)
3588c2ecf20Sopenharmony_ci * @pipe: pipe
3598c2ecf20Sopenharmony_ci * @queue: queue
3608c2ecf20Sopenharmony_ci * @vmid: VMID
3618c2ecf20Sopenharmony_ci *
3628c2ecf20Sopenharmony_ci * Switches the currently active registers instances.  Some
3638c2ecf20Sopenharmony_ci * registers are instanced per VMID, others are instanced per
3648c2ecf20Sopenharmony_ci * me/pipe/queue combination.
3658c2ecf20Sopenharmony_ci */
3668c2ecf20Sopenharmony_civoid vi_srbm_select(struct amdgpu_device *adev,
3678c2ecf20Sopenharmony_ci		     u32 me, u32 pipe, u32 queue, u32 vmid)
3688c2ecf20Sopenharmony_ci{
3698c2ecf20Sopenharmony_ci	u32 srbm_gfx_cntl = 0;
3708c2ecf20Sopenharmony_ci	srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, PIPEID, pipe);
3718c2ecf20Sopenharmony_ci	srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, MEID, me);
3728c2ecf20Sopenharmony_ci	srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, VMID, vmid);
3738c2ecf20Sopenharmony_ci	srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, QUEUEID, queue);
3748c2ecf20Sopenharmony_ci	WREG32(mmSRBM_GFX_CNTL, srbm_gfx_cntl);
3758c2ecf20Sopenharmony_ci}
3768c2ecf20Sopenharmony_ci
3778c2ecf20Sopenharmony_cistatic void vi_vga_set_state(struct amdgpu_device *adev, bool state)
3788c2ecf20Sopenharmony_ci{
3798c2ecf20Sopenharmony_ci	/* todo */
3808c2ecf20Sopenharmony_ci}
3818c2ecf20Sopenharmony_ci
3828c2ecf20Sopenharmony_cistatic bool vi_read_disabled_bios(struct amdgpu_device *adev)
3838c2ecf20Sopenharmony_ci{
3848c2ecf20Sopenharmony_ci	u32 bus_cntl;
3858c2ecf20Sopenharmony_ci	u32 d1vga_control = 0;
3868c2ecf20Sopenharmony_ci	u32 d2vga_control = 0;
3878c2ecf20Sopenharmony_ci	u32 vga_render_control = 0;
3888c2ecf20Sopenharmony_ci	u32 rom_cntl;
3898c2ecf20Sopenharmony_ci	bool r;
3908c2ecf20Sopenharmony_ci
3918c2ecf20Sopenharmony_ci	bus_cntl = RREG32(mmBUS_CNTL);
3928c2ecf20Sopenharmony_ci	if (adev->mode_info.num_crtc) {
3938c2ecf20Sopenharmony_ci		d1vga_control = RREG32(mmD1VGA_CONTROL);
3948c2ecf20Sopenharmony_ci		d2vga_control = RREG32(mmD2VGA_CONTROL);
3958c2ecf20Sopenharmony_ci		vga_render_control = RREG32(mmVGA_RENDER_CONTROL);
3968c2ecf20Sopenharmony_ci	}
3978c2ecf20Sopenharmony_ci	rom_cntl = RREG32_SMC(ixROM_CNTL);
3988c2ecf20Sopenharmony_ci
3998c2ecf20Sopenharmony_ci	/* enable the rom */
4008c2ecf20Sopenharmony_ci	WREG32(mmBUS_CNTL, (bus_cntl & ~BUS_CNTL__BIOS_ROM_DIS_MASK));
4018c2ecf20Sopenharmony_ci	if (adev->mode_info.num_crtc) {
4028c2ecf20Sopenharmony_ci		/* Disable VGA mode */
4038c2ecf20Sopenharmony_ci		WREG32(mmD1VGA_CONTROL,
4048c2ecf20Sopenharmony_ci		       (d1vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
4058c2ecf20Sopenharmony_ci					  D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
4068c2ecf20Sopenharmony_ci		WREG32(mmD2VGA_CONTROL,
4078c2ecf20Sopenharmony_ci		       (d2vga_control & ~(D2VGA_CONTROL__D2VGA_MODE_ENABLE_MASK |
4088c2ecf20Sopenharmony_ci					  D2VGA_CONTROL__D2VGA_TIMING_SELECT_MASK)));
4098c2ecf20Sopenharmony_ci		WREG32(mmVGA_RENDER_CONTROL,
4108c2ecf20Sopenharmony_ci		       (vga_render_control & ~VGA_RENDER_CONTROL__VGA_VSTATUS_CNTL_MASK));
4118c2ecf20Sopenharmony_ci	}
4128c2ecf20Sopenharmony_ci	WREG32_SMC(ixROM_CNTL, rom_cntl | ROM_CNTL__SCK_OVERWRITE_MASK);
4138c2ecf20Sopenharmony_ci
4148c2ecf20Sopenharmony_ci	r = amdgpu_read_bios(adev);
4158c2ecf20Sopenharmony_ci
4168c2ecf20Sopenharmony_ci	/* restore regs */
4178c2ecf20Sopenharmony_ci	WREG32(mmBUS_CNTL, bus_cntl);
4188c2ecf20Sopenharmony_ci	if (adev->mode_info.num_crtc) {
4198c2ecf20Sopenharmony_ci		WREG32(mmD1VGA_CONTROL, d1vga_control);
4208c2ecf20Sopenharmony_ci		WREG32(mmD2VGA_CONTROL, d2vga_control);
4218c2ecf20Sopenharmony_ci		WREG32(mmVGA_RENDER_CONTROL, vga_render_control);
4228c2ecf20Sopenharmony_ci	}
4238c2ecf20Sopenharmony_ci	WREG32_SMC(ixROM_CNTL, rom_cntl);
4248c2ecf20Sopenharmony_ci	return r;
4258c2ecf20Sopenharmony_ci}
4268c2ecf20Sopenharmony_ci
4278c2ecf20Sopenharmony_cistatic bool vi_read_bios_from_rom(struct amdgpu_device *adev,
4288c2ecf20Sopenharmony_ci				  u8 *bios, u32 length_bytes)
4298c2ecf20Sopenharmony_ci{
4308c2ecf20Sopenharmony_ci	u32 *dw_ptr;
4318c2ecf20Sopenharmony_ci	unsigned long flags;
4328c2ecf20Sopenharmony_ci	u32 i, length_dw;
4338c2ecf20Sopenharmony_ci
4348c2ecf20Sopenharmony_ci	if (bios == NULL)
4358c2ecf20Sopenharmony_ci		return false;
4368c2ecf20Sopenharmony_ci	if (length_bytes == 0)
4378c2ecf20Sopenharmony_ci		return false;
4388c2ecf20Sopenharmony_ci	/* APU vbios image is part of sbios image */
4398c2ecf20Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
4408c2ecf20Sopenharmony_ci		return false;
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ci	dw_ptr = (u32 *)bios;
4438c2ecf20Sopenharmony_ci	length_dw = ALIGN(length_bytes, 4) / 4;
4448c2ecf20Sopenharmony_ci	/* take the smc lock since we are using the smc index */
4458c2ecf20Sopenharmony_ci	spin_lock_irqsave(&adev->smc_idx_lock, flags);
4468c2ecf20Sopenharmony_ci	/* set rom index to 0 */
4478c2ecf20Sopenharmony_ci	WREG32(mmSMC_IND_INDEX_11, ixROM_INDEX);
4488c2ecf20Sopenharmony_ci	WREG32(mmSMC_IND_DATA_11, 0);
4498c2ecf20Sopenharmony_ci	/* set index to data for continous read */
4508c2ecf20Sopenharmony_ci	WREG32(mmSMC_IND_INDEX_11, ixROM_DATA);
4518c2ecf20Sopenharmony_ci	for (i = 0; i < length_dw; i++)
4528c2ecf20Sopenharmony_ci		dw_ptr[i] = RREG32(mmSMC_IND_DATA_11);
4538c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
4548c2ecf20Sopenharmony_ci
4558c2ecf20Sopenharmony_ci	return true;
4568c2ecf20Sopenharmony_ci}
4578c2ecf20Sopenharmony_ci
4588c2ecf20Sopenharmony_cistatic const struct amdgpu_allowed_register_entry vi_allowed_read_registers[] = {
4598c2ecf20Sopenharmony_ci	{mmGRBM_STATUS},
4608c2ecf20Sopenharmony_ci	{mmGRBM_STATUS2},
4618c2ecf20Sopenharmony_ci	{mmGRBM_STATUS_SE0},
4628c2ecf20Sopenharmony_ci	{mmGRBM_STATUS_SE1},
4638c2ecf20Sopenharmony_ci	{mmGRBM_STATUS_SE2},
4648c2ecf20Sopenharmony_ci	{mmGRBM_STATUS_SE3},
4658c2ecf20Sopenharmony_ci	{mmSRBM_STATUS},
4668c2ecf20Sopenharmony_ci	{mmSRBM_STATUS2},
4678c2ecf20Sopenharmony_ci	{mmSRBM_STATUS3},
4688c2ecf20Sopenharmony_ci	{mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET},
4698c2ecf20Sopenharmony_ci	{mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET},
4708c2ecf20Sopenharmony_ci	{mmCP_STAT},
4718c2ecf20Sopenharmony_ci	{mmCP_STALLED_STAT1},
4728c2ecf20Sopenharmony_ci	{mmCP_STALLED_STAT2},
4738c2ecf20Sopenharmony_ci	{mmCP_STALLED_STAT3},
4748c2ecf20Sopenharmony_ci	{mmCP_CPF_BUSY_STAT},
4758c2ecf20Sopenharmony_ci	{mmCP_CPF_STALLED_STAT1},
4768c2ecf20Sopenharmony_ci	{mmCP_CPF_STATUS},
4778c2ecf20Sopenharmony_ci	{mmCP_CPC_BUSY_STAT},
4788c2ecf20Sopenharmony_ci	{mmCP_CPC_STALLED_STAT1},
4798c2ecf20Sopenharmony_ci	{mmCP_CPC_STATUS},
4808c2ecf20Sopenharmony_ci	{mmGB_ADDR_CONFIG},
4818c2ecf20Sopenharmony_ci	{mmMC_ARB_RAMCFG},
4828c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE0},
4838c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE1},
4848c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE2},
4858c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE3},
4868c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE4},
4878c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE5},
4888c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE6},
4898c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE7},
4908c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE8},
4918c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE9},
4928c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE10},
4938c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE11},
4948c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE12},
4958c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE13},
4968c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE14},
4978c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE15},
4988c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE16},
4998c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE17},
5008c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE18},
5018c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE19},
5028c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE20},
5038c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE21},
5048c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE22},
5058c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE23},
5068c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE24},
5078c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE25},
5088c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE26},
5098c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE27},
5108c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE28},
5118c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE29},
5128c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE30},
5138c2ecf20Sopenharmony_ci	{mmGB_TILE_MODE31},
5148c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE0},
5158c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE1},
5168c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE2},
5178c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE3},
5188c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE4},
5198c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE5},
5208c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE6},
5218c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE7},
5228c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE8},
5238c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE9},
5248c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE10},
5258c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE11},
5268c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE12},
5278c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE13},
5288c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE14},
5298c2ecf20Sopenharmony_ci	{mmGB_MACROTILE_MODE15},
5308c2ecf20Sopenharmony_ci	{mmCC_RB_BACKEND_DISABLE, true},
5318c2ecf20Sopenharmony_ci	{mmGC_USER_RB_BACKEND_DISABLE, true},
5328c2ecf20Sopenharmony_ci	{mmGB_BACKEND_MAP, false},
5338c2ecf20Sopenharmony_ci	{mmPA_SC_RASTER_CONFIG, true},
5348c2ecf20Sopenharmony_ci	{mmPA_SC_RASTER_CONFIG_1, true},
5358c2ecf20Sopenharmony_ci};
5368c2ecf20Sopenharmony_ci
5378c2ecf20Sopenharmony_cistatic uint32_t vi_get_register_value(struct amdgpu_device *adev,
5388c2ecf20Sopenharmony_ci				      bool indexed, u32 se_num,
5398c2ecf20Sopenharmony_ci				      u32 sh_num, u32 reg_offset)
5408c2ecf20Sopenharmony_ci{
5418c2ecf20Sopenharmony_ci	if (indexed) {
5428c2ecf20Sopenharmony_ci		uint32_t val;
5438c2ecf20Sopenharmony_ci		unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
5448c2ecf20Sopenharmony_ci		unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
5458c2ecf20Sopenharmony_ci
5468c2ecf20Sopenharmony_ci		switch (reg_offset) {
5478c2ecf20Sopenharmony_ci		case mmCC_RB_BACKEND_DISABLE:
5488c2ecf20Sopenharmony_ci			return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
5498c2ecf20Sopenharmony_ci		case mmGC_USER_RB_BACKEND_DISABLE:
5508c2ecf20Sopenharmony_ci			return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
5518c2ecf20Sopenharmony_ci		case mmPA_SC_RASTER_CONFIG:
5528c2ecf20Sopenharmony_ci			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
5538c2ecf20Sopenharmony_ci		case mmPA_SC_RASTER_CONFIG_1:
5548c2ecf20Sopenharmony_ci			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config_1;
5558c2ecf20Sopenharmony_ci		}
5568c2ecf20Sopenharmony_ci
5578c2ecf20Sopenharmony_ci		mutex_lock(&adev->grbm_idx_mutex);
5588c2ecf20Sopenharmony_ci		if (se_num != 0xffffffff || sh_num != 0xffffffff)
5598c2ecf20Sopenharmony_ci			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
5608c2ecf20Sopenharmony_ci
5618c2ecf20Sopenharmony_ci		val = RREG32(reg_offset);
5628c2ecf20Sopenharmony_ci
5638c2ecf20Sopenharmony_ci		if (se_num != 0xffffffff || sh_num != 0xffffffff)
5648c2ecf20Sopenharmony_ci			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
5658c2ecf20Sopenharmony_ci		mutex_unlock(&adev->grbm_idx_mutex);
5668c2ecf20Sopenharmony_ci		return val;
5678c2ecf20Sopenharmony_ci	} else {
5688c2ecf20Sopenharmony_ci		unsigned idx;
5698c2ecf20Sopenharmony_ci
5708c2ecf20Sopenharmony_ci		switch (reg_offset) {
5718c2ecf20Sopenharmony_ci		case mmGB_ADDR_CONFIG:
5728c2ecf20Sopenharmony_ci			return adev->gfx.config.gb_addr_config;
5738c2ecf20Sopenharmony_ci		case mmMC_ARB_RAMCFG:
5748c2ecf20Sopenharmony_ci			return adev->gfx.config.mc_arb_ramcfg;
5758c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE0:
5768c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE1:
5778c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE2:
5788c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE3:
5798c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE4:
5808c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE5:
5818c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE6:
5828c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE7:
5838c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE8:
5848c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE9:
5858c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE10:
5868c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE11:
5878c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE12:
5888c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE13:
5898c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE14:
5908c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE15:
5918c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE16:
5928c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE17:
5938c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE18:
5948c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE19:
5958c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE20:
5968c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE21:
5978c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE22:
5988c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE23:
5998c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE24:
6008c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE25:
6018c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE26:
6028c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE27:
6038c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE28:
6048c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE29:
6058c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE30:
6068c2ecf20Sopenharmony_ci		case mmGB_TILE_MODE31:
6078c2ecf20Sopenharmony_ci			idx = (reg_offset - mmGB_TILE_MODE0);
6088c2ecf20Sopenharmony_ci			return adev->gfx.config.tile_mode_array[idx];
6098c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE0:
6108c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE1:
6118c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE2:
6128c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE3:
6138c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE4:
6148c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE5:
6158c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE6:
6168c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE7:
6178c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE8:
6188c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE9:
6198c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE10:
6208c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE11:
6218c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE12:
6228c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE13:
6238c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE14:
6248c2ecf20Sopenharmony_ci		case mmGB_MACROTILE_MODE15:
6258c2ecf20Sopenharmony_ci			idx = (reg_offset - mmGB_MACROTILE_MODE0);
6268c2ecf20Sopenharmony_ci			return adev->gfx.config.macrotile_mode_array[idx];
6278c2ecf20Sopenharmony_ci		default:
6288c2ecf20Sopenharmony_ci			return RREG32(reg_offset);
6298c2ecf20Sopenharmony_ci		}
6308c2ecf20Sopenharmony_ci	}
6318c2ecf20Sopenharmony_ci}
6328c2ecf20Sopenharmony_ci
6338c2ecf20Sopenharmony_cistatic int vi_read_register(struct amdgpu_device *adev, u32 se_num,
6348c2ecf20Sopenharmony_ci			    u32 sh_num, u32 reg_offset, u32 *value)
6358c2ecf20Sopenharmony_ci{
6368c2ecf20Sopenharmony_ci	uint32_t i;
6378c2ecf20Sopenharmony_ci
6388c2ecf20Sopenharmony_ci	*value = 0;
6398c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(vi_allowed_read_registers); i++) {
6408c2ecf20Sopenharmony_ci		bool indexed = vi_allowed_read_registers[i].grbm_indexed;
6418c2ecf20Sopenharmony_ci
6428c2ecf20Sopenharmony_ci		if (reg_offset != vi_allowed_read_registers[i].reg_offset)
6438c2ecf20Sopenharmony_ci			continue;
6448c2ecf20Sopenharmony_ci
6458c2ecf20Sopenharmony_ci		*value = vi_get_register_value(adev, indexed, se_num, sh_num,
6468c2ecf20Sopenharmony_ci					       reg_offset);
6478c2ecf20Sopenharmony_ci		return 0;
6488c2ecf20Sopenharmony_ci	}
6498c2ecf20Sopenharmony_ci	return -EINVAL;
6508c2ecf20Sopenharmony_ci}
6518c2ecf20Sopenharmony_ci
6528c2ecf20Sopenharmony_cistatic int vi_gpu_pci_config_reset(struct amdgpu_device *adev)
6538c2ecf20Sopenharmony_ci{
6548c2ecf20Sopenharmony_ci	u32 i;
6558c2ecf20Sopenharmony_ci
6568c2ecf20Sopenharmony_ci	dev_info(adev->dev, "GPU pci config reset\n");
6578c2ecf20Sopenharmony_ci
6588c2ecf20Sopenharmony_ci	/* disable BM */
6598c2ecf20Sopenharmony_ci	pci_clear_master(adev->pdev);
6608c2ecf20Sopenharmony_ci	/* reset */
6618c2ecf20Sopenharmony_ci	amdgpu_device_pci_config_reset(adev);
6628c2ecf20Sopenharmony_ci
6638c2ecf20Sopenharmony_ci	udelay(100);
6648c2ecf20Sopenharmony_ci
6658c2ecf20Sopenharmony_ci	/* wait for asic to come out of reset */
6668c2ecf20Sopenharmony_ci	for (i = 0; i < adev->usec_timeout; i++) {
6678c2ecf20Sopenharmony_ci		if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
6688c2ecf20Sopenharmony_ci			/* enable BM */
6698c2ecf20Sopenharmony_ci			pci_set_master(adev->pdev);
6708c2ecf20Sopenharmony_ci			adev->has_hw_reset = true;
6718c2ecf20Sopenharmony_ci			return 0;
6728c2ecf20Sopenharmony_ci		}
6738c2ecf20Sopenharmony_ci		udelay(1);
6748c2ecf20Sopenharmony_ci	}
6758c2ecf20Sopenharmony_ci	return -EINVAL;
6768c2ecf20Sopenharmony_ci}
6778c2ecf20Sopenharmony_ci
6788c2ecf20Sopenharmony_ci/**
6798c2ecf20Sopenharmony_ci * vi_asic_pci_config_reset - soft reset GPU
6808c2ecf20Sopenharmony_ci *
6818c2ecf20Sopenharmony_ci * @adev: amdgpu_device pointer
6828c2ecf20Sopenharmony_ci *
6838c2ecf20Sopenharmony_ci * Use PCI Config method to reset the GPU.
6848c2ecf20Sopenharmony_ci *
6858c2ecf20Sopenharmony_ci * Returns 0 for success.
6868c2ecf20Sopenharmony_ci */
6878c2ecf20Sopenharmony_cistatic int vi_asic_pci_config_reset(struct amdgpu_device *adev)
6888c2ecf20Sopenharmony_ci{
6898c2ecf20Sopenharmony_ci	int r;
6908c2ecf20Sopenharmony_ci
6918c2ecf20Sopenharmony_ci	amdgpu_atombios_scratch_regs_engine_hung(adev, true);
6928c2ecf20Sopenharmony_ci
6938c2ecf20Sopenharmony_ci	r = vi_gpu_pci_config_reset(adev);
6948c2ecf20Sopenharmony_ci
6958c2ecf20Sopenharmony_ci	amdgpu_atombios_scratch_regs_engine_hung(adev, false);
6968c2ecf20Sopenharmony_ci
6978c2ecf20Sopenharmony_ci	return r;
6988c2ecf20Sopenharmony_ci}
6998c2ecf20Sopenharmony_ci
7008c2ecf20Sopenharmony_cistatic bool vi_asic_supports_baco(struct amdgpu_device *adev)
7018c2ecf20Sopenharmony_ci{
7028c2ecf20Sopenharmony_ci	switch (adev->asic_type) {
7038c2ecf20Sopenharmony_ci	case CHIP_FIJI:
7048c2ecf20Sopenharmony_ci	case CHIP_TONGA:
7058c2ecf20Sopenharmony_ci	case CHIP_POLARIS10:
7068c2ecf20Sopenharmony_ci	case CHIP_POLARIS11:
7078c2ecf20Sopenharmony_ci	case CHIP_POLARIS12:
7088c2ecf20Sopenharmony_ci	case CHIP_TOPAZ:
7098c2ecf20Sopenharmony_ci		return amdgpu_dpm_is_baco_supported(adev);
7108c2ecf20Sopenharmony_ci	default:
7118c2ecf20Sopenharmony_ci		return false;
7128c2ecf20Sopenharmony_ci	}
7138c2ecf20Sopenharmony_ci}
7148c2ecf20Sopenharmony_ci
7158c2ecf20Sopenharmony_cistatic enum amd_reset_method
7168c2ecf20Sopenharmony_civi_asic_reset_method(struct amdgpu_device *adev)
7178c2ecf20Sopenharmony_ci{
7188c2ecf20Sopenharmony_ci	bool baco_reset;
7198c2ecf20Sopenharmony_ci
7208c2ecf20Sopenharmony_ci	if (amdgpu_reset_method == AMD_RESET_METHOD_LEGACY ||
7218c2ecf20Sopenharmony_ci	    amdgpu_reset_method == AMD_RESET_METHOD_BACO)
7228c2ecf20Sopenharmony_ci		return amdgpu_reset_method;
7238c2ecf20Sopenharmony_ci
7248c2ecf20Sopenharmony_ci	if (amdgpu_reset_method != -1)
7258c2ecf20Sopenharmony_ci		dev_warn(adev->dev, "Specified reset method:%d isn't supported, using AUTO instead.\n",
7268c2ecf20Sopenharmony_ci				  amdgpu_reset_method);
7278c2ecf20Sopenharmony_ci
7288c2ecf20Sopenharmony_ci	switch (adev->asic_type) {
7298c2ecf20Sopenharmony_ci	case CHIP_FIJI:
7308c2ecf20Sopenharmony_ci	case CHIP_TONGA:
7318c2ecf20Sopenharmony_ci	case CHIP_POLARIS10:
7328c2ecf20Sopenharmony_ci	case CHIP_POLARIS11:
7338c2ecf20Sopenharmony_ci	case CHIP_POLARIS12:
7348c2ecf20Sopenharmony_ci	case CHIP_TOPAZ:
7358c2ecf20Sopenharmony_ci		baco_reset = amdgpu_dpm_is_baco_supported(adev);
7368c2ecf20Sopenharmony_ci		break;
7378c2ecf20Sopenharmony_ci	default:
7388c2ecf20Sopenharmony_ci		baco_reset = false;
7398c2ecf20Sopenharmony_ci		break;
7408c2ecf20Sopenharmony_ci	}
7418c2ecf20Sopenharmony_ci
7428c2ecf20Sopenharmony_ci	if (baco_reset)
7438c2ecf20Sopenharmony_ci		return AMD_RESET_METHOD_BACO;
7448c2ecf20Sopenharmony_ci	else
7458c2ecf20Sopenharmony_ci		return AMD_RESET_METHOD_LEGACY;
7468c2ecf20Sopenharmony_ci}
7478c2ecf20Sopenharmony_ci
7488c2ecf20Sopenharmony_ci/**
7498c2ecf20Sopenharmony_ci * vi_asic_reset - soft reset GPU
7508c2ecf20Sopenharmony_ci *
7518c2ecf20Sopenharmony_ci * @adev: amdgpu_device pointer
7528c2ecf20Sopenharmony_ci *
7538c2ecf20Sopenharmony_ci * Look up which blocks are hung and attempt
7548c2ecf20Sopenharmony_ci * to reset them.
7558c2ecf20Sopenharmony_ci * Returns 0 for success.
7568c2ecf20Sopenharmony_ci */
7578c2ecf20Sopenharmony_cistatic int vi_asic_reset(struct amdgpu_device *adev)
7588c2ecf20Sopenharmony_ci{
7598c2ecf20Sopenharmony_ci	int r;
7608c2ecf20Sopenharmony_ci
7618c2ecf20Sopenharmony_ci	if (vi_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {
7628c2ecf20Sopenharmony_ci		dev_info(adev->dev, "BACO reset\n");
7638c2ecf20Sopenharmony_ci		r = amdgpu_dpm_baco_reset(adev);
7648c2ecf20Sopenharmony_ci	} else {
7658c2ecf20Sopenharmony_ci		dev_info(adev->dev, "PCI CONFIG reset\n");
7668c2ecf20Sopenharmony_ci		r = vi_asic_pci_config_reset(adev);
7678c2ecf20Sopenharmony_ci	}
7688c2ecf20Sopenharmony_ci
7698c2ecf20Sopenharmony_ci	return r;
7708c2ecf20Sopenharmony_ci}
7718c2ecf20Sopenharmony_ci
7728c2ecf20Sopenharmony_cistatic u32 vi_get_config_memsize(struct amdgpu_device *adev)
7738c2ecf20Sopenharmony_ci{
7748c2ecf20Sopenharmony_ci	return RREG32(mmCONFIG_MEMSIZE);
7758c2ecf20Sopenharmony_ci}
7768c2ecf20Sopenharmony_ci
7778c2ecf20Sopenharmony_cistatic int vi_set_uvd_clock(struct amdgpu_device *adev, u32 clock,
7788c2ecf20Sopenharmony_ci			u32 cntl_reg, u32 status_reg)
7798c2ecf20Sopenharmony_ci{
7808c2ecf20Sopenharmony_ci	int r, i;
7818c2ecf20Sopenharmony_ci	struct atom_clock_dividers dividers;
7828c2ecf20Sopenharmony_ci	uint32_t tmp;
7838c2ecf20Sopenharmony_ci
7848c2ecf20Sopenharmony_ci	r = amdgpu_atombios_get_clock_dividers(adev,
7858c2ecf20Sopenharmony_ci					       COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
7868c2ecf20Sopenharmony_ci					       clock, false, &dividers);
7878c2ecf20Sopenharmony_ci	if (r)
7888c2ecf20Sopenharmony_ci		return r;
7898c2ecf20Sopenharmony_ci
7908c2ecf20Sopenharmony_ci	tmp = RREG32_SMC(cntl_reg);
7918c2ecf20Sopenharmony_ci
7928c2ecf20Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
7938c2ecf20Sopenharmony_ci		tmp &= ~CG_DCLK_CNTL__DCLK_DIVIDER_MASK;
7948c2ecf20Sopenharmony_ci	else
7958c2ecf20Sopenharmony_ci		tmp &= ~(CG_DCLK_CNTL__DCLK_DIR_CNTL_EN_MASK |
7968c2ecf20Sopenharmony_ci				CG_DCLK_CNTL__DCLK_DIVIDER_MASK);
7978c2ecf20Sopenharmony_ci	tmp |= dividers.post_divider;
7988c2ecf20Sopenharmony_ci	WREG32_SMC(cntl_reg, tmp);
7998c2ecf20Sopenharmony_ci
8008c2ecf20Sopenharmony_ci	for (i = 0; i < 100; i++) {
8018c2ecf20Sopenharmony_ci		tmp = RREG32_SMC(status_reg);
8028c2ecf20Sopenharmony_ci		if (adev->flags & AMD_IS_APU) {
8038c2ecf20Sopenharmony_ci			if (tmp & 0x10000)
8048c2ecf20Sopenharmony_ci				break;
8058c2ecf20Sopenharmony_ci		} else {
8068c2ecf20Sopenharmony_ci			if (tmp & CG_DCLK_STATUS__DCLK_STATUS_MASK)
8078c2ecf20Sopenharmony_ci				break;
8088c2ecf20Sopenharmony_ci		}
8098c2ecf20Sopenharmony_ci		mdelay(10);
8108c2ecf20Sopenharmony_ci	}
8118c2ecf20Sopenharmony_ci	if (i == 100)
8128c2ecf20Sopenharmony_ci		return -ETIMEDOUT;
8138c2ecf20Sopenharmony_ci	return 0;
8148c2ecf20Sopenharmony_ci}
8158c2ecf20Sopenharmony_ci
8168c2ecf20Sopenharmony_ci#define ixGNB_CLK1_DFS_CNTL 0xD82200F0
8178c2ecf20Sopenharmony_ci#define ixGNB_CLK1_STATUS   0xD822010C
8188c2ecf20Sopenharmony_ci#define ixGNB_CLK2_DFS_CNTL 0xD8220110
8198c2ecf20Sopenharmony_ci#define ixGNB_CLK2_STATUS   0xD822012C
8208c2ecf20Sopenharmony_ci#define ixGNB_CLK3_DFS_CNTL 0xD8220130
8218c2ecf20Sopenharmony_ci#define ixGNB_CLK3_STATUS   0xD822014C
8228c2ecf20Sopenharmony_ci
8238c2ecf20Sopenharmony_cistatic int vi_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
8248c2ecf20Sopenharmony_ci{
8258c2ecf20Sopenharmony_ci	int r;
8268c2ecf20Sopenharmony_ci
8278c2ecf20Sopenharmony_ci	if (adev->flags & AMD_IS_APU) {
8288c2ecf20Sopenharmony_ci		r = vi_set_uvd_clock(adev, vclk, ixGNB_CLK2_DFS_CNTL, ixGNB_CLK2_STATUS);
8298c2ecf20Sopenharmony_ci		if (r)
8308c2ecf20Sopenharmony_ci			return r;
8318c2ecf20Sopenharmony_ci
8328c2ecf20Sopenharmony_ci		r = vi_set_uvd_clock(adev, dclk, ixGNB_CLK1_DFS_CNTL, ixGNB_CLK1_STATUS);
8338c2ecf20Sopenharmony_ci		if (r)
8348c2ecf20Sopenharmony_ci			return r;
8358c2ecf20Sopenharmony_ci	} else {
8368c2ecf20Sopenharmony_ci		r = vi_set_uvd_clock(adev, vclk, ixCG_VCLK_CNTL, ixCG_VCLK_STATUS);
8378c2ecf20Sopenharmony_ci		if (r)
8388c2ecf20Sopenharmony_ci			return r;
8398c2ecf20Sopenharmony_ci
8408c2ecf20Sopenharmony_ci		r = vi_set_uvd_clock(adev, dclk, ixCG_DCLK_CNTL, ixCG_DCLK_STATUS);
8418c2ecf20Sopenharmony_ci		if (r)
8428c2ecf20Sopenharmony_ci			return r;
8438c2ecf20Sopenharmony_ci	}
8448c2ecf20Sopenharmony_ci
8458c2ecf20Sopenharmony_ci	return 0;
8468c2ecf20Sopenharmony_ci}
8478c2ecf20Sopenharmony_ci
8488c2ecf20Sopenharmony_cistatic int vi_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
8498c2ecf20Sopenharmony_ci{
8508c2ecf20Sopenharmony_ci	int r, i;
8518c2ecf20Sopenharmony_ci	struct atom_clock_dividers dividers;
8528c2ecf20Sopenharmony_ci	u32 tmp;
8538c2ecf20Sopenharmony_ci	u32 reg_ctrl;
8548c2ecf20Sopenharmony_ci	u32 reg_status;
8558c2ecf20Sopenharmony_ci	u32 status_mask;
8568c2ecf20Sopenharmony_ci	u32 reg_mask;
8578c2ecf20Sopenharmony_ci
8588c2ecf20Sopenharmony_ci	if (adev->flags & AMD_IS_APU) {
8598c2ecf20Sopenharmony_ci		reg_ctrl = ixGNB_CLK3_DFS_CNTL;
8608c2ecf20Sopenharmony_ci		reg_status = ixGNB_CLK3_STATUS;
8618c2ecf20Sopenharmony_ci		status_mask = 0x00010000;
8628c2ecf20Sopenharmony_ci		reg_mask = CG_ECLK_CNTL__ECLK_DIVIDER_MASK;
8638c2ecf20Sopenharmony_ci	} else {
8648c2ecf20Sopenharmony_ci		reg_ctrl = ixCG_ECLK_CNTL;
8658c2ecf20Sopenharmony_ci		reg_status = ixCG_ECLK_STATUS;
8668c2ecf20Sopenharmony_ci		status_mask = CG_ECLK_STATUS__ECLK_STATUS_MASK;
8678c2ecf20Sopenharmony_ci		reg_mask = CG_ECLK_CNTL__ECLK_DIR_CNTL_EN_MASK | CG_ECLK_CNTL__ECLK_DIVIDER_MASK;
8688c2ecf20Sopenharmony_ci	}
8698c2ecf20Sopenharmony_ci
8708c2ecf20Sopenharmony_ci	r = amdgpu_atombios_get_clock_dividers(adev,
8718c2ecf20Sopenharmony_ci					       COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
8728c2ecf20Sopenharmony_ci					       ecclk, false, &dividers);
8738c2ecf20Sopenharmony_ci	if (r)
8748c2ecf20Sopenharmony_ci		return r;
8758c2ecf20Sopenharmony_ci
8768c2ecf20Sopenharmony_ci	for (i = 0; i < 100; i++) {
8778c2ecf20Sopenharmony_ci		if (RREG32_SMC(reg_status) & status_mask)
8788c2ecf20Sopenharmony_ci			break;
8798c2ecf20Sopenharmony_ci		mdelay(10);
8808c2ecf20Sopenharmony_ci	}
8818c2ecf20Sopenharmony_ci
8828c2ecf20Sopenharmony_ci	if (i == 100)
8838c2ecf20Sopenharmony_ci		return -ETIMEDOUT;
8848c2ecf20Sopenharmony_ci
8858c2ecf20Sopenharmony_ci	tmp = RREG32_SMC(reg_ctrl);
8868c2ecf20Sopenharmony_ci	tmp &= ~reg_mask;
8878c2ecf20Sopenharmony_ci	tmp |= dividers.post_divider;
8888c2ecf20Sopenharmony_ci	WREG32_SMC(reg_ctrl, tmp);
8898c2ecf20Sopenharmony_ci
8908c2ecf20Sopenharmony_ci	for (i = 0; i < 100; i++) {
8918c2ecf20Sopenharmony_ci		if (RREG32_SMC(reg_status) & status_mask)
8928c2ecf20Sopenharmony_ci			break;
8938c2ecf20Sopenharmony_ci		mdelay(10);
8948c2ecf20Sopenharmony_ci	}
8958c2ecf20Sopenharmony_ci
8968c2ecf20Sopenharmony_ci	if (i == 100)
8978c2ecf20Sopenharmony_ci		return -ETIMEDOUT;
8988c2ecf20Sopenharmony_ci
8998c2ecf20Sopenharmony_ci	return 0;
9008c2ecf20Sopenharmony_ci}
9018c2ecf20Sopenharmony_ci
9028c2ecf20Sopenharmony_cistatic void vi_pcie_gen3_enable(struct amdgpu_device *adev)
9038c2ecf20Sopenharmony_ci{
9048c2ecf20Sopenharmony_ci	if (pci_is_root_bus(adev->pdev->bus))
9058c2ecf20Sopenharmony_ci		return;
9068c2ecf20Sopenharmony_ci
9078c2ecf20Sopenharmony_ci	if (amdgpu_pcie_gen2 == 0)
9088c2ecf20Sopenharmony_ci		return;
9098c2ecf20Sopenharmony_ci
9108c2ecf20Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
9118c2ecf20Sopenharmony_ci		return;
9128c2ecf20Sopenharmony_ci
9138c2ecf20Sopenharmony_ci	if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
9148c2ecf20Sopenharmony_ci					CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
9158c2ecf20Sopenharmony_ci		return;
9168c2ecf20Sopenharmony_ci
9178c2ecf20Sopenharmony_ci	/* todo */
9188c2ecf20Sopenharmony_ci}
9198c2ecf20Sopenharmony_ci
9208c2ecf20Sopenharmony_cistatic void vi_program_aspm(struct amdgpu_device *adev)
9218c2ecf20Sopenharmony_ci{
9228c2ecf20Sopenharmony_ci
9238c2ecf20Sopenharmony_ci	if (amdgpu_aspm == 0)
9248c2ecf20Sopenharmony_ci		return;
9258c2ecf20Sopenharmony_ci
9268c2ecf20Sopenharmony_ci	/* todo */
9278c2ecf20Sopenharmony_ci}
9288c2ecf20Sopenharmony_ci
9298c2ecf20Sopenharmony_cistatic void vi_enable_doorbell_aperture(struct amdgpu_device *adev,
9308c2ecf20Sopenharmony_ci					bool enable)
9318c2ecf20Sopenharmony_ci{
9328c2ecf20Sopenharmony_ci	u32 tmp;
9338c2ecf20Sopenharmony_ci
9348c2ecf20Sopenharmony_ci	/* not necessary on CZ */
9358c2ecf20Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
9368c2ecf20Sopenharmony_ci		return;
9378c2ecf20Sopenharmony_ci
9388c2ecf20Sopenharmony_ci	tmp = RREG32(mmBIF_DOORBELL_APER_EN);
9398c2ecf20Sopenharmony_ci	if (enable)
9408c2ecf20Sopenharmony_ci		tmp = REG_SET_FIELD(tmp, BIF_DOORBELL_APER_EN, BIF_DOORBELL_APER_EN, 1);
9418c2ecf20Sopenharmony_ci	else
9428c2ecf20Sopenharmony_ci		tmp = REG_SET_FIELD(tmp, BIF_DOORBELL_APER_EN, BIF_DOORBELL_APER_EN, 0);
9438c2ecf20Sopenharmony_ci
9448c2ecf20Sopenharmony_ci	WREG32(mmBIF_DOORBELL_APER_EN, tmp);
9458c2ecf20Sopenharmony_ci}
9468c2ecf20Sopenharmony_ci
9478c2ecf20Sopenharmony_ci#define ATI_REV_ID_FUSE_MACRO__ADDRESS      0xC0014044
9488c2ecf20Sopenharmony_ci#define ATI_REV_ID_FUSE_MACRO__SHIFT        9
9498c2ecf20Sopenharmony_ci#define ATI_REV_ID_FUSE_MACRO__MASK         0x00001E00
9508c2ecf20Sopenharmony_ci
9518c2ecf20Sopenharmony_cistatic uint32_t vi_get_rev_id(struct amdgpu_device *adev)
9528c2ecf20Sopenharmony_ci{
9538c2ecf20Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
9548c2ecf20Sopenharmony_ci		return (RREG32_SMC(ATI_REV_ID_FUSE_MACRO__ADDRESS) & ATI_REV_ID_FUSE_MACRO__MASK)
9558c2ecf20Sopenharmony_ci			>> ATI_REV_ID_FUSE_MACRO__SHIFT;
9568c2ecf20Sopenharmony_ci	else
9578c2ecf20Sopenharmony_ci		return (RREG32(mmPCIE_EFUSE4) & PCIE_EFUSE4__STRAP_BIF_ATI_REV_ID_MASK)
9588c2ecf20Sopenharmony_ci			>> PCIE_EFUSE4__STRAP_BIF_ATI_REV_ID__SHIFT;
9598c2ecf20Sopenharmony_ci}
9608c2ecf20Sopenharmony_ci
9618c2ecf20Sopenharmony_cistatic void vi_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
9628c2ecf20Sopenharmony_ci{
9638c2ecf20Sopenharmony_ci	if (!ring || !ring->funcs->emit_wreg) {
9648c2ecf20Sopenharmony_ci		WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
9658c2ecf20Sopenharmony_ci		RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
9668c2ecf20Sopenharmony_ci	} else {
9678c2ecf20Sopenharmony_ci		amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
9688c2ecf20Sopenharmony_ci	}
9698c2ecf20Sopenharmony_ci}
9708c2ecf20Sopenharmony_ci
9718c2ecf20Sopenharmony_cistatic void vi_invalidate_hdp(struct amdgpu_device *adev,
9728c2ecf20Sopenharmony_ci			      struct amdgpu_ring *ring)
9738c2ecf20Sopenharmony_ci{
9748c2ecf20Sopenharmony_ci	if (!ring || !ring->funcs->emit_wreg) {
9758c2ecf20Sopenharmony_ci		WREG32(mmHDP_DEBUG0, 1);
9768c2ecf20Sopenharmony_ci		RREG32(mmHDP_DEBUG0);
9778c2ecf20Sopenharmony_ci	} else {
9788c2ecf20Sopenharmony_ci		amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
9798c2ecf20Sopenharmony_ci	}
9808c2ecf20Sopenharmony_ci}
9818c2ecf20Sopenharmony_ci
9828c2ecf20Sopenharmony_cistatic bool vi_need_full_reset(struct amdgpu_device *adev)
9838c2ecf20Sopenharmony_ci{
9848c2ecf20Sopenharmony_ci	switch (adev->asic_type) {
9858c2ecf20Sopenharmony_ci	case CHIP_CARRIZO:
9868c2ecf20Sopenharmony_ci	case CHIP_STONEY:
9878c2ecf20Sopenharmony_ci		/* CZ has hang issues with full reset at the moment */
9888c2ecf20Sopenharmony_ci		return false;
9898c2ecf20Sopenharmony_ci	case CHIP_FIJI:
9908c2ecf20Sopenharmony_ci	case CHIP_TONGA:
9918c2ecf20Sopenharmony_ci		/* XXX: soft reset should work on fiji and tonga */
9928c2ecf20Sopenharmony_ci		return true;
9938c2ecf20Sopenharmony_ci	case CHIP_POLARIS10:
9948c2ecf20Sopenharmony_ci	case CHIP_POLARIS11:
9958c2ecf20Sopenharmony_ci	case CHIP_POLARIS12:
9968c2ecf20Sopenharmony_ci	case CHIP_TOPAZ:
9978c2ecf20Sopenharmony_ci	default:
9988c2ecf20Sopenharmony_ci		/* change this when we support soft reset */
9998c2ecf20Sopenharmony_ci		return true;
10008c2ecf20Sopenharmony_ci	}
10018c2ecf20Sopenharmony_ci}
10028c2ecf20Sopenharmony_ci
10038c2ecf20Sopenharmony_cistatic void vi_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
10048c2ecf20Sopenharmony_ci			      uint64_t *count1)
10058c2ecf20Sopenharmony_ci{
10068c2ecf20Sopenharmony_ci	uint32_t perfctr = 0;
10078c2ecf20Sopenharmony_ci	uint64_t cnt0_of, cnt1_of;
10088c2ecf20Sopenharmony_ci	int tmp;
10098c2ecf20Sopenharmony_ci
10108c2ecf20Sopenharmony_ci	/* This reports 0 on APUs, so return to avoid writing/reading registers
10118c2ecf20Sopenharmony_ci	 * that may or may not be different from their GPU counterparts
10128c2ecf20Sopenharmony_ci	 */
10138c2ecf20Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
10148c2ecf20Sopenharmony_ci		return;
10158c2ecf20Sopenharmony_ci
10168c2ecf20Sopenharmony_ci	/* Set the 2 events that we wish to watch, defined above */
10178c2ecf20Sopenharmony_ci	/* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
10188c2ecf20Sopenharmony_ci	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
10198c2ecf20Sopenharmony_ci	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
10208c2ecf20Sopenharmony_ci
10218c2ecf20Sopenharmony_ci	/* Write to enable desired perf counters */
10228c2ecf20Sopenharmony_ci	WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
10238c2ecf20Sopenharmony_ci	/* Zero out and enable the perf counters
10248c2ecf20Sopenharmony_ci	 * Write 0x5:
10258c2ecf20Sopenharmony_ci	 * Bit 0 = Start all counters(1)
10268c2ecf20Sopenharmony_ci	 * Bit 2 = Global counter reset enable(1)
10278c2ecf20Sopenharmony_ci	 */
10288c2ecf20Sopenharmony_ci	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
10298c2ecf20Sopenharmony_ci
10308c2ecf20Sopenharmony_ci	msleep(1000);
10318c2ecf20Sopenharmony_ci
10328c2ecf20Sopenharmony_ci	/* Load the shadow and disable the perf counters
10338c2ecf20Sopenharmony_ci	 * Write 0x2:
10348c2ecf20Sopenharmony_ci	 * Bit 0 = Stop counters(0)
10358c2ecf20Sopenharmony_ci	 * Bit 1 = Load the shadow counters(1)
10368c2ecf20Sopenharmony_ci	 */
10378c2ecf20Sopenharmony_ci	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
10388c2ecf20Sopenharmony_ci
10398c2ecf20Sopenharmony_ci	/* Read register values to get any >32bit overflow */
10408c2ecf20Sopenharmony_ci	tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
10418c2ecf20Sopenharmony_ci	cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
10428c2ecf20Sopenharmony_ci	cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
10438c2ecf20Sopenharmony_ci
10448c2ecf20Sopenharmony_ci	/* Get the values and add the overflow */
10458c2ecf20Sopenharmony_ci	*count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
10468c2ecf20Sopenharmony_ci	*count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
10478c2ecf20Sopenharmony_ci}
10488c2ecf20Sopenharmony_ci
10498c2ecf20Sopenharmony_cistatic uint64_t vi_get_pcie_replay_count(struct amdgpu_device *adev)
10508c2ecf20Sopenharmony_ci{
10518c2ecf20Sopenharmony_ci	uint64_t nak_r, nak_g;
10528c2ecf20Sopenharmony_ci
10538c2ecf20Sopenharmony_ci	/* Get the number of NAKs received and generated */
10548c2ecf20Sopenharmony_ci	nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
10558c2ecf20Sopenharmony_ci	nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
10568c2ecf20Sopenharmony_ci
10578c2ecf20Sopenharmony_ci	/* Add the total number of NAKs, i.e the number of replays */
10588c2ecf20Sopenharmony_ci	return (nak_r + nak_g);
10598c2ecf20Sopenharmony_ci}
10608c2ecf20Sopenharmony_ci
10618c2ecf20Sopenharmony_cistatic bool vi_need_reset_on_init(struct amdgpu_device *adev)
10628c2ecf20Sopenharmony_ci{
10638c2ecf20Sopenharmony_ci	u32 clock_cntl, pc;
10648c2ecf20Sopenharmony_ci
10658c2ecf20Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
10668c2ecf20Sopenharmony_ci		return false;
10678c2ecf20Sopenharmony_ci
10688c2ecf20Sopenharmony_ci	/* check if the SMC is already running */
10698c2ecf20Sopenharmony_ci	clock_cntl = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
10708c2ecf20Sopenharmony_ci	pc = RREG32_SMC(ixSMC_PC_C);
10718c2ecf20Sopenharmony_ci	if ((0 == REG_GET_FIELD(clock_cntl, SMC_SYSCON_CLOCK_CNTL_0, ck_disable)) &&
10728c2ecf20Sopenharmony_ci	    (0x20100 <= pc))
10738c2ecf20Sopenharmony_ci		return true;
10748c2ecf20Sopenharmony_ci
10758c2ecf20Sopenharmony_ci	return false;
10768c2ecf20Sopenharmony_ci}
10778c2ecf20Sopenharmony_ci
10788c2ecf20Sopenharmony_cistatic void vi_pre_asic_init(struct amdgpu_device *adev)
10798c2ecf20Sopenharmony_ci{
10808c2ecf20Sopenharmony_ci}
10818c2ecf20Sopenharmony_ci
10828c2ecf20Sopenharmony_cistatic const struct amdgpu_asic_funcs vi_asic_funcs =
10838c2ecf20Sopenharmony_ci{
10848c2ecf20Sopenharmony_ci	.read_disabled_bios = &vi_read_disabled_bios,
10858c2ecf20Sopenharmony_ci	.read_bios_from_rom = &vi_read_bios_from_rom,
10868c2ecf20Sopenharmony_ci	.read_register = &vi_read_register,
10878c2ecf20Sopenharmony_ci	.reset = &vi_asic_reset,
10888c2ecf20Sopenharmony_ci	.reset_method = &vi_asic_reset_method,
10898c2ecf20Sopenharmony_ci	.set_vga_state = &vi_vga_set_state,
10908c2ecf20Sopenharmony_ci	.get_xclk = &vi_get_xclk,
10918c2ecf20Sopenharmony_ci	.set_uvd_clocks = &vi_set_uvd_clocks,
10928c2ecf20Sopenharmony_ci	.set_vce_clocks = &vi_set_vce_clocks,
10938c2ecf20Sopenharmony_ci	.get_config_memsize = &vi_get_config_memsize,
10948c2ecf20Sopenharmony_ci	.flush_hdp = &vi_flush_hdp,
10958c2ecf20Sopenharmony_ci	.invalidate_hdp = &vi_invalidate_hdp,
10968c2ecf20Sopenharmony_ci	.need_full_reset = &vi_need_full_reset,
10978c2ecf20Sopenharmony_ci	.init_doorbell_index = &legacy_doorbell_index_init,
10988c2ecf20Sopenharmony_ci	.get_pcie_usage = &vi_get_pcie_usage,
10998c2ecf20Sopenharmony_ci	.need_reset_on_init = &vi_need_reset_on_init,
11008c2ecf20Sopenharmony_ci	.get_pcie_replay_count = &vi_get_pcie_replay_count,
11018c2ecf20Sopenharmony_ci	.supports_baco = &vi_asic_supports_baco,
11028c2ecf20Sopenharmony_ci	.pre_asic_init = &vi_pre_asic_init,
11038c2ecf20Sopenharmony_ci};
11048c2ecf20Sopenharmony_ci
11058c2ecf20Sopenharmony_ci#define CZ_REV_BRISTOL(rev)	 \
11068c2ecf20Sopenharmony_ci	((rev >= 0xC8 && rev <= 0xCE) || (rev >= 0xE1 && rev <= 0xE6))
11078c2ecf20Sopenharmony_ci
11088c2ecf20Sopenharmony_cistatic int vi_common_early_init(void *handle)
11098c2ecf20Sopenharmony_ci{
11108c2ecf20Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
11118c2ecf20Sopenharmony_ci
11128c2ecf20Sopenharmony_ci	if (adev->flags & AMD_IS_APU) {
11138c2ecf20Sopenharmony_ci		adev->smc_rreg = &cz_smc_rreg;
11148c2ecf20Sopenharmony_ci		adev->smc_wreg = &cz_smc_wreg;
11158c2ecf20Sopenharmony_ci	} else {
11168c2ecf20Sopenharmony_ci		adev->smc_rreg = &vi_smc_rreg;
11178c2ecf20Sopenharmony_ci		adev->smc_wreg = &vi_smc_wreg;
11188c2ecf20Sopenharmony_ci	}
11198c2ecf20Sopenharmony_ci	adev->pcie_rreg = &vi_pcie_rreg;
11208c2ecf20Sopenharmony_ci	adev->pcie_wreg = &vi_pcie_wreg;
11218c2ecf20Sopenharmony_ci	adev->uvd_ctx_rreg = &vi_uvd_ctx_rreg;
11228c2ecf20Sopenharmony_ci	adev->uvd_ctx_wreg = &vi_uvd_ctx_wreg;
11238c2ecf20Sopenharmony_ci	adev->didt_rreg = &vi_didt_rreg;
11248c2ecf20Sopenharmony_ci	adev->didt_wreg = &vi_didt_wreg;
11258c2ecf20Sopenharmony_ci	adev->gc_cac_rreg = &vi_gc_cac_rreg;
11268c2ecf20Sopenharmony_ci	adev->gc_cac_wreg = &vi_gc_cac_wreg;
11278c2ecf20Sopenharmony_ci
11288c2ecf20Sopenharmony_ci	adev->asic_funcs = &vi_asic_funcs;
11298c2ecf20Sopenharmony_ci
11308c2ecf20Sopenharmony_ci	adev->rev_id = vi_get_rev_id(adev);
11318c2ecf20Sopenharmony_ci	adev->external_rev_id = 0xFF;
11328c2ecf20Sopenharmony_ci	switch (adev->asic_type) {
11338c2ecf20Sopenharmony_ci	case CHIP_TOPAZ:
11348c2ecf20Sopenharmony_ci		adev->cg_flags = 0;
11358c2ecf20Sopenharmony_ci		adev->pg_flags = 0;
11368c2ecf20Sopenharmony_ci		adev->external_rev_id = 0x1;
11378c2ecf20Sopenharmony_ci		break;
11388c2ecf20Sopenharmony_ci	case CHIP_FIJI:
11398c2ecf20Sopenharmony_ci		adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
11408c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGLS |
11418c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
11428c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
11438c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS |
11448c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS_LS |
11458c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGCG |
11468c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
11478c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
11488c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
11498c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
11508c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
11518c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
11528c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_ROM_MGCG |
11538c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
11548c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
11558c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG;
11568c2ecf20Sopenharmony_ci		adev->pg_flags = 0;
11578c2ecf20Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x3c;
11588c2ecf20Sopenharmony_ci		break;
11598c2ecf20Sopenharmony_ci	case CHIP_TONGA:
11608c2ecf20Sopenharmony_ci		adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
11618c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGCG |
11628c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
11638c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
11648c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
11658c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
11668c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
11678c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
11688c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_ROM_MGCG |
11698c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
11708c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
11718c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_DRM_LS |
11728c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG;
11738c2ecf20Sopenharmony_ci		adev->pg_flags = 0;
11748c2ecf20Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x14;
11758c2ecf20Sopenharmony_ci		break;
11768c2ecf20Sopenharmony_ci	case CHIP_POLARIS11:
11778c2ecf20Sopenharmony_ci		adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
11788c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
11798c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
11808c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGCG |
11818c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
11828c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGCG |
11838c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGLS |
11848c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
11858c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
11868c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_BIF_MGCG |
11878c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
11888c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
11898c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
11908c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_ROM_MGCG |
11918c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
11928c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
11938c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_DRM_LS |
11948c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
11958c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG;
11968c2ecf20Sopenharmony_ci		adev->pg_flags = 0;
11978c2ecf20Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x5A;
11988c2ecf20Sopenharmony_ci		break;
11998c2ecf20Sopenharmony_ci	case CHIP_POLARIS10:
12008c2ecf20Sopenharmony_ci		adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
12018c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
12028c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
12038c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGCG |
12048c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
12058c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGCG |
12068c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGLS |
12078c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
12088c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
12098c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_BIF_MGCG |
12108c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
12118c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
12128c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
12138c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_ROM_MGCG |
12148c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
12158c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
12168c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_DRM_LS |
12178c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
12188c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG;
12198c2ecf20Sopenharmony_ci		adev->pg_flags = 0;
12208c2ecf20Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x50;
12218c2ecf20Sopenharmony_ci		break;
12228c2ecf20Sopenharmony_ci	case CHIP_POLARIS12:
12238c2ecf20Sopenharmony_ci		adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
12248c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
12258c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
12268c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGCG |
12278c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
12288c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGCG |
12298c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGLS |
12308c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
12318c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
12328c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_BIF_MGCG |
12338c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
12348c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
12358c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
12368c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_ROM_MGCG |
12378c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
12388c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
12398c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_DRM_LS |
12408c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
12418c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG;
12428c2ecf20Sopenharmony_ci		adev->pg_flags = 0;
12438c2ecf20Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x64;
12448c2ecf20Sopenharmony_ci		break;
12458c2ecf20Sopenharmony_ci	case CHIP_VEGAM:
12468c2ecf20Sopenharmony_ci		adev->cg_flags = 0;
12478c2ecf20Sopenharmony_ci			/*AMD_CG_SUPPORT_GFX_MGCG |
12488c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
12498c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
12508c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGCG |
12518c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
12528c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGCG |
12538c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGLS |
12548c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
12558c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
12568c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_BIF_MGCG |
12578c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
12588c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
12598c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
12608c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_ROM_MGCG |
12618c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
12628c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
12638c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_DRM_LS |
12648c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
12658c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG;*/
12668c2ecf20Sopenharmony_ci		adev->pg_flags = 0;
12678c2ecf20Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x6E;
12688c2ecf20Sopenharmony_ci		break;
12698c2ecf20Sopenharmony_ci	case CHIP_CARRIZO:
12708c2ecf20Sopenharmony_ci		adev->cg_flags = AMD_CG_SUPPORT_UVD_MGCG |
12718c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGCG |
12728c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGLS |
12738c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
12748c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
12758c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS |
12768c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS_LS |
12778c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGCG |
12788c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
12798c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
12808c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
12818c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
12828c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
12838c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
12848c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG;
12858c2ecf20Sopenharmony_ci		/* rev0 hardware requires workarounds to support PG */
12868c2ecf20Sopenharmony_ci		adev->pg_flags = 0;
12878c2ecf20Sopenharmony_ci		if (adev->rev_id != 0x00 || CZ_REV_BRISTOL(adev->pdev->revision)) {
12888c2ecf20Sopenharmony_ci			adev->pg_flags |= AMD_PG_SUPPORT_GFX_SMG |
12898c2ecf20Sopenharmony_ci				AMD_PG_SUPPORT_GFX_PIPELINE |
12908c2ecf20Sopenharmony_ci				AMD_PG_SUPPORT_CP |
12918c2ecf20Sopenharmony_ci				AMD_PG_SUPPORT_UVD |
12928c2ecf20Sopenharmony_ci				AMD_PG_SUPPORT_VCE;
12938c2ecf20Sopenharmony_ci		}
12948c2ecf20Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x1;
12958c2ecf20Sopenharmony_ci		break;
12968c2ecf20Sopenharmony_ci	case CHIP_STONEY:
12978c2ecf20Sopenharmony_ci		adev->cg_flags = AMD_CG_SUPPORT_UVD_MGCG |
12988c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGCG |
12998c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGLS |
13008c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
13018c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
13028c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS |
13038c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS_LS |
13048c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
13058c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
13068c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
13078c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
13088c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
13098c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
13108c2ecf20Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG;
13118c2ecf20Sopenharmony_ci		adev->pg_flags = AMD_PG_SUPPORT_GFX_PG |
13128c2ecf20Sopenharmony_ci			AMD_PG_SUPPORT_GFX_SMG |
13138c2ecf20Sopenharmony_ci			AMD_PG_SUPPORT_GFX_PIPELINE |
13148c2ecf20Sopenharmony_ci			AMD_PG_SUPPORT_CP |
13158c2ecf20Sopenharmony_ci			AMD_PG_SUPPORT_UVD |
13168c2ecf20Sopenharmony_ci			AMD_PG_SUPPORT_VCE;
13178c2ecf20Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x61;
13188c2ecf20Sopenharmony_ci		break;
13198c2ecf20Sopenharmony_ci	default:
13208c2ecf20Sopenharmony_ci		/* FIXME: not supported yet */
13218c2ecf20Sopenharmony_ci		return -EINVAL;
13228c2ecf20Sopenharmony_ci	}
13238c2ecf20Sopenharmony_ci
13248c2ecf20Sopenharmony_ci	if (amdgpu_sriov_vf(adev)) {
13258c2ecf20Sopenharmony_ci		amdgpu_virt_init_setting(adev);
13268c2ecf20Sopenharmony_ci		xgpu_vi_mailbox_set_irq_funcs(adev);
13278c2ecf20Sopenharmony_ci	}
13288c2ecf20Sopenharmony_ci
13298c2ecf20Sopenharmony_ci	return 0;
13308c2ecf20Sopenharmony_ci}
13318c2ecf20Sopenharmony_ci
13328c2ecf20Sopenharmony_cistatic int vi_common_late_init(void *handle)
13338c2ecf20Sopenharmony_ci{
13348c2ecf20Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
13358c2ecf20Sopenharmony_ci
13368c2ecf20Sopenharmony_ci	if (amdgpu_sriov_vf(adev))
13378c2ecf20Sopenharmony_ci		xgpu_vi_mailbox_get_irq(adev);
13388c2ecf20Sopenharmony_ci
13398c2ecf20Sopenharmony_ci	return 0;
13408c2ecf20Sopenharmony_ci}
13418c2ecf20Sopenharmony_ci
13428c2ecf20Sopenharmony_cistatic int vi_common_sw_init(void *handle)
13438c2ecf20Sopenharmony_ci{
13448c2ecf20Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
13458c2ecf20Sopenharmony_ci
13468c2ecf20Sopenharmony_ci	if (amdgpu_sriov_vf(adev))
13478c2ecf20Sopenharmony_ci		xgpu_vi_mailbox_add_irq_id(adev);
13488c2ecf20Sopenharmony_ci
13498c2ecf20Sopenharmony_ci	return 0;
13508c2ecf20Sopenharmony_ci}
13518c2ecf20Sopenharmony_ci
13528c2ecf20Sopenharmony_cistatic int vi_common_sw_fini(void *handle)
13538c2ecf20Sopenharmony_ci{
13548c2ecf20Sopenharmony_ci	return 0;
13558c2ecf20Sopenharmony_ci}
13568c2ecf20Sopenharmony_ci
13578c2ecf20Sopenharmony_cistatic int vi_common_hw_init(void *handle)
13588c2ecf20Sopenharmony_ci{
13598c2ecf20Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
13608c2ecf20Sopenharmony_ci
13618c2ecf20Sopenharmony_ci	/* move the golden regs per IP block */
13628c2ecf20Sopenharmony_ci	vi_init_golden_registers(adev);
13638c2ecf20Sopenharmony_ci	/* enable pcie gen2/3 link */
13648c2ecf20Sopenharmony_ci	vi_pcie_gen3_enable(adev);
13658c2ecf20Sopenharmony_ci	/* enable aspm */
13668c2ecf20Sopenharmony_ci	vi_program_aspm(adev);
13678c2ecf20Sopenharmony_ci	/* enable the doorbell aperture */
13688c2ecf20Sopenharmony_ci	vi_enable_doorbell_aperture(adev, true);
13698c2ecf20Sopenharmony_ci
13708c2ecf20Sopenharmony_ci	return 0;
13718c2ecf20Sopenharmony_ci}
13728c2ecf20Sopenharmony_ci
13738c2ecf20Sopenharmony_cistatic int vi_common_hw_fini(void *handle)
13748c2ecf20Sopenharmony_ci{
13758c2ecf20Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
13768c2ecf20Sopenharmony_ci
13778c2ecf20Sopenharmony_ci	/* enable the doorbell aperture */
13788c2ecf20Sopenharmony_ci	vi_enable_doorbell_aperture(adev, false);
13798c2ecf20Sopenharmony_ci
13808c2ecf20Sopenharmony_ci	if (amdgpu_sriov_vf(adev))
13818c2ecf20Sopenharmony_ci		xgpu_vi_mailbox_put_irq(adev);
13828c2ecf20Sopenharmony_ci
13838c2ecf20Sopenharmony_ci	return 0;
13848c2ecf20Sopenharmony_ci}
13858c2ecf20Sopenharmony_ci
13868c2ecf20Sopenharmony_cistatic int vi_common_suspend(void *handle)
13878c2ecf20Sopenharmony_ci{
13888c2ecf20Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
13898c2ecf20Sopenharmony_ci
13908c2ecf20Sopenharmony_ci	return vi_common_hw_fini(adev);
13918c2ecf20Sopenharmony_ci}
13928c2ecf20Sopenharmony_ci
13938c2ecf20Sopenharmony_cistatic int vi_common_resume(void *handle)
13948c2ecf20Sopenharmony_ci{
13958c2ecf20Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
13968c2ecf20Sopenharmony_ci
13978c2ecf20Sopenharmony_ci	return vi_common_hw_init(adev);
13988c2ecf20Sopenharmony_ci}
13998c2ecf20Sopenharmony_ci
14008c2ecf20Sopenharmony_cistatic bool vi_common_is_idle(void *handle)
14018c2ecf20Sopenharmony_ci{
14028c2ecf20Sopenharmony_ci	return true;
14038c2ecf20Sopenharmony_ci}
14048c2ecf20Sopenharmony_ci
14058c2ecf20Sopenharmony_cistatic int vi_common_wait_for_idle(void *handle)
14068c2ecf20Sopenharmony_ci{
14078c2ecf20Sopenharmony_ci	return 0;
14088c2ecf20Sopenharmony_ci}
14098c2ecf20Sopenharmony_ci
14108c2ecf20Sopenharmony_cistatic int vi_common_soft_reset(void *handle)
14118c2ecf20Sopenharmony_ci{
14128c2ecf20Sopenharmony_ci	return 0;
14138c2ecf20Sopenharmony_ci}
14148c2ecf20Sopenharmony_ci
14158c2ecf20Sopenharmony_cistatic void vi_update_bif_medium_grain_light_sleep(struct amdgpu_device *adev,
14168c2ecf20Sopenharmony_ci						   bool enable)
14178c2ecf20Sopenharmony_ci{
14188c2ecf20Sopenharmony_ci	uint32_t temp, data;
14198c2ecf20Sopenharmony_ci
14208c2ecf20Sopenharmony_ci	temp = data = RREG32_PCIE(ixPCIE_CNTL2);
14218c2ecf20Sopenharmony_ci
14228c2ecf20Sopenharmony_ci	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_BIF_LS))
14238c2ecf20Sopenharmony_ci		data |= PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
14248c2ecf20Sopenharmony_ci				PCIE_CNTL2__MST_MEM_LS_EN_MASK |
14258c2ecf20Sopenharmony_ci				PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK;
14268c2ecf20Sopenharmony_ci	else
14278c2ecf20Sopenharmony_ci		data &= ~(PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
14288c2ecf20Sopenharmony_ci				PCIE_CNTL2__MST_MEM_LS_EN_MASK |
14298c2ecf20Sopenharmony_ci				PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK);
14308c2ecf20Sopenharmony_ci
14318c2ecf20Sopenharmony_ci	if (temp != data)
14328c2ecf20Sopenharmony_ci		WREG32_PCIE(ixPCIE_CNTL2, data);
14338c2ecf20Sopenharmony_ci}
14348c2ecf20Sopenharmony_ci
14358c2ecf20Sopenharmony_cistatic void vi_update_hdp_medium_grain_clock_gating(struct amdgpu_device *adev,
14368c2ecf20Sopenharmony_ci						    bool enable)
14378c2ecf20Sopenharmony_ci{
14388c2ecf20Sopenharmony_ci	uint32_t temp, data;
14398c2ecf20Sopenharmony_ci
14408c2ecf20Sopenharmony_ci	temp = data = RREG32(mmHDP_HOST_PATH_CNTL);
14418c2ecf20Sopenharmony_ci
14428c2ecf20Sopenharmony_ci	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_MGCG))
14438c2ecf20Sopenharmony_ci		data &= ~HDP_HOST_PATH_CNTL__CLOCK_GATING_DIS_MASK;
14448c2ecf20Sopenharmony_ci	else
14458c2ecf20Sopenharmony_ci		data |= HDP_HOST_PATH_CNTL__CLOCK_GATING_DIS_MASK;
14468c2ecf20Sopenharmony_ci
14478c2ecf20Sopenharmony_ci	if (temp != data)
14488c2ecf20Sopenharmony_ci		WREG32(mmHDP_HOST_PATH_CNTL, data);
14498c2ecf20Sopenharmony_ci}
14508c2ecf20Sopenharmony_ci
14518c2ecf20Sopenharmony_cistatic void vi_update_hdp_light_sleep(struct amdgpu_device *adev,
14528c2ecf20Sopenharmony_ci				      bool enable)
14538c2ecf20Sopenharmony_ci{
14548c2ecf20Sopenharmony_ci	uint32_t temp, data;
14558c2ecf20Sopenharmony_ci
14568c2ecf20Sopenharmony_ci	temp = data = RREG32(mmHDP_MEM_POWER_LS);
14578c2ecf20Sopenharmony_ci
14588c2ecf20Sopenharmony_ci	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS))
14598c2ecf20Sopenharmony_ci		data |= HDP_MEM_POWER_LS__LS_ENABLE_MASK;
14608c2ecf20Sopenharmony_ci	else
14618c2ecf20Sopenharmony_ci		data &= ~HDP_MEM_POWER_LS__LS_ENABLE_MASK;
14628c2ecf20Sopenharmony_ci
14638c2ecf20Sopenharmony_ci	if (temp != data)
14648c2ecf20Sopenharmony_ci		WREG32(mmHDP_MEM_POWER_LS, data);
14658c2ecf20Sopenharmony_ci}
14668c2ecf20Sopenharmony_ci
14678c2ecf20Sopenharmony_cistatic void vi_update_drm_light_sleep(struct amdgpu_device *adev,
14688c2ecf20Sopenharmony_ci				      bool enable)
14698c2ecf20Sopenharmony_ci{
14708c2ecf20Sopenharmony_ci	uint32_t temp, data;
14718c2ecf20Sopenharmony_ci
14728c2ecf20Sopenharmony_ci	temp = data = RREG32(0x157a);
14738c2ecf20Sopenharmony_ci
14748c2ecf20Sopenharmony_ci	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_DRM_LS))
14758c2ecf20Sopenharmony_ci		data |= 1;
14768c2ecf20Sopenharmony_ci	else
14778c2ecf20Sopenharmony_ci		data &= ~1;
14788c2ecf20Sopenharmony_ci
14798c2ecf20Sopenharmony_ci	if (temp != data)
14808c2ecf20Sopenharmony_ci		WREG32(0x157a, data);
14818c2ecf20Sopenharmony_ci}
14828c2ecf20Sopenharmony_ci
14838c2ecf20Sopenharmony_ci
14848c2ecf20Sopenharmony_cistatic void vi_update_rom_medium_grain_clock_gating(struct amdgpu_device *adev,
14858c2ecf20Sopenharmony_ci						    bool enable)
14868c2ecf20Sopenharmony_ci{
14878c2ecf20Sopenharmony_ci	uint32_t temp, data;
14888c2ecf20Sopenharmony_ci
14898c2ecf20Sopenharmony_ci	temp = data = RREG32_SMC(ixCGTT_ROM_CLK_CTRL0);
14908c2ecf20Sopenharmony_ci
14918c2ecf20Sopenharmony_ci	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_ROM_MGCG))
14928c2ecf20Sopenharmony_ci		data &= ~(CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE0_MASK |
14938c2ecf20Sopenharmony_ci				CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE1_MASK);
14948c2ecf20Sopenharmony_ci	else
14958c2ecf20Sopenharmony_ci		data |= CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE0_MASK |
14968c2ecf20Sopenharmony_ci				CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE1_MASK;
14978c2ecf20Sopenharmony_ci
14988c2ecf20Sopenharmony_ci	if (temp != data)
14998c2ecf20Sopenharmony_ci		WREG32_SMC(ixCGTT_ROM_CLK_CTRL0, data);
15008c2ecf20Sopenharmony_ci}
15018c2ecf20Sopenharmony_ci
15028c2ecf20Sopenharmony_cistatic int vi_common_set_clockgating_state_by_smu(void *handle,
15038c2ecf20Sopenharmony_ci					   enum amd_clockgating_state state)
15048c2ecf20Sopenharmony_ci{
15058c2ecf20Sopenharmony_ci	uint32_t msg_id, pp_state = 0;
15068c2ecf20Sopenharmony_ci	uint32_t pp_support_state = 0;
15078c2ecf20Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
15088c2ecf20Sopenharmony_ci
15098c2ecf20Sopenharmony_ci	if (adev->cg_flags & (AMD_CG_SUPPORT_MC_LS | AMD_CG_SUPPORT_MC_MGCG)) {
15108c2ecf20Sopenharmony_ci		if (adev->cg_flags & AMD_CG_SUPPORT_MC_LS) {
15118c2ecf20Sopenharmony_ci			pp_support_state = PP_STATE_SUPPORT_LS;
15128c2ecf20Sopenharmony_ci			pp_state = PP_STATE_LS;
15138c2ecf20Sopenharmony_ci		}
15148c2ecf20Sopenharmony_ci		if (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG) {
15158c2ecf20Sopenharmony_ci			pp_support_state |= PP_STATE_SUPPORT_CG;
15168c2ecf20Sopenharmony_ci			pp_state |= PP_STATE_CG;
15178c2ecf20Sopenharmony_ci		}
15188c2ecf20Sopenharmony_ci		if (state == AMD_CG_STATE_UNGATE)
15198c2ecf20Sopenharmony_ci			pp_state = 0;
15208c2ecf20Sopenharmony_ci		msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
15218c2ecf20Sopenharmony_ci			       PP_BLOCK_SYS_MC,
15228c2ecf20Sopenharmony_ci			       pp_support_state,
15238c2ecf20Sopenharmony_ci			       pp_state);
15248c2ecf20Sopenharmony_ci		amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
15258c2ecf20Sopenharmony_ci	}
15268c2ecf20Sopenharmony_ci
15278c2ecf20Sopenharmony_ci	if (adev->cg_flags & (AMD_CG_SUPPORT_SDMA_LS | AMD_CG_SUPPORT_SDMA_MGCG)) {
15288c2ecf20Sopenharmony_ci		if (adev->cg_flags & AMD_CG_SUPPORT_SDMA_LS) {
15298c2ecf20Sopenharmony_ci			pp_support_state = PP_STATE_SUPPORT_LS;
15308c2ecf20Sopenharmony_ci			pp_state = PP_STATE_LS;
15318c2ecf20Sopenharmony_ci		}
15328c2ecf20Sopenharmony_ci		if (adev->cg_flags & AMD_CG_SUPPORT_SDMA_MGCG) {
15338c2ecf20Sopenharmony_ci			pp_support_state |= PP_STATE_SUPPORT_CG;
15348c2ecf20Sopenharmony_ci			pp_state |= PP_STATE_CG;
15358c2ecf20Sopenharmony_ci		}
15368c2ecf20Sopenharmony_ci		if (state == AMD_CG_STATE_UNGATE)
15378c2ecf20Sopenharmony_ci			pp_state = 0;
15388c2ecf20Sopenharmony_ci		msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
15398c2ecf20Sopenharmony_ci			       PP_BLOCK_SYS_SDMA,
15408c2ecf20Sopenharmony_ci			       pp_support_state,
15418c2ecf20Sopenharmony_ci			       pp_state);
15428c2ecf20Sopenharmony_ci		amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
15438c2ecf20Sopenharmony_ci	}
15448c2ecf20Sopenharmony_ci
15458c2ecf20Sopenharmony_ci	if (adev->cg_flags & (AMD_CG_SUPPORT_HDP_LS | AMD_CG_SUPPORT_HDP_MGCG)) {
15468c2ecf20Sopenharmony_ci		if (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS) {
15478c2ecf20Sopenharmony_ci			pp_support_state = PP_STATE_SUPPORT_LS;
15488c2ecf20Sopenharmony_ci			pp_state = PP_STATE_LS;
15498c2ecf20Sopenharmony_ci		}
15508c2ecf20Sopenharmony_ci		if (adev->cg_flags & AMD_CG_SUPPORT_HDP_MGCG) {
15518c2ecf20Sopenharmony_ci			pp_support_state |= PP_STATE_SUPPORT_CG;
15528c2ecf20Sopenharmony_ci			pp_state |= PP_STATE_CG;
15538c2ecf20Sopenharmony_ci		}
15548c2ecf20Sopenharmony_ci		if (state == AMD_CG_STATE_UNGATE)
15558c2ecf20Sopenharmony_ci			pp_state = 0;
15568c2ecf20Sopenharmony_ci		msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
15578c2ecf20Sopenharmony_ci			       PP_BLOCK_SYS_HDP,
15588c2ecf20Sopenharmony_ci			       pp_support_state,
15598c2ecf20Sopenharmony_ci			       pp_state);
15608c2ecf20Sopenharmony_ci		amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
15618c2ecf20Sopenharmony_ci	}
15628c2ecf20Sopenharmony_ci
15638c2ecf20Sopenharmony_ci
15648c2ecf20Sopenharmony_ci	if (adev->cg_flags & AMD_CG_SUPPORT_BIF_LS) {
15658c2ecf20Sopenharmony_ci		if (state == AMD_CG_STATE_UNGATE)
15668c2ecf20Sopenharmony_ci			pp_state = 0;
15678c2ecf20Sopenharmony_ci		else
15688c2ecf20Sopenharmony_ci			pp_state = PP_STATE_LS;
15698c2ecf20Sopenharmony_ci
15708c2ecf20Sopenharmony_ci		msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
15718c2ecf20Sopenharmony_ci			       PP_BLOCK_SYS_BIF,
15728c2ecf20Sopenharmony_ci			       PP_STATE_SUPPORT_LS,
15738c2ecf20Sopenharmony_ci			        pp_state);
15748c2ecf20Sopenharmony_ci		amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
15758c2ecf20Sopenharmony_ci	}
15768c2ecf20Sopenharmony_ci	if (adev->cg_flags & AMD_CG_SUPPORT_BIF_MGCG) {
15778c2ecf20Sopenharmony_ci		if (state == AMD_CG_STATE_UNGATE)
15788c2ecf20Sopenharmony_ci			pp_state = 0;
15798c2ecf20Sopenharmony_ci		else
15808c2ecf20Sopenharmony_ci			pp_state = PP_STATE_CG;
15818c2ecf20Sopenharmony_ci
15828c2ecf20Sopenharmony_ci		msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
15838c2ecf20Sopenharmony_ci			       PP_BLOCK_SYS_BIF,
15848c2ecf20Sopenharmony_ci			       PP_STATE_SUPPORT_CG,
15858c2ecf20Sopenharmony_ci			       pp_state);
15868c2ecf20Sopenharmony_ci		amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
15878c2ecf20Sopenharmony_ci	}
15888c2ecf20Sopenharmony_ci
15898c2ecf20Sopenharmony_ci	if (adev->cg_flags & AMD_CG_SUPPORT_DRM_LS) {
15908c2ecf20Sopenharmony_ci
15918c2ecf20Sopenharmony_ci		if (state == AMD_CG_STATE_UNGATE)
15928c2ecf20Sopenharmony_ci			pp_state = 0;
15938c2ecf20Sopenharmony_ci		else
15948c2ecf20Sopenharmony_ci			pp_state = PP_STATE_LS;
15958c2ecf20Sopenharmony_ci
15968c2ecf20Sopenharmony_ci		msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
15978c2ecf20Sopenharmony_ci			       PP_BLOCK_SYS_DRM,
15988c2ecf20Sopenharmony_ci			       PP_STATE_SUPPORT_LS,
15998c2ecf20Sopenharmony_ci			       pp_state);
16008c2ecf20Sopenharmony_ci		amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
16018c2ecf20Sopenharmony_ci	}
16028c2ecf20Sopenharmony_ci
16038c2ecf20Sopenharmony_ci	if (adev->cg_flags & AMD_CG_SUPPORT_ROM_MGCG) {
16048c2ecf20Sopenharmony_ci
16058c2ecf20Sopenharmony_ci		if (state == AMD_CG_STATE_UNGATE)
16068c2ecf20Sopenharmony_ci			pp_state = 0;
16078c2ecf20Sopenharmony_ci		else
16088c2ecf20Sopenharmony_ci			pp_state = PP_STATE_CG;
16098c2ecf20Sopenharmony_ci
16108c2ecf20Sopenharmony_ci		msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
16118c2ecf20Sopenharmony_ci			       PP_BLOCK_SYS_ROM,
16128c2ecf20Sopenharmony_ci			       PP_STATE_SUPPORT_CG,
16138c2ecf20Sopenharmony_ci			       pp_state);
16148c2ecf20Sopenharmony_ci		amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
16158c2ecf20Sopenharmony_ci	}
16168c2ecf20Sopenharmony_ci	return 0;
16178c2ecf20Sopenharmony_ci}
16188c2ecf20Sopenharmony_ci
16198c2ecf20Sopenharmony_cistatic int vi_common_set_clockgating_state(void *handle,
16208c2ecf20Sopenharmony_ci					   enum amd_clockgating_state state)
16218c2ecf20Sopenharmony_ci{
16228c2ecf20Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
16238c2ecf20Sopenharmony_ci
16248c2ecf20Sopenharmony_ci	if (amdgpu_sriov_vf(adev))
16258c2ecf20Sopenharmony_ci		return 0;
16268c2ecf20Sopenharmony_ci
16278c2ecf20Sopenharmony_ci	switch (adev->asic_type) {
16288c2ecf20Sopenharmony_ci	case CHIP_FIJI:
16298c2ecf20Sopenharmony_ci		vi_update_bif_medium_grain_light_sleep(adev,
16308c2ecf20Sopenharmony_ci				state == AMD_CG_STATE_GATE);
16318c2ecf20Sopenharmony_ci		vi_update_hdp_medium_grain_clock_gating(adev,
16328c2ecf20Sopenharmony_ci				state == AMD_CG_STATE_GATE);
16338c2ecf20Sopenharmony_ci		vi_update_hdp_light_sleep(adev,
16348c2ecf20Sopenharmony_ci				state == AMD_CG_STATE_GATE);
16358c2ecf20Sopenharmony_ci		vi_update_rom_medium_grain_clock_gating(adev,
16368c2ecf20Sopenharmony_ci				state == AMD_CG_STATE_GATE);
16378c2ecf20Sopenharmony_ci		break;
16388c2ecf20Sopenharmony_ci	case CHIP_CARRIZO:
16398c2ecf20Sopenharmony_ci	case CHIP_STONEY:
16408c2ecf20Sopenharmony_ci		vi_update_bif_medium_grain_light_sleep(adev,
16418c2ecf20Sopenharmony_ci				state == AMD_CG_STATE_GATE);
16428c2ecf20Sopenharmony_ci		vi_update_hdp_medium_grain_clock_gating(adev,
16438c2ecf20Sopenharmony_ci				state == AMD_CG_STATE_GATE);
16448c2ecf20Sopenharmony_ci		vi_update_hdp_light_sleep(adev,
16458c2ecf20Sopenharmony_ci				state == AMD_CG_STATE_GATE);
16468c2ecf20Sopenharmony_ci		vi_update_drm_light_sleep(adev,
16478c2ecf20Sopenharmony_ci				state == AMD_CG_STATE_GATE);
16488c2ecf20Sopenharmony_ci		break;
16498c2ecf20Sopenharmony_ci	case CHIP_TONGA:
16508c2ecf20Sopenharmony_ci	case CHIP_POLARIS10:
16518c2ecf20Sopenharmony_ci	case CHIP_POLARIS11:
16528c2ecf20Sopenharmony_ci	case CHIP_POLARIS12:
16538c2ecf20Sopenharmony_ci	case CHIP_VEGAM:
16548c2ecf20Sopenharmony_ci		vi_common_set_clockgating_state_by_smu(adev, state);
16558c2ecf20Sopenharmony_ci	default:
16568c2ecf20Sopenharmony_ci		break;
16578c2ecf20Sopenharmony_ci	}
16588c2ecf20Sopenharmony_ci	return 0;
16598c2ecf20Sopenharmony_ci}
16608c2ecf20Sopenharmony_ci
16618c2ecf20Sopenharmony_cistatic int vi_common_set_powergating_state(void *handle,
16628c2ecf20Sopenharmony_ci					    enum amd_powergating_state state)
16638c2ecf20Sopenharmony_ci{
16648c2ecf20Sopenharmony_ci	return 0;
16658c2ecf20Sopenharmony_ci}
16668c2ecf20Sopenharmony_ci
16678c2ecf20Sopenharmony_cistatic void vi_common_get_clockgating_state(void *handle, u32 *flags)
16688c2ecf20Sopenharmony_ci{
16698c2ecf20Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
16708c2ecf20Sopenharmony_ci	int data;
16718c2ecf20Sopenharmony_ci
16728c2ecf20Sopenharmony_ci	if (amdgpu_sriov_vf(adev))
16738c2ecf20Sopenharmony_ci		*flags = 0;
16748c2ecf20Sopenharmony_ci
16758c2ecf20Sopenharmony_ci	/* AMD_CG_SUPPORT_BIF_LS */
16768c2ecf20Sopenharmony_ci	data = RREG32_PCIE(ixPCIE_CNTL2);
16778c2ecf20Sopenharmony_ci	if (data & PCIE_CNTL2__SLV_MEM_LS_EN_MASK)
16788c2ecf20Sopenharmony_ci		*flags |= AMD_CG_SUPPORT_BIF_LS;
16798c2ecf20Sopenharmony_ci
16808c2ecf20Sopenharmony_ci	/* AMD_CG_SUPPORT_HDP_LS */
16818c2ecf20Sopenharmony_ci	data = RREG32(mmHDP_MEM_POWER_LS);
16828c2ecf20Sopenharmony_ci	if (data & HDP_MEM_POWER_LS__LS_ENABLE_MASK)
16838c2ecf20Sopenharmony_ci		*flags |= AMD_CG_SUPPORT_HDP_LS;
16848c2ecf20Sopenharmony_ci
16858c2ecf20Sopenharmony_ci	/* AMD_CG_SUPPORT_HDP_MGCG */
16868c2ecf20Sopenharmony_ci	data = RREG32(mmHDP_HOST_PATH_CNTL);
16878c2ecf20Sopenharmony_ci	if (!(data & HDP_HOST_PATH_CNTL__CLOCK_GATING_DIS_MASK))
16888c2ecf20Sopenharmony_ci		*flags |= AMD_CG_SUPPORT_HDP_MGCG;
16898c2ecf20Sopenharmony_ci
16908c2ecf20Sopenharmony_ci	/* AMD_CG_SUPPORT_ROM_MGCG */
16918c2ecf20Sopenharmony_ci	data = RREG32_SMC(ixCGTT_ROM_CLK_CTRL0);
16928c2ecf20Sopenharmony_ci	if (!(data & CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE0_MASK))
16938c2ecf20Sopenharmony_ci		*flags |= AMD_CG_SUPPORT_ROM_MGCG;
16948c2ecf20Sopenharmony_ci}
16958c2ecf20Sopenharmony_ci
16968c2ecf20Sopenharmony_cistatic const struct amd_ip_funcs vi_common_ip_funcs = {
16978c2ecf20Sopenharmony_ci	.name = "vi_common",
16988c2ecf20Sopenharmony_ci	.early_init = vi_common_early_init,
16998c2ecf20Sopenharmony_ci	.late_init = vi_common_late_init,
17008c2ecf20Sopenharmony_ci	.sw_init = vi_common_sw_init,
17018c2ecf20Sopenharmony_ci	.sw_fini = vi_common_sw_fini,
17028c2ecf20Sopenharmony_ci	.hw_init = vi_common_hw_init,
17038c2ecf20Sopenharmony_ci	.hw_fini = vi_common_hw_fini,
17048c2ecf20Sopenharmony_ci	.suspend = vi_common_suspend,
17058c2ecf20Sopenharmony_ci	.resume = vi_common_resume,
17068c2ecf20Sopenharmony_ci	.is_idle = vi_common_is_idle,
17078c2ecf20Sopenharmony_ci	.wait_for_idle = vi_common_wait_for_idle,
17088c2ecf20Sopenharmony_ci	.soft_reset = vi_common_soft_reset,
17098c2ecf20Sopenharmony_ci	.set_clockgating_state = vi_common_set_clockgating_state,
17108c2ecf20Sopenharmony_ci	.set_powergating_state = vi_common_set_powergating_state,
17118c2ecf20Sopenharmony_ci	.get_clockgating_state = vi_common_get_clockgating_state,
17128c2ecf20Sopenharmony_ci};
17138c2ecf20Sopenharmony_ci
17148c2ecf20Sopenharmony_cistatic const struct amdgpu_ip_block_version vi_common_ip_block =
17158c2ecf20Sopenharmony_ci{
17168c2ecf20Sopenharmony_ci	.type = AMD_IP_BLOCK_TYPE_COMMON,
17178c2ecf20Sopenharmony_ci	.major = 1,
17188c2ecf20Sopenharmony_ci	.minor = 0,
17198c2ecf20Sopenharmony_ci	.rev = 0,
17208c2ecf20Sopenharmony_ci	.funcs = &vi_common_ip_funcs,
17218c2ecf20Sopenharmony_ci};
17228c2ecf20Sopenharmony_ci
17238c2ecf20Sopenharmony_civoid vi_set_virt_ops(struct amdgpu_device *adev)
17248c2ecf20Sopenharmony_ci{
17258c2ecf20Sopenharmony_ci	adev->virt.ops = &xgpu_vi_virt_ops;
17268c2ecf20Sopenharmony_ci}
17278c2ecf20Sopenharmony_ci
17288c2ecf20Sopenharmony_ciint vi_set_ip_blocks(struct amdgpu_device *adev)
17298c2ecf20Sopenharmony_ci{
17308c2ecf20Sopenharmony_ci	switch (adev->asic_type) {
17318c2ecf20Sopenharmony_ci	case CHIP_TOPAZ:
17328c2ecf20Sopenharmony_ci		/* topaz has no DCE, UVD, VCE */
17338c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
17348c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v7_4_ip_block);
17358c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &iceland_ih_ip_block);
17368c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
17378c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &sdma_v2_4_ip_block);
17388c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
17398c2ecf20Sopenharmony_ci		if (adev->enable_virtual_display)
17408c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
17418c2ecf20Sopenharmony_ci		break;
17428c2ecf20Sopenharmony_ci	case CHIP_FIJI:
17438c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
17448c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v8_5_ip_block);
17458c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block);
17468c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
17478c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
17488c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
17498c2ecf20Sopenharmony_ci		if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
17508c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
17518c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC)
17528c2ecf20Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
17538c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
17548c2ecf20Sopenharmony_ci#endif
17558c2ecf20Sopenharmony_ci		else
17568c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v10_1_ip_block);
17578c2ecf20Sopenharmony_ci		if (!amdgpu_sriov_vf(adev)) {
17588c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &uvd_v6_0_ip_block);
17598c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &vce_v3_0_ip_block);
17608c2ecf20Sopenharmony_ci		}
17618c2ecf20Sopenharmony_ci		break;
17628c2ecf20Sopenharmony_ci	case CHIP_TONGA:
17638c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
17648c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block);
17658c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block);
17668c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
17678c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
17688c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
17698c2ecf20Sopenharmony_ci		if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
17708c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
17718c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC)
17728c2ecf20Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
17738c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
17748c2ecf20Sopenharmony_ci#endif
17758c2ecf20Sopenharmony_ci		else
17768c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v10_0_ip_block);
17778c2ecf20Sopenharmony_ci		if (!amdgpu_sriov_vf(adev)) {
17788c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &uvd_v5_0_ip_block);
17798c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &vce_v3_0_ip_block);
17808c2ecf20Sopenharmony_ci		}
17818c2ecf20Sopenharmony_ci		break;
17828c2ecf20Sopenharmony_ci	case CHIP_POLARIS10:
17838c2ecf20Sopenharmony_ci	case CHIP_POLARIS11:
17848c2ecf20Sopenharmony_ci	case CHIP_POLARIS12:
17858c2ecf20Sopenharmony_ci	case CHIP_VEGAM:
17868c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
17878c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v8_1_ip_block);
17888c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block);
17898c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
17908c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &sdma_v3_1_ip_block);
17918c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
17928c2ecf20Sopenharmony_ci		if (adev->enable_virtual_display)
17938c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
17948c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC)
17958c2ecf20Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
17968c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
17978c2ecf20Sopenharmony_ci#endif
17988c2ecf20Sopenharmony_ci		else
17998c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v11_2_ip_block);
18008c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &uvd_v6_3_ip_block);
18018c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vce_v3_4_ip_block);
18028c2ecf20Sopenharmony_ci		break;
18038c2ecf20Sopenharmony_ci	case CHIP_CARRIZO:
18048c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
18058c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block);
18068c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cz_ih_ip_block);
18078c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
18088c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
18098c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
18108c2ecf20Sopenharmony_ci		if (adev->enable_virtual_display)
18118c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
18128c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC)
18138c2ecf20Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
18148c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
18158c2ecf20Sopenharmony_ci#endif
18168c2ecf20Sopenharmony_ci		else
18178c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v11_0_ip_block);
18188c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &uvd_v6_0_ip_block);
18198c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vce_v3_1_ip_block);
18208c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_ACP)
18218c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &acp_ip_block);
18228c2ecf20Sopenharmony_ci#endif
18238c2ecf20Sopenharmony_ci		break;
18248c2ecf20Sopenharmony_ci	case CHIP_STONEY:
18258c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
18268c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block);
18278c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cz_ih_ip_block);
18288c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v8_1_ip_block);
18298c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
18308c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
18318c2ecf20Sopenharmony_ci		if (adev->enable_virtual_display)
18328c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
18338c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC)
18348c2ecf20Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
18358c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
18368c2ecf20Sopenharmony_ci#endif
18378c2ecf20Sopenharmony_ci		else
18388c2ecf20Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v11_0_ip_block);
18398c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &uvd_v6_2_ip_block);
18408c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vce_v3_4_ip_block);
18418c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_ACP)
18428c2ecf20Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &acp_ip_block);
18438c2ecf20Sopenharmony_ci#endif
18448c2ecf20Sopenharmony_ci		break;
18458c2ecf20Sopenharmony_ci	default:
18468c2ecf20Sopenharmony_ci		/* FIXME: not supported yet */
18478c2ecf20Sopenharmony_ci		return -EINVAL;
18488c2ecf20Sopenharmony_ci	}
18498c2ecf20Sopenharmony_ci
18508c2ecf20Sopenharmony_ci	return 0;
18518c2ecf20Sopenharmony_ci}
18528c2ecf20Sopenharmony_ci
18538c2ecf20Sopenharmony_civoid legacy_doorbell_index_init(struct amdgpu_device *adev)
18548c2ecf20Sopenharmony_ci{
18558c2ecf20Sopenharmony_ci	adev->doorbell_index.kiq = AMDGPU_DOORBELL_KIQ;
18568c2ecf20Sopenharmony_ci	adev->doorbell_index.mec_ring0 = AMDGPU_DOORBELL_MEC_RING0;
18578c2ecf20Sopenharmony_ci	adev->doorbell_index.mec_ring1 = AMDGPU_DOORBELL_MEC_RING1;
18588c2ecf20Sopenharmony_ci	adev->doorbell_index.mec_ring2 = AMDGPU_DOORBELL_MEC_RING2;
18598c2ecf20Sopenharmony_ci	adev->doorbell_index.mec_ring3 = AMDGPU_DOORBELL_MEC_RING3;
18608c2ecf20Sopenharmony_ci	adev->doorbell_index.mec_ring4 = AMDGPU_DOORBELL_MEC_RING4;
18618c2ecf20Sopenharmony_ci	adev->doorbell_index.mec_ring5 = AMDGPU_DOORBELL_MEC_RING5;
18628c2ecf20Sopenharmony_ci	adev->doorbell_index.mec_ring6 = AMDGPU_DOORBELL_MEC_RING6;
18638c2ecf20Sopenharmony_ci	adev->doorbell_index.mec_ring7 = AMDGPU_DOORBELL_MEC_RING7;
18648c2ecf20Sopenharmony_ci	adev->doorbell_index.gfx_ring0 = AMDGPU_DOORBELL_GFX_RING0;
18658c2ecf20Sopenharmony_ci	adev->doorbell_index.sdma_engine[0] = AMDGPU_DOORBELL_sDMA_ENGINE0;
18668c2ecf20Sopenharmony_ci	adev->doorbell_index.sdma_engine[1] = AMDGPU_DOORBELL_sDMA_ENGINE1;
18678c2ecf20Sopenharmony_ci	adev->doorbell_index.ih = AMDGPU_DOORBELL_IH;
18688c2ecf20Sopenharmony_ci	adev->doorbell_index.max_assignment = AMDGPU_DOORBELL_MAX_ASSIGNMENT;
18698c2ecf20Sopenharmony_ci}
1870