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