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