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