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