162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Copyright 2014 Advanced Micro Devices, Inc.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
562306a36Sopenharmony_ci * copy of this software and associated documentation files (the "Software"),
662306a36Sopenharmony_ci * to deal in the Software without restriction, including without limitation
762306a36Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
862306a36Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
962306a36Sopenharmony_ci * Software is furnished to do so, subject to the following conditions:
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci * The above copyright notice and this permission notice shall be included in
1262306a36Sopenharmony_ci * all copies or substantial portions of the Software.
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1562306a36Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1662306a36Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1762306a36Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1862306a36Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1962306a36Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2062306a36Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE.
2162306a36Sopenharmony_ci *
2262306a36Sopenharmony_ci */
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#include <linux/pci.h>
2562306a36Sopenharmony_ci#include <linux/slab.h>
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#include <drm/amdgpu_drm.h>
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#include "amdgpu.h"
3062306a36Sopenharmony_ci#include "amdgpu_atombios.h"
3162306a36Sopenharmony_ci#include "amdgpu_ih.h"
3262306a36Sopenharmony_ci#include "amdgpu_uvd.h"
3362306a36Sopenharmony_ci#include "amdgpu_vce.h"
3462306a36Sopenharmony_ci#include "amdgpu_ucode.h"
3562306a36Sopenharmony_ci#include "atom.h"
3662306a36Sopenharmony_ci#include "amd_pcie.h"
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#include "gmc/gmc_8_1_d.h"
3962306a36Sopenharmony_ci#include "gmc/gmc_8_1_sh_mask.h"
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#include "oss/oss_3_0_d.h"
4262306a36Sopenharmony_ci#include "oss/oss_3_0_sh_mask.h"
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#include "bif/bif_5_0_d.h"
4562306a36Sopenharmony_ci#include "bif/bif_5_0_sh_mask.h"
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#include "gca/gfx_8_0_d.h"
4862306a36Sopenharmony_ci#include "gca/gfx_8_0_sh_mask.h"
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#include "smu/smu_7_1_1_d.h"
5162306a36Sopenharmony_ci#include "smu/smu_7_1_1_sh_mask.h"
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#include "uvd/uvd_5_0_d.h"
5462306a36Sopenharmony_ci#include "uvd/uvd_5_0_sh_mask.h"
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#include "vce/vce_3_0_d.h"
5762306a36Sopenharmony_ci#include "vce/vce_3_0_sh_mask.h"
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#include "dce/dce_10_0_d.h"
6062306a36Sopenharmony_ci#include "dce/dce_10_0_sh_mask.h"
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#include "vid.h"
6362306a36Sopenharmony_ci#include "vi.h"
6462306a36Sopenharmony_ci#include "gmc_v8_0.h"
6562306a36Sopenharmony_ci#include "gmc_v7_0.h"
6662306a36Sopenharmony_ci#include "gfx_v8_0.h"
6762306a36Sopenharmony_ci#include "sdma_v2_4.h"
6862306a36Sopenharmony_ci#include "sdma_v3_0.h"
6962306a36Sopenharmony_ci#include "dce_v10_0.h"
7062306a36Sopenharmony_ci#include "dce_v11_0.h"
7162306a36Sopenharmony_ci#include "iceland_ih.h"
7262306a36Sopenharmony_ci#include "tonga_ih.h"
7362306a36Sopenharmony_ci#include "cz_ih.h"
7462306a36Sopenharmony_ci#include "uvd_v5_0.h"
7562306a36Sopenharmony_ci#include "uvd_v6_0.h"
7662306a36Sopenharmony_ci#include "vce_v3_0.h"
7762306a36Sopenharmony_ci#if defined(CONFIG_DRM_AMD_ACP)
7862306a36Sopenharmony_ci#include "amdgpu_acp.h"
7962306a36Sopenharmony_ci#endif
8062306a36Sopenharmony_ci#include "amdgpu_vkms.h"
8162306a36Sopenharmony_ci#include "mxgpu_vi.h"
8262306a36Sopenharmony_ci#include "amdgpu_dm.h"
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci#define ixPCIE_LC_L1_PM_SUBSTATE	0x100100C6
8562306a36Sopenharmony_ci#define PCIE_LC_L1_PM_SUBSTATE__LC_L1_SUBSTATES_OVERRIDE_EN_MASK	0x00000001L
8662306a36Sopenharmony_ci#define PCIE_LC_L1_PM_SUBSTATE__LC_PCI_PM_L1_2_OVERRIDE_MASK	0x00000002L
8762306a36Sopenharmony_ci#define PCIE_LC_L1_PM_SUBSTATE__LC_PCI_PM_L1_1_OVERRIDE_MASK	0x00000004L
8862306a36Sopenharmony_ci#define PCIE_LC_L1_PM_SUBSTATE__LC_ASPM_L1_2_OVERRIDE_MASK		0x00000008L
8962306a36Sopenharmony_ci#define PCIE_LC_L1_PM_SUBSTATE__LC_ASPM_L1_1_OVERRIDE_MASK		0x00000010L
9062306a36Sopenharmony_ci#define ixPCIE_L1_PM_SUB_CNTL	0x378
9162306a36Sopenharmony_ci#define PCIE_L1_PM_SUB_CNTL__ASPM_L1_2_EN_MASK	0x00000004L
9262306a36Sopenharmony_ci#define PCIE_L1_PM_SUB_CNTL__ASPM_L1_1_EN_MASK	0x00000008L
9362306a36Sopenharmony_ci#define PCIE_L1_PM_SUB_CNTL__PCI_PM_L1_2_EN_MASK	0x00000001L
9462306a36Sopenharmony_ci#define PCIE_L1_PM_SUB_CNTL__PCI_PM_L1_1_EN_MASK	0x00000002L
9562306a36Sopenharmony_ci#define PCIE_LC_CNTL6__LC_L1_POWERDOWN_MASK		0x00200000L
9662306a36Sopenharmony_ci#define LINK_CAP	0x64
9762306a36Sopenharmony_ci#define PCIE_LINK_CAP__CLOCK_POWER_MANAGEMENT_MASK	0x00040000L
9862306a36Sopenharmony_ci#define ixCPM_CONTROL	0x1400118
9962306a36Sopenharmony_ci#define ixPCIE_LC_CNTL7	0x100100BC
10062306a36Sopenharmony_ci#define PCIE_LC_CNTL7__LC_L1_SIDEBAND_CLKREQ_PDWN_EN_MASK	0x00000400L
10162306a36Sopenharmony_ci#define PCIE_LC_CNTL__LC_L0S_INACTIVITY_DEFAULT	0x00000007
10262306a36Sopenharmony_ci#define PCIE_LC_CNTL__LC_L1_INACTIVITY_DEFAULT	0x00000009
10362306a36Sopenharmony_ci#define CPM_CONTROL__CLKREQb_UNGATE_TXCLK_ENABLE_MASK	0x01000000L
10462306a36Sopenharmony_ci#define PCIE_L1_PM_SUB_CNTL	0x378
10562306a36Sopenharmony_ci#define ASIC_IS_P22(asic_type, rid)	((asic_type >= CHIP_POLARIS10) && \
10662306a36Sopenharmony_ci									(asic_type <= CHIP_POLARIS12) && \
10762306a36Sopenharmony_ci									(rid >= 0x6E))
10862306a36Sopenharmony_ci/* Topaz */
10962306a36Sopenharmony_cistatic const struct amdgpu_video_codecs topaz_video_codecs_encode =
11062306a36Sopenharmony_ci{
11162306a36Sopenharmony_ci	.codec_count = 0,
11262306a36Sopenharmony_ci	.codec_array = NULL,
11362306a36Sopenharmony_ci};
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci/* Tonga, CZ, ST, Fiji */
11662306a36Sopenharmony_cistatic const struct amdgpu_video_codec_info tonga_video_codecs_encode_array[] =
11762306a36Sopenharmony_ci{
11862306a36Sopenharmony_ci	{
11962306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
12062306a36Sopenharmony_ci		.max_width = 4096,
12162306a36Sopenharmony_ci		.max_height = 2304,
12262306a36Sopenharmony_ci		.max_pixels_per_frame = 4096 * 2304,
12362306a36Sopenharmony_ci		.max_level = 0,
12462306a36Sopenharmony_ci	},
12562306a36Sopenharmony_ci};
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_cistatic const struct amdgpu_video_codecs tonga_video_codecs_encode =
12862306a36Sopenharmony_ci{
12962306a36Sopenharmony_ci	.codec_count = ARRAY_SIZE(tonga_video_codecs_encode_array),
13062306a36Sopenharmony_ci	.codec_array = tonga_video_codecs_encode_array,
13162306a36Sopenharmony_ci};
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci/* Polaris */
13462306a36Sopenharmony_cistatic const struct amdgpu_video_codec_info polaris_video_codecs_encode_array[] =
13562306a36Sopenharmony_ci{
13662306a36Sopenharmony_ci	{
13762306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
13862306a36Sopenharmony_ci		.max_width = 4096,
13962306a36Sopenharmony_ci		.max_height = 2304,
14062306a36Sopenharmony_ci		.max_pixels_per_frame = 4096 * 2304,
14162306a36Sopenharmony_ci		.max_level = 0,
14262306a36Sopenharmony_ci	},
14362306a36Sopenharmony_ci	{
14462306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC,
14562306a36Sopenharmony_ci		.max_width = 4096,
14662306a36Sopenharmony_ci		.max_height = 2304,
14762306a36Sopenharmony_ci		.max_pixels_per_frame = 4096 * 2304,
14862306a36Sopenharmony_ci		.max_level = 0,
14962306a36Sopenharmony_ci	},
15062306a36Sopenharmony_ci};
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_cistatic const struct amdgpu_video_codecs polaris_video_codecs_encode =
15362306a36Sopenharmony_ci{
15462306a36Sopenharmony_ci	.codec_count = ARRAY_SIZE(polaris_video_codecs_encode_array),
15562306a36Sopenharmony_ci	.codec_array = polaris_video_codecs_encode_array,
15662306a36Sopenharmony_ci};
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci/* Topaz */
15962306a36Sopenharmony_cistatic const struct amdgpu_video_codecs topaz_video_codecs_decode =
16062306a36Sopenharmony_ci{
16162306a36Sopenharmony_ci	.codec_count = 0,
16262306a36Sopenharmony_ci	.codec_array = NULL,
16362306a36Sopenharmony_ci};
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci/* Tonga */
16662306a36Sopenharmony_cistatic const struct amdgpu_video_codec_info tonga_video_codecs_decode_array[] =
16762306a36Sopenharmony_ci{
16862306a36Sopenharmony_ci	{
16962306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
17062306a36Sopenharmony_ci		.max_width = 4096,
17162306a36Sopenharmony_ci		.max_height = 4096,
17262306a36Sopenharmony_ci		.max_pixels_per_frame = 4096 * 4096,
17362306a36Sopenharmony_ci		.max_level = 3,
17462306a36Sopenharmony_ci	},
17562306a36Sopenharmony_ci	{
17662306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
17762306a36Sopenharmony_ci		.max_width = 4096,
17862306a36Sopenharmony_ci		.max_height = 4096,
17962306a36Sopenharmony_ci		.max_pixels_per_frame = 4096 * 4096,
18062306a36Sopenharmony_ci		.max_level = 5,
18162306a36Sopenharmony_ci	},
18262306a36Sopenharmony_ci	{
18362306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
18462306a36Sopenharmony_ci		.max_width = 4096,
18562306a36Sopenharmony_ci		.max_height = 4096,
18662306a36Sopenharmony_ci		.max_pixels_per_frame = 4096 * 4096,
18762306a36Sopenharmony_ci		.max_level = 52,
18862306a36Sopenharmony_ci	},
18962306a36Sopenharmony_ci	{
19062306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
19162306a36Sopenharmony_ci		.max_width = 4096,
19262306a36Sopenharmony_ci		.max_height = 4096,
19362306a36Sopenharmony_ci		.max_pixels_per_frame = 4096 * 4096,
19462306a36Sopenharmony_ci		.max_level = 4,
19562306a36Sopenharmony_ci	},
19662306a36Sopenharmony_ci};
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_cistatic const struct amdgpu_video_codecs tonga_video_codecs_decode =
19962306a36Sopenharmony_ci{
20062306a36Sopenharmony_ci	.codec_count = ARRAY_SIZE(tonga_video_codecs_decode_array),
20162306a36Sopenharmony_ci	.codec_array = tonga_video_codecs_decode_array,
20262306a36Sopenharmony_ci};
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci/* CZ, ST, Fiji, Polaris */
20562306a36Sopenharmony_cistatic const struct amdgpu_video_codec_info cz_video_codecs_decode_array[] =
20662306a36Sopenharmony_ci{
20762306a36Sopenharmony_ci	{
20862306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
20962306a36Sopenharmony_ci		.max_width = 4096,
21062306a36Sopenharmony_ci		.max_height = 4096,
21162306a36Sopenharmony_ci		.max_pixels_per_frame = 4096 * 4096,
21262306a36Sopenharmony_ci		.max_level = 3,
21362306a36Sopenharmony_ci	},
21462306a36Sopenharmony_ci	{
21562306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
21662306a36Sopenharmony_ci		.max_width = 4096,
21762306a36Sopenharmony_ci		.max_height = 4096,
21862306a36Sopenharmony_ci		.max_pixels_per_frame = 4096 * 4096,
21962306a36Sopenharmony_ci		.max_level = 5,
22062306a36Sopenharmony_ci	},
22162306a36Sopenharmony_ci	{
22262306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
22362306a36Sopenharmony_ci		.max_width = 4096,
22462306a36Sopenharmony_ci		.max_height = 4096,
22562306a36Sopenharmony_ci		.max_pixels_per_frame = 4096 * 4096,
22662306a36Sopenharmony_ci		.max_level = 52,
22762306a36Sopenharmony_ci	},
22862306a36Sopenharmony_ci	{
22962306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
23062306a36Sopenharmony_ci		.max_width = 4096,
23162306a36Sopenharmony_ci		.max_height = 4096,
23262306a36Sopenharmony_ci		.max_pixels_per_frame = 4096 * 4096,
23362306a36Sopenharmony_ci		.max_level = 4,
23462306a36Sopenharmony_ci	},
23562306a36Sopenharmony_ci	{
23662306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC,
23762306a36Sopenharmony_ci		.max_width = 4096,
23862306a36Sopenharmony_ci		.max_height = 4096,
23962306a36Sopenharmony_ci		.max_pixels_per_frame = 4096 * 4096,
24062306a36Sopenharmony_ci		.max_level = 186,
24162306a36Sopenharmony_ci	},
24262306a36Sopenharmony_ci	{
24362306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG,
24462306a36Sopenharmony_ci		.max_width = 4096,
24562306a36Sopenharmony_ci		.max_height = 4096,
24662306a36Sopenharmony_ci		.max_pixels_per_frame = 4096 * 4096,
24762306a36Sopenharmony_ci		.max_level = 0,
24862306a36Sopenharmony_ci	},
24962306a36Sopenharmony_ci};
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_cistatic const struct amdgpu_video_codecs cz_video_codecs_decode =
25262306a36Sopenharmony_ci{
25362306a36Sopenharmony_ci	.codec_count = ARRAY_SIZE(cz_video_codecs_decode_array),
25462306a36Sopenharmony_ci	.codec_array = cz_video_codecs_decode_array,
25562306a36Sopenharmony_ci};
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_cistatic int vi_query_video_codecs(struct amdgpu_device *adev, bool encode,
25862306a36Sopenharmony_ci				 const struct amdgpu_video_codecs **codecs)
25962306a36Sopenharmony_ci{
26062306a36Sopenharmony_ci	switch (adev->asic_type) {
26162306a36Sopenharmony_ci	case CHIP_TOPAZ:
26262306a36Sopenharmony_ci		if (encode)
26362306a36Sopenharmony_ci			*codecs = &topaz_video_codecs_encode;
26462306a36Sopenharmony_ci		else
26562306a36Sopenharmony_ci			*codecs = &topaz_video_codecs_decode;
26662306a36Sopenharmony_ci		return 0;
26762306a36Sopenharmony_ci	case CHIP_TONGA:
26862306a36Sopenharmony_ci		if (encode)
26962306a36Sopenharmony_ci			*codecs = &tonga_video_codecs_encode;
27062306a36Sopenharmony_ci		else
27162306a36Sopenharmony_ci			*codecs = &tonga_video_codecs_decode;
27262306a36Sopenharmony_ci		return 0;
27362306a36Sopenharmony_ci	case CHIP_POLARIS10:
27462306a36Sopenharmony_ci	case CHIP_POLARIS11:
27562306a36Sopenharmony_ci	case CHIP_POLARIS12:
27662306a36Sopenharmony_ci	case CHIP_VEGAM:
27762306a36Sopenharmony_ci		if (encode)
27862306a36Sopenharmony_ci			*codecs = &polaris_video_codecs_encode;
27962306a36Sopenharmony_ci		else
28062306a36Sopenharmony_ci			*codecs = &cz_video_codecs_decode;
28162306a36Sopenharmony_ci		return 0;
28262306a36Sopenharmony_ci	case CHIP_FIJI:
28362306a36Sopenharmony_ci	case CHIP_CARRIZO:
28462306a36Sopenharmony_ci	case CHIP_STONEY:
28562306a36Sopenharmony_ci		if (encode)
28662306a36Sopenharmony_ci			*codecs = &tonga_video_codecs_encode;
28762306a36Sopenharmony_ci		else
28862306a36Sopenharmony_ci			*codecs = &cz_video_codecs_decode;
28962306a36Sopenharmony_ci		return 0;
29062306a36Sopenharmony_ci	default:
29162306a36Sopenharmony_ci		return -EINVAL;
29262306a36Sopenharmony_ci	}
29362306a36Sopenharmony_ci}
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci/*
29662306a36Sopenharmony_ci * Indirect registers accessor
29762306a36Sopenharmony_ci */
29862306a36Sopenharmony_cistatic u32 vi_pcie_rreg(struct amdgpu_device *adev, u32 reg)
29962306a36Sopenharmony_ci{
30062306a36Sopenharmony_ci	unsigned long flags;
30162306a36Sopenharmony_ci	u32 r;
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
30462306a36Sopenharmony_ci	WREG32_NO_KIQ(mmPCIE_INDEX, reg);
30562306a36Sopenharmony_ci	(void)RREG32_NO_KIQ(mmPCIE_INDEX);
30662306a36Sopenharmony_ci	r = RREG32_NO_KIQ(mmPCIE_DATA);
30762306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
30862306a36Sopenharmony_ci	return r;
30962306a36Sopenharmony_ci}
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_cistatic void vi_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
31262306a36Sopenharmony_ci{
31362306a36Sopenharmony_ci	unsigned long flags;
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ci	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
31662306a36Sopenharmony_ci	WREG32_NO_KIQ(mmPCIE_INDEX, reg);
31762306a36Sopenharmony_ci	(void)RREG32_NO_KIQ(mmPCIE_INDEX);
31862306a36Sopenharmony_ci	WREG32_NO_KIQ(mmPCIE_DATA, v);
31962306a36Sopenharmony_ci	(void)RREG32_NO_KIQ(mmPCIE_DATA);
32062306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
32162306a36Sopenharmony_ci}
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_cistatic u32 vi_smc_rreg(struct amdgpu_device *adev, u32 reg)
32462306a36Sopenharmony_ci{
32562306a36Sopenharmony_ci	unsigned long flags;
32662306a36Sopenharmony_ci	u32 r;
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci	spin_lock_irqsave(&adev->smc_idx_lock, flags);
32962306a36Sopenharmony_ci	WREG32_NO_KIQ(mmSMC_IND_INDEX_11, (reg));
33062306a36Sopenharmony_ci	r = RREG32_NO_KIQ(mmSMC_IND_DATA_11);
33162306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
33262306a36Sopenharmony_ci	return r;
33362306a36Sopenharmony_ci}
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_cistatic void vi_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
33662306a36Sopenharmony_ci{
33762306a36Sopenharmony_ci	unsigned long flags;
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci	spin_lock_irqsave(&adev->smc_idx_lock, flags);
34062306a36Sopenharmony_ci	WREG32_NO_KIQ(mmSMC_IND_INDEX_11, (reg));
34162306a36Sopenharmony_ci	WREG32_NO_KIQ(mmSMC_IND_DATA_11, (v));
34262306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
34362306a36Sopenharmony_ci}
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci/* smu_8_0_d.h */
34662306a36Sopenharmony_ci#define mmMP0PUB_IND_INDEX                                                      0x180
34762306a36Sopenharmony_ci#define mmMP0PUB_IND_DATA                                                       0x181
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_cistatic u32 cz_smc_rreg(struct amdgpu_device *adev, u32 reg)
35062306a36Sopenharmony_ci{
35162306a36Sopenharmony_ci	unsigned long flags;
35262306a36Sopenharmony_ci	u32 r;
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci	spin_lock_irqsave(&adev->smc_idx_lock, flags);
35562306a36Sopenharmony_ci	WREG32(mmMP0PUB_IND_INDEX, (reg));
35662306a36Sopenharmony_ci	r = RREG32(mmMP0PUB_IND_DATA);
35762306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
35862306a36Sopenharmony_ci	return r;
35962306a36Sopenharmony_ci}
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_cistatic void cz_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
36262306a36Sopenharmony_ci{
36362306a36Sopenharmony_ci	unsigned long flags;
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_ci	spin_lock_irqsave(&adev->smc_idx_lock, flags);
36662306a36Sopenharmony_ci	WREG32(mmMP0PUB_IND_INDEX, (reg));
36762306a36Sopenharmony_ci	WREG32(mmMP0PUB_IND_DATA, (v));
36862306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
36962306a36Sopenharmony_ci}
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_cistatic u32 vi_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
37262306a36Sopenharmony_ci{
37362306a36Sopenharmony_ci	unsigned long flags;
37462306a36Sopenharmony_ci	u32 r;
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
37762306a36Sopenharmony_ci	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
37862306a36Sopenharmony_ci	r = RREG32(mmUVD_CTX_DATA);
37962306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
38062306a36Sopenharmony_ci	return r;
38162306a36Sopenharmony_ci}
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_cistatic void vi_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
38462306a36Sopenharmony_ci{
38562306a36Sopenharmony_ci	unsigned long flags;
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ci	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
38862306a36Sopenharmony_ci	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
38962306a36Sopenharmony_ci	WREG32(mmUVD_CTX_DATA, (v));
39062306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
39162306a36Sopenharmony_ci}
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_cistatic u32 vi_didt_rreg(struct amdgpu_device *adev, u32 reg)
39462306a36Sopenharmony_ci{
39562306a36Sopenharmony_ci	unsigned long flags;
39662306a36Sopenharmony_ci	u32 r;
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci	spin_lock_irqsave(&adev->didt_idx_lock, flags);
39962306a36Sopenharmony_ci	WREG32(mmDIDT_IND_INDEX, (reg));
40062306a36Sopenharmony_ci	r = RREG32(mmDIDT_IND_DATA);
40162306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
40262306a36Sopenharmony_ci	return r;
40362306a36Sopenharmony_ci}
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_cistatic void vi_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
40662306a36Sopenharmony_ci{
40762306a36Sopenharmony_ci	unsigned long flags;
40862306a36Sopenharmony_ci
40962306a36Sopenharmony_ci	spin_lock_irqsave(&adev->didt_idx_lock, flags);
41062306a36Sopenharmony_ci	WREG32(mmDIDT_IND_INDEX, (reg));
41162306a36Sopenharmony_ci	WREG32(mmDIDT_IND_DATA, (v));
41262306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
41362306a36Sopenharmony_ci}
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_cistatic u32 vi_gc_cac_rreg(struct amdgpu_device *adev, u32 reg)
41662306a36Sopenharmony_ci{
41762306a36Sopenharmony_ci	unsigned long flags;
41862306a36Sopenharmony_ci	u32 r;
41962306a36Sopenharmony_ci
42062306a36Sopenharmony_ci	spin_lock_irqsave(&adev->gc_cac_idx_lock, flags);
42162306a36Sopenharmony_ci	WREG32(mmGC_CAC_IND_INDEX, (reg));
42262306a36Sopenharmony_ci	r = RREG32(mmGC_CAC_IND_DATA);
42362306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->gc_cac_idx_lock, flags);
42462306a36Sopenharmony_ci	return r;
42562306a36Sopenharmony_ci}
42662306a36Sopenharmony_ci
42762306a36Sopenharmony_cistatic void vi_gc_cac_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
42862306a36Sopenharmony_ci{
42962306a36Sopenharmony_ci	unsigned long flags;
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_ci	spin_lock_irqsave(&adev->gc_cac_idx_lock, flags);
43262306a36Sopenharmony_ci	WREG32(mmGC_CAC_IND_INDEX, (reg));
43362306a36Sopenharmony_ci	WREG32(mmGC_CAC_IND_DATA, (v));
43462306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->gc_cac_idx_lock, flags);
43562306a36Sopenharmony_ci}
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci
43862306a36Sopenharmony_cistatic const u32 tonga_mgcg_cgcg_init[] =
43962306a36Sopenharmony_ci{
44062306a36Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100,
44162306a36Sopenharmony_ci	mmPCIE_INDEX, 0xffffffff, 0x0140001c,
44262306a36Sopenharmony_ci	mmPCIE_DATA, 0x000f0000, 0x00000000,
44362306a36Sopenharmony_ci	mmSMC_IND_INDEX_4, 0xffffffff, 0xC060000C,
44462306a36Sopenharmony_ci	mmSMC_IND_DATA_4, 0xc0000fff, 0x00000100,
44562306a36Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
44662306a36Sopenharmony_ci	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
44762306a36Sopenharmony_ci};
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_cistatic const u32 fiji_mgcg_cgcg_init[] =
45062306a36Sopenharmony_ci{
45162306a36Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100,
45262306a36Sopenharmony_ci	mmPCIE_INDEX, 0xffffffff, 0x0140001c,
45362306a36Sopenharmony_ci	mmPCIE_DATA, 0x000f0000, 0x00000000,
45462306a36Sopenharmony_ci	mmSMC_IND_INDEX_4, 0xffffffff, 0xC060000C,
45562306a36Sopenharmony_ci	mmSMC_IND_DATA_4, 0xc0000fff, 0x00000100,
45662306a36Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
45762306a36Sopenharmony_ci	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
45862306a36Sopenharmony_ci};
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_cistatic const u32 iceland_mgcg_cgcg_init[] =
46162306a36Sopenharmony_ci{
46262306a36Sopenharmony_ci	mmPCIE_INDEX, 0xffffffff, ixPCIE_CNTL2,
46362306a36Sopenharmony_ci	mmPCIE_DATA, 0x000f0000, 0x00000000,
46462306a36Sopenharmony_ci	mmSMC_IND_INDEX_4, 0xffffffff, ixCGTT_ROM_CLK_CTRL0,
46562306a36Sopenharmony_ci	mmSMC_IND_DATA_4, 0xc0000fff, 0x00000100,
46662306a36Sopenharmony_ci	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
46762306a36Sopenharmony_ci};
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_cistatic const u32 cz_mgcg_cgcg_init[] =
47062306a36Sopenharmony_ci{
47162306a36Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100,
47262306a36Sopenharmony_ci	mmPCIE_INDEX, 0xffffffff, 0x0140001c,
47362306a36Sopenharmony_ci	mmPCIE_DATA, 0x000f0000, 0x00000000,
47462306a36Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
47562306a36Sopenharmony_ci	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
47662306a36Sopenharmony_ci};
47762306a36Sopenharmony_ci
47862306a36Sopenharmony_cistatic const u32 stoney_mgcg_cgcg_init[] =
47962306a36Sopenharmony_ci{
48062306a36Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00000100,
48162306a36Sopenharmony_ci	mmHDP_XDP_CGTT_BLK_CTRL, 0xffffffff, 0x00000104,
48262306a36Sopenharmony_ci	mmHDP_HOST_PATH_CNTL, 0xffffffff, 0x0f000027,
48362306a36Sopenharmony_ci};
48462306a36Sopenharmony_ci
48562306a36Sopenharmony_cistatic void vi_init_golden_registers(struct amdgpu_device *adev)
48662306a36Sopenharmony_ci{
48762306a36Sopenharmony_ci	/* Some of the registers might be dependent on GRBM_GFX_INDEX */
48862306a36Sopenharmony_ci	mutex_lock(&adev->grbm_idx_mutex);
48962306a36Sopenharmony_ci
49062306a36Sopenharmony_ci	if (amdgpu_sriov_vf(adev)) {
49162306a36Sopenharmony_ci		xgpu_vi_init_golden_registers(adev);
49262306a36Sopenharmony_ci		mutex_unlock(&adev->grbm_idx_mutex);
49362306a36Sopenharmony_ci		return;
49462306a36Sopenharmony_ci	}
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_ci	switch (adev->asic_type) {
49762306a36Sopenharmony_ci	case CHIP_TOPAZ:
49862306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
49962306a36Sopenharmony_ci							iceland_mgcg_cgcg_init,
50062306a36Sopenharmony_ci							ARRAY_SIZE(iceland_mgcg_cgcg_init));
50162306a36Sopenharmony_ci		break;
50262306a36Sopenharmony_ci	case CHIP_FIJI:
50362306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
50462306a36Sopenharmony_ci							fiji_mgcg_cgcg_init,
50562306a36Sopenharmony_ci							ARRAY_SIZE(fiji_mgcg_cgcg_init));
50662306a36Sopenharmony_ci		break;
50762306a36Sopenharmony_ci	case CHIP_TONGA:
50862306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
50962306a36Sopenharmony_ci							tonga_mgcg_cgcg_init,
51062306a36Sopenharmony_ci							ARRAY_SIZE(tonga_mgcg_cgcg_init));
51162306a36Sopenharmony_ci		break;
51262306a36Sopenharmony_ci	case CHIP_CARRIZO:
51362306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
51462306a36Sopenharmony_ci							cz_mgcg_cgcg_init,
51562306a36Sopenharmony_ci							ARRAY_SIZE(cz_mgcg_cgcg_init));
51662306a36Sopenharmony_ci		break;
51762306a36Sopenharmony_ci	case CHIP_STONEY:
51862306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
51962306a36Sopenharmony_ci							stoney_mgcg_cgcg_init,
52062306a36Sopenharmony_ci							ARRAY_SIZE(stoney_mgcg_cgcg_init));
52162306a36Sopenharmony_ci		break;
52262306a36Sopenharmony_ci	case CHIP_POLARIS10:
52362306a36Sopenharmony_ci	case CHIP_POLARIS11:
52462306a36Sopenharmony_ci	case CHIP_POLARIS12:
52562306a36Sopenharmony_ci	case CHIP_VEGAM:
52662306a36Sopenharmony_ci	default:
52762306a36Sopenharmony_ci		break;
52862306a36Sopenharmony_ci	}
52962306a36Sopenharmony_ci	mutex_unlock(&adev->grbm_idx_mutex);
53062306a36Sopenharmony_ci}
53162306a36Sopenharmony_ci
53262306a36Sopenharmony_ci/**
53362306a36Sopenharmony_ci * vi_get_xclk - get the xclk
53462306a36Sopenharmony_ci *
53562306a36Sopenharmony_ci * @adev: amdgpu_device pointer
53662306a36Sopenharmony_ci *
53762306a36Sopenharmony_ci * Returns the reference clock used by the gfx engine
53862306a36Sopenharmony_ci * (VI).
53962306a36Sopenharmony_ci */
54062306a36Sopenharmony_cistatic u32 vi_get_xclk(struct amdgpu_device *adev)
54162306a36Sopenharmony_ci{
54262306a36Sopenharmony_ci	u32 reference_clock = adev->clock.spll.reference_freq;
54362306a36Sopenharmony_ci	u32 tmp;
54462306a36Sopenharmony_ci
54562306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU) {
54662306a36Sopenharmony_ci		switch (adev->asic_type) {
54762306a36Sopenharmony_ci		case CHIP_STONEY:
54862306a36Sopenharmony_ci			/* vbios says 48Mhz, but the actual freq is 100Mhz */
54962306a36Sopenharmony_ci			return 10000;
55062306a36Sopenharmony_ci		default:
55162306a36Sopenharmony_ci			return reference_clock;
55262306a36Sopenharmony_ci		}
55362306a36Sopenharmony_ci	}
55462306a36Sopenharmony_ci
55562306a36Sopenharmony_ci	tmp = RREG32_SMC(ixCG_CLKPIN_CNTL_2);
55662306a36Sopenharmony_ci	if (REG_GET_FIELD(tmp, CG_CLKPIN_CNTL_2, MUX_TCLK_TO_XCLK))
55762306a36Sopenharmony_ci		return 1000;
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_ci	tmp = RREG32_SMC(ixCG_CLKPIN_CNTL);
56062306a36Sopenharmony_ci	if (REG_GET_FIELD(tmp, CG_CLKPIN_CNTL, XTALIN_DIVIDE))
56162306a36Sopenharmony_ci		return reference_clock / 4;
56262306a36Sopenharmony_ci
56362306a36Sopenharmony_ci	return reference_clock;
56462306a36Sopenharmony_ci}
56562306a36Sopenharmony_ci
56662306a36Sopenharmony_ci/**
56762306a36Sopenharmony_ci * vi_srbm_select - select specific register instances
56862306a36Sopenharmony_ci *
56962306a36Sopenharmony_ci * @adev: amdgpu_device pointer
57062306a36Sopenharmony_ci * @me: selected ME (micro engine)
57162306a36Sopenharmony_ci * @pipe: pipe
57262306a36Sopenharmony_ci * @queue: queue
57362306a36Sopenharmony_ci * @vmid: VMID
57462306a36Sopenharmony_ci *
57562306a36Sopenharmony_ci * Switches the currently active registers instances.  Some
57662306a36Sopenharmony_ci * registers are instanced per VMID, others are instanced per
57762306a36Sopenharmony_ci * me/pipe/queue combination.
57862306a36Sopenharmony_ci */
57962306a36Sopenharmony_civoid vi_srbm_select(struct amdgpu_device *adev,
58062306a36Sopenharmony_ci		     u32 me, u32 pipe, u32 queue, u32 vmid)
58162306a36Sopenharmony_ci{
58262306a36Sopenharmony_ci	u32 srbm_gfx_cntl = 0;
58362306a36Sopenharmony_ci	srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, PIPEID, pipe);
58462306a36Sopenharmony_ci	srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, MEID, me);
58562306a36Sopenharmony_ci	srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, VMID, vmid);
58662306a36Sopenharmony_ci	srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, QUEUEID, queue);
58762306a36Sopenharmony_ci	WREG32(mmSRBM_GFX_CNTL, srbm_gfx_cntl);
58862306a36Sopenharmony_ci}
58962306a36Sopenharmony_ci
59062306a36Sopenharmony_cistatic bool vi_read_disabled_bios(struct amdgpu_device *adev)
59162306a36Sopenharmony_ci{
59262306a36Sopenharmony_ci	u32 bus_cntl;
59362306a36Sopenharmony_ci	u32 d1vga_control = 0;
59462306a36Sopenharmony_ci	u32 d2vga_control = 0;
59562306a36Sopenharmony_ci	u32 vga_render_control = 0;
59662306a36Sopenharmony_ci	u32 rom_cntl;
59762306a36Sopenharmony_ci	bool r;
59862306a36Sopenharmony_ci
59962306a36Sopenharmony_ci	bus_cntl = RREG32(mmBUS_CNTL);
60062306a36Sopenharmony_ci	if (adev->mode_info.num_crtc) {
60162306a36Sopenharmony_ci		d1vga_control = RREG32(mmD1VGA_CONTROL);
60262306a36Sopenharmony_ci		d2vga_control = RREG32(mmD2VGA_CONTROL);
60362306a36Sopenharmony_ci		vga_render_control = RREG32(mmVGA_RENDER_CONTROL);
60462306a36Sopenharmony_ci	}
60562306a36Sopenharmony_ci	rom_cntl = RREG32_SMC(ixROM_CNTL);
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_ci	/* enable the rom */
60862306a36Sopenharmony_ci	WREG32(mmBUS_CNTL, (bus_cntl & ~BUS_CNTL__BIOS_ROM_DIS_MASK));
60962306a36Sopenharmony_ci	if (adev->mode_info.num_crtc) {
61062306a36Sopenharmony_ci		/* Disable VGA mode */
61162306a36Sopenharmony_ci		WREG32(mmD1VGA_CONTROL,
61262306a36Sopenharmony_ci		       (d1vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
61362306a36Sopenharmony_ci					  D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
61462306a36Sopenharmony_ci		WREG32(mmD2VGA_CONTROL,
61562306a36Sopenharmony_ci		       (d2vga_control & ~(D2VGA_CONTROL__D2VGA_MODE_ENABLE_MASK |
61662306a36Sopenharmony_ci					  D2VGA_CONTROL__D2VGA_TIMING_SELECT_MASK)));
61762306a36Sopenharmony_ci		WREG32(mmVGA_RENDER_CONTROL,
61862306a36Sopenharmony_ci		       (vga_render_control & ~VGA_RENDER_CONTROL__VGA_VSTATUS_CNTL_MASK));
61962306a36Sopenharmony_ci	}
62062306a36Sopenharmony_ci	WREG32_SMC(ixROM_CNTL, rom_cntl | ROM_CNTL__SCK_OVERWRITE_MASK);
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_ci	r = amdgpu_read_bios(adev);
62362306a36Sopenharmony_ci
62462306a36Sopenharmony_ci	/* restore regs */
62562306a36Sopenharmony_ci	WREG32(mmBUS_CNTL, bus_cntl);
62662306a36Sopenharmony_ci	if (adev->mode_info.num_crtc) {
62762306a36Sopenharmony_ci		WREG32(mmD1VGA_CONTROL, d1vga_control);
62862306a36Sopenharmony_ci		WREG32(mmD2VGA_CONTROL, d2vga_control);
62962306a36Sopenharmony_ci		WREG32(mmVGA_RENDER_CONTROL, vga_render_control);
63062306a36Sopenharmony_ci	}
63162306a36Sopenharmony_ci	WREG32_SMC(ixROM_CNTL, rom_cntl);
63262306a36Sopenharmony_ci	return r;
63362306a36Sopenharmony_ci}
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_cistatic bool vi_read_bios_from_rom(struct amdgpu_device *adev,
63662306a36Sopenharmony_ci				  u8 *bios, u32 length_bytes)
63762306a36Sopenharmony_ci{
63862306a36Sopenharmony_ci	u32 *dw_ptr;
63962306a36Sopenharmony_ci	unsigned long flags;
64062306a36Sopenharmony_ci	u32 i, length_dw;
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_ci	if (bios == NULL)
64362306a36Sopenharmony_ci		return false;
64462306a36Sopenharmony_ci	if (length_bytes == 0)
64562306a36Sopenharmony_ci		return false;
64662306a36Sopenharmony_ci	/* APU vbios image is part of sbios image */
64762306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
64862306a36Sopenharmony_ci		return false;
64962306a36Sopenharmony_ci
65062306a36Sopenharmony_ci	dw_ptr = (u32 *)bios;
65162306a36Sopenharmony_ci	length_dw = ALIGN(length_bytes, 4) / 4;
65262306a36Sopenharmony_ci	/* take the smc lock since we are using the smc index */
65362306a36Sopenharmony_ci	spin_lock_irqsave(&adev->smc_idx_lock, flags);
65462306a36Sopenharmony_ci	/* set rom index to 0 */
65562306a36Sopenharmony_ci	WREG32(mmSMC_IND_INDEX_11, ixROM_INDEX);
65662306a36Sopenharmony_ci	WREG32(mmSMC_IND_DATA_11, 0);
65762306a36Sopenharmony_ci	/* set index to data for continous read */
65862306a36Sopenharmony_ci	WREG32(mmSMC_IND_INDEX_11, ixROM_DATA);
65962306a36Sopenharmony_ci	for (i = 0; i < length_dw; i++)
66062306a36Sopenharmony_ci		dw_ptr[i] = RREG32(mmSMC_IND_DATA_11);
66162306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
66262306a36Sopenharmony_ci
66362306a36Sopenharmony_ci	return true;
66462306a36Sopenharmony_ci}
66562306a36Sopenharmony_ci
66662306a36Sopenharmony_cistatic const struct amdgpu_allowed_register_entry vi_allowed_read_registers[] = {
66762306a36Sopenharmony_ci	{mmGRBM_STATUS},
66862306a36Sopenharmony_ci	{mmGRBM_STATUS2},
66962306a36Sopenharmony_ci	{mmGRBM_STATUS_SE0},
67062306a36Sopenharmony_ci	{mmGRBM_STATUS_SE1},
67162306a36Sopenharmony_ci	{mmGRBM_STATUS_SE2},
67262306a36Sopenharmony_ci	{mmGRBM_STATUS_SE3},
67362306a36Sopenharmony_ci	{mmSRBM_STATUS},
67462306a36Sopenharmony_ci	{mmSRBM_STATUS2},
67562306a36Sopenharmony_ci	{mmSRBM_STATUS3},
67662306a36Sopenharmony_ci	{mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET},
67762306a36Sopenharmony_ci	{mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET},
67862306a36Sopenharmony_ci	{mmCP_STAT},
67962306a36Sopenharmony_ci	{mmCP_STALLED_STAT1},
68062306a36Sopenharmony_ci	{mmCP_STALLED_STAT2},
68162306a36Sopenharmony_ci	{mmCP_STALLED_STAT3},
68262306a36Sopenharmony_ci	{mmCP_CPF_BUSY_STAT},
68362306a36Sopenharmony_ci	{mmCP_CPF_STALLED_STAT1},
68462306a36Sopenharmony_ci	{mmCP_CPF_STATUS},
68562306a36Sopenharmony_ci	{mmCP_CPC_BUSY_STAT},
68662306a36Sopenharmony_ci	{mmCP_CPC_STALLED_STAT1},
68762306a36Sopenharmony_ci	{mmCP_CPC_STATUS},
68862306a36Sopenharmony_ci	{mmGB_ADDR_CONFIG},
68962306a36Sopenharmony_ci	{mmMC_ARB_RAMCFG},
69062306a36Sopenharmony_ci	{mmGB_TILE_MODE0},
69162306a36Sopenharmony_ci	{mmGB_TILE_MODE1},
69262306a36Sopenharmony_ci	{mmGB_TILE_MODE2},
69362306a36Sopenharmony_ci	{mmGB_TILE_MODE3},
69462306a36Sopenharmony_ci	{mmGB_TILE_MODE4},
69562306a36Sopenharmony_ci	{mmGB_TILE_MODE5},
69662306a36Sopenharmony_ci	{mmGB_TILE_MODE6},
69762306a36Sopenharmony_ci	{mmGB_TILE_MODE7},
69862306a36Sopenharmony_ci	{mmGB_TILE_MODE8},
69962306a36Sopenharmony_ci	{mmGB_TILE_MODE9},
70062306a36Sopenharmony_ci	{mmGB_TILE_MODE10},
70162306a36Sopenharmony_ci	{mmGB_TILE_MODE11},
70262306a36Sopenharmony_ci	{mmGB_TILE_MODE12},
70362306a36Sopenharmony_ci	{mmGB_TILE_MODE13},
70462306a36Sopenharmony_ci	{mmGB_TILE_MODE14},
70562306a36Sopenharmony_ci	{mmGB_TILE_MODE15},
70662306a36Sopenharmony_ci	{mmGB_TILE_MODE16},
70762306a36Sopenharmony_ci	{mmGB_TILE_MODE17},
70862306a36Sopenharmony_ci	{mmGB_TILE_MODE18},
70962306a36Sopenharmony_ci	{mmGB_TILE_MODE19},
71062306a36Sopenharmony_ci	{mmGB_TILE_MODE20},
71162306a36Sopenharmony_ci	{mmGB_TILE_MODE21},
71262306a36Sopenharmony_ci	{mmGB_TILE_MODE22},
71362306a36Sopenharmony_ci	{mmGB_TILE_MODE23},
71462306a36Sopenharmony_ci	{mmGB_TILE_MODE24},
71562306a36Sopenharmony_ci	{mmGB_TILE_MODE25},
71662306a36Sopenharmony_ci	{mmGB_TILE_MODE26},
71762306a36Sopenharmony_ci	{mmGB_TILE_MODE27},
71862306a36Sopenharmony_ci	{mmGB_TILE_MODE28},
71962306a36Sopenharmony_ci	{mmGB_TILE_MODE29},
72062306a36Sopenharmony_ci	{mmGB_TILE_MODE30},
72162306a36Sopenharmony_ci	{mmGB_TILE_MODE31},
72262306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE0},
72362306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE1},
72462306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE2},
72562306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE3},
72662306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE4},
72762306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE5},
72862306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE6},
72962306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE7},
73062306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE8},
73162306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE9},
73262306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE10},
73362306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE11},
73462306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE12},
73562306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE13},
73662306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE14},
73762306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE15},
73862306a36Sopenharmony_ci	{mmCC_RB_BACKEND_DISABLE, true},
73962306a36Sopenharmony_ci	{mmGC_USER_RB_BACKEND_DISABLE, true},
74062306a36Sopenharmony_ci	{mmGB_BACKEND_MAP, false},
74162306a36Sopenharmony_ci	{mmPA_SC_RASTER_CONFIG, true},
74262306a36Sopenharmony_ci	{mmPA_SC_RASTER_CONFIG_1, true},
74362306a36Sopenharmony_ci};
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_cistatic uint32_t vi_get_register_value(struct amdgpu_device *adev,
74662306a36Sopenharmony_ci				      bool indexed, u32 se_num,
74762306a36Sopenharmony_ci				      u32 sh_num, u32 reg_offset)
74862306a36Sopenharmony_ci{
74962306a36Sopenharmony_ci	if (indexed) {
75062306a36Sopenharmony_ci		uint32_t val;
75162306a36Sopenharmony_ci		unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
75262306a36Sopenharmony_ci		unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
75362306a36Sopenharmony_ci
75462306a36Sopenharmony_ci		switch (reg_offset) {
75562306a36Sopenharmony_ci		case mmCC_RB_BACKEND_DISABLE:
75662306a36Sopenharmony_ci			return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
75762306a36Sopenharmony_ci		case mmGC_USER_RB_BACKEND_DISABLE:
75862306a36Sopenharmony_ci			return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
75962306a36Sopenharmony_ci		case mmPA_SC_RASTER_CONFIG:
76062306a36Sopenharmony_ci			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
76162306a36Sopenharmony_ci		case mmPA_SC_RASTER_CONFIG_1:
76262306a36Sopenharmony_ci			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config_1;
76362306a36Sopenharmony_ci		}
76462306a36Sopenharmony_ci
76562306a36Sopenharmony_ci		mutex_lock(&adev->grbm_idx_mutex);
76662306a36Sopenharmony_ci		if (se_num != 0xffffffff || sh_num != 0xffffffff)
76762306a36Sopenharmony_ci			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff, 0);
76862306a36Sopenharmony_ci
76962306a36Sopenharmony_ci		val = RREG32(reg_offset);
77062306a36Sopenharmony_ci
77162306a36Sopenharmony_ci		if (se_num != 0xffffffff || sh_num != 0xffffffff)
77262306a36Sopenharmony_ci			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
77362306a36Sopenharmony_ci		mutex_unlock(&adev->grbm_idx_mutex);
77462306a36Sopenharmony_ci		return val;
77562306a36Sopenharmony_ci	} else {
77662306a36Sopenharmony_ci		unsigned idx;
77762306a36Sopenharmony_ci
77862306a36Sopenharmony_ci		switch (reg_offset) {
77962306a36Sopenharmony_ci		case mmGB_ADDR_CONFIG:
78062306a36Sopenharmony_ci			return adev->gfx.config.gb_addr_config;
78162306a36Sopenharmony_ci		case mmMC_ARB_RAMCFG:
78262306a36Sopenharmony_ci			return adev->gfx.config.mc_arb_ramcfg;
78362306a36Sopenharmony_ci		case mmGB_TILE_MODE0:
78462306a36Sopenharmony_ci		case mmGB_TILE_MODE1:
78562306a36Sopenharmony_ci		case mmGB_TILE_MODE2:
78662306a36Sopenharmony_ci		case mmGB_TILE_MODE3:
78762306a36Sopenharmony_ci		case mmGB_TILE_MODE4:
78862306a36Sopenharmony_ci		case mmGB_TILE_MODE5:
78962306a36Sopenharmony_ci		case mmGB_TILE_MODE6:
79062306a36Sopenharmony_ci		case mmGB_TILE_MODE7:
79162306a36Sopenharmony_ci		case mmGB_TILE_MODE8:
79262306a36Sopenharmony_ci		case mmGB_TILE_MODE9:
79362306a36Sopenharmony_ci		case mmGB_TILE_MODE10:
79462306a36Sopenharmony_ci		case mmGB_TILE_MODE11:
79562306a36Sopenharmony_ci		case mmGB_TILE_MODE12:
79662306a36Sopenharmony_ci		case mmGB_TILE_MODE13:
79762306a36Sopenharmony_ci		case mmGB_TILE_MODE14:
79862306a36Sopenharmony_ci		case mmGB_TILE_MODE15:
79962306a36Sopenharmony_ci		case mmGB_TILE_MODE16:
80062306a36Sopenharmony_ci		case mmGB_TILE_MODE17:
80162306a36Sopenharmony_ci		case mmGB_TILE_MODE18:
80262306a36Sopenharmony_ci		case mmGB_TILE_MODE19:
80362306a36Sopenharmony_ci		case mmGB_TILE_MODE20:
80462306a36Sopenharmony_ci		case mmGB_TILE_MODE21:
80562306a36Sopenharmony_ci		case mmGB_TILE_MODE22:
80662306a36Sopenharmony_ci		case mmGB_TILE_MODE23:
80762306a36Sopenharmony_ci		case mmGB_TILE_MODE24:
80862306a36Sopenharmony_ci		case mmGB_TILE_MODE25:
80962306a36Sopenharmony_ci		case mmGB_TILE_MODE26:
81062306a36Sopenharmony_ci		case mmGB_TILE_MODE27:
81162306a36Sopenharmony_ci		case mmGB_TILE_MODE28:
81262306a36Sopenharmony_ci		case mmGB_TILE_MODE29:
81362306a36Sopenharmony_ci		case mmGB_TILE_MODE30:
81462306a36Sopenharmony_ci		case mmGB_TILE_MODE31:
81562306a36Sopenharmony_ci			idx = (reg_offset - mmGB_TILE_MODE0);
81662306a36Sopenharmony_ci			return adev->gfx.config.tile_mode_array[idx];
81762306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE0:
81862306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE1:
81962306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE2:
82062306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE3:
82162306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE4:
82262306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE5:
82362306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE6:
82462306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE7:
82562306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE8:
82662306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE9:
82762306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE10:
82862306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE11:
82962306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE12:
83062306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE13:
83162306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE14:
83262306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE15:
83362306a36Sopenharmony_ci			idx = (reg_offset - mmGB_MACROTILE_MODE0);
83462306a36Sopenharmony_ci			return adev->gfx.config.macrotile_mode_array[idx];
83562306a36Sopenharmony_ci		default:
83662306a36Sopenharmony_ci			return RREG32(reg_offset);
83762306a36Sopenharmony_ci		}
83862306a36Sopenharmony_ci	}
83962306a36Sopenharmony_ci}
84062306a36Sopenharmony_ci
84162306a36Sopenharmony_cistatic int vi_read_register(struct amdgpu_device *adev, u32 se_num,
84262306a36Sopenharmony_ci			    u32 sh_num, u32 reg_offset, u32 *value)
84362306a36Sopenharmony_ci{
84462306a36Sopenharmony_ci	uint32_t i;
84562306a36Sopenharmony_ci
84662306a36Sopenharmony_ci	*value = 0;
84762306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(vi_allowed_read_registers); i++) {
84862306a36Sopenharmony_ci		bool indexed = vi_allowed_read_registers[i].grbm_indexed;
84962306a36Sopenharmony_ci
85062306a36Sopenharmony_ci		if (reg_offset != vi_allowed_read_registers[i].reg_offset)
85162306a36Sopenharmony_ci			continue;
85262306a36Sopenharmony_ci
85362306a36Sopenharmony_ci		*value = vi_get_register_value(adev, indexed, se_num, sh_num,
85462306a36Sopenharmony_ci					       reg_offset);
85562306a36Sopenharmony_ci		return 0;
85662306a36Sopenharmony_ci	}
85762306a36Sopenharmony_ci	return -EINVAL;
85862306a36Sopenharmony_ci}
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_ci/**
86162306a36Sopenharmony_ci * vi_asic_pci_config_reset - soft reset GPU
86262306a36Sopenharmony_ci *
86362306a36Sopenharmony_ci * @adev: amdgpu_device pointer
86462306a36Sopenharmony_ci *
86562306a36Sopenharmony_ci * Use PCI Config method to reset the GPU.
86662306a36Sopenharmony_ci *
86762306a36Sopenharmony_ci * Returns 0 for success.
86862306a36Sopenharmony_ci */
86962306a36Sopenharmony_cistatic int vi_asic_pci_config_reset(struct amdgpu_device *adev)
87062306a36Sopenharmony_ci{
87162306a36Sopenharmony_ci	u32 i;
87262306a36Sopenharmony_ci	int r = -EINVAL;
87362306a36Sopenharmony_ci
87462306a36Sopenharmony_ci	amdgpu_atombios_scratch_regs_engine_hung(adev, true);
87562306a36Sopenharmony_ci
87662306a36Sopenharmony_ci	/* disable BM */
87762306a36Sopenharmony_ci	pci_clear_master(adev->pdev);
87862306a36Sopenharmony_ci	/* reset */
87962306a36Sopenharmony_ci	amdgpu_device_pci_config_reset(adev);
88062306a36Sopenharmony_ci
88162306a36Sopenharmony_ci	udelay(100);
88262306a36Sopenharmony_ci
88362306a36Sopenharmony_ci	/* wait for asic to come out of reset */
88462306a36Sopenharmony_ci	for (i = 0; i < adev->usec_timeout; i++) {
88562306a36Sopenharmony_ci		if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
88662306a36Sopenharmony_ci			/* enable BM */
88762306a36Sopenharmony_ci			pci_set_master(adev->pdev);
88862306a36Sopenharmony_ci			adev->has_hw_reset = true;
88962306a36Sopenharmony_ci			r = 0;
89062306a36Sopenharmony_ci			break;
89162306a36Sopenharmony_ci		}
89262306a36Sopenharmony_ci		udelay(1);
89362306a36Sopenharmony_ci	}
89462306a36Sopenharmony_ci
89562306a36Sopenharmony_ci	amdgpu_atombios_scratch_regs_engine_hung(adev, false);
89662306a36Sopenharmony_ci
89762306a36Sopenharmony_ci	return r;
89862306a36Sopenharmony_ci}
89962306a36Sopenharmony_ci
90062306a36Sopenharmony_cistatic bool vi_asic_supports_baco(struct amdgpu_device *adev)
90162306a36Sopenharmony_ci{
90262306a36Sopenharmony_ci	switch (adev->asic_type) {
90362306a36Sopenharmony_ci	case CHIP_FIJI:
90462306a36Sopenharmony_ci	case CHIP_TONGA:
90562306a36Sopenharmony_ci	case CHIP_POLARIS10:
90662306a36Sopenharmony_ci	case CHIP_POLARIS11:
90762306a36Sopenharmony_ci	case CHIP_POLARIS12:
90862306a36Sopenharmony_ci	case CHIP_TOPAZ:
90962306a36Sopenharmony_ci		return amdgpu_dpm_is_baco_supported(adev);
91062306a36Sopenharmony_ci	default:
91162306a36Sopenharmony_ci		return false;
91262306a36Sopenharmony_ci	}
91362306a36Sopenharmony_ci}
91462306a36Sopenharmony_ci
91562306a36Sopenharmony_cistatic enum amd_reset_method
91662306a36Sopenharmony_civi_asic_reset_method(struct amdgpu_device *adev)
91762306a36Sopenharmony_ci{
91862306a36Sopenharmony_ci	bool baco_reset;
91962306a36Sopenharmony_ci
92062306a36Sopenharmony_ci	if (amdgpu_reset_method == AMD_RESET_METHOD_LEGACY ||
92162306a36Sopenharmony_ci	    amdgpu_reset_method == AMD_RESET_METHOD_BACO)
92262306a36Sopenharmony_ci		return amdgpu_reset_method;
92362306a36Sopenharmony_ci
92462306a36Sopenharmony_ci	if (amdgpu_reset_method != -1)
92562306a36Sopenharmony_ci		dev_warn(adev->dev, "Specified reset method:%d isn't supported, using AUTO instead.\n",
92662306a36Sopenharmony_ci				  amdgpu_reset_method);
92762306a36Sopenharmony_ci
92862306a36Sopenharmony_ci	switch (adev->asic_type) {
92962306a36Sopenharmony_ci	case CHIP_FIJI:
93062306a36Sopenharmony_ci	case CHIP_TONGA:
93162306a36Sopenharmony_ci	case CHIP_POLARIS10:
93262306a36Sopenharmony_ci	case CHIP_POLARIS11:
93362306a36Sopenharmony_ci	case CHIP_POLARIS12:
93462306a36Sopenharmony_ci	case CHIP_TOPAZ:
93562306a36Sopenharmony_ci		baco_reset = amdgpu_dpm_is_baco_supported(adev);
93662306a36Sopenharmony_ci		break;
93762306a36Sopenharmony_ci	default:
93862306a36Sopenharmony_ci		baco_reset = false;
93962306a36Sopenharmony_ci		break;
94062306a36Sopenharmony_ci	}
94162306a36Sopenharmony_ci
94262306a36Sopenharmony_ci	if (baco_reset)
94362306a36Sopenharmony_ci		return AMD_RESET_METHOD_BACO;
94462306a36Sopenharmony_ci	else
94562306a36Sopenharmony_ci		return AMD_RESET_METHOD_LEGACY;
94662306a36Sopenharmony_ci}
94762306a36Sopenharmony_ci
94862306a36Sopenharmony_ci/**
94962306a36Sopenharmony_ci * vi_asic_reset - soft reset GPU
95062306a36Sopenharmony_ci *
95162306a36Sopenharmony_ci * @adev: amdgpu_device pointer
95262306a36Sopenharmony_ci *
95362306a36Sopenharmony_ci * Look up which blocks are hung and attempt
95462306a36Sopenharmony_ci * to reset them.
95562306a36Sopenharmony_ci * Returns 0 for success.
95662306a36Sopenharmony_ci */
95762306a36Sopenharmony_cistatic int vi_asic_reset(struct amdgpu_device *adev)
95862306a36Sopenharmony_ci{
95962306a36Sopenharmony_ci	int r;
96062306a36Sopenharmony_ci
96162306a36Sopenharmony_ci	/* APUs don't have full asic reset */
96262306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
96362306a36Sopenharmony_ci		return 0;
96462306a36Sopenharmony_ci
96562306a36Sopenharmony_ci	if (vi_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {
96662306a36Sopenharmony_ci		dev_info(adev->dev, "BACO reset\n");
96762306a36Sopenharmony_ci		r = amdgpu_dpm_baco_reset(adev);
96862306a36Sopenharmony_ci	} else {
96962306a36Sopenharmony_ci		dev_info(adev->dev, "PCI CONFIG reset\n");
97062306a36Sopenharmony_ci		r = vi_asic_pci_config_reset(adev);
97162306a36Sopenharmony_ci	}
97262306a36Sopenharmony_ci
97362306a36Sopenharmony_ci	return r;
97462306a36Sopenharmony_ci}
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_cistatic u32 vi_get_config_memsize(struct amdgpu_device *adev)
97762306a36Sopenharmony_ci{
97862306a36Sopenharmony_ci	return RREG32(mmCONFIG_MEMSIZE);
97962306a36Sopenharmony_ci}
98062306a36Sopenharmony_ci
98162306a36Sopenharmony_cistatic int vi_set_uvd_clock(struct amdgpu_device *adev, u32 clock,
98262306a36Sopenharmony_ci			u32 cntl_reg, u32 status_reg)
98362306a36Sopenharmony_ci{
98462306a36Sopenharmony_ci	int r, i;
98562306a36Sopenharmony_ci	struct atom_clock_dividers dividers;
98662306a36Sopenharmony_ci	uint32_t tmp;
98762306a36Sopenharmony_ci
98862306a36Sopenharmony_ci	r = amdgpu_atombios_get_clock_dividers(adev,
98962306a36Sopenharmony_ci					       COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
99062306a36Sopenharmony_ci					       clock, false, &dividers);
99162306a36Sopenharmony_ci	if (r)
99262306a36Sopenharmony_ci		return r;
99362306a36Sopenharmony_ci
99462306a36Sopenharmony_ci	tmp = RREG32_SMC(cntl_reg);
99562306a36Sopenharmony_ci
99662306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
99762306a36Sopenharmony_ci		tmp &= ~CG_DCLK_CNTL__DCLK_DIVIDER_MASK;
99862306a36Sopenharmony_ci	else
99962306a36Sopenharmony_ci		tmp &= ~(CG_DCLK_CNTL__DCLK_DIR_CNTL_EN_MASK |
100062306a36Sopenharmony_ci				CG_DCLK_CNTL__DCLK_DIVIDER_MASK);
100162306a36Sopenharmony_ci	tmp |= dividers.post_divider;
100262306a36Sopenharmony_ci	WREG32_SMC(cntl_reg, tmp);
100362306a36Sopenharmony_ci
100462306a36Sopenharmony_ci	for (i = 0; i < 100; i++) {
100562306a36Sopenharmony_ci		tmp = RREG32_SMC(status_reg);
100662306a36Sopenharmony_ci		if (adev->flags & AMD_IS_APU) {
100762306a36Sopenharmony_ci			if (tmp & 0x10000)
100862306a36Sopenharmony_ci				break;
100962306a36Sopenharmony_ci		} else {
101062306a36Sopenharmony_ci			if (tmp & CG_DCLK_STATUS__DCLK_STATUS_MASK)
101162306a36Sopenharmony_ci				break;
101262306a36Sopenharmony_ci		}
101362306a36Sopenharmony_ci		mdelay(10);
101462306a36Sopenharmony_ci	}
101562306a36Sopenharmony_ci	if (i == 100)
101662306a36Sopenharmony_ci		return -ETIMEDOUT;
101762306a36Sopenharmony_ci	return 0;
101862306a36Sopenharmony_ci}
101962306a36Sopenharmony_ci
102062306a36Sopenharmony_ci#define ixGNB_CLK1_DFS_CNTL 0xD82200F0
102162306a36Sopenharmony_ci#define ixGNB_CLK1_STATUS   0xD822010C
102262306a36Sopenharmony_ci#define ixGNB_CLK2_DFS_CNTL 0xD8220110
102362306a36Sopenharmony_ci#define ixGNB_CLK2_STATUS   0xD822012C
102462306a36Sopenharmony_ci#define ixGNB_CLK3_DFS_CNTL 0xD8220130
102562306a36Sopenharmony_ci#define ixGNB_CLK3_STATUS   0xD822014C
102662306a36Sopenharmony_ci
102762306a36Sopenharmony_cistatic int vi_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
102862306a36Sopenharmony_ci{
102962306a36Sopenharmony_ci	int r;
103062306a36Sopenharmony_ci
103162306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU) {
103262306a36Sopenharmony_ci		r = vi_set_uvd_clock(adev, vclk, ixGNB_CLK2_DFS_CNTL, ixGNB_CLK2_STATUS);
103362306a36Sopenharmony_ci		if (r)
103462306a36Sopenharmony_ci			return r;
103562306a36Sopenharmony_ci
103662306a36Sopenharmony_ci		r = vi_set_uvd_clock(adev, dclk, ixGNB_CLK1_DFS_CNTL, ixGNB_CLK1_STATUS);
103762306a36Sopenharmony_ci		if (r)
103862306a36Sopenharmony_ci			return r;
103962306a36Sopenharmony_ci	} else {
104062306a36Sopenharmony_ci		r = vi_set_uvd_clock(adev, vclk, ixCG_VCLK_CNTL, ixCG_VCLK_STATUS);
104162306a36Sopenharmony_ci		if (r)
104262306a36Sopenharmony_ci			return r;
104362306a36Sopenharmony_ci
104462306a36Sopenharmony_ci		r = vi_set_uvd_clock(adev, dclk, ixCG_DCLK_CNTL, ixCG_DCLK_STATUS);
104562306a36Sopenharmony_ci		if (r)
104662306a36Sopenharmony_ci			return r;
104762306a36Sopenharmony_ci	}
104862306a36Sopenharmony_ci
104962306a36Sopenharmony_ci	return 0;
105062306a36Sopenharmony_ci}
105162306a36Sopenharmony_ci
105262306a36Sopenharmony_cistatic int vi_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
105362306a36Sopenharmony_ci{
105462306a36Sopenharmony_ci	int r, i;
105562306a36Sopenharmony_ci	struct atom_clock_dividers dividers;
105662306a36Sopenharmony_ci	u32 tmp;
105762306a36Sopenharmony_ci	u32 reg_ctrl;
105862306a36Sopenharmony_ci	u32 reg_status;
105962306a36Sopenharmony_ci	u32 status_mask;
106062306a36Sopenharmony_ci	u32 reg_mask;
106162306a36Sopenharmony_ci
106262306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU) {
106362306a36Sopenharmony_ci		reg_ctrl = ixGNB_CLK3_DFS_CNTL;
106462306a36Sopenharmony_ci		reg_status = ixGNB_CLK3_STATUS;
106562306a36Sopenharmony_ci		status_mask = 0x00010000;
106662306a36Sopenharmony_ci		reg_mask = CG_ECLK_CNTL__ECLK_DIVIDER_MASK;
106762306a36Sopenharmony_ci	} else {
106862306a36Sopenharmony_ci		reg_ctrl = ixCG_ECLK_CNTL;
106962306a36Sopenharmony_ci		reg_status = ixCG_ECLK_STATUS;
107062306a36Sopenharmony_ci		status_mask = CG_ECLK_STATUS__ECLK_STATUS_MASK;
107162306a36Sopenharmony_ci		reg_mask = CG_ECLK_CNTL__ECLK_DIR_CNTL_EN_MASK | CG_ECLK_CNTL__ECLK_DIVIDER_MASK;
107262306a36Sopenharmony_ci	}
107362306a36Sopenharmony_ci
107462306a36Sopenharmony_ci	r = amdgpu_atombios_get_clock_dividers(adev,
107562306a36Sopenharmony_ci					       COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
107662306a36Sopenharmony_ci					       ecclk, false, &dividers);
107762306a36Sopenharmony_ci	if (r)
107862306a36Sopenharmony_ci		return r;
107962306a36Sopenharmony_ci
108062306a36Sopenharmony_ci	for (i = 0; i < 100; i++) {
108162306a36Sopenharmony_ci		if (RREG32_SMC(reg_status) & status_mask)
108262306a36Sopenharmony_ci			break;
108362306a36Sopenharmony_ci		mdelay(10);
108462306a36Sopenharmony_ci	}
108562306a36Sopenharmony_ci
108662306a36Sopenharmony_ci	if (i == 100)
108762306a36Sopenharmony_ci		return -ETIMEDOUT;
108862306a36Sopenharmony_ci
108962306a36Sopenharmony_ci	tmp = RREG32_SMC(reg_ctrl);
109062306a36Sopenharmony_ci	tmp &= ~reg_mask;
109162306a36Sopenharmony_ci	tmp |= dividers.post_divider;
109262306a36Sopenharmony_ci	WREG32_SMC(reg_ctrl, tmp);
109362306a36Sopenharmony_ci
109462306a36Sopenharmony_ci	for (i = 0; i < 100; i++) {
109562306a36Sopenharmony_ci		if (RREG32_SMC(reg_status) & status_mask)
109662306a36Sopenharmony_ci			break;
109762306a36Sopenharmony_ci		mdelay(10);
109862306a36Sopenharmony_ci	}
109962306a36Sopenharmony_ci
110062306a36Sopenharmony_ci	if (i == 100)
110162306a36Sopenharmony_ci		return -ETIMEDOUT;
110262306a36Sopenharmony_ci
110362306a36Sopenharmony_ci	return 0;
110462306a36Sopenharmony_ci}
110562306a36Sopenharmony_ci
110662306a36Sopenharmony_cistatic void vi_enable_aspm(struct amdgpu_device *adev)
110762306a36Sopenharmony_ci{
110862306a36Sopenharmony_ci	u32 data, orig;
110962306a36Sopenharmony_ci
111062306a36Sopenharmony_ci	orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
111162306a36Sopenharmony_ci	data |= PCIE_LC_CNTL__LC_L0S_INACTIVITY_DEFAULT <<
111262306a36Sopenharmony_ci			PCIE_LC_CNTL__LC_L0S_INACTIVITY__SHIFT;
111362306a36Sopenharmony_ci	data |= PCIE_LC_CNTL__LC_L1_INACTIVITY_DEFAULT <<
111462306a36Sopenharmony_ci			PCIE_LC_CNTL__LC_L1_INACTIVITY__SHIFT;
111562306a36Sopenharmony_ci	data &= ~PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
111662306a36Sopenharmony_ci	data |= PCIE_LC_CNTL__LC_DELAY_L1_EXIT_MASK;
111762306a36Sopenharmony_ci	if (orig != data)
111862306a36Sopenharmony_ci		WREG32_PCIE(ixPCIE_LC_CNTL, data);
111962306a36Sopenharmony_ci}
112062306a36Sopenharmony_ci
112162306a36Sopenharmony_cistatic void vi_program_aspm(struct amdgpu_device *adev)
112262306a36Sopenharmony_ci{
112362306a36Sopenharmony_ci	u32 data, data1, orig;
112462306a36Sopenharmony_ci	bool bL1SS = false;
112562306a36Sopenharmony_ci	bool bClkReqSupport = true;
112662306a36Sopenharmony_ci
112762306a36Sopenharmony_ci	if (!amdgpu_device_should_use_aspm(adev) || !amdgpu_device_pcie_dynamic_switching_supported())
112862306a36Sopenharmony_ci		return;
112962306a36Sopenharmony_ci
113062306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU ||
113162306a36Sopenharmony_ci	    adev->asic_type < CHIP_POLARIS10)
113262306a36Sopenharmony_ci		return;
113362306a36Sopenharmony_ci
113462306a36Sopenharmony_ci	orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
113562306a36Sopenharmony_ci	data &= ~PCIE_LC_CNTL__LC_L1_INACTIVITY_MASK;
113662306a36Sopenharmony_ci	data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK;
113762306a36Sopenharmony_ci	data |= PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
113862306a36Sopenharmony_ci	if (orig != data)
113962306a36Sopenharmony_ci		WREG32_PCIE(ixPCIE_LC_CNTL, data);
114062306a36Sopenharmony_ci
114162306a36Sopenharmony_ci	orig = data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
114262306a36Sopenharmony_ci	data &= ~PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_MASK;
114362306a36Sopenharmony_ci	data |= 0x0024 << PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS__SHIFT;
114462306a36Sopenharmony_ci	data |= PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_OVERRIDE_EN_MASK;
114562306a36Sopenharmony_ci	if (orig != data)
114662306a36Sopenharmony_ci		WREG32_PCIE(ixPCIE_LC_N_FTS_CNTL, data);
114762306a36Sopenharmony_ci
114862306a36Sopenharmony_ci	orig = data = RREG32_PCIE(ixPCIE_LC_CNTL3);
114962306a36Sopenharmony_ci	data |= PCIE_LC_CNTL3__LC_GO_TO_RECOVERY_MASK;
115062306a36Sopenharmony_ci	if (orig != data)
115162306a36Sopenharmony_ci		WREG32_PCIE(ixPCIE_LC_CNTL3, data);
115262306a36Sopenharmony_ci
115362306a36Sopenharmony_ci	orig = data = RREG32_PCIE(ixPCIE_P_CNTL);
115462306a36Sopenharmony_ci	data |= PCIE_P_CNTL__P_IGNORE_EDB_ERR_MASK;
115562306a36Sopenharmony_ci	if (orig != data)
115662306a36Sopenharmony_ci		WREG32_PCIE(ixPCIE_P_CNTL, data);
115762306a36Sopenharmony_ci
115862306a36Sopenharmony_ci	data = RREG32_PCIE(ixPCIE_LC_L1_PM_SUBSTATE);
115962306a36Sopenharmony_ci	pci_read_config_dword(adev->pdev, PCIE_L1_PM_SUB_CNTL, &data1);
116062306a36Sopenharmony_ci	if (data & PCIE_LC_L1_PM_SUBSTATE__LC_L1_SUBSTATES_OVERRIDE_EN_MASK &&
116162306a36Sopenharmony_ci	    (data & (PCIE_LC_L1_PM_SUBSTATE__LC_PCI_PM_L1_2_OVERRIDE_MASK |
116262306a36Sopenharmony_ci		    PCIE_LC_L1_PM_SUBSTATE__LC_PCI_PM_L1_1_OVERRIDE_MASK |
116362306a36Sopenharmony_ci			PCIE_LC_L1_PM_SUBSTATE__LC_ASPM_L1_2_OVERRIDE_MASK |
116462306a36Sopenharmony_ci			PCIE_LC_L1_PM_SUBSTATE__LC_ASPM_L1_1_OVERRIDE_MASK))) {
116562306a36Sopenharmony_ci		bL1SS = true;
116662306a36Sopenharmony_ci	} else if (data1 & (PCIE_L1_PM_SUB_CNTL__ASPM_L1_2_EN_MASK |
116762306a36Sopenharmony_ci	    PCIE_L1_PM_SUB_CNTL__ASPM_L1_1_EN_MASK |
116862306a36Sopenharmony_ci	    PCIE_L1_PM_SUB_CNTL__PCI_PM_L1_2_EN_MASK |
116962306a36Sopenharmony_ci	    PCIE_L1_PM_SUB_CNTL__PCI_PM_L1_1_EN_MASK)) {
117062306a36Sopenharmony_ci		bL1SS = true;
117162306a36Sopenharmony_ci	}
117262306a36Sopenharmony_ci
117362306a36Sopenharmony_ci	orig = data = RREG32_PCIE(ixPCIE_LC_CNTL6);
117462306a36Sopenharmony_ci	data |= PCIE_LC_CNTL6__LC_L1_POWERDOWN_MASK;
117562306a36Sopenharmony_ci	if (orig != data)
117662306a36Sopenharmony_ci		WREG32_PCIE(ixPCIE_LC_CNTL6, data);
117762306a36Sopenharmony_ci
117862306a36Sopenharmony_ci	orig = data = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
117962306a36Sopenharmony_ci	data |= PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE_MASK;
118062306a36Sopenharmony_ci	if (orig != data)
118162306a36Sopenharmony_ci		WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, data);
118262306a36Sopenharmony_ci
118362306a36Sopenharmony_ci	pci_read_config_dword(adev->pdev, LINK_CAP, &data);
118462306a36Sopenharmony_ci	if (!(data & PCIE_LINK_CAP__CLOCK_POWER_MANAGEMENT_MASK))
118562306a36Sopenharmony_ci		bClkReqSupport = false;
118662306a36Sopenharmony_ci
118762306a36Sopenharmony_ci	if (bClkReqSupport) {
118862306a36Sopenharmony_ci		orig = data = RREG32_SMC(ixTHM_CLK_CNTL);
118962306a36Sopenharmony_ci		data &= ~(THM_CLK_CNTL__CMON_CLK_SEL_MASK | THM_CLK_CNTL__TMON_CLK_SEL_MASK);
119062306a36Sopenharmony_ci		data |= (1 << THM_CLK_CNTL__CMON_CLK_SEL__SHIFT) |
119162306a36Sopenharmony_ci				(1 << THM_CLK_CNTL__TMON_CLK_SEL__SHIFT);
119262306a36Sopenharmony_ci		if (orig != data)
119362306a36Sopenharmony_ci			WREG32_SMC(ixTHM_CLK_CNTL, data);
119462306a36Sopenharmony_ci
119562306a36Sopenharmony_ci		orig = data = RREG32_SMC(ixMISC_CLK_CTRL);
119662306a36Sopenharmony_ci		data &= ~(MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL_MASK |
119762306a36Sopenharmony_ci			MISC_CLK_CTRL__ZCLK_SEL_MASK | MISC_CLK_CTRL__DFT_SMS_PG_CLK_SEL_MASK);
119862306a36Sopenharmony_ci		data |= (1 << MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL__SHIFT) |
119962306a36Sopenharmony_ci				(1 << MISC_CLK_CTRL__ZCLK_SEL__SHIFT);
120062306a36Sopenharmony_ci		data |= (0x20 << MISC_CLK_CTRL__DFT_SMS_PG_CLK_SEL__SHIFT);
120162306a36Sopenharmony_ci		if (orig != data)
120262306a36Sopenharmony_ci			WREG32_SMC(ixMISC_CLK_CTRL, data);
120362306a36Sopenharmony_ci
120462306a36Sopenharmony_ci		orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL);
120562306a36Sopenharmony_ci		data |= CG_CLKPIN_CNTL__XTALIN_DIVIDE_MASK;
120662306a36Sopenharmony_ci		if (orig != data)
120762306a36Sopenharmony_ci			WREG32_SMC(ixCG_CLKPIN_CNTL, data);
120862306a36Sopenharmony_ci
120962306a36Sopenharmony_ci		orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL_2);
121062306a36Sopenharmony_ci		data |= CG_CLKPIN_CNTL_2__ENABLE_XCLK_MASK;
121162306a36Sopenharmony_ci		if (orig != data)
121262306a36Sopenharmony_ci			WREG32_SMC(ixCG_CLKPIN_CNTL, data);
121362306a36Sopenharmony_ci
121462306a36Sopenharmony_ci		orig = data = RREG32_SMC(ixMPLL_BYPASSCLK_SEL);
121562306a36Sopenharmony_ci		data &= ~MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL_MASK;
121662306a36Sopenharmony_ci		data |= (4 << MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL__SHIFT);
121762306a36Sopenharmony_ci		if (orig != data)
121862306a36Sopenharmony_ci			WREG32_SMC(ixMPLL_BYPASSCLK_SEL, data);
121962306a36Sopenharmony_ci
122062306a36Sopenharmony_ci		orig = data = RREG32_PCIE(ixCPM_CONTROL);
122162306a36Sopenharmony_ci		data |= (CPM_CONTROL__REFCLK_XSTCLK_ENABLE_MASK |
122262306a36Sopenharmony_ci				CPM_CONTROL__CLKREQb_UNGATE_TXCLK_ENABLE_MASK);
122362306a36Sopenharmony_ci		if (orig != data)
122462306a36Sopenharmony_ci			WREG32_PCIE(ixCPM_CONTROL, data);
122562306a36Sopenharmony_ci
122662306a36Sopenharmony_ci		orig = data = RREG32_PCIE(ixPCIE_CONFIG_CNTL);
122762306a36Sopenharmony_ci		data &= ~PCIE_CONFIG_CNTL__DYN_CLK_LATENCY_MASK;
122862306a36Sopenharmony_ci		data |= (0xE << PCIE_CONFIG_CNTL__DYN_CLK_LATENCY__SHIFT);
122962306a36Sopenharmony_ci		if (orig != data)
123062306a36Sopenharmony_ci			WREG32_PCIE(ixPCIE_CONFIG_CNTL, data);
123162306a36Sopenharmony_ci
123262306a36Sopenharmony_ci		orig = data = RREG32(mmBIF_CLK_CTRL);
123362306a36Sopenharmony_ci		data |= BIF_CLK_CTRL__BIF_XSTCLK_READY_MASK;
123462306a36Sopenharmony_ci		if (orig != data)
123562306a36Sopenharmony_ci			WREG32(mmBIF_CLK_CTRL, data);
123662306a36Sopenharmony_ci
123762306a36Sopenharmony_ci		orig = data = RREG32_PCIE(ixPCIE_LC_CNTL7);
123862306a36Sopenharmony_ci		data |= PCIE_LC_CNTL7__LC_L1_SIDEBAND_CLKREQ_PDWN_EN_MASK;
123962306a36Sopenharmony_ci		if (orig != data)
124062306a36Sopenharmony_ci			WREG32_PCIE(ixPCIE_LC_CNTL7, data);
124162306a36Sopenharmony_ci
124262306a36Sopenharmony_ci		orig = data = RREG32_PCIE(ixPCIE_HW_DEBUG);
124362306a36Sopenharmony_ci		data |= PCIE_HW_DEBUG__HW_01_DEBUG_MASK;
124462306a36Sopenharmony_ci		if (orig != data)
124562306a36Sopenharmony_ci			WREG32_PCIE(ixPCIE_HW_DEBUG, data);
124662306a36Sopenharmony_ci
124762306a36Sopenharmony_ci		orig = data = RREG32_PCIE(ixPCIE_LC_CNTL2);
124862306a36Sopenharmony_ci		data |= PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L23_MASK;
124962306a36Sopenharmony_ci		data |= PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L1_MASK;
125062306a36Sopenharmony_ci		if (bL1SS)
125162306a36Sopenharmony_ci			data &= ~PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L1_MASK;
125262306a36Sopenharmony_ci		if (orig != data)
125362306a36Sopenharmony_ci			WREG32_PCIE(ixPCIE_LC_CNTL2, data);
125462306a36Sopenharmony_ci
125562306a36Sopenharmony_ci	}
125662306a36Sopenharmony_ci
125762306a36Sopenharmony_ci	vi_enable_aspm(adev);
125862306a36Sopenharmony_ci
125962306a36Sopenharmony_ci	data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
126062306a36Sopenharmony_ci	data1 = RREG32_PCIE(ixPCIE_LC_STATUS1);
126162306a36Sopenharmony_ci	if (((data & PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) == PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) &&
126262306a36Sopenharmony_ci	    data1 & PCIE_LC_STATUS1__LC_REVERSE_XMIT_MASK &&
126362306a36Sopenharmony_ci	    data1 & PCIE_LC_STATUS1__LC_REVERSE_RCVR_MASK) {
126462306a36Sopenharmony_ci		orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
126562306a36Sopenharmony_ci		data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK;
126662306a36Sopenharmony_ci		if (orig != data)
126762306a36Sopenharmony_ci			WREG32_PCIE(ixPCIE_LC_CNTL, data);
126862306a36Sopenharmony_ci	}
126962306a36Sopenharmony_ci
127062306a36Sopenharmony_ci	if ((adev->asic_type == CHIP_POLARIS12 &&
127162306a36Sopenharmony_ci	    !(ASICID_IS_P23(adev->pdev->device, adev->pdev->revision))) ||
127262306a36Sopenharmony_ci	    ASIC_IS_P22(adev->asic_type, adev->external_rev_id)) {
127362306a36Sopenharmony_ci		orig = data = RREG32_PCIE(ixPCIE_LC_TRAINING_CNTL);
127462306a36Sopenharmony_ci		data &= ~PCIE_LC_TRAINING_CNTL__LC_DISABLE_TRAINING_BIT_ARCH_MASK;
127562306a36Sopenharmony_ci		if (orig != data)
127662306a36Sopenharmony_ci			WREG32_PCIE(ixPCIE_LC_TRAINING_CNTL, data);
127762306a36Sopenharmony_ci	}
127862306a36Sopenharmony_ci}
127962306a36Sopenharmony_ci
128062306a36Sopenharmony_cistatic void vi_enable_doorbell_aperture(struct amdgpu_device *adev,
128162306a36Sopenharmony_ci					bool enable)
128262306a36Sopenharmony_ci{
128362306a36Sopenharmony_ci	u32 tmp;
128462306a36Sopenharmony_ci
128562306a36Sopenharmony_ci	/* not necessary on CZ */
128662306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
128762306a36Sopenharmony_ci		return;
128862306a36Sopenharmony_ci
128962306a36Sopenharmony_ci	tmp = RREG32(mmBIF_DOORBELL_APER_EN);
129062306a36Sopenharmony_ci	if (enable)
129162306a36Sopenharmony_ci		tmp = REG_SET_FIELD(tmp, BIF_DOORBELL_APER_EN, BIF_DOORBELL_APER_EN, 1);
129262306a36Sopenharmony_ci	else
129362306a36Sopenharmony_ci		tmp = REG_SET_FIELD(tmp, BIF_DOORBELL_APER_EN, BIF_DOORBELL_APER_EN, 0);
129462306a36Sopenharmony_ci
129562306a36Sopenharmony_ci	WREG32(mmBIF_DOORBELL_APER_EN, tmp);
129662306a36Sopenharmony_ci}
129762306a36Sopenharmony_ci
129862306a36Sopenharmony_ci#define ATI_REV_ID_FUSE_MACRO__ADDRESS      0xC0014044
129962306a36Sopenharmony_ci#define ATI_REV_ID_FUSE_MACRO__SHIFT        9
130062306a36Sopenharmony_ci#define ATI_REV_ID_FUSE_MACRO__MASK         0x00001E00
130162306a36Sopenharmony_ci
130262306a36Sopenharmony_cistatic uint32_t vi_get_rev_id(struct amdgpu_device *adev)
130362306a36Sopenharmony_ci{
130462306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
130562306a36Sopenharmony_ci		return (RREG32_SMC(ATI_REV_ID_FUSE_MACRO__ADDRESS) & ATI_REV_ID_FUSE_MACRO__MASK)
130662306a36Sopenharmony_ci			>> ATI_REV_ID_FUSE_MACRO__SHIFT;
130762306a36Sopenharmony_ci	else
130862306a36Sopenharmony_ci		return (RREG32(mmPCIE_EFUSE4) & PCIE_EFUSE4__STRAP_BIF_ATI_REV_ID_MASK)
130962306a36Sopenharmony_ci			>> PCIE_EFUSE4__STRAP_BIF_ATI_REV_ID__SHIFT;
131062306a36Sopenharmony_ci}
131162306a36Sopenharmony_ci
131262306a36Sopenharmony_cistatic void vi_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
131362306a36Sopenharmony_ci{
131462306a36Sopenharmony_ci	if (!ring || !ring->funcs->emit_wreg) {
131562306a36Sopenharmony_ci		WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
131662306a36Sopenharmony_ci		RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
131762306a36Sopenharmony_ci	} else {
131862306a36Sopenharmony_ci		amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
131962306a36Sopenharmony_ci	}
132062306a36Sopenharmony_ci}
132162306a36Sopenharmony_ci
132262306a36Sopenharmony_cistatic void vi_invalidate_hdp(struct amdgpu_device *adev,
132362306a36Sopenharmony_ci			      struct amdgpu_ring *ring)
132462306a36Sopenharmony_ci{
132562306a36Sopenharmony_ci	if (!ring || !ring->funcs->emit_wreg) {
132662306a36Sopenharmony_ci		WREG32(mmHDP_DEBUG0, 1);
132762306a36Sopenharmony_ci		RREG32(mmHDP_DEBUG0);
132862306a36Sopenharmony_ci	} else {
132962306a36Sopenharmony_ci		amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
133062306a36Sopenharmony_ci	}
133162306a36Sopenharmony_ci}
133262306a36Sopenharmony_ci
133362306a36Sopenharmony_cistatic bool vi_need_full_reset(struct amdgpu_device *adev)
133462306a36Sopenharmony_ci{
133562306a36Sopenharmony_ci	switch (adev->asic_type) {
133662306a36Sopenharmony_ci	case CHIP_CARRIZO:
133762306a36Sopenharmony_ci	case CHIP_STONEY:
133862306a36Sopenharmony_ci		/* CZ has hang issues with full reset at the moment */
133962306a36Sopenharmony_ci		return false;
134062306a36Sopenharmony_ci	case CHIP_FIJI:
134162306a36Sopenharmony_ci	case CHIP_TONGA:
134262306a36Sopenharmony_ci		/* XXX: soft reset should work on fiji and tonga */
134362306a36Sopenharmony_ci		return true;
134462306a36Sopenharmony_ci	case CHIP_POLARIS10:
134562306a36Sopenharmony_ci	case CHIP_POLARIS11:
134662306a36Sopenharmony_ci	case CHIP_POLARIS12:
134762306a36Sopenharmony_ci	case CHIP_TOPAZ:
134862306a36Sopenharmony_ci	default:
134962306a36Sopenharmony_ci		/* change this when we support soft reset */
135062306a36Sopenharmony_ci		return true;
135162306a36Sopenharmony_ci	}
135262306a36Sopenharmony_ci}
135362306a36Sopenharmony_ci
135462306a36Sopenharmony_cistatic void vi_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
135562306a36Sopenharmony_ci			      uint64_t *count1)
135662306a36Sopenharmony_ci{
135762306a36Sopenharmony_ci	uint32_t perfctr = 0;
135862306a36Sopenharmony_ci	uint64_t cnt0_of, cnt1_of;
135962306a36Sopenharmony_ci	int tmp;
136062306a36Sopenharmony_ci
136162306a36Sopenharmony_ci	/* This reports 0 on APUs, so return to avoid writing/reading registers
136262306a36Sopenharmony_ci	 * that may or may not be different from their GPU counterparts
136362306a36Sopenharmony_ci	 */
136462306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
136562306a36Sopenharmony_ci		return;
136662306a36Sopenharmony_ci
136762306a36Sopenharmony_ci	/* Set the 2 events that we wish to watch, defined above */
136862306a36Sopenharmony_ci	/* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
136962306a36Sopenharmony_ci	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
137062306a36Sopenharmony_ci	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
137162306a36Sopenharmony_ci
137262306a36Sopenharmony_ci	/* Write to enable desired perf counters */
137362306a36Sopenharmony_ci	WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
137462306a36Sopenharmony_ci	/* Zero out and enable the perf counters
137562306a36Sopenharmony_ci	 * Write 0x5:
137662306a36Sopenharmony_ci	 * Bit 0 = Start all counters(1)
137762306a36Sopenharmony_ci	 * Bit 2 = Global counter reset enable(1)
137862306a36Sopenharmony_ci	 */
137962306a36Sopenharmony_ci	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
138062306a36Sopenharmony_ci
138162306a36Sopenharmony_ci	msleep(1000);
138262306a36Sopenharmony_ci
138362306a36Sopenharmony_ci	/* Load the shadow and disable the perf counters
138462306a36Sopenharmony_ci	 * Write 0x2:
138562306a36Sopenharmony_ci	 * Bit 0 = Stop counters(0)
138662306a36Sopenharmony_ci	 * Bit 1 = Load the shadow counters(1)
138762306a36Sopenharmony_ci	 */
138862306a36Sopenharmony_ci	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
138962306a36Sopenharmony_ci
139062306a36Sopenharmony_ci	/* Read register values to get any >32bit overflow */
139162306a36Sopenharmony_ci	tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
139262306a36Sopenharmony_ci	cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
139362306a36Sopenharmony_ci	cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
139462306a36Sopenharmony_ci
139562306a36Sopenharmony_ci	/* Get the values and add the overflow */
139662306a36Sopenharmony_ci	*count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
139762306a36Sopenharmony_ci	*count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
139862306a36Sopenharmony_ci}
139962306a36Sopenharmony_ci
140062306a36Sopenharmony_cistatic uint64_t vi_get_pcie_replay_count(struct amdgpu_device *adev)
140162306a36Sopenharmony_ci{
140262306a36Sopenharmony_ci	uint64_t nak_r, nak_g;
140362306a36Sopenharmony_ci
140462306a36Sopenharmony_ci	/* Get the number of NAKs received and generated */
140562306a36Sopenharmony_ci	nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
140662306a36Sopenharmony_ci	nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
140762306a36Sopenharmony_ci
140862306a36Sopenharmony_ci	/* Add the total number of NAKs, i.e the number of replays */
140962306a36Sopenharmony_ci	return (nak_r + nak_g);
141062306a36Sopenharmony_ci}
141162306a36Sopenharmony_ci
141262306a36Sopenharmony_cistatic bool vi_need_reset_on_init(struct amdgpu_device *adev)
141362306a36Sopenharmony_ci{
141462306a36Sopenharmony_ci	u32 clock_cntl, pc;
141562306a36Sopenharmony_ci
141662306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
141762306a36Sopenharmony_ci		return false;
141862306a36Sopenharmony_ci
141962306a36Sopenharmony_ci	/* check if the SMC is already running */
142062306a36Sopenharmony_ci	clock_cntl = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
142162306a36Sopenharmony_ci	pc = RREG32_SMC(ixSMC_PC_C);
142262306a36Sopenharmony_ci	if ((0 == REG_GET_FIELD(clock_cntl, SMC_SYSCON_CLOCK_CNTL_0, ck_disable)) &&
142362306a36Sopenharmony_ci	    (0x20100 <= pc))
142462306a36Sopenharmony_ci		return true;
142562306a36Sopenharmony_ci
142662306a36Sopenharmony_ci	return false;
142762306a36Sopenharmony_ci}
142862306a36Sopenharmony_ci
142962306a36Sopenharmony_cistatic void vi_pre_asic_init(struct amdgpu_device *adev)
143062306a36Sopenharmony_ci{
143162306a36Sopenharmony_ci}
143262306a36Sopenharmony_ci
143362306a36Sopenharmony_cistatic const struct amdgpu_asic_funcs vi_asic_funcs =
143462306a36Sopenharmony_ci{
143562306a36Sopenharmony_ci	.read_disabled_bios = &vi_read_disabled_bios,
143662306a36Sopenharmony_ci	.read_bios_from_rom = &vi_read_bios_from_rom,
143762306a36Sopenharmony_ci	.read_register = &vi_read_register,
143862306a36Sopenharmony_ci	.reset = &vi_asic_reset,
143962306a36Sopenharmony_ci	.reset_method = &vi_asic_reset_method,
144062306a36Sopenharmony_ci	.get_xclk = &vi_get_xclk,
144162306a36Sopenharmony_ci	.set_uvd_clocks = &vi_set_uvd_clocks,
144262306a36Sopenharmony_ci	.set_vce_clocks = &vi_set_vce_clocks,
144362306a36Sopenharmony_ci	.get_config_memsize = &vi_get_config_memsize,
144462306a36Sopenharmony_ci	.flush_hdp = &vi_flush_hdp,
144562306a36Sopenharmony_ci	.invalidate_hdp = &vi_invalidate_hdp,
144662306a36Sopenharmony_ci	.need_full_reset = &vi_need_full_reset,
144762306a36Sopenharmony_ci	.init_doorbell_index = &legacy_doorbell_index_init,
144862306a36Sopenharmony_ci	.get_pcie_usage = &vi_get_pcie_usage,
144962306a36Sopenharmony_ci	.need_reset_on_init = &vi_need_reset_on_init,
145062306a36Sopenharmony_ci	.get_pcie_replay_count = &vi_get_pcie_replay_count,
145162306a36Sopenharmony_ci	.supports_baco = &vi_asic_supports_baco,
145262306a36Sopenharmony_ci	.pre_asic_init = &vi_pre_asic_init,
145362306a36Sopenharmony_ci	.query_video_codecs = &vi_query_video_codecs,
145462306a36Sopenharmony_ci};
145562306a36Sopenharmony_ci
145662306a36Sopenharmony_ci#define CZ_REV_BRISTOL(rev)	 \
145762306a36Sopenharmony_ci	((rev >= 0xC8 && rev <= 0xCE) || (rev >= 0xE1 && rev <= 0xE6))
145862306a36Sopenharmony_ci
145962306a36Sopenharmony_cistatic int vi_common_early_init(void *handle)
146062306a36Sopenharmony_ci{
146162306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
146262306a36Sopenharmony_ci
146362306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU) {
146462306a36Sopenharmony_ci		adev->smc_rreg = &cz_smc_rreg;
146562306a36Sopenharmony_ci		adev->smc_wreg = &cz_smc_wreg;
146662306a36Sopenharmony_ci	} else {
146762306a36Sopenharmony_ci		adev->smc_rreg = &vi_smc_rreg;
146862306a36Sopenharmony_ci		adev->smc_wreg = &vi_smc_wreg;
146962306a36Sopenharmony_ci	}
147062306a36Sopenharmony_ci	adev->pcie_rreg = &vi_pcie_rreg;
147162306a36Sopenharmony_ci	adev->pcie_wreg = &vi_pcie_wreg;
147262306a36Sopenharmony_ci	adev->uvd_ctx_rreg = &vi_uvd_ctx_rreg;
147362306a36Sopenharmony_ci	adev->uvd_ctx_wreg = &vi_uvd_ctx_wreg;
147462306a36Sopenharmony_ci	adev->didt_rreg = &vi_didt_rreg;
147562306a36Sopenharmony_ci	adev->didt_wreg = &vi_didt_wreg;
147662306a36Sopenharmony_ci	adev->gc_cac_rreg = &vi_gc_cac_rreg;
147762306a36Sopenharmony_ci	adev->gc_cac_wreg = &vi_gc_cac_wreg;
147862306a36Sopenharmony_ci
147962306a36Sopenharmony_ci	adev->asic_funcs = &vi_asic_funcs;
148062306a36Sopenharmony_ci
148162306a36Sopenharmony_ci	adev->rev_id = vi_get_rev_id(adev);
148262306a36Sopenharmony_ci	adev->external_rev_id = 0xFF;
148362306a36Sopenharmony_ci	switch (adev->asic_type) {
148462306a36Sopenharmony_ci	case CHIP_TOPAZ:
148562306a36Sopenharmony_ci		adev->cg_flags = 0;
148662306a36Sopenharmony_ci		adev->pg_flags = 0;
148762306a36Sopenharmony_ci		adev->external_rev_id = 0x1;
148862306a36Sopenharmony_ci		break;
148962306a36Sopenharmony_ci	case CHIP_FIJI:
149062306a36Sopenharmony_ci		adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
149162306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGLS |
149262306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
149362306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
149462306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS |
149562306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS_LS |
149662306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGCG |
149762306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
149862306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
149962306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
150062306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
150162306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
150262306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
150362306a36Sopenharmony_ci			AMD_CG_SUPPORT_ROM_MGCG |
150462306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
150562306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
150662306a36Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG;
150762306a36Sopenharmony_ci		adev->pg_flags = 0;
150862306a36Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x3c;
150962306a36Sopenharmony_ci		break;
151062306a36Sopenharmony_ci	case CHIP_TONGA:
151162306a36Sopenharmony_ci		adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
151262306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGCG |
151362306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
151462306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
151562306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
151662306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
151762306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
151862306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
151962306a36Sopenharmony_ci			AMD_CG_SUPPORT_ROM_MGCG |
152062306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
152162306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
152262306a36Sopenharmony_ci			AMD_CG_SUPPORT_DRM_LS |
152362306a36Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG;
152462306a36Sopenharmony_ci		adev->pg_flags = 0;
152562306a36Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x14;
152662306a36Sopenharmony_ci		break;
152762306a36Sopenharmony_ci	case CHIP_POLARIS11:
152862306a36Sopenharmony_ci		adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
152962306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
153062306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
153162306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGCG |
153262306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
153362306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGCG |
153462306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGLS |
153562306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
153662306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
153762306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_MGCG |
153862306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
153962306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
154062306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
154162306a36Sopenharmony_ci			AMD_CG_SUPPORT_ROM_MGCG |
154262306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
154362306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
154462306a36Sopenharmony_ci			AMD_CG_SUPPORT_DRM_LS |
154562306a36Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
154662306a36Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG;
154762306a36Sopenharmony_ci		adev->pg_flags = 0;
154862306a36Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x5A;
154962306a36Sopenharmony_ci		break;
155062306a36Sopenharmony_ci	case CHIP_POLARIS10:
155162306a36Sopenharmony_ci		adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
155262306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
155362306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
155462306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGCG |
155562306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
155662306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGCG |
155762306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGLS |
155862306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
155962306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
156062306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_MGCG |
156162306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
156262306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
156362306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
156462306a36Sopenharmony_ci			AMD_CG_SUPPORT_ROM_MGCG |
156562306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
156662306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
156762306a36Sopenharmony_ci			AMD_CG_SUPPORT_DRM_LS |
156862306a36Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
156962306a36Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG;
157062306a36Sopenharmony_ci		adev->pg_flags = 0;
157162306a36Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x50;
157262306a36Sopenharmony_ci		break;
157362306a36Sopenharmony_ci	case CHIP_POLARIS12:
157462306a36Sopenharmony_ci		adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
157562306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
157662306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
157762306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGCG |
157862306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
157962306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGCG |
158062306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGLS |
158162306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
158262306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
158362306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_MGCG |
158462306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
158562306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
158662306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
158762306a36Sopenharmony_ci			AMD_CG_SUPPORT_ROM_MGCG |
158862306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
158962306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
159062306a36Sopenharmony_ci			AMD_CG_SUPPORT_DRM_LS |
159162306a36Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
159262306a36Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG;
159362306a36Sopenharmony_ci		adev->pg_flags = 0;
159462306a36Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x64;
159562306a36Sopenharmony_ci		break;
159662306a36Sopenharmony_ci	case CHIP_VEGAM:
159762306a36Sopenharmony_ci		adev->cg_flags = 0;
159862306a36Sopenharmony_ci			/*AMD_CG_SUPPORT_GFX_MGCG |
159962306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
160062306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
160162306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGCG |
160262306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
160362306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGCG |
160462306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_3D_CGLS |
160562306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
160662306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
160762306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_MGCG |
160862306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
160962306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
161062306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
161162306a36Sopenharmony_ci			AMD_CG_SUPPORT_ROM_MGCG |
161262306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
161362306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
161462306a36Sopenharmony_ci			AMD_CG_SUPPORT_DRM_LS |
161562306a36Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
161662306a36Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG;*/
161762306a36Sopenharmony_ci		adev->pg_flags = 0;
161862306a36Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x6E;
161962306a36Sopenharmony_ci		break;
162062306a36Sopenharmony_ci	case CHIP_CARRIZO:
162162306a36Sopenharmony_ci		adev->cg_flags = AMD_CG_SUPPORT_UVD_MGCG |
162262306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGCG |
162362306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGLS |
162462306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
162562306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
162662306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS |
162762306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS_LS |
162862306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGCG |
162962306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
163062306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
163162306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
163262306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
163362306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
163462306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
163562306a36Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG;
163662306a36Sopenharmony_ci		/* rev0 hardware requires workarounds to support PG */
163762306a36Sopenharmony_ci		adev->pg_flags = 0;
163862306a36Sopenharmony_ci		if (adev->rev_id != 0x00 || CZ_REV_BRISTOL(adev->pdev->revision)) {
163962306a36Sopenharmony_ci			adev->pg_flags |= AMD_PG_SUPPORT_GFX_SMG |
164062306a36Sopenharmony_ci				AMD_PG_SUPPORT_GFX_PIPELINE |
164162306a36Sopenharmony_ci				AMD_PG_SUPPORT_CP |
164262306a36Sopenharmony_ci				AMD_PG_SUPPORT_UVD |
164362306a36Sopenharmony_ci				AMD_PG_SUPPORT_VCE;
164462306a36Sopenharmony_ci		}
164562306a36Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x1;
164662306a36Sopenharmony_ci		break;
164762306a36Sopenharmony_ci	case CHIP_STONEY:
164862306a36Sopenharmony_ci		adev->cg_flags = AMD_CG_SUPPORT_UVD_MGCG |
164962306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGCG |
165062306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGLS |
165162306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
165262306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
165362306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS |
165462306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS_LS |
165562306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
165662306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
165762306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG |
165862306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
165962306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
166062306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
166162306a36Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG;
166262306a36Sopenharmony_ci		adev->pg_flags = AMD_PG_SUPPORT_GFX_PG |
166362306a36Sopenharmony_ci			AMD_PG_SUPPORT_GFX_SMG |
166462306a36Sopenharmony_ci			AMD_PG_SUPPORT_GFX_PIPELINE |
166562306a36Sopenharmony_ci			AMD_PG_SUPPORT_CP |
166662306a36Sopenharmony_ci			AMD_PG_SUPPORT_UVD |
166762306a36Sopenharmony_ci			AMD_PG_SUPPORT_VCE;
166862306a36Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x61;
166962306a36Sopenharmony_ci		break;
167062306a36Sopenharmony_ci	default:
167162306a36Sopenharmony_ci		/* FIXME: not supported yet */
167262306a36Sopenharmony_ci		return -EINVAL;
167362306a36Sopenharmony_ci	}
167462306a36Sopenharmony_ci
167562306a36Sopenharmony_ci	if (amdgpu_sriov_vf(adev)) {
167662306a36Sopenharmony_ci		amdgpu_virt_init_setting(adev);
167762306a36Sopenharmony_ci		xgpu_vi_mailbox_set_irq_funcs(adev);
167862306a36Sopenharmony_ci	}
167962306a36Sopenharmony_ci
168062306a36Sopenharmony_ci	return 0;
168162306a36Sopenharmony_ci}
168262306a36Sopenharmony_ci
168362306a36Sopenharmony_cistatic int vi_common_late_init(void *handle)
168462306a36Sopenharmony_ci{
168562306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
168662306a36Sopenharmony_ci
168762306a36Sopenharmony_ci	if (amdgpu_sriov_vf(adev))
168862306a36Sopenharmony_ci		xgpu_vi_mailbox_get_irq(adev);
168962306a36Sopenharmony_ci
169062306a36Sopenharmony_ci	return 0;
169162306a36Sopenharmony_ci}
169262306a36Sopenharmony_ci
169362306a36Sopenharmony_cistatic int vi_common_sw_init(void *handle)
169462306a36Sopenharmony_ci{
169562306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
169662306a36Sopenharmony_ci
169762306a36Sopenharmony_ci	if (amdgpu_sriov_vf(adev))
169862306a36Sopenharmony_ci		xgpu_vi_mailbox_add_irq_id(adev);
169962306a36Sopenharmony_ci
170062306a36Sopenharmony_ci	return 0;
170162306a36Sopenharmony_ci}
170262306a36Sopenharmony_ci
170362306a36Sopenharmony_cistatic int vi_common_sw_fini(void *handle)
170462306a36Sopenharmony_ci{
170562306a36Sopenharmony_ci	return 0;
170662306a36Sopenharmony_ci}
170762306a36Sopenharmony_ci
170862306a36Sopenharmony_cistatic int vi_common_hw_init(void *handle)
170962306a36Sopenharmony_ci{
171062306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
171162306a36Sopenharmony_ci
171262306a36Sopenharmony_ci	/* move the golden regs per IP block */
171362306a36Sopenharmony_ci	vi_init_golden_registers(adev);
171462306a36Sopenharmony_ci	/* enable aspm */
171562306a36Sopenharmony_ci	vi_program_aspm(adev);
171662306a36Sopenharmony_ci	/* enable the doorbell aperture */
171762306a36Sopenharmony_ci	vi_enable_doorbell_aperture(adev, true);
171862306a36Sopenharmony_ci
171962306a36Sopenharmony_ci	return 0;
172062306a36Sopenharmony_ci}
172162306a36Sopenharmony_ci
172262306a36Sopenharmony_cistatic int vi_common_hw_fini(void *handle)
172362306a36Sopenharmony_ci{
172462306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
172562306a36Sopenharmony_ci
172662306a36Sopenharmony_ci	/* enable the doorbell aperture */
172762306a36Sopenharmony_ci	vi_enable_doorbell_aperture(adev, false);
172862306a36Sopenharmony_ci
172962306a36Sopenharmony_ci	if (amdgpu_sriov_vf(adev))
173062306a36Sopenharmony_ci		xgpu_vi_mailbox_put_irq(adev);
173162306a36Sopenharmony_ci
173262306a36Sopenharmony_ci	return 0;
173362306a36Sopenharmony_ci}
173462306a36Sopenharmony_ci
173562306a36Sopenharmony_cistatic int vi_common_suspend(void *handle)
173662306a36Sopenharmony_ci{
173762306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
173862306a36Sopenharmony_ci
173962306a36Sopenharmony_ci	return vi_common_hw_fini(adev);
174062306a36Sopenharmony_ci}
174162306a36Sopenharmony_ci
174262306a36Sopenharmony_cistatic int vi_common_resume(void *handle)
174362306a36Sopenharmony_ci{
174462306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
174562306a36Sopenharmony_ci
174662306a36Sopenharmony_ci	return vi_common_hw_init(adev);
174762306a36Sopenharmony_ci}
174862306a36Sopenharmony_ci
174962306a36Sopenharmony_cistatic bool vi_common_is_idle(void *handle)
175062306a36Sopenharmony_ci{
175162306a36Sopenharmony_ci	return true;
175262306a36Sopenharmony_ci}
175362306a36Sopenharmony_ci
175462306a36Sopenharmony_cistatic int vi_common_wait_for_idle(void *handle)
175562306a36Sopenharmony_ci{
175662306a36Sopenharmony_ci	return 0;
175762306a36Sopenharmony_ci}
175862306a36Sopenharmony_ci
175962306a36Sopenharmony_cistatic int vi_common_soft_reset(void *handle)
176062306a36Sopenharmony_ci{
176162306a36Sopenharmony_ci	return 0;
176262306a36Sopenharmony_ci}
176362306a36Sopenharmony_ci
176462306a36Sopenharmony_cistatic void vi_update_bif_medium_grain_light_sleep(struct amdgpu_device *adev,
176562306a36Sopenharmony_ci						   bool enable)
176662306a36Sopenharmony_ci{
176762306a36Sopenharmony_ci	uint32_t temp, data;
176862306a36Sopenharmony_ci
176962306a36Sopenharmony_ci	temp = data = RREG32_PCIE(ixPCIE_CNTL2);
177062306a36Sopenharmony_ci
177162306a36Sopenharmony_ci	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_BIF_LS))
177262306a36Sopenharmony_ci		data |= PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
177362306a36Sopenharmony_ci				PCIE_CNTL2__MST_MEM_LS_EN_MASK |
177462306a36Sopenharmony_ci				PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK;
177562306a36Sopenharmony_ci	else
177662306a36Sopenharmony_ci		data &= ~(PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
177762306a36Sopenharmony_ci				PCIE_CNTL2__MST_MEM_LS_EN_MASK |
177862306a36Sopenharmony_ci				PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK);
177962306a36Sopenharmony_ci
178062306a36Sopenharmony_ci	if (temp != data)
178162306a36Sopenharmony_ci		WREG32_PCIE(ixPCIE_CNTL2, data);
178262306a36Sopenharmony_ci}
178362306a36Sopenharmony_ci
178462306a36Sopenharmony_cistatic void vi_update_hdp_medium_grain_clock_gating(struct amdgpu_device *adev,
178562306a36Sopenharmony_ci						    bool enable)
178662306a36Sopenharmony_ci{
178762306a36Sopenharmony_ci	uint32_t temp, data;
178862306a36Sopenharmony_ci
178962306a36Sopenharmony_ci	temp = data = RREG32(mmHDP_HOST_PATH_CNTL);
179062306a36Sopenharmony_ci
179162306a36Sopenharmony_ci	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_MGCG))
179262306a36Sopenharmony_ci		data &= ~HDP_HOST_PATH_CNTL__CLOCK_GATING_DIS_MASK;
179362306a36Sopenharmony_ci	else
179462306a36Sopenharmony_ci		data |= HDP_HOST_PATH_CNTL__CLOCK_GATING_DIS_MASK;
179562306a36Sopenharmony_ci
179662306a36Sopenharmony_ci	if (temp != data)
179762306a36Sopenharmony_ci		WREG32(mmHDP_HOST_PATH_CNTL, data);
179862306a36Sopenharmony_ci}
179962306a36Sopenharmony_ci
180062306a36Sopenharmony_cistatic void vi_update_hdp_light_sleep(struct amdgpu_device *adev,
180162306a36Sopenharmony_ci				      bool enable)
180262306a36Sopenharmony_ci{
180362306a36Sopenharmony_ci	uint32_t temp, data;
180462306a36Sopenharmony_ci
180562306a36Sopenharmony_ci	temp = data = RREG32(mmHDP_MEM_POWER_LS);
180662306a36Sopenharmony_ci
180762306a36Sopenharmony_ci	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS))
180862306a36Sopenharmony_ci		data |= HDP_MEM_POWER_LS__LS_ENABLE_MASK;
180962306a36Sopenharmony_ci	else
181062306a36Sopenharmony_ci		data &= ~HDP_MEM_POWER_LS__LS_ENABLE_MASK;
181162306a36Sopenharmony_ci
181262306a36Sopenharmony_ci	if (temp != data)
181362306a36Sopenharmony_ci		WREG32(mmHDP_MEM_POWER_LS, data);
181462306a36Sopenharmony_ci}
181562306a36Sopenharmony_ci
181662306a36Sopenharmony_cistatic void vi_update_drm_light_sleep(struct amdgpu_device *adev,
181762306a36Sopenharmony_ci				      bool enable)
181862306a36Sopenharmony_ci{
181962306a36Sopenharmony_ci	uint32_t temp, data;
182062306a36Sopenharmony_ci
182162306a36Sopenharmony_ci	temp = data = RREG32(0x157a);
182262306a36Sopenharmony_ci
182362306a36Sopenharmony_ci	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_DRM_LS))
182462306a36Sopenharmony_ci		data |= 1;
182562306a36Sopenharmony_ci	else
182662306a36Sopenharmony_ci		data &= ~1;
182762306a36Sopenharmony_ci
182862306a36Sopenharmony_ci	if (temp != data)
182962306a36Sopenharmony_ci		WREG32(0x157a, data);
183062306a36Sopenharmony_ci}
183162306a36Sopenharmony_ci
183262306a36Sopenharmony_ci
183362306a36Sopenharmony_cistatic void vi_update_rom_medium_grain_clock_gating(struct amdgpu_device *adev,
183462306a36Sopenharmony_ci						    bool enable)
183562306a36Sopenharmony_ci{
183662306a36Sopenharmony_ci	uint32_t temp, data;
183762306a36Sopenharmony_ci
183862306a36Sopenharmony_ci	temp = data = RREG32_SMC(ixCGTT_ROM_CLK_CTRL0);
183962306a36Sopenharmony_ci
184062306a36Sopenharmony_ci	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_ROM_MGCG))
184162306a36Sopenharmony_ci		data &= ~(CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE0_MASK |
184262306a36Sopenharmony_ci				CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE1_MASK);
184362306a36Sopenharmony_ci	else
184462306a36Sopenharmony_ci		data |= CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE0_MASK |
184562306a36Sopenharmony_ci				CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE1_MASK;
184662306a36Sopenharmony_ci
184762306a36Sopenharmony_ci	if (temp != data)
184862306a36Sopenharmony_ci		WREG32_SMC(ixCGTT_ROM_CLK_CTRL0, data);
184962306a36Sopenharmony_ci}
185062306a36Sopenharmony_ci
185162306a36Sopenharmony_cistatic int vi_common_set_clockgating_state_by_smu(void *handle,
185262306a36Sopenharmony_ci					   enum amd_clockgating_state state)
185362306a36Sopenharmony_ci{
185462306a36Sopenharmony_ci	uint32_t msg_id, pp_state = 0;
185562306a36Sopenharmony_ci	uint32_t pp_support_state = 0;
185662306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
185762306a36Sopenharmony_ci
185862306a36Sopenharmony_ci	if (adev->cg_flags & (AMD_CG_SUPPORT_MC_LS | AMD_CG_SUPPORT_MC_MGCG)) {
185962306a36Sopenharmony_ci		if (adev->cg_flags & AMD_CG_SUPPORT_MC_LS) {
186062306a36Sopenharmony_ci			pp_support_state = PP_STATE_SUPPORT_LS;
186162306a36Sopenharmony_ci			pp_state = PP_STATE_LS;
186262306a36Sopenharmony_ci		}
186362306a36Sopenharmony_ci		if (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG) {
186462306a36Sopenharmony_ci			pp_support_state |= PP_STATE_SUPPORT_CG;
186562306a36Sopenharmony_ci			pp_state |= PP_STATE_CG;
186662306a36Sopenharmony_ci		}
186762306a36Sopenharmony_ci		if (state == AMD_CG_STATE_UNGATE)
186862306a36Sopenharmony_ci			pp_state = 0;
186962306a36Sopenharmony_ci		msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
187062306a36Sopenharmony_ci			       PP_BLOCK_SYS_MC,
187162306a36Sopenharmony_ci			       pp_support_state,
187262306a36Sopenharmony_ci			       pp_state);
187362306a36Sopenharmony_ci		amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
187462306a36Sopenharmony_ci	}
187562306a36Sopenharmony_ci
187662306a36Sopenharmony_ci	if (adev->cg_flags & (AMD_CG_SUPPORT_SDMA_LS | AMD_CG_SUPPORT_SDMA_MGCG)) {
187762306a36Sopenharmony_ci		if (adev->cg_flags & AMD_CG_SUPPORT_SDMA_LS) {
187862306a36Sopenharmony_ci			pp_support_state = PP_STATE_SUPPORT_LS;
187962306a36Sopenharmony_ci			pp_state = PP_STATE_LS;
188062306a36Sopenharmony_ci		}
188162306a36Sopenharmony_ci		if (adev->cg_flags & AMD_CG_SUPPORT_SDMA_MGCG) {
188262306a36Sopenharmony_ci			pp_support_state |= PP_STATE_SUPPORT_CG;
188362306a36Sopenharmony_ci			pp_state |= PP_STATE_CG;
188462306a36Sopenharmony_ci		}
188562306a36Sopenharmony_ci		if (state == AMD_CG_STATE_UNGATE)
188662306a36Sopenharmony_ci			pp_state = 0;
188762306a36Sopenharmony_ci		msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
188862306a36Sopenharmony_ci			       PP_BLOCK_SYS_SDMA,
188962306a36Sopenharmony_ci			       pp_support_state,
189062306a36Sopenharmony_ci			       pp_state);
189162306a36Sopenharmony_ci		amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
189262306a36Sopenharmony_ci	}
189362306a36Sopenharmony_ci
189462306a36Sopenharmony_ci	if (adev->cg_flags & (AMD_CG_SUPPORT_HDP_LS | AMD_CG_SUPPORT_HDP_MGCG)) {
189562306a36Sopenharmony_ci		if (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS) {
189662306a36Sopenharmony_ci			pp_support_state = PP_STATE_SUPPORT_LS;
189762306a36Sopenharmony_ci			pp_state = PP_STATE_LS;
189862306a36Sopenharmony_ci		}
189962306a36Sopenharmony_ci		if (adev->cg_flags & AMD_CG_SUPPORT_HDP_MGCG) {
190062306a36Sopenharmony_ci			pp_support_state |= PP_STATE_SUPPORT_CG;
190162306a36Sopenharmony_ci			pp_state |= PP_STATE_CG;
190262306a36Sopenharmony_ci		}
190362306a36Sopenharmony_ci		if (state == AMD_CG_STATE_UNGATE)
190462306a36Sopenharmony_ci			pp_state = 0;
190562306a36Sopenharmony_ci		msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
190662306a36Sopenharmony_ci			       PP_BLOCK_SYS_HDP,
190762306a36Sopenharmony_ci			       pp_support_state,
190862306a36Sopenharmony_ci			       pp_state);
190962306a36Sopenharmony_ci		amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
191062306a36Sopenharmony_ci	}
191162306a36Sopenharmony_ci
191262306a36Sopenharmony_ci
191362306a36Sopenharmony_ci	if (adev->cg_flags & AMD_CG_SUPPORT_BIF_LS) {
191462306a36Sopenharmony_ci		if (state == AMD_CG_STATE_UNGATE)
191562306a36Sopenharmony_ci			pp_state = 0;
191662306a36Sopenharmony_ci		else
191762306a36Sopenharmony_ci			pp_state = PP_STATE_LS;
191862306a36Sopenharmony_ci
191962306a36Sopenharmony_ci		msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
192062306a36Sopenharmony_ci			       PP_BLOCK_SYS_BIF,
192162306a36Sopenharmony_ci			       PP_STATE_SUPPORT_LS,
192262306a36Sopenharmony_ci			        pp_state);
192362306a36Sopenharmony_ci		amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
192462306a36Sopenharmony_ci	}
192562306a36Sopenharmony_ci	if (adev->cg_flags & AMD_CG_SUPPORT_BIF_MGCG) {
192662306a36Sopenharmony_ci		if (state == AMD_CG_STATE_UNGATE)
192762306a36Sopenharmony_ci			pp_state = 0;
192862306a36Sopenharmony_ci		else
192962306a36Sopenharmony_ci			pp_state = PP_STATE_CG;
193062306a36Sopenharmony_ci
193162306a36Sopenharmony_ci		msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
193262306a36Sopenharmony_ci			       PP_BLOCK_SYS_BIF,
193362306a36Sopenharmony_ci			       PP_STATE_SUPPORT_CG,
193462306a36Sopenharmony_ci			       pp_state);
193562306a36Sopenharmony_ci		amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
193662306a36Sopenharmony_ci	}
193762306a36Sopenharmony_ci
193862306a36Sopenharmony_ci	if (adev->cg_flags & AMD_CG_SUPPORT_DRM_LS) {
193962306a36Sopenharmony_ci
194062306a36Sopenharmony_ci		if (state == AMD_CG_STATE_UNGATE)
194162306a36Sopenharmony_ci			pp_state = 0;
194262306a36Sopenharmony_ci		else
194362306a36Sopenharmony_ci			pp_state = PP_STATE_LS;
194462306a36Sopenharmony_ci
194562306a36Sopenharmony_ci		msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
194662306a36Sopenharmony_ci			       PP_BLOCK_SYS_DRM,
194762306a36Sopenharmony_ci			       PP_STATE_SUPPORT_LS,
194862306a36Sopenharmony_ci			       pp_state);
194962306a36Sopenharmony_ci		amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
195062306a36Sopenharmony_ci	}
195162306a36Sopenharmony_ci
195262306a36Sopenharmony_ci	if (adev->cg_flags & AMD_CG_SUPPORT_ROM_MGCG) {
195362306a36Sopenharmony_ci
195462306a36Sopenharmony_ci		if (state == AMD_CG_STATE_UNGATE)
195562306a36Sopenharmony_ci			pp_state = 0;
195662306a36Sopenharmony_ci		else
195762306a36Sopenharmony_ci			pp_state = PP_STATE_CG;
195862306a36Sopenharmony_ci
195962306a36Sopenharmony_ci		msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
196062306a36Sopenharmony_ci			       PP_BLOCK_SYS_ROM,
196162306a36Sopenharmony_ci			       PP_STATE_SUPPORT_CG,
196262306a36Sopenharmony_ci			       pp_state);
196362306a36Sopenharmony_ci		amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
196462306a36Sopenharmony_ci	}
196562306a36Sopenharmony_ci	return 0;
196662306a36Sopenharmony_ci}
196762306a36Sopenharmony_ci
196862306a36Sopenharmony_cistatic int vi_common_set_clockgating_state(void *handle,
196962306a36Sopenharmony_ci					   enum amd_clockgating_state state)
197062306a36Sopenharmony_ci{
197162306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
197262306a36Sopenharmony_ci
197362306a36Sopenharmony_ci	if (amdgpu_sriov_vf(adev))
197462306a36Sopenharmony_ci		return 0;
197562306a36Sopenharmony_ci
197662306a36Sopenharmony_ci	switch (adev->asic_type) {
197762306a36Sopenharmony_ci	case CHIP_FIJI:
197862306a36Sopenharmony_ci		vi_update_bif_medium_grain_light_sleep(adev,
197962306a36Sopenharmony_ci				state == AMD_CG_STATE_GATE);
198062306a36Sopenharmony_ci		vi_update_hdp_medium_grain_clock_gating(adev,
198162306a36Sopenharmony_ci				state == AMD_CG_STATE_GATE);
198262306a36Sopenharmony_ci		vi_update_hdp_light_sleep(adev,
198362306a36Sopenharmony_ci				state == AMD_CG_STATE_GATE);
198462306a36Sopenharmony_ci		vi_update_rom_medium_grain_clock_gating(adev,
198562306a36Sopenharmony_ci				state == AMD_CG_STATE_GATE);
198662306a36Sopenharmony_ci		break;
198762306a36Sopenharmony_ci	case CHIP_CARRIZO:
198862306a36Sopenharmony_ci	case CHIP_STONEY:
198962306a36Sopenharmony_ci		vi_update_bif_medium_grain_light_sleep(adev,
199062306a36Sopenharmony_ci				state == AMD_CG_STATE_GATE);
199162306a36Sopenharmony_ci		vi_update_hdp_medium_grain_clock_gating(adev,
199262306a36Sopenharmony_ci				state == AMD_CG_STATE_GATE);
199362306a36Sopenharmony_ci		vi_update_hdp_light_sleep(adev,
199462306a36Sopenharmony_ci				state == AMD_CG_STATE_GATE);
199562306a36Sopenharmony_ci		vi_update_drm_light_sleep(adev,
199662306a36Sopenharmony_ci				state == AMD_CG_STATE_GATE);
199762306a36Sopenharmony_ci		break;
199862306a36Sopenharmony_ci	case CHIP_TONGA:
199962306a36Sopenharmony_ci	case CHIP_POLARIS10:
200062306a36Sopenharmony_ci	case CHIP_POLARIS11:
200162306a36Sopenharmony_ci	case CHIP_POLARIS12:
200262306a36Sopenharmony_ci	case CHIP_VEGAM:
200362306a36Sopenharmony_ci		vi_common_set_clockgating_state_by_smu(adev, state);
200462306a36Sopenharmony_ci		break;
200562306a36Sopenharmony_ci	default:
200662306a36Sopenharmony_ci		break;
200762306a36Sopenharmony_ci	}
200862306a36Sopenharmony_ci	return 0;
200962306a36Sopenharmony_ci}
201062306a36Sopenharmony_ci
201162306a36Sopenharmony_cistatic int vi_common_set_powergating_state(void *handle,
201262306a36Sopenharmony_ci					    enum amd_powergating_state state)
201362306a36Sopenharmony_ci{
201462306a36Sopenharmony_ci	return 0;
201562306a36Sopenharmony_ci}
201662306a36Sopenharmony_ci
201762306a36Sopenharmony_cistatic void vi_common_get_clockgating_state(void *handle, u64 *flags)
201862306a36Sopenharmony_ci{
201962306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
202062306a36Sopenharmony_ci	int data;
202162306a36Sopenharmony_ci
202262306a36Sopenharmony_ci	if (amdgpu_sriov_vf(adev))
202362306a36Sopenharmony_ci		*flags = 0;
202462306a36Sopenharmony_ci
202562306a36Sopenharmony_ci	/* AMD_CG_SUPPORT_BIF_LS */
202662306a36Sopenharmony_ci	data = RREG32_PCIE(ixPCIE_CNTL2);
202762306a36Sopenharmony_ci	if (data & PCIE_CNTL2__SLV_MEM_LS_EN_MASK)
202862306a36Sopenharmony_ci		*flags |= AMD_CG_SUPPORT_BIF_LS;
202962306a36Sopenharmony_ci
203062306a36Sopenharmony_ci	/* AMD_CG_SUPPORT_HDP_LS */
203162306a36Sopenharmony_ci	data = RREG32(mmHDP_MEM_POWER_LS);
203262306a36Sopenharmony_ci	if (data & HDP_MEM_POWER_LS__LS_ENABLE_MASK)
203362306a36Sopenharmony_ci		*flags |= AMD_CG_SUPPORT_HDP_LS;
203462306a36Sopenharmony_ci
203562306a36Sopenharmony_ci	/* AMD_CG_SUPPORT_HDP_MGCG */
203662306a36Sopenharmony_ci	data = RREG32(mmHDP_HOST_PATH_CNTL);
203762306a36Sopenharmony_ci	if (!(data & HDP_HOST_PATH_CNTL__CLOCK_GATING_DIS_MASK))
203862306a36Sopenharmony_ci		*flags |= AMD_CG_SUPPORT_HDP_MGCG;
203962306a36Sopenharmony_ci
204062306a36Sopenharmony_ci	/* AMD_CG_SUPPORT_ROM_MGCG */
204162306a36Sopenharmony_ci	data = RREG32_SMC(ixCGTT_ROM_CLK_CTRL0);
204262306a36Sopenharmony_ci	if (!(data & CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE0_MASK))
204362306a36Sopenharmony_ci		*flags |= AMD_CG_SUPPORT_ROM_MGCG;
204462306a36Sopenharmony_ci}
204562306a36Sopenharmony_ci
204662306a36Sopenharmony_cistatic const struct amd_ip_funcs vi_common_ip_funcs = {
204762306a36Sopenharmony_ci	.name = "vi_common",
204862306a36Sopenharmony_ci	.early_init = vi_common_early_init,
204962306a36Sopenharmony_ci	.late_init = vi_common_late_init,
205062306a36Sopenharmony_ci	.sw_init = vi_common_sw_init,
205162306a36Sopenharmony_ci	.sw_fini = vi_common_sw_fini,
205262306a36Sopenharmony_ci	.hw_init = vi_common_hw_init,
205362306a36Sopenharmony_ci	.hw_fini = vi_common_hw_fini,
205462306a36Sopenharmony_ci	.suspend = vi_common_suspend,
205562306a36Sopenharmony_ci	.resume = vi_common_resume,
205662306a36Sopenharmony_ci	.is_idle = vi_common_is_idle,
205762306a36Sopenharmony_ci	.wait_for_idle = vi_common_wait_for_idle,
205862306a36Sopenharmony_ci	.soft_reset = vi_common_soft_reset,
205962306a36Sopenharmony_ci	.set_clockgating_state = vi_common_set_clockgating_state,
206062306a36Sopenharmony_ci	.set_powergating_state = vi_common_set_powergating_state,
206162306a36Sopenharmony_ci	.get_clockgating_state = vi_common_get_clockgating_state,
206262306a36Sopenharmony_ci};
206362306a36Sopenharmony_ci
206462306a36Sopenharmony_cistatic const struct amdgpu_ip_block_version vi_common_ip_block =
206562306a36Sopenharmony_ci{
206662306a36Sopenharmony_ci	.type = AMD_IP_BLOCK_TYPE_COMMON,
206762306a36Sopenharmony_ci	.major = 1,
206862306a36Sopenharmony_ci	.minor = 0,
206962306a36Sopenharmony_ci	.rev = 0,
207062306a36Sopenharmony_ci	.funcs = &vi_common_ip_funcs,
207162306a36Sopenharmony_ci};
207262306a36Sopenharmony_ci
207362306a36Sopenharmony_civoid vi_set_virt_ops(struct amdgpu_device *adev)
207462306a36Sopenharmony_ci{
207562306a36Sopenharmony_ci	adev->virt.ops = &xgpu_vi_virt_ops;
207662306a36Sopenharmony_ci}
207762306a36Sopenharmony_ci
207862306a36Sopenharmony_ciint vi_set_ip_blocks(struct amdgpu_device *adev)
207962306a36Sopenharmony_ci{
208062306a36Sopenharmony_ci	amdgpu_device_set_sriov_virtual_display(adev);
208162306a36Sopenharmony_ci
208262306a36Sopenharmony_ci	switch (adev->asic_type) {
208362306a36Sopenharmony_ci	case CHIP_TOPAZ:
208462306a36Sopenharmony_ci		/* topaz has no DCE, UVD, VCE */
208562306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
208662306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v7_4_ip_block);
208762306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &iceland_ih_ip_block);
208862306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
208962306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &sdma_v2_4_ip_block);
209062306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
209162306a36Sopenharmony_ci		if (adev->enable_virtual_display)
209262306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
209362306a36Sopenharmony_ci		break;
209462306a36Sopenharmony_ci	case CHIP_FIJI:
209562306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
209662306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v8_5_ip_block);
209762306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block);
209862306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
209962306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
210062306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
210162306a36Sopenharmony_ci		if (adev->enable_virtual_display)
210262306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
210362306a36Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC)
210462306a36Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
210562306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
210662306a36Sopenharmony_ci#endif
210762306a36Sopenharmony_ci		else
210862306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v10_1_ip_block);
210962306a36Sopenharmony_ci		if (!amdgpu_sriov_vf(adev)) {
211062306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &uvd_v6_0_ip_block);
211162306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &vce_v3_0_ip_block);
211262306a36Sopenharmony_ci		}
211362306a36Sopenharmony_ci		break;
211462306a36Sopenharmony_ci	case CHIP_TONGA:
211562306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
211662306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block);
211762306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block);
211862306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
211962306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
212062306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
212162306a36Sopenharmony_ci		if (adev->enable_virtual_display)
212262306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
212362306a36Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC)
212462306a36Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
212562306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
212662306a36Sopenharmony_ci#endif
212762306a36Sopenharmony_ci		else
212862306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v10_0_ip_block);
212962306a36Sopenharmony_ci		if (!amdgpu_sriov_vf(adev)) {
213062306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &uvd_v5_0_ip_block);
213162306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &vce_v3_0_ip_block);
213262306a36Sopenharmony_ci		}
213362306a36Sopenharmony_ci		break;
213462306a36Sopenharmony_ci	case CHIP_POLARIS10:
213562306a36Sopenharmony_ci	case CHIP_POLARIS11:
213662306a36Sopenharmony_ci	case CHIP_POLARIS12:
213762306a36Sopenharmony_ci	case CHIP_VEGAM:
213862306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
213962306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v8_1_ip_block);
214062306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block);
214162306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
214262306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &sdma_v3_1_ip_block);
214362306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
214462306a36Sopenharmony_ci		if (adev->enable_virtual_display)
214562306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
214662306a36Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC)
214762306a36Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
214862306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
214962306a36Sopenharmony_ci#endif
215062306a36Sopenharmony_ci		else
215162306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v11_2_ip_block);
215262306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &uvd_v6_3_ip_block);
215362306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vce_v3_4_ip_block);
215462306a36Sopenharmony_ci		break;
215562306a36Sopenharmony_ci	case CHIP_CARRIZO:
215662306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
215762306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block);
215862306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cz_ih_ip_block);
215962306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
216062306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
216162306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
216262306a36Sopenharmony_ci		if (adev->enable_virtual_display)
216362306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
216462306a36Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC)
216562306a36Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
216662306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
216762306a36Sopenharmony_ci#endif
216862306a36Sopenharmony_ci		else
216962306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v11_0_ip_block);
217062306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &uvd_v6_0_ip_block);
217162306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vce_v3_1_ip_block);
217262306a36Sopenharmony_ci#if defined(CONFIG_DRM_AMD_ACP)
217362306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &acp_ip_block);
217462306a36Sopenharmony_ci#endif
217562306a36Sopenharmony_ci		break;
217662306a36Sopenharmony_ci	case CHIP_STONEY:
217762306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
217862306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block);
217962306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cz_ih_ip_block);
218062306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v8_1_ip_block);
218162306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
218262306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
218362306a36Sopenharmony_ci		if (adev->enable_virtual_display)
218462306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
218562306a36Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC)
218662306a36Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
218762306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
218862306a36Sopenharmony_ci#endif
218962306a36Sopenharmony_ci		else
219062306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v11_0_ip_block);
219162306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &uvd_v6_2_ip_block);
219262306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vce_v3_4_ip_block);
219362306a36Sopenharmony_ci#if defined(CONFIG_DRM_AMD_ACP)
219462306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &acp_ip_block);
219562306a36Sopenharmony_ci#endif
219662306a36Sopenharmony_ci		break;
219762306a36Sopenharmony_ci	default:
219862306a36Sopenharmony_ci		/* FIXME: not supported yet */
219962306a36Sopenharmony_ci		return -EINVAL;
220062306a36Sopenharmony_ci	}
220162306a36Sopenharmony_ci
220262306a36Sopenharmony_ci	return 0;
220362306a36Sopenharmony_ci}
220462306a36Sopenharmony_ci
220562306a36Sopenharmony_civoid legacy_doorbell_index_init(struct amdgpu_device *adev)
220662306a36Sopenharmony_ci{
220762306a36Sopenharmony_ci	adev->doorbell_index.kiq = AMDGPU_DOORBELL_KIQ;
220862306a36Sopenharmony_ci	adev->doorbell_index.mec_ring0 = AMDGPU_DOORBELL_MEC_RING0;
220962306a36Sopenharmony_ci	adev->doorbell_index.mec_ring1 = AMDGPU_DOORBELL_MEC_RING1;
221062306a36Sopenharmony_ci	adev->doorbell_index.mec_ring2 = AMDGPU_DOORBELL_MEC_RING2;
221162306a36Sopenharmony_ci	adev->doorbell_index.mec_ring3 = AMDGPU_DOORBELL_MEC_RING3;
221262306a36Sopenharmony_ci	adev->doorbell_index.mec_ring4 = AMDGPU_DOORBELL_MEC_RING4;
221362306a36Sopenharmony_ci	adev->doorbell_index.mec_ring5 = AMDGPU_DOORBELL_MEC_RING5;
221462306a36Sopenharmony_ci	adev->doorbell_index.mec_ring6 = AMDGPU_DOORBELL_MEC_RING6;
221562306a36Sopenharmony_ci	adev->doorbell_index.mec_ring7 = AMDGPU_DOORBELL_MEC_RING7;
221662306a36Sopenharmony_ci	adev->doorbell_index.gfx_ring0 = AMDGPU_DOORBELL_GFX_RING0;
221762306a36Sopenharmony_ci	adev->doorbell_index.sdma_engine[0] = AMDGPU_DOORBELL_sDMA_ENGINE0;
221862306a36Sopenharmony_ci	adev->doorbell_index.sdma_engine[1] = AMDGPU_DOORBELL_sDMA_ENGINE1;
221962306a36Sopenharmony_ci	adev->doorbell_index.ih = AMDGPU_DOORBELL_IH;
222062306a36Sopenharmony_ci	adev->doorbell_index.max_assignment = AMDGPU_DOORBELL_MAX_ASSIGNMENT;
222162306a36Sopenharmony_ci}
2222