xref: /linux-6.15/drivers/gpu/drm/amd/amdgpu/cik.c (revision 7dc34054)
1a2e73f56SAlex Deucher /*
2a2e73f56SAlex Deucher  * Copyright 2012 Advanced Micro Devices, Inc.
3a2e73f56SAlex Deucher  *
4a2e73f56SAlex Deucher  * Permission is hereby granted, free of charge, to any person obtaining a
5a2e73f56SAlex Deucher  * copy of this software and associated documentation files (the "Software"),
6a2e73f56SAlex Deucher  * to deal in the Software without restriction, including without limitation
7a2e73f56SAlex Deucher  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8a2e73f56SAlex Deucher  * and/or sell copies of the Software, and to permit persons to whom the
9a2e73f56SAlex Deucher  * Software is furnished to do so, subject to the following conditions:
10a2e73f56SAlex Deucher  *
11a2e73f56SAlex Deucher  * The above copyright notice and this permission notice shall be included in
12a2e73f56SAlex Deucher  * all copies or substantial portions of the Software.
13a2e73f56SAlex Deucher  *
14a2e73f56SAlex Deucher  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15a2e73f56SAlex Deucher  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16a2e73f56SAlex Deucher  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17a2e73f56SAlex Deucher  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18a2e73f56SAlex Deucher  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19a2e73f56SAlex Deucher  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20a2e73f56SAlex Deucher  * OTHER DEALINGS IN THE SOFTWARE.
21a2e73f56SAlex Deucher  *
22a2e73f56SAlex Deucher  * Authors: Alex Deucher
23a2e73f56SAlex Deucher  */
24a2e73f56SAlex Deucher #include <linux/firmware.h>
25a2e73f56SAlex Deucher #include <linux/slab.h>
26a2e73f56SAlex Deucher #include <linux/module.h>
2747b757fbSSam Ravnborg #include <linux/pci.h>
2847b757fbSSam Ravnborg 
296f786950SAlex Deucher #include <drm/amdgpu_drm.h>
306f786950SAlex Deucher 
31a2e73f56SAlex Deucher #include "amdgpu.h"
32a2e73f56SAlex Deucher #include "amdgpu_atombios.h"
33a2e73f56SAlex Deucher #include "amdgpu_ih.h"
34a2e73f56SAlex Deucher #include "amdgpu_uvd.h"
35a2e73f56SAlex Deucher #include "amdgpu_vce.h"
36a2e73f56SAlex Deucher #include "cikd.h"
37a2e73f56SAlex Deucher #include "atom.h"
38d0dd7f0cSAlex Deucher #include "amd_pcie.h"
39a2e73f56SAlex Deucher 
40a2e73f56SAlex Deucher #include "cik.h"
41a2e73f56SAlex Deucher #include "gmc_v7_0.h"
42a2e73f56SAlex Deucher #include "cik_ih.h"
43a2e73f56SAlex Deucher #include "dce_v8_0.h"
44a2e73f56SAlex Deucher #include "gfx_v7_0.h"
45a2e73f56SAlex Deucher #include "cik_sdma.h"
46a2e73f56SAlex Deucher #include "uvd_v4_2.h"
47a2e73f56SAlex Deucher #include "vce_v2_0.h"
48a2e73f56SAlex Deucher #include "cik_dpm.h"
49a2e73f56SAlex Deucher 
50a2e73f56SAlex Deucher #include "uvd/uvd_4_2_d.h"
51a2e73f56SAlex Deucher 
52a2e73f56SAlex Deucher #include "smu/smu_7_0_1_d.h"
53a2e73f56SAlex Deucher #include "smu/smu_7_0_1_sh_mask.h"
54a2e73f56SAlex Deucher 
55a2e73f56SAlex Deucher #include "dce/dce_8_0_d.h"
56a2e73f56SAlex Deucher #include "dce/dce_8_0_sh_mask.h"
57a2e73f56SAlex Deucher 
58a2e73f56SAlex Deucher #include "bif/bif_4_1_d.h"
59a2e73f56SAlex Deucher #include "bif/bif_4_1_sh_mask.h"
60a2e73f56SAlex Deucher 
61a2e73f56SAlex Deucher #include "gca/gfx_7_2_d.h"
62a2e73f56SAlex Deucher #include "gca/gfx_7_2_enum.h"
63a2e73f56SAlex Deucher #include "gca/gfx_7_2_sh_mask.h"
64a2e73f56SAlex Deucher 
65a2e73f56SAlex Deucher #include "gmc/gmc_7_1_d.h"
66a2e73f56SAlex Deucher #include "gmc/gmc_7_1_sh_mask.h"
67a2e73f56SAlex Deucher 
68a2e73f56SAlex Deucher #include "oss/oss_2_0_d.h"
69a2e73f56SAlex Deucher #include "oss/oss_2_0_sh_mask.h"
70a2e73f56SAlex Deucher 
714562236bSHarry Wentland #include "amdgpu_dm.h"
72130e0371SOded Gabbay #include "amdgpu_amdkfd.h"
73733ee71aSRyan Taylor #include "amdgpu_vkms.h"
74130e0371SOded Gabbay 
753b246e8bSAlex Deucher static const struct amdgpu_video_codec_info cik_video_codecs_encode_array[] =
763b246e8bSAlex Deucher {
773b246e8bSAlex Deucher 	{
786f786950SAlex Deucher 		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
793b246e8bSAlex Deucher 		.max_width = 2048,
803b246e8bSAlex Deucher 		.max_height = 1152,
813b246e8bSAlex Deucher 		.max_pixels_per_frame = 2048 * 1152,
823b246e8bSAlex Deucher 		.max_level = 0,
833b246e8bSAlex Deucher 	},
843b246e8bSAlex Deucher };
853b246e8bSAlex Deucher 
863b246e8bSAlex Deucher static const struct amdgpu_video_codecs cik_video_codecs_encode =
873b246e8bSAlex Deucher {
883b246e8bSAlex Deucher 	.codec_count = ARRAY_SIZE(cik_video_codecs_encode_array),
893b246e8bSAlex Deucher 	.codec_array = cik_video_codecs_encode_array,
903b246e8bSAlex Deucher };
913b246e8bSAlex Deucher 
923b246e8bSAlex Deucher static const struct amdgpu_video_codec_info cik_video_codecs_decode_array[] =
933b246e8bSAlex Deucher {
943b246e8bSAlex Deucher 	{
956f786950SAlex Deucher 		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
963b246e8bSAlex Deucher 		.max_width = 2048,
973b246e8bSAlex Deucher 		.max_height = 1152,
983b246e8bSAlex Deucher 		.max_pixels_per_frame = 2048 * 1152,
993b246e8bSAlex Deucher 		.max_level = 3,
1003b246e8bSAlex Deucher 	},
1013b246e8bSAlex Deucher 	{
1026f786950SAlex Deucher 		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
1033b246e8bSAlex Deucher 		.max_width = 2048,
1043b246e8bSAlex Deucher 		.max_height = 1152,
1053b246e8bSAlex Deucher 		.max_pixels_per_frame = 2048 * 1152,
1063b246e8bSAlex Deucher 		.max_level = 5,
1073b246e8bSAlex Deucher 	},
1083b246e8bSAlex Deucher 	{
1096f786950SAlex Deucher 		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
1103b246e8bSAlex Deucher 		.max_width = 2048,
1113b246e8bSAlex Deucher 		.max_height = 1152,
1123b246e8bSAlex Deucher 		.max_pixels_per_frame = 2048 * 1152,
1133b246e8bSAlex Deucher 		.max_level = 41,
1143b246e8bSAlex Deucher 	},
1153b246e8bSAlex Deucher 	{
1166f786950SAlex Deucher 		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
1173b246e8bSAlex Deucher 		.max_width = 2048,
1183b246e8bSAlex Deucher 		.max_height = 1152,
1193b246e8bSAlex Deucher 		.max_pixels_per_frame = 2048 * 1152,
1203b246e8bSAlex Deucher 		.max_level = 4,
1213b246e8bSAlex Deucher 	},
1223b246e8bSAlex Deucher };
1233b246e8bSAlex Deucher 
1243b246e8bSAlex Deucher static const struct amdgpu_video_codecs cik_video_codecs_decode =
1253b246e8bSAlex Deucher {
1263b246e8bSAlex Deucher 	.codec_count = ARRAY_SIZE(cik_video_codecs_decode_array),
1273b246e8bSAlex Deucher 	.codec_array = cik_video_codecs_decode_array,
1283b246e8bSAlex Deucher };
1293b246e8bSAlex Deucher 
cik_query_video_codecs(struct amdgpu_device * adev,bool encode,const struct amdgpu_video_codecs ** codecs)1303b246e8bSAlex Deucher static int cik_query_video_codecs(struct amdgpu_device *adev, bool encode,
1313b246e8bSAlex Deucher 				  const struct amdgpu_video_codecs **codecs)
1323b246e8bSAlex Deucher {
1333b246e8bSAlex Deucher 	switch (adev->asic_type) {
1343b246e8bSAlex Deucher 	case CHIP_BONAIRE:
1353b246e8bSAlex Deucher 	case CHIP_HAWAII:
1363b246e8bSAlex Deucher 	case CHIP_KAVERI:
1373b246e8bSAlex Deucher 	case CHIP_KABINI:
1383b246e8bSAlex Deucher 	case CHIP_MULLINS:
1393b246e8bSAlex Deucher 		if (encode)
1403b246e8bSAlex Deucher 			*codecs = &cik_video_codecs_encode;
1413b246e8bSAlex Deucher 		else
1423b246e8bSAlex Deucher 			*codecs = &cik_video_codecs_decode;
1433b246e8bSAlex Deucher 		return 0;
1443b246e8bSAlex Deucher 	default:
1453b246e8bSAlex Deucher 		return -EINVAL;
1463b246e8bSAlex Deucher 	}
1473b246e8bSAlex Deucher }
1483b246e8bSAlex Deucher 
149a2e73f56SAlex Deucher /*
150a2e73f56SAlex Deucher  * Indirect registers accessor
151a2e73f56SAlex Deucher  */
cik_pcie_rreg(struct amdgpu_device * adev,u32 reg)152a2e73f56SAlex Deucher static u32 cik_pcie_rreg(struct amdgpu_device *adev, u32 reg)
153a2e73f56SAlex Deucher {
154a2e73f56SAlex Deucher 	unsigned long flags;
155a2e73f56SAlex Deucher 	u32 r;
156a2e73f56SAlex Deucher 
157a2e73f56SAlex Deucher 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
158a2e73f56SAlex Deucher 	WREG32(mmPCIE_INDEX, reg);
159a2e73f56SAlex Deucher 	(void)RREG32(mmPCIE_INDEX);
160a2e73f56SAlex Deucher 	r = RREG32(mmPCIE_DATA);
161a2e73f56SAlex Deucher 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
162a2e73f56SAlex Deucher 	return r;
163a2e73f56SAlex Deucher }
164a2e73f56SAlex Deucher 
cik_pcie_wreg(struct amdgpu_device * adev,u32 reg,u32 v)165a2e73f56SAlex Deucher static void cik_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
166a2e73f56SAlex Deucher {
167a2e73f56SAlex Deucher 	unsigned long flags;
168a2e73f56SAlex Deucher 
169a2e73f56SAlex Deucher 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
170a2e73f56SAlex Deucher 	WREG32(mmPCIE_INDEX, reg);
171a2e73f56SAlex Deucher 	(void)RREG32(mmPCIE_INDEX);
172a2e73f56SAlex Deucher 	WREG32(mmPCIE_DATA, v);
173a2e73f56SAlex Deucher 	(void)RREG32(mmPCIE_DATA);
174a2e73f56SAlex Deucher 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
175a2e73f56SAlex Deucher }
176a2e73f56SAlex Deucher 
cik_smc_rreg(struct amdgpu_device * adev,u32 reg)177a2e73f56SAlex Deucher static u32 cik_smc_rreg(struct amdgpu_device *adev, u32 reg)
178a2e73f56SAlex Deucher {
179a2e73f56SAlex Deucher 	unsigned long flags;
180a2e73f56SAlex Deucher 	u32 r;
181a2e73f56SAlex Deucher 
182a2e73f56SAlex Deucher 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
183a2e73f56SAlex Deucher 	WREG32(mmSMC_IND_INDEX_0, (reg));
184a2e73f56SAlex Deucher 	r = RREG32(mmSMC_IND_DATA_0);
185a2e73f56SAlex Deucher 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
186a2e73f56SAlex Deucher 	return r;
187a2e73f56SAlex Deucher }
188a2e73f56SAlex Deucher 
cik_smc_wreg(struct amdgpu_device * adev,u32 reg,u32 v)189a2e73f56SAlex Deucher static void cik_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
190a2e73f56SAlex Deucher {
191a2e73f56SAlex Deucher 	unsigned long flags;
192a2e73f56SAlex Deucher 
193a2e73f56SAlex Deucher 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
194a2e73f56SAlex Deucher 	WREG32(mmSMC_IND_INDEX_0, (reg));
195a2e73f56SAlex Deucher 	WREG32(mmSMC_IND_DATA_0, (v));
196a2e73f56SAlex Deucher 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
197a2e73f56SAlex Deucher }
198a2e73f56SAlex Deucher 
cik_uvd_ctx_rreg(struct amdgpu_device * adev,u32 reg)199a2e73f56SAlex Deucher static u32 cik_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
200a2e73f56SAlex Deucher {
201a2e73f56SAlex Deucher 	unsigned long flags;
202a2e73f56SAlex Deucher 	u32 r;
203a2e73f56SAlex Deucher 
204a2e73f56SAlex Deucher 	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
205a2e73f56SAlex Deucher 	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
206a2e73f56SAlex Deucher 	r = RREG32(mmUVD_CTX_DATA);
207a2e73f56SAlex Deucher 	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
208a2e73f56SAlex Deucher 	return r;
209a2e73f56SAlex Deucher }
210a2e73f56SAlex Deucher 
cik_uvd_ctx_wreg(struct amdgpu_device * adev,u32 reg,u32 v)211a2e73f56SAlex Deucher static void cik_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
212a2e73f56SAlex Deucher {
213a2e73f56SAlex Deucher 	unsigned long flags;
214a2e73f56SAlex Deucher 
215a2e73f56SAlex Deucher 	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
216a2e73f56SAlex Deucher 	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
217a2e73f56SAlex Deucher 	WREG32(mmUVD_CTX_DATA, (v));
218a2e73f56SAlex Deucher 	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
219a2e73f56SAlex Deucher }
220a2e73f56SAlex Deucher 
cik_didt_rreg(struct amdgpu_device * adev,u32 reg)221a2e73f56SAlex Deucher static u32 cik_didt_rreg(struct amdgpu_device *adev, u32 reg)
222a2e73f56SAlex Deucher {
223a2e73f56SAlex Deucher 	unsigned long flags;
224a2e73f56SAlex Deucher 	u32 r;
225a2e73f56SAlex Deucher 
226a2e73f56SAlex Deucher 	spin_lock_irqsave(&adev->didt_idx_lock, flags);
227a2e73f56SAlex Deucher 	WREG32(mmDIDT_IND_INDEX, (reg));
228a2e73f56SAlex Deucher 	r = RREG32(mmDIDT_IND_DATA);
229a2e73f56SAlex Deucher 	spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
230a2e73f56SAlex Deucher 	return r;
231a2e73f56SAlex Deucher }
232a2e73f56SAlex Deucher 
cik_didt_wreg(struct amdgpu_device * adev,u32 reg,u32 v)233a2e73f56SAlex Deucher static void cik_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
234a2e73f56SAlex Deucher {
235a2e73f56SAlex Deucher 	unsigned long flags;
236a2e73f56SAlex Deucher 
237a2e73f56SAlex Deucher 	spin_lock_irqsave(&adev->didt_idx_lock, flags);
238a2e73f56SAlex Deucher 	WREG32(mmDIDT_IND_INDEX, (reg));
239a2e73f56SAlex Deucher 	WREG32(mmDIDT_IND_DATA, (v));
240a2e73f56SAlex Deucher 	spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
241a2e73f56SAlex Deucher }
242a2e73f56SAlex Deucher 
243a2e73f56SAlex Deucher static const u32 bonaire_golden_spm_registers[] =
244a2e73f56SAlex Deucher {
245a2e73f56SAlex Deucher 	0xc200, 0xe0ffffff, 0xe0000000
246a2e73f56SAlex Deucher };
247a2e73f56SAlex Deucher 
248a2e73f56SAlex Deucher static const u32 bonaire_golden_common_registers[] =
249a2e73f56SAlex Deucher {
250a2e73f56SAlex Deucher 	0x31dc, 0xffffffff, 0x00000800,
251a2e73f56SAlex Deucher 	0x31dd, 0xffffffff, 0x00000800,
252a2e73f56SAlex Deucher 	0x31e6, 0xffffffff, 0x00007fbf,
253a2e73f56SAlex Deucher 	0x31e7, 0xffffffff, 0x00007faf
254a2e73f56SAlex Deucher };
255a2e73f56SAlex Deucher 
256a2e73f56SAlex Deucher static const u32 bonaire_golden_registers[] =
257a2e73f56SAlex Deucher {
258a2e73f56SAlex Deucher 	0xcd5, 0x00000333, 0x00000333,
259a2e73f56SAlex Deucher 	0xcd4, 0x000c0fc0, 0x00040200,
260a2e73f56SAlex Deucher 	0x2684, 0x00010000, 0x00058208,
261a2e73f56SAlex Deucher 	0xf000, 0xffff1fff, 0x00140000,
262a2e73f56SAlex Deucher 	0xf080, 0xfdfc0fff, 0x00000100,
263a2e73f56SAlex Deucher 	0xf08d, 0x40000000, 0x40000200,
264a2e73f56SAlex Deucher 	0x260c, 0xffffffff, 0x00000000,
265a2e73f56SAlex Deucher 	0x260d, 0xf00fffff, 0x00000400,
266a2e73f56SAlex Deucher 	0x260e, 0x0002021c, 0x00020200,
267a2e73f56SAlex Deucher 	0x31e, 0x00000080, 0x00000000,
268a2e73f56SAlex Deucher 	0x16ec, 0x000000f0, 0x00000070,
269a2e73f56SAlex Deucher 	0x16f0, 0xf0311fff, 0x80300000,
270a2e73f56SAlex Deucher 	0x263e, 0x73773777, 0x12010001,
271a2e73f56SAlex Deucher 	0xd43, 0x00810000, 0x408af000,
272a2e73f56SAlex Deucher 	0x1c0c, 0x31000111, 0x00000011,
273a2e73f56SAlex Deucher 	0xbd2, 0x73773777, 0x12010001,
274a2e73f56SAlex Deucher 	0x883, 0x00007fb6, 0x0021a1b1,
275a2e73f56SAlex Deucher 	0x884, 0x00007fb6, 0x002021b1,
276a2e73f56SAlex Deucher 	0x860, 0x00007fb6, 0x00002191,
277a2e73f56SAlex Deucher 	0x886, 0x00007fb6, 0x002121b1,
278a2e73f56SAlex Deucher 	0x887, 0x00007fb6, 0x002021b1,
279a2e73f56SAlex Deucher 	0x877, 0x00007fb6, 0x00002191,
280a2e73f56SAlex Deucher 	0x878, 0x00007fb6, 0x00002191,
281a2e73f56SAlex Deucher 	0xd8a, 0x0000003f, 0x0000000a,
282a2e73f56SAlex Deucher 	0xd8b, 0x0000003f, 0x0000000a,
283a2e73f56SAlex Deucher 	0xab9, 0x00073ffe, 0x000022a2,
284a2e73f56SAlex Deucher 	0x903, 0x000007ff, 0x00000000,
285a2e73f56SAlex Deucher 	0x2285, 0xf000003f, 0x00000007,
286a2e73f56SAlex Deucher 	0x22fc, 0x00002001, 0x00000001,
287a2e73f56SAlex Deucher 	0x22c9, 0xffffffff, 0x00ffffff,
288a2e73f56SAlex Deucher 	0xc281, 0x0000ff0f, 0x00000000,
289a2e73f56SAlex Deucher 	0xa293, 0x07ffffff, 0x06000000,
290a2e73f56SAlex Deucher 	0x136, 0x00000fff, 0x00000100,
291a2e73f56SAlex Deucher 	0xf9e, 0x00000001, 0x00000002,
292a2e73f56SAlex Deucher 	0x2440, 0x03000000, 0x0362c688,
293a2e73f56SAlex Deucher 	0x2300, 0x000000ff, 0x00000001,
294a2e73f56SAlex Deucher 	0x390, 0x00001fff, 0x00001fff,
295a2e73f56SAlex Deucher 	0x2418, 0x0000007f, 0x00000020,
296a2e73f56SAlex Deucher 	0x2542, 0x00010000, 0x00010000,
297a2e73f56SAlex Deucher 	0x2b05, 0x000003ff, 0x000000f3,
298a2e73f56SAlex Deucher 	0x2b03, 0xffffffff, 0x00001032
299a2e73f56SAlex Deucher };
300a2e73f56SAlex Deucher 
301a2e73f56SAlex Deucher static const u32 bonaire_mgcg_cgcg_init[] =
302a2e73f56SAlex Deucher {
303a2e73f56SAlex Deucher 	0x3108, 0xffffffff, 0xfffffffc,
304a2e73f56SAlex Deucher 	0xc200, 0xffffffff, 0xe0000000,
305a2e73f56SAlex Deucher 	0xf0a8, 0xffffffff, 0x00000100,
306a2e73f56SAlex Deucher 	0xf082, 0xffffffff, 0x00000100,
307a2e73f56SAlex Deucher 	0xf0b0, 0xffffffff, 0xc0000100,
308a2e73f56SAlex Deucher 	0xf0b2, 0xffffffff, 0xc0000100,
309a2e73f56SAlex Deucher 	0xf0b1, 0xffffffff, 0xc0000100,
310a2e73f56SAlex Deucher 	0x1579, 0xffffffff, 0x00600100,
311a2e73f56SAlex Deucher 	0xf0a0, 0xffffffff, 0x00000100,
312a2e73f56SAlex Deucher 	0xf085, 0xffffffff, 0x06000100,
313a2e73f56SAlex Deucher 	0xf088, 0xffffffff, 0x00000100,
314a2e73f56SAlex Deucher 	0xf086, 0xffffffff, 0x06000100,
315a2e73f56SAlex Deucher 	0xf081, 0xffffffff, 0x00000100,
316a2e73f56SAlex Deucher 	0xf0b8, 0xffffffff, 0x00000100,
317a2e73f56SAlex Deucher 	0xf089, 0xffffffff, 0x00000100,
318a2e73f56SAlex Deucher 	0xf080, 0xffffffff, 0x00000100,
319a2e73f56SAlex Deucher 	0xf08c, 0xffffffff, 0x00000100,
320a2e73f56SAlex Deucher 	0xf08d, 0xffffffff, 0x00000100,
321a2e73f56SAlex Deucher 	0xf094, 0xffffffff, 0x00000100,
322a2e73f56SAlex Deucher 	0xf095, 0xffffffff, 0x00000100,
323a2e73f56SAlex Deucher 	0xf096, 0xffffffff, 0x00000100,
324a2e73f56SAlex Deucher 	0xf097, 0xffffffff, 0x00000100,
325a2e73f56SAlex Deucher 	0xf098, 0xffffffff, 0x00000100,
326a2e73f56SAlex Deucher 	0xf09f, 0xffffffff, 0x00000100,
327a2e73f56SAlex Deucher 	0xf09e, 0xffffffff, 0x00000100,
328a2e73f56SAlex Deucher 	0xf084, 0xffffffff, 0x06000100,
329a2e73f56SAlex Deucher 	0xf0a4, 0xffffffff, 0x00000100,
330a2e73f56SAlex Deucher 	0xf09d, 0xffffffff, 0x00000100,
331a2e73f56SAlex Deucher 	0xf0ad, 0xffffffff, 0x00000100,
332a2e73f56SAlex Deucher 	0xf0ac, 0xffffffff, 0x00000100,
333a2e73f56SAlex Deucher 	0xf09c, 0xffffffff, 0x00000100,
334a2e73f56SAlex Deucher 	0xc200, 0xffffffff, 0xe0000000,
335a2e73f56SAlex Deucher 	0xf008, 0xffffffff, 0x00010000,
336a2e73f56SAlex Deucher 	0xf009, 0xffffffff, 0x00030002,
337a2e73f56SAlex Deucher 	0xf00a, 0xffffffff, 0x00040007,
338a2e73f56SAlex Deucher 	0xf00b, 0xffffffff, 0x00060005,
339a2e73f56SAlex Deucher 	0xf00c, 0xffffffff, 0x00090008,
340a2e73f56SAlex Deucher 	0xf00d, 0xffffffff, 0x00010000,
341a2e73f56SAlex Deucher 	0xf00e, 0xffffffff, 0x00030002,
342a2e73f56SAlex Deucher 	0xf00f, 0xffffffff, 0x00040007,
343a2e73f56SAlex Deucher 	0xf010, 0xffffffff, 0x00060005,
344a2e73f56SAlex Deucher 	0xf011, 0xffffffff, 0x00090008,
345a2e73f56SAlex Deucher 	0xf012, 0xffffffff, 0x00010000,
346a2e73f56SAlex Deucher 	0xf013, 0xffffffff, 0x00030002,
347a2e73f56SAlex Deucher 	0xf014, 0xffffffff, 0x00040007,
348a2e73f56SAlex Deucher 	0xf015, 0xffffffff, 0x00060005,
349a2e73f56SAlex Deucher 	0xf016, 0xffffffff, 0x00090008,
350a2e73f56SAlex Deucher 	0xf017, 0xffffffff, 0x00010000,
351a2e73f56SAlex Deucher 	0xf018, 0xffffffff, 0x00030002,
352a2e73f56SAlex Deucher 	0xf019, 0xffffffff, 0x00040007,
353a2e73f56SAlex Deucher 	0xf01a, 0xffffffff, 0x00060005,
354a2e73f56SAlex Deucher 	0xf01b, 0xffffffff, 0x00090008,
355a2e73f56SAlex Deucher 	0xf01c, 0xffffffff, 0x00010000,
356a2e73f56SAlex Deucher 	0xf01d, 0xffffffff, 0x00030002,
357a2e73f56SAlex Deucher 	0xf01e, 0xffffffff, 0x00040007,
358a2e73f56SAlex Deucher 	0xf01f, 0xffffffff, 0x00060005,
359a2e73f56SAlex Deucher 	0xf020, 0xffffffff, 0x00090008,
360a2e73f56SAlex Deucher 	0xf021, 0xffffffff, 0x00010000,
361a2e73f56SAlex Deucher 	0xf022, 0xffffffff, 0x00030002,
362a2e73f56SAlex Deucher 	0xf023, 0xffffffff, 0x00040007,
363a2e73f56SAlex Deucher 	0xf024, 0xffffffff, 0x00060005,
364a2e73f56SAlex Deucher 	0xf025, 0xffffffff, 0x00090008,
365a2e73f56SAlex Deucher 	0xf026, 0xffffffff, 0x00010000,
366a2e73f56SAlex Deucher 	0xf027, 0xffffffff, 0x00030002,
367a2e73f56SAlex Deucher 	0xf028, 0xffffffff, 0x00040007,
368a2e73f56SAlex Deucher 	0xf029, 0xffffffff, 0x00060005,
369a2e73f56SAlex Deucher 	0xf02a, 0xffffffff, 0x00090008,
370a2e73f56SAlex Deucher 	0xf000, 0xffffffff, 0x96e00200,
371a2e73f56SAlex Deucher 	0x21c2, 0xffffffff, 0x00900100,
372a2e73f56SAlex Deucher 	0x3109, 0xffffffff, 0x0020003f,
373a2e73f56SAlex Deucher 	0xe, 0xffffffff, 0x0140001c,
374a2e73f56SAlex Deucher 	0xf, 0x000f0000, 0x000f0000,
375a2e73f56SAlex Deucher 	0x88, 0xffffffff, 0xc060000c,
376a2e73f56SAlex Deucher 	0x89, 0xc0000fff, 0x00000100,
377a2e73f56SAlex Deucher 	0x3e4, 0xffffffff, 0x00000100,
378a2e73f56SAlex Deucher 	0x3e6, 0x00000101, 0x00000000,
379a2e73f56SAlex Deucher 	0x82a, 0xffffffff, 0x00000104,
380a2e73f56SAlex Deucher 	0x1579, 0xff000fff, 0x00000100,
381a2e73f56SAlex Deucher 	0xc33, 0xc0000fff, 0x00000104,
382a2e73f56SAlex Deucher 	0x3079, 0x00000001, 0x00000001,
383a2e73f56SAlex Deucher 	0x3403, 0xff000ff0, 0x00000100,
384a2e73f56SAlex Deucher 	0x3603, 0xff000ff0, 0x00000100
385a2e73f56SAlex Deucher };
386a2e73f56SAlex Deucher 
387a2e73f56SAlex Deucher static const u32 spectre_golden_spm_registers[] =
388a2e73f56SAlex Deucher {
389a2e73f56SAlex Deucher 	0xc200, 0xe0ffffff, 0xe0000000
390a2e73f56SAlex Deucher };
391a2e73f56SAlex Deucher 
392a2e73f56SAlex Deucher static const u32 spectre_golden_common_registers[] =
393a2e73f56SAlex Deucher {
394a2e73f56SAlex Deucher 	0x31dc, 0xffffffff, 0x00000800,
395a2e73f56SAlex Deucher 	0x31dd, 0xffffffff, 0x00000800,
396a2e73f56SAlex Deucher 	0x31e6, 0xffffffff, 0x00007fbf,
397a2e73f56SAlex Deucher 	0x31e7, 0xffffffff, 0x00007faf
398a2e73f56SAlex Deucher };
399a2e73f56SAlex Deucher 
400a2e73f56SAlex Deucher static const u32 spectre_golden_registers[] =
401a2e73f56SAlex Deucher {
402a2e73f56SAlex Deucher 	0xf000, 0xffff1fff, 0x96940200,
403a2e73f56SAlex Deucher 	0xf003, 0xffff0001, 0xff000000,
404a2e73f56SAlex Deucher 	0xf080, 0xfffc0fff, 0x00000100,
405a2e73f56SAlex Deucher 	0x1bb6, 0x00010101, 0x00010000,
406a2e73f56SAlex Deucher 	0x260d, 0xf00fffff, 0x00000400,
407a2e73f56SAlex Deucher 	0x260e, 0xfffffffc, 0x00020200,
408a2e73f56SAlex Deucher 	0x16ec, 0x000000f0, 0x00000070,
409a2e73f56SAlex Deucher 	0x16f0, 0xf0311fff, 0x80300000,
410a2e73f56SAlex Deucher 	0x263e, 0x73773777, 0x12010001,
411a2e73f56SAlex Deucher 	0x26df, 0x00ff0000, 0x00fc0000,
412a2e73f56SAlex Deucher 	0xbd2, 0x73773777, 0x12010001,
413a2e73f56SAlex Deucher 	0x2285, 0xf000003f, 0x00000007,
414a2e73f56SAlex Deucher 	0x22c9, 0xffffffff, 0x00ffffff,
415a2e73f56SAlex Deucher 	0xa0d4, 0x3f3f3fff, 0x00000082,
416a2e73f56SAlex Deucher 	0xa0d5, 0x0000003f, 0x00000000,
417a2e73f56SAlex Deucher 	0xf9e, 0x00000001, 0x00000002,
418a2e73f56SAlex Deucher 	0x244f, 0xffff03df, 0x00000004,
419a2e73f56SAlex Deucher 	0x31da, 0x00000008, 0x00000008,
420a2e73f56SAlex Deucher 	0x2300, 0x000008ff, 0x00000800,
421a2e73f56SAlex Deucher 	0x2542, 0x00010000, 0x00010000,
422a2e73f56SAlex Deucher 	0x2b03, 0xffffffff, 0x54763210,
423a2e73f56SAlex Deucher 	0x853e, 0x01ff01ff, 0x00000002,
424a2e73f56SAlex Deucher 	0x8526, 0x007ff800, 0x00200000,
425a2e73f56SAlex Deucher 	0x8057, 0xffffffff, 0x00000f40,
426a2e73f56SAlex Deucher 	0xc24d, 0xffffffff, 0x00000001
427a2e73f56SAlex Deucher };
428a2e73f56SAlex Deucher 
429a2e73f56SAlex Deucher static const u32 spectre_mgcg_cgcg_init[] =
430a2e73f56SAlex Deucher {
431a2e73f56SAlex Deucher 	0x3108, 0xffffffff, 0xfffffffc,
432a2e73f56SAlex Deucher 	0xc200, 0xffffffff, 0xe0000000,
433a2e73f56SAlex Deucher 	0xf0a8, 0xffffffff, 0x00000100,
434a2e73f56SAlex Deucher 	0xf082, 0xffffffff, 0x00000100,
435a2e73f56SAlex Deucher 	0xf0b0, 0xffffffff, 0x00000100,
436a2e73f56SAlex Deucher 	0xf0b2, 0xffffffff, 0x00000100,
437a2e73f56SAlex Deucher 	0xf0b1, 0xffffffff, 0x00000100,
438a2e73f56SAlex Deucher 	0x1579, 0xffffffff, 0x00600100,
439a2e73f56SAlex Deucher 	0xf0a0, 0xffffffff, 0x00000100,
440a2e73f56SAlex Deucher 	0xf085, 0xffffffff, 0x06000100,
441a2e73f56SAlex Deucher 	0xf088, 0xffffffff, 0x00000100,
442a2e73f56SAlex Deucher 	0xf086, 0xffffffff, 0x06000100,
443a2e73f56SAlex Deucher 	0xf081, 0xffffffff, 0x00000100,
444a2e73f56SAlex Deucher 	0xf0b8, 0xffffffff, 0x00000100,
445a2e73f56SAlex Deucher 	0xf089, 0xffffffff, 0x00000100,
446a2e73f56SAlex Deucher 	0xf080, 0xffffffff, 0x00000100,
447a2e73f56SAlex Deucher 	0xf08c, 0xffffffff, 0x00000100,
448a2e73f56SAlex Deucher 	0xf08d, 0xffffffff, 0x00000100,
449a2e73f56SAlex Deucher 	0xf094, 0xffffffff, 0x00000100,
450a2e73f56SAlex Deucher 	0xf095, 0xffffffff, 0x00000100,
451a2e73f56SAlex Deucher 	0xf096, 0xffffffff, 0x00000100,
452a2e73f56SAlex Deucher 	0xf097, 0xffffffff, 0x00000100,
453a2e73f56SAlex Deucher 	0xf098, 0xffffffff, 0x00000100,
454a2e73f56SAlex Deucher 	0xf09f, 0xffffffff, 0x00000100,
455a2e73f56SAlex Deucher 	0xf09e, 0xffffffff, 0x00000100,
456a2e73f56SAlex Deucher 	0xf084, 0xffffffff, 0x06000100,
457a2e73f56SAlex Deucher 	0xf0a4, 0xffffffff, 0x00000100,
458a2e73f56SAlex Deucher 	0xf09d, 0xffffffff, 0x00000100,
459a2e73f56SAlex Deucher 	0xf0ad, 0xffffffff, 0x00000100,
460a2e73f56SAlex Deucher 	0xf0ac, 0xffffffff, 0x00000100,
461a2e73f56SAlex Deucher 	0xf09c, 0xffffffff, 0x00000100,
462a2e73f56SAlex Deucher 	0xc200, 0xffffffff, 0xe0000000,
463a2e73f56SAlex Deucher 	0xf008, 0xffffffff, 0x00010000,
464a2e73f56SAlex Deucher 	0xf009, 0xffffffff, 0x00030002,
465a2e73f56SAlex Deucher 	0xf00a, 0xffffffff, 0x00040007,
466a2e73f56SAlex Deucher 	0xf00b, 0xffffffff, 0x00060005,
467a2e73f56SAlex Deucher 	0xf00c, 0xffffffff, 0x00090008,
468a2e73f56SAlex Deucher 	0xf00d, 0xffffffff, 0x00010000,
469a2e73f56SAlex Deucher 	0xf00e, 0xffffffff, 0x00030002,
470a2e73f56SAlex Deucher 	0xf00f, 0xffffffff, 0x00040007,
471a2e73f56SAlex Deucher 	0xf010, 0xffffffff, 0x00060005,
472a2e73f56SAlex Deucher 	0xf011, 0xffffffff, 0x00090008,
473a2e73f56SAlex Deucher 	0xf012, 0xffffffff, 0x00010000,
474a2e73f56SAlex Deucher 	0xf013, 0xffffffff, 0x00030002,
475a2e73f56SAlex Deucher 	0xf014, 0xffffffff, 0x00040007,
476a2e73f56SAlex Deucher 	0xf015, 0xffffffff, 0x00060005,
477a2e73f56SAlex Deucher 	0xf016, 0xffffffff, 0x00090008,
478a2e73f56SAlex Deucher 	0xf017, 0xffffffff, 0x00010000,
479a2e73f56SAlex Deucher 	0xf018, 0xffffffff, 0x00030002,
480a2e73f56SAlex Deucher 	0xf019, 0xffffffff, 0x00040007,
481a2e73f56SAlex Deucher 	0xf01a, 0xffffffff, 0x00060005,
482a2e73f56SAlex Deucher 	0xf01b, 0xffffffff, 0x00090008,
483a2e73f56SAlex Deucher 	0xf01c, 0xffffffff, 0x00010000,
484a2e73f56SAlex Deucher 	0xf01d, 0xffffffff, 0x00030002,
485a2e73f56SAlex Deucher 	0xf01e, 0xffffffff, 0x00040007,
486a2e73f56SAlex Deucher 	0xf01f, 0xffffffff, 0x00060005,
487a2e73f56SAlex Deucher 	0xf020, 0xffffffff, 0x00090008,
488a2e73f56SAlex Deucher 	0xf021, 0xffffffff, 0x00010000,
489a2e73f56SAlex Deucher 	0xf022, 0xffffffff, 0x00030002,
490a2e73f56SAlex Deucher 	0xf023, 0xffffffff, 0x00040007,
491a2e73f56SAlex Deucher 	0xf024, 0xffffffff, 0x00060005,
492a2e73f56SAlex Deucher 	0xf025, 0xffffffff, 0x00090008,
493a2e73f56SAlex Deucher 	0xf026, 0xffffffff, 0x00010000,
494a2e73f56SAlex Deucher 	0xf027, 0xffffffff, 0x00030002,
495a2e73f56SAlex Deucher 	0xf028, 0xffffffff, 0x00040007,
496a2e73f56SAlex Deucher 	0xf029, 0xffffffff, 0x00060005,
497a2e73f56SAlex Deucher 	0xf02a, 0xffffffff, 0x00090008,
498a2e73f56SAlex Deucher 	0xf02b, 0xffffffff, 0x00010000,
499a2e73f56SAlex Deucher 	0xf02c, 0xffffffff, 0x00030002,
500a2e73f56SAlex Deucher 	0xf02d, 0xffffffff, 0x00040007,
501a2e73f56SAlex Deucher 	0xf02e, 0xffffffff, 0x00060005,
502a2e73f56SAlex Deucher 	0xf02f, 0xffffffff, 0x00090008,
503a2e73f56SAlex Deucher 	0xf000, 0xffffffff, 0x96e00200,
504a2e73f56SAlex Deucher 	0x21c2, 0xffffffff, 0x00900100,
505a2e73f56SAlex Deucher 	0x3109, 0xffffffff, 0x0020003f,
506a2e73f56SAlex Deucher 	0xe, 0xffffffff, 0x0140001c,
507a2e73f56SAlex Deucher 	0xf, 0x000f0000, 0x000f0000,
508a2e73f56SAlex Deucher 	0x88, 0xffffffff, 0xc060000c,
509a2e73f56SAlex Deucher 	0x89, 0xc0000fff, 0x00000100,
510a2e73f56SAlex Deucher 	0x3e4, 0xffffffff, 0x00000100,
511a2e73f56SAlex Deucher 	0x3e6, 0x00000101, 0x00000000,
512a2e73f56SAlex Deucher 	0x82a, 0xffffffff, 0x00000104,
513a2e73f56SAlex Deucher 	0x1579, 0xff000fff, 0x00000100,
514a2e73f56SAlex Deucher 	0xc33, 0xc0000fff, 0x00000104,
515a2e73f56SAlex Deucher 	0x3079, 0x00000001, 0x00000001,
516a2e73f56SAlex Deucher 	0x3403, 0xff000ff0, 0x00000100,
517a2e73f56SAlex Deucher 	0x3603, 0xff000ff0, 0x00000100
518a2e73f56SAlex Deucher };
519a2e73f56SAlex Deucher 
520a2e73f56SAlex Deucher static const u32 kalindi_golden_spm_registers[] =
521a2e73f56SAlex Deucher {
522a2e73f56SAlex Deucher 	0xc200, 0xe0ffffff, 0xe0000000
523a2e73f56SAlex Deucher };
524a2e73f56SAlex Deucher 
525a2e73f56SAlex Deucher static const u32 kalindi_golden_common_registers[] =
526a2e73f56SAlex Deucher {
527a2e73f56SAlex Deucher 	0x31dc, 0xffffffff, 0x00000800,
528a2e73f56SAlex Deucher 	0x31dd, 0xffffffff, 0x00000800,
529a2e73f56SAlex Deucher 	0x31e6, 0xffffffff, 0x00007fbf,
530a2e73f56SAlex Deucher 	0x31e7, 0xffffffff, 0x00007faf
531a2e73f56SAlex Deucher };
532a2e73f56SAlex Deucher 
533a2e73f56SAlex Deucher static const u32 kalindi_golden_registers[] =
534a2e73f56SAlex Deucher {
535a2e73f56SAlex Deucher 	0xf000, 0xffffdfff, 0x6e944040,
536a2e73f56SAlex Deucher 	0x1579, 0xff607fff, 0xfc000100,
537a2e73f56SAlex Deucher 	0xf088, 0xff000fff, 0x00000100,
538a2e73f56SAlex Deucher 	0xf089, 0xff000fff, 0x00000100,
539a2e73f56SAlex Deucher 	0xf080, 0xfffc0fff, 0x00000100,
540a2e73f56SAlex Deucher 	0x1bb6, 0x00010101, 0x00010000,
541a2e73f56SAlex Deucher 	0x260c, 0xffffffff, 0x00000000,
542a2e73f56SAlex Deucher 	0x260d, 0xf00fffff, 0x00000400,
543a2e73f56SAlex Deucher 	0x16ec, 0x000000f0, 0x00000070,
544a2e73f56SAlex Deucher 	0x16f0, 0xf0311fff, 0x80300000,
545a2e73f56SAlex Deucher 	0x263e, 0x73773777, 0x12010001,
546a2e73f56SAlex Deucher 	0x263f, 0xffffffff, 0x00000010,
547a2e73f56SAlex Deucher 	0x26df, 0x00ff0000, 0x00fc0000,
548a2e73f56SAlex Deucher 	0x200c, 0x00001f0f, 0x0000100a,
549a2e73f56SAlex Deucher 	0xbd2, 0x73773777, 0x12010001,
550a2e73f56SAlex Deucher 	0x902, 0x000fffff, 0x000c007f,
551a2e73f56SAlex Deucher 	0x2285, 0xf000003f, 0x00000007,
552a2e73f56SAlex Deucher 	0x22c9, 0x3fff3fff, 0x00ffcfff,
553a2e73f56SAlex Deucher 	0xc281, 0x0000ff0f, 0x00000000,
554a2e73f56SAlex Deucher 	0xa293, 0x07ffffff, 0x06000000,
555a2e73f56SAlex Deucher 	0x136, 0x00000fff, 0x00000100,
556a2e73f56SAlex Deucher 	0xf9e, 0x00000001, 0x00000002,
557a2e73f56SAlex Deucher 	0x31da, 0x00000008, 0x00000008,
558a2e73f56SAlex Deucher 	0x2300, 0x000000ff, 0x00000003,
559a2e73f56SAlex Deucher 	0x853e, 0x01ff01ff, 0x00000002,
560a2e73f56SAlex Deucher 	0x8526, 0x007ff800, 0x00200000,
561a2e73f56SAlex Deucher 	0x8057, 0xffffffff, 0x00000f40,
562a2e73f56SAlex Deucher 	0x2231, 0x001f3ae3, 0x00000082,
563a2e73f56SAlex Deucher 	0x2235, 0x0000001f, 0x00000010,
564a2e73f56SAlex Deucher 	0xc24d, 0xffffffff, 0x00000000
565a2e73f56SAlex Deucher };
566a2e73f56SAlex Deucher 
567a2e73f56SAlex Deucher static const u32 kalindi_mgcg_cgcg_init[] =
568a2e73f56SAlex Deucher {
569a2e73f56SAlex Deucher 	0x3108, 0xffffffff, 0xfffffffc,
570a2e73f56SAlex Deucher 	0xc200, 0xffffffff, 0xe0000000,
571a2e73f56SAlex Deucher 	0xf0a8, 0xffffffff, 0x00000100,
572a2e73f56SAlex Deucher 	0xf082, 0xffffffff, 0x00000100,
573a2e73f56SAlex Deucher 	0xf0b0, 0xffffffff, 0x00000100,
574a2e73f56SAlex Deucher 	0xf0b2, 0xffffffff, 0x00000100,
575a2e73f56SAlex Deucher 	0xf0b1, 0xffffffff, 0x00000100,
576a2e73f56SAlex Deucher 	0x1579, 0xffffffff, 0x00600100,
577a2e73f56SAlex Deucher 	0xf0a0, 0xffffffff, 0x00000100,
578a2e73f56SAlex Deucher 	0xf085, 0xffffffff, 0x06000100,
579a2e73f56SAlex Deucher 	0xf088, 0xffffffff, 0x00000100,
580a2e73f56SAlex Deucher 	0xf086, 0xffffffff, 0x06000100,
581a2e73f56SAlex Deucher 	0xf081, 0xffffffff, 0x00000100,
582a2e73f56SAlex Deucher 	0xf0b8, 0xffffffff, 0x00000100,
583a2e73f56SAlex Deucher 	0xf089, 0xffffffff, 0x00000100,
584a2e73f56SAlex Deucher 	0xf080, 0xffffffff, 0x00000100,
585a2e73f56SAlex Deucher 	0xf08c, 0xffffffff, 0x00000100,
586a2e73f56SAlex Deucher 	0xf08d, 0xffffffff, 0x00000100,
587a2e73f56SAlex Deucher 	0xf094, 0xffffffff, 0x00000100,
588a2e73f56SAlex Deucher 	0xf095, 0xffffffff, 0x00000100,
589a2e73f56SAlex Deucher 	0xf096, 0xffffffff, 0x00000100,
590a2e73f56SAlex Deucher 	0xf097, 0xffffffff, 0x00000100,
591a2e73f56SAlex Deucher 	0xf098, 0xffffffff, 0x00000100,
592a2e73f56SAlex Deucher 	0xf09f, 0xffffffff, 0x00000100,
593a2e73f56SAlex Deucher 	0xf09e, 0xffffffff, 0x00000100,
594a2e73f56SAlex Deucher 	0xf084, 0xffffffff, 0x06000100,
595a2e73f56SAlex Deucher 	0xf0a4, 0xffffffff, 0x00000100,
596a2e73f56SAlex Deucher 	0xf09d, 0xffffffff, 0x00000100,
597a2e73f56SAlex Deucher 	0xf0ad, 0xffffffff, 0x00000100,
598a2e73f56SAlex Deucher 	0xf0ac, 0xffffffff, 0x00000100,
599a2e73f56SAlex Deucher 	0xf09c, 0xffffffff, 0x00000100,
600a2e73f56SAlex Deucher 	0xc200, 0xffffffff, 0xe0000000,
601a2e73f56SAlex Deucher 	0xf008, 0xffffffff, 0x00010000,
602a2e73f56SAlex Deucher 	0xf009, 0xffffffff, 0x00030002,
603a2e73f56SAlex Deucher 	0xf00a, 0xffffffff, 0x00040007,
604a2e73f56SAlex Deucher 	0xf00b, 0xffffffff, 0x00060005,
605a2e73f56SAlex Deucher 	0xf00c, 0xffffffff, 0x00090008,
606a2e73f56SAlex Deucher 	0xf00d, 0xffffffff, 0x00010000,
607a2e73f56SAlex Deucher 	0xf00e, 0xffffffff, 0x00030002,
608a2e73f56SAlex Deucher 	0xf00f, 0xffffffff, 0x00040007,
609a2e73f56SAlex Deucher 	0xf010, 0xffffffff, 0x00060005,
610a2e73f56SAlex Deucher 	0xf011, 0xffffffff, 0x00090008,
611a2e73f56SAlex Deucher 	0xf000, 0xffffffff, 0x96e00200,
612a2e73f56SAlex Deucher 	0x21c2, 0xffffffff, 0x00900100,
613a2e73f56SAlex Deucher 	0x3109, 0xffffffff, 0x0020003f,
614a2e73f56SAlex Deucher 	0xe, 0xffffffff, 0x0140001c,
615a2e73f56SAlex Deucher 	0xf, 0x000f0000, 0x000f0000,
616a2e73f56SAlex Deucher 	0x88, 0xffffffff, 0xc060000c,
617a2e73f56SAlex Deucher 	0x89, 0xc0000fff, 0x00000100,
618a2e73f56SAlex Deucher 	0x82a, 0xffffffff, 0x00000104,
619a2e73f56SAlex Deucher 	0x1579, 0xff000fff, 0x00000100,
620a2e73f56SAlex Deucher 	0xc33, 0xc0000fff, 0x00000104,
621a2e73f56SAlex Deucher 	0x3079, 0x00000001, 0x00000001,
622a2e73f56SAlex Deucher 	0x3403, 0xff000ff0, 0x00000100,
623a2e73f56SAlex Deucher 	0x3603, 0xff000ff0, 0x00000100
624a2e73f56SAlex Deucher };
625a2e73f56SAlex Deucher 
626a2e73f56SAlex Deucher static const u32 hawaii_golden_spm_registers[] =
627a2e73f56SAlex Deucher {
628a2e73f56SAlex Deucher 	0xc200, 0xe0ffffff, 0xe0000000
629a2e73f56SAlex Deucher };
630a2e73f56SAlex Deucher 
631a2e73f56SAlex Deucher static const u32 hawaii_golden_common_registers[] =
632a2e73f56SAlex Deucher {
633a2e73f56SAlex Deucher 	0xc200, 0xffffffff, 0xe0000000,
634a2e73f56SAlex Deucher 	0xa0d4, 0xffffffff, 0x3a00161a,
635a2e73f56SAlex Deucher 	0xa0d5, 0xffffffff, 0x0000002e,
636a2e73f56SAlex Deucher 	0x2684, 0xffffffff, 0x00018208,
637a2e73f56SAlex Deucher 	0x263e, 0xffffffff, 0x12011003
638a2e73f56SAlex Deucher };
639a2e73f56SAlex Deucher 
640a2e73f56SAlex Deucher static const u32 hawaii_golden_registers[] =
641a2e73f56SAlex Deucher {
642a2e73f56SAlex Deucher 	0xcd5, 0x00000333, 0x00000333,
643a2e73f56SAlex Deucher 	0x2684, 0x00010000, 0x00058208,
644a2e73f56SAlex Deucher 	0x260c, 0xffffffff, 0x00000000,
645a2e73f56SAlex Deucher 	0x260d, 0xf00fffff, 0x00000400,
646a2e73f56SAlex Deucher 	0x260e, 0x0002021c, 0x00020200,
647a2e73f56SAlex Deucher 	0x31e, 0x00000080, 0x00000000,
648a2e73f56SAlex Deucher 	0x16ec, 0x000000f0, 0x00000070,
649a2e73f56SAlex Deucher 	0x16f0, 0xf0311fff, 0x80300000,
650a2e73f56SAlex Deucher 	0xd43, 0x00810000, 0x408af000,
651a2e73f56SAlex Deucher 	0x1c0c, 0x31000111, 0x00000011,
652a2e73f56SAlex Deucher 	0xbd2, 0x73773777, 0x12010001,
653a2e73f56SAlex Deucher 	0x848, 0x0000007f, 0x0000001b,
654a2e73f56SAlex Deucher 	0x877, 0x00007fb6, 0x00002191,
655a2e73f56SAlex Deucher 	0xd8a, 0x0000003f, 0x0000000a,
656a2e73f56SAlex Deucher 	0xd8b, 0x0000003f, 0x0000000a,
657a2e73f56SAlex Deucher 	0xab9, 0x00073ffe, 0x000022a2,
658a2e73f56SAlex Deucher 	0x903, 0x000007ff, 0x00000000,
659a2e73f56SAlex Deucher 	0x22fc, 0x00002001, 0x00000001,
660a2e73f56SAlex Deucher 	0x22c9, 0xffffffff, 0x00ffffff,
661a2e73f56SAlex Deucher 	0xc281, 0x0000ff0f, 0x00000000,
662a2e73f56SAlex Deucher 	0xa293, 0x07ffffff, 0x06000000,
663a2e73f56SAlex Deucher 	0xf9e, 0x00000001, 0x00000002,
664a2e73f56SAlex Deucher 	0x31da, 0x00000008, 0x00000008,
665a2e73f56SAlex Deucher 	0x31dc, 0x00000f00, 0x00000800,
666a2e73f56SAlex Deucher 	0x31dd, 0x00000f00, 0x00000800,
667a2e73f56SAlex Deucher 	0x31e6, 0x00ffffff, 0x00ff7fbf,
668a2e73f56SAlex Deucher 	0x31e7, 0x00ffffff, 0x00ff7faf,
669a2e73f56SAlex Deucher 	0x2300, 0x000000ff, 0x00000800,
670a2e73f56SAlex Deucher 	0x390, 0x00001fff, 0x00001fff,
671a2e73f56SAlex Deucher 	0x2418, 0x0000007f, 0x00000020,
672a2e73f56SAlex Deucher 	0x2542, 0x00010000, 0x00010000,
673a2e73f56SAlex Deucher 	0x2b80, 0x00100000, 0x000ff07c,
674a2e73f56SAlex Deucher 	0x2b05, 0x000003ff, 0x0000000f,
675a2e73f56SAlex Deucher 	0x2b04, 0xffffffff, 0x7564fdec,
676a2e73f56SAlex Deucher 	0x2b03, 0xffffffff, 0x3120b9a8,
677a2e73f56SAlex Deucher 	0x2b02, 0x20000000, 0x0f9c0000
678a2e73f56SAlex Deucher };
679a2e73f56SAlex Deucher 
680a2e73f56SAlex Deucher static const u32 hawaii_mgcg_cgcg_init[] =
681a2e73f56SAlex Deucher {
682a2e73f56SAlex Deucher 	0x3108, 0xffffffff, 0xfffffffd,
683a2e73f56SAlex Deucher 	0xc200, 0xffffffff, 0xe0000000,
684a2e73f56SAlex Deucher 	0xf0a8, 0xffffffff, 0x00000100,
685a2e73f56SAlex Deucher 	0xf082, 0xffffffff, 0x00000100,
686a2e73f56SAlex Deucher 	0xf0b0, 0xffffffff, 0x00000100,
687a2e73f56SAlex Deucher 	0xf0b2, 0xffffffff, 0x00000100,
688a2e73f56SAlex Deucher 	0xf0b1, 0xffffffff, 0x00000100,
689a2e73f56SAlex Deucher 	0x1579, 0xffffffff, 0x00200100,
690a2e73f56SAlex Deucher 	0xf0a0, 0xffffffff, 0x00000100,
691a2e73f56SAlex Deucher 	0xf085, 0xffffffff, 0x06000100,
692a2e73f56SAlex Deucher 	0xf088, 0xffffffff, 0x00000100,
693a2e73f56SAlex Deucher 	0xf086, 0xffffffff, 0x06000100,
694a2e73f56SAlex Deucher 	0xf081, 0xffffffff, 0x00000100,
695a2e73f56SAlex Deucher 	0xf0b8, 0xffffffff, 0x00000100,
696a2e73f56SAlex Deucher 	0xf089, 0xffffffff, 0x00000100,
697a2e73f56SAlex Deucher 	0xf080, 0xffffffff, 0x00000100,
698a2e73f56SAlex Deucher 	0xf08c, 0xffffffff, 0x00000100,
699a2e73f56SAlex Deucher 	0xf08d, 0xffffffff, 0x00000100,
700a2e73f56SAlex Deucher 	0xf094, 0xffffffff, 0x00000100,
701a2e73f56SAlex Deucher 	0xf095, 0xffffffff, 0x00000100,
702a2e73f56SAlex Deucher 	0xf096, 0xffffffff, 0x00000100,
703a2e73f56SAlex Deucher 	0xf097, 0xffffffff, 0x00000100,
704a2e73f56SAlex Deucher 	0xf098, 0xffffffff, 0x00000100,
705a2e73f56SAlex Deucher 	0xf09f, 0xffffffff, 0x00000100,
706a2e73f56SAlex Deucher 	0xf09e, 0xffffffff, 0x00000100,
707a2e73f56SAlex Deucher 	0xf084, 0xffffffff, 0x06000100,
708a2e73f56SAlex Deucher 	0xf0a4, 0xffffffff, 0x00000100,
709a2e73f56SAlex Deucher 	0xf09d, 0xffffffff, 0x00000100,
710a2e73f56SAlex Deucher 	0xf0ad, 0xffffffff, 0x00000100,
711a2e73f56SAlex Deucher 	0xf0ac, 0xffffffff, 0x00000100,
712a2e73f56SAlex Deucher 	0xf09c, 0xffffffff, 0x00000100,
713a2e73f56SAlex Deucher 	0xc200, 0xffffffff, 0xe0000000,
714a2e73f56SAlex Deucher 	0xf008, 0xffffffff, 0x00010000,
715a2e73f56SAlex Deucher 	0xf009, 0xffffffff, 0x00030002,
716a2e73f56SAlex Deucher 	0xf00a, 0xffffffff, 0x00040007,
717a2e73f56SAlex Deucher 	0xf00b, 0xffffffff, 0x00060005,
718a2e73f56SAlex Deucher 	0xf00c, 0xffffffff, 0x00090008,
719a2e73f56SAlex Deucher 	0xf00d, 0xffffffff, 0x00010000,
720a2e73f56SAlex Deucher 	0xf00e, 0xffffffff, 0x00030002,
721a2e73f56SAlex Deucher 	0xf00f, 0xffffffff, 0x00040007,
722a2e73f56SAlex Deucher 	0xf010, 0xffffffff, 0x00060005,
723a2e73f56SAlex Deucher 	0xf011, 0xffffffff, 0x00090008,
724a2e73f56SAlex Deucher 	0xf012, 0xffffffff, 0x00010000,
725a2e73f56SAlex Deucher 	0xf013, 0xffffffff, 0x00030002,
726a2e73f56SAlex Deucher 	0xf014, 0xffffffff, 0x00040007,
727a2e73f56SAlex Deucher 	0xf015, 0xffffffff, 0x00060005,
728a2e73f56SAlex Deucher 	0xf016, 0xffffffff, 0x00090008,
729a2e73f56SAlex Deucher 	0xf017, 0xffffffff, 0x00010000,
730a2e73f56SAlex Deucher 	0xf018, 0xffffffff, 0x00030002,
731a2e73f56SAlex Deucher 	0xf019, 0xffffffff, 0x00040007,
732a2e73f56SAlex Deucher 	0xf01a, 0xffffffff, 0x00060005,
733a2e73f56SAlex Deucher 	0xf01b, 0xffffffff, 0x00090008,
734a2e73f56SAlex Deucher 	0xf01c, 0xffffffff, 0x00010000,
735a2e73f56SAlex Deucher 	0xf01d, 0xffffffff, 0x00030002,
736a2e73f56SAlex Deucher 	0xf01e, 0xffffffff, 0x00040007,
737a2e73f56SAlex Deucher 	0xf01f, 0xffffffff, 0x00060005,
738a2e73f56SAlex Deucher 	0xf020, 0xffffffff, 0x00090008,
739a2e73f56SAlex Deucher 	0xf021, 0xffffffff, 0x00010000,
740a2e73f56SAlex Deucher 	0xf022, 0xffffffff, 0x00030002,
741a2e73f56SAlex Deucher 	0xf023, 0xffffffff, 0x00040007,
742a2e73f56SAlex Deucher 	0xf024, 0xffffffff, 0x00060005,
743a2e73f56SAlex Deucher 	0xf025, 0xffffffff, 0x00090008,
744a2e73f56SAlex Deucher 	0xf026, 0xffffffff, 0x00010000,
745a2e73f56SAlex Deucher 	0xf027, 0xffffffff, 0x00030002,
746a2e73f56SAlex Deucher 	0xf028, 0xffffffff, 0x00040007,
747a2e73f56SAlex Deucher 	0xf029, 0xffffffff, 0x00060005,
748a2e73f56SAlex Deucher 	0xf02a, 0xffffffff, 0x00090008,
749a2e73f56SAlex Deucher 	0xf02b, 0xffffffff, 0x00010000,
750a2e73f56SAlex Deucher 	0xf02c, 0xffffffff, 0x00030002,
751a2e73f56SAlex Deucher 	0xf02d, 0xffffffff, 0x00040007,
752a2e73f56SAlex Deucher 	0xf02e, 0xffffffff, 0x00060005,
753a2e73f56SAlex Deucher 	0xf02f, 0xffffffff, 0x00090008,
754a2e73f56SAlex Deucher 	0xf030, 0xffffffff, 0x00010000,
755a2e73f56SAlex Deucher 	0xf031, 0xffffffff, 0x00030002,
756a2e73f56SAlex Deucher 	0xf032, 0xffffffff, 0x00040007,
757a2e73f56SAlex Deucher 	0xf033, 0xffffffff, 0x00060005,
758a2e73f56SAlex Deucher 	0xf034, 0xffffffff, 0x00090008,
759a2e73f56SAlex Deucher 	0xf035, 0xffffffff, 0x00010000,
760a2e73f56SAlex Deucher 	0xf036, 0xffffffff, 0x00030002,
761a2e73f56SAlex Deucher 	0xf037, 0xffffffff, 0x00040007,
762a2e73f56SAlex Deucher 	0xf038, 0xffffffff, 0x00060005,
763a2e73f56SAlex Deucher 	0xf039, 0xffffffff, 0x00090008,
764a2e73f56SAlex Deucher 	0xf03a, 0xffffffff, 0x00010000,
765a2e73f56SAlex Deucher 	0xf03b, 0xffffffff, 0x00030002,
766a2e73f56SAlex Deucher 	0xf03c, 0xffffffff, 0x00040007,
767a2e73f56SAlex Deucher 	0xf03d, 0xffffffff, 0x00060005,
768a2e73f56SAlex Deucher 	0xf03e, 0xffffffff, 0x00090008,
769a2e73f56SAlex Deucher 	0x30c6, 0xffffffff, 0x00020200,
770a2e73f56SAlex Deucher 	0xcd4, 0xffffffff, 0x00000200,
771a2e73f56SAlex Deucher 	0x570, 0xffffffff, 0x00000400,
772a2e73f56SAlex Deucher 	0x157a, 0xffffffff, 0x00000000,
773a2e73f56SAlex Deucher 	0xbd4, 0xffffffff, 0x00000902,
774a2e73f56SAlex Deucher 	0xf000, 0xffffffff, 0x96940200,
775a2e73f56SAlex Deucher 	0x21c2, 0xffffffff, 0x00900100,
776a2e73f56SAlex Deucher 	0x3109, 0xffffffff, 0x0020003f,
777a2e73f56SAlex Deucher 	0xe, 0xffffffff, 0x0140001c,
778a2e73f56SAlex Deucher 	0xf, 0x000f0000, 0x000f0000,
779a2e73f56SAlex Deucher 	0x88, 0xffffffff, 0xc060000c,
780a2e73f56SAlex Deucher 	0x89, 0xc0000fff, 0x00000100,
781a2e73f56SAlex Deucher 	0x3e4, 0xffffffff, 0x00000100,
782a2e73f56SAlex Deucher 	0x3e6, 0x00000101, 0x00000000,
783a2e73f56SAlex Deucher 	0x82a, 0xffffffff, 0x00000104,
784a2e73f56SAlex Deucher 	0x1579, 0xff000fff, 0x00000100,
785a2e73f56SAlex Deucher 	0xc33, 0xc0000fff, 0x00000104,
786a2e73f56SAlex Deucher 	0x3079, 0x00000001, 0x00000001,
787a2e73f56SAlex Deucher 	0x3403, 0xff000ff0, 0x00000100,
788a2e73f56SAlex Deucher 	0x3603, 0xff000ff0, 0x00000100
789a2e73f56SAlex Deucher };
790a2e73f56SAlex Deucher 
791a2e73f56SAlex Deucher static const u32 godavari_golden_registers[] =
792a2e73f56SAlex Deucher {
793a2e73f56SAlex Deucher 	0x1579, 0xff607fff, 0xfc000100,
794a2e73f56SAlex Deucher 	0x1bb6, 0x00010101, 0x00010000,
795a2e73f56SAlex Deucher 	0x260c, 0xffffffff, 0x00000000,
796a2e73f56SAlex Deucher 	0x260c0, 0xf00fffff, 0x00000400,
797a2e73f56SAlex Deucher 	0x184c, 0xffffffff, 0x00010000,
798a2e73f56SAlex Deucher 	0x16ec, 0x000000f0, 0x00000070,
799a2e73f56SAlex Deucher 	0x16f0, 0xf0311fff, 0x80300000,
800a2e73f56SAlex Deucher 	0x263e, 0x73773777, 0x12010001,
801a2e73f56SAlex Deucher 	0x263f, 0xffffffff, 0x00000010,
802a2e73f56SAlex Deucher 	0x200c, 0x00001f0f, 0x0000100a,
803a2e73f56SAlex Deucher 	0xbd2, 0x73773777, 0x12010001,
804a2e73f56SAlex Deucher 	0x902, 0x000fffff, 0x000c007f,
805a2e73f56SAlex Deucher 	0x2285, 0xf000003f, 0x00000007,
806a2e73f56SAlex Deucher 	0x22c9, 0xffffffff, 0x00ff0fff,
807a2e73f56SAlex Deucher 	0xc281, 0x0000ff0f, 0x00000000,
808a2e73f56SAlex Deucher 	0xa293, 0x07ffffff, 0x06000000,
809a2e73f56SAlex Deucher 	0x136, 0x00000fff, 0x00000100,
810a2e73f56SAlex Deucher 	0x3405, 0x00010000, 0x00810001,
811a2e73f56SAlex Deucher 	0x3605, 0x00010000, 0x00810001,
812a2e73f56SAlex Deucher 	0xf9e, 0x00000001, 0x00000002,
813a2e73f56SAlex Deucher 	0x31da, 0x00000008, 0x00000008,
814a2e73f56SAlex Deucher 	0x31dc, 0x00000f00, 0x00000800,
815a2e73f56SAlex Deucher 	0x31dd, 0x00000f00, 0x00000800,
816a2e73f56SAlex Deucher 	0x31e6, 0x00ffffff, 0x00ff7fbf,
817a2e73f56SAlex Deucher 	0x31e7, 0x00ffffff, 0x00ff7faf,
818a2e73f56SAlex Deucher 	0x2300, 0x000000ff, 0x00000001,
819a2e73f56SAlex Deucher 	0x853e, 0x01ff01ff, 0x00000002,
820a2e73f56SAlex Deucher 	0x8526, 0x007ff800, 0x00200000,
821a2e73f56SAlex Deucher 	0x8057, 0xffffffff, 0x00000f40,
822a2e73f56SAlex Deucher 	0x2231, 0x001f3ae3, 0x00000082,
823a2e73f56SAlex Deucher 	0x2235, 0x0000001f, 0x00000010,
824a2e73f56SAlex Deucher 	0xc24d, 0xffffffff, 0x00000000
825a2e73f56SAlex Deucher };
826a2e73f56SAlex Deucher 
cik_init_golden_registers(struct amdgpu_device * adev)827a2e73f56SAlex Deucher static void cik_init_golden_registers(struct amdgpu_device *adev)
828a2e73f56SAlex Deucher {
829a2e73f56SAlex Deucher 	/* Some of the registers might be dependent on GRBM_GFX_INDEX */
830a2e73f56SAlex Deucher 	mutex_lock(&adev->grbm_idx_mutex);
831a2e73f56SAlex Deucher 
832a2e73f56SAlex Deucher 	switch (adev->asic_type) {
833a2e73f56SAlex Deucher 	case CHIP_BONAIRE:
8349c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
835a2e73f56SAlex Deucher 							bonaire_mgcg_cgcg_init,
836c47b41a7SChristian König 							ARRAY_SIZE(bonaire_mgcg_cgcg_init));
8379c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
838a2e73f56SAlex Deucher 							bonaire_golden_registers,
839c47b41a7SChristian König 							ARRAY_SIZE(bonaire_golden_registers));
8409c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
841a2e73f56SAlex Deucher 							bonaire_golden_common_registers,
842c47b41a7SChristian König 							ARRAY_SIZE(bonaire_golden_common_registers));
8439c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
844a2e73f56SAlex Deucher 							bonaire_golden_spm_registers,
845c47b41a7SChristian König 							ARRAY_SIZE(bonaire_golden_spm_registers));
846a2e73f56SAlex Deucher 		break;
847a2e73f56SAlex Deucher 	case CHIP_KABINI:
8489c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
849a2e73f56SAlex Deucher 							kalindi_mgcg_cgcg_init,
850c47b41a7SChristian König 							ARRAY_SIZE(kalindi_mgcg_cgcg_init));
8519c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
852a2e73f56SAlex Deucher 							kalindi_golden_registers,
853c47b41a7SChristian König 							ARRAY_SIZE(kalindi_golden_registers));
8549c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
855a2e73f56SAlex Deucher 							kalindi_golden_common_registers,
856c47b41a7SChristian König 							ARRAY_SIZE(kalindi_golden_common_registers));
8579c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
858a2e73f56SAlex Deucher 							kalindi_golden_spm_registers,
859c47b41a7SChristian König 							ARRAY_SIZE(kalindi_golden_spm_registers));
860a2e73f56SAlex Deucher 		break;
861a2e73f56SAlex Deucher 	case CHIP_MULLINS:
8629c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
863a2e73f56SAlex Deucher 							kalindi_mgcg_cgcg_init,
864c47b41a7SChristian König 							ARRAY_SIZE(kalindi_mgcg_cgcg_init));
8659c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
866a2e73f56SAlex Deucher 							godavari_golden_registers,
867c47b41a7SChristian König 							ARRAY_SIZE(godavari_golden_registers));
8689c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
869a2e73f56SAlex Deucher 							kalindi_golden_common_registers,
870c47b41a7SChristian König 							ARRAY_SIZE(kalindi_golden_common_registers));
8719c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
872a2e73f56SAlex Deucher 							kalindi_golden_spm_registers,
873c47b41a7SChristian König 							ARRAY_SIZE(kalindi_golden_spm_registers));
874a2e73f56SAlex Deucher 		break;
875a2e73f56SAlex Deucher 	case CHIP_KAVERI:
8769c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
877a2e73f56SAlex Deucher 							spectre_mgcg_cgcg_init,
878c47b41a7SChristian König 							ARRAY_SIZE(spectre_mgcg_cgcg_init));
8799c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
880a2e73f56SAlex Deucher 							spectre_golden_registers,
881c47b41a7SChristian König 							ARRAY_SIZE(spectre_golden_registers));
8829c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
883a2e73f56SAlex Deucher 							spectre_golden_common_registers,
884c47b41a7SChristian König 							ARRAY_SIZE(spectre_golden_common_registers));
8859c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
886a2e73f56SAlex Deucher 							spectre_golden_spm_registers,
887c47b41a7SChristian König 							ARRAY_SIZE(spectre_golden_spm_registers));
888a2e73f56SAlex Deucher 		break;
889a2e73f56SAlex Deucher 	case CHIP_HAWAII:
8909c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
891a2e73f56SAlex Deucher 							hawaii_mgcg_cgcg_init,
892c47b41a7SChristian König 							ARRAY_SIZE(hawaii_mgcg_cgcg_init));
8939c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
894a2e73f56SAlex Deucher 							hawaii_golden_registers,
895c47b41a7SChristian König 							ARRAY_SIZE(hawaii_golden_registers));
8969c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
897a2e73f56SAlex Deucher 							hawaii_golden_common_registers,
898c47b41a7SChristian König 							ARRAY_SIZE(hawaii_golden_common_registers));
8999c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
900a2e73f56SAlex Deucher 							hawaii_golden_spm_registers,
901c47b41a7SChristian König 							ARRAY_SIZE(hawaii_golden_spm_registers));
902a2e73f56SAlex Deucher 		break;
903a2e73f56SAlex Deucher 	default:
904a2e73f56SAlex Deucher 		break;
905a2e73f56SAlex Deucher 	}
906a2e73f56SAlex Deucher 	mutex_unlock(&adev->grbm_idx_mutex);
907a2e73f56SAlex Deucher }
908a2e73f56SAlex Deucher 
909a2e73f56SAlex Deucher /**
910a2e73f56SAlex Deucher  * cik_get_xclk - get the xclk
911a2e73f56SAlex Deucher  *
912a2e73f56SAlex Deucher  * @adev: amdgpu_device pointer
913a2e73f56SAlex Deucher  *
914a2e73f56SAlex Deucher  * Returns the reference clock used by the gfx engine
915a2e73f56SAlex Deucher  * (CIK).
916a2e73f56SAlex Deucher  */
cik_get_xclk(struct amdgpu_device * adev)917a2e73f56SAlex Deucher static u32 cik_get_xclk(struct amdgpu_device *adev)
918a2e73f56SAlex Deucher {
919a2e73f56SAlex Deucher 	u32 reference_clock = adev->clock.spll.reference_freq;
920a2e73f56SAlex Deucher 
9212f7d10b3SJammy Zhou 	if (adev->flags & AMD_IS_APU) {
922a2e73f56SAlex Deucher 		if (RREG32_SMC(ixGENERAL_PWRMGT) & GENERAL_PWRMGT__GPU_COUNTER_CLK_MASK)
923a2e73f56SAlex Deucher 			return reference_clock / 2;
924a2e73f56SAlex Deucher 	} else {
925a2e73f56SAlex Deucher 		if (RREG32_SMC(ixCG_CLKPIN_CNTL) & CG_CLKPIN_CNTL__XTALIN_DIVIDE_MASK)
926a2e73f56SAlex Deucher 			return reference_clock / 4;
927a2e73f56SAlex Deucher 	}
928a2e73f56SAlex Deucher 	return reference_clock;
929a2e73f56SAlex Deucher }
930a2e73f56SAlex Deucher 
931a2e73f56SAlex Deucher /**
932a2e73f56SAlex Deucher  * cik_srbm_select - select specific register instances
933a2e73f56SAlex Deucher  *
934a2e73f56SAlex Deucher  * @adev: amdgpu_device pointer
935a2e73f56SAlex Deucher  * @me: selected ME (micro engine)
936a2e73f56SAlex Deucher  * @pipe: pipe
937a2e73f56SAlex Deucher  * @queue: queue
938a2e73f56SAlex Deucher  * @vmid: VMID
939a2e73f56SAlex Deucher  *
940a2e73f56SAlex Deucher  * Switches the currently active registers instances.  Some
941a2e73f56SAlex Deucher  * registers are instanced per VMID, others are instanced per
942a2e73f56SAlex Deucher  * me/pipe/queue combination.
943a2e73f56SAlex Deucher  */
cik_srbm_select(struct amdgpu_device * adev,u32 me,u32 pipe,u32 queue,u32 vmid)944a2e73f56SAlex Deucher void cik_srbm_select(struct amdgpu_device *adev,
945a2e73f56SAlex Deucher 		     u32 me, u32 pipe, u32 queue, u32 vmid)
946a2e73f56SAlex Deucher {
947a2e73f56SAlex Deucher 	u32 srbm_gfx_cntl =
948a2e73f56SAlex Deucher 		(((pipe << SRBM_GFX_CNTL__PIPEID__SHIFT) & SRBM_GFX_CNTL__PIPEID_MASK)|
949a2e73f56SAlex Deucher 		((me << SRBM_GFX_CNTL__MEID__SHIFT) & SRBM_GFX_CNTL__MEID_MASK)|
950a2e73f56SAlex Deucher 		((vmid << SRBM_GFX_CNTL__VMID__SHIFT) & SRBM_GFX_CNTL__VMID_MASK)|
951a2e73f56SAlex Deucher 		((queue << SRBM_GFX_CNTL__QUEUEID__SHIFT) & SRBM_GFX_CNTL__QUEUEID_MASK));
952a2e73f56SAlex Deucher 	WREG32(mmSRBM_GFX_CNTL, srbm_gfx_cntl);
953a2e73f56SAlex Deucher }
954a2e73f56SAlex Deucher 
cik_vga_set_state(struct amdgpu_device * adev,bool state)955a2e73f56SAlex Deucher static void cik_vga_set_state(struct amdgpu_device *adev, bool state)
956a2e73f56SAlex Deucher {
957a2e73f56SAlex Deucher 	uint32_t tmp;
958a2e73f56SAlex Deucher 
959a2e73f56SAlex Deucher 	tmp = RREG32(mmCONFIG_CNTL);
960004e29ccSEdward O'Callaghan 	if (!state)
961a2e73f56SAlex Deucher 		tmp |= CONFIG_CNTL__VGA_DIS_MASK;
962a2e73f56SAlex Deucher 	else
963a2e73f56SAlex Deucher 		tmp &= ~CONFIG_CNTL__VGA_DIS_MASK;
964a2e73f56SAlex Deucher 	WREG32(mmCONFIG_CNTL, tmp);
965a2e73f56SAlex Deucher }
966a2e73f56SAlex Deucher 
cik_read_disabled_bios(struct amdgpu_device * adev)967a2e73f56SAlex Deucher static bool cik_read_disabled_bios(struct amdgpu_device *adev)
968a2e73f56SAlex Deucher {
969a2e73f56SAlex Deucher 	u32 bus_cntl;
970a2e73f56SAlex Deucher 	u32 d1vga_control = 0;
971a2e73f56SAlex Deucher 	u32 d2vga_control = 0;
972a2e73f56SAlex Deucher 	u32 vga_render_control = 0;
973a2e73f56SAlex Deucher 	u32 rom_cntl;
974a2e73f56SAlex Deucher 	bool r;
975a2e73f56SAlex Deucher 
976a2e73f56SAlex Deucher 	bus_cntl = RREG32(mmBUS_CNTL);
977a2e73f56SAlex Deucher 	if (adev->mode_info.num_crtc) {
978a2e73f56SAlex Deucher 		d1vga_control = RREG32(mmD1VGA_CONTROL);
979a2e73f56SAlex Deucher 		d2vga_control = RREG32(mmD2VGA_CONTROL);
980a2e73f56SAlex Deucher 		vga_render_control = RREG32(mmVGA_RENDER_CONTROL);
981a2e73f56SAlex Deucher 	}
982a2e73f56SAlex Deucher 	rom_cntl = RREG32_SMC(ixROM_CNTL);
983a2e73f56SAlex Deucher 
984a2e73f56SAlex Deucher 	/* enable the rom */
985a2e73f56SAlex Deucher 	WREG32(mmBUS_CNTL, (bus_cntl & ~BUS_CNTL__BIOS_ROM_DIS_MASK));
986a2e73f56SAlex Deucher 	if (adev->mode_info.num_crtc) {
987a2e73f56SAlex Deucher 		/* Disable VGA mode */
988a2e73f56SAlex Deucher 		WREG32(mmD1VGA_CONTROL,
989a2e73f56SAlex Deucher 		       (d1vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
990a2e73f56SAlex Deucher 					  D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
991a2e73f56SAlex Deucher 		WREG32(mmD2VGA_CONTROL,
992a2e73f56SAlex Deucher 		       (d2vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
993a2e73f56SAlex Deucher 					  D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
994a2e73f56SAlex Deucher 		WREG32(mmVGA_RENDER_CONTROL,
995a2e73f56SAlex Deucher 		       (vga_render_control & ~VGA_RENDER_CONTROL__VGA_VSTATUS_CNTL_MASK));
996a2e73f56SAlex Deucher 	}
997a2e73f56SAlex Deucher 	WREG32_SMC(ixROM_CNTL, rom_cntl | ROM_CNTL__SCK_OVERWRITE_MASK);
998a2e73f56SAlex Deucher 
999a2e73f56SAlex Deucher 	r = amdgpu_read_bios(adev);
1000a2e73f56SAlex Deucher 
1001a2e73f56SAlex Deucher 	/* restore regs */
1002a2e73f56SAlex Deucher 	WREG32(mmBUS_CNTL, bus_cntl);
1003a2e73f56SAlex Deucher 	if (adev->mode_info.num_crtc) {
1004a2e73f56SAlex Deucher 		WREG32(mmD1VGA_CONTROL, d1vga_control);
1005a2e73f56SAlex Deucher 		WREG32(mmD2VGA_CONTROL, d2vga_control);
1006a2e73f56SAlex Deucher 		WREG32(mmVGA_RENDER_CONTROL, vga_render_control);
1007a2e73f56SAlex Deucher 	}
1008a2e73f56SAlex Deucher 	WREG32_SMC(ixROM_CNTL, rom_cntl);
1009a2e73f56SAlex Deucher 	return r;
1010a2e73f56SAlex Deucher }
1011a2e73f56SAlex Deucher 
cik_read_bios_from_rom(struct amdgpu_device * adev,u8 * bios,u32 length_bytes)10121eb22bd3SAlex Deucher static bool cik_read_bios_from_rom(struct amdgpu_device *adev,
10131eb22bd3SAlex Deucher 				   u8 *bios, u32 length_bytes)
10141eb22bd3SAlex Deucher {
10151eb22bd3SAlex Deucher 	u32 *dw_ptr;
10161eb22bd3SAlex Deucher 	unsigned long flags;
10171eb22bd3SAlex Deucher 	u32 i, length_dw;
10181eb22bd3SAlex Deucher 
10191eb22bd3SAlex Deucher 	if (bios == NULL)
10201eb22bd3SAlex Deucher 		return false;
10211eb22bd3SAlex Deucher 	if (length_bytes == 0)
10221eb22bd3SAlex Deucher 		return false;
10231eb22bd3SAlex Deucher 	/* APU vbios image is part of sbios image */
10241eb22bd3SAlex Deucher 	if (adev->flags & AMD_IS_APU)
10251eb22bd3SAlex Deucher 		return false;
10261eb22bd3SAlex Deucher 
10271eb22bd3SAlex Deucher 	dw_ptr = (u32 *)bios;
10281eb22bd3SAlex Deucher 	length_dw = ALIGN(length_bytes, 4) / 4;
10291eb22bd3SAlex Deucher 	/* take the smc lock since we are using the smc index */
10301eb22bd3SAlex Deucher 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
10311eb22bd3SAlex Deucher 	/* set rom index to 0 */
10321eb22bd3SAlex Deucher 	WREG32(mmSMC_IND_INDEX_0, ixROM_INDEX);
10331eb22bd3SAlex Deucher 	WREG32(mmSMC_IND_DATA_0, 0);
10341eb22bd3SAlex Deucher 	/* set index to data for continous read */
10351eb22bd3SAlex Deucher 	WREG32(mmSMC_IND_INDEX_0, ixROM_DATA);
10361eb22bd3SAlex Deucher 	for (i = 0; i < length_dw; i++)
10371eb22bd3SAlex Deucher 		dw_ptr[i] = RREG32(mmSMC_IND_DATA_0);
10381eb22bd3SAlex Deucher 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
10391eb22bd3SAlex Deucher 
10401eb22bd3SAlex Deucher 	return true;
10411eb22bd3SAlex Deucher }
10421eb22bd3SAlex Deucher 
1043eca2240fSNils Wallménius static const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = {
104497fcc76bSChristian König 	{mmGRBM_STATUS},
1045664fe85aSMarek Olšák 	{mmGRBM_STATUS2},
1046664fe85aSMarek Olšák 	{mmGRBM_STATUS_SE0},
1047664fe85aSMarek Olšák 	{mmGRBM_STATUS_SE1},
1048664fe85aSMarek Olšák 	{mmGRBM_STATUS_SE2},
1049664fe85aSMarek Olšák 	{mmGRBM_STATUS_SE3},
1050664fe85aSMarek Olšák 	{mmSRBM_STATUS},
1051664fe85aSMarek Olšák 	{mmSRBM_STATUS2},
1052664fe85aSMarek Olšák 	{mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET},
1053664fe85aSMarek Olšák 	{mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET},
1054664fe85aSMarek Olšák 	{mmCP_STAT},
1055664fe85aSMarek Olšák 	{mmCP_STALLED_STAT1},
1056664fe85aSMarek Olšák 	{mmCP_STALLED_STAT2},
1057664fe85aSMarek Olšák 	{mmCP_STALLED_STAT3},
1058664fe85aSMarek Olšák 	{mmCP_CPF_BUSY_STAT},
1059664fe85aSMarek Olšák 	{mmCP_CPF_STALLED_STAT1},
1060664fe85aSMarek Olšák 	{mmCP_CPF_STATUS},
1061664fe85aSMarek Olšák 	{mmCP_CPC_BUSY_STAT},
1062664fe85aSMarek Olšák 	{mmCP_CPC_STALLED_STAT1},
1063664fe85aSMarek Olšák 	{mmCP_CPC_STATUS},
106497fcc76bSChristian König 	{mmGB_ADDR_CONFIG},
106597fcc76bSChristian König 	{mmMC_ARB_RAMCFG},
106697fcc76bSChristian König 	{mmGB_TILE_MODE0},
106797fcc76bSChristian König 	{mmGB_TILE_MODE1},
106897fcc76bSChristian König 	{mmGB_TILE_MODE2},
106997fcc76bSChristian König 	{mmGB_TILE_MODE3},
107097fcc76bSChristian König 	{mmGB_TILE_MODE4},
107197fcc76bSChristian König 	{mmGB_TILE_MODE5},
107297fcc76bSChristian König 	{mmGB_TILE_MODE6},
107397fcc76bSChristian König 	{mmGB_TILE_MODE7},
107497fcc76bSChristian König 	{mmGB_TILE_MODE8},
107597fcc76bSChristian König 	{mmGB_TILE_MODE9},
107697fcc76bSChristian König 	{mmGB_TILE_MODE10},
107797fcc76bSChristian König 	{mmGB_TILE_MODE11},
107897fcc76bSChristian König 	{mmGB_TILE_MODE12},
107997fcc76bSChristian König 	{mmGB_TILE_MODE13},
108097fcc76bSChristian König 	{mmGB_TILE_MODE14},
108197fcc76bSChristian König 	{mmGB_TILE_MODE15},
108297fcc76bSChristian König 	{mmGB_TILE_MODE16},
108397fcc76bSChristian König 	{mmGB_TILE_MODE17},
108497fcc76bSChristian König 	{mmGB_TILE_MODE18},
108597fcc76bSChristian König 	{mmGB_TILE_MODE19},
108697fcc76bSChristian König 	{mmGB_TILE_MODE20},
108797fcc76bSChristian König 	{mmGB_TILE_MODE21},
108897fcc76bSChristian König 	{mmGB_TILE_MODE22},
108997fcc76bSChristian König 	{mmGB_TILE_MODE23},
109097fcc76bSChristian König 	{mmGB_TILE_MODE24},
109197fcc76bSChristian König 	{mmGB_TILE_MODE25},
109297fcc76bSChristian König 	{mmGB_TILE_MODE26},
109397fcc76bSChristian König 	{mmGB_TILE_MODE27},
109497fcc76bSChristian König 	{mmGB_TILE_MODE28},
109597fcc76bSChristian König 	{mmGB_TILE_MODE29},
109697fcc76bSChristian König 	{mmGB_TILE_MODE30},
109797fcc76bSChristian König 	{mmGB_TILE_MODE31},
109897fcc76bSChristian König 	{mmGB_MACROTILE_MODE0},
109997fcc76bSChristian König 	{mmGB_MACROTILE_MODE1},
110097fcc76bSChristian König 	{mmGB_MACROTILE_MODE2},
110197fcc76bSChristian König 	{mmGB_MACROTILE_MODE3},
110297fcc76bSChristian König 	{mmGB_MACROTILE_MODE4},
110397fcc76bSChristian König 	{mmGB_MACROTILE_MODE5},
110497fcc76bSChristian König 	{mmGB_MACROTILE_MODE6},
110597fcc76bSChristian König 	{mmGB_MACROTILE_MODE7},
110697fcc76bSChristian König 	{mmGB_MACROTILE_MODE8},
110797fcc76bSChristian König 	{mmGB_MACROTILE_MODE9},
110897fcc76bSChristian König 	{mmGB_MACROTILE_MODE10},
110997fcc76bSChristian König 	{mmGB_MACROTILE_MODE11},
111097fcc76bSChristian König 	{mmGB_MACROTILE_MODE12},
111197fcc76bSChristian König 	{mmGB_MACROTILE_MODE13},
111297fcc76bSChristian König 	{mmGB_MACROTILE_MODE14},
111397fcc76bSChristian König 	{mmGB_MACROTILE_MODE15},
111497fcc76bSChristian König 	{mmCC_RB_BACKEND_DISABLE, true},
111597fcc76bSChristian König 	{mmGC_USER_RB_BACKEND_DISABLE, true},
111697fcc76bSChristian König 	{mmGB_BACKEND_MAP, false},
111797fcc76bSChristian König 	{mmPA_SC_RASTER_CONFIG, true},
111897fcc76bSChristian König 	{mmPA_SC_RASTER_CONFIG_1, true},
1119a2e73f56SAlex Deucher };
1120a2e73f56SAlex Deucher 
1121aca31681SAlex Deucher 
cik_get_register_value(struct amdgpu_device * adev,bool indexed,u32 se_num,u32 sh_num,u32 reg_offset)1122aca31681SAlex Deucher static uint32_t cik_get_register_value(struct amdgpu_device *adev,
1123aca31681SAlex Deucher 				       bool indexed, u32 se_num,
1124aca31681SAlex Deucher 				       u32 sh_num, u32 reg_offset)
1125a2e73f56SAlex Deucher {
1126aca31681SAlex Deucher 	if (indexed) {
1127a2e73f56SAlex Deucher 		uint32_t val;
1128aca31681SAlex Deucher 		unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
1129aca31681SAlex Deucher 		unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
1130aca31681SAlex Deucher 
1131aca31681SAlex Deucher 		switch (reg_offset) {
1132aca31681SAlex Deucher 		case mmCC_RB_BACKEND_DISABLE:
1133aca31681SAlex Deucher 			return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
1134aca31681SAlex Deucher 		case mmGC_USER_RB_BACKEND_DISABLE:
1135aca31681SAlex Deucher 			return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
1136aca31681SAlex Deucher 		case mmPA_SC_RASTER_CONFIG:
1137aca31681SAlex Deucher 			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
1138aca31681SAlex Deucher 		case mmPA_SC_RASTER_CONFIG_1:
1139aca31681SAlex Deucher 			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config_1;
1140aca31681SAlex Deucher 		}
1141a2e73f56SAlex Deucher 
1142a2e73f56SAlex Deucher 		mutex_lock(&adev->grbm_idx_mutex);
1143a2e73f56SAlex Deucher 		if (se_num != 0xffffffff || sh_num != 0xffffffff)
1144d51ac6d0SLe Ma 			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff, 0);
1145a2e73f56SAlex Deucher 
1146a2e73f56SAlex Deucher 		val = RREG32(reg_offset);
1147a2e73f56SAlex Deucher 
1148a2e73f56SAlex Deucher 		if (se_num != 0xffffffff || sh_num != 0xffffffff)
1149d51ac6d0SLe Ma 			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
1150a2e73f56SAlex Deucher 		mutex_unlock(&adev->grbm_idx_mutex);
1151a2e73f56SAlex Deucher 		return val;
1152aca31681SAlex Deucher 	} else {
1153aca31681SAlex Deucher 		unsigned idx;
1154aca31681SAlex Deucher 
1155aca31681SAlex Deucher 		switch (reg_offset) {
1156aca31681SAlex Deucher 		case mmGB_ADDR_CONFIG:
1157aca31681SAlex Deucher 			return adev->gfx.config.gb_addr_config;
1158aca31681SAlex Deucher 		case mmMC_ARB_RAMCFG:
1159aca31681SAlex Deucher 			return adev->gfx.config.mc_arb_ramcfg;
1160aca31681SAlex Deucher 		case mmGB_TILE_MODE0:
1161aca31681SAlex Deucher 		case mmGB_TILE_MODE1:
1162aca31681SAlex Deucher 		case mmGB_TILE_MODE2:
1163aca31681SAlex Deucher 		case mmGB_TILE_MODE3:
1164aca31681SAlex Deucher 		case mmGB_TILE_MODE4:
1165aca31681SAlex Deucher 		case mmGB_TILE_MODE5:
1166aca31681SAlex Deucher 		case mmGB_TILE_MODE6:
1167aca31681SAlex Deucher 		case mmGB_TILE_MODE7:
1168aca31681SAlex Deucher 		case mmGB_TILE_MODE8:
1169aca31681SAlex Deucher 		case mmGB_TILE_MODE9:
1170aca31681SAlex Deucher 		case mmGB_TILE_MODE10:
1171aca31681SAlex Deucher 		case mmGB_TILE_MODE11:
1172aca31681SAlex Deucher 		case mmGB_TILE_MODE12:
1173aca31681SAlex Deucher 		case mmGB_TILE_MODE13:
1174aca31681SAlex Deucher 		case mmGB_TILE_MODE14:
1175aca31681SAlex Deucher 		case mmGB_TILE_MODE15:
1176aca31681SAlex Deucher 		case mmGB_TILE_MODE16:
1177aca31681SAlex Deucher 		case mmGB_TILE_MODE17:
1178aca31681SAlex Deucher 		case mmGB_TILE_MODE18:
1179aca31681SAlex Deucher 		case mmGB_TILE_MODE19:
1180aca31681SAlex Deucher 		case mmGB_TILE_MODE20:
1181aca31681SAlex Deucher 		case mmGB_TILE_MODE21:
1182aca31681SAlex Deucher 		case mmGB_TILE_MODE22:
1183aca31681SAlex Deucher 		case mmGB_TILE_MODE23:
1184aca31681SAlex Deucher 		case mmGB_TILE_MODE24:
1185aca31681SAlex Deucher 		case mmGB_TILE_MODE25:
1186aca31681SAlex Deucher 		case mmGB_TILE_MODE26:
1187aca31681SAlex Deucher 		case mmGB_TILE_MODE27:
1188aca31681SAlex Deucher 		case mmGB_TILE_MODE28:
1189aca31681SAlex Deucher 		case mmGB_TILE_MODE29:
1190aca31681SAlex Deucher 		case mmGB_TILE_MODE30:
1191aca31681SAlex Deucher 		case mmGB_TILE_MODE31:
1192aca31681SAlex Deucher 			idx = (reg_offset - mmGB_TILE_MODE0);
1193aca31681SAlex Deucher 			return adev->gfx.config.tile_mode_array[idx];
1194aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE0:
1195aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE1:
1196aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE2:
1197aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE3:
1198aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE4:
1199aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE5:
1200aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE6:
1201aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE7:
1202aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE8:
1203aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE9:
1204aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE10:
1205aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE11:
1206aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE12:
1207aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE13:
1208aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE14:
1209aca31681SAlex Deucher 		case mmGB_MACROTILE_MODE15:
1210aca31681SAlex Deucher 			idx = (reg_offset - mmGB_MACROTILE_MODE0);
1211aca31681SAlex Deucher 			return adev->gfx.config.macrotile_mode_array[idx];
1212aca31681SAlex Deucher 		default:
1213aca31681SAlex Deucher 			return RREG32(reg_offset);
1214aca31681SAlex Deucher 		}
1215aca31681SAlex Deucher 	}
1216a2e73f56SAlex Deucher }
1217a2e73f56SAlex Deucher 
cik_read_register(struct amdgpu_device * adev,u32 se_num,u32 sh_num,u32 reg_offset,u32 * value)1218a2e73f56SAlex Deucher static int cik_read_register(struct amdgpu_device *adev, u32 se_num,
1219a2e73f56SAlex Deucher 			     u32 sh_num, u32 reg_offset, u32 *value)
1220a2e73f56SAlex Deucher {
1221a2e73f56SAlex Deucher 	uint32_t i;
1222a2e73f56SAlex Deucher 
1223a2e73f56SAlex Deucher 	*value = 0;
1224a2e73f56SAlex Deucher 	for (i = 0; i < ARRAY_SIZE(cik_allowed_read_registers); i++) {
1225aca31681SAlex Deucher 		bool indexed = cik_allowed_read_registers[i].grbm_indexed;
1226aca31681SAlex Deucher 
1227a2e73f56SAlex Deucher 		if (reg_offset != cik_allowed_read_registers[i].reg_offset)
1228a2e73f56SAlex Deucher 			continue;
1229a2e73f56SAlex Deucher 
1230aca31681SAlex Deucher 		*value = cik_get_register_value(adev, indexed, se_num, sh_num,
1231aca31681SAlex Deucher 						reg_offset);
1232a2e73f56SAlex Deucher 		return 0;
1233a2e73f56SAlex Deucher 	}
1234a2e73f56SAlex Deucher 	return -EINVAL;
1235a2e73f56SAlex Deucher }
1236a2e73f56SAlex Deucher 
1237a2e73f56SAlex Deucher struct kv_reset_save_regs {
1238a2e73f56SAlex Deucher 	u32 gmcon_reng_execute;
1239a2e73f56SAlex Deucher 	u32 gmcon_misc;
1240a2e73f56SAlex Deucher 	u32 gmcon_misc3;
1241a2e73f56SAlex Deucher };
1242a2e73f56SAlex Deucher 
kv_save_regs_for_reset(struct amdgpu_device * adev,struct kv_reset_save_regs * save)1243a2e73f56SAlex Deucher static void kv_save_regs_for_reset(struct amdgpu_device *adev,
1244a2e73f56SAlex Deucher 				   struct kv_reset_save_regs *save)
1245a2e73f56SAlex Deucher {
1246a2e73f56SAlex Deucher 	save->gmcon_reng_execute = RREG32(mmGMCON_RENG_EXECUTE);
1247a2e73f56SAlex Deucher 	save->gmcon_misc = RREG32(mmGMCON_MISC);
1248a2e73f56SAlex Deucher 	save->gmcon_misc3 = RREG32(mmGMCON_MISC3);
1249a2e73f56SAlex Deucher 
1250a2e73f56SAlex Deucher 	WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute &
1251a2e73f56SAlex Deucher 		~GMCON_RENG_EXECUTE__RENG_EXECUTE_ON_PWR_UP_MASK);
1252a2e73f56SAlex Deucher 	WREG32(mmGMCON_MISC, save->gmcon_misc &
1253a2e73f56SAlex Deucher 		~(GMCON_MISC__RENG_EXECUTE_ON_REG_UPDATE_MASK |
1254a2e73f56SAlex Deucher 			GMCON_MISC__STCTRL_STUTTER_EN_MASK));
1255a2e73f56SAlex Deucher }
1256a2e73f56SAlex Deucher 
kv_restore_regs_for_reset(struct amdgpu_device * adev,struct kv_reset_save_regs * save)1257a2e73f56SAlex Deucher static void kv_restore_regs_for_reset(struct amdgpu_device *adev,
1258a2e73f56SAlex Deucher 				      struct kv_reset_save_regs *save)
1259a2e73f56SAlex Deucher {
1260a2e73f56SAlex Deucher 	int i;
1261a2e73f56SAlex Deucher 
1262a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_WRITE, 0);
1263a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_CONFIG, 0x200010ff);
1264a2e73f56SAlex Deucher 
1265a2e73f56SAlex Deucher 	for (i = 0; i < 5; i++)
1266a2e73f56SAlex Deucher 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1267a2e73f56SAlex Deucher 
1268a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_WRITE, 0);
1269a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_CONFIG, 0x300010ff);
1270a2e73f56SAlex Deucher 
1271a2e73f56SAlex Deucher 	for (i = 0; i < 5; i++)
1272a2e73f56SAlex Deucher 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1273a2e73f56SAlex Deucher 
1274a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_WRITE, 0x210000);
1275a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_CONFIG, 0xa00010ff);
1276a2e73f56SAlex Deucher 
1277a2e73f56SAlex Deucher 	for (i = 0; i < 5; i++)
1278a2e73f56SAlex Deucher 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1279a2e73f56SAlex Deucher 
1280a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_WRITE, 0x21003);
1281a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_CONFIG, 0xb00010ff);
1282a2e73f56SAlex Deucher 
1283a2e73f56SAlex Deucher 	for (i = 0; i < 5; i++)
1284a2e73f56SAlex Deucher 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1285a2e73f56SAlex Deucher 
1286a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_WRITE, 0x2b00);
1287a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_CONFIG, 0xc00010ff);
1288a2e73f56SAlex Deucher 
1289a2e73f56SAlex Deucher 	for (i = 0; i < 5; i++)
1290a2e73f56SAlex Deucher 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1291a2e73f56SAlex Deucher 
1292a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_WRITE, 0);
1293a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_CONFIG, 0xd00010ff);
1294a2e73f56SAlex Deucher 
1295a2e73f56SAlex Deucher 	for (i = 0; i < 5; i++)
1296a2e73f56SAlex Deucher 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1297a2e73f56SAlex Deucher 
1298a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_WRITE, 0x420000);
1299a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_CONFIG, 0x100010ff);
1300a2e73f56SAlex Deucher 
1301a2e73f56SAlex Deucher 	for (i = 0; i < 5; i++)
1302a2e73f56SAlex Deucher 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1303a2e73f56SAlex Deucher 
1304a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_WRITE, 0x120202);
1305a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_CONFIG, 0x500010ff);
1306a2e73f56SAlex Deucher 
1307a2e73f56SAlex Deucher 	for (i = 0; i < 5; i++)
1308a2e73f56SAlex Deucher 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1309a2e73f56SAlex Deucher 
1310a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_WRITE, 0x3e3e36);
1311a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_CONFIG, 0x600010ff);
1312a2e73f56SAlex Deucher 
1313a2e73f56SAlex Deucher 	for (i = 0; i < 5; i++)
1314a2e73f56SAlex Deucher 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1315a2e73f56SAlex Deucher 
1316a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_WRITE, 0x373f3e);
1317a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_CONFIG, 0x700010ff);
1318a2e73f56SAlex Deucher 
1319a2e73f56SAlex Deucher 	for (i = 0; i < 5; i++)
1320a2e73f56SAlex Deucher 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1321a2e73f56SAlex Deucher 
1322a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_WRITE, 0x3e1332);
1323a2e73f56SAlex Deucher 	WREG32(mmGMCON_PGFSM_CONFIG, 0xe00010ff);
1324a2e73f56SAlex Deucher 
1325a2e73f56SAlex Deucher 	WREG32(mmGMCON_MISC3, save->gmcon_misc3);
1326a2e73f56SAlex Deucher 	WREG32(mmGMCON_MISC, save->gmcon_misc);
1327a2e73f56SAlex Deucher 	WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute);
1328a2e73f56SAlex Deucher }
1329a2e73f56SAlex Deucher 
133044ab8bb0SAlex Deucher /**
133144ab8bb0SAlex Deucher  * cik_asic_pci_config_reset - soft reset GPU
133244ab8bb0SAlex Deucher  *
133344ab8bb0SAlex Deucher  * @adev: amdgpu_device pointer
133444ab8bb0SAlex Deucher  *
133544ab8bb0SAlex Deucher  * Use PCI Config method to reset the GPU.
133644ab8bb0SAlex Deucher  *
133744ab8bb0SAlex Deucher  * Returns 0 for success.
133844ab8bb0SAlex Deucher  */
cik_asic_pci_config_reset(struct amdgpu_device * adev)133944ab8bb0SAlex Deucher static int cik_asic_pci_config_reset(struct amdgpu_device *adev)
1340a2e73f56SAlex Deucher {
1341a2e73f56SAlex Deucher 	struct kv_reset_save_regs kv_save = { 0 };
1342ceb5bc86SAlex Deucher 	u32 i;
134389a31827SChunming Zhou 	int r = -EINVAL;
1344a2e73f56SAlex Deucher 
134544ab8bb0SAlex Deucher 	amdgpu_atombios_scratch_regs_engine_hung(adev, true);
1346a2e73f56SAlex Deucher 
13472f7d10b3SJammy Zhou 	if (adev->flags & AMD_IS_APU)
1348a2e73f56SAlex Deucher 		kv_save_regs_for_reset(adev, &kv_save);
1349a2e73f56SAlex Deucher 
1350a2e73f56SAlex Deucher 	/* disable BM */
1351a2e73f56SAlex Deucher 	pci_clear_master(adev->pdev);
1352a2e73f56SAlex Deucher 	/* reset */
13538111c387SAlex Deucher 	amdgpu_device_pci_config_reset(adev);
1354a2e73f56SAlex Deucher 
1355a2e73f56SAlex Deucher 	udelay(100);
1356a2e73f56SAlex Deucher 
1357a2e73f56SAlex Deucher 	/* wait for asic to come out of reset */
1358a2e73f56SAlex Deucher 	for (i = 0; i < adev->usec_timeout; i++) {
135989a31827SChunming Zhou 		if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
1360b314f9a9SChunming Zhou 			/* enable BM */
1361b314f9a9SChunming Zhou 			pci_set_master(adev->pdev);
1362c836fec5SJim Qu 			adev->has_hw_reset = true;
136389a31827SChunming Zhou 			r = 0;
1364a2e73f56SAlex Deucher 			break;
136589a31827SChunming Zhou 		}
1366a2e73f56SAlex Deucher 		udelay(1);
1367a2e73f56SAlex Deucher 	}
1368a2e73f56SAlex Deucher 
1369a2e73f56SAlex Deucher 	/* does asic init need to be run first??? */
13702f7d10b3SJammy Zhou 	if (adev->flags & AMD_IS_APU)
1371a2e73f56SAlex Deucher 		kv_restore_regs_for_reset(adev, &kv_save);
137289a31827SChunming Zhou 
137372a57438SAlex Deucher 	amdgpu_atombios_scratch_regs_engine_hung(adev, false);
1374a2e73f56SAlex Deucher 
137589a31827SChunming Zhou 	return r;
1376a2e73f56SAlex Deucher }
1377a2e73f56SAlex Deucher 
cik_asic_supports_baco(struct amdgpu_device * adev)1378b2207dc6SMa Jun static int cik_asic_supports_baco(struct amdgpu_device *adev)
13790d0c07eeSAlex Deucher {
13800d0c07eeSAlex Deucher 	switch (adev->asic_type) {
13810d0c07eeSAlex Deucher 	case CHIP_BONAIRE:
13820d0c07eeSAlex Deucher 	case CHIP_HAWAII:
13839530273eSEvan Quan 		return amdgpu_dpm_is_baco_supported(adev);
13840d0c07eeSAlex Deucher 	default:
1385b2207dc6SMa Jun 		return 0;
13860d0c07eeSAlex Deucher 	}
13870d0c07eeSAlex Deucher }
13880d0c07eeSAlex Deucher 
13896d0f50daSAlex Deucher static enum amd_reset_method
cik_asic_reset_method(struct amdgpu_device * adev)13906d0f50daSAlex Deucher cik_asic_reset_method(struct amdgpu_device *adev)
13916d0f50daSAlex Deucher {
139297c002beSAlex Deucher 	bool baco_reset;
139397c002beSAlex Deucher 
1394273da6ffSWenhui Sheng 	if (amdgpu_reset_method == AMD_RESET_METHOD_LEGACY ||
1395273da6ffSWenhui Sheng 	    amdgpu_reset_method == AMD_RESET_METHOD_BACO)
1396273da6ffSWenhui Sheng 		return amdgpu_reset_method;
1397273da6ffSWenhui Sheng 
1398273da6ffSWenhui Sheng 	if (amdgpu_reset_method != -1)
1399273da6ffSWenhui Sheng 		dev_warn(adev->dev, "Specified reset:%d isn't supported, using AUTO instead.\n",
1400273da6ffSWenhui Sheng 				  amdgpu_reset_method);
1401273da6ffSWenhui Sheng 
140297c002beSAlex Deucher 	switch (adev->asic_type) {
140397c002beSAlex Deucher 	case CHIP_BONAIRE:
14040134022fSEvan Quan 	case CHIP_HAWAII:
14050134022fSEvan Quan 		baco_reset = cik_asic_supports_baco(adev);
14060134022fSEvan Quan 		break;
140797c002beSAlex Deucher 	default:
140897c002beSAlex Deucher 		baco_reset = false;
140997c002beSAlex Deucher 		break;
141097c002beSAlex Deucher 	}
141197c002beSAlex Deucher 
141297c002beSAlex Deucher 	if (baco_reset)
141397c002beSAlex Deucher 		return AMD_RESET_METHOD_BACO;
141497c002beSAlex Deucher 	else
14156d0f50daSAlex Deucher 		return AMD_RESET_METHOD_LEGACY;
14166d0f50daSAlex Deucher }
14176d0f50daSAlex Deucher 
141897c002beSAlex Deucher /**
141997c002beSAlex Deucher  * cik_asic_reset - soft reset GPU
142097c002beSAlex Deucher  *
142197c002beSAlex Deucher  * @adev: amdgpu_device pointer
142297c002beSAlex Deucher  *
142397c002beSAlex Deucher  * Look up which blocks are hung and attempt
142497c002beSAlex Deucher  * to reset them.
142597c002beSAlex Deucher  * Returns 0 for success.
142697c002beSAlex Deucher  */
cik_asic_reset(struct amdgpu_device * adev)142797c002beSAlex Deucher static int cik_asic_reset(struct amdgpu_device *adev)
142897c002beSAlex Deucher {
142997c002beSAlex Deucher 	int r;
143097c002beSAlex Deucher 
1431e8309d50SAlex Deucher 	/* APUs don't have full asic reset */
1432e8309d50SAlex Deucher 	if (adev->flags & AMD_IS_APU)
1433e8309d50SAlex Deucher 		return 0;
1434e8309d50SAlex Deucher 
1435dea8b900SAlex Deucher 	if (cik_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {
143611043b7aSAlex Deucher 		dev_info(adev->dev, "BACO reset\n");
14379530273eSEvan Quan 		r = amdgpu_dpm_baco_reset(adev);
1438dea8b900SAlex Deucher 	} else {
143911043b7aSAlex Deucher 		dev_info(adev->dev, "PCI CONFIG reset\n");
144097c002beSAlex Deucher 		r = cik_asic_pci_config_reset(adev);
1441dea8b900SAlex Deucher 	}
144297c002beSAlex Deucher 
144397c002beSAlex Deucher 	return r;
144497c002beSAlex Deucher }
144597c002beSAlex Deucher 
cik_get_config_memsize(struct amdgpu_device * adev)1446bbf282d8SAlex Deucher static u32 cik_get_config_memsize(struct amdgpu_device *adev)
1447bbf282d8SAlex Deucher {
1448bbf282d8SAlex Deucher 	return RREG32(mmCONFIG_MEMSIZE);
1449bbf282d8SAlex Deucher }
1450bbf282d8SAlex Deucher 
cik_set_uvd_clock(struct amdgpu_device * adev,u32 clock,u32 cntl_reg,u32 status_reg)1451a2e73f56SAlex Deucher static int cik_set_uvd_clock(struct amdgpu_device *adev, u32 clock,
1452a2e73f56SAlex Deucher 			      u32 cntl_reg, u32 status_reg)
1453a2e73f56SAlex Deucher {
1454a2e73f56SAlex Deucher 	int r, i;
1455a2e73f56SAlex Deucher 	struct atom_clock_dividers dividers;
1456a2e73f56SAlex Deucher 	uint32_t tmp;
1457a2e73f56SAlex Deucher 
1458a2e73f56SAlex Deucher 	r = amdgpu_atombios_get_clock_dividers(adev,
1459a2e73f56SAlex Deucher 					       COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
1460a2e73f56SAlex Deucher 					       clock, false, &dividers);
1461a2e73f56SAlex Deucher 	if (r)
1462a2e73f56SAlex Deucher 		return r;
1463a2e73f56SAlex Deucher 
1464a2e73f56SAlex Deucher 	tmp = RREG32_SMC(cntl_reg);
1465a2e73f56SAlex Deucher 	tmp &= ~(CG_DCLK_CNTL__DCLK_DIR_CNTL_EN_MASK |
1466a2e73f56SAlex Deucher 		CG_DCLK_CNTL__DCLK_DIVIDER_MASK);
1467a2e73f56SAlex Deucher 	tmp |= dividers.post_divider;
1468a2e73f56SAlex Deucher 	WREG32_SMC(cntl_reg, tmp);
1469a2e73f56SAlex Deucher 
1470a2e73f56SAlex Deucher 	for (i = 0; i < 100; i++) {
1471a2e73f56SAlex Deucher 		if (RREG32_SMC(status_reg) & CG_DCLK_STATUS__DCLK_STATUS_MASK)
1472a2e73f56SAlex Deucher 			break;
1473a2e73f56SAlex Deucher 		mdelay(10);
1474a2e73f56SAlex Deucher 	}
1475a2e73f56SAlex Deucher 	if (i == 100)
1476a2e73f56SAlex Deucher 		return -ETIMEDOUT;
1477a2e73f56SAlex Deucher 
1478a2e73f56SAlex Deucher 	return 0;
1479a2e73f56SAlex Deucher }
1480a2e73f56SAlex Deucher 
cik_set_uvd_clocks(struct amdgpu_device * adev,u32 vclk,u32 dclk)1481a2e73f56SAlex Deucher static int cik_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1482a2e73f56SAlex Deucher {
1483a2e73f56SAlex Deucher 	int r = 0;
1484a2e73f56SAlex Deucher 
1485a2e73f56SAlex Deucher 	r = cik_set_uvd_clock(adev, vclk, ixCG_VCLK_CNTL, ixCG_VCLK_STATUS);
1486a2e73f56SAlex Deucher 	if (r)
1487a2e73f56SAlex Deucher 		return r;
1488a2e73f56SAlex Deucher 
1489a2e73f56SAlex Deucher 	r = cik_set_uvd_clock(adev, dclk, ixCG_DCLK_CNTL, ixCG_DCLK_STATUS);
1490a2e73f56SAlex Deucher 	return r;
1491a2e73f56SAlex Deucher }
1492a2e73f56SAlex Deucher 
cik_set_vce_clocks(struct amdgpu_device * adev,u32 evclk,u32 ecclk)1493a2e73f56SAlex Deucher static int cik_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
1494a2e73f56SAlex Deucher {
1495a2e73f56SAlex Deucher 	int r, i;
1496a2e73f56SAlex Deucher 	struct atom_clock_dividers dividers;
1497a2e73f56SAlex Deucher 	u32 tmp;
1498a2e73f56SAlex Deucher 
1499a2e73f56SAlex Deucher 	r = amdgpu_atombios_get_clock_dividers(adev,
1500a2e73f56SAlex Deucher 					       COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
1501a2e73f56SAlex Deucher 					       ecclk, false, &dividers);
1502a2e73f56SAlex Deucher 	if (r)
1503a2e73f56SAlex Deucher 		return r;
1504a2e73f56SAlex Deucher 
1505a2e73f56SAlex Deucher 	for (i = 0; i < 100; i++) {
1506a2e73f56SAlex Deucher 		if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
1507a2e73f56SAlex Deucher 			break;
1508a2e73f56SAlex Deucher 		mdelay(10);
1509a2e73f56SAlex Deucher 	}
1510a2e73f56SAlex Deucher 	if (i == 100)
1511a2e73f56SAlex Deucher 		return -ETIMEDOUT;
1512a2e73f56SAlex Deucher 
1513a2e73f56SAlex Deucher 	tmp = RREG32_SMC(ixCG_ECLK_CNTL);
1514a2e73f56SAlex Deucher 	tmp &= ~(CG_ECLK_CNTL__ECLK_DIR_CNTL_EN_MASK |
1515a2e73f56SAlex Deucher 		CG_ECLK_CNTL__ECLK_DIVIDER_MASK);
1516a2e73f56SAlex Deucher 	tmp |= dividers.post_divider;
1517a2e73f56SAlex Deucher 	WREG32_SMC(ixCG_ECLK_CNTL, tmp);
1518a2e73f56SAlex Deucher 
1519a2e73f56SAlex Deucher 	for (i = 0; i < 100; i++) {
1520a2e73f56SAlex Deucher 		if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
1521a2e73f56SAlex Deucher 			break;
1522a2e73f56SAlex Deucher 		mdelay(10);
1523a2e73f56SAlex Deucher 	}
1524a2e73f56SAlex Deucher 	if (i == 100)
1525a2e73f56SAlex Deucher 		return -ETIMEDOUT;
1526a2e73f56SAlex Deucher 
1527a2e73f56SAlex Deucher 	return 0;
1528a2e73f56SAlex Deucher }
1529a2e73f56SAlex Deucher 
cik_pcie_gen3_enable(struct amdgpu_device * adev)1530a2e73f56SAlex Deucher static void cik_pcie_gen3_enable(struct amdgpu_device *adev)
1531a2e73f56SAlex Deucher {
1532a2e73f56SAlex Deucher 	struct pci_dev *root = adev->pdev->bus->self;
1533d0dd7f0cSAlex Deucher 	u32 speed_cntl, current_data_rate;
1534d0dd7f0cSAlex Deucher 	int i;
1535a2e73f56SAlex Deucher 	u16 tmp16;
1536a2e73f56SAlex Deucher 
1537e79d5c08SAlex Deucher 	if (pci_is_root_bus(adev->pdev->bus))
1538e79d5c08SAlex Deucher 		return;
1539e79d5c08SAlex Deucher 
1540a2e73f56SAlex Deucher 	if (amdgpu_pcie_gen2 == 0)
1541a2e73f56SAlex Deucher 		return;
1542a2e73f56SAlex Deucher 
15432f7d10b3SJammy Zhou 	if (adev->flags & AMD_IS_APU)
1544a2e73f56SAlex Deucher 		return;
1545a2e73f56SAlex Deucher 
1546d0dd7f0cSAlex Deucher 	if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
1547d0dd7f0cSAlex Deucher 					CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
1548a2e73f56SAlex Deucher 		return;
1549a2e73f56SAlex Deucher 
1550a2e73f56SAlex Deucher 	speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1551a2e73f56SAlex Deucher 	current_data_rate = (speed_cntl & PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK) >>
1552a2e73f56SAlex Deucher 		PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT;
1553d0dd7f0cSAlex Deucher 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1554a2e73f56SAlex Deucher 		if (current_data_rate == 2) {
1555a2e73f56SAlex Deucher 			DRM_INFO("PCIE gen 3 link speeds already enabled\n");
1556a2e73f56SAlex Deucher 			return;
1557a2e73f56SAlex Deucher 		}
1558a2e73f56SAlex Deucher 		DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
1559d0dd7f0cSAlex Deucher 	} else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
1560a2e73f56SAlex Deucher 		if (current_data_rate == 1) {
1561a2e73f56SAlex Deucher 			DRM_INFO("PCIE gen 2 link speeds already enabled\n");
1562a2e73f56SAlex Deucher 			return;
1563a2e73f56SAlex Deucher 		}
1564a2e73f56SAlex Deucher 		DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
1565a2e73f56SAlex Deucher 	}
1566a2e73f56SAlex Deucher 
156788027c89SFrederick Lawler 	if (!pci_is_pcie(root) || !pci_is_pcie(adev->pdev))
1568a2e73f56SAlex Deucher 		return;
1569a2e73f56SAlex Deucher 
1570d0dd7f0cSAlex Deucher 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1571a2e73f56SAlex Deucher 		/* re-try equalization if gen3 is not already enabled */
1572a2e73f56SAlex Deucher 		if (current_data_rate != 2) {
1573a2e73f56SAlex Deucher 			u16 bridge_cfg, gpu_cfg;
1574a2e73f56SAlex Deucher 			u16 bridge_cfg2, gpu_cfg2;
1575a2e73f56SAlex Deucher 			u32 max_lw, current_lw, tmp;
1576a2e73f56SAlex Deucher 
1577ce7d8811SIlpo Järvinen 			pcie_capability_set_word(root, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
1578ce7d8811SIlpo Järvinen 			pcie_capability_set_word(adev->pdev, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
1579a2e73f56SAlex Deucher 
1580a2e73f56SAlex Deucher 			tmp = RREG32_PCIE(ixPCIE_LC_STATUS1);
1581a2e73f56SAlex Deucher 			max_lw = (tmp & PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH_MASK) >>
1582a2e73f56SAlex Deucher 				PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH__SHIFT;
1583a2e73f56SAlex Deucher 			current_lw = (tmp & PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH_MASK)
1584a2e73f56SAlex Deucher 				>> PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH__SHIFT;
1585a2e73f56SAlex Deucher 
1586a2e73f56SAlex Deucher 			if (current_lw < max_lw) {
1587a2e73f56SAlex Deucher 				tmp = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
1588a2e73f56SAlex Deucher 				if (tmp & PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATION_SUPPORT_MASK) {
1589a2e73f56SAlex Deucher 					tmp &= ~(PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_MASK |
1590a2e73f56SAlex Deucher 						PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_DIS_MASK);
1591a2e73f56SAlex Deucher 					tmp |= (max_lw <<
1592a2e73f56SAlex Deucher 						PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH__SHIFT);
1593a2e73f56SAlex Deucher 					tmp |= PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_SUPPORT_MASK |
1594a2e73f56SAlex Deucher 					PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATE_EN_MASK |
1595a2e73f56SAlex Deucher 					PCIE_LC_LINK_WIDTH_CNTL__LC_RECONFIG_NOW_MASK;
1596a2e73f56SAlex Deucher 					WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, tmp);
1597a2e73f56SAlex Deucher 				}
1598a2e73f56SAlex Deucher 			}
1599a2e73f56SAlex Deucher 
1600a2e73f56SAlex Deucher 			for (i = 0; i < 10; i++) {
1601a2e73f56SAlex Deucher 				/* check status */
160288027c89SFrederick Lawler 				pcie_capability_read_word(adev->pdev,
160388027c89SFrederick Lawler 							  PCI_EXP_DEVSTA,
160488027c89SFrederick Lawler 							  &tmp16);
1605a2e73f56SAlex Deucher 				if (tmp16 & PCI_EXP_DEVSTA_TRPND)
1606a2e73f56SAlex Deucher 					break;
1607a2e73f56SAlex Deucher 
160888027c89SFrederick Lawler 				pcie_capability_read_word(root, PCI_EXP_LNKCTL,
160988027c89SFrederick Lawler 							  &bridge_cfg);
161088027c89SFrederick Lawler 				pcie_capability_read_word(adev->pdev,
161188027c89SFrederick Lawler 							  PCI_EXP_LNKCTL,
161288027c89SFrederick Lawler 							  &gpu_cfg);
1613a2e73f56SAlex Deucher 
161488027c89SFrederick Lawler 				pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
161588027c89SFrederick Lawler 							  &bridge_cfg2);
161688027c89SFrederick Lawler 				pcie_capability_read_word(adev->pdev,
161788027c89SFrederick Lawler 							  PCI_EXP_LNKCTL2,
161888027c89SFrederick Lawler 							  &gpu_cfg2);
1619a2e73f56SAlex Deucher 
1620a2e73f56SAlex Deucher 				tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1621a2e73f56SAlex Deucher 				tmp |= PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
1622a2e73f56SAlex Deucher 				WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1623a2e73f56SAlex Deucher 
1624a2e73f56SAlex Deucher 				tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1625a2e73f56SAlex Deucher 				tmp |= PCIE_LC_CNTL4__LC_REDO_EQ_MASK;
1626a2e73f56SAlex Deucher 				WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1627a2e73f56SAlex Deucher 
1628586092abSJia-Ju Bai 				msleep(100);
1629a2e73f56SAlex Deucher 
1630a2e73f56SAlex Deucher 				/* linkctl */
1631ce7d8811SIlpo Järvinen 				pcie_capability_clear_and_set_word(root, PCI_EXP_LNKCTL,
1632ce7d8811SIlpo Järvinen 								   PCI_EXP_LNKCTL_HAWD,
1633ce7d8811SIlpo Järvinen 								   bridge_cfg &
1634ce7d8811SIlpo Järvinen 								   PCI_EXP_LNKCTL_HAWD);
1635ce7d8811SIlpo Järvinen 				pcie_capability_clear_and_set_word(adev->pdev, PCI_EXP_LNKCTL,
1636ce7d8811SIlpo Järvinen 								   PCI_EXP_LNKCTL_HAWD,
1637ce7d8811SIlpo Järvinen 								   gpu_cfg &
1638ce7d8811SIlpo Järvinen 								   PCI_EXP_LNKCTL_HAWD);
1639a2e73f56SAlex Deucher 
1640a2e73f56SAlex Deucher 				/* linkctl2 */
1641bb87e511SIlpo Järvinen 				pcie_capability_clear_and_set_word(root, PCI_EXP_LNKCTL2,
1642bb87e511SIlpo Järvinen 								   PCI_EXP_LNKCTL2_ENTER_COMP |
1643bb87e511SIlpo Järvinen 								   PCI_EXP_LNKCTL2_TX_MARGIN,
1644bb87e511SIlpo Järvinen 								   bridge_cfg2 &
164535e768e2SBjorn Helgaas 								   (PCI_EXP_LNKCTL2_ENTER_COMP |
164635e768e2SBjorn Helgaas 								    PCI_EXP_LNKCTL2_TX_MARGIN));
1647bb87e511SIlpo Järvinen 				pcie_capability_clear_and_set_word(adev->pdev, PCI_EXP_LNKCTL2,
1648bb87e511SIlpo Järvinen 								   PCI_EXP_LNKCTL2_ENTER_COMP |
1649bb87e511SIlpo Järvinen 								   PCI_EXP_LNKCTL2_TX_MARGIN,
1650bb87e511SIlpo Järvinen 								   gpu_cfg2 &
165135e768e2SBjorn Helgaas 								   (PCI_EXP_LNKCTL2_ENTER_COMP |
165235e768e2SBjorn Helgaas 								    PCI_EXP_LNKCTL2_TX_MARGIN));
1653a2e73f56SAlex Deucher 
1654a2e73f56SAlex Deucher 				tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1655a2e73f56SAlex Deucher 				tmp &= ~PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
1656a2e73f56SAlex Deucher 				WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1657a2e73f56SAlex Deucher 			}
1658a2e73f56SAlex Deucher 		}
1659a2e73f56SAlex Deucher 	}
1660a2e73f56SAlex Deucher 
1661a2e73f56SAlex Deucher 	/* set the link speed */
1662a2e73f56SAlex Deucher 	speed_cntl |= PCIE_LC_SPEED_CNTL__LC_FORCE_EN_SW_SPEED_CHANGE_MASK |
1663a2e73f56SAlex Deucher 		PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_HW_SPEED_CHANGE_MASK;
1664a2e73f56SAlex Deucher 	speed_cntl &= ~PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_SW_SPEED_CHANGE_MASK;
1665a2e73f56SAlex Deucher 	WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
1666a2e73f56SAlex Deucher 
1667bb87e511SIlpo Järvinen 	tmp16 = 0;
1668d0dd7f0cSAlex Deucher 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
166935e768e2SBjorn Helgaas 		tmp16 |= PCI_EXP_LNKCTL2_TLS_8_0GT; /* gen3 */
1670d0dd7f0cSAlex Deucher 	else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
167135e768e2SBjorn Helgaas 		tmp16 |= PCI_EXP_LNKCTL2_TLS_5_0GT; /* gen2 */
1672a2e73f56SAlex Deucher 	else
167335e768e2SBjorn Helgaas 		tmp16 |= PCI_EXP_LNKCTL2_TLS_2_5GT; /* gen1 */
1674bb87e511SIlpo Järvinen 	pcie_capability_clear_and_set_word(adev->pdev, PCI_EXP_LNKCTL2,
1675bb87e511SIlpo Järvinen 					   PCI_EXP_LNKCTL2_TLS, tmp16);
1676a2e73f56SAlex Deucher 
1677a2e73f56SAlex Deucher 	speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1678a2e73f56SAlex Deucher 	speed_cntl |= PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK;
1679a2e73f56SAlex Deucher 	WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
1680a2e73f56SAlex Deucher 
1681a2e73f56SAlex Deucher 	for (i = 0; i < adev->usec_timeout; i++) {
1682a2e73f56SAlex Deucher 		speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1683a2e73f56SAlex Deucher 		if ((speed_cntl & PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK) == 0)
1684a2e73f56SAlex Deucher 			break;
1685a2e73f56SAlex Deucher 		udelay(1);
1686a2e73f56SAlex Deucher 	}
1687a2e73f56SAlex Deucher }
1688a2e73f56SAlex Deucher 
cik_program_aspm(struct amdgpu_device * adev)1689a2e73f56SAlex Deucher static void cik_program_aspm(struct amdgpu_device *adev)
1690a2e73f56SAlex Deucher {
1691a2e73f56SAlex Deucher 	u32 data, orig;
1692a2e73f56SAlex Deucher 	bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
1693a2e73f56SAlex Deucher 	bool disable_clkreq = false;
1694a2e73f56SAlex Deucher 
16950ab5d711SMario Limonciello 	if (!amdgpu_device_should_use_aspm(adev))
1696a2e73f56SAlex Deucher 		return;
1697a2e73f56SAlex Deucher 
169876ecb2c7SAlex Deucher 	if (pci_is_root_bus(adev->pdev->bus))
169976ecb2c7SAlex Deucher 		return;
170076ecb2c7SAlex Deucher 
1701a2e73f56SAlex Deucher 	orig = data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
1702a2e73f56SAlex Deucher 	data &= ~PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_MASK;
1703a2e73f56SAlex Deucher 	data |= (0x24 << PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS__SHIFT) |
1704a2e73f56SAlex Deucher 		PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_OVERRIDE_EN_MASK;
1705a2e73f56SAlex Deucher 	if (orig != data)
1706a2e73f56SAlex Deucher 		WREG32_PCIE(ixPCIE_LC_N_FTS_CNTL, data);
1707a2e73f56SAlex Deucher 
1708a2e73f56SAlex Deucher 	orig = data = RREG32_PCIE(ixPCIE_LC_CNTL3);
1709a2e73f56SAlex Deucher 	data |= PCIE_LC_CNTL3__LC_GO_TO_RECOVERY_MASK;
1710a2e73f56SAlex Deucher 	if (orig != data)
1711a2e73f56SAlex Deucher 		WREG32_PCIE(ixPCIE_LC_CNTL3, data);
1712a2e73f56SAlex Deucher 
1713a2e73f56SAlex Deucher 	orig = data = RREG32_PCIE(ixPCIE_P_CNTL);
1714a2e73f56SAlex Deucher 	data |= PCIE_P_CNTL__P_IGNORE_EDB_ERR_MASK;
1715a2e73f56SAlex Deucher 	if (orig != data)
1716a2e73f56SAlex Deucher 		WREG32_PCIE(ixPCIE_P_CNTL, data);
1717a2e73f56SAlex Deucher 
1718a2e73f56SAlex Deucher 	orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
1719a2e73f56SAlex Deucher 	data &= ~(PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK |
1720a2e73f56SAlex Deucher 		PCIE_LC_CNTL__LC_L1_INACTIVITY_MASK);
1721a2e73f56SAlex Deucher 	data |= PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
1722a2e73f56SAlex Deucher 	if (!disable_l0s)
1723a2e73f56SAlex Deucher 		data |= (7 << PCIE_LC_CNTL__LC_L0S_INACTIVITY__SHIFT);
1724a2e73f56SAlex Deucher 
1725a2e73f56SAlex Deucher 	if (!disable_l1) {
1726a2e73f56SAlex Deucher 		data |= (7 << PCIE_LC_CNTL__LC_L1_INACTIVITY__SHIFT);
1727a2e73f56SAlex Deucher 		data &= ~PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
1728a2e73f56SAlex Deucher 		if (orig != data)
1729a2e73f56SAlex Deucher 			WREG32_PCIE(ixPCIE_LC_CNTL, data);
1730a2e73f56SAlex Deucher 
1731a2e73f56SAlex Deucher 		if (!disable_plloff_in_l1) {
1732a2e73f56SAlex Deucher 			bool clk_req_support;
1733a2e73f56SAlex Deucher 
1734a2e73f56SAlex Deucher 			orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_0);
1735a2e73f56SAlex Deucher 			data &= ~(PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
1736a2e73f56SAlex Deucher 				PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
1737a2e73f56SAlex Deucher 			data |= (7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
1738a2e73f56SAlex Deucher 				(7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
1739a2e73f56SAlex Deucher 			if (orig != data)
1740a2e73f56SAlex Deucher 				WREG32_PCIE(ixPB0_PIF_PWRDOWN_0, data);
1741a2e73f56SAlex Deucher 
1742a2e73f56SAlex Deucher 			orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_1);
1743a2e73f56SAlex Deucher 			data &= ~(PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
1744a2e73f56SAlex Deucher 				PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
1745a2e73f56SAlex Deucher 			data |= (7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
1746a2e73f56SAlex Deucher 				(7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
1747a2e73f56SAlex Deucher 			if (orig != data)
1748a2e73f56SAlex Deucher 				WREG32_PCIE(ixPB0_PIF_PWRDOWN_1, data);
1749a2e73f56SAlex Deucher 
1750a2e73f56SAlex Deucher 			orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_0);
1751a2e73f56SAlex Deucher 			data &= ~(PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
1752a2e73f56SAlex Deucher 				PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
1753a2e73f56SAlex Deucher 			data |= (7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
1754a2e73f56SAlex Deucher 				(7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
1755a2e73f56SAlex Deucher 			if (orig != data)
1756a2e73f56SAlex Deucher 				WREG32_PCIE(ixPB1_PIF_PWRDOWN_0, data);
1757a2e73f56SAlex Deucher 
1758a2e73f56SAlex Deucher 			orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_1);
1759a2e73f56SAlex Deucher 			data &= ~(PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
1760a2e73f56SAlex Deucher 				PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
1761a2e73f56SAlex Deucher 			data |= (7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
1762a2e73f56SAlex Deucher 				(7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
1763a2e73f56SAlex Deucher 			if (orig != data)
1764a2e73f56SAlex Deucher 				WREG32_PCIE(ixPB1_PIF_PWRDOWN_1, data);
1765a2e73f56SAlex Deucher 
1766a2e73f56SAlex Deucher 			orig = data = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
1767a2e73f56SAlex Deucher 			data &= ~PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE_MASK;
1768a2e73f56SAlex Deucher 			data |= ~(3 << PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE__SHIFT);
1769a2e73f56SAlex Deucher 			if (orig != data)
1770a2e73f56SAlex Deucher 				WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, data);
1771a2e73f56SAlex Deucher 
1772a2e73f56SAlex Deucher 			if (!disable_clkreq) {
1773a2e73f56SAlex Deucher 				struct pci_dev *root = adev->pdev->bus->self;
1774a2e73f56SAlex Deucher 				u32 lnkcap;
1775a2e73f56SAlex Deucher 
1776a2e73f56SAlex Deucher 				clk_req_support = false;
1777a2e73f56SAlex Deucher 				pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
1778a2e73f56SAlex Deucher 				if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
1779a2e73f56SAlex Deucher 					clk_req_support = true;
1780a2e73f56SAlex Deucher 			} else {
1781a2e73f56SAlex Deucher 				clk_req_support = false;
1782a2e73f56SAlex Deucher 			}
1783a2e73f56SAlex Deucher 
1784a2e73f56SAlex Deucher 			if (clk_req_support) {
1785a2e73f56SAlex Deucher 				orig = data = RREG32_PCIE(ixPCIE_LC_CNTL2);
1786a2e73f56SAlex Deucher 				data |= PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L1_MASK |
1787a2e73f56SAlex Deucher 					PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L23_MASK;
1788a2e73f56SAlex Deucher 				if (orig != data)
1789a2e73f56SAlex Deucher 					WREG32_PCIE(ixPCIE_LC_CNTL2, data);
1790a2e73f56SAlex Deucher 
1791a2e73f56SAlex Deucher 				orig = data = RREG32_SMC(ixTHM_CLK_CNTL);
1792a2e73f56SAlex Deucher 				data &= ~(THM_CLK_CNTL__CMON_CLK_SEL_MASK |
1793a2e73f56SAlex Deucher 					THM_CLK_CNTL__TMON_CLK_SEL_MASK);
1794a2e73f56SAlex Deucher 				data |= (1 << THM_CLK_CNTL__CMON_CLK_SEL__SHIFT) |
1795a2e73f56SAlex Deucher 					(1 << THM_CLK_CNTL__TMON_CLK_SEL__SHIFT);
1796a2e73f56SAlex Deucher 				if (orig != data)
1797a2e73f56SAlex Deucher 					WREG32_SMC(ixTHM_CLK_CNTL, data);
1798a2e73f56SAlex Deucher 
1799a2e73f56SAlex Deucher 				orig = data = RREG32_SMC(ixMISC_CLK_CTRL);
1800a2e73f56SAlex Deucher 				data &= ~(MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL_MASK |
1801a2e73f56SAlex Deucher 					MISC_CLK_CTRL__ZCLK_SEL_MASK);
1802a2e73f56SAlex Deucher 				data |= (1 << MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL__SHIFT) |
1803a2e73f56SAlex Deucher 					(1 << MISC_CLK_CTRL__ZCLK_SEL__SHIFT);
1804a2e73f56SAlex Deucher 				if (orig != data)
1805a2e73f56SAlex Deucher 					WREG32_SMC(ixMISC_CLK_CTRL, data);
1806a2e73f56SAlex Deucher 
1807a2e73f56SAlex Deucher 				orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL);
1808a2e73f56SAlex Deucher 				data &= ~CG_CLKPIN_CNTL__BCLK_AS_XCLK_MASK;
1809a2e73f56SAlex Deucher 				if (orig != data)
1810a2e73f56SAlex Deucher 					WREG32_SMC(ixCG_CLKPIN_CNTL, data);
1811a2e73f56SAlex Deucher 
1812a2e73f56SAlex Deucher 				orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL_2);
1813a2e73f56SAlex Deucher 				data &= ~CG_CLKPIN_CNTL_2__FORCE_BIF_REFCLK_EN_MASK;
1814a2e73f56SAlex Deucher 				if (orig != data)
1815a2e73f56SAlex Deucher 					WREG32_SMC(ixCG_CLKPIN_CNTL_2, data);
1816a2e73f56SAlex Deucher 
1817a2e73f56SAlex Deucher 				orig = data = RREG32_SMC(ixMPLL_BYPASSCLK_SEL);
1818a2e73f56SAlex Deucher 				data &= ~MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL_MASK;
1819a2e73f56SAlex Deucher 				data |= (4 << MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL__SHIFT);
1820a2e73f56SAlex Deucher 				if (orig != data)
1821a2e73f56SAlex Deucher 					WREG32_SMC(ixMPLL_BYPASSCLK_SEL, data);
1822a2e73f56SAlex Deucher 			}
1823a2e73f56SAlex Deucher 		}
1824a2e73f56SAlex Deucher 	} else {
1825a2e73f56SAlex Deucher 		if (orig != data)
1826a2e73f56SAlex Deucher 			WREG32_PCIE(ixPCIE_LC_CNTL, data);
1827a2e73f56SAlex Deucher 	}
1828a2e73f56SAlex Deucher 
1829a2e73f56SAlex Deucher 	orig = data = RREG32_PCIE(ixPCIE_CNTL2);
1830a2e73f56SAlex Deucher 	data |= PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
1831a2e73f56SAlex Deucher 		PCIE_CNTL2__MST_MEM_LS_EN_MASK |
1832a2e73f56SAlex Deucher 		PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK;
1833a2e73f56SAlex Deucher 	if (orig != data)
1834a2e73f56SAlex Deucher 		WREG32_PCIE(ixPCIE_CNTL2, data);
1835a2e73f56SAlex Deucher 
1836a2e73f56SAlex Deucher 	if (!disable_l0s) {
1837a2e73f56SAlex Deucher 		data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
1838a2e73f56SAlex Deucher 		if ((data & PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) ==
1839a2e73f56SAlex Deucher 				PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) {
1840a2e73f56SAlex Deucher 			data = RREG32_PCIE(ixPCIE_LC_STATUS1);
1841a2e73f56SAlex Deucher 			if ((data & PCIE_LC_STATUS1__LC_REVERSE_XMIT_MASK) &&
1842a2e73f56SAlex Deucher 			(data & PCIE_LC_STATUS1__LC_REVERSE_RCVR_MASK)) {
1843a2e73f56SAlex Deucher 				orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
1844a2e73f56SAlex Deucher 				data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK;
1845a2e73f56SAlex Deucher 				if (orig != data)
1846a2e73f56SAlex Deucher 					WREG32_PCIE(ixPCIE_LC_CNTL, data);
1847a2e73f56SAlex Deucher 			}
1848a2e73f56SAlex Deucher 		}
1849a2e73f56SAlex Deucher 	}
1850a2e73f56SAlex Deucher }
1851a2e73f56SAlex Deucher 
cik_get_rev_id(struct amdgpu_device * adev)1852a2e73f56SAlex Deucher static uint32_t cik_get_rev_id(struct amdgpu_device *adev)
1853a2e73f56SAlex Deucher {
1854a2e73f56SAlex Deucher 	return (RREG32(mmCC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1855a2e73f56SAlex Deucher 		>> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1856a2e73f56SAlex Deucher }
1857a2e73f56SAlex Deucher 
cik_flush_hdp(struct amdgpu_device * adev,struct amdgpu_ring * ring)185869882565SChristian König static void cik_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
185913854c60SAlex Deucher {
186069882565SChristian König 	if (!ring || !ring->funcs->emit_wreg) {
186113854c60SAlex Deucher 		WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
186213854c60SAlex Deucher 		RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
186369882565SChristian König 	} else {
186469882565SChristian König 		amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
186569882565SChristian König 	}
186613854c60SAlex Deucher }
186713854c60SAlex Deucher 
cik_invalidate_hdp(struct amdgpu_device * adev,struct amdgpu_ring * ring)186869882565SChristian König static void cik_invalidate_hdp(struct amdgpu_device *adev,
186969882565SChristian König 			       struct amdgpu_ring *ring)
187013854c60SAlex Deucher {
187169882565SChristian König 	if (!ring || !ring->funcs->emit_wreg) {
187213854c60SAlex Deucher 		WREG32(mmHDP_DEBUG0, 1);
187313854c60SAlex Deucher 		RREG32(mmHDP_DEBUG0);
187469882565SChristian König 	} else {
187569882565SChristian König 		amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
187669882565SChristian König 	}
187713854c60SAlex Deucher }
187813854c60SAlex Deucher 
cik_need_full_reset(struct amdgpu_device * adev)1879b7acb46fSAlex Deucher static bool cik_need_full_reset(struct amdgpu_device *adev)
1880b7acb46fSAlex Deucher {
1881b7acb46fSAlex Deucher 	/* change this when we support soft reset */
1882b7acb46fSAlex Deucher 	return true;
1883b7acb46fSAlex Deucher }
1884b7acb46fSAlex Deucher 
cik_get_pcie_usage(struct amdgpu_device * adev,uint64_t * count0,uint64_t * count1)1885b45e18acSKent Russell static void cik_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
1886b45e18acSKent Russell 			       uint64_t *count1)
1887b45e18acSKent Russell {
1888b45e18acSKent Russell 	uint32_t perfctr = 0;
1889b45e18acSKent Russell 	uint64_t cnt0_of, cnt1_of;
1890b45e18acSKent Russell 	int tmp;
1891b45e18acSKent Russell 
1892b45e18acSKent Russell 	/* This reports 0 on APUs, so return to avoid writing/reading registers
1893b45e18acSKent Russell 	 * that may or may not be different from their GPU counterparts
1894b45e18acSKent Russell 	 */
1895b45e18acSKent Russell 	if (adev->flags & AMD_IS_APU)
1896b45e18acSKent Russell 		return;
1897b45e18acSKent Russell 
1898b45e18acSKent Russell 	/* Set the 2 events that we wish to watch, defined above */
1899b45e18acSKent Russell 	/* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
1900b45e18acSKent Russell 	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
1901b45e18acSKent Russell 	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
1902b45e18acSKent Russell 
1903b45e18acSKent Russell 	/* Write to enable desired perf counters */
1904b45e18acSKent Russell 	WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
1905b45e18acSKent Russell 	/* Zero out and enable the perf counters
1906b45e18acSKent Russell 	 * Write 0x5:
1907b45e18acSKent Russell 	 * Bit 0 = Start all counters(1)
1908b45e18acSKent Russell 	 * Bit 2 = Global counter reset enable(1)
1909b45e18acSKent Russell 	 */
1910b45e18acSKent Russell 	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
1911b45e18acSKent Russell 
1912b45e18acSKent Russell 	msleep(1000);
1913b45e18acSKent Russell 
1914b45e18acSKent Russell 	/* Load the shadow and disable the perf counters
1915b45e18acSKent Russell 	 * Write 0x2:
1916b45e18acSKent Russell 	 * Bit 0 = Stop counters(0)
1917b45e18acSKent Russell 	 * Bit 1 = Load the shadow counters(1)
1918b45e18acSKent Russell 	 */
1919b45e18acSKent Russell 	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
1920b45e18acSKent Russell 
1921b45e18acSKent Russell 	/* Read register values to get any >32bit overflow */
1922b45e18acSKent Russell 	tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
1923b45e18acSKent Russell 	cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
1924b45e18acSKent Russell 	cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
1925b45e18acSKent Russell 
1926b45e18acSKent Russell 	/* Get the values and add the overflow */
1927b45e18acSKent Russell 	*count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
1928b45e18acSKent Russell 	*count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
1929b45e18acSKent Russell }
1930b45e18acSKent Russell 
cik_need_reset_on_init(struct amdgpu_device * adev)19313fcc10d7SAlex Deucher static bool cik_need_reset_on_init(struct amdgpu_device *adev)
19323fcc10d7SAlex Deucher {
19333fcc10d7SAlex Deucher 	u32 clock_cntl, pc;
19343fcc10d7SAlex Deucher 
19353fcc10d7SAlex Deucher 	if (adev->flags & AMD_IS_APU)
19363fcc10d7SAlex Deucher 		return false;
19373fcc10d7SAlex Deucher 
19383fcc10d7SAlex Deucher 	/* check if the SMC is already running */
19393fcc10d7SAlex Deucher 	clock_cntl = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
19403fcc10d7SAlex Deucher 	pc = RREG32_SMC(ixSMC_PC_C);
19413fcc10d7SAlex Deucher 	if ((0 == REG_GET_FIELD(clock_cntl, SMC_SYSCON_CLOCK_CNTL_0, ck_disable)) &&
19423fcc10d7SAlex Deucher 	    (0x20100 <= pc))
19433fcc10d7SAlex Deucher 		return true;
19443fcc10d7SAlex Deucher 
19453fcc10d7SAlex Deucher 	return false;
19463fcc10d7SAlex Deucher }
19473fcc10d7SAlex Deucher 
cik_get_pcie_replay_count(struct amdgpu_device * adev)1948dcea6e65SKent Russell static uint64_t cik_get_pcie_replay_count(struct amdgpu_device *adev)
1949dcea6e65SKent Russell {
1950dcea6e65SKent Russell 	uint64_t nak_r, nak_g;
1951dcea6e65SKent Russell 
1952dcea6e65SKent Russell 	/* Get the number of NAKs received and generated */
1953dcea6e65SKent Russell 	nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
1954dcea6e65SKent Russell 	nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
1955dcea6e65SKent Russell 
1956dcea6e65SKent Russell 	/* Add the total number of NAKs, i.e the number of replays */
1957dcea6e65SKent Russell 	return (nak_r + nak_g);
1958dcea6e65SKent Russell }
1959dcea6e65SKent Russell 
cik_pre_asic_init(struct amdgpu_device * adev)1960819515c7SAlex Deucher static void cik_pre_asic_init(struct amdgpu_device *adev)
1961819515c7SAlex Deucher {
1962819515c7SAlex Deucher }
1963819515c7SAlex Deucher 
1964a2e73f56SAlex Deucher static const struct amdgpu_asic_funcs cik_asic_funcs =
1965a2e73f56SAlex Deucher {
1966a2e73f56SAlex Deucher 	.read_disabled_bios = &cik_read_disabled_bios,
19671eb22bd3SAlex Deucher 	.read_bios_from_rom = &cik_read_bios_from_rom,
1968a2e73f56SAlex Deucher 	.read_register = &cik_read_register,
1969a2e73f56SAlex Deucher 	.reset = &cik_asic_reset,
19706d0f50daSAlex Deucher 	.reset_method = &cik_asic_reset_method,
1971a2e73f56SAlex Deucher 	.set_vga_state = &cik_vga_set_state,
1972a2e73f56SAlex Deucher 	.get_xclk = &cik_get_xclk,
1973a2e73f56SAlex Deucher 	.set_uvd_clocks = &cik_set_uvd_clocks,
1974a2e73f56SAlex Deucher 	.set_vce_clocks = &cik_set_vce_clocks,
1975bbf282d8SAlex Deucher 	.get_config_memsize = &cik_get_config_memsize,
197613854c60SAlex Deucher 	.flush_hdp = &cik_flush_hdp,
197713854c60SAlex Deucher 	.invalidate_hdp = &cik_invalidate_hdp,
1978b7acb46fSAlex Deucher 	.need_full_reset = &cik_need_full_reset,
19794e2c1ac2SOak Zeng 	.init_doorbell_index = &legacy_doorbell_index_init,
1980b45e18acSKent Russell 	.get_pcie_usage = &cik_get_pcie_usage,
19813fcc10d7SAlex Deucher 	.need_reset_on_init = &cik_need_reset_on_init,
1982dcea6e65SKent Russell 	.get_pcie_replay_count = &cik_get_pcie_replay_count,
19830d0c07eeSAlex Deucher 	.supports_baco = &cik_asic_supports_baco,
1984819515c7SAlex Deucher 	.pre_asic_init = &cik_pre_asic_init,
19853b246e8bSAlex Deucher 	.query_video_codecs = &cik_query_video_codecs,
1986a2e73f56SAlex Deucher };
1987a2e73f56SAlex Deucher 
cik_common_early_init(struct amdgpu_ip_block * ip_block)1988146b085eSSunil Khatri static int cik_common_early_init(struct amdgpu_ip_block *ip_block)
1989a2e73f56SAlex Deucher {
1990146b085eSSunil Khatri 	struct amdgpu_device *adev = ip_block->adev;
19915fc3aeebSyanyang1 
1992a2e73f56SAlex Deucher 	adev->smc_rreg = &cik_smc_rreg;
1993a2e73f56SAlex Deucher 	adev->smc_wreg = &cik_smc_wreg;
1994a2e73f56SAlex Deucher 	adev->pcie_rreg = &cik_pcie_rreg;
1995a2e73f56SAlex Deucher 	adev->pcie_wreg = &cik_pcie_wreg;
1996a2e73f56SAlex Deucher 	adev->uvd_ctx_rreg = &cik_uvd_ctx_rreg;
1997a2e73f56SAlex Deucher 	adev->uvd_ctx_wreg = &cik_uvd_ctx_wreg;
1998a2e73f56SAlex Deucher 	adev->didt_rreg = &cik_didt_rreg;
1999a2e73f56SAlex Deucher 	adev->didt_wreg = &cik_didt_wreg;
2000a2e73f56SAlex Deucher 
2001a2e73f56SAlex Deucher 	adev->asic_funcs = &cik_asic_funcs;
2002a2e73f56SAlex Deucher 
2003a2e73f56SAlex Deucher 	adev->rev_id = cik_get_rev_id(adev);
2004a2e73f56SAlex Deucher 	adev->external_rev_id = 0xFF;
2005a2e73f56SAlex Deucher 	switch (adev->asic_type) {
2006a2e73f56SAlex Deucher 	case CHIP_BONAIRE:
2007a2e73f56SAlex Deucher 		adev->cg_flags =
2008e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_MGCG |
2009e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_MGLS |
2010e3b04bc7SAlex Deucher 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
2011e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_CGLS |
2012e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_CGTS |
2013e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_CGTS_LS |
2014e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_CP_LS |
2015e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_MC_LS |
2016e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_MC_MGCG |
2017e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_SDMA_MGCG |
2018e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_SDMA_LS |
2019e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_BIF_LS |
2020e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_VCE_MGCG |
2021e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_UVD_MGCG |
2022e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_HDP_LS |
2023e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_HDP_MGCG;
2024a2e73f56SAlex Deucher 		adev->pg_flags = 0;
2025a2e73f56SAlex Deucher 		adev->external_rev_id = adev->rev_id + 0x14;
2026a2e73f56SAlex Deucher 		break;
2027a2e73f56SAlex Deucher 	case CHIP_HAWAII:
2028a2e73f56SAlex Deucher 		adev->cg_flags =
2029e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_MGCG |
2030e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_MGLS |
2031e3b04bc7SAlex Deucher 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
2032e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_CGLS |
2033e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_CGTS |
2034e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_CP_LS |
2035e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_MC_LS |
2036e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_MC_MGCG |
2037e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_SDMA_MGCG |
2038e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_SDMA_LS |
2039e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_BIF_LS |
2040e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_VCE_MGCG |
2041e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_UVD_MGCG |
2042e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_HDP_LS |
2043e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_HDP_MGCG;
2044a2e73f56SAlex Deucher 		adev->pg_flags = 0;
2045a2e73f56SAlex Deucher 		adev->external_rev_id = 0x28;
2046a2e73f56SAlex Deucher 		break;
2047a2e73f56SAlex Deucher 	case CHIP_KAVERI:
2048a2e73f56SAlex Deucher 		adev->cg_flags =
2049e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_MGCG |
2050e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_MGLS |
2051e3b04bc7SAlex Deucher 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
2052e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_CGLS |
2053e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_CGTS |
2054e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_CGTS_LS |
2055e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_CP_LS |
2056e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_SDMA_MGCG |
2057e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_SDMA_LS |
2058e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_BIF_LS |
2059e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_VCE_MGCG |
2060e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_UVD_MGCG |
2061e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_HDP_LS |
2062e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_HDP_MGCG;
2063a2e73f56SAlex Deucher 		adev->pg_flags =
2064e3b04bc7SAlex Deucher 			/*AMD_PG_SUPPORT_GFX_PG |
2065e3b04bc7SAlex Deucher 			  AMD_PG_SUPPORT_GFX_SMG |
2066e3b04bc7SAlex Deucher 			  AMD_PG_SUPPORT_GFX_DMG |*/
2067e3b04bc7SAlex Deucher 			AMD_PG_SUPPORT_UVD |
2068ca6d3503SRex Zhu 			AMD_PG_SUPPORT_VCE |
2069ca6d3503SRex Zhu 			/*  AMD_PG_SUPPORT_CP |
2070e3b04bc7SAlex Deucher 			  AMD_PG_SUPPORT_GDS |
2071e3b04bc7SAlex Deucher 			  AMD_PG_SUPPORT_RLC_SMU_HS |
2072e3b04bc7SAlex Deucher 			  AMD_PG_SUPPORT_ACP |
2073e3b04bc7SAlex Deucher 			  AMD_PG_SUPPORT_SAMU |*/
2074a2e73f56SAlex Deucher 			0;
2075a2e73f56SAlex Deucher 		if (adev->pdev->device == 0x1312 ||
2076a2e73f56SAlex Deucher 			adev->pdev->device == 0x1316 ||
2077a2e73f56SAlex Deucher 			adev->pdev->device == 0x1317)
2078a2e73f56SAlex Deucher 			adev->external_rev_id = 0x41;
2079a2e73f56SAlex Deucher 		else
2080a2e73f56SAlex Deucher 			adev->external_rev_id = 0x1;
2081a2e73f56SAlex Deucher 		break;
2082a2e73f56SAlex Deucher 	case CHIP_KABINI:
2083a2e73f56SAlex Deucher 	case CHIP_MULLINS:
2084a2e73f56SAlex Deucher 		adev->cg_flags =
2085e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_MGCG |
2086e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_MGLS |
2087e3b04bc7SAlex Deucher 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
2088e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_CGLS |
2089e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_CGTS |
2090e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_CGTS_LS |
2091e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_GFX_CP_LS |
2092e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_SDMA_MGCG |
2093e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_SDMA_LS |
2094e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_BIF_LS |
2095e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_VCE_MGCG |
2096e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_UVD_MGCG |
2097e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_HDP_LS |
2098e3b04bc7SAlex Deucher 			AMD_CG_SUPPORT_HDP_MGCG;
2099a2e73f56SAlex Deucher 		adev->pg_flags =
2100e3b04bc7SAlex Deucher 			/*AMD_PG_SUPPORT_GFX_PG |
2101e3b04bc7SAlex Deucher 			  AMD_PG_SUPPORT_GFX_SMG | */
2102e3b04bc7SAlex Deucher 			AMD_PG_SUPPORT_UVD |
2103e3b04bc7SAlex Deucher 			/*AMD_PG_SUPPORT_VCE |
2104e3b04bc7SAlex Deucher 			  AMD_PG_SUPPORT_CP |
2105e3b04bc7SAlex Deucher 			  AMD_PG_SUPPORT_GDS |
2106e3b04bc7SAlex Deucher 			  AMD_PG_SUPPORT_RLC_SMU_HS |
2107e3b04bc7SAlex Deucher 			  AMD_PG_SUPPORT_SAMU |*/
2108a2e73f56SAlex Deucher 			0;
2109a2e73f56SAlex Deucher 		if (adev->asic_type == CHIP_KABINI) {
2110a2e73f56SAlex Deucher 			if (adev->rev_id == 0)
2111a2e73f56SAlex Deucher 				adev->external_rev_id = 0x81;
2112a2e73f56SAlex Deucher 			else if (adev->rev_id == 1)
2113a2e73f56SAlex Deucher 				adev->external_rev_id = 0x82;
2114a2e73f56SAlex Deucher 			else if (adev->rev_id == 2)
2115a2e73f56SAlex Deucher 				adev->external_rev_id = 0x85;
2116a2e73f56SAlex Deucher 		} else
2117a2e73f56SAlex Deucher 			adev->external_rev_id = adev->rev_id + 0xa1;
2118a2e73f56SAlex Deucher 		break;
2119a2e73f56SAlex Deucher 	default:
2120a2e73f56SAlex Deucher 		/* FIXME: not supported yet */
2121a2e73f56SAlex Deucher 		return -EINVAL;
2122a2e73f56SAlex Deucher 	}
2123a2e73f56SAlex Deucher 
2124a2e73f56SAlex Deucher 	return 0;
2125a2e73f56SAlex Deucher }
2126a2e73f56SAlex Deucher 
cik_common_hw_init(struct amdgpu_ip_block * ip_block)212758608034SSunil Khatri static int cik_common_hw_init(struct amdgpu_ip_block *ip_block)
2128a2e73f56SAlex Deucher {
212958608034SSunil Khatri 	struct amdgpu_device *adev = ip_block->adev;
21305fc3aeebSyanyang1 
2131a2e73f56SAlex Deucher 	/* move the golden regs per IP block */
2132a2e73f56SAlex Deucher 	cik_init_golden_registers(adev);
2133a2e73f56SAlex Deucher 	/* enable pcie gen2/3 link */
2134a2e73f56SAlex Deucher 	cik_pcie_gen3_enable(adev);
2135a2e73f56SAlex Deucher 	/* enable aspm */
2136a2e73f56SAlex Deucher 	cik_program_aspm(adev);
2137a2e73f56SAlex Deucher 
2138a2e73f56SAlex Deucher 	return 0;
2139a2e73f56SAlex Deucher }
2140a2e73f56SAlex Deucher 
cik_common_hw_fini(struct amdgpu_ip_block * ip_block)2141692d2cd1SSunil Khatri static int cik_common_hw_fini(struct amdgpu_ip_block *ip_block)
2142a2e73f56SAlex Deucher {
2143a2e73f56SAlex Deucher 	return 0;
2144a2e73f56SAlex Deucher }
2145a2e73f56SAlex Deucher 
cik_common_resume(struct amdgpu_ip_block * ip_block)21467feb4f3aSSunil Khatri static int cik_common_resume(struct amdgpu_ip_block *ip_block)
2147a2e73f56SAlex Deucher {
214858608034SSunil Khatri 	return cik_common_hw_init(ip_block);
2149a2e73f56SAlex Deucher }
2150a2e73f56SAlex Deucher 
cik_common_is_idle(struct amdgpu_ip_block * ip_block)2151*7dc34054SSunil Khatri static bool cik_common_is_idle(struct amdgpu_ip_block *ip_block)
2152a2e73f56SAlex Deucher {
2153a2e73f56SAlex Deucher 	return true;
2154a2e73f56SAlex Deucher }
2155a2e73f56SAlex Deucher 
2156f13c7da1SSunil Khatri 
2157a2e73f56SAlex Deucher 
cik_common_soft_reset(struct amdgpu_ip_block * ip_block)21580ef2a1e7SSunil Khatri static int cik_common_soft_reset(struct amdgpu_ip_block *ip_block)
2159a2e73f56SAlex Deucher {
2160a2e73f56SAlex Deucher 	/* XXX hard reset?? */
2161a2e73f56SAlex Deucher 	return 0;
2162a2e73f56SAlex Deucher }
2163a2e73f56SAlex Deucher 
cik_common_set_clockgating_state(struct amdgpu_ip_block * ip_block,enum amd_clockgating_state state)2164f2ba8c3dSBoyuan Zhang static int cik_common_set_clockgating_state(struct amdgpu_ip_block *ip_block,
21655fc3aeebSyanyang1 					    enum amd_clockgating_state state)
2166a2e73f56SAlex Deucher {
2167a2e73f56SAlex Deucher 	return 0;
2168a2e73f56SAlex Deucher }
2169a2e73f56SAlex Deucher 
cik_common_set_powergating_state(struct amdgpu_ip_block * ip_block,enum amd_powergating_state state)217080d80511SBoyuan Zhang static int cik_common_set_powergating_state(struct amdgpu_ip_block *ip_block,
21715fc3aeebSyanyang1 					    enum amd_powergating_state state)
2172a2e73f56SAlex Deucher {
2173a2e73f56SAlex Deucher 	return 0;
2174a2e73f56SAlex Deucher }
2175a2e73f56SAlex Deucher 
2176a1255107SAlex Deucher static const struct amd_ip_funcs cik_common_ip_funcs = {
217788a907d6STom St Denis 	.name = "cik_common",
2178a2e73f56SAlex Deucher 	.early_init = cik_common_early_init,
2179a2e73f56SAlex Deucher 	.hw_init = cik_common_hw_init,
2180a2e73f56SAlex Deucher 	.hw_fini = cik_common_hw_fini,
2181a2e73f56SAlex Deucher 	.resume = cik_common_resume,
2182a2e73f56SAlex Deucher 	.is_idle = cik_common_is_idle,
2183a2e73f56SAlex Deucher 	.soft_reset = cik_common_soft_reset,
2184a2e73f56SAlex Deucher 	.set_clockgating_state = cik_common_set_clockgating_state,
2185a2e73f56SAlex Deucher 	.set_powergating_state = cik_common_set_powergating_state,
2186a2e73f56SAlex Deucher };
2187a1255107SAlex Deucher 
2188a1255107SAlex Deucher static const struct amdgpu_ip_block_version cik_common_ip_block =
2189a1255107SAlex Deucher {
2190a1255107SAlex Deucher 	.type = AMD_IP_BLOCK_TYPE_COMMON,
2191a1255107SAlex Deucher 	.major = 1,
2192a1255107SAlex Deucher 	.minor = 0,
2193a1255107SAlex Deucher 	.rev = 0,
2194a1255107SAlex Deucher 	.funcs = &cik_common_ip_funcs,
2195a1255107SAlex Deucher };
2196a1255107SAlex Deucher 
cik_set_ip_blocks(struct amdgpu_device * adev)2197a1255107SAlex Deucher int cik_set_ip_blocks(struct amdgpu_device *adev)
2198a1255107SAlex Deucher {
2199a1255107SAlex Deucher 	switch (adev->asic_type) {
2200a1255107SAlex Deucher 	case CHIP_BONAIRE:
22012990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
22022990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
22032990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
22043089aa22SRex Zhu 		amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
22053089aa22SRex Zhu 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2206b905090dSRex Zhu 		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
2207a1255107SAlex Deucher 		if (adev->enable_virtual_display)
2208733ee71aSRyan Taylor 			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
22094562236bSHarry Wentland #if defined(CONFIG_DRM_AMD_DC)
22104562236bSHarry Wentland 		else if (amdgpu_device_has_dc_support(adev))
22112990a1fcSAlex Deucher 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
22124562236bSHarry Wentland #endif
2213a1255107SAlex Deucher 		else
22142990a1fcSAlex Deucher 			amdgpu_device_ip_block_add(adev, &dce_v8_2_ip_block);
22152990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
22162990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2217a1255107SAlex Deucher 		break;
2218a1255107SAlex Deucher 	case CHIP_HAWAII:
22192990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
22202990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
22212990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
22223089aa22SRex Zhu 		amdgpu_device_ip_block_add(adev, &gfx_v7_3_ip_block);
22233089aa22SRex Zhu 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2224b905090dSRex Zhu 		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
2225a1255107SAlex Deucher 		if (adev->enable_virtual_display)
2226733ee71aSRyan Taylor 			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
22274562236bSHarry Wentland #if defined(CONFIG_DRM_AMD_DC)
22284562236bSHarry Wentland 		else if (amdgpu_device_has_dc_support(adev))
22292990a1fcSAlex Deucher 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
22304562236bSHarry Wentland #endif
2231a1255107SAlex Deucher 		else
22322990a1fcSAlex Deucher 			amdgpu_device_ip_block_add(adev, &dce_v8_5_ip_block);
22332990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
22342990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2235a1255107SAlex Deucher 		break;
2236a1255107SAlex Deucher 	case CHIP_KAVERI:
22372990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
22382990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
22392990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
22403089aa22SRex Zhu 		amdgpu_device_ip_block_add(adev, &gfx_v7_1_ip_block);
22413089aa22SRex Zhu 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2242b905090dSRex Zhu 		amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
2243a1255107SAlex Deucher 		if (adev->enable_virtual_display)
2244733ee71aSRyan Taylor 			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
22459355c0e8SAlex Deucher #if defined(CONFIG_DRM_AMD_DC)
22469355c0e8SAlex Deucher 		else if (amdgpu_device_has_dc_support(adev))
22472990a1fcSAlex Deucher 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
22489355c0e8SAlex Deucher #endif
2249a1255107SAlex Deucher 		else
22502990a1fcSAlex Deucher 			amdgpu_device_ip_block_add(adev, &dce_v8_1_ip_block);
22513089aa22SRex Zhu 
22522990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
22532990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2254a1255107SAlex Deucher 		break;
2255a1255107SAlex Deucher 	case CHIP_KABINI:
2256a1255107SAlex Deucher 	case CHIP_MULLINS:
22572990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
22582990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
22592990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
22603089aa22SRex Zhu 		amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
22613089aa22SRex Zhu 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2262b905090dSRex Zhu 		amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
2263a1255107SAlex Deucher 		if (adev->enable_virtual_display)
2264733ee71aSRyan Taylor 			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
22659355c0e8SAlex Deucher #if defined(CONFIG_DRM_AMD_DC)
22669355c0e8SAlex Deucher 		else if (amdgpu_device_has_dc_support(adev))
22672990a1fcSAlex Deucher 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
22689355c0e8SAlex Deucher #endif
2269a1255107SAlex Deucher 		else
22702990a1fcSAlex Deucher 			amdgpu_device_ip_block_add(adev, &dce_v8_3_ip_block);
22712990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
22722990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2273a1255107SAlex Deucher 		break;
2274a1255107SAlex Deucher 	default:
2275a1255107SAlex Deucher 		/* FIXME: not supported yet */
2276a1255107SAlex Deucher 		return -EINVAL;
2277a1255107SAlex Deucher 	}
2278a1255107SAlex Deucher 	return 0;
2279a1255107SAlex Deucher }
2280