xref: /openbsd-src/sys/dev/pci/drm/amd/amdgpu/amdgpu_cik.c (revision f005ef32267c16bdb134f0e9fa4477dbe07c263a)
1fb4d8502Sjsg /*
2fb4d8502Sjsg  * Copyright 2012 Advanced Micro Devices, Inc.
3fb4d8502Sjsg  *
4fb4d8502Sjsg  * Permission is hereby granted, free of charge, to any person obtaining a
5fb4d8502Sjsg  * copy of this software and associated documentation files (the "Software"),
6fb4d8502Sjsg  * to deal in the Software without restriction, including without limitation
7fb4d8502Sjsg  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8fb4d8502Sjsg  * and/or sell copies of the Software, and to permit persons to whom the
9fb4d8502Sjsg  * Software is furnished to do so, subject to the following conditions:
10fb4d8502Sjsg  *
11fb4d8502Sjsg  * The above copyright notice and this permission notice shall be included in
12fb4d8502Sjsg  * all copies or substantial portions of the Software.
13fb4d8502Sjsg  *
14fb4d8502Sjsg  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15fb4d8502Sjsg  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16fb4d8502Sjsg  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17fb4d8502Sjsg  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18fb4d8502Sjsg  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19fb4d8502Sjsg  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20fb4d8502Sjsg  * OTHER DEALINGS IN THE SOFTWARE.
21fb4d8502Sjsg  *
22fb4d8502Sjsg  * Authors: Alex Deucher
23fb4d8502Sjsg  */
24fb4d8502Sjsg #include <linux/firmware.h>
25fb4d8502Sjsg #include <linux/slab.h>
26fb4d8502Sjsg #include <linux/module.h>
27c349dbc7Sjsg #include <linux/pci.h>
28c349dbc7Sjsg 
295ca02815Sjsg #include <drm/amdgpu_drm.h>
305ca02815Sjsg 
31fb4d8502Sjsg #include "amdgpu.h"
32fb4d8502Sjsg #include "amdgpu_atombios.h"
33fb4d8502Sjsg #include "amdgpu_ih.h"
34fb4d8502Sjsg #include "amdgpu_uvd.h"
35fb4d8502Sjsg #include "amdgpu_vce.h"
36fb4d8502Sjsg #include "cikd.h"
37fb4d8502Sjsg #include "atom.h"
38fb4d8502Sjsg #include "amd_pcie.h"
39fb4d8502Sjsg 
40fb4d8502Sjsg #include "cik.h"
41fb4d8502Sjsg #include "gmc_v7_0.h"
42fb4d8502Sjsg #include "cik_ih.h"
43fb4d8502Sjsg #include "dce_v8_0.h"
44fb4d8502Sjsg #include "gfx_v7_0.h"
45fb4d8502Sjsg #include "cik_sdma.h"
46fb4d8502Sjsg #include "uvd_v4_2.h"
47fb4d8502Sjsg #include "vce_v2_0.h"
48fb4d8502Sjsg #include "cik_dpm.h"
49fb4d8502Sjsg 
50fb4d8502Sjsg #include "uvd/uvd_4_2_d.h"
51fb4d8502Sjsg 
52fb4d8502Sjsg #include "smu/smu_7_0_1_d.h"
53fb4d8502Sjsg #include "smu/smu_7_0_1_sh_mask.h"
54fb4d8502Sjsg 
55fb4d8502Sjsg #include "dce/dce_8_0_d.h"
56fb4d8502Sjsg #include "dce/dce_8_0_sh_mask.h"
57fb4d8502Sjsg 
58fb4d8502Sjsg #include "bif/bif_4_1_d.h"
59fb4d8502Sjsg #include "bif/bif_4_1_sh_mask.h"
60fb4d8502Sjsg 
61fb4d8502Sjsg #include "gca/gfx_7_2_d.h"
62fb4d8502Sjsg #include "gca/gfx_7_2_enum.h"
63fb4d8502Sjsg #include "gca/gfx_7_2_sh_mask.h"
64fb4d8502Sjsg 
65fb4d8502Sjsg #include "gmc/gmc_7_1_d.h"
66fb4d8502Sjsg #include "gmc/gmc_7_1_sh_mask.h"
67fb4d8502Sjsg 
68fb4d8502Sjsg #include "oss/oss_2_0_d.h"
69fb4d8502Sjsg #include "oss/oss_2_0_sh_mask.h"
70fb4d8502Sjsg 
71fb4d8502Sjsg #include "amdgpu_dm.h"
72fb4d8502Sjsg #include "amdgpu_amdkfd.h"
735ca02815Sjsg #include "amdgpu_vkms.h"
745ca02815Sjsg 
755ca02815Sjsg static const struct amdgpu_video_codec_info cik_video_codecs_encode_array[] =
765ca02815Sjsg {
775ca02815Sjsg 	{
785ca02815Sjsg 		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
795ca02815Sjsg 		.max_width = 2048,
805ca02815Sjsg 		.max_height = 1152,
815ca02815Sjsg 		.max_pixels_per_frame = 2048 * 1152,
825ca02815Sjsg 		.max_level = 0,
835ca02815Sjsg 	},
845ca02815Sjsg };
855ca02815Sjsg 
865ca02815Sjsg static const struct amdgpu_video_codecs cik_video_codecs_encode =
875ca02815Sjsg {
885ca02815Sjsg 	.codec_count = ARRAY_SIZE(cik_video_codecs_encode_array),
895ca02815Sjsg 	.codec_array = cik_video_codecs_encode_array,
905ca02815Sjsg };
915ca02815Sjsg 
925ca02815Sjsg static const struct amdgpu_video_codec_info cik_video_codecs_decode_array[] =
935ca02815Sjsg {
945ca02815Sjsg 	{
955ca02815Sjsg 		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
965ca02815Sjsg 		.max_width = 2048,
975ca02815Sjsg 		.max_height = 1152,
985ca02815Sjsg 		.max_pixels_per_frame = 2048 * 1152,
995ca02815Sjsg 		.max_level = 3,
1005ca02815Sjsg 	},
1015ca02815Sjsg 	{
1025ca02815Sjsg 		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
1035ca02815Sjsg 		.max_width = 2048,
1045ca02815Sjsg 		.max_height = 1152,
1055ca02815Sjsg 		.max_pixels_per_frame = 2048 * 1152,
1065ca02815Sjsg 		.max_level = 5,
1075ca02815Sjsg 	},
1085ca02815Sjsg 	{
1095ca02815Sjsg 		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
1105ca02815Sjsg 		.max_width = 2048,
1115ca02815Sjsg 		.max_height = 1152,
1125ca02815Sjsg 		.max_pixels_per_frame = 2048 * 1152,
1135ca02815Sjsg 		.max_level = 41,
1145ca02815Sjsg 	},
1155ca02815Sjsg 	{
1165ca02815Sjsg 		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
1175ca02815Sjsg 		.max_width = 2048,
1185ca02815Sjsg 		.max_height = 1152,
1195ca02815Sjsg 		.max_pixels_per_frame = 2048 * 1152,
1205ca02815Sjsg 		.max_level = 4,
1215ca02815Sjsg 	},
1225ca02815Sjsg };
1235ca02815Sjsg 
1245ca02815Sjsg static const struct amdgpu_video_codecs cik_video_codecs_decode =
1255ca02815Sjsg {
1265ca02815Sjsg 	.codec_count = ARRAY_SIZE(cik_video_codecs_decode_array),
1275ca02815Sjsg 	.codec_array = cik_video_codecs_decode_array,
1285ca02815Sjsg };
1295ca02815Sjsg 
cik_query_video_codecs(struct amdgpu_device * adev,bool encode,const struct amdgpu_video_codecs ** codecs)1305ca02815Sjsg static int cik_query_video_codecs(struct amdgpu_device *adev, bool encode,
1315ca02815Sjsg 				  const struct amdgpu_video_codecs **codecs)
1325ca02815Sjsg {
1335ca02815Sjsg 	switch (adev->asic_type) {
1345ca02815Sjsg 	case CHIP_BONAIRE:
1355ca02815Sjsg 	case CHIP_HAWAII:
1365ca02815Sjsg 	case CHIP_KAVERI:
1375ca02815Sjsg 	case CHIP_KABINI:
1385ca02815Sjsg 	case CHIP_MULLINS:
1395ca02815Sjsg 		if (encode)
1405ca02815Sjsg 			*codecs = &cik_video_codecs_encode;
1415ca02815Sjsg 		else
1425ca02815Sjsg 			*codecs = &cik_video_codecs_decode;
1435ca02815Sjsg 		return 0;
1445ca02815Sjsg 	default:
1455ca02815Sjsg 		return -EINVAL;
1465ca02815Sjsg 	}
1475ca02815Sjsg }
148fb4d8502Sjsg 
149fb4d8502Sjsg /*
150fb4d8502Sjsg  * Indirect registers accessor
151fb4d8502Sjsg  */
cik_pcie_rreg(struct amdgpu_device * adev,u32 reg)152fb4d8502Sjsg static u32 cik_pcie_rreg(struct amdgpu_device *adev, u32 reg)
153fb4d8502Sjsg {
154fb4d8502Sjsg 	unsigned long flags;
155fb4d8502Sjsg 	u32 r;
156fb4d8502Sjsg 
157fb4d8502Sjsg 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
158fb4d8502Sjsg 	WREG32(mmPCIE_INDEX, reg);
159fb4d8502Sjsg 	(void)RREG32(mmPCIE_INDEX);
160fb4d8502Sjsg 	r = RREG32(mmPCIE_DATA);
161fb4d8502Sjsg 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
162fb4d8502Sjsg 	return r;
163fb4d8502Sjsg }
164fb4d8502Sjsg 
cik_pcie_wreg(struct amdgpu_device * adev,u32 reg,u32 v)165fb4d8502Sjsg static void cik_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
166fb4d8502Sjsg {
167fb4d8502Sjsg 	unsigned long flags;
168fb4d8502Sjsg 
169fb4d8502Sjsg 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
170fb4d8502Sjsg 	WREG32(mmPCIE_INDEX, reg);
171fb4d8502Sjsg 	(void)RREG32(mmPCIE_INDEX);
172fb4d8502Sjsg 	WREG32(mmPCIE_DATA, v);
173fb4d8502Sjsg 	(void)RREG32(mmPCIE_DATA);
174fb4d8502Sjsg 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
175fb4d8502Sjsg }
176fb4d8502Sjsg 
cik_smc_rreg(struct amdgpu_device * adev,u32 reg)177fb4d8502Sjsg static u32 cik_smc_rreg(struct amdgpu_device *adev, u32 reg)
178fb4d8502Sjsg {
179fb4d8502Sjsg 	unsigned long flags;
180fb4d8502Sjsg 	u32 r;
181fb4d8502Sjsg 
182fb4d8502Sjsg 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
183fb4d8502Sjsg 	WREG32(mmSMC_IND_INDEX_0, (reg));
184fb4d8502Sjsg 	r = RREG32(mmSMC_IND_DATA_0);
185fb4d8502Sjsg 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
186fb4d8502Sjsg 	return r;
187fb4d8502Sjsg }
188fb4d8502Sjsg 
cik_smc_wreg(struct amdgpu_device * adev,u32 reg,u32 v)189fb4d8502Sjsg static void cik_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
190fb4d8502Sjsg {
191fb4d8502Sjsg 	unsigned long flags;
192fb4d8502Sjsg 
193fb4d8502Sjsg 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
194fb4d8502Sjsg 	WREG32(mmSMC_IND_INDEX_0, (reg));
195fb4d8502Sjsg 	WREG32(mmSMC_IND_DATA_0, (v));
196fb4d8502Sjsg 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
197fb4d8502Sjsg }
198fb4d8502Sjsg 
cik_uvd_ctx_rreg(struct amdgpu_device * adev,u32 reg)199fb4d8502Sjsg static u32 cik_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
200fb4d8502Sjsg {
201fb4d8502Sjsg 	unsigned long flags;
202fb4d8502Sjsg 	u32 r;
203fb4d8502Sjsg 
204fb4d8502Sjsg 	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
205fb4d8502Sjsg 	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
206fb4d8502Sjsg 	r = RREG32(mmUVD_CTX_DATA);
207fb4d8502Sjsg 	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
208fb4d8502Sjsg 	return r;
209fb4d8502Sjsg }
210fb4d8502Sjsg 
cik_uvd_ctx_wreg(struct amdgpu_device * adev,u32 reg,u32 v)211fb4d8502Sjsg static void cik_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
212fb4d8502Sjsg {
213fb4d8502Sjsg 	unsigned long flags;
214fb4d8502Sjsg 
215fb4d8502Sjsg 	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
216fb4d8502Sjsg 	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
217fb4d8502Sjsg 	WREG32(mmUVD_CTX_DATA, (v));
218fb4d8502Sjsg 	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
219fb4d8502Sjsg }
220fb4d8502Sjsg 
cik_didt_rreg(struct amdgpu_device * adev,u32 reg)221fb4d8502Sjsg static u32 cik_didt_rreg(struct amdgpu_device *adev, u32 reg)
222fb4d8502Sjsg {
223fb4d8502Sjsg 	unsigned long flags;
224fb4d8502Sjsg 	u32 r;
225fb4d8502Sjsg 
226fb4d8502Sjsg 	spin_lock_irqsave(&adev->didt_idx_lock, flags);
227fb4d8502Sjsg 	WREG32(mmDIDT_IND_INDEX, (reg));
228fb4d8502Sjsg 	r = RREG32(mmDIDT_IND_DATA);
229fb4d8502Sjsg 	spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
230fb4d8502Sjsg 	return r;
231fb4d8502Sjsg }
232fb4d8502Sjsg 
cik_didt_wreg(struct amdgpu_device * adev,u32 reg,u32 v)233fb4d8502Sjsg static void cik_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
234fb4d8502Sjsg {
235fb4d8502Sjsg 	unsigned long flags;
236fb4d8502Sjsg 
237fb4d8502Sjsg 	spin_lock_irqsave(&adev->didt_idx_lock, flags);
238fb4d8502Sjsg 	WREG32(mmDIDT_IND_INDEX, (reg));
239fb4d8502Sjsg 	WREG32(mmDIDT_IND_DATA, (v));
240fb4d8502Sjsg 	spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
241fb4d8502Sjsg }
242fb4d8502Sjsg 
243fb4d8502Sjsg static const u32 bonaire_golden_spm_registers[] =
244fb4d8502Sjsg {
245fb4d8502Sjsg 	0xc200, 0xe0ffffff, 0xe0000000
246fb4d8502Sjsg };
247fb4d8502Sjsg 
248fb4d8502Sjsg static const u32 bonaire_golden_common_registers[] =
249fb4d8502Sjsg {
250fb4d8502Sjsg 	0x31dc, 0xffffffff, 0x00000800,
251fb4d8502Sjsg 	0x31dd, 0xffffffff, 0x00000800,
252fb4d8502Sjsg 	0x31e6, 0xffffffff, 0x00007fbf,
253fb4d8502Sjsg 	0x31e7, 0xffffffff, 0x00007faf
254fb4d8502Sjsg };
255fb4d8502Sjsg 
256fb4d8502Sjsg static const u32 bonaire_golden_registers[] =
257fb4d8502Sjsg {
258fb4d8502Sjsg 	0xcd5, 0x00000333, 0x00000333,
259fb4d8502Sjsg 	0xcd4, 0x000c0fc0, 0x00040200,
260fb4d8502Sjsg 	0x2684, 0x00010000, 0x00058208,
261fb4d8502Sjsg 	0xf000, 0xffff1fff, 0x00140000,
262fb4d8502Sjsg 	0xf080, 0xfdfc0fff, 0x00000100,
263fb4d8502Sjsg 	0xf08d, 0x40000000, 0x40000200,
264fb4d8502Sjsg 	0x260c, 0xffffffff, 0x00000000,
265fb4d8502Sjsg 	0x260d, 0xf00fffff, 0x00000400,
266fb4d8502Sjsg 	0x260e, 0x0002021c, 0x00020200,
267fb4d8502Sjsg 	0x31e, 0x00000080, 0x00000000,
268fb4d8502Sjsg 	0x16ec, 0x000000f0, 0x00000070,
269fb4d8502Sjsg 	0x16f0, 0xf0311fff, 0x80300000,
270fb4d8502Sjsg 	0x263e, 0x73773777, 0x12010001,
271fb4d8502Sjsg 	0xd43, 0x00810000, 0x408af000,
272fb4d8502Sjsg 	0x1c0c, 0x31000111, 0x00000011,
273fb4d8502Sjsg 	0xbd2, 0x73773777, 0x12010001,
274fb4d8502Sjsg 	0x883, 0x00007fb6, 0x0021a1b1,
275fb4d8502Sjsg 	0x884, 0x00007fb6, 0x002021b1,
276fb4d8502Sjsg 	0x860, 0x00007fb6, 0x00002191,
277fb4d8502Sjsg 	0x886, 0x00007fb6, 0x002121b1,
278fb4d8502Sjsg 	0x887, 0x00007fb6, 0x002021b1,
279fb4d8502Sjsg 	0x877, 0x00007fb6, 0x00002191,
280fb4d8502Sjsg 	0x878, 0x00007fb6, 0x00002191,
281fb4d8502Sjsg 	0xd8a, 0x0000003f, 0x0000000a,
282fb4d8502Sjsg 	0xd8b, 0x0000003f, 0x0000000a,
283fb4d8502Sjsg 	0xab9, 0x00073ffe, 0x000022a2,
284fb4d8502Sjsg 	0x903, 0x000007ff, 0x00000000,
285fb4d8502Sjsg 	0x2285, 0xf000003f, 0x00000007,
286fb4d8502Sjsg 	0x22fc, 0x00002001, 0x00000001,
287fb4d8502Sjsg 	0x22c9, 0xffffffff, 0x00ffffff,
288fb4d8502Sjsg 	0xc281, 0x0000ff0f, 0x00000000,
289fb4d8502Sjsg 	0xa293, 0x07ffffff, 0x06000000,
290fb4d8502Sjsg 	0x136, 0x00000fff, 0x00000100,
291fb4d8502Sjsg 	0xf9e, 0x00000001, 0x00000002,
292fb4d8502Sjsg 	0x2440, 0x03000000, 0x0362c688,
293fb4d8502Sjsg 	0x2300, 0x000000ff, 0x00000001,
294fb4d8502Sjsg 	0x390, 0x00001fff, 0x00001fff,
295fb4d8502Sjsg 	0x2418, 0x0000007f, 0x00000020,
296fb4d8502Sjsg 	0x2542, 0x00010000, 0x00010000,
297fb4d8502Sjsg 	0x2b05, 0x000003ff, 0x000000f3,
298fb4d8502Sjsg 	0x2b03, 0xffffffff, 0x00001032
299fb4d8502Sjsg };
300fb4d8502Sjsg 
301fb4d8502Sjsg static const u32 bonaire_mgcg_cgcg_init[] =
302fb4d8502Sjsg {
303fb4d8502Sjsg 	0x3108, 0xffffffff, 0xfffffffc,
304fb4d8502Sjsg 	0xc200, 0xffffffff, 0xe0000000,
305fb4d8502Sjsg 	0xf0a8, 0xffffffff, 0x00000100,
306fb4d8502Sjsg 	0xf082, 0xffffffff, 0x00000100,
307fb4d8502Sjsg 	0xf0b0, 0xffffffff, 0xc0000100,
308fb4d8502Sjsg 	0xf0b2, 0xffffffff, 0xc0000100,
309fb4d8502Sjsg 	0xf0b1, 0xffffffff, 0xc0000100,
310fb4d8502Sjsg 	0x1579, 0xffffffff, 0x00600100,
311fb4d8502Sjsg 	0xf0a0, 0xffffffff, 0x00000100,
312fb4d8502Sjsg 	0xf085, 0xffffffff, 0x06000100,
313fb4d8502Sjsg 	0xf088, 0xffffffff, 0x00000100,
314fb4d8502Sjsg 	0xf086, 0xffffffff, 0x06000100,
315fb4d8502Sjsg 	0xf081, 0xffffffff, 0x00000100,
316fb4d8502Sjsg 	0xf0b8, 0xffffffff, 0x00000100,
317fb4d8502Sjsg 	0xf089, 0xffffffff, 0x00000100,
318fb4d8502Sjsg 	0xf080, 0xffffffff, 0x00000100,
319fb4d8502Sjsg 	0xf08c, 0xffffffff, 0x00000100,
320fb4d8502Sjsg 	0xf08d, 0xffffffff, 0x00000100,
321fb4d8502Sjsg 	0xf094, 0xffffffff, 0x00000100,
322fb4d8502Sjsg 	0xf095, 0xffffffff, 0x00000100,
323fb4d8502Sjsg 	0xf096, 0xffffffff, 0x00000100,
324fb4d8502Sjsg 	0xf097, 0xffffffff, 0x00000100,
325fb4d8502Sjsg 	0xf098, 0xffffffff, 0x00000100,
326fb4d8502Sjsg 	0xf09f, 0xffffffff, 0x00000100,
327fb4d8502Sjsg 	0xf09e, 0xffffffff, 0x00000100,
328fb4d8502Sjsg 	0xf084, 0xffffffff, 0x06000100,
329fb4d8502Sjsg 	0xf0a4, 0xffffffff, 0x00000100,
330fb4d8502Sjsg 	0xf09d, 0xffffffff, 0x00000100,
331fb4d8502Sjsg 	0xf0ad, 0xffffffff, 0x00000100,
332fb4d8502Sjsg 	0xf0ac, 0xffffffff, 0x00000100,
333fb4d8502Sjsg 	0xf09c, 0xffffffff, 0x00000100,
334fb4d8502Sjsg 	0xc200, 0xffffffff, 0xe0000000,
335fb4d8502Sjsg 	0xf008, 0xffffffff, 0x00010000,
336fb4d8502Sjsg 	0xf009, 0xffffffff, 0x00030002,
337fb4d8502Sjsg 	0xf00a, 0xffffffff, 0x00040007,
338fb4d8502Sjsg 	0xf00b, 0xffffffff, 0x00060005,
339fb4d8502Sjsg 	0xf00c, 0xffffffff, 0x00090008,
340fb4d8502Sjsg 	0xf00d, 0xffffffff, 0x00010000,
341fb4d8502Sjsg 	0xf00e, 0xffffffff, 0x00030002,
342fb4d8502Sjsg 	0xf00f, 0xffffffff, 0x00040007,
343fb4d8502Sjsg 	0xf010, 0xffffffff, 0x00060005,
344fb4d8502Sjsg 	0xf011, 0xffffffff, 0x00090008,
345fb4d8502Sjsg 	0xf012, 0xffffffff, 0x00010000,
346fb4d8502Sjsg 	0xf013, 0xffffffff, 0x00030002,
347fb4d8502Sjsg 	0xf014, 0xffffffff, 0x00040007,
348fb4d8502Sjsg 	0xf015, 0xffffffff, 0x00060005,
349fb4d8502Sjsg 	0xf016, 0xffffffff, 0x00090008,
350fb4d8502Sjsg 	0xf017, 0xffffffff, 0x00010000,
351fb4d8502Sjsg 	0xf018, 0xffffffff, 0x00030002,
352fb4d8502Sjsg 	0xf019, 0xffffffff, 0x00040007,
353fb4d8502Sjsg 	0xf01a, 0xffffffff, 0x00060005,
354fb4d8502Sjsg 	0xf01b, 0xffffffff, 0x00090008,
355fb4d8502Sjsg 	0xf01c, 0xffffffff, 0x00010000,
356fb4d8502Sjsg 	0xf01d, 0xffffffff, 0x00030002,
357fb4d8502Sjsg 	0xf01e, 0xffffffff, 0x00040007,
358fb4d8502Sjsg 	0xf01f, 0xffffffff, 0x00060005,
359fb4d8502Sjsg 	0xf020, 0xffffffff, 0x00090008,
360fb4d8502Sjsg 	0xf021, 0xffffffff, 0x00010000,
361fb4d8502Sjsg 	0xf022, 0xffffffff, 0x00030002,
362fb4d8502Sjsg 	0xf023, 0xffffffff, 0x00040007,
363fb4d8502Sjsg 	0xf024, 0xffffffff, 0x00060005,
364fb4d8502Sjsg 	0xf025, 0xffffffff, 0x00090008,
365fb4d8502Sjsg 	0xf026, 0xffffffff, 0x00010000,
366fb4d8502Sjsg 	0xf027, 0xffffffff, 0x00030002,
367fb4d8502Sjsg 	0xf028, 0xffffffff, 0x00040007,
368fb4d8502Sjsg 	0xf029, 0xffffffff, 0x00060005,
369fb4d8502Sjsg 	0xf02a, 0xffffffff, 0x00090008,
370fb4d8502Sjsg 	0xf000, 0xffffffff, 0x96e00200,
371fb4d8502Sjsg 	0x21c2, 0xffffffff, 0x00900100,
372fb4d8502Sjsg 	0x3109, 0xffffffff, 0x0020003f,
373fb4d8502Sjsg 	0xe, 0xffffffff, 0x0140001c,
374fb4d8502Sjsg 	0xf, 0x000f0000, 0x000f0000,
375fb4d8502Sjsg 	0x88, 0xffffffff, 0xc060000c,
376fb4d8502Sjsg 	0x89, 0xc0000fff, 0x00000100,
377fb4d8502Sjsg 	0x3e4, 0xffffffff, 0x00000100,
378fb4d8502Sjsg 	0x3e6, 0x00000101, 0x00000000,
379fb4d8502Sjsg 	0x82a, 0xffffffff, 0x00000104,
380fb4d8502Sjsg 	0x1579, 0xff000fff, 0x00000100,
381fb4d8502Sjsg 	0xc33, 0xc0000fff, 0x00000104,
382fb4d8502Sjsg 	0x3079, 0x00000001, 0x00000001,
383fb4d8502Sjsg 	0x3403, 0xff000ff0, 0x00000100,
384fb4d8502Sjsg 	0x3603, 0xff000ff0, 0x00000100
385fb4d8502Sjsg };
386fb4d8502Sjsg 
387fb4d8502Sjsg static const u32 spectre_golden_spm_registers[] =
388fb4d8502Sjsg {
389fb4d8502Sjsg 	0xc200, 0xe0ffffff, 0xe0000000
390fb4d8502Sjsg };
391fb4d8502Sjsg 
392fb4d8502Sjsg static const u32 spectre_golden_common_registers[] =
393fb4d8502Sjsg {
394fb4d8502Sjsg 	0x31dc, 0xffffffff, 0x00000800,
395fb4d8502Sjsg 	0x31dd, 0xffffffff, 0x00000800,
396fb4d8502Sjsg 	0x31e6, 0xffffffff, 0x00007fbf,
397fb4d8502Sjsg 	0x31e7, 0xffffffff, 0x00007faf
398fb4d8502Sjsg };
399fb4d8502Sjsg 
400fb4d8502Sjsg static const u32 spectre_golden_registers[] =
401fb4d8502Sjsg {
402fb4d8502Sjsg 	0xf000, 0xffff1fff, 0x96940200,
403fb4d8502Sjsg 	0xf003, 0xffff0001, 0xff000000,
404fb4d8502Sjsg 	0xf080, 0xfffc0fff, 0x00000100,
405fb4d8502Sjsg 	0x1bb6, 0x00010101, 0x00010000,
406fb4d8502Sjsg 	0x260d, 0xf00fffff, 0x00000400,
407fb4d8502Sjsg 	0x260e, 0xfffffffc, 0x00020200,
408fb4d8502Sjsg 	0x16ec, 0x000000f0, 0x00000070,
409fb4d8502Sjsg 	0x16f0, 0xf0311fff, 0x80300000,
410fb4d8502Sjsg 	0x263e, 0x73773777, 0x12010001,
411fb4d8502Sjsg 	0x26df, 0x00ff0000, 0x00fc0000,
412fb4d8502Sjsg 	0xbd2, 0x73773777, 0x12010001,
413fb4d8502Sjsg 	0x2285, 0xf000003f, 0x00000007,
414fb4d8502Sjsg 	0x22c9, 0xffffffff, 0x00ffffff,
415fb4d8502Sjsg 	0xa0d4, 0x3f3f3fff, 0x00000082,
416fb4d8502Sjsg 	0xa0d5, 0x0000003f, 0x00000000,
417fb4d8502Sjsg 	0xf9e, 0x00000001, 0x00000002,
418fb4d8502Sjsg 	0x244f, 0xffff03df, 0x00000004,
419fb4d8502Sjsg 	0x31da, 0x00000008, 0x00000008,
420fb4d8502Sjsg 	0x2300, 0x000008ff, 0x00000800,
421fb4d8502Sjsg 	0x2542, 0x00010000, 0x00010000,
422fb4d8502Sjsg 	0x2b03, 0xffffffff, 0x54763210,
423fb4d8502Sjsg 	0x853e, 0x01ff01ff, 0x00000002,
424fb4d8502Sjsg 	0x8526, 0x007ff800, 0x00200000,
425fb4d8502Sjsg 	0x8057, 0xffffffff, 0x00000f40,
426fb4d8502Sjsg 	0xc24d, 0xffffffff, 0x00000001
427fb4d8502Sjsg };
428fb4d8502Sjsg 
429fb4d8502Sjsg static const u32 spectre_mgcg_cgcg_init[] =
430fb4d8502Sjsg {
431fb4d8502Sjsg 	0x3108, 0xffffffff, 0xfffffffc,
432fb4d8502Sjsg 	0xc200, 0xffffffff, 0xe0000000,
433fb4d8502Sjsg 	0xf0a8, 0xffffffff, 0x00000100,
434fb4d8502Sjsg 	0xf082, 0xffffffff, 0x00000100,
435fb4d8502Sjsg 	0xf0b0, 0xffffffff, 0x00000100,
436fb4d8502Sjsg 	0xf0b2, 0xffffffff, 0x00000100,
437fb4d8502Sjsg 	0xf0b1, 0xffffffff, 0x00000100,
438fb4d8502Sjsg 	0x1579, 0xffffffff, 0x00600100,
439fb4d8502Sjsg 	0xf0a0, 0xffffffff, 0x00000100,
440fb4d8502Sjsg 	0xf085, 0xffffffff, 0x06000100,
441fb4d8502Sjsg 	0xf088, 0xffffffff, 0x00000100,
442fb4d8502Sjsg 	0xf086, 0xffffffff, 0x06000100,
443fb4d8502Sjsg 	0xf081, 0xffffffff, 0x00000100,
444fb4d8502Sjsg 	0xf0b8, 0xffffffff, 0x00000100,
445fb4d8502Sjsg 	0xf089, 0xffffffff, 0x00000100,
446fb4d8502Sjsg 	0xf080, 0xffffffff, 0x00000100,
447fb4d8502Sjsg 	0xf08c, 0xffffffff, 0x00000100,
448fb4d8502Sjsg 	0xf08d, 0xffffffff, 0x00000100,
449fb4d8502Sjsg 	0xf094, 0xffffffff, 0x00000100,
450fb4d8502Sjsg 	0xf095, 0xffffffff, 0x00000100,
451fb4d8502Sjsg 	0xf096, 0xffffffff, 0x00000100,
452fb4d8502Sjsg 	0xf097, 0xffffffff, 0x00000100,
453fb4d8502Sjsg 	0xf098, 0xffffffff, 0x00000100,
454fb4d8502Sjsg 	0xf09f, 0xffffffff, 0x00000100,
455fb4d8502Sjsg 	0xf09e, 0xffffffff, 0x00000100,
456fb4d8502Sjsg 	0xf084, 0xffffffff, 0x06000100,
457fb4d8502Sjsg 	0xf0a4, 0xffffffff, 0x00000100,
458fb4d8502Sjsg 	0xf09d, 0xffffffff, 0x00000100,
459fb4d8502Sjsg 	0xf0ad, 0xffffffff, 0x00000100,
460fb4d8502Sjsg 	0xf0ac, 0xffffffff, 0x00000100,
461fb4d8502Sjsg 	0xf09c, 0xffffffff, 0x00000100,
462fb4d8502Sjsg 	0xc200, 0xffffffff, 0xe0000000,
463fb4d8502Sjsg 	0xf008, 0xffffffff, 0x00010000,
464fb4d8502Sjsg 	0xf009, 0xffffffff, 0x00030002,
465fb4d8502Sjsg 	0xf00a, 0xffffffff, 0x00040007,
466fb4d8502Sjsg 	0xf00b, 0xffffffff, 0x00060005,
467fb4d8502Sjsg 	0xf00c, 0xffffffff, 0x00090008,
468fb4d8502Sjsg 	0xf00d, 0xffffffff, 0x00010000,
469fb4d8502Sjsg 	0xf00e, 0xffffffff, 0x00030002,
470fb4d8502Sjsg 	0xf00f, 0xffffffff, 0x00040007,
471fb4d8502Sjsg 	0xf010, 0xffffffff, 0x00060005,
472fb4d8502Sjsg 	0xf011, 0xffffffff, 0x00090008,
473fb4d8502Sjsg 	0xf012, 0xffffffff, 0x00010000,
474fb4d8502Sjsg 	0xf013, 0xffffffff, 0x00030002,
475fb4d8502Sjsg 	0xf014, 0xffffffff, 0x00040007,
476fb4d8502Sjsg 	0xf015, 0xffffffff, 0x00060005,
477fb4d8502Sjsg 	0xf016, 0xffffffff, 0x00090008,
478fb4d8502Sjsg 	0xf017, 0xffffffff, 0x00010000,
479fb4d8502Sjsg 	0xf018, 0xffffffff, 0x00030002,
480fb4d8502Sjsg 	0xf019, 0xffffffff, 0x00040007,
481fb4d8502Sjsg 	0xf01a, 0xffffffff, 0x00060005,
482fb4d8502Sjsg 	0xf01b, 0xffffffff, 0x00090008,
483fb4d8502Sjsg 	0xf01c, 0xffffffff, 0x00010000,
484fb4d8502Sjsg 	0xf01d, 0xffffffff, 0x00030002,
485fb4d8502Sjsg 	0xf01e, 0xffffffff, 0x00040007,
486fb4d8502Sjsg 	0xf01f, 0xffffffff, 0x00060005,
487fb4d8502Sjsg 	0xf020, 0xffffffff, 0x00090008,
488fb4d8502Sjsg 	0xf021, 0xffffffff, 0x00010000,
489fb4d8502Sjsg 	0xf022, 0xffffffff, 0x00030002,
490fb4d8502Sjsg 	0xf023, 0xffffffff, 0x00040007,
491fb4d8502Sjsg 	0xf024, 0xffffffff, 0x00060005,
492fb4d8502Sjsg 	0xf025, 0xffffffff, 0x00090008,
493fb4d8502Sjsg 	0xf026, 0xffffffff, 0x00010000,
494fb4d8502Sjsg 	0xf027, 0xffffffff, 0x00030002,
495fb4d8502Sjsg 	0xf028, 0xffffffff, 0x00040007,
496fb4d8502Sjsg 	0xf029, 0xffffffff, 0x00060005,
497fb4d8502Sjsg 	0xf02a, 0xffffffff, 0x00090008,
498fb4d8502Sjsg 	0xf02b, 0xffffffff, 0x00010000,
499fb4d8502Sjsg 	0xf02c, 0xffffffff, 0x00030002,
500fb4d8502Sjsg 	0xf02d, 0xffffffff, 0x00040007,
501fb4d8502Sjsg 	0xf02e, 0xffffffff, 0x00060005,
502fb4d8502Sjsg 	0xf02f, 0xffffffff, 0x00090008,
503fb4d8502Sjsg 	0xf000, 0xffffffff, 0x96e00200,
504fb4d8502Sjsg 	0x21c2, 0xffffffff, 0x00900100,
505fb4d8502Sjsg 	0x3109, 0xffffffff, 0x0020003f,
506fb4d8502Sjsg 	0xe, 0xffffffff, 0x0140001c,
507fb4d8502Sjsg 	0xf, 0x000f0000, 0x000f0000,
508fb4d8502Sjsg 	0x88, 0xffffffff, 0xc060000c,
509fb4d8502Sjsg 	0x89, 0xc0000fff, 0x00000100,
510fb4d8502Sjsg 	0x3e4, 0xffffffff, 0x00000100,
511fb4d8502Sjsg 	0x3e6, 0x00000101, 0x00000000,
512fb4d8502Sjsg 	0x82a, 0xffffffff, 0x00000104,
513fb4d8502Sjsg 	0x1579, 0xff000fff, 0x00000100,
514fb4d8502Sjsg 	0xc33, 0xc0000fff, 0x00000104,
515fb4d8502Sjsg 	0x3079, 0x00000001, 0x00000001,
516fb4d8502Sjsg 	0x3403, 0xff000ff0, 0x00000100,
517fb4d8502Sjsg 	0x3603, 0xff000ff0, 0x00000100
518fb4d8502Sjsg };
519fb4d8502Sjsg 
520fb4d8502Sjsg static const u32 kalindi_golden_spm_registers[] =
521fb4d8502Sjsg {
522fb4d8502Sjsg 	0xc200, 0xe0ffffff, 0xe0000000
523fb4d8502Sjsg };
524fb4d8502Sjsg 
525fb4d8502Sjsg static const u32 kalindi_golden_common_registers[] =
526fb4d8502Sjsg {
527fb4d8502Sjsg 	0x31dc, 0xffffffff, 0x00000800,
528fb4d8502Sjsg 	0x31dd, 0xffffffff, 0x00000800,
529fb4d8502Sjsg 	0x31e6, 0xffffffff, 0x00007fbf,
530fb4d8502Sjsg 	0x31e7, 0xffffffff, 0x00007faf
531fb4d8502Sjsg };
532fb4d8502Sjsg 
533fb4d8502Sjsg static const u32 kalindi_golden_registers[] =
534fb4d8502Sjsg {
535fb4d8502Sjsg 	0xf000, 0xffffdfff, 0x6e944040,
536fb4d8502Sjsg 	0x1579, 0xff607fff, 0xfc000100,
537fb4d8502Sjsg 	0xf088, 0xff000fff, 0x00000100,
538fb4d8502Sjsg 	0xf089, 0xff000fff, 0x00000100,
539fb4d8502Sjsg 	0xf080, 0xfffc0fff, 0x00000100,
540fb4d8502Sjsg 	0x1bb6, 0x00010101, 0x00010000,
541fb4d8502Sjsg 	0x260c, 0xffffffff, 0x00000000,
542fb4d8502Sjsg 	0x260d, 0xf00fffff, 0x00000400,
543fb4d8502Sjsg 	0x16ec, 0x000000f0, 0x00000070,
544fb4d8502Sjsg 	0x16f0, 0xf0311fff, 0x80300000,
545fb4d8502Sjsg 	0x263e, 0x73773777, 0x12010001,
546fb4d8502Sjsg 	0x263f, 0xffffffff, 0x00000010,
547fb4d8502Sjsg 	0x26df, 0x00ff0000, 0x00fc0000,
548fb4d8502Sjsg 	0x200c, 0x00001f0f, 0x0000100a,
549fb4d8502Sjsg 	0xbd2, 0x73773777, 0x12010001,
550fb4d8502Sjsg 	0x902, 0x000fffff, 0x000c007f,
551fb4d8502Sjsg 	0x2285, 0xf000003f, 0x00000007,
552fb4d8502Sjsg 	0x22c9, 0x3fff3fff, 0x00ffcfff,
553fb4d8502Sjsg 	0xc281, 0x0000ff0f, 0x00000000,
554fb4d8502Sjsg 	0xa293, 0x07ffffff, 0x06000000,
555fb4d8502Sjsg 	0x136, 0x00000fff, 0x00000100,
556fb4d8502Sjsg 	0xf9e, 0x00000001, 0x00000002,
557fb4d8502Sjsg 	0x31da, 0x00000008, 0x00000008,
558fb4d8502Sjsg 	0x2300, 0x000000ff, 0x00000003,
559fb4d8502Sjsg 	0x853e, 0x01ff01ff, 0x00000002,
560fb4d8502Sjsg 	0x8526, 0x007ff800, 0x00200000,
561fb4d8502Sjsg 	0x8057, 0xffffffff, 0x00000f40,
562fb4d8502Sjsg 	0x2231, 0x001f3ae3, 0x00000082,
563fb4d8502Sjsg 	0x2235, 0x0000001f, 0x00000010,
564fb4d8502Sjsg 	0xc24d, 0xffffffff, 0x00000000
565fb4d8502Sjsg };
566fb4d8502Sjsg 
567fb4d8502Sjsg static const u32 kalindi_mgcg_cgcg_init[] =
568fb4d8502Sjsg {
569fb4d8502Sjsg 	0x3108, 0xffffffff, 0xfffffffc,
570fb4d8502Sjsg 	0xc200, 0xffffffff, 0xe0000000,
571fb4d8502Sjsg 	0xf0a8, 0xffffffff, 0x00000100,
572fb4d8502Sjsg 	0xf082, 0xffffffff, 0x00000100,
573fb4d8502Sjsg 	0xf0b0, 0xffffffff, 0x00000100,
574fb4d8502Sjsg 	0xf0b2, 0xffffffff, 0x00000100,
575fb4d8502Sjsg 	0xf0b1, 0xffffffff, 0x00000100,
576fb4d8502Sjsg 	0x1579, 0xffffffff, 0x00600100,
577fb4d8502Sjsg 	0xf0a0, 0xffffffff, 0x00000100,
578fb4d8502Sjsg 	0xf085, 0xffffffff, 0x06000100,
579fb4d8502Sjsg 	0xf088, 0xffffffff, 0x00000100,
580fb4d8502Sjsg 	0xf086, 0xffffffff, 0x06000100,
581fb4d8502Sjsg 	0xf081, 0xffffffff, 0x00000100,
582fb4d8502Sjsg 	0xf0b8, 0xffffffff, 0x00000100,
583fb4d8502Sjsg 	0xf089, 0xffffffff, 0x00000100,
584fb4d8502Sjsg 	0xf080, 0xffffffff, 0x00000100,
585fb4d8502Sjsg 	0xf08c, 0xffffffff, 0x00000100,
586fb4d8502Sjsg 	0xf08d, 0xffffffff, 0x00000100,
587fb4d8502Sjsg 	0xf094, 0xffffffff, 0x00000100,
588fb4d8502Sjsg 	0xf095, 0xffffffff, 0x00000100,
589fb4d8502Sjsg 	0xf096, 0xffffffff, 0x00000100,
590fb4d8502Sjsg 	0xf097, 0xffffffff, 0x00000100,
591fb4d8502Sjsg 	0xf098, 0xffffffff, 0x00000100,
592fb4d8502Sjsg 	0xf09f, 0xffffffff, 0x00000100,
593fb4d8502Sjsg 	0xf09e, 0xffffffff, 0x00000100,
594fb4d8502Sjsg 	0xf084, 0xffffffff, 0x06000100,
595fb4d8502Sjsg 	0xf0a4, 0xffffffff, 0x00000100,
596fb4d8502Sjsg 	0xf09d, 0xffffffff, 0x00000100,
597fb4d8502Sjsg 	0xf0ad, 0xffffffff, 0x00000100,
598fb4d8502Sjsg 	0xf0ac, 0xffffffff, 0x00000100,
599fb4d8502Sjsg 	0xf09c, 0xffffffff, 0x00000100,
600fb4d8502Sjsg 	0xc200, 0xffffffff, 0xe0000000,
601fb4d8502Sjsg 	0xf008, 0xffffffff, 0x00010000,
602fb4d8502Sjsg 	0xf009, 0xffffffff, 0x00030002,
603fb4d8502Sjsg 	0xf00a, 0xffffffff, 0x00040007,
604fb4d8502Sjsg 	0xf00b, 0xffffffff, 0x00060005,
605fb4d8502Sjsg 	0xf00c, 0xffffffff, 0x00090008,
606fb4d8502Sjsg 	0xf00d, 0xffffffff, 0x00010000,
607fb4d8502Sjsg 	0xf00e, 0xffffffff, 0x00030002,
608fb4d8502Sjsg 	0xf00f, 0xffffffff, 0x00040007,
609fb4d8502Sjsg 	0xf010, 0xffffffff, 0x00060005,
610fb4d8502Sjsg 	0xf011, 0xffffffff, 0x00090008,
611fb4d8502Sjsg 	0xf000, 0xffffffff, 0x96e00200,
612fb4d8502Sjsg 	0x21c2, 0xffffffff, 0x00900100,
613fb4d8502Sjsg 	0x3109, 0xffffffff, 0x0020003f,
614fb4d8502Sjsg 	0xe, 0xffffffff, 0x0140001c,
615fb4d8502Sjsg 	0xf, 0x000f0000, 0x000f0000,
616fb4d8502Sjsg 	0x88, 0xffffffff, 0xc060000c,
617fb4d8502Sjsg 	0x89, 0xc0000fff, 0x00000100,
618fb4d8502Sjsg 	0x82a, 0xffffffff, 0x00000104,
619fb4d8502Sjsg 	0x1579, 0xff000fff, 0x00000100,
620fb4d8502Sjsg 	0xc33, 0xc0000fff, 0x00000104,
621fb4d8502Sjsg 	0x3079, 0x00000001, 0x00000001,
622fb4d8502Sjsg 	0x3403, 0xff000ff0, 0x00000100,
623fb4d8502Sjsg 	0x3603, 0xff000ff0, 0x00000100
624fb4d8502Sjsg };
625fb4d8502Sjsg 
626fb4d8502Sjsg static const u32 hawaii_golden_spm_registers[] =
627fb4d8502Sjsg {
628fb4d8502Sjsg 	0xc200, 0xe0ffffff, 0xe0000000
629fb4d8502Sjsg };
630fb4d8502Sjsg 
631fb4d8502Sjsg static const u32 hawaii_golden_common_registers[] =
632fb4d8502Sjsg {
633fb4d8502Sjsg 	0xc200, 0xffffffff, 0xe0000000,
634fb4d8502Sjsg 	0xa0d4, 0xffffffff, 0x3a00161a,
635fb4d8502Sjsg 	0xa0d5, 0xffffffff, 0x0000002e,
636fb4d8502Sjsg 	0x2684, 0xffffffff, 0x00018208,
637fb4d8502Sjsg 	0x263e, 0xffffffff, 0x12011003
638fb4d8502Sjsg };
639fb4d8502Sjsg 
640fb4d8502Sjsg static const u32 hawaii_golden_registers[] =
641fb4d8502Sjsg {
642fb4d8502Sjsg 	0xcd5, 0x00000333, 0x00000333,
643fb4d8502Sjsg 	0x2684, 0x00010000, 0x00058208,
644fb4d8502Sjsg 	0x260c, 0xffffffff, 0x00000000,
645fb4d8502Sjsg 	0x260d, 0xf00fffff, 0x00000400,
646fb4d8502Sjsg 	0x260e, 0x0002021c, 0x00020200,
647fb4d8502Sjsg 	0x31e, 0x00000080, 0x00000000,
648fb4d8502Sjsg 	0x16ec, 0x000000f0, 0x00000070,
649fb4d8502Sjsg 	0x16f0, 0xf0311fff, 0x80300000,
650fb4d8502Sjsg 	0xd43, 0x00810000, 0x408af000,
651fb4d8502Sjsg 	0x1c0c, 0x31000111, 0x00000011,
652fb4d8502Sjsg 	0xbd2, 0x73773777, 0x12010001,
653fb4d8502Sjsg 	0x848, 0x0000007f, 0x0000001b,
654fb4d8502Sjsg 	0x877, 0x00007fb6, 0x00002191,
655fb4d8502Sjsg 	0xd8a, 0x0000003f, 0x0000000a,
656fb4d8502Sjsg 	0xd8b, 0x0000003f, 0x0000000a,
657fb4d8502Sjsg 	0xab9, 0x00073ffe, 0x000022a2,
658fb4d8502Sjsg 	0x903, 0x000007ff, 0x00000000,
659fb4d8502Sjsg 	0x22fc, 0x00002001, 0x00000001,
660fb4d8502Sjsg 	0x22c9, 0xffffffff, 0x00ffffff,
661fb4d8502Sjsg 	0xc281, 0x0000ff0f, 0x00000000,
662fb4d8502Sjsg 	0xa293, 0x07ffffff, 0x06000000,
663fb4d8502Sjsg 	0xf9e, 0x00000001, 0x00000002,
664fb4d8502Sjsg 	0x31da, 0x00000008, 0x00000008,
665fb4d8502Sjsg 	0x31dc, 0x00000f00, 0x00000800,
666fb4d8502Sjsg 	0x31dd, 0x00000f00, 0x00000800,
667fb4d8502Sjsg 	0x31e6, 0x00ffffff, 0x00ff7fbf,
668fb4d8502Sjsg 	0x31e7, 0x00ffffff, 0x00ff7faf,
669fb4d8502Sjsg 	0x2300, 0x000000ff, 0x00000800,
670fb4d8502Sjsg 	0x390, 0x00001fff, 0x00001fff,
671fb4d8502Sjsg 	0x2418, 0x0000007f, 0x00000020,
672fb4d8502Sjsg 	0x2542, 0x00010000, 0x00010000,
673fb4d8502Sjsg 	0x2b80, 0x00100000, 0x000ff07c,
674fb4d8502Sjsg 	0x2b05, 0x000003ff, 0x0000000f,
675fb4d8502Sjsg 	0x2b04, 0xffffffff, 0x7564fdec,
676fb4d8502Sjsg 	0x2b03, 0xffffffff, 0x3120b9a8,
677fb4d8502Sjsg 	0x2b02, 0x20000000, 0x0f9c0000
678fb4d8502Sjsg };
679fb4d8502Sjsg 
680fb4d8502Sjsg static const u32 hawaii_mgcg_cgcg_init[] =
681fb4d8502Sjsg {
682fb4d8502Sjsg 	0x3108, 0xffffffff, 0xfffffffd,
683fb4d8502Sjsg 	0xc200, 0xffffffff, 0xe0000000,
684fb4d8502Sjsg 	0xf0a8, 0xffffffff, 0x00000100,
685fb4d8502Sjsg 	0xf082, 0xffffffff, 0x00000100,
686fb4d8502Sjsg 	0xf0b0, 0xffffffff, 0x00000100,
687fb4d8502Sjsg 	0xf0b2, 0xffffffff, 0x00000100,
688fb4d8502Sjsg 	0xf0b1, 0xffffffff, 0x00000100,
689fb4d8502Sjsg 	0x1579, 0xffffffff, 0x00200100,
690fb4d8502Sjsg 	0xf0a0, 0xffffffff, 0x00000100,
691fb4d8502Sjsg 	0xf085, 0xffffffff, 0x06000100,
692fb4d8502Sjsg 	0xf088, 0xffffffff, 0x00000100,
693fb4d8502Sjsg 	0xf086, 0xffffffff, 0x06000100,
694fb4d8502Sjsg 	0xf081, 0xffffffff, 0x00000100,
695fb4d8502Sjsg 	0xf0b8, 0xffffffff, 0x00000100,
696fb4d8502Sjsg 	0xf089, 0xffffffff, 0x00000100,
697fb4d8502Sjsg 	0xf080, 0xffffffff, 0x00000100,
698fb4d8502Sjsg 	0xf08c, 0xffffffff, 0x00000100,
699fb4d8502Sjsg 	0xf08d, 0xffffffff, 0x00000100,
700fb4d8502Sjsg 	0xf094, 0xffffffff, 0x00000100,
701fb4d8502Sjsg 	0xf095, 0xffffffff, 0x00000100,
702fb4d8502Sjsg 	0xf096, 0xffffffff, 0x00000100,
703fb4d8502Sjsg 	0xf097, 0xffffffff, 0x00000100,
704fb4d8502Sjsg 	0xf098, 0xffffffff, 0x00000100,
705fb4d8502Sjsg 	0xf09f, 0xffffffff, 0x00000100,
706fb4d8502Sjsg 	0xf09e, 0xffffffff, 0x00000100,
707fb4d8502Sjsg 	0xf084, 0xffffffff, 0x06000100,
708fb4d8502Sjsg 	0xf0a4, 0xffffffff, 0x00000100,
709fb4d8502Sjsg 	0xf09d, 0xffffffff, 0x00000100,
710fb4d8502Sjsg 	0xf0ad, 0xffffffff, 0x00000100,
711fb4d8502Sjsg 	0xf0ac, 0xffffffff, 0x00000100,
712fb4d8502Sjsg 	0xf09c, 0xffffffff, 0x00000100,
713fb4d8502Sjsg 	0xc200, 0xffffffff, 0xe0000000,
714fb4d8502Sjsg 	0xf008, 0xffffffff, 0x00010000,
715fb4d8502Sjsg 	0xf009, 0xffffffff, 0x00030002,
716fb4d8502Sjsg 	0xf00a, 0xffffffff, 0x00040007,
717fb4d8502Sjsg 	0xf00b, 0xffffffff, 0x00060005,
718fb4d8502Sjsg 	0xf00c, 0xffffffff, 0x00090008,
719fb4d8502Sjsg 	0xf00d, 0xffffffff, 0x00010000,
720fb4d8502Sjsg 	0xf00e, 0xffffffff, 0x00030002,
721fb4d8502Sjsg 	0xf00f, 0xffffffff, 0x00040007,
722fb4d8502Sjsg 	0xf010, 0xffffffff, 0x00060005,
723fb4d8502Sjsg 	0xf011, 0xffffffff, 0x00090008,
724fb4d8502Sjsg 	0xf012, 0xffffffff, 0x00010000,
725fb4d8502Sjsg 	0xf013, 0xffffffff, 0x00030002,
726fb4d8502Sjsg 	0xf014, 0xffffffff, 0x00040007,
727fb4d8502Sjsg 	0xf015, 0xffffffff, 0x00060005,
728fb4d8502Sjsg 	0xf016, 0xffffffff, 0x00090008,
729fb4d8502Sjsg 	0xf017, 0xffffffff, 0x00010000,
730fb4d8502Sjsg 	0xf018, 0xffffffff, 0x00030002,
731fb4d8502Sjsg 	0xf019, 0xffffffff, 0x00040007,
732fb4d8502Sjsg 	0xf01a, 0xffffffff, 0x00060005,
733fb4d8502Sjsg 	0xf01b, 0xffffffff, 0x00090008,
734fb4d8502Sjsg 	0xf01c, 0xffffffff, 0x00010000,
735fb4d8502Sjsg 	0xf01d, 0xffffffff, 0x00030002,
736fb4d8502Sjsg 	0xf01e, 0xffffffff, 0x00040007,
737fb4d8502Sjsg 	0xf01f, 0xffffffff, 0x00060005,
738fb4d8502Sjsg 	0xf020, 0xffffffff, 0x00090008,
739fb4d8502Sjsg 	0xf021, 0xffffffff, 0x00010000,
740fb4d8502Sjsg 	0xf022, 0xffffffff, 0x00030002,
741fb4d8502Sjsg 	0xf023, 0xffffffff, 0x00040007,
742fb4d8502Sjsg 	0xf024, 0xffffffff, 0x00060005,
743fb4d8502Sjsg 	0xf025, 0xffffffff, 0x00090008,
744fb4d8502Sjsg 	0xf026, 0xffffffff, 0x00010000,
745fb4d8502Sjsg 	0xf027, 0xffffffff, 0x00030002,
746fb4d8502Sjsg 	0xf028, 0xffffffff, 0x00040007,
747fb4d8502Sjsg 	0xf029, 0xffffffff, 0x00060005,
748fb4d8502Sjsg 	0xf02a, 0xffffffff, 0x00090008,
749fb4d8502Sjsg 	0xf02b, 0xffffffff, 0x00010000,
750fb4d8502Sjsg 	0xf02c, 0xffffffff, 0x00030002,
751fb4d8502Sjsg 	0xf02d, 0xffffffff, 0x00040007,
752fb4d8502Sjsg 	0xf02e, 0xffffffff, 0x00060005,
753fb4d8502Sjsg 	0xf02f, 0xffffffff, 0x00090008,
754fb4d8502Sjsg 	0xf030, 0xffffffff, 0x00010000,
755fb4d8502Sjsg 	0xf031, 0xffffffff, 0x00030002,
756fb4d8502Sjsg 	0xf032, 0xffffffff, 0x00040007,
757fb4d8502Sjsg 	0xf033, 0xffffffff, 0x00060005,
758fb4d8502Sjsg 	0xf034, 0xffffffff, 0x00090008,
759fb4d8502Sjsg 	0xf035, 0xffffffff, 0x00010000,
760fb4d8502Sjsg 	0xf036, 0xffffffff, 0x00030002,
761fb4d8502Sjsg 	0xf037, 0xffffffff, 0x00040007,
762fb4d8502Sjsg 	0xf038, 0xffffffff, 0x00060005,
763fb4d8502Sjsg 	0xf039, 0xffffffff, 0x00090008,
764fb4d8502Sjsg 	0xf03a, 0xffffffff, 0x00010000,
765fb4d8502Sjsg 	0xf03b, 0xffffffff, 0x00030002,
766fb4d8502Sjsg 	0xf03c, 0xffffffff, 0x00040007,
767fb4d8502Sjsg 	0xf03d, 0xffffffff, 0x00060005,
768fb4d8502Sjsg 	0xf03e, 0xffffffff, 0x00090008,
769fb4d8502Sjsg 	0x30c6, 0xffffffff, 0x00020200,
770fb4d8502Sjsg 	0xcd4, 0xffffffff, 0x00000200,
771fb4d8502Sjsg 	0x570, 0xffffffff, 0x00000400,
772fb4d8502Sjsg 	0x157a, 0xffffffff, 0x00000000,
773fb4d8502Sjsg 	0xbd4, 0xffffffff, 0x00000902,
774fb4d8502Sjsg 	0xf000, 0xffffffff, 0x96940200,
775fb4d8502Sjsg 	0x21c2, 0xffffffff, 0x00900100,
776fb4d8502Sjsg 	0x3109, 0xffffffff, 0x0020003f,
777fb4d8502Sjsg 	0xe, 0xffffffff, 0x0140001c,
778fb4d8502Sjsg 	0xf, 0x000f0000, 0x000f0000,
779fb4d8502Sjsg 	0x88, 0xffffffff, 0xc060000c,
780fb4d8502Sjsg 	0x89, 0xc0000fff, 0x00000100,
781fb4d8502Sjsg 	0x3e4, 0xffffffff, 0x00000100,
782fb4d8502Sjsg 	0x3e6, 0x00000101, 0x00000000,
783fb4d8502Sjsg 	0x82a, 0xffffffff, 0x00000104,
784fb4d8502Sjsg 	0x1579, 0xff000fff, 0x00000100,
785fb4d8502Sjsg 	0xc33, 0xc0000fff, 0x00000104,
786fb4d8502Sjsg 	0x3079, 0x00000001, 0x00000001,
787fb4d8502Sjsg 	0x3403, 0xff000ff0, 0x00000100,
788fb4d8502Sjsg 	0x3603, 0xff000ff0, 0x00000100
789fb4d8502Sjsg };
790fb4d8502Sjsg 
791fb4d8502Sjsg static const u32 godavari_golden_registers[] =
792fb4d8502Sjsg {
793fb4d8502Sjsg 	0x1579, 0xff607fff, 0xfc000100,
794fb4d8502Sjsg 	0x1bb6, 0x00010101, 0x00010000,
795fb4d8502Sjsg 	0x260c, 0xffffffff, 0x00000000,
796fb4d8502Sjsg 	0x260c0, 0xf00fffff, 0x00000400,
797fb4d8502Sjsg 	0x184c, 0xffffffff, 0x00010000,
798fb4d8502Sjsg 	0x16ec, 0x000000f0, 0x00000070,
799fb4d8502Sjsg 	0x16f0, 0xf0311fff, 0x80300000,
800fb4d8502Sjsg 	0x263e, 0x73773777, 0x12010001,
801fb4d8502Sjsg 	0x263f, 0xffffffff, 0x00000010,
802fb4d8502Sjsg 	0x200c, 0x00001f0f, 0x0000100a,
803fb4d8502Sjsg 	0xbd2, 0x73773777, 0x12010001,
804fb4d8502Sjsg 	0x902, 0x000fffff, 0x000c007f,
805fb4d8502Sjsg 	0x2285, 0xf000003f, 0x00000007,
806fb4d8502Sjsg 	0x22c9, 0xffffffff, 0x00ff0fff,
807fb4d8502Sjsg 	0xc281, 0x0000ff0f, 0x00000000,
808fb4d8502Sjsg 	0xa293, 0x07ffffff, 0x06000000,
809fb4d8502Sjsg 	0x136, 0x00000fff, 0x00000100,
810fb4d8502Sjsg 	0x3405, 0x00010000, 0x00810001,
811fb4d8502Sjsg 	0x3605, 0x00010000, 0x00810001,
812fb4d8502Sjsg 	0xf9e, 0x00000001, 0x00000002,
813fb4d8502Sjsg 	0x31da, 0x00000008, 0x00000008,
814fb4d8502Sjsg 	0x31dc, 0x00000f00, 0x00000800,
815fb4d8502Sjsg 	0x31dd, 0x00000f00, 0x00000800,
816fb4d8502Sjsg 	0x31e6, 0x00ffffff, 0x00ff7fbf,
817fb4d8502Sjsg 	0x31e7, 0x00ffffff, 0x00ff7faf,
818fb4d8502Sjsg 	0x2300, 0x000000ff, 0x00000001,
819fb4d8502Sjsg 	0x853e, 0x01ff01ff, 0x00000002,
820fb4d8502Sjsg 	0x8526, 0x007ff800, 0x00200000,
821fb4d8502Sjsg 	0x8057, 0xffffffff, 0x00000f40,
822fb4d8502Sjsg 	0x2231, 0x001f3ae3, 0x00000082,
823fb4d8502Sjsg 	0x2235, 0x0000001f, 0x00000010,
824fb4d8502Sjsg 	0xc24d, 0xffffffff, 0x00000000
825fb4d8502Sjsg };
826fb4d8502Sjsg 
cik_init_golden_registers(struct amdgpu_device * adev)827fb4d8502Sjsg static void cik_init_golden_registers(struct amdgpu_device *adev)
828fb4d8502Sjsg {
829fb4d8502Sjsg 	/* Some of the registers might be dependent on GRBM_GFX_INDEX */
830fb4d8502Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
831fb4d8502Sjsg 
832fb4d8502Sjsg 	switch (adev->asic_type) {
833fb4d8502Sjsg 	case CHIP_BONAIRE:
834fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
835fb4d8502Sjsg 							bonaire_mgcg_cgcg_init,
836fb4d8502Sjsg 							ARRAY_SIZE(bonaire_mgcg_cgcg_init));
837fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
838fb4d8502Sjsg 							bonaire_golden_registers,
839fb4d8502Sjsg 							ARRAY_SIZE(bonaire_golden_registers));
840fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
841fb4d8502Sjsg 							bonaire_golden_common_registers,
842fb4d8502Sjsg 							ARRAY_SIZE(bonaire_golden_common_registers));
843fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
844fb4d8502Sjsg 							bonaire_golden_spm_registers,
845fb4d8502Sjsg 							ARRAY_SIZE(bonaire_golden_spm_registers));
846fb4d8502Sjsg 		break;
847fb4d8502Sjsg 	case CHIP_KABINI:
848fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
849fb4d8502Sjsg 							kalindi_mgcg_cgcg_init,
850fb4d8502Sjsg 							ARRAY_SIZE(kalindi_mgcg_cgcg_init));
851fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
852fb4d8502Sjsg 							kalindi_golden_registers,
853fb4d8502Sjsg 							ARRAY_SIZE(kalindi_golden_registers));
854fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
855fb4d8502Sjsg 							kalindi_golden_common_registers,
856fb4d8502Sjsg 							ARRAY_SIZE(kalindi_golden_common_registers));
857fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
858fb4d8502Sjsg 							kalindi_golden_spm_registers,
859fb4d8502Sjsg 							ARRAY_SIZE(kalindi_golden_spm_registers));
860fb4d8502Sjsg 		break;
861fb4d8502Sjsg 	case CHIP_MULLINS:
862fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
863fb4d8502Sjsg 							kalindi_mgcg_cgcg_init,
864fb4d8502Sjsg 							ARRAY_SIZE(kalindi_mgcg_cgcg_init));
865fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
866fb4d8502Sjsg 							godavari_golden_registers,
867fb4d8502Sjsg 							ARRAY_SIZE(godavari_golden_registers));
868fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
869fb4d8502Sjsg 							kalindi_golden_common_registers,
870fb4d8502Sjsg 							ARRAY_SIZE(kalindi_golden_common_registers));
871fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
872fb4d8502Sjsg 							kalindi_golden_spm_registers,
873fb4d8502Sjsg 							ARRAY_SIZE(kalindi_golden_spm_registers));
874fb4d8502Sjsg 		break;
875fb4d8502Sjsg 	case CHIP_KAVERI:
876fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
877fb4d8502Sjsg 							spectre_mgcg_cgcg_init,
878fb4d8502Sjsg 							ARRAY_SIZE(spectre_mgcg_cgcg_init));
879fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
880fb4d8502Sjsg 							spectre_golden_registers,
881fb4d8502Sjsg 							ARRAY_SIZE(spectre_golden_registers));
882fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
883fb4d8502Sjsg 							spectre_golden_common_registers,
884fb4d8502Sjsg 							ARRAY_SIZE(spectre_golden_common_registers));
885fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
886fb4d8502Sjsg 							spectre_golden_spm_registers,
887fb4d8502Sjsg 							ARRAY_SIZE(spectre_golden_spm_registers));
888fb4d8502Sjsg 		break;
889fb4d8502Sjsg 	case CHIP_HAWAII:
890fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
891fb4d8502Sjsg 							hawaii_mgcg_cgcg_init,
892fb4d8502Sjsg 							ARRAY_SIZE(hawaii_mgcg_cgcg_init));
893fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
894fb4d8502Sjsg 							hawaii_golden_registers,
895fb4d8502Sjsg 							ARRAY_SIZE(hawaii_golden_registers));
896fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
897fb4d8502Sjsg 							hawaii_golden_common_registers,
898fb4d8502Sjsg 							ARRAY_SIZE(hawaii_golden_common_registers));
899fb4d8502Sjsg 		amdgpu_device_program_register_sequence(adev,
900fb4d8502Sjsg 							hawaii_golden_spm_registers,
901fb4d8502Sjsg 							ARRAY_SIZE(hawaii_golden_spm_registers));
902fb4d8502Sjsg 		break;
903fb4d8502Sjsg 	default:
904fb4d8502Sjsg 		break;
905fb4d8502Sjsg 	}
906fb4d8502Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
907fb4d8502Sjsg }
908fb4d8502Sjsg 
909fb4d8502Sjsg /**
910fb4d8502Sjsg  * cik_get_xclk - get the xclk
911fb4d8502Sjsg  *
912fb4d8502Sjsg  * @adev: amdgpu_device pointer
913fb4d8502Sjsg  *
914fb4d8502Sjsg  * Returns the reference clock used by the gfx engine
915fb4d8502Sjsg  * (CIK).
916fb4d8502Sjsg  */
cik_get_xclk(struct amdgpu_device * adev)917fb4d8502Sjsg static u32 cik_get_xclk(struct amdgpu_device *adev)
918fb4d8502Sjsg {
919fb4d8502Sjsg 	u32 reference_clock = adev->clock.spll.reference_freq;
920fb4d8502Sjsg 
921fb4d8502Sjsg 	if (adev->flags & AMD_IS_APU) {
922fb4d8502Sjsg 		if (RREG32_SMC(ixGENERAL_PWRMGT) & GENERAL_PWRMGT__GPU_COUNTER_CLK_MASK)
923fb4d8502Sjsg 			return reference_clock / 2;
924fb4d8502Sjsg 	} else {
925fb4d8502Sjsg 		if (RREG32_SMC(ixCG_CLKPIN_CNTL) & CG_CLKPIN_CNTL__XTALIN_DIVIDE_MASK)
926fb4d8502Sjsg 			return reference_clock / 4;
927fb4d8502Sjsg 	}
928fb4d8502Sjsg 	return reference_clock;
929fb4d8502Sjsg }
930fb4d8502Sjsg 
931fb4d8502Sjsg /**
932fb4d8502Sjsg  * cik_srbm_select - select specific register instances
933fb4d8502Sjsg  *
934fb4d8502Sjsg  * @adev: amdgpu_device pointer
935fb4d8502Sjsg  * @me: selected ME (micro engine)
936fb4d8502Sjsg  * @pipe: pipe
937fb4d8502Sjsg  * @queue: queue
938fb4d8502Sjsg  * @vmid: VMID
939fb4d8502Sjsg  *
940fb4d8502Sjsg  * Switches the currently active registers instances.  Some
941fb4d8502Sjsg  * registers are instanced per VMID, others are instanced per
942fb4d8502Sjsg  * me/pipe/queue combination.
943fb4d8502Sjsg  */
cik_srbm_select(struct amdgpu_device * adev,u32 me,u32 pipe,u32 queue,u32 vmid)944fb4d8502Sjsg void cik_srbm_select(struct amdgpu_device *adev,
945fb4d8502Sjsg 		     u32 me, u32 pipe, u32 queue, u32 vmid)
946fb4d8502Sjsg {
947fb4d8502Sjsg 	u32 srbm_gfx_cntl =
948fb4d8502Sjsg 		(((pipe << SRBM_GFX_CNTL__PIPEID__SHIFT) & SRBM_GFX_CNTL__PIPEID_MASK)|
949fb4d8502Sjsg 		((me << SRBM_GFX_CNTL__MEID__SHIFT) & SRBM_GFX_CNTL__MEID_MASK)|
950fb4d8502Sjsg 		((vmid << SRBM_GFX_CNTL__VMID__SHIFT) & SRBM_GFX_CNTL__VMID_MASK)|
951fb4d8502Sjsg 		((queue << SRBM_GFX_CNTL__QUEUEID__SHIFT) & SRBM_GFX_CNTL__QUEUEID_MASK));
952fb4d8502Sjsg 	WREG32(mmSRBM_GFX_CNTL, srbm_gfx_cntl);
953fb4d8502Sjsg }
954fb4d8502Sjsg 
cik_vga_set_state(struct amdgpu_device * adev,bool state)955fb4d8502Sjsg static void cik_vga_set_state(struct amdgpu_device *adev, bool state)
956fb4d8502Sjsg {
957fb4d8502Sjsg 	uint32_t tmp;
958fb4d8502Sjsg 
959fb4d8502Sjsg 	tmp = RREG32(mmCONFIG_CNTL);
960fb4d8502Sjsg 	if (!state)
961fb4d8502Sjsg 		tmp |= CONFIG_CNTL__VGA_DIS_MASK;
962fb4d8502Sjsg 	else
963fb4d8502Sjsg 		tmp &= ~CONFIG_CNTL__VGA_DIS_MASK;
964fb4d8502Sjsg 	WREG32(mmCONFIG_CNTL, tmp);
965fb4d8502Sjsg }
966fb4d8502Sjsg 
cik_read_disabled_bios(struct amdgpu_device * adev)967fb4d8502Sjsg static bool cik_read_disabled_bios(struct amdgpu_device *adev)
968fb4d8502Sjsg {
969fb4d8502Sjsg 	u32 bus_cntl;
970fb4d8502Sjsg 	u32 d1vga_control = 0;
971fb4d8502Sjsg 	u32 d2vga_control = 0;
972fb4d8502Sjsg 	u32 vga_render_control = 0;
973fb4d8502Sjsg 	u32 rom_cntl;
974fb4d8502Sjsg 	bool r;
975fb4d8502Sjsg 
976fb4d8502Sjsg 	bus_cntl = RREG32(mmBUS_CNTL);
977fb4d8502Sjsg 	if (adev->mode_info.num_crtc) {
978fb4d8502Sjsg 		d1vga_control = RREG32(mmD1VGA_CONTROL);
979fb4d8502Sjsg 		d2vga_control = RREG32(mmD2VGA_CONTROL);
980fb4d8502Sjsg 		vga_render_control = RREG32(mmVGA_RENDER_CONTROL);
981fb4d8502Sjsg 	}
982fb4d8502Sjsg 	rom_cntl = RREG32_SMC(ixROM_CNTL);
983fb4d8502Sjsg 
984fb4d8502Sjsg 	/* enable the rom */
985fb4d8502Sjsg 	WREG32(mmBUS_CNTL, (bus_cntl & ~BUS_CNTL__BIOS_ROM_DIS_MASK));
986fb4d8502Sjsg 	if (adev->mode_info.num_crtc) {
987fb4d8502Sjsg 		/* Disable VGA mode */
988fb4d8502Sjsg 		WREG32(mmD1VGA_CONTROL,
989fb4d8502Sjsg 		       (d1vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
990fb4d8502Sjsg 					  D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
991fb4d8502Sjsg 		WREG32(mmD2VGA_CONTROL,
992fb4d8502Sjsg 		       (d2vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
993fb4d8502Sjsg 					  D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
994fb4d8502Sjsg 		WREG32(mmVGA_RENDER_CONTROL,
995fb4d8502Sjsg 		       (vga_render_control & ~VGA_RENDER_CONTROL__VGA_VSTATUS_CNTL_MASK));
996fb4d8502Sjsg 	}
997fb4d8502Sjsg 	WREG32_SMC(ixROM_CNTL, rom_cntl | ROM_CNTL__SCK_OVERWRITE_MASK);
998fb4d8502Sjsg 
999fb4d8502Sjsg 	r = amdgpu_read_bios(adev);
1000fb4d8502Sjsg 
1001fb4d8502Sjsg 	/* restore regs */
1002fb4d8502Sjsg 	WREG32(mmBUS_CNTL, bus_cntl);
1003fb4d8502Sjsg 	if (adev->mode_info.num_crtc) {
1004fb4d8502Sjsg 		WREG32(mmD1VGA_CONTROL, d1vga_control);
1005fb4d8502Sjsg 		WREG32(mmD2VGA_CONTROL, d2vga_control);
1006fb4d8502Sjsg 		WREG32(mmVGA_RENDER_CONTROL, vga_render_control);
1007fb4d8502Sjsg 	}
1008fb4d8502Sjsg 	WREG32_SMC(ixROM_CNTL, rom_cntl);
1009fb4d8502Sjsg 	return r;
1010fb4d8502Sjsg }
1011fb4d8502Sjsg 
cik_read_bios_from_rom(struct amdgpu_device * adev,u8 * bios,u32 length_bytes)1012fb4d8502Sjsg static bool cik_read_bios_from_rom(struct amdgpu_device *adev,
1013fb4d8502Sjsg 				   u8 *bios, u32 length_bytes)
1014fb4d8502Sjsg {
1015fb4d8502Sjsg 	u32 *dw_ptr;
1016fb4d8502Sjsg 	unsigned long flags;
1017fb4d8502Sjsg 	u32 i, length_dw;
1018fb4d8502Sjsg 
1019fb4d8502Sjsg 	if (bios == NULL)
1020fb4d8502Sjsg 		return false;
1021fb4d8502Sjsg 	if (length_bytes == 0)
1022fb4d8502Sjsg 		return false;
1023fb4d8502Sjsg 	/* APU vbios image is part of sbios image */
1024fb4d8502Sjsg 	if (adev->flags & AMD_IS_APU)
1025fb4d8502Sjsg 		return false;
1026fb4d8502Sjsg 
1027fb4d8502Sjsg 	dw_ptr = (u32 *)bios;
1028*f005ef32Sjsg 	length_dw = ALIGN(length_bytes, 4) / 4;
1029fb4d8502Sjsg 	/* take the smc lock since we are using the smc index */
1030fb4d8502Sjsg 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
1031fb4d8502Sjsg 	/* set rom index to 0 */
1032fb4d8502Sjsg 	WREG32(mmSMC_IND_INDEX_0, ixROM_INDEX);
1033fb4d8502Sjsg 	WREG32(mmSMC_IND_DATA_0, 0);
1034fb4d8502Sjsg 	/* set index to data for continous read */
1035fb4d8502Sjsg 	WREG32(mmSMC_IND_INDEX_0, ixROM_DATA);
1036fb4d8502Sjsg 	for (i = 0; i < length_dw; i++)
1037fb4d8502Sjsg 		dw_ptr[i] = RREG32(mmSMC_IND_DATA_0);
1038fb4d8502Sjsg 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
1039fb4d8502Sjsg 
1040fb4d8502Sjsg 	return true;
1041fb4d8502Sjsg }
1042fb4d8502Sjsg 
1043fb4d8502Sjsg static const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = {
1044fb4d8502Sjsg 	{mmGRBM_STATUS},
1045c349dbc7Sjsg 	{mmGRBM_STATUS2},
1046c349dbc7Sjsg 	{mmGRBM_STATUS_SE0},
1047c349dbc7Sjsg 	{mmGRBM_STATUS_SE1},
1048c349dbc7Sjsg 	{mmGRBM_STATUS_SE2},
1049c349dbc7Sjsg 	{mmGRBM_STATUS_SE3},
1050c349dbc7Sjsg 	{mmSRBM_STATUS},
1051c349dbc7Sjsg 	{mmSRBM_STATUS2},
1052c349dbc7Sjsg 	{mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET},
1053c349dbc7Sjsg 	{mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET},
1054c349dbc7Sjsg 	{mmCP_STAT},
1055c349dbc7Sjsg 	{mmCP_STALLED_STAT1},
1056c349dbc7Sjsg 	{mmCP_STALLED_STAT2},
1057c349dbc7Sjsg 	{mmCP_STALLED_STAT3},
1058c349dbc7Sjsg 	{mmCP_CPF_BUSY_STAT},
1059c349dbc7Sjsg 	{mmCP_CPF_STALLED_STAT1},
1060c349dbc7Sjsg 	{mmCP_CPF_STATUS},
1061c349dbc7Sjsg 	{mmCP_CPC_BUSY_STAT},
1062c349dbc7Sjsg 	{mmCP_CPC_STALLED_STAT1},
1063c349dbc7Sjsg 	{mmCP_CPC_STATUS},
1064fb4d8502Sjsg 	{mmGB_ADDR_CONFIG},
1065fb4d8502Sjsg 	{mmMC_ARB_RAMCFG},
1066fb4d8502Sjsg 	{mmGB_TILE_MODE0},
1067fb4d8502Sjsg 	{mmGB_TILE_MODE1},
1068fb4d8502Sjsg 	{mmGB_TILE_MODE2},
1069fb4d8502Sjsg 	{mmGB_TILE_MODE3},
1070fb4d8502Sjsg 	{mmGB_TILE_MODE4},
1071fb4d8502Sjsg 	{mmGB_TILE_MODE5},
1072fb4d8502Sjsg 	{mmGB_TILE_MODE6},
1073fb4d8502Sjsg 	{mmGB_TILE_MODE7},
1074fb4d8502Sjsg 	{mmGB_TILE_MODE8},
1075fb4d8502Sjsg 	{mmGB_TILE_MODE9},
1076fb4d8502Sjsg 	{mmGB_TILE_MODE10},
1077fb4d8502Sjsg 	{mmGB_TILE_MODE11},
1078fb4d8502Sjsg 	{mmGB_TILE_MODE12},
1079fb4d8502Sjsg 	{mmGB_TILE_MODE13},
1080fb4d8502Sjsg 	{mmGB_TILE_MODE14},
1081fb4d8502Sjsg 	{mmGB_TILE_MODE15},
1082fb4d8502Sjsg 	{mmGB_TILE_MODE16},
1083fb4d8502Sjsg 	{mmGB_TILE_MODE17},
1084fb4d8502Sjsg 	{mmGB_TILE_MODE18},
1085fb4d8502Sjsg 	{mmGB_TILE_MODE19},
1086fb4d8502Sjsg 	{mmGB_TILE_MODE20},
1087fb4d8502Sjsg 	{mmGB_TILE_MODE21},
1088fb4d8502Sjsg 	{mmGB_TILE_MODE22},
1089fb4d8502Sjsg 	{mmGB_TILE_MODE23},
1090fb4d8502Sjsg 	{mmGB_TILE_MODE24},
1091fb4d8502Sjsg 	{mmGB_TILE_MODE25},
1092fb4d8502Sjsg 	{mmGB_TILE_MODE26},
1093fb4d8502Sjsg 	{mmGB_TILE_MODE27},
1094fb4d8502Sjsg 	{mmGB_TILE_MODE28},
1095fb4d8502Sjsg 	{mmGB_TILE_MODE29},
1096fb4d8502Sjsg 	{mmGB_TILE_MODE30},
1097fb4d8502Sjsg 	{mmGB_TILE_MODE31},
1098fb4d8502Sjsg 	{mmGB_MACROTILE_MODE0},
1099fb4d8502Sjsg 	{mmGB_MACROTILE_MODE1},
1100fb4d8502Sjsg 	{mmGB_MACROTILE_MODE2},
1101fb4d8502Sjsg 	{mmGB_MACROTILE_MODE3},
1102fb4d8502Sjsg 	{mmGB_MACROTILE_MODE4},
1103fb4d8502Sjsg 	{mmGB_MACROTILE_MODE5},
1104fb4d8502Sjsg 	{mmGB_MACROTILE_MODE6},
1105fb4d8502Sjsg 	{mmGB_MACROTILE_MODE7},
1106fb4d8502Sjsg 	{mmGB_MACROTILE_MODE8},
1107fb4d8502Sjsg 	{mmGB_MACROTILE_MODE9},
1108fb4d8502Sjsg 	{mmGB_MACROTILE_MODE10},
1109fb4d8502Sjsg 	{mmGB_MACROTILE_MODE11},
1110fb4d8502Sjsg 	{mmGB_MACROTILE_MODE12},
1111fb4d8502Sjsg 	{mmGB_MACROTILE_MODE13},
1112fb4d8502Sjsg 	{mmGB_MACROTILE_MODE14},
1113fb4d8502Sjsg 	{mmGB_MACROTILE_MODE15},
1114fb4d8502Sjsg 	{mmCC_RB_BACKEND_DISABLE, true},
1115fb4d8502Sjsg 	{mmGC_USER_RB_BACKEND_DISABLE, true},
1116fb4d8502Sjsg 	{mmGB_BACKEND_MAP, false},
1117fb4d8502Sjsg 	{mmPA_SC_RASTER_CONFIG, true},
1118fb4d8502Sjsg 	{mmPA_SC_RASTER_CONFIG_1, true},
1119fb4d8502Sjsg };
1120fb4d8502Sjsg 
1121fb4d8502Sjsg 
cik_get_register_value(struct amdgpu_device * adev,bool indexed,u32 se_num,u32 sh_num,u32 reg_offset)1122fb4d8502Sjsg static uint32_t cik_get_register_value(struct amdgpu_device *adev,
1123fb4d8502Sjsg 				       bool indexed, u32 se_num,
1124fb4d8502Sjsg 				       u32 sh_num, u32 reg_offset)
1125fb4d8502Sjsg {
1126fb4d8502Sjsg 	if (indexed) {
1127fb4d8502Sjsg 		uint32_t val;
1128fb4d8502Sjsg 		unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
1129fb4d8502Sjsg 		unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
1130fb4d8502Sjsg 
1131fb4d8502Sjsg 		switch (reg_offset) {
1132fb4d8502Sjsg 		case mmCC_RB_BACKEND_DISABLE:
1133fb4d8502Sjsg 			return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
1134fb4d8502Sjsg 		case mmGC_USER_RB_BACKEND_DISABLE:
1135fb4d8502Sjsg 			return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
1136fb4d8502Sjsg 		case mmPA_SC_RASTER_CONFIG:
1137fb4d8502Sjsg 			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
1138fb4d8502Sjsg 		case mmPA_SC_RASTER_CONFIG_1:
1139fb4d8502Sjsg 			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config_1;
1140fb4d8502Sjsg 		}
1141fb4d8502Sjsg 
1142fb4d8502Sjsg 		mutex_lock(&adev->grbm_idx_mutex);
1143fb4d8502Sjsg 		if (se_num != 0xffffffff || sh_num != 0xffffffff)
1144*f005ef32Sjsg 			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff, 0);
1145fb4d8502Sjsg 
1146fb4d8502Sjsg 		val = RREG32(reg_offset);
1147fb4d8502Sjsg 
1148fb4d8502Sjsg 		if (se_num != 0xffffffff || sh_num != 0xffffffff)
1149*f005ef32Sjsg 			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
1150fb4d8502Sjsg 		mutex_unlock(&adev->grbm_idx_mutex);
1151fb4d8502Sjsg 		return val;
1152fb4d8502Sjsg 	} else {
1153fb4d8502Sjsg 		unsigned idx;
1154fb4d8502Sjsg 
1155fb4d8502Sjsg 		switch (reg_offset) {
1156fb4d8502Sjsg 		case mmGB_ADDR_CONFIG:
1157fb4d8502Sjsg 			return adev->gfx.config.gb_addr_config;
1158fb4d8502Sjsg 		case mmMC_ARB_RAMCFG:
1159fb4d8502Sjsg 			return adev->gfx.config.mc_arb_ramcfg;
1160fb4d8502Sjsg 		case mmGB_TILE_MODE0:
1161fb4d8502Sjsg 		case mmGB_TILE_MODE1:
1162fb4d8502Sjsg 		case mmGB_TILE_MODE2:
1163fb4d8502Sjsg 		case mmGB_TILE_MODE3:
1164fb4d8502Sjsg 		case mmGB_TILE_MODE4:
1165fb4d8502Sjsg 		case mmGB_TILE_MODE5:
1166fb4d8502Sjsg 		case mmGB_TILE_MODE6:
1167fb4d8502Sjsg 		case mmGB_TILE_MODE7:
1168fb4d8502Sjsg 		case mmGB_TILE_MODE8:
1169fb4d8502Sjsg 		case mmGB_TILE_MODE9:
1170fb4d8502Sjsg 		case mmGB_TILE_MODE10:
1171fb4d8502Sjsg 		case mmGB_TILE_MODE11:
1172fb4d8502Sjsg 		case mmGB_TILE_MODE12:
1173fb4d8502Sjsg 		case mmGB_TILE_MODE13:
1174fb4d8502Sjsg 		case mmGB_TILE_MODE14:
1175fb4d8502Sjsg 		case mmGB_TILE_MODE15:
1176fb4d8502Sjsg 		case mmGB_TILE_MODE16:
1177fb4d8502Sjsg 		case mmGB_TILE_MODE17:
1178fb4d8502Sjsg 		case mmGB_TILE_MODE18:
1179fb4d8502Sjsg 		case mmGB_TILE_MODE19:
1180fb4d8502Sjsg 		case mmGB_TILE_MODE20:
1181fb4d8502Sjsg 		case mmGB_TILE_MODE21:
1182fb4d8502Sjsg 		case mmGB_TILE_MODE22:
1183fb4d8502Sjsg 		case mmGB_TILE_MODE23:
1184fb4d8502Sjsg 		case mmGB_TILE_MODE24:
1185fb4d8502Sjsg 		case mmGB_TILE_MODE25:
1186fb4d8502Sjsg 		case mmGB_TILE_MODE26:
1187fb4d8502Sjsg 		case mmGB_TILE_MODE27:
1188fb4d8502Sjsg 		case mmGB_TILE_MODE28:
1189fb4d8502Sjsg 		case mmGB_TILE_MODE29:
1190fb4d8502Sjsg 		case mmGB_TILE_MODE30:
1191fb4d8502Sjsg 		case mmGB_TILE_MODE31:
1192fb4d8502Sjsg 			idx = (reg_offset - mmGB_TILE_MODE0);
1193fb4d8502Sjsg 			return adev->gfx.config.tile_mode_array[idx];
1194fb4d8502Sjsg 		case mmGB_MACROTILE_MODE0:
1195fb4d8502Sjsg 		case mmGB_MACROTILE_MODE1:
1196fb4d8502Sjsg 		case mmGB_MACROTILE_MODE2:
1197fb4d8502Sjsg 		case mmGB_MACROTILE_MODE3:
1198fb4d8502Sjsg 		case mmGB_MACROTILE_MODE4:
1199fb4d8502Sjsg 		case mmGB_MACROTILE_MODE5:
1200fb4d8502Sjsg 		case mmGB_MACROTILE_MODE6:
1201fb4d8502Sjsg 		case mmGB_MACROTILE_MODE7:
1202fb4d8502Sjsg 		case mmGB_MACROTILE_MODE8:
1203fb4d8502Sjsg 		case mmGB_MACROTILE_MODE9:
1204fb4d8502Sjsg 		case mmGB_MACROTILE_MODE10:
1205fb4d8502Sjsg 		case mmGB_MACROTILE_MODE11:
1206fb4d8502Sjsg 		case mmGB_MACROTILE_MODE12:
1207fb4d8502Sjsg 		case mmGB_MACROTILE_MODE13:
1208fb4d8502Sjsg 		case mmGB_MACROTILE_MODE14:
1209fb4d8502Sjsg 		case mmGB_MACROTILE_MODE15:
1210fb4d8502Sjsg 			idx = (reg_offset - mmGB_MACROTILE_MODE0);
1211fb4d8502Sjsg 			return adev->gfx.config.macrotile_mode_array[idx];
1212fb4d8502Sjsg 		default:
1213fb4d8502Sjsg 			return RREG32(reg_offset);
1214fb4d8502Sjsg 		}
1215fb4d8502Sjsg 	}
1216fb4d8502Sjsg }
1217fb4d8502Sjsg 
cik_read_register(struct amdgpu_device * adev,u32 se_num,u32 sh_num,u32 reg_offset,u32 * value)1218fb4d8502Sjsg static int cik_read_register(struct amdgpu_device *adev, u32 se_num,
1219fb4d8502Sjsg 			     u32 sh_num, u32 reg_offset, u32 *value)
1220fb4d8502Sjsg {
1221fb4d8502Sjsg 	uint32_t i;
1222fb4d8502Sjsg 
1223fb4d8502Sjsg 	*value = 0;
1224fb4d8502Sjsg 	for (i = 0; i < ARRAY_SIZE(cik_allowed_read_registers); i++) {
1225fb4d8502Sjsg 		bool indexed = cik_allowed_read_registers[i].grbm_indexed;
1226fb4d8502Sjsg 
1227fb4d8502Sjsg 		if (reg_offset != cik_allowed_read_registers[i].reg_offset)
1228fb4d8502Sjsg 			continue;
1229fb4d8502Sjsg 
1230fb4d8502Sjsg 		*value = cik_get_register_value(adev, indexed, se_num, sh_num,
1231fb4d8502Sjsg 						reg_offset);
1232fb4d8502Sjsg 		return 0;
1233fb4d8502Sjsg 	}
1234fb4d8502Sjsg 	return -EINVAL;
1235fb4d8502Sjsg }
1236fb4d8502Sjsg 
1237fb4d8502Sjsg struct kv_reset_save_regs {
1238fb4d8502Sjsg 	u32 gmcon_reng_execute;
1239fb4d8502Sjsg 	u32 gmcon_misc;
1240fb4d8502Sjsg 	u32 gmcon_misc3;
1241fb4d8502Sjsg };
1242fb4d8502Sjsg 
kv_save_regs_for_reset(struct amdgpu_device * adev,struct kv_reset_save_regs * save)1243fb4d8502Sjsg static void kv_save_regs_for_reset(struct amdgpu_device *adev,
1244fb4d8502Sjsg 				   struct kv_reset_save_regs *save)
1245fb4d8502Sjsg {
1246fb4d8502Sjsg 	save->gmcon_reng_execute = RREG32(mmGMCON_RENG_EXECUTE);
1247fb4d8502Sjsg 	save->gmcon_misc = RREG32(mmGMCON_MISC);
1248fb4d8502Sjsg 	save->gmcon_misc3 = RREG32(mmGMCON_MISC3);
1249fb4d8502Sjsg 
1250fb4d8502Sjsg 	WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute &
1251fb4d8502Sjsg 		~GMCON_RENG_EXECUTE__RENG_EXECUTE_ON_PWR_UP_MASK);
1252fb4d8502Sjsg 	WREG32(mmGMCON_MISC, save->gmcon_misc &
1253fb4d8502Sjsg 		~(GMCON_MISC__RENG_EXECUTE_ON_REG_UPDATE_MASK |
1254fb4d8502Sjsg 			GMCON_MISC__STCTRL_STUTTER_EN_MASK));
1255fb4d8502Sjsg }
1256fb4d8502Sjsg 
kv_restore_regs_for_reset(struct amdgpu_device * adev,struct kv_reset_save_regs * save)1257fb4d8502Sjsg static void kv_restore_regs_for_reset(struct amdgpu_device *adev,
1258fb4d8502Sjsg 				      struct kv_reset_save_regs *save)
1259fb4d8502Sjsg {
1260fb4d8502Sjsg 	int i;
1261fb4d8502Sjsg 
1262fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_WRITE, 0);
1263fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_CONFIG, 0x200010ff);
1264fb4d8502Sjsg 
1265fb4d8502Sjsg 	for (i = 0; i < 5; i++)
1266fb4d8502Sjsg 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1267fb4d8502Sjsg 
1268fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_WRITE, 0);
1269fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_CONFIG, 0x300010ff);
1270fb4d8502Sjsg 
1271fb4d8502Sjsg 	for (i = 0; i < 5; i++)
1272fb4d8502Sjsg 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1273fb4d8502Sjsg 
1274fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_WRITE, 0x210000);
1275fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_CONFIG, 0xa00010ff);
1276fb4d8502Sjsg 
1277fb4d8502Sjsg 	for (i = 0; i < 5; i++)
1278fb4d8502Sjsg 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1279fb4d8502Sjsg 
1280fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_WRITE, 0x21003);
1281fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_CONFIG, 0xb00010ff);
1282fb4d8502Sjsg 
1283fb4d8502Sjsg 	for (i = 0; i < 5; i++)
1284fb4d8502Sjsg 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1285fb4d8502Sjsg 
1286fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_WRITE, 0x2b00);
1287fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_CONFIG, 0xc00010ff);
1288fb4d8502Sjsg 
1289fb4d8502Sjsg 	for (i = 0; i < 5; i++)
1290fb4d8502Sjsg 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1291fb4d8502Sjsg 
1292fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_WRITE, 0);
1293fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_CONFIG, 0xd00010ff);
1294fb4d8502Sjsg 
1295fb4d8502Sjsg 	for (i = 0; i < 5; i++)
1296fb4d8502Sjsg 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1297fb4d8502Sjsg 
1298fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_WRITE, 0x420000);
1299fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_CONFIG, 0x100010ff);
1300fb4d8502Sjsg 
1301fb4d8502Sjsg 	for (i = 0; i < 5; i++)
1302fb4d8502Sjsg 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1303fb4d8502Sjsg 
1304fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_WRITE, 0x120202);
1305fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_CONFIG, 0x500010ff);
1306fb4d8502Sjsg 
1307fb4d8502Sjsg 	for (i = 0; i < 5; i++)
1308fb4d8502Sjsg 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1309fb4d8502Sjsg 
1310fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_WRITE, 0x3e3e36);
1311fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_CONFIG, 0x600010ff);
1312fb4d8502Sjsg 
1313fb4d8502Sjsg 	for (i = 0; i < 5; i++)
1314fb4d8502Sjsg 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1315fb4d8502Sjsg 
1316fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_WRITE, 0x373f3e);
1317fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_CONFIG, 0x700010ff);
1318fb4d8502Sjsg 
1319fb4d8502Sjsg 	for (i = 0; i < 5; i++)
1320fb4d8502Sjsg 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1321fb4d8502Sjsg 
1322fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_WRITE, 0x3e1332);
1323fb4d8502Sjsg 	WREG32(mmGMCON_PGFSM_CONFIG, 0xe00010ff);
1324fb4d8502Sjsg 
1325fb4d8502Sjsg 	WREG32(mmGMCON_MISC3, save->gmcon_misc3);
1326fb4d8502Sjsg 	WREG32(mmGMCON_MISC, save->gmcon_misc);
1327fb4d8502Sjsg 	WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute);
1328fb4d8502Sjsg }
1329fb4d8502Sjsg 
13305ca02815Sjsg /**
13315ca02815Sjsg  * cik_asic_pci_config_reset - soft reset GPU
13325ca02815Sjsg  *
13335ca02815Sjsg  * @adev: amdgpu_device pointer
13345ca02815Sjsg  *
13355ca02815Sjsg  * Use PCI Config method to reset the GPU.
13365ca02815Sjsg  *
13375ca02815Sjsg  * Returns 0 for success.
13385ca02815Sjsg  */
cik_asic_pci_config_reset(struct amdgpu_device * adev)13395ca02815Sjsg static int cik_asic_pci_config_reset(struct amdgpu_device *adev)
1340fb4d8502Sjsg {
1341fb4d8502Sjsg 	struct kv_reset_save_regs kv_save = { 0 };
1342fb4d8502Sjsg 	u32 i;
1343fb4d8502Sjsg 	int r = -EINVAL;
1344fb4d8502Sjsg 
13455ca02815Sjsg 	amdgpu_atombios_scratch_regs_engine_hung(adev, true);
1346fb4d8502Sjsg 
1347fb4d8502Sjsg 	if (adev->flags & AMD_IS_APU)
1348fb4d8502Sjsg 		kv_save_regs_for_reset(adev, &kv_save);
1349fb4d8502Sjsg 
1350fb4d8502Sjsg 	/* disable BM */
1351fb4d8502Sjsg 	pci_clear_master(adev->pdev);
1352fb4d8502Sjsg 	/* reset */
1353fb4d8502Sjsg 	amdgpu_device_pci_config_reset(adev);
1354fb4d8502Sjsg 
1355fb4d8502Sjsg 	udelay(100);
1356fb4d8502Sjsg 
1357fb4d8502Sjsg 	/* wait for asic to come out of reset */
1358fb4d8502Sjsg 	for (i = 0; i < adev->usec_timeout; i++) {
1359fb4d8502Sjsg 		if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
1360fb4d8502Sjsg 			/* enable BM */
1361fb4d8502Sjsg 			pci_set_master(adev->pdev);
1362fb4d8502Sjsg 			adev->has_hw_reset = true;
1363fb4d8502Sjsg 			r = 0;
1364fb4d8502Sjsg 			break;
1365fb4d8502Sjsg 		}
1366fb4d8502Sjsg 		udelay(1);
1367fb4d8502Sjsg 	}
1368fb4d8502Sjsg 
1369fb4d8502Sjsg 	/* does asic init need to be run first??? */
1370fb4d8502Sjsg 	if (adev->flags & AMD_IS_APU)
1371fb4d8502Sjsg 		kv_restore_regs_for_reset(adev, &kv_save);
1372fb4d8502Sjsg 
1373c349dbc7Sjsg 	amdgpu_atombios_scratch_regs_engine_hung(adev, false);
1374c349dbc7Sjsg 
1375c349dbc7Sjsg 	return r;
1376c349dbc7Sjsg }
1377c349dbc7Sjsg 
cik_asic_supports_baco(struct amdgpu_device * adev)1378c349dbc7Sjsg static bool cik_asic_supports_baco(struct amdgpu_device *adev)
1379c349dbc7Sjsg {
1380c349dbc7Sjsg 	switch (adev->asic_type) {
1381c349dbc7Sjsg 	case CHIP_BONAIRE:
1382c349dbc7Sjsg 	case CHIP_HAWAII:
1383c349dbc7Sjsg 		return amdgpu_dpm_is_baco_supported(adev);
1384c349dbc7Sjsg 	default:
1385c349dbc7Sjsg 		return false;
1386c349dbc7Sjsg 	}
1387c349dbc7Sjsg }
1388c349dbc7Sjsg 
1389c349dbc7Sjsg static enum amd_reset_method
cik_asic_reset_method(struct amdgpu_device * adev)1390c349dbc7Sjsg cik_asic_reset_method(struct amdgpu_device *adev)
1391c349dbc7Sjsg {
1392c349dbc7Sjsg 	bool baco_reset;
1393c349dbc7Sjsg 
1394ad8b1aafSjsg 	if (amdgpu_reset_method == AMD_RESET_METHOD_LEGACY ||
1395ad8b1aafSjsg 	    amdgpu_reset_method == AMD_RESET_METHOD_BACO)
1396ad8b1aafSjsg 		return amdgpu_reset_method;
1397ad8b1aafSjsg 
1398ad8b1aafSjsg 	if (amdgpu_reset_method != -1)
1399ad8b1aafSjsg 		dev_warn(adev->dev, "Specified reset:%d isn't supported, using AUTO instead.\n",
1400ad8b1aafSjsg 				  amdgpu_reset_method);
1401ad8b1aafSjsg 
1402c349dbc7Sjsg 	switch (adev->asic_type) {
1403c349dbc7Sjsg 	case CHIP_BONAIRE:
1404ad8b1aafSjsg 	case CHIP_HAWAII:
1405ad8b1aafSjsg 		baco_reset = cik_asic_supports_baco(adev);
1406ad8b1aafSjsg 		break;
1407c349dbc7Sjsg 	default:
1408c349dbc7Sjsg 		baco_reset = false;
1409c349dbc7Sjsg 		break;
1410c349dbc7Sjsg 	}
1411c349dbc7Sjsg 
1412c349dbc7Sjsg 	if (baco_reset)
1413c349dbc7Sjsg 		return AMD_RESET_METHOD_BACO;
1414c349dbc7Sjsg 	else
1415c349dbc7Sjsg 		return AMD_RESET_METHOD_LEGACY;
1416c349dbc7Sjsg }
1417c349dbc7Sjsg 
1418c349dbc7Sjsg /**
1419fb4d8502Sjsg  * cik_asic_reset - soft reset GPU
1420fb4d8502Sjsg  *
1421fb4d8502Sjsg  * @adev: amdgpu_device pointer
1422fb4d8502Sjsg  *
1423fb4d8502Sjsg  * Look up which blocks are hung and attempt
1424fb4d8502Sjsg  * to reset them.
1425fb4d8502Sjsg  * Returns 0 for success.
1426fb4d8502Sjsg  */
cik_asic_reset(struct amdgpu_device * adev)1427fb4d8502Sjsg static int cik_asic_reset(struct amdgpu_device *adev)
1428fb4d8502Sjsg {
1429fb4d8502Sjsg 	int r;
1430fb4d8502Sjsg 
14311b8cb181Sjsg 	/* APUs don't have full asic reset */
14321b8cb181Sjsg 	if (adev->flags & AMD_IS_APU)
14331b8cb181Sjsg 		return 0;
14341b8cb181Sjsg 
1435c349dbc7Sjsg 	if (cik_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {
1436ad8b1aafSjsg 		dev_info(adev->dev, "BACO reset\n");
1437c349dbc7Sjsg 		r = amdgpu_dpm_baco_reset(adev);
1438c349dbc7Sjsg 	} else {
1439ad8b1aafSjsg 		dev_info(adev->dev, "PCI CONFIG reset\n");
1440c349dbc7Sjsg 		r = cik_asic_pci_config_reset(adev);
1441c349dbc7Sjsg 	}
1442fb4d8502Sjsg 
1443fb4d8502Sjsg 	return r;
1444fb4d8502Sjsg }
1445fb4d8502Sjsg 
cik_get_config_memsize(struct amdgpu_device * adev)1446fb4d8502Sjsg static u32 cik_get_config_memsize(struct amdgpu_device *adev)
1447fb4d8502Sjsg {
1448fb4d8502Sjsg 	return RREG32(mmCONFIG_MEMSIZE);
1449fb4d8502Sjsg }
1450fb4d8502Sjsg 
cik_set_uvd_clock(struct amdgpu_device * adev,u32 clock,u32 cntl_reg,u32 status_reg)1451fb4d8502Sjsg static int cik_set_uvd_clock(struct amdgpu_device *adev, u32 clock,
1452fb4d8502Sjsg 			      u32 cntl_reg, u32 status_reg)
1453fb4d8502Sjsg {
1454fb4d8502Sjsg 	int r, i;
1455fb4d8502Sjsg 	struct atom_clock_dividers dividers;
1456fb4d8502Sjsg 	uint32_t tmp;
1457fb4d8502Sjsg 
1458fb4d8502Sjsg 	r = amdgpu_atombios_get_clock_dividers(adev,
1459fb4d8502Sjsg 					       COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
1460fb4d8502Sjsg 					       clock, false, &dividers);
1461fb4d8502Sjsg 	if (r)
1462fb4d8502Sjsg 		return r;
1463fb4d8502Sjsg 
1464fb4d8502Sjsg 	tmp = RREG32_SMC(cntl_reg);
1465fb4d8502Sjsg 	tmp &= ~(CG_DCLK_CNTL__DCLK_DIR_CNTL_EN_MASK |
1466fb4d8502Sjsg 		CG_DCLK_CNTL__DCLK_DIVIDER_MASK);
1467fb4d8502Sjsg 	tmp |= dividers.post_divider;
1468fb4d8502Sjsg 	WREG32_SMC(cntl_reg, tmp);
1469fb4d8502Sjsg 
1470fb4d8502Sjsg 	for (i = 0; i < 100; i++) {
1471fb4d8502Sjsg 		if (RREG32_SMC(status_reg) & CG_DCLK_STATUS__DCLK_STATUS_MASK)
1472fb4d8502Sjsg 			break;
1473fb4d8502Sjsg 		mdelay(10);
1474fb4d8502Sjsg 	}
1475fb4d8502Sjsg 	if (i == 100)
1476fb4d8502Sjsg 		return -ETIMEDOUT;
1477fb4d8502Sjsg 
1478fb4d8502Sjsg 	return 0;
1479fb4d8502Sjsg }
1480fb4d8502Sjsg 
cik_set_uvd_clocks(struct amdgpu_device * adev,u32 vclk,u32 dclk)1481fb4d8502Sjsg static int cik_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1482fb4d8502Sjsg {
1483fb4d8502Sjsg 	int r = 0;
1484fb4d8502Sjsg 
1485fb4d8502Sjsg 	r = cik_set_uvd_clock(adev, vclk, ixCG_VCLK_CNTL, ixCG_VCLK_STATUS);
1486fb4d8502Sjsg 	if (r)
1487fb4d8502Sjsg 		return r;
1488fb4d8502Sjsg 
1489fb4d8502Sjsg 	r = cik_set_uvd_clock(adev, dclk, ixCG_DCLK_CNTL, ixCG_DCLK_STATUS);
1490fb4d8502Sjsg 	return r;
1491fb4d8502Sjsg }
1492fb4d8502Sjsg 
cik_set_vce_clocks(struct amdgpu_device * adev,u32 evclk,u32 ecclk)1493fb4d8502Sjsg static int cik_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
1494fb4d8502Sjsg {
1495fb4d8502Sjsg 	int r, i;
1496fb4d8502Sjsg 	struct atom_clock_dividers dividers;
1497fb4d8502Sjsg 	u32 tmp;
1498fb4d8502Sjsg 
1499fb4d8502Sjsg 	r = amdgpu_atombios_get_clock_dividers(adev,
1500fb4d8502Sjsg 					       COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
1501fb4d8502Sjsg 					       ecclk, false, &dividers);
1502fb4d8502Sjsg 	if (r)
1503fb4d8502Sjsg 		return r;
1504fb4d8502Sjsg 
1505fb4d8502Sjsg 	for (i = 0; i < 100; i++) {
1506fb4d8502Sjsg 		if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
1507fb4d8502Sjsg 			break;
1508fb4d8502Sjsg 		mdelay(10);
1509fb4d8502Sjsg 	}
1510fb4d8502Sjsg 	if (i == 100)
1511fb4d8502Sjsg 		return -ETIMEDOUT;
1512fb4d8502Sjsg 
1513fb4d8502Sjsg 	tmp = RREG32_SMC(ixCG_ECLK_CNTL);
1514fb4d8502Sjsg 	tmp &= ~(CG_ECLK_CNTL__ECLK_DIR_CNTL_EN_MASK |
1515fb4d8502Sjsg 		CG_ECLK_CNTL__ECLK_DIVIDER_MASK);
1516fb4d8502Sjsg 	tmp |= dividers.post_divider;
1517fb4d8502Sjsg 	WREG32_SMC(ixCG_ECLK_CNTL, tmp);
1518fb4d8502Sjsg 
1519fb4d8502Sjsg 	for (i = 0; i < 100; i++) {
1520fb4d8502Sjsg 		if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
1521fb4d8502Sjsg 			break;
1522fb4d8502Sjsg 		mdelay(10);
1523fb4d8502Sjsg 	}
1524fb4d8502Sjsg 	if (i == 100)
1525fb4d8502Sjsg 		return -ETIMEDOUT;
1526fb4d8502Sjsg 
1527fb4d8502Sjsg 	return 0;
1528fb4d8502Sjsg }
1529fb4d8502Sjsg 
cik_pcie_gen3_enable(struct amdgpu_device * adev)1530fb4d8502Sjsg static void cik_pcie_gen3_enable(struct amdgpu_device *adev)
1531fb4d8502Sjsg {
1532fb4d8502Sjsg 	struct pci_dev *root = adev->pdev->bus->self;
1533fb4d8502Sjsg 	u32 speed_cntl, current_data_rate;
1534fb4d8502Sjsg 	int i;
1535fb4d8502Sjsg 	u16 tmp16;
1536fb4d8502Sjsg 
1537fb4d8502Sjsg 	if (pci_is_root_bus(adev->pdev->bus))
1538fb4d8502Sjsg 		return;
1539fb4d8502Sjsg 
1540fb4d8502Sjsg 	if (amdgpu_pcie_gen2 == 0)
1541fb4d8502Sjsg 		return;
1542fb4d8502Sjsg 
1543fb4d8502Sjsg 	if (adev->flags & AMD_IS_APU)
1544fb4d8502Sjsg 		return;
1545fb4d8502Sjsg 
1546fb4d8502Sjsg 	if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
1547fb4d8502Sjsg 					CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
1548fb4d8502Sjsg 		return;
1549fb4d8502Sjsg 
1550fb4d8502Sjsg 	speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1551fb4d8502Sjsg 	current_data_rate = (speed_cntl & PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK) >>
1552fb4d8502Sjsg 		PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT;
1553fb4d8502Sjsg 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1554fb4d8502Sjsg 		if (current_data_rate == 2) {
1555fb4d8502Sjsg 			DRM_INFO("PCIE gen 3 link speeds already enabled\n");
1556fb4d8502Sjsg 			return;
1557fb4d8502Sjsg 		}
1558fb4d8502Sjsg 		DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
1559fb4d8502Sjsg 	} else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
1560fb4d8502Sjsg 		if (current_data_rate == 1) {
1561fb4d8502Sjsg 			DRM_INFO("PCIE gen 2 link speeds already enabled\n");
1562fb4d8502Sjsg 			return;
1563fb4d8502Sjsg 		}
1564fb4d8502Sjsg 		DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
1565fb4d8502Sjsg 	}
1566fb4d8502Sjsg 
1567c349dbc7Sjsg 	if (!pci_is_pcie(root) || !pci_is_pcie(adev->pdev))
1568fb4d8502Sjsg 		return;
1569fb4d8502Sjsg 
1570fb4d8502Sjsg 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1571fb4d8502Sjsg 		/* re-try equalization if gen3 is not already enabled */
1572fb4d8502Sjsg 		if (current_data_rate != 2) {
1573fb4d8502Sjsg 			u16 bridge_cfg, gpu_cfg;
1574fb4d8502Sjsg 			u16 bridge_cfg2, gpu_cfg2;
1575fb4d8502Sjsg 			u32 max_lw, current_lw, tmp;
1576fb4d8502Sjsg 
1577a311475eSjsg 			pcie_capability_set_word(root, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
1578a311475eSjsg 			pcie_capability_set_word(adev->pdev, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
1579fb4d8502Sjsg 
1580fb4d8502Sjsg 			tmp = RREG32_PCIE(ixPCIE_LC_STATUS1);
1581fb4d8502Sjsg 			max_lw = (tmp & PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH_MASK) >>
1582fb4d8502Sjsg 				PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH__SHIFT;
1583fb4d8502Sjsg 			current_lw = (tmp & PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH_MASK)
1584fb4d8502Sjsg 				>> PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH__SHIFT;
1585fb4d8502Sjsg 
1586fb4d8502Sjsg 			if (current_lw < max_lw) {
1587fb4d8502Sjsg 				tmp = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
1588fb4d8502Sjsg 				if (tmp & PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATION_SUPPORT_MASK) {
1589fb4d8502Sjsg 					tmp &= ~(PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_MASK |
1590fb4d8502Sjsg 						PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_DIS_MASK);
1591fb4d8502Sjsg 					tmp |= (max_lw <<
1592fb4d8502Sjsg 						PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH__SHIFT);
1593fb4d8502Sjsg 					tmp |= PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_SUPPORT_MASK |
1594fb4d8502Sjsg 					PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATE_EN_MASK |
1595fb4d8502Sjsg 					PCIE_LC_LINK_WIDTH_CNTL__LC_RECONFIG_NOW_MASK;
1596fb4d8502Sjsg 					WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, tmp);
1597fb4d8502Sjsg 				}
1598fb4d8502Sjsg 			}
1599fb4d8502Sjsg 
1600fb4d8502Sjsg 			for (i = 0; i < 10; i++) {
1601fb4d8502Sjsg 				/* check status */
1602c349dbc7Sjsg 				pcie_capability_read_word(adev->pdev,
1603c349dbc7Sjsg 							  PCI_EXP_DEVSTA,
1604c349dbc7Sjsg 							  &tmp16);
1605fb4d8502Sjsg 				if (tmp16 & PCI_EXP_DEVSTA_TRPND)
1606fb4d8502Sjsg 					break;
1607fb4d8502Sjsg 
1608c349dbc7Sjsg 				pcie_capability_read_word(root, PCI_EXP_LNKCTL,
1609c349dbc7Sjsg 							  &bridge_cfg);
1610c349dbc7Sjsg 				pcie_capability_read_word(adev->pdev,
1611c349dbc7Sjsg 							  PCI_EXP_LNKCTL,
1612c349dbc7Sjsg 							  &gpu_cfg);
1613fb4d8502Sjsg 
1614c349dbc7Sjsg 				pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
1615c349dbc7Sjsg 							  &bridge_cfg2);
1616c349dbc7Sjsg 				pcie_capability_read_word(adev->pdev,
1617c349dbc7Sjsg 							  PCI_EXP_LNKCTL2,
1618c349dbc7Sjsg 							  &gpu_cfg2);
1619fb4d8502Sjsg 
1620fb4d8502Sjsg 				tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1621fb4d8502Sjsg 				tmp |= PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
1622fb4d8502Sjsg 				WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1623fb4d8502Sjsg 
1624fb4d8502Sjsg 				tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1625fb4d8502Sjsg 				tmp |= PCIE_LC_CNTL4__LC_REDO_EQ_MASK;
1626fb4d8502Sjsg 				WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1627fb4d8502Sjsg 
1628fb4d8502Sjsg 				drm_msleep(100);
1629fb4d8502Sjsg 
1630fb4d8502Sjsg 				/* linkctl */
1631a311475eSjsg 				pcie_capability_clear_and_set_word(root, PCI_EXP_LNKCTL,
1632a311475eSjsg 								   PCI_EXP_LNKCTL_HAWD,
1633a311475eSjsg 								   bridge_cfg &
1634a311475eSjsg 								   PCI_EXP_LNKCTL_HAWD);
1635a311475eSjsg 				pcie_capability_clear_and_set_word(adev->pdev, PCI_EXP_LNKCTL,
1636a311475eSjsg 								   PCI_EXP_LNKCTL_HAWD,
1637a311475eSjsg 								   gpu_cfg &
1638a311475eSjsg 								   PCI_EXP_LNKCTL_HAWD);
1639fb4d8502Sjsg 
1640fb4d8502Sjsg 				/* linkctl2 */
1641c349dbc7Sjsg 				pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
1642c349dbc7Sjsg 							  &tmp16);
1643c349dbc7Sjsg 				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
1644c349dbc7Sjsg 					   PCI_EXP_LNKCTL2_TX_MARGIN);
1645c349dbc7Sjsg 				tmp16 |= (bridge_cfg2 &
1646c349dbc7Sjsg 					  (PCI_EXP_LNKCTL2_ENTER_COMP |
1647c349dbc7Sjsg 					   PCI_EXP_LNKCTL2_TX_MARGIN));
1648c349dbc7Sjsg 				pcie_capability_write_word(root,
1649c349dbc7Sjsg 							   PCI_EXP_LNKCTL2,
1650c349dbc7Sjsg 							   tmp16);
1651fb4d8502Sjsg 
1652c349dbc7Sjsg 				pcie_capability_read_word(adev->pdev,
1653c349dbc7Sjsg 							  PCI_EXP_LNKCTL2,
1654c349dbc7Sjsg 							  &tmp16);
1655c349dbc7Sjsg 				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
1656c349dbc7Sjsg 					   PCI_EXP_LNKCTL2_TX_MARGIN);
1657c349dbc7Sjsg 				tmp16 |= (gpu_cfg2 &
1658c349dbc7Sjsg 					  (PCI_EXP_LNKCTL2_ENTER_COMP |
1659c349dbc7Sjsg 					   PCI_EXP_LNKCTL2_TX_MARGIN));
1660c349dbc7Sjsg 				pcie_capability_write_word(adev->pdev,
1661c349dbc7Sjsg 							   PCI_EXP_LNKCTL2,
1662c349dbc7Sjsg 							   tmp16);
1663fb4d8502Sjsg 
1664fb4d8502Sjsg 				tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1665fb4d8502Sjsg 				tmp &= ~PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
1666fb4d8502Sjsg 				WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1667fb4d8502Sjsg 			}
1668fb4d8502Sjsg 		}
1669fb4d8502Sjsg 	}
1670fb4d8502Sjsg 
1671fb4d8502Sjsg 	/* set the link speed */
1672fb4d8502Sjsg 	speed_cntl |= PCIE_LC_SPEED_CNTL__LC_FORCE_EN_SW_SPEED_CHANGE_MASK |
1673fb4d8502Sjsg 		PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_HW_SPEED_CHANGE_MASK;
1674fb4d8502Sjsg 	speed_cntl &= ~PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_SW_SPEED_CHANGE_MASK;
1675fb4d8502Sjsg 	WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
1676fb4d8502Sjsg 
1677c349dbc7Sjsg 	pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL2, &tmp16);
1678c349dbc7Sjsg 	tmp16 &= ~PCI_EXP_LNKCTL2_TLS;
1679c349dbc7Sjsg 
1680fb4d8502Sjsg 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
1681c349dbc7Sjsg 		tmp16 |= PCI_EXP_LNKCTL2_TLS_8_0GT; /* gen3 */
1682fb4d8502Sjsg 	else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
1683c349dbc7Sjsg 		tmp16 |= PCI_EXP_LNKCTL2_TLS_5_0GT; /* gen2 */
1684fb4d8502Sjsg 	else
1685c349dbc7Sjsg 		tmp16 |= PCI_EXP_LNKCTL2_TLS_2_5GT; /* gen1 */
1686c349dbc7Sjsg 	pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL2, tmp16);
1687fb4d8502Sjsg 
1688fb4d8502Sjsg 	speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1689fb4d8502Sjsg 	speed_cntl |= PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK;
1690fb4d8502Sjsg 	WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
1691fb4d8502Sjsg 
1692fb4d8502Sjsg 	for (i = 0; i < adev->usec_timeout; i++) {
1693fb4d8502Sjsg 		speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1694fb4d8502Sjsg 		if ((speed_cntl & PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK) == 0)
1695fb4d8502Sjsg 			break;
1696fb4d8502Sjsg 		udelay(1);
1697fb4d8502Sjsg 	}
1698fb4d8502Sjsg }
1699fb4d8502Sjsg 
cik_program_aspm(struct amdgpu_device * adev)1700fb4d8502Sjsg static void cik_program_aspm(struct amdgpu_device *adev)
1701fb4d8502Sjsg {
1702fb4d8502Sjsg 	u32 data, orig;
1703fb4d8502Sjsg 	bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
1704fb4d8502Sjsg 	bool disable_clkreq = false;
1705fb4d8502Sjsg 
1706a9d9cd9cSjsg 	if (!amdgpu_device_should_use_aspm(adev))
1707fb4d8502Sjsg 		return;
1708fb4d8502Sjsg 
1709fb4d8502Sjsg 	if (pci_is_root_bus(adev->pdev->bus))
1710fb4d8502Sjsg 		return;
1711fb4d8502Sjsg 
1712fb4d8502Sjsg 	/* XXX double check APUs */
1713fb4d8502Sjsg 	if (adev->flags & AMD_IS_APU)
1714fb4d8502Sjsg 		return;
1715fb4d8502Sjsg 
1716fb4d8502Sjsg 	orig = data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
1717fb4d8502Sjsg 	data &= ~PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_MASK;
1718fb4d8502Sjsg 	data |= (0x24 << PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS__SHIFT) |
1719fb4d8502Sjsg 		PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_OVERRIDE_EN_MASK;
1720fb4d8502Sjsg 	if (orig != data)
1721fb4d8502Sjsg 		WREG32_PCIE(ixPCIE_LC_N_FTS_CNTL, data);
1722fb4d8502Sjsg 
1723fb4d8502Sjsg 	orig = data = RREG32_PCIE(ixPCIE_LC_CNTL3);
1724fb4d8502Sjsg 	data |= PCIE_LC_CNTL3__LC_GO_TO_RECOVERY_MASK;
1725fb4d8502Sjsg 	if (orig != data)
1726fb4d8502Sjsg 		WREG32_PCIE(ixPCIE_LC_CNTL3, data);
1727fb4d8502Sjsg 
1728fb4d8502Sjsg 	orig = data = RREG32_PCIE(ixPCIE_P_CNTL);
1729fb4d8502Sjsg 	data |= PCIE_P_CNTL__P_IGNORE_EDB_ERR_MASK;
1730fb4d8502Sjsg 	if (orig != data)
1731fb4d8502Sjsg 		WREG32_PCIE(ixPCIE_P_CNTL, data);
1732fb4d8502Sjsg 
1733fb4d8502Sjsg 	orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
1734fb4d8502Sjsg 	data &= ~(PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK |
1735fb4d8502Sjsg 		PCIE_LC_CNTL__LC_L1_INACTIVITY_MASK);
1736fb4d8502Sjsg 	data |= PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
1737fb4d8502Sjsg 	if (!disable_l0s)
1738fb4d8502Sjsg 		data |= (7 << PCIE_LC_CNTL__LC_L0S_INACTIVITY__SHIFT);
1739fb4d8502Sjsg 
1740fb4d8502Sjsg 	if (!disable_l1) {
1741fb4d8502Sjsg 		data |= (7 << PCIE_LC_CNTL__LC_L1_INACTIVITY__SHIFT);
1742fb4d8502Sjsg 		data &= ~PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
1743fb4d8502Sjsg 		if (orig != data)
1744fb4d8502Sjsg 			WREG32_PCIE(ixPCIE_LC_CNTL, data);
1745fb4d8502Sjsg 
1746fb4d8502Sjsg 		if (!disable_plloff_in_l1) {
1747fb4d8502Sjsg 			bool clk_req_support;
1748fb4d8502Sjsg 
1749fb4d8502Sjsg 			orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_0);
1750fb4d8502Sjsg 			data &= ~(PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
1751fb4d8502Sjsg 				PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
1752fb4d8502Sjsg 			data |= (7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
1753fb4d8502Sjsg 				(7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
1754fb4d8502Sjsg 			if (orig != data)
1755fb4d8502Sjsg 				WREG32_PCIE(ixPB0_PIF_PWRDOWN_0, data);
1756fb4d8502Sjsg 
1757fb4d8502Sjsg 			orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_1);
1758fb4d8502Sjsg 			data &= ~(PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
1759fb4d8502Sjsg 				PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
1760fb4d8502Sjsg 			data |= (7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
1761fb4d8502Sjsg 				(7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
1762fb4d8502Sjsg 			if (orig != data)
1763fb4d8502Sjsg 				WREG32_PCIE(ixPB0_PIF_PWRDOWN_1, data);
1764fb4d8502Sjsg 
1765fb4d8502Sjsg 			orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_0);
1766fb4d8502Sjsg 			data &= ~(PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
1767fb4d8502Sjsg 				PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
1768fb4d8502Sjsg 			data |= (7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
1769fb4d8502Sjsg 				(7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
1770fb4d8502Sjsg 			if (orig != data)
1771fb4d8502Sjsg 				WREG32_PCIE(ixPB1_PIF_PWRDOWN_0, data);
1772fb4d8502Sjsg 
1773fb4d8502Sjsg 			orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_1);
1774fb4d8502Sjsg 			data &= ~(PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
1775fb4d8502Sjsg 				PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
1776fb4d8502Sjsg 			data |= (7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
1777fb4d8502Sjsg 				(7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
1778fb4d8502Sjsg 			if (orig != data)
1779fb4d8502Sjsg 				WREG32_PCIE(ixPB1_PIF_PWRDOWN_1, data);
1780fb4d8502Sjsg 
1781fb4d8502Sjsg 			orig = data = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
1782fb4d8502Sjsg 			data &= ~PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE_MASK;
1783fb4d8502Sjsg 			data |= ~(3 << PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE__SHIFT);
1784fb4d8502Sjsg 			if (orig != data)
1785fb4d8502Sjsg 				WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, data);
1786fb4d8502Sjsg 
1787fb4d8502Sjsg 			if (!disable_clkreq) {
1788fb4d8502Sjsg 				struct pci_dev *root = adev->pdev->bus->self;
1789fb4d8502Sjsg 				u32 lnkcap;
1790fb4d8502Sjsg 
1791fb4d8502Sjsg 				clk_req_support = false;
1792fb4d8502Sjsg 				pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
1793fb4d8502Sjsg 				if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
1794fb4d8502Sjsg 					clk_req_support = true;
1795fb4d8502Sjsg 			} else {
1796fb4d8502Sjsg 				clk_req_support = false;
1797fb4d8502Sjsg 			}
1798fb4d8502Sjsg 
1799fb4d8502Sjsg 			if (clk_req_support) {
1800fb4d8502Sjsg 				orig = data = RREG32_PCIE(ixPCIE_LC_CNTL2);
1801fb4d8502Sjsg 				data |= PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L1_MASK |
1802fb4d8502Sjsg 					PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L23_MASK;
1803fb4d8502Sjsg 				if (orig != data)
1804fb4d8502Sjsg 					WREG32_PCIE(ixPCIE_LC_CNTL2, data);
1805fb4d8502Sjsg 
1806fb4d8502Sjsg 				orig = data = RREG32_SMC(ixTHM_CLK_CNTL);
1807fb4d8502Sjsg 				data &= ~(THM_CLK_CNTL__CMON_CLK_SEL_MASK |
1808fb4d8502Sjsg 					THM_CLK_CNTL__TMON_CLK_SEL_MASK);
1809fb4d8502Sjsg 				data |= (1 << THM_CLK_CNTL__CMON_CLK_SEL__SHIFT) |
1810fb4d8502Sjsg 					(1 << THM_CLK_CNTL__TMON_CLK_SEL__SHIFT);
1811fb4d8502Sjsg 				if (orig != data)
1812fb4d8502Sjsg 					WREG32_SMC(ixTHM_CLK_CNTL, data);
1813fb4d8502Sjsg 
1814fb4d8502Sjsg 				orig = data = RREG32_SMC(ixMISC_CLK_CTRL);
1815fb4d8502Sjsg 				data &= ~(MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL_MASK |
1816fb4d8502Sjsg 					MISC_CLK_CTRL__ZCLK_SEL_MASK);
1817fb4d8502Sjsg 				data |= (1 << MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL__SHIFT) |
1818fb4d8502Sjsg 					(1 << MISC_CLK_CTRL__ZCLK_SEL__SHIFT);
1819fb4d8502Sjsg 				if (orig != data)
1820fb4d8502Sjsg 					WREG32_SMC(ixMISC_CLK_CTRL, data);
1821fb4d8502Sjsg 
1822fb4d8502Sjsg 				orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL);
1823fb4d8502Sjsg 				data &= ~CG_CLKPIN_CNTL__BCLK_AS_XCLK_MASK;
1824fb4d8502Sjsg 				if (orig != data)
1825fb4d8502Sjsg 					WREG32_SMC(ixCG_CLKPIN_CNTL, data);
1826fb4d8502Sjsg 
1827fb4d8502Sjsg 				orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL_2);
1828fb4d8502Sjsg 				data &= ~CG_CLKPIN_CNTL_2__FORCE_BIF_REFCLK_EN_MASK;
1829fb4d8502Sjsg 				if (orig != data)
1830fb4d8502Sjsg 					WREG32_SMC(ixCG_CLKPIN_CNTL_2, data);
1831fb4d8502Sjsg 
1832fb4d8502Sjsg 				orig = data = RREG32_SMC(ixMPLL_BYPASSCLK_SEL);
1833fb4d8502Sjsg 				data &= ~MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL_MASK;
1834fb4d8502Sjsg 				data |= (4 << MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL__SHIFT);
1835fb4d8502Sjsg 				if (orig != data)
1836fb4d8502Sjsg 					WREG32_SMC(ixMPLL_BYPASSCLK_SEL, data);
1837fb4d8502Sjsg 			}
1838fb4d8502Sjsg 		}
1839fb4d8502Sjsg 	} else {
1840fb4d8502Sjsg 		if (orig != data)
1841fb4d8502Sjsg 			WREG32_PCIE(ixPCIE_LC_CNTL, data);
1842fb4d8502Sjsg 	}
1843fb4d8502Sjsg 
1844fb4d8502Sjsg 	orig = data = RREG32_PCIE(ixPCIE_CNTL2);
1845fb4d8502Sjsg 	data |= PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
1846fb4d8502Sjsg 		PCIE_CNTL2__MST_MEM_LS_EN_MASK |
1847fb4d8502Sjsg 		PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK;
1848fb4d8502Sjsg 	if (orig != data)
1849fb4d8502Sjsg 		WREG32_PCIE(ixPCIE_CNTL2, data);
1850fb4d8502Sjsg 
1851fb4d8502Sjsg 	if (!disable_l0s) {
1852fb4d8502Sjsg 		data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
1853fb4d8502Sjsg 		if ((data & PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) ==
1854fb4d8502Sjsg 				PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) {
1855fb4d8502Sjsg 			data = RREG32_PCIE(ixPCIE_LC_STATUS1);
1856fb4d8502Sjsg 			if ((data & PCIE_LC_STATUS1__LC_REVERSE_XMIT_MASK) &&
1857fb4d8502Sjsg 			(data & PCIE_LC_STATUS1__LC_REVERSE_RCVR_MASK)) {
1858fb4d8502Sjsg 				orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
1859fb4d8502Sjsg 				data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK;
1860fb4d8502Sjsg 				if (orig != data)
1861fb4d8502Sjsg 					WREG32_PCIE(ixPCIE_LC_CNTL, data);
1862fb4d8502Sjsg 			}
1863fb4d8502Sjsg 		}
1864fb4d8502Sjsg 	}
1865fb4d8502Sjsg }
1866fb4d8502Sjsg 
cik_get_rev_id(struct amdgpu_device * adev)1867fb4d8502Sjsg static uint32_t cik_get_rev_id(struct amdgpu_device *adev)
1868fb4d8502Sjsg {
1869fb4d8502Sjsg 	return (RREG32(mmCC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1870fb4d8502Sjsg 		>> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1871fb4d8502Sjsg }
1872fb4d8502Sjsg 
cik_flush_hdp(struct amdgpu_device * adev,struct amdgpu_ring * ring)1873fb4d8502Sjsg static void cik_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
1874fb4d8502Sjsg {
1875fb4d8502Sjsg 	if (!ring || !ring->funcs->emit_wreg) {
1876fb4d8502Sjsg 		WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1877fb4d8502Sjsg 		RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
1878fb4d8502Sjsg 	} else {
1879fb4d8502Sjsg 		amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1880fb4d8502Sjsg 	}
1881fb4d8502Sjsg }
1882fb4d8502Sjsg 
cik_invalidate_hdp(struct amdgpu_device * adev,struct amdgpu_ring * ring)1883fb4d8502Sjsg static void cik_invalidate_hdp(struct amdgpu_device *adev,
1884fb4d8502Sjsg 			       struct amdgpu_ring *ring)
1885fb4d8502Sjsg {
1886fb4d8502Sjsg 	if (!ring || !ring->funcs->emit_wreg) {
1887fb4d8502Sjsg 		WREG32(mmHDP_DEBUG0, 1);
1888fb4d8502Sjsg 		RREG32(mmHDP_DEBUG0);
1889fb4d8502Sjsg 	} else {
1890fb4d8502Sjsg 		amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
1891fb4d8502Sjsg 	}
1892fb4d8502Sjsg }
1893fb4d8502Sjsg 
cik_need_full_reset(struct amdgpu_device * adev)1894fb4d8502Sjsg static bool cik_need_full_reset(struct amdgpu_device *adev)
1895fb4d8502Sjsg {
1896fb4d8502Sjsg 	/* change this when we support soft reset */
1897fb4d8502Sjsg 	return true;
1898fb4d8502Sjsg }
1899fb4d8502Sjsg 
cik_get_pcie_usage(struct amdgpu_device * adev,uint64_t * count0,uint64_t * count1)1900c349dbc7Sjsg static void cik_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
1901c349dbc7Sjsg 			       uint64_t *count1)
1902c349dbc7Sjsg {
1903c349dbc7Sjsg 	uint32_t perfctr = 0;
1904c349dbc7Sjsg 	uint64_t cnt0_of, cnt1_of;
1905c349dbc7Sjsg 	int tmp;
1906c349dbc7Sjsg 
1907c349dbc7Sjsg 	/* This reports 0 on APUs, so return to avoid writing/reading registers
1908c349dbc7Sjsg 	 * that may or may not be different from their GPU counterparts
1909c349dbc7Sjsg 	 */
1910c349dbc7Sjsg 	if (adev->flags & AMD_IS_APU)
1911c349dbc7Sjsg 		return;
1912c349dbc7Sjsg 
1913c349dbc7Sjsg 	/* Set the 2 events that we wish to watch, defined above */
1914c349dbc7Sjsg 	/* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
1915c349dbc7Sjsg 	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
1916c349dbc7Sjsg 	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
1917c349dbc7Sjsg 
1918c349dbc7Sjsg 	/* Write to enable desired perf counters */
1919c349dbc7Sjsg 	WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
1920c349dbc7Sjsg 	/* Zero out and enable the perf counters
1921c349dbc7Sjsg 	 * Write 0x5:
1922c349dbc7Sjsg 	 * Bit 0 = Start all counters(1)
1923c349dbc7Sjsg 	 * Bit 2 = Global counter reset enable(1)
1924c349dbc7Sjsg 	 */
1925c349dbc7Sjsg 	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
1926c349dbc7Sjsg 
1927c349dbc7Sjsg 	drm_msleep(1000);
1928c349dbc7Sjsg 
1929c349dbc7Sjsg 	/* Load the shadow and disable the perf counters
1930c349dbc7Sjsg 	 * Write 0x2:
1931c349dbc7Sjsg 	 * Bit 0 = Stop counters(0)
1932c349dbc7Sjsg 	 * Bit 1 = Load the shadow counters(1)
1933c349dbc7Sjsg 	 */
1934c349dbc7Sjsg 	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
1935c349dbc7Sjsg 
1936c349dbc7Sjsg 	/* Read register values to get any >32bit overflow */
1937c349dbc7Sjsg 	tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
1938c349dbc7Sjsg 	cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
1939c349dbc7Sjsg 	cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
1940c349dbc7Sjsg 
1941c349dbc7Sjsg 	/* Get the values and add the overflow */
1942c349dbc7Sjsg 	*count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
1943c349dbc7Sjsg 	*count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
1944c349dbc7Sjsg }
1945c349dbc7Sjsg 
cik_need_reset_on_init(struct amdgpu_device * adev)1946c349dbc7Sjsg static bool cik_need_reset_on_init(struct amdgpu_device *adev)
1947c349dbc7Sjsg {
1948c349dbc7Sjsg 	u32 clock_cntl, pc;
1949c349dbc7Sjsg 
1950c349dbc7Sjsg 	if (adev->flags & AMD_IS_APU)
1951c349dbc7Sjsg 		return false;
1952c349dbc7Sjsg 
1953c349dbc7Sjsg 	/* check if the SMC is already running */
1954c349dbc7Sjsg 	clock_cntl = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
1955c349dbc7Sjsg 	pc = RREG32_SMC(ixSMC_PC_C);
1956c349dbc7Sjsg 	if ((0 == REG_GET_FIELD(clock_cntl, SMC_SYSCON_CLOCK_CNTL_0, ck_disable)) &&
1957c349dbc7Sjsg 	    (0x20100 <= pc))
1958c349dbc7Sjsg 		return true;
1959c349dbc7Sjsg 
1960c349dbc7Sjsg 	return false;
1961c349dbc7Sjsg }
1962c349dbc7Sjsg 
cik_get_pcie_replay_count(struct amdgpu_device * adev)1963c349dbc7Sjsg static uint64_t cik_get_pcie_replay_count(struct amdgpu_device *adev)
1964c349dbc7Sjsg {
1965c349dbc7Sjsg 	uint64_t nak_r, nak_g;
1966c349dbc7Sjsg 
1967c349dbc7Sjsg 	/* Get the number of NAKs received and generated */
1968c349dbc7Sjsg 	nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
1969c349dbc7Sjsg 	nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
1970c349dbc7Sjsg 
1971c349dbc7Sjsg 	/* Add the total number of NAKs, i.e the number of replays */
1972c349dbc7Sjsg 	return (nak_r + nak_g);
1973c349dbc7Sjsg }
1974c349dbc7Sjsg 
cik_pre_asic_init(struct amdgpu_device * adev)1975ad8b1aafSjsg static void cik_pre_asic_init(struct amdgpu_device *adev)
1976ad8b1aafSjsg {
1977ad8b1aafSjsg }
1978ad8b1aafSjsg 
1979fb4d8502Sjsg static const struct amdgpu_asic_funcs cik_asic_funcs =
1980fb4d8502Sjsg {
1981fb4d8502Sjsg 	.read_disabled_bios = &cik_read_disabled_bios,
1982fb4d8502Sjsg 	.read_bios_from_rom = &cik_read_bios_from_rom,
1983fb4d8502Sjsg 	.read_register = &cik_read_register,
1984fb4d8502Sjsg 	.reset = &cik_asic_reset,
1985c349dbc7Sjsg 	.reset_method = &cik_asic_reset_method,
1986fb4d8502Sjsg 	.set_vga_state = &cik_vga_set_state,
1987fb4d8502Sjsg 	.get_xclk = &cik_get_xclk,
1988fb4d8502Sjsg 	.set_uvd_clocks = &cik_set_uvd_clocks,
1989fb4d8502Sjsg 	.set_vce_clocks = &cik_set_vce_clocks,
1990fb4d8502Sjsg 	.get_config_memsize = &cik_get_config_memsize,
1991fb4d8502Sjsg 	.flush_hdp = &cik_flush_hdp,
1992fb4d8502Sjsg 	.invalidate_hdp = &cik_invalidate_hdp,
1993fb4d8502Sjsg 	.need_full_reset = &cik_need_full_reset,
1994c349dbc7Sjsg 	.init_doorbell_index = &legacy_doorbell_index_init,
1995c349dbc7Sjsg 	.get_pcie_usage = &cik_get_pcie_usage,
1996c349dbc7Sjsg 	.need_reset_on_init = &cik_need_reset_on_init,
1997c349dbc7Sjsg 	.get_pcie_replay_count = &cik_get_pcie_replay_count,
1998c349dbc7Sjsg 	.supports_baco = &cik_asic_supports_baco,
1999ad8b1aafSjsg 	.pre_asic_init = &cik_pre_asic_init,
20005ca02815Sjsg 	.query_video_codecs = &cik_query_video_codecs,
2001fb4d8502Sjsg };
2002fb4d8502Sjsg 
cik_common_early_init(void * handle)2003fb4d8502Sjsg static int cik_common_early_init(void *handle)
2004fb4d8502Sjsg {
2005fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2006fb4d8502Sjsg 
2007fb4d8502Sjsg 	adev->smc_rreg = &cik_smc_rreg;
2008fb4d8502Sjsg 	adev->smc_wreg = &cik_smc_wreg;
2009fb4d8502Sjsg 	adev->pcie_rreg = &cik_pcie_rreg;
2010fb4d8502Sjsg 	adev->pcie_wreg = &cik_pcie_wreg;
2011fb4d8502Sjsg 	adev->uvd_ctx_rreg = &cik_uvd_ctx_rreg;
2012fb4d8502Sjsg 	adev->uvd_ctx_wreg = &cik_uvd_ctx_wreg;
2013fb4d8502Sjsg 	adev->didt_rreg = &cik_didt_rreg;
2014fb4d8502Sjsg 	adev->didt_wreg = &cik_didt_wreg;
2015fb4d8502Sjsg 
2016fb4d8502Sjsg 	adev->asic_funcs = &cik_asic_funcs;
2017fb4d8502Sjsg 
2018fb4d8502Sjsg 	adev->rev_id = cik_get_rev_id(adev);
2019fb4d8502Sjsg 	adev->external_rev_id = 0xFF;
2020fb4d8502Sjsg 	switch (adev->asic_type) {
2021fb4d8502Sjsg 	case CHIP_BONAIRE:
2022fb4d8502Sjsg 		adev->cg_flags =
2023fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_MGCG |
2024fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_MGLS |
2025fb4d8502Sjsg 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
2026fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_CGLS |
2027fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_CGTS |
2028fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_CGTS_LS |
2029fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_CP_LS |
2030fb4d8502Sjsg 			AMD_CG_SUPPORT_MC_LS |
2031fb4d8502Sjsg 			AMD_CG_SUPPORT_MC_MGCG |
2032fb4d8502Sjsg 			AMD_CG_SUPPORT_SDMA_MGCG |
2033fb4d8502Sjsg 			AMD_CG_SUPPORT_SDMA_LS |
2034fb4d8502Sjsg 			AMD_CG_SUPPORT_BIF_LS |
2035fb4d8502Sjsg 			AMD_CG_SUPPORT_VCE_MGCG |
2036fb4d8502Sjsg 			AMD_CG_SUPPORT_UVD_MGCG |
2037fb4d8502Sjsg 			AMD_CG_SUPPORT_HDP_LS |
2038fb4d8502Sjsg 			AMD_CG_SUPPORT_HDP_MGCG;
2039fb4d8502Sjsg 		adev->pg_flags = 0;
2040fb4d8502Sjsg 		adev->external_rev_id = adev->rev_id + 0x14;
2041fb4d8502Sjsg 		break;
2042fb4d8502Sjsg 	case CHIP_HAWAII:
2043fb4d8502Sjsg 		adev->cg_flags =
2044fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_MGCG |
2045fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_MGLS |
2046fb4d8502Sjsg 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
2047fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_CGLS |
2048fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_CGTS |
2049fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_CP_LS |
2050fb4d8502Sjsg 			AMD_CG_SUPPORT_MC_LS |
2051fb4d8502Sjsg 			AMD_CG_SUPPORT_MC_MGCG |
2052fb4d8502Sjsg 			AMD_CG_SUPPORT_SDMA_MGCG |
2053fb4d8502Sjsg 			AMD_CG_SUPPORT_SDMA_LS |
2054fb4d8502Sjsg 			AMD_CG_SUPPORT_BIF_LS |
2055fb4d8502Sjsg 			AMD_CG_SUPPORT_VCE_MGCG |
2056fb4d8502Sjsg 			AMD_CG_SUPPORT_UVD_MGCG |
2057fb4d8502Sjsg 			AMD_CG_SUPPORT_HDP_LS |
2058fb4d8502Sjsg 			AMD_CG_SUPPORT_HDP_MGCG;
2059fb4d8502Sjsg 		adev->pg_flags = 0;
2060fb4d8502Sjsg 		adev->external_rev_id = 0x28;
2061fb4d8502Sjsg 		break;
2062fb4d8502Sjsg 	case CHIP_KAVERI:
2063fb4d8502Sjsg 		adev->cg_flags =
2064fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_MGCG |
2065fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_MGLS |
2066fb4d8502Sjsg 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
2067fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_CGLS |
2068fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_CGTS |
2069fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_CGTS_LS |
2070fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_CP_LS |
2071fb4d8502Sjsg 			AMD_CG_SUPPORT_SDMA_MGCG |
2072fb4d8502Sjsg 			AMD_CG_SUPPORT_SDMA_LS |
2073fb4d8502Sjsg 			AMD_CG_SUPPORT_BIF_LS |
2074fb4d8502Sjsg 			AMD_CG_SUPPORT_VCE_MGCG |
2075fb4d8502Sjsg 			AMD_CG_SUPPORT_UVD_MGCG |
2076fb4d8502Sjsg 			AMD_CG_SUPPORT_HDP_LS |
2077fb4d8502Sjsg 			AMD_CG_SUPPORT_HDP_MGCG;
2078fb4d8502Sjsg 		adev->pg_flags =
2079fb4d8502Sjsg 			/*AMD_PG_SUPPORT_GFX_PG |
2080fb4d8502Sjsg 			  AMD_PG_SUPPORT_GFX_SMG |
2081fb4d8502Sjsg 			  AMD_PG_SUPPORT_GFX_DMG |*/
2082fb4d8502Sjsg 			AMD_PG_SUPPORT_UVD |
2083fb4d8502Sjsg 			AMD_PG_SUPPORT_VCE |
2084fb4d8502Sjsg 			/*  AMD_PG_SUPPORT_CP |
2085fb4d8502Sjsg 			  AMD_PG_SUPPORT_GDS |
2086fb4d8502Sjsg 			  AMD_PG_SUPPORT_RLC_SMU_HS |
2087fb4d8502Sjsg 			  AMD_PG_SUPPORT_ACP |
2088fb4d8502Sjsg 			  AMD_PG_SUPPORT_SAMU |*/
2089fb4d8502Sjsg 			0;
2090fb4d8502Sjsg 		if (adev->pdev->device == 0x1312 ||
2091fb4d8502Sjsg 			adev->pdev->device == 0x1316 ||
2092fb4d8502Sjsg 			adev->pdev->device == 0x1317)
2093fb4d8502Sjsg 			adev->external_rev_id = 0x41;
2094fb4d8502Sjsg 		else
2095fb4d8502Sjsg 			adev->external_rev_id = 0x1;
2096fb4d8502Sjsg 		break;
2097fb4d8502Sjsg 	case CHIP_KABINI:
2098fb4d8502Sjsg 	case CHIP_MULLINS:
2099fb4d8502Sjsg 		adev->cg_flags =
2100fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_MGCG |
2101fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_MGLS |
2102fb4d8502Sjsg 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
2103fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_CGLS |
2104fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_CGTS |
2105fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_CGTS_LS |
2106fb4d8502Sjsg 			AMD_CG_SUPPORT_GFX_CP_LS |
2107fb4d8502Sjsg 			AMD_CG_SUPPORT_SDMA_MGCG |
2108fb4d8502Sjsg 			AMD_CG_SUPPORT_SDMA_LS |
2109fb4d8502Sjsg 			AMD_CG_SUPPORT_BIF_LS |
2110fb4d8502Sjsg 			AMD_CG_SUPPORT_VCE_MGCG |
2111fb4d8502Sjsg 			AMD_CG_SUPPORT_UVD_MGCG |
2112fb4d8502Sjsg 			AMD_CG_SUPPORT_HDP_LS |
2113fb4d8502Sjsg 			AMD_CG_SUPPORT_HDP_MGCG;
2114fb4d8502Sjsg 		adev->pg_flags =
2115fb4d8502Sjsg 			/*AMD_PG_SUPPORT_GFX_PG |
2116fb4d8502Sjsg 			  AMD_PG_SUPPORT_GFX_SMG | */
2117fb4d8502Sjsg 			AMD_PG_SUPPORT_UVD |
2118fb4d8502Sjsg 			/*AMD_PG_SUPPORT_VCE |
2119fb4d8502Sjsg 			  AMD_PG_SUPPORT_CP |
2120fb4d8502Sjsg 			  AMD_PG_SUPPORT_GDS |
2121fb4d8502Sjsg 			  AMD_PG_SUPPORT_RLC_SMU_HS |
2122fb4d8502Sjsg 			  AMD_PG_SUPPORT_SAMU |*/
2123fb4d8502Sjsg 			0;
2124fb4d8502Sjsg 		if (adev->asic_type == CHIP_KABINI) {
2125fb4d8502Sjsg 			if (adev->rev_id == 0)
2126fb4d8502Sjsg 				adev->external_rev_id = 0x81;
2127fb4d8502Sjsg 			else if (adev->rev_id == 1)
2128fb4d8502Sjsg 				adev->external_rev_id = 0x82;
2129fb4d8502Sjsg 			else if (adev->rev_id == 2)
2130fb4d8502Sjsg 				adev->external_rev_id = 0x85;
2131fb4d8502Sjsg 		} else
2132fb4d8502Sjsg 			adev->external_rev_id = adev->rev_id + 0xa1;
2133fb4d8502Sjsg 		break;
2134fb4d8502Sjsg 	default:
2135fb4d8502Sjsg 		/* FIXME: not supported yet */
2136fb4d8502Sjsg 		return -EINVAL;
2137fb4d8502Sjsg 	}
2138fb4d8502Sjsg 
2139fb4d8502Sjsg 	return 0;
2140fb4d8502Sjsg }
2141fb4d8502Sjsg 
cik_common_sw_init(void * handle)2142fb4d8502Sjsg static int cik_common_sw_init(void *handle)
2143fb4d8502Sjsg {
2144fb4d8502Sjsg 	return 0;
2145fb4d8502Sjsg }
2146fb4d8502Sjsg 
cik_common_sw_fini(void * handle)2147fb4d8502Sjsg static int cik_common_sw_fini(void *handle)
2148fb4d8502Sjsg {
2149fb4d8502Sjsg 	return 0;
2150fb4d8502Sjsg }
2151fb4d8502Sjsg 
cik_common_hw_init(void * handle)2152fb4d8502Sjsg static int cik_common_hw_init(void *handle)
2153fb4d8502Sjsg {
2154fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2155fb4d8502Sjsg 
2156fb4d8502Sjsg 	/* move the golden regs per IP block */
2157fb4d8502Sjsg 	cik_init_golden_registers(adev);
2158fb4d8502Sjsg 	/* enable pcie gen2/3 link */
2159fb4d8502Sjsg 	cik_pcie_gen3_enable(adev);
2160fb4d8502Sjsg 	/* enable aspm */
2161fb4d8502Sjsg 	cik_program_aspm(adev);
2162fb4d8502Sjsg 
2163fb4d8502Sjsg 	return 0;
2164fb4d8502Sjsg }
2165fb4d8502Sjsg 
cik_common_hw_fini(void * handle)2166fb4d8502Sjsg static int cik_common_hw_fini(void *handle)
2167fb4d8502Sjsg {
2168fb4d8502Sjsg 	return 0;
2169fb4d8502Sjsg }
2170fb4d8502Sjsg 
cik_common_suspend(void * handle)2171fb4d8502Sjsg static int cik_common_suspend(void *handle)
2172fb4d8502Sjsg {
2173fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2174fb4d8502Sjsg 
2175fb4d8502Sjsg 	return cik_common_hw_fini(adev);
2176fb4d8502Sjsg }
2177fb4d8502Sjsg 
cik_common_resume(void * handle)2178fb4d8502Sjsg static int cik_common_resume(void *handle)
2179fb4d8502Sjsg {
2180fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2181fb4d8502Sjsg 
2182fb4d8502Sjsg 	return cik_common_hw_init(adev);
2183fb4d8502Sjsg }
2184fb4d8502Sjsg 
cik_common_is_idle(void * handle)2185fb4d8502Sjsg static bool cik_common_is_idle(void *handle)
2186fb4d8502Sjsg {
2187fb4d8502Sjsg 	return true;
2188fb4d8502Sjsg }
2189fb4d8502Sjsg 
cik_common_wait_for_idle(void * handle)2190fb4d8502Sjsg static int cik_common_wait_for_idle(void *handle)
2191fb4d8502Sjsg {
2192fb4d8502Sjsg 	return 0;
2193fb4d8502Sjsg }
2194fb4d8502Sjsg 
cik_common_soft_reset(void * handle)2195fb4d8502Sjsg static int cik_common_soft_reset(void *handle)
2196fb4d8502Sjsg {
2197fb4d8502Sjsg 	/* XXX hard reset?? */
2198fb4d8502Sjsg 	return 0;
2199fb4d8502Sjsg }
2200fb4d8502Sjsg 
cik_common_set_clockgating_state(void * handle,enum amd_clockgating_state state)2201fb4d8502Sjsg static int cik_common_set_clockgating_state(void *handle,
2202fb4d8502Sjsg 					    enum amd_clockgating_state state)
2203fb4d8502Sjsg {
2204fb4d8502Sjsg 	return 0;
2205fb4d8502Sjsg }
2206fb4d8502Sjsg 
cik_common_set_powergating_state(void * handle,enum amd_powergating_state state)2207fb4d8502Sjsg static int cik_common_set_powergating_state(void *handle,
2208fb4d8502Sjsg 					    enum amd_powergating_state state)
2209fb4d8502Sjsg {
2210fb4d8502Sjsg 	return 0;
2211fb4d8502Sjsg }
2212fb4d8502Sjsg 
2213fb4d8502Sjsg static const struct amd_ip_funcs cik_common_ip_funcs = {
2214fb4d8502Sjsg 	.name = "cik_common",
2215fb4d8502Sjsg 	.early_init = cik_common_early_init,
2216fb4d8502Sjsg 	.late_init = NULL,
2217fb4d8502Sjsg 	.sw_init = cik_common_sw_init,
2218fb4d8502Sjsg 	.sw_fini = cik_common_sw_fini,
2219fb4d8502Sjsg 	.hw_init = cik_common_hw_init,
2220fb4d8502Sjsg 	.hw_fini = cik_common_hw_fini,
2221fb4d8502Sjsg 	.suspend = cik_common_suspend,
2222fb4d8502Sjsg 	.resume = cik_common_resume,
2223fb4d8502Sjsg 	.is_idle = cik_common_is_idle,
2224fb4d8502Sjsg 	.wait_for_idle = cik_common_wait_for_idle,
2225fb4d8502Sjsg 	.soft_reset = cik_common_soft_reset,
2226fb4d8502Sjsg 	.set_clockgating_state = cik_common_set_clockgating_state,
2227fb4d8502Sjsg 	.set_powergating_state = cik_common_set_powergating_state,
2228fb4d8502Sjsg };
2229fb4d8502Sjsg 
2230fb4d8502Sjsg static const struct amdgpu_ip_block_version cik_common_ip_block =
2231fb4d8502Sjsg {
2232fb4d8502Sjsg 	.type = AMD_IP_BLOCK_TYPE_COMMON,
2233fb4d8502Sjsg 	.major = 1,
2234fb4d8502Sjsg 	.minor = 0,
2235fb4d8502Sjsg 	.rev = 0,
2236fb4d8502Sjsg 	.funcs = &cik_common_ip_funcs,
2237fb4d8502Sjsg };
2238fb4d8502Sjsg 
cik_set_ip_blocks(struct amdgpu_device * adev)2239fb4d8502Sjsg int cik_set_ip_blocks(struct amdgpu_device *adev)
2240fb4d8502Sjsg {
2241fb4d8502Sjsg 	switch (adev->asic_type) {
2242fb4d8502Sjsg 	case CHIP_BONAIRE:
2243fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
2244fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
2245fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
2246c349dbc7Sjsg 		amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
2247c349dbc7Sjsg 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2248fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
2249fb4d8502Sjsg 		if (adev->enable_virtual_display)
22505ca02815Sjsg 			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
2251fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_DC)
2252fb4d8502Sjsg 		else if (amdgpu_device_has_dc_support(adev))
2253fb4d8502Sjsg 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
2254fb4d8502Sjsg #endif
2255fb4d8502Sjsg 		else
2256fb4d8502Sjsg 			amdgpu_device_ip_block_add(adev, &dce_v8_2_ip_block);
2257fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
2258fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2259fb4d8502Sjsg 		break;
2260fb4d8502Sjsg 	case CHIP_HAWAII:
2261fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
2262fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
2263fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
2264c349dbc7Sjsg 		amdgpu_device_ip_block_add(adev, &gfx_v7_3_ip_block);
2265c349dbc7Sjsg 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2266fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
2267fb4d8502Sjsg 		if (adev->enable_virtual_display)
22685ca02815Sjsg 			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
2269fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_DC)
2270fb4d8502Sjsg 		else if (amdgpu_device_has_dc_support(adev))
2271fb4d8502Sjsg 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
2272fb4d8502Sjsg #endif
2273fb4d8502Sjsg 		else
2274fb4d8502Sjsg 			amdgpu_device_ip_block_add(adev, &dce_v8_5_ip_block);
2275fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
2276fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2277fb4d8502Sjsg 		break;
2278fb4d8502Sjsg 	case CHIP_KAVERI:
2279fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
2280fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
2281fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
2282c349dbc7Sjsg 		amdgpu_device_ip_block_add(adev, &gfx_v7_1_ip_block);
2283c349dbc7Sjsg 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2284fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
2285fb4d8502Sjsg 		if (adev->enable_virtual_display)
22865ca02815Sjsg 			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
2287fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_DC)
2288fb4d8502Sjsg 		else if (amdgpu_device_has_dc_support(adev))
2289fb4d8502Sjsg 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
2290fb4d8502Sjsg #endif
2291fb4d8502Sjsg 		else
2292fb4d8502Sjsg 			amdgpu_device_ip_block_add(adev, &dce_v8_1_ip_block);
2293c349dbc7Sjsg 
2294fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
2295fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2296fb4d8502Sjsg 		break;
2297fb4d8502Sjsg 	case CHIP_KABINI:
2298fb4d8502Sjsg 	case CHIP_MULLINS:
2299fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
2300fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
2301fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
2302c349dbc7Sjsg 		amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
2303c349dbc7Sjsg 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2304fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
2305fb4d8502Sjsg 		if (adev->enable_virtual_display)
23065ca02815Sjsg 			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
2307fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_DC)
2308fb4d8502Sjsg 		else if (amdgpu_device_has_dc_support(adev))
2309fb4d8502Sjsg 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
2310fb4d8502Sjsg #endif
2311fb4d8502Sjsg 		else
2312fb4d8502Sjsg 			amdgpu_device_ip_block_add(adev, &dce_v8_3_ip_block);
2313fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
2314fb4d8502Sjsg 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2315fb4d8502Sjsg 		break;
2316fb4d8502Sjsg 	default:
2317fb4d8502Sjsg 		/* FIXME: not supported yet */
2318fb4d8502Sjsg 		return -EINVAL;
2319fb4d8502Sjsg 	}
2320fb4d8502Sjsg 	return 0;
2321fb4d8502Sjsg }
2322