162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Copyright 2012 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 * Authors: Alex Deucher
2362306a36Sopenharmony_ci */
2462306a36Sopenharmony_ci#include <linux/firmware.h>
2562306a36Sopenharmony_ci#include <linux/slab.h>
2662306a36Sopenharmony_ci#include <linux/module.h>
2762306a36Sopenharmony_ci#include <linux/pci.h>
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#include <drm/amdgpu_drm.h>
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#include "amdgpu.h"
3262306a36Sopenharmony_ci#include "amdgpu_atombios.h"
3362306a36Sopenharmony_ci#include "amdgpu_ih.h"
3462306a36Sopenharmony_ci#include "amdgpu_uvd.h"
3562306a36Sopenharmony_ci#include "amdgpu_vce.h"
3662306a36Sopenharmony_ci#include "cikd.h"
3762306a36Sopenharmony_ci#include "atom.h"
3862306a36Sopenharmony_ci#include "amd_pcie.h"
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#include "cik.h"
4162306a36Sopenharmony_ci#include "gmc_v7_0.h"
4262306a36Sopenharmony_ci#include "cik_ih.h"
4362306a36Sopenharmony_ci#include "dce_v8_0.h"
4462306a36Sopenharmony_ci#include "gfx_v7_0.h"
4562306a36Sopenharmony_ci#include "cik_sdma.h"
4662306a36Sopenharmony_ci#include "uvd_v4_2.h"
4762306a36Sopenharmony_ci#include "vce_v2_0.h"
4862306a36Sopenharmony_ci#include "cik_dpm.h"
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#include "uvd/uvd_4_2_d.h"
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#include "smu/smu_7_0_1_d.h"
5362306a36Sopenharmony_ci#include "smu/smu_7_0_1_sh_mask.h"
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#include "dce/dce_8_0_d.h"
5662306a36Sopenharmony_ci#include "dce/dce_8_0_sh_mask.h"
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#include "bif/bif_4_1_d.h"
5962306a36Sopenharmony_ci#include "bif/bif_4_1_sh_mask.h"
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#include "gca/gfx_7_2_d.h"
6262306a36Sopenharmony_ci#include "gca/gfx_7_2_enum.h"
6362306a36Sopenharmony_ci#include "gca/gfx_7_2_sh_mask.h"
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci#include "gmc/gmc_7_1_d.h"
6662306a36Sopenharmony_ci#include "gmc/gmc_7_1_sh_mask.h"
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#include "oss/oss_2_0_d.h"
6962306a36Sopenharmony_ci#include "oss/oss_2_0_sh_mask.h"
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci#include "amdgpu_dm.h"
7262306a36Sopenharmony_ci#include "amdgpu_amdkfd.h"
7362306a36Sopenharmony_ci#include "amdgpu_vkms.h"
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cistatic const struct amdgpu_video_codec_info cik_video_codecs_encode_array[] =
7662306a36Sopenharmony_ci{
7762306a36Sopenharmony_ci	{
7862306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
7962306a36Sopenharmony_ci		.max_width = 2048,
8062306a36Sopenharmony_ci		.max_height = 1152,
8162306a36Sopenharmony_ci		.max_pixels_per_frame = 2048 * 1152,
8262306a36Sopenharmony_ci		.max_level = 0,
8362306a36Sopenharmony_ci	},
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistatic const struct amdgpu_video_codecs cik_video_codecs_encode =
8762306a36Sopenharmony_ci{
8862306a36Sopenharmony_ci	.codec_count = ARRAY_SIZE(cik_video_codecs_encode_array),
8962306a36Sopenharmony_ci	.codec_array = cik_video_codecs_encode_array,
9062306a36Sopenharmony_ci};
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_cistatic const struct amdgpu_video_codec_info cik_video_codecs_decode_array[] =
9362306a36Sopenharmony_ci{
9462306a36Sopenharmony_ci	{
9562306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
9662306a36Sopenharmony_ci		.max_width = 2048,
9762306a36Sopenharmony_ci		.max_height = 1152,
9862306a36Sopenharmony_ci		.max_pixels_per_frame = 2048 * 1152,
9962306a36Sopenharmony_ci		.max_level = 3,
10062306a36Sopenharmony_ci	},
10162306a36Sopenharmony_ci	{
10262306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
10362306a36Sopenharmony_ci		.max_width = 2048,
10462306a36Sopenharmony_ci		.max_height = 1152,
10562306a36Sopenharmony_ci		.max_pixels_per_frame = 2048 * 1152,
10662306a36Sopenharmony_ci		.max_level = 5,
10762306a36Sopenharmony_ci	},
10862306a36Sopenharmony_ci	{
10962306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
11062306a36Sopenharmony_ci		.max_width = 2048,
11162306a36Sopenharmony_ci		.max_height = 1152,
11262306a36Sopenharmony_ci		.max_pixels_per_frame = 2048 * 1152,
11362306a36Sopenharmony_ci		.max_level = 41,
11462306a36Sopenharmony_ci	},
11562306a36Sopenharmony_ci	{
11662306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
11762306a36Sopenharmony_ci		.max_width = 2048,
11862306a36Sopenharmony_ci		.max_height = 1152,
11962306a36Sopenharmony_ci		.max_pixels_per_frame = 2048 * 1152,
12062306a36Sopenharmony_ci		.max_level = 4,
12162306a36Sopenharmony_ci	},
12262306a36Sopenharmony_ci};
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_cistatic const struct amdgpu_video_codecs cik_video_codecs_decode =
12562306a36Sopenharmony_ci{
12662306a36Sopenharmony_ci	.codec_count = ARRAY_SIZE(cik_video_codecs_decode_array),
12762306a36Sopenharmony_ci	.codec_array = cik_video_codecs_decode_array,
12862306a36Sopenharmony_ci};
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_cistatic int cik_query_video_codecs(struct amdgpu_device *adev, bool encode,
13162306a36Sopenharmony_ci				  const struct amdgpu_video_codecs **codecs)
13262306a36Sopenharmony_ci{
13362306a36Sopenharmony_ci	switch (adev->asic_type) {
13462306a36Sopenharmony_ci	case CHIP_BONAIRE:
13562306a36Sopenharmony_ci	case CHIP_HAWAII:
13662306a36Sopenharmony_ci	case CHIP_KAVERI:
13762306a36Sopenharmony_ci	case CHIP_KABINI:
13862306a36Sopenharmony_ci	case CHIP_MULLINS:
13962306a36Sopenharmony_ci		if (encode)
14062306a36Sopenharmony_ci			*codecs = &cik_video_codecs_encode;
14162306a36Sopenharmony_ci		else
14262306a36Sopenharmony_ci			*codecs = &cik_video_codecs_decode;
14362306a36Sopenharmony_ci		return 0;
14462306a36Sopenharmony_ci	default:
14562306a36Sopenharmony_ci		return -EINVAL;
14662306a36Sopenharmony_ci	}
14762306a36Sopenharmony_ci}
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci/*
15062306a36Sopenharmony_ci * Indirect registers accessor
15162306a36Sopenharmony_ci */
15262306a36Sopenharmony_cistatic u32 cik_pcie_rreg(struct amdgpu_device *adev, u32 reg)
15362306a36Sopenharmony_ci{
15462306a36Sopenharmony_ci	unsigned long flags;
15562306a36Sopenharmony_ci	u32 r;
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
15862306a36Sopenharmony_ci	WREG32(mmPCIE_INDEX, reg);
15962306a36Sopenharmony_ci	(void)RREG32(mmPCIE_INDEX);
16062306a36Sopenharmony_ci	r = RREG32(mmPCIE_DATA);
16162306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
16262306a36Sopenharmony_ci	return r;
16362306a36Sopenharmony_ci}
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_cistatic void cik_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
16662306a36Sopenharmony_ci{
16762306a36Sopenharmony_ci	unsigned long flags;
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
17062306a36Sopenharmony_ci	WREG32(mmPCIE_INDEX, reg);
17162306a36Sopenharmony_ci	(void)RREG32(mmPCIE_INDEX);
17262306a36Sopenharmony_ci	WREG32(mmPCIE_DATA, v);
17362306a36Sopenharmony_ci	(void)RREG32(mmPCIE_DATA);
17462306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
17562306a36Sopenharmony_ci}
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_cistatic u32 cik_smc_rreg(struct amdgpu_device *adev, u32 reg)
17862306a36Sopenharmony_ci{
17962306a36Sopenharmony_ci	unsigned long flags;
18062306a36Sopenharmony_ci	u32 r;
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci	spin_lock_irqsave(&adev->smc_idx_lock, flags);
18362306a36Sopenharmony_ci	WREG32(mmSMC_IND_INDEX_0, (reg));
18462306a36Sopenharmony_ci	r = RREG32(mmSMC_IND_DATA_0);
18562306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
18662306a36Sopenharmony_ci	return r;
18762306a36Sopenharmony_ci}
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_cistatic void cik_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
19062306a36Sopenharmony_ci{
19162306a36Sopenharmony_ci	unsigned long flags;
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci	spin_lock_irqsave(&adev->smc_idx_lock, flags);
19462306a36Sopenharmony_ci	WREG32(mmSMC_IND_INDEX_0, (reg));
19562306a36Sopenharmony_ci	WREG32(mmSMC_IND_DATA_0, (v));
19662306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
19762306a36Sopenharmony_ci}
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_cistatic u32 cik_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
20062306a36Sopenharmony_ci{
20162306a36Sopenharmony_ci	unsigned long flags;
20262306a36Sopenharmony_ci	u32 r;
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
20562306a36Sopenharmony_ci	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
20662306a36Sopenharmony_ci	r = RREG32(mmUVD_CTX_DATA);
20762306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
20862306a36Sopenharmony_ci	return r;
20962306a36Sopenharmony_ci}
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_cistatic void cik_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
21262306a36Sopenharmony_ci{
21362306a36Sopenharmony_ci	unsigned long flags;
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
21662306a36Sopenharmony_ci	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
21762306a36Sopenharmony_ci	WREG32(mmUVD_CTX_DATA, (v));
21862306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
21962306a36Sopenharmony_ci}
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_cistatic u32 cik_didt_rreg(struct amdgpu_device *adev, u32 reg)
22262306a36Sopenharmony_ci{
22362306a36Sopenharmony_ci	unsigned long flags;
22462306a36Sopenharmony_ci	u32 r;
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci	spin_lock_irqsave(&adev->didt_idx_lock, flags);
22762306a36Sopenharmony_ci	WREG32(mmDIDT_IND_INDEX, (reg));
22862306a36Sopenharmony_ci	r = RREG32(mmDIDT_IND_DATA);
22962306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
23062306a36Sopenharmony_ci	return r;
23162306a36Sopenharmony_ci}
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_cistatic void cik_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
23462306a36Sopenharmony_ci{
23562306a36Sopenharmony_ci	unsigned long flags;
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci	spin_lock_irqsave(&adev->didt_idx_lock, flags);
23862306a36Sopenharmony_ci	WREG32(mmDIDT_IND_INDEX, (reg));
23962306a36Sopenharmony_ci	WREG32(mmDIDT_IND_DATA, (v));
24062306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
24162306a36Sopenharmony_ci}
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_cistatic const u32 bonaire_golden_spm_registers[] =
24462306a36Sopenharmony_ci{
24562306a36Sopenharmony_ci	0xc200, 0xe0ffffff, 0xe0000000
24662306a36Sopenharmony_ci};
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_cistatic const u32 bonaire_golden_common_registers[] =
24962306a36Sopenharmony_ci{
25062306a36Sopenharmony_ci	0x31dc, 0xffffffff, 0x00000800,
25162306a36Sopenharmony_ci	0x31dd, 0xffffffff, 0x00000800,
25262306a36Sopenharmony_ci	0x31e6, 0xffffffff, 0x00007fbf,
25362306a36Sopenharmony_ci	0x31e7, 0xffffffff, 0x00007faf
25462306a36Sopenharmony_ci};
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_cistatic const u32 bonaire_golden_registers[] =
25762306a36Sopenharmony_ci{
25862306a36Sopenharmony_ci	0xcd5, 0x00000333, 0x00000333,
25962306a36Sopenharmony_ci	0xcd4, 0x000c0fc0, 0x00040200,
26062306a36Sopenharmony_ci	0x2684, 0x00010000, 0x00058208,
26162306a36Sopenharmony_ci	0xf000, 0xffff1fff, 0x00140000,
26262306a36Sopenharmony_ci	0xf080, 0xfdfc0fff, 0x00000100,
26362306a36Sopenharmony_ci	0xf08d, 0x40000000, 0x40000200,
26462306a36Sopenharmony_ci	0x260c, 0xffffffff, 0x00000000,
26562306a36Sopenharmony_ci	0x260d, 0xf00fffff, 0x00000400,
26662306a36Sopenharmony_ci	0x260e, 0x0002021c, 0x00020200,
26762306a36Sopenharmony_ci	0x31e, 0x00000080, 0x00000000,
26862306a36Sopenharmony_ci	0x16ec, 0x000000f0, 0x00000070,
26962306a36Sopenharmony_ci	0x16f0, 0xf0311fff, 0x80300000,
27062306a36Sopenharmony_ci	0x263e, 0x73773777, 0x12010001,
27162306a36Sopenharmony_ci	0xd43, 0x00810000, 0x408af000,
27262306a36Sopenharmony_ci	0x1c0c, 0x31000111, 0x00000011,
27362306a36Sopenharmony_ci	0xbd2, 0x73773777, 0x12010001,
27462306a36Sopenharmony_ci	0x883, 0x00007fb6, 0x0021a1b1,
27562306a36Sopenharmony_ci	0x884, 0x00007fb6, 0x002021b1,
27662306a36Sopenharmony_ci	0x860, 0x00007fb6, 0x00002191,
27762306a36Sopenharmony_ci	0x886, 0x00007fb6, 0x002121b1,
27862306a36Sopenharmony_ci	0x887, 0x00007fb6, 0x002021b1,
27962306a36Sopenharmony_ci	0x877, 0x00007fb6, 0x00002191,
28062306a36Sopenharmony_ci	0x878, 0x00007fb6, 0x00002191,
28162306a36Sopenharmony_ci	0xd8a, 0x0000003f, 0x0000000a,
28262306a36Sopenharmony_ci	0xd8b, 0x0000003f, 0x0000000a,
28362306a36Sopenharmony_ci	0xab9, 0x00073ffe, 0x000022a2,
28462306a36Sopenharmony_ci	0x903, 0x000007ff, 0x00000000,
28562306a36Sopenharmony_ci	0x2285, 0xf000003f, 0x00000007,
28662306a36Sopenharmony_ci	0x22fc, 0x00002001, 0x00000001,
28762306a36Sopenharmony_ci	0x22c9, 0xffffffff, 0x00ffffff,
28862306a36Sopenharmony_ci	0xc281, 0x0000ff0f, 0x00000000,
28962306a36Sopenharmony_ci	0xa293, 0x07ffffff, 0x06000000,
29062306a36Sopenharmony_ci	0x136, 0x00000fff, 0x00000100,
29162306a36Sopenharmony_ci	0xf9e, 0x00000001, 0x00000002,
29262306a36Sopenharmony_ci	0x2440, 0x03000000, 0x0362c688,
29362306a36Sopenharmony_ci	0x2300, 0x000000ff, 0x00000001,
29462306a36Sopenharmony_ci	0x390, 0x00001fff, 0x00001fff,
29562306a36Sopenharmony_ci	0x2418, 0x0000007f, 0x00000020,
29662306a36Sopenharmony_ci	0x2542, 0x00010000, 0x00010000,
29762306a36Sopenharmony_ci	0x2b05, 0x000003ff, 0x000000f3,
29862306a36Sopenharmony_ci	0x2b03, 0xffffffff, 0x00001032
29962306a36Sopenharmony_ci};
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_cistatic const u32 bonaire_mgcg_cgcg_init[] =
30262306a36Sopenharmony_ci{
30362306a36Sopenharmony_ci	0x3108, 0xffffffff, 0xfffffffc,
30462306a36Sopenharmony_ci	0xc200, 0xffffffff, 0xe0000000,
30562306a36Sopenharmony_ci	0xf0a8, 0xffffffff, 0x00000100,
30662306a36Sopenharmony_ci	0xf082, 0xffffffff, 0x00000100,
30762306a36Sopenharmony_ci	0xf0b0, 0xffffffff, 0xc0000100,
30862306a36Sopenharmony_ci	0xf0b2, 0xffffffff, 0xc0000100,
30962306a36Sopenharmony_ci	0xf0b1, 0xffffffff, 0xc0000100,
31062306a36Sopenharmony_ci	0x1579, 0xffffffff, 0x00600100,
31162306a36Sopenharmony_ci	0xf0a0, 0xffffffff, 0x00000100,
31262306a36Sopenharmony_ci	0xf085, 0xffffffff, 0x06000100,
31362306a36Sopenharmony_ci	0xf088, 0xffffffff, 0x00000100,
31462306a36Sopenharmony_ci	0xf086, 0xffffffff, 0x06000100,
31562306a36Sopenharmony_ci	0xf081, 0xffffffff, 0x00000100,
31662306a36Sopenharmony_ci	0xf0b8, 0xffffffff, 0x00000100,
31762306a36Sopenharmony_ci	0xf089, 0xffffffff, 0x00000100,
31862306a36Sopenharmony_ci	0xf080, 0xffffffff, 0x00000100,
31962306a36Sopenharmony_ci	0xf08c, 0xffffffff, 0x00000100,
32062306a36Sopenharmony_ci	0xf08d, 0xffffffff, 0x00000100,
32162306a36Sopenharmony_ci	0xf094, 0xffffffff, 0x00000100,
32262306a36Sopenharmony_ci	0xf095, 0xffffffff, 0x00000100,
32362306a36Sopenharmony_ci	0xf096, 0xffffffff, 0x00000100,
32462306a36Sopenharmony_ci	0xf097, 0xffffffff, 0x00000100,
32562306a36Sopenharmony_ci	0xf098, 0xffffffff, 0x00000100,
32662306a36Sopenharmony_ci	0xf09f, 0xffffffff, 0x00000100,
32762306a36Sopenharmony_ci	0xf09e, 0xffffffff, 0x00000100,
32862306a36Sopenharmony_ci	0xf084, 0xffffffff, 0x06000100,
32962306a36Sopenharmony_ci	0xf0a4, 0xffffffff, 0x00000100,
33062306a36Sopenharmony_ci	0xf09d, 0xffffffff, 0x00000100,
33162306a36Sopenharmony_ci	0xf0ad, 0xffffffff, 0x00000100,
33262306a36Sopenharmony_ci	0xf0ac, 0xffffffff, 0x00000100,
33362306a36Sopenharmony_ci	0xf09c, 0xffffffff, 0x00000100,
33462306a36Sopenharmony_ci	0xc200, 0xffffffff, 0xe0000000,
33562306a36Sopenharmony_ci	0xf008, 0xffffffff, 0x00010000,
33662306a36Sopenharmony_ci	0xf009, 0xffffffff, 0x00030002,
33762306a36Sopenharmony_ci	0xf00a, 0xffffffff, 0x00040007,
33862306a36Sopenharmony_ci	0xf00b, 0xffffffff, 0x00060005,
33962306a36Sopenharmony_ci	0xf00c, 0xffffffff, 0x00090008,
34062306a36Sopenharmony_ci	0xf00d, 0xffffffff, 0x00010000,
34162306a36Sopenharmony_ci	0xf00e, 0xffffffff, 0x00030002,
34262306a36Sopenharmony_ci	0xf00f, 0xffffffff, 0x00040007,
34362306a36Sopenharmony_ci	0xf010, 0xffffffff, 0x00060005,
34462306a36Sopenharmony_ci	0xf011, 0xffffffff, 0x00090008,
34562306a36Sopenharmony_ci	0xf012, 0xffffffff, 0x00010000,
34662306a36Sopenharmony_ci	0xf013, 0xffffffff, 0x00030002,
34762306a36Sopenharmony_ci	0xf014, 0xffffffff, 0x00040007,
34862306a36Sopenharmony_ci	0xf015, 0xffffffff, 0x00060005,
34962306a36Sopenharmony_ci	0xf016, 0xffffffff, 0x00090008,
35062306a36Sopenharmony_ci	0xf017, 0xffffffff, 0x00010000,
35162306a36Sopenharmony_ci	0xf018, 0xffffffff, 0x00030002,
35262306a36Sopenharmony_ci	0xf019, 0xffffffff, 0x00040007,
35362306a36Sopenharmony_ci	0xf01a, 0xffffffff, 0x00060005,
35462306a36Sopenharmony_ci	0xf01b, 0xffffffff, 0x00090008,
35562306a36Sopenharmony_ci	0xf01c, 0xffffffff, 0x00010000,
35662306a36Sopenharmony_ci	0xf01d, 0xffffffff, 0x00030002,
35762306a36Sopenharmony_ci	0xf01e, 0xffffffff, 0x00040007,
35862306a36Sopenharmony_ci	0xf01f, 0xffffffff, 0x00060005,
35962306a36Sopenharmony_ci	0xf020, 0xffffffff, 0x00090008,
36062306a36Sopenharmony_ci	0xf021, 0xffffffff, 0x00010000,
36162306a36Sopenharmony_ci	0xf022, 0xffffffff, 0x00030002,
36262306a36Sopenharmony_ci	0xf023, 0xffffffff, 0x00040007,
36362306a36Sopenharmony_ci	0xf024, 0xffffffff, 0x00060005,
36462306a36Sopenharmony_ci	0xf025, 0xffffffff, 0x00090008,
36562306a36Sopenharmony_ci	0xf026, 0xffffffff, 0x00010000,
36662306a36Sopenharmony_ci	0xf027, 0xffffffff, 0x00030002,
36762306a36Sopenharmony_ci	0xf028, 0xffffffff, 0x00040007,
36862306a36Sopenharmony_ci	0xf029, 0xffffffff, 0x00060005,
36962306a36Sopenharmony_ci	0xf02a, 0xffffffff, 0x00090008,
37062306a36Sopenharmony_ci	0xf000, 0xffffffff, 0x96e00200,
37162306a36Sopenharmony_ci	0x21c2, 0xffffffff, 0x00900100,
37262306a36Sopenharmony_ci	0x3109, 0xffffffff, 0x0020003f,
37362306a36Sopenharmony_ci	0xe, 0xffffffff, 0x0140001c,
37462306a36Sopenharmony_ci	0xf, 0x000f0000, 0x000f0000,
37562306a36Sopenharmony_ci	0x88, 0xffffffff, 0xc060000c,
37662306a36Sopenharmony_ci	0x89, 0xc0000fff, 0x00000100,
37762306a36Sopenharmony_ci	0x3e4, 0xffffffff, 0x00000100,
37862306a36Sopenharmony_ci	0x3e6, 0x00000101, 0x00000000,
37962306a36Sopenharmony_ci	0x82a, 0xffffffff, 0x00000104,
38062306a36Sopenharmony_ci	0x1579, 0xff000fff, 0x00000100,
38162306a36Sopenharmony_ci	0xc33, 0xc0000fff, 0x00000104,
38262306a36Sopenharmony_ci	0x3079, 0x00000001, 0x00000001,
38362306a36Sopenharmony_ci	0x3403, 0xff000ff0, 0x00000100,
38462306a36Sopenharmony_ci	0x3603, 0xff000ff0, 0x00000100
38562306a36Sopenharmony_ci};
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_cistatic const u32 spectre_golden_spm_registers[] =
38862306a36Sopenharmony_ci{
38962306a36Sopenharmony_ci	0xc200, 0xe0ffffff, 0xe0000000
39062306a36Sopenharmony_ci};
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_cistatic const u32 spectre_golden_common_registers[] =
39362306a36Sopenharmony_ci{
39462306a36Sopenharmony_ci	0x31dc, 0xffffffff, 0x00000800,
39562306a36Sopenharmony_ci	0x31dd, 0xffffffff, 0x00000800,
39662306a36Sopenharmony_ci	0x31e6, 0xffffffff, 0x00007fbf,
39762306a36Sopenharmony_ci	0x31e7, 0xffffffff, 0x00007faf
39862306a36Sopenharmony_ci};
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_cistatic const u32 spectre_golden_registers[] =
40162306a36Sopenharmony_ci{
40262306a36Sopenharmony_ci	0xf000, 0xffff1fff, 0x96940200,
40362306a36Sopenharmony_ci	0xf003, 0xffff0001, 0xff000000,
40462306a36Sopenharmony_ci	0xf080, 0xfffc0fff, 0x00000100,
40562306a36Sopenharmony_ci	0x1bb6, 0x00010101, 0x00010000,
40662306a36Sopenharmony_ci	0x260d, 0xf00fffff, 0x00000400,
40762306a36Sopenharmony_ci	0x260e, 0xfffffffc, 0x00020200,
40862306a36Sopenharmony_ci	0x16ec, 0x000000f0, 0x00000070,
40962306a36Sopenharmony_ci	0x16f0, 0xf0311fff, 0x80300000,
41062306a36Sopenharmony_ci	0x263e, 0x73773777, 0x12010001,
41162306a36Sopenharmony_ci	0x26df, 0x00ff0000, 0x00fc0000,
41262306a36Sopenharmony_ci	0xbd2, 0x73773777, 0x12010001,
41362306a36Sopenharmony_ci	0x2285, 0xf000003f, 0x00000007,
41462306a36Sopenharmony_ci	0x22c9, 0xffffffff, 0x00ffffff,
41562306a36Sopenharmony_ci	0xa0d4, 0x3f3f3fff, 0x00000082,
41662306a36Sopenharmony_ci	0xa0d5, 0x0000003f, 0x00000000,
41762306a36Sopenharmony_ci	0xf9e, 0x00000001, 0x00000002,
41862306a36Sopenharmony_ci	0x244f, 0xffff03df, 0x00000004,
41962306a36Sopenharmony_ci	0x31da, 0x00000008, 0x00000008,
42062306a36Sopenharmony_ci	0x2300, 0x000008ff, 0x00000800,
42162306a36Sopenharmony_ci	0x2542, 0x00010000, 0x00010000,
42262306a36Sopenharmony_ci	0x2b03, 0xffffffff, 0x54763210,
42362306a36Sopenharmony_ci	0x853e, 0x01ff01ff, 0x00000002,
42462306a36Sopenharmony_ci	0x8526, 0x007ff800, 0x00200000,
42562306a36Sopenharmony_ci	0x8057, 0xffffffff, 0x00000f40,
42662306a36Sopenharmony_ci	0xc24d, 0xffffffff, 0x00000001
42762306a36Sopenharmony_ci};
42862306a36Sopenharmony_ci
42962306a36Sopenharmony_cistatic const u32 spectre_mgcg_cgcg_init[] =
43062306a36Sopenharmony_ci{
43162306a36Sopenharmony_ci	0x3108, 0xffffffff, 0xfffffffc,
43262306a36Sopenharmony_ci	0xc200, 0xffffffff, 0xe0000000,
43362306a36Sopenharmony_ci	0xf0a8, 0xffffffff, 0x00000100,
43462306a36Sopenharmony_ci	0xf082, 0xffffffff, 0x00000100,
43562306a36Sopenharmony_ci	0xf0b0, 0xffffffff, 0x00000100,
43662306a36Sopenharmony_ci	0xf0b2, 0xffffffff, 0x00000100,
43762306a36Sopenharmony_ci	0xf0b1, 0xffffffff, 0x00000100,
43862306a36Sopenharmony_ci	0x1579, 0xffffffff, 0x00600100,
43962306a36Sopenharmony_ci	0xf0a0, 0xffffffff, 0x00000100,
44062306a36Sopenharmony_ci	0xf085, 0xffffffff, 0x06000100,
44162306a36Sopenharmony_ci	0xf088, 0xffffffff, 0x00000100,
44262306a36Sopenharmony_ci	0xf086, 0xffffffff, 0x06000100,
44362306a36Sopenharmony_ci	0xf081, 0xffffffff, 0x00000100,
44462306a36Sopenharmony_ci	0xf0b8, 0xffffffff, 0x00000100,
44562306a36Sopenharmony_ci	0xf089, 0xffffffff, 0x00000100,
44662306a36Sopenharmony_ci	0xf080, 0xffffffff, 0x00000100,
44762306a36Sopenharmony_ci	0xf08c, 0xffffffff, 0x00000100,
44862306a36Sopenharmony_ci	0xf08d, 0xffffffff, 0x00000100,
44962306a36Sopenharmony_ci	0xf094, 0xffffffff, 0x00000100,
45062306a36Sopenharmony_ci	0xf095, 0xffffffff, 0x00000100,
45162306a36Sopenharmony_ci	0xf096, 0xffffffff, 0x00000100,
45262306a36Sopenharmony_ci	0xf097, 0xffffffff, 0x00000100,
45362306a36Sopenharmony_ci	0xf098, 0xffffffff, 0x00000100,
45462306a36Sopenharmony_ci	0xf09f, 0xffffffff, 0x00000100,
45562306a36Sopenharmony_ci	0xf09e, 0xffffffff, 0x00000100,
45662306a36Sopenharmony_ci	0xf084, 0xffffffff, 0x06000100,
45762306a36Sopenharmony_ci	0xf0a4, 0xffffffff, 0x00000100,
45862306a36Sopenharmony_ci	0xf09d, 0xffffffff, 0x00000100,
45962306a36Sopenharmony_ci	0xf0ad, 0xffffffff, 0x00000100,
46062306a36Sopenharmony_ci	0xf0ac, 0xffffffff, 0x00000100,
46162306a36Sopenharmony_ci	0xf09c, 0xffffffff, 0x00000100,
46262306a36Sopenharmony_ci	0xc200, 0xffffffff, 0xe0000000,
46362306a36Sopenharmony_ci	0xf008, 0xffffffff, 0x00010000,
46462306a36Sopenharmony_ci	0xf009, 0xffffffff, 0x00030002,
46562306a36Sopenharmony_ci	0xf00a, 0xffffffff, 0x00040007,
46662306a36Sopenharmony_ci	0xf00b, 0xffffffff, 0x00060005,
46762306a36Sopenharmony_ci	0xf00c, 0xffffffff, 0x00090008,
46862306a36Sopenharmony_ci	0xf00d, 0xffffffff, 0x00010000,
46962306a36Sopenharmony_ci	0xf00e, 0xffffffff, 0x00030002,
47062306a36Sopenharmony_ci	0xf00f, 0xffffffff, 0x00040007,
47162306a36Sopenharmony_ci	0xf010, 0xffffffff, 0x00060005,
47262306a36Sopenharmony_ci	0xf011, 0xffffffff, 0x00090008,
47362306a36Sopenharmony_ci	0xf012, 0xffffffff, 0x00010000,
47462306a36Sopenharmony_ci	0xf013, 0xffffffff, 0x00030002,
47562306a36Sopenharmony_ci	0xf014, 0xffffffff, 0x00040007,
47662306a36Sopenharmony_ci	0xf015, 0xffffffff, 0x00060005,
47762306a36Sopenharmony_ci	0xf016, 0xffffffff, 0x00090008,
47862306a36Sopenharmony_ci	0xf017, 0xffffffff, 0x00010000,
47962306a36Sopenharmony_ci	0xf018, 0xffffffff, 0x00030002,
48062306a36Sopenharmony_ci	0xf019, 0xffffffff, 0x00040007,
48162306a36Sopenharmony_ci	0xf01a, 0xffffffff, 0x00060005,
48262306a36Sopenharmony_ci	0xf01b, 0xffffffff, 0x00090008,
48362306a36Sopenharmony_ci	0xf01c, 0xffffffff, 0x00010000,
48462306a36Sopenharmony_ci	0xf01d, 0xffffffff, 0x00030002,
48562306a36Sopenharmony_ci	0xf01e, 0xffffffff, 0x00040007,
48662306a36Sopenharmony_ci	0xf01f, 0xffffffff, 0x00060005,
48762306a36Sopenharmony_ci	0xf020, 0xffffffff, 0x00090008,
48862306a36Sopenharmony_ci	0xf021, 0xffffffff, 0x00010000,
48962306a36Sopenharmony_ci	0xf022, 0xffffffff, 0x00030002,
49062306a36Sopenharmony_ci	0xf023, 0xffffffff, 0x00040007,
49162306a36Sopenharmony_ci	0xf024, 0xffffffff, 0x00060005,
49262306a36Sopenharmony_ci	0xf025, 0xffffffff, 0x00090008,
49362306a36Sopenharmony_ci	0xf026, 0xffffffff, 0x00010000,
49462306a36Sopenharmony_ci	0xf027, 0xffffffff, 0x00030002,
49562306a36Sopenharmony_ci	0xf028, 0xffffffff, 0x00040007,
49662306a36Sopenharmony_ci	0xf029, 0xffffffff, 0x00060005,
49762306a36Sopenharmony_ci	0xf02a, 0xffffffff, 0x00090008,
49862306a36Sopenharmony_ci	0xf02b, 0xffffffff, 0x00010000,
49962306a36Sopenharmony_ci	0xf02c, 0xffffffff, 0x00030002,
50062306a36Sopenharmony_ci	0xf02d, 0xffffffff, 0x00040007,
50162306a36Sopenharmony_ci	0xf02e, 0xffffffff, 0x00060005,
50262306a36Sopenharmony_ci	0xf02f, 0xffffffff, 0x00090008,
50362306a36Sopenharmony_ci	0xf000, 0xffffffff, 0x96e00200,
50462306a36Sopenharmony_ci	0x21c2, 0xffffffff, 0x00900100,
50562306a36Sopenharmony_ci	0x3109, 0xffffffff, 0x0020003f,
50662306a36Sopenharmony_ci	0xe, 0xffffffff, 0x0140001c,
50762306a36Sopenharmony_ci	0xf, 0x000f0000, 0x000f0000,
50862306a36Sopenharmony_ci	0x88, 0xffffffff, 0xc060000c,
50962306a36Sopenharmony_ci	0x89, 0xc0000fff, 0x00000100,
51062306a36Sopenharmony_ci	0x3e4, 0xffffffff, 0x00000100,
51162306a36Sopenharmony_ci	0x3e6, 0x00000101, 0x00000000,
51262306a36Sopenharmony_ci	0x82a, 0xffffffff, 0x00000104,
51362306a36Sopenharmony_ci	0x1579, 0xff000fff, 0x00000100,
51462306a36Sopenharmony_ci	0xc33, 0xc0000fff, 0x00000104,
51562306a36Sopenharmony_ci	0x3079, 0x00000001, 0x00000001,
51662306a36Sopenharmony_ci	0x3403, 0xff000ff0, 0x00000100,
51762306a36Sopenharmony_ci	0x3603, 0xff000ff0, 0x00000100
51862306a36Sopenharmony_ci};
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_cistatic const u32 kalindi_golden_spm_registers[] =
52162306a36Sopenharmony_ci{
52262306a36Sopenharmony_ci	0xc200, 0xe0ffffff, 0xe0000000
52362306a36Sopenharmony_ci};
52462306a36Sopenharmony_ci
52562306a36Sopenharmony_cistatic const u32 kalindi_golden_common_registers[] =
52662306a36Sopenharmony_ci{
52762306a36Sopenharmony_ci	0x31dc, 0xffffffff, 0x00000800,
52862306a36Sopenharmony_ci	0x31dd, 0xffffffff, 0x00000800,
52962306a36Sopenharmony_ci	0x31e6, 0xffffffff, 0x00007fbf,
53062306a36Sopenharmony_ci	0x31e7, 0xffffffff, 0x00007faf
53162306a36Sopenharmony_ci};
53262306a36Sopenharmony_ci
53362306a36Sopenharmony_cistatic const u32 kalindi_golden_registers[] =
53462306a36Sopenharmony_ci{
53562306a36Sopenharmony_ci	0xf000, 0xffffdfff, 0x6e944040,
53662306a36Sopenharmony_ci	0x1579, 0xff607fff, 0xfc000100,
53762306a36Sopenharmony_ci	0xf088, 0xff000fff, 0x00000100,
53862306a36Sopenharmony_ci	0xf089, 0xff000fff, 0x00000100,
53962306a36Sopenharmony_ci	0xf080, 0xfffc0fff, 0x00000100,
54062306a36Sopenharmony_ci	0x1bb6, 0x00010101, 0x00010000,
54162306a36Sopenharmony_ci	0x260c, 0xffffffff, 0x00000000,
54262306a36Sopenharmony_ci	0x260d, 0xf00fffff, 0x00000400,
54362306a36Sopenharmony_ci	0x16ec, 0x000000f0, 0x00000070,
54462306a36Sopenharmony_ci	0x16f0, 0xf0311fff, 0x80300000,
54562306a36Sopenharmony_ci	0x263e, 0x73773777, 0x12010001,
54662306a36Sopenharmony_ci	0x263f, 0xffffffff, 0x00000010,
54762306a36Sopenharmony_ci	0x26df, 0x00ff0000, 0x00fc0000,
54862306a36Sopenharmony_ci	0x200c, 0x00001f0f, 0x0000100a,
54962306a36Sopenharmony_ci	0xbd2, 0x73773777, 0x12010001,
55062306a36Sopenharmony_ci	0x902, 0x000fffff, 0x000c007f,
55162306a36Sopenharmony_ci	0x2285, 0xf000003f, 0x00000007,
55262306a36Sopenharmony_ci	0x22c9, 0x3fff3fff, 0x00ffcfff,
55362306a36Sopenharmony_ci	0xc281, 0x0000ff0f, 0x00000000,
55462306a36Sopenharmony_ci	0xa293, 0x07ffffff, 0x06000000,
55562306a36Sopenharmony_ci	0x136, 0x00000fff, 0x00000100,
55662306a36Sopenharmony_ci	0xf9e, 0x00000001, 0x00000002,
55762306a36Sopenharmony_ci	0x31da, 0x00000008, 0x00000008,
55862306a36Sopenharmony_ci	0x2300, 0x000000ff, 0x00000003,
55962306a36Sopenharmony_ci	0x853e, 0x01ff01ff, 0x00000002,
56062306a36Sopenharmony_ci	0x8526, 0x007ff800, 0x00200000,
56162306a36Sopenharmony_ci	0x8057, 0xffffffff, 0x00000f40,
56262306a36Sopenharmony_ci	0x2231, 0x001f3ae3, 0x00000082,
56362306a36Sopenharmony_ci	0x2235, 0x0000001f, 0x00000010,
56462306a36Sopenharmony_ci	0xc24d, 0xffffffff, 0x00000000
56562306a36Sopenharmony_ci};
56662306a36Sopenharmony_ci
56762306a36Sopenharmony_cistatic const u32 kalindi_mgcg_cgcg_init[] =
56862306a36Sopenharmony_ci{
56962306a36Sopenharmony_ci	0x3108, 0xffffffff, 0xfffffffc,
57062306a36Sopenharmony_ci	0xc200, 0xffffffff, 0xe0000000,
57162306a36Sopenharmony_ci	0xf0a8, 0xffffffff, 0x00000100,
57262306a36Sopenharmony_ci	0xf082, 0xffffffff, 0x00000100,
57362306a36Sopenharmony_ci	0xf0b0, 0xffffffff, 0x00000100,
57462306a36Sopenharmony_ci	0xf0b2, 0xffffffff, 0x00000100,
57562306a36Sopenharmony_ci	0xf0b1, 0xffffffff, 0x00000100,
57662306a36Sopenharmony_ci	0x1579, 0xffffffff, 0x00600100,
57762306a36Sopenharmony_ci	0xf0a0, 0xffffffff, 0x00000100,
57862306a36Sopenharmony_ci	0xf085, 0xffffffff, 0x06000100,
57962306a36Sopenharmony_ci	0xf088, 0xffffffff, 0x00000100,
58062306a36Sopenharmony_ci	0xf086, 0xffffffff, 0x06000100,
58162306a36Sopenharmony_ci	0xf081, 0xffffffff, 0x00000100,
58262306a36Sopenharmony_ci	0xf0b8, 0xffffffff, 0x00000100,
58362306a36Sopenharmony_ci	0xf089, 0xffffffff, 0x00000100,
58462306a36Sopenharmony_ci	0xf080, 0xffffffff, 0x00000100,
58562306a36Sopenharmony_ci	0xf08c, 0xffffffff, 0x00000100,
58662306a36Sopenharmony_ci	0xf08d, 0xffffffff, 0x00000100,
58762306a36Sopenharmony_ci	0xf094, 0xffffffff, 0x00000100,
58862306a36Sopenharmony_ci	0xf095, 0xffffffff, 0x00000100,
58962306a36Sopenharmony_ci	0xf096, 0xffffffff, 0x00000100,
59062306a36Sopenharmony_ci	0xf097, 0xffffffff, 0x00000100,
59162306a36Sopenharmony_ci	0xf098, 0xffffffff, 0x00000100,
59262306a36Sopenharmony_ci	0xf09f, 0xffffffff, 0x00000100,
59362306a36Sopenharmony_ci	0xf09e, 0xffffffff, 0x00000100,
59462306a36Sopenharmony_ci	0xf084, 0xffffffff, 0x06000100,
59562306a36Sopenharmony_ci	0xf0a4, 0xffffffff, 0x00000100,
59662306a36Sopenharmony_ci	0xf09d, 0xffffffff, 0x00000100,
59762306a36Sopenharmony_ci	0xf0ad, 0xffffffff, 0x00000100,
59862306a36Sopenharmony_ci	0xf0ac, 0xffffffff, 0x00000100,
59962306a36Sopenharmony_ci	0xf09c, 0xffffffff, 0x00000100,
60062306a36Sopenharmony_ci	0xc200, 0xffffffff, 0xe0000000,
60162306a36Sopenharmony_ci	0xf008, 0xffffffff, 0x00010000,
60262306a36Sopenharmony_ci	0xf009, 0xffffffff, 0x00030002,
60362306a36Sopenharmony_ci	0xf00a, 0xffffffff, 0x00040007,
60462306a36Sopenharmony_ci	0xf00b, 0xffffffff, 0x00060005,
60562306a36Sopenharmony_ci	0xf00c, 0xffffffff, 0x00090008,
60662306a36Sopenharmony_ci	0xf00d, 0xffffffff, 0x00010000,
60762306a36Sopenharmony_ci	0xf00e, 0xffffffff, 0x00030002,
60862306a36Sopenharmony_ci	0xf00f, 0xffffffff, 0x00040007,
60962306a36Sopenharmony_ci	0xf010, 0xffffffff, 0x00060005,
61062306a36Sopenharmony_ci	0xf011, 0xffffffff, 0x00090008,
61162306a36Sopenharmony_ci	0xf000, 0xffffffff, 0x96e00200,
61262306a36Sopenharmony_ci	0x21c2, 0xffffffff, 0x00900100,
61362306a36Sopenharmony_ci	0x3109, 0xffffffff, 0x0020003f,
61462306a36Sopenharmony_ci	0xe, 0xffffffff, 0x0140001c,
61562306a36Sopenharmony_ci	0xf, 0x000f0000, 0x000f0000,
61662306a36Sopenharmony_ci	0x88, 0xffffffff, 0xc060000c,
61762306a36Sopenharmony_ci	0x89, 0xc0000fff, 0x00000100,
61862306a36Sopenharmony_ci	0x82a, 0xffffffff, 0x00000104,
61962306a36Sopenharmony_ci	0x1579, 0xff000fff, 0x00000100,
62062306a36Sopenharmony_ci	0xc33, 0xc0000fff, 0x00000104,
62162306a36Sopenharmony_ci	0x3079, 0x00000001, 0x00000001,
62262306a36Sopenharmony_ci	0x3403, 0xff000ff0, 0x00000100,
62362306a36Sopenharmony_ci	0x3603, 0xff000ff0, 0x00000100
62462306a36Sopenharmony_ci};
62562306a36Sopenharmony_ci
62662306a36Sopenharmony_cistatic const u32 hawaii_golden_spm_registers[] =
62762306a36Sopenharmony_ci{
62862306a36Sopenharmony_ci	0xc200, 0xe0ffffff, 0xe0000000
62962306a36Sopenharmony_ci};
63062306a36Sopenharmony_ci
63162306a36Sopenharmony_cistatic const u32 hawaii_golden_common_registers[] =
63262306a36Sopenharmony_ci{
63362306a36Sopenharmony_ci	0xc200, 0xffffffff, 0xe0000000,
63462306a36Sopenharmony_ci	0xa0d4, 0xffffffff, 0x3a00161a,
63562306a36Sopenharmony_ci	0xa0d5, 0xffffffff, 0x0000002e,
63662306a36Sopenharmony_ci	0x2684, 0xffffffff, 0x00018208,
63762306a36Sopenharmony_ci	0x263e, 0xffffffff, 0x12011003
63862306a36Sopenharmony_ci};
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_cistatic const u32 hawaii_golden_registers[] =
64162306a36Sopenharmony_ci{
64262306a36Sopenharmony_ci	0xcd5, 0x00000333, 0x00000333,
64362306a36Sopenharmony_ci	0x2684, 0x00010000, 0x00058208,
64462306a36Sopenharmony_ci	0x260c, 0xffffffff, 0x00000000,
64562306a36Sopenharmony_ci	0x260d, 0xf00fffff, 0x00000400,
64662306a36Sopenharmony_ci	0x260e, 0x0002021c, 0x00020200,
64762306a36Sopenharmony_ci	0x31e, 0x00000080, 0x00000000,
64862306a36Sopenharmony_ci	0x16ec, 0x000000f0, 0x00000070,
64962306a36Sopenharmony_ci	0x16f0, 0xf0311fff, 0x80300000,
65062306a36Sopenharmony_ci	0xd43, 0x00810000, 0x408af000,
65162306a36Sopenharmony_ci	0x1c0c, 0x31000111, 0x00000011,
65262306a36Sopenharmony_ci	0xbd2, 0x73773777, 0x12010001,
65362306a36Sopenharmony_ci	0x848, 0x0000007f, 0x0000001b,
65462306a36Sopenharmony_ci	0x877, 0x00007fb6, 0x00002191,
65562306a36Sopenharmony_ci	0xd8a, 0x0000003f, 0x0000000a,
65662306a36Sopenharmony_ci	0xd8b, 0x0000003f, 0x0000000a,
65762306a36Sopenharmony_ci	0xab9, 0x00073ffe, 0x000022a2,
65862306a36Sopenharmony_ci	0x903, 0x000007ff, 0x00000000,
65962306a36Sopenharmony_ci	0x22fc, 0x00002001, 0x00000001,
66062306a36Sopenharmony_ci	0x22c9, 0xffffffff, 0x00ffffff,
66162306a36Sopenharmony_ci	0xc281, 0x0000ff0f, 0x00000000,
66262306a36Sopenharmony_ci	0xa293, 0x07ffffff, 0x06000000,
66362306a36Sopenharmony_ci	0xf9e, 0x00000001, 0x00000002,
66462306a36Sopenharmony_ci	0x31da, 0x00000008, 0x00000008,
66562306a36Sopenharmony_ci	0x31dc, 0x00000f00, 0x00000800,
66662306a36Sopenharmony_ci	0x31dd, 0x00000f00, 0x00000800,
66762306a36Sopenharmony_ci	0x31e6, 0x00ffffff, 0x00ff7fbf,
66862306a36Sopenharmony_ci	0x31e7, 0x00ffffff, 0x00ff7faf,
66962306a36Sopenharmony_ci	0x2300, 0x000000ff, 0x00000800,
67062306a36Sopenharmony_ci	0x390, 0x00001fff, 0x00001fff,
67162306a36Sopenharmony_ci	0x2418, 0x0000007f, 0x00000020,
67262306a36Sopenharmony_ci	0x2542, 0x00010000, 0x00010000,
67362306a36Sopenharmony_ci	0x2b80, 0x00100000, 0x000ff07c,
67462306a36Sopenharmony_ci	0x2b05, 0x000003ff, 0x0000000f,
67562306a36Sopenharmony_ci	0x2b04, 0xffffffff, 0x7564fdec,
67662306a36Sopenharmony_ci	0x2b03, 0xffffffff, 0x3120b9a8,
67762306a36Sopenharmony_ci	0x2b02, 0x20000000, 0x0f9c0000
67862306a36Sopenharmony_ci};
67962306a36Sopenharmony_ci
68062306a36Sopenharmony_cistatic const u32 hawaii_mgcg_cgcg_init[] =
68162306a36Sopenharmony_ci{
68262306a36Sopenharmony_ci	0x3108, 0xffffffff, 0xfffffffd,
68362306a36Sopenharmony_ci	0xc200, 0xffffffff, 0xe0000000,
68462306a36Sopenharmony_ci	0xf0a8, 0xffffffff, 0x00000100,
68562306a36Sopenharmony_ci	0xf082, 0xffffffff, 0x00000100,
68662306a36Sopenharmony_ci	0xf0b0, 0xffffffff, 0x00000100,
68762306a36Sopenharmony_ci	0xf0b2, 0xffffffff, 0x00000100,
68862306a36Sopenharmony_ci	0xf0b1, 0xffffffff, 0x00000100,
68962306a36Sopenharmony_ci	0x1579, 0xffffffff, 0x00200100,
69062306a36Sopenharmony_ci	0xf0a0, 0xffffffff, 0x00000100,
69162306a36Sopenharmony_ci	0xf085, 0xffffffff, 0x06000100,
69262306a36Sopenharmony_ci	0xf088, 0xffffffff, 0x00000100,
69362306a36Sopenharmony_ci	0xf086, 0xffffffff, 0x06000100,
69462306a36Sopenharmony_ci	0xf081, 0xffffffff, 0x00000100,
69562306a36Sopenharmony_ci	0xf0b8, 0xffffffff, 0x00000100,
69662306a36Sopenharmony_ci	0xf089, 0xffffffff, 0x00000100,
69762306a36Sopenharmony_ci	0xf080, 0xffffffff, 0x00000100,
69862306a36Sopenharmony_ci	0xf08c, 0xffffffff, 0x00000100,
69962306a36Sopenharmony_ci	0xf08d, 0xffffffff, 0x00000100,
70062306a36Sopenharmony_ci	0xf094, 0xffffffff, 0x00000100,
70162306a36Sopenharmony_ci	0xf095, 0xffffffff, 0x00000100,
70262306a36Sopenharmony_ci	0xf096, 0xffffffff, 0x00000100,
70362306a36Sopenharmony_ci	0xf097, 0xffffffff, 0x00000100,
70462306a36Sopenharmony_ci	0xf098, 0xffffffff, 0x00000100,
70562306a36Sopenharmony_ci	0xf09f, 0xffffffff, 0x00000100,
70662306a36Sopenharmony_ci	0xf09e, 0xffffffff, 0x00000100,
70762306a36Sopenharmony_ci	0xf084, 0xffffffff, 0x06000100,
70862306a36Sopenharmony_ci	0xf0a4, 0xffffffff, 0x00000100,
70962306a36Sopenharmony_ci	0xf09d, 0xffffffff, 0x00000100,
71062306a36Sopenharmony_ci	0xf0ad, 0xffffffff, 0x00000100,
71162306a36Sopenharmony_ci	0xf0ac, 0xffffffff, 0x00000100,
71262306a36Sopenharmony_ci	0xf09c, 0xffffffff, 0x00000100,
71362306a36Sopenharmony_ci	0xc200, 0xffffffff, 0xe0000000,
71462306a36Sopenharmony_ci	0xf008, 0xffffffff, 0x00010000,
71562306a36Sopenharmony_ci	0xf009, 0xffffffff, 0x00030002,
71662306a36Sopenharmony_ci	0xf00a, 0xffffffff, 0x00040007,
71762306a36Sopenharmony_ci	0xf00b, 0xffffffff, 0x00060005,
71862306a36Sopenharmony_ci	0xf00c, 0xffffffff, 0x00090008,
71962306a36Sopenharmony_ci	0xf00d, 0xffffffff, 0x00010000,
72062306a36Sopenharmony_ci	0xf00e, 0xffffffff, 0x00030002,
72162306a36Sopenharmony_ci	0xf00f, 0xffffffff, 0x00040007,
72262306a36Sopenharmony_ci	0xf010, 0xffffffff, 0x00060005,
72362306a36Sopenharmony_ci	0xf011, 0xffffffff, 0x00090008,
72462306a36Sopenharmony_ci	0xf012, 0xffffffff, 0x00010000,
72562306a36Sopenharmony_ci	0xf013, 0xffffffff, 0x00030002,
72662306a36Sopenharmony_ci	0xf014, 0xffffffff, 0x00040007,
72762306a36Sopenharmony_ci	0xf015, 0xffffffff, 0x00060005,
72862306a36Sopenharmony_ci	0xf016, 0xffffffff, 0x00090008,
72962306a36Sopenharmony_ci	0xf017, 0xffffffff, 0x00010000,
73062306a36Sopenharmony_ci	0xf018, 0xffffffff, 0x00030002,
73162306a36Sopenharmony_ci	0xf019, 0xffffffff, 0x00040007,
73262306a36Sopenharmony_ci	0xf01a, 0xffffffff, 0x00060005,
73362306a36Sopenharmony_ci	0xf01b, 0xffffffff, 0x00090008,
73462306a36Sopenharmony_ci	0xf01c, 0xffffffff, 0x00010000,
73562306a36Sopenharmony_ci	0xf01d, 0xffffffff, 0x00030002,
73662306a36Sopenharmony_ci	0xf01e, 0xffffffff, 0x00040007,
73762306a36Sopenharmony_ci	0xf01f, 0xffffffff, 0x00060005,
73862306a36Sopenharmony_ci	0xf020, 0xffffffff, 0x00090008,
73962306a36Sopenharmony_ci	0xf021, 0xffffffff, 0x00010000,
74062306a36Sopenharmony_ci	0xf022, 0xffffffff, 0x00030002,
74162306a36Sopenharmony_ci	0xf023, 0xffffffff, 0x00040007,
74262306a36Sopenharmony_ci	0xf024, 0xffffffff, 0x00060005,
74362306a36Sopenharmony_ci	0xf025, 0xffffffff, 0x00090008,
74462306a36Sopenharmony_ci	0xf026, 0xffffffff, 0x00010000,
74562306a36Sopenharmony_ci	0xf027, 0xffffffff, 0x00030002,
74662306a36Sopenharmony_ci	0xf028, 0xffffffff, 0x00040007,
74762306a36Sopenharmony_ci	0xf029, 0xffffffff, 0x00060005,
74862306a36Sopenharmony_ci	0xf02a, 0xffffffff, 0x00090008,
74962306a36Sopenharmony_ci	0xf02b, 0xffffffff, 0x00010000,
75062306a36Sopenharmony_ci	0xf02c, 0xffffffff, 0x00030002,
75162306a36Sopenharmony_ci	0xf02d, 0xffffffff, 0x00040007,
75262306a36Sopenharmony_ci	0xf02e, 0xffffffff, 0x00060005,
75362306a36Sopenharmony_ci	0xf02f, 0xffffffff, 0x00090008,
75462306a36Sopenharmony_ci	0xf030, 0xffffffff, 0x00010000,
75562306a36Sopenharmony_ci	0xf031, 0xffffffff, 0x00030002,
75662306a36Sopenharmony_ci	0xf032, 0xffffffff, 0x00040007,
75762306a36Sopenharmony_ci	0xf033, 0xffffffff, 0x00060005,
75862306a36Sopenharmony_ci	0xf034, 0xffffffff, 0x00090008,
75962306a36Sopenharmony_ci	0xf035, 0xffffffff, 0x00010000,
76062306a36Sopenharmony_ci	0xf036, 0xffffffff, 0x00030002,
76162306a36Sopenharmony_ci	0xf037, 0xffffffff, 0x00040007,
76262306a36Sopenharmony_ci	0xf038, 0xffffffff, 0x00060005,
76362306a36Sopenharmony_ci	0xf039, 0xffffffff, 0x00090008,
76462306a36Sopenharmony_ci	0xf03a, 0xffffffff, 0x00010000,
76562306a36Sopenharmony_ci	0xf03b, 0xffffffff, 0x00030002,
76662306a36Sopenharmony_ci	0xf03c, 0xffffffff, 0x00040007,
76762306a36Sopenharmony_ci	0xf03d, 0xffffffff, 0x00060005,
76862306a36Sopenharmony_ci	0xf03e, 0xffffffff, 0x00090008,
76962306a36Sopenharmony_ci	0x30c6, 0xffffffff, 0x00020200,
77062306a36Sopenharmony_ci	0xcd4, 0xffffffff, 0x00000200,
77162306a36Sopenharmony_ci	0x570, 0xffffffff, 0x00000400,
77262306a36Sopenharmony_ci	0x157a, 0xffffffff, 0x00000000,
77362306a36Sopenharmony_ci	0xbd4, 0xffffffff, 0x00000902,
77462306a36Sopenharmony_ci	0xf000, 0xffffffff, 0x96940200,
77562306a36Sopenharmony_ci	0x21c2, 0xffffffff, 0x00900100,
77662306a36Sopenharmony_ci	0x3109, 0xffffffff, 0x0020003f,
77762306a36Sopenharmony_ci	0xe, 0xffffffff, 0x0140001c,
77862306a36Sopenharmony_ci	0xf, 0x000f0000, 0x000f0000,
77962306a36Sopenharmony_ci	0x88, 0xffffffff, 0xc060000c,
78062306a36Sopenharmony_ci	0x89, 0xc0000fff, 0x00000100,
78162306a36Sopenharmony_ci	0x3e4, 0xffffffff, 0x00000100,
78262306a36Sopenharmony_ci	0x3e6, 0x00000101, 0x00000000,
78362306a36Sopenharmony_ci	0x82a, 0xffffffff, 0x00000104,
78462306a36Sopenharmony_ci	0x1579, 0xff000fff, 0x00000100,
78562306a36Sopenharmony_ci	0xc33, 0xc0000fff, 0x00000104,
78662306a36Sopenharmony_ci	0x3079, 0x00000001, 0x00000001,
78762306a36Sopenharmony_ci	0x3403, 0xff000ff0, 0x00000100,
78862306a36Sopenharmony_ci	0x3603, 0xff000ff0, 0x00000100
78962306a36Sopenharmony_ci};
79062306a36Sopenharmony_ci
79162306a36Sopenharmony_cistatic const u32 godavari_golden_registers[] =
79262306a36Sopenharmony_ci{
79362306a36Sopenharmony_ci	0x1579, 0xff607fff, 0xfc000100,
79462306a36Sopenharmony_ci	0x1bb6, 0x00010101, 0x00010000,
79562306a36Sopenharmony_ci	0x260c, 0xffffffff, 0x00000000,
79662306a36Sopenharmony_ci	0x260c0, 0xf00fffff, 0x00000400,
79762306a36Sopenharmony_ci	0x184c, 0xffffffff, 0x00010000,
79862306a36Sopenharmony_ci	0x16ec, 0x000000f0, 0x00000070,
79962306a36Sopenharmony_ci	0x16f0, 0xf0311fff, 0x80300000,
80062306a36Sopenharmony_ci	0x263e, 0x73773777, 0x12010001,
80162306a36Sopenharmony_ci	0x263f, 0xffffffff, 0x00000010,
80262306a36Sopenharmony_ci	0x200c, 0x00001f0f, 0x0000100a,
80362306a36Sopenharmony_ci	0xbd2, 0x73773777, 0x12010001,
80462306a36Sopenharmony_ci	0x902, 0x000fffff, 0x000c007f,
80562306a36Sopenharmony_ci	0x2285, 0xf000003f, 0x00000007,
80662306a36Sopenharmony_ci	0x22c9, 0xffffffff, 0x00ff0fff,
80762306a36Sopenharmony_ci	0xc281, 0x0000ff0f, 0x00000000,
80862306a36Sopenharmony_ci	0xa293, 0x07ffffff, 0x06000000,
80962306a36Sopenharmony_ci	0x136, 0x00000fff, 0x00000100,
81062306a36Sopenharmony_ci	0x3405, 0x00010000, 0x00810001,
81162306a36Sopenharmony_ci	0x3605, 0x00010000, 0x00810001,
81262306a36Sopenharmony_ci	0xf9e, 0x00000001, 0x00000002,
81362306a36Sopenharmony_ci	0x31da, 0x00000008, 0x00000008,
81462306a36Sopenharmony_ci	0x31dc, 0x00000f00, 0x00000800,
81562306a36Sopenharmony_ci	0x31dd, 0x00000f00, 0x00000800,
81662306a36Sopenharmony_ci	0x31e6, 0x00ffffff, 0x00ff7fbf,
81762306a36Sopenharmony_ci	0x31e7, 0x00ffffff, 0x00ff7faf,
81862306a36Sopenharmony_ci	0x2300, 0x000000ff, 0x00000001,
81962306a36Sopenharmony_ci	0x853e, 0x01ff01ff, 0x00000002,
82062306a36Sopenharmony_ci	0x8526, 0x007ff800, 0x00200000,
82162306a36Sopenharmony_ci	0x8057, 0xffffffff, 0x00000f40,
82262306a36Sopenharmony_ci	0x2231, 0x001f3ae3, 0x00000082,
82362306a36Sopenharmony_ci	0x2235, 0x0000001f, 0x00000010,
82462306a36Sopenharmony_ci	0xc24d, 0xffffffff, 0x00000000
82562306a36Sopenharmony_ci};
82662306a36Sopenharmony_ci
82762306a36Sopenharmony_cistatic void cik_init_golden_registers(struct amdgpu_device *adev)
82862306a36Sopenharmony_ci{
82962306a36Sopenharmony_ci	/* Some of the registers might be dependent on GRBM_GFX_INDEX */
83062306a36Sopenharmony_ci	mutex_lock(&adev->grbm_idx_mutex);
83162306a36Sopenharmony_ci
83262306a36Sopenharmony_ci	switch (adev->asic_type) {
83362306a36Sopenharmony_ci	case CHIP_BONAIRE:
83462306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
83562306a36Sopenharmony_ci							bonaire_mgcg_cgcg_init,
83662306a36Sopenharmony_ci							ARRAY_SIZE(bonaire_mgcg_cgcg_init));
83762306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
83862306a36Sopenharmony_ci							bonaire_golden_registers,
83962306a36Sopenharmony_ci							ARRAY_SIZE(bonaire_golden_registers));
84062306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
84162306a36Sopenharmony_ci							bonaire_golden_common_registers,
84262306a36Sopenharmony_ci							ARRAY_SIZE(bonaire_golden_common_registers));
84362306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
84462306a36Sopenharmony_ci							bonaire_golden_spm_registers,
84562306a36Sopenharmony_ci							ARRAY_SIZE(bonaire_golden_spm_registers));
84662306a36Sopenharmony_ci		break;
84762306a36Sopenharmony_ci	case CHIP_KABINI:
84862306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
84962306a36Sopenharmony_ci							kalindi_mgcg_cgcg_init,
85062306a36Sopenharmony_ci							ARRAY_SIZE(kalindi_mgcg_cgcg_init));
85162306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
85262306a36Sopenharmony_ci							kalindi_golden_registers,
85362306a36Sopenharmony_ci							ARRAY_SIZE(kalindi_golden_registers));
85462306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
85562306a36Sopenharmony_ci							kalindi_golden_common_registers,
85662306a36Sopenharmony_ci							ARRAY_SIZE(kalindi_golden_common_registers));
85762306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
85862306a36Sopenharmony_ci							kalindi_golden_spm_registers,
85962306a36Sopenharmony_ci							ARRAY_SIZE(kalindi_golden_spm_registers));
86062306a36Sopenharmony_ci		break;
86162306a36Sopenharmony_ci	case CHIP_MULLINS:
86262306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
86362306a36Sopenharmony_ci							kalindi_mgcg_cgcg_init,
86462306a36Sopenharmony_ci							ARRAY_SIZE(kalindi_mgcg_cgcg_init));
86562306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
86662306a36Sopenharmony_ci							godavari_golden_registers,
86762306a36Sopenharmony_ci							ARRAY_SIZE(godavari_golden_registers));
86862306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
86962306a36Sopenharmony_ci							kalindi_golden_common_registers,
87062306a36Sopenharmony_ci							ARRAY_SIZE(kalindi_golden_common_registers));
87162306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
87262306a36Sopenharmony_ci							kalindi_golden_spm_registers,
87362306a36Sopenharmony_ci							ARRAY_SIZE(kalindi_golden_spm_registers));
87462306a36Sopenharmony_ci		break;
87562306a36Sopenharmony_ci	case CHIP_KAVERI:
87662306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
87762306a36Sopenharmony_ci							spectre_mgcg_cgcg_init,
87862306a36Sopenharmony_ci							ARRAY_SIZE(spectre_mgcg_cgcg_init));
87962306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
88062306a36Sopenharmony_ci							spectre_golden_registers,
88162306a36Sopenharmony_ci							ARRAY_SIZE(spectre_golden_registers));
88262306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
88362306a36Sopenharmony_ci							spectre_golden_common_registers,
88462306a36Sopenharmony_ci							ARRAY_SIZE(spectre_golden_common_registers));
88562306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
88662306a36Sopenharmony_ci							spectre_golden_spm_registers,
88762306a36Sopenharmony_ci							ARRAY_SIZE(spectre_golden_spm_registers));
88862306a36Sopenharmony_ci		break;
88962306a36Sopenharmony_ci	case CHIP_HAWAII:
89062306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
89162306a36Sopenharmony_ci							hawaii_mgcg_cgcg_init,
89262306a36Sopenharmony_ci							ARRAY_SIZE(hawaii_mgcg_cgcg_init));
89362306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
89462306a36Sopenharmony_ci							hawaii_golden_registers,
89562306a36Sopenharmony_ci							ARRAY_SIZE(hawaii_golden_registers));
89662306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
89762306a36Sopenharmony_ci							hawaii_golden_common_registers,
89862306a36Sopenharmony_ci							ARRAY_SIZE(hawaii_golden_common_registers));
89962306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
90062306a36Sopenharmony_ci							hawaii_golden_spm_registers,
90162306a36Sopenharmony_ci							ARRAY_SIZE(hawaii_golden_spm_registers));
90262306a36Sopenharmony_ci		break;
90362306a36Sopenharmony_ci	default:
90462306a36Sopenharmony_ci		break;
90562306a36Sopenharmony_ci	}
90662306a36Sopenharmony_ci	mutex_unlock(&adev->grbm_idx_mutex);
90762306a36Sopenharmony_ci}
90862306a36Sopenharmony_ci
90962306a36Sopenharmony_ci/**
91062306a36Sopenharmony_ci * cik_get_xclk - get the xclk
91162306a36Sopenharmony_ci *
91262306a36Sopenharmony_ci * @adev: amdgpu_device pointer
91362306a36Sopenharmony_ci *
91462306a36Sopenharmony_ci * Returns the reference clock used by the gfx engine
91562306a36Sopenharmony_ci * (CIK).
91662306a36Sopenharmony_ci */
91762306a36Sopenharmony_cistatic u32 cik_get_xclk(struct amdgpu_device *adev)
91862306a36Sopenharmony_ci{
91962306a36Sopenharmony_ci	u32 reference_clock = adev->clock.spll.reference_freq;
92062306a36Sopenharmony_ci
92162306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU) {
92262306a36Sopenharmony_ci		if (RREG32_SMC(ixGENERAL_PWRMGT) & GENERAL_PWRMGT__GPU_COUNTER_CLK_MASK)
92362306a36Sopenharmony_ci			return reference_clock / 2;
92462306a36Sopenharmony_ci	} else {
92562306a36Sopenharmony_ci		if (RREG32_SMC(ixCG_CLKPIN_CNTL) & CG_CLKPIN_CNTL__XTALIN_DIVIDE_MASK)
92662306a36Sopenharmony_ci			return reference_clock / 4;
92762306a36Sopenharmony_ci	}
92862306a36Sopenharmony_ci	return reference_clock;
92962306a36Sopenharmony_ci}
93062306a36Sopenharmony_ci
93162306a36Sopenharmony_ci/**
93262306a36Sopenharmony_ci * cik_srbm_select - select specific register instances
93362306a36Sopenharmony_ci *
93462306a36Sopenharmony_ci * @adev: amdgpu_device pointer
93562306a36Sopenharmony_ci * @me: selected ME (micro engine)
93662306a36Sopenharmony_ci * @pipe: pipe
93762306a36Sopenharmony_ci * @queue: queue
93862306a36Sopenharmony_ci * @vmid: VMID
93962306a36Sopenharmony_ci *
94062306a36Sopenharmony_ci * Switches the currently active registers instances.  Some
94162306a36Sopenharmony_ci * registers are instanced per VMID, others are instanced per
94262306a36Sopenharmony_ci * me/pipe/queue combination.
94362306a36Sopenharmony_ci */
94462306a36Sopenharmony_civoid cik_srbm_select(struct amdgpu_device *adev,
94562306a36Sopenharmony_ci		     u32 me, u32 pipe, u32 queue, u32 vmid)
94662306a36Sopenharmony_ci{
94762306a36Sopenharmony_ci	u32 srbm_gfx_cntl =
94862306a36Sopenharmony_ci		(((pipe << SRBM_GFX_CNTL__PIPEID__SHIFT) & SRBM_GFX_CNTL__PIPEID_MASK)|
94962306a36Sopenharmony_ci		((me << SRBM_GFX_CNTL__MEID__SHIFT) & SRBM_GFX_CNTL__MEID_MASK)|
95062306a36Sopenharmony_ci		((vmid << SRBM_GFX_CNTL__VMID__SHIFT) & SRBM_GFX_CNTL__VMID_MASK)|
95162306a36Sopenharmony_ci		((queue << SRBM_GFX_CNTL__QUEUEID__SHIFT) & SRBM_GFX_CNTL__QUEUEID_MASK));
95262306a36Sopenharmony_ci	WREG32(mmSRBM_GFX_CNTL, srbm_gfx_cntl);
95362306a36Sopenharmony_ci}
95462306a36Sopenharmony_ci
95562306a36Sopenharmony_cistatic void cik_vga_set_state(struct amdgpu_device *adev, bool state)
95662306a36Sopenharmony_ci{
95762306a36Sopenharmony_ci	uint32_t tmp;
95862306a36Sopenharmony_ci
95962306a36Sopenharmony_ci	tmp = RREG32(mmCONFIG_CNTL);
96062306a36Sopenharmony_ci	if (!state)
96162306a36Sopenharmony_ci		tmp |= CONFIG_CNTL__VGA_DIS_MASK;
96262306a36Sopenharmony_ci	else
96362306a36Sopenharmony_ci		tmp &= ~CONFIG_CNTL__VGA_DIS_MASK;
96462306a36Sopenharmony_ci	WREG32(mmCONFIG_CNTL, tmp);
96562306a36Sopenharmony_ci}
96662306a36Sopenharmony_ci
96762306a36Sopenharmony_cistatic bool cik_read_disabled_bios(struct amdgpu_device *adev)
96862306a36Sopenharmony_ci{
96962306a36Sopenharmony_ci	u32 bus_cntl;
97062306a36Sopenharmony_ci	u32 d1vga_control = 0;
97162306a36Sopenharmony_ci	u32 d2vga_control = 0;
97262306a36Sopenharmony_ci	u32 vga_render_control = 0;
97362306a36Sopenharmony_ci	u32 rom_cntl;
97462306a36Sopenharmony_ci	bool r;
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_ci	bus_cntl = RREG32(mmBUS_CNTL);
97762306a36Sopenharmony_ci	if (adev->mode_info.num_crtc) {
97862306a36Sopenharmony_ci		d1vga_control = RREG32(mmD1VGA_CONTROL);
97962306a36Sopenharmony_ci		d2vga_control = RREG32(mmD2VGA_CONTROL);
98062306a36Sopenharmony_ci		vga_render_control = RREG32(mmVGA_RENDER_CONTROL);
98162306a36Sopenharmony_ci	}
98262306a36Sopenharmony_ci	rom_cntl = RREG32_SMC(ixROM_CNTL);
98362306a36Sopenharmony_ci
98462306a36Sopenharmony_ci	/* enable the rom */
98562306a36Sopenharmony_ci	WREG32(mmBUS_CNTL, (bus_cntl & ~BUS_CNTL__BIOS_ROM_DIS_MASK));
98662306a36Sopenharmony_ci	if (adev->mode_info.num_crtc) {
98762306a36Sopenharmony_ci		/* Disable VGA mode */
98862306a36Sopenharmony_ci		WREG32(mmD1VGA_CONTROL,
98962306a36Sopenharmony_ci		       (d1vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
99062306a36Sopenharmony_ci					  D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
99162306a36Sopenharmony_ci		WREG32(mmD2VGA_CONTROL,
99262306a36Sopenharmony_ci		       (d2vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
99362306a36Sopenharmony_ci					  D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
99462306a36Sopenharmony_ci		WREG32(mmVGA_RENDER_CONTROL,
99562306a36Sopenharmony_ci		       (vga_render_control & ~VGA_RENDER_CONTROL__VGA_VSTATUS_CNTL_MASK));
99662306a36Sopenharmony_ci	}
99762306a36Sopenharmony_ci	WREG32_SMC(ixROM_CNTL, rom_cntl | ROM_CNTL__SCK_OVERWRITE_MASK);
99862306a36Sopenharmony_ci
99962306a36Sopenharmony_ci	r = amdgpu_read_bios(adev);
100062306a36Sopenharmony_ci
100162306a36Sopenharmony_ci	/* restore regs */
100262306a36Sopenharmony_ci	WREG32(mmBUS_CNTL, bus_cntl);
100362306a36Sopenharmony_ci	if (adev->mode_info.num_crtc) {
100462306a36Sopenharmony_ci		WREG32(mmD1VGA_CONTROL, d1vga_control);
100562306a36Sopenharmony_ci		WREG32(mmD2VGA_CONTROL, d2vga_control);
100662306a36Sopenharmony_ci		WREG32(mmVGA_RENDER_CONTROL, vga_render_control);
100762306a36Sopenharmony_ci	}
100862306a36Sopenharmony_ci	WREG32_SMC(ixROM_CNTL, rom_cntl);
100962306a36Sopenharmony_ci	return r;
101062306a36Sopenharmony_ci}
101162306a36Sopenharmony_ci
101262306a36Sopenharmony_cistatic bool cik_read_bios_from_rom(struct amdgpu_device *adev,
101362306a36Sopenharmony_ci				   u8 *bios, u32 length_bytes)
101462306a36Sopenharmony_ci{
101562306a36Sopenharmony_ci	u32 *dw_ptr;
101662306a36Sopenharmony_ci	unsigned long flags;
101762306a36Sopenharmony_ci	u32 i, length_dw;
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_ci	if (bios == NULL)
102062306a36Sopenharmony_ci		return false;
102162306a36Sopenharmony_ci	if (length_bytes == 0)
102262306a36Sopenharmony_ci		return false;
102362306a36Sopenharmony_ci	/* APU vbios image is part of sbios image */
102462306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
102562306a36Sopenharmony_ci		return false;
102662306a36Sopenharmony_ci
102762306a36Sopenharmony_ci	dw_ptr = (u32 *)bios;
102862306a36Sopenharmony_ci	length_dw = ALIGN(length_bytes, 4) / 4;
102962306a36Sopenharmony_ci	/* take the smc lock since we are using the smc index */
103062306a36Sopenharmony_ci	spin_lock_irqsave(&adev->smc_idx_lock, flags);
103162306a36Sopenharmony_ci	/* set rom index to 0 */
103262306a36Sopenharmony_ci	WREG32(mmSMC_IND_INDEX_0, ixROM_INDEX);
103362306a36Sopenharmony_ci	WREG32(mmSMC_IND_DATA_0, 0);
103462306a36Sopenharmony_ci	/* set index to data for continous read */
103562306a36Sopenharmony_ci	WREG32(mmSMC_IND_INDEX_0, ixROM_DATA);
103662306a36Sopenharmony_ci	for (i = 0; i < length_dw; i++)
103762306a36Sopenharmony_ci		dw_ptr[i] = RREG32(mmSMC_IND_DATA_0);
103862306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_ci	return true;
104162306a36Sopenharmony_ci}
104262306a36Sopenharmony_ci
104362306a36Sopenharmony_cistatic const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = {
104462306a36Sopenharmony_ci	{mmGRBM_STATUS},
104562306a36Sopenharmony_ci	{mmGRBM_STATUS2},
104662306a36Sopenharmony_ci	{mmGRBM_STATUS_SE0},
104762306a36Sopenharmony_ci	{mmGRBM_STATUS_SE1},
104862306a36Sopenharmony_ci	{mmGRBM_STATUS_SE2},
104962306a36Sopenharmony_ci	{mmGRBM_STATUS_SE3},
105062306a36Sopenharmony_ci	{mmSRBM_STATUS},
105162306a36Sopenharmony_ci	{mmSRBM_STATUS2},
105262306a36Sopenharmony_ci	{mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET},
105362306a36Sopenharmony_ci	{mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET},
105462306a36Sopenharmony_ci	{mmCP_STAT},
105562306a36Sopenharmony_ci	{mmCP_STALLED_STAT1},
105662306a36Sopenharmony_ci	{mmCP_STALLED_STAT2},
105762306a36Sopenharmony_ci	{mmCP_STALLED_STAT3},
105862306a36Sopenharmony_ci	{mmCP_CPF_BUSY_STAT},
105962306a36Sopenharmony_ci	{mmCP_CPF_STALLED_STAT1},
106062306a36Sopenharmony_ci	{mmCP_CPF_STATUS},
106162306a36Sopenharmony_ci	{mmCP_CPC_BUSY_STAT},
106262306a36Sopenharmony_ci	{mmCP_CPC_STALLED_STAT1},
106362306a36Sopenharmony_ci	{mmCP_CPC_STATUS},
106462306a36Sopenharmony_ci	{mmGB_ADDR_CONFIG},
106562306a36Sopenharmony_ci	{mmMC_ARB_RAMCFG},
106662306a36Sopenharmony_ci	{mmGB_TILE_MODE0},
106762306a36Sopenharmony_ci	{mmGB_TILE_MODE1},
106862306a36Sopenharmony_ci	{mmGB_TILE_MODE2},
106962306a36Sopenharmony_ci	{mmGB_TILE_MODE3},
107062306a36Sopenharmony_ci	{mmGB_TILE_MODE4},
107162306a36Sopenharmony_ci	{mmGB_TILE_MODE5},
107262306a36Sopenharmony_ci	{mmGB_TILE_MODE6},
107362306a36Sopenharmony_ci	{mmGB_TILE_MODE7},
107462306a36Sopenharmony_ci	{mmGB_TILE_MODE8},
107562306a36Sopenharmony_ci	{mmGB_TILE_MODE9},
107662306a36Sopenharmony_ci	{mmGB_TILE_MODE10},
107762306a36Sopenharmony_ci	{mmGB_TILE_MODE11},
107862306a36Sopenharmony_ci	{mmGB_TILE_MODE12},
107962306a36Sopenharmony_ci	{mmGB_TILE_MODE13},
108062306a36Sopenharmony_ci	{mmGB_TILE_MODE14},
108162306a36Sopenharmony_ci	{mmGB_TILE_MODE15},
108262306a36Sopenharmony_ci	{mmGB_TILE_MODE16},
108362306a36Sopenharmony_ci	{mmGB_TILE_MODE17},
108462306a36Sopenharmony_ci	{mmGB_TILE_MODE18},
108562306a36Sopenharmony_ci	{mmGB_TILE_MODE19},
108662306a36Sopenharmony_ci	{mmGB_TILE_MODE20},
108762306a36Sopenharmony_ci	{mmGB_TILE_MODE21},
108862306a36Sopenharmony_ci	{mmGB_TILE_MODE22},
108962306a36Sopenharmony_ci	{mmGB_TILE_MODE23},
109062306a36Sopenharmony_ci	{mmGB_TILE_MODE24},
109162306a36Sopenharmony_ci	{mmGB_TILE_MODE25},
109262306a36Sopenharmony_ci	{mmGB_TILE_MODE26},
109362306a36Sopenharmony_ci	{mmGB_TILE_MODE27},
109462306a36Sopenharmony_ci	{mmGB_TILE_MODE28},
109562306a36Sopenharmony_ci	{mmGB_TILE_MODE29},
109662306a36Sopenharmony_ci	{mmGB_TILE_MODE30},
109762306a36Sopenharmony_ci	{mmGB_TILE_MODE31},
109862306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE0},
109962306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE1},
110062306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE2},
110162306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE3},
110262306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE4},
110362306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE5},
110462306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE6},
110562306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE7},
110662306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE8},
110762306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE9},
110862306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE10},
110962306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE11},
111062306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE12},
111162306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE13},
111262306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE14},
111362306a36Sopenharmony_ci	{mmGB_MACROTILE_MODE15},
111462306a36Sopenharmony_ci	{mmCC_RB_BACKEND_DISABLE, true},
111562306a36Sopenharmony_ci	{mmGC_USER_RB_BACKEND_DISABLE, true},
111662306a36Sopenharmony_ci	{mmGB_BACKEND_MAP, false},
111762306a36Sopenharmony_ci	{mmPA_SC_RASTER_CONFIG, true},
111862306a36Sopenharmony_ci	{mmPA_SC_RASTER_CONFIG_1, true},
111962306a36Sopenharmony_ci};
112062306a36Sopenharmony_ci
112162306a36Sopenharmony_ci
112262306a36Sopenharmony_cistatic uint32_t cik_get_register_value(struct amdgpu_device *adev,
112362306a36Sopenharmony_ci				       bool indexed, u32 se_num,
112462306a36Sopenharmony_ci				       u32 sh_num, u32 reg_offset)
112562306a36Sopenharmony_ci{
112662306a36Sopenharmony_ci	if (indexed) {
112762306a36Sopenharmony_ci		uint32_t val;
112862306a36Sopenharmony_ci		unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
112962306a36Sopenharmony_ci		unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
113062306a36Sopenharmony_ci
113162306a36Sopenharmony_ci		switch (reg_offset) {
113262306a36Sopenharmony_ci		case mmCC_RB_BACKEND_DISABLE:
113362306a36Sopenharmony_ci			return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
113462306a36Sopenharmony_ci		case mmGC_USER_RB_BACKEND_DISABLE:
113562306a36Sopenharmony_ci			return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
113662306a36Sopenharmony_ci		case mmPA_SC_RASTER_CONFIG:
113762306a36Sopenharmony_ci			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
113862306a36Sopenharmony_ci		case mmPA_SC_RASTER_CONFIG_1:
113962306a36Sopenharmony_ci			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config_1;
114062306a36Sopenharmony_ci		}
114162306a36Sopenharmony_ci
114262306a36Sopenharmony_ci		mutex_lock(&adev->grbm_idx_mutex);
114362306a36Sopenharmony_ci		if (se_num != 0xffffffff || sh_num != 0xffffffff)
114462306a36Sopenharmony_ci			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff, 0);
114562306a36Sopenharmony_ci
114662306a36Sopenharmony_ci		val = RREG32(reg_offset);
114762306a36Sopenharmony_ci
114862306a36Sopenharmony_ci		if (se_num != 0xffffffff || sh_num != 0xffffffff)
114962306a36Sopenharmony_ci			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
115062306a36Sopenharmony_ci		mutex_unlock(&adev->grbm_idx_mutex);
115162306a36Sopenharmony_ci		return val;
115262306a36Sopenharmony_ci	} else {
115362306a36Sopenharmony_ci		unsigned idx;
115462306a36Sopenharmony_ci
115562306a36Sopenharmony_ci		switch (reg_offset) {
115662306a36Sopenharmony_ci		case mmGB_ADDR_CONFIG:
115762306a36Sopenharmony_ci			return adev->gfx.config.gb_addr_config;
115862306a36Sopenharmony_ci		case mmMC_ARB_RAMCFG:
115962306a36Sopenharmony_ci			return adev->gfx.config.mc_arb_ramcfg;
116062306a36Sopenharmony_ci		case mmGB_TILE_MODE0:
116162306a36Sopenharmony_ci		case mmGB_TILE_MODE1:
116262306a36Sopenharmony_ci		case mmGB_TILE_MODE2:
116362306a36Sopenharmony_ci		case mmGB_TILE_MODE3:
116462306a36Sopenharmony_ci		case mmGB_TILE_MODE4:
116562306a36Sopenharmony_ci		case mmGB_TILE_MODE5:
116662306a36Sopenharmony_ci		case mmGB_TILE_MODE6:
116762306a36Sopenharmony_ci		case mmGB_TILE_MODE7:
116862306a36Sopenharmony_ci		case mmGB_TILE_MODE8:
116962306a36Sopenharmony_ci		case mmGB_TILE_MODE9:
117062306a36Sopenharmony_ci		case mmGB_TILE_MODE10:
117162306a36Sopenharmony_ci		case mmGB_TILE_MODE11:
117262306a36Sopenharmony_ci		case mmGB_TILE_MODE12:
117362306a36Sopenharmony_ci		case mmGB_TILE_MODE13:
117462306a36Sopenharmony_ci		case mmGB_TILE_MODE14:
117562306a36Sopenharmony_ci		case mmGB_TILE_MODE15:
117662306a36Sopenharmony_ci		case mmGB_TILE_MODE16:
117762306a36Sopenharmony_ci		case mmGB_TILE_MODE17:
117862306a36Sopenharmony_ci		case mmGB_TILE_MODE18:
117962306a36Sopenharmony_ci		case mmGB_TILE_MODE19:
118062306a36Sopenharmony_ci		case mmGB_TILE_MODE20:
118162306a36Sopenharmony_ci		case mmGB_TILE_MODE21:
118262306a36Sopenharmony_ci		case mmGB_TILE_MODE22:
118362306a36Sopenharmony_ci		case mmGB_TILE_MODE23:
118462306a36Sopenharmony_ci		case mmGB_TILE_MODE24:
118562306a36Sopenharmony_ci		case mmGB_TILE_MODE25:
118662306a36Sopenharmony_ci		case mmGB_TILE_MODE26:
118762306a36Sopenharmony_ci		case mmGB_TILE_MODE27:
118862306a36Sopenharmony_ci		case mmGB_TILE_MODE28:
118962306a36Sopenharmony_ci		case mmGB_TILE_MODE29:
119062306a36Sopenharmony_ci		case mmGB_TILE_MODE30:
119162306a36Sopenharmony_ci		case mmGB_TILE_MODE31:
119262306a36Sopenharmony_ci			idx = (reg_offset - mmGB_TILE_MODE0);
119362306a36Sopenharmony_ci			return adev->gfx.config.tile_mode_array[idx];
119462306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE0:
119562306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE1:
119662306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE2:
119762306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE3:
119862306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE4:
119962306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE5:
120062306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE6:
120162306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE7:
120262306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE8:
120362306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE9:
120462306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE10:
120562306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE11:
120662306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE12:
120762306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE13:
120862306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE14:
120962306a36Sopenharmony_ci		case mmGB_MACROTILE_MODE15:
121062306a36Sopenharmony_ci			idx = (reg_offset - mmGB_MACROTILE_MODE0);
121162306a36Sopenharmony_ci			return adev->gfx.config.macrotile_mode_array[idx];
121262306a36Sopenharmony_ci		default:
121362306a36Sopenharmony_ci			return RREG32(reg_offset);
121462306a36Sopenharmony_ci		}
121562306a36Sopenharmony_ci	}
121662306a36Sopenharmony_ci}
121762306a36Sopenharmony_ci
121862306a36Sopenharmony_cistatic int cik_read_register(struct amdgpu_device *adev, u32 se_num,
121962306a36Sopenharmony_ci			     u32 sh_num, u32 reg_offset, u32 *value)
122062306a36Sopenharmony_ci{
122162306a36Sopenharmony_ci	uint32_t i;
122262306a36Sopenharmony_ci
122362306a36Sopenharmony_ci	*value = 0;
122462306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(cik_allowed_read_registers); i++) {
122562306a36Sopenharmony_ci		bool indexed = cik_allowed_read_registers[i].grbm_indexed;
122662306a36Sopenharmony_ci
122762306a36Sopenharmony_ci		if (reg_offset != cik_allowed_read_registers[i].reg_offset)
122862306a36Sopenharmony_ci			continue;
122962306a36Sopenharmony_ci
123062306a36Sopenharmony_ci		*value = cik_get_register_value(adev, indexed, se_num, sh_num,
123162306a36Sopenharmony_ci						reg_offset);
123262306a36Sopenharmony_ci		return 0;
123362306a36Sopenharmony_ci	}
123462306a36Sopenharmony_ci	return -EINVAL;
123562306a36Sopenharmony_ci}
123662306a36Sopenharmony_ci
123762306a36Sopenharmony_cistruct kv_reset_save_regs {
123862306a36Sopenharmony_ci	u32 gmcon_reng_execute;
123962306a36Sopenharmony_ci	u32 gmcon_misc;
124062306a36Sopenharmony_ci	u32 gmcon_misc3;
124162306a36Sopenharmony_ci};
124262306a36Sopenharmony_ci
124362306a36Sopenharmony_cistatic void kv_save_regs_for_reset(struct amdgpu_device *adev,
124462306a36Sopenharmony_ci				   struct kv_reset_save_regs *save)
124562306a36Sopenharmony_ci{
124662306a36Sopenharmony_ci	save->gmcon_reng_execute = RREG32(mmGMCON_RENG_EXECUTE);
124762306a36Sopenharmony_ci	save->gmcon_misc = RREG32(mmGMCON_MISC);
124862306a36Sopenharmony_ci	save->gmcon_misc3 = RREG32(mmGMCON_MISC3);
124962306a36Sopenharmony_ci
125062306a36Sopenharmony_ci	WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute &
125162306a36Sopenharmony_ci		~GMCON_RENG_EXECUTE__RENG_EXECUTE_ON_PWR_UP_MASK);
125262306a36Sopenharmony_ci	WREG32(mmGMCON_MISC, save->gmcon_misc &
125362306a36Sopenharmony_ci		~(GMCON_MISC__RENG_EXECUTE_ON_REG_UPDATE_MASK |
125462306a36Sopenharmony_ci			GMCON_MISC__STCTRL_STUTTER_EN_MASK));
125562306a36Sopenharmony_ci}
125662306a36Sopenharmony_ci
125762306a36Sopenharmony_cistatic void kv_restore_regs_for_reset(struct amdgpu_device *adev,
125862306a36Sopenharmony_ci				      struct kv_reset_save_regs *save)
125962306a36Sopenharmony_ci{
126062306a36Sopenharmony_ci	int i;
126162306a36Sopenharmony_ci
126262306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_WRITE, 0);
126362306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_CONFIG, 0x200010ff);
126462306a36Sopenharmony_ci
126562306a36Sopenharmony_ci	for (i = 0; i < 5; i++)
126662306a36Sopenharmony_ci		WREG32(mmGMCON_PGFSM_WRITE, 0);
126762306a36Sopenharmony_ci
126862306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_WRITE, 0);
126962306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_CONFIG, 0x300010ff);
127062306a36Sopenharmony_ci
127162306a36Sopenharmony_ci	for (i = 0; i < 5; i++)
127262306a36Sopenharmony_ci		WREG32(mmGMCON_PGFSM_WRITE, 0);
127362306a36Sopenharmony_ci
127462306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_WRITE, 0x210000);
127562306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_CONFIG, 0xa00010ff);
127662306a36Sopenharmony_ci
127762306a36Sopenharmony_ci	for (i = 0; i < 5; i++)
127862306a36Sopenharmony_ci		WREG32(mmGMCON_PGFSM_WRITE, 0);
127962306a36Sopenharmony_ci
128062306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_WRITE, 0x21003);
128162306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_CONFIG, 0xb00010ff);
128262306a36Sopenharmony_ci
128362306a36Sopenharmony_ci	for (i = 0; i < 5; i++)
128462306a36Sopenharmony_ci		WREG32(mmGMCON_PGFSM_WRITE, 0);
128562306a36Sopenharmony_ci
128662306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_WRITE, 0x2b00);
128762306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_CONFIG, 0xc00010ff);
128862306a36Sopenharmony_ci
128962306a36Sopenharmony_ci	for (i = 0; i < 5; i++)
129062306a36Sopenharmony_ci		WREG32(mmGMCON_PGFSM_WRITE, 0);
129162306a36Sopenharmony_ci
129262306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_WRITE, 0);
129362306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_CONFIG, 0xd00010ff);
129462306a36Sopenharmony_ci
129562306a36Sopenharmony_ci	for (i = 0; i < 5; i++)
129662306a36Sopenharmony_ci		WREG32(mmGMCON_PGFSM_WRITE, 0);
129762306a36Sopenharmony_ci
129862306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_WRITE, 0x420000);
129962306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_CONFIG, 0x100010ff);
130062306a36Sopenharmony_ci
130162306a36Sopenharmony_ci	for (i = 0; i < 5; i++)
130262306a36Sopenharmony_ci		WREG32(mmGMCON_PGFSM_WRITE, 0);
130362306a36Sopenharmony_ci
130462306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_WRITE, 0x120202);
130562306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_CONFIG, 0x500010ff);
130662306a36Sopenharmony_ci
130762306a36Sopenharmony_ci	for (i = 0; i < 5; i++)
130862306a36Sopenharmony_ci		WREG32(mmGMCON_PGFSM_WRITE, 0);
130962306a36Sopenharmony_ci
131062306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_WRITE, 0x3e3e36);
131162306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_CONFIG, 0x600010ff);
131262306a36Sopenharmony_ci
131362306a36Sopenharmony_ci	for (i = 0; i < 5; i++)
131462306a36Sopenharmony_ci		WREG32(mmGMCON_PGFSM_WRITE, 0);
131562306a36Sopenharmony_ci
131662306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_WRITE, 0x373f3e);
131762306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_CONFIG, 0x700010ff);
131862306a36Sopenharmony_ci
131962306a36Sopenharmony_ci	for (i = 0; i < 5; i++)
132062306a36Sopenharmony_ci		WREG32(mmGMCON_PGFSM_WRITE, 0);
132162306a36Sopenharmony_ci
132262306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_WRITE, 0x3e1332);
132362306a36Sopenharmony_ci	WREG32(mmGMCON_PGFSM_CONFIG, 0xe00010ff);
132462306a36Sopenharmony_ci
132562306a36Sopenharmony_ci	WREG32(mmGMCON_MISC3, save->gmcon_misc3);
132662306a36Sopenharmony_ci	WREG32(mmGMCON_MISC, save->gmcon_misc);
132762306a36Sopenharmony_ci	WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute);
132862306a36Sopenharmony_ci}
132962306a36Sopenharmony_ci
133062306a36Sopenharmony_ci/**
133162306a36Sopenharmony_ci * cik_asic_pci_config_reset - soft reset GPU
133262306a36Sopenharmony_ci *
133362306a36Sopenharmony_ci * @adev: amdgpu_device pointer
133462306a36Sopenharmony_ci *
133562306a36Sopenharmony_ci * Use PCI Config method to reset the GPU.
133662306a36Sopenharmony_ci *
133762306a36Sopenharmony_ci * Returns 0 for success.
133862306a36Sopenharmony_ci */
133962306a36Sopenharmony_cistatic int cik_asic_pci_config_reset(struct amdgpu_device *adev)
134062306a36Sopenharmony_ci{
134162306a36Sopenharmony_ci	struct kv_reset_save_regs kv_save = { 0 };
134262306a36Sopenharmony_ci	u32 i;
134362306a36Sopenharmony_ci	int r = -EINVAL;
134462306a36Sopenharmony_ci
134562306a36Sopenharmony_ci	amdgpu_atombios_scratch_regs_engine_hung(adev, true);
134662306a36Sopenharmony_ci
134762306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
134862306a36Sopenharmony_ci		kv_save_regs_for_reset(adev, &kv_save);
134962306a36Sopenharmony_ci
135062306a36Sopenharmony_ci	/* disable BM */
135162306a36Sopenharmony_ci	pci_clear_master(adev->pdev);
135262306a36Sopenharmony_ci	/* reset */
135362306a36Sopenharmony_ci	amdgpu_device_pci_config_reset(adev);
135462306a36Sopenharmony_ci
135562306a36Sopenharmony_ci	udelay(100);
135662306a36Sopenharmony_ci
135762306a36Sopenharmony_ci	/* wait for asic to come out of reset */
135862306a36Sopenharmony_ci	for (i = 0; i < adev->usec_timeout; i++) {
135962306a36Sopenharmony_ci		if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
136062306a36Sopenharmony_ci			/* enable BM */
136162306a36Sopenharmony_ci			pci_set_master(adev->pdev);
136262306a36Sopenharmony_ci			adev->has_hw_reset = true;
136362306a36Sopenharmony_ci			r = 0;
136462306a36Sopenharmony_ci			break;
136562306a36Sopenharmony_ci		}
136662306a36Sopenharmony_ci		udelay(1);
136762306a36Sopenharmony_ci	}
136862306a36Sopenharmony_ci
136962306a36Sopenharmony_ci	/* does asic init need to be run first??? */
137062306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
137162306a36Sopenharmony_ci		kv_restore_regs_for_reset(adev, &kv_save);
137262306a36Sopenharmony_ci
137362306a36Sopenharmony_ci	amdgpu_atombios_scratch_regs_engine_hung(adev, false);
137462306a36Sopenharmony_ci
137562306a36Sopenharmony_ci	return r;
137662306a36Sopenharmony_ci}
137762306a36Sopenharmony_ci
137862306a36Sopenharmony_cistatic bool cik_asic_supports_baco(struct amdgpu_device *adev)
137962306a36Sopenharmony_ci{
138062306a36Sopenharmony_ci	switch (adev->asic_type) {
138162306a36Sopenharmony_ci	case CHIP_BONAIRE:
138262306a36Sopenharmony_ci	case CHIP_HAWAII:
138362306a36Sopenharmony_ci		return amdgpu_dpm_is_baco_supported(adev);
138462306a36Sopenharmony_ci	default:
138562306a36Sopenharmony_ci		return false;
138662306a36Sopenharmony_ci	}
138762306a36Sopenharmony_ci}
138862306a36Sopenharmony_ci
138962306a36Sopenharmony_cistatic enum amd_reset_method
139062306a36Sopenharmony_cicik_asic_reset_method(struct amdgpu_device *adev)
139162306a36Sopenharmony_ci{
139262306a36Sopenharmony_ci	bool baco_reset;
139362306a36Sopenharmony_ci
139462306a36Sopenharmony_ci	if (amdgpu_reset_method == AMD_RESET_METHOD_LEGACY ||
139562306a36Sopenharmony_ci	    amdgpu_reset_method == AMD_RESET_METHOD_BACO)
139662306a36Sopenharmony_ci		return amdgpu_reset_method;
139762306a36Sopenharmony_ci
139862306a36Sopenharmony_ci	if (amdgpu_reset_method != -1)
139962306a36Sopenharmony_ci		dev_warn(adev->dev, "Specified reset:%d isn't supported, using AUTO instead.\n",
140062306a36Sopenharmony_ci				  amdgpu_reset_method);
140162306a36Sopenharmony_ci
140262306a36Sopenharmony_ci	switch (adev->asic_type) {
140362306a36Sopenharmony_ci	case CHIP_BONAIRE:
140462306a36Sopenharmony_ci	case CHIP_HAWAII:
140562306a36Sopenharmony_ci		baco_reset = cik_asic_supports_baco(adev);
140662306a36Sopenharmony_ci		break;
140762306a36Sopenharmony_ci	default:
140862306a36Sopenharmony_ci		baco_reset = false;
140962306a36Sopenharmony_ci		break;
141062306a36Sopenharmony_ci	}
141162306a36Sopenharmony_ci
141262306a36Sopenharmony_ci	if (baco_reset)
141362306a36Sopenharmony_ci		return AMD_RESET_METHOD_BACO;
141462306a36Sopenharmony_ci	else
141562306a36Sopenharmony_ci		return AMD_RESET_METHOD_LEGACY;
141662306a36Sopenharmony_ci}
141762306a36Sopenharmony_ci
141862306a36Sopenharmony_ci/**
141962306a36Sopenharmony_ci * cik_asic_reset - soft reset GPU
142062306a36Sopenharmony_ci *
142162306a36Sopenharmony_ci * @adev: amdgpu_device pointer
142262306a36Sopenharmony_ci *
142362306a36Sopenharmony_ci * Look up which blocks are hung and attempt
142462306a36Sopenharmony_ci * to reset them.
142562306a36Sopenharmony_ci * Returns 0 for success.
142662306a36Sopenharmony_ci */
142762306a36Sopenharmony_cistatic int cik_asic_reset(struct amdgpu_device *adev)
142862306a36Sopenharmony_ci{
142962306a36Sopenharmony_ci	int r;
143062306a36Sopenharmony_ci
143162306a36Sopenharmony_ci	/* APUs don't have full asic reset */
143262306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
143362306a36Sopenharmony_ci		return 0;
143462306a36Sopenharmony_ci
143562306a36Sopenharmony_ci	if (cik_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {
143662306a36Sopenharmony_ci		dev_info(adev->dev, "BACO reset\n");
143762306a36Sopenharmony_ci		r = amdgpu_dpm_baco_reset(adev);
143862306a36Sopenharmony_ci	} else {
143962306a36Sopenharmony_ci		dev_info(adev->dev, "PCI CONFIG reset\n");
144062306a36Sopenharmony_ci		r = cik_asic_pci_config_reset(adev);
144162306a36Sopenharmony_ci	}
144262306a36Sopenharmony_ci
144362306a36Sopenharmony_ci	return r;
144462306a36Sopenharmony_ci}
144562306a36Sopenharmony_ci
144662306a36Sopenharmony_cistatic u32 cik_get_config_memsize(struct amdgpu_device *adev)
144762306a36Sopenharmony_ci{
144862306a36Sopenharmony_ci	return RREG32(mmCONFIG_MEMSIZE);
144962306a36Sopenharmony_ci}
145062306a36Sopenharmony_ci
145162306a36Sopenharmony_cistatic int cik_set_uvd_clock(struct amdgpu_device *adev, u32 clock,
145262306a36Sopenharmony_ci			      u32 cntl_reg, u32 status_reg)
145362306a36Sopenharmony_ci{
145462306a36Sopenharmony_ci	int r, i;
145562306a36Sopenharmony_ci	struct atom_clock_dividers dividers;
145662306a36Sopenharmony_ci	uint32_t tmp;
145762306a36Sopenharmony_ci
145862306a36Sopenharmony_ci	r = amdgpu_atombios_get_clock_dividers(adev,
145962306a36Sopenharmony_ci					       COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
146062306a36Sopenharmony_ci					       clock, false, &dividers);
146162306a36Sopenharmony_ci	if (r)
146262306a36Sopenharmony_ci		return r;
146362306a36Sopenharmony_ci
146462306a36Sopenharmony_ci	tmp = RREG32_SMC(cntl_reg);
146562306a36Sopenharmony_ci	tmp &= ~(CG_DCLK_CNTL__DCLK_DIR_CNTL_EN_MASK |
146662306a36Sopenharmony_ci		CG_DCLK_CNTL__DCLK_DIVIDER_MASK);
146762306a36Sopenharmony_ci	tmp |= dividers.post_divider;
146862306a36Sopenharmony_ci	WREG32_SMC(cntl_reg, tmp);
146962306a36Sopenharmony_ci
147062306a36Sopenharmony_ci	for (i = 0; i < 100; i++) {
147162306a36Sopenharmony_ci		if (RREG32_SMC(status_reg) & CG_DCLK_STATUS__DCLK_STATUS_MASK)
147262306a36Sopenharmony_ci			break;
147362306a36Sopenharmony_ci		mdelay(10);
147462306a36Sopenharmony_ci	}
147562306a36Sopenharmony_ci	if (i == 100)
147662306a36Sopenharmony_ci		return -ETIMEDOUT;
147762306a36Sopenharmony_ci
147862306a36Sopenharmony_ci	return 0;
147962306a36Sopenharmony_ci}
148062306a36Sopenharmony_ci
148162306a36Sopenharmony_cistatic int cik_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
148262306a36Sopenharmony_ci{
148362306a36Sopenharmony_ci	int r = 0;
148462306a36Sopenharmony_ci
148562306a36Sopenharmony_ci	r = cik_set_uvd_clock(adev, vclk, ixCG_VCLK_CNTL, ixCG_VCLK_STATUS);
148662306a36Sopenharmony_ci	if (r)
148762306a36Sopenharmony_ci		return r;
148862306a36Sopenharmony_ci
148962306a36Sopenharmony_ci	r = cik_set_uvd_clock(adev, dclk, ixCG_DCLK_CNTL, ixCG_DCLK_STATUS);
149062306a36Sopenharmony_ci	return r;
149162306a36Sopenharmony_ci}
149262306a36Sopenharmony_ci
149362306a36Sopenharmony_cistatic int cik_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
149462306a36Sopenharmony_ci{
149562306a36Sopenharmony_ci	int r, i;
149662306a36Sopenharmony_ci	struct atom_clock_dividers dividers;
149762306a36Sopenharmony_ci	u32 tmp;
149862306a36Sopenharmony_ci
149962306a36Sopenharmony_ci	r = amdgpu_atombios_get_clock_dividers(adev,
150062306a36Sopenharmony_ci					       COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
150162306a36Sopenharmony_ci					       ecclk, false, &dividers);
150262306a36Sopenharmony_ci	if (r)
150362306a36Sopenharmony_ci		return r;
150462306a36Sopenharmony_ci
150562306a36Sopenharmony_ci	for (i = 0; i < 100; i++) {
150662306a36Sopenharmony_ci		if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
150762306a36Sopenharmony_ci			break;
150862306a36Sopenharmony_ci		mdelay(10);
150962306a36Sopenharmony_ci	}
151062306a36Sopenharmony_ci	if (i == 100)
151162306a36Sopenharmony_ci		return -ETIMEDOUT;
151262306a36Sopenharmony_ci
151362306a36Sopenharmony_ci	tmp = RREG32_SMC(ixCG_ECLK_CNTL);
151462306a36Sopenharmony_ci	tmp &= ~(CG_ECLK_CNTL__ECLK_DIR_CNTL_EN_MASK |
151562306a36Sopenharmony_ci		CG_ECLK_CNTL__ECLK_DIVIDER_MASK);
151662306a36Sopenharmony_ci	tmp |= dividers.post_divider;
151762306a36Sopenharmony_ci	WREG32_SMC(ixCG_ECLK_CNTL, tmp);
151862306a36Sopenharmony_ci
151962306a36Sopenharmony_ci	for (i = 0; i < 100; i++) {
152062306a36Sopenharmony_ci		if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
152162306a36Sopenharmony_ci			break;
152262306a36Sopenharmony_ci		mdelay(10);
152362306a36Sopenharmony_ci	}
152462306a36Sopenharmony_ci	if (i == 100)
152562306a36Sopenharmony_ci		return -ETIMEDOUT;
152662306a36Sopenharmony_ci
152762306a36Sopenharmony_ci	return 0;
152862306a36Sopenharmony_ci}
152962306a36Sopenharmony_ci
153062306a36Sopenharmony_cistatic void cik_pcie_gen3_enable(struct amdgpu_device *adev)
153162306a36Sopenharmony_ci{
153262306a36Sopenharmony_ci	struct pci_dev *root = adev->pdev->bus->self;
153362306a36Sopenharmony_ci	u32 speed_cntl, current_data_rate;
153462306a36Sopenharmony_ci	int i;
153562306a36Sopenharmony_ci	u16 tmp16;
153662306a36Sopenharmony_ci
153762306a36Sopenharmony_ci	if (pci_is_root_bus(adev->pdev->bus))
153862306a36Sopenharmony_ci		return;
153962306a36Sopenharmony_ci
154062306a36Sopenharmony_ci	if (amdgpu_pcie_gen2 == 0)
154162306a36Sopenharmony_ci		return;
154262306a36Sopenharmony_ci
154362306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
154462306a36Sopenharmony_ci		return;
154562306a36Sopenharmony_ci
154662306a36Sopenharmony_ci	if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
154762306a36Sopenharmony_ci					CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
154862306a36Sopenharmony_ci		return;
154962306a36Sopenharmony_ci
155062306a36Sopenharmony_ci	speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
155162306a36Sopenharmony_ci	current_data_rate = (speed_cntl & PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK) >>
155262306a36Sopenharmony_ci		PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT;
155362306a36Sopenharmony_ci	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
155462306a36Sopenharmony_ci		if (current_data_rate == 2) {
155562306a36Sopenharmony_ci			DRM_INFO("PCIE gen 3 link speeds already enabled\n");
155662306a36Sopenharmony_ci			return;
155762306a36Sopenharmony_ci		}
155862306a36Sopenharmony_ci		DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
155962306a36Sopenharmony_ci	} else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
156062306a36Sopenharmony_ci		if (current_data_rate == 1) {
156162306a36Sopenharmony_ci			DRM_INFO("PCIE gen 2 link speeds already enabled\n");
156262306a36Sopenharmony_ci			return;
156362306a36Sopenharmony_ci		}
156462306a36Sopenharmony_ci		DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
156562306a36Sopenharmony_ci	}
156662306a36Sopenharmony_ci
156762306a36Sopenharmony_ci	if (!pci_is_pcie(root) || !pci_is_pcie(adev->pdev))
156862306a36Sopenharmony_ci		return;
156962306a36Sopenharmony_ci
157062306a36Sopenharmony_ci	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
157162306a36Sopenharmony_ci		/* re-try equalization if gen3 is not already enabled */
157262306a36Sopenharmony_ci		if (current_data_rate != 2) {
157362306a36Sopenharmony_ci			u16 bridge_cfg, gpu_cfg;
157462306a36Sopenharmony_ci			u16 bridge_cfg2, gpu_cfg2;
157562306a36Sopenharmony_ci			u32 max_lw, current_lw, tmp;
157662306a36Sopenharmony_ci
157762306a36Sopenharmony_ci			pcie_capability_set_word(root, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
157862306a36Sopenharmony_ci			pcie_capability_set_word(adev->pdev, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
157962306a36Sopenharmony_ci
158062306a36Sopenharmony_ci			tmp = RREG32_PCIE(ixPCIE_LC_STATUS1);
158162306a36Sopenharmony_ci			max_lw = (tmp & PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH_MASK) >>
158262306a36Sopenharmony_ci				PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH__SHIFT;
158362306a36Sopenharmony_ci			current_lw = (tmp & PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH_MASK)
158462306a36Sopenharmony_ci				>> PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH__SHIFT;
158562306a36Sopenharmony_ci
158662306a36Sopenharmony_ci			if (current_lw < max_lw) {
158762306a36Sopenharmony_ci				tmp = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
158862306a36Sopenharmony_ci				if (tmp & PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATION_SUPPORT_MASK) {
158962306a36Sopenharmony_ci					tmp &= ~(PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_MASK |
159062306a36Sopenharmony_ci						PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_DIS_MASK);
159162306a36Sopenharmony_ci					tmp |= (max_lw <<
159262306a36Sopenharmony_ci						PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH__SHIFT);
159362306a36Sopenharmony_ci					tmp |= PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_SUPPORT_MASK |
159462306a36Sopenharmony_ci					PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATE_EN_MASK |
159562306a36Sopenharmony_ci					PCIE_LC_LINK_WIDTH_CNTL__LC_RECONFIG_NOW_MASK;
159662306a36Sopenharmony_ci					WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, tmp);
159762306a36Sopenharmony_ci				}
159862306a36Sopenharmony_ci			}
159962306a36Sopenharmony_ci
160062306a36Sopenharmony_ci			for (i = 0; i < 10; i++) {
160162306a36Sopenharmony_ci				/* check status */
160262306a36Sopenharmony_ci				pcie_capability_read_word(adev->pdev,
160362306a36Sopenharmony_ci							  PCI_EXP_DEVSTA,
160462306a36Sopenharmony_ci							  &tmp16);
160562306a36Sopenharmony_ci				if (tmp16 & PCI_EXP_DEVSTA_TRPND)
160662306a36Sopenharmony_ci					break;
160762306a36Sopenharmony_ci
160862306a36Sopenharmony_ci				pcie_capability_read_word(root, PCI_EXP_LNKCTL,
160962306a36Sopenharmony_ci							  &bridge_cfg);
161062306a36Sopenharmony_ci				pcie_capability_read_word(adev->pdev,
161162306a36Sopenharmony_ci							  PCI_EXP_LNKCTL,
161262306a36Sopenharmony_ci							  &gpu_cfg);
161362306a36Sopenharmony_ci
161462306a36Sopenharmony_ci				pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
161562306a36Sopenharmony_ci							  &bridge_cfg2);
161662306a36Sopenharmony_ci				pcie_capability_read_word(adev->pdev,
161762306a36Sopenharmony_ci							  PCI_EXP_LNKCTL2,
161862306a36Sopenharmony_ci							  &gpu_cfg2);
161962306a36Sopenharmony_ci
162062306a36Sopenharmony_ci				tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
162162306a36Sopenharmony_ci				tmp |= PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
162262306a36Sopenharmony_ci				WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
162362306a36Sopenharmony_ci
162462306a36Sopenharmony_ci				tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
162562306a36Sopenharmony_ci				tmp |= PCIE_LC_CNTL4__LC_REDO_EQ_MASK;
162662306a36Sopenharmony_ci				WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
162762306a36Sopenharmony_ci
162862306a36Sopenharmony_ci				msleep(100);
162962306a36Sopenharmony_ci
163062306a36Sopenharmony_ci				/* linkctl */
163162306a36Sopenharmony_ci				pcie_capability_clear_and_set_word(root, PCI_EXP_LNKCTL,
163262306a36Sopenharmony_ci								   PCI_EXP_LNKCTL_HAWD,
163362306a36Sopenharmony_ci								   bridge_cfg &
163462306a36Sopenharmony_ci								   PCI_EXP_LNKCTL_HAWD);
163562306a36Sopenharmony_ci				pcie_capability_clear_and_set_word(adev->pdev, PCI_EXP_LNKCTL,
163662306a36Sopenharmony_ci								   PCI_EXP_LNKCTL_HAWD,
163762306a36Sopenharmony_ci								   gpu_cfg &
163862306a36Sopenharmony_ci								   PCI_EXP_LNKCTL_HAWD);
163962306a36Sopenharmony_ci
164062306a36Sopenharmony_ci				/* linkctl2 */
164162306a36Sopenharmony_ci				pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
164262306a36Sopenharmony_ci							  &tmp16);
164362306a36Sopenharmony_ci				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
164462306a36Sopenharmony_ci					   PCI_EXP_LNKCTL2_TX_MARGIN);
164562306a36Sopenharmony_ci				tmp16 |= (bridge_cfg2 &
164662306a36Sopenharmony_ci					  (PCI_EXP_LNKCTL2_ENTER_COMP |
164762306a36Sopenharmony_ci					   PCI_EXP_LNKCTL2_TX_MARGIN));
164862306a36Sopenharmony_ci				pcie_capability_write_word(root,
164962306a36Sopenharmony_ci							   PCI_EXP_LNKCTL2,
165062306a36Sopenharmony_ci							   tmp16);
165162306a36Sopenharmony_ci
165262306a36Sopenharmony_ci				pcie_capability_read_word(adev->pdev,
165362306a36Sopenharmony_ci							  PCI_EXP_LNKCTL2,
165462306a36Sopenharmony_ci							  &tmp16);
165562306a36Sopenharmony_ci				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
165662306a36Sopenharmony_ci					   PCI_EXP_LNKCTL2_TX_MARGIN);
165762306a36Sopenharmony_ci				tmp16 |= (gpu_cfg2 &
165862306a36Sopenharmony_ci					  (PCI_EXP_LNKCTL2_ENTER_COMP |
165962306a36Sopenharmony_ci					   PCI_EXP_LNKCTL2_TX_MARGIN));
166062306a36Sopenharmony_ci				pcie_capability_write_word(adev->pdev,
166162306a36Sopenharmony_ci							   PCI_EXP_LNKCTL2,
166262306a36Sopenharmony_ci							   tmp16);
166362306a36Sopenharmony_ci
166462306a36Sopenharmony_ci				tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
166562306a36Sopenharmony_ci				tmp &= ~PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
166662306a36Sopenharmony_ci				WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
166762306a36Sopenharmony_ci			}
166862306a36Sopenharmony_ci		}
166962306a36Sopenharmony_ci	}
167062306a36Sopenharmony_ci
167162306a36Sopenharmony_ci	/* set the link speed */
167262306a36Sopenharmony_ci	speed_cntl |= PCIE_LC_SPEED_CNTL__LC_FORCE_EN_SW_SPEED_CHANGE_MASK |
167362306a36Sopenharmony_ci		PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_HW_SPEED_CHANGE_MASK;
167462306a36Sopenharmony_ci	speed_cntl &= ~PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_SW_SPEED_CHANGE_MASK;
167562306a36Sopenharmony_ci	WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
167662306a36Sopenharmony_ci
167762306a36Sopenharmony_ci	pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL2, &tmp16);
167862306a36Sopenharmony_ci	tmp16 &= ~PCI_EXP_LNKCTL2_TLS;
167962306a36Sopenharmony_ci
168062306a36Sopenharmony_ci	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
168162306a36Sopenharmony_ci		tmp16 |= PCI_EXP_LNKCTL2_TLS_8_0GT; /* gen3 */
168262306a36Sopenharmony_ci	else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
168362306a36Sopenharmony_ci		tmp16 |= PCI_EXP_LNKCTL2_TLS_5_0GT; /* gen2 */
168462306a36Sopenharmony_ci	else
168562306a36Sopenharmony_ci		tmp16 |= PCI_EXP_LNKCTL2_TLS_2_5GT; /* gen1 */
168662306a36Sopenharmony_ci	pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL2, tmp16);
168762306a36Sopenharmony_ci
168862306a36Sopenharmony_ci	speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
168962306a36Sopenharmony_ci	speed_cntl |= PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK;
169062306a36Sopenharmony_ci	WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
169162306a36Sopenharmony_ci
169262306a36Sopenharmony_ci	for (i = 0; i < adev->usec_timeout; i++) {
169362306a36Sopenharmony_ci		speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
169462306a36Sopenharmony_ci		if ((speed_cntl & PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK) == 0)
169562306a36Sopenharmony_ci			break;
169662306a36Sopenharmony_ci		udelay(1);
169762306a36Sopenharmony_ci	}
169862306a36Sopenharmony_ci}
169962306a36Sopenharmony_ci
170062306a36Sopenharmony_cistatic void cik_program_aspm(struct amdgpu_device *adev)
170162306a36Sopenharmony_ci{
170262306a36Sopenharmony_ci	u32 data, orig;
170362306a36Sopenharmony_ci	bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
170462306a36Sopenharmony_ci	bool disable_clkreq = false;
170562306a36Sopenharmony_ci
170662306a36Sopenharmony_ci	if (!amdgpu_device_should_use_aspm(adev))
170762306a36Sopenharmony_ci		return;
170862306a36Sopenharmony_ci
170962306a36Sopenharmony_ci	if (pci_is_root_bus(adev->pdev->bus))
171062306a36Sopenharmony_ci		return;
171162306a36Sopenharmony_ci
171262306a36Sopenharmony_ci	/* XXX double check APUs */
171362306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
171462306a36Sopenharmony_ci		return;
171562306a36Sopenharmony_ci
171662306a36Sopenharmony_ci	orig = data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
171762306a36Sopenharmony_ci	data &= ~PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_MASK;
171862306a36Sopenharmony_ci	data |= (0x24 << PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS__SHIFT) |
171962306a36Sopenharmony_ci		PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_OVERRIDE_EN_MASK;
172062306a36Sopenharmony_ci	if (orig != data)
172162306a36Sopenharmony_ci		WREG32_PCIE(ixPCIE_LC_N_FTS_CNTL, data);
172262306a36Sopenharmony_ci
172362306a36Sopenharmony_ci	orig = data = RREG32_PCIE(ixPCIE_LC_CNTL3);
172462306a36Sopenharmony_ci	data |= PCIE_LC_CNTL3__LC_GO_TO_RECOVERY_MASK;
172562306a36Sopenharmony_ci	if (orig != data)
172662306a36Sopenharmony_ci		WREG32_PCIE(ixPCIE_LC_CNTL3, data);
172762306a36Sopenharmony_ci
172862306a36Sopenharmony_ci	orig = data = RREG32_PCIE(ixPCIE_P_CNTL);
172962306a36Sopenharmony_ci	data |= PCIE_P_CNTL__P_IGNORE_EDB_ERR_MASK;
173062306a36Sopenharmony_ci	if (orig != data)
173162306a36Sopenharmony_ci		WREG32_PCIE(ixPCIE_P_CNTL, data);
173262306a36Sopenharmony_ci
173362306a36Sopenharmony_ci	orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
173462306a36Sopenharmony_ci	data &= ~(PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK |
173562306a36Sopenharmony_ci		PCIE_LC_CNTL__LC_L1_INACTIVITY_MASK);
173662306a36Sopenharmony_ci	data |= PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
173762306a36Sopenharmony_ci	if (!disable_l0s)
173862306a36Sopenharmony_ci		data |= (7 << PCIE_LC_CNTL__LC_L0S_INACTIVITY__SHIFT);
173962306a36Sopenharmony_ci
174062306a36Sopenharmony_ci	if (!disable_l1) {
174162306a36Sopenharmony_ci		data |= (7 << PCIE_LC_CNTL__LC_L1_INACTIVITY__SHIFT);
174262306a36Sopenharmony_ci		data &= ~PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
174362306a36Sopenharmony_ci		if (orig != data)
174462306a36Sopenharmony_ci			WREG32_PCIE(ixPCIE_LC_CNTL, data);
174562306a36Sopenharmony_ci
174662306a36Sopenharmony_ci		if (!disable_plloff_in_l1) {
174762306a36Sopenharmony_ci			bool clk_req_support;
174862306a36Sopenharmony_ci
174962306a36Sopenharmony_ci			orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_0);
175062306a36Sopenharmony_ci			data &= ~(PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
175162306a36Sopenharmony_ci				PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
175262306a36Sopenharmony_ci			data |= (7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
175362306a36Sopenharmony_ci				(7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
175462306a36Sopenharmony_ci			if (orig != data)
175562306a36Sopenharmony_ci				WREG32_PCIE(ixPB0_PIF_PWRDOWN_0, data);
175662306a36Sopenharmony_ci
175762306a36Sopenharmony_ci			orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_1);
175862306a36Sopenharmony_ci			data &= ~(PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
175962306a36Sopenharmony_ci				PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
176062306a36Sopenharmony_ci			data |= (7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
176162306a36Sopenharmony_ci				(7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
176262306a36Sopenharmony_ci			if (orig != data)
176362306a36Sopenharmony_ci				WREG32_PCIE(ixPB0_PIF_PWRDOWN_1, data);
176462306a36Sopenharmony_ci
176562306a36Sopenharmony_ci			orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_0);
176662306a36Sopenharmony_ci			data &= ~(PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
176762306a36Sopenharmony_ci				PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
176862306a36Sopenharmony_ci			data |= (7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
176962306a36Sopenharmony_ci				(7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
177062306a36Sopenharmony_ci			if (orig != data)
177162306a36Sopenharmony_ci				WREG32_PCIE(ixPB1_PIF_PWRDOWN_0, data);
177262306a36Sopenharmony_ci
177362306a36Sopenharmony_ci			orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_1);
177462306a36Sopenharmony_ci			data &= ~(PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
177562306a36Sopenharmony_ci				PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
177662306a36Sopenharmony_ci			data |= (7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
177762306a36Sopenharmony_ci				(7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
177862306a36Sopenharmony_ci			if (orig != data)
177962306a36Sopenharmony_ci				WREG32_PCIE(ixPB1_PIF_PWRDOWN_1, data);
178062306a36Sopenharmony_ci
178162306a36Sopenharmony_ci			orig = data = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
178262306a36Sopenharmony_ci			data &= ~PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE_MASK;
178362306a36Sopenharmony_ci			data |= ~(3 << PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE__SHIFT);
178462306a36Sopenharmony_ci			if (orig != data)
178562306a36Sopenharmony_ci				WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, data);
178662306a36Sopenharmony_ci
178762306a36Sopenharmony_ci			if (!disable_clkreq) {
178862306a36Sopenharmony_ci				struct pci_dev *root = adev->pdev->bus->self;
178962306a36Sopenharmony_ci				u32 lnkcap;
179062306a36Sopenharmony_ci
179162306a36Sopenharmony_ci				clk_req_support = false;
179262306a36Sopenharmony_ci				pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
179362306a36Sopenharmony_ci				if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
179462306a36Sopenharmony_ci					clk_req_support = true;
179562306a36Sopenharmony_ci			} else {
179662306a36Sopenharmony_ci				clk_req_support = false;
179762306a36Sopenharmony_ci			}
179862306a36Sopenharmony_ci
179962306a36Sopenharmony_ci			if (clk_req_support) {
180062306a36Sopenharmony_ci				orig = data = RREG32_PCIE(ixPCIE_LC_CNTL2);
180162306a36Sopenharmony_ci				data |= PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L1_MASK |
180262306a36Sopenharmony_ci					PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L23_MASK;
180362306a36Sopenharmony_ci				if (orig != data)
180462306a36Sopenharmony_ci					WREG32_PCIE(ixPCIE_LC_CNTL2, data);
180562306a36Sopenharmony_ci
180662306a36Sopenharmony_ci				orig = data = RREG32_SMC(ixTHM_CLK_CNTL);
180762306a36Sopenharmony_ci				data &= ~(THM_CLK_CNTL__CMON_CLK_SEL_MASK |
180862306a36Sopenharmony_ci					THM_CLK_CNTL__TMON_CLK_SEL_MASK);
180962306a36Sopenharmony_ci				data |= (1 << THM_CLK_CNTL__CMON_CLK_SEL__SHIFT) |
181062306a36Sopenharmony_ci					(1 << THM_CLK_CNTL__TMON_CLK_SEL__SHIFT);
181162306a36Sopenharmony_ci				if (orig != data)
181262306a36Sopenharmony_ci					WREG32_SMC(ixTHM_CLK_CNTL, data);
181362306a36Sopenharmony_ci
181462306a36Sopenharmony_ci				orig = data = RREG32_SMC(ixMISC_CLK_CTRL);
181562306a36Sopenharmony_ci				data &= ~(MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL_MASK |
181662306a36Sopenharmony_ci					MISC_CLK_CTRL__ZCLK_SEL_MASK);
181762306a36Sopenharmony_ci				data |= (1 << MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL__SHIFT) |
181862306a36Sopenharmony_ci					(1 << MISC_CLK_CTRL__ZCLK_SEL__SHIFT);
181962306a36Sopenharmony_ci				if (orig != data)
182062306a36Sopenharmony_ci					WREG32_SMC(ixMISC_CLK_CTRL, data);
182162306a36Sopenharmony_ci
182262306a36Sopenharmony_ci				orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL);
182362306a36Sopenharmony_ci				data &= ~CG_CLKPIN_CNTL__BCLK_AS_XCLK_MASK;
182462306a36Sopenharmony_ci				if (orig != data)
182562306a36Sopenharmony_ci					WREG32_SMC(ixCG_CLKPIN_CNTL, data);
182662306a36Sopenharmony_ci
182762306a36Sopenharmony_ci				orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL_2);
182862306a36Sopenharmony_ci				data &= ~CG_CLKPIN_CNTL_2__FORCE_BIF_REFCLK_EN_MASK;
182962306a36Sopenharmony_ci				if (orig != data)
183062306a36Sopenharmony_ci					WREG32_SMC(ixCG_CLKPIN_CNTL_2, data);
183162306a36Sopenharmony_ci
183262306a36Sopenharmony_ci				orig = data = RREG32_SMC(ixMPLL_BYPASSCLK_SEL);
183362306a36Sopenharmony_ci				data &= ~MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL_MASK;
183462306a36Sopenharmony_ci				data |= (4 << MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL__SHIFT);
183562306a36Sopenharmony_ci				if (orig != data)
183662306a36Sopenharmony_ci					WREG32_SMC(ixMPLL_BYPASSCLK_SEL, data);
183762306a36Sopenharmony_ci			}
183862306a36Sopenharmony_ci		}
183962306a36Sopenharmony_ci	} else {
184062306a36Sopenharmony_ci		if (orig != data)
184162306a36Sopenharmony_ci			WREG32_PCIE(ixPCIE_LC_CNTL, data);
184262306a36Sopenharmony_ci	}
184362306a36Sopenharmony_ci
184462306a36Sopenharmony_ci	orig = data = RREG32_PCIE(ixPCIE_CNTL2);
184562306a36Sopenharmony_ci	data |= PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
184662306a36Sopenharmony_ci		PCIE_CNTL2__MST_MEM_LS_EN_MASK |
184762306a36Sopenharmony_ci		PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK;
184862306a36Sopenharmony_ci	if (orig != data)
184962306a36Sopenharmony_ci		WREG32_PCIE(ixPCIE_CNTL2, data);
185062306a36Sopenharmony_ci
185162306a36Sopenharmony_ci	if (!disable_l0s) {
185262306a36Sopenharmony_ci		data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
185362306a36Sopenharmony_ci		if ((data & PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) ==
185462306a36Sopenharmony_ci				PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) {
185562306a36Sopenharmony_ci			data = RREG32_PCIE(ixPCIE_LC_STATUS1);
185662306a36Sopenharmony_ci			if ((data & PCIE_LC_STATUS1__LC_REVERSE_XMIT_MASK) &&
185762306a36Sopenharmony_ci			(data & PCIE_LC_STATUS1__LC_REVERSE_RCVR_MASK)) {
185862306a36Sopenharmony_ci				orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
185962306a36Sopenharmony_ci				data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK;
186062306a36Sopenharmony_ci				if (orig != data)
186162306a36Sopenharmony_ci					WREG32_PCIE(ixPCIE_LC_CNTL, data);
186262306a36Sopenharmony_ci			}
186362306a36Sopenharmony_ci		}
186462306a36Sopenharmony_ci	}
186562306a36Sopenharmony_ci}
186662306a36Sopenharmony_ci
186762306a36Sopenharmony_cistatic uint32_t cik_get_rev_id(struct amdgpu_device *adev)
186862306a36Sopenharmony_ci{
186962306a36Sopenharmony_ci	return (RREG32(mmCC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
187062306a36Sopenharmony_ci		>> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
187162306a36Sopenharmony_ci}
187262306a36Sopenharmony_ci
187362306a36Sopenharmony_cistatic void cik_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
187462306a36Sopenharmony_ci{
187562306a36Sopenharmony_ci	if (!ring || !ring->funcs->emit_wreg) {
187662306a36Sopenharmony_ci		WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
187762306a36Sopenharmony_ci		RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
187862306a36Sopenharmony_ci	} else {
187962306a36Sopenharmony_ci		amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
188062306a36Sopenharmony_ci	}
188162306a36Sopenharmony_ci}
188262306a36Sopenharmony_ci
188362306a36Sopenharmony_cistatic void cik_invalidate_hdp(struct amdgpu_device *adev,
188462306a36Sopenharmony_ci			       struct amdgpu_ring *ring)
188562306a36Sopenharmony_ci{
188662306a36Sopenharmony_ci	if (!ring || !ring->funcs->emit_wreg) {
188762306a36Sopenharmony_ci		WREG32(mmHDP_DEBUG0, 1);
188862306a36Sopenharmony_ci		RREG32(mmHDP_DEBUG0);
188962306a36Sopenharmony_ci	} else {
189062306a36Sopenharmony_ci		amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
189162306a36Sopenharmony_ci	}
189262306a36Sopenharmony_ci}
189362306a36Sopenharmony_ci
189462306a36Sopenharmony_cistatic bool cik_need_full_reset(struct amdgpu_device *adev)
189562306a36Sopenharmony_ci{
189662306a36Sopenharmony_ci	/* change this when we support soft reset */
189762306a36Sopenharmony_ci	return true;
189862306a36Sopenharmony_ci}
189962306a36Sopenharmony_ci
190062306a36Sopenharmony_cistatic void cik_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
190162306a36Sopenharmony_ci			       uint64_t *count1)
190262306a36Sopenharmony_ci{
190362306a36Sopenharmony_ci	uint32_t perfctr = 0;
190462306a36Sopenharmony_ci	uint64_t cnt0_of, cnt1_of;
190562306a36Sopenharmony_ci	int tmp;
190662306a36Sopenharmony_ci
190762306a36Sopenharmony_ci	/* This reports 0 on APUs, so return to avoid writing/reading registers
190862306a36Sopenharmony_ci	 * that may or may not be different from their GPU counterparts
190962306a36Sopenharmony_ci	 */
191062306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
191162306a36Sopenharmony_ci		return;
191262306a36Sopenharmony_ci
191362306a36Sopenharmony_ci	/* Set the 2 events that we wish to watch, defined above */
191462306a36Sopenharmony_ci	/* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
191562306a36Sopenharmony_ci	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
191662306a36Sopenharmony_ci	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
191762306a36Sopenharmony_ci
191862306a36Sopenharmony_ci	/* Write to enable desired perf counters */
191962306a36Sopenharmony_ci	WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
192062306a36Sopenharmony_ci	/* Zero out and enable the perf counters
192162306a36Sopenharmony_ci	 * Write 0x5:
192262306a36Sopenharmony_ci	 * Bit 0 = Start all counters(1)
192362306a36Sopenharmony_ci	 * Bit 2 = Global counter reset enable(1)
192462306a36Sopenharmony_ci	 */
192562306a36Sopenharmony_ci	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
192662306a36Sopenharmony_ci
192762306a36Sopenharmony_ci	msleep(1000);
192862306a36Sopenharmony_ci
192962306a36Sopenharmony_ci	/* Load the shadow and disable the perf counters
193062306a36Sopenharmony_ci	 * Write 0x2:
193162306a36Sopenharmony_ci	 * Bit 0 = Stop counters(0)
193262306a36Sopenharmony_ci	 * Bit 1 = Load the shadow counters(1)
193362306a36Sopenharmony_ci	 */
193462306a36Sopenharmony_ci	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
193562306a36Sopenharmony_ci
193662306a36Sopenharmony_ci	/* Read register values to get any >32bit overflow */
193762306a36Sopenharmony_ci	tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
193862306a36Sopenharmony_ci	cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
193962306a36Sopenharmony_ci	cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
194062306a36Sopenharmony_ci
194162306a36Sopenharmony_ci	/* Get the values and add the overflow */
194262306a36Sopenharmony_ci	*count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
194362306a36Sopenharmony_ci	*count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
194462306a36Sopenharmony_ci}
194562306a36Sopenharmony_ci
194662306a36Sopenharmony_cistatic bool cik_need_reset_on_init(struct amdgpu_device *adev)
194762306a36Sopenharmony_ci{
194862306a36Sopenharmony_ci	u32 clock_cntl, pc;
194962306a36Sopenharmony_ci
195062306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
195162306a36Sopenharmony_ci		return false;
195262306a36Sopenharmony_ci
195362306a36Sopenharmony_ci	/* check if the SMC is already running */
195462306a36Sopenharmony_ci	clock_cntl = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
195562306a36Sopenharmony_ci	pc = RREG32_SMC(ixSMC_PC_C);
195662306a36Sopenharmony_ci	if ((0 == REG_GET_FIELD(clock_cntl, SMC_SYSCON_CLOCK_CNTL_0, ck_disable)) &&
195762306a36Sopenharmony_ci	    (0x20100 <= pc))
195862306a36Sopenharmony_ci		return true;
195962306a36Sopenharmony_ci
196062306a36Sopenharmony_ci	return false;
196162306a36Sopenharmony_ci}
196262306a36Sopenharmony_ci
196362306a36Sopenharmony_cistatic uint64_t cik_get_pcie_replay_count(struct amdgpu_device *adev)
196462306a36Sopenharmony_ci{
196562306a36Sopenharmony_ci	uint64_t nak_r, nak_g;
196662306a36Sopenharmony_ci
196762306a36Sopenharmony_ci	/* Get the number of NAKs received and generated */
196862306a36Sopenharmony_ci	nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
196962306a36Sopenharmony_ci	nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
197062306a36Sopenharmony_ci
197162306a36Sopenharmony_ci	/* Add the total number of NAKs, i.e the number of replays */
197262306a36Sopenharmony_ci	return (nak_r + nak_g);
197362306a36Sopenharmony_ci}
197462306a36Sopenharmony_ci
197562306a36Sopenharmony_cistatic void cik_pre_asic_init(struct amdgpu_device *adev)
197662306a36Sopenharmony_ci{
197762306a36Sopenharmony_ci}
197862306a36Sopenharmony_ci
197962306a36Sopenharmony_cistatic const struct amdgpu_asic_funcs cik_asic_funcs =
198062306a36Sopenharmony_ci{
198162306a36Sopenharmony_ci	.read_disabled_bios = &cik_read_disabled_bios,
198262306a36Sopenharmony_ci	.read_bios_from_rom = &cik_read_bios_from_rom,
198362306a36Sopenharmony_ci	.read_register = &cik_read_register,
198462306a36Sopenharmony_ci	.reset = &cik_asic_reset,
198562306a36Sopenharmony_ci	.reset_method = &cik_asic_reset_method,
198662306a36Sopenharmony_ci	.set_vga_state = &cik_vga_set_state,
198762306a36Sopenharmony_ci	.get_xclk = &cik_get_xclk,
198862306a36Sopenharmony_ci	.set_uvd_clocks = &cik_set_uvd_clocks,
198962306a36Sopenharmony_ci	.set_vce_clocks = &cik_set_vce_clocks,
199062306a36Sopenharmony_ci	.get_config_memsize = &cik_get_config_memsize,
199162306a36Sopenharmony_ci	.flush_hdp = &cik_flush_hdp,
199262306a36Sopenharmony_ci	.invalidate_hdp = &cik_invalidate_hdp,
199362306a36Sopenharmony_ci	.need_full_reset = &cik_need_full_reset,
199462306a36Sopenharmony_ci	.init_doorbell_index = &legacy_doorbell_index_init,
199562306a36Sopenharmony_ci	.get_pcie_usage = &cik_get_pcie_usage,
199662306a36Sopenharmony_ci	.need_reset_on_init = &cik_need_reset_on_init,
199762306a36Sopenharmony_ci	.get_pcie_replay_count = &cik_get_pcie_replay_count,
199862306a36Sopenharmony_ci	.supports_baco = &cik_asic_supports_baco,
199962306a36Sopenharmony_ci	.pre_asic_init = &cik_pre_asic_init,
200062306a36Sopenharmony_ci	.query_video_codecs = &cik_query_video_codecs,
200162306a36Sopenharmony_ci};
200262306a36Sopenharmony_ci
200362306a36Sopenharmony_cistatic int cik_common_early_init(void *handle)
200462306a36Sopenharmony_ci{
200562306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
200662306a36Sopenharmony_ci
200762306a36Sopenharmony_ci	adev->smc_rreg = &cik_smc_rreg;
200862306a36Sopenharmony_ci	adev->smc_wreg = &cik_smc_wreg;
200962306a36Sopenharmony_ci	adev->pcie_rreg = &cik_pcie_rreg;
201062306a36Sopenharmony_ci	adev->pcie_wreg = &cik_pcie_wreg;
201162306a36Sopenharmony_ci	adev->uvd_ctx_rreg = &cik_uvd_ctx_rreg;
201262306a36Sopenharmony_ci	adev->uvd_ctx_wreg = &cik_uvd_ctx_wreg;
201362306a36Sopenharmony_ci	adev->didt_rreg = &cik_didt_rreg;
201462306a36Sopenharmony_ci	adev->didt_wreg = &cik_didt_wreg;
201562306a36Sopenharmony_ci
201662306a36Sopenharmony_ci	adev->asic_funcs = &cik_asic_funcs;
201762306a36Sopenharmony_ci
201862306a36Sopenharmony_ci	adev->rev_id = cik_get_rev_id(adev);
201962306a36Sopenharmony_ci	adev->external_rev_id = 0xFF;
202062306a36Sopenharmony_ci	switch (adev->asic_type) {
202162306a36Sopenharmony_ci	case CHIP_BONAIRE:
202262306a36Sopenharmony_ci		adev->cg_flags =
202362306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGCG |
202462306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGLS |
202562306a36Sopenharmony_ci			/*AMD_CG_SUPPORT_GFX_CGCG |*/
202662306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
202762306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS |
202862306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS_LS |
202962306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
203062306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
203162306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
203262306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
203362306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
203462306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
203562306a36Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG |
203662306a36Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
203762306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
203862306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG;
203962306a36Sopenharmony_ci		adev->pg_flags = 0;
204062306a36Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 0x14;
204162306a36Sopenharmony_ci		break;
204262306a36Sopenharmony_ci	case CHIP_HAWAII:
204362306a36Sopenharmony_ci		adev->cg_flags =
204462306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGCG |
204562306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGLS |
204662306a36Sopenharmony_ci			/*AMD_CG_SUPPORT_GFX_CGCG |*/
204762306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
204862306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS |
204962306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
205062306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
205162306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
205262306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
205362306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
205462306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
205562306a36Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG |
205662306a36Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
205762306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
205862306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG;
205962306a36Sopenharmony_ci		adev->pg_flags = 0;
206062306a36Sopenharmony_ci		adev->external_rev_id = 0x28;
206162306a36Sopenharmony_ci		break;
206262306a36Sopenharmony_ci	case CHIP_KAVERI:
206362306a36Sopenharmony_ci		adev->cg_flags =
206462306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGCG |
206562306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGLS |
206662306a36Sopenharmony_ci			/*AMD_CG_SUPPORT_GFX_CGCG |*/
206762306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
206862306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS |
206962306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS_LS |
207062306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
207162306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
207262306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
207362306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
207462306a36Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG |
207562306a36Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
207662306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
207762306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG;
207862306a36Sopenharmony_ci		adev->pg_flags =
207962306a36Sopenharmony_ci			/*AMD_PG_SUPPORT_GFX_PG |
208062306a36Sopenharmony_ci			  AMD_PG_SUPPORT_GFX_SMG |
208162306a36Sopenharmony_ci			  AMD_PG_SUPPORT_GFX_DMG |*/
208262306a36Sopenharmony_ci			AMD_PG_SUPPORT_UVD |
208362306a36Sopenharmony_ci			AMD_PG_SUPPORT_VCE |
208462306a36Sopenharmony_ci			/*  AMD_PG_SUPPORT_CP |
208562306a36Sopenharmony_ci			  AMD_PG_SUPPORT_GDS |
208662306a36Sopenharmony_ci			  AMD_PG_SUPPORT_RLC_SMU_HS |
208762306a36Sopenharmony_ci			  AMD_PG_SUPPORT_ACP |
208862306a36Sopenharmony_ci			  AMD_PG_SUPPORT_SAMU |*/
208962306a36Sopenharmony_ci			0;
209062306a36Sopenharmony_ci		if (adev->pdev->device == 0x1312 ||
209162306a36Sopenharmony_ci			adev->pdev->device == 0x1316 ||
209262306a36Sopenharmony_ci			adev->pdev->device == 0x1317)
209362306a36Sopenharmony_ci			adev->external_rev_id = 0x41;
209462306a36Sopenharmony_ci		else
209562306a36Sopenharmony_ci			adev->external_rev_id = 0x1;
209662306a36Sopenharmony_ci		break;
209762306a36Sopenharmony_ci	case CHIP_KABINI:
209862306a36Sopenharmony_ci	case CHIP_MULLINS:
209962306a36Sopenharmony_ci		adev->cg_flags =
210062306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGCG |
210162306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGLS |
210262306a36Sopenharmony_ci			/*AMD_CG_SUPPORT_GFX_CGCG |*/
210362306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
210462306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS |
210562306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS_LS |
210662306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
210762306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
210862306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
210962306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
211062306a36Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG |
211162306a36Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
211262306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
211362306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG;
211462306a36Sopenharmony_ci		adev->pg_flags =
211562306a36Sopenharmony_ci			/*AMD_PG_SUPPORT_GFX_PG |
211662306a36Sopenharmony_ci			  AMD_PG_SUPPORT_GFX_SMG | */
211762306a36Sopenharmony_ci			AMD_PG_SUPPORT_UVD |
211862306a36Sopenharmony_ci			/*AMD_PG_SUPPORT_VCE |
211962306a36Sopenharmony_ci			  AMD_PG_SUPPORT_CP |
212062306a36Sopenharmony_ci			  AMD_PG_SUPPORT_GDS |
212162306a36Sopenharmony_ci			  AMD_PG_SUPPORT_RLC_SMU_HS |
212262306a36Sopenharmony_ci			  AMD_PG_SUPPORT_SAMU |*/
212362306a36Sopenharmony_ci			0;
212462306a36Sopenharmony_ci		if (adev->asic_type == CHIP_KABINI) {
212562306a36Sopenharmony_ci			if (adev->rev_id == 0)
212662306a36Sopenharmony_ci				adev->external_rev_id = 0x81;
212762306a36Sopenharmony_ci			else if (adev->rev_id == 1)
212862306a36Sopenharmony_ci				adev->external_rev_id = 0x82;
212962306a36Sopenharmony_ci			else if (adev->rev_id == 2)
213062306a36Sopenharmony_ci				adev->external_rev_id = 0x85;
213162306a36Sopenharmony_ci		} else
213262306a36Sopenharmony_ci			adev->external_rev_id = adev->rev_id + 0xa1;
213362306a36Sopenharmony_ci		break;
213462306a36Sopenharmony_ci	default:
213562306a36Sopenharmony_ci		/* FIXME: not supported yet */
213662306a36Sopenharmony_ci		return -EINVAL;
213762306a36Sopenharmony_ci	}
213862306a36Sopenharmony_ci
213962306a36Sopenharmony_ci	return 0;
214062306a36Sopenharmony_ci}
214162306a36Sopenharmony_ci
214262306a36Sopenharmony_cistatic int cik_common_sw_init(void *handle)
214362306a36Sopenharmony_ci{
214462306a36Sopenharmony_ci	return 0;
214562306a36Sopenharmony_ci}
214662306a36Sopenharmony_ci
214762306a36Sopenharmony_cistatic int cik_common_sw_fini(void *handle)
214862306a36Sopenharmony_ci{
214962306a36Sopenharmony_ci	return 0;
215062306a36Sopenharmony_ci}
215162306a36Sopenharmony_ci
215262306a36Sopenharmony_cistatic int cik_common_hw_init(void *handle)
215362306a36Sopenharmony_ci{
215462306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
215562306a36Sopenharmony_ci
215662306a36Sopenharmony_ci	/* move the golden regs per IP block */
215762306a36Sopenharmony_ci	cik_init_golden_registers(adev);
215862306a36Sopenharmony_ci	/* enable pcie gen2/3 link */
215962306a36Sopenharmony_ci	cik_pcie_gen3_enable(adev);
216062306a36Sopenharmony_ci	/* enable aspm */
216162306a36Sopenharmony_ci	cik_program_aspm(adev);
216262306a36Sopenharmony_ci
216362306a36Sopenharmony_ci	return 0;
216462306a36Sopenharmony_ci}
216562306a36Sopenharmony_ci
216662306a36Sopenharmony_cistatic int cik_common_hw_fini(void *handle)
216762306a36Sopenharmony_ci{
216862306a36Sopenharmony_ci	return 0;
216962306a36Sopenharmony_ci}
217062306a36Sopenharmony_ci
217162306a36Sopenharmony_cistatic int cik_common_suspend(void *handle)
217262306a36Sopenharmony_ci{
217362306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
217462306a36Sopenharmony_ci
217562306a36Sopenharmony_ci	return cik_common_hw_fini(adev);
217662306a36Sopenharmony_ci}
217762306a36Sopenharmony_ci
217862306a36Sopenharmony_cistatic int cik_common_resume(void *handle)
217962306a36Sopenharmony_ci{
218062306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
218162306a36Sopenharmony_ci
218262306a36Sopenharmony_ci	return cik_common_hw_init(adev);
218362306a36Sopenharmony_ci}
218462306a36Sopenharmony_ci
218562306a36Sopenharmony_cistatic bool cik_common_is_idle(void *handle)
218662306a36Sopenharmony_ci{
218762306a36Sopenharmony_ci	return true;
218862306a36Sopenharmony_ci}
218962306a36Sopenharmony_ci
219062306a36Sopenharmony_cistatic int cik_common_wait_for_idle(void *handle)
219162306a36Sopenharmony_ci{
219262306a36Sopenharmony_ci	return 0;
219362306a36Sopenharmony_ci}
219462306a36Sopenharmony_ci
219562306a36Sopenharmony_cistatic int cik_common_soft_reset(void *handle)
219662306a36Sopenharmony_ci{
219762306a36Sopenharmony_ci	/* XXX hard reset?? */
219862306a36Sopenharmony_ci	return 0;
219962306a36Sopenharmony_ci}
220062306a36Sopenharmony_ci
220162306a36Sopenharmony_cistatic int cik_common_set_clockgating_state(void *handle,
220262306a36Sopenharmony_ci					    enum amd_clockgating_state state)
220362306a36Sopenharmony_ci{
220462306a36Sopenharmony_ci	return 0;
220562306a36Sopenharmony_ci}
220662306a36Sopenharmony_ci
220762306a36Sopenharmony_cistatic int cik_common_set_powergating_state(void *handle,
220862306a36Sopenharmony_ci					    enum amd_powergating_state state)
220962306a36Sopenharmony_ci{
221062306a36Sopenharmony_ci	return 0;
221162306a36Sopenharmony_ci}
221262306a36Sopenharmony_ci
221362306a36Sopenharmony_cistatic const struct amd_ip_funcs cik_common_ip_funcs = {
221462306a36Sopenharmony_ci	.name = "cik_common",
221562306a36Sopenharmony_ci	.early_init = cik_common_early_init,
221662306a36Sopenharmony_ci	.late_init = NULL,
221762306a36Sopenharmony_ci	.sw_init = cik_common_sw_init,
221862306a36Sopenharmony_ci	.sw_fini = cik_common_sw_fini,
221962306a36Sopenharmony_ci	.hw_init = cik_common_hw_init,
222062306a36Sopenharmony_ci	.hw_fini = cik_common_hw_fini,
222162306a36Sopenharmony_ci	.suspend = cik_common_suspend,
222262306a36Sopenharmony_ci	.resume = cik_common_resume,
222362306a36Sopenharmony_ci	.is_idle = cik_common_is_idle,
222462306a36Sopenharmony_ci	.wait_for_idle = cik_common_wait_for_idle,
222562306a36Sopenharmony_ci	.soft_reset = cik_common_soft_reset,
222662306a36Sopenharmony_ci	.set_clockgating_state = cik_common_set_clockgating_state,
222762306a36Sopenharmony_ci	.set_powergating_state = cik_common_set_powergating_state,
222862306a36Sopenharmony_ci};
222962306a36Sopenharmony_ci
223062306a36Sopenharmony_cistatic const struct amdgpu_ip_block_version cik_common_ip_block =
223162306a36Sopenharmony_ci{
223262306a36Sopenharmony_ci	.type = AMD_IP_BLOCK_TYPE_COMMON,
223362306a36Sopenharmony_ci	.major = 1,
223462306a36Sopenharmony_ci	.minor = 0,
223562306a36Sopenharmony_ci	.rev = 0,
223662306a36Sopenharmony_ci	.funcs = &cik_common_ip_funcs,
223762306a36Sopenharmony_ci};
223862306a36Sopenharmony_ci
223962306a36Sopenharmony_ciint cik_set_ip_blocks(struct amdgpu_device *adev)
224062306a36Sopenharmony_ci{
224162306a36Sopenharmony_ci	switch (adev->asic_type) {
224262306a36Sopenharmony_ci	case CHIP_BONAIRE:
224362306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
224462306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
224562306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
224662306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
224762306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
224862306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
224962306a36Sopenharmony_ci		if (adev->enable_virtual_display)
225062306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
225162306a36Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC)
225262306a36Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
225362306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
225462306a36Sopenharmony_ci#endif
225562306a36Sopenharmony_ci		else
225662306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v8_2_ip_block);
225762306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
225862306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
225962306a36Sopenharmony_ci		break;
226062306a36Sopenharmony_ci	case CHIP_HAWAII:
226162306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
226262306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
226362306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
226462306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v7_3_ip_block);
226562306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
226662306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
226762306a36Sopenharmony_ci		if (adev->enable_virtual_display)
226862306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
226962306a36Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC)
227062306a36Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
227162306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
227262306a36Sopenharmony_ci#endif
227362306a36Sopenharmony_ci		else
227462306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v8_5_ip_block);
227562306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
227662306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
227762306a36Sopenharmony_ci		break;
227862306a36Sopenharmony_ci	case CHIP_KAVERI:
227962306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
228062306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
228162306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
228262306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v7_1_ip_block);
228362306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
228462306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
228562306a36Sopenharmony_ci		if (adev->enable_virtual_display)
228662306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
228762306a36Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC)
228862306a36Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
228962306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
229062306a36Sopenharmony_ci#endif
229162306a36Sopenharmony_ci		else
229262306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v8_1_ip_block);
229362306a36Sopenharmony_ci
229462306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
229562306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
229662306a36Sopenharmony_ci		break;
229762306a36Sopenharmony_ci	case CHIP_KABINI:
229862306a36Sopenharmony_ci	case CHIP_MULLINS:
229962306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
230062306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
230162306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
230262306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
230362306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
230462306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
230562306a36Sopenharmony_ci		if (adev->enable_virtual_display)
230662306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
230762306a36Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC)
230862306a36Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
230962306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
231062306a36Sopenharmony_ci#endif
231162306a36Sopenharmony_ci		else
231262306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v8_3_ip_block);
231362306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
231462306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
231562306a36Sopenharmony_ci		break;
231662306a36Sopenharmony_ci	default:
231762306a36Sopenharmony_ci		/* FIXME: not supported yet */
231862306a36Sopenharmony_ci		return -EINVAL;
231962306a36Sopenharmony_ci	}
232062306a36Sopenharmony_ci	return 0;
232162306a36Sopenharmony_ci}
2322