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"
43 #include "dce_virtual.h"
44 #include "gca/gfx_6_0_d.h"
45 #include "oss/oss_1_0_d.h"
46 #include "gmc/gmc_6_0_d.h"
47 #include "dce/dce_6_0_d.h"
48 #include "uvd/uvd_4_0_d.h"
49 #include "bif/bif_3_0_d.h"
50 #include "bif/bif_3_0_sh_mask.h"
52 static const u32 tahiti_golden_registers[] =
54 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
55 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
56 mmDB_DEBUG, 0xffffffff, 0x00000000,
57 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
58 mmDB_DEBUG3, 0x0002021c, 0x00020200,
59 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
60 0x340c, 0x000000c0, 0x00800040,
61 0x360c, 0x000000c0, 0x00800040,
62 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
63 mmFBC_MISC, 0x00200000, 0x50100000,
64 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
65 mmMC_ARB_WTM_CNTL_RD, 0x00000003, 0x000007ff,
66 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
67 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
68 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
69 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
70 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
71 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
72 0x000c, 0xffffffff, 0x0040,
73 0x000d, 0x00000040, 0x00004040,
74 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
75 mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
76 mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
77 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
78 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
79 mmTCP_ADDR_CONFIG, 0x00000200, 0x000002fb,
80 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x0000543b,
81 mmTCP_CHAN_STEER_LO, 0xffffffff, 0xa9210876,
82 mmVGT_FIFO_DEPTHS, 0xffffffff, 0x000fff40,
83 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
84 mmVM_CONTEXT0_CNTL, 0x20000000, 0x20fffed8,
85 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
86 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
87 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
88 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
89 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
92 static const u32 tahiti_golden_registers2[] =
94 mmMCIF_MEM_CONTROL, 0x00000001, 0x00000001,
97 static const u32 tahiti_golden_rlc_registers[] =
99 mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
100 mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
101 0x311f, 0xffffffff, 0x10104040,
102 0x3122, 0xffffffff, 0x0100000a,
103 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
104 mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
105 mmUVD_CGC_GATE, 0x00000008, 0x00000000,
108 static const u32 pitcairn_golden_registers[] =
110 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
111 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
112 mmDB_DEBUG, 0xffffffff, 0x00000000,
113 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
114 mmDB_DEBUG3, 0x0002021c, 0x00020200,
115 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
116 0x340c, 0x000300c0, 0x00800040,
117 0x360c, 0x000300c0, 0x00800040,
118 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
119 mmFBC_MISC, 0x00200000, 0x50100000,
120 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
121 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
122 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
123 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
124 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
125 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
126 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
127 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
128 0x000c, 0xffffffff, 0x0040,
129 0x000d, 0x00000040, 0x00004040,
130 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
131 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
132 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
133 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7,
134 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
135 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x32761054,
136 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
137 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
138 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
139 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
140 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
141 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
144 static const u32 pitcairn_golden_rlc_registers[] =
146 mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
147 mmRLC_LB_PARAMS, 0xffffffff, 0x00601004,
148 0x311f, 0xffffffff, 0x10102020,
149 0x3122, 0xffffffff, 0x01000020,
150 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
151 mmRLC_LB_CNTL, 0xffffffff, 0x800000a4,
154 static const u32 verde_pg_init[] =
156 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x40000,
157 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x200010ff,
158 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
159 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
160 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
161 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
162 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
163 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x7007,
164 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x300010ff,
165 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
166 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
167 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
168 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
169 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
170 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x400000,
171 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x100010ff,
172 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
173 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
174 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
175 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
176 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
177 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x120200,
178 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x500010ff,
179 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
180 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
181 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
182 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
183 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
184 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x1e1e16,
185 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x600010ff,
186 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
187 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
188 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
189 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
190 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
191 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x171f1e,
192 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x700010ff,
193 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
194 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
195 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
196 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
197 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
198 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
199 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x9ff,
200 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x0,
201 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10000800,
202 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
203 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
204 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4,
205 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1000051e,
206 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
207 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
208 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x8,
209 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x80500,
210 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x12,
211 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x9050c,
212 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1d,
213 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xb052c,
214 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2a,
215 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1053e,
216 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2d,
217 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10546,
218 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x30,
219 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xa054e,
220 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3c,
221 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1055f,
222 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3f,
223 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10567,
224 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x42,
225 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1056f,
226 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x45,
227 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10572,
228 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x48,
229 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20575,
230 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4c,
231 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x190801,
232 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x67,
233 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1082a,
234 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x6a,
235 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1b082d,
236 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x87,
237 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x310851,
238 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xba,
239 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x891,
240 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbc,
241 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x893,
242 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbe,
243 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20895,
244 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc2,
245 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20899,
246 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc6,
247 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2089d,
248 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xca,
249 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a1,
250 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xcc,
251 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a3,
252 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xce,
253 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x308a5,
254 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xd3,
255 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x6d08cd,
256 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x142,
257 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2000095a,
258 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1,
259 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x144,
260 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x301f095b,
261 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x165,
262 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc094d,
263 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x173,
264 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf096d,
265 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x184,
266 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x15097f,
267 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x19b,
268 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc0998,
269 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1a9,
270 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x409a7,
271 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1af,
272 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xcdc,
273 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1b1,
274 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x800,
275 mmGMCON_RENG_EXECUTE, 0xffffffff, 0x6c9b2000,
276 mmGMCON_MISC2, 0xfc00, 0x2000,
277 mmGMCON_MISC3, 0xffffffff, 0xfc0,
278 mmMC_PMG_AUTO_CFG, 0x00000100, 0x100,
281 static const u32 verde_golden_rlc_registers[] =
283 mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
284 mmRLC_LB_PARAMS, 0xffffffff, 0x033f1005,
285 0x311f, 0xffffffff, 0x10808020,
286 0x3122, 0xffffffff, 0x00800008,
287 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00001000,
288 mmRLC_LB_CNTL, 0xffffffff, 0x80010014,
291 static const u32 verde_golden_registers[] =
293 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
294 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
295 mmDB_DEBUG, 0xffffffff, 0x00000000,
296 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
297 mmDB_DEBUG3, 0x0002021c, 0x00020200,
298 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
299 0x340c, 0x000300c0, 0x00800040,
300 0x360c, 0x000300c0, 0x00800040,
301 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
302 mmFBC_MISC, 0x00200000, 0x50100000,
303 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
304 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
305 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
306 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
307 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
308 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
309 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
310 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x0000124a,
311 0x000c, 0xffffffff, 0x0040,
312 0x000d, 0x00000040, 0x00004040,
313 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
314 mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
315 mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
316 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
317 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
318 mmTCP_ADDR_CONFIG, 0x000003ff, 0x00000003,
319 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
320 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00001032,
321 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
322 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
323 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
324 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
325 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
326 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
329 static const u32 oland_golden_registers[] =
331 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
332 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
333 mmDB_DEBUG, 0xffffffff, 0x00000000,
334 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
335 mmDB_DEBUG3, 0x0002021c, 0x00020200,
336 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
337 0x340c, 0x000300c0, 0x00800040,
338 0x360c, 0x000300c0, 0x00800040,
339 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
340 mmFBC_MISC, 0x00200000, 0x50100000,
341 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
342 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
343 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
344 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
345 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
346 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
347 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
348 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000082,
349 0x000c, 0xffffffff, 0x0040,
350 0x000d, 0x00000040, 0x00004040,
351 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
352 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
353 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
354 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f3,
355 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
356 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
357 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
358 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
359 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
360 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
361 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
362 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
366 static const u32 oland_golden_rlc_registers[] =
368 mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
369 mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
370 0x311f, 0xffffffff, 0x10104040,
371 0x3122, 0xffffffff, 0x0100000a,
372 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
373 mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
376 static const u32 hainan_golden_registers[] =
378 0x17bc, 0x00000030, 0x00000011,
379 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
380 mmDB_DEBUG, 0xffffffff, 0x00000000,
381 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
382 mmDB_DEBUG3, 0x0002021c, 0x00020200,
383 0x031e, 0x00000080, 0x00000000,
384 0x3430, 0xff000fff, 0x00000100,
385 0x340c, 0x000300c0, 0x00800040,
386 0x3630, 0xff000fff, 0x00000100,
387 0x360c, 0x000300c0, 0x00800040,
388 0x16ec, 0x000000f0, 0x00000070,
389 0x16f0, 0x00200000, 0x50100000,
390 0x1c0c, 0x31000311, 0x00000011,
391 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
392 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
393 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
394 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
395 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
396 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
397 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000000,
398 0x000c, 0xffffffff, 0x0040,
399 0x000d, 0x00000040, 0x00004040,
400 mmSPI_CONFIG_CNTL, 0x03e00000, 0x03600000,
401 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
402 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
403 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f1,
404 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
405 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
406 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
407 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
408 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
409 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
410 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
411 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
414 static const u32 hainan_golden_registers2[] =
416 mmGB_ADDR_CONFIG, 0xffffffff, 0x2011003,
419 static const u32 tahiti_mgcg_cgcg_init[] =
421 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
422 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
423 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
424 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
425 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
426 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
427 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
428 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
429 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
430 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
431 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
432 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
433 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
434 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
435 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
436 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
437 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
438 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
439 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
440 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
441 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
442 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
443 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
444 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
445 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
446 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
447 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
448 0x2458, 0xffffffff, 0x00010000,
449 0x2459, 0xffffffff, 0x00030002,
450 0x245a, 0xffffffff, 0x00040007,
451 0x245b, 0xffffffff, 0x00060005,
452 0x245c, 0xffffffff, 0x00090008,
453 0x245d, 0xffffffff, 0x00020001,
454 0x245e, 0xffffffff, 0x00040003,
455 0x245f, 0xffffffff, 0x00000007,
456 0x2460, 0xffffffff, 0x00060005,
457 0x2461, 0xffffffff, 0x00090008,
458 0x2462, 0xffffffff, 0x00030002,
459 0x2463, 0xffffffff, 0x00050004,
460 0x2464, 0xffffffff, 0x00000008,
461 0x2465, 0xffffffff, 0x00070006,
462 0x2466, 0xffffffff, 0x000a0009,
463 0x2467, 0xffffffff, 0x00040003,
464 0x2468, 0xffffffff, 0x00060005,
465 0x2469, 0xffffffff, 0x00000009,
466 0x246a, 0xffffffff, 0x00080007,
467 0x246b, 0xffffffff, 0x000b000a,
468 0x246c, 0xffffffff, 0x00050004,
469 0x246d, 0xffffffff, 0x00070006,
470 0x246e, 0xffffffff, 0x0008000b,
471 0x246f, 0xffffffff, 0x000a0009,
472 0x2470, 0xffffffff, 0x000d000c,
473 0x2471, 0xffffffff, 0x00060005,
474 0x2472, 0xffffffff, 0x00080007,
475 0x2473, 0xffffffff, 0x0000000b,
476 0x2474, 0xffffffff, 0x000a0009,
477 0x2475, 0xffffffff, 0x000d000c,
478 0x2476, 0xffffffff, 0x00070006,
479 0x2477, 0xffffffff, 0x00090008,
480 0x2478, 0xffffffff, 0x0000000c,
481 0x2479, 0xffffffff, 0x000b000a,
482 0x247a, 0xffffffff, 0x000e000d,
483 0x247b, 0xffffffff, 0x00080007,
484 0x247c, 0xffffffff, 0x000a0009,
485 0x247d, 0xffffffff, 0x0000000d,
486 0x247e, 0xffffffff, 0x000c000b,
487 0x247f, 0xffffffff, 0x000f000e,
488 0x2480, 0xffffffff, 0x00090008,
489 0x2481, 0xffffffff, 0x000b000a,
490 0x2482, 0xffffffff, 0x000c000f,
491 0x2483, 0xffffffff, 0x000e000d,
492 0x2484, 0xffffffff, 0x00110010,
493 0x2485, 0xffffffff, 0x000a0009,
494 0x2486, 0xffffffff, 0x000c000b,
495 0x2487, 0xffffffff, 0x0000000f,
496 0x2488, 0xffffffff, 0x000e000d,
497 0x2489, 0xffffffff, 0x00110010,
498 0x248a, 0xffffffff, 0x000b000a,
499 0x248b, 0xffffffff, 0x000d000c,
500 0x248c, 0xffffffff, 0x00000010,
501 0x248d, 0xffffffff, 0x000f000e,
502 0x248e, 0xffffffff, 0x00120011,
503 0x248f, 0xffffffff, 0x000c000b,
504 0x2490, 0xffffffff, 0x000e000d,
505 0x2491, 0xffffffff, 0x00000011,
506 0x2492, 0xffffffff, 0x0010000f,
507 0x2493, 0xffffffff, 0x00130012,
508 0x2494, 0xffffffff, 0x000d000c,
509 0x2495, 0xffffffff, 0x000f000e,
510 0x2496, 0xffffffff, 0x00100013,
511 0x2497, 0xffffffff, 0x00120011,
512 0x2498, 0xffffffff, 0x00150014,
513 0x2499, 0xffffffff, 0x000e000d,
514 0x249a, 0xffffffff, 0x0010000f,
515 0x249b, 0xffffffff, 0x00000013,
516 0x249c, 0xffffffff, 0x00120011,
517 0x249d, 0xffffffff, 0x00150014,
518 0x249e, 0xffffffff, 0x000f000e,
519 0x249f, 0xffffffff, 0x00110010,
520 0x24a0, 0xffffffff, 0x00000014,
521 0x24a1, 0xffffffff, 0x00130012,
522 0x24a2, 0xffffffff, 0x00160015,
523 0x24a3, 0xffffffff, 0x0010000f,
524 0x24a4, 0xffffffff, 0x00120011,
525 0x24a5, 0xffffffff, 0x00000015,
526 0x24a6, 0xffffffff, 0x00140013,
527 0x24a7, 0xffffffff, 0x00170016,
528 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
529 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
530 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
531 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
532 0x000c, 0xffffffff, 0x0000001c,
533 0x000d, 0x000f0000, 0x000f0000,
534 0x0583, 0xffffffff, 0x00000100,
535 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
536 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
537 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
538 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
539 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
540 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
541 0x157a, 0x00000001, 0x00000001,
542 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
543 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
544 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
545 0x3430, 0xfffffff0, 0x00000100,
546 0x3630, 0xfffffff0, 0x00000100,
548 static const u32 pitcairn_mgcg_cgcg_init[] =
550 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
551 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
552 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
553 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
554 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
555 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
556 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
557 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
558 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
559 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
560 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
561 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
562 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
563 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
564 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
565 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
566 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
567 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
568 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
569 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
570 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
571 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
572 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
573 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
574 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
575 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
576 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
577 0x2458, 0xffffffff, 0x00010000,
578 0x2459, 0xffffffff, 0x00030002,
579 0x245a, 0xffffffff, 0x00040007,
580 0x245b, 0xffffffff, 0x00060005,
581 0x245c, 0xffffffff, 0x00090008,
582 0x245d, 0xffffffff, 0x00020001,
583 0x245e, 0xffffffff, 0x00040003,
584 0x245f, 0xffffffff, 0x00000007,
585 0x2460, 0xffffffff, 0x00060005,
586 0x2461, 0xffffffff, 0x00090008,
587 0x2462, 0xffffffff, 0x00030002,
588 0x2463, 0xffffffff, 0x00050004,
589 0x2464, 0xffffffff, 0x00000008,
590 0x2465, 0xffffffff, 0x00070006,
591 0x2466, 0xffffffff, 0x000a0009,
592 0x2467, 0xffffffff, 0x00040003,
593 0x2468, 0xffffffff, 0x00060005,
594 0x2469, 0xffffffff, 0x00000009,
595 0x246a, 0xffffffff, 0x00080007,
596 0x246b, 0xffffffff, 0x000b000a,
597 0x246c, 0xffffffff, 0x00050004,
598 0x246d, 0xffffffff, 0x00070006,
599 0x246e, 0xffffffff, 0x0008000b,
600 0x246f, 0xffffffff, 0x000a0009,
601 0x2470, 0xffffffff, 0x000d000c,
602 0x2480, 0xffffffff, 0x00090008,
603 0x2481, 0xffffffff, 0x000b000a,
604 0x2482, 0xffffffff, 0x000c000f,
605 0x2483, 0xffffffff, 0x000e000d,
606 0x2484, 0xffffffff, 0x00110010,
607 0x2485, 0xffffffff, 0x000a0009,
608 0x2486, 0xffffffff, 0x000c000b,
609 0x2487, 0xffffffff, 0x0000000f,
610 0x2488, 0xffffffff, 0x000e000d,
611 0x2489, 0xffffffff, 0x00110010,
612 0x248a, 0xffffffff, 0x000b000a,
613 0x248b, 0xffffffff, 0x000d000c,
614 0x248c, 0xffffffff, 0x00000010,
615 0x248d, 0xffffffff, 0x000f000e,
616 0x248e, 0xffffffff, 0x00120011,
617 0x248f, 0xffffffff, 0x000c000b,
618 0x2490, 0xffffffff, 0x000e000d,
619 0x2491, 0xffffffff, 0x00000011,
620 0x2492, 0xffffffff, 0x0010000f,
621 0x2493, 0xffffffff, 0x00130012,
622 0x2494, 0xffffffff, 0x000d000c,
623 0x2495, 0xffffffff, 0x000f000e,
624 0x2496, 0xffffffff, 0x00100013,
625 0x2497, 0xffffffff, 0x00120011,
626 0x2498, 0xffffffff, 0x00150014,
627 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
628 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
629 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
630 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
631 0x000c, 0xffffffff, 0x0000001c,
632 0x000d, 0x000f0000, 0x000f0000,
633 0x0583, 0xffffffff, 0x00000100,
634 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
635 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
636 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
637 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
638 0x157a, 0x00000001, 0x00000001,
639 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
640 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
641 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
642 0x3430, 0xfffffff0, 0x00000100,
643 0x3630, 0xfffffff0, 0x00000100,
646 static const u32 verde_mgcg_cgcg_init[] =
648 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
649 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
650 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
651 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
652 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
653 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
654 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
655 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
656 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
657 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
658 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
659 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
660 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
661 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
662 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
663 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
664 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
665 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
666 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
667 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
668 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
669 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
670 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
671 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
672 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
673 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
674 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
675 0x2458, 0xffffffff, 0x00010000,
676 0x2459, 0xffffffff, 0x00030002,
677 0x245a, 0xffffffff, 0x00040007,
678 0x245b, 0xffffffff, 0x00060005,
679 0x245c, 0xffffffff, 0x00090008,
680 0x245d, 0xffffffff, 0x00020001,
681 0x245e, 0xffffffff, 0x00040003,
682 0x245f, 0xffffffff, 0x00000007,
683 0x2460, 0xffffffff, 0x00060005,
684 0x2461, 0xffffffff, 0x00090008,
685 0x2462, 0xffffffff, 0x00030002,
686 0x2463, 0xffffffff, 0x00050004,
687 0x2464, 0xffffffff, 0x00000008,
688 0x2465, 0xffffffff, 0x00070006,
689 0x2466, 0xffffffff, 0x000a0009,
690 0x2467, 0xffffffff, 0x00040003,
691 0x2468, 0xffffffff, 0x00060005,
692 0x2469, 0xffffffff, 0x00000009,
693 0x246a, 0xffffffff, 0x00080007,
694 0x246b, 0xffffffff, 0x000b000a,
695 0x246c, 0xffffffff, 0x00050004,
696 0x246d, 0xffffffff, 0x00070006,
697 0x246e, 0xffffffff, 0x0008000b,
698 0x246f, 0xffffffff, 0x000a0009,
699 0x2470, 0xffffffff, 0x000d000c,
700 0x2480, 0xffffffff, 0x00090008,
701 0x2481, 0xffffffff, 0x000b000a,
702 0x2482, 0xffffffff, 0x000c000f,
703 0x2483, 0xffffffff, 0x000e000d,
704 0x2484, 0xffffffff, 0x00110010,
705 0x2485, 0xffffffff, 0x000a0009,
706 0x2486, 0xffffffff, 0x000c000b,
707 0x2487, 0xffffffff, 0x0000000f,
708 0x2488, 0xffffffff, 0x000e000d,
709 0x2489, 0xffffffff, 0x00110010,
710 0x248a, 0xffffffff, 0x000b000a,
711 0x248b, 0xffffffff, 0x000d000c,
712 0x248c, 0xffffffff, 0x00000010,
713 0x248d, 0xffffffff, 0x000f000e,
714 0x248e, 0xffffffff, 0x00120011,
715 0x248f, 0xffffffff, 0x000c000b,
716 0x2490, 0xffffffff, 0x000e000d,
717 0x2491, 0xffffffff, 0x00000011,
718 0x2492, 0xffffffff, 0x0010000f,
719 0x2493, 0xffffffff, 0x00130012,
720 0x2494, 0xffffffff, 0x000d000c,
721 0x2495, 0xffffffff, 0x000f000e,
722 0x2496, 0xffffffff, 0x00100013,
723 0x2497, 0xffffffff, 0x00120011,
724 0x2498, 0xffffffff, 0x00150014,
725 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
726 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
727 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
728 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
729 0x000c, 0xffffffff, 0x0000001c,
730 0x000d, 0x000f0000, 0x000f0000,
731 0x0583, 0xffffffff, 0x00000100,
732 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
733 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
734 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
735 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
736 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
737 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
738 0x157a, 0x00000001, 0x00000001,
739 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
740 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
741 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
742 0x3430, 0xfffffff0, 0x00000100,
743 0x3630, 0xfffffff0, 0x00000100,
746 static const u32 oland_mgcg_cgcg_init[] =
748 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
749 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
750 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
751 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
752 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
753 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
754 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
755 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
756 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
757 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
758 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
759 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
760 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
761 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
762 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
763 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
764 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
765 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
766 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
767 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
768 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
769 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
770 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
771 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
772 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
773 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
774 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
775 0x2458, 0xffffffff, 0x00010000,
776 0x2459, 0xffffffff, 0x00030002,
777 0x245a, 0xffffffff, 0x00040007,
778 0x245b, 0xffffffff, 0x00060005,
779 0x245c, 0xffffffff, 0x00090008,
780 0x245d, 0xffffffff, 0x00020001,
781 0x245e, 0xffffffff, 0x00040003,
782 0x245f, 0xffffffff, 0x00000007,
783 0x2460, 0xffffffff, 0x00060005,
784 0x2461, 0xffffffff, 0x00090008,
785 0x2462, 0xffffffff, 0x00030002,
786 0x2463, 0xffffffff, 0x00050004,
787 0x2464, 0xffffffff, 0x00000008,
788 0x2465, 0xffffffff, 0x00070006,
789 0x2466, 0xffffffff, 0x000a0009,
790 0x2467, 0xffffffff, 0x00040003,
791 0x2468, 0xffffffff, 0x00060005,
792 0x2469, 0xffffffff, 0x00000009,
793 0x246a, 0xffffffff, 0x00080007,
794 0x246b, 0xffffffff, 0x000b000a,
795 0x246c, 0xffffffff, 0x00050004,
796 0x246d, 0xffffffff, 0x00070006,
797 0x246e, 0xffffffff, 0x0008000b,
798 0x246f, 0xffffffff, 0x000a0009,
799 0x2470, 0xffffffff, 0x000d000c,
800 0x2471, 0xffffffff, 0x00060005,
801 0x2472, 0xffffffff, 0x00080007,
802 0x2473, 0xffffffff, 0x0000000b,
803 0x2474, 0xffffffff, 0x000a0009,
804 0x2475, 0xffffffff, 0x000d000c,
805 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
806 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
807 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
808 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
809 0x000c, 0xffffffff, 0x0000001c,
810 0x000d, 0x000f0000, 0x000f0000,
811 0x0583, 0xffffffff, 0x00000100,
812 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
813 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
814 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
815 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
816 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
817 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
818 0x157a, 0x00000001, 0x00000001,
819 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
820 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
821 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
822 0x3430, 0xfffffff0, 0x00000100,
823 0x3630, 0xfffffff0, 0x00000100,
826 static const u32 hainan_mgcg_cgcg_init[] =
828 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
829 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
830 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
831 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
832 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
833 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
834 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
835 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
836 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
837 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
838 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
839 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
840 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
841 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
842 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
843 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
844 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
845 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
846 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
847 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
848 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
849 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
850 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
851 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
852 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
853 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
854 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
855 0x2458, 0xffffffff, 0x00010000,
856 0x2459, 0xffffffff, 0x00030002,
857 0x245a, 0xffffffff, 0x00040007,
858 0x245b, 0xffffffff, 0x00060005,
859 0x245c, 0xffffffff, 0x00090008,
860 0x245d, 0xffffffff, 0x00020001,
861 0x245e, 0xffffffff, 0x00040003,
862 0x245f, 0xffffffff, 0x00000007,
863 0x2460, 0xffffffff, 0x00060005,
864 0x2461, 0xffffffff, 0x00090008,
865 0x2462, 0xffffffff, 0x00030002,
866 0x2463, 0xffffffff, 0x00050004,
867 0x2464, 0xffffffff, 0x00000008,
868 0x2465, 0xffffffff, 0x00070006,
869 0x2466, 0xffffffff, 0x000a0009,
870 0x2467, 0xffffffff, 0x00040003,
871 0x2468, 0xffffffff, 0x00060005,
872 0x2469, 0xffffffff, 0x00000009,
873 0x246a, 0xffffffff, 0x00080007,
874 0x246b, 0xffffffff, 0x000b000a,
875 0x246c, 0xffffffff, 0x00050004,
876 0x246d, 0xffffffff, 0x00070006,
877 0x246e, 0xffffffff, 0x0008000b,
878 0x246f, 0xffffffff, 0x000a0009,
879 0x2470, 0xffffffff, 0x000d000c,
880 0x2471, 0xffffffff, 0x00060005,
881 0x2472, 0xffffffff, 0x00080007,
882 0x2473, 0xffffffff, 0x0000000b,
883 0x2474, 0xffffffff, 0x000a0009,
884 0x2475, 0xffffffff, 0x000d000c,
885 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
886 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
887 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
888 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
889 0x000c, 0xffffffff, 0x0000001c,
890 0x000d, 0x000f0000, 0x000f0000,
891 0x0583, 0xffffffff, 0x00000100,
892 0x0409, 0xffffffff, 0x00000100,
893 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
894 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
895 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
896 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
897 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
898 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
899 0x3430, 0xfffffff0, 0x00000100,
900 0x3630, 0xfffffff0, 0x00000100,
903 static u32 si_pcie_rreg(struct amdgpu_device *adev, u32 reg)
908 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
909 WREG32(AMDGPU_PCIE_INDEX, reg);
910 (void)RREG32(AMDGPU_PCIE_INDEX);
911 r = RREG32(AMDGPU_PCIE_DATA);
912 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
916 static void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
920 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
921 WREG32(AMDGPU_PCIE_INDEX, reg);
922 (void)RREG32(AMDGPU_PCIE_INDEX);
923 WREG32(AMDGPU_PCIE_DATA, v);
924 (void)RREG32(AMDGPU_PCIE_DATA);
925 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
928 static u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
933 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
934 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
935 (void)RREG32(PCIE_PORT_INDEX);
936 r = RREG32(PCIE_PORT_DATA);
937 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
941 static void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
945 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
946 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
947 (void)RREG32(PCIE_PORT_INDEX);
948 WREG32(PCIE_PORT_DATA, (v));
949 (void)RREG32(PCIE_PORT_DATA);
950 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
953 static u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg)
958 spin_lock_irqsave(&adev->smc_idx_lock, flags);
959 WREG32(SMC_IND_INDEX_0, (reg));
960 r = RREG32(SMC_IND_DATA_0);
961 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
965 static void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
969 spin_lock_irqsave(&adev->smc_idx_lock, flags);
970 WREG32(SMC_IND_INDEX_0, (reg));
971 WREG32(SMC_IND_DATA_0, (v));
972 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
975 static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = {
1011 {CC_RB_BACKEND_DISABLE, true},
1012 {GC_USER_RB_BACKEND_DISABLE, true},
1013 {PA_SC_RASTER_CONFIG, true},
1016 static uint32_t si_get_register_value(struct amdgpu_device *adev,
1017 bool indexed, u32 se_num,
1018 u32 sh_num, u32 reg_offset)
1022 unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
1023 unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
1025 switch (reg_offset) {
1026 case mmCC_RB_BACKEND_DISABLE:
1027 return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
1028 case mmGC_USER_RB_BACKEND_DISABLE:
1029 return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
1030 case mmPA_SC_RASTER_CONFIG:
1031 return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
1034 mutex_lock(&adev->grbm_idx_mutex);
1035 if (se_num != 0xffffffff || sh_num != 0xffffffff)
1036 amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
1038 val = RREG32(reg_offset);
1040 if (se_num != 0xffffffff || sh_num != 0xffffffff)
1041 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1042 mutex_unlock(&adev->grbm_idx_mutex);
1047 switch (reg_offset) {
1048 case mmGB_ADDR_CONFIG:
1049 return adev->gfx.config.gb_addr_config;
1050 case mmMC_ARB_RAMCFG:
1051 return adev->gfx.config.mc_arb_ramcfg;
1052 case mmGB_TILE_MODE0:
1053 case mmGB_TILE_MODE1:
1054 case mmGB_TILE_MODE2:
1055 case mmGB_TILE_MODE3:
1056 case mmGB_TILE_MODE4:
1057 case mmGB_TILE_MODE5:
1058 case mmGB_TILE_MODE6:
1059 case mmGB_TILE_MODE7:
1060 case mmGB_TILE_MODE8:
1061 case mmGB_TILE_MODE9:
1062 case mmGB_TILE_MODE10:
1063 case mmGB_TILE_MODE11:
1064 case mmGB_TILE_MODE12:
1065 case mmGB_TILE_MODE13:
1066 case mmGB_TILE_MODE14:
1067 case mmGB_TILE_MODE15:
1068 case mmGB_TILE_MODE16:
1069 case mmGB_TILE_MODE17:
1070 case mmGB_TILE_MODE18:
1071 case mmGB_TILE_MODE19:
1072 case mmGB_TILE_MODE20:
1073 case mmGB_TILE_MODE21:
1074 case mmGB_TILE_MODE22:
1075 case mmGB_TILE_MODE23:
1076 case mmGB_TILE_MODE24:
1077 case mmGB_TILE_MODE25:
1078 case mmGB_TILE_MODE26:
1079 case mmGB_TILE_MODE27:
1080 case mmGB_TILE_MODE28:
1081 case mmGB_TILE_MODE29:
1082 case mmGB_TILE_MODE30:
1083 case mmGB_TILE_MODE31:
1084 idx = (reg_offset - mmGB_TILE_MODE0);
1085 return adev->gfx.config.tile_mode_array[idx];
1087 return RREG32(reg_offset);
1091 static int si_read_register(struct amdgpu_device *adev, u32 se_num,
1092 u32 sh_num, u32 reg_offset, u32 *value)
1097 for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) {
1098 bool indexed = si_allowed_read_registers[i].grbm_indexed;
1100 if (reg_offset != si_allowed_read_registers[i].reg_offset)
1103 *value = si_get_register_value(adev, indexed, se_num, sh_num,
1110 static bool si_read_disabled_bios(struct amdgpu_device *adev)
1113 u32 d1vga_control = 0;
1114 u32 d2vga_control = 0;
1115 u32 vga_render_control = 0;
1119 bus_cntl = RREG32(R600_BUS_CNTL);
1120 if (adev->mode_info.num_crtc) {
1121 d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
1122 d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
1123 vga_render_control = RREG32(VGA_RENDER_CONTROL);
1125 rom_cntl = RREG32(R600_ROM_CNTL);
1127 /* enable the rom */
1128 WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
1129 if (adev->mode_info.num_crtc) {
1130 /* Disable VGA mode */
1131 WREG32(AVIVO_D1VGA_CONTROL,
1132 (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1133 AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1134 WREG32(AVIVO_D2VGA_CONTROL,
1135 (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1136 AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1137 WREG32(VGA_RENDER_CONTROL,
1138 (vga_render_control & C_000300_VGA_VSTATUS_CNTL));
1140 WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
1142 r = amdgpu_read_bios(adev);
1145 WREG32(R600_BUS_CNTL, bus_cntl);
1146 if (adev->mode_info.num_crtc) {
1147 WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
1148 WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
1149 WREG32(VGA_RENDER_CONTROL, vga_render_control);
1151 WREG32(R600_ROM_CNTL, rom_cntl);
1155 #define mmROM_INDEX 0x2A
1156 #define mmROM_DATA 0x2B
1158 static bool si_read_bios_from_rom(struct amdgpu_device *adev,
1159 u8 *bios, u32 length_bytes)
1166 if (length_bytes == 0)
1168 /* APU vbios image is part of sbios image */
1169 if (adev->flags & AMD_IS_APU)
1172 dw_ptr = (u32 *)bios;
1173 length_dw = ALIGN(length_bytes, 4) / 4;
1174 /* set rom index to 0 */
1175 WREG32(mmROM_INDEX, 0);
1176 for (i = 0; i < length_dw; i++)
1177 dw_ptr[i] = RREG32(mmROM_DATA);
1182 //xxx: not implemented
1183 static int si_asic_reset(struct amdgpu_device *adev)
1188 static u32 si_get_config_memsize(struct amdgpu_device *adev)
1190 return RREG32(mmCONFIG_MEMSIZE);
1193 static void si_vga_set_state(struct amdgpu_device *adev, bool state)
1197 temp = RREG32(CONFIG_CNTL);
1198 if (state == false) {
1204 WREG32(CONFIG_CNTL, temp);
1207 static u32 si_get_xclk(struct amdgpu_device *adev)
1209 u32 reference_clock = adev->clock.spll.reference_freq;
1212 tmp = RREG32(CG_CLKPIN_CNTL_2);
1213 if (tmp & MUX_TCLK_TO_XCLK)
1216 tmp = RREG32(CG_CLKPIN_CNTL);
1217 if (tmp & XTALIN_DIVIDE)
1218 return reference_clock / 4;
1220 return reference_clock;
1223 //xxx:not implemented
1224 static int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1229 static void si_detect_hw_virtualization(struct amdgpu_device *adev)
1231 if (is_virtual_machine()) /* passthrough mode */
1232 adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE;
1235 static void si_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
1237 if (!ring || !ring->funcs->emit_wreg) {
1238 WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1239 RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
1241 amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1245 static void si_invalidate_hdp(struct amdgpu_device *adev,
1246 struct amdgpu_ring *ring)
1248 if (!ring || !ring->funcs->emit_wreg) {
1249 WREG32(mmHDP_DEBUG0, 1);
1250 RREG32(mmHDP_DEBUG0);
1252 amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
1256 static bool si_need_full_reset(struct amdgpu_device *adev)
1258 /* change this when we support soft reset */
1262 static bool si_need_reset_on_init(struct amdgpu_device *adev)
1267 static int si_get_pcie_lanes(struct amdgpu_device *adev)
1269 u32 link_width_cntl;
1271 if (adev->flags & AMD_IS_APU)
1274 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1276 switch ((link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT) {
1277 case LC_LINK_WIDTH_X1:
1279 case LC_LINK_WIDTH_X2:
1281 case LC_LINK_WIDTH_X4:
1283 case LC_LINK_WIDTH_X8:
1285 case LC_LINK_WIDTH_X0:
1286 case LC_LINK_WIDTH_X16:
1292 static void si_set_pcie_lanes(struct amdgpu_device *adev, int lanes)
1294 u32 link_width_cntl, mask;
1296 if (adev->flags & AMD_IS_APU)
1301 mask = LC_LINK_WIDTH_X0;
1304 mask = LC_LINK_WIDTH_X1;
1307 mask = LC_LINK_WIDTH_X2;
1310 mask = LC_LINK_WIDTH_X4;
1313 mask = LC_LINK_WIDTH_X8;
1316 mask = LC_LINK_WIDTH_X16;
1319 DRM_ERROR("invalid pcie lane request: %d\n", lanes);
1323 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1324 link_width_cntl &= ~LC_LINK_WIDTH_MASK;
1325 link_width_cntl |= mask << LC_LINK_WIDTH_SHIFT;
1326 link_width_cntl |= (LC_RECONFIG_NOW |
1327 LC_RECONFIG_ARC_MISSING_ESCAPE);
1329 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
1332 static void si_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
1335 uint32_t perfctr = 0;
1336 uint64_t cnt0_of, cnt1_of;
1339 /* This reports 0 on APUs, so return to avoid writing/reading registers
1340 * that may or may not be different from their GPU counterparts
1342 if (adev->flags & AMD_IS_APU)
1345 /* Set the 2 events that we wish to watch, defined above */
1346 /* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
1347 perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
1348 perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
1350 /* Write to enable desired perf counters */
1351 WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
1352 /* Zero out and enable the perf counters
1354 * Bit 0 = Start all counters(1)
1355 * Bit 2 = Global counter reset enable(1)
1357 WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
1361 /* Load the shadow and disable the perf counters
1363 * Bit 0 = Stop counters(0)
1364 * Bit 1 = Load the shadow counters(1)
1366 WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
1368 /* Read register values to get any >32bit overflow */
1369 tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
1370 cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
1371 cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
1373 /* Get the values and add the overflow */
1374 *count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
1375 *count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
1378 static uint64_t si_get_pcie_replay_count(struct amdgpu_device *adev)
1380 uint64_t nak_r, nak_g;
1382 /* Get the number of NAKs received and generated */
1383 nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
1384 nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
1386 /* Add the total number of NAKs, i.e the number of replays */
1387 return (nak_r + nak_g);
1390 static const struct amdgpu_asic_funcs si_asic_funcs =
1392 .read_disabled_bios = &si_read_disabled_bios,
1393 .read_bios_from_rom = &si_read_bios_from_rom,
1394 .read_register = &si_read_register,
1395 .reset = &si_asic_reset,
1396 .set_vga_state = &si_vga_set_state,
1397 .get_xclk = &si_get_xclk,
1398 .set_uvd_clocks = &si_set_uvd_clocks,
1399 .set_vce_clocks = NULL,
1400 .get_pcie_lanes = &si_get_pcie_lanes,
1401 .set_pcie_lanes = &si_set_pcie_lanes,
1402 .get_config_memsize = &si_get_config_memsize,
1403 .flush_hdp = &si_flush_hdp,
1404 .invalidate_hdp = &si_invalidate_hdp,
1405 .need_full_reset = &si_need_full_reset,
1406 .get_pcie_usage = &si_get_pcie_usage,
1407 .need_reset_on_init = &si_need_reset_on_init,
1408 .get_pcie_replay_count = &si_get_pcie_replay_count,
1411 static uint32_t si_get_rev_id(struct amdgpu_device *adev)
1413 return (RREG32(CC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1414 >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1417 static int si_common_early_init(void *handle)
1419 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1421 adev->smc_rreg = &si_smc_rreg;
1422 adev->smc_wreg = &si_smc_wreg;
1423 adev->pcie_rreg = &si_pcie_rreg;
1424 adev->pcie_wreg = &si_pcie_wreg;
1425 adev->pciep_rreg = &si_pciep_rreg;
1426 adev->pciep_wreg = &si_pciep_wreg;
1427 adev->uvd_ctx_rreg = NULL;
1428 adev->uvd_ctx_wreg = NULL;
1429 adev->didt_rreg = NULL;
1430 adev->didt_wreg = NULL;
1432 adev->asic_funcs = &si_asic_funcs;
1434 adev->rev_id = si_get_rev_id(adev);
1435 adev->external_rev_id = 0xFF;
1436 switch (adev->asic_type) {
1439 AMD_CG_SUPPORT_GFX_MGCG |
1440 AMD_CG_SUPPORT_GFX_MGLS |
1441 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1442 AMD_CG_SUPPORT_GFX_CGLS |
1443 AMD_CG_SUPPORT_GFX_CGTS |
1444 AMD_CG_SUPPORT_GFX_CP_LS |
1445 AMD_CG_SUPPORT_MC_MGCG |
1446 AMD_CG_SUPPORT_SDMA_MGCG |
1447 AMD_CG_SUPPORT_BIF_LS |
1448 AMD_CG_SUPPORT_VCE_MGCG |
1449 AMD_CG_SUPPORT_UVD_MGCG |
1450 AMD_CG_SUPPORT_HDP_LS |
1451 AMD_CG_SUPPORT_HDP_MGCG;
1453 adev->external_rev_id = (adev->rev_id == 0) ? 1 :
1454 (adev->rev_id == 1) ? 5 : 6;
1458 AMD_CG_SUPPORT_GFX_MGCG |
1459 AMD_CG_SUPPORT_GFX_MGLS |
1460 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1461 AMD_CG_SUPPORT_GFX_CGLS |
1462 AMD_CG_SUPPORT_GFX_CGTS |
1463 AMD_CG_SUPPORT_GFX_CP_LS |
1464 AMD_CG_SUPPORT_GFX_RLC_LS |
1465 AMD_CG_SUPPORT_MC_LS |
1466 AMD_CG_SUPPORT_MC_MGCG |
1467 AMD_CG_SUPPORT_SDMA_MGCG |
1468 AMD_CG_SUPPORT_BIF_LS |
1469 AMD_CG_SUPPORT_VCE_MGCG |
1470 AMD_CG_SUPPORT_UVD_MGCG |
1471 AMD_CG_SUPPORT_HDP_LS |
1472 AMD_CG_SUPPORT_HDP_MGCG;
1474 adev->external_rev_id = adev->rev_id + 20;
1479 AMD_CG_SUPPORT_GFX_MGCG |
1480 AMD_CG_SUPPORT_GFX_MGLS |
1481 AMD_CG_SUPPORT_GFX_CGLS |
1482 AMD_CG_SUPPORT_GFX_CGTS |
1483 AMD_CG_SUPPORT_GFX_CGTS_LS |
1484 AMD_CG_SUPPORT_GFX_CP_LS |
1485 AMD_CG_SUPPORT_MC_LS |
1486 AMD_CG_SUPPORT_MC_MGCG |
1487 AMD_CG_SUPPORT_SDMA_MGCG |
1488 AMD_CG_SUPPORT_SDMA_LS |
1489 AMD_CG_SUPPORT_BIF_LS |
1490 AMD_CG_SUPPORT_VCE_MGCG |
1491 AMD_CG_SUPPORT_UVD_MGCG |
1492 AMD_CG_SUPPORT_HDP_LS |
1493 AMD_CG_SUPPORT_HDP_MGCG;
1496 adev->external_rev_id = adev->rev_id + 40;
1500 AMD_CG_SUPPORT_GFX_MGCG |
1501 AMD_CG_SUPPORT_GFX_MGLS |
1502 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1503 AMD_CG_SUPPORT_GFX_CGLS |
1504 AMD_CG_SUPPORT_GFX_CGTS |
1505 AMD_CG_SUPPORT_GFX_CP_LS |
1506 AMD_CG_SUPPORT_GFX_RLC_LS |
1507 AMD_CG_SUPPORT_MC_LS |
1508 AMD_CG_SUPPORT_MC_MGCG |
1509 AMD_CG_SUPPORT_SDMA_MGCG |
1510 AMD_CG_SUPPORT_BIF_LS |
1511 AMD_CG_SUPPORT_UVD_MGCG |
1512 AMD_CG_SUPPORT_HDP_LS |
1513 AMD_CG_SUPPORT_HDP_MGCG;
1515 adev->external_rev_id = 60;
1519 AMD_CG_SUPPORT_GFX_MGCG |
1520 AMD_CG_SUPPORT_GFX_MGLS |
1521 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1522 AMD_CG_SUPPORT_GFX_CGLS |
1523 AMD_CG_SUPPORT_GFX_CGTS |
1524 AMD_CG_SUPPORT_GFX_CP_LS |
1525 AMD_CG_SUPPORT_GFX_RLC_LS |
1526 AMD_CG_SUPPORT_MC_LS |
1527 AMD_CG_SUPPORT_MC_MGCG |
1528 AMD_CG_SUPPORT_SDMA_MGCG |
1529 AMD_CG_SUPPORT_BIF_LS |
1530 AMD_CG_SUPPORT_HDP_LS |
1531 AMD_CG_SUPPORT_HDP_MGCG;
1533 adev->external_rev_id = 70;
1543 static int si_common_sw_init(void *handle)
1548 static int si_common_sw_fini(void *handle)
1554 static void si_init_golden_registers(struct amdgpu_device *adev)
1556 switch (adev->asic_type) {
1558 amdgpu_device_program_register_sequence(adev,
1559 tahiti_golden_registers,
1560 ARRAY_SIZE(tahiti_golden_registers));
1561 amdgpu_device_program_register_sequence(adev,
1562 tahiti_golden_rlc_registers,
1563 ARRAY_SIZE(tahiti_golden_rlc_registers));
1564 amdgpu_device_program_register_sequence(adev,
1565 tahiti_mgcg_cgcg_init,
1566 ARRAY_SIZE(tahiti_mgcg_cgcg_init));
1567 amdgpu_device_program_register_sequence(adev,
1568 tahiti_golden_registers2,
1569 ARRAY_SIZE(tahiti_golden_registers2));
1572 amdgpu_device_program_register_sequence(adev,
1573 pitcairn_golden_registers,
1574 ARRAY_SIZE(pitcairn_golden_registers));
1575 amdgpu_device_program_register_sequence(adev,
1576 pitcairn_golden_rlc_registers,
1577 ARRAY_SIZE(pitcairn_golden_rlc_registers));
1578 amdgpu_device_program_register_sequence(adev,
1579 pitcairn_mgcg_cgcg_init,
1580 ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
1583 amdgpu_device_program_register_sequence(adev,
1584 verde_golden_registers,
1585 ARRAY_SIZE(verde_golden_registers));
1586 amdgpu_device_program_register_sequence(adev,
1587 verde_golden_rlc_registers,
1588 ARRAY_SIZE(verde_golden_rlc_registers));
1589 amdgpu_device_program_register_sequence(adev,
1590 verde_mgcg_cgcg_init,
1591 ARRAY_SIZE(verde_mgcg_cgcg_init));
1592 amdgpu_device_program_register_sequence(adev,
1594 ARRAY_SIZE(verde_pg_init));
1597 amdgpu_device_program_register_sequence(adev,
1598 oland_golden_registers,
1599 ARRAY_SIZE(oland_golden_registers));
1600 amdgpu_device_program_register_sequence(adev,
1601 oland_golden_rlc_registers,
1602 ARRAY_SIZE(oland_golden_rlc_registers));
1603 amdgpu_device_program_register_sequence(adev,
1604 oland_mgcg_cgcg_init,
1605 ARRAY_SIZE(oland_mgcg_cgcg_init));
1608 amdgpu_device_program_register_sequence(adev,
1609 hainan_golden_registers,
1610 ARRAY_SIZE(hainan_golden_registers));
1611 amdgpu_device_program_register_sequence(adev,
1612 hainan_golden_registers2,
1613 ARRAY_SIZE(hainan_golden_registers2));
1614 amdgpu_device_program_register_sequence(adev,
1615 hainan_mgcg_cgcg_init,
1616 ARRAY_SIZE(hainan_mgcg_cgcg_init));
1625 static void si_pcie_gen3_enable(struct amdgpu_device *adev)
1627 struct pci_dev *root = adev->pdev->bus->self;
1628 int bridge_pos, gpu_pos;
1629 u32 speed_cntl, current_data_rate;
1633 if (pci_is_root_bus(adev->pdev->bus))
1636 if (amdgpu_pcie_gen2 == 0)
1639 if (adev->flags & AMD_IS_APU)
1642 if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
1643 CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
1646 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1647 current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
1648 LC_CURRENT_DATA_RATE_SHIFT;
1649 if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1650 if (current_data_rate == 2) {
1651 DRM_INFO("PCIE gen 3 link speeds already enabled\n");
1654 DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
1655 } else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
1656 if (current_data_rate == 1) {
1657 DRM_INFO("PCIE gen 2 link speeds already enabled\n");
1660 DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
1663 bridge_pos = pci_pcie_cap(root);
1667 gpu_pos = pci_pcie_cap(adev->pdev);
1671 if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1672 if (current_data_rate != 2) {
1673 u16 bridge_cfg, gpu_cfg;
1674 u16 bridge_cfg2, gpu_cfg2;
1675 u32 max_lw, current_lw, tmp;
1677 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1678 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1680 tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
1681 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1683 tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
1684 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1686 tmp = RREG32_PCIE(PCIE_LC_STATUS1);
1687 max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
1688 current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
1690 if (current_lw < max_lw) {
1691 tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1692 if (tmp & LC_RENEGOTIATION_SUPPORT) {
1693 tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
1694 tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
1695 tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
1696 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
1700 for (i = 0; i < 10; i++) {
1701 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
1702 if (tmp16 & PCI_EXP_DEVSTA_TRPND)
1705 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1706 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1708 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
1709 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
1711 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1712 tmp |= LC_SET_QUIESCE;
1713 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1715 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1717 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1721 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
1722 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1723 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
1724 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1726 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
1727 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1728 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
1729 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1731 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
1732 tmp16 &= ~((1 << 4) | (7 << 9));
1733 tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
1734 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
1736 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1737 tmp16 &= ~((1 << 4) | (7 << 9));
1738 tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
1739 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1741 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1742 tmp &= ~LC_SET_QUIESCE;
1743 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1748 speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
1749 speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
1750 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1752 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1754 if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
1756 else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
1760 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1762 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1763 speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
1764 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1766 for (i = 0; i < adev->usec_timeout; i++) {
1767 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1768 if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
1774 static inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg)
1776 unsigned long flags;
1779 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1780 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1781 r = RREG32(EVERGREEN_PIF_PHY0_DATA);
1782 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1786 static inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1788 unsigned long flags;
1790 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1791 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1792 WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
1793 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1796 static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
1798 unsigned long flags;
1801 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1802 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1803 r = RREG32(EVERGREEN_PIF_PHY1_DATA);
1804 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1808 static inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1810 unsigned long flags;
1812 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1813 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1814 WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
1815 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1817 static void si_program_aspm(struct amdgpu_device *adev)
1820 bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
1821 bool disable_clkreq = false;
1823 if (amdgpu_aspm == 0)
1826 if (adev->flags & AMD_IS_APU)
1828 orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
1829 data &= ~LC_XMIT_N_FTS_MASK;
1830 data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
1832 WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
1834 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
1835 data |= LC_GO_TO_RECOVERY;
1837 WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
1839 orig = data = RREG32_PCIE(PCIE_P_CNTL);
1840 data |= P_IGNORE_EDB_ERR;
1842 WREG32_PCIE(PCIE_P_CNTL, data);
1844 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
1845 data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
1846 data |= LC_PMI_TO_L1_DIS;
1848 data |= LC_L0S_INACTIVITY(7);
1851 data |= LC_L1_INACTIVITY(7);
1852 data &= ~LC_PMI_TO_L1_DIS;
1854 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1856 if (!disable_plloff_in_l1) {
1857 bool clk_req_support;
1859 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1860 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1861 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1863 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1865 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1866 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1867 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1869 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1871 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1872 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1873 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1875 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1877 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1878 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1879 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1881 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1883 if ((adev->family != CHIP_OLAND) && (adev->family != CHIP_HAINAN)) {
1884 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1885 data &= ~PLL_RAMP_UP_TIME_0_MASK;
1887 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1889 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1890 data &= ~PLL_RAMP_UP_TIME_1_MASK;
1892 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1894 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2);
1895 data &= ~PLL_RAMP_UP_TIME_2_MASK;
1897 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data);
1899 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3);
1900 data &= ~PLL_RAMP_UP_TIME_3_MASK;
1902 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data);
1904 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1905 data &= ~PLL_RAMP_UP_TIME_0_MASK;
1907 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1909 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1910 data &= ~PLL_RAMP_UP_TIME_1_MASK;
1912 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1914 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2);
1915 data &= ~PLL_RAMP_UP_TIME_2_MASK;
1917 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data);
1919 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3);
1920 data &= ~PLL_RAMP_UP_TIME_3_MASK;
1922 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data);
1924 orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1925 data &= ~LC_DYN_LANES_PWR_STATE_MASK;
1926 data |= LC_DYN_LANES_PWR_STATE(3);
1928 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
1930 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL);
1931 data &= ~LS2_EXIT_TIME_MASK;
1932 if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
1933 data |= LS2_EXIT_TIME(5);
1935 si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data);
1937 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL);
1938 data &= ~LS2_EXIT_TIME_MASK;
1939 if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
1940 data |= LS2_EXIT_TIME(5);
1942 si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data);
1944 if (!disable_clkreq &&
1945 !pci_is_root_bus(adev->pdev->bus)) {
1946 struct pci_dev *root = adev->pdev->bus->self;
1949 clk_req_support = false;
1950 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
1951 if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
1952 clk_req_support = true;
1954 clk_req_support = false;
1957 if (clk_req_support) {
1958 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
1959 data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
1961 WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
1963 orig = data = RREG32(THM_CLK_CNTL);
1964 data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
1965 data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
1967 WREG32(THM_CLK_CNTL, data);
1969 orig = data = RREG32(MISC_CLK_CNTL);
1970 data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
1971 data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
1973 WREG32(MISC_CLK_CNTL, data);
1975 orig = data = RREG32(CG_CLKPIN_CNTL);
1976 data &= ~BCLK_AS_XCLK;
1978 WREG32(CG_CLKPIN_CNTL, data);
1980 orig = data = RREG32(CG_CLKPIN_CNTL_2);
1981 data &= ~FORCE_BIF_REFCLK_EN;
1983 WREG32(CG_CLKPIN_CNTL_2, data);
1985 orig = data = RREG32(MPLL_BYPASSCLK_SEL);
1986 data &= ~MPLL_CLKOUT_SEL_MASK;
1987 data |= MPLL_CLKOUT_SEL(4);
1989 WREG32(MPLL_BYPASSCLK_SEL, data);
1991 orig = data = RREG32(SPLL_CNTL_MODE);
1992 data &= ~SPLL_REFCLK_SEL_MASK;
1994 WREG32(SPLL_CNTL_MODE, data);
1999 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2002 orig = data = RREG32_PCIE(PCIE_CNTL2);
2003 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
2005 WREG32_PCIE(PCIE_CNTL2, data);
2008 data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
2009 if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
2010 data = RREG32_PCIE(PCIE_LC_STATUS1);
2011 if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
2012 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
2013 data &= ~LC_L0S_INACTIVITY_MASK;
2015 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2021 static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
2026 readrq = pcie_get_readrq(adev->pdev);
2027 v = ffs(readrq) - 8;
2028 if ((v == 0) || (v == 6) || (v == 7))
2029 pcie_set_readrq(adev->pdev, 512);
2032 static int si_common_hw_init(void *handle)
2034 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2036 si_fix_pci_max_read_req_size(adev);
2037 si_init_golden_registers(adev);
2038 si_pcie_gen3_enable(adev);
2039 si_program_aspm(adev);
2044 static int si_common_hw_fini(void *handle)
2049 static int si_common_suspend(void *handle)
2051 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2053 return si_common_hw_fini(adev);
2056 static int si_common_resume(void *handle)
2058 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2060 return si_common_hw_init(adev);
2063 static bool si_common_is_idle(void *handle)
2068 static int si_common_wait_for_idle(void *handle)
2073 static int si_common_soft_reset(void *handle)
2078 static int si_common_set_clockgating_state(void *handle,
2079 enum amd_clockgating_state state)
2084 static int si_common_set_powergating_state(void *handle,
2085 enum amd_powergating_state state)
2090 static const struct amd_ip_funcs si_common_ip_funcs = {
2091 .name = "si_common",
2092 .early_init = si_common_early_init,
2094 .sw_init = si_common_sw_init,
2095 .sw_fini = si_common_sw_fini,
2096 .hw_init = si_common_hw_init,
2097 .hw_fini = si_common_hw_fini,
2098 .suspend = si_common_suspend,
2099 .resume = si_common_resume,
2100 .is_idle = si_common_is_idle,
2101 .wait_for_idle = si_common_wait_for_idle,
2102 .soft_reset = si_common_soft_reset,
2103 .set_clockgating_state = si_common_set_clockgating_state,
2104 .set_powergating_state = si_common_set_powergating_state,
2107 static const struct amdgpu_ip_block_version si_common_ip_block =
2109 .type = AMD_IP_BLOCK_TYPE_COMMON,
2113 .funcs = &si_common_ip_funcs,
2116 int si_set_ip_blocks(struct amdgpu_device *adev)
2118 si_detect_hw_virtualization(adev);
2120 switch (adev->asic_type) {
2124 amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2125 amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2126 amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2127 amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2128 amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2129 amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2130 if (adev->enable_virtual_display)
2131 amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2133 amdgpu_device_ip_block_add(adev, &dce_v6_0_ip_block);
2134 /* amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block); */
2135 /* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2138 amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2139 amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2140 amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2141 amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2142 amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2143 amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2144 if (adev->enable_virtual_display)
2145 amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2147 amdgpu_device_ip_block_add(adev, &dce_v6_4_ip_block);
2149 /* amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block); */
2150 /* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2153 amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2154 amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2155 amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2156 amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2157 amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2158 amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2159 if (adev->enable_virtual_display)
2160 amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);