xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/amd/amdgpu/si.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2015 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  */
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 "atom.h"
35*4882a593Smuzhiyun #include "amd_pcie.h"
36*4882a593Smuzhiyun #include "si_dpm.h"
37*4882a593Smuzhiyun #include "sid.h"
38*4882a593Smuzhiyun #include "si_ih.h"
39*4882a593Smuzhiyun #include "gfx_v6_0.h"
40*4882a593Smuzhiyun #include "gmc_v6_0.h"
41*4882a593Smuzhiyun #include "si_dma.h"
42*4882a593Smuzhiyun #include "dce_v6_0.h"
43*4882a593Smuzhiyun #include "si.h"
44*4882a593Smuzhiyun #include "uvd_v3_1.h"
45*4882a593Smuzhiyun #include "dce_virtual.h"
46*4882a593Smuzhiyun #include "gca/gfx_6_0_d.h"
47*4882a593Smuzhiyun #include "oss/oss_1_0_d.h"
48*4882a593Smuzhiyun #include "oss/oss_1_0_sh_mask.h"
49*4882a593Smuzhiyun #include "gmc/gmc_6_0_d.h"
50*4882a593Smuzhiyun #include "dce/dce_6_0_d.h"
51*4882a593Smuzhiyun #include "uvd/uvd_4_0_d.h"
52*4882a593Smuzhiyun #include "bif/bif_3_0_d.h"
53*4882a593Smuzhiyun #include "bif/bif_3_0_sh_mask.h"
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #include "amdgpu_dm.h"
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun static const u32 tahiti_golden_registers[] =
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun 	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
60*4882a593Smuzhiyun 	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
61*4882a593Smuzhiyun 	mmDB_DEBUG, 0xffffffff, 0x00000000,
62*4882a593Smuzhiyun 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
63*4882a593Smuzhiyun 	mmDB_DEBUG3, 0x0002021c, 0x00020200,
64*4882a593Smuzhiyun 	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
65*4882a593Smuzhiyun 	0x340c, 0x000000c0, 0x00800040,
66*4882a593Smuzhiyun 	0x360c, 0x000000c0, 0x00800040,
67*4882a593Smuzhiyun 	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
68*4882a593Smuzhiyun 	mmFBC_MISC, 0x00200000, 0x50100000,
69*4882a593Smuzhiyun 	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
70*4882a593Smuzhiyun 	mmMC_ARB_WTM_CNTL_RD, 0x00000003, 0x000007ff,
71*4882a593Smuzhiyun 	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
72*4882a593Smuzhiyun 	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
73*4882a593Smuzhiyun 	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
74*4882a593Smuzhiyun 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
75*4882a593Smuzhiyun 	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
76*4882a593Smuzhiyun 	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
77*4882a593Smuzhiyun 	0x000c, 0xffffffff, 0x0040,
78*4882a593Smuzhiyun 	0x000d, 0x00000040, 0x00004040,
79*4882a593Smuzhiyun 	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
80*4882a593Smuzhiyun 	mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
81*4882a593Smuzhiyun 	mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
82*4882a593Smuzhiyun 	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
83*4882a593Smuzhiyun 	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
84*4882a593Smuzhiyun 	mmTCP_ADDR_CONFIG, 0x00000200, 0x000002fb,
85*4882a593Smuzhiyun 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x0000543b,
86*4882a593Smuzhiyun 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0xa9210876,
87*4882a593Smuzhiyun 	mmVGT_FIFO_DEPTHS, 0xffffffff, 0x000fff40,
88*4882a593Smuzhiyun 	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
89*4882a593Smuzhiyun 	mmVM_CONTEXT0_CNTL, 0x20000000, 0x20fffed8,
90*4882a593Smuzhiyun 	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
91*4882a593Smuzhiyun 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
92*4882a593Smuzhiyun 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
93*4882a593Smuzhiyun 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
94*4882a593Smuzhiyun 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
95*4882a593Smuzhiyun };
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun static const u32 tahiti_golden_registers2[] =
98*4882a593Smuzhiyun {
99*4882a593Smuzhiyun 	mmMCIF_MEM_CONTROL, 0x00000001, 0x00000001,
100*4882a593Smuzhiyun };
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun static const u32 tahiti_golden_rlc_registers[] =
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun 	mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
105*4882a593Smuzhiyun 	mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
106*4882a593Smuzhiyun 	0x311f, 0xffffffff, 0x10104040,
107*4882a593Smuzhiyun 	0x3122, 0xffffffff, 0x0100000a,
108*4882a593Smuzhiyun 	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
109*4882a593Smuzhiyun 	mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
110*4882a593Smuzhiyun 	mmUVD_CGC_GATE, 0x00000008, 0x00000000,
111*4882a593Smuzhiyun };
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun static const u32 pitcairn_golden_registers[] =
114*4882a593Smuzhiyun {
115*4882a593Smuzhiyun 	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
116*4882a593Smuzhiyun 	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
117*4882a593Smuzhiyun 	mmDB_DEBUG, 0xffffffff, 0x00000000,
118*4882a593Smuzhiyun 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
119*4882a593Smuzhiyun 	mmDB_DEBUG3, 0x0002021c, 0x00020200,
120*4882a593Smuzhiyun 	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
121*4882a593Smuzhiyun 	0x340c, 0x000300c0, 0x00800040,
122*4882a593Smuzhiyun 	0x360c, 0x000300c0, 0x00800040,
123*4882a593Smuzhiyun 	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
124*4882a593Smuzhiyun 	mmFBC_MISC, 0x00200000, 0x50100000,
125*4882a593Smuzhiyun 	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
126*4882a593Smuzhiyun 	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
127*4882a593Smuzhiyun 	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
128*4882a593Smuzhiyun 	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
129*4882a593Smuzhiyun 	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
130*4882a593Smuzhiyun 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
131*4882a593Smuzhiyun 	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
132*4882a593Smuzhiyun 	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
133*4882a593Smuzhiyun 	0x000c, 0xffffffff, 0x0040,
134*4882a593Smuzhiyun 	0x000d, 0x00000040, 0x00004040,
135*4882a593Smuzhiyun 	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
136*4882a593Smuzhiyun 	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
137*4882a593Smuzhiyun 	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
138*4882a593Smuzhiyun 	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7,
139*4882a593Smuzhiyun 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
140*4882a593Smuzhiyun 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x32761054,
141*4882a593Smuzhiyun 	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
142*4882a593Smuzhiyun 	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
143*4882a593Smuzhiyun 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
144*4882a593Smuzhiyun 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
145*4882a593Smuzhiyun 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
146*4882a593Smuzhiyun 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
147*4882a593Smuzhiyun };
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun static const u32 pitcairn_golden_rlc_registers[] =
150*4882a593Smuzhiyun {
151*4882a593Smuzhiyun 	mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
152*4882a593Smuzhiyun 	mmRLC_LB_PARAMS, 0xffffffff, 0x00601004,
153*4882a593Smuzhiyun 	0x311f, 0xffffffff, 0x10102020,
154*4882a593Smuzhiyun 	0x3122, 0xffffffff, 0x01000020,
155*4882a593Smuzhiyun 	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
156*4882a593Smuzhiyun 	mmRLC_LB_CNTL, 0xffffffff, 0x800000a4,
157*4882a593Smuzhiyun };
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun static const u32 verde_pg_init[] =
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x40000,
162*4882a593Smuzhiyun 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x200010ff,
163*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
164*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
165*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
166*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
167*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
168*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x7007,
169*4882a593Smuzhiyun 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x300010ff,
170*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
171*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
172*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
173*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
174*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
175*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x400000,
176*4882a593Smuzhiyun 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x100010ff,
177*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
178*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
179*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
180*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
181*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
182*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x120200,
183*4882a593Smuzhiyun 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x500010ff,
184*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
185*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
186*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
187*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
188*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
189*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x1e1e16,
190*4882a593Smuzhiyun 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x600010ff,
191*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
192*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
193*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
194*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
195*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
196*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x171f1e,
197*4882a593Smuzhiyun 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x700010ff,
198*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
199*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
200*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
201*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
202*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
203*4882a593Smuzhiyun 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
204*4882a593Smuzhiyun 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x9ff,
205*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x0,
206*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10000800,
207*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
208*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
209*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4,
210*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1000051e,
211*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
212*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
213*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x8,
214*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x80500,
215*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x12,
216*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x9050c,
217*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1d,
218*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xb052c,
219*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2a,
220*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1053e,
221*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2d,
222*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10546,
223*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x30,
224*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xa054e,
225*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3c,
226*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1055f,
227*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3f,
228*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10567,
229*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x42,
230*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1056f,
231*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x45,
232*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10572,
233*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x48,
234*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20575,
235*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4c,
236*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x190801,
237*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x67,
238*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1082a,
239*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x6a,
240*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1b082d,
241*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x87,
242*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x310851,
243*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xba,
244*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x891,
245*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbc,
246*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x893,
247*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbe,
248*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20895,
249*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc2,
250*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20899,
251*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc6,
252*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2089d,
253*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xca,
254*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a1,
255*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xcc,
256*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a3,
257*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xce,
258*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x308a5,
259*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xd3,
260*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x6d08cd,
261*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x142,
262*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2000095a,
263*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1,
264*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x144,
265*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x301f095b,
266*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x165,
267*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc094d,
268*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x173,
269*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf096d,
270*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x184,
271*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x15097f,
272*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x19b,
273*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc0998,
274*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1a9,
275*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x409a7,
276*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1af,
277*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xcdc,
278*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1b1,
279*4882a593Smuzhiyun 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x800,
280*4882a593Smuzhiyun 	mmGMCON_RENG_EXECUTE, 0xffffffff, 0x6c9b2000,
281*4882a593Smuzhiyun 	mmGMCON_MISC2, 0xfc00, 0x2000,
282*4882a593Smuzhiyun 	mmGMCON_MISC3, 0xffffffff, 0xfc0,
283*4882a593Smuzhiyun 	mmMC_PMG_AUTO_CFG, 0x00000100, 0x100,
284*4882a593Smuzhiyun };
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun static const u32 verde_golden_rlc_registers[] =
287*4882a593Smuzhiyun {
288*4882a593Smuzhiyun 	mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
289*4882a593Smuzhiyun 	mmRLC_LB_PARAMS, 0xffffffff, 0x033f1005,
290*4882a593Smuzhiyun 	0x311f, 0xffffffff, 0x10808020,
291*4882a593Smuzhiyun 	0x3122, 0xffffffff, 0x00800008,
292*4882a593Smuzhiyun 	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00001000,
293*4882a593Smuzhiyun 	mmRLC_LB_CNTL, 0xffffffff, 0x80010014,
294*4882a593Smuzhiyun };
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun static const u32 verde_golden_registers[] =
297*4882a593Smuzhiyun {
298*4882a593Smuzhiyun 	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
299*4882a593Smuzhiyun 	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
300*4882a593Smuzhiyun 	mmDB_DEBUG, 0xffffffff, 0x00000000,
301*4882a593Smuzhiyun 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
302*4882a593Smuzhiyun 	mmDB_DEBUG3, 0x0002021c, 0x00020200,
303*4882a593Smuzhiyun 	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
304*4882a593Smuzhiyun 	0x340c, 0x000300c0, 0x00800040,
305*4882a593Smuzhiyun 	0x360c, 0x000300c0, 0x00800040,
306*4882a593Smuzhiyun 	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
307*4882a593Smuzhiyun 	mmFBC_MISC, 0x00200000, 0x50100000,
308*4882a593Smuzhiyun 	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
309*4882a593Smuzhiyun 	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
310*4882a593Smuzhiyun 	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
311*4882a593Smuzhiyun 	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
312*4882a593Smuzhiyun 	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
313*4882a593Smuzhiyun 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
314*4882a593Smuzhiyun 	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
315*4882a593Smuzhiyun 	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x0000124a,
316*4882a593Smuzhiyun 	0x000c, 0xffffffff, 0x0040,
317*4882a593Smuzhiyun 	0x000d, 0x00000040, 0x00004040,
318*4882a593Smuzhiyun 	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
319*4882a593Smuzhiyun 	mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
320*4882a593Smuzhiyun 	mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
321*4882a593Smuzhiyun 	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
322*4882a593Smuzhiyun 	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
323*4882a593Smuzhiyun 	mmTCP_ADDR_CONFIG, 0x000003ff, 0x00000003,
324*4882a593Smuzhiyun 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
325*4882a593Smuzhiyun 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00001032,
326*4882a593Smuzhiyun 	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
327*4882a593Smuzhiyun 	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
328*4882a593Smuzhiyun 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
329*4882a593Smuzhiyun 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
330*4882a593Smuzhiyun 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
331*4882a593Smuzhiyun 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
332*4882a593Smuzhiyun };
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun static const u32 oland_golden_registers[] =
335*4882a593Smuzhiyun {
336*4882a593Smuzhiyun 	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
337*4882a593Smuzhiyun 	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
338*4882a593Smuzhiyun 	mmDB_DEBUG, 0xffffffff, 0x00000000,
339*4882a593Smuzhiyun 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
340*4882a593Smuzhiyun 	mmDB_DEBUG3, 0x0002021c, 0x00020200,
341*4882a593Smuzhiyun 	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
342*4882a593Smuzhiyun 	0x340c, 0x000300c0, 0x00800040,
343*4882a593Smuzhiyun 	0x360c, 0x000300c0, 0x00800040,
344*4882a593Smuzhiyun 	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
345*4882a593Smuzhiyun 	mmFBC_MISC, 0x00200000, 0x50100000,
346*4882a593Smuzhiyun 	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
347*4882a593Smuzhiyun 	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
348*4882a593Smuzhiyun 	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
349*4882a593Smuzhiyun 	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
350*4882a593Smuzhiyun 	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
351*4882a593Smuzhiyun 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
352*4882a593Smuzhiyun 	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
353*4882a593Smuzhiyun 	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000082,
354*4882a593Smuzhiyun 	0x000c, 0xffffffff, 0x0040,
355*4882a593Smuzhiyun 	0x000d, 0x00000040, 0x00004040,
356*4882a593Smuzhiyun 	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
357*4882a593Smuzhiyun 	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
358*4882a593Smuzhiyun 	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
359*4882a593Smuzhiyun 	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f3,
360*4882a593Smuzhiyun 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
361*4882a593Smuzhiyun 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
362*4882a593Smuzhiyun 	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
363*4882a593Smuzhiyun 	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
364*4882a593Smuzhiyun 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
365*4882a593Smuzhiyun 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
366*4882a593Smuzhiyun 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
367*4882a593Smuzhiyun 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun };
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun static const u32 oland_golden_rlc_registers[] =
372*4882a593Smuzhiyun {
373*4882a593Smuzhiyun 	mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
374*4882a593Smuzhiyun 	mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
375*4882a593Smuzhiyun 	0x311f, 0xffffffff, 0x10104040,
376*4882a593Smuzhiyun 	0x3122, 0xffffffff, 0x0100000a,
377*4882a593Smuzhiyun 	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
378*4882a593Smuzhiyun 	mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
379*4882a593Smuzhiyun };
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun static const u32 hainan_golden_registers[] =
382*4882a593Smuzhiyun {
383*4882a593Smuzhiyun 	0x17bc, 0x00000030, 0x00000011,
384*4882a593Smuzhiyun 	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
385*4882a593Smuzhiyun 	mmDB_DEBUG, 0xffffffff, 0x00000000,
386*4882a593Smuzhiyun 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
387*4882a593Smuzhiyun 	mmDB_DEBUG3, 0x0002021c, 0x00020200,
388*4882a593Smuzhiyun 	0x031e, 0x00000080, 0x00000000,
389*4882a593Smuzhiyun 	0x3430, 0xff000fff, 0x00000100,
390*4882a593Smuzhiyun 	0x340c, 0x000300c0, 0x00800040,
391*4882a593Smuzhiyun 	0x3630, 0xff000fff, 0x00000100,
392*4882a593Smuzhiyun 	0x360c, 0x000300c0, 0x00800040,
393*4882a593Smuzhiyun 	0x16ec, 0x000000f0, 0x00000070,
394*4882a593Smuzhiyun 	0x16f0, 0x00200000, 0x50100000,
395*4882a593Smuzhiyun 	0x1c0c, 0x31000311, 0x00000011,
396*4882a593Smuzhiyun 	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
397*4882a593Smuzhiyun 	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
398*4882a593Smuzhiyun 	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
399*4882a593Smuzhiyun 	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
400*4882a593Smuzhiyun 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
401*4882a593Smuzhiyun 	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
402*4882a593Smuzhiyun 	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000000,
403*4882a593Smuzhiyun 	0x000c, 0xffffffff, 0x0040,
404*4882a593Smuzhiyun 	0x000d, 0x00000040, 0x00004040,
405*4882a593Smuzhiyun 	mmSPI_CONFIG_CNTL, 0x03e00000, 0x03600000,
406*4882a593Smuzhiyun 	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
407*4882a593Smuzhiyun 	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
408*4882a593Smuzhiyun 	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f1,
409*4882a593Smuzhiyun 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
410*4882a593Smuzhiyun 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
411*4882a593Smuzhiyun 	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
412*4882a593Smuzhiyun 	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
413*4882a593Smuzhiyun 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
414*4882a593Smuzhiyun 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
415*4882a593Smuzhiyun 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
416*4882a593Smuzhiyun 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
417*4882a593Smuzhiyun };
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun static const u32 hainan_golden_registers2[] =
420*4882a593Smuzhiyun {
421*4882a593Smuzhiyun 	mmGB_ADDR_CONFIG, 0xffffffff, 0x2011003,
422*4882a593Smuzhiyun };
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun static const u32 tahiti_mgcg_cgcg_init[] =
425*4882a593Smuzhiyun {
426*4882a593Smuzhiyun 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
427*4882a593Smuzhiyun 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
428*4882a593Smuzhiyun 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
429*4882a593Smuzhiyun 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
430*4882a593Smuzhiyun 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
431*4882a593Smuzhiyun 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
432*4882a593Smuzhiyun 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
433*4882a593Smuzhiyun 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
434*4882a593Smuzhiyun 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
435*4882a593Smuzhiyun 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
436*4882a593Smuzhiyun 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
437*4882a593Smuzhiyun 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
438*4882a593Smuzhiyun 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
439*4882a593Smuzhiyun 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
440*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
441*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
442*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
443*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
444*4882a593Smuzhiyun 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
445*4882a593Smuzhiyun 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
446*4882a593Smuzhiyun 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
447*4882a593Smuzhiyun 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
448*4882a593Smuzhiyun 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
449*4882a593Smuzhiyun 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
450*4882a593Smuzhiyun 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
451*4882a593Smuzhiyun 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
452*4882a593Smuzhiyun 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
453*4882a593Smuzhiyun 	0x2458, 0xffffffff, 0x00010000,
454*4882a593Smuzhiyun 	0x2459, 0xffffffff, 0x00030002,
455*4882a593Smuzhiyun 	0x245a, 0xffffffff, 0x00040007,
456*4882a593Smuzhiyun 	0x245b, 0xffffffff, 0x00060005,
457*4882a593Smuzhiyun 	0x245c, 0xffffffff, 0x00090008,
458*4882a593Smuzhiyun 	0x245d, 0xffffffff, 0x00020001,
459*4882a593Smuzhiyun 	0x245e, 0xffffffff, 0x00040003,
460*4882a593Smuzhiyun 	0x245f, 0xffffffff, 0x00000007,
461*4882a593Smuzhiyun 	0x2460, 0xffffffff, 0x00060005,
462*4882a593Smuzhiyun 	0x2461, 0xffffffff, 0x00090008,
463*4882a593Smuzhiyun 	0x2462, 0xffffffff, 0x00030002,
464*4882a593Smuzhiyun 	0x2463, 0xffffffff, 0x00050004,
465*4882a593Smuzhiyun 	0x2464, 0xffffffff, 0x00000008,
466*4882a593Smuzhiyun 	0x2465, 0xffffffff, 0x00070006,
467*4882a593Smuzhiyun 	0x2466, 0xffffffff, 0x000a0009,
468*4882a593Smuzhiyun 	0x2467, 0xffffffff, 0x00040003,
469*4882a593Smuzhiyun 	0x2468, 0xffffffff, 0x00060005,
470*4882a593Smuzhiyun 	0x2469, 0xffffffff, 0x00000009,
471*4882a593Smuzhiyun 	0x246a, 0xffffffff, 0x00080007,
472*4882a593Smuzhiyun 	0x246b, 0xffffffff, 0x000b000a,
473*4882a593Smuzhiyun 	0x246c, 0xffffffff, 0x00050004,
474*4882a593Smuzhiyun 	0x246d, 0xffffffff, 0x00070006,
475*4882a593Smuzhiyun 	0x246e, 0xffffffff, 0x0008000b,
476*4882a593Smuzhiyun 	0x246f, 0xffffffff, 0x000a0009,
477*4882a593Smuzhiyun 	0x2470, 0xffffffff, 0x000d000c,
478*4882a593Smuzhiyun 	0x2471, 0xffffffff, 0x00060005,
479*4882a593Smuzhiyun 	0x2472, 0xffffffff, 0x00080007,
480*4882a593Smuzhiyun 	0x2473, 0xffffffff, 0x0000000b,
481*4882a593Smuzhiyun 	0x2474, 0xffffffff, 0x000a0009,
482*4882a593Smuzhiyun 	0x2475, 0xffffffff, 0x000d000c,
483*4882a593Smuzhiyun 	0x2476, 0xffffffff, 0x00070006,
484*4882a593Smuzhiyun 	0x2477, 0xffffffff, 0x00090008,
485*4882a593Smuzhiyun 	0x2478, 0xffffffff, 0x0000000c,
486*4882a593Smuzhiyun 	0x2479, 0xffffffff, 0x000b000a,
487*4882a593Smuzhiyun 	0x247a, 0xffffffff, 0x000e000d,
488*4882a593Smuzhiyun 	0x247b, 0xffffffff, 0x00080007,
489*4882a593Smuzhiyun 	0x247c, 0xffffffff, 0x000a0009,
490*4882a593Smuzhiyun 	0x247d, 0xffffffff, 0x0000000d,
491*4882a593Smuzhiyun 	0x247e, 0xffffffff, 0x000c000b,
492*4882a593Smuzhiyun 	0x247f, 0xffffffff, 0x000f000e,
493*4882a593Smuzhiyun 	0x2480, 0xffffffff, 0x00090008,
494*4882a593Smuzhiyun 	0x2481, 0xffffffff, 0x000b000a,
495*4882a593Smuzhiyun 	0x2482, 0xffffffff, 0x000c000f,
496*4882a593Smuzhiyun 	0x2483, 0xffffffff, 0x000e000d,
497*4882a593Smuzhiyun 	0x2484, 0xffffffff, 0x00110010,
498*4882a593Smuzhiyun 	0x2485, 0xffffffff, 0x000a0009,
499*4882a593Smuzhiyun 	0x2486, 0xffffffff, 0x000c000b,
500*4882a593Smuzhiyun 	0x2487, 0xffffffff, 0x0000000f,
501*4882a593Smuzhiyun 	0x2488, 0xffffffff, 0x000e000d,
502*4882a593Smuzhiyun 	0x2489, 0xffffffff, 0x00110010,
503*4882a593Smuzhiyun 	0x248a, 0xffffffff, 0x000b000a,
504*4882a593Smuzhiyun 	0x248b, 0xffffffff, 0x000d000c,
505*4882a593Smuzhiyun 	0x248c, 0xffffffff, 0x00000010,
506*4882a593Smuzhiyun 	0x248d, 0xffffffff, 0x000f000e,
507*4882a593Smuzhiyun 	0x248e, 0xffffffff, 0x00120011,
508*4882a593Smuzhiyun 	0x248f, 0xffffffff, 0x000c000b,
509*4882a593Smuzhiyun 	0x2490, 0xffffffff, 0x000e000d,
510*4882a593Smuzhiyun 	0x2491, 0xffffffff, 0x00000011,
511*4882a593Smuzhiyun 	0x2492, 0xffffffff, 0x0010000f,
512*4882a593Smuzhiyun 	0x2493, 0xffffffff, 0x00130012,
513*4882a593Smuzhiyun 	0x2494, 0xffffffff, 0x000d000c,
514*4882a593Smuzhiyun 	0x2495, 0xffffffff, 0x000f000e,
515*4882a593Smuzhiyun 	0x2496, 0xffffffff, 0x00100013,
516*4882a593Smuzhiyun 	0x2497, 0xffffffff, 0x00120011,
517*4882a593Smuzhiyun 	0x2498, 0xffffffff, 0x00150014,
518*4882a593Smuzhiyun 	0x2499, 0xffffffff, 0x000e000d,
519*4882a593Smuzhiyun 	0x249a, 0xffffffff, 0x0010000f,
520*4882a593Smuzhiyun 	0x249b, 0xffffffff, 0x00000013,
521*4882a593Smuzhiyun 	0x249c, 0xffffffff, 0x00120011,
522*4882a593Smuzhiyun 	0x249d, 0xffffffff, 0x00150014,
523*4882a593Smuzhiyun 	0x249e, 0xffffffff, 0x000f000e,
524*4882a593Smuzhiyun 	0x249f, 0xffffffff, 0x00110010,
525*4882a593Smuzhiyun 	0x24a0, 0xffffffff, 0x00000014,
526*4882a593Smuzhiyun 	0x24a1, 0xffffffff, 0x00130012,
527*4882a593Smuzhiyun 	0x24a2, 0xffffffff, 0x00160015,
528*4882a593Smuzhiyun 	0x24a3, 0xffffffff, 0x0010000f,
529*4882a593Smuzhiyun 	0x24a4, 0xffffffff, 0x00120011,
530*4882a593Smuzhiyun 	0x24a5, 0xffffffff, 0x00000015,
531*4882a593Smuzhiyun 	0x24a6, 0xffffffff, 0x00140013,
532*4882a593Smuzhiyun 	0x24a7, 0xffffffff, 0x00170016,
533*4882a593Smuzhiyun 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
534*4882a593Smuzhiyun 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
535*4882a593Smuzhiyun 	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
536*4882a593Smuzhiyun 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
537*4882a593Smuzhiyun 	0x000c, 0xffffffff, 0x0000001c,
538*4882a593Smuzhiyun 	0x000d, 0x000f0000, 0x000f0000,
539*4882a593Smuzhiyun 	0x0583, 0xffffffff, 0x00000100,
540*4882a593Smuzhiyun 	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
541*4882a593Smuzhiyun 	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
542*4882a593Smuzhiyun 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
543*4882a593Smuzhiyun 	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
544*4882a593Smuzhiyun 	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
545*4882a593Smuzhiyun 	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
546*4882a593Smuzhiyun 	0x157a, 0x00000001, 0x00000001,
547*4882a593Smuzhiyun 	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
548*4882a593Smuzhiyun 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
549*4882a593Smuzhiyun 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
550*4882a593Smuzhiyun 	0x3430, 0xfffffff0, 0x00000100,
551*4882a593Smuzhiyun 	0x3630, 0xfffffff0, 0x00000100,
552*4882a593Smuzhiyun };
553*4882a593Smuzhiyun static const u32 pitcairn_mgcg_cgcg_init[] =
554*4882a593Smuzhiyun {
555*4882a593Smuzhiyun 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
556*4882a593Smuzhiyun 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
557*4882a593Smuzhiyun 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
558*4882a593Smuzhiyun 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
559*4882a593Smuzhiyun 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
560*4882a593Smuzhiyun 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
561*4882a593Smuzhiyun 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
562*4882a593Smuzhiyun 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
563*4882a593Smuzhiyun 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
564*4882a593Smuzhiyun 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
565*4882a593Smuzhiyun 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
566*4882a593Smuzhiyun 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
567*4882a593Smuzhiyun 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
568*4882a593Smuzhiyun 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
569*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
570*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
571*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
572*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
573*4882a593Smuzhiyun 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
574*4882a593Smuzhiyun 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
575*4882a593Smuzhiyun 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
576*4882a593Smuzhiyun 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
577*4882a593Smuzhiyun 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
578*4882a593Smuzhiyun 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
579*4882a593Smuzhiyun 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
580*4882a593Smuzhiyun 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
581*4882a593Smuzhiyun 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
582*4882a593Smuzhiyun 	0x2458, 0xffffffff, 0x00010000,
583*4882a593Smuzhiyun 	0x2459, 0xffffffff, 0x00030002,
584*4882a593Smuzhiyun 	0x245a, 0xffffffff, 0x00040007,
585*4882a593Smuzhiyun 	0x245b, 0xffffffff, 0x00060005,
586*4882a593Smuzhiyun 	0x245c, 0xffffffff, 0x00090008,
587*4882a593Smuzhiyun 	0x245d, 0xffffffff, 0x00020001,
588*4882a593Smuzhiyun 	0x245e, 0xffffffff, 0x00040003,
589*4882a593Smuzhiyun 	0x245f, 0xffffffff, 0x00000007,
590*4882a593Smuzhiyun 	0x2460, 0xffffffff, 0x00060005,
591*4882a593Smuzhiyun 	0x2461, 0xffffffff, 0x00090008,
592*4882a593Smuzhiyun 	0x2462, 0xffffffff, 0x00030002,
593*4882a593Smuzhiyun 	0x2463, 0xffffffff, 0x00050004,
594*4882a593Smuzhiyun 	0x2464, 0xffffffff, 0x00000008,
595*4882a593Smuzhiyun 	0x2465, 0xffffffff, 0x00070006,
596*4882a593Smuzhiyun 	0x2466, 0xffffffff, 0x000a0009,
597*4882a593Smuzhiyun 	0x2467, 0xffffffff, 0x00040003,
598*4882a593Smuzhiyun 	0x2468, 0xffffffff, 0x00060005,
599*4882a593Smuzhiyun 	0x2469, 0xffffffff, 0x00000009,
600*4882a593Smuzhiyun 	0x246a, 0xffffffff, 0x00080007,
601*4882a593Smuzhiyun 	0x246b, 0xffffffff, 0x000b000a,
602*4882a593Smuzhiyun 	0x246c, 0xffffffff, 0x00050004,
603*4882a593Smuzhiyun 	0x246d, 0xffffffff, 0x00070006,
604*4882a593Smuzhiyun 	0x246e, 0xffffffff, 0x0008000b,
605*4882a593Smuzhiyun 	0x246f, 0xffffffff, 0x000a0009,
606*4882a593Smuzhiyun 	0x2470, 0xffffffff, 0x000d000c,
607*4882a593Smuzhiyun 	0x2480, 0xffffffff, 0x00090008,
608*4882a593Smuzhiyun 	0x2481, 0xffffffff, 0x000b000a,
609*4882a593Smuzhiyun 	0x2482, 0xffffffff, 0x000c000f,
610*4882a593Smuzhiyun 	0x2483, 0xffffffff, 0x000e000d,
611*4882a593Smuzhiyun 	0x2484, 0xffffffff, 0x00110010,
612*4882a593Smuzhiyun 	0x2485, 0xffffffff, 0x000a0009,
613*4882a593Smuzhiyun 	0x2486, 0xffffffff, 0x000c000b,
614*4882a593Smuzhiyun 	0x2487, 0xffffffff, 0x0000000f,
615*4882a593Smuzhiyun 	0x2488, 0xffffffff, 0x000e000d,
616*4882a593Smuzhiyun 	0x2489, 0xffffffff, 0x00110010,
617*4882a593Smuzhiyun 	0x248a, 0xffffffff, 0x000b000a,
618*4882a593Smuzhiyun 	0x248b, 0xffffffff, 0x000d000c,
619*4882a593Smuzhiyun 	0x248c, 0xffffffff, 0x00000010,
620*4882a593Smuzhiyun 	0x248d, 0xffffffff, 0x000f000e,
621*4882a593Smuzhiyun 	0x248e, 0xffffffff, 0x00120011,
622*4882a593Smuzhiyun 	0x248f, 0xffffffff, 0x000c000b,
623*4882a593Smuzhiyun 	0x2490, 0xffffffff, 0x000e000d,
624*4882a593Smuzhiyun 	0x2491, 0xffffffff, 0x00000011,
625*4882a593Smuzhiyun 	0x2492, 0xffffffff, 0x0010000f,
626*4882a593Smuzhiyun 	0x2493, 0xffffffff, 0x00130012,
627*4882a593Smuzhiyun 	0x2494, 0xffffffff, 0x000d000c,
628*4882a593Smuzhiyun 	0x2495, 0xffffffff, 0x000f000e,
629*4882a593Smuzhiyun 	0x2496, 0xffffffff, 0x00100013,
630*4882a593Smuzhiyun 	0x2497, 0xffffffff, 0x00120011,
631*4882a593Smuzhiyun 	0x2498, 0xffffffff, 0x00150014,
632*4882a593Smuzhiyun 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
633*4882a593Smuzhiyun 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
634*4882a593Smuzhiyun 	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
635*4882a593Smuzhiyun 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
636*4882a593Smuzhiyun 	0x000c, 0xffffffff, 0x0000001c,
637*4882a593Smuzhiyun 	0x000d, 0x000f0000, 0x000f0000,
638*4882a593Smuzhiyun 	0x0583, 0xffffffff, 0x00000100,
639*4882a593Smuzhiyun 	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
640*4882a593Smuzhiyun 	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
641*4882a593Smuzhiyun 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
642*4882a593Smuzhiyun 	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
643*4882a593Smuzhiyun 	0x157a, 0x00000001, 0x00000001,
644*4882a593Smuzhiyun 	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
645*4882a593Smuzhiyun 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
646*4882a593Smuzhiyun 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
647*4882a593Smuzhiyun 	0x3430, 0xfffffff0, 0x00000100,
648*4882a593Smuzhiyun 	0x3630, 0xfffffff0, 0x00000100,
649*4882a593Smuzhiyun };
650*4882a593Smuzhiyun 
651*4882a593Smuzhiyun static const u32 verde_mgcg_cgcg_init[] =
652*4882a593Smuzhiyun {
653*4882a593Smuzhiyun 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
654*4882a593Smuzhiyun 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
655*4882a593Smuzhiyun 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
656*4882a593Smuzhiyun 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
657*4882a593Smuzhiyun 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
658*4882a593Smuzhiyun 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
659*4882a593Smuzhiyun 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
660*4882a593Smuzhiyun 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
661*4882a593Smuzhiyun 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
662*4882a593Smuzhiyun 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
663*4882a593Smuzhiyun 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
664*4882a593Smuzhiyun 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
665*4882a593Smuzhiyun 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
666*4882a593Smuzhiyun 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
667*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
668*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
669*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
670*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
671*4882a593Smuzhiyun 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
672*4882a593Smuzhiyun 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
673*4882a593Smuzhiyun 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
674*4882a593Smuzhiyun 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
675*4882a593Smuzhiyun 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
676*4882a593Smuzhiyun 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
677*4882a593Smuzhiyun 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
678*4882a593Smuzhiyun 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
679*4882a593Smuzhiyun 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
680*4882a593Smuzhiyun 	0x2458, 0xffffffff, 0x00010000,
681*4882a593Smuzhiyun 	0x2459, 0xffffffff, 0x00030002,
682*4882a593Smuzhiyun 	0x245a, 0xffffffff, 0x00040007,
683*4882a593Smuzhiyun 	0x245b, 0xffffffff, 0x00060005,
684*4882a593Smuzhiyun 	0x245c, 0xffffffff, 0x00090008,
685*4882a593Smuzhiyun 	0x245d, 0xffffffff, 0x00020001,
686*4882a593Smuzhiyun 	0x245e, 0xffffffff, 0x00040003,
687*4882a593Smuzhiyun 	0x245f, 0xffffffff, 0x00000007,
688*4882a593Smuzhiyun 	0x2460, 0xffffffff, 0x00060005,
689*4882a593Smuzhiyun 	0x2461, 0xffffffff, 0x00090008,
690*4882a593Smuzhiyun 	0x2462, 0xffffffff, 0x00030002,
691*4882a593Smuzhiyun 	0x2463, 0xffffffff, 0x00050004,
692*4882a593Smuzhiyun 	0x2464, 0xffffffff, 0x00000008,
693*4882a593Smuzhiyun 	0x2465, 0xffffffff, 0x00070006,
694*4882a593Smuzhiyun 	0x2466, 0xffffffff, 0x000a0009,
695*4882a593Smuzhiyun 	0x2467, 0xffffffff, 0x00040003,
696*4882a593Smuzhiyun 	0x2468, 0xffffffff, 0x00060005,
697*4882a593Smuzhiyun 	0x2469, 0xffffffff, 0x00000009,
698*4882a593Smuzhiyun 	0x246a, 0xffffffff, 0x00080007,
699*4882a593Smuzhiyun 	0x246b, 0xffffffff, 0x000b000a,
700*4882a593Smuzhiyun 	0x246c, 0xffffffff, 0x00050004,
701*4882a593Smuzhiyun 	0x246d, 0xffffffff, 0x00070006,
702*4882a593Smuzhiyun 	0x246e, 0xffffffff, 0x0008000b,
703*4882a593Smuzhiyun 	0x246f, 0xffffffff, 0x000a0009,
704*4882a593Smuzhiyun 	0x2470, 0xffffffff, 0x000d000c,
705*4882a593Smuzhiyun 	0x2480, 0xffffffff, 0x00090008,
706*4882a593Smuzhiyun 	0x2481, 0xffffffff, 0x000b000a,
707*4882a593Smuzhiyun 	0x2482, 0xffffffff, 0x000c000f,
708*4882a593Smuzhiyun 	0x2483, 0xffffffff, 0x000e000d,
709*4882a593Smuzhiyun 	0x2484, 0xffffffff, 0x00110010,
710*4882a593Smuzhiyun 	0x2485, 0xffffffff, 0x000a0009,
711*4882a593Smuzhiyun 	0x2486, 0xffffffff, 0x000c000b,
712*4882a593Smuzhiyun 	0x2487, 0xffffffff, 0x0000000f,
713*4882a593Smuzhiyun 	0x2488, 0xffffffff, 0x000e000d,
714*4882a593Smuzhiyun 	0x2489, 0xffffffff, 0x00110010,
715*4882a593Smuzhiyun 	0x248a, 0xffffffff, 0x000b000a,
716*4882a593Smuzhiyun 	0x248b, 0xffffffff, 0x000d000c,
717*4882a593Smuzhiyun 	0x248c, 0xffffffff, 0x00000010,
718*4882a593Smuzhiyun 	0x248d, 0xffffffff, 0x000f000e,
719*4882a593Smuzhiyun 	0x248e, 0xffffffff, 0x00120011,
720*4882a593Smuzhiyun 	0x248f, 0xffffffff, 0x000c000b,
721*4882a593Smuzhiyun 	0x2490, 0xffffffff, 0x000e000d,
722*4882a593Smuzhiyun 	0x2491, 0xffffffff, 0x00000011,
723*4882a593Smuzhiyun 	0x2492, 0xffffffff, 0x0010000f,
724*4882a593Smuzhiyun 	0x2493, 0xffffffff, 0x00130012,
725*4882a593Smuzhiyun 	0x2494, 0xffffffff, 0x000d000c,
726*4882a593Smuzhiyun 	0x2495, 0xffffffff, 0x000f000e,
727*4882a593Smuzhiyun 	0x2496, 0xffffffff, 0x00100013,
728*4882a593Smuzhiyun 	0x2497, 0xffffffff, 0x00120011,
729*4882a593Smuzhiyun 	0x2498, 0xffffffff, 0x00150014,
730*4882a593Smuzhiyun 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
731*4882a593Smuzhiyun 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
732*4882a593Smuzhiyun 	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
733*4882a593Smuzhiyun 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
734*4882a593Smuzhiyun 	0x000c, 0xffffffff, 0x0000001c,
735*4882a593Smuzhiyun 	0x000d, 0x000f0000, 0x000f0000,
736*4882a593Smuzhiyun 	0x0583, 0xffffffff, 0x00000100,
737*4882a593Smuzhiyun 	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
738*4882a593Smuzhiyun 	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
739*4882a593Smuzhiyun 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
740*4882a593Smuzhiyun 	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
741*4882a593Smuzhiyun 	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
742*4882a593Smuzhiyun 	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
743*4882a593Smuzhiyun 	0x157a, 0x00000001, 0x00000001,
744*4882a593Smuzhiyun 	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
745*4882a593Smuzhiyun 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
746*4882a593Smuzhiyun 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
747*4882a593Smuzhiyun 	0x3430, 0xfffffff0, 0x00000100,
748*4882a593Smuzhiyun 	0x3630, 0xfffffff0, 0x00000100,
749*4882a593Smuzhiyun };
750*4882a593Smuzhiyun 
751*4882a593Smuzhiyun static const u32 oland_mgcg_cgcg_init[] =
752*4882a593Smuzhiyun {
753*4882a593Smuzhiyun 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
754*4882a593Smuzhiyun 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
755*4882a593Smuzhiyun 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
756*4882a593Smuzhiyun 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
757*4882a593Smuzhiyun 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
758*4882a593Smuzhiyun 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
759*4882a593Smuzhiyun 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
760*4882a593Smuzhiyun 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
761*4882a593Smuzhiyun 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
762*4882a593Smuzhiyun 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
763*4882a593Smuzhiyun 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
764*4882a593Smuzhiyun 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
765*4882a593Smuzhiyun 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
766*4882a593Smuzhiyun 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
767*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
768*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
769*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
770*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
771*4882a593Smuzhiyun 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
772*4882a593Smuzhiyun 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
773*4882a593Smuzhiyun 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
774*4882a593Smuzhiyun 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
775*4882a593Smuzhiyun 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
776*4882a593Smuzhiyun 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
777*4882a593Smuzhiyun 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
778*4882a593Smuzhiyun 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
779*4882a593Smuzhiyun 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
780*4882a593Smuzhiyun 	0x2458, 0xffffffff, 0x00010000,
781*4882a593Smuzhiyun 	0x2459, 0xffffffff, 0x00030002,
782*4882a593Smuzhiyun 	0x245a, 0xffffffff, 0x00040007,
783*4882a593Smuzhiyun 	0x245b, 0xffffffff, 0x00060005,
784*4882a593Smuzhiyun 	0x245c, 0xffffffff, 0x00090008,
785*4882a593Smuzhiyun 	0x245d, 0xffffffff, 0x00020001,
786*4882a593Smuzhiyun 	0x245e, 0xffffffff, 0x00040003,
787*4882a593Smuzhiyun 	0x245f, 0xffffffff, 0x00000007,
788*4882a593Smuzhiyun 	0x2460, 0xffffffff, 0x00060005,
789*4882a593Smuzhiyun 	0x2461, 0xffffffff, 0x00090008,
790*4882a593Smuzhiyun 	0x2462, 0xffffffff, 0x00030002,
791*4882a593Smuzhiyun 	0x2463, 0xffffffff, 0x00050004,
792*4882a593Smuzhiyun 	0x2464, 0xffffffff, 0x00000008,
793*4882a593Smuzhiyun 	0x2465, 0xffffffff, 0x00070006,
794*4882a593Smuzhiyun 	0x2466, 0xffffffff, 0x000a0009,
795*4882a593Smuzhiyun 	0x2467, 0xffffffff, 0x00040003,
796*4882a593Smuzhiyun 	0x2468, 0xffffffff, 0x00060005,
797*4882a593Smuzhiyun 	0x2469, 0xffffffff, 0x00000009,
798*4882a593Smuzhiyun 	0x246a, 0xffffffff, 0x00080007,
799*4882a593Smuzhiyun 	0x246b, 0xffffffff, 0x000b000a,
800*4882a593Smuzhiyun 	0x246c, 0xffffffff, 0x00050004,
801*4882a593Smuzhiyun 	0x246d, 0xffffffff, 0x00070006,
802*4882a593Smuzhiyun 	0x246e, 0xffffffff, 0x0008000b,
803*4882a593Smuzhiyun 	0x246f, 0xffffffff, 0x000a0009,
804*4882a593Smuzhiyun 	0x2470, 0xffffffff, 0x000d000c,
805*4882a593Smuzhiyun 	0x2471, 0xffffffff, 0x00060005,
806*4882a593Smuzhiyun 	0x2472, 0xffffffff, 0x00080007,
807*4882a593Smuzhiyun 	0x2473, 0xffffffff, 0x0000000b,
808*4882a593Smuzhiyun 	0x2474, 0xffffffff, 0x000a0009,
809*4882a593Smuzhiyun 	0x2475, 0xffffffff, 0x000d000c,
810*4882a593Smuzhiyun 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
811*4882a593Smuzhiyun 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
812*4882a593Smuzhiyun 	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
813*4882a593Smuzhiyun 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
814*4882a593Smuzhiyun 	0x000c, 0xffffffff, 0x0000001c,
815*4882a593Smuzhiyun 	0x000d, 0x000f0000, 0x000f0000,
816*4882a593Smuzhiyun 	0x0583, 0xffffffff, 0x00000100,
817*4882a593Smuzhiyun 	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
818*4882a593Smuzhiyun 	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
819*4882a593Smuzhiyun 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
820*4882a593Smuzhiyun 	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
821*4882a593Smuzhiyun 	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
822*4882a593Smuzhiyun 	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
823*4882a593Smuzhiyun 	0x157a, 0x00000001, 0x00000001,
824*4882a593Smuzhiyun 	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
825*4882a593Smuzhiyun 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
826*4882a593Smuzhiyun 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
827*4882a593Smuzhiyun 	0x3430, 0xfffffff0, 0x00000100,
828*4882a593Smuzhiyun 	0x3630, 0xfffffff0, 0x00000100,
829*4882a593Smuzhiyun };
830*4882a593Smuzhiyun 
831*4882a593Smuzhiyun static const u32 hainan_mgcg_cgcg_init[] =
832*4882a593Smuzhiyun {
833*4882a593Smuzhiyun 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
834*4882a593Smuzhiyun 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
835*4882a593Smuzhiyun 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
836*4882a593Smuzhiyun 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
837*4882a593Smuzhiyun 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
838*4882a593Smuzhiyun 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
839*4882a593Smuzhiyun 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
840*4882a593Smuzhiyun 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
841*4882a593Smuzhiyun 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
842*4882a593Smuzhiyun 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
843*4882a593Smuzhiyun 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
844*4882a593Smuzhiyun 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
845*4882a593Smuzhiyun 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
846*4882a593Smuzhiyun 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
847*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
848*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
849*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
850*4882a593Smuzhiyun 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
851*4882a593Smuzhiyun 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
852*4882a593Smuzhiyun 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
853*4882a593Smuzhiyun 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
854*4882a593Smuzhiyun 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
855*4882a593Smuzhiyun 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
856*4882a593Smuzhiyun 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
857*4882a593Smuzhiyun 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
858*4882a593Smuzhiyun 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
859*4882a593Smuzhiyun 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
860*4882a593Smuzhiyun 	0x2458, 0xffffffff, 0x00010000,
861*4882a593Smuzhiyun 	0x2459, 0xffffffff, 0x00030002,
862*4882a593Smuzhiyun 	0x245a, 0xffffffff, 0x00040007,
863*4882a593Smuzhiyun 	0x245b, 0xffffffff, 0x00060005,
864*4882a593Smuzhiyun 	0x245c, 0xffffffff, 0x00090008,
865*4882a593Smuzhiyun 	0x245d, 0xffffffff, 0x00020001,
866*4882a593Smuzhiyun 	0x245e, 0xffffffff, 0x00040003,
867*4882a593Smuzhiyun 	0x245f, 0xffffffff, 0x00000007,
868*4882a593Smuzhiyun 	0x2460, 0xffffffff, 0x00060005,
869*4882a593Smuzhiyun 	0x2461, 0xffffffff, 0x00090008,
870*4882a593Smuzhiyun 	0x2462, 0xffffffff, 0x00030002,
871*4882a593Smuzhiyun 	0x2463, 0xffffffff, 0x00050004,
872*4882a593Smuzhiyun 	0x2464, 0xffffffff, 0x00000008,
873*4882a593Smuzhiyun 	0x2465, 0xffffffff, 0x00070006,
874*4882a593Smuzhiyun 	0x2466, 0xffffffff, 0x000a0009,
875*4882a593Smuzhiyun 	0x2467, 0xffffffff, 0x00040003,
876*4882a593Smuzhiyun 	0x2468, 0xffffffff, 0x00060005,
877*4882a593Smuzhiyun 	0x2469, 0xffffffff, 0x00000009,
878*4882a593Smuzhiyun 	0x246a, 0xffffffff, 0x00080007,
879*4882a593Smuzhiyun 	0x246b, 0xffffffff, 0x000b000a,
880*4882a593Smuzhiyun 	0x246c, 0xffffffff, 0x00050004,
881*4882a593Smuzhiyun 	0x246d, 0xffffffff, 0x00070006,
882*4882a593Smuzhiyun 	0x246e, 0xffffffff, 0x0008000b,
883*4882a593Smuzhiyun 	0x246f, 0xffffffff, 0x000a0009,
884*4882a593Smuzhiyun 	0x2470, 0xffffffff, 0x000d000c,
885*4882a593Smuzhiyun 	0x2471, 0xffffffff, 0x00060005,
886*4882a593Smuzhiyun 	0x2472, 0xffffffff, 0x00080007,
887*4882a593Smuzhiyun 	0x2473, 0xffffffff, 0x0000000b,
888*4882a593Smuzhiyun 	0x2474, 0xffffffff, 0x000a0009,
889*4882a593Smuzhiyun 	0x2475, 0xffffffff, 0x000d000c,
890*4882a593Smuzhiyun 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
891*4882a593Smuzhiyun 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
892*4882a593Smuzhiyun 	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
893*4882a593Smuzhiyun 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
894*4882a593Smuzhiyun 	0x000c, 0xffffffff, 0x0000001c,
895*4882a593Smuzhiyun 	0x000d, 0x000f0000, 0x000f0000,
896*4882a593Smuzhiyun 	0x0583, 0xffffffff, 0x00000100,
897*4882a593Smuzhiyun 	0x0409, 0xffffffff, 0x00000100,
898*4882a593Smuzhiyun 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
899*4882a593Smuzhiyun 	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
900*4882a593Smuzhiyun 	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
901*4882a593Smuzhiyun 	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
902*4882a593Smuzhiyun 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
903*4882a593Smuzhiyun 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
904*4882a593Smuzhiyun 	0x3430, 0xfffffff0, 0x00000100,
905*4882a593Smuzhiyun 	0x3630, 0xfffffff0, 0x00000100,
906*4882a593Smuzhiyun };
907*4882a593Smuzhiyun 
si_pcie_rreg(struct amdgpu_device * adev,u32 reg)908*4882a593Smuzhiyun static u32 si_pcie_rreg(struct amdgpu_device *adev, u32 reg)
909*4882a593Smuzhiyun {
910*4882a593Smuzhiyun 	unsigned long flags;
911*4882a593Smuzhiyun 	u32 r;
912*4882a593Smuzhiyun 
913*4882a593Smuzhiyun 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
914*4882a593Smuzhiyun 	WREG32(AMDGPU_PCIE_INDEX, reg);
915*4882a593Smuzhiyun 	(void)RREG32(AMDGPU_PCIE_INDEX);
916*4882a593Smuzhiyun 	r = RREG32(AMDGPU_PCIE_DATA);
917*4882a593Smuzhiyun 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
918*4882a593Smuzhiyun 	return r;
919*4882a593Smuzhiyun }
920*4882a593Smuzhiyun 
si_pcie_wreg(struct amdgpu_device * adev,u32 reg,u32 v)921*4882a593Smuzhiyun static void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
922*4882a593Smuzhiyun {
923*4882a593Smuzhiyun 	unsigned long flags;
924*4882a593Smuzhiyun 
925*4882a593Smuzhiyun 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
926*4882a593Smuzhiyun 	WREG32(AMDGPU_PCIE_INDEX, reg);
927*4882a593Smuzhiyun 	(void)RREG32(AMDGPU_PCIE_INDEX);
928*4882a593Smuzhiyun 	WREG32(AMDGPU_PCIE_DATA, v);
929*4882a593Smuzhiyun 	(void)RREG32(AMDGPU_PCIE_DATA);
930*4882a593Smuzhiyun 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
931*4882a593Smuzhiyun }
932*4882a593Smuzhiyun 
si_pciep_rreg(struct amdgpu_device * adev,u32 reg)933*4882a593Smuzhiyun static u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
934*4882a593Smuzhiyun {
935*4882a593Smuzhiyun 	unsigned long flags;
936*4882a593Smuzhiyun 	u32 r;
937*4882a593Smuzhiyun 
938*4882a593Smuzhiyun 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
939*4882a593Smuzhiyun 	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
940*4882a593Smuzhiyun 	(void)RREG32(PCIE_PORT_INDEX);
941*4882a593Smuzhiyun 	r = RREG32(PCIE_PORT_DATA);
942*4882a593Smuzhiyun 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
943*4882a593Smuzhiyun 	return r;
944*4882a593Smuzhiyun }
945*4882a593Smuzhiyun 
si_pciep_wreg(struct amdgpu_device * adev,u32 reg,u32 v)946*4882a593Smuzhiyun static void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
947*4882a593Smuzhiyun {
948*4882a593Smuzhiyun 	unsigned long flags;
949*4882a593Smuzhiyun 
950*4882a593Smuzhiyun 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
951*4882a593Smuzhiyun 	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
952*4882a593Smuzhiyun 	(void)RREG32(PCIE_PORT_INDEX);
953*4882a593Smuzhiyun 	WREG32(PCIE_PORT_DATA, (v));
954*4882a593Smuzhiyun 	(void)RREG32(PCIE_PORT_DATA);
955*4882a593Smuzhiyun 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
956*4882a593Smuzhiyun }
957*4882a593Smuzhiyun 
si_smc_rreg(struct amdgpu_device * adev,u32 reg)958*4882a593Smuzhiyun static u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg)
959*4882a593Smuzhiyun {
960*4882a593Smuzhiyun 	unsigned long flags;
961*4882a593Smuzhiyun 	u32 r;
962*4882a593Smuzhiyun 
963*4882a593Smuzhiyun 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
964*4882a593Smuzhiyun 	WREG32(SMC_IND_INDEX_0, (reg));
965*4882a593Smuzhiyun 	r = RREG32(SMC_IND_DATA_0);
966*4882a593Smuzhiyun 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
967*4882a593Smuzhiyun 	return r;
968*4882a593Smuzhiyun }
969*4882a593Smuzhiyun 
si_smc_wreg(struct amdgpu_device * adev,u32 reg,u32 v)970*4882a593Smuzhiyun static void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
971*4882a593Smuzhiyun {
972*4882a593Smuzhiyun 	unsigned long flags;
973*4882a593Smuzhiyun 
974*4882a593Smuzhiyun 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
975*4882a593Smuzhiyun 	WREG32(SMC_IND_INDEX_0, (reg));
976*4882a593Smuzhiyun 	WREG32(SMC_IND_DATA_0, (v));
977*4882a593Smuzhiyun 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
978*4882a593Smuzhiyun }
979*4882a593Smuzhiyun 
si_uvd_ctx_rreg(struct amdgpu_device * adev,u32 reg)980*4882a593Smuzhiyun static u32 si_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
981*4882a593Smuzhiyun {
982*4882a593Smuzhiyun 	unsigned long flags;
983*4882a593Smuzhiyun 	u32 r;
984*4882a593Smuzhiyun 
985*4882a593Smuzhiyun 	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
986*4882a593Smuzhiyun 	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
987*4882a593Smuzhiyun 	r = RREG32(mmUVD_CTX_DATA);
988*4882a593Smuzhiyun 	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
989*4882a593Smuzhiyun 	return r;
990*4882a593Smuzhiyun }
991*4882a593Smuzhiyun 
si_uvd_ctx_wreg(struct amdgpu_device * adev,u32 reg,u32 v)992*4882a593Smuzhiyun static void si_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
993*4882a593Smuzhiyun {
994*4882a593Smuzhiyun 	unsigned long flags;
995*4882a593Smuzhiyun 
996*4882a593Smuzhiyun 	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
997*4882a593Smuzhiyun 	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
998*4882a593Smuzhiyun 	WREG32(mmUVD_CTX_DATA, (v));
999*4882a593Smuzhiyun 	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
1000*4882a593Smuzhiyun }
1001*4882a593Smuzhiyun 
1002*4882a593Smuzhiyun static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = {
1003*4882a593Smuzhiyun 	{GRBM_STATUS},
1004*4882a593Smuzhiyun 	{mmGRBM_STATUS2},
1005*4882a593Smuzhiyun 	{mmGRBM_STATUS_SE0},
1006*4882a593Smuzhiyun 	{mmGRBM_STATUS_SE1},
1007*4882a593Smuzhiyun 	{mmSRBM_STATUS},
1008*4882a593Smuzhiyun 	{mmSRBM_STATUS2},
1009*4882a593Smuzhiyun 	{DMA_STATUS_REG + DMA0_REGISTER_OFFSET},
1010*4882a593Smuzhiyun 	{DMA_STATUS_REG + DMA1_REGISTER_OFFSET},
1011*4882a593Smuzhiyun 	{mmCP_STAT},
1012*4882a593Smuzhiyun 	{mmCP_STALLED_STAT1},
1013*4882a593Smuzhiyun 	{mmCP_STALLED_STAT2},
1014*4882a593Smuzhiyun 	{mmCP_STALLED_STAT3},
1015*4882a593Smuzhiyun 	{GB_ADDR_CONFIG},
1016*4882a593Smuzhiyun 	{MC_ARB_RAMCFG},
1017*4882a593Smuzhiyun 	{GB_TILE_MODE0},
1018*4882a593Smuzhiyun 	{GB_TILE_MODE1},
1019*4882a593Smuzhiyun 	{GB_TILE_MODE2},
1020*4882a593Smuzhiyun 	{GB_TILE_MODE3},
1021*4882a593Smuzhiyun 	{GB_TILE_MODE4},
1022*4882a593Smuzhiyun 	{GB_TILE_MODE5},
1023*4882a593Smuzhiyun 	{GB_TILE_MODE6},
1024*4882a593Smuzhiyun 	{GB_TILE_MODE7},
1025*4882a593Smuzhiyun 	{GB_TILE_MODE8},
1026*4882a593Smuzhiyun 	{GB_TILE_MODE9},
1027*4882a593Smuzhiyun 	{GB_TILE_MODE10},
1028*4882a593Smuzhiyun 	{GB_TILE_MODE11},
1029*4882a593Smuzhiyun 	{GB_TILE_MODE12},
1030*4882a593Smuzhiyun 	{GB_TILE_MODE13},
1031*4882a593Smuzhiyun 	{GB_TILE_MODE14},
1032*4882a593Smuzhiyun 	{GB_TILE_MODE15},
1033*4882a593Smuzhiyun 	{GB_TILE_MODE16},
1034*4882a593Smuzhiyun 	{GB_TILE_MODE17},
1035*4882a593Smuzhiyun 	{GB_TILE_MODE18},
1036*4882a593Smuzhiyun 	{GB_TILE_MODE19},
1037*4882a593Smuzhiyun 	{GB_TILE_MODE20},
1038*4882a593Smuzhiyun 	{GB_TILE_MODE21},
1039*4882a593Smuzhiyun 	{GB_TILE_MODE22},
1040*4882a593Smuzhiyun 	{GB_TILE_MODE23},
1041*4882a593Smuzhiyun 	{GB_TILE_MODE24},
1042*4882a593Smuzhiyun 	{GB_TILE_MODE25},
1043*4882a593Smuzhiyun 	{GB_TILE_MODE26},
1044*4882a593Smuzhiyun 	{GB_TILE_MODE27},
1045*4882a593Smuzhiyun 	{GB_TILE_MODE28},
1046*4882a593Smuzhiyun 	{GB_TILE_MODE29},
1047*4882a593Smuzhiyun 	{GB_TILE_MODE30},
1048*4882a593Smuzhiyun 	{GB_TILE_MODE31},
1049*4882a593Smuzhiyun 	{CC_RB_BACKEND_DISABLE, true},
1050*4882a593Smuzhiyun 	{GC_USER_RB_BACKEND_DISABLE, true},
1051*4882a593Smuzhiyun 	{PA_SC_RASTER_CONFIG, true},
1052*4882a593Smuzhiyun };
1053*4882a593Smuzhiyun 
si_get_register_value(struct amdgpu_device * adev,bool indexed,u32 se_num,u32 sh_num,u32 reg_offset)1054*4882a593Smuzhiyun static uint32_t si_get_register_value(struct amdgpu_device *adev,
1055*4882a593Smuzhiyun 				      bool indexed, u32 se_num,
1056*4882a593Smuzhiyun 				      u32 sh_num, u32 reg_offset)
1057*4882a593Smuzhiyun {
1058*4882a593Smuzhiyun 	if (indexed) {
1059*4882a593Smuzhiyun 		uint32_t val;
1060*4882a593Smuzhiyun 		unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
1061*4882a593Smuzhiyun 		unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
1062*4882a593Smuzhiyun 
1063*4882a593Smuzhiyun 		switch (reg_offset) {
1064*4882a593Smuzhiyun 		case mmCC_RB_BACKEND_DISABLE:
1065*4882a593Smuzhiyun 			return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
1066*4882a593Smuzhiyun 		case mmGC_USER_RB_BACKEND_DISABLE:
1067*4882a593Smuzhiyun 			return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
1068*4882a593Smuzhiyun 		case mmPA_SC_RASTER_CONFIG:
1069*4882a593Smuzhiyun 			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
1070*4882a593Smuzhiyun 		}
1071*4882a593Smuzhiyun 
1072*4882a593Smuzhiyun 		mutex_lock(&adev->grbm_idx_mutex);
1073*4882a593Smuzhiyun 		if (se_num != 0xffffffff || sh_num != 0xffffffff)
1074*4882a593Smuzhiyun 			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
1075*4882a593Smuzhiyun 
1076*4882a593Smuzhiyun 		val = RREG32(reg_offset);
1077*4882a593Smuzhiyun 
1078*4882a593Smuzhiyun 		if (se_num != 0xffffffff || sh_num != 0xffffffff)
1079*4882a593Smuzhiyun 			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1080*4882a593Smuzhiyun 		mutex_unlock(&adev->grbm_idx_mutex);
1081*4882a593Smuzhiyun 		return val;
1082*4882a593Smuzhiyun 	} else {
1083*4882a593Smuzhiyun 		unsigned idx;
1084*4882a593Smuzhiyun 
1085*4882a593Smuzhiyun 		switch (reg_offset) {
1086*4882a593Smuzhiyun 		case mmGB_ADDR_CONFIG:
1087*4882a593Smuzhiyun 			return adev->gfx.config.gb_addr_config;
1088*4882a593Smuzhiyun 		case mmMC_ARB_RAMCFG:
1089*4882a593Smuzhiyun 			return adev->gfx.config.mc_arb_ramcfg;
1090*4882a593Smuzhiyun 		case mmGB_TILE_MODE0:
1091*4882a593Smuzhiyun 		case mmGB_TILE_MODE1:
1092*4882a593Smuzhiyun 		case mmGB_TILE_MODE2:
1093*4882a593Smuzhiyun 		case mmGB_TILE_MODE3:
1094*4882a593Smuzhiyun 		case mmGB_TILE_MODE4:
1095*4882a593Smuzhiyun 		case mmGB_TILE_MODE5:
1096*4882a593Smuzhiyun 		case mmGB_TILE_MODE6:
1097*4882a593Smuzhiyun 		case mmGB_TILE_MODE7:
1098*4882a593Smuzhiyun 		case mmGB_TILE_MODE8:
1099*4882a593Smuzhiyun 		case mmGB_TILE_MODE9:
1100*4882a593Smuzhiyun 		case mmGB_TILE_MODE10:
1101*4882a593Smuzhiyun 		case mmGB_TILE_MODE11:
1102*4882a593Smuzhiyun 		case mmGB_TILE_MODE12:
1103*4882a593Smuzhiyun 		case mmGB_TILE_MODE13:
1104*4882a593Smuzhiyun 		case mmGB_TILE_MODE14:
1105*4882a593Smuzhiyun 		case mmGB_TILE_MODE15:
1106*4882a593Smuzhiyun 		case mmGB_TILE_MODE16:
1107*4882a593Smuzhiyun 		case mmGB_TILE_MODE17:
1108*4882a593Smuzhiyun 		case mmGB_TILE_MODE18:
1109*4882a593Smuzhiyun 		case mmGB_TILE_MODE19:
1110*4882a593Smuzhiyun 		case mmGB_TILE_MODE20:
1111*4882a593Smuzhiyun 		case mmGB_TILE_MODE21:
1112*4882a593Smuzhiyun 		case mmGB_TILE_MODE22:
1113*4882a593Smuzhiyun 		case mmGB_TILE_MODE23:
1114*4882a593Smuzhiyun 		case mmGB_TILE_MODE24:
1115*4882a593Smuzhiyun 		case mmGB_TILE_MODE25:
1116*4882a593Smuzhiyun 		case mmGB_TILE_MODE26:
1117*4882a593Smuzhiyun 		case mmGB_TILE_MODE27:
1118*4882a593Smuzhiyun 		case mmGB_TILE_MODE28:
1119*4882a593Smuzhiyun 		case mmGB_TILE_MODE29:
1120*4882a593Smuzhiyun 		case mmGB_TILE_MODE30:
1121*4882a593Smuzhiyun 		case mmGB_TILE_MODE31:
1122*4882a593Smuzhiyun 			idx = (reg_offset - mmGB_TILE_MODE0);
1123*4882a593Smuzhiyun 			return adev->gfx.config.tile_mode_array[idx];
1124*4882a593Smuzhiyun 		default:
1125*4882a593Smuzhiyun 			return RREG32(reg_offset);
1126*4882a593Smuzhiyun 		}
1127*4882a593Smuzhiyun 	}
1128*4882a593Smuzhiyun }
si_read_register(struct amdgpu_device * adev,u32 se_num,u32 sh_num,u32 reg_offset,u32 * value)1129*4882a593Smuzhiyun static int si_read_register(struct amdgpu_device *adev, u32 se_num,
1130*4882a593Smuzhiyun 			     u32 sh_num, u32 reg_offset, u32 *value)
1131*4882a593Smuzhiyun {
1132*4882a593Smuzhiyun 	uint32_t i;
1133*4882a593Smuzhiyun 
1134*4882a593Smuzhiyun 	*value = 0;
1135*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) {
1136*4882a593Smuzhiyun 		bool indexed = si_allowed_read_registers[i].grbm_indexed;
1137*4882a593Smuzhiyun 
1138*4882a593Smuzhiyun 		if (reg_offset != si_allowed_read_registers[i].reg_offset)
1139*4882a593Smuzhiyun 			continue;
1140*4882a593Smuzhiyun 
1141*4882a593Smuzhiyun 		*value = si_get_register_value(adev, indexed, se_num, sh_num,
1142*4882a593Smuzhiyun 					       reg_offset);
1143*4882a593Smuzhiyun 		return 0;
1144*4882a593Smuzhiyun 	}
1145*4882a593Smuzhiyun 	return -EINVAL;
1146*4882a593Smuzhiyun }
1147*4882a593Smuzhiyun 
si_read_disabled_bios(struct amdgpu_device * adev)1148*4882a593Smuzhiyun static bool si_read_disabled_bios(struct amdgpu_device *adev)
1149*4882a593Smuzhiyun {
1150*4882a593Smuzhiyun 	u32 bus_cntl;
1151*4882a593Smuzhiyun 	u32 d1vga_control = 0;
1152*4882a593Smuzhiyun 	u32 d2vga_control = 0;
1153*4882a593Smuzhiyun 	u32 vga_render_control = 0;
1154*4882a593Smuzhiyun 	u32 rom_cntl;
1155*4882a593Smuzhiyun 	bool r;
1156*4882a593Smuzhiyun 
1157*4882a593Smuzhiyun 	bus_cntl = RREG32(R600_BUS_CNTL);
1158*4882a593Smuzhiyun 	if (adev->mode_info.num_crtc) {
1159*4882a593Smuzhiyun 		d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
1160*4882a593Smuzhiyun 		d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
1161*4882a593Smuzhiyun 		vga_render_control = RREG32(VGA_RENDER_CONTROL);
1162*4882a593Smuzhiyun 	}
1163*4882a593Smuzhiyun 	rom_cntl = RREG32(R600_ROM_CNTL);
1164*4882a593Smuzhiyun 
1165*4882a593Smuzhiyun 	/* enable the rom */
1166*4882a593Smuzhiyun 	WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
1167*4882a593Smuzhiyun 	if (adev->mode_info.num_crtc) {
1168*4882a593Smuzhiyun 		/* Disable VGA mode */
1169*4882a593Smuzhiyun 		WREG32(AVIVO_D1VGA_CONTROL,
1170*4882a593Smuzhiyun 		       (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1171*4882a593Smuzhiyun 					  AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1172*4882a593Smuzhiyun 		WREG32(AVIVO_D2VGA_CONTROL,
1173*4882a593Smuzhiyun 		       (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1174*4882a593Smuzhiyun 					  AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1175*4882a593Smuzhiyun 		WREG32(VGA_RENDER_CONTROL,
1176*4882a593Smuzhiyun 		       (vga_render_control & C_000300_VGA_VSTATUS_CNTL));
1177*4882a593Smuzhiyun 	}
1178*4882a593Smuzhiyun 	WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
1179*4882a593Smuzhiyun 
1180*4882a593Smuzhiyun 	r = amdgpu_read_bios(adev);
1181*4882a593Smuzhiyun 
1182*4882a593Smuzhiyun 	/* restore regs */
1183*4882a593Smuzhiyun 	WREG32(R600_BUS_CNTL, bus_cntl);
1184*4882a593Smuzhiyun 	if (adev->mode_info.num_crtc) {
1185*4882a593Smuzhiyun 		WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
1186*4882a593Smuzhiyun 		WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
1187*4882a593Smuzhiyun 		WREG32(VGA_RENDER_CONTROL, vga_render_control);
1188*4882a593Smuzhiyun 	}
1189*4882a593Smuzhiyun 	WREG32(R600_ROM_CNTL, rom_cntl);
1190*4882a593Smuzhiyun 	return r;
1191*4882a593Smuzhiyun }
1192*4882a593Smuzhiyun 
1193*4882a593Smuzhiyun #define mmROM_INDEX 0x2A
1194*4882a593Smuzhiyun #define mmROM_DATA  0x2B
1195*4882a593Smuzhiyun 
si_read_bios_from_rom(struct amdgpu_device * adev,u8 * bios,u32 length_bytes)1196*4882a593Smuzhiyun static bool si_read_bios_from_rom(struct amdgpu_device *adev,
1197*4882a593Smuzhiyun 				  u8 *bios, u32 length_bytes)
1198*4882a593Smuzhiyun {
1199*4882a593Smuzhiyun 	u32 *dw_ptr;
1200*4882a593Smuzhiyun 	u32 i, length_dw;
1201*4882a593Smuzhiyun 
1202*4882a593Smuzhiyun 	if (bios == NULL)
1203*4882a593Smuzhiyun 		return false;
1204*4882a593Smuzhiyun 	if (length_bytes == 0)
1205*4882a593Smuzhiyun 		return false;
1206*4882a593Smuzhiyun 	/* APU vbios image is part of sbios image */
1207*4882a593Smuzhiyun 	if (adev->flags & AMD_IS_APU)
1208*4882a593Smuzhiyun 		return false;
1209*4882a593Smuzhiyun 
1210*4882a593Smuzhiyun 	dw_ptr = (u32 *)bios;
1211*4882a593Smuzhiyun 	length_dw = ALIGN(length_bytes, 4) / 4;
1212*4882a593Smuzhiyun 	/* set rom index to 0 */
1213*4882a593Smuzhiyun 	WREG32(mmROM_INDEX, 0);
1214*4882a593Smuzhiyun 	for (i = 0; i < length_dw; i++)
1215*4882a593Smuzhiyun 		dw_ptr[i] = RREG32(mmROM_DATA);
1216*4882a593Smuzhiyun 
1217*4882a593Smuzhiyun 	return true;
1218*4882a593Smuzhiyun }
1219*4882a593Smuzhiyun 
si_set_clk_bypass_mode(struct amdgpu_device * adev)1220*4882a593Smuzhiyun static void si_set_clk_bypass_mode(struct amdgpu_device *adev)
1221*4882a593Smuzhiyun {
1222*4882a593Smuzhiyun 	u32 tmp, i;
1223*4882a593Smuzhiyun 
1224*4882a593Smuzhiyun 	tmp = RREG32(CG_SPLL_FUNC_CNTL);
1225*4882a593Smuzhiyun 	tmp |= SPLL_BYPASS_EN;
1226*4882a593Smuzhiyun 	WREG32(CG_SPLL_FUNC_CNTL, tmp);
1227*4882a593Smuzhiyun 
1228*4882a593Smuzhiyun 	tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
1229*4882a593Smuzhiyun 	tmp |= SPLL_CTLREQ_CHG;
1230*4882a593Smuzhiyun 	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1231*4882a593Smuzhiyun 
1232*4882a593Smuzhiyun 	for (i = 0; i < adev->usec_timeout; i++) {
1233*4882a593Smuzhiyun 		if (RREG32(SPLL_STATUS) & SPLL_CHG_STATUS)
1234*4882a593Smuzhiyun 			break;
1235*4882a593Smuzhiyun 		udelay(1);
1236*4882a593Smuzhiyun 	}
1237*4882a593Smuzhiyun 
1238*4882a593Smuzhiyun 	tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
1239*4882a593Smuzhiyun 	tmp &= ~(SPLL_CTLREQ_CHG | SCLK_MUX_UPDATE);
1240*4882a593Smuzhiyun 	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1241*4882a593Smuzhiyun 
1242*4882a593Smuzhiyun 	tmp = RREG32(MPLL_CNTL_MODE);
1243*4882a593Smuzhiyun 	tmp &= ~MPLL_MCLK_SEL;
1244*4882a593Smuzhiyun 	WREG32(MPLL_CNTL_MODE, tmp);
1245*4882a593Smuzhiyun }
1246*4882a593Smuzhiyun 
si_spll_powerdown(struct amdgpu_device * adev)1247*4882a593Smuzhiyun static void si_spll_powerdown(struct amdgpu_device *adev)
1248*4882a593Smuzhiyun {
1249*4882a593Smuzhiyun 	u32 tmp;
1250*4882a593Smuzhiyun 
1251*4882a593Smuzhiyun 	tmp = RREG32(SPLL_CNTL_MODE);
1252*4882a593Smuzhiyun 	tmp |= SPLL_SW_DIR_CONTROL;
1253*4882a593Smuzhiyun 	WREG32(SPLL_CNTL_MODE, tmp);
1254*4882a593Smuzhiyun 
1255*4882a593Smuzhiyun 	tmp = RREG32(CG_SPLL_FUNC_CNTL);
1256*4882a593Smuzhiyun 	tmp |= SPLL_RESET;
1257*4882a593Smuzhiyun 	WREG32(CG_SPLL_FUNC_CNTL, tmp);
1258*4882a593Smuzhiyun 
1259*4882a593Smuzhiyun 	tmp = RREG32(CG_SPLL_FUNC_CNTL);
1260*4882a593Smuzhiyun 	tmp |= SPLL_SLEEP;
1261*4882a593Smuzhiyun 	WREG32(CG_SPLL_FUNC_CNTL, tmp);
1262*4882a593Smuzhiyun 
1263*4882a593Smuzhiyun 	tmp = RREG32(SPLL_CNTL_MODE);
1264*4882a593Smuzhiyun 	tmp &= ~SPLL_SW_DIR_CONTROL;
1265*4882a593Smuzhiyun 	WREG32(SPLL_CNTL_MODE, tmp);
1266*4882a593Smuzhiyun }
1267*4882a593Smuzhiyun 
si_gpu_pci_config_reset(struct amdgpu_device * adev)1268*4882a593Smuzhiyun static int si_gpu_pci_config_reset(struct amdgpu_device *adev)
1269*4882a593Smuzhiyun {
1270*4882a593Smuzhiyun 	u32 i;
1271*4882a593Smuzhiyun 	int r = -EINVAL;
1272*4882a593Smuzhiyun 
1273*4882a593Smuzhiyun 	dev_info(adev->dev, "GPU pci config reset\n");
1274*4882a593Smuzhiyun 
1275*4882a593Smuzhiyun 	/* set mclk/sclk to bypass */
1276*4882a593Smuzhiyun 	si_set_clk_bypass_mode(adev);
1277*4882a593Smuzhiyun 	/* powerdown spll */
1278*4882a593Smuzhiyun 	si_spll_powerdown(adev);
1279*4882a593Smuzhiyun 	/* disable BM */
1280*4882a593Smuzhiyun 	pci_clear_master(adev->pdev);
1281*4882a593Smuzhiyun 	/* reset */
1282*4882a593Smuzhiyun 	amdgpu_device_pci_config_reset(adev);
1283*4882a593Smuzhiyun 
1284*4882a593Smuzhiyun 	udelay(100);
1285*4882a593Smuzhiyun 
1286*4882a593Smuzhiyun 	/* wait for asic to come out of reset */
1287*4882a593Smuzhiyun 	for (i = 0; i < adev->usec_timeout; i++) {
1288*4882a593Smuzhiyun 		if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
1289*4882a593Smuzhiyun 			/* enable BM */
1290*4882a593Smuzhiyun 			pci_set_master(adev->pdev);
1291*4882a593Smuzhiyun 			adev->has_hw_reset = true;
1292*4882a593Smuzhiyun 			r = 0;
1293*4882a593Smuzhiyun 			break;
1294*4882a593Smuzhiyun 		}
1295*4882a593Smuzhiyun 		udelay(1);
1296*4882a593Smuzhiyun 	}
1297*4882a593Smuzhiyun 
1298*4882a593Smuzhiyun 	return r;
1299*4882a593Smuzhiyun }
1300*4882a593Smuzhiyun 
si_asic_reset(struct amdgpu_device * adev)1301*4882a593Smuzhiyun static int si_asic_reset(struct amdgpu_device *adev)
1302*4882a593Smuzhiyun {
1303*4882a593Smuzhiyun 	int r;
1304*4882a593Smuzhiyun 
1305*4882a593Smuzhiyun 	dev_info(adev->dev, "PCI CONFIG reset\n");
1306*4882a593Smuzhiyun 
1307*4882a593Smuzhiyun 	amdgpu_atombios_scratch_regs_engine_hung(adev, true);
1308*4882a593Smuzhiyun 
1309*4882a593Smuzhiyun 	r = si_gpu_pci_config_reset(adev);
1310*4882a593Smuzhiyun 
1311*4882a593Smuzhiyun 	amdgpu_atombios_scratch_regs_engine_hung(adev, false);
1312*4882a593Smuzhiyun 
1313*4882a593Smuzhiyun 	return r;
1314*4882a593Smuzhiyun }
1315*4882a593Smuzhiyun 
si_asic_supports_baco(struct amdgpu_device * adev)1316*4882a593Smuzhiyun static bool si_asic_supports_baco(struct amdgpu_device *adev)
1317*4882a593Smuzhiyun {
1318*4882a593Smuzhiyun 	return false;
1319*4882a593Smuzhiyun }
1320*4882a593Smuzhiyun 
1321*4882a593Smuzhiyun static enum amd_reset_method
si_asic_reset_method(struct amdgpu_device * adev)1322*4882a593Smuzhiyun si_asic_reset_method(struct amdgpu_device *adev)
1323*4882a593Smuzhiyun {
1324*4882a593Smuzhiyun 	if (amdgpu_reset_method != AMD_RESET_METHOD_LEGACY &&
1325*4882a593Smuzhiyun 	    amdgpu_reset_method != -1)
1326*4882a593Smuzhiyun 		dev_warn(adev->dev, "Specified reset method:%d isn't supported, using AUTO instead.\n",
1327*4882a593Smuzhiyun 				  amdgpu_reset_method);
1328*4882a593Smuzhiyun 
1329*4882a593Smuzhiyun 	return AMD_RESET_METHOD_LEGACY;
1330*4882a593Smuzhiyun }
1331*4882a593Smuzhiyun 
si_get_config_memsize(struct amdgpu_device * adev)1332*4882a593Smuzhiyun static u32 si_get_config_memsize(struct amdgpu_device *adev)
1333*4882a593Smuzhiyun {
1334*4882a593Smuzhiyun 	return RREG32(mmCONFIG_MEMSIZE);
1335*4882a593Smuzhiyun }
1336*4882a593Smuzhiyun 
si_vga_set_state(struct amdgpu_device * adev,bool state)1337*4882a593Smuzhiyun static void si_vga_set_state(struct amdgpu_device *adev, bool state)
1338*4882a593Smuzhiyun {
1339*4882a593Smuzhiyun 	uint32_t temp;
1340*4882a593Smuzhiyun 
1341*4882a593Smuzhiyun 	temp = RREG32(CONFIG_CNTL);
1342*4882a593Smuzhiyun 	if (!state) {
1343*4882a593Smuzhiyun 		temp &= ~(1<<0);
1344*4882a593Smuzhiyun 		temp |= (1<<1);
1345*4882a593Smuzhiyun 	} else {
1346*4882a593Smuzhiyun 		temp &= ~(1<<1);
1347*4882a593Smuzhiyun 	}
1348*4882a593Smuzhiyun 	WREG32(CONFIG_CNTL, temp);
1349*4882a593Smuzhiyun }
1350*4882a593Smuzhiyun 
si_get_xclk(struct amdgpu_device * adev)1351*4882a593Smuzhiyun static u32 si_get_xclk(struct amdgpu_device *adev)
1352*4882a593Smuzhiyun {
1353*4882a593Smuzhiyun         u32 reference_clock = adev->clock.spll.reference_freq;
1354*4882a593Smuzhiyun 	u32 tmp;
1355*4882a593Smuzhiyun 
1356*4882a593Smuzhiyun 	tmp = RREG32(CG_CLKPIN_CNTL_2);
1357*4882a593Smuzhiyun 	if (tmp & MUX_TCLK_TO_XCLK)
1358*4882a593Smuzhiyun 		return TCLK;
1359*4882a593Smuzhiyun 
1360*4882a593Smuzhiyun 	tmp = RREG32(CG_CLKPIN_CNTL);
1361*4882a593Smuzhiyun 	if (tmp & XTALIN_DIVIDE)
1362*4882a593Smuzhiyun 		return reference_clock / 4;
1363*4882a593Smuzhiyun 
1364*4882a593Smuzhiyun 	return reference_clock;
1365*4882a593Smuzhiyun }
1366*4882a593Smuzhiyun 
si_flush_hdp(struct amdgpu_device * adev,struct amdgpu_ring * ring)1367*4882a593Smuzhiyun static void si_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
1368*4882a593Smuzhiyun {
1369*4882a593Smuzhiyun 	if (!ring || !ring->funcs->emit_wreg) {
1370*4882a593Smuzhiyun 		WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1371*4882a593Smuzhiyun 		RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
1372*4882a593Smuzhiyun 	} else {
1373*4882a593Smuzhiyun 		amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1374*4882a593Smuzhiyun 	}
1375*4882a593Smuzhiyun }
1376*4882a593Smuzhiyun 
si_invalidate_hdp(struct amdgpu_device * adev,struct amdgpu_ring * ring)1377*4882a593Smuzhiyun static void si_invalidate_hdp(struct amdgpu_device *adev,
1378*4882a593Smuzhiyun 			      struct amdgpu_ring *ring)
1379*4882a593Smuzhiyun {
1380*4882a593Smuzhiyun 	if (!ring || !ring->funcs->emit_wreg) {
1381*4882a593Smuzhiyun 		WREG32(mmHDP_DEBUG0, 1);
1382*4882a593Smuzhiyun 		RREG32(mmHDP_DEBUG0);
1383*4882a593Smuzhiyun 	} else {
1384*4882a593Smuzhiyun 		amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
1385*4882a593Smuzhiyun 	}
1386*4882a593Smuzhiyun }
1387*4882a593Smuzhiyun 
si_need_full_reset(struct amdgpu_device * adev)1388*4882a593Smuzhiyun static bool si_need_full_reset(struct amdgpu_device *adev)
1389*4882a593Smuzhiyun {
1390*4882a593Smuzhiyun 	/* change this when we support soft reset */
1391*4882a593Smuzhiyun 	return true;
1392*4882a593Smuzhiyun }
1393*4882a593Smuzhiyun 
si_need_reset_on_init(struct amdgpu_device * adev)1394*4882a593Smuzhiyun static bool si_need_reset_on_init(struct amdgpu_device *adev)
1395*4882a593Smuzhiyun {
1396*4882a593Smuzhiyun 	return false;
1397*4882a593Smuzhiyun }
1398*4882a593Smuzhiyun 
si_get_pcie_lanes(struct amdgpu_device * adev)1399*4882a593Smuzhiyun static int si_get_pcie_lanes(struct amdgpu_device *adev)
1400*4882a593Smuzhiyun {
1401*4882a593Smuzhiyun 	u32 link_width_cntl;
1402*4882a593Smuzhiyun 
1403*4882a593Smuzhiyun 	if (adev->flags & AMD_IS_APU)
1404*4882a593Smuzhiyun 		return 0;
1405*4882a593Smuzhiyun 
1406*4882a593Smuzhiyun 	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1407*4882a593Smuzhiyun 
1408*4882a593Smuzhiyun 	switch ((link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT) {
1409*4882a593Smuzhiyun 	case LC_LINK_WIDTH_X1:
1410*4882a593Smuzhiyun 		return 1;
1411*4882a593Smuzhiyun 	case LC_LINK_WIDTH_X2:
1412*4882a593Smuzhiyun 		return 2;
1413*4882a593Smuzhiyun 	case LC_LINK_WIDTH_X4:
1414*4882a593Smuzhiyun 		return 4;
1415*4882a593Smuzhiyun 	case LC_LINK_WIDTH_X8:
1416*4882a593Smuzhiyun 		return 8;
1417*4882a593Smuzhiyun 	case LC_LINK_WIDTH_X0:
1418*4882a593Smuzhiyun 	case LC_LINK_WIDTH_X16:
1419*4882a593Smuzhiyun 	default:
1420*4882a593Smuzhiyun 		return 16;
1421*4882a593Smuzhiyun 	}
1422*4882a593Smuzhiyun }
1423*4882a593Smuzhiyun 
si_set_pcie_lanes(struct amdgpu_device * adev,int lanes)1424*4882a593Smuzhiyun static void si_set_pcie_lanes(struct amdgpu_device *adev, int lanes)
1425*4882a593Smuzhiyun {
1426*4882a593Smuzhiyun 	u32 link_width_cntl, mask;
1427*4882a593Smuzhiyun 
1428*4882a593Smuzhiyun 	if (adev->flags & AMD_IS_APU)
1429*4882a593Smuzhiyun 		return;
1430*4882a593Smuzhiyun 
1431*4882a593Smuzhiyun 	switch (lanes) {
1432*4882a593Smuzhiyun 	case 0:
1433*4882a593Smuzhiyun 		mask = LC_LINK_WIDTH_X0;
1434*4882a593Smuzhiyun 		break;
1435*4882a593Smuzhiyun 	case 1:
1436*4882a593Smuzhiyun 		mask = LC_LINK_WIDTH_X1;
1437*4882a593Smuzhiyun 		break;
1438*4882a593Smuzhiyun 	case 2:
1439*4882a593Smuzhiyun 		mask = LC_LINK_WIDTH_X2;
1440*4882a593Smuzhiyun 		break;
1441*4882a593Smuzhiyun 	case 4:
1442*4882a593Smuzhiyun 		mask = LC_LINK_WIDTH_X4;
1443*4882a593Smuzhiyun 		break;
1444*4882a593Smuzhiyun 	case 8:
1445*4882a593Smuzhiyun 		mask = LC_LINK_WIDTH_X8;
1446*4882a593Smuzhiyun 		break;
1447*4882a593Smuzhiyun 	case 16:
1448*4882a593Smuzhiyun 		mask = LC_LINK_WIDTH_X16;
1449*4882a593Smuzhiyun 		break;
1450*4882a593Smuzhiyun 	default:
1451*4882a593Smuzhiyun 		DRM_ERROR("invalid pcie lane request: %d\n", lanes);
1452*4882a593Smuzhiyun 		return;
1453*4882a593Smuzhiyun 	}
1454*4882a593Smuzhiyun 
1455*4882a593Smuzhiyun 	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1456*4882a593Smuzhiyun 	link_width_cntl &= ~LC_LINK_WIDTH_MASK;
1457*4882a593Smuzhiyun 	link_width_cntl |= mask << LC_LINK_WIDTH_SHIFT;
1458*4882a593Smuzhiyun 	link_width_cntl |= (LC_RECONFIG_NOW |
1459*4882a593Smuzhiyun 			    LC_RECONFIG_ARC_MISSING_ESCAPE);
1460*4882a593Smuzhiyun 
1461*4882a593Smuzhiyun 	WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
1462*4882a593Smuzhiyun }
1463*4882a593Smuzhiyun 
si_get_pcie_usage(struct amdgpu_device * adev,uint64_t * count0,uint64_t * count1)1464*4882a593Smuzhiyun static void si_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
1465*4882a593Smuzhiyun 			      uint64_t *count1)
1466*4882a593Smuzhiyun {
1467*4882a593Smuzhiyun 	uint32_t perfctr = 0;
1468*4882a593Smuzhiyun 	uint64_t cnt0_of, cnt1_of;
1469*4882a593Smuzhiyun 	int tmp;
1470*4882a593Smuzhiyun 
1471*4882a593Smuzhiyun 	/* This reports 0 on APUs, so return to avoid writing/reading registers
1472*4882a593Smuzhiyun 	 * that may or may not be different from their GPU counterparts
1473*4882a593Smuzhiyun 	 */
1474*4882a593Smuzhiyun 	if (adev->flags & AMD_IS_APU)
1475*4882a593Smuzhiyun 		return;
1476*4882a593Smuzhiyun 
1477*4882a593Smuzhiyun 	/* Set the 2 events that we wish to watch, defined above */
1478*4882a593Smuzhiyun 	/* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
1479*4882a593Smuzhiyun 	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
1480*4882a593Smuzhiyun 	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
1481*4882a593Smuzhiyun 
1482*4882a593Smuzhiyun 	/* Write to enable desired perf counters */
1483*4882a593Smuzhiyun 	WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
1484*4882a593Smuzhiyun 	/* Zero out and enable the perf counters
1485*4882a593Smuzhiyun 	 * Write 0x5:
1486*4882a593Smuzhiyun 	 * Bit 0 = Start all counters(1)
1487*4882a593Smuzhiyun 	 * Bit 2 = Global counter reset enable(1)
1488*4882a593Smuzhiyun 	 */
1489*4882a593Smuzhiyun 	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
1490*4882a593Smuzhiyun 
1491*4882a593Smuzhiyun 	msleep(1000);
1492*4882a593Smuzhiyun 
1493*4882a593Smuzhiyun 	/* Load the shadow and disable the perf counters
1494*4882a593Smuzhiyun 	 * Write 0x2:
1495*4882a593Smuzhiyun 	 * Bit 0 = Stop counters(0)
1496*4882a593Smuzhiyun 	 * Bit 1 = Load the shadow counters(1)
1497*4882a593Smuzhiyun 	 */
1498*4882a593Smuzhiyun 	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
1499*4882a593Smuzhiyun 
1500*4882a593Smuzhiyun 	/* Read register values to get any >32bit overflow */
1501*4882a593Smuzhiyun 	tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
1502*4882a593Smuzhiyun 	cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
1503*4882a593Smuzhiyun 	cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
1504*4882a593Smuzhiyun 
1505*4882a593Smuzhiyun 	/* Get the values and add the overflow */
1506*4882a593Smuzhiyun 	*count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
1507*4882a593Smuzhiyun 	*count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
1508*4882a593Smuzhiyun }
1509*4882a593Smuzhiyun 
si_get_pcie_replay_count(struct amdgpu_device * adev)1510*4882a593Smuzhiyun static uint64_t si_get_pcie_replay_count(struct amdgpu_device *adev)
1511*4882a593Smuzhiyun {
1512*4882a593Smuzhiyun 	uint64_t nak_r, nak_g;
1513*4882a593Smuzhiyun 
1514*4882a593Smuzhiyun 	/* Get the number of NAKs received and generated */
1515*4882a593Smuzhiyun 	nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
1516*4882a593Smuzhiyun 	nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
1517*4882a593Smuzhiyun 
1518*4882a593Smuzhiyun 	/* Add the total number of NAKs, i.e the number of replays */
1519*4882a593Smuzhiyun 	return (nak_r + nak_g);
1520*4882a593Smuzhiyun }
1521*4882a593Smuzhiyun 
si_uvd_send_upll_ctlreq(struct amdgpu_device * adev,unsigned cg_upll_func_cntl)1522*4882a593Smuzhiyun static int si_uvd_send_upll_ctlreq(struct amdgpu_device *adev,
1523*4882a593Smuzhiyun 				   unsigned cg_upll_func_cntl)
1524*4882a593Smuzhiyun {
1525*4882a593Smuzhiyun 	unsigned i;
1526*4882a593Smuzhiyun 
1527*4882a593Smuzhiyun 	/* Make sure UPLL_CTLREQ is deasserted */
1528*4882a593Smuzhiyun 	WREG32_P(cg_upll_func_cntl, 0, ~UPLL_CTLREQ_MASK);
1529*4882a593Smuzhiyun 
1530*4882a593Smuzhiyun 	mdelay(10);
1531*4882a593Smuzhiyun 
1532*4882a593Smuzhiyun 	/* Assert UPLL_CTLREQ */
1533*4882a593Smuzhiyun 	WREG32_P(cg_upll_func_cntl, UPLL_CTLREQ_MASK, ~UPLL_CTLREQ_MASK);
1534*4882a593Smuzhiyun 
1535*4882a593Smuzhiyun 	/* Wait for CTLACK and CTLACK2 to get asserted */
1536*4882a593Smuzhiyun 	for (i = 0; i < SI_MAX_CTLACKS_ASSERTION_WAIT; ++i) {
1537*4882a593Smuzhiyun 		uint32_t mask = UPLL_CTLACK_MASK | UPLL_CTLACK2_MASK;
1538*4882a593Smuzhiyun 
1539*4882a593Smuzhiyun 		if ((RREG32(cg_upll_func_cntl) & mask) == mask)
1540*4882a593Smuzhiyun 			break;
1541*4882a593Smuzhiyun 		mdelay(10);
1542*4882a593Smuzhiyun 	}
1543*4882a593Smuzhiyun 
1544*4882a593Smuzhiyun 	/* Deassert UPLL_CTLREQ */
1545*4882a593Smuzhiyun 	WREG32_P(cg_upll_func_cntl, 0, ~UPLL_CTLREQ_MASK);
1546*4882a593Smuzhiyun 
1547*4882a593Smuzhiyun 	if (i == SI_MAX_CTLACKS_ASSERTION_WAIT) {
1548*4882a593Smuzhiyun 		DRM_ERROR("Timeout setting UVD clocks!\n");
1549*4882a593Smuzhiyun 		return -ETIMEDOUT;
1550*4882a593Smuzhiyun 	}
1551*4882a593Smuzhiyun 
1552*4882a593Smuzhiyun 	return 0;
1553*4882a593Smuzhiyun }
1554*4882a593Smuzhiyun 
si_uvd_calc_upll_post_div(unsigned vco_freq,unsigned target_freq,unsigned pd_min,unsigned pd_even)1555*4882a593Smuzhiyun static unsigned si_uvd_calc_upll_post_div(unsigned vco_freq,
1556*4882a593Smuzhiyun 					  unsigned target_freq,
1557*4882a593Smuzhiyun 					  unsigned pd_min,
1558*4882a593Smuzhiyun 					  unsigned pd_even)
1559*4882a593Smuzhiyun {
1560*4882a593Smuzhiyun 	unsigned post_div = vco_freq / target_freq;
1561*4882a593Smuzhiyun 
1562*4882a593Smuzhiyun 	/* Adjust to post divider minimum value */
1563*4882a593Smuzhiyun 	if (post_div < pd_min)
1564*4882a593Smuzhiyun 		post_div = pd_min;
1565*4882a593Smuzhiyun 
1566*4882a593Smuzhiyun 	/* We alway need a frequency less than or equal the target */
1567*4882a593Smuzhiyun 	if ((vco_freq / post_div) > target_freq)
1568*4882a593Smuzhiyun 		post_div += 1;
1569*4882a593Smuzhiyun 
1570*4882a593Smuzhiyun 	/* Post dividers above a certain value must be even */
1571*4882a593Smuzhiyun 	if (post_div > pd_even && post_div % 2)
1572*4882a593Smuzhiyun 		post_div += 1;
1573*4882a593Smuzhiyun 
1574*4882a593Smuzhiyun 	return post_div;
1575*4882a593Smuzhiyun }
1576*4882a593Smuzhiyun 
1577*4882a593Smuzhiyun /**
1578*4882a593Smuzhiyun  * si_calc_upll_dividers - calc UPLL clock dividers
1579*4882a593Smuzhiyun  *
1580*4882a593Smuzhiyun  * @adev: amdgpu_device pointer
1581*4882a593Smuzhiyun  * @vclk: wanted VCLK
1582*4882a593Smuzhiyun  * @dclk: wanted DCLK
1583*4882a593Smuzhiyun  * @vco_min: minimum VCO frequency
1584*4882a593Smuzhiyun  * @vco_max: maximum VCO frequency
1585*4882a593Smuzhiyun  * @fb_factor: factor to multiply vco freq with
1586*4882a593Smuzhiyun  * @fb_mask: limit and bitmask for feedback divider
1587*4882a593Smuzhiyun  * @pd_min: post divider minimum
1588*4882a593Smuzhiyun  * @pd_max: post divider maximum
1589*4882a593Smuzhiyun  * @pd_even: post divider must be even above this value
1590*4882a593Smuzhiyun  * @optimal_fb_div: resulting feedback divider
1591*4882a593Smuzhiyun  * @optimal_vclk_div: resulting vclk post divider
1592*4882a593Smuzhiyun  * @optimal_dclk_div: resulting dclk post divider
1593*4882a593Smuzhiyun  *
1594*4882a593Smuzhiyun  * Calculate dividers for UVDs UPLL (except APUs).
1595*4882a593Smuzhiyun  * Returns zero on success; -EINVAL on error.
1596*4882a593Smuzhiyun  */
si_calc_upll_dividers(struct amdgpu_device * adev,unsigned vclk,unsigned dclk,unsigned vco_min,unsigned vco_max,unsigned fb_factor,unsigned fb_mask,unsigned pd_min,unsigned pd_max,unsigned pd_even,unsigned * optimal_fb_div,unsigned * optimal_vclk_div,unsigned * optimal_dclk_div)1597*4882a593Smuzhiyun static int si_calc_upll_dividers(struct amdgpu_device *adev,
1598*4882a593Smuzhiyun 				 unsigned vclk, unsigned dclk,
1599*4882a593Smuzhiyun 				 unsigned vco_min, unsigned vco_max,
1600*4882a593Smuzhiyun 				 unsigned fb_factor, unsigned fb_mask,
1601*4882a593Smuzhiyun 				 unsigned pd_min, unsigned pd_max,
1602*4882a593Smuzhiyun 				 unsigned pd_even,
1603*4882a593Smuzhiyun 				 unsigned *optimal_fb_div,
1604*4882a593Smuzhiyun 				 unsigned *optimal_vclk_div,
1605*4882a593Smuzhiyun 				 unsigned *optimal_dclk_div)
1606*4882a593Smuzhiyun {
1607*4882a593Smuzhiyun 	unsigned vco_freq, ref_freq = adev->clock.spll.reference_freq;
1608*4882a593Smuzhiyun 
1609*4882a593Smuzhiyun 	/* Start off with something large */
1610*4882a593Smuzhiyun 	unsigned optimal_score = ~0;
1611*4882a593Smuzhiyun 
1612*4882a593Smuzhiyun 	/* Loop through vco from low to high */
1613*4882a593Smuzhiyun 	vco_min = max(max(vco_min, vclk), dclk);
1614*4882a593Smuzhiyun 	for (vco_freq = vco_min; vco_freq <= vco_max; vco_freq += 100) {
1615*4882a593Smuzhiyun 		uint64_t fb_div = (uint64_t)vco_freq * fb_factor;
1616*4882a593Smuzhiyun 		unsigned vclk_div, dclk_div, score;
1617*4882a593Smuzhiyun 
1618*4882a593Smuzhiyun 		do_div(fb_div, ref_freq);
1619*4882a593Smuzhiyun 
1620*4882a593Smuzhiyun 		/* fb div out of range ? */
1621*4882a593Smuzhiyun 		if (fb_div > fb_mask)
1622*4882a593Smuzhiyun 			break; /* It can oly get worse */
1623*4882a593Smuzhiyun 
1624*4882a593Smuzhiyun 		fb_div &= fb_mask;
1625*4882a593Smuzhiyun 
1626*4882a593Smuzhiyun 		/* Calc vclk divider with current vco freq */
1627*4882a593Smuzhiyun 		vclk_div = si_uvd_calc_upll_post_div(vco_freq, vclk,
1628*4882a593Smuzhiyun 						     pd_min, pd_even);
1629*4882a593Smuzhiyun 		if (vclk_div > pd_max)
1630*4882a593Smuzhiyun 			break; /* vco is too big, it has to stop */
1631*4882a593Smuzhiyun 
1632*4882a593Smuzhiyun 		/* Calc dclk divider with current vco freq */
1633*4882a593Smuzhiyun 		dclk_div = si_uvd_calc_upll_post_div(vco_freq, dclk,
1634*4882a593Smuzhiyun 						     pd_min, pd_even);
1635*4882a593Smuzhiyun 		if (dclk_div > pd_max)
1636*4882a593Smuzhiyun 			break; /* vco is too big, it has to stop */
1637*4882a593Smuzhiyun 
1638*4882a593Smuzhiyun 		/* Calc score with current vco freq */
1639*4882a593Smuzhiyun 		score = vclk - (vco_freq / vclk_div) + dclk - (vco_freq / dclk_div);
1640*4882a593Smuzhiyun 
1641*4882a593Smuzhiyun 		/* Determine if this vco setting is better than current optimal settings */
1642*4882a593Smuzhiyun 		if (score < optimal_score) {
1643*4882a593Smuzhiyun 			*optimal_fb_div = fb_div;
1644*4882a593Smuzhiyun 			*optimal_vclk_div = vclk_div;
1645*4882a593Smuzhiyun 			*optimal_dclk_div = dclk_div;
1646*4882a593Smuzhiyun 			optimal_score = score;
1647*4882a593Smuzhiyun 			if (optimal_score == 0)
1648*4882a593Smuzhiyun 				break; /* It can't get better than this */
1649*4882a593Smuzhiyun 		}
1650*4882a593Smuzhiyun 	}
1651*4882a593Smuzhiyun 
1652*4882a593Smuzhiyun 	/* Did we found a valid setup ? */
1653*4882a593Smuzhiyun 	if (optimal_score == ~0)
1654*4882a593Smuzhiyun 		return -EINVAL;
1655*4882a593Smuzhiyun 
1656*4882a593Smuzhiyun 	return 0;
1657*4882a593Smuzhiyun }
1658*4882a593Smuzhiyun 
si_set_uvd_clocks(struct amdgpu_device * adev,u32 vclk,u32 dclk)1659*4882a593Smuzhiyun static int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1660*4882a593Smuzhiyun {
1661*4882a593Smuzhiyun 	unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
1662*4882a593Smuzhiyun 	int r;
1663*4882a593Smuzhiyun 
1664*4882a593Smuzhiyun 	/* Bypass vclk and dclk with bclk */
1665*4882a593Smuzhiyun 	WREG32_P(CG_UPLL_FUNC_CNTL_2,
1666*4882a593Smuzhiyun 		 VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
1667*4882a593Smuzhiyun 		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
1668*4882a593Smuzhiyun 
1669*4882a593Smuzhiyun 	/* Put PLL in bypass mode */
1670*4882a593Smuzhiyun 	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
1671*4882a593Smuzhiyun 
1672*4882a593Smuzhiyun 	if (!vclk || !dclk) {
1673*4882a593Smuzhiyun 		/* Keep the Bypass mode */
1674*4882a593Smuzhiyun 		return 0;
1675*4882a593Smuzhiyun 	}
1676*4882a593Smuzhiyun 
1677*4882a593Smuzhiyun 	r = si_calc_upll_dividers(adev, vclk, dclk, 125000, 250000,
1678*4882a593Smuzhiyun 				  16384, 0x03FFFFFF, 0, 128, 5,
1679*4882a593Smuzhiyun 				  &fb_div, &vclk_div, &dclk_div);
1680*4882a593Smuzhiyun 	if (r)
1681*4882a593Smuzhiyun 		return r;
1682*4882a593Smuzhiyun 
1683*4882a593Smuzhiyun 	/* Set RESET_ANTI_MUX to 0 */
1684*4882a593Smuzhiyun 	WREG32_P(CG_UPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
1685*4882a593Smuzhiyun 
1686*4882a593Smuzhiyun 	/* Set VCO_MODE to 1 */
1687*4882a593Smuzhiyun 	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK);
1688*4882a593Smuzhiyun 
1689*4882a593Smuzhiyun 	/* Disable sleep mode */
1690*4882a593Smuzhiyun 	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK);
1691*4882a593Smuzhiyun 
1692*4882a593Smuzhiyun 	/* Deassert UPLL_RESET */
1693*4882a593Smuzhiyun 	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
1694*4882a593Smuzhiyun 
1695*4882a593Smuzhiyun 	mdelay(1);
1696*4882a593Smuzhiyun 
1697*4882a593Smuzhiyun 	r = si_uvd_send_upll_ctlreq(adev, CG_UPLL_FUNC_CNTL);
1698*4882a593Smuzhiyun 	if (r)
1699*4882a593Smuzhiyun 		return r;
1700*4882a593Smuzhiyun 
1701*4882a593Smuzhiyun 	/* Assert UPLL_RESET again */
1702*4882a593Smuzhiyun 	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
1703*4882a593Smuzhiyun 
1704*4882a593Smuzhiyun 	/* Disable spread spectrum. */
1705*4882a593Smuzhiyun 	WREG32_P(CG_UPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
1706*4882a593Smuzhiyun 
1707*4882a593Smuzhiyun 	/* Set feedback divider */
1708*4882a593Smuzhiyun 	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div), ~UPLL_FB_DIV_MASK);
1709*4882a593Smuzhiyun 
1710*4882a593Smuzhiyun 	/* Set ref divider to 0 */
1711*4882a593Smuzhiyun 	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_REF_DIV_MASK);
1712*4882a593Smuzhiyun 
1713*4882a593Smuzhiyun 	if (fb_div < 307200)
1714*4882a593Smuzhiyun 		WREG32_P(CG_UPLL_FUNC_CNTL_4, 0, ~UPLL_SPARE_ISPARE9);
1715*4882a593Smuzhiyun 	else
1716*4882a593Smuzhiyun 		WREG32_P(CG_UPLL_FUNC_CNTL_4,
1717*4882a593Smuzhiyun 			 UPLL_SPARE_ISPARE9,
1718*4882a593Smuzhiyun 			 ~UPLL_SPARE_ISPARE9);
1719*4882a593Smuzhiyun 
1720*4882a593Smuzhiyun 	/* Set PDIV_A and PDIV_B */
1721*4882a593Smuzhiyun 	WREG32_P(CG_UPLL_FUNC_CNTL_2,
1722*4882a593Smuzhiyun 		 UPLL_PDIV_A(vclk_div) | UPLL_PDIV_B(dclk_div),
1723*4882a593Smuzhiyun 		 ~(UPLL_PDIV_A_MASK | UPLL_PDIV_B_MASK));
1724*4882a593Smuzhiyun 
1725*4882a593Smuzhiyun 	/* Give the PLL some time to settle */
1726*4882a593Smuzhiyun 	mdelay(15);
1727*4882a593Smuzhiyun 
1728*4882a593Smuzhiyun 	/* Deassert PLL_RESET */
1729*4882a593Smuzhiyun 	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
1730*4882a593Smuzhiyun 
1731*4882a593Smuzhiyun 	mdelay(15);
1732*4882a593Smuzhiyun 
1733*4882a593Smuzhiyun 	/* Switch from bypass mode to normal mode */
1734*4882a593Smuzhiyun 	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
1735*4882a593Smuzhiyun 
1736*4882a593Smuzhiyun 	r = si_uvd_send_upll_ctlreq(adev, CG_UPLL_FUNC_CNTL);
1737*4882a593Smuzhiyun 	if (r)
1738*4882a593Smuzhiyun 		return r;
1739*4882a593Smuzhiyun 
1740*4882a593Smuzhiyun 	/* Switch VCLK and DCLK selection */
1741*4882a593Smuzhiyun 	WREG32_P(CG_UPLL_FUNC_CNTL_2,
1742*4882a593Smuzhiyun 		 VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
1743*4882a593Smuzhiyun 		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
1744*4882a593Smuzhiyun 
1745*4882a593Smuzhiyun 	mdelay(100);
1746*4882a593Smuzhiyun 
1747*4882a593Smuzhiyun 	return 0;
1748*4882a593Smuzhiyun }
1749*4882a593Smuzhiyun 
si_vce_send_vcepll_ctlreq(struct amdgpu_device * adev)1750*4882a593Smuzhiyun static int si_vce_send_vcepll_ctlreq(struct amdgpu_device *adev)
1751*4882a593Smuzhiyun {
1752*4882a593Smuzhiyun 	unsigned i;
1753*4882a593Smuzhiyun 
1754*4882a593Smuzhiyun 	/* Make sure VCEPLL_CTLREQ is deasserted */
1755*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK);
1756*4882a593Smuzhiyun 
1757*4882a593Smuzhiyun 	mdelay(10);
1758*4882a593Smuzhiyun 
1759*4882a593Smuzhiyun 	/* Assert UPLL_CTLREQ */
1760*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, UPLL_CTLREQ_MASK, ~UPLL_CTLREQ_MASK);
1761*4882a593Smuzhiyun 
1762*4882a593Smuzhiyun 	/* Wait for CTLACK and CTLACK2 to get asserted */
1763*4882a593Smuzhiyun 	for (i = 0; i < SI_MAX_CTLACKS_ASSERTION_WAIT; ++i) {
1764*4882a593Smuzhiyun 		uint32_t mask = UPLL_CTLACK_MASK | UPLL_CTLACK2_MASK;
1765*4882a593Smuzhiyun 
1766*4882a593Smuzhiyun 		if ((RREG32_SMC(CG_VCEPLL_FUNC_CNTL) & mask) == mask)
1767*4882a593Smuzhiyun 			break;
1768*4882a593Smuzhiyun 		mdelay(10);
1769*4882a593Smuzhiyun 	}
1770*4882a593Smuzhiyun 
1771*4882a593Smuzhiyun 	/* Deassert UPLL_CTLREQ */
1772*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK);
1773*4882a593Smuzhiyun 
1774*4882a593Smuzhiyun 	if (i == SI_MAX_CTLACKS_ASSERTION_WAIT) {
1775*4882a593Smuzhiyun 		DRM_ERROR("Timeout setting UVD clocks!\n");
1776*4882a593Smuzhiyun 		return -ETIMEDOUT;
1777*4882a593Smuzhiyun 	}
1778*4882a593Smuzhiyun 
1779*4882a593Smuzhiyun 	return 0;
1780*4882a593Smuzhiyun }
1781*4882a593Smuzhiyun 
si_set_vce_clocks(struct amdgpu_device * adev,u32 evclk,u32 ecclk)1782*4882a593Smuzhiyun static int si_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
1783*4882a593Smuzhiyun {
1784*4882a593Smuzhiyun 	unsigned fb_div = 0, evclk_div = 0, ecclk_div = 0;
1785*4882a593Smuzhiyun 	int r;
1786*4882a593Smuzhiyun 
1787*4882a593Smuzhiyun 	/* Bypass evclk and ecclk with bclk */
1788*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
1789*4882a593Smuzhiyun 		     EVCLK_SRC_SEL(1) | ECCLK_SRC_SEL(1),
1790*4882a593Smuzhiyun 		     ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK));
1791*4882a593Smuzhiyun 
1792*4882a593Smuzhiyun 	/* Put PLL in bypass mode */
1793*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_BYPASS_EN_MASK,
1794*4882a593Smuzhiyun 		     ~VCEPLL_BYPASS_EN_MASK);
1795*4882a593Smuzhiyun 
1796*4882a593Smuzhiyun 	if (!evclk || !ecclk) {
1797*4882a593Smuzhiyun 		/* Keep the Bypass mode, put PLL to sleep */
1798*4882a593Smuzhiyun 		WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK,
1799*4882a593Smuzhiyun 			     ~VCEPLL_SLEEP_MASK);
1800*4882a593Smuzhiyun 		return 0;
1801*4882a593Smuzhiyun 	}
1802*4882a593Smuzhiyun 
1803*4882a593Smuzhiyun 	r = si_calc_upll_dividers(adev, evclk, ecclk, 125000, 250000,
1804*4882a593Smuzhiyun 				  16384, 0x03FFFFFF, 0, 128, 5,
1805*4882a593Smuzhiyun 				  &fb_div, &evclk_div, &ecclk_div);
1806*4882a593Smuzhiyun 	if (r)
1807*4882a593Smuzhiyun 		return r;
1808*4882a593Smuzhiyun 
1809*4882a593Smuzhiyun 	/* Set RESET_ANTI_MUX to 0 */
1810*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
1811*4882a593Smuzhiyun 
1812*4882a593Smuzhiyun 	/* Set VCO_MODE to 1 */
1813*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_VCO_MODE_MASK,
1814*4882a593Smuzhiyun 		     ~VCEPLL_VCO_MODE_MASK);
1815*4882a593Smuzhiyun 
1816*4882a593Smuzhiyun 	/* Toggle VCEPLL_SLEEP to 1 then back to 0 */
1817*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK,
1818*4882a593Smuzhiyun 		     ~VCEPLL_SLEEP_MASK);
1819*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_SLEEP_MASK);
1820*4882a593Smuzhiyun 
1821*4882a593Smuzhiyun 	/* Deassert VCEPLL_RESET */
1822*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK);
1823*4882a593Smuzhiyun 
1824*4882a593Smuzhiyun 	mdelay(1);
1825*4882a593Smuzhiyun 
1826*4882a593Smuzhiyun 	r = si_vce_send_vcepll_ctlreq(adev);
1827*4882a593Smuzhiyun 	if (r)
1828*4882a593Smuzhiyun 		return r;
1829*4882a593Smuzhiyun 
1830*4882a593Smuzhiyun 	/* Assert VCEPLL_RESET again */
1831*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_RESET_MASK, ~VCEPLL_RESET_MASK);
1832*4882a593Smuzhiyun 
1833*4882a593Smuzhiyun 	/* Disable spread spectrum. */
1834*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
1835*4882a593Smuzhiyun 
1836*4882a593Smuzhiyun 	/* Set feedback divider */
1837*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_3,
1838*4882a593Smuzhiyun 		     VCEPLL_FB_DIV(fb_div),
1839*4882a593Smuzhiyun 		     ~VCEPLL_FB_DIV_MASK);
1840*4882a593Smuzhiyun 
1841*4882a593Smuzhiyun 	/* Set ref divider to 0 */
1842*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_REF_DIV_MASK);
1843*4882a593Smuzhiyun 
1844*4882a593Smuzhiyun 	/* Set PDIV_A and PDIV_B */
1845*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
1846*4882a593Smuzhiyun 		     VCEPLL_PDIV_A(evclk_div) | VCEPLL_PDIV_B(ecclk_div),
1847*4882a593Smuzhiyun 		     ~(VCEPLL_PDIV_A_MASK | VCEPLL_PDIV_B_MASK));
1848*4882a593Smuzhiyun 
1849*4882a593Smuzhiyun 	/* Give the PLL some time to settle */
1850*4882a593Smuzhiyun 	mdelay(15);
1851*4882a593Smuzhiyun 
1852*4882a593Smuzhiyun 	/* Deassert PLL_RESET */
1853*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK);
1854*4882a593Smuzhiyun 
1855*4882a593Smuzhiyun 	mdelay(15);
1856*4882a593Smuzhiyun 
1857*4882a593Smuzhiyun 	/* Switch from bypass mode to normal mode */
1858*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_BYPASS_EN_MASK);
1859*4882a593Smuzhiyun 
1860*4882a593Smuzhiyun 	r = si_vce_send_vcepll_ctlreq(adev);
1861*4882a593Smuzhiyun 	if (r)
1862*4882a593Smuzhiyun 		return r;
1863*4882a593Smuzhiyun 
1864*4882a593Smuzhiyun 	/* Switch VCLK and DCLK selection */
1865*4882a593Smuzhiyun 	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
1866*4882a593Smuzhiyun 		     EVCLK_SRC_SEL(16) | ECCLK_SRC_SEL(16),
1867*4882a593Smuzhiyun 		     ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK));
1868*4882a593Smuzhiyun 
1869*4882a593Smuzhiyun 	mdelay(100);
1870*4882a593Smuzhiyun 
1871*4882a593Smuzhiyun 	return 0;
1872*4882a593Smuzhiyun }
1873*4882a593Smuzhiyun 
si_pre_asic_init(struct amdgpu_device * adev)1874*4882a593Smuzhiyun static void si_pre_asic_init(struct amdgpu_device *adev)
1875*4882a593Smuzhiyun {
1876*4882a593Smuzhiyun }
1877*4882a593Smuzhiyun 
1878*4882a593Smuzhiyun static const struct amdgpu_asic_funcs si_asic_funcs =
1879*4882a593Smuzhiyun {
1880*4882a593Smuzhiyun 	.read_disabled_bios = &si_read_disabled_bios,
1881*4882a593Smuzhiyun 	.read_bios_from_rom = &si_read_bios_from_rom,
1882*4882a593Smuzhiyun 	.read_register = &si_read_register,
1883*4882a593Smuzhiyun 	.reset = &si_asic_reset,
1884*4882a593Smuzhiyun 	.reset_method = &si_asic_reset_method,
1885*4882a593Smuzhiyun 	.set_vga_state = &si_vga_set_state,
1886*4882a593Smuzhiyun 	.get_xclk = &si_get_xclk,
1887*4882a593Smuzhiyun 	.set_uvd_clocks = &si_set_uvd_clocks,
1888*4882a593Smuzhiyun 	.set_vce_clocks = &si_set_vce_clocks,
1889*4882a593Smuzhiyun 	.get_pcie_lanes = &si_get_pcie_lanes,
1890*4882a593Smuzhiyun 	.set_pcie_lanes = &si_set_pcie_lanes,
1891*4882a593Smuzhiyun 	.get_config_memsize = &si_get_config_memsize,
1892*4882a593Smuzhiyun 	.flush_hdp = &si_flush_hdp,
1893*4882a593Smuzhiyun 	.invalidate_hdp = &si_invalidate_hdp,
1894*4882a593Smuzhiyun 	.need_full_reset = &si_need_full_reset,
1895*4882a593Smuzhiyun 	.get_pcie_usage = &si_get_pcie_usage,
1896*4882a593Smuzhiyun 	.need_reset_on_init = &si_need_reset_on_init,
1897*4882a593Smuzhiyun 	.get_pcie_replay_count = &si_get_pcie_replay_count,
1898*4882a593Smuzhiyun 	.supports_baco = &si_asic_supports_baco,
1899*4882a593Smuzhiyun 	.pre_asic_init = &si_pre_asic_init,
1900*4882a593Smuzhiyun };
1901*4882a593Smuzhiyun 
si_get_rev_id(struct amdgpu_device * adev)1902*4882a593Smuzhiyun static uint32_t si_get_rev_id(struct amdgpu_device *adev)
1903*4882a593Smuzhiyun {
1904*4882a593Smuzhiyun 	return (RREG32(CC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1905*4882a593Smuzhiyun 		>> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1906*4882a593Smuzhiyun }
1907*4882a593Smuzhiyun 
si_common_early_init(void * handle)1908*4882a593Smuzhiyun static int si_common_early_init(void *handle)
1909*4882a593Smuzhiyun {
1910*4882a593Smuzhiyun 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1911*4882a593Smuzhiyun 
1912*4882a593Smuzhiyun 	adev->smc_rreg = &si_smc_rreg;
1913*4882a593Smuzhiyun 	adev->smc_wreg = &si_smc_wreg;
1914*4882a593Smuzhiyun 	adev->pcie_rreg = &si_pcie_rreg;
1915*4882a593Smuzhiyun 	adev->pcie_wreg = &si_pcie_wreg;
1916*4882a593Smuzhiyun 	adev->pciep_rreg = &si_pciep_rreg;
1917*4882a593Smuzhiyun 	adev->pciep_wreg = &si_pciep_wreg;
1918*4882a593Smuzhiyun 	adev->uvd_ctx_rreg = si_uvd_ctx_rreg;
1919*4882a593Smuzhiyun 	adev->uvd_ctx_wreg = si_uvd_ctx_wreg;
1920*4882a593Smuzhiyun 	adev->didt_rreg = NULL;
1921*4882a593Smuzhiyun 	adev->didt_wreg = NULL;
1922*4882a593Smuzhiyun 
1923*4882a593Smuzhiyun 	adev->asic_funcs = &si_asic_funcs;
1924*4882a593Smuzhiyun 
1925*4882a593Smuzhiyun 	adev->rev_id = si_get_rev_id(adev);
1926*4882a593Smuzhiyun 	adev->external_rev_id = 0xFF;
1927*4882a593Smuzhiyun 	switch (adev->asic_type) {
1928*4882a593Smuzhiyun 	case CHIP_TAHITI:
1929*4882a593Smuzhiyun 		adev->cg_flags =
1930*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_MGCG |
1931*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_MGLS |
1932*4882a593Smuzhiyun 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
1933*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CGLS |
1934*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CGTS |
1935*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CP_LS |
1936*4882a593Smuzhiyun 			AMD_CG_SUPPORT_MC_MGCG |
1937*4882a593Smuzhiyun 			AMD_CG_SUPPORT_SDMA_MGCG |
1938*4882a593Smuzhiyun 			AMD_CG_SUPPORT_BIF_LS |
1939*4882a593Smuzhiyun 			AMD_CG_SUPPORT_VCE_MGCG |
1940*4882a593Smuzhiyun 			AMD_CG_SUPPORT_UVD_MGCG |
1941*4882a593Smuzhiyun 			AMD_CG_SUPPORT_HDP_LS |
1942*4882a593Smuzhiyun 			AMD_CG_SUPPORT_HDP_MGCG;
1943*4882a593Smuzhiyun 		adev->pg_flags = 0;
1944*4882a593Smuzhiyun 		adev->external_rev_id = (adev->rev_id == 0) ? 1 :
1945*4882a593Smuzhiyun 					(adev->rev_id == 1) ? 5 : 6;
1946*4882a593Smuzhiyun 		break;
1947*4882a593Smuzhiyun 	case CHIP_PITCAIRN:
1948*4882a593Smuzhiyun 		adev->cg_flags =
1949*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_MGCG |
1950*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_MGLS |
1951*4882a593Smuzhiyun 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
1952*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CGLS |
1953*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CGTS |
1954*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CP_LS |
1955*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_RLC_LS |
1956*4882a593Smuzhiyun 			AMD_CG_SUPPORT_MC_LS |
1957*4882a593Smuzhiyun 			AMD_CG_SUPPORT_MC_MGCG |
1958*4882a593Smuzhiyun 			AMD_CG_SUPPORT_SDMA_MGCG |
1959*4882a593Smuzhiyun 			AMD_CG_SUPPORT_BIF_LS |
1960*4882a593Smuzhiyun 			AMD_CG_SUPPORT_VCE_MGCG |
1961*4882a593Smuzhiyun 			AMD_CG_SUPPORT_UVD_MGCG |
1962*4882a593Smuzhiyun 			AMD_CG_SUPPORT_HDP_LS |
1963*4882a593Smuzhiyun 			AMD_CG_SUPPORT_HDP_MGCG;
1964*4882a593Smuzhiyun 		adev->pg_flags = 0;
1965*4882a593Smuzhiyun 		adev->external_rev_id = adev->rev_id + 20;
1966*4882a593Smuzhiyun 		break;
1967*4882a593Smuzhiyun 
1968*4882a593Smuzhiyun 	case CHIP_VERDE:
1969*4882a593Smuzhiyun 		adev->cg_flags =
1970*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_MGCG |
1971*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_MGLS |
1972*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CGLS |
1973*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CGTS |
1974*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CGTS_LS |
1975*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CP_LS |
1976*4882a593Smuzhiyun 			AMD_CG_SUPPORT_MC_LS |
1977*4882a593Smuzhiyun 			AMD_CG_SUPPORT_MC_MGCG |
1978*4882a593Smuzhiyun 			AMD_CG_SUPPORT_SDMA_MGCG |
1979*4882a593Smuzhiyun 			AMD_CG_SUPPORT_SDMA_LS |
1980*4882a593Smuzhiyun 			AMD_CG_SUPPORT_BIF_LS |
1981*4882a593Smuzhiyun 			AMD_CG_SUPPORT_VCE_MGCG |
1982*4882a593Smuzhiyun 			AMD_CG_SUPPORT_UVD_MGCG |
1983*4882a593Smuzhiyun 			AMD_CG_SUPPORT_HDP_LS |
1984*4882a593Smuzhiyun 			AMD_CG_SUPPORT_HDP_MGCG;
1985*4882a593Smuzhiyun 		adev->pg_flags = 0;
1986*4882a593Smuzhiyun 		//???
1987*4882a593Smuzhiyun 		adev->external_rev_id = adev->rev_id + 40;
1988*4882a593Smuzhiyun 		break;
1989*4882a593Smuzhiyun 	case CHIP_OLAND:
1990*4882a593Smuzhiyun 		adev->cg_flags =
1991*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_MGCG |
1992*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_MGLS |
1993*4882a593Smuzhiyun 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
1994*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CGLS |
1995*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CGTS |
1996*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CP_LS |
1997*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_RLC_LS |
1998*4882a593Smuzhiyun 			AMD_CG_SUPPORT_MC_LS |
1999*4882a593Smuzhiyun 			AMD_CG_SUPPORT_MC_MGCG |
2000*4882a593Smuzhiyun 			AMD_CG_SUPPORT_SDMA_MGCG |
2001*4882a593Smuzhiyun 			AMD_CG_SUPPORT_BIF_LS |
2002*4882a593Smuzhiyun 			AMD_CG_SUPPORT_UVD_MGCG |
2003*4882a593Smuzhiyun 			AMD_CG_SUPPORT_HDP_LS |
2004*4882a593Smuzhiyun 			AMD_CG_SUPPORT_HDP_MGCG;
2005*4882a593Smuzhiyun 		adev->pg_flags = 0;
2006*4882a593Smuzhiyun 		adev->external_rev_id = 60;
2007*4882a593Smuzhiyun 		break;
2008*4882a593Smuzhiyun 	case CHIP_HAINAN:
2009*4882a593Smuzhiyun 		adev->cg_flags =
2010*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_MGCG |
2011*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_MGLS |
2012*4882a593Smuzhiyun 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
2013*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CGLS |
2014*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CGTS |
2015*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_CP_LS |
2016*4882a593Smuzhiyun 			AMD_CG_SUPPORT_GFX_RLC_LS |
2017*4882a593Smuzhiyun 			AMD_CG_SUPPORT_MC_LS |
2018*4882a593Smuzhiyun 			AMD_CG_SUPPORT_MC_MGCG |
2019*4882a593Smuzhiyun 			AMD_CG_SUPPORT_SDMA_MGCG |
2020*4882a593Smuzhiyun 			AMD_CG_SUPPORT_BIF_LS |
2021*4882a593Smuzhiyun 			AMD_CG_SUPPORT_HDP_LS |
2022*4882a593Smuzhiyun 			AMD_CG_SUPPORT_HDP_MGCG;
2023*4882a593Smuzhiyun 		adev->pg_flags = 0;
2024*4882a593Smuzhiyun 		adev->external_rev_id = 70;
2025*4882a593Smuzhiyun 		break;
2026*4882a593Smuzhiyun 
2027*4882a593Smuzhiyun 	default:
2028*4882a593Smuzhiyun 		return -EINVAL;
2029*4882a593Smuzhiyun 	}
2030*4882a593Smuzhiyun 
2031*4882a593Smuzhiyun 	return 0;
2032*4882a593Smuzhiyun }
2033*4882a593Smuzhiyun 
si_common_sw_init(void * handle)2034*4882a593Smuzhiyun static int si_common_sw_init(void *handle)
2035*4882a593Smuzhiyun {
2036*4882a593Smuzhiyun 	return 0;
2037*4882a593Smuzhiyun }
2038*4882a593Smuzhiyun 
si_common_sw_fini(void * handle)2039*4882a593Smuzhiyun static int si_common_sw_fini(void *handle)
2040*4882a593Smuzhiyun {
2041*4882a593Smuzhiyun 	return 0;
2042*4882a593Smuzhiyun }
2043*4882a593Smuzhiyun 
2044*4882a593Smuzhiyun 
si_init_golden_registers(struct amdgpu_device * adev)2045*4882a593Smuzhiyun static void si_init_golden_registers(struct amdgpu_device *adev)
2046*4882a593Smuzhiyun {
2047*4882a593Smuzhiyun 	switch (adev->asic_type) {
2048*4882a593Smuzhiyun 	case CHIP_TAHITI:
2049*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2050*4882a593Smuzhiyun 							tahiti_golden_registers,
2051*4882a593Smuzhiyun 							ARRAY_SIZE(tahiti_golden_registers));
2052*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2053*4882a593Smuzhiyun 							tahiti_golden_rlc_registers,
2054*4882a593Smuzhiyun 							ARRAY_SIZE(tahiti_golden_rlc_registers));
2055*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2056*4882a593Smuzhiyun 							tahiti_mgcg_cgcg_init,
2057*4882a593Smuzhiyun 							ARRAY_SIZE(tahiti_mgcg_cgcg_init));
2058*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2059*4882a593Smuzhiyun 							tahiti_golden_registers2,
2060*4882a593Smuzhiyun 							ARRAY_SIZE(tahiti_golden_registers2));
2061*4882a593Smuzhiyun 		break;
2062*4882a593Smuzhiyun 	case CHIP_PITCAIRN:
2063*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2064*4882a593Smuzhiyun 							pitcairn_golden_registers,
2065*4882a593Smuzhiyun 							ARRAY_SIZE(pitcairn_golden_registers));
2066*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2067*4882a593Smuzhiyun 							pitcairn_golden_rlc_registers,
2068*4882a593Smuzhiyun 							ARRAY_SIZE(pitcairn_golden_rlc_registers));
2069*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2070*4882a593Smuzhiyun 							pitcairn_mgcg_cgcg_init,
2071*4882a593Smuzhiyun 							ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
2072*4882a593Smuzhiyun 		break;
2073*4882a593Smuzhiyun 	case CHIP_VERDE:
2074*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2075*4882a593Smuzhiyun 							verde_golden_registers,
2076*4882a593Smuzhiyun 							ARRAY_SIZE(verde_golden_registers));
2077*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2078*4882a593Smuzhiyun 							verde_golden_rlc_registers,
2079*4882a593Smuzhiyun 							ARRAY_SIZE(verde_golden_rlc_registers));
2080*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2081*4882a593Smuzhiyun 							verde_mgcg_cgcg_init,
2082*4882a593Smuzhiyun 							ARRAY_SIZE(verde_mgcg_cgcg_init));
2083*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2084*4882a593Smuzhiyun 							verde_pg_init,
2085*4882a593Smuzhiyun 							ARRAY_SIZE(verde_pg_init));
2086*4882a593Smuzhiyun 		break;
2087*4882a593Smuzhiyun 	case CHIP_OLAND:
2088*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2089*4882a593Smuzhiyun 							oland_golden_registers,
2090*4882a593Smuzhiyun 							ARRAY_SIZE(oland_golden_registers));
2091*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2092*4882a593Smuzhiyun 							oland_golden_rlc_registers,
2093*4882a593Smuzhiyun 							ARRAY_SIZE(oland_golden_rlc_registers));
2094*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2095*4882a593Smuzhiyun 							oland_mgcg_cgcg_init,
2096*4882a593Smuzhiyun 							ARRAY_SIZE(oland_mgcg_cgcg_init));
2097*4882a593Smuzhiyun 		break;
2098*4882a593Smuzhiyun 	case CHIP_HAINAN:
2099*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2100*4882a593Smuzhiyun 							hainan_golden_registers,
2101*4882a593Smuzhiyun 							ARRAY_SIZE(hainan_golden_registers));
2102*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2103*4882a593Smuzhiyun 							hainan_golden_registers2,
2104*4882a593Smuzhiyun 							ARRAY_SIZE(hainan_golden_registers2));
2105*4882a593Smuzhiyun 		amdgpu_device_program_register_sequence(adev,
2106*4882a593Smuzhiyun 							hainan_mgcg_cgcg_init,
2107*4882a593Smuzhiyun 							ARRAY_SIZE(hainan_mgcg_cgcg_init));
2108*4882a593Smuzhiyun 		break;
2109*4882a593Smuzhiyun 
2110*4882a593Smuzhiyun 
2111*4882a593Smuzhiyun 	default:
2112*4882a593Smuzhiyun 		BUG();
2113*4882a593Smuzhiyun 	}
2114*4882a593Smuzhiyun }
2115*4882a593Smuzhiyun 
si_pcie_gen3_enable(struct amdgpu_device * adev)2116*4882a593Smuzhiyun static void si_pcie_gen3_enable(struct amdgpu_device *adev)
2117*4882a593Smuzhiyun {
2118*4882a593Smuzhiyun 	struct pci_dev *root = adev->pdev->bus->self;
2119*4882a593Smuzhiyun 	u32 speed_cntl, current_data_rate;
2120*4882a593Smuzhiyun 	int i;
2121*4882a593Smuzhiyun 	u16 tmp16;
2122*4882a593Smuzhiyun 
2123*4882a593Smuzhiyun 	if (pci_is_root_bus(adev->pdev->bus))
2124*4882a593Smuzhiyun 		return;
2125*4882a593Smuzhiyun 
2126*4882a593Smuzhiyun 	if (amdgpu_pcie_gen2 == 0)
2127*4882a593Smuzhiyun 		return;
2128*4882a593Smuzhiyun 
2129*4882a593Smuzhiyun 	if (adev->flags & AMD_IS_APU)
2130*4882a593Smuzhiyun 		return;
2131*4882a593Smuzhiyun 
2132*4882a593Smuzhiyun 	if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
2133*4882a593Smuzhiyun 					CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
2134*4882a593Smuzhiyun 		return;
2135*4882a593Smuzhiyun 
2136*4882a593Smuzhiyun 	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2137*4882a593Smuzhiyun 	current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
2138*4882a593Smuzhiyun 		LC_CURRENT_DATA_RATE_SHIFT;
2139*4882a593Smuzhiyun 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
2140*4882a593Smuzhiyun 		if (current_data_rate == 2) {
2141*4882a593Smuzhiyun 			DRM_INFO("PCIE gen 3 link speeds already enabled\n");
2142*4882a593Smuzhiyun 			return;
2143*4882a593Smuzhiyun 		}
2144*4882a593Smuzhiyun 		DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
2145*4882a593Smuzhiyun 	} else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
2146*4882a593Smuzhiyun 		if (current_data_rate == 1) {
2147*4882a593Smuzhiyun 			DRM_INFO("PCIE gen 2 link speeds already enabled\n");
2148*4882a593Smuzhiyun 			return;
2149*4882a593Smuzhiyun 		}
2150*4882a593Smuzhiyun 		DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
2151*4882a593Smuzhiyun 	}
2152*4882a593Smuzhiyun 
2153*4882a593Smuzhiyun 	if (!pci_is_pcie(root) || !pci_is_pcie(adev->pdev))
2154*4882a593Smuzhiyun 		return;
2155*4882a593Smuzhiyun 
2156*4882a593Smuzhiyun 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
2157*4882a593Smuzhiyun 		if (current_data_rate != 2) {
2158*4882a593Smuzhiyun 			u16 bridge_cfg, gpu_cfg;
2159*4882a593Smuzhiyun 			u16 bridge_cfg2, gpu_cfg2;
2160*4882a593Smuzhiyun 			u32 max_lw, current_lw, tmp;
2161*4882a593Smuzhiyun 
2162*4882a593Smuzhiyun 			pcie_capability_read_word(root, PCI_EXP_LNKCTL,
2163*4882a593Smuzhiyun 						  &bridge_cfg);
2164*4882a593Smuzhiyun 			pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL,
2165*4882a593Smuzhiyun 						  &gpu_cfg);
2166*4882a593Smuzhiyun 
2167*4882a593Smuzhiyun 			tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
2168*4882a593Smuzhiyun 			pcie_capability_write_word(root, PCI_EXP_LNKCTL, tmp16);
2169*4882a593Smuzhiyun 
2170*4882a593Smuzhiyun 			tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
2171*4882a593Smuzhiyun 			pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL,
2172*4882a593Smuzhiyun 						   tmp16);
2173*4882a593Smuzhiyun 
2174*4882a593Smuzhiyun 			tmp = RREG32_PCIE(PCIE_LC_STATUS1);
2175*4882a593Smuzhiyun 			max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
2176*4882a593Smuzhiyun 			current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
2177*4882a593Smuzhiyun 
2178*4882a593Smuzhiyun 			if (current_lw < max_lw) {
2179*4882a593Smuzhiyun 				tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2180*4882a593Smuzhiyun 				if (tmp & LC_RENEGOTIATION_SUPPORT) {
2181*4882a593Smuzhiyun 					tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
2182*4882a593Smuzhiyun 					tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
2183*4882a593Smuzhiyun 					tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
2184*4882a593Smuzhiyun 					WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
2185*4882a593Smuzhiyun 				}
2186*4882a593Smuzhiyun 			}
2187*4882a593Smuzhiyun 
2188*4882a593Smuzhiyun 			for (i = 0; i < 10; i++) {
2189*4882a593Smuzhiyun 				pcie_capability_read_word(adev->pdev,
2190*4882a593Smuzhiyun 							  PCI_EXP_DEVSTA,
2191*4882a593Smuzhiyun 							  &tmp16);
2192*4882a593Smuzhiyun 				if (tmp16 & PCI_EXP_DEVSTA_TRPND)
2193*4882a593Smuzhiyun 					break;
2194*4882a593Smuzhiyun 
2195*4882a593Smuzhiyun 				pcie_capability_read_word(root, PCI_EXP_LNKCTL,
2196*4882a593Smuzhiyun 							  &bridge_cfg);
2197*4882a593Smuzhiyun 				pcie_capability_read_word(adev->pdev,
2198*4882a593Smuzhiyun 							  PCI_EXP_LNKCTL,
2199*4882a593Smuzhiyun 							  &gpu_cfg);
2200*4882a593Smuzhiyun 
2201*4882a593Smuzhiyun 				pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
2202*4882a593Smuzhiyun 							  &bridge_cfg2);
2203*4882a593Smuzhiyun 				pcie_capability_read_word(adev->pdev,
2204*4882a593Smuzhiyun 							  PCI_EXP_LNKCTL2,
2205*4882a593Smuzhiyun 							  &gpu_cfg2);
2206*4882a593Smuzhiyun 
2207*4882a593Smuzhiyun 				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
2208*4882a593Smuzhiyun 				tmp |= LC_SET_QUIESCE;
2209*4882a593Smuzhiyun 				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
2210*4882a593Smuzhiyun 
2211*4882a593Smuzhiyun 				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
2212*4882a593Smuzhiyun 				tmp |= LC_REDO_EQ;
2213*4882a593Smuzhiyun 				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
2214*4882a593Smuzhiyun 
2215*4882a593Smuzhiyun 				mdelay(100);
2216*4882a593Smuzhiyun 
2217*4882a593Smuzhiyun 				pcie_capability_read_word(root, PCI_EXP_LNKCTL,
2218*4882a593Smuzhiyun 							  &tmp16);
2219*4882a593Smuzhiyun 				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
2220*4882a593Smuzhiyun 				tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
2221*4882a593Smuzhiyun 				pcie_capability_write_word(root, PCI_EXP_LNKCTL,
2222*4882a593Smuzhiyun 							   tmp16);
2223*4882a593Smuzhiyun 
2224*4882a593Smuzhiyun 				pcie_capability_read_word(adev->pdev,
2225*4882a593Smuzhiyun 							  PCI_EXP_LNKCTL,
2226*4882a593Smuzhiyun 							  &tmp16);
2227*4882a593Smuzhiyun 				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
2228*4882a593Smuzhiyun 				tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
2229*4882a593Smuzhiyun 				pcie_capability_write_word(adev->pdev,
2230*4882a593Smuzhiyun 							   PCI_EXP_LNKCTL,
2231*4882a593Smuzhiyun 							   tmp16);
2232*4882a593Smuzhiyun 
2233*4882a593Smuzhiyun 				pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
2234*4882a593Smuzhiyun 							  &tmp16);
2235*4882a593Smuzhiyun 				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
2236*4882a593Smuzhiyun 					   PCI_EXP_LNKCTL2_TX_MARGIN);
2237*4882a593Smuzhiyun 				tmp16 |= (bridge_cfg2 &
2238*4882a593Smuzhiyun 					  (PCI_EXP_LNKCTL2_ENTER_COMP |
2239*4882a593Smuzhiyun 					   PCI_EXP_LNKCTL2_TX_MARGIN));
2240*4882a593Smuzhiyun 				pcie_capability_write_word(root,
2241*4882a593Smuzhiyun 							   PCI_EXP_LNKCTL2,
2242*4882a593Smuzhiyun 							   tmp16);
2243*4882a593Smuzhiyun 
2244*4882a593Smuzhiyun 				pcie_capability_read_word(adev->pdev,
2245*4882a593Smuzhiyun 							  PCI_EXP_LNKCTL2,
2246*4882a593Smuzhiyun 							  &tmp16);
2247*4882a593Smuzhiyun 				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
2248*4882a593Smuzhiyun 					   PCI_EXP_LNKCTL2_TX_MARGIN);
2249*4882a593Smuzhiyun 				tmp16 |= (gpu_cfg2 &
2250*4882a593Smuzhiyun 					  (PCI_EXP_LNKCTL2_ENTER_COMP |
2251*4882a593Smuzhiyun 					   PCI_EXP_LNKCTL2_TX_MARGIN));
2252*4882a593Smuzhiyun 				pcie_capability_write_word(adev->pdev,
2253*4882a593Smuzhiyun 							   PCI_EXP_LNKCTL2,
2254*4882a593Smuzhiyun 							   tmp16);
2255*4882a593Smuzhiyun 
2256*4882a593Smuzhiyun 				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
2257*4882a593Smuzhiyun 				tmp &= ~LC_SET_QUIESCE;
2258*4882a593Smuzhiyun 				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
2259*4882a593Smuzhiyun 			}
2260*4882a593Smuzhiyun 		}
2261*4882a593Smuzhiyun 	}
2262*4882a593Smuzhiyun 
2263*4882a593Smuzhiyun 	speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
2264*4882a593Smuzhiyun 	speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
2265*4882a593Smuzhiyun 	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2266*4882a593Smuzhiyun 
2267*4882a593Smuzhiyun 	pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL2, &tmp16);
2268*4882a593Smuzhiyun 	tmp16 &= ~PCI_EXP_LNKCTL2_TLS;
2269*4882a593Smuzhiyun 
2270*4882a593Smuzhiyun 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
2271*4882a593Smuzhiyun 		tmp16 |= PCI_EXP_LNKCTL2_TLS_8_0GT; /* gen3 */
2272*4882a593Smuzhiyun 	else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
2273*4882a593Smuzhiyun 		tmp16 |= PCI_EXP_LNKCTL2_TLS_5_0GT; /* gen2 */
2274*4882a593Smuzhiyun 	else
2275*4882a593Smuzhiyun 		tmp16 |= PCI_EXP_LNKCTL2_TLS_2_5GT; /* gen1 */
2276*4882a593Smuzhiyun 	pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL2, tmp16);
2277*4882a593Smuzhiyun 
2278*4882a593Smuzhiyun 	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2279*4882a593Smuzhiyun 	speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
2280*4882a593Smuzhiyun 	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2281*4882a593Smuzhiyun 
2282*4882a593Smuzhiyun 	for (i = 0; i < adev->usec_timeout; i++) {
2283*4882a593Smuzhiyun 		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2284*4882a593Smuzhiyun 		if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
2285*4882a593Smuzhiyun 			break;
2286*4882a593Smuzhiyun 		udelay(1);
2287*4882a593Smuzhiyun 	}
2288*4882a593Smuzhiyun }
2289*4882a593Smuzhiyun 
si_pif_phy0_rreg(struct amdgpu_device * adev,u32 reg)2290*4882a593Smuzhiyun static inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg)
2291*4882a593Smuzhiyun {
2292*4882a593Smuzhiyun 	unsigned long flags;
2293*4882a593Smuzhiyun 	u32 r;
2294*4882a593Smuzhiyun 
2295*4882a593Smuzhiyun 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2296*4882a593Smuzhiyun 	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
2297*4882a593Smuzhiyun 	r = RREG32(EVERGREEN_PIF_PHY0_DATA);
2298*4882a593Smuzhiyun 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2299*4882a593Smuzhiyun 	return r;
2300*4882a593Smuzhiyun }
2301*4882a593Smuzhiyun 
si_pif_phy0_wreg(struct amdgpu_device * adev,u32 reg,u32 v)2302*4882a593Smuzhiyun static inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
2303*4882a593Smuzhiyun {
2304*4882a593Smuzhiyun 	unsigned long flags;
2305*4882a593Smuzhiyun 
2306*4882a593Smuzhiyun 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2307*4882a593Smuzhiyun 	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
2308*4882a593Smuzhiyun 	WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
2309*4882a593Smuzhiyun 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2310*4882a593Smuzhiyun }
2311*4882a593Smuzhiyun 
si_pif_phy1_rreg(struct amdgpu_device * adev,u32 reg)2312*4882a593Smuzhiyun static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
2313*4882a593Smuzhiyun {
2314*4882a593Smuzhiyun 	unsigned long flags;
2315*4882a593Smuzhiyun 	u32 r;
2316*4882a593Smuzhiyun 
2317*4882a593Smuzhiyun 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2318*4882a593Smuzhiyun 	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
2319*4882a593Smuzhiyun 	r = RREG32(EVERGREEN_PIF_PHY1_DATA);
2320*4882a593Smuzhiyun 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2321*4882a593Smuzhiyun 	return r;
2322*4882a593Smuzhiyun }
2323*4882a593Smuzhiyun 
si_pif_phy1_wreg(struct amdgpu_device * adev,u32 reg,u32 v)2324*4882a593Smuzhiyun static inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
2325*4882a593Smuzhiyun {
2326*4882a593Smuzhiyun 	unsigned long flags;
2327*4882a593Smuzhiyun 
2328*4882a593Smuzhiyun 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2329*4882a593Smuzhiyun 	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
2330*4882a593Smuzhiyun 	WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
2331*4882a593Smuzhiyun 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2332*4882a593Smuzhiyun }
si_program_aspm(struct amdgpu_device * adev)2333*4882a593Smuzhiyun static void si_program_aspm(struct amdgpu_device *adev)
2334*4882a593Smuzhiyun {
2335*4882a593Smuzhiyun 	u32 data, orig;
2336*4882a593Smuzhiyun 	bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
2337*4882a593Smuzhiyun 	bool disable_clkreq = false;
2338*4882a593Smuzhiyun 
2339*4882a593Smuzhiyun 	if (amdgpu_aspm == 0)
2340*4882a593Smuzhiyun 		return;
2341*4882a593Smuzhiyun 
2342*4882a593Smuzhiyun 	if (adev->flags & AMD_IS_APU)
2343*4882a593Smuzhiyun 		return;
2344*4882a593Smuzhiyun 	orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
2345*4882a593Smuzhiyun 	data &= ~LC_XMIT_N_FTS_MASK;
2346*4882a593Smuzhiyun 	data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
2347*4882a593Smuzhiyun 	if (orig != data)
2348*4882a593Smuzhiyun 		WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
2349*4882a593Smuzhiyun 
2350*4882a593Smuzhiyun 	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
2351*4882a593Smuzhiyun 	data |= LC_GO_TO_RECOVERY;
2352*4882a593Smuzhiyun 	if (orig != data)
2353*4882a593Smuzhiyun 		WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
2354*4882a593Smuzhiyun 
2355*4882a593Smuzhiyun 	orig = data = RREG32_PCIE(PCIE_P_CNTL);
2356*4882a593Smuzhiyun 	data |= P_IGNORE_EDB_ERR;
2357*4882a593Smuzhiyun 	if (orig != data)
2358*4882a593Smuzhiyun 		WREG32_PCIE(PCIE_P_CNTL, data);
2359*4882a593Smuzhiyun 
2360*4882a593Smuzhiyun 	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
2361*4882a593Smuzhiyun 	data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
2362*4882a593Smuzhiyun 	data |= LC_PMI_TO_L1_DIS;
2363*4882a593Smuzhiyun 	if (!disable_l0s)
2364*4882a593Smuzhiyun 		data |= LC_L0S_INACTIVITY(7);
2365*4882a593Smuzhiyun 
2366*4882a593Smuzhiyun 	if (!disable_l1) {
2367*4882a593Smuzhiyun 		data |= LC_L1_INACTIVITY(7);
2368*4882a593Smuzhiyun 		data &= ~LC_PMI_TO_L1_DIS;
2369*4882a593Smuzhiyun 		if (orig != data)
2370*4882a593Smuzhiyun 			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2371*4882a593Smuzhiyun 
2372*4882a593Smuzhiyun 		if (!disable_plloff_in_l1) {
2373*4882a593Smuzhiyun 			bool clk_req_support;
2374*4882a593Smuzhiyun 
2375*4882a593Smuzhiyun 			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
2376*4882a593Smuzhiyun 			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
2377*4882a593Smuzhiyun 			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
2378*4882a593Smuzhiyun 			if (orig != data)
2379*4882a593Smuzhiyun 				si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
2380*4882a593Smuzhiyun 
2381*4882a593Smuzhiyun 			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
2382*4882a593Smuzhiyun 			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
2383*4882a593Smuzhiyun 			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
2384*4882a593Smuzhiyun 			if (orig != data)
2385*4882a593Smuzhiyun 				si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
2386*4882a593Smuzhiyun 
2387*4882a593Smuzhiyun 			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
2388*4882a593Smuzhiyun 			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
2389*4882a593Smuzhiyun 			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
2390*4882a593Smuzhiyun 			if (orig != data)
2391*4882a593Smuzhiyun 				si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
2392*4882a593Smuzhiyun 
2393*4882a593Smuzhiyun 			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
2394*4882a593Smuzhiyun 			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
2395*4882a593Smuzhiyun 			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
2396*4882a593Smuzhiyun 			if (orig != data)
2397*4882a593Smuzhiyun 				si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
2398*4882a593Smuzhiyun 
2399*4882a593Smuzhiyun 			if ((adev->asic_type != CHIP_OLAND) && (adev->asic_type != CHIP_HAINAN)) {
2400*4882a593Smuzhiyun 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
2401*4882a593Smuzhiyun 				data &= ~PLL_RAMP_UP_TIME_0_MASK;
2402*4882a593Smuzhiyun 				if (orig != data)
2403*4882a593Smuzhiyun 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
2404*4882a593Smuzhiyun 
2405*4882a593Smuzhiyun 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
2406*4882a593Smuzhiyun 				data &= ~PLL_RAMP_UP_TIME_1_MASK;
2407*4882a593Smuzhiyun 				if (orig != data)
2408*4882a593Smuzhiyun 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
2409*4882a593Smuzhiyun 
2410*4882a593Smuzhiyun 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2);
2411*4882a593Smuzhiyun 				data &= ~PLL_RAMP_UP_TIME_2_MASK;
2412*4882a593Smuzhiyun 				if (orig != data)
2413*4882a593Smuzhiyun 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data);
2414*4882a593Smuzhiyun 
2415*4882a593Smuzhiyun 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3);
2416*4882a593Smuzhiyun 				data &= ~PLL_RAMP_UP_TIME_3_MASK;
2417*4882a593Smuzhiyun 				if (orig != data)
2418*4882a593Smuzhiyun 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data);
2419*4882a593Smuzhiyun 
2420*4882a593Smuzhiyun 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
2421*4882a593Smuzhiyun 				data &= ~PLL_RAMP_UP_TIME_0_MASK;
2422*4882a593Smuzhiyun 				if (orig != data)
2423*4882a593Smuzhiyun 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
2424*4882a593Smuzhiyun 
2425*4882a593Smuzhiyun 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
2426*4882a593Smuzhiyun 				data &= ~PLL_RAMP_UP_TIME_1_MASK;
2427*4882a593Smuzhiyun 				if (orig != data)
2428*4882a593Smuzhiyun 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
2429*4882a593Smuzhiyun 
2430*4882a593Smuzhiyun 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2);
2431*4882a593Smuzhiyun 				data &= ~PLL_RAMP_UP_TIME_2_MASK;
2432*4882a593Smuzhiyun 				if (orig != data)
2433*4882a593Smuzhiyun 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data);
2434*4882a593Smuzhiyun 
2435*4882a593Smuzhiyun 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3);
2436*4882a593Smuzhiyun 				data &= ~PLL_RAMP_UP_TIME_3_MASK;
2437*4882a593Smuzhiyun 				if (orig != data)
2438*4882a593Smuzhiyun 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data);
2439*4882a593Smuzhiyun 			}
2440*4882a593Smuzhiyun 			orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2441*4882a593Smuzhiyun 			data &= ~LC_DYN_LANES_PWR_STATE_MASK;
2442*4882a593Smuzhiyun 			data |= LC_DYN_LANES_PWR_STATE(3);
2443*4882a593Smuzhiyun 			if (orig != data)
2444*4882a593Smuzhiyun 				WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
2445*4882a593Smuzhiyun 
2446*4882a593Smuzhiyun 			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL);
2447*4882a593Smuzhiyun 			data &= ~LS2_EXIT_TIME_MASK;
2448*4882a593Smuzhiyun 			if ((adev->asic_type == CHIP_OLAND) || (adev->asic_type == CHIP_HAINAN))
2449*4882a593Smuzhiyun 				data |= LS2_EXIT_TIME(5);
2450*4882a593Smuzhiyun 			if (orig != data)
2451*4882a593Smuzhiyun 				si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data);
2452*4882a593Smuzhiyun 
2453*4882a593Smuzhiyun 			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL);
2454*4882a593Smuzhiyun 			data &= ~LS2_EXIT_TIME_MASK;
2455*4882a593Smuzhiyun 			if ((adev->asic_type == CHIP_OLAND) || (adev->asic_type == CHIP_HAINAN))
2456*4882a593Smuzhiyun 				data |= LS2_EXIT_TIME(5);
2457*4882a593Smuzhiyun 			if (orig != data)
2458*4882a593Smuzhiyun 				si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data);
2459*4882a593Smuzhiyun 
2460*4882a593Smuzhiyun 			if (!disable_clkreq &&
2461*4882a593Smuzhiyun 			    !pci_is_root_bus(adev->pdev->bus)) {
2462*4882a593Smuzhiyun 				struct pci_dev *root = adev->pdev->bus->self;
2463*4882a593Smuzhiyun 				u32 lnkcap;
2464*4882a593Smuzhiyun 
2465*4882a593Smuzhiyun 				clk_req_support = false;
2466*4882a593Smuzhiyun 				pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
2467*4882a593Smuzhiyun 				if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
2468*4882a593Smuzhiyun 					clk_req_support = true;
2469*4882a593Smuzhiyun 			} else {
2470*4882a593Smuzhiyun 				clk_req_support = false;
2471*4882a593Smuzhiyun 			}
2472*4882a593Smuzhiyun 
2473*4882a593Smuzhiyun 			if (clk_req_support) {
2474*4882a593Smuzhiyun 				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
2475*4882a593Smuzhiyun 				data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
2476*4882a593Smuzhiyun 				if (orig != data)
2477*4882a593Smuzhiyun 					WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
2478*4882a593Smuzhiyun 
2479*4882a593Smuzhiyun 				orig = data = RREG32(THM_CLK_CNTL);
2480*4882a593Smuzhiyun 				data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
2481*4882a593Smuzhiyun 				data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
2482*4882a593Smuzhiyun 				if (orig != data)
2483*4882a593Smuzhiyun 					WREG32(THM_CLK_CNTL, data);
2484*4882a593Smuzhiyun 
2485*4882a593Smuzhiyun 				orig = data = RREG32(MISC_CLK_CNTL);
2486*4882a593Smuzhiyun 				data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
2487*4882a593Smuzhiyun 				data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
2488*4882a593Smuzhiyun 				if (orig != data)
2489*4882a593Smuzhiyun 					WREG32(MISC_CLK_CNTL, data);
2490*4882a593Smuzhiyun 
2491*4882a593Smuzhiyun 				orig = data = RREG32(CG_CLKPIN_CNTL);
2492*4882a593Smuzhiyun 				data &= ~BCLK_AS_XCLK;
2493*4882a593Smuzhiyun 				if (orig != data)
2494*4882a593Smuzhiyun 					WREG32(CG_CLKPIN_CNTL, data);
2495*4882a593Smuzhiyun 
2496*4882a593Smuzhiyun 				orig = data = RREG32(CG_CLKPIN_CNTL_2);
2497*4882a593Smuzhiyun 				data &= ~FORCE_BIF_REFCLK_EN;
2498*4882a593Smuzhiyun 				if (orig != data)
2499*4882a593Smuzhiyun 					WREG32(CG_CLKPIN_CNTL_2, data);
2500*4882a593Smuzhiyun 
2501*4882a593Smuzhiyun 				orig = data = RREG32(MPLL_BYPASSCLK_SEL);
2502*4882a593Smuzhiyun 				data &= ~MPLL_CLKOUT_SEL_MASK;
2503*4882a593Smuzhiyun 				data |= MPLL_CLKOUT_SEL(4);
2504*4882a593Smuzhiyun 				if (orig != data)
2505*4882a593Smuzhiyun 					WREG32(MPLL_BYPASSCLK_SEL, data);
2506*4882a593Smuzhiyun 
2507*4882a593Smuzhiyun 				orig = data = RREG32(SPLL_CNTL_MODE);
2508*4882a593Smuzhiyun 				data &= ~SPLL_REFCLK_SEL_MASK;
2509*4882a593Smuzhiyun 				if (orig != data)
2510*4882a593Smuzhiyun 					WREG32(SPLL_CNTL_MODE, data);
2511*4882a593Smuzhiyun 			}
2512*4882a593Smuzhiyun 		}
2513*4882a593Smuzhiyun 	} else {
2514*4882a593Smuzhiyun 		if (orig != data)
2515*4882a593Smuzhiyun 			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2516*4882a593Smuzhiyun 	}
2517*4882a593Smuzhiyun 
2518*4882a593Smuzhiyun 	orig = data = RREG32_PCIE(PCIE_CNTL2);
2519*4882a593Smuzhiyun 	data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
2520*4882a593Smuzhiyun 	if (orig != data)
2521*4882a593Smuzhiyun 		WREG32_PCIE(PCIE_CNTL2, data);
2522*4882a593Smuzhiyun 
2523*4882a593Smuzhiyun 	if (!disable_l0s) {
2524*4882a593Smuzhiyun 		data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
2525*4882a593Smuzhiyun 		if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
2526*4882a593Smuzhiyun 			data = RREG32_PCIE(PCIE_LC_STATUS1);
2527*4882a593Smuzhiyun 			if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
2528*4882a593Smuzhiyun 				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
2529*4882a593Smuzhiyun 				data &= ~LC_L0S_INACTIVITY_MASK;
2530*4882a593Smuzhiyun 				if (orig != data)
2531*4882a593Smuzhiyun 					WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2532*4882a593Smuzhiyun 			}
2533*4882a593Smuzhiyun 		}
2534*4882a593Smuzhiyun 	}
2535*4882a593Smuzhiyun }
2536*4882a593Smuzhiyun 
si_fix_pci_max_read_req_size(struct amdgpu_device * adev)2537*4882a593Smuzhiyun static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
2538*4882a593Smuzhiyun {
2539*4882a593Smuzhiyun 	int readrq;
2540*4882a593Smuzhiyun 	u16 v;
2541*4882a593Smuzhiyun 
2542*4882a593Smuzhiyun 	readrq = pcie_get_readrq(adev->pdev);
2543*4882a593Smuzhiyun 	v = ffs(readrq) - 8;
2544*4882a593Smuzhiyun 	if ((v == 0) || (v == 6) || (v == 7))
2545*4882a593Smuzhiyun 		pcie_set_readrq(adev->pdev, 512);
2546*4882a593Smuzhiyun }
2547*4882a593Smuzhiyun 
si_common_hw_init(void * handle)2548*4882a593Smuzhiyun static int si_common_hw_init(void *handle)
2549*4882a593Smuzhiyun {
2550*4882a593Smuzhiyun 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2551*4882a593Smuzhiyun 
2552*4882a593Smuzhiyun 	si_fix_pci_max_read_req_size(adev);
2553*4882a593Smuzhiyun 	si_init_golden_registers(adev);
2554*4882a593Smuzhiyun 	si_pcie_gen3_enable(adev);
2555*4882a593Smuzhiyun 	si_program_aspm(adev);
2556*4882a593Smuzhiyun 
2557*4882a593Smuzhiyun 	return 0;
2558*4882a593Smuzhiyun }
2559*4882a593Smuzhiyun 
si_common_hw_fini(void * handle)2560*4882a593Smuzhiyun static int si_common_hw_fini(void *handle)
2561*4882a593Smuzhiyun {
2562*4882a593Smuzhiyun 	return 0;
2563*4882a593Smuzhiyun }
2564*4882a593Smuzhiyun 
si_common_suspend(void * handle)2565*4882a593Smuzhiyun static int si_common_suspend(void *handle)
2566*4882a593Smuzhiyun {
2567*4882a593Smuzhiyun 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2568*4882a593Smuzhiyun 
2569*4882a593Smuzhiyun 	return si_common_hw_fini(adev);
2570*4882a593Smuzhiyun }
2571*4882a593Smuzhiyun 
si_common_resume(void * handle)2572*4882a593Smuzhiyun static int si_common_resume(void *handle)
2573*4882a593Smuzhiyun {
2574*4882a593Smuzhiyun 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2575*4882a593Smuzhiyun 
2576*4882a593Smuzhiyun 	return si_common_hw_init(adev);
2577*4882a593Smuzhiyun }
2578*4882a593Smuzhiyun 
si_common_is_idle(void * handle)2579*4882a593Smuzhiyun static bool si_common_is_idle(void *handle)
2580*4882a593Smuzhiyun {
2581*4882a593Smuzhiyun 	return true;
2582*4882a593Smuzhiyun }
2583*4882a593Smuzhiyun 
si_common_wait_for_idle(void * handle)2584*4882a593Smuzhiyun static int si_common_wait_for_idle(void *handle)
2585*4882a593Smuzhiyun {
2586*4882a593Smuzhiyun 	return 0;
2587*4882a593Smuzhiyun }
2588*4882a593Smuzhiyun 
si_common_soft_reset(void * handle)2589*4882a593Smuzhiyun static int si_common_soft_reset(void *handle)
2590*4882a593Smuzhiyun {
2591*4882a593Smuzhiyun 	return 0;
2592*4882a593Smuzhiyun }
2593*4882a593Smuzhiyun 
si_common_set_clockgating_state(void * handle,enum amd_clockgating_state state)2594*4882a593Smuzhiyun static int si_common_set_clockgating_state(void *handle,
2595*4882a593Smuzhiyun 					    enum amd_clockgating_state state)
2596*4882a593Smuzhiyun {
2597*4882a593Smuzhiyun 	return 0;
2598*4882a593Smuzhiyun }
2599*4882a593Smuzhiyun 
si_common_set_powergating_state(void * handle,enum amd_powergating_state state)2600*4882a593Smuzhiyun static int si_common_set_powergating_state(void *handle,
2601*4882a593Smuzhiyun 					    enum amd_powergating_state state)
2602*4882a593Smuzhiyun {
2603*4882a593Smuzhiyun 	return 0;
2604*4882a593Smuzhiyun }
2605*4882a593Smuzhiyun 
2606*4882a593Smuzhiyun static const struct amd_ip_funcs si_common_ip_funcs = {
2607*4882a593Smuzhiyun 	.name = "si_common",
2608*4882a593Smuzhiyun 	.early_init = si_common_early_init,
2609*4882a593Smuzhiyun 	.late_init = NULL,
2610*4882a593Smuzhiyun 	.sw_init = si_common_sw_init,
2611*4882a593Smuzhiyun 	.sw_fini = si_common_sw_fini,
2612*4882a593Smuzhiyun 	.hw_init = si_common_hw_init,
2613*4882a593Smuzhiyun 	.hw_fini = si_common_hw_fini,
2614*4882a593Smuzhiyun 	.suspend = si_common_suspend,
2615*4882a593Smuzhiyun 	.resume = si_common_resume,
2616*4882a593Smuzhiyun 	.is_idle = si_common_is_idle,
2617*4882a593Smuzhiyun 	.wait_for_idle = si_common_wait_for_idle,
2618*4882a593Smuzhiyun 	.soft_reset = si_common_soft_reset,
2619*4882a593Smuzhiyun 	.set_clockgating_state = si_common_set_clockgating_state,
2620*4882a593Smuzhiyun 	.set_powergating_state = si_common_set_powergating_state,
2621*4882a593Smuzhiyun };
2622*4882a593Smuzhiyun 
2623*4882a593Smuzhiyun static const struct amdgpu_ip_block_version si_common_ip_block =
2624*4882a593Smuzhiyun {
2625*4882a593Smuzhiyun 	.type = AMD_IP_BLOCK_TYPE_COMMON,
2626*4882a593Smuzhiyun 	.major = 1,
2627*4882a593Smuzhiyun 	.minor = 0,
2628*4882a593Smuzhiyun 	.rev = 0,
2629*4882a593Smuzhiyun 	.funcs = &si_common_ip_funcs,
2630*4882a593Smuzhiyun };
2631*4882a593Smuzhiyun 
si_set_ip_blocks(struct amdgpu_device * adev)2632*4882a593Smuzhiyun int si_set_ip_blocks(struct amdgpu_device *adev)
2633*4882a593Smuzhiyun {
2634*4882a593Smuzhiyun 	switch (adev->asic_type) {
2635*4882a593Smuzhiyun 	case CHIP_VERDE:
2636*4882a593Smuzhiyun 	case CHIP_TAHITI:
2637*4882a593Smuzhiyun 	case CHIP_PITCAIRN:
2638*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2639*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2640*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2641*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2642*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2643*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2644*4882a593Smuzhiyun 		if (adev->enable_virtual_display)
2645*4882a593Smuzhiyun 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2646*4882a593Smuzhiyun #if defined(CONFIG_DRM_AMD_DC) && defined(CONFIG_DRM_AMD_DC_SI)
2647*4882a593Smuzhiyun 		else if (amdgpu_device_has_dc_support(adev))
2648*4882a593Smuzhiyun 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
2649*4882a593Smuzhiyun #endif
2650*4882a593Smuzhiyun 		else
2651*4882a593Smuzhiyun 			amdgpu_device_ip_block_add(adev, &dce_v6_0_ip_block);
2652*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block);
2653*4882a593Smuzhiyun 		/* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2654*4882a593Smuzhiyun 		break;
2655*4882a593Smuzhiyun 	case CHIP_OLAND:
2656*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2657*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2658*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2659*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2660*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2661*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2662*4882a593Smuzhiyun 		if (adev->enable_virtual_display)
2663*4882a593Smuzhiyun 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2664*4882a593Smuzhiyun #if defined(CONFIG_DRM_AMD_DC) && defined(CONFIG_DRM_AMD_DC_SI)
2665*4882a593Smuzhiyun 		else if (amdgpu_device_has_dc_support(adev))
2666*4882a593Smuzhiyun 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
2667*4882a593Smuzhiyun #endif
2668*4882a593Smuzhiyun 		else
2669*4882a593Smuzhiyun 			amdgpu_device_ip_block_add(adev, &dce_v6_4_ip_block);
2670*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block);
2671*4882a593Smuzhiyun 		/* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2672*4882a593Smuzhiyun 		break;
2673*4882a593Smuzhiyun 	case CHIP_HAINAN:
2674*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2675*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2676*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2677*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2678*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2679*4882a593Smuzhiyun 		amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2680*4882a593Smuzhiyun 		if (adev->enable_virtual_display)
2681*4882a593Smuzhiyun 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2682*4882a593Smuzhiyun 		break;
2683*4882a593Smuzhiyun 	default:
2684*4882a593Smuzhiyun 		BUG();
2685*4882a593Smuzhiyun 	}
2686*4882a593Smuzhiyun 	return 0;
2687*4882a593Smuzhiyun }
2688*4882a593Smuzhiyun 
2689