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