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>
27 #include <linux/pci.h>
30 #include "amdgpu_atombios.h"
31 #include "amdgpu_ih.h"
32 #include "amdgpu_uvd.h"
33 #include "amdgpu_vce.h"
45 #include "dce_virtual.h"
46 #include "gca/gfx_6_0_d.h"
47 #include "oss/oss_1_0_d.h"
48 #include "oss/oss_1_0_sh_mask.h"
49 #include "gmc/gmc_6_0_d.h"
50 #include "dce/dce_6_0_d.h"
51 #include "uvd/uvd_4_0_d.h"
52 #include "bif/bif_3_0_d.h"
53 #include "bif/bif_3_0_sh_mask.h"
55 static const u32 tahiti_golden_registers[] =
57 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
58 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
59 mmDB_DEBUG, 0xffffffff, 0x00000000,
60 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
61 mmDB_DEBUG3, 0x0002021c, 0x00020200,
62 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
63 0x340c, 0x000000c0, 0x00800040,
64 0x360c, 0x000000c0, 0x00800040,
65 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
66 mmFBC_MISC, 0x00200000, 0x50100000,
67 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
68 mmMC_ARB_WTM_CNTL_RD, 0x00000003, 0x000007ff,
69 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
70 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
71 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
72 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
73 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
74 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
75 0x000c, 0xffffffff, 0x0040,
76 0x000d, 0x00000040, 0x00004040,
77 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
78 mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
79 mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
80 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
81 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
82 mmTCP_ADDR_CONFIG, 0x00000200, 0x000002fb,
83 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x0000543b,
84 mmTCP_CHAN_STEER_LO, 0xffffffff, 0xa9210876,
85 mmVGT_FIFO_DEPTHS, 0xffffffff, 0x000fff40,
86 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
87 mmVM_CONTEXT0_CNTL, 0x20000000, 0x20fffed8,
88 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
89 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
90 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
91 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
92 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
95 static const u32 tahiti_golden_registers2[] =
97 mmMCIF_MEM_CONTROL, 0x00000001, 0x00000001,
100 static const u32 tahiti_golden_rlc_registers[] =
102 mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
103 mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
104 0x311f, 0xffffffff, 0x10104040,
105 0x3122, 0xffffffff, 0x0100000a,
106 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
107 mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
108 mmUVD_CGC_GATE, 0x00000008, 0x00000000,
111 static const u32 pitcairn_golden_registers[] =
113 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
114 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
115 mmDB_DEBUG, 0xffffffff, 0x00000000,
116 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
117 mmDB_DEBUG3, 0x0002021c, 0x00020200,
118 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
119 0x340c, 0x000300c0, 0x00800040,
120 0x360c, 0x000300c0, 0x00800040,
121 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
122 mmFBC_MISC, 0x00200000, 0x50100000,
123 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
124 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
125 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
126 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
127 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
128 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
129 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
130 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
131 0x000c, 0xffffffff, 0x0040,
132 0x000d, 0x00000040, 0x00004040,
133 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
134 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
135 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
136 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7,
137 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
138 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x32761054,
139 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
140 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
141 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
142 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
143 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
144 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
147 static const u32 pitcairn_golden_rlc_registers[] =
149 mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
150 mmRLC_LB_PARAMS, 0xffffffff, 0x00601004,
151 0x311f, 0xffffffff, 0x10102020,
152 0x3122, 0xffffffff, 0x01000020,
153 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
154 mmRLC_LB_CNTL, 0xffffffff, 0x800000a4,
157 static const u32 verde_pg_init[] =
159 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x40000,
160 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x200010ff,
161 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
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, 0x7007,
167 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x300010ff,
168 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
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, 0x400000,
174 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x100010ff,
175 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
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, 0x120200,
181 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x500010ff,
182 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
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, 0x1e1e16,
188 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x600010ff,
189 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
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, 0x171f1e,
195 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x700010ff,
196 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
197 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
198 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
199 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
200 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
201 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
202 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x9ff,
203 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x0,
204 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10000800,
205 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
206 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
207 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4,
208 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1000051e,
209 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
210 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
211 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x8,
212 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x80500,
213 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x12,
214 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x9050c,
215 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1d,
216 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xb052c,
217 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2a,
218 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1053e,
219 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2d,
220 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10546,
221 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x30,
222 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xa054e,
223 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3c,
224 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1055f,
225 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3f,
226 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10567,
227 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x42,
228 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1056f,
229 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x45,
230 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10572,
231 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x48,
232 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20575,
233 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4c,
234 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x190801,
235 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x67,
236 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1082a,
237 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x6a,
238 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1b082d,
239 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x87,
240 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x310851,
241 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xba,
242 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x891,
243 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbc,
244 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x893,
245 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbe,
246 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20895,
247 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc2,
248 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20899,
249 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc6,
250 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2089d,
251 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xca,
252 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a1,
253 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xcc,
254 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a3,
255 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xce,
256 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x308a5,
257 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xd3,
258 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x6d08cd,
259 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x142,
260 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2000095a,
261 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1,
262 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x144,
263 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x301f095b,
264 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x165,
265 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc094d,
266 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x173,
267 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf096d,
268 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x184,
269 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x15097f,
270 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x19b,
271 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc0998,
272 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1a9,
273 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x409a7,
274 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1af,
275 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xcdc,
276 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1b1,
277 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x800,
278 mmGMCON_RENG_EXECUTE, 0xffffffff, 0x6c9b2000,
279 mmGMCON_MISC2, 0xfc00, 0x2000,
280 mmGMCON_MISC3, 0xffffffff, 0xfc0,
281 mmMC_PMG_AUTO_CFG, 0x00000100, 0x100,
284 static const u32 verde_golden_rlc_registers[] =
286 mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
287 mmRLC_LB_PARAMS, 0xffffffff, 0x033f1005,
288 0x311f, 0xffffffff, 0x10808020,
289 0x3122, 0xffffffff, 0x00800008,
290 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00001000,
291 mmRLC_LB_CNTL, 0xffffffff, 0x80010014,
294 static const u32 verde_golden_registers[] =
296 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
297 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
298 mmDB_DEBUG, 0xffffffff, 0x00000000,
299 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
300 mmDB_DEBUG3, 0x0002021c, 0x00020200,
301 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
302 0x340c, 0x000300c0, 0x00800040,
303 0x360c, 0x000300c0, 0x00800040,
304 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
305 mmFBC_MISC, 0x00200000, 0x50100000,
306 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
307 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
308 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
309 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
310 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
311 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
312 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
313 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x0000124a,
314 0x000c, 0xffffffff, 0x0040,
315 0x000d, 0x00000040, 0x00004040,
316 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
317 mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
318 mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
319 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
320 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
321 mmTCP_ADDR_CONFIG, 0x000003ff, 0x00000003,
322 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
323 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00001032,
324 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
325 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
326 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
327 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
328 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
329 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
332 static const u32 oland_golden_registers[] =
334 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
335 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
336 mmDB_DEBUG, 0xffffffff, 0x00000000,
337 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
338 mmDB_DEBUG3, 0x0002021c, 0x00020200,
339 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
340 0x340c, 0x000300c0, 0x00800040,
341 0x360c, 0x000300c0, 0x00800040,
342 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
343 mmFBC_MISC, 0x00200000, 0x50100000,
344 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
345 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
346 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
347 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
348 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
349 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
350 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
351 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000082,
352 0x000c, 0xffffffff, 0x0040,
353 0x000d, 0x00000040, 0x00004040,
354 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
355 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
356 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
357 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f3,
358 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
359 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
360 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
361 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
362 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
363 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
364 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
365 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
369 static const u32 oland_golden_rlc_registers[] =
371 mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
372 mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
373 0x311f, 0xffffffff, 0x10104040,
374 0x3122, 0xffffffff, 0x0100000a,
375 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
376 mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
379 static const u32 hainan_golden_registers[] =
381 0x17bc, 0x00000030, 0x00000011,
382 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
383 mmDB_DEBUG, 0xffffffff, 0x00000000,
384 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
385 mmDB_DEBUG3, 0x0002021c, 0x00020200,
386 0x031e, 0x00000080, 0x00000000,
387 0x3430, 0xff000fff, 0x00000100,
388 0x340c, 0x000300c0, 0x00800040,
389 0x3630, 0xff000fff, 0x00000100,
390 0x360c, 0x000300c0, 0x00800040,
391 0x16ec, 0x000000f0, 0x00000070,
392 0x16f0, 0x00200000, 0x50100000,
393 0x1c0c, 0x31000311, 0x00000011,
394 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
395 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
396 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
397 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
398 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
399 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
400 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000000,
401 0x000c, 0xffffffff, 0x0040,
402 0x000d, 0x00000040, 0x00004040,
403 mmSPI_CONFIG_CNTL, 0x03e00000, 0x03600000,
404 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
405 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
406 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f1,
407 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
408 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
409 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
410 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
411 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
412 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
413 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
414 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
417 static const u32 hainan_golden_registers2[] =
419 mmGB_ADDR_CONFIG, 0xffffffff, 0x2011003,
422 static const u32 tahiti_mgcg_cgcg_init[] =
424 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
425 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
426 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
427 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
428 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
429 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
430 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
431 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
432 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
433 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
434 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
435 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
436 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
437 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
438 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
439 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
440 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
441 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
442 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
443 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
444 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
445 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
446 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
447 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
448 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
449 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
450 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
451 0x2458, 0xffffffff, 0x00010000,
452 0x2459, 0xffffffff, 0x00030002,
453 0x245a, 0xffffffff, 0x00040007,
454 0x245b, 0xffffffff, 0x00060005,
455 0x245c, 0xffffffff, 0x00090008,
456 0x245d, 0xffffffff, 0x00020001,
457 0x245e, 0xffffffff, 0x00040003,
458 0x245f, 0xffffffff, 0x00000007,
459 0x2460, 0xffffffff, 0x00060005,
460 0x2461, 0xffffffff, 0x00090008,
461 0x2462, 0xffffffff, 0x00030002,
462 0x2463, 0xffffffff, 0x00050004,
463 0x2464, 0xffffffff, 0x00000008,
464 0x2465, 0xffffffff, 0x00070006,
465 0x2466, 0xffffffff, 0x000a0009,
466 0x2467, 0xffffffff, 0x00040003,
467 0x2468, 0xffffffff, 0x00060005,
468 0x2469, 0xffffffff, 0x00000009,
469 0x246a, 0xffffffff, 0x00080007,
470 0x246b, 0xffffffff, 0x000b000a,
471 0x246c, 0xffffffff, 0x00050004,
472 0x246d, 0xffffffff, 0x00070006,
473 0x246e, 0xffffffff, 0x0008000b,
474 0x246f, 0xffffffff, 0x000a0009,
475 0x2470, 0xffffffff, 0x000d000c,
476 0x2471, 0xffffffff, 0x00060005,
477 0x2472, 0xffffffff, 0x00080007,
478 0x2473, 0xffffffff, 0x0000000b,
479 0x2474, 0xffffffff, 0x000a0009,
480 0x2475, 0xffffffff, 0x000d000c,
481 0x2476, 0xffffffff, 0x00070006,
482 0x2477, 0xffffffff, 0x00090008,
483 0x2478, 0xffffffff, 0x0000000c,
484 0x2479, 0xffffffff, 0x000b000a,
485 0x247a, 0xffffffff, 0x000e000d,
486 0x247b, 0xffffffff, 0x00080007,
487 0x247c, 0xffffffff, 0x000a0009,
488 0x247d, 0xffffffff, 0x0000000d,
489 0x247e, 0xffffffff, 0x000c000b,
490 0x247f, 0xffffffff, 0x000f000e,
491 0x2480, 0xffffffff, 0x00090008,
492 0x2481, 0xffffffff, 0x000b000a,
493 0x2482, 0xffffffff, 0x000c000f,
494 0x2483, 0xffffffff, 0x000e000d,
495 0x2484, 0xffffffff, 0x00110010,
496 0x2485, 0xffffffff, 0x000a0009,
497 0x2486, 0xffffffff, 0x000c000b,
498 0x2487, 0xffffffff, 0x0000000f,
499 0x2488, 0xffffffff, 0x000e000d,
500 0x2489, 0xffffffff, 0x00110010,
501 0x248a, 0xffffffff, 0x000b000a,
502 0x248b, 0xffffffff, 0x000d000c,
503 0x248c, 0xffffffff, 0x00000010,
504 0x248d, 0xffffffff, 0x000f000e,
505 0x248e, 0xffffffff, 0x00120011,
506 0x248f, 0xffffffff, 0x000c000b,
507 0x2490, 0xffffffff, 0x000e000d,
508 0x2491, 0xffffffff, 0x00000011,
509 0x2492, 0xffffffff, 0x0010000f,
510 0x2493, 0xffffffff, 0x00130012,
511 0x2494, 0xffffffff, 0x000d000c,
512 0x2495, 0xffffffff, 0x000f000e,
513 0x2496, 0xffffffff, 0x00100013,
514 0x2497, 0xffffffff, 0x00120011,
515 0x2498, 0xffffffff, 0x00150014,
516 0x2499, 0xffffffff, 0x000e000d,
517 0x249a, 0xffffffff, 0x0010000f,
518 0x249b, 0xffffffff, 0x00000013,
519 0x249c, 0xffffffff, 0x00120011,
520 0x249d, 0xffffffff, 0x00150014,
521 0x249e, 0xffffffff, 0x000f000e,
522 0x249f, 0xffffffff, 0x00110010,
523 0x24a0, 0xffffffff, 0x00000014,
524 0x24a1, 0xffffffff, 0x00130012,
525 0x24a2, 0xffffffff, 0x00160015,
526 0x24a3, 0xffffffff, 0x0010000f,
527 0x24a4, 0xffffffff, 0x00120011,
528 0x24a5, 0xffffffff, 0x00000015,
529 0x24a6, 0xffffffff, 0x00140013,
530 0x24a7, 0xffffffff, 0x00170016,
531 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
532 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
533 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
534 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
535 0x000c, 0xffffffff, 0x0000001c,
536 0x000d, 0x000f0000, 0x000f0000,
537 0x0583, 0xffffffff, 0x00000100,
538 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
539 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
540 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
541 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
542 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
543 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
544 0x157a, 0x00000001, 0x00000001,
545 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
546 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
547 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
548 0x3430, 0xfffffff0, 0x00000100,
549 0x3630, 0xfffffff0, 0x00000100,
551 static const u32 pitcairn_mgcg_cgcg_init[] =
553 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
554 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
555 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
556 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
557 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
558 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
559 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
560 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
561 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
562 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
563 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
564 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
565 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
566 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
567 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
568 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
569 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
570 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
571 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
572 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
573 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
574 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
575 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
576 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
577 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
578 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
579 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
580 0x2458, 0xffffffff, 0x00010000,
581 0x2459, 0xffffffff, 0x00030002,
582 0x245a, 0xffffffff, 0x00040007,
583 0x245b, 0xffffffff, 0x00060005,
584 0x245c, 0xffffffff, 0x00090008,
585 0x245d, 0xffffffff, 0x00020001,
586 0x245e, 0xffffffff, 0x00040003,
587 0x245f, 0xffffffff, 0x00000007,
588 0x2460, 0xffffffff, 0x00060005,
589 0x2461, 0xffffffff, 0x00090008,
590 0x2462, 0xffffffff, 0x00030002,
591 0x2463, 0xffffffff, 0x00050004,
592 0x2464, 0xffffffff, 0x00000008,
593 0x2465, 0xffffffff, 0x00070006,
594 0x2466, 0xffffffff, 0x000a0009,
595 0x2467, 0xffffffff, 0x00040003,
596 0x2468, 0xffffffff, 0x00060005,
597 0x2469, 0xffffffff, 0x00000009,
598 0x246a, 0xffffffff, 0x00080007,
599 0x246b, 0xffffffff, 0x000b000a,
600 0x246c, 0xffffffff, 0x00050004,
601 0x246d, 0xffffffff, 0x00070006,
602 0x246e, 0xffffffff, 0x0008000b,
603 0x246f, 0xffffffff, 0x000a0009,
604 0x2470, 0xffffffff, 0x000d000c,
605 0x2480, 0xffffffff, 0x00090008,
606 0x2481, 0xffffffff, 0x000b000a,
607 0x2482, 0xffffffff, 0x000c000f,
608 0x2483, 0xffffffff, 0x000e000d,
609 0x2484, 0xffffffff, 0x00110010,
610 0x2485, 0xffffffff, 0x000a0009,
611 0x2486, 0xffffffff, 0x000c000b,
612 0x2487, 0xffffffff, 0x0000000f,
613 0x2488, 0xffffffff, 0x000e000d,
614 0x2489, 0xffffffff, 0x00110010,
615 0x248a, 0xffffffff, 0x000b000a,
616 0x248b, 0xffffffff, 0x000d000c,
617 0x248c, 0xffffffff, 0x00000010,
618 0x248d, 0xffffffff, 0x000f000e,
619 0x248e, 0xffffffff, 0x00120011,
620 0x248f, 0xffffffff, 0x000c000b,
621 0x2490, 0xffffffff, 0x000e000d,
622 0x2491, 0xffffffff, 0x00000011,
623 0x2492, 0xffffffff, 0x0010000f,
624 0x2493, 0xffffffff, 0x00130012,
625 0x2494, 0xffffffff, 0x000d000c,
626 0x2495, 0xffffffff, 0x000f000e,
627 0x2496, 0xffffffff, 0x00100013,
628 0x2497, 0xffffffff, 0x00120011,
629 0x2498, 0xffffffff, 0x00150014,
630 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
631 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
632 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
633 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
634 0x000c, 0xffffffff, 0x0000001c,
635 0x000d, 0x000f0000, 0x000f0000,
636 0x0583, 0xffffffff, 0x00000100,
637 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
638 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
639 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
640 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
641 0x157a, 0x00000001, 0x00000001,
642 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
643 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
644 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
645 0x3430, 0xfffffff0, 0x00000100,
646 0x3630, 0xfffffff0, 0x00000100,
649 static const u32 verde_mgcg_cgcg_init[] =
651 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
652 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
653 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
654 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
655 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
656 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
657 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
658 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
659 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
660 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
661 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
662 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
663 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
664 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
665 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
666 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
667 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
668 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
669 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
670 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
671 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
672 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
673 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
674 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
675 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
676 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
677 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
678 0x2458, 0xffffffff, 0x00010000,
679 0x2459, 0xffffffff, 0x00030002,
680 0x245a, 0xffffffff, 0x00040007,
681 0x245b, 0xffffffff, 0x00060005,
682 0x245c, 0xffffffff, 0x00090008,
683 0x245d, 0xffffffff, 0x00020001,
684 0x245e, 0xffffffff, 0x00040003,
685 0x245f, 0xffffffff, 0x00000007,
686 0x2460, 0xffffffff, 0x00060005,
687 0x2461, 0xffffffff, 0x00090008,
688 0x2462, 0xffffffff, 0x00030002,
689 0x2463, 0xffffffff, 0x00050004,
690 0x2464, 0xffffffff, 0x00000008,
691 0x2465, 0xffffffff, 0x00070006,
692 0x2466, 0xffffffff, 0x000a0009,
693 0x2467, 0xffffffff, 0x00040003,
694 0x2468, 0xffffffff, 0x00060005,
695 0x2469, 0xffffffff, 0x00000009,
696 0x246a, 0xffffffff, 0x00080007,
697 0x246b, 0xffffffff, 0x000b000a,
698 0x246c, 0xffffffff, 0x00050004,
699 0x246d, 0xffffffff, 0x00070006,
700 0x246e, 0xffffffff, 0x0008000b,
701 0x246f, 0xffffffff, 0x000a0009,
702 0x2470, 0xffffffff, 0x000d000c,
703 0x2480, 0xffffffff, 0x00090008,
704 0x2481, 0xffffffff, 0x000b000a,
705 0x2482, 0xffffffff, 0x000c000f,
706 0x2483, 0xffffffff, 0x000e000d,
707 0x2484, 0xffffffff, 0x00110010,
708 0x2485, 0xffffffff, 0x000a0009,
709 0x2486, 0xffffffff, 0x000c000b,
710 0x2487, 0xffffffff, 0x0000000f,
711 0x2488, 0xffffffff, 0x000e000d,
712 0x2489, 0xffffffff, 0x00110010,
713 0x248a, 0xffffffff, 0x000b000a,
714 0x248b, 0xffffffff, 0x000d000c,
715 0x248c, 0xffffffff, 0x00000010,
716 0x248d, 0xffffffff, 0x000f000e,
717 0x248e, 0xffffffff, 0x00120011,
718 0x248f, 0xffffffff, 0x000c000b,
719 0x2490, 0xffffffff, 0x000e000d,
720 0x2491, 0xffffffff, 0x00000011,
721 0x2492, 0xffffffff, 0x0010000f,
722 0x2493, 0xffffffff, 0x00130012,
723 0x2494, 0xffffffff, 0x000d000c,
724 0x2495, 0xffffffff, 0x000f000e,
725 0x2496, 0xffffffff, 0x00100013,
726 0x2497, 0xffffffff, 0x00120011,
727 0x2498, 0xffffffff, 0x00150014,
728 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
729 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
730 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
731 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
732 0x000c, 0xffffffff, 0x0000001c,
733 0x000d, 0x000f0000, 0x000f0000,
734 0x0583, 0xffffffff, 0x00000100,
735 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
736 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
737 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
738 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
739 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
740 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
741 0x157a, 0x00000001, 0x00000001,
742 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
743 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
744 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
745 0x3430, 0xfffffff0, 0x00000100,
746 0x3630, 0xfffffff0, 0x00000100,
749 static const u32 oland_mgcg_cgcg_init[] =
751 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
752 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
753 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
754 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
755 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
756 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
757 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
758 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
759 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
760 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
761 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
762 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
763 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
764 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
765 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
766 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
767 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
768 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
769 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
770 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
771 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
772 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
773 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
774 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
775 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
776 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
777 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
778 0x2458, 0xffffffff, 0x00010000,
779 0x2459, 0xffffffff, 0x00030002,
780 0x245a, 0xffffffff, 0x00040007,
781 0x245b, 0xffffffff, 0x00060005,
782 0x245c, 0xffffffff, 0x00090008,
783 0x245d, 0xffffffff, 0x00020001,
784 0x245e, 0xffffffff, 0x00040003,
785 0x245f, 0xffffffff, 0x00000007,
786 0x2460, 0xffffffff, 0x00060005,
787 0x2461, 0xffffffff, 0x00090008,
788 0x2462, 0xffffffff, 0x00030002,
789 0x2463, 0xffffffff, 0x00050004,
790 0x2464, 0xffffffff, 0x00000008,
791 0x2465, 0xffffffff, 0x00070006,
792 0x2466, 0xffffffff, 0x000a0009,
793 0x2467, 0xffffffff, 0x00040003,
794 0x2468, 0xffffffff, 0x00060005,
795 0x2469, 0xffffffff, 0x00000009,
796 0x246a, 0xffffffff, 0x00080007,
797 0x246b, 0xffffffff, 0x000b000a,
798 0x246c, 0xffffffff, 0x00050004,
799 0x246d, 0xffffffff, 0x00070006,
800 0x246e, 0xffffffff, 0x0008000b,
801 0x246f, 0xffffffff, 0x000a0009,
802 0x2470, 0xffffffff, 0x000d000c,
803 0x2471, 0xffffffff, 0x00060005,
804 0x2472, 0xffffffff, 0x00080007,
805 0x2473, 0xffffffff, 0x0000000b,
806 0x2474, 0xffffffff, 0x000a0009,
807 0x2475, 0xffffffff, 0x000d000c,
808 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
809 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
810 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
811 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
812 0x000c, 0xffffffff, 0x0000001c,
813 0x000d, 0x000f0000, 0x000f0000,
814 0x0583, 0xffffffff, 0x00000100,
815 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
816 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
817 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
818 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
819 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
820 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
821 0x157a, 0x00000001, 0x00000001,
822 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
823 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
824 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
825 0x3430, 0xfffffff0, 0x00000100,
826 0x3630, 0xfffffff0, 0x00000100,
829 static const u32 hainan_mgcg_cgcg_init[] =
831 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
832 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
833 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
834 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
835 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
836 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
837 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
838 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
839 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
840 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
841 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
842 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
843 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
844 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
845 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
846 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
847 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
848 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
849 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
850 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
851 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
852 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
853 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
854 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
855 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
856 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
857 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
858 0x2458, 0xffffffff, 0x00010000,
859 0x2459, 0xffffffff, 0x00030002,
860 0x245a, 0xffffffff, 0x00040007,
861 0x245b, 0xffffffff, 0x00060005,
862 0x245c, 0xffffffff, 0x00090008,
863 0x245d, 0xffffffff, 0x00020001,
864 0x245e, 0xffffffff, 0x00040003,
865 0x245f, 0xffffffff, 0x00000007,
866 0x2460, 0xffffffff, 0x00060005,
867 0x2461, 0xffffffff, 0x00090008,
868 0x2462, 0xffffffff, 0x00030002,
869 0x2463, 0xffffffff, 0x00050004,
870 0x2464, 0xffffffff, 0x00000008,
871 0x2465, 0xffffffff, 0x00070006,
872 0x2466, 0xffffffff, 0x000a0009,
873 0x2467, 0xffffffff, 0x00040003,
874 0x2468, 0xffffffff, 0x00060005,
875 0x2469, 0xffffffff, 0x00000009,
876 0x246a, 0xffffffff, 0x00080007,
877 0x246b, 0xffffffff, 0x000b000a,
878 0x246c, 0xffffffff, 0x00050004,
879 0x246d, 0xffffffff, 0x00070006,
880 0x246e, 0xffffffff, 0x0008000b,
881 0x246f, 0xffffffff, 0x000a0009,
882 0x2470, 0xffffffff, 0x000d000c,
883 0x2471, 0xffffffff, 0x00060005,
884 0x2472, 0xffffffff, 0x00080007,
885 0x2473, 0xffffffff, 0x0000000b,
886 0x2474, 0xffffffff, 0x000a0009,
887 0x2475, 0xffffffff, 0x000d000c,
888 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
889 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
890 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
891 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
892 0x000c, 0xffffffff, 0x0000001c,
893 0x000d, 0x000f0000, 0x000f0000,
894 0x0583, 0xffffffff, 0x00000100,
895 0x0409, 0xffffffff, 0x00000100,
896 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
897 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
898 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
899 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
900 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
901 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
902 0x3430, 0xfffffff0, 0x00000100,
903 0x3630, 0xfffffff0, 0x00000100,
906 static u32 si_pcie_rreg(struct amdgpu_device *adev, u32 reg)
911 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
912 WREG32(AMDGPU_PCIE_INDEX, reg);
913 (void)RREG32(AMDGPU_PCIE_INDEX);
914 r = RREG32(AMDGPU_PCIE_DATA);
915 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
919 static void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
923 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
924 WREG32(AMDGPU_PCIE_INDEX, reg);
925 (void)RREG32(AMDGPU_PCIE_INDEX);
926 WREG32(AMDGPU_PCIE_DATA, v);
927 (void)RREG32(AMDGPU_PCIE_DATA);
928 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
931 static u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
936 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
937 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
938 (void)RREG32(PCIE_PORT_INDEX);
939 r = RREG32(PCIE_PORT_DATA);
940 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
944 static void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
948 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
949 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
950 (void)RREG32(PCIE_PORT_INDEX);
951 WREG32(PCIE_PORT_DATA, (v));
952 (void)RREG32(PCIE_PORT_DATA);
953 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
956 static u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg)
961 spin_lock_irqsave(&adev->smc_idx_lock, flags);
962 WREG32(SMC_IND_INDEX_0, (reg));
963 r = RREG32(SMC_IND_DATA_0);
964 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
968 static void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
972 spin_lock_irqsave(&adev->smc_idx_lock, flags);
973 WREG32(SMC_IND_INDEX_0, (reg));
974 WREG32(SMC_IND_DATA_0, (v));
975 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
978 static u32 si_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
983 spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
984 WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
985 r = RREG32(mmUVD_CTX_DATA);
986 spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
990 static void si_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
994 spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
995 WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
996 WREG32(mmUVD_CTX_DATA, (v));
997 spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
1000 static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = {
1003 {mmGRBM_STATUS_SE0},
1004 {mmGRBM_STATUS_SE1},
1007 {DMA_STATUS_REG + DMA0_REGISTER_OFFSET},
1008 {DMA_STATUS_REG + DMA1_REGISTER_OFFSET},
1010 {mmCP_STALLED_STAT1},
1011 {mmCP_STALLED_STAT2},
1012 {mmCP_STALLED_STAT3},
1047 {CC_RB_BACKEND_DISABLE, true},
1048 {GC_USER_RB_BACKEND_DISABLE, true},
1049 {PA_SC_RASTER_CONFIG, true},
1052 static uint32_t si_get_register_value(struct amdgpu_device *adev,
1053 bool indexed, u32 se_num,
1054 u32 sh_num, u32 reg_offset)
1058 unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
1059 unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
1061 switch (reg_offset) {
1062 case mmCC_RB_BACKEND_DISABLE:
1063 return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
1064 case mmGC_USER_RB_BACKEND_DISABLE:
1065 return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
1066 case mmPA_SC_RASTER_CONFIG:
1067 return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
1070 mutex_lock(&adev->grbm_idx_mutex);
1071 if (se_num != 0xffffffff || sh_num != 0xffffffff)
1072 amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
1074 val = RREG32(reg_offset);
1076 if (se_num != 0xffffffff || sh_num != 0xffffffff)
1077 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1078 mutex_unlock(&adev->grbm_idx_mutex);
1083 switch (reg_offset) {
1084 case mmGB_ADDR_CONFIG:
1085 return adev->gfx.config.gb_addr_config;
1086 case mmMC_ARB_RAMCFG:
1087 return adev->gfx.config.mc_arb_ramcfg;
1088 case mmGB_TILE_MODE0:
1089 case mmGB_TILE_MODE1:
1090 case mmGB_TILE_MODE2:
1091 case mmGB_TILE_MODE3:
1092 case mmGB_TILE_MODE4:
1093 case mmGB_TILE_MODE5:
1094 case mmGB_TILE_MODE6:
1095 case mmGB_TILE_MODE7:
1096 case mmGB_TILE_MODE8:
1097 case mmGB_TILE_MODE9:
1098 case mmGB_TILE_MODE10:
1099 case mmGB_TILE_MODE11:
1100 case mmGB_TILE_MODE12:
1101 case mmGB_TILE_MODE13:
1102 case mmGB_TILE_MODE14:
1103 case mmGB_TILE_MODE15:
1104 case mmGB_TILE_MODE16:
1105 case mmGB_TILE_MODE17:
1106 case mmGB_TILE_MODE18:
1107 case mmGB_TILE_MODE19:
1108 case mmGB_TILE_MODE20:
1109 case mmGB_TILE_MODE21:
1110 case mmGB_TILE_MODE22:
1111 case mmGB_TILE_MODE23:
1112 case mmGB_TILE_MODE24:
1113 case mmGB_TILE_MODE25:
1114 case mmGB_TILE_MODE26:
1115 case mmGB_TILE_MODE27:
1116 case mmGB_TILE_MODE28:
1117 case mmGB_TILE_MODE29:
1118 case mmGB_TILE_MODE30:
1119 case mmGB_TILE_MODE31:
1120 idx = (reg_offset - mmGB_TILE_MODE0);
1121 return adev->gfx.config.tile_mode_array[idx];
1123 return RREG32(reg_offset);
1127 static int si_read_register(struct amdgpu_device *adev, u32 se_num,
1128 u32 sh_num, u32 reg_offset, u32 *value)
1133 for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) {
1134 bool indexed = si_allowed_read_registers[i].grbm_indexed;
1136 if (reg_offset != si_allowed_read_registers[i].reg_offset)
1139 *value = si_get_register_value(adev, indexed, se_num, sh_num,
1146 static bool si_read_disabled_bios(struct amdgpu_device *adev)
1149 u32 d1vga_control = 0;
1150 u32 d2vga_control = 0;
1151 u32 vga_render_control = 0;
1155 bus_cntl = RREG32(R600_BUS_CNTL);
1156 if (adev->mode_info.num_crtc) {
1157 d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
1158 d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
1159 vga_render_control = RREG32(VGA_RENDER_CONTROL);
1161 rom_cntl = RREG32(R600_ROM_CNTL);
1163 /* enable the rom */
1164 WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
1165 if (adev->mode_info.num_crtc) {
1166 /* Disable VGA mode */
1167 WREG32(AVIVO_D1VGA_CONTROL,
1168 (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1169 AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1170 WREG32(AVIVO_D2VGA_CONTROL,
1171 (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1172 AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1173 WREG32(VGA_RENDER_CONTROL,
1174 (vga_render_control & C_000300_VGA_VSTATUS_CNTL));
1176 WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
1178 r = amdgpu_read_bios(adev);
1181 WREG32(R600_BUS_CNTL, bus_cntl);
1182 if (adev->mode_info.num_crtc) {
1183 WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
1184 WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
1185 WREG32(VGA_RENDER_CONTROL, vga_render_control);
1187 WREG32(R600_ROM_CNTL, rom_cntl);
1191 #define mmROM_INDEX 0x2A
1192 #define mmROM_DATA 0x2B
1194 static bool si_read_bios_from_rom(struct amdgpu_device *adev,
1195 u8 *bios, u32 length_bytes)
1202 if (length_bytes == 0)
1204 /* APU vbios image is part of sbios image */
1205 if (adev->flags & AMD_IS_APU)
1208 dw_ptr = (u32 *)bios;
1209 length_dw = ALIGN(length_bytes, 4) / 4;
1210 /* set rom index to 0 */
1211 WREG32(mmROM_INDEX, 0);
1212 for (i = 0; i < length_dw; i++)
1213 dw_ptr[i] = RREG32(mmROM_DATA);
1218 //xxx: not implemented
1219 static int si_asic_reset(struct amdgpu_device *adev)
1224 static bool si_asic_supports_baco(struct amdgpu_device *adev)
1229 static enum amd_reset_method
1230 si_asic_reset_method(struct amdgpu_device *adev)
1232 return AMD_RESET_METHOD_LEGACY;
1235 static u32 si_get_config_memsize(struct amdgpu_device *adev)
1237 return RREG32(mmCONFIG_MEMSIZE);
1240 static void si_vga_set_state(struct amdgpu_device *adev, bool state)
1244 temp = RREG32(CONFIG_CNTL);
1245 if (state == false) {
1251 WREG32(CONFIG_CNTL, temp);
1254 static u32 si_get_xclk(struct amdgpu_device *adev)
1256 u32 reference_clock = adev->clock.spll.reference_freq;
1259 tmp = RREG32(CG_CLKPIN_CNTL_2);
1260 if (tmp & MUX_TCLK_TO_XCLK)
1263 tmp = RREG32(CG_CLKPIN_CNTL);
1264 if (tmp & XTALIN_DIVIDE)
1265 return reference_clock / 4;
1267 return reference_clock;
1270 //xxx:not implemented
1271 static int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1276 static void si_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
1278 if (!ring || !ring->funcs->emit_wreg) {
1279 WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1280 RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
1282 amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1286 static void si_invalidate_hdp(struct amdgpu_device *adev,
1287 struct amdgpu_ring *ring)
1289 if (!ring || !ring->funcs->emit_wreg) {
1290 WREG32(mmHDP_DEBUG0, 1);
1291 RREG32(mmHDP_DEBUG0);
1293 amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
1297 static bool si_need_full_reset(struct amdgpu_device *adev)
1299 /* change this when we support soft reset */
1303 static bool si_need_reset_on_init(struct amdgpu_device *adev)
1308 static int si_get_pcie_lanes(struct amdgpu_device *adev)
1310 u32 link_width_cntl;
1312 if (adev->flags & AMD_IS_APU)
1315 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1317 switch ((link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT) {
1318 case LC_LINK_WIDTH_X1:
1320 case LC_LINK_WIDTH_X2:
1322 case LC_LINK_WIDTH_X4:
1324 case LC_LINK_WIDTH_X8:
1326 case LC_LINK_WIDTH_X0:
1327 case LC_LINK_WIDTH_X16:
1333 static void si_set_pcie_lanes(struct amdgpu_device *adev, int lanes)
1335 u32 link_width_cntl, mask;
1337 if (adev->flags & AMD_IS_APU)
1342 mask = LC_LINK_WIDTH_X0;
1345 mask = LC_LINK_WIDTH_X1;
1348 mask = LC_LINK_WIDTH_X2;
1351 mask = LC_LINK_WIDTH_X4;
1354 mask = LC_LINK_WIDTH_X8;
1357 mask = LC_LINK_WIDTH_X16;
1360 DRM_ERROR("invalid pcie lane request: %d\n", lanes);
1364 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1365 link_width_cntl &= ~LC_LINK_WIDTH_MASK;
1366 link_width_cntl |= mask << LC_LINK_WIDTH_SHIFT;
1367 link_width_cntl |= (LC_RECONFIG_NOW |
1368 LC_RECONFIG_ARC_MISSING_ESCAPE);
1370 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
1373 static void si_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
1376 uint32_t perfctr = 0;
1377 uint64_t cnt0_of, cnt1_of;
1380 /* This reports 0 on APUs, so return to avoid writing/reading registers
1381 * that may or may not be different from their GPU counterparts
1383 if (adev->flags & AMD_IS_APU)
1386 /* Set the 2 events that we wish to watch, defined above */
1387 /* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
1388 perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
1389 perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
1391 /* Write to enable desired perf counters */
1392 WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
1393 /* Zero out and enable the perf counters
1395 * Bit 0 = Start all counters(1)
1396 * Bit 2 = Global counter reset enable(1)
1398 WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
1402 /* Load the shadow and disable the perf counters
1404 * Bit 0 = Stop counters(0)
1405 * Bit 1 = Load the shadow counters(1)
1407 WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
1409 /* Read register values to get any >32bit overflow */
1410 tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
1411 cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
1412 cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
1414 /* Get the values and add the overflow */
1415 *count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
1416 *count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
1419 static uint64_t si_get_pcie_replay_count(struct amdgpu_device *adev)
1421 uint64_t nak_r, nak_g;
1423 /* Get the number of NAKs received and generated */
1424 nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
1425 nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
1427 /* Add the total number of NAKs, i.e the number of replays */
1428 return (nak_r + nak_g);
1431 static const struct amdgpu_asic_funcs si_asic_funcs =
1433 .read_disabled_bios = &si_read_disabled_bios,
1434 .read_bios_from_rom = &si_read_bios_from_rom,
1435 .read_register = &si_read_register,
1436 .reset = &si_asic_reset,
1437 .reset_method = &si_asic_reset_method,
1438 .set_vga_state = &si_vga_set_state,
1439 .get_xclk = &si_get_xclk,
1440 .set_uvd_clocks = &si_set_uvd_clocks,
1441 .set_vce_clocks = NULL,
1442 .get_pcie_lanes = &si_get_pcie_lanes,
1443 .set_pcie_lanes = &si_set_pcie_lanes,
1444 .get_config_memsize = &si_get_config_memsize,
1445 .flush_hdp = &si_flush_hdp,
1446 .invalidate_hdp = &si_invalidate_hdp,
1447 .need_full_reset = &si_need_full_reset,
1448 .get_pcie_usage = &si_get_pcie_usage,
1449 .need_reset_on_init = &si_need_reset_on_init,
1450 .get_pcie_replay_count = &si_get_pcie_replay_count,
1451 .supports_baco = &si_asic_supports_baco,
1454 static uint32_t si_get_rev_id(struct amdgpu_device *adev)
1456 return (RREG32(CC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1457 >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1460 static int si_common_early_init(void *handle)
1462 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1464 adev->smc_rreg = &si_smc_rreg;
1465 adev->smc_wreg = &si_smc_wreg;
1466 adev->pcie_rreg = &si_pcie_rreg;
1467 adev->pcie_wreg = &si_pcie_wreg;
1468 adev->pciep_rreg = &si_pciep_rreg;
1469 adev->pciep_wreg = &si_pciep_wreg;
1470 adev->uvd_ctx_rreg = si_uvd_ctx_rreg;
1471 adev->uvd_ctx_wreg = si_uvd_ctx_wreg;
1472 adev->didt_rreg = NULL;
1473 adev->didt_wreg = NULL;
1475 adev->asic_funcs = &si_asic_funcs;
1477 adev->rev_id = si_get_rev_id(adev);
1478 adev->external_rev_id = 0xFF;
1479 switch (adev->asic_type) {
1482 AMD_CG_SUPPORT_GFX_MGCG |
1483 AMD_CG_SUPPORT_GFX_MGLS |
1484 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1485 AMD_CG_SUPPORT_GFX_CGLS |
1486 AMD_CG_SUPPORT_GFX_CGTS |
1487 AMD_CG_SUPPORT_GFX_CP_LS |
1488 AMD_CG_SUPPORT_MC_MGCG |
1489 AMD_CG_SUPPORT_SDMA_MGCG |
1490 AMD_CG_SUPPORT_BIF_LS |
1491 AMD_CG_SUPPORT_VCE_MGCG |
1492 AMD_CG_SUPPORT_UVD_MGCG |
1493 AMD_CG_SUPPORT_HDP_LS |
1494 AMD_CG_SUPPORT_HDP_MGCG;
1496 adev->external_rev_id = (adev->rev_id == 0) ? 1 :
1497 (adev->rev_id == 1) ? 5 : 6;
1501 AMD_CG_SUPPORT_GFX_MGCG |
1502 AMD_CG_SUPPORT_GFX_MGLS |
1503 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1504 AMD_CG_SUPPORT_GFX_CGLS |
1505 AMD_CG_SUPPORT_GFX_CGTS |
1506 AMD_CG_SUPPORT_GFX_CP_LS |
1507 AMD_CG_SUPPORT_GFX_RLC_LS |
1508 AMD_CG_SUPPORT_MC_LS |
1509 AMD_CG_SUPPORT_MC_MGCG |
1510 AMD_CG_SUPPORT_SDMA_MGCG |
1511 AMD_CG_SUPPORT_BIF_LS |
1512 AMD_CG_SUPPORT_VCE_MGCG |
1513 AMD_CG_SUPPORT_UVD_MGCG |
1514 AMD_CG_SUPPORT_HDP_LS |
1515 AMD_CG_SUPPORT_HDP_MGCG;
1517 adev->external_rev_id = adev->rev_id + 20;
1522 AMD_CG_SUPPORT_GFX_MGCG |
1523 AMD_CG_SUPPORT_GFX_MGLS |
1524 AMD_CG_SUPPORT_GFX_CGLS |
1525 AMD_CG_SUPPORT_GFX_CGTS |
1526 AMD_CG_SUPPORT_GFX_CGTS_LS |
1527 AMD_CG_SUPPORT_GFX_CP_LS |
1528 AMD_CG_SUPPORT_MC_LS |
1529 AMD_CG_SUPPORT_MC_MGCG |
1530 AMD_CG_SUPPORT_SDMA_MGCG |
1531 AMD_CG_SUPPORT_SDMA_LS |
1532 AMD_CG_SUPPORT_BIF_LS |
1533 AMD_CG_SUPPORT_VCE_MGCG |
1534 AMD_CG_SUPPORT_UVD_MGCG |
1535 AMD_CG_SUPPORT_HDP_LS |
1536 AMD_CG_SUPPORT_HDP_MGCG;
1539 adev->external_rev_id = adev->rev_id + 40;
1543 AMD_CG_SUPPORT_GFX_MGCG |
1544 AMD_CG_SUPPORT_GFX_MGLS |
1545 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1546 AMD_CG_SUPPORT_GFX_CGLS |
1547 AMD_CG_SUPPORT_GFX_CGTS |
1548 AMD_CG_SUPPORT_GFX_CP_LS |
1549 AMD_CG_SUPPORT_GFX_RLC_LS |
1550 AMD_CG_SUPPORT_MC_LS |
1551 AMD_CG_SUPPORT_MC_MGCG |
1552 AMD_CG_SUPPORT_SDMA_MGCG |
1553 AMD_CG_SUPPORT_BIF_LS |
1554 AMD_CG_SUPPORT_UVD_MGCG |
1555 AMD_CG_SUPPORT_HDP_LS |
1556 AMD_CG_SUPPORT_HDP_MGCG;
1558 adev->external_rev_id = 60;
1562 AMD_CG_SUPPORT_GFX_MGCG |
1563 AMD_CG_SUPPORT_GFX_MGLS |
1564 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1565 AMD_CG_SUPPORT_GFX_CGLS |
1566 AMD_CG_SUPPORT_GFX_CGTS |
1567 AMD_CG_SUPPORT_GFX_CP_LS |
1568 AMD_CG_SUPPORT_GFX_RLC_LS |
1569 AMD_CG_SUPPORT_MC_LS |
1570 AMD_CG_SUPPORT_MC_MGCG |
1571 AMD_CG_SUPPORT_SDMA_MGCG |
1572 AMD_CG_SUPPORT_BIF_LS |
1573 AMD_CG_SUPPORT_HDP_LS |
1574 AMD_CG_SUPPORT_HDP_MGCG;
1576 adev->external_rev_id = 70;
1586 static int si_common_sw_init(void *handle)
1591 static int si_common_sw_fini(void *handle)
1597 static void si_init_golden_registers(struct amdgpu_device *adev)
1599 switch (adev->asic_type) {
1601 amdgpu_device_program_register_sequence(adev,
1602 tahiti_golden_registers,
1603 ARRAY_SIZE(tahiti_golden_registers));
1604 amdgpu_device_program_register_sequence(adev,
1605 tahiti_golden_rlc_registers,
1606 ARRAY_SIZE(tahiti_golden_rlc_registers));
1607 amdgpu_device_program_register_sequence(adev,
1608 tahiti_mgcg_cgcg_init,
1609 ARRAY_SIZE(tahiti_mgcg_cgcg_init));
1610 amdgpu_device_program_register_sequence(adev,
1611 tahiti_golden_registers2,
1612 ARRAY_SIZE(tahiti_golden_registers2));
1615 amdgpu_device_program_register_sequence(adev,
1616 pitcairn_golden_registers,
1617 ARRAY_SIZE(pitcairn_golden_registers));
1618 amdgpu_device_program_register_sequence(adev,
1619 pitcairn_golden_rlc_registers,
1620 ARRAY_SIZE(pitcairn_golden_rlc_registers));
1621 amdgpu_device_program_register_sequence(adev,
1622 pitcairn_mgcg_cgcg_init,
1623 ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
1626 amdgpu_device_program_register_sequence(adev,
1627 verde_golden_registers,
1628 ARRAY_SIZE(verde_golden_registers));
1629 amdgpu_device_program_register_sequence(adev,
1630 verde_golden_rlc_registers,
1631 ARRAY_SIZE(verde_golden_rlc_registers));
1632 amdgpu_device_program_register_sequence(adev,
1633 verde_mgcg_cgcg_init,
1634 ARRAY_SIZE(verde_mgcg_cgcg_init));
1635 amdgpu_device_program_register_sequence(adev,
1637 ARRAY_SIZE(verde_pg_init));
1640 amdgpu_device_program_register_sequence(adev,
1641 oland_golden_registers,
1642 ARRAY_SIZE(oland_golden_registers));
1643 amdgpu_device_program_register_sequence(adev,
1644 oland_golden_rlc_registers,
1645 ARRAY_SIZE(oland_golden_rlc_registers));
1646 amdgpu_device_program_register_sequence(adev,
1647 oland_mgcg_cgcg_init,
1648 ARRAY_SIZE(oland_mgcg_cgcg_init));
1651 amdgpu_device_program_register_sequence(adev,
1652 hainan_golden_registers,
1653 ARRAY_SIZE(hainan_golden_registers));
1654 amdgpu_device_program_register_sequence(adev,
1655 hainan_golden_registers2,
1656 ARRAY_SIZE(hainan_golden_registers2));
1657 amdgpu_device_program_register_sequence(adev,
1658 hainan_mgcg_cgcg_init,
1659 ARRAY_SIZE(hainan_mgcg_cgcg_init));
1668 static void si_pcie_gen3_enable(struct amdgpu_device *adev)
1670 struct pci_dev *root = adev->pdev->bus->self;
1671 u32 speed_cntl, current_data_rate;
1675 if (pci_is_root_bus(adev->pdev->bus))
1678 if (amdgpu_pcie_gen2 == 0)
1681 if (adev->flags & AMD_IS_APU)
1684 if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
1685 CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
1688 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1689 current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
1690 LC_CURRENT_DATA_RATE_SHIFT;
1691 if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1692 if (current_data_rate == 2) {
1693 DRM_INFO("PCIE gen 3 link speeds already enabled\n");
1696 DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
1697 } else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
1698 if (current_data_rate == 1) {
1699 DRM_INFO("PCIE gen 2 link speeds already enabled\n");
1702 DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
1705 if (!pci_is_pcie(root) || !pci_is_pcie(adev->pdev))
1708 if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1709 if (current_data_rate != 2) {
1710 u16 bridge_cfg, gpu_cfg;
1711 u16 bridge_cfg2, gpu_cfg2;
1712 u32 max_lw, current_lw, tmp;
1714 pcie_capability_read_word(root, PCI_EXP_LNKCTL,
1716 pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL,
1719 tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
1720 pcie_capability_write_word(root, PCI_EXP_LNKCTL, tmp16);
1722 tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
1723 pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL,
1726 tmp = RREG32_PCIE(PCIE_LC_STATUS1);
1727 max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
1728 current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
1730 if (current_lw < max_lw) {
1731 tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1732 if (tmp & LC_RENEGOTIATION_SUPPORT) {
1733 tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
1734 tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
1735 tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
1736 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
1740 for (i = 0; i < 10; i++) {
1741 pcie_capability_read_word(adev->pdev,
1744 if (tmp16 & PCI_EXP_DEVSTA_TRPND)
1747 pcie_capability_read_word(root, PCI_EXP_LNKCTL,
1749 pcie_capability_read_word(adev->pdev,
1753 pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
1755 pcie_capability_read_word(adev->pdev,
1759 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1760 tmp |= LC_SET_QUIESCE;
1761 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1763 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1765 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1769 pcie_capability_read_word(root, PCI_EXP_LNKCTL,
1771 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1772 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
1773 pcie_capability_write_word(root, PCI_EXP_LNKCTL,
1776 pcie_capability_read_word(adev->pdev,
1779 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1780 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
1781 pcie_capability_write_word(adev->pdev,
1785 pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
1787 tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
1788 PCI_EXP_LNKCTL2_TX_MARGIN);
1789 tmp16 |= (bridge_cfg2 &
1790 (PCI_EXP_LNKCTL2_ENTER_COMP |
1791 PCI_EXP_LNKCTL2_TX_MARGIN));
1792 pcie_capability_write_word(root,
1796 pcie_capability_read_word(adev->pdev,
1799 tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
1800 PCI_EXP_LNKCTL2_TX_MARGIN);
1801 tmp16 |= (gpu_cfg2 &
1802 (PCI_EXP_LNKCTL2_ENTER_COMP |
1803 PCI_EXP_LNKCTL2_TX_MARGIN));
1804 pcie_capability_write_word(adev->pdev,
1808 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1809 tmp &= ~LC_SET_QUIESCE;
1810 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1815 speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
1816 speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
1817 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1819 pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL2, &tmp16);
1820 tmp16 &= ~PCI_EXP_LNKCTL2_TLS;
1822 if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
1823 tmp16 |= PCI_EXP_LNKCTL2_TLS_8_0GT; /* gen3 */
1824 else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
1825 tmp16 |= PCI_EXP_LNKCTL2_TLS_5_0GT; /* gen2 */
1827 tmp16 |= PCI_EXP_LNKCTL2_TLS_2_5GT; /* gen1 */
1828 pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL2, tmp16);
1830 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1831 speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
1832 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1834 for (i = 0; i < adev->usec_timeout; i++) {
1835 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1836 if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
1842 static inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg)
1844 unsigned long flags;
1847 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1848 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1849 r = RREG32(EVERGREEN_PIF_PHY0_DATA);
1850 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1854 static inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1856 unsigned long flags;
1858 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1859 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1860 WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
1861 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1864 static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
1866 unsigned long flags;
1869 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1870 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1871 r = RREG32(EVERGREEN_PIF_PHY1_DATA);
1872 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1876 static inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1878 unsigned long flags;
1880 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1881 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1882 WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
1883 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1885 static void si_program_aspm(struct amdgpu_device *adev)
1888 bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
1889 bool disable_clkreq = false;
1891 if (amdgpu_aspm == 0)
1894 if (adev->flags & AMD_IS_APU)
1896 orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
1897 data &= ~LC_XMIT_N_FTS_MASK;
1898 data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
1900 WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
1902 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
1903 data |= LC_GO_TO_RECOVERY;
1905 WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
1907 orig = data = RREG32_PCIE(PCIE_P_CNTL);
1908 data |= P_IGNORE_EDB_ERR;
1910 WREG32_PCIE(PCIE_P_CNTL, data);
1912 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
1913 data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
1914 data |= LC_PMI_TO_L1_DIS;
1916 data |= LC_L0S_INACTIVITY(7);
1919 data |= LC_L1_INACTIVITY(7);
1920 data &= ~LC_PMI_TO_L1_DIS;
1922 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1924 if (!disable_plloff_in_l1) {
1925 bool clk_req_support;
1927 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1928 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1929 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1931 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1933 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1934 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1935 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1937 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1939 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1940 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1941 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1943 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1945 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1946 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1947 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1949 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1951 if ((adev->asic_type != CHIP_OLAND) && (adev->asic_type != CHIP_HAINAN)) {
1952 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1953 data &= ~PLL_RAMP_UP_TIME_0_MASK;
1955 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1957 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1958 data &= ~PLL_RAMP_UP_TIME_1_MASK;
1960 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1962 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2);
1963 data &= ~PLL_RAMP_UP_TIME_2_MASK;
1965 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data);
1967 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3);
1968 data &= ~PLL_RAMP_UP_TIME_3_MASK;
1970 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data);
1972 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1973 data &= ~PLL_RAMP_UP_TIME_0_MASK;
1975 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1977 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1978 data &= ~PLL_RAMP_UP_TIME_1_MASK;
1980 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1982 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2);
1983 data &= ~PLL_RAMP_UP_TIME_2_MASK;
1985 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data);
1987 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3);
1988 data &= ~PLL_RAMP_UP_TIME_3_MASK;
1990 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data);
1992 orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1993 data &= ~LC_DYN_LANES_PWR_STATE_MASK;
1994 data |= LC_DYN_LANES_PWR_STATE(3);
1996 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
1998 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL);
1999 data &= ~LS2_EXIT_TIME_MASK;
2000 if ((adev->asic_type == CHIP_OLAND) || (adev->asic_type == CHIP_HAINAN))
2001 data |= LS2_EXIT_TIME(5);
2003 si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data);
2005 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL);
2006 data &= ~LS2_EXIT_TIME_MASK;
2007 if ((adev->asic_type == CHIP_OLAND) || (adev->asic_type == CHIP_HAINAN))
2008 data |= LS2_EXIT_TIME(5);
2010 si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data);
2012 if (!disable_clkreq &&
2013 !pci_is_root_bus(adev->pdev->bus)) {
2014 struct pci_dev *root = adev->pdev->bus->self;
2017 clk_req_support = false;
2018 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
2019 if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
2020 clk_req_support = true;
2022 clk_req_support = false;
2025 if (clk_req_support) {
2026 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
2027 data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
2029 WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
2031 orig = data = RREG32(THM_CLK_CNTL);
2032 data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
2033 data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
2035 WREG32(THM_CLK_CNTL, data);
2037 orig = data = RREG32(MISC_CLK_CNTL);
2038 data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
2039 data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
2041 WREG32(MISC_CLK_CNTL, data);
2043 orig = data = RREG32(CG_CLKPIN_CNTL);
2044 data &= ~BCLK_AS_XCLK;
2046 WREG32(CG_CLKPIN_CNTL, data);
2048 orig = data = RREG32(CG_CLKPIN_CNTL_2);
2049 data &= ~FORCE_BIF_REFCLK_EN;
2051 WREG32(CG_CLKPIN_CNTL_2, data);
2053 orig = data = RREG32(MPLL_BYPASSCLK_SEL);
2054 data &= ~MPLL_CLKOUT_SEL_MASK;
2055 data |= MPLL_CLKOUT_SEL(4);
2057 WREG32(MPLL_BYPASSCLK_SEL, data);
2059 orig = data = RREG32(SPLL_CNTL_MODE);
2060 data &= ~SPLL_REFCLK_SEL_MASK;
2062 WREG32(SPLL_CNTL_MODE, data);
2067 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2070 orig = data = RREG32_PCIE(PCIE_CNTL2);
2071 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
2073 WREG32_PCIE(PCIE_CNTL2, data);
2076 data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
2077 if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
2078 data = RREG32_PCIE(PCIE_LC_STATUS1);
2079 if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
2080 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
2081 data &= ~LC_L0S_INACTIVITY_MASK;
2083 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2089 static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
2094 readrq = pcie_get_readrq(adev->pdev);
2095 v = ffs(readrq) - 8;
2096 if ((v == 0) || (v == 6) || (v == 7))
2097 pcie_set_readrq(adev->pdev, 512);
2100 static int si_common_hw_init(void *handle)
2102 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2104 si_fix_pci_max_read_req_size(adev);
2105 si_init_golden_registers(adev);
2106 si_pcie_gen3_enable(adev);
2107 si_program_aspm(adev);
2112 static int si_common_hw_fini(void *handle)
2117 static int si_common_suspend(void *handle)
2119 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2121 return si_common_hw_fini(adev);
2124 static int si_common_resume(void *handle)
2126 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2128 return si_common_hw_init(adev);
2131 static bool si_common_is_idle(void *handle)
2136 static int si_common_wait_for_idle(void *handle)
2141 static int si_common_soft_reset(void *handle)
2146 static int si_common_set_clockgating_state(void *handle,
2147 enum amd_clockgating_state state)
2152 static int si_common_set_powergating_state(void *handle,
2153 enum amd_powergating_state state)
2158 static const struct amd_ip_funcs si_common_ip_funcs = {
2159 .name = "si_common",
2160 .early_init = si_common_early_init,
2162 .sw_init = si_common_sw_init,
2163 .sw_fini = si_common_sw_fini,
2164 .hw_init = si_common_hw_init,
2165 .hw_fini = si_common_hw_fini,
2166 .suspend = si_common_suspend,
2167 .resume = si_common_resume,
2168 .is_idle = si_common_is_idle,
2169 .wait_for_idle = si_common_wait_for_idle,
2170 .soft_reset = si_common_soft_reset,
2171 .set_clockgating_state = si_common_set_clockgating_state,
2172 .set_powergating_state = si_common_set_powergating_state,
2175 static const struct amdgpu_ip_block_version si_common_ip_block =
2177 .type = AMD_IP_BLOCK_TYPE_COMMON,
2181 .funcs = &si_common_ip_funcs,
2184 int si_set_ip_blocks(struct amdgpu_device *adev)
2186 switch (adev->asic_type) {
2190 amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2191 amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2192 amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2193 amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2194 amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2195 amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2196 if (adev->enable_virtual_display)
2197 amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2199 amdgpu_device_ip_block_add(adev, &dce_v6_0_ip_block);
2200 amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block);
2201 /* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2204 amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2205 amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2206 amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2207 amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2208 amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2209 amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2210 if (adev->enable_virtual_display)
2211 amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2213 amdgpu_device_ip_block_add(adev, &dce_v6_4_ip_block);
2214 amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block);
2215 /* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2218 amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2219 amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2220 amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2221 amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2222 amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2223 amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2224 if (adev->enable_virtual_display)
2225 amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);