]> Git Repo - linux.git/blob - drivers/gpu/drm/amd/amdgpu/si.c
Merge branch 'kvm-fix-svm-races' into kvm-master
[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 <linux/pci.h>
28
29 #include "amdgpu.h"
30 #include "amdgpu_atombios.h"
31 #include "amdgpu_ih.h"
32 #include "amdgpu_uvd.h"
33 #include "amdgpu_vce.h"
34 #include "atom.h"
35 #include "amd_pcie.h"
36 #include "si_dpm.h"
37 #include "sid.h"
38 #include "si_ih.h"
39 #include "gfx_v6_0.h"
40 #include "gmc_v6_0.h"
41 #include "si_dma.h"
42 #include "dce_v6_0.h"
43 #include "si.h"
44 #include "uvd_v3_1.h"
45 #include "dce_virtual.h"
46 #include "gca/gfx_6_0_d.h"
47 #include "oss/oss_1_0_d.h"
48 #include "oss/oss_1_0_sh_mask.h"
49 #include "gmc/gmc_6_0_d.h"
50 #include "dce/dce_6_0_d.h"
51 #include "uvd/uvd_4_0_d.h"
52 #include "bif/bif_3_0_d.h"
53 #include "bif/bif_3_0_sh_mask.h"
54
55 #include "amdgpu_dm.h"
56
57 static const u32 tahiti_golden_registers[] =
58 {
59         mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
60         mmCB_HW_CONTROL, 0x00010000, 0x00018208,
61         mmDB_DEBUG, 0xffffffff, 0x00000000,
62         mmDB_DEBUG2, 0xf00fffff, 0x00000400,
63         mmDB_DEBUG3, 0x0002021c, 0x00020200,
64         mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
65         0x340c, 0x000000c0, 0x00800040,
66         0x360c, 0x000000c0, 0x00800040,
67         mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
68         mmFBC_MISC, 0x00200000, 0x50100000,
69         mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
70         mmMC_ARB_WTM_CNTL_RD, 0x00000003, 0x000007ff,
71         mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
72         mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
73         mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
74         mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
75         mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
76         mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
77         0x000c, 0xffffffff, 0x0040,
78         0x000d, 0x00000040, 0x00004040,
79         mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
80         mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
81         mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
82         mmSX_DEBUG_1, 0x0000007f, 0x00000020,
83         mmTA_CNTL_AUX, 0x00010000, 0x00010000,
84         mmTCP_ADDR_CONFIG, 0x00000200, 0x000002fb,
85         mmTCP_CHAN_STEER_HI, 0xffffffff, 0x0000543b,
86         mmTCP_CHAN_STEER_LO, 0xffffffff, 0xa9210876,
87         mmVGT_FIFO_DEPTHS, 0xffffffff, 0x000fff40,
88         mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
89         mmVM_CONTEXT0_CNTL, 0x20000000, 0x20fffed8,
90         mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
91         mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
92         mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
93         mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
94         mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
95 };
96
97 static const u32 tahiti_golden_registers2[] =
98 {
99         mmMCIF_MEM_CONTROL, 0x00000001, 0x00000001,
100 };
101
102 static const u32 tahiti_golden_rlc_registers[] =
103 {
104         mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
105         mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
106         0x311f, 0xffffffff, 0x10104040,
107         0x3122, 0xffffffff, 0x0100000a,
108         mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
109         mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
110         mmUVD_CGC_GATE, 0x00000008, 0x00000000,
111 };
112
113 static const u32 pitcairn_golden_registers[] =
114 {
115         mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
116         mmCB_HW_CONTROL, 0x00010000, 0x00018208,
117         mmDB_DEBUG, 0xffffffff, 0x00000000,
118         mmDB_DEBUG2, 0xf00fffff, 0x00000400,
119         mmDB_DEBUG3, 0x0002021c, 0x00020200,
120         mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
121         0x340c, 0x000300c0, 0x00800040,
122         0x360c, 0x000300c0, 0x00800040,
123         mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
124         mmFBC_MISC, 0x00200000, 0x50100000,
125         mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
126         mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
127         mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
128         mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
129         mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
130         mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
131         mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
132         mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
133         0x000c, 0xffffffff, 0x0040,
134         0x000d, 0x00000040, 0x00004040,
135         mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
136         mmSX_DEBUG_1, 0x0000007f, 0x00000020,
137         mmTA_CNTL_AUX, 0x00010000, 0x00010000,
138         mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7,
139         mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
140         mmTCP_CHAN_STEER_LO, 0xffffffff, 0x32761054,
141         mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
142         mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
143         mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
144         mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
145         mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
146         mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
147 };
148
149 static const u32 pitcairn_golden_rlc_registers[] =
150 {
151         mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
152         mmRLC_LB_PARAMS, 0xffffffff, 0x00601004,
153         0x311f, 0xffffffff, 0x10102020,
154         0x3122, 0xffffffff, 0x01000020,
155         mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
156         mmRLC_LB_CNTL, 0xffffffff, 0x800000a4,
157 };
158
159 static const u32 verde_pg_init[] =
160 {
161         mmGMCON_PGFSM_WRITE, 0xffffffff, 0x40000,
162         mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x200010ff,
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, 0x0,
168         mmGMCON_PGFSM_WRITE, 0xffffffff, 0x7007,
169         mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x300010ff,
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, 0x0,
175         mmGMCON_PGFSM_WRITE, 0xffffffff, 0x400000,
176         mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x100010ff,
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, 0x0,
182         mmGMCON_PGFSM_WRITE, 0xffffffff, 0x120200,
183         mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x500010ff,
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, 0x0,
189         mmGMCON_PGFSM_WRITE, 0xffffffff, 0x1e1e16,
190         mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x600010ff,
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_WRITE, 0xffffffff, 0x171f1e,
197         mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x700010ff,
198         mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
199         mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
200         mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
201         mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
202         mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
203         mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
204         mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x9ff,
205         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x0,
206         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10000800,
207         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
208         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
209         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4,
210         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1000051e,
211         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
212         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
213         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x8,
214         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x80500,
215         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x12,
216         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x9050c,
217         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1d,
218         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xb052c,
219         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2a,
220         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1053e,
221         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2d,
222         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10546,
223         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x30,
224         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xa054e,
225         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3c,
226         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1055f,
227         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3f,
228         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10567,
229         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x42,
230         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1056f,
231         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x45,
232         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10572,
233         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x48,
234         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20575,
235         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4c,
236         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x190801,
237         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x67,
238         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1082a,
239         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x6a,
240         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1b082d,
241         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x87,
242         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x310851,
243         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xba,
244         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x891,
245         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbc,
246         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x893,
247         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbe,
248         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20895,
249         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc2,
250         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20899,
251         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc6,
252         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2089d,
253         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xca,
254         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a1,
255         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xcc,
256         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a3,
257         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xce,
258         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x308a5,
259         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xd3,
260         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x6d08cd,
261         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x142,
262         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2000095a,
263         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1,
264         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x144,
265         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x301f095b,
266         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x165,
267         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc094d,
268         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x173,
269         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf096d,
270         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x184,
271         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x15097f,
272         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x19b,
273         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc0998,
274         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1a9,
275         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x409a7,
276         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1af,
277         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xcdc,
278         mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1b1,
279         mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x800,
280         mmGMCON_RENG_EXECUTE, 0xffffffff, 0x6c9b2000,
281         mmGMCON_MISC2, 0xfc00, 0x2000,
282         mmGMCON_MISC3, 0xffffffff, 0xfc0,
283         mmMC_PMG_AUTO_CFG, 0x00000100, 0x100,
284 };
285
286 static const u32 verde_golden_rlc_registers[] =
287 {
288         mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
289         mmRLC_LB_PARAMS, 0xffffffff, 0x033f1005,
290         0x311f, 0xffffffff, 0x10808020,
291         0x3122, 0xffffffff, 0x00800008,
292         mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00001000,
293         mmRLC_LB_CNTL, 0xffffffff, 0x80010014,
294 };
295
296 static const u32 verde_golden_registers[] =
297 {
298         mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
299         mmCB_HW_CONTROL, 0x00010000, 0x00018208,
300         mmDB_DEBUG, 0xffffffff, 0x00000000,
301         mmDB_DEBUG2, 0xf00fffff, 0x00000400,
302         mmDB_DEBUG3, 0x0002021c, 0x00020200,
303         mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
304         0x340c, 0x000300c0, 0x00800040,
305         0x360c, 0x000300c0, 0x00800040,
306         mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
307         mmFBC_MISC, 0x00200000, 0x50100000,
308         mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
309         mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
310         mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
311         mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
312         mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
313         mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
314         mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
315         mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x0000124a,
316         0x000c, 0xffffffff, 0x0040,
317         0x000d, 0x00000040, 0x00004040,
318         mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
319         mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
320         mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
321         mmSX_DEBUG_1, 0x0000007f, 0x00000020,
322         mmTA_CNTL_AUX, 0x00010000, 0x00010000,
323         mmTCP_ADDR_CONFIG, 0x000003ff, 0x00000003,
324         mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
325         mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00001032,
326         mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
327         mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
328         mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
329         mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
330         mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
331         mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
332 };
333
334 static const u32 oland_golden_registers[] =
335 {
336         mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
337         mmCB_HW_CONTROL, 0x00010000, 0x00018208,
338         mmDB_DEBUG, 0xffffffff, 0x00000000,
339         mmDB_DEBUG2, 0xf00fffff, 0x00000400,
340         mmDB_DEBUG3, 0x0002021c, 0x00020200,
341         mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
342         0x340c, 0x000300c0, 0x00800040,
343         0x360c, 0x000300c0, 0x00800040,
344         mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
345         mmFBC_MISC, 0x00200000, 0x50100000,
346         mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
347         mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
348         mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
349         mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
350         mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
351         mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
352         mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
353         mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000082,
354         0x000c, 0xffffffff, 0x0040,
355         0x000d, 0x00000040, 0x00004040,
356         mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
357         mmSX_DEBUG_1, 0x0000007f, 0x00000020,
358         mmTA_CNTL_AUX, 0x00010000, 0x00010000,
359         mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f3,
360         mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
361         mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
362         mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
363         mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
364         mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
365         mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
366         mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
367         mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
368
369 };
370
371 static const u32 oland_golden_rlc_registers[] =
372 {
373         mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
374         mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
375         0x311f, 0xffffffff, 0x10104040,
376         0x3122, 0xffffffff, 0x0100000a,
377         mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
378         mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
379 };
380
381 static const u32 hainan_golden_registers[] =
382 {
383         0x17bc, 0x00000030, 0x00000011,
384         mmCB_HW_CONTROL, 0x00010000, 0x00018208,
385         mmDB_DEBUG, 0xffffffff, 0x00000000,
386         mmDB_DEBUG2, 0xf00fffff, 0x00000400,
387         mmDB_DEBUG3, 0x0002021c, 0x00020200,
388         0x031e, 0x00000080, 0x00000000,
389         0x3430, 0xff000fff, 0x00000100,
390         0x340c, 0x000300c0, 0x00800040,
391         0x3630, 0xff000fff, 0x00000100,
392         0x360c, 0x000300c0, 0x00800040,
393         0x16ec, 0x000000f0, 0x00000070,
394         0x16f0, 0x00200000, 0x50100000,
395         0x1c0c, 0x31000311, 0x00000011,
396         mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
397         mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
398         mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
399         mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
400         mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
401         mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
402         mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000000,
403         0x000c, 0xffffffff, 0x0040,
404         0x000d, 0x00000040, 0x00004040,
405         mmSPI_CONFIG_CNTL, 0x03e00000, 0x03600000,
406         mmSX_DEBUG_1, 0x0000007f, 0x00000020,
407         mmTA_CNTL_AUX, 0x00010000, 0x00010000,
408         mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f1,
409         mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
410         mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
411         mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
412         mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
413         mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
414         mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
415         mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
416         mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
417 };
418
419 static const u32 hainan_golden_registers2[] =
420 {
421         mmGB_ADDR_CONFIG, 0xffffffff, 0x2011003,
422 };
423
424 static const u32 tahiti_mgcg_cgcg_init[] =
425 {
426         mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
427         mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
428         mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
429         mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
430         mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
431         mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
432         mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
433         mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
434         mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
435         mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
436         mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
437         mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
438         mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
439         mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
440         mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
441         mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
442         mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
443         mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
444         mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
445         mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
446         mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
447         mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
448         mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
449         mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
450         mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
451         mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
452         mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
453         0x2458, 0xffffffff, 0x00010000,
454         0x2459, 0xffffffff, 0x00030002,
455         0x245a, 0xffffffff, 0x00040007,
456         0x245b, 0xffffffff, 0x00060005,
457         0x245c, 0xffffffff, 0x00090008,
458         0x245d, 0xffffffff, 0x00020001,
459         0x245e, 0xffffffff, 0x00040003,
460         0x245f, 0xffffffff, 0x00000007,
461         0x2460, 0xffffffff, 0x00060005,
462         0x2461, 0xffffffff, 0x00090008,
463         0x2462, 0xffffffff, 0x00030002,
464         0x2463, 0xffffffff, 0x00050004,
465         0x2464, 0xffffffff, 0x00000008,
466         0x2465, 0xffffffff, 0x00070006,
467         0x2466, 0xffffffff, 0x000a0009,
468         0x2467, 0xffffffff, 0x00040003,
469         0x2468, 0xffffffff, 0x00060005,
470         0x2469, 0xffffffff, 0x00000009,
471         0x246a, 0xffffffff, 0x00080007,
472         0x246b, 0xffffffff, 0x000b000a,
473         0x246c, 0xffffffff, 0x00050004,
474         0x246d, 0xffffffff, 0x00070006,
475         0x246e, 0xffffffff, 0x0008000b,
476         0x246f, 0xffffffff, 0x000a0009,
477         0x2470, 0xffffffff, 0x000d000c,
478         0x2471, 0xffffffff, 0x00060005,
479         0x2472, 0xffffffff, 0x00080007,
480         0x2473, 0xffffffff, 0x0000000b,
481         0x2474, 0xffffffff, 0x000a0009,
482         0x2475, 0xffffffff, 0x000d000c,
483         0x2476, 0xffffffff, 0x00070006,
484         0x2477, 0xffffffff, 0x00090008,
485         0x2478, 0xffffffff, 0x0000000c,
486         0x2479, 0xffffffff, 0x000b000a,
487         0x247a, 0xffffffff, 0x000e000d,
488         0x247b, 0xffffffff, 0x00080007,
489         0x247c, 0xffffffff, 0x000a0009,
490         0x247d, 0xffffffff, 0x0000000d,
491         0x247e, 0xffffffff, 0x000c000b,
492         0x247f, 0xffffffff, 0x000f000e,
493         0x2480, 0xffffffff, 0x00090008,
494         0x2481, 0xffffffff, 0x000b000a,
495         0x2482, 0xffffffff, 0x000c000f,
496         0x2483, 0xffffffff, 0x000e000d,
497         0x2484, 0xffffffff, 0x00110010,
498         0x2485, 0xffffffff, 0x000a0009,
499         0x2486, 0xffffffff, 0x000c000b,
500         0x2487, 0xffffffff, 0x0000000f,
501         0x2488, 0xffffffff, 0x000e000d,
502         0x2489, 0xffffffff, 0x00110010,
503         0x248a, 0xffffffff, 0x000b000a,
504         0x248b, 0xffffffff, 0x000d000c,
505         0x248c, 0xffffffff, 0x00000010,
506         0x248d, 0xffffffff, 0x000f000e,
507         0x248e, 0xffffffff, 0x00120011,
508         0x248f, 0xffffffff, 0x000c000b,
509         0x2490, 0xffffffff, 0x000e000d,
510         0x2491, 0xffffffff, 0x00000011,
511         0x2492, 0xffffffff, 0x0010000f,
512         0x2493, 0xffffffff, 0x00130012,
513         0x2494, 0xffffffff, 0x000d000c,
514         0x2495, 0xffffffff, 0x000f000e,
515         0x2496, 0xffffffff, 0x00100013,
516         0x2497, 0xffffffff, 0x00120011,
517         0x2498, 0xffffffff, 0x00150014,
518         0x2499, 0xffffffff, 0x000e000d,
519         0x249a, 0xffffffff, 0x0010000f,
520         0x249b, 0xffffffff, 0x00000013,
521         0x249c, 0xffffffff, 0x00120011,
522         0x249d, 0xffffffff, 0x00150014,
523         0x249e, 0xffffffff, 0x000f000e,
524         0x249f, 0xffffffff, 0x00110010,
525         0x24a0, 0xffffffff, 0x00000014,
526         0x24a1, 0xffffffff, 0x00130012,
527         0x24a2, 0xffffffff, 0x00160015,
528         0x24a3, 0xffffffff, 0x0010000f,
529         0x24a4, 0xffffffff, 0x00120011,
530         0x24a5, 0xffffffff, 0x00000015,
531         0x24a6, 0xffffffff, 0x00140013,
532         0x24a7, 0xffffffff, 0x00170016,
533         mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
534         mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
535         mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
536         mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
537         0x000c, 0xffffffff, 0x0000001c,
538         0x000d, 0x000f0000, 0x000f0000,
539         0x0583, 0xffffffff, 0x00000100,
540         mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
541         mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
542         mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
543         mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
544         mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
545         mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
546         0x157a, 0x00000001, 0x00000001,
547         mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
548         mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
549         mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
550         0x3430, 0xfffffff0, 0x00000100,
551         0x3630, 0xfffffff0, 0x00000100,
552 };
553 static const u32 pitcairn_mgcg_cgcg_init[] =
554 {
555         mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
556         mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
557         mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
558         mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
559         mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
560         mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
561         mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
562         mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
563         mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
564         mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
565         mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
566         mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
567         mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
568         mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
569         mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
570         mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
571         mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
572         mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
573         mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
574         mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
575         mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
576         mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
577         mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
578         mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
579         mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
580         mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
581         mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
582         0x2458, 0xffffffff, 0x00010000,
583         0x2459, 0xffffffff, 0x00030002,
584         0x245a, 0xffffffff, 0x00040007,
585         0x245b, 0xffffffff, 0x00060005,
586         0x245c, 0xffffffff, 0x00090008,
587         0x245d, 0xffffffff, 0x00020001,
588         0x245e, 0xffffffff, 0x00040003,
589         0x245f, 0xffffffff, 0x00000007,
590         0x2460, 0xffffffff, 0x00060005,
591         0x2461, 0xffffffff, 0x00090008,
592         0x2462, 0xffffffff, 0x00030002,
593         0x2463, 0xffffffff, 0x00050004,
594         0x2464, 0xffffffff, 0x00000008,
595         0x2465, 0xffffffff, 0x00070006,
596         0x2466, 0xffffffff, 0x000a0009,
597         0x2467, 0xffffffff, 0x00040003,
598         0x2468, 0xffffffff, 0x00060005,
599         0x2469, 0xffffffff, 0x00000009,
600         0x246a, 0xffffffff, 0x00080007,
601         0x246b, 0xffffffff, 0x000b000a,
602         0x246c, 0xffffffff, 0x00050004,
603         0x246d, 0xffffffff, 0x00070006,
604         0x246e, 0xffffffff, 0x0008000b,
605         0x246f, 0xffffffff, 0x000a0009,
606         0x2470, 0xffffffff, 0x000d000c,
607         0x2480, 0xffffffff, 0x00090008,
608         0x2481, 0xffffffff, 0x000b000a,
609         0x2482, 0xffffffff, 0x000c000f,
610         0x2483, 0xffffffff, 0x000e000d,
611         0x2484, 0xffffffff, 0x00110010,
612         0x2485, 0xffffffff, 0x000a0009,
613         0x2486, 0xffffffff, 0x000c000b,
614         0x2487, 0xffffffff, 0x0000000f,
615         0x2488, 0xffffffff, 0x000e000d,
616         0x2489, 0xffffffff, 0x00110010,
617         0x248a, 0xffffffff, 0x000b000a,
618         0x248b, 0xffffffff, 0x000d000c,
619         0x248c, 0xffffffff, 0x00000010,
620         0x248d, 0xffffffff, 0x000f000e,
621         0x248e, 0xffffffff, 0x00120011,
622         0x248f, 0xffffffff, 0x000c000b,
623         0x2490, 0xffffffff, 0x000e000d,
624         0x2491, 0xffffffff, 0x00000011,
625         0x2492, 0xffffffff, 0x0010000f,
626         0x2493, 0xffffffff, 0x00130012,
627         0x2494, 0xffffffff, 0x000d000c,
628         0x2495, 0xffffffff, 0x000f000e,
629         0x2496, 0xffffffff, 0x00100013,
630         0x2497, 0xffffffff, 0x00120011,
631         0x2498, 0xffffffff, 0x00150014,
632         mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
633         mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
634         mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
635         mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
636         0x000c, 0xffffffff, 0x0000001c,
637         0x000d, 0x000f0000, 0x000f0000,
638         0x0583, 0xffffffff, 0x00000100,
639         mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
640         mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
641         mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
642         mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
643         0x157a, 0x00000001, 0x00000001,
644         mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
645         mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
646         mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
647         0x3430, 0xfffffff0, 0x00000100,
648         0x3630, 0xfffffff0, 0x00000100,
649 };
650
651 static const u32 verde_mgcg_cgcg_init[] =
652 {
653         mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
654         mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
655         mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
656         mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
657         mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
658         mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
659         mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
660         mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
661         mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
662         mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
663         mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
664         mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
665         mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
666         mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
667         mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
668         mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
669         mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
670         mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
671         mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
672         mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
673         mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
674         mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
675         mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
676         mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
677         mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
678         mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
679         mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
680         0x2458, 0xffffffff, 0x00010000,
681         0x2459, 0xffffffff, 0x00030002,
682         0x245a, 0xffffffff, 0x00040007,
683         0x245b, 0xffffffff, 0x00060005,
684         0x245c, 0xffffffff, 0x00090008,
685         0x245d, 0xffffffff, 0x00020001,
686         0x245e, 0xffffffff, 0x00040003,
687         0x245f, 0xffffffff, 0x00000007,
688         0x2460, 0xffffffff, 0x00060005,
689         0x2461, 0xffffffff, 0x00090008,
690         0x2462, 0xffffffff, 0x00030002,
691         0x2463, 0xffffffff, 0x00050004,
692         0x2464, 0xffffffff, 0x00000008,
693         0x2465, 0xffffffff, 0x00070006,
694         0x2466, 0xffffffff, 0x000a0009,
695         0x2467, 0xffffffff, 0x00040003,
696         0x2468, 0xffffffff, 0x00060005,
697         0x2469, 0xffffffff, 0x00000009,
698         0x246a, 0xffffffff, 0x00080007,
699         0x246b, 0xffffffff, 0x000b000a,
700         0x246c, 0xffffffff, 0x00050004,
701         0x246d, 0xffffffff, 0x00070006,
702         0x246e, 0xffffffff, 0x0008000b,
703         0x246f, 0xffffffff, 0x000a0009,
704         0x2470, 0xffffffff, 0x000d000c,
705         0x2480, 0xffffffff, 0x00090008,
706         0x2481, 0xffffffff, 0x000b000a,
707         0x2482, 0xffffffff, 0x000c000f,
708         0x2483, 0xffffffff, 0x000e000d,
709         0x2484, 0xffffffff, 0x00110010,
710         0x2485, 0xffffffff, 0x000a0009,
711         0x2486, 0xffffffff, 0x000c000b,
712         0x2487, 0xffffffff, 0x0000000f,
713         0x2488, 0xffffffff, 0x000e000d,
714         0x2489, 0xffffffff, 0x00110010,
715         0x248a, 0xffffffff, 0x000b000a,
716         0x248b, 0xffffffff, 0x000d000c,
717         0x248c, 0xffffffff, 0x00000010,
718         0x248d, 0xffffffff, 0x000f000e,
719         0x248e, 0xffffffff, 0x00120011,
720         0x248f, 0xffffffff, 0x000c000b,
721         0x2490, 0xffffffff, 0x000e000d,
722         0x2491, 0xffffffff, 0x00000011,
723         0x2492, 0xffffffff, 0x0010000f,
724         0x2493, 0xffffffff, 0x00130012,
725         0x2494, 0xffffffff, 0x000d000c,
726         0x2495, 0xffffffff, 0x000f000e,
727         0x2496, 0xffffffff, 0x00100013,
728         0x2497, 0xffffffff, 0x00120011,
729         0x2498, 0xffffffff, 0x00150014,
730         mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
731         mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
732         mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
733         mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
734         0x000c, 0xffffffff, 0x0000001c,
735         0x000d, 0x000f0000, 0x000f0000,
736         0x0583, 0xffffffff, 0x00000100,
737         mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
738         mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
739         mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
740         mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
741         mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
742         mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
743         0x157a, 0x00000001, 0x00000001,
744         mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
745         mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
746         mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
747         0x3430, 0xfffffff0, 0x00000100,
748         0x3630, 0xfffffff0, 0x00000100,
749 };
750
751 static const u32 oland_mgcg_cgcg_init[] =
752 {
753         mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
754         mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
755         mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
756         mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
757         mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
758         mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
759         mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
760         mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
761         mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
762         mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
763         mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
764         mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
765         mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
766         mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
767         mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
768         mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
769         mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
770         mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
771         mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
772         mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
773         mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
774         mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
775         mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
776         mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
777         mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
778         mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
779         mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
780         0x2458, 0xffffffff, 0x00010000,
781         0x2459, 0xffffffff, 0x00030002,
782         0x245a, 0xffffffff, 0x00040007,
783         0x245b, 0xffffffff, 0x00060005,
784         0x245c, 0xffffffff, 0x00090008,
785         0x245d, 0xffffffff, 0x00020001,
786         0x245e, 0xffffffff, 0x00040003,
787         0x245f, 0xffffffff, 0x00000007,
788         0x2460, 0xffffffff, 0x00060005,
789         0x2461, 0xffffffff, 0x00090008,
790         0x2462, 0xffffffff, 0x00030002,
791         0x2463, 0xffffffff, 0x00050004,
792         0x2464, 0xffffffff, 0x00000008,
793         0x2465, 0xffffffff, 0x00070006,
794         0x2466, 0xffffffff, 0x000a0009,
795         0x2467, 0xffffffff, 0x00040003,
796         0x2468, 0xffffffff, 0x00060005,
797         0x2469, 0xffffffff, 0x00000009,
798         0x246a, 0xffffffff, 0x00080007,
799         0x246b, 0xffffffff, 0x000b000a,
800         0x246c, 0xffffffff, 0x00050004,
801         0x246d, 0xffffffff, 0x00070006,
802         0x246e, 0xffffffff, 0x0008000b,
803         0x246f, 0xffffffff, 0x000a0009,
804         0x2470, 0xffffffff, 0x000d000c,
805         0x2471, 0xffffffff, 0x00060005,
806         0x2472, 0xffffffff, 0x00080007,
807         0x2473, 0xffffffff, 0x0000000b,
808         0x2474, 0xffffffff, 0x000a0009,
809         0x2475, 0xffffffff, 0x000d000c,
810         mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
811         mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
812         mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
813         mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
814         0x000c, 0xffffffff, 0x0000001c,
815         0x000d, 0x000f0000, 0x000f0000,
816         0x0583, 0xffffffff, 0x00000100,
817         mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
818         mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
819         mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
820         mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
821         mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
822         mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
823         0x157a, 0x00000001, 0x00000001,
824         mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
825         mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
826         mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
827         0x3430, 0xfffffff0, 0x00000100,
828         0x3630, 0xfffffff0, 0x00000100,
829 };
830
831 static const u32 hainan_mgcg_cgcg_init[] =
832 {
833         mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
834         mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
835         mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
836         mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
837         mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
838         mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
839         mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
840         mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
841         mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
842         mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
843         mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
844         mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
845         mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
846         mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
847         mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
848         mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
849         mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
850         mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
851         mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
852         mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
853         mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
854         mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
855         mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
856         mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
857         mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
858         mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
859         mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
860         0x2458, 0xffffffff, 0x00010000,
861         0x2459, 0xffffffff, 0x00030002,
862         0x245a, 0xffffffff, 0x00040007,
863         0x245b, 0xffffffff, 0x00060005,
864         0x245c, 0xffffffff, 0x00090008,
865         0x245d, 0xffffffff, 0x00020001,
866         0x245e, 0xffffffff, 0x00040003,
867         0x245f, 0xffffffff, 0x00000007,
868         0x2460, 0xffffffff, 0x00060005,
869         0x2461, 0xffffffff, 0x00090008,
870         0x2462, 0xffffffff, 0x00030002,
871         0x2463, 0xffffffff, 0x00050004,
872         0x2464, 0xffffffff, 0x00000008,
873         0x2465, 0xffffffff, 0x00070006,
874         0x2466, 0xffffffff, 0x000a0009,
875         0x2467, 0xffffffff, 0x00040003,
876         0x2468, 0xffffffff, 0x00060005,
877         0x2469, 0xffffffff, 0x00000009,
878         0x246a, 0xffffffff, 0x00080007,
879         0x246b, 0xffffffff, 0x000b000a,
880         0x246c, 0xffffffff, 0x00050004,
881         0x246d, 0xffffffff, 0x00070006,
882         0x246e, 0xffffffff, 0x0008000b,
883         0x246f, 0xffffffff, 0x000a0009,
884         0x2470, 0xffffffff, 0x000d000c,
885         0x2471, 0xffffffff, 0x00060005,
886         0x2472, 0xffffffff, 0x00080007,
887         0x2473, 0xffffffff, 0x0000000b,
888         0x2474, 0xffffffff, 0x000a0009,
889         0x2475, 0xffffffff, 0x000d000c,
890         mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
891         mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
892         mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
893         mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
894         0x000c, 0xffffffff, 0x0000001c,
895         0x000d, 0x000f0000, 0x000f0000,
896         0x0583, 0xffffffff, 0x00000100,
897         0x0409, 0xffffffff, 0x00000100,
898         mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
899         mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
900         mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
901         mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
902         mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
903         mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
904         0x3430, 0xfffffff0, 0x00000100,
905         0x3630, 0xfffffff0, 0x00000100,
906 };
907
908 static u32 si_pcie_rreg(struct amdgpu_device *adev, u32 reg)
909 {
910         unsigned long flags;
911         u32 r;
912
913         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
914         WREG32(AMDGPU_PCIE_INDEX, reg);
915         (void)RREG32(AMDGPU_PCIE_INDEX);
916         r = RREG32(AMDGPU_PCIE_DATA);
917         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
918         return r;
919 }
920
921 static void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
922 {
923         unsigned long flags;
924
925         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
926         WREG32(AMDGPU_PCIE_INDEX, reg);
927         (void)RREG32(AMDGPU_PCIE_INDEX);
928         WREG32(AMDGPU_PCIE_DATA, v);
929         (void)RREG32(AMDGPU_PCIE_DATA);
930         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
931 }
932
933 static u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
934 {
935         unsigned long flags;
936         u32 r;
937
938         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
939         WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
940         (void)RREG32(PCIE_PORT_INDEX);
941         r = RREG32(PCIE_PORT_DATA);
942         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
943         return r;
944 }
945
946 static void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
947 {
948         unsigned long flags;
949
950         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
951         WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
952         (void)RREG32(PCIE_PORT_INDEX);
953         WREG32(PCIE_PORT_DATA, (v));
954         (void)RREG32(PCIE_PORT_DATA);
955         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
956 }
957
958 static u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg)
959 {
960         unsigned long flags;
961         u32 r;
962
963         spin_lock_irqsave(&adev->smc_idx_lock, flags);
964         WREG32(SMC_IND_INDEX_0, (reg));
965         r = RREG32(SMC_IND_DATA_0);
966         spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
967         return r;
968 }
969
970 static void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
971 {
972         unsigned long flags;
973
974         spin_lock_irqsave(&adev->smc_idx_lock, flags);
975         WREG32(SMC_IND_INDEX_0, (reg));
976         WREG32(SMC_IND_DATA_0, (v));
977         spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
978 }
979
980 static u32 si_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
981 {
982         unsigned long flags;
983         u32 r;
984
985         spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
986         WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
987         r = RREG32(mmUVD_CTX_DATA);
988         spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
989         return r;
990 }
991
992 static void si_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
993 {
994         unsigned long flags;
995
996         spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
997         WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
998         WREG32(mmUVD_CTX_DATA, (v));
999         spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
1000 }
1001
1002 static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = {
1003         {GRBM_STATUS},
1004         {mmGRBM_STATUS2},
1005         {mmGRBM_STATUS_SE0},
1006         {mmGRBM_STATUS_SE1},
1007         {mmSRBM_STATUS},
1008         {mmSRBM_STATUS2},
1009         {DMA_STATUS_REG + DMA0_REGISTER_OFFSET},
1010         {DMA_STATUS_REG + DMA1_REGISTER_OFFSET},
1011         {mmCP_STAT},
1012         {mmCP_STALLED_STAT1},
1013         {mmCP_STALLED_STAT2},
1014         {mmCP_STALLED_STAT3},
1015         {GB_ADDR_CONFIG},
1016         {MC_ARB_RAMCFG},
1017         {GB_TILE_MODE0},
1018         {GB_TILE_MODE1},
1019         {GB_TILE_MODE2},
1020         {GB_TILE_MODE3},
1021         {GB_TILE_MODE4},
1022         {GB_TILE_MODE5},
1023         {GB_TILE_MODE6},
1024         {GB_TILE_MODE7},
1025         {GB_TILE_MODE8},
1026         {GB_TILE_MODE9},
1027         {GB_TILE_MODE10},
1028         {GB_TILE_MODE11},
1029         {GB_TILE_MODE12},
1030         {GB_TILE_MODE13},
1031         {GB_TILE_MODE14},
1032         {GB_TILE_MODE15},
1033         {GB_TILE_MODE16},
1034         {GB_TILE_MODE17},
1035         {GB_TILE_MODE18},
1036         {GB_TILE_MODE19},
1037         {GB_TILE_MODE20},
1038         {GB_TILE_MODE21},
1039         {GB_TILE_MODE22},
1040         {GB_TILE_MODE23},
1041         {GB_TILE_MODE24},
1042         {GB_TILE_MODE25},
1043         {GB_TILE_MODE26},
1044         {GB_TILE_MODE27},
1045         {GB_TILE_MODE28},
1046         {GB_TILE_MODE29},
1047         {GB_TILE_MODE30},
1048         {GB_TILE_MODE31},
1049         {CC_RB_BACKEND_DISABLE, true},
1050         {GC_USER_RB_BACKEND_DISABLE, true},
1051         {PA_SC_RASTER_CONFIG, true},
1052 };
1053
1054 static uint32_t si_get_register_value(struct amdgpu_device *adev,
1055                                       bool indexed, u32 se_num,
1056                                       u32 sh_num, u32 reg_offset)
1057 {
1058         if (indexed) {
1059                 uint32_t val;
1060                 unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
1061                 unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
1062
1063                 switch (reg_offset) {
1064                 case mmCC_RB_BACKEND_DISABLE:
1065                         return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
1066                 case mmGC_USER_RB_BACKEND_DISABLE:
1067                         return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
1068                 case mmPA_SC_RASTER_CONFIG:
1069                         return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
1070                 }
1071
1072                 mutex_lock(&adev->grbm_idx_mutex);
1073                 if (se_num != 0xffffffff || sh_num != 0xffffffff)
1074                         amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
1075
1076                 val = RREG32(reg_offset);
1077
1078                 if (se_num != 0xffffffff || sh_num != 0xffffffff)
1079                         amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1080                 mutex_unlock(&adev->grbm_idx_mutex);
1081                 return val;
1082         } else {
1083                 unsigned idx;
1084
1085                 switch (reg_offset) {
1086                 case mmGB_ADDR_CONFIG:
1087                         return adev->gfx.config.gb_addr_config;
1088                 case mmMC_ARB_RAMCFG:
1089                         return adev->gfx.config.mc_arb_ramcfg;
1090                 case mmGB_TILE_MODE0:
1091                 case mmGB_TILE_MODE1:
1092                 case mmGB_TILE_MODE2:
1093                 case mmGB_TILE_MODE3:
1094                 case mmGB_TILE_MODE4:
1095                 case mmGB_TILE_MODE5:
1096                 case mmGB_TILE_MODE6:
1097                 case mmGB_TILE_MODE7:
1098                 case mmGB_TILE_MODE8:
1099                 case mmGB_TILE_MODE9:
1100                 case mmGB_TILE_MODE10:
1101                 case mmGB_TILE_MODE11:
1102                 case mmGB_TILE_MODE12:
1103                 case mmGB_TILE_MODE13:
1104                 case mmGB_TILE_MODE14:
1105                 case mmGB_TILE_MODE15:
1106                 case mmGB_TILE_MODE16:
1107                 case mmGB_TILE_MODE17:
1108                 case mmGB_TILE_MODE18:
1109                 case mmGB_TILE_MODE19:
1110                 case mmGB_TILE_MODE20:
1111                 case mmGB_TILE_MODE21:
1112                 case mmGB_TILE_MODE22:
1113                 case mmGB_TILE_MODE23:
1114                 case mmGB_TILE_MODE24:
1115                 case mmGB_TILE_MODE25:
1116                 case mmGB_TILE_MODE26:
1117                 case mmGB_TILE_MODE27:
1118                 case mmGB_TILE_MODE28:
1119                 case mmGB_TILE_MODE29:
1120                 case mmGB_TILE_MODE30:
1121                 case mmGB_TILE_MODE31:
1122                         idx = (reg_offset - mmGB_TILE_MODE0);
1123                         return adev->gfx.config.tile_mode_array[idx];
1124                 default:
1125                         return RREG32(reg_offset);
1126                 }
1127         }
1128 }
1129 static int si_read_register(struct amdgpu_device *adev, u32 se_num,
1130                              u32 sh_num, u32 reg_offset, u32 *value)
1131 {
1132         uint32_t i;
1133
1134         *value = 0;
1135         for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) {
1136                 bool indexed = si_allowed_read_registers[i].grbm_indexed;
1137
1138                 if (reg_offset != si_allowed_read_registers[i].reg_offset)
1139                         continue;
1140
1141                 *value = si_get_register_value(adev, indexed, se_num, sh_num,
1142                                                reg_offset);
1143                 return 0;
1144         }
1145         return -EINVAL;
1146 }
1147
1148 static bool si_read_disabled_bios(struct amdgpu_device *adev)
1149 {
1150         u32 bus_cntl;
1151         u32 d1vga_control = 0;
1152         u32 d2vga_control = 0;
1153         u32 vga_render_control = 0;
1154         u32 rom_cntl;
1155         bool r;
1156
1157         bus_cntl = RREG32(R600_BUS_CNTL);
1158         if (adev->mode_info.num_crtc) {
1159                 d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
1160                 d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
1161                 vga_render_control = RREG32(VGA_RENDER_CONTROL);
1162         }
1163         rom_cntl = RREG32(R600_ROM_CNTL);
1164
1165         /* enable the rom */
1166         WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
1167         if (adev->mode_info.num_crtc) {
1168                 /* Disable VGA mode */
1169                 WREG32(AVIVO_D1VGA_CONTROL,
1170                        (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1171                                           AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1172                 WREG32(AVIVO_D2VGA_CONTROL,
1173                        (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1174                                           AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1175                 WREG32(VGA_RENDER_CONTROL,
1176                        (vga_render_control & C_000300_VGA_VSTATUS_CNTL));
1177         }
1178         WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
1179
1180         r = amdgpu_read_bios(adev);
1181
1182         /* restore regs */
1183         WREG32(R600_BUS_CNTL, bus_cntl);
1184         if (adev->mode_info.num_crtc) {
1185                 WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
1186                 WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
1187                 WREG32(VGA_RENDER_CONTROL, vga_render_control);
1188         }
1189         WREG32(R600_ROM_CNTL, rom_cntl);
1190         return r;
1191 }
1192
1193 #define mmROM_INDEX 0x2A
1194 #define mmROM_DATA  0x2B
1195
1196 static bool si_read_bios_from_rom(struct amdgpu_device *adev,
1197                                   u8 *bios, u32 length_bytes)
1198 {
1199         u32 *dw_ptr;
1200         u32 i, length_dw;
1201
1202         if (bios == NULL)
1203                 return false;
1204         if (length_bytes == 0)
1205                 return false;
1206         /* APU vbios image is part of sbios image */
1207         if (adev->flags & AMD_IS_APU)
1208                 return false;
1209
1210         dw_ptr = (u32 *)bios;
1211         length_dw = ALIGN(length_bytes, 4) / 4;
1212         /* set rom index to 0 */
1213         WREG32(mmROM_INDEX, 0);
1214         for (i = 0; i < length_dw; i++)
1215                 dw_ptr[i] = RREG32(mmROM_DATA);
1216
1217         return true;
1218 }
1219
1220 static void si_set_clk_bypass_mode(struct amdgpu_device *adev)
1221 {
1222         u32 tmp, i;
1223
1224         tmp = RREG32(CG_SPLL_FUNC_CNTL);
1225         tmp |= SPLL_BYPASS_EN;
1226         WREG32(CG_SPLL_FUNC_CNTL, tmp);
1227
1228         tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
1229         tmp |= SPLL_CTLREQ_CHG;
1230         WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1231
1232         for (i = 0; i < adev->usec_timeout; i++) {
1233                 if (RREG32(SPLL_STATUS) & SPLL_CHG_STATUS)
1234                         break;
1235                 udelay(1);
1236         }
1237
1238         tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
1239         tmp &= ~(SPLL_CTLREQ_CHG | SCLK_MUX_UPDATE);
1240         WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1241
1242         tmp = RREG32(MPLL_CNTL_MODE);
1243         tmp &= ~MPLL_MCLK_SEL;
1244         WREG32(MPLL_CNTL_MODE, tmp);
1245 }
1246
1247 static void si_spll_powerdown(struct amdgpu_device *adev)
1248 {
1249         u32 tmp;
1250
1251         tmp = RREG32(SPLL_CNTL_MODE);
1252         tmp |= SPLL_SW_DIR_CONTROL;
1253         WREG32(SPLL_CNTL_MODE, tmp);
1254
1255         tmp = RREG32(CG_SPLL_FUNC_CNTL);
1256         tmp |= SPLL_RESET;
1257         WREG32(CG_SPLL_FUNC_CNTL, tmp);
1258
1259         tmp = RREG32(CG_SPLL_FUNC_CNTL);
1260         tmp |= SPLL_SLEEP;
1261         WREG32(CG_SPLL_FUNC_CNTL, tmp);
1262
1263         tmp = RREG32(SPLL_CNTL_MODE);
1264         tmp &= ~SPLL_SW_DIR_CONTROL;
1265         WREG32(SPLL_CNTL_MODE, tmp);
1266 }
1267
1268 static int si_gpu_pci_config_reset(struct amdgpu_device *adev)
1269 {
1270         u32 i;
1271         int r = -EINVAL;
1272
1273         amdgpu_atombios_scratch_regs_engine_hung(adev, true);
1274
1275         /* set mclk/sclk to bypass */
1276         si_set_clk_bypass_mode(adev);
1277         /* powerdown spll */
1278         si_spll_powerdown(adev);
1279         /* disable BM */
1280         pci_clear_master(adev->pdev);
1281         /* reset */
1282         amdgpu_device_pci_config_reset(adev);
1283
1284         udelay(100);
1285
1286         /* wait for asic to come out of reset */
1287         for (i = 0; i < adev->usec_timeout; i++) {
1288                 if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
1289                         /* enable BM */
1290                         pci_set_master(adev->pdev);
1291                         adev->has_hw_reset = true;
1292                         r = 0;
1293                         break;
1294                 }
1295                 udelay(1);
1296         }
1297         amdgpu_atombios_scratch_regs_engine_hung(adev, false);
1298
1299         return r;
1300 }
1301
1302 static bool si_asic_supports_baco(struct amdgpu_device *adev)
1303 {
1304         return false;
1305 }
1306
1307 static enum amd_reset_method
1308 si_asic_reset_method(struct amdgpu_device *adev)
1309 {
1310         if (amdgpu_reset_method == AMD_RESET_METHOD_PCI)
1311                 return amdgpu_reset_method;
1312         else if (amdgpu_reset_method != AMD_RESET_METHOD_LEGACY &&
1313                  amdgpu_reset_method != -1)
1314                 dev_warn(adev->dev, "Specified reset method:%d isn't supported, using AUTO instead.\n",
1315                          amdgpu_reset_method);
1316
1317         return AMD_RESET_METHOD_LEGACY;
1318 }
1319
1320 static int si_asic_reset(struct amdgpu_device *adev)
1321 {
1322         int r;
1323
1324         switch (si_asic_reset_method(adev)) {
1325         case AMD_RESET_METHOD_PCI:
1326                 dev_info(adev->dev, "PCI reset\n");
1327                 r = amdgpu_device_pci_reset(adev);
1328                 break;
1329         default:
1330                 dev_info(adev->dev, "PCI CONFIG reset\n");
1331                 r = si_gpu_pci_config_reset(adev);
1332                 break;
1333         }
1334
1335         return r;
1336 }
1337
1338 static u32 si_get_config_memsize(struct amdgpu_device *adev)
1339 {
1340         return RREG32(mmCONFIG_MEMSIZE);
1341 }
1342
1343 static void si_vga_set_state(struct amdgpu_device *adev, bool state)
1344 {
1345         uint32_t temp;
1346
1347         temp = RREG32(CONFIG_CNTL);
1348         if (!state) {
1349                 temp &= ~(1<<0);
1350                 temp |= (1<<1);
1351         } else {
1352                 temp &= ~(1<<1);
1353         }
1354         WREG32(CONFIG_CNTL, temp);
1355 }
1356
1357 static u32 si_get_xclk(struct amdgpu_device *adev)
1358 {
1359         u32 reference_clock = adev->clock.spll.reference_freq;
1360         u32 tmp;
1361
1362         tmp = RREG32(CG_CLKPIN_CNTL_2);
1363         if (tmp & MUX_TCLK_TO_XCLK)
1364                 return TCLK;
1365
1366         tmp = RREG32(CG_CLKPIN_CNTL);
1367         if (tmp & XTALIN_DIVIDE)
1368                 return reference_clock / 4;
1369
1370         return reference_clock;
1371 }
1372
1373 static void si_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
1374 {
1375         if (!ring || !ring->funcs->emit_wreg) {
1376                 WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1377                 RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
1378         } else {
1379                 amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1380         }
1381 }
1382
1383 static void si_invalidate_hdp(struct amdgpu_device *adev,
1384                               struct amdgpu_ring *ring)
1385 {
1386         if (!ring || !ring->funcs->emit_wreg) {
1387                 WREG32(mmHDP_DEBUG0, 1);
1388                 RREG32(mmHDP_DEBUG0);
1389         } else {
1390                 amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
1391         }
1392 }
1393
1394 static bool si_need_full_reset(struct amdgpu_device *adev)
1395 {
1396         /* change this when we support soft reset */
1397         return true;
1398 }
1399
1400 static bool si_need_reset_on_init(struct amdgpu_device *adev)
1401 {
1402         return false;
1403 }
1404
1405 static int si_get_pcie_lanes(struct amdgpu_device *adev)
1406 {
1407         u32 link_width_cntl;
1408
1409         if (adev->flags & AMD_IS_APU)
1410                 return 0;
1411
1412         link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1413
1414         switch ((link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT) {
1415         case LC_LINK_WIDTH_X1:
1416                 return 1;
1417         case LC_LINK_WIDTH_X2:
1418                 return 2;
1419         case LC_LINK_WIDTH_X4:
1420                 return 4;
1421         case LC_LINK_WIDTH_X8:
1422                 return 8;
1423         case LC_LINK_WIDTH_X0:
1424         case LC_LINK_WIDTH_X16:
1425         default:
1426                 return 16;
1427         }
1428 }
1429
1430 static void si_set_pcie_lanes(struct amdgpu_device *adev, int lanes)
1431 {
1432         u32 link_width_cntl, mask;
1433
1434         if (adev->flags & AMD_IS_APU)
1435                 return;
1436
1437         switch (lanes) {
1438         case 0:
1439                 mask = LC_LINK_WIDTH_X0;
1440                 break;
1441         case 1:
1442                 mask = LC_LINK_WIDTH_X1;
1443                 break;
1444         case 2:
1445                 mask = LC_LINK_WIDTH_X2;
1446                 break;
1447         case 4:
1448                 mask = LC_LINK_WIDTH_X4;
1449                 break;
1450         case 8:
1451                 mask = LC_LINK_WIDTH_X8;
1452                 break;
1453         case 16:
1454                 mask = LC_LINK_WIDTH_X16;
1455                 break;
1456         default:
1457                 DRM_ERROR("invalid pcie lane request: %d\n", lanes);
1458                 return;
1459         }
1460
1461         link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1462         link_width_cntl &= ~LC_LINK_WIDTH_MASK;
1463         link_width_cntl |= mask << LC_LINK_WIDTH_SHIFT;
1464         link_width_cntl |= (LC_RECONFIG_NOW |
1465                             LC_RECONFIG_ARC_MISSING_ESCAPE);
1466
1467         WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
1468 }
1469
1470 static void si_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
1471                               uint64_t *count1)
1472 {
1473         uint32_t perfctr = 0;
1474         uint64_t cnt0_of, cnt1_of;
1475         int tmp;
1476
1477         /* This reports 0 on APUs, so return to avoid writing/reading registers
1478          * that may or may not be different from their GPU counterparts
1479          */
1480         if (adev->flags & AMD_IS_APU)
1481                 return;
1482
1483         /* Set the 2 events that we wish to watch, defined above */
1484         /* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
1485         perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
1486         perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
1487
1488         /* Write to enable desired perf counters */
1489         WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
1490         /* Zero out and enable the perf counters
1491          * Write 0x5:
1492          * Bit 0 = Start all counters(1)
1493          * Bit 2 = Global counter reset enable(1)
1494          */
1495         WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
1496
1497         msleep(1000);
1498
1499         /* Load the shadow and disable the perf counters
1500          * Write 0x2:
1501          * Bit 0 = Stop counters(0)
1502          * Bit 1 = Load the shadow counters(1)
1503          */
1504         WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
1505
1506         /* Read register values to get any >32bit overflow */
1507         tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
1508         cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
1509         cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
1510
1511         /* Get the values and add the overflow */
1512         *count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
1513         *count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
1514 }
1515
1516 static uint64_t si_get_pcie_replay_count(struct amdgpu_device *adev)
1517 {
1518         uint64_t nak_r, nak_g;
1519
1520         /* Get the number of NAKs received and generated */
1521         nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
1522         nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
1523
1524         /* Add the total number of NAKs, i.e the number of replays */
1525         return (nak_r + nak_g);
1526 }
1527
1528 static int si_uvd_send_upll_ctlreq(struct amdgpu_device *adev,
1529                                    unsigned cg_upll_func_cntl)
1530 {
1531         unsigned i;
1532
1533         /* Make sure UPLL_CTLREQ is deasserted */
1534         WREG32_P(cg_upll_func_cntl, 0, ~UPLL_CTLREQ_MASK);
1535
1536         mdelay(10);
1537
1538         /* Assert UPLL_CTLREQ */
1539         WREG32_P(cg_upll_func_cntl, UPLL_CTLREQ_MASK, ~UPLL_CTLREQ_MASK);
1540
1541         /* Wait for CTLACK and CTLACK2 to get asserted */
1542         for (i = 0; i < SI_MAX_CTLACKS_ASSERTION_WAIT; ++i) {
1543                 uint32_t mask = UPLL_CTLACK_MASK | UPLL_CTLACK2_MASK;
1544
1545                 if ((RREG32(cg_upll_func_cntl) & mask) == mask)
1546                         break;
1547                 mdelay(10);
1548         }
1549
1550         /* Deassert UPLL_CTLREQ */
1551         WREG32_P(cg_upll_func_cntl, 0, ~UPLL_CTLREQ_MASK);
1552
1553         if (i == SI_MAX_CTLACKS_ASSERTION_WAIT) {
1554                 DRM_ERROR("Timeout setting UVD clocks!\n");
1555                 return -ETIMEDOUT;
1556         }
1557
1558         return 0;
1559 }
1560
1561 static unsigned si_uvd_calc_upll_post_div(unsigned vco_freq,
1562                                           unsigned target_freq,
1563                                           unsigned pd_min,
1564                                           unsigned pd_even)
1565 {
1566         unsigned post_div = vco_freq / target_freq;
1567
1568         /* Adjust to post divider minimum value */
1569         if (post_div < pd_min)
1570                 post_div = pd_min;
1571
1572         /* We alway need a frequency less than or equal the target */
1573         if ((vco_freq / post_div) > target_freq)
1574                 post_div += 1;
1575
1576         /* Post dividers above a certain value must be even */
1577         if (post_div > pd_even && post_div % 2)
1578                 post_div += 1;
1579
1580         return post_div;
1581 }
1582
1583 /**
1584  * si_calc_upll_dividers - calc UPLL clock dividers
1585  *
1586  * @adev: amdgpu_device pointer
1587  * @vclk: wanted VCLK
1588  * @dclk: wanted DCLK
1589  * @vco_min: minimum VCO frequency
1590  * @vco_max: maximum VCO frequency
1591  * @fb_factor: factor to multiply vco freq with
1592  * @fb_mask: limit and bitmask for feedback divider
1593  * @pd_min: post divider minimum
1594  * @pd_max: post divider maximum
1595  * @pd_even: post divider must be even above this value
1596  * @optimal_fb_div: resulting feedback divider
1597  * @optimal_vclk_div: resulting vclk post divider
1598  * @optimal_dclk_div: resulting dclk post divider
1599  *
1600  * Calculate dividers for UVDs UPLL (except APUs).
1601  * Returns zero on success; -EINVAL on error.
1602  */
1603 static int si_calc_upll_dividers(struct amdgpu_device *adev,
1604                                  unsigned vclk, unsigned dclk,
1605                                  unsigned vco_min, unsigned vco_max,
1606                                  unsigned fb_factor, unsigned fb_mask,
1607                                  unsigned pd_min, unsigned pd_max,
1608                                  unsigned pd_even,
1609                                  unsigned *optimal_fb_div,
1610                                  unsigned *optimal_vclk_div,
1611                                  unsigned *optimal_dclk_div)
1612 {
1613         unsigned vco_freq, ref_freq = adev->clock.spll.reference_freq;
1614
1615         /* Start off with something large */
1616         unsigned optimal_score = ~0;
1617
1618         /* Loop through vco from low to high */
1619         vco_min = max(max(vco_min, vclk), dclk);
1620         for (vco_freq = vco_min; vco_freq <= vco_max; vco_freq += 100) {
1621                 uint64_t fb_div = (uint64_t)vco_freq * fb_factor;
1622                 unsigned vclk_div, dclk_div, score;
1623
1624                 do_div(fb_div, ref_freq);
1625
1626                 /* fb div out of range ? */
1627                 if (fb_div > fb_mask)
1628                         break; /* It can oly get worse */
1629
1630                 fb_div &= fb_mask;
1631
1632                 /* Calc vclk divider with current vco freq */
1633                 vclk_div = si_uvd_calc_upll_post_div(vco_freq, vclk,
1634                                                      pd_min, pd_even);
1635                 if (vclk_div > pd_max)
1636                         break; /* vco is too big, it has to stop */
1637
1638                 /* Calc dclk divider with current vco freq */
1639                 dclk_div = si_uvd_calc_upll_post_div(vco_freq, dclk,
1640                                                      pd_min, pd_even);
1641                 if (dclk_div > pd_max)
1642                         break; /* vco is too big, it has to stop */
1643
1644                 /* Calc score with current vco freq */
1645                 score = vclk - (vco_freq / vclk_div) + dclk - (vco_freq / dclk_div);
1646
1647                 /* Determine if this vco setting is better than current optimal settings */
1648                 if (score < optimal_score) {
1649                         *optimal_fb_div = fb_div;
1650                         *optimal_vclk_div = vclk_div;
1651                         *optimal_dclk_div = dclk_div;
1652                         optimal_score = score;
1653                         if (optimal_score == 0)
1654                                 break; /* It can't get better than this */
1655                 }
1656         }
1657
1658         /* Did we found a valid setup ? */
1659         if (optimal_score == ~0)
1660                 return -EINVAL;
1661
1662         return 0;
1663 }
1664
1665 static int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1666 {
1667         unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
1668         int r;
1669
1670         /* Bypass vclk and dclk with bclk */
1671         WREG32_P(CG_UPLL_FUNC_CNTL_2,
1672                  VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
1673                  ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
1674
1675         /* Put PLL in bypass mode */
1676         WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
1677
1678         if (!vclk || !dclk) {
1679                 /* Keep the Bypass mode */
1680                 return 0;
1681         }
1682
1683         r = si_calc_upll_dividers(adev, vclk, dclk, 125000, 250000,
1684                                   16384, 0x03FFFFFF, 0, 128, 5,
1685                                   &fb_div, &vclk_div, &dclk_div);
1686         if (r)
1687                 return r;
1688
1689         /* Set RESET_ANTI_MUX to 0 */
1690         WREG32_P(CG_UPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
1691
1692         /* Set VCO_MODE to 1 */
1693         WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK);
1694
1695         /* Disable sleep mode */
1696         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK);
1697
1698         /* Deassert UPLL_RESET */
1699         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
1700
1701         mdelay(1);
1702
1703         r = si_uvd_send_upll_ctlreq(adev, CG_UPLL_FUNC_CNTL);
1704         if (r)
1705                 return r;
1706
1707         /* Assert UPLL_RESET again */
1708         WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
1709
1710         /* Disable spread spectrum. */
1711         WREG32_P(CG_UPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
1712
1713         /* Set feedback divider */
1714         WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div), ~UPLL_FB_DIV_MASK);
1715
1716         /* Set ref divider to 0 */
1717         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_REF_DIV_MASK);
1718
1719         if (fb_div < 307200)
1720                 WREG32_P(CG_UPLL_FUNC_CNTL_4, 0, ~UPLL_SPARE_ISPARE9);
1721         else
1722                 WREG32_P(CG_UPLL_FUNC_CNTL_4,
1723                          UPLL_SPARE_ISPARE9,
1724                          ~UPLL_SPARE_ISPARE9);
1725
1726         /* Set PDIV_A and PDIV_B */
1727         WREG32_P(CG_UPLL_FUNC_CNTL_2,
1728                  UPLL_PDIV_A(vclk_div) | UPLL_PDIV_B(dclk_div),
1729                  ~(UPLL_PDIV_A_MASK | UPLL_PDIV_B_MASK));
1730
1731         /* Give the PLL some time to settle */
1732         mdelay(15);
1733
1734         /* Deassert PLL_RESET */
1735         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
1736
1737         mdelay(15);
1738
1739         /* Switch from bypass mode to normal mode */
1740         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
1741
1742         r = si_uvd_send_upll_ctlreq(adev, CG_UPLL_FUNC_CNTL);
1743         if (r)
1744                 return r;
1745
1746         /* Switch VCLK and DCLK selection */
1747         WREG32_P(CG_UPLL_FUNC_CNTL_2,
1748                  VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
1749                  ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
1750
1751         mdelay(100);
1752
1753         return 0;
1754 }
1755
1756 static int si_vce_send_vcepll_ctlreq(struct amdgpu_device *adev)
1757 {
1758         unsigned i;
1759
1760         /* Make sure VCEPLL_CTLREQ is deasserted */
1761         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK);
1762
1763         mdelay(10);
1764
1765         /* Assert UPLL_CTLREQ */
1766         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, UPLL_CTLREQ_MASK, ~UPLL_CTLREQ_MASK);
1767
1768         /* Wait for CTLACK and CTLACK2 to get asserted */
1769         for (i = 0; i < SI_MAX_CTLACKS_ASSERTION_WAIT; ++i) {
1770                 uint32_t mask = UPLL_CTLACK_MASK | UPLL_CTLACK2_MASK;
1771
1772                 if ((RREG32_SMC(CG_VCEPLL_FUNC_CNTL) & mask) == mask)
1773                         break;
1774                 mdelay(10);
1775         }
1776
1777         /* Deassert UPLL_CTLREQ */
1778         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK);
1779
1780         if (i == SI_MAX_CTLACKS_ASSERTION_WAIT) {
1781                 DRM_ERROR("Timeout setting UVD clocks!\n");
1782                 return -ETIMEDOUT;
1783         }
1784
1785         return 0;
1786 }
1787
1788 static int si_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
1789 {
1790         unsigned fb_div = 0, evclk_div = 0, ecclk_div = 0;
1791         int r;
1792
1793         /* Bypass evclk and ecclk with bclk */
1794         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
1795                      EVCLK_SRC_SEL(1) | ECCLK_SRC_SEL(1),
1796                      ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK));
1797
1798         /* Put PLL in bypass mode */
1799         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_BYPASS_EN_MASK,
1800                      ~VCEPLL_BYPASS_EN_MASK);
1801
1802         if (!evclk || !ecclk) {
1803                 /* Keep the Bypass mode, put PLL to sleep */
1804                 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK,
1805                              ~VCEPLL_SLEEP_MASK);
1806                 return 0;
1807         }
1808
1809         r = si_calc_upll_dividers(adev, evclk, ecclk, 125000, 250000,
1810                                   16384, 0x03FFFFFF, 0, 128, 5,
1811                                   &fb_div, &evclk_div, &ecclk_div);
1812         if (r)
1813                 return r;
1814
1815         /* Set RESET_ANTI_MUX to 0 */
1816         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
1817
1818         /* Set VCO_MODE to 1 */
1819         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_VCO_MODE_MASK,
1820                      ~VCEPLL_VCO_MODE_MASK);
1821
1822         /* Toggle VCEPLL_SLEEP to 1 then back to 0 */
1823         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK,
1824                      ~VCEPLL_SLEEP_MASK);
1825         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_SLEEP_MASK);
1826
1827         /* Deassert VCEPLL_RESET */
1828         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK);
1829
1830         mdelay(1);
1831
1832         r = si_vce_send_vcepll_ctlreq(adev);
1833         if (r)
1834                 return r;
1835
1836         /* Assert VCEPLL_RESET again */
1837         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_RESET_MASK, ~VCEPLL_RESET_MASK);
1838
1839         /* Disable spread spectrum. */
1840         WREG32_SMC_P(CG_VCEPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
1841
1842         /* Set feedback divider */
1843         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_3,
1844                      VCEPLL_FB_DIV(fb_div),
1845                      ~VCEPLL_FB_DIV_MASK);
1846
1847         /* Set ref divider to 0 */
1848         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_REF_DIV_MASK);
1849
1850         /* Set PDIV_A and PDIV_B */
1851         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
1852                      VCEPLL_PDIV_A(evclk_div) | VCEPLL_PDIV_B(ecclk_div),
1853                      ~(VCEPLL_PDIV_A_MASK | VCEPLL_PDIV_B_MASK));
1854
1855         /* Give the PLL some time to settle */
1856         mdelay(15);
1857
1858         /* Deassert PLL_RESET */
1859         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK);
1860
1861         mdelay(15);
1862
1863         /* Switch from bypass mode to normal mode */
1864         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_BYPASS_EN_MASK);
1865
1866         r = si_vce_send_vcepll_ctlreq(adev);
1867         if (r)
1868                 return r;
1869
1870         /* Switch VCLK and DCLK selection */
1871         WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
1872                      EVCLK_SRC_SEL(16) | ECCLK_SRC_SEL(16),
1873                      ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK));
1874
1875         mdelay(100);
1876
1877         return 0;
1878 }
1879
1880 static void si_pre_asic_init(struct amdgpu_device *adev)
1881 {
1882 }
1883
1884 static const struct amdgpu_asic_funcs si_asic_funcs =
1885 {
1886         .read_disabled_bios = &si_read_disabled_bios,
1887         .read_bios_from_rom = &si_read_bios_from_rom,
1888         .read_register = &si_read_register,
1889         .reset = &si_asic_reset,
1890         .reset_method = &si_asic_reset_method,
1891         .set_vga_state = &si_vga_set_state,
1892         .get_xclk = &si_get_xclk,
1893         .set_uvd_clocks = &si_set_uvd_clocks,
1894         .set_vce_clocks = &si_set_vce_clocks,
1895         .get_pcie_lanes = &si_get_pcie_lanes,
1896         .set_pcie_lanes = &si_set_pcie_lanes,
1897         .get_config_memsize = &si_get_config_memsize,
1898         .flush_hdp = &si_flush_hdp,
1899         .invalidate_hdp = &si_invalidate_hdp,
1900         .need_full_reset = &si_need_full_reset,
1901         .get_pcie_usage = &si_get_pcie_usage,
1902         .need_reset_on_init = &si_need_reset_on_init,
1903         .get_pcie_replay_count = &si_get_pcie_replay_count,
1904         .supports_baco = &si_asic_supports_baco,
1905         .pre_asic_init = &si_pre_asic_init,
1906 };
1907
1908 static uint32_t si_get_rev_id(struct amdgpu_device *adev)
1909 {
1910         return (RREG32(CC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1911                 >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1912 }
1913
1914 static int si_common_early_init(void *handle)
1915 {
1916         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1917
1918         adev->smc_rreg = &si_smc_rreg;
1919         adev->smc_wreg = &si_smc_wreg;
1920         adev->pcie_rreg = &si_pcie_rreg;
1921         adev->pcie_wreg = &si_pcie_wreg;
1922         adev->pciep_rreg = &si_pciep_rreg;
1923         adev->pciep_wreg = &si_pciep_wreg;
1924         adev->uvd_ctx_rreg = si_uvd_ctx_rreg;
1925         adev->uvd_ctx_wreg = si_uvd_ctx_wreg;
1926         adev->didt_rreg = NULL;
1927         adev->didt_wreg = NULL;
1928
1929         adev->asic_funcs = &si_asic_funcs;
1930
1931         adev->rev_id = si_get_rev_id(adev);
1932         adev->external_rev_id = 0xFF;
1933         switch (adev->asic_type) {
1934         case CHIP_TAHITI:
1935                 adev->cg_flags =
1936                         AMD_CG_SUPPORT_GFX_MGCG |
1937                         AMD_CG_SUPPORT_GFX_MGLS |
1938                         /*AMD_CG_SUPPORT_GFX_CGCG |*/
1939                         AMD_CG_SUPPORT_GFX_CGLS |
1940                         AMD_CG_SUPPORT_GFX_CGTS |
1941                         AMD_CG_SUPPORT_GFX_CP_LS |
1942                         AMD_CG_SUPPORT_MC_MGCG |
1943                         AMD_CG_SUPPORT_SDMA_MGCG |
1944                         AMD_CG_SUPPORT_BIF_LS |
1945                         AMD_CG_SUPPORT_VCE_MGCG |
1946                         AMD_CG_SUPPORT_UVD_MGCG |
1947                         AMD_CG_SUPPORT_HDP_LS |
1948                         AMD_CG_SUPPORT_HDP_MGCG;
1949                 adev->pg_flags = 0;
1950                 adev->external_rev_id = (adev->rev_id == 0) ? 1 :
1951                                         (adev->rev_id == 1) ? 5 : 6;
1952                 break;
1953         case CHIP_PITCAIRN:
1954                 adev->cg_flags =
1955                         AMD_CG_SUPPORT_GFX_MGCG |
1956                         AMD_CG_SUPPORT_GFX_MGLS |
1957                         /*AMD_CG_SUPPORT_GFX_CGCG |*/
1958                         AMD_CG_SUPPORT_GFX_CGLS |
1959                         AMD_CG_SUPPORT_GFX_CGTS |
1960                         AMD_CG_SUPPORT_GFX_CP_LS |
1961                         AMD_CG_SUPPORT_GFX_RLC_LS |
1962                         AMD_CG_SUPPORT_MC_LS |
1963                         AMD_CG_SUPPORT_MC_MGCG |
1964                         AMD_CG_SUPPORT_SDMA_MGCG |
1965                         AMD_CG_SUPPORT_BIF_LS |
1966                         AMD_CG_SUPPORT_VCE_MGCG |
1967                         AMD_CG_SUPPORT_UVD_MGCG |
1968                         AMD_CG_SUPPORT_HDP_LS |
1969                         AMD_CG_SUPPORT_HDP_MGCG;
1970                 adev->pg_flags = 0;
1971                 adev->external_rev_id = adev->rev_id + 20;
1972                 break;
1973
1974         case CHIP_VERDE:
1975                 adev->cg_flags =
1976                         AMD_CG_SUPPORT_GFX_MGCG |
1977                         AMD_CG_SUPPORT_GFX_MGLS |
1978                         AMD_CG_SUPPORT_GFX_CGLS |
1979                         AMD_CG_SUPPORT_GFX_CGTS |
1980                         AMD_CG_SUPPORT_GFX_CGTS_LS |
1981                         AMD_CG_SUPPORT_GFX_CP_LS |
1982                         AMD_CG_SUPPORT_MC_LS |
1983                         AMD_CG_SUPPORT_MC_MGCG |
1984                         AMD_CG_SUPPORT_SDMA_MGCG |
1985                         AMD_CG_SUPPORT_SDMA_LS |
1986                         AMD_CG_SUPPORT_BIF_LS |
1987                         AMD_CG_SUPPORT_VCE_MGCG |
1988                         AMD_CG_SUPPORT_UVD_MGCG |
1989                         AMD_CG_SUPPORT_HDP_LS |
1990                         AMD_CG_SUPPORT_HDP_MGCG;
1991                 adev->pg_flags = 0;
1992                 //???
1993                 adev->external_rev_id = adev->rev_id + 40;
1994                 break;
1995         case CHIP_OLAND:
1996                 adev->cg_flags =
1997                         AMD_CG_SUPPORT_GFX_MGCG |
1998                         AMD_CG_SUPPORT_GFX_MGLS |
1999                         /*AMD_CG_SUPPORT_GFX_CGCG |*/
2000                         AMD_CG_SUPPORT_GFX_CGLS |
2001                         AMD_CG_SUPPORT_GFX_CGTS |
2002                         AMD_CG_SUPPORT_GFX_CP_LS |
2003                         AMD_CG_SUPPORT_GFX_RLC_LS |
2004                         AMD_CG_SUPPORT_MC_LS |
2005                         AMD_CG_SUPPORT_MC_MGCG |
2006                         AMD_CG_SUPPORT_SDMA_MGCG |
2007                         AMD_CG_SUPPORT_BIF_LS |
2008                         AMD_CG_SUPPORT_UVD_MGCG |
2009                         AMD_CG_SUPPORT_HDP_LS |
2010                         AMD_CG_SUPPORT_HDP_MGCG;
2011                 adev->pg_flags = 0;
2012                 adev->external_rev_id = 60;
2013                 break;
2014         case CHIP_HAINAN:
2015                 adev->cg_flags =
2016                         AMD_CG_SUPPORT_GFX_MGCG |
2017                         AMD_CG_SUPPORT_GFX_MGLS |
2018                         /*AMD_CG_SUPPORT_GFX_CGCG |*/
2019                         AMD_CG_SUPPORT_GFX_CGLS |
2020                         AMD_CG_SUPPORT_GFX_CGTS |
2021                         AMD_CG_SUPPORT_GFX_CP_LS |
2022                         AMD_CG_SUPPORT_GFX_RLC_LS |
2023                         AMD_CG_SUPPORT_MC_LS |
2024                         AMD_CG_SUPPORT_MC_MGCG |
2025                         AMD_CG_SUPPORT_SDMA_MGCG |
2026                         AMD_CG_SUPPORT_BIF_LS |
2027                         AMD_CG_SUPPORT_HDP_LS |
2028                         AMD_CG_SUPPORT_HDP_MGCG;
2029                 adev->pg_flags = 0;
2030                 adev->external_rev_id = 70;
2031                 break;
2032
2033         default:
2034                 return -EINVAL;
2035         }
2036
2037         return 0;
2038 }
2039
2040 static int si_common_sw_init(void *handle)
2041 {
2042         return 0;
2043 }
2044
2045 static int si_common_sw_fini(void *handle)
2046 {
2047         return 0;
2048 }
2049
2050
2051 static void si_init_golden_registers(struct amdgpu_device *adev)
2052 {
2053         switch (adev->asic_type) {
2054         case CHIP_TAHITI:
2055                 amdgpu_device_program_register_sequence(adev,
2056                                                         tahiti_golden_registers,
2057                                                         ARRAY_SIZE(tahiti_golden_registers));
2058                 amdgpu_device_program_register_sequence(adev,
2059                                                         tahiti_golden_rlc_registers,
2060                                                         ARRAY_SIZE(tahiti_golden_rlc_registers));
2061                 amdgpu_device_program_register_sequence(adev,
2062                                                         tahiti_mgcg_cgcg_init,
2063                                                         ARRAY_SIZE(tahiti_mgcg_cgcg_init));
2064                 amdgpu_device_program_register_sequence(adev,
2065                                                         tahiti_golden_registers2,
2066                                                         ARRAY_SIZE(tahiti_golden_registers2));
2067                 break;
2068         case CHIP_PITCAIRN:
2069                 amdgpu_device_program_register_sequence(adev,
2070                                                         pitcairn_golden_registers,
2071                                                         ARRAY_SIZE(pitcairn_golden_registers));
2072                 amdgpu_device_program_register_sequence(adev,
2073                                                         pitcairn_golden_rlc_registers,
2074                                                         ARRAY_SIZE(pitcairn_golden_rlc_registers));
2075                 amdgpu_device_program_register_sequence(adev,
2076                                                         pitcairn_mgcg_cgcg_init,
2077                                                         ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
2078                 break;
2079         case CHIP_VERDE:
2080                 amdgpu_device_program_register_sequence(adev,
2081                                                         verde_golden_registers,
2082                                                         ARRAY_SIZE(verde_golden_registers));
2083                 amdgpu_device_program_register_sequence(adev,
2084                                                         verde_golden_rlc_registers,
2085                                                         ARRAY_SIZE(verde_golden_rlc_registers));
2086                 amdgpu_device_program_register_sequence(adev,
2087                                                         verde_mgcg_cgcg_init,
2088                                                         ARRAY_SIZE(verde_mgcg_cgcg_init));
2089                 amdgpu_device_program_register_sequence(adev,
2090                                                         verde_pg_init,
2091                                                         ARRAY_SIZE(verde_pg_init));
2092                 break;
2093         case CHIP_OLAND:
2094                 amdgpu_device_program_register_sequence(adev,
2095                                                         oland_golden_registers,
2096                                                         ARRAY_SIZE(oland_golden_registers));
2097                 amdgpu_device_program_register_sequence(adev,
2098                                                         oland_golden_rlc_registers,
2099                                                         ARRAY_SIZE(oland_golden_rlc_registers));
2100                 amdgpu_device_program_register_sequence(adev,
2101                                                         oland_mgcg_cgcg_init,
2102                                                         ARRAY_SIZE(oland_mgcg_cgcg_init));
2103                 break;
2104         case CHIP_HAINAN:
2105                 amdgpu_device_program_register_sequence(adev,
2106                                                         hainan_golden_registers,
2107                                                         ARRAY_SIZE(hainan_golden_registers));
2108                 amdgpu_device_program_register_sequence(adev,
2109                                                         hainan_golden_registers2,
2110                                                         ARRAY_SIZE(hainan_golden_registers2));
2111                 amdgpu_device_program_register_sequence(adev,
2112                                                         hainan_mgcg_cgcg_init,
2113                                                         ARRAY_SIZE(hainan_mgcg_cgcg_init));
2114                 break;
2115
2116
2117         default:
2118                 BUG();
2119         }
2120 }
2121
2122 static void si_pcie_gen3_enable(struct amdgpu_device *adev)
2123 {
2124         struct pci_dev *root = adev->pdev->bus->self;
2125         u32 speed_cntl, current_data_rate;
2126         int i;
2127         u16 tmp16;
2128
2129         if (pci_is_root_bus(adev->pdev->bus))
2130                 return;
2131
2132         if (amdgpu_pcie_gen2 == 0)
2133                 return;
2134
2135         if (adev->flags & AMD_IS_APU)
2136                 return;
2137
2138         if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
2139                                         CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
2140                 return;
2141
2142         speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2143         current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
2144                 LC_CURRENT_DATA_RATE_SHIFT;
2145         if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
2146                 if (current_data_rate == 2) {
2147                         DRM_INFO("PCIE gen 3 link speeds already enabled\n");
2148                         return;
2149                 }
2150                 DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
2151         } else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
2152                 if (current_data_rate == 1) {
2153                         DRM_INFO("PCIE gen 2 link speeds already enabled\n");
2154                         return;
2155                 }
2156                 DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
2157         }
2158
2159         if (!pci_is_pcie(root) || !pci_is_pcie(adev->pdev))
2160                 return;
2161
2162         if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
2163                 if (current_data_rate != 2) {
2164                         u16 bridge_cfg, gpu_cfg;
2165                         u16 bridge_cfg2, gpu_cfg2;
2166                         u32 max_lw, current_lw, tmp;
2167
2168                         pcie_capability_read_word(root, PCI_EXP_LNKCTL,
2169                                                   &bridge_cfg);
2170                         pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL,
2171                                                   &gpu_cfg);
2172
2173                         tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
2174                         pcie_capability_write_word(root, PCI_EXP_LNKCTL, tmp16);
2175
2176                         tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
2177                         pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL,
2178                                                    tmp16);
2179
2180                         tmp = RREG32_PCIE(PCIE_LC_STATUS1);
2181                         max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
2182                         current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
2183
2184                         if (current_lw < max_lw) {
2185                                 tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2186                                 if (tmp & LC_RENEGOTIATION_SUPPORT) {
2187                                         tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
2188                                         tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
2189                                         tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
2190                                         WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
2191                                 }
2192                         }
2193
2194                         for (i = 0; i < 10; i++) {
2195                                 pcie_capability_read_word(adev->pdev,
2196                                                           PCI_EXP_DEVSTA,
2197                                                           &tmp16);
2198                                 if (tmp16 & PCI_EXP_DEVSTA_TRPND)
2199                                         break;
2200
2201                                 pcie_capability_read_word(root, PCI_EXP_LNKCTL,
2202                                                           &bridge_cfg);
2203                                 pcie_capability_read_word(adev->pdev,
2204                                                           PCI_EXP_LNKCTL,
2205                                                           &gpu_cfg);
2206
2207                                 pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
2208                                                           &bridge_cfg2);
2209                                 pcie_capability_read_word(adev->pdev,
2210                                                           PCI_EXP_LNKCTL2,
2211                                                           &gpu_cfg2);
2212
2213                                 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
2214                                 tmp |= LC_SET_QUIESCE;
2215                                 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
2216
2217                                 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
2218                                 tmp |= LC_REDO_EQ;
2219                                 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
2220
2221                                 mdelay(100);
2222
2223                                 pcie_capability_read_word(root, PCI_EXP_LNKCTL,
2224                                                           &tmp16);
2225                                 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
2226                                 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
2227                                 pcie_capability_write_word(root, PCI_EXP_LNKCTL,
2228                                                            tmp16);
2229
2230                                 pcie_capability_read_word(adev->pdev,
2231                                                           PCI_EXP_LNKCTL,
2232                                                           &tmp16);
2233                                 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
2234                                 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
2235                                 pcie_capability_write_word(adev->pdev,
2236                                                            PCI_EXP_LNKCTL,
2237                                                            tmp16);
2238
2239                                 pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
2240                                                           &tmp16);
2241                                 tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
2242                                            PCI_EXP_LNKCTL2_TX_MARGIN);
2243                                 tmp16 |= (bridge_cfg2 &
2244                                           (PCI_EXP_LNKCTL2_ENTER_COMP |
2245                                            PCI_EXP_LNKCTL2_TX_MARGIN));
2246                                 pcie_capability_write_word(root,
2247                                                            PCI_EXP_LNKCTL2,
2248                                                            tmp16);
2249
2250                                 pcie_capability_read_word(adev->pdev,
2251                                                           PCI_EXP_LNKCTL2,
2252                                                           &tmp16);
2253                                 tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
2254                                            PCI_EXP_LNKCTL2_TX_MARGIN);
2255                                 tmp16 |= (gpu_cfg2 &
2256                                           (PCI_EXP_LNKCTL2_ENTER_COMP |
2257                                            PCI_EXP_LNKCTL2_TX_MARGIN));
2258                                 pcie_capability_write_word(adev->pdev,
2259                                                            PCI_EXP_LNKCTL2,
2260                                                            tmp16);
2261
2262                                 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
2263                                 tmp &= ~LC_SET_QUIESCE;
2264                                 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
2265                         }
2266                 }
2267         }
2268
2269         speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
2270         speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
2271         WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2272
2273         pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL2, &tmp16);
2274         tmp16 &= ~PCI_EXP_LNKCTL2_TLS;
2275
2276         if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
2277                 tmp16 |= PCI_EXP_LNKCTL2_TLS_8_0GT; /* gen3 */
2278         else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
2279                 tmp16 |= PCI_EXP_LNKCTL2_TLS_5_0GT; /* gen2 */
2280         else
2281                 tmp16 |= PCI_EXP_LNKCTL2_TLS_2_5GT; /* gen1 */
2282         pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL2, tmp16);
2283
2284         speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2285         speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
2286         WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2287
2288         for (i = 0; i < adev->usec_timeout; i++) {
2289                 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2290                 if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
2291                         break;
2292                 udelay(1);
2293         }
2294 }
2295
2296 static inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg)
2297 {
2298         unsigned long flags;
2299         u32 r;
2300
2301         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2302         WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
2303         r = RREG32(EVERGREEN_PIF_PHY0_DATA);
2304         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2305         return r;
2306 }
2307
2308 static inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
2309 {
2310         unsigned long flags;
2311
2312         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2313         WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
2314         WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
2315         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2316 }
2317
2318 static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
2319 {
2320         unsigned long flags;
2321         u32 r;
2322
2323         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2324         WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
2325         r = RREG32(EVERGREEN_PIF_PHY1_DATA);
2326         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2327         return r;
2328 }
2329
2330 static inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
2331 {
2332         unsigned long flags;
2333
2334         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2335         WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
2336         WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
2337         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2338 }
2339 static void si_program_aspm(struct amdgpu_device *adev)
2340 {
2341         u32 data, orig;
2342         bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
2343         bool disable_clkreq = false;
2344
2345         if (amdgpu_aspm == 0)
2346                 return;
2347
2348         if (adev->flags & AMD_IS_APU)
2349                 return;
2350         orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
2351         data &= ~LC_XMIT_N_FTS_MASK;
2352         data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
2353         if (orig != data)
2354                 WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
2355
2356         orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
2357         data |= LC_GO_TO_RECOVERY;
2358         if (orig != data)
2359                 WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
2360
2361         orig = data = RREG32_PCIE(PCIE_P_CNTL);
2362         data |= P_IGNORE_EDB_ERR;
2363         if (orig != data)
2364                 WREG32_PCIE(PCIE_P_CNTL, data);
2365
2366         orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
2367         data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
2368         data |= LC_PMI_TO_L1_DIS;
2369         if (!disable_l0s)
2370                 data |= LC_L0S_INACTIVITY(7);
2371
2372         if (!disable_l1) {
2373                 data |= LC_L1_INACTIVITY(7);
2374                 data &= ~LC_PMI_TO_L1_DIS;
2375                 if (orig != data)
2376                         WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2377
2378                 if (!disable_plloff_in_l1) {
2379                         bool clk_req_support;
2380
2381                         orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
2382                         data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
2383                         data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
2384                         if (orig != data)
2385                                 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
2386
2387                         orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
2388                         data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
2389                         data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
2390                         if (orig != data)
2391                                 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
2392
2393                         orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
2394                         data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
2395                         data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
2396                         if (orig != data)
2397                                 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
2398
2399                         orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
2400                         data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
2401                         data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
2402                         if (orig != data)
2403                                 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
2404
2405                         if ((adev->asic_type != CHIP_OLAND) && (adev->asic_type != CHIP_HAINAN)) {
2406                                 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
2407                                 data &= ~PLL_RAMP_UP_TIME_0_MASK;
2408                                 if (orig != data)
2409                                         si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
2410
2411                                 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
2412                                 data &= ~PLL_RAMP_UP_TIME_1_MASK;
2413                                 if (orig != data)
2414                                         si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
2415
2416                                 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2);
2417                                 data &= ~PLL_RAMP_UP_TIME_2_MASK;
2418                                 if (orig != data)
2419                                         si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data);
2420
2421                                 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3);
2422                                 data &= ~PLL_RAMP_UP_TIME_3_MASK;
2423                                 if (orig != data)
2424                                         si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data);
2425
2426                                 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
2427                                 data &= ~PLL_RAMP_UP_TIME_0_MASK;
2428                                 if (orig != data)
2429                                         si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
2430
2431                                 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
2432                                 data &= ~PLL_RAMP_UP_TIME_1_MASK;
2433                                 if (orig != data)
2434                                         si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
2435
2436                                 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2);
2437                                 data &= ~PLL_RAMP_UP_TIME_2_MASK;
2438                                 if (orig != data)
2439                                         si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data);
2440
2441                                 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3);
2442                                 data &= ~PLL_RAMP_UP_TIME_3_MASK;
2443                                 if (orig != data)
2444                                         si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data);
2445                         }
2446                         orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2447                         data &= ~LC_DYN_LANES_PWR_STATE_MASK;
2448                         data |= LC_DYN_LANES_PWR_STATE(3);
2449                         if (orig != data)
2450                                 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
2451
2452                         orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL);
2453                         data &= ~LS2_EXIT_TIME_MASK;
2454                         if ((adev->asic_type == CHIP_OLAND) || (adev->asic_type == CHIP_HAINAN))
2455                                 data |= LS2_EXIT_TIME(5);
2456                         if (orig != data)
2457                                 si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data);
2458
2459                         orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL);
2460                         data &= ~LS2_EXIT_TIME_MASK;
2461                         if ((adev->asic_type == CHIP_OLAND) || (adev->asic_type == CHIP_HAINAN))
2462                                 data |= LS2_EXIT_TIME(5);
2463                         if (orig != data)
2464                                 si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data);
2465
2466                         if (!disable_clkreq &&
2467                             !pci_is_root_bus(adev->pdev->bus)) {
2468                                 struct pci_dev *root = adev->pdev->bus->self;
2469                                 u32 lnkcap;
2470
2471                                 clk_req_support = false;
2472                                 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
2473                                 if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
2474                                         clk_req_support = true;
2475                         } else {
2476                                 clk_req_support = false;
2477                         }
2478
2479                         if (clk_req_support) {
2480                                 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
2481                                 data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
2482                                 if (orig != data)
2483                                         WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
2484
2485                                 orig = data = RREG32(THM_CLK_CNTL);
2486                                 data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
2487                                 data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
2488                                 if (orig != data)
2489                                         WREG32(THM_CLK_CNTL, data);
2490
2491                                 orig = data = RREG32(MISC_CLK_CNTL);
2492                                 data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
2493                                 data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
2494                                 if (orig != data)
2495                                         WREG32(MISC_CLK_CNTL, data);
2496
2497                                 orig = data = RREG32(CG_CLKPIN_CNTL);
2498                                 data &= ~BCLK_AS_XCLK;
2499                                 if (orig != data)
2500                                         WREG32(CG_CLKPIN_CNTL, data);
2501
2502                                 orig = data = RREG32(CG_CLKPIN_CNTL_2);
2503                                 data &= ~FORCE_BIF_REFCLK_EN;
2504                                 if (orig != data)
2505                                         WREG32(CG_CLKPIN_CNTL_2, data);
2506
2507                                 orig = data = RREG32(MPLL_BYPASSCLK_SEL);
2508                                 data &= ~MPLL_CLKOUT_SEL_MASK;
2509                                 data |= MPLL_CLKOUT_SEL(4);
2510                                 if (orig != data)
2511                                         WREG32(MPLL_BYPASSCLK_SEL, data);
2512
2513                                 orig = data = RREG32(SPLL_CNTL_MODE);
2514                                 data &= ~SPLL_REFCLK_SEL_MASK;
2515                                 if (orig != data)
2516                                         WREG32(SPLL_CNTL_MODE, data);
2517                         }
2518                 }
2519         } else {
2520                 if (orig != data)
2521                         WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2522         }
2523
2524         orig = data = RREG32_PCIE(PCIE_CNTL2);
2525         data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
2526         if (orig != data)
2527                 WREG32_PCIE(PCIE_CNTL2, data);
2528
2529         if (!disable_l0s) {
2530                 data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
2531                 if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
2532                         data = RREG32_PCIE(PCIE_LC_STATUS1);
2533                         if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
2534                                 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
2535                                 data &= ~LC_L0S_INACTIVITY_MASK;
2536                                 if (orig != data)
2537                                         WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2538                         }
2539                 }
2540         }
2541 }
2542
2543 static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
2544 {
2545         int readrq;
2546         u16 v;
2547
2548         readrq = pcie_get_readrq(adev->pdev);
2549         v = ffs(readrq) - 8;
2550         if ((v == 0) || (v == 6) || (v == 7))
2551                 pcie_set_readrq(adev->pdev, 512);
2552 }
2553
2554 static int si_common_hw_init(void *handle)
2555 {
2556         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2557
2558         si_fix_pci_max_read_req_size(adev);
2559         si_init_golden_registers(adev);
2560         si_pcie_gen3_enable(adev);
2561         si_program_aspm(adev);
2562
2563         return 0;
2564 }
2565
2566 static int si_common_hw_fini(void *handle)
2567 {
2568         return 0;
2569 }
2570
2571 static int si_common_suspend(void *handle)
2572 {
2573         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2574
2575         return si_common_hw_fini(adev);
2576 }
2577
2578 static int si_common_resume(void *handle)
2579 {
2580         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2581
2582         return si_common_hw_init(adev);
2583 }
2584
2585 static bool si_common_is_idle(void *handle)
2586 {
2587         return true;
2588 }
2589
2590 static int si_common_wait_for_idle(void *handle)
2591 {
2592         return 0;
2593 }
2594
2595 static int si_common_soft_reset(void *handle)
2596 {
2597         return 0;
2598 }
2599
2600 static int si_common_set_clockgating_state(void *handle,
2601                                             enum amd_clockgating_state state)
2602 {
2603         return 0;
2604 }
2605
2606 static int si_common_set_powergating_state(void *handle,
2607                                             enum amd_powergating_state state)
2608 {
2609         return 0;
2610 }
2611
2612 static const struct amd_ip_funcs si_common_ip_funcs = {
2613         .name = "si_common",
2614         .early_init = si_common_early_init,
2615         .late_init = NULL,
2616         .sw_init = si_common_sw_init,
2617         .sw_fini = si_common_sw_fini,
2618         .hw_init = si_common_hw_init,
2619         .hw_fini = si_common_hw_fini,
2620         .suspend = si_common_suspend,
2621         .resume = si_common_resume,
2622         .is_idle = si_common_is_idle,
2623         .wait_for_idle = si_common_wait_for_idle,
2624         .soft_reset = si_common_soft_reset,
2625         .set_clockgating_state = si_common_set_clockgating_state,
2626         .set_powergating_state = si_common_set_powergating_state,
2627 };
2628
2629 static const struct amdgpu_ip_block_version si_common_ip_block =
2630 {
2631         .type = AMD_IP_BLOCK_TYPE_COMMON,
2632         .major = 1,
2633         .minor = 0,
2634         .rev = 0,
2635         .funcs = &si_common_ip_funcs,
2636 };
2637
2638 int si_set_ip_blocks(struct amdgpu_device *adev)
2639 {
2640         switch (adev->asic_type) {
2641         case CHIP_VERDE:
2642         case CHIP_TAHITI:
2643         case CHIP_PITCAIRN:
2644                 amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2645                 amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2646                 amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2647                 amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2648                 amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2649                 amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2650                 if (adev->enable_virtual_display)
2651                         amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2652 #if defined(CONFIG_DRM_AMD_DC) && defined(CONFIG_DRM_AMD_DC_SI)
2653                 else if (amdgpu_device_has_dc_support(adev))
2654                         amdgpu_device_ip_block_add(adev, &dm_ip_block);
2655 #endif
2656                 else
2657                         amdgpu_device_ip_block_add(adev, &dce_v6_0_ip_block);
2658                 amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block);
2659                 /* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2660                 break;
2661         case CHIP_OLAND:
2662                 amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2663                 amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2664                 amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2665                 amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2666                 amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2667                 amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2668                 if (adev->enable_virtual_display)
2669                         amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2670 #if defined(CONFIG_DRM_AMD_DC) && defined(CONFIG_DRM_AMD_DC_SI)
2671                 else if (amdgpu_device_has_dc_support(adev))
2672                         amdgpu_device_ip_block_add(adev, &dm_ip_block);
2673 #endif
2674                 else
2675                         amdgpu_device_ip_block_add(adev, &dce_v6_4_ip_block);
2676                 amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block);
2677                 /* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2678                 break;
2679         case CHIP_HAINAN:
2680                 amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2681                 amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2682                 amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2683                 amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2684                 amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2685                 amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2686                 if (adev->enable_virtual_display)
2687                         amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2688                 break;
2689         default:
2690                 BUG();
2691         }
2692         return 0;
2693 }
2694
This page took 0.193624 seconds and 4 git commands to generate.