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