2 * Copyright 2015 Advanced Micro Devices, Inc.
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:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
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.
24 #include <linux/firmware.h>
25 #include <linux/slab.h>
26 #include <linux/module.h>
29 #include "amdgpu_atombios.h"
30 #include "amdgpu_ih.h"
31 #include "amdgpu_uvd.h"
32 #include "amdgpu_vce.h"
34 #include "amdgpu_powerplay.h"
42 #include "dce_virtual.h"
43 #include "gca/gfx_6_0_d.h"
44 #include "oss/oss_1_0_d.h"
45 #include "gmc/gmc_6_0_d.h"
46 #include "dce/dce_6_0_d.h"
47 #include "uvd/uvd_4_0_d.h"
49 static const u32 tahiti_golden_registers[] =
51 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
52 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
53 mmDB_DEBUG, 0xffffffff, 0x00000000,
54 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
55 mmDB_DEBUG3, 0x0002021c, 0x00020200,
56 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
57 0x340c, 0x000000c0, 0x00800040,
58 0x360c, 0x000000c0, 0x00800040,
59 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
60 mmFBC_MISC, 0x00200000, 0x50100000,
61 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
62 mmMC_ARB_WTM_CNTL_RD, 0x00000003, 0x000007ff,
63 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
64 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
65 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
66 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
67 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
68 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
69 0x000c, 0xffffffff, 0x0040,
70 0x000d, 0x00000040, 0x00004040,
71 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
72 mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
73 mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
74 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
75 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
76 mmTCP_ADDR_CONFIG, 0x00000200, 0x000002fb,
77 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x0000543b,
78 mmTCP_CHAN_STEER_LO, 0xffffffff, 0xa9210876,
79 mmVGT_FIFO_DEPTHS, 0xffffffff, 0x000fff40,
80 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
81 mmVM_CONTEXT0_CNTL, 0x20000000, 0x20fffed8,
82 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
83 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
84 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
85 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
86 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
89 static const u32 tahiti_golden_registers2[] =
91 mmMCIF_MEM_CONTROL, 0x00000001, 0x00000001,
94 static const u32 tahiti_golden_rlc_registers[] =
96 mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
97 mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
98 0x311f, 0xffffffff, 0x10104040,
99 0x3122, 0xffffffff, 0x0100000a,
100 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
101 mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
102 mmUVD_CGC_GATE, 0x00000008, 0x00000000,
105 static const u32 pitcairn_golden_registers[] =
107 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
108 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
109 mmDB_DEBUG, 0xffffffff, 0x00000000,
110 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
111 mmDB_DEBUG3, 0x0002021c, 0x00020200,
112 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
113 0x340c, 0x000300c0, 0x00800040,
114 0x360c, 0x000300c0, 0x00800040,
115 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
116 mmFBC_MISC, 0x00200000, 0x50100000,
117 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
118 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
119 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
120 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
121 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
122 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
123 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
124 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
125 0x000c, 0xffffffff, 0x0040,
126 0x000d, 0x00000040, 0x00004040,
127 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
128 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
129 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
130 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7,
131 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
132 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x32761054,
133 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
134 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
135 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
136 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
137 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
138 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
141 static const u32 pitcairn_golden_rlc_registers[] =
143 mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
144 mmRLC_LB_PARAMS, 0xffffffff, 0x00601004,
145 0x311f, 0xffffffff, 0x10102020,
146 0x3122, 0xffffffff, 0x01000020,
147 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
148 mmRLC_LB_CNTL, 0xffffffff, 0x800000a4,
151 static const u32 verde_pg_init[] =
153 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x40000,
154 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x200010ff,
155 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
156 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
157 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
158 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
159 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
160 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x7007,
161 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x300010ff,
162 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
163 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
164 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
165 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
166 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
167 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x400000,
168 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x100010ff,
169 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
170 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
171 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
172 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
173 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
174 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x120200,
175 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x500010ff,
176 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
177 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
178 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
179 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
180 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
181 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x1e1e16,
182 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x600010ff,
183 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
184 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
185 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
186 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
187 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
188 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x171f1e,
189 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x700010ff,
190 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
191 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
192 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
193 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
194 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
195 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
196 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x9ff,
197 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x0,
198 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10000800,
199 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
200 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
201 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4,
202 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1000051e,
203 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
204 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
205 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x8,
206 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x80500,
207 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x12,
208 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x9050c,
209 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1d,
210 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xb052c,
211 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2a,
212 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1053e,
213 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2d,
214 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10546,
215 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x30,
216 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xa054e,
217 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3c,
218 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1055f,
219 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3f,
220 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10567,
221 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x42,
222 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1056f,
223 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x45,
224 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10572,
225 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x48,
226 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20575,
227 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4c,
228 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x190801,
229 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x67,
230 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1082a,
231 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x6a,
232 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1b082d,
233 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x87,
234 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x310851,
235 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xba,
236 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x891,
237 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbc,
238 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x893,
239 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbe,
240 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20895,
241 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc2,
242 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20899,
243 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc6,
244 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2089d,
245 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xca,
246 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a1,
247 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xcc,
248 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a3,
249 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xce,
250 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x308a5,
251 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xd3,
252 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x6d08cd,
253 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x142,
254 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2000095a,
255 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1,
256 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x144,
257 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x301f095b,
258 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x165,
259 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc094d,
260 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x173,
261 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf096d,
262 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x184,
263 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x15097f,
264 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x19b,
265 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc0998,
266 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1a9,
267 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x409a7,
268 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1af,
269 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xcdc,
270 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1b1,
271 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x800,
272 mmGMCON_RENG_EXECUTE, 0xffffffff, 0x6c9b2000,
273 mmGMCON_MISC2, 0xfc00, 0x2000,
274 mmGMCON_MISC3, 0xffffffff, 0xfc0,
275 mmMC_PMG_AUTO_CFG, 0x00000100, 0x100,
278 static const u32 verde_golden_rlc_registers[] =
280 mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
281 mmRLC_LB_PARAMS, 0xffffffff, 0x033f1005,
282 0x311f, 0xffffffff, 0x10808020,
283 0x3122, 0xffffffff, 0x00800008,
284 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00001000,
285 mmRLC_LB_CNTL, 0xffffffff, 0x80010014,
288 static const u32 verde_golden_registers[] =
290 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
291 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
292 mmDB_DEBUG, 0xffffffff, 0x00000000,
293 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
294 mmDB_DEBUG3, 0x0002021c, 0x00020200,
295 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
296 0x340c, 0x000300c0, 0x00800040,
297 0x360c, 0x000300c0, 0x00800040,
298 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
299 mmFBC_MISC, 0x00200000, 0x50100000,
300 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
301 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
302 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
303 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
304 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
305 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
306 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
307 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x0000124a,
308 0x000c, 0xffffffff, 0x0040,
309 0x000d, 0x00000040, 0x00004040,
310 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
311 mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
312 mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
313 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
314 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
315 mmTCP_ADDR_CONFIG, 0x000003ff, 0x00000003,
316 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
317 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00001032,
318 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
319 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
320 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
321 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
322 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
323 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
326 static const u32 oland_golden_registers[] =
328 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
329 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
330 mmDB_DEBUG, 0xffffffff, 0x00000000,
331 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
332 mmDB_DEBUG3, 0x0002021c, 0x00020200,
333 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
334 0x340c, 0x000300c0, 0x00800040,
335 0x360c, 0x000300c0, 0x00800040,
336 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
337 mmFBC_MISC, 0x00200000, 0x50100000,
338 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
339 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
340 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
341 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
342 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
343 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
344 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
345 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000082,
346 0x000c, 0xffffffff, 0x0040,
347 0x000d, 0x00000040, 0x00004040,
348 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
349 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
350 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
351 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f3,
352 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
353 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
354 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
355 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
356 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
357 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
358 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
359 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
363 static const u32 oland_golden_rlc_registers[] =
365 mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
366 mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
367 0x311f, 0xffffffff, 0x10104040,
368 0x3122, 0xffffffff, 0x0100000a,
369 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
370 mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
373 static const u32 hainan_golden_registers[] =
375 0x17bc, 0x00000030, 0x00000011,
376 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
377 mmDB_DEBUG, 0xffffffff, 0x00000000,
378 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
379 mmDB_DEBUG3, 0x0002021c, 0x00020200,
380 0x031e, 0x00000080, 0x00000000,
381 0x3430, 0xff000fff, 0x00000100,
382 0x340c, 0x000300c0, 0x00800040,
383 0x3630, 0xff000fff, 0x00000100,
384 0x360c, 0x000300c0, 0x00800040,
385 0x16ec, 0x000000f0, 0x00000070,
386 0x16f0, 0x00200000, 0x50100000,
387 0x1c0c, 0x31000311, 0x00000011,
388 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
389 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
390 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
391 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
392 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
393 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
394 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000000,
395 0x000c, 0xffffffff, 0x0040,
396 0x000d, 0x00000040, 0x00004040,
397 mmSPI_CONFIG_CNTL, 0x03e00000, 0x03600000,
398 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
399 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
400 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f1,
401 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
402 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
403 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
404 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
405 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
406 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
407 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
408 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
411 static const u32 hainan_golden_registers2[] =
413 mmGB_ADDR_CONFIG, 0xffffffff, 0x2011003,
416 static const u32 tahiti_mgcg_cgcg_init[] =
418 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
419 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
420 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
421 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
422 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
423 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
424 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
425 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
426 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
427 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
428 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
429 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
430 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
431 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
432 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
433 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
434 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
435 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
436 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
437 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
438 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
439 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
440 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
441 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
442 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
443 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
444 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
445 0x2458, 0xffffffff, 0x00010000,
446 0x2459, 0xffffffff, 0x00030002,
447 0x245a, 0xffffffff, 0x00040007,
448 0x245b, 0xffffffff, 0x00060005,
449 0x245c, 0xffffffff, 0x00090008,
450 0x245d, 0xffffffff, 0x00020001,
451 0x245e, 0xffffffff, 0x00040003,
452 0x245f, 0xffffffff, 0x00000007,
453 0x2460, 0xffffffff, 0x00060005,
454 0x2461, 0xffffffff, 0x00090008,
455 0x2462, 0xffffffff, 0x00030002,
456 0x2463, 0xffffffff, 0x00050004,
457 0x2464, 0xffffffff, 0x00000008,
458 0x2465, 0xffffffff, 0x00070006,
459 0x2466, 0xffffffff, 0x000a0009,
460 0x2467, 0xffffffff, 0x00040003,
461 0x2468, 0xffffffff, 0x00060005,
462 0x2469, 0xffffffff, 0x00000009,
463 0x246a, 0xffffffff, 0x00080007,
464 0x246b, 0xffffffff, 0x000b000a,
465 0x246c, 0xffffffff, 0x00050004,
466 0x246d, 0xffffffff, 0x00070006,
467 0x246e, 0xffffffff, 0x0008000b,
468 0x246f, 0xffffffff, 0x000a0009,
469 0x2470, 0xffffffff, 0x000d000c,
470 0x2471, 0xffffffff, 0x00060005,
471 0x2472, 0xffffffff, 0x00080007,
472 0x2473, 0xffffffff, 0x0000000b,
473 0x2474, 0xffffffff, 0x000a0009,
474 0x2475, 0xffffffff, 0x000d000c,
475 0x2476, 0xffffffff, 0x00070006,
476 0x2477, 0xffffffff, 0x00090008,
477 0x2478, 0xffffffff, 0x0000000c,
478 0x2479, 0xffffffff, 0x000b000a,
479 0x247a, 0xffffffff, 0x000e000d,
480 0x247b, 0xffffffff, 0x00080007,
481 0x247c, 0xffffffff, 0x000a0009,
482 0x247d, 0xffffffff, 0x0000000d,
483 0x247e, 0xffffffff, 0x000c000b,
484 0x247f, 0xffffffff, 0x000f000e,
485 0x2480, 0xffffffff, 0x00090008,
486 0x2481, 0xffffffff, 0x000b000a,
487 0x2482, 0xffffffff, 0x000c000f,
488 0x2483, 0xffffffff, 0x000e000d,
489 0x2484, 0xffffffff, 0x00110010,
490 0x2485, 0xffffffff, 0x000a0009,
491 0x2486, 0xffffffff, 0x000c000b,
492 0x2487, 0xffffffff, 0x0000000f,
493 0x2488, 0xffffffff, 0x000e000d,
494 0x2489, 0xffffffff, 0x00110010,
495 0x248a, 0xffffffff, 0x000b000a,
496 0x248b, 0xffffffff, 0x000d000c,
497 0x248c, 0xffffffff, 0x00000010,
498 0x248d, 0xffffffff, 0x000f000e,
499 0x248e, 0xffffffff, 0x00120011,
500 0x248f, 0xffffffff, 0x000c000b,
501 0x2490, 0xffffffff, 0x000e000d,
502 0x2491, 0xffffffff, 0x00000011,
503 0x2492, 0xffffffff, 0x0010000f,
504 0x2493, 0xffffffff, 0x00130012,
505 0x2494, 0xffffffff, 0x000d000c,
506 0x2495, 0xffffffff, 0x000f000e,
507 0x2496, 0xffffffff, 0x00100013,
508 0x2497, 0xffffffff, 0x00120011,
509 0x2498, 0xffffffff, 0x00150014,
510 0x2499, 0xffffffff, 0x000e000d,
511 0x249a, 0xffffffff, 0x0010000f,
512 0x249b, 0xffffffff, 0x00000013,
513 0x249c, 0xffffffff, 0x00120011,
514 0x249d, 0xffffffff, 0x00150014,
515 0x249e, 0xffffffff, 0x000f000e,
516 0x249f, 0xffffffff, 0x00110010,
517 0x24a0, 0xffffffff, 0x00000014,
518 0x24a1, 0xffffffff, 0x00130012,
519 0x24a2, 0xffffffff, 0x00160015,
520 0x24a3, 0xffffffff, 0x0010000f,
521 0x24a4, 0xffffffff, 0x00120011,
522 0x24a5, 0xffffffff, 0x00000015,
523 0x24a6, 0xffffffff, 0x00140013,
524 0x24a7, 0xffffffff, 0x00170016,
525 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
526 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
527 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
528 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
529 0x000c, 0xffffffff, 0x0000001c,
530 0x000d, 0x000f0000, 0x000f0000,
531 0x0583, 0xffffffff, 0x00000100,
532 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
533 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
534 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
535 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
536 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
537 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
538 0x157a, 0x00000001, 0x00000001,
539 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
540 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
541 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
542 0x3430, 0xfffffff0, 0x00000100,
543 0x3630, 0xfffffff0, 0x00000100,
545 static const u32 pitcairn_mgcg_cgcg_init[] =
547 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
548 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
549 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
550 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
551 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
552 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
553 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
554 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
555 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
556 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
557 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
558 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
559 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
560 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
561 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
562 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
563 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
564 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
565 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
566 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
567 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
568 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
569 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
570 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
571 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
572 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
573 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
574 0x2458, 0xffffffff, 0x00010000,
575 0x2459, 0xffffffff, 0x00030002,
576 0x245a, 0xffffffff, 0x00040007,
577 0x245b, 0xffffffff, 0x00060005,
578 0x245c, 0xffffffff, 0x00090008,
579 0x245d, 0xffffffff, 0x00020001,
580 0x245e, 0xffffffff, 0x00040003,
581 0x245f, 0xffffffff, 0x00000007,
582 0x2460, 0xffffffff, 0x00060005,
583 0x2461, 0xffffffff, 0x00090008,
584 0x2462, 0xffffffff, 0x00030002,
585 0x2463, 0xffffffff, 0x00050004,
586 0x2464, 0xffffffff, 0x00000008,
587 0x2465, 0xffffffff, 0x00070006,
588 0x2466, 0xffffffff, 0x000a0009,
589 0x2467, 0xffffffff, 0x00040003,
590 0x2468, 0xffffffff, 0x00060005,
591 0x2469, 0xffffffff, 0x00000009,
592 0x246a, 0xffffffff, 0x00080007,
593 0x246b, 0xffffffff, 0x000b000a,
594 0x246c, 0xffffffff, 0x00050004,
595 0x246d, 0xffffffff, 0x00070006,
596 0x246e, 0xffffffff, 0x0008000b,
597 0x246f, 0xffffffff, 0x000a0009,
598 0x2470, 0xffffffff, 0x000d000c,
599 0x2480, 0xffffffff, 0x00090008,
600 0x2481, 0xffffffff, 0x000b000a,
601 0x2482, 0xffffffff, 0x000c000f,
602 0x2483, 0xffffffff, 0x000e000d,
603 0x2484, 0xffffffff, 0x00110010,
604 0x2485, 0xffffffff, 0x000a0009,
605 0x2486, 0xffffffff, 0x000c000b,
606 0x2487, 0xffffffff, 0x0000000f,
607 0x2488, 0xffffffff, 0x000e000d,
608 0x2489, 0xffffffff, 0x00110010,
609 0x248a, 0xffffffff, 0x000b000a,
610 0x248b, 0xffffffff, 0x000d000c,
611 0x248c, 0xffffffff, 0x00000010,
612 0x248d, 0xffffffff, 0x000f000e,
613 0x248e, 0xffffffff, 0x00120011,
614 0x248f, 0xffffffff, 0x000c000b,
615 0x2490, 0xffffffff, 0x000e000d,
616 0x2491, 0xffffffff, 0x00000011,
617 0x2492, 0xffffffff, 0x0010000f,
618 0x2493, 0xffffffff, 0x00130012,
619 0x2494, 0xffffffff, 0x000d000c,
620 0x2495, 0xffffffff, 0x000f000e,
621 0x2496, 0xffffffff, 0x00100013,
622 0x2497, 0xffffffff, 0x00120011,
623 0x2498, 0xffffffff, 0x00150014,
624 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
625 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
626 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
627 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
628 0x000c, 0xffffffff, 0x0000001c,
629 0x000d, 0x000f0000, 0x000f0000,
630 0x0583, 0xffffffff, 0x00000100,
631 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
632 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
633 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
634 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
635 0x157a, 0x00000001, 0x00000001,
636 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
637 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
638 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
639 0x3430, 0xfffffff0, 0x00000100,
640 0x3630, 0xfffffff0, 0x00000100,
643 static const u32 verde_mgcg_cgcg_init[] =
645 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
646 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
647 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
648 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
649 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
650 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
651 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
652 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
653 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
654 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
655 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
656 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
657 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
658 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
659 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
660 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
661 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
662 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
663 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
664 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
665 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
666 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
667 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
668 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
669 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
670 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
671 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
672 0x2458, 0xffffffff, 0x00010000,
673 0x2459, 0xffffffff, 0x00030002,
674 0x245a, 0xffffffff, 0x00040007,
675 0x245b, 0xffffffff, 0x00060005,
676 0x245c, 0xffffffff, 0x00090008,
677 0x245d, 0xffffffff, 0x00020001,
678 0x245e, 0xffffffff, 0x00040003,
679 0x245f, 0xffffffff, 0x00000007,
680 0x2460, 0xffffffff, 0x00060005,
681 0x2461, 0xffffffff, 0x00090008,
682 0x2462, 0xffffffff, 0x00030002,
683 0x2463, 0xffffffff, 0x00050004,
684 0x2464, 0xffffffff, 0x00000008,
685 0x2465, 0xffffffff, 0x00070006,
686 0x2466, 0xffffffff, 0x000a0009,
687 0x2467, 0xffffffff, 0x00040003,
688 0x2468, 0xffffffff, 0x00060005,
689 0x2469, 0xffffffff, 0x00000009,
690 0x246a, 0xffffffff, 0x00080007,
691 0x246b, 0xffffffff, 0x000b000a,
692 0x246c, 0xffffffff, 0x00050004,
693 0x246d, 0xffffffff, 0x00070006,
694 0x246e, 0xffffffff, 0x0008000b,
695 0x246f, 0xffffffff, 0x000a0009,
696 0x2470, 0xffffffff, 0x000d000c,
697 0x2480, 0xffffffff, 0x00090008,
698 0x2481, 0xffffffff, 0x000b000a,
699 0x2482, 0xffffffff, 0x000c000f,
700 0x2483, 0xffffffff, 0x000e000d,
701 0x2484, 0xffffffff, 0x00110010,
702 0x2485, 0xffffffff, 0x000a0009,
703 0x2486, 0xffffffff, 0x000c000b,
704 0x2487, 0xffffffff, 0x0000000f,
705 0x2488, 0xffffffff, 0x000e000d,
706 0x2489, 0xffffffff, 0x00110010,
707 0x248a, 0xffffffff, 0x000b000a,
708 0x248b, 0xffffffff, 0x000d000c,
709 0x248c, 0xffffffff, 0x00000010,
710 0x248d, 0xffffffff, 0x000f000e,
711 0x248e, 0xffffffff, 0x00120011,
712 0x248f, 0xffffffff, 0x000c000b,
713 0x2490, 0xffffffff, 0x000e000d,
714 0x2491, 0xffffffff, 0x00000011,
715 0x2492, 0xffffffff, 0x0010000f,
716 0x2493, 0xffffffff, 0x00130012,
717 0x2494, 0xffffffff, 0x000d000c,
718 0x2495, 0xffffffff, 0x000f000e,
719 0x2496, 0xffffffff, 0x00100013,
720 0x2497, 0xffffffff, 0x00120011,
721 0x2498, 0xffffffff, 0x00150014,
722 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
723 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
724 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
725 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
726 0x000c, 0xffffffff, 0x0000001c,
727 0x000d, 0x000f0000, 0x000f0000,
728 0x0583, 0xffffffff, 0x00000100,
729 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
730 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
731 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
732 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
733 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
734 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
735 0x157a, 0x00000001, 0x00000001,
736 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
737 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
738 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
739 0x3430, 0xfffffff0, 0x00000100,
740 0x3630, 0xfffffff0, 0x00000100,
743 static const u32 oland_mgcg_cgcg_init[] =
745 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
746 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
747 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
748 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
749 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
750 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
751 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
752 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
753 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
754 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
755 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
756 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
757 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
758 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
759 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
760 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
761 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
762 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
763 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
764 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
765 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
766 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
767 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
768 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
769 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
770 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
771 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
772 0x2458, 0xffffffff, 0x00010000,
773 0x2459, 0xffffffff, 0x00030002,
774 0x245a, 0xffffffff, 0x00040007,
775 0x245b, 0xffffffff, 0x00060005,
776 0x245c, 0xffffffff, 0x00090008,
777 0x245d, 0xffffffff, 0x00020001,
778 0x245e, 0xffffffff, 0x00040003,
779 0x245f, 0xffffffff, 0x00000007,
780 0x2460, 0xffffffff, 0x00060005,
781 0x2461, 0xffffffff, 0x00090008,
782 0x2462, 0xffffffff, 0x00030002,
783 0x2463, 0xffffffff, 0x00050004,
784 0x2464, 0xffffffff, 0x00000008,
785 0x2465, 0xffffffff, 0x00070006,
786 0x2466, 0xffffffff, 0x000a0009,
787 0x2467, 0xffffffff, 0x00040003,
788 0x2468, 0xffffffff, 0x00060005,
789 0x2469, 0xffffffff, 0x00000009,
790 0x246a, 0xffffffff, 0x00080007,
791 0x246b, 0xffffffff, 0x000b000a,
792 0x246c, 0xffffffff, 0x00050004,
793 0x246d, 0xffffffff, 0x00070006,
794 0x246e, 0xffffffff, 0x0008000b,
795 0x246f, 0xffffffff, 0x000a0009,
796 0x2470, 0xffffffff, 0x000d000c,
797 0x2471, 0xffffffff, 0x00060005,
798 0x2472, 0xffffffff, 0x00080007,
799 0x2473, 0xffffffff, 0x0000000b,
800 0x2474, 0xffffffff, 0x000a0009,
801 0x2475, 0xffffffff, 0x000d000c,
802 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
803 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
804 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
805 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
806 0x000c, 0xffffffff, 0x0000001c,
807 0x000d, 0x000f0000, 0x000f0000,
808 0x0583, 0xffffffff, 0x00000100,
809 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
810 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
811 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
812 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
813 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
814 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
815 0x157a, 0x00000001, 0x00000001,
816 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
817 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
818 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
819 0x3430, 0xfffffff0, 0x00000100,
820 0x3630, 0xfffffff0, 0x00000100,
823 static const u32 hainan_mgcg_cgcg_init[] =
825 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
826 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
827 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
828 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
829 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
830 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
831 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
832 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
833 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
834 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
835 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
836 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
837 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
838 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
839 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
840 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
841 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
842 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
843 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
844 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
845 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
846 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
847 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
848 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
849 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
850 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
851 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
852 0x2458, 0xffffffff, 0x00010000,
853 0x2459, 0xffffffff, 0x00030002,
854 0x245a, 0xffffffff, 0x00040007,
855 0x245b, 0xffffffff, 0x00060005,
856 0x245c, 0xffffffff, 0x00090008,
857 0x245d, 0xffffffff, 0x00020001,
858 0x245e, 0xffffffff, 0x00040003,
859 0x245f, 0xffffffff, 0x00000007,
860 0x2460, 0xffffffff, 0x00060005,
861 0x2461, 0xffffffff, 0x00090008,
862 0x2462, 0xffffffff, 0x00030002,
863 0x2463, 0xffffffff, 0x00050004,
864 0x2464, 0xffffffff, 0x00000008,
865 0x2465, 0xffffffff, 0x00070006,
866 0x2466, 0xffffffff, 0x000a0009,
867 0x2467, 0xffffffff, 0x00040003,
868 0x2468, 0xffffffff, 0x00060005,
869 0x2469, 0xffffffff, 0x00000009,
870 0x246a, 0xffffffff, 0x00080007,
871 0x246b, 0xffffffff, 0x000b000a,
872 0x246c, 0xffffffff, 0x00050004,
873 0x246d, 0xffffffff, 0x00070006,
874 0x246e, 0xffffffff, 0x0008000b,
875 0x246f, 0xffffffff, 0x000a0009,
876 0x2470, 0xffffffff, 0x000d000c,
877 0x2471, 0xffffffff, 0x00060005,
878 0x2472, 0xffffffff, 0x00080007,
879 0x2473, 0xffffffff, 0x0000000b,
880 0x2474, 0xffffffff, 0x000a0009,
881 0x2475, 0xffffffff, 0x000d000c,
882 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
883 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
884 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
885 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
886 0x000c, 0xffffffff, 0x0000001c,
887 0x000d, 0x000f0000, 0x000f0000,
888 0x0583, 0xffffffff, 0x00000100,
889 0x0409, 0xffffffff, 0x00000100,
890 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
891 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
892 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
893 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
894 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
895 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
896 0x3430, 0xfffffff0, 0x00000100,
897 0x3630, 0xfffffff0, 0x00000100,
900 static u32 si_pcie_rreg(struct amdgpu_device *adev, u32 reg)
905 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
906 WREG32(AMDGPU_PCIE_INDEX, reg);
907 (void)RREG32(AMDGPU_PCIE_INDEX);
908 r = RREG32(AMDGPU_PCIE_DATA);
909 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
913 static void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
917 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
918 WREG32(AMDGPU_PCIE_INDEX, reg);
919 (void)RREG32(AMDGPU_PCIE_INDEX);
920 WREG32(AMDGPU_PCIE_DATA, v);
921 (void)RREG32(AMDGPU_PCIE_DATA);
922 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
925 static u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
930 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
931 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
932 (void)RREG32(PCIE_PORT_INDEX);
933 r = RREG32(PCIE_PORT_DATA);
934 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
938 static void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
942 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
943 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
944 (void)RREG32(PCIE_PORT_INDEX);
945 WREG32(PCIE_PORT_DATA, (v));
946 (void)RREG32(PCIE_PORT_DATA);
947 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
950 static u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg)
955 spin_lock_irqsave(&adev->smc_idx_lock, flags);
956 WREG32(SMC_IND_INDEX_0, (reg));
957 r = RREG32(SMC_IND_DATA_0);
958 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
962 static void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
966 spin_lock_irqsave(&adev->smc_idx_lock, flags);
967 WREG32(SMC_IND_INDEX_0, (reg));
968 WREG32(SMC_IND_DATA_0, (v));
969 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
972 static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = {
973 {GRBM_STATUS, false},
974 {GB_ADDR_CONFIG, false},
975 {MC_ARB_RAMCFG, false},
976 {GB_TILE_MODE0, false},
977 {GB_TILE_MODE1, false},
978 {GB_TILE_MODE2, false},
979 {GB_TILE_MODE3, false},
980 {GB_TILE_MODE4, false},
981 {GB_TILE_MODE5, false},
982 {GB_TILE_MODE6, false},
983 {GB_TILE_MODE7, false},
984 {GB_TILE_MODE8, false},
985 {GB_TILE_MODE9, false},
986 {GB_TILE_MODE10, false},
987 {GB_TILE_MODE11, false},
988 {GB_TILE_MODE12, false},
989 {GB_TILE_MODE13, false},
990 {GB_TILE_MODE14, false},
991 {GB_TILE_MODE15, false},
992 {GB_TILE_MODE16, false},
993 {GB_TILE_MODE17, false},
994 {GB_TILE_MODE18, false},
995 {GB_TILE_MODE19, false},
996 {GB_TILE_MODE20, false},
997 {GB_TILE_MODE21, false},
998 {GB_TILE_MODE22, false},
999 {GB_TILE_MODE23, false},
1000 {GB_TILE_MODE24, false},
1001 {GB_TILE_MODE25, false},
1002 {GB_TILE_MODE26, false},
1003 {GB_TILE_MODE27, false},
1004 {GB_TILE_MODE28, false},
1005 {GB_TILE_MODE29, false},
1006 {GB_TILE_MODE30, false},
1007 {GB_TILE_MODE31, false},
1008 {CC_RB_BACKEND_DISABLE, false, true},
1009 {GC_USER_RB_BACKEND_DISABLE, false, true},
1010 {PA_SC_RASTER_CONFIG, false, true},
1013 static uint32_t si_get_register_value(struct amdgpu_device *adev,
1014 bool indexed, u32 se_num,
1015 u32 sh_num, u32 reg_offset)
1019 unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
1020 unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
1022 switch (reg_offset) {
1023 case mmCC_RB_BACKEND_DISABLE:
1024 return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
1025 case mmGC_USER_RB_BACKEND_DISABLE:
1026 return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
1027 case mmPA_SC_RASTER_CONFIG:
1028 return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
1031 mutex_lock(&adev->grbm_idx_mutex);
1032 if (se_num != 0xffffffff || sh_num != 0xffffffff)
1033 amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
1035 val = RREG32(reg_offset);
1037 if (se_num != 0xffffffff || sh_num != 0xffffffff)
1038 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1039 mutex_unlock(&adev->grbm_idx_mutex);
1044 switch (reg_offset) {
1045 case mmGB_ADDR_CONFIG:
1046 return adev->gfx.config.gb_addr_config;
1047 case mmMC_ARB_RAMCFG:
1048 return adev->gfx.config.mc_arb_ramcfg;
1049 case mmGB_TILE_MODE0:
1050 case mmGB_TILE_MODE1:
1051 case mmGB_TILE_MODE2:
1052 case mmGB_TILE_MODE3:
1053 case mmGB_TILE_MODE4:
1054 case mmGB_TILE_MODE5:
1055 case mmGB_TILE_MODE6:
1056 case mmGB_TILE_MODE7:
1057 case mmGB_TILE_MODE8:
1058 case mmGB_TILE_MODE9:
1059 case mmGB_TILE_MODE10:
1060 case mmGB_TILE_MODE11:
1061 case mmGB_TILE_MODE12:
1062 case mmGB_TILE_MODE13:
1063 case mmGB_TILE_MODE14:
1064 case mmGB_TILE_MODE15:
1065 case mmGB_TILE_MODE16:
1066 case mmGB_TILE_MODE17:
1067 case mmGB_TILE_MODE18:
1068 case mmGB_TILE_MODE19:
1069 case mmGB_TILE_MODE20:
1070 case mmGB_TILE_MODE21:
1071 case mmGB_TILE_MODE22:
1072 case mmGB_TILE_MODE23:
1073 case mmGB_TILE_MODE24:
1074 case mmGB_TILE_MODE25:
1075 case mmGB_TILE_MODE26:
1076 case mmGB_TILE_MODE27:
1077 case mmGB_TILE_MODE28:
1078 case mmGB_TILE_MODE29:
1079 case mmGB_TILE_MODE30:
1080 case mmGB_TILE_MODE31:
1081 idx = (reg_offset - mmGB_TILE_MODE0);
1082 return adev->gfx.config.tile_mode_array[idx];
1084 return RREG32(reg_offset);
1088 static int si_read_register(struct amdgpu_device *adev, u32 se_num,
1089 u32 sh_num, u32 reg_offset, u32 *value)
1094 for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) {
1095 if (reg_offset != si_allowed_read_registers[i].reg_offset)
1098 if (!si_allowed_read_registers[i].untouched)
1099 *value = si_get_register_value(adev,
1100 si_allowed_read_registers[i].grbm_indexed,
1101 se_num, sh_num, reg_offset);
1107 static bool si_read_disabled_bios(struct amdgpu_device *adev)
1110 u32 d1vga_control = 0;
1111 u32 d2vga_control = 0;
1112 u32 vga_render_control = 0;
1116 bus_cntl = RREG32(R600_BUS_CNTL);
1117 if (adev->mode_info.num_crtc) {
1118 d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
1119 d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
1120 vga_render_control = RREG32(VGA_RENDER_CONTROL);
1122 rom_cntl = RREG32(R600_ROM_CNTL);
1124 /* enable the rom */
1125 WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
1126 if (adev->mode_info.num_crtc) {
1127 /* Disable VGA mode */
1128 WREG32(AVIVO_D1VGA_CONTROL,
1129 (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1130 AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1131 WREG32(AVIVO_D2VGA_CONTROL,
1132 (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1133 AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1134 WREG32(VGA_RENDER_CONTROL,
1135 (vga_render_control & C_000300_VGA_VSTATUS_CNTL));
1137 WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
1139 r = amdgpu_read_bios(adev);
1142 WREG32(R600_BUS_CNTL, bus_cntl);
1143 if (adev->mode_info.num_crtc) {
1144 WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
1145 WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
1146 WREG32(VGA_RENDER_CONTROL, vga_render_control);
1148 WREG32(R600_ROM_CNTL, rom_cntl);
1152 //xxx: not implemented
1153 static int si_asic_reset(struct amdgpu_device *adev)
1158 static void si_vga_set_state(struct amdgpu_device *adev, bool state)
1162 temp = RREG32(CONFIG_CNTL);
1163 if (state == false) {
1169 WREG32(CONFIG_CNTL, temp);
1172 static u32 si_get_xclk(struct amdgpu_device *adev)
1174 u32 reference_clock = adev->clock.spll.reference_freq;
1177 tmp = RREG32(CG_CLKPIN_CNTL_2);
1178 if (tmp & MUX_TCLK_TO_XCLK)
1181 tmp = RREG32(CG_CLKPIN_CNTL);
1182 if (tmp & XTALIN_DIVIDE)
1183 return reference_clock / 4;
1185 return reference_clock;
1188 //xxx:not implemented
1189 static int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1194 static void si_detect_hw_virtualization(struct amdgpu_device *adev)
1196 if (is_virtual_machine()) /* passthrough mode */
1197 adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE;
1200 static const struct amdgpu_asic_funcs si_asic_funcs =
1202 .read_disabled_bios = &si_read_disabled_bios,
1203 .read_register = &si_read_register,
1204 .reset = &si_asic_reset,
1205 .set_vga_state = &si_vga_set_state,
1206 .get_xclk = &si_get_xclk,
1207 .set_uvd_clocks = &si_set_uvd_clocks,
1208 .set_vce_clocks = NULL,
1211 static uint32_t si_get_rev_id(struct amdgpu_device *adev)
1213 return (RREG32(CC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1214 >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1217 static int si_common_early_init(void *handle)
1219 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1221 adev->smc_rreg = &si_smc_rreg;
1222 adev->smc_wreg = &si_smc_wreg;
1223 adev->pcie_rreg = &si_pcie_rreg;
1224 adev->pcie_wreg = &si_pcie_wreg;
1225 adev->pciep_rreg = &si_pciep_rreg;
1226 adev->pciep_wreg = &si_pciep_wreg;
1227 adev->uvd_ctx_rreg = NULL;
1228 adev->uvd_ctx_wreg = NULL;
1229 adev->didt_rreg = NULL;
1230 adev->didt_wreg = NULL;
1232 adev->asic_funcs = &si_asic_funcs;
1234 adev->rev_id = si_get_rev_id(adev);
1235 adev->external_rev_id = 0xFF;
1236 switch (adev->asic_type) {
1239 AMD_CG_SUPPORT_GFX_MGCG |
1240 AMD_CG_SUPPORT_GFX_MGLS |
1241 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1242 AMD_CG_SUPPORT_GFX_CGLS |
1243 AMD_CG_SUPPORT_GFX_CGTS |
1244 AMD_CG_SUPPORT_GFX_CP_LS |
1245 AMD_CG_SUPPORT_MC_MGCG |
1246 AMD_CG_SUPPORT_SDMA_MGCG |
1247 AMD_CG_SUPPORT_BIF_LS |
1248 AMD_CG_SUPPORT_VCE_MGCG |
1249 AMD_CG_SUPPORT_UVD_MGCG |
1250 AMD_CG_SUPPORT_HDP_LS |
1251 AMD_CG_SUPPORT_HDP_MGCG;
1253 adev->external_rev_id = (adev->rev_id == 0) ? 1 :
1254 (adev->rev_id == 1) ? 5 : 6;
1258 AMD_CG_SUPPORT_GFX_MGCG |
1259 AMD_CG_SUPPORT_GFX_MGLS |
1260 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1261 AMD_CG_SUPPORT_GFX_CGLS |
1262 AMD_CG_SUPPORT_GFX_CGTS |
1263 AMD_CG_SUPPORT_GFX_CP_LS |
1264 AMD_CG_SUPPORT_GFX_RLC_LS |
1265 AMD_CG_SUPPORT_MC_LS |
1266 AMD_CG_SUPPORT_MC_MGCG |
1267 AMD_CG_SUPPORT_SDMA_MGCG |
1268 AMD_CG_SUPPORT_BIF_LS |
1269 AMD_CG_SUPPORT_VCE_MGCG |
1270 AMD_CG_SUPPORT_UVD_MGCG |
1271 AMD_CG_SUPPORT_HDP_LS |
1272 AMD_CG_SUPPORT_HDP_MGCG;
1274 adev->external_rev_id = adev->rev_id + 20;
1279 AMD_CG_SUPPORT_GFX_MGCG |
1280 AMD_CG_SUPPORT_GFX_MGLS |
1281 AMD_CG_SUPPORT_GFX_CGLS |
1282 AMD_CG_SUPPORT_GFX_CGTS |
1283 AMD_CG_SUPPORT_GFX_CGTS_LS |
1284 AMD_CG_SUPPORT_GFX_CP_LS |
1285 AMD_CG_SUPPORT_MC_LS |
1286 AMD_CG_SUPPORT_MC_MGCG |
1287 AMD_CG_SUPPORT_SDMA_MGCG |
1288 AMD_CG_SUPPORT_SDMA_LS |
1289 AMD_CG_SUPPORT_BIF_LS |
1290 AMD_CG_SUPPORT_VCE_MGCG |
1291 AMD_CG_SUPPORT_UVD_MGCG |
1292 AMD_CG_SUPPORT_HDP_LS |
1293 AMD_CG_SUPPORT_HDP_MGCG;
1296 adev->external_rev_id = adev->rev_id + 40;
1300 AMD_CG_SUPPORT_GFX_MGCG |
1301 AMD_CG_SUPPORT_GFX_MGLS |
1302 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1303 AMD_CG_SUPPORT_GFX_CGLS |
1304 AMD_CG_SUPPORT_GFX_CGTS |
1305 AMD_CG_SUPPORT_GFX_CP_LS |
1306 AMD_CG_SUPPORT_GFX_RLC_LS |
1307 AMD_CG_SUPPORT_MC_LS |
1308 AMD_CG_SUPPORT_MC_MGCG |
1309 AMD_CG_SUPPORT_SDMA_MGCG |
1310 AMD_CG_SUPPORT_BIF_LS |
1311 AMD_CG_SUPPORT_UVD_MGCG |
1312 AMD_CG_SUPPORT_HDP_LS |
1313 AMD_CG_SUPPORT_HDP_MGCG;
1315 adev->external_rev_id = 60;
1319 AMD_CG_SUPPORT_GFX_MGCG |
1320 AMD_CG_SUPPORT_GFX_MGLS |
1321 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1322 AMD_CG_SUPPORT_GFX_CGLS |
1323 AMD_CG_SUPPORT_GFX_CGTS |
1324 AMD_CG_SUPPORT_GFX_CP_LS |
1325 AMD_CG_SUPPORT_GFX_RLC_LS |
1326 AMD_CG_SUPPORT_MC_LS |
1327 AMD_CG_SUPPORT_MC_MGCG |
1328 AMD_CG_SUPPORT_SDMA_MGCG |
1329 AMD_CG_SUPPORT_BIF_LS |
1330 AMD_CG_SUPPORT_HDP_LS |
1331 AMD_CG_SUPPORT_HDP_MGCG;
1333 adev->external_rev_id = 70;
1343 static int si_common_sw_init(void *handle)
1348 static int si_common_sw_fini(void *handle)
1354 static void si_init_golden_registers(struct amdgpu_device *adev)
1356 switch (adev->asic_type) {
1358 amdgpu_program_register_sequence(adev,
1359 tahiti_golden_registers,
1360 (const u32)ARRAY_SIZE(tahiti_golden_registers));
1361 amdgpu_program_register_sequence(adev,
1362 tahiti_golden_rlc_registers,
1363 (const u32)ARRAY_SIZE(tahiti_golden_rlc_registers));
1364 amdgpu_program_register_sequence(adev,
1365 tahiti_mgcg_cgcg_init,
1366 (const u32)ARRAY_SIZE(tahiti_mgcg_cgcg_init));
1367 amdgpu_program_register_sequence(adev,
1368 tahiti_golden_registers2,
1369 (const u32)ARRAY_SIZE(tahiti_golden_registers2));
1372 amdgpu_program_register_sequence(adev,
1373 pitcairn_golden_registers,
1374 (const u32)ARRAY_SIZE(pitcairn_golden_registers));
1375 amdgpu_program_register_sequence(adev,
1376 pitcairn_golden_rlc_registers,
1377 (const u32)ARRAY_SIZE(pitcairn_golden_rlc_registers));
1378 amdgpu_program_register_sequence(adev,
1379 pitcairn_mgcg_cgcg_init,
1380 (const u32)ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
1382 amdgpu_program_register_sequence(adev,
1383 verde_golden_registers,
1384 (const u32)ARRAY_SIZE(verde_golden_registers));
1385 amdgpu_program_register_sequence(adev,
1386 verde_golden_rlc_registers,
1387 (const u32)ARRAY_SIZE(verde_golden_rlc_registers));
1388 amdgpu_program_register_sequence(adev,
1389 verde_mgcg_cgcg_init,
1390 (const u32)ARRAY_SIZE(verde_mgcg_cgcg_init));
1391 amdgpu_program_register_sequence(adev,
1393 (const u32)ARRAY_SIZE(verde_pg_init));
1396 amdgpu_program_register_sequence(adev,
1397 oland_golden_registers,
1398 (const u32)ARRAY_SIZE(oland_golden_registers));
1399 amdgpu_program_register_sequence(adev,
1400 oland_golden_rlc_registers,
1401 (const u32)ARRAY_SIZE(oland_golden_rlc_registers));
1402 amdgpu_program_register_sequence(adev,
1403 oland_mgcg_cgcg_init,
1404 (const u32)ARRAY_SIZE(oland_mgcg_cgcg_init));
1406 amdgpu_program_register_sequence(adev,
1407 hainan_golden_registers,
1408 (const u32)ARRAY_SIZE(hainan_golden_registers));
1409 amdgpu_program_register_sequence(adev,
1410 hainan_golden_registers2,
1411 (const u32)ARRAY_SIZE(hainan_golden_registers2));
1412 amdgpu_program_register_sequence(adev,
1413 hainan_mgcg_cgcg_init,
1414 (const u32)ARRAY_SIZE(hainan_mgcg_cgcg_init));
1423 static void si_pcie_gen3_enable(struct amdgpu_device *adev)
1425 struct pci_dev *root = adev->pdev->bus->self;
1426 int bridge_pos, gpu_pos;
1427 u32 speed_cntl, mask, current_data_rate;
1431 if (pci_is_root_bus(adev->pdev->bus))
1434 if (amdgpu_pcie_gen2 == 0)
1437 if (adev->flags & AMD_IS_APU)
1440 ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
1444 if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80)))
1447 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1448 current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
1449 LC_CURRENT_DATA_RATE_SHIFT;
1450 if (mask & DRM_PCIE_SPEED_80) {
1451 if (current_data_rate == 2) {
1452 DRM_INFO("PCIE gen 3 link speeds already enabled\n");
1455 DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
1456 } else if (mask & DRM_PCIE_SPEED_50) {
1457 if (current_data_rate == 1) {
1458 DRM_INFO("PCIE gen 2 link speeds already enabled\n");
1461 DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
1464 bridge_pos = pci_pcie_cap(root);
1468 gpu_pos = pci_pcie_cap(adev->pdev);
1472 if (mask & DRM_PCIE_SPEED_80) {
1473 if (current_data_rate != 2) {
1474 u16 bridge_cfg, gpu_cfg;
1475 u16 bridge_cfg2, gpu_cfg2;
1476 u32 max_lw, current_lw, tmp;
1478 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1479 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1481 tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
1482 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1484 tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
1485 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1487 tmp = RREG32_PCIE(PCIE_LC_STATUS1);
1488 max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
1489 current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
1491 if (current_lw < max_lw) {
1492 tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1493 if (tmp & LC_RENEGOTIATION_SUPPORT) {
1494 tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
1495 tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
1496 tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
1497 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
1501 for (i = 0; i < 10; i++) {
1502 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
1503 if (tmp16 & PCI_EXP_DEVSTA_TRPND)
1506 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1507 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1509 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
1510 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
1512 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1513 tmp |= LC_SET_QUIESCE;
1514 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1516 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1518 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1522 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
1523 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1524 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
1525 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1527 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
1528 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1529 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
1530 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1532 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
1533 tmp16 &= ~((1 << 4) | (7 << 9));
1534 tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
1535 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
1537 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1538 tmp16 &= ~((1 << 4) | (7 << 9));
1539 tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
1540 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1542 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1543 tmp &= ~LC_SET_QUIESCE;
1544 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1549 speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
1550 speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
1551 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1553 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1555 if (mask & DRM_PCIE_SPEED_80)
1557 else if (mask & DRM_PCIE_SPEED_50)
1561 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1563 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1564 speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
1565 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1567 for (i = 0; i < adev->usec_timeout; i++) {
1568 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1569 if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
1575 static inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg)
1577 unsigned long flags;
1580 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1581 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1582 r = RREG32(EVERGREEN_PIF_PHY0_DATA);
1583 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1587 static inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1589 unsigned long flags;
1591 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1592 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1593 WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
1594 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1597 static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
1599 unsigned long flags;
1602 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1603 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1604 r = RREG32(EVERGREEN_PIF_PHY1_DATA);
1605 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1609 static inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1611 unsigned long flags;
1613 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1614 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1615 WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
1616 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1618 static void si_program_aspm(struct amdgpu_device *adev)
1621 bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
1622 bool disable_clkreq = false;
1624 if (amdgpu_aspm == 0)
1627 if (adev->flags & AMD_IS_APU)
1629 orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
1630 data &= ~LC_XMIT_N_FTS_MASK;
1631 data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
1633 WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
1635 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
1636 data |= LC_GO_TO_RECOVERY;
1638 WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
1640 orig = data = RREG32_PCIE(PCIE_P_CNTL);
1641 data |= P_IGNORE_EDB_ERR;
1643 WREG32_PCIE(PCIE_P_CNTL, data);
1645 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
1646 data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
1647 data |= LC_PMI_TO_L1_DIS;
1649 data |= LC_L0S_INACTIVITY(7);
1652 data |= LC_L1_INACTIVITY(7);
1653 data &= ~LC_PMI_TO_L1_DIS;
1655 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1657 if (!disable_plloff_in_l1) {
1658 bool clk_req_support;
1660 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1661 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1662 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1664 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1666 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1667 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1668 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1670 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1672 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1673 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1674 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1676 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1678 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1679 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1680 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1682 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1684 if ((adev->family != CHIP_OLAND) && (adev->family != CHIP_HAINAN)) {
1685 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1686 data &= ~PLL_RAMP_UP_TIME_0_MASK;
1688 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1690 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1691 data &= ~PLL_RAMP_UP_TIME_1_MASK;
1693 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1695 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2);
1696 data &= ~PLL_RAMP_UP_TIME_2_MASK;
1698 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data);
1700 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3);
1701 data &= ~PLL_RAMP_UP_TIME_3_MASK;
1703 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data);
1705 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1706 data &= ~PLL_RAMP_UP_TIME_0_MASK;
1708 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1710 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1711 data &= ~PLL_RAMP_UP_TIME_1_MASK;
1713 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1715 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2);
1716 data &= ~PLL_RAMP_UP_TIME_2_MASK;
1718 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data);
1720 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3);
1721 data &= ~PLL_RAMP_UP_TIME_3_MASK;
1723 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data);
1725 orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1726 data &= ~LC_DYN_LANES_PWR_STATE_MASK;
1727 data |= LC_DYN_LANES_PWR_STATE(3);
1729 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
1731 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL);
1732 data &= ~LS2_EXIT_TIME_MASK;
1733 if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
1734 data |= LS2_EXIT_TIME(5);
1736 si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data);
1738 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL);
1739 data &= ~LS2_EXIT_TIME_MASK;
1740 if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
1741 data |= LS2_EXIT_TIME(5);
1743 si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data);
1745 if (!disable_clkreq &&
1746 !pci_is_root_bus(adev->pdev->bus)) {
1747 struct pci_dev *root = adev->pdev->bus->self;
1750 clk_req_support = false;
1751 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
1752 if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
1753 clk_req_support = true;
1755 clk_req_support = false;
1758 if (clk_req_support) {
1759 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
1760 data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
1762 WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
1764 orig = data = RREG32(THM_CLK_CNTL);
1765 data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
1766 data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
1768 WREG32(THM_CLK_CNTL, data);
1770 orig = data = RREG32(MISC_CLK_CNTL);
1771 data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
1772 data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
1774 WREG32(MISC_CLK_CNTL, data);
1776 orig = data = RREG32(CG_CLKPIN_CNTL);
1777 data &= ~BCLK_AS_XCLK;
1779 WREG32(CG_CLKPIN_CNTL, data);
1781 orig = data = RREG32(CG_CLKPIN_CNTL_2);
1782 data &= ~FORCE_BIF_REFCLK_EN;
1784 WREG32(CG_CLKPIN_CNTL_2, data);
1786 orig = data = RREG32(MPLL_BYPASSCLK_SEL);
1787 data &= ~MPLL_CLKOUT_SEL_MASK;
1788 data |= MPLL_CLKOUT_SEL(4);
1790 WREG32(MPLL_BYPASSCLK_SEL, data);
1792 orig = data = RREG32(SPLL_CNTL_MODE);
1793 data &= ~SPLL_REFCLK_SEL_MASK;
1795 WREG32(SPLL_CNTL_MODE, data);
1800 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1803 orig = data = RREG32_PCIE(PCIE_CNTL2);
1804 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
1806 WREG32_PCIE(PCIE_CNTL2, data);
1809 data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
1810 if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
1811 data = RREG32_PCIE(PCIE_LC_STATUS1);
1812 if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
1813 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
1814 data &= ~LC_L0S_INACTIVITY_MASK;
1816 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1822 static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
1827 readrq = pcie_get_readrq(adev->pdev);
1828 v = ffs(readrq) - 8;
1829 if ((v == 0) || (v == 6) || (v == 7))
1830 pcie_set_readrq(adev->pdev, 512);
1833 static int si_common_hw_init(void *handle)
1835 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1837 si_fix_pci_max_read_req_size(adev);
1838 si_init_golden_registers(adev);
1839 si_pcie_gen3_enable(adev);
1840 si_program_aspm(adev);
1845 static int si_common_hw_fini(void *handle)
1850 static int si_common_suspend(void *handle)
1852 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1854 return si_common_hw_fini(adev);
1857 static int si_common_resume(void *handle)
1859 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1861 return si_common_hw_init(adev);
1864 static bool si_common_is_idle(void *handle)
1869 static int si_common_wait_for_idle(void *handle)
1874 static int si_common_soft_reset(void *handle)
1879 static int si_common_set_clockgating_state(void *handle,
1880 enum amd_clockgating_state state)
1885 static int si_common_set_powergating_state(void *handle,
1886 enum amd_powergating_state state)
1891 static const struct amd_ip_funcs si_common_ip_funcs = {
1892 .name = "si_common",
1893 .early_init = si_common_early_init,
1895 .sw_init = si_common_sw_init,
1896 .sw_fini = si_common_sw_fini,
1897 .hw_init = si_common_hw_init,
1898 .hw_fini = si_common_hw_fini,
1899 .suspend = si_common_suspend,
1900 .resume = si_common_resume,
1901 .is_idle = si_common_is_idle,
1902 .wait_for_idle = si_common_wait_for_idle,
1903 .soft_reset = si_common_soft_reset,
1904 .set_clockgating_state = si_common_set_clockgating_state,
1905 .set_powergating_state = si_common_set_powergating_state,
1908 static const struct amdgpu_ip_block_version si_common_ip_block =
1910 .type = AMD_IP_BLOCK_TYPE_COMMON,
1914 .funcs = &si_common_ip_funcs,
1917 int si_set_ip_blocks(struct amdgpu_device *adev)
1919 si_detect_hw_virtualization(adev);
1921 switch (adev->asic_type) {
1925 amdgpu_ip_block_add(adev, &si_common_ip_block);
1926 amdgpu_ip_block_add(adev, &gmc_v6_0_ip_block);
1927 amdgpu_ip_block_add(adev, &si_ih_ip_block);
1928 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
1929 if (adev->enable_virtual_display)
1930 amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
1932 amdgpu_ip_block_add(adev, &dce_v6_0_ip_block);
1933 amdgpu_ip_block_add(adev, &gfx_v6_0_ip_block);
1934 amdgpu_ip_block_add(adev, &si_dma_ip_block);
1935 /* amdgpu_ip_block_add(adev, &uvd_v3_1_ip_block); */
1936 /* amdgpu_ip_block_add(adev, &vce_v1_0_ip_block); */
1939 amdgpu_ip_block_add(adev, &si_common_ip_block);
1940 amdgpu_ip_block_add(adev, &gmc_v6_0_ip_block);
1941 amdgpu_ip_block_add(adev, &si_ih_ip_block);
1942 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
1943 if (adev->enable_virtual_display)
1944 amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
1946 amdgpu_ip_block_add(adev, &dce_v6_4_ip_block);
1947 amdgpu_ip_block_add(adev, &gfx_v6_0_ip_block);
1948 amdgpu_ip_block_add(adev, &si_dma_ip_block);
1949 /* amdgpu_ip_block_add(adev, &uvd_v3_1_ip_block); */
1950 /* amdgpu_ip_block_add(adev, &vce_v1_0_ip_block); */
1953 amdgpu_ip_block_add(adev, &si_common_ip_block);
1954 amdgpu_ip_block_add(adev, &gmc_v6_0_ip_block);
1955 amdgpu_ip_block_add(adev, &si_ih_ip_block);
1956 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
1957 if (adev->enable_virtual_display)
1958 amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
1959 amdgpu_ip_block_add(adev, &gfx_v6_0_ip_block);
1960 amdgpu_ip_block_add(adev, &si_dma_ip_block);