xref: /openbmc/linux/drivers/gpu/drm/amd/amdgpu/si.c (revision 2874c5fd)
1 /*
2  * Copyright 2015 Advanced Micro Devices, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  *
22  */
23 
24 #include <linux/firmware.h>
25 #include <linux/slab.h>
26 #include <linux/module.h>
27 #include <drm/drmP.h>
28 #include "amdgpu.h"
29 #include "amdgpu_atombios.h"
30 #include "amdgpu_ih.h"
31 #include "amdgpu_uvd.h"
32 #include "amdgpu_vce.h"
33 #include "atom.h"
34 #include "amd_pcie.h"
35 #include "si_dpm.h"
36 #include "sid.h"
37 #include "si_ih.h"
38 #include "gfx_v6_0.h"
39 #include "gmc_v6_0.h"
40 #include "si_dma.h"
41 #include "dce_v6_0.h"
42 #include "si.h"
43 #include "dce_virtual.h"
44 #include "gca/gfx_6_0_d.h"
45 #include "oss/oss_1_0_d.h"
46 #include "gmc/gmc_6_0_d.h"
47 #include "dce/dce_6_0_d.h"
48 #include "uvd/uvd_4_0_d.h"
49 #include "bif/bif_3_0_d.h"
50 #include "bif/bif_3_0_sh_mask.h"
51 
52 static const u32 tahiti_golden_registers[] =
53 {
54 	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
55 	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
56 	mmDB_DEBUG, 0xffffffff, 0x00000000,
57 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
58 	mmDB_DEBUG3, 0x0002021c, 0x00020200,
59 	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
60 	0x340c, 0x000000c0, 0x00800040,
61 	0x360c, 0x000000c0, 0x00800040,
62 	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
63 	mmFBC_MISC, 0x00200000, 0x50100000,
64 	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
65 	mmMC_ARB_WTM_CNTL_RD, 0x00000003, 0x000007ff,
66 	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
67 	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
68 	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
69 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
70 	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
71 	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
72 	0x000c, 0xffffffff, 0x0040,
73 	0x000d, 0x00000040, 0x00004040,
74 	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
75 	mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
76 	mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
77 	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
78 	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
79 	mmTCP_ADDR_CONFIG, 0x00000200, 0x000002fb,
80 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x0000543b,
81 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0xa9210876,
82 	mmVGT_FIFO_DEPTHS, 0xffffffff, 0x000fff40,
83 	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
84 	mmVM_CONTEXT0_CNTL, 0x20000000, 0x20fffed8,
85 	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
86 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
87 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
88 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
89 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
90 };
91 
92 static const u32 tahiti_golden_registers2[] =
93 {
94 	mmMCIF_MEM_CONTROL, 0x00000001, 0x00000001,
95 };
96 
97 static const u32 tahiti_golden_rlc_registers[] =
98 {
99 	mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
100 	mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
101 	0x311f, 0xffffffff, 0x10104040,
102 	0x3122, 0xffffffff, 0x0100000a,
103 	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
104 	mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
105 	mmUVD_CGC_GATE, 0x00000008, 0x00000000,
106 };
107 
108 static const u32 pitcairn_golden_registers[] =
109 {
110 	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
111 	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
112 	mmDB_DEBUG, 0xffffffff, 0x00000000,
113 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
114 	mmDB_DEBUG3, 0x0002021c, 0x00020200,
115 	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
116 	0x340c, 0x000300c0, 0x00800040,
117 	0x360c, 0x000300c0, 0x00800040,
118 	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
119 	mmFBC_MISC, 0x00200000, 0x50100000,
120 	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
121 	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
122 	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
123 	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
124 	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
125 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
126 	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
127 	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
128 	0x000c, 0xffffffff, 0x0040,
129 	0x000d, 0x00000040, 0x00004040,
130 	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
131 	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
132 	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
133 	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7,
134 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
135 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x32761054,
136 	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
137 	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
138 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
139 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
140 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
141 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
142 };
143 
144 static const u32 pitcairn_golden_rlc_registers[] =
145 {
146 	mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
147 	mmRLC_LB_PARAMS, 0xffffffff, 0x00601004,
148 	0x311f, 0xffffffff, 0x10102020,
149 	0x3122, 0xffffffff, 0x01000020,
150 	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
151 	mmRLC_LB_CNTL, 0xffffffff, 0x800000a4,
152 };
153 
154 static const u32 verde_pg_init[] =
155 {
156 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x40000,
157 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x200010ff,
158 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
159 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
160 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
161 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
162 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
163 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x7007,
164 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x300010ff,
165 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
166 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
167 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
168 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
169 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
170 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x400000,
171 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x100010ff,
172 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
173 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
174 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
175 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
176 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
177 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x120200,
178 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x500010ff,
179 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
180 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
181 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
182 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
183 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
184 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x1e1e16,
185 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x600010ff,
186 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
187 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
188 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
189 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
190 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
191 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x171f1e,
192 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x700010ff,
193 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
194 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
195 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
196 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
197 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
198 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
199 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x9ff,
200 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x0,
201 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10000800,
202 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
203 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
204 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4,
205 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1000051e,
206 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
207 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
208 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x8,
209 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x80500,
210 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x12,
211 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x9050c,
212 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1d,
213 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xb052c,
214 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2a,
215 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1053e,
216 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2d,
217 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10546,
218 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x30,
219 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xa054e,
220 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3c,
221 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1055f,
222 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3f,
223 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10567,
224 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x42,
225 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1056f,
226 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x45,
227 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10572,
228 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x48,
229 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20575,
230 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4c,
231 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x190801,
232 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x67,
233 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1082a,
234 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x6a,
235 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1b082d,
236 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x87,
237 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x310851,
238 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xba,
239 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x891,
240 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbc,
241 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x893,
242 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbe,
243 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20895,
244 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc2,
245 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20899,
246 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc6,
247 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2089d,
248 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xca,
249 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a1,
250 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xcc,
251 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a3,
252 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xce,
253 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x308a5,
254 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xd3,
255 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x6d08cd,
256 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x142,
257 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2000095a,
258 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1,
259 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x144,
260 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x301f095b,
261 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x165,
262 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc094d,
263 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x173,
264 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf096d,
265 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x184,
266 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x15097f,
267 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x19b,
268 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc0998,
269 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1a9,
270 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x409a7,
271 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1af,
272 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xcdc,
273 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1b1,
274 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x800,
275 	mmGMCON_RENG_EXECUTE, 0xffffffff, 0x6c9b2000,
276 	mmGMCON_MISC2, 0xfc00, 0x2000,
277 	mmGMCON_MISC3, 0xffffffff, 0xfc0,
278 	mmMC_PMG_AUTO_CFG, 0x00000100, 0x100,
279 };
280 
281 static const u32 verde_golden_rlc_registers[] =
282 {
283 	mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
284 	mmRLC_LB_PARAMS, 0xffffffff, 0x033f1005,
285 	0x311f, 0xffffffff, 0x10808020,
286 	0x3122, 0xffffffff, 0x00800008,
287 	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00001000,
288 	mmRLC_LB_CNTL, 0xffffffff, 0x80010014,
289 };
290 
291 static const u32 verde_golden_registers[] =
292 {
293 	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
294 	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
295 	mmDB_DEBUG, 0xffffffff, 0x00000000,
296 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
297 	mmDB_DEBUG3, 0x0002021c, 0x00020200,
298 	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
299 	0x340c, 0x000300c0, 0x00800040,
300 	0x360c, 0x000300c0, 0x00800040,
301 	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
302 	mmFBC_MISC, 0x00200000, 0x50100000,
303 	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
304 	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
305 	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
306 	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
307 	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
308 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
309 	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
310 	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x0000124a,
311 	0x000c, 0xffffffff, 0x0040,
312 	0x000d, 0x00000040, 0x00004040,
313 	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
314 	mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
315 	mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
316 	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
317 	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
318 	mmTCP_ADDR_CONFIG, 0x000003ff, 0x00000003,
319 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
320 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00001032,
321 	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
322 	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
323 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
324 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
325 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
326 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
327 };
328 
329 static const u32 oland_golden_registers[] =
330 {
331 	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
332 	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
333 	mmDB_DEBUG, 0xffffffff, 0x00000000,
334 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
335 	mmDB_DEBUG3, 0x0002021c, 0x00020200,
336 	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
337 	0x340c, 0x000300c0, 0x00800040,
338 	0x360c, 0x000300c0, 0x00800040,
339 	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
340 	mmFBC_MISC, 0x00200000, 0x50100000,
341 	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
342 	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
343 	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
344 	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
345 	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
346 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
347 	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
348 	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000082,
349 	0x000c, 0xffffffff, 0x0040,
350 	0x000d, 0x00000040, 0x00004040,
351 	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
352 	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
353 	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
354 	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f3,
355 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
356 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
357 	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
358 	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
359 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
360 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
361 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
362 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
363 
364 };
365 
366 static const u32 oland_golden_rlc_registers[] =
367 {
368 	mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
369 	mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
370 	0x311f, 0xffffffff, 0x10104040,
371 	0x3122, 0xffffffff, 0x0100000a,
372 	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
373 	mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
374 };
375 
376 static const u32 hainan_golden_registers[] =
377 {
378 	0x17bc, 0x00000030, 0x00000011,
379 	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
380 	mmDB_DEBUG, 0xffffffff, 0x00000000,
381 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
382 	mmDB_DEBUG3, 0x0002021c, 0x00020200,
383 	0x031e, 0x00000080, 0x00000000,
384 	0x3430, 0xff000fff, 0x00000100,
385 	0x340c, 0x000300c0, 0x00800040,
386 	0x3630, 0xff000fff, 0x00000100,
387 	0x360c, 0x000300c0, 0x00800040,
388 	0x16ec, 0x000000f0, 0x00000070,
389 	0x16f0, 0x00200000, 0x50100000,
390 	0x1c0c, 0x31000311, 0x00000011,
391 	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
392 	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
393 	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
394 	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
395 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
396 	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
397 	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000000,
398 	0x000c, 0xffffffff, 0x0040,
399 	0x000d, 0x00000040, 0x00004040,
400 	mmSPI_CONFIG_CNTL, 0x03e00000, 0x03600000,
401 	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
402 	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
403 	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f1,
404 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
405 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
406 	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
407 	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
408 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
409 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
410 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
411 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
412 };
413 
414 static const u32 hainan_golden_registers2[] =
415 {
416 	mmGB_ADDR_CONFIG, 0xffffffff, 0x2011003,
417 };
418 
419 static const u32 tahiti_mgcg_cgcg_init[] =
420 {
421 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
422 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
423 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
424 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
425 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
426 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
427 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
428 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
429 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
430 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
431 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
432 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
433 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
434 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
435 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
436 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
437 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
438 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
439 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
440 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
441 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
442 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
443 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
444 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
445 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
446 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
447 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
448 	0x2458, 0xffffffff, 0x00010000,
449 	0x2459, 0xffffffff, 0x00030002,
450 	0x245a, 0xffffffff, 0x00040007,
451 	0x245b, 0xffffffff, 0x00060005,
452 	0x245c, 0xffffffff, 0x00090008,
453 	0x245d, 0xffffffff, 0x00020001,
454 	0x245e, 0xffffffff, 0x00040003,
455 	0x245f, 0xffffffff, 0x00000007,
456 	0x2460, 0xffffffff, 0x00060005,
457 	0x2461, 0xffffffff, 0x00090008,
458 	0x2462, 0xffffffff, 0x00030002,
459 	0x2463, 0xffffffff, 0x00050004,
460 	0x2464, 0xffffffff, 0x00000008,
461 	0x2465, 0xffffffff, 0x00070006,
462 	0x2466, 0xffffffff, 0x000a0009,
463 	0x2467, 0xffffffff, 0x00040003,
464 	0x2468, 0xffffffff, 0x00060005,
465 	0x2469, 0xffffffff, 0x00000009,
466 	0x246a, 0xffffffff, 0x00080007,
467 	0x246b, 0xffffffff, 0x000b000a,
468 	0x246c, 0xffffffff, 0x00050004,
469 	0x246d, 0xffffffff, 0x00070006,
470 	0x246e, 0xffffffff, 0x0008000b,
471 	0x246f, 0xffffffff, 0x000a0009,
472 	0x2470, 0xffffffff, 0x000d000c,
473 	0x2471, 0xffffffff, 0x00060005,
474 	0x2472, 0xffffffff, 0x00080007,
475 	0x2473, 0xffffffff, 0x0000000b,
476 	0x2474, 0xffffffff, 0x000a0009,
477 	0x2475, 0xffffffff, 0x000d000c,
478 	0x2476, 0xffffffff, 0x00070006,
479 	0x2477, 0xffffffff, 0x00090008,
480 	0x2478, 0xffffffff, 0x0000000c,
481 	0x2479, 0xffffffff, 0x000b000a,
482 	0x247a, 0xffffffff, 0x000e000d,
483 	0x247b, 0xffffffff, 0x00080007,
484 	0x247c, 0xffffffff, 0x000a0009,
485 	0x247d, 0xffffffff, 0x0000000d,
486 	0x247e, 0xffffffff, 0x000c000b,
487 	0x247f, 0xffffffff, 0x000f000e,
488 	0x2480, 0xffffffff, 0x00090008,
489 	0x2481, 0xffffffff, 0x000b000a,
490 	0x2482, 0xffffffff, 0x000c000f,
491 	0x2483, 0xffffffff, 0x000e000d,
492 	0x2484, 0xffffffff, 0x00110010,
493 	0x2485, 0xffffffff, 0x000a0009,
494 	0x2486, 0xffffffff, 0x000c000b,
495 	0x2487, 0xffffffff, 0x0000000f,
496 	0x2488, 0xffffffff, 0x000e000d,
497 	0x2489, 0xffffffff, 0x00110010,
498 	0x248a, 0xffffffff, 0x000b000a,
499 	0x248b, 0xffffffff, 0x000d000c,
500 	0x248c, 0xffffffff, 0x00000010,
501 	0x248d, 0xffffffff, 0x000f000e,
502 	0x248e, 0xffffffff, 0x00120011,
503 	0x248f, 0xffffffff, 0x000c000b,
504 	0x2490, 0xffffffff, 0x000e000d,
505 	0x2491, 0xffffffff, 0x00000011,
506 	0x2492, 0xffffffff, 0x0010000f,
507 	0x2493, 0xffffffff, 0x00130012,
508 	0x2494, 0xffffffff, 0x000d000c,
509 	0x2495, 0xffffffff, 0x000f000e,
510 	0x2496, 0xffffffff, 0x00100013,
511 	0x2497, 0xffffffff, 0x00120011,
512 	0x2498, 0xffffffff, 0x00150014,
513 	0x2499, 0xffffffff, 0x000e000d,
514 	0x249a, 0xffffffff, 0x0010000f,
515 	0x249b, 0xffffffff, 0x00000013,
516 	0x249c, 0xffffffff, 0x00120011,
517 	0x249d, 0xffffffff, 0x00150014,
518 	0x249e, 0xffffffff, 0x000f000e,
519 	0x249f, 0xffffffff, 0x00110010,
520 	0x24a0, 0xffffffff, 0x00000014,
521 	0x24a1, 0xffffffff, 0x00130012,
522 	0x24a2, 0xffffffff, 0x00160015,
523 	0x24a3, 0xffffffff, 0x0010000f,
524 	0x24a4, 0xffffffff, 0x00120011,
525 	0x24a5, 0xffffffff, 0x00000015,
526 	0x24a6, 0xffffffff, 0x00140013,
527 	0x24a7, 0xffffffff, 0x00170016,
528 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
529 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
530 	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
531 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
532 	0x000c, 0xffffffff, 0x0000001c,
533 	0x000d, 0x000f0000, 0x000f0000,
534 	0x0583, 0xffffffff, 0x00000100,
535 	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
536 	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
537 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
538 	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
539 	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
540 	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
541 	0x157a, 0x00000001, 0x00000001,
542 	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
543 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
544 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
545 	0x3430, 0xfffffff0, 0x00000100,
546 	0x3630, 0xfffffff0, 0x00000100,
547 };
548 static const u32 pitcairn_mgcg_cgcg_init[] =
549 {
550 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
551 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
552 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
553 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
554 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
555 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
556 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
557 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
558 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
559 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
560 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
561 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
562 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
563 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
564 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
565 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
566 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
567 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
568 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
569 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
570 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
571 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
572 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
573 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
574 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
575 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
576 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
577 	0x2458, 0xffffffff, 0x00010000,
578 	0x2459, 0xffffffff, 0x00030002,
579 	0x245a, 0xffffffff, 0x00040007,
580 	0x245b, 0xffffffff, 0x00060005,
581 	0x245c, 0xffffffff, 0x00090008,
582 	0x245d, 0xffffffff, 0x00020001,
583 	0x245e, 0xffffffff, 0x00040003,
584 	0x245f, 0xffffffff, 0x00000007,
585 	0x2460, 0xffffffff, 0x00060005,
586 	0x2461, 0xffffffff, 0x00090008,
587 	0x2462, 0xffffffff, 0x00030002,
588 	0x2463, 0xffffffff, 0x00050004,
589 	0x2464, 0xffffffff, 0x00000008,
590 	0x2465, 0xffffffff, 0x00070006,
591 	0x2466, 0xffffffff, 0x000a0009,
592 	0x2467, 0xffffffff, 0x00040003,
593 	0x2468, 0xffffffff, 0x00060005,
594 	0x2469, 0xffffffff, 0x00000009,
595 	0x246a, 0xffffffff, 0x00080007,
596 	0x246b, 0xffffffff, 0x000b000a,
597 	0x246c, 0xffffffff, 0x00050004,
598 	0x246d, 0xffffffff, 0x00070006,
599 	0x246e, 0xffffffff, 0x0008000b,
600 	0x246f, 0xffffffff, 0x000a0009,
601 	0x2470, 0xffffffff, 0x000d000c,
602 	0x2480, 0xffffffff, 0x00090008,
603 	0x2481, 0xffffffff, 0x000b000a,
604 	0x2482, 0xffffffff, 0x000c000f,
605 	0x2483, 0xffffffff, 0x000e000d,
606 	0x2484, 0xffffffff, 0x00110010,
607 	0x2485, 0xffffffff, 0x000a0009,
608 	0x2486, 0xffffffff, 0x000c000b,
609 	0x2487, 0xffffffff, 0x0000000f,
610 	0x2488, 0xffffffff, 0x000e000d,
611 	0x2489, 0xffffffff, 0x00110010,
612 	0x248a, 0xffffffff, 0x000b000a,
613 	0x248b, 0xffffffff, 0x000d000c,
614 	0x248c, 0xffffffff, 0x00000010,
615 	0x248d, 0xffffffff, 0x000f000e,
616 	0x248e, 0xffffffff, 0x00120011,
617 	0x248f, 0xffffffff, 0x000c000b,
618 	0x2490, 0xffffffff, 0x000e000d,
619 	0x2491, 0xffffffff, 0x00000011,
620 	0x2492, 0xffffffff, 0x0010000f,
621 	0x2493, 0xffffffff, 0x00130012,
622 	0x2494, 0xffffffff, 0x000d000c,
623 	0x2495, 0xffffffff, 0x000f000e,
624 	0x2496, 0xffffffff, 0x00100013,
625 	0x2497, 0xffffffff, 0x00120011,
626 	0x2498, 0xffffffff, 0x00150014,
627 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
628 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
629 	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
630 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
631 	0x000c, 0xffffffff, 0x0000001c,
632 	0x000d, 0x000f0000, 0x000f0000,
633 	0x0583, 0xffffffff, 0x00000100,
634 	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
635 	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
636 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
637 	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
638 	0x157a, 0x00000001, 0x00000001,
639 	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
640 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
641 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
642 	0x3430, 0xfffffff0, 0x00000100,
643 	0x3630, 0xfffffff0, 0x00000100,
644 };
645 
646 static const u32 verde_mgcg_cgcg_init[] =
647 {
648 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
649 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
650 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
651 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
652 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
653 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
654 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
655 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
656 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
657 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
658 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
659 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
660 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
661 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
662 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
663 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
664 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
665 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
666 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
667 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
668 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
669 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
670 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
671 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
672 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
673 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
674 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
675 	0x2458, 0xffffffff, 0x00010000,
676 	0x2459, 0xffffffff, 0x00030002,
677 	0x245a, 0xffffffff, 0x00040007,
678 	0x245b, 0xffffffff, 0x00060005,
679 	0x245c, 0xffffffff, 0x00090008,
680 	0x245d, 0xffffffff, 0x00020001,
681 	0x245e, 0xffffffff, 0x00040003,
682 	0x245f, 0xffffffff, 0x00000007,
683 	0x2460, 0xffffffff, 0x00060005,
684 	0x2461, 0xffffffff, 0x00090008,
685 	0x2462, 0xffffffff, 0x00030002,
686 	0x2463, 0xffffffff, 0x00050004,
687 	0x2464, 0xffffffff, 0x00000008,
688 	0x2465, 0xffffffff, 0x00070006,
689 	0x2466, 0xffffffff, 0x000a0009,
690 	0x2467, 0xffffffff, 0x00040003,
691 	0x2468, 0xffffffff, 0x00060005,
692 	0x2469, 0xffffffff, 0x00000009,
693 	0x246a, 0xffffffff, 0x00080007,
694 	0x246b, 0xffffffff, 0x000b000a,
695 	0x246c, 0xffffffff, 0x00050004,
696 	0x246d, 0xffffffff, 0x00070006,
697 	0x246e, 0xffffffff, 0x0008000b,
698 	0x246f, 0xffffffff, 0x000a0009,
699 	0x2470, 0xffffffff, 0x000d000c,
700 	0x2480, 0xffffffff, 0x00090008,
701 	0x2481, 0xffffffff, 0x000b000a,
702 	0x2482, 0xffffffff, 0x000c000f,
703 	0x2483, 0xffffffff, 0x000e000d,
704 	0x2484, 0xffffffff, 0x00110010,
705 	0x2485, 0xffffffff, 0x000a0009,
706 	0x2486, 0xffffffff, 0x000c000b,
707 	0x2487, 0xffffffff, 0x0000000f,
708 	0x2488, 0xffffffff, 0x000e000d,
709 	0x2489, 0xffffffff, 0x00110010,
710 	0x248a, 0xffffffff, 0x000b000a,
711 	0x248b, 0xffffffff, 0x000d000c,
712 	0x248c, 0xffffffff, 0x00000010,
713 	0x248d, 0xffffffff, 0x000f000e,
714 	0x248e, 0xffffffff, 0x00120011,
715 	0x248f, 0xffffffff, 0x000c000b,
716 	0x2490, 0xffffffff, 0x000e000d,
717 	0x2491, 0xffffffff, 0x00000011,
718 	0x2492, 0xffffffff, 0x0010000f,
719 	0x2493, 0xffffffff, 0x00130012,
720 	0x2494, 0xffffffff, 0x000d000c,
721 	0x2495, 0xffffffff, 0x000f000e,
722 	0x2496, 0xffffffff, 0x00100013,
723 	0x2497, 0xffffffff, 0x00120011,
724 	0x2498, 0xffffffff, 0x00150014,
725 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
726 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
727 	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
728 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
729 	0x000c, 0xffffffff, 0x0000001c,
730 	0x000d, 0x000f0000, 0x000f0000,
731 	0x0583, 0xffffffff, 0x00000100,
732 	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
733 	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
734 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
735 	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
736 	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
737 	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
738 	0x157a, 0x00000001, 0x00000001,
739 	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
740 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
741 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
742 	0x3430, 0xfffffff0, 0x00000100,
743 	0x3630, 0xfffffff0, 0x00000100,
744 };
745 
746 static const u32 oland_mgcg_cgcg_init[] =
747 {
748 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
749 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
750 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
751 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
752 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
753 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
754 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
755 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
756 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
757 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
758 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
759 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
760 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
761 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
762 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
763 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
764 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
765 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
766 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
767 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
768 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
769 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
770 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
771 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
772 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
773 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
774 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
775 	0x2458, 0xffffffff, 0x00010000,
776 	0x2459, 0xffffffff, 0x00030002,
777 	0x245a, 0xffffffff, 0x00040007,
778 	0x245b, 0xffffffff, 0x00060005,
779 	0x245c, 0xffffffff, 0x00090008,
780 	0x245d, 0xffffffff, 0x00020001,
781 	0x245e, 0xffffffff, 0x00040003,
782 	0x245f, 0xffffffff, 0x00000007,
783 	0x2460, 0xffffffff, 0x00060005,
784 	0x2461, 0xffffffff, 0x00090008,
785 	0x2462, 0xffffffff, 0x00030002,
786 	0x2463, 0xffffffff, 0x00050004,
787 	0x2464, 0xffffffff, 0x00000008,
788 	0x2465, 0xffffffff, 0x00070006,
789 	0x2466, 0xffffffff, 0x000a0009,
790 	0x2467, 0xffffffff, 0x00040003,
791 	0x2468, 0xffffffff, 0x00060005,
792 	0x2469, 0xffffffff, 0x00000009,
793 	0x246a, 0xffffffff, 0x00080007,
794 	0x246b, 0xffffffff, 0x000b000a,
795 	0x246c, 0xffffffff, 0x00050004,
796 	0x246d, 0xffffffff, 0x00070006,
797 	0x246e, 0xffffffff, 0x0008000b,
798 	0x246f, 0xffffffff, 0x000a0009,
799 	0x2470, 0xffffffff, 0x000d000c,
800 	0x2471, 0xffffffff, 0x00060005,
801 	0x2472, 0xffffffff, 0x00080007,
802 	0x2473, 0xffffffff, 0x0000000b,
803 	0x2474, 0xffffffff, 0x000a0009,
804 	0x2475, 0xffffffff, 0x000d000c,
805 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
806 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
807 	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
808 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
809 	0x000c, 0xffffffff, 0x0000001c,
810 	0x000d, 0x000f0000, 0x000f0000,
811 	0x0583, 0xffffffff, 0x00000100,
812 	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
813 	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
814 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
815 	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
816 	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
817 	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
818 	0x157a, 0x00000001, 0x00000001,
819 	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
820 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
821 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
822 	0x3430, 0xfffffff0, 0x00000100,
823 	0x3630, 0xfffffff0, 0x00000100,
824 };
825 
826 static const u32 hainan_mgcg_cgcg_init[] =
827 {
828 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
829 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
830 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
831 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
832 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
833 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
834 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
835 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
836 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
837 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
838 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
839 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
840 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
841 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
842 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
843 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
844 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
845 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
846 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
847 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
848 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
849 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
850 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
851 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
852 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
853 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
854 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
855 	0x2458, 0xffffffff, 0x00010000,
856 	0x2459, 0xffffffff, 0x00030002,
857 	0x245a, 0xffffffff, 0x00040007,
858 	0x245b, 0xffffffff, 0x00060005,
859 	0x245c, 0xffffffff, 0x00090008,
860 	0x245d, 0xffffffff, 0x00020001,
861 	0x245e, 0xffffffff, 0x00040003,
862 	0x245f, 0xffffffff, 0x00000007,
863 	0x2460, 0xffffffff, 0x00060005,
864 	0x2461, 0xffffffff, 0x00090008,
865 	0x2462, 0xffffffff, 0x00030002,
866 	0x2463, 0xffffffff, 0x00050004,
867 	0x2464, 0xffffffff, 0x00000008,
868 	0x2465, 0xffffffff, 0x00070006,
869 	0x2466, 0xffffffff, 0x000a0009,
870 	0x2467, 0xffffffff, 0x00040003,
871 	0x2468, 0xffffffff, 0x00060005,
872 	0x2469, 0xffffffff, 0x00000009,
873 	0x246a, 0xffffffff, 0x00080007,
874 	0x246b, 0xffffffff, 0x000b000a,
875 	0x246c, 0xffffffff, 0x00050004,
876 	0x246d, 0xffffffff, 0x00070006,
877 	0x246e, 0xffffffff, 0x0008000b,
878 	0x246f, 0xffffffff, 0x000a0009,
879 	0x2470, 0xffffffff, 0x000d000c,
880 	0x2471, 0xffffffff, 0x00060005,
881 	0x2472, 0xffffffff, 0x00080007,
882 	0x2473, 0xffffffff, 0x0000000b,
883 	0x2474, 0xffffffff, 0x000a0009,
884 	0x2475, 0xffffffff, 0x000d000c,
885 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
886 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
887 	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
888 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
889 	0x000c, 0xffffffff, 0x0000001c,
890 	0x000d, 0x000f0000, 0x000f0000,
891 	0x0583, 0xffffffff, 0x00000100,
892 	0x0409, 0xffffffff, 0x00000100,
893 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
894 	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
895 	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
896 	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
897 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
898 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
899 	0x3430, 0xfffffff0, 0x00000100,
900 	0x3630, 0xfffffff0, 0x00000100,
901 };
902 
903 static u32 si_pcie_rreg(struct amdgpu_device *adev, u32 reg)
904 {
905 	unsigned long flags;
906 	u32 r;
907 
908 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
909 	WREG32(AMDGPU_PCIE_INDEX, reg);
910 	(void)RREG32(AMDGPU_PCIE_INDEX);
911 	r = RREG32(AMDGPU_PCIE_DATA);
912 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
913 	return r;
914 }
915 
916 static void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
917 {
918 	unsigned long flags;
919 
920 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
921 	WREG32(AMDGPU_PCIE_INDEX, reg);
922 	(void)RREG32(AMDGPU_PCIE_INDEX);
923 	WREG32(AMDGPU_PCIE_DATA, v);
924 	(void)RREG32(AMDGPU_PCIE_DATA);
925 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
926 }
927 
928 static u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
929 {
930 	unsigned long flags;
931 	u32 r;
932 
933 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
934 	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
935 	(void)RREG32(PCIE_PORT_INDEX);
936 	r = RREG32(PCIE_PORT_DATA);
937 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
938 	return r;
939 }
940 
941 static void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
942 {
943 	unsigned long flags;
944 
945 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
946 	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
947 	(void)RREG32(PCIE_PORT_INDEX);
948 	WREG32(PCIE_PORT_DATA, (v));
949 	(void)RREG32(PCIE_PORT_DATA);
950 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
951 }
952 
953 static u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg)
954 {
955 	unsigned long flags;
956 	u32 r;
957 
958 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
959 	WREG32(SMC_IND_INDEX_0, (reg));
960 	r = RREG32(SMC_IND_DATA_0);
961 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
962 	return r;
963 }
964 
965 static void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
966 {
967 	unsigned long flags;
968 
969 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
970 	WREG32(SMC_IND_INDEX_0, (reg));
971 	WREG32(SMC_IND_DATA_0, (v));
972 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
973 }
974 
975 static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = {
976 	{GRBM_STATUS},
977 	{GB_ADDR_CONFIG},
978 	{MC_ARB_RAMCFG},
979 	{GB_TILE_MODE0},
980 	{GB_TILE_MODE1},
981 	{GB_TILE_MODE2},
982 	{GB_TILE_MODE3},
983 	{GB_TILE_MODE4},
984 	{GB_TILE_MODE5},
985 	{GB_TILE_MODE6},
986 	{GB_TILE_MODE7},
987 	{GB_TILE_MODE8},
988 	{GB_TILE_MODE9},
989 	{GB_TILE_MODE10},
990 	{GB_TILE_MODE11},
991 	{GB_TILE_MODE12},
992 	{GB_TILE_MODE13},
993 	{GB_TILE_MODE14},
994 	{GB_TILE_MODE15},
995 	{GB_TILE_MODE16},
996 	{GB_TILE_MODE17},
997 	{GB_TILE_MODE18},
998 	{GB_TILE_MODE19},
999 	{GB_TILE_MODE20},
1000 	{GB_TILE_MODE21},
1001 	{GB_TILE_MODE22},
1002 	{GB_TILE_MODE23},
1003 	{GB_TILE_MODE24},
1004 	{GB_TILE_MODE25},
1005 	{GB_TILE_MODE26},
1006 	{GB_TILE_MODE27},
1007 	{GB_TILE_MODE28},
1008 	{GB_TILE_MODE29},
1009 	{GB_TILE_MODE30},
1010 	{GB_TILE_MODE31},
1011 	{CC_RB_BACKEND_DISABLE, true},
1012 	{GC_USER_RB_BACKEND_DISABLE, true},
1013 	{PA_SC_RASTER_CONFIG, true},
1014 };
1015 
1016 static uint32_t si_get_register_value(struct amdgpu_device *adev,
1017 				      bool indexed, u32 se_num,
1018 				      u32 sh_num, u32 reg_offset)
1019 {
1020 	if (indexed) {
1021 		uint32_t val;
1022 		unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
1023 		unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
1024 
1025 		switch (reg_offset) {
1026 		case mmCC_RB_BACKEND_DISABLE:
1027 			return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
1028 		case mmGC_USER_RB_BACKEND_DISABLE:
1029 			return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
1030 		case mmPA_SC_RASTER_CONFIG:
1031 			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
1032 		}
1033 
1034 		mutex_lock(&adev->grbm_idx_mutex);
1035 		if (se_num != 0xffffffff || sh_num != 0xffffffff)
1036 			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
1037 
1038 		val = RREG32(reg_offset);
1039 
1040 		if (se_num != 0xffffffff || sh_num != 0xffffffff)
1041 			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1042 		mutex_unlock(&adev->grbm_idx_mutex);
1043 		return val;
1044 	} else {
1045 		unsigned idx;
1046 
1047 		switch (reg_offset) {
1048 		case mmGB_ADDR_CONFIG:
1049 			return adev->gfx.config.gb_addr_config;
1050 		case mmMC_ARB_RAMCFG:
1051 			return adev->gfx.config.mc_arb_ramcfg;
1052 		case mmGB_TILE_MODE0:
1053 		case mmGB_TILE_MODE1:
1054 		case mmGB_TILE_MODE2:
1055 		case mmGB_TILE_MODE3:
1056 		case mmGB_TILE_MODE4:
1057 		case mmGB_TILE_MODE5:
1058 		case mmGB_TILE_MODE6:
1059 		case mmGB_TILE_MODE7:
1060 		case mmGB_TILE_MODE8:
1061 		case mmGB_TILE_MODE9:
1062 		case mmGB_TILE_MODE10:
1063 		case mmGB_TILE_MODE11:
1064 		case mmGB_TILE_MODE12:
1065 		case mmGB_TILE_MODE13:
1066 		case mmGB_TILE_MODE14:
1067 		case mmGB_TILE_MODE15:
1068 		case mmGB_TILE_MODE16:
1069 		case mmGB_TILE_MODE17:
1070 		case mmGB_TILE_MODE18:
1071 		case mmGB_TILE_MODE19:
1072 		case mmGB_TILE_MODE20:
1073 		case mmGB_TILE_MODE21:
1074 		case mmGB_TILE_MODE22:
1075 		case mmGB_TILE_MODE23:
1076 		case mmGB_TILE_MODE24:
1077 		case mmGB_TILE_MODE25:
1078 		case mmGB_TILE_MODE26:
1079 		case mmGB_TILE_MODE27:
1080 		case mmGB_TILE_MODE28:
1081 		case mmGB_TILE_MODE29:
1082 		case mmGB_TILE_MODE30:
1083 		case mmGB_TILE_MODE31:
1084 			idx = (reg_offset - mmGB_TILE_MODE0);
1085 			return adev->gfx.config.tile_mode_array[idx];
1086 		default:
1087 			return RREG32(reg_offset);
1088 		}
1089 	}
1090 }
1091 static int si_read_register(struct amdgpu_device *adev, u32 se_num,
1092 			     u32 sh_num, u32 reg_offset, u32 *value)
1093 {
1094 	uint32_t i;
1095 
1096 	*value = 0;
1097 	for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) {
1098 		bool indexed = si_allowed_read_registers[i].grbm_indexed;
1099 
1100 		if (reg_offset != si_allowed_read_registers[i].reg_offset)
1101 			continue;
1102 
1103 		*value = si_get_register_value(adev, indexed, se_num, sh_num,
1104 					       reg_offset);
1105 		return 0;
1106 	}
1107 	return -EINVAL;
1108 }
1109 
1110 static bool si_read_disabled_bios(struct amdgpu_device *adev)
1111 {
1112 	u32 bus_cntl;
1113 	u32 d1vga_control = 0;
1114 	u32 d2vga_control = 0;
1115 	u32 vga_render_control = 0;
1116 	u32 rom_cntl;
1117 	bool r;
1118 
1119 	bus_cntl = RREG32(R600_BUS_CNTL);
1120 	if (adev->mode_info.num_crtc) {
1121 		d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
1122 		d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
1123 		vga_render_control = RREG32(VGA_RENDER_CONTROL);
1124 	}
1125 	rom_cntl = RREG32(R600_ROM_CNTL);
1126 
1127 	/* enable the rom */
1128 	WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
1129 	if (adev->mode_info.num_crtc) {
1130 		/* Disable VGA mode */
1131 		WREG32(AVIVO_D1VGA_CONTROL,
1132 		       (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1133 					  AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1134 		WREG32(AVIVO_D2VGA_CONTROL,
1135 		       (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1136 					  AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1137 		WREG32(VGA_RENDER_CONTROL,
1138 		       (vga_render_control & C_000300_VGA_VSTATUS_CNTL));
1139 	}
1140 	WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
1141 
1142 	r = amdgpu_read_bios(adev);
1143 
1144 	/* restore regs */
1145 	WREG32(R600_BUS_CNTL, bus_cntl);
1146 	if (adev->mode_info.num_crtc) {
1147 		WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
1148 		WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
1149 		WREG32(VGA_RENDER_CONTROL, vga_render_control);
1150 	}
1151 	WREG32(R600_ROM_CNTL, rom_cntl);
1152 	return r;
1153 }
1154 
1155 #define mmROM_INDEX 0x2A
1156 #define mmROM_DATA  0x2B
1157 
1158 static bool si_read_bios_from_rom(struct amdgpu_device *adev,
1159 				  u8 *bios, u32 length_bytes)
1160 {
1161 	u32 *dw_ptr;
1162 	u32 i, length_dw;
1163 
1164 	if (bios == NULL)
1165 		return false;
1166 	if (length_bytes == 0)
1167 		return false;
1168 	/* APU vbios image is part of sbios image */
1169 	if (adev->flags & AMD_IS_APU)
1170 		return false;
1171 
1172 	dw_ptr = (u32 *)bios;
1173 	length_dw = ALIGN(length_bytes, 4) / 4;
1174 	/* set rom index to 0 */
1175 	WREG32(mmROM_INDEX, 0);
1176 	for (i = 0; i < length_dw; i++)
1177 		dw_ptr[i] = RREG32(mmROM_DATA);
1178 
1179 	return true;
1180 }
1181 
1182 //xxx: not implemented
1183 static int si_asic_reset(struct amdgpu_device *adev)
1184 {
1185 	return 0;
1186 }
1187 
1188 static u32 si_get_config_memsize(struct amdgpu_device *adev)
1189 {
1190 	return RREG32(mmCONFIG_MEMSIZE);
1191 }
1192 
1193 static void si_vga_set_state(struct amdgpu_device *adev, bool state)
1194 {
1195 	uint32_t temp;
1196 
1197 	temp = RREG32(CONFIG_CNTL);
1198 	if (state == false) {
1199 		temp &= ~(1<<0);
1200 		temp |= (1<<1);
1201 	} else {
1202 		temp &= ~(1<<1);
1203 	}
1204 	WREG32(CONFIG_CNTL, temp);
1205 }
1206 
1207 static u32 si_get_xclk(struct amdgpu_device *adev)
1208 {
1209         u32 reference_clock = adev->clock.spll.reference_freq;
1210 	u32 tmp;
1211 
1212 	tmp = RREG32(CG_CLKPIN_CNTL_2);
1213 	if (tmp & MUX_TCLK_TO_XCLK)
1214 		return TCLK;
1215 
1216 	tmp = RREG32(CG_CLKPIN_CNTL);
1217 	if (tmp & XTALIN_DIVIDE)
1218 		return reference_clock / 4;
1219 
1220 	return reference_clock;
1221 }
1222 
1223 //xxx:not implemented
1224 static int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1225 {
1226 	return 0;
1227 }
1228 
1229 static void si_detect_hw_virtualization(struct amdgpu_device *adev)
1230 {
1231 	if (is_virtual_machine()) /* passthrough mode */
1232 		adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE;
1233 }
1234 
1235 static void si_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
1236 {
1237 	if (!ring || !ring->funcs->emit_wreg) {
1238 		WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1239 		RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
1240 	} else {
1241 		amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1242 	}
1243 }
1244 
1245 static void si_invalidate_hdp(struct amdgpu_device *adev,
1246 			      struct amdgpu_ring *ring)
1247 {
1248 	if (!ring || !ring->funcs->emit_wreg) {
1249 		WREG32(mmHDP_DEBUG0, 1);
1250 		RREG32(mmHDP_DEBUG0);
1251 	} else {
1252 		amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
1253 	}
1254 }
1255 
1256 static bool si_need_full_reset(struct amdgpu_device *adev)
1257 {
1258 	/* change this when we support soft reset */
1259 	return true;
1260 }
1261 
1262 static bool si_need_reset_on_init(struct amdgpu_device *adev)
1263 {
1264 	return false;
1265 }
1266 
1267 static int si_get_pcie_lanes(struct amdgpu_device *adev)
1268 {
1269 	u32 link_width_cntl;
1270 
1271 	if (adev->flags & AMD_IS_APU)
1272 		return 0;
1273 
1274 	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1275 
1276 	switch ((link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT) {
1277 	case LC_LINK_WIDTH_X1:
1278 		return 1;
1279 	case LC_LINK_WIDTH_X2:
1280 		return 2;
1281 	case LC_LINK_WIDTH_X4:
1282 		return 4;
1283 	case LC_LINK_WIDTH_X8:
1284 		return 8;
1285 	case LC_LINK_WIDTH_X0:
1286 	case LC_LINK_WIDTH_X16:
1287 	default:
1288 		return 16;
1289 	}
1290 }
1291 
1292 static void si_set_pcie_lanes(struct amdgpu_device *adev, int lanes)
1293 {
1294 	u32 link_width_cntl, mask;
1295 
1296 	if (adev->flags & AMD_IS_APU)
1297 		return;
1298 
1299 	switch (lanes) {
1300 	case 0:
1301 		mask = LC_LINK_WIDTH_X0;
1302 		break;
1303 	case 1:
1304 		mask = LC_LINK_WIDTH_X1;
1305 		break;
1306 	case 2:
1307 		mask = LC_LINK_WIDTH_X2;
1308 		break;
1309 	case 4:
1310 		mask = LC_LINK_WIDTH_X4;
1311 		break;
1312 	case 8:
1313 		mask = LC_LINK_WIDTH_X8;
1314 		break;
1315 	case 16:
1316 		mask = LC_LINK_WIDTH_X16;
1317 		break;
1318 	default:
1319 		DRM_ERROR("invalid pcie lane request: %d\n", lanes);
1320 		return;
1321 	}
1322 
1323 	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1324 	link_width_cntl &= ~LC_LINK_WIDTH_MASK;
1325 	link_width_cntl |= mask << LC_LINK_WIDTH_SHIFT;
1326 	link_width_cntl |= (LC_RECONFIG_NOW |
1327 			    LC_RECONFIG_ARC_MISSING_ESCAPE);
1328 
1329 	WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
1330 }
1331 
1332 static void si_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
1333 			      uint64_t *count1)
1334 {
1335 	uint32_t perfctr = 0;
1336 	uint64_t cnt0_of, cnt1_of;
1337 	int tmp;
1338 
1339 	/* This reports 0 on APUs, so return to avoid writing/reading registers
1340 	 * that may or may not be different from their GPU counterparts
1341 	 */
1342         if (adev->flags & AMD_IS_APU)
1343                 return;
1344 
1345 	/* Set the 2 events that we wish to watch, defined above */
1346 	/* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
1347 	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
1348 	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
1349 
1350 	/* Write to enable desired perf counters */
1351 	WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
1352 	/* Zero out and enable the perf counters
1353 	 * Write 0x5:
1354 	 * Bit 0 = Start all counters(1)
1355 	 * Bit 2 = Global counter reset enable(1)
1356 	 */
1357 	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
1358 
1359 	msleep(1000);
1360 
1361 	/* Load the shadow and disable the perf counters
1362 	 * Write 0x2:
1363 	 * Bit 0 = Stop counters(0)
1364 	 * Bit 1 = Load the shadow counters(1)
1365 	 */
1366 	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
1367 
1368 	/* Read register values to get any >32bit overflow */
1369 	tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
1370 	cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
1371 	cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
1372 
1373 	/* Get the values and add the overflow */
1374 	*count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
1375 	*count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
1376 }
1377 
1378 static const struct amdgpu_asic_funcs si_asic_funcs =
1379 {
1380 	.read_disabled_bios = &si_read_disabled_bios,
1381 	.read_bios_from_rom = &si_read_bios_from_rom,
1382 	.read_register = &si_read_register,
1383 	.reset = &si_asic_reset,
1384 	.set_vga_state = &si_vga_set_state,
1385 	.get_xclk = &si_get_xclk,
1386 	.set_uvd_clocks = &si_set_uvd_clocks,
1387 	.set_vce_clocks = NULL,
1388 	.get_pcie_lanes = &si_get_pcie_lanes,
1389 	.set_pcie_lanes = &si_set_pcie_lanes,
1390 	.get_config_memsize = &si_get_config_memsize,
1391 	.flush_hdp = &si_flush_hdp,
1392 	.invalidate_hdp = &si_invalidate_hdp,
1393 	.need_full_reset = &si_need_full_reset,
1394 	.get_pcie_usage = &si_get_pcie_usage,
1395 	.need_reset_on_init = &si_need_reset_on_init,
1396 };
1397 
1398 static uint32_t si_get_rev_id(struct amdgpu_device *adev)
1399 {
1400 	return (RREG32(CC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1401 		>> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1402 }
1403 
1404 static int si_common_early_init(void *handle)
1405 {
1406 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1407 
1408 	adev->smc_rreg = &si_smc_rreg;
1409 	adev->smc_wreg = &si_smc_wreg;
1410 	adev->pcie_rreg = &si_pcie_rreg;
1411 	adev->pcie_wreg = &si_pcie_wreg;
1412 	adev->pciep_rreg = &si_pciep_rreg;
1413 	adev->pciep_wreg = &si_pciep_wreg;
1414 	adev->uvd_ctx_rreg = NULL;
1415 	adev->uvd_ctx_wreg = NULL;
1416 	adev->didt_rreg = NULL;
1417 	adev->didt_wreg = NULL;
1418 
1419 	adev->asic_funcs = &si_asic_funcs;
1420 
1421 	adev->rev_id = si_get_rev_id(adev);
1422 	adev->external_rev_id = 0xFF;
1423 	switch (adev->asic_type) {
1424 	case CHIP_TAHITI:
1425 		adev->cg_flags =
1426 			AMD_CG_SUPPORT_GFX_MGCG |
1427 			AMD_CG_SUPPORT_GFX_MGLS |
1428 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
1429 			AMD_CG_SUPPORT_GFX_CGLS |
1430 			AMD_CG_SUPPORT_GFX_CGTS |
1431 			AMD_CG_SUPPORT_GFX_CP_LS |
1432 			AMD_CG_SUPPORT_MC_MGCG |
1433 			AMD_CG_SUPPORT_SDMA_MGCG |
1434 			AMD_CG_SUPPORT_BIF_LS |
1435 			AMD_CG_SUPPORT_VCE_MGCG |
1436 			AMD_CG_SUPPORT_UVD_MGCG |
1437 			AMD_CG_SUPPORT_HDP_LS |
1438 			AMD_CG_SUPPORT_HDP_MGCG;
1439 		adev->pg_flags = 0;
1440 		adev->external_rev_id = (adev->rev_id == 0) ? 1 :
1441 					(adev->rev_id == 1) ? 5 : 6;
1442 		break;
1443 	case CHIP_PITCAIRN:
1444 		adev->cg_flags =
1445 			AMD_CG_SUPPORT_GFX_MGCG |
1446 			AMD_CG_SUPPORT_GFX_MGLS |
1447 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
1448 			AMD_CG_SUPPORT_GFX_CGLS |
1449 			AMD_CG_SUPPORT_GFX_CGTS |
1450 			AMD_CG_SUPPORT_GFX_CP_LS |
1451 			AMD_CG_SUPPORT_GFX_RLC_LS |
1452 			AMD_CG_SUPPORT_MC_LS |
1453 			AMD_CG_SUPPORT_MC_MGCG |
1454 			AMD_CG_SUPPORT_SDMA_MGCG |
1455 			AMD_CG_SUPPORT_BIF_LS |
1456 			AMD_CG_SUPPORT_VCE_MGCG |
1457 			AMD_CG_SUPPORT_UVD_MGCG |
1458 			AMD_CG_SUPPORT_HDP_LS |
1459 			AMD_CG_SUPPORT_HDP_MGCG;
1460 		adev->pg_flags = 0;
1461 		adev->external_rev_id = adev->rev_id + 20;
1462 		break;
1463 
1464 	case CHIP_VERDE:
1465 		adev->cg_flags =
1466 			AMD_CG_SUPPORT_GFX_MGCG |
1467 			AMD_CG_SUPPORT_GFX_MGLS |
1468 			AMD_CG_SUPPORT_GFX_CGLS |
1469 			AMD_CG_SUPPORT_GFX_CGTS |
1470 			AMD_CG_SUPPORT_GFX_CGTS_LS |
1471 			AMD_CG_SUPPORT_GFX_CP_LS |
1472 			AMD_CG_SUPPORT_MC_LS |
1473 			AMD_CG_SUPPORT_MC_MGCG |
1474 			AMD_CG_SUPPORT_SDMA_MGCG |
1475 			AMD_CG_SUPPORT_SDMA_LS |
1476 			AMD_CG_SUPPORT_BIF_LS |
1477 			AMD_CG_SUPPORT_VCE_MGCG |
1478 			AMD_CG_SUPPORT_UVD_MGCG |
1479 			AMD_CG_SUPPORT_HDP_LS |
1480 			AMD_CG_SUPPORT_HDP_MGCG;
1481 		adev->pg_flags = 0;
1482 		//???
1483 		adev->external_rev_id = adev->rev_id + 40;
1484 		break;
1485 	case CHIP_OLAND:
1486 		adev->cg_flags =
1487 			AMD_CG_SUPPORT_GFX_MGCG |
1488 			AMD_CG_SUPPORT_GFX_MGLS |
1489 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
1490 			AMD_CG_SUPPORT_GFX_CGLS |
1491 			AMD_CG_SUPPORT_GFX_CGTS |
1492 			AMD_CG_SUPPORT_GFX_CP_LS |
1493 			AMD_CG_SUPPORT_GFX_RLC_LS |
1494 			AMD_CG_SUPPORT_MC_LS |
1495 			AMD_CG_SUPPORT_MC_MGCG |
1496 			AMD_CG_SUPPORT_SDMA_MGCG |
1497 			AMD_CG_SUPPORT_BIF_LS |
1498 			AMD_CG_SUPPORT_UVD_MGCG |
1499 			AMD_CG_SUPPORT_HDP_LS |
1500 			AMD_CG_SUPPORT_HDP_MGCG;
1501 		adev->pg_flags = 0;
1502 		adev->external_rev_id = 60;
1503 		break;
1504 	case CHIP_HAINAN:
1505 		adev->cg_flags =
1506 			AMD_CG_SUPPORT_GFX_MGCG |
1507 			AMD_CG_SUPPORT_GFX_MGLS |
1508 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
1509 			AMD_CG_SUPPORT_GFX_CGLS |
1510 			AMD_CG_SUPPORT_GFX_CGTS |
1511 			AMD_CG_SUPPORT_GFX_CP_LS |
1512 			AMD_CG_SUPPORT_GFX_RLC_LS |
1513 			AMD_CG_SUPPORT_MC_LS |
1514 			AMD_CG_SUPPORT_MC_MGCG |
1515 			AMD_CG_SUPPORT_SDMA_MGCG |
1516 			AMD_CG_SUPPORT_BIF_LS |
1517 			AMD_CG_SUPPORT_HDP_LS |
1518 			AMD_CG_SUPPORT_HDP_MGCG;
1519 		adev->pg_flags = 0;
1520 		adev->external_rev_id = 70;
1521 		break;
1522 
1523 	default:
1524 		return -EINVAL;
1525 	}
1526 
1527 	return 0;
1528 }
1529 
1530 static int si_common_sw_init(void *handle)
1531 {
1532 	return 0;
1533 }
1534 
1535 static int si_common_sw_fini(void *handle)
1536 {
1537 	return 0;
1538 }
1539 
1540 
1541 static void si_init_golden_registers(struct amdgpu_device *adev)
1542 {
1543 	switch (adev->asic_type) {
1544 	case CHIP_TAHITI:
1545 		amdgpu_device_program_register_sequence(adev,
1546 							tahiti_golden_registers,
1547 							ARRAY_SIZE(tahiti_golden_registers));
1548 		amdgpu_device_program_register_sequence(adev,
1549 							tahiti_golden_rlc_registers,
1550 							ARRAY_SIZE(tahiti_golden_rlc_registers));
1551 		amdgpu_device_program_register_sequence(adev,
1552 							tahiti_mgcg_cgcg_init,
1553 							ARRAY_SIZE(tahiti_mgcg_cgcg_init));
1554 		amdgpu_device_program_register_sequence(adev,
1555 							tahiti_golden_registers2,
1556 							ARRAY_SIZE(tahiti_golden_registers2));
1557 		break;
1558 	case CHIP_PITCAIRN:
1559 		amdgpu_device_program_register_sequence(adev,
1560 							pitcairn_golden_registers,
1561 							ARRAY_SIZE(pitcairn_golden_registers));
1562 		amdgpu_device_program_register_sequence(adev,
1563 							pitcairn_golden_rlc_registers,
1564 							ARRAY_SIZE(pitcairn_golden_rlc_registers));
1565 		amdgpu_device_program_register_sequence(adev,
1566 							pitcairn_mgcg_cgcg_init,
1567 							ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
1568 		break;
1569 	case CHIP_VERDE:
1570 		amdgpu_device_program_register_sequence(adev,
1571 							verde_golden_registers,
1572 							ARRAY_SIZE(verde_golden_registers));
1573 		amdgpu_device_program_register_sequence(adev,
1574 							verde_golden_rlc_registers,
1575 							ARRAY_SIZE(verde_golden_rlc_registers));
1576 		amdgpu_device_program_register_sequence(adev,
1577 							verde_mgcg_cgcg_init,
1578 							ARRAY_SIZE(verde_mgcg_cgcg_init));
1579 		amdgpu_device_program_register_sequence(adev,
1580 							verde_pg_init,
1581 							ARRAY_SIZE(verde_pg_init));
1582 		break;
1583 	case CHIP_OLAND:
1584 		amdgpu_device_program_register_sequence(adev,
1585 							oland_golden_registers,
1586 							ARRAY_SIZE(oland_golden_registers));
1587 		amdgpu_device_program_register_sequence(adev,
1588 							oland_golden_rlc_registers,
1589 							ARRAY_SIZE(oland_golden_rlc_registers));
1590 		amdgpu_device_program_register_sequence(adev,
1591 							oland_mgcg_cgcg_init,
1592 							ARRAY_SIZE(oland_mgcg_cgcg_init));
1593 		break;
1594 	case CHIP_HAINAN:
1595 		amdgpu_device_program_register_sequence(adev,
1596 							hainan_golden_registers,
1597 							ARRAY_SIZE(hainan_golden_registers));
1598 		amdgpu_device_program_register_sequence(adev,
1599 							hainan_golden_registers2,
1600 							ARRAY_SIZE(hainan_golden_registers2));
1601 		amdgpu_device_program_register_sequence(adev,
1602 							hainan_mgcg_cgcg_init,
1603 							ARRAY_SIZE(hainan_mgcg_cgcg_init));
1604 		break;
1605 
1606 
1607 	default:
1608 		BUG();
1609 	}
1610 }
1611 
1612 static void si_pcie_gen3_enable(struct amdgpu_device *adev)
1613 {
1614 	struct pci_dev *root = adev->pdev->bus->self;
1615 	int bridge_pos, gpu_pos;
1616 	u32 speed_cntl, current_data_rate;
1617 	int i;
1618 	u16 tmp16;
1619 
1620 	if (pci_is_root_bus(adev->pdev->bus))
1621 		return;
1622 
1623 	if (amdgpu_pcie_gen2 == 0)
1624 		return;
1625 
1626 	if (adev->flags & AMD_IS_APU)
1627 		return;
1628 
1629 	if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
1630 					CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
1631 		return;
1632 
1633 	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1634 	current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
1635 		LC_CURRENT_DATA_RATE_SHIFT;
1636 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1637 		if (current_data_rate == 2) {
1638 			DRM_INFO("PCIE gen 3 link speeds already enabled\n");
1639 			return;
1640 		}
1641 		DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
1642 	} else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
1643 		if (current_data_rate == 1) {
1644 			DRM_INFO("PCIE gen 2 link speeds already enabled\n");
1645 			return;
1646 		}
1647 		DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
1648 	}
1649 
1650 	bridge_pos = pci_pcie_cap(root);
1651 	if (!bridge_pos)
1652 		return;
1653 
1654 	gpu_pos = pci_pcie_cap(adev->pdev);
1655 	if (!gpu_pos)
1656 		return;
1657 
1658 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1659 		if (current_data_rate != 2) {
1660 			u16 bridge_cfg, gpu_cfg;
1661 			u16 bridge_cfg2, gpu_cfg2;
1662 			u32 max_lw, current_lw, tmp;
1663 
1664 			pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1665 			pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1666 
1667 			tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
1668 			pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1669 
1670 			tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
1671 			pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1672 
1673 			tmp = RREG32_PCIE(PCIE_LC_STATUS1);
1674 			max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
1675 			current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
1676 
1677 			if (current_lw < max_lw) {
1678 				tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1679 				if (tmp & LC_RENEGOTIATION_SUPPORT) {
1680 					tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
1681 					tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
1682 					tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
1683 					WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
1684 				}
1685 			}
1686 
1687 			for (i = 0; i < 10; i++) {
1688 				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
1689 				if (tmp16 & PCI_EXP_DEVSTA_TRPND)
1690 					break;
1691 
1692 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1693 				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1694 
1695 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
1696 				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
1697 
1698 				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1699 				tmp |= LC_SET_QUIESCE;
1700 				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1701 
1702 				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1703 				tmp |= LC_REDO_EQ;
1704 				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1705 
1706 				mdelay(100);
1707 
1708 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
1709 				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1710 				tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
1711 				pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1712 
1713 				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
1714 				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1715 				tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
1716 				pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1717 
1718 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
1719 				tmp16 &= ~((1 << 4) | (7 << 9));
1720 				tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
1721 				pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
1722 
1723 				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1724 				tmp16 &= ~((1 << 4) | (7 << 9));
1725 				tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
1726 				pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1727 
1728 				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1729 				tmp &= ~LC_SET_QUIESCE;
1730 				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1731 			}
1732 		}
1733 	}
1734 
1735 	speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
1736 	speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
1737 	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1738 
1739 	pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1740 	tmp16 &= ~0xf;
1741 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
1742 		tmp16 |= 3;
1743 	else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
1744 		tmp16 |= 2;
1745 	else
1746 		tmp16 |= 1;
1747 	pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1748 
1749 	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1750 	speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
1751 	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1752 
1753 	for (i = 0; i < adev->usec_timeout; i++) {
1754 		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1755 		if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
1756 			break;
1757 		udelay(1);
1758 	}
1759 }
1760 
1761 static inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg)
1762 {
1763 	unsigned long flags;
1764 	u32 r;
1765 
1766 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1767 	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1768 	r = RREG32(EVERGREEN_PIF_PHY0_DATA);
1769 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1770 	return r;
1771 }
1772 
1773 static inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1774 {
1775 	unsigned long flags;
1776 
1777 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1778 	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1779 	WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
1780 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1781 }
1782 
1783 static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
1784 {
1785 	unsigned long flags;
1786 	u32 r;
1787 
1788 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1789 	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1790 	r = RREG32(EVERGREEN_PIF_PHY1_DATA);
1791 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1792 	return r;
1793 }
1794 
1795 static inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1796 {
1797 	unsigned long flags;
1798 
1799 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1800 	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1801 	WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
1802 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1803 }
1804 static void si_program_aspm(struct amdgpu_device *adev)
1805 {
1806 	u32 data, orig;
1807 	bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
1808 	bool disable_clkreq = false;
1809 
1810 	if (amdgpu_aspm == 0)
1811 		return;
1812 
1813 	if (adev->flags & AMD_IS_APU)
1814 		return;
1815 	orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
1816 	data &= ~LC_XMIT_N_FTS_MASK;
1817 	data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
1818 	if (orig != data)
1819 		WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
1820 
1821 	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
1822 	data |= LC_GO_TO_RECOVERY;
1823 	if (orig != data)
1824 		WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
1825 
1826 	orig = data = RREG32_PCIE(PCIE_P_CNTL);
1827 	data |= P_IGNORE_EDB_ERR;
1828 	if (orig != data)
1829 		WREG32_PCIE(PCIE_P_CNTL, data);
1830 
1831 	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
1832 	data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
1833 	data |= LC_PMI_TO_L1_DIS;
1834 	if (!disable_l0s)
1835 		data |= LC_L0S_INACTIVITY(7);
1836 
1837 	if (!disable_l1) {
1838 		data |= LC_L1_INACTIVITY(7);
1839 		data &= ~LC_PMI_TO_L1_DIS;
1840 		if (orig != data)
1841 			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1842 
1843 		if (!disable_plloff_in_l1) {
1844 			bool clk_req_support;
1845 
1846 			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1847 			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1848 			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1849 			if (orig != data)
1850 				si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1851 
1852 			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1853 			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1854 			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1855 			if (orig != data)
1856 				si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1857 
1858 			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1859 			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1860 			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1861 			if (orig != data)
1862 				si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1863 
1864 			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1865 			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1866 			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1867 			if (orig != data)
1868 				si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1869 
1870 			if ((adev->family != CHIP_OLAND) && (adev->family != CHIP_HAINAN)) {
1871 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1872 				data &= ~PLL_RAMP_UP_TIME_0_MASK;
1873 				if (orig != data)
1874 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1875 
1876 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1877 				data &= ~PLL_RAMP_UP_TIME_1_MASK;
1878 				if (orig != data)
1879 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1880 
1881 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2);
1882 				data &= ~PLL_RAMP_UP_TIME_2_MASK;
1883 				if (orig != data)
1884 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data);
1885 
1886 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3);
1887 				data &= ~PLL_RAMP_UP_TIME_3_MASK;
1888 				if (orig != data)
1889 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data);
1890 
1891 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1892 				data &= ~PLL_RAMP_UP_TIME_0_MASK;
1893 				if (orig != data)
1894 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1895 
1896 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1897 				data &= ~PLL_RAMP_UP_TIME_1_MASK;
1898 				if (orig != data)
1899 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1900 
1901 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2);
1902 				data &= ~PLL_RAMP_UP_TIME_2_MASK;
1903 				if (orig != data)
1904 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data);
1905 
1906 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3);
1907 				data &= ~PLL_RAMP_UP_TIME_3_MASK;
1908 				if (orig != data)
1909 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data);
1910 			}
1911 			orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1912 			data &= ~LC_DYN_LANES_PWR_STATE_MASK;
1913 			data |= LC_DYN_LANES_PWR_STATE(3);
1914 			if (orig != data)
1915 				WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
1916 
1917 			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL);
1918 			data &= ~LS2_EXIT_TIME_MASK;
1919 			if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
1920 				data |= LS2_EXIT_TIME(5);
1921 			if (orig != data)
1922 				si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data);
1923 
1924 			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL);
1925 			data &= ~LS2_EXIT_TIME_MASK;
1926 			if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
1927 				data |= LS2_EXIT_TIME(5);
1928 			if (orig != data)
1929 				si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data);
1930 
1931 			if (!disable_clkreq &&
1932 			    !pci_is_root_bus(adev->pdev->bus)) {
1933 				struct pci_dev *root = adev->pdev->bus->self;
1934 				u32 lnkcap;
1935 
1936 				clk_req_support = false;
1937 				pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
1938 				if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
1939 					clk_req_support = true;
1940 			} else {
1941 				clk_req_support = false;
1942 			}
1943 
1944 			if (clk_req_support) {
1945 				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
1946 				data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
1947 				if (orig != data)
1948 					WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
1949 
1950 				orig = data = RREG32(THM_CLK_CNTL);
1951 				data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
1952 				data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
1953 				if (orig != data)
1954 					WREG32(THM_CLK_CNTL, data);
1955 
1956 				orig = data = RREG32(MISC_CLK_CNTL);
1957 				data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
1958 				data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
1959 				if (orig != data)
1960 					WREG32(MISC_CLK_CNTL, data);
1961 
1962 				orig = data = RREG32(CG_CLKPIN_CNTL);
1963 				data &= ~BCLK_AS_XCLK;
1964 				if (orig != data)
1965 					WREG32(CG_CLKPIN_CNTL, data);
1966 
1967 				orig = data = RREG32(CG_CLKPIN_CNTL_2);
1968 				data &= ~FORCE_BIF_REFCLK_EN;
1969 				if (orig != data)
1970 					WREG32(CG_CLKPIN_CNTL_2, data);
1971 
1972 				orig = data = RREG32(MPLL_BYPASSCLK_SEL);
1973 				data &= ~MPLL_CLKOUT_SEL_MASK;
1974 				data |= MPLL_CLKOUT_SEL(4);
1975 				if (orig != data)
1976 					WREG32(MPLL_BYPASSCLK_SEL, data);
1977 
1978 				orig = data = RREG32(SPLL_CNTL_MODE);
1979 				data &= ~SPLL_REFCLK_SEL_MASK;
1980 				if (orig != data)
1981 					WREG32(SPLL_CNTL_MODE, data);
1982 			}
1983 		}
1984 	} else {
1985 		if (orig != data)
1986 			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1987 	}
1988 
1989 	orig = data = RREG32_PCIE(PCIE_CNTL2);
1990 	data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
1991 	if (orig != data)
1992 		WREG32_PCIE(PCIE_CNTL2, data);
1993 
1994 	if (!disable_l0s) {
1995 		data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
1996 		if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
1997 			data = RREG32_PCIE(PCIE_LC_STATUS1);
1998 			if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
1999 				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
2000 				data &= ~LC_L0S_INACTIVITY_MASK;
2001 				if (orig != data)
2002 					WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2003 			}
2004 		}
2005 	}
2006 }
2007 
2008 static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
2009 {
2010 	int readrq;
2011 	u16 v;
2012 
2013 	readrq = pcie_get_readrq(adev->pdev);
2014 	v = ffs(readrq) - 8;
2015 	if ((v == 0) || (v == 6) || (v == 7))
2016 		pcie_set_readrq(adev->pdev, 512);
2017 }
2018 
2019 static int si_common_hw_init(void *handle)
2020 {
2021 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2022 
2023 	si_fix_pci_max_read_req_size(adev);
2024 	si_init_golden_registers(adev);
2025 	si_pcie_gen3_enable(adev);
2026 	si_program_aspm(adev);
2027 
2028 	return 0;
2029 }
2030 
2031 static int si_common_hw_fini(void *handle)
2032 {
2033 	return 0;
2034 }
2035 
2036 static int si_common_suspend(void *handle)
2037 {
2038 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2039 
2040 	return si_common_hw_fini(adev);
2041 }
2042 
2043 static int si_common_resume(void *handle)
2044 {
2045 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2046 
2047 	return si_common_hw_init(adev);
2048 }
2049 
2050 static bool si_common_is_idle(void *handle)
2051 {
2052 	return true;
2053 }
2054 
2055 static int si_common_wait_for_idle(void *handle)
2056 {
2057 	return 0;
2058 }
2059 
2060 static int si_common_soft_reset(void *handle)
2061 {
2062 	return 0;
2063 }
2064 
2065 static int si_common_set_clockgating_state(void *handle,
2066 					    enum amd_clockgating_state state)
2067 {
2068 	return 0;
2069 }
2070 
2071 static int si_common_set_powergating_state(void *handle,
2072 					    enum amd_powergating_state state)
2073 {
2074 	return 0;
2075 }
2076 
2077 static const struct amd_ip_funcs si_common_ip_funcs = {
2078 	.name = "si_common",
2079 	.early_init = si_common_early_init,
2080 	.late_init = NULL,
2081 	.sw_init = si_common_sw_init,
2082 	.sw_fini = si_common_sw_fini,
2083 	.hw_init = si_common_hw_init,
2084 	.hw_fini = si_common_hw_fini,
2085 	.suspend = si_common_suspend,
2086 	.resume = si_common_resume,
2087 	.is_idle = si_common_is_idle,
2088 	.wait_for_idle = si_common_wait_for_idle,
2089 	.soft_reset = si_common_soft_reset,
2090 	.set_clockgating_state = si_common_set_clockgating_state,
2091 	.set_powergating_state = si_common_set_powergating_state,
2092 };
2093 
2094 static const struct amdgpu_ip_block_version si_common_ip_block =
2095 {
2096 	.type = AMD_IP_BLOCK_TYPE_COMMON,
2097 	.major = 1,
2098 	.minor = 0,
2099 	.rev = 0,
2100 	.funcs = &si_common_ip_funcs,
2101 };
2102 
2103 int si_set_ip_blocks(struct amdgpu_device *adev)
2104 {
2105 	si_detect_hw_virtualization(adev);
2106 
2107 	switch (adev->asic_type) {
2108 	case CHIP_VERDE:
2109 	case CHIP_TAHITI:
2110 	case CHIP_PITCAIRN:
2111 		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2112 		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2113 		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2114 		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2115 		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2116 		amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2117 		if (adev->enable_virtual_display)
2118 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2119 		else
2120 			amdgpu_device_ip_block_add(adev, &dce_v6_0_ip_block);
2121 		/* amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block); */
2122 		/* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2123 		break;
2124 	case CHIP_OLAND:
2125 		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2126 		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2127 		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2128 		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2129 		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2130 		amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2131 		if (adev->enable_virtual_display)
2132 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2133 		else
2134 			amdgpu_device_ip_block_add(adev, &dce_v6_4_ip_block);
2135 
2136 		/* amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block); */
2137 		/* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2138 		break;
2139 	case CHIP_HAINAN:
2140 		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2141 		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2142 		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2143 		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2144 		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2145 		amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2146 		if (adev->enable_virtual_display)
2147 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2148 		break;
2149 	default:
2150 		BUG();
2151 	}
2152 	return 0;
2153 }
2154 
2155