Merge branch 'akpm' (patches from Andrew)
[cascardo/linux.git] / drivers / gpu / drm / amd / amdgpu / cik.c
1 /*
2  * Copyright 2012 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  * Authors: Alex Deucher
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 "cikd.h"
34 #include "atom.h"
35 #include "amd_pcie.h"
36
37 #include "cik.h"
38 #include "gmc_v7_0.h"
39 #include "cik_ih.h"
40 #include "dce_v8_0.h"
41 #include "gfx_v7_0.h"
42 #include "cik_sdma.h"
43 #include "uvd_v4_2.h"
44 #include "vce_v2_0.h"
45 #include "cik_dpm.h"
46
47 #include "uvd/uvd_4_2_d.h"
48
49 #include "smu/smu_7_0_1_d.h"
50 #include "smu/smu_7_0_1_sh_mask.h"
51
52 #include "dce/dce_8_0_d.h"
53 #include "dce/dce_8_0_sh_mask.h"
54
55 #include "bif/bif_4_1_d.h"
56 #include "bif/bif_4_1_sh_mask.h"
57
58 #include "gca/gfx_7_2_d.h"
59 #include "gca/gfx_7_2_enum.h"
60 #include "gca/gfx_7_2_sh_mask.h"
61
62 #include "gmc/gmc_7_1_d.h"
63 #include "gmc/gmc_7_1_sh_mask.h"
64
65 #include "oss/oss_2_0_d.h"
66 #include "oss/oss_2_0_sh_mask.h"
67
68 #include "amdgpu_amdkfd.h"
69 #include "amdgpu_powerplay.h"
70
71 /*
72  * Indirect registers accessor
73  */
74 static u32 cik_pcie_rreg(struct amdgpu_device *adev, u32 reg)
75 {
76         unsigned long flags;
77         u32 r;
78
79         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
80         WREG32(mmPCIE_INDEX, reg);
81         (void)RREG32(mmPCIE_INDEX);
82         r = RREG32(mmPCIE_DATA);
83         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
84         return r;
85 }
86
87 static void cik_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
88 {
89         unsigned long flags;
90
91         spin_lock_irqsave(&adev->pcie_idx_lock, flags);
92         WREG32(mmPCIE_INDEX, reg);
93         (void)RREG32(mmPCIE_INDEX);
94         WREG32(mmPCIE_DATA, v);
95         (void)RREG32(mmPCIE_DATA);
96         spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
97 }
98
99 static u32 cik_smc_rreg(struct amdgpu_device *adev, u32 reg)
100 {
101         unsigned long flags;
102         u32 r;
103
104         spin_lock_irqsave(&adev->smc_idx_lock, flags);
105         WREG32(mmSMC_IND_INDEX_0, (reg));
106         r = RREG32(mmSMC_IND_DATA_0);
107         spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
108         return r;
109 }
110
111 static void cik_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
112 {
113         unsigned long flags;
114
115         spin_lock_irqsave(&adev->smc_idx_lock, flags);
116         WREG32(mmSMC_IND_INDEX_0, (reg));
117         WREG32(mmSMC_IND_DATA_0, (v));
118         spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
119 }
120
121 static u32 cik_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
122 {
123         unsigned long flags;
124         u32 r;
125
126         spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
127         WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
128         r = RREG32(mmUVD_CTX_DATA);
129         spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
130         return r;
131 }
132
133 static void cik_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
134 {
135         unsigned long flags;
136
137         spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
138         WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
139         WREG32(mmUVD_CTX_DATA, (v));
140         spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
141 }
142
143 static u32 cik_didt_rreg(struct amdgpu_device *adev, u32 reg)
144 {
145         unsigned long flags;
146         u32 r;
147
148         spin_lock_irqsave(&adev->didt_idx_lock, flags);
149         WREG32(mmDIDT_IND_INDEX, (reg));
150         r = RREG32(mmDIDT_IND_DATA);
151         spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
152         return r;
153 }
154
155 static void cik_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
156 {
157         unsigned long flags;
158
159         spin_lock_irqsave(&adev->didt_idx_lock, flags);
160         WREG32(mmDIDT_IND_INDEX, (reg));
161         WREG32(mmDIDT_IND_DATA, (v));
162         spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
163 }
164
165 static const u32 bonaire_golden_spm_registers[] =
166 {
167         0xc200, 0xe0ffffff, 0xe0000000
168 };
169
170 static const u32 bonaire_golden_common_registers[] =
171 {
172         0x31dc, 0xffffffff, 0x00000800,
173         0x31dd, 0xffffffff, 0x00000800,
174         0x31e6, 0xffffffff, 0x00007fbf,
175         0x31e7, 0xffffffff, 0x00007faf
176 };
177
178 static const u32 bonaire_golden_registers[] =
179 {
180         0xcd5, 0x00000333, 0x00000333,
181         0xcd4, 0x000c0fc0, 0x00040200,
182         0x2684, 0x00010000, 0x00058208,
183         0xf000, 0xffff1fff, 0x00140000,
184         0xf080, 0xfdfc0fff, 0x00000100,
185         0xf08d, 0x40000000, 0x40000200,
186         0x260c, 0xffffffff, 0x00000000,
187         0x260d, 0xf00fffff, 0x00000400,
188         0x260e, 0x0002021c, 0x00020200,
189         0x31e, 0x00000080, 0x00000000,
190         0x16ec, 0x000000f0, 0x00000070,
191         0x16f0, 0xf0311fff, 0x80300000,
192         0x263e, 0x73773777, 0x12010001,
193         0xd43, 0x00810000, 0x408af000,
194         0x1c0c, 0x31000111, 0x00000011,
195         0xbd2, 0x73773777, 0x12010001,
196         0x883, 0x00007fb6, 0x0021a1b1,
197         0x884, 0x00007fb6, 0x002021b1,
198         0x860, 0x00007fb6, 0x00002191,
199         0x886, 0x00007fb6, 0x002121b1,
200         0x887, 0x00007fb6, 0x002021b1,
201         0x877, 0x00007fb6, 0x00002191,
202         0x878, 0x00007fb6, 0x00002191,
203         0xd8a, 0x0000003f, 0x0000000a,
204         0xd8b, 0x0000003f, 0x0000000a,
205         0xab9, 0x00073ffe, 0x000022a2,
206         0x903, 0x000007ff, 0x00000000,
207         0x2285, 0xf000003f, 0x00000007,
208         0x22fc, 0x00002001, 0x00000001,
209         0x22c9, 0xffffffff, 0x00ffffff,
210         0xc281, 0x0000ff0f, 0x00000000,
211         0xa293, 0x07ffffff, 0x06000000,
212         0x136, 0x00000fff, 0x00000100,
213         0xf9e, 0x00000001, 0x00000002,
214         0x2440, 0x03000000, 0x0362c688,
215         0x2300, 0x000000ff, 0x00000001,
216         0x390, 0x00001fff, 0x00001fff,
217         0x2418, 0x0000007f, 0x00000020,
218         0x2542, 0x00010000, 0x00010000,
219         0x2b05, 0x000003ff, 0x000000f3,
220         0x2b03, 0xffffffff, 0x00001032
221 };
222
223 static const u32 bonaire_mgcg_cgcg_init[] =
224 {
225         0x3108, 0xffffffff, 0xfffffffc,
226         0xc200, 0xffffffff, 0xe0000000,
227         0xf0a8, 0xffffffff, 0x00000100,
228         0xf082, 0xffffffff, 0x00000100,
229         0xf0b0, 0xffffffff, 0xc0000100,
230         0xf0b2, 0xffffffff, 0xc0000100,
231         0xf0b1, 0xffffffff, 0xc0000100,
232         0x1579, 0xffffffff, 0x00600100,
233         0xf0a0, 0xffffffff, 0x00000100,
234         0xf085, 0xffffffff, 0x06000100,
235         0xf088, 0xffffffff, 0x00000100,
236         0xf086, 0xffffffff, 0x06000100,
237         0xf081, 0xffffffff, 0x00000100,
238         0xf0b8, 0xffffffff, 0x00000100,
239         0xf089, 0xffffffff, 0x00000100,
240         0xf080, 0xffffffff, 0x00000100,
241         0xf08c, 0xffffffff, 0x00000100,
242         0xf08d, 0xffffffff, 0x00000100,
243         0xf094, 0xffffffff, 0x00000100,
244         0xf095, 0xffffffff, 0x00000100,
245         0xf096, 0xffffffff, 0x00000100,
246         0xf097, 0xffffffff, 0x00000100,
247         0xf098, 0xffffffff, 0x00000100,
248         0xf09f, 0xffffffff, 0x00000100,
249         0xf09e, 0xffffffff, 0x00000100,
250         0xf084, 0xffffffff, 0x06000100,
251         0xf0a4, 0xffffffff, 0x00000100,
252         0xf09d, 0xffffffff, 0x00000100,
253         0xf0ad, 0xffffffff, 0x00000100,
254         0xf0ac, 0xffffffff, 0x00000100,
255         0xf09c, 0xffffffff, 0x00000100,
256         0xc200, 0xffffffff, 0xe0000000,
257         0xf008, 0xffffffff, 0x00010000,
258         0xf009, 0xffffffff, 0x00030002,
259         0xf00a, 0xffffffff, 0x00040007,
260         0xf00b, 0xffffffff, 0x00060005,
261         0xf00c, 0xffffffff, 0x00090008,
262         0xf00d, 0xffffffff, 0x00010000,
263         0xf00e, 0xffffffff, 0x00030002,
264         0xf00f, 0xffffffff, 0x00040007,
265         0xf010, 0xffffffff, 0x00060005,
266         0xf011, 0xffffffff, 0x00090008,
267         0xf012, 0xffffffff, 0x00010000,
268         0xf013, 0xffffffff, 0x00030002,
269         0xf014, 0xffffffff, 0x00040007,
270         0xf015, 0xffffffff, 0x00060005,
271         0xf016, 0xffffffff, 0x00090008,
272         0xf017, 0xffffffff, 0x00010000,
273         0xf018, 0xffffffff, 0x00030002,
274         0xf019, 0xffffffff, 0x00040007,
275         0xf01a, 0xffffffff, 0x00060005,
276         0xf01b, 0xffffffff, 0x00090008,
277         0xf01c, 0xffffffff, 0x00010000,
278         0xf01d, 0xffffffff, 0x00030002,
279         0xf01e, 0xffffffff, 0x00040007,
280         0xf01f, 0xffffffff, 0x00060005,
281         0xf020, 0xffffffff, 0x00090008,
282         0xf021, 0xffffffff, 0x00010000,
283         0xf022, 0xffffffff, 0x00030002,
284         0xf023, 0xffffffff, 0x00040007,
285         0xf024, 0xffffffff, 0x00060005,
286         0xf025, 0xffffffff, 0x00090008,
287         0xf026, 0xffffffff, 0x00010000,
288         0xf027, 0xffffffff, 0x00030002,
289         0xf028, 0xffffffff, 0x00040007,
290         0xf029, 0xffffffff, 0x00060005,
291         0xf02a, 0xffffffff, 0x00090008,
292         0xf000, 0xffffffff, 0x96e00200,
293         0x21c2, 0xffffffff, 0x00900100,
294         0x3109, 0xffffffff, 0x0020003f,
295         0xe, 0xffffffff, 0x0140001c,
296         0xf, 0x000f0000, 0x000f0000,
297         0x88, 0xffffffff, 0xc060000c,
298         0x89, 0xc0000fff, 0x00000100,
299         0x3e4, 0xffffffff, 0x00000100,
300         0x3e6, 0x00000101, 0x00000000,
301         0x82a, 0xffffffff, 0x00000104,
302         0x1579, 0xff000fff, 0x00000100,
303         0xc33, 0xc0000fff, 0x00000104,
304         0x3079, 0x00000001, 0x00000001,
305         0x3403, 0xff000ff0, 0x00000100,
306         0x3603, 0xff000ff0, 0x00000100
307 };
308
309 static const u32 spectre_golden_spm_registers[] =
310 {
311         0xc200, 0xe0ffffff, 0xe0000000
312 };
313
314 static const u32 spectre_golden_common_registers[] =
315 {
316         0x31dc, 0xffffffff, 0x00000800,
317         0x31dd, 0xffffffff, 0x00000800,
318         0x31e6, 0xffffffff, 0x00007fbf,
319         0x31e7, 0xffffffff, 0x00007faf
320 };
321
322 static const u32 spectre_golden_registers[] =
323 {
324         0xf000, 0xffff1fff, 0x96940200,
325         0xf003, 0xffff0001, 0xff000000,
326         0xf080, 0xfffc0fff, 0x00000100,
327         0x1bb6, 0x00010101, 0x00010000,
328         0x260d, 0xf00fffff, 0x00000400,
329         0x260e, 0xfffffffc, 0x00020200,
330         0x16ec, 0x000000f0, 0x00000070,
331         0x16f0, 0xf0311fff, 0x80300000,
332         0x263e, 0x73773777, 0x12010001,
333         0x26df, 0x00ff0000, 0x00fc0000,
334         0xbd2, 0x73773777, 0x12010001,
335         0x2285, 0xf000003f, 0x00000007,
336         0x22c9, 0xffffffff, 0x00ffffff,
337         0xa0d4, 0x3f3f3fff, 0x00000082,
338         0xa0d5, 0x0000003f, 0x00000000,
339         0xf9e, 0x00000001, 0x00000002,
340         0x244f, 0xffff03df, 0x00000004,
341         0x31da, 0x00000008, 0x00000008,
342         0x2300, 0x000008ff, 0x00000800,
343         0x2542, 0x00010000, 0x00010000,
344         0x2b03, 0xffffffff, 0x54763210,
345         0x853e, 0x01ff01ff, 0x00000002,
346         0x8526, 0x007ff800, 0x00200000,
347         0x8057, 0xffffffff, 0x00000f40,
348         0xc24d, 0xffffffff, 0x00000001
349 };
350
351 static const u32 spectre_mgcg_cgcg_init[] =
352 {
353         0x3108, 0xffffffff, 0xfffffffc,
354         0xc200, 0xffffffff, 0xe0000000,
355         0xf0a8, 0xffffffff, 0x00000100,
356         0xf082, 0xffffffff, 0x00000100,
357         0xf0b0, 0xffffffff, 0x00000100,
358         0xf0b2, 0xffffffff, 0x00000100,
359         0xf0b1, 0xffffffff, 0x00000100,
360         0x1579, 0xffffffff, 0x00600100,
361         0xf0a0, 0xffffffff, 0x00000100,
362         0xf085, 0xffffffff, 0x06000100,
363         0xf088, 0xffffffff, 0x00000100,
364         0xf086, 0xffffffff, 0x06000100,
365         0xf081, 0xffffffff, 0x00000100,
366         0xf0b8, 0xffffffff, 0x00000100,
367         0xf089, 0xffffffff, 0x00000100,
368         0xf080, 0xffffffff, 0x00000100,
369         0xf08c, 0xffffffff, 0x00000100,
370         0xf08d, 0xffffffff, 0x00000100,
371         0xf094, 0xffffffff, 0x00000100,
372         0xf095, 0xffffffff, 0x00000100,
373         0xf096, 0xffffffff, 0x00000100,
374         0xf097, 0xffffffff, 0x00000100,
375         0xf098, 0xffffffff, 0x00000100,
376         0xf09f, 0xffffffff, 0x00000100,
377         0xf09e, 0xffffffff, 0x00000100,
378         0xf084, 0xffffffff, 0x06000100,
379         0xf0a4, 0xffffffff, 0x00000100,
380         0xf09d, 0xffffffff, 0x00000100,
381         0xf0ad, 0xffffffff, 0x00000100,
382         0xf0ac, 0xffffffff, 0x00000100,
383         0xf09c, 0xffffffff, 0x00000100,
384         0xc200, 0xffffffff, 0xe0000000,
385         0xf008, 0xffffffff, 0x00010000,
386         0xf009, 0xffffffff, 0x00030002,
387         0xf00a, 0xffffffff, 0x00040007,
388         0xf00b, 0xffffffff, 0x00060005,
389         0xf00c, 0xffffffff, 0x00090008,
390         0xf00d, 0xffffffff, 0x00010000,
391         0xf00e, 0xffffffff, 0x00030002,
392         0xf00f, 0xffffffff, 0x00040007,
393         0xf010, 0xffffffff, 0x00060005,
394         0xf011, 0xffffffff, 0x00090008,
395         0xf012, 0xffffffff, 0x00010000,
396         0xf013, 0xffffffff, 0x00030002,
397         0xf014, 0xffffffff, 0x00040007,
398         0xf015, 0xffffffff, 0x00060005,
399         0xf016, 0xffffffff, 0x00090008,
400         0xf017, 0xffffffff, 0x00010000,
401         0xf018, 0xffffffff, 0x00030002,
402         0xf019, 0xffffffff, 0x00040007,
403         0xf01a, 0xffffffff, 0x00060005,
404         0xf01b, 0xffffffff, 0x00090008,
405         0xf01c, 0xffffffff, 0x00010000,
406         0xf01d, 0xffffffff, 0x00030002,
407         0xf01e, 0xffffffff, 0x00040007,
408         0xf01f, 0xffffffff, 0x00060005,
409         0xf020, 0xffffffff, 0x00090008,
410         0xf021, 0xffffffff, 0x00010000,
411         0xf022, 0xffffffff, 0x00030002,
412         0xf023, 0xffffffff, 0x00040007,
413         0xf024, 0xffffffff, 0x00060005,
414         0xf025, 0xffffffff, 0x00090008,
415         0xf026, 0xffffffff, 0x00010000,
416         0xf027, 0xffffffff, 0x00030002,
417         0xf028, 0xffffffff, 0x00040007,
418         0xf029, 0xffffffff, 0x00060005,
419         0xf02a, 0xffffffff, 0x00090008,
420         0xf02b, 0xffffffff, 0x00010000,
421         0xf02c, 0xffffffff, 0x00030002,
422         0xf02d, 0xffffffff, 0x00040007,
423         0xf02e, 0xffffffff, 0x00060005,
424         0xf02f, 0xffffffff, 0x00090008,
425         0xf000, 0xffffffff, 0x96e00200,
426         0x21c2, 0xffffffff, 0x00900100,
427         0x3109, 0xffffffff, 0x0020003f,
428         0xe, 0xffffffff, 0x0140001c,
429         0xf, 0x000f0000, 0x000f0000,
430         0x88, 0xffffffff, 0xc060000c,
431         0x89, 0xc0000fff, 0x00000100,
432         0x3e4, 0xffffffff, 0x00000100,
433         0x3e6, 0x00000101, 0x00000000,
434         0x82a, 0xffffffff, 0x00000104,
435         0x1579, 0xff000fff, 0x00000100,
436         0xc33, 0xc0000fff, 0x00000104,
437         0x3079, 0x00000001, 0x00000001,
438         0x3403, 0xff000ff0, 0x00000100,
439         0x3603, 0xff000ff0, 0x00000100
440 };
441
442 static const u32 kalindi_golden_spm_registers[] =
443 {
444         0xc200, 0xe0ffffff, 0xe0000000
445 };
446
447 static const u32 kalindi_golden_common_registers[] =
448 {
449         0x31dc, 0xffffffff, 0x00000800,
450         0x31dd, 0xffffffff, 0x00000800,
451         0x31e6, 0xffffffff, 0x00007fbf,
452         0x31e7, 0xffffffff, 0x00007faf
453 };
454
455 static const u32 kalindi_golden_registers[] =
456 {
457         0xf000, 0xffffdfff, 0x6e944040,
458         0x1579, 0xff607fff, 0xfc000100,
459         0xf088, 0xff000fff, 0x00000100,
460         0xf089, 0xff000fff, 0x00000100,
461         0xf080, 0xfffc0fff, 0x00000100,
462         0x1bb6, 0x00010101, 0x00010000,
463         0x260c, 0xffffffff, 0x00000000,
464         0x260d, 0xf00fffff, 0x00000400,
465         0x16ec, 0x000000f0, 0x00000070,
466         0x16f0, 0xf0311fff, 0x80300000,
467         0x263e, 0x73773777, 0x12010001,
468         0x263f, 0xffffffff, 0x00000010,
469         0x26df, 0x00ff0000, 0x00fc0000,
470         0x200c, 0x00001f0f, 0x0000100a,
471         0xbd2, 0x73773777, 0x12010001,
472         0x902, 0x000fffff, 0x000c007f,
473         0x2285, 0xf000003f, 0x00000007,
474         0x22c9, 0x3fff3fff, 0x00ffcfff,
475         0xc281, 0x0000ff0f, 0x00000000,
476         0xa293, 0x07ffffff, 0x06000000,
477         0x136, 0x00000fff, 0x00000100,
478         0xf9e, 0x00000001, 0x00000002,
479         0x31da, 0x00000008, 0x00000008,
480         0x2300, 0x000000ff, 0x00000003,
481         0x853e, 0x01ff01ff, 0x00000002,
482         0x8526, 0x007ff800, 0x00200000,
483         0x8057, 0xffffffff, 0x00000f40,
484         0x2231, 0x001f3ae3, 0x00000082,
485         0x2235, 0x0000001f, 0x00000010,
486         0xc24d, 0xffffffff, 0x00000000
487 };
488
489 static const u32 kalindi_mgcg_cgcg_init[] =
490 {
491         0x3108, 0xffffffff, 0xfffffffc,
492         0xc200, 0xffffffff, 0xe0000000,
493         0xf0a8, 0xffffffff, 0x00000100,
494         0xf082, 0xffffffff, 0x00000100,
495         0xf0b0, 0xffffffff, 0x00000100,
496         0xf0b2, 0xffffffff, 0x00000100,
497         0xf0b1, 0xffffffff, 0x00000100,
498         0x1579, 0xffffffff, 0x00600100,
499         0xf0a0, 0xffffffff, 0x00000100,
500         0xf085, 0xffffffff, 0x06000100,
501         0xf088, 0xffffffff, 0x00000100,
502         0xf086, 0xffffffff, 0x06000100,
503         0xf081, 0xffffffff, 0x00000100,
504         0xf0b8, 0xffffffff, 0x00000100,
505         0xf089, 0xffffffff, 0x00000100,
506         0xf080, 0xffffffff, 0x00000100,
507         0xf08c, 0xffffffff, 0x00000100,
508         0xf08d, 0xffffffff, 0x00000100,
509         0xf094, 0xffffffff, 0x00000100,
510         0xf095, 0xffffffff, 0x00000100,
511         0xf096, 0xffffffff, 0x00000100,
512         0xf097, 0xffffffff, 0x00000100,
513         0xf098, 0xffffffff, 0x00000100,
514         0xf09f, 0xffffffff, 0x00000100,
515         0xf09e, 0xffffffff, 0x00000100,
516         0xf084, 0xffffffff, 0x06000100,
517         0xf0a4, 0xffffffff, 0x00000100,
518         0xf09d, 0xffffffff, 0x00000100,
519         0xf0ad, 0xffffffff, 0x00000100,
520         0xf0ac, 0xffffffff, 0x00000100,
521         0xf09c, 0xffffffff, 0x00000100,
522         0xc200, 0xffffffff, 0xe0000000,
523         0xf008, 0xffffffff, 0x00010000,
524         0xf009, 0xffffffff, 0x00030002,
525         0xf00a, 0xffffffff, 0x00040007,
526         0xf00b, 0xffffffff, 0x00060005,
527         0xf00c, 0xffffffff, 0x00090008,
528         0xf00d, 0xffffffff, 0x00010000,
529         0xf00e, 0xffffffff, 0x00030002,
530         0xf00f, 0xffffffff, 0x00040007,
531         0xf010, 0xffffffff, 0x00060005,
532         0xf011, 0xffffffff, 0x00090008,
533         0xf000, 0xffffffff, 0x96e00200,
534         0x21c2, 0xffffffff, 0x00900100,
535         0x3109, 0xffffffff, 0x0020003f,
536         0xe, 0xffffffff, 0x0140001c,
537         0xf, 0x000f0000, 0x000f0000,
538         0x88, 0xffffffff, 0xc060000c,
539         0x89, 0xc0000fff, 0x00000100,
540         0x82a, 0xffffffff, 0x00000104,
541         0x1579, 0xff000fff, 0x00000100,
542         0xc33, 0xc0000fff, 0x00000104,
543         0x3079, 0x00000001, 0x00000001,
544         0x3403, 0xff000ff0, 0x00000100,
545         0x3603, 0xff000ff0, 0x00000100
546 };
547
548 static const u32 hawaii_golden_spm_registers[] =
549 {
550         0xc200, 0xe0ffffff, 0xe0000000
551 };
552
553 static const u32 hawaii_golden_common_registers[] =
554 {
555         0xc200, 0xffffffff, 0xe0000000,
556         0xa0d4, 0xffffffff, 0x3a00161a,
557         0xa0d5, 0xffffffff, 0x0000002e,
558         0x2684, 0xffffffff, 0x00018208,
559         0x263e, 0xffffffff, 0x12011003
560 };
561
562 static const u32 hawaii_golden_registers[] =
563 {
564         0xcd5, 0x00000333, 0x00000333,
565         0x2684, 0x00010000, 0x00058208,
566         0x260c, 0xffffffff, 0x00000000,
567         0x260d, 0xf00fffff, 0x00000400,
568         0x260e, 0x0002021c, 0x00020200,
569         0x31e, 0x00000080, 0x00000000,
570         0x16ec, 0x000000f0, 0x00000070,
571         0x16f0, 0xf0311fff, 0x80300000,
572         0xd43, 0x00810000, 0x408af000,
573         0x1c0c, 0x31000111, 0x00000011,
574         0xbd2, 0x73773777, 0x12010001,
575         0x848, 0x0000007f, 0x0000001b,
576         0x877, 0x00007fb6, 0x00002191,
577         0xd8a, 0x0000003f, 0x0000000a,
578         0xd8b, 0x0000003f, 0x0000000a,
579         0xab9, 0x00073ffe, 0x000022a2,
580         0x903, 0x000007ff, 0x00000000,
581         0x22fc, 0x00002001, 0x00000001,
582         0x22c9, 0xffffffff, 0x00ffffff,
583         0xc281, 0x0000ff0f, 0x00000000,
584         0xa293, 0x07ffffff, 0x06000000,
585         0xf9e, 0x00000001, 0x00000002,
586         0x31da, 0x00000008, 0x00000008,
587         0x31dc, 0x00000f00, 0x00000800,
588         0x31dd, 0x00000f00, 0x00000800,
589         0x31e6, 0x00ffffff, 0x00ff7fbf,
590         0x31e7, 0x00ffffff, 0x00ff7faf,
591         0x2300, 0x000000ff, 0x00000800,
592         0x390, 0x00001fff, 0x00001fff,
593         0x2418, 0x0000007f, 0x00000020,
594         0x2542, 0x00010000, 0x00010000,
595         0x2b80, 0x00100000, 0x000ff07c,
596         0x2b05, 0x000003ff, 0x0000000f,
597         0x2b04, 0xffffffff, 0x7564fdec,
598         0x2b03, 0xffffffff, 0x3120b9a8,
599         0x2b02, 0x20000000, 0x0f9c0000
600 };
601
602 static const u32 hawaii_mgcg_cgcg_init[] =
603 {
604         0x3108, 0xffffffff, 0xfffffffd,
605         0xc200, 0xffffffff, 0xe0000000,
606         0xf0a8, 0xffffffff, 0x00000100,
607         0xf082, 0xffffffff, 0x00000100,
608         0xf0b0, 0xffffffff, 0x00000100,
609         0xf0b2, 0xffffffff, 0x00000100,
610         0xf0b1, 0xffffffff, 0x00000100,
611         0x1579, 0xffffffff, 0x00200100,
612         0xf0a0, 0xffffffff, 0x00000100,
613         0xf085, 0xffffffff, 0x06000100,
614         0xf088, 0xffffffff, 0x00000100,
615         0xf086, 0xffffffff, 0x06000100,
616         0xf081, 0xffffffff, 0x00000100,
617         0xf0b8, 0xffffffff, 0x00000100,
618         0xf089, 0xffffffff, 0x00000100,
619         0xf080, 0xffffffff, 0x00000100,
620         0xf08c, 0xffffffff, 0x00000100,
621         0xf08d, 0xffffffff, 0x00000100,
622         0xf094, 0xffffffff, 0x00000100,
623         0xf095, 0xffffffff, 0x00000100,
624         0xf096, 0xffffffff, 0x00000100,
625         0xf097, 0xffffffff, 0x00000100,
626         0xf098, 0xffffffff, 0x00000100,
627         0xf09f, 0xffffffff, 0x00000100,
628         0xf09e, 0xffffffff, 0x00000100,
629         0xf084, 0xffffffff, 0x06000100,
630         0xf0a4, 0xffffffff, 0x00000100,
631         0xf09d, 0xffffffff, 0x00000100,
632         0xf0ad, 0xffffffff, 0x00000100,
633         0xf0ac, 0xffffffff, 0x00000100,
634         0xf09c, 0xffffffff, 0x00000100,
635         0xc200, 0xffffffff, 0xe0000000,
636         0xf008, 0xffffffff, 0x00010000,
637         0xf009, 0xffffffff, 0x00030002,
638         0xf00a, 0xffffffff, 0x00040007,
639         0xf00b, 0xffffffff, 0x00060005,
640         0xf00c, 0xffffffff, 0x00090008,
641         0xf00d, 0xffffffff, 0x00010000,
642         0xf00e, 0xffffffff, 0x00030002,
643         0xf00f, 0xffffffff, 0x00040007,
644         0xf010, 0xffffffff, 0x00060005,
645         0xf011, 0xffffffff, 0x00090008,
646         0xf012, 0xffffffff, 0x00010000,
647         0xf013, 0xffffffff, 0x00030002,
648         0xf014, 0xffffffff, 0x00040007,
649         0xf015, 0xffffffff, 0x00060005,
650         0xf016, 0xffffffff, 0x00090008,
651         0xf017, 0xffffffff, 0x00010000,
652         0xf018, 0xffffffff, 0x00030002,
653         0xf019, 0xffffffff, 0x00040007,
654         0xf01a, 0xffffffff, 0x00060005,
655         0xf01b, 0xffffffff, 0x00090008,
656         0xf01c, 0xffffffff, 0x00010000,
657         0xf01d, 0xffffffff, 0x00030002,
658         0xf01e, 0xffffffff, 0x00040007,
659         0xf01f, 0xffffffff, 0x00060005,
660         0xf020, 0xffffffff, 0x00090008,
661         0xf021, 0xffffffff, 0x00010000,
662         0xf022, 0xffffffff, 0x00030002,
663         0xf023, 0xffffffff, 0x00040007,
664         0xf024, 0xffffffff, 0x00060005,
665         0xf025, 0xffffffff, 0x00090008,
666         0xf026, 0xffffffff, 0x00010000,
667         0xf027, 0xffffffff, 0x00030002,
668         0xf028, 0xffffffff, 0x00040007,
669         0xf029, 0xffffffff, 0x00060005,
670         0xf02a, 0xffffffff, 0x00090008,
671         0xf02b, 0xffffffff, 0x00010000,
672         0xf02c, 0xffffffff, 0x00030002,
673         0xf02d, 0xffffffff, 0x00040007,
674         0xf02e, 0xffffffff, 0x00060005,
675         0xf02f, 0xffffffff, 0x00090008,
676         0xf030, 0xffffffff, 0x00010000,
677         0xf031, 0xffffffff, 0x00030002,
678         0xf032, 0xffffffff, 0x00040007,
679         0xf033, 0xffffffff, 0x00060005,
680         0xf034, 0xffffffff, 0x00090008,
681         0xf035, 0xffffffff, 0x00010000,
682         0xf036, 0xffffffff, 0x00030002,
683         0xf037, 0xffffffff, 0x00040007,
684         0xf038, 0xffffffff, 0x00060005,
685         0xf039, 0xffffffff, 0x00090008,
686         0xf03a, 0xffffffff, 0x00010000,
687         0xf03b, 0xffffffff, 0x00030002,
688         0xf03c, 0xffffffff, 0x00040007,
689         0xf03d, 0xffffffff, 0x00060005,
690         0xf03e, 0xffffffff, 0x00090008,
691         0x30c6, 0xffffffff, 0x00020200,
692         0xcd4, 0xffffffff, 0x00000200,
693         0x570, 0xffffffff, 0x00000400,
694         0x157a, 0xffffffff, 0x00000000,
695         0xbd4, 0xffffffff, 0x00000902,
696         0xf000, 0xffffffff, 0x96940200,
697         0x21c2, 0xffffffff, 0x00900100,
698         0x3109, 0xffffffff, 0x0020003f,
699         0xe, 0xffffffff, 0x0140001c,
700         0xf, 0x000f0000, 0x000f0000,
701         0x88, 0xffffffff, 0xc060000c,
702         0x89, 0xc0000fff, 0x00000100,
703         0x3e4, 0xffffffff, 0x00000100,
704         0x3e6, 0x00000101, 0x00000000,
705         0x82a, 0xffffffff, 0x00000104,
706         0x1579, 0xff000fff, 0x00000100,
707         0xc33, 0xc0000fff, 0x00000104,
708         0x3079, 0x00000001, 0x00000001,
709         0x3403, 0xff000ff0, 0x00000100,
710         0x3603, 0xff000ff0, 0x00000100
711 };
712
713 static const u32 godavari_golden_registers[] =
714 {
715         0x1579, 0xff607fff, 0xfc000100,
716         0x1bb6, 0x00010101, 0x00010000,
717         0x260c, 0xffffffff, 0x00000000,
718         0x260c0, 0xf00fffff, 0x00000400,
719         0x184c, 0xffffffff, 0x00010000,
720         0x16ec, 0x000000f0, 0x00000070,
721         0x16f0, 0xf0311fff, 0x80300000,
722         0x263e, 0x73773777, 0x12010001,
723         0x263f, 0xffffffff, 0x00000010,
724         0x200c, 0x00001f0f, 0x0000100a,
725         0xbd2, 0x73773777, 0x12010001,
726         0x902, 0x000fffff, 0x000c007f,
727         0x2285, 0xf000003f, 0x00000007,
728         0x22c9, 0xffffffff, 0x00ff0fff,
729         0xc281, 0x0000ff0f, 0x00000000,
730         0xa293, 0x07ffffff, 0x06000000,
731         0x136, 0x00000fff, 0x00000100,
732         0x3405, 0x00010000, 0x00810001,
733         0x3605, 0x00010000, 0x00810001,
734         0xf9e, 0x00000001, 0x00000002,
735         0x31da, 0x00000008, 0x00000008,
736         0x31dc, 0x00000f00, 0x00000800,
737         0x31dd, 0x00000f00, 0x00000800,
738         0x31e6, 0x00ffffff, 0x00ff7fbf,
739         0x31e7, 0x00ffffff, 0x00ff7faf,
740         0x2300, 0x000000ff, 0x00000001,
741         0x853e, 0x01ff01ff, 0x00000002,
742         0x8526, 0x007ff800, 0x00200000,
743         0x8057, 0xffffffff, 0x00000f40,
744         0x2231, 0x001f3ae3, 0x00000082,
745         0x2235, 0x0000001f, 0x00000010,
746         0xc24d, 0xffffffff, 0x00000000
747 };
748
749 static void cik_init_golden_registers(struct amdgpu_device *adev)
750 {
751         /* Some of the registers might be dependent on GRBM_GFX_INDEX */
752         mutex_lock(&adev->grbm_idx_mutex);
753
754         switch (adev->asic_type) {
755         case CHIP_BONAIRE:
756                 amdgpu_program_register_sequence(adev,
757                                                  bonaire_mgcg_cgcg_init,
758                                                  (const u32)ARRAY_SIZE(bonaire_mgcg_cgcg_init));
759                 amdgpu_program_register_sequence(adev,
760                                                  bonaire_golden_registers,
761                                                  (const u32)ARRAY_SIZE(bonaire_golden_registers));
762                 amdgpu_program_register_sequence(adev,
763                                                  bonaire_golden_common_registers,
764                                                  (const u32)ARRAY_SIZE(bonaire_golden_common_registers));
765                 amdgpu_program_register_sequence(adev,
766                                                  bonaire_golden_spm_registers,
767                                                  (const u32)ARRAY_SIZE(bonaire_golden_spm_registers));
768                 break;
769         case CHIP_KABINI:
770                 amdgpu_program_register_sequence(adev,
771                                                  kalindi_mgcg_cgcg_init,
772                                                  (const u32)ARRAY_SIZE(kalindi_mgcg_cgcg_init));
773                 amdgpu_program_register_sequence(adev,
774                                                  kalindi_golden_registers,
775                                                  (const u32)ARRAY_SIZE(kalindi_golden_registers));
776                 amdgpu_program_register_sequence(adev,
777                                                  kalindi_golden_common_registers,
778                                                  (const u32)ARRAY_SIZE(kalindi_golden_common_registers));
779                 amdgpu_program_register_sequence(adev,
780                                                  kalindi_golden_spm_registers,
781                                                  (const u32)ARRAY_SIZE(kalindi_golden_spm_registers));
782                 break;
783         case CHIP_MULLINS:
784                 amdgpu_program_register_sequence(adev,
785                                                  kalindi_mgcg_cgcg_init,
786                                                  (const u32)ARRAY_SIZE(kalindi_mgcg_cgcg_init));
787                 amdgpu_program_register_sequence(adev,
788                                                  godavari_golden_registers,
789                                                  (const u32)ARRAY_SIZE(godavari_golden_registers));
790                 amdgpu_program_register_sequence(adev,
791                                                  kalindi_golden_common_registers,
792                                                  (const u32)ARRAY_SIZE(kalindi_golden_common_registers));
793                 amdgpu_program_register_sequence(adev,
794                                                  kalindi_golden_spm_registers,
795                                                  (const u32)ARRAY_SIZE(kalindi_golden_spm_registers));
796                 break;
797         case CHIP_KAVERI:
798                 amdgpu_program_register_sequence(adev,
799                                                  spectre_mgcg_cgcg_init,
800                                                  (const u32)ARRAY_SIZE(spectre_mgcg_cgcg_init));
801                 amdgpu_program_register_sequence(adev,
802                                                  spectre_golden_registers,
803                                                  (const u32)ARRAY_SIZE(spectre_golden_registers));
804                 amdgpu_program_register_sequence(adev,
805                                                  spectre_golden_common_registers,
806                                                  (const u32)ARRAY_SIZE(spectre_golden_common_registers));
807                 amdgpu_program_register_sequence(adev,
808                                                  spectre_golden_spm_registers,
809                                                  (const u32)ARRAY_SIZE(spectre_golden_spm_registers));
810                 break;
811         case CHIP_HAWAII:
812                 amdgpu_program_register_sequence(adev,
813                                                  hawaii_mgcg_cgcg_init,
814                                                  (const u32)ARRAY_SIZE(hawaii_mgcg_cgcg_init));
815                 amdgpu_program_register_sequence(adev,
816                                                  hawaii_golden_registers,
817                                                  (const u32)ARRAY_SIZE(hawaii_golden_registers));
818                 amdgpu_program_register_sequence(adev,
819                                                  hawaii_golden_common_registers,
820                                                  (const u32)ARRAY_SIZE(hawaii_golden_common_registers));
821                 amdgpu_program_register_sequence(adev,
822                                                  hawaii_golden_spm_registers,
823                                                  (const u32)ARRAY_SIZE(hawaii_golden_spm_registers));
824                 break;
825         default:
826                 break;
827         }
828         mutex_unlock(&adev->grbm_idx_mutex);
829 }
830
831 /**
832  * cik_get_xclk - get the xclk
833  *
834  * @adev: amdgpu_device pointer
835  *
836  * Returns the reference clock used by the gfx engine
837  * (CIK).
838  */
839 static u32 cik_get_xclk(struct amdgpu_device *adev)
840 {
841         u32 reference_clock = adev->clock.spll.reference_freq;
842
843         if (adev->flags & AMD_IS_APU) {
844                 if (RREG32_SMC(ixGENERAL_PWRMGT) & GENERAL_PWRMGT__GPU_COUNTER_CLK_MASK)
845                         return reference_clock / 2;
846         } else {
847                 if (RREG32_SMC(ixCG_CLKPIN_CNTL) & CG_CLKPIN_CNTL__XTALIN_DIVIDE_MASK)
848                         return reference_clock / 4;
849         }
850         return reference_clock;
851 }
852
853 /**
854  * cik_srbm_select - select specific register instances
855  *
856  * @adev: amdgpu_device pointer
857  * @me: selected ME (micro engine)
858  * @pipe: pipe
859  * @queue: queue
860  * @vmid: VMID
861  *
862  * Switches the currently active registers instances.  Some
863  * registers are instanced per VMID, others are instanced per
864  * me/pipe/queue combination.
865  */
866 void cik_srbm_select(struct amdgpu_device *adev,
867                      u32 me, u32 pipe, u32 queue, u32 vmid)
868 {
869         u32 srbm_gfx_cntl =
870                 (((pipe << SRBM_GFX_CNTL__PIPEID__SHIFT) & SRBM_GFX_CNTL__PIPEID_MASK)|
871                 ((me << SRBM_GFX_CNTL__MEID__SHIFT) & SRBM_GFX_CNTL__MEID_MASK)|
872                 ((vmid << SRBM_GFX_CNTL__VMID__SHIFT) & SRBM_GFX_CNTL__VMID_MASK)|
873                 ((queue << SRBM_GFX_CNTL__QUEUEID__SHIFT) & SRBM_GFX_CNTL__QUEUEID_MASK));
874         WREG32(mmSRBM_GFX_CNTL, srbm_gfx_cntl);
875 }
876
877 static void cik_vga_set_state(struct amdgpu_device *adev, bool state)
878 {
879         uint32_t tmp;
880
881         tmp = RREG32(mmCONFIG_CNTL);
882         if (!state)
883                 tmp |= CONFIG_CNTL__VGA_DIS_MASK;
884         else
885                 tmp &= ~CONFIG_CNTL__VGA_DIS_MASK;
886         WREG32(mmCONFIG_CNTL, tmp);
887 }
888
889 static bool cik_read_disabled_bios(struct amdgpu_device *adev)
890 {
891         u32 bus_cntl;
892         u32 d1vga_control = 0;
893         u32 d2vga_control = 0;
894         u32 vga_render_control = 0;
895         u32 rom_cntl;
896         bool r;
897
898         bus_cntl = RREG32(mmBUS_CNTL);
899         if (adev->mode_info.num_crtc) {
900                 d1vga_control = RREG32(mmD1VGA_CONTROL);
901                 d2vga_control = RREG32(mmD2VGA_CONTROL);
902                 vga_render_control = RREG32(mmVGA_RENDER_CONTROL);
903         }
904         rom_cntl = RREG32_SMC(ixROM_CNTL);
905
906         /* enable the rom */
907         WREG32(mmBUS_CNTL, (bus_cntl & ~BUS_CNTL__BIOS_ROM_DIS_MASK));
908         if (adev->mode_info.num_crtc) {
909                 /* Disable VGA mode */
910                 WREG32(mmD1VGA_CONTROL,
911                        (d1vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
912                                           D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
913                 WREG32(mmD2VGA_CONTROL,
914                        (d2vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
915                                           D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
916                 WREG32(mmVGA_RENDER_CONTROL,
917                        (vga_render_control & ~VGA_RENDER_CONTROL__VGA_VSTATUS_CNTL_MASK));
918         }
919         WREG32_SMC(ixROM_CNTL, rom_cntl | ROM_CNTL__SCK_OVERWRITE_MASK);
920
921         r = amdgpu_read_bios(adev);
922
923         /* restore regs */
924         WREG32(mmBUS_CNTL, bus_cntl);
925         if (adev->mode_info.num_crtc) {
926                 WREG32(mmD1VGA_CONTROL, d1vga_control);
927                 WREG32(mmD2VGA_CONTROL, d2vga_control);
928                 WREG32(mmVGA_RENDER_CONTROL, vga_render_control);
929         }
930         WREG32_SMC(ixROM_CNTL, rom_cntl);
931         return r;
932 }
933
934 static bool cik_read_bios_from_rom(struct amdgpu_device *adev,
935                                    u8 *bios, u32 length_bytes)
936 {
937         u32 *dw_ptr;
938         unsigned long flags;
939         u32 i, length_dw;
940
941         if (bios == NULL)
942                 return false;
943         if (length_bytes == 0)
944                 return false;
945         /* APU vbios image is part of sbios image */
946         if (adev->flags & AMD_IS_APU)
947                 return false;
948
949         dw_ptr = (u32 *)bios;
950         length_dw = ALIGN(length_bytes, 4) / 4;
951         /* take the smc lock since we are using the smc index */
952         spin_lock_irqsave(&adev->smc_idx_lock, flags);
953         /* set rom index to 0 */
954         WREG32(mmSMC_IND_INDEX_0, ixROM_INDEX);
955         WREG32(mmSMC_IND_DATA_0, 0);
956         /* set index to data for continous read */
957         WREG32(mmSMC_IND_INDEX_0, ixROM_DATA);
958         for (i = 0; i < length_dw; i++)
959                 dw_ptr[i] = RREG32(mmSMC_IND_DATA_0);
960         spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
961
962         return true;
963 }
964
965 static u32 cik_get_virtual_caps(struct amdgpu_device *adev)
966 {
967         /* CIK does not support SR-IOV */
968         return 0;
969 }
970
971 static const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = {
972         {mmGRBM_STATUS, false},
973         {mmGB_ADDR_CONFIG, false},
974         {mmMC_ARB_RAMCFG, false},
975         {mmGB_TILE_MODE0, false},
976         {mmGB_TILE_MODE1, false},
977         {mmGB_TILE_MODE2, false},
978         {mmGB_TILE_MODE3, false},
979         {mmGB_TILE_MODE4, false},
980         {mmGB_TILE_MODE5, false},
981         {mmGB_TILE_MODE6, false},
982         {mmGB_TILE_MODE7, false},
983         {mmGB_TILE_MODE8, false},
984         {mmGB_TILE_MODE9, false},
985         {mmGB_TILE_MODE10, false},
986         {mmGB_TILE_MODE11, false},
987         {mmGB_TILE_MODE12, false},
988         {mmGB_TILE_MODE13, false},
989         {mmGB_TILE_MODE14, false},
990         {mmGB_TILE_MODE15, false},
991         {mmGB_TILE_MODE16, false},
992         {mmGB_TILE_MODE17, false},
993         {mmGB_TILE_MODE18, false},
994         {mmGB_TILE_MODE19, false},
995         {mmGB_TILE_MODE20, false},
996         {mmGB_TILE_MODE21, false},
997         {mmGB_TILE_MODE22, false},
998         {mmGB_TILE_MODE23, false},
999         {mmGB_TILE_MODE24, false},
1000         {mmGB_TILE_MODE25, false},
1001         {mmGB_TILE_MODE26, false},
1002         {mmGB_TILE_MODE27, false},
1003         {mmGB_TILE_MODE28, false},
1004         {mmGB_TILE_MODE29, false},
1005         {mmGB_TILE_MODE30, false},
1006         {mmGB_TILE_MODE31, false},
1007         {mmGB_MACROTILE_MODE0, false},
1008         {mmGB_MACROTILE_MODE1, false},
1009         {mmGB_MACROTILE_MODE2, false},
1010         {mmGB_MACROTILE_MODE3, false},
1011         {mmGB_MACROTILE_MODE4, false},
1012         {mmGB_MACROTILE_MODE5, false},
1013         {mmGB_MACROTILE_MODE6, false},
1014         {mmGB_MACROTILE_MODE7, false},
1015         {mmGB_MACROTILE_MODE8, false},
1016         {mmGB_MACROTILE_MODE9, false},
1017         {mmGB_MACROTILE_MODE10, false},
1018         {mmGB_MACROTILE_MODE11, false},
1019         {mmGB_MACROTILE_MODE12, false},
1020         {mmGB_MACROTILE_MODE13, false},
1021         {mmGB_MACROTILE_MODE14, false},
1022         {mmGB_MACROTILE_MODE15, false},
1023         {mmCC_RB_BACKEND_DISABLE, false, true},
1024         {mmGC_USER_RB_BACKEND_DISABLE, false, true},
1025         {mmGB_BACKEND_MAP, false, false},
1026         {mmPA_SC_RASTER_CONFIG, false, true},
1027         {mmPA_SC_RASTER_CONFIG_1, false, true},
1028 };
1029
1030 static uint32_t cik_read_indexed_register(struct amdgpu_device *adev,
1031                                           u32 se_num, u32 sh_num,
1032                                           u32 reg_offset)
1033 {
1034         uint32_t val;
1035
1036         mutex_lock(&adev->grbm_idx_mutex);
1037         if (se_num != 0xffffffff || sh_num != 0xffffffff)
1038                 amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
1039
1040         val = RREG32(reg_offset);
1041
1042         if (se_num != 0xffffffff || sh_num != 0xffffffff)
1043                 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1044         mutex_unlock(&adev->grbm_idx_mutex);
1045         return val;
1046 }
1047
1048 static int cik_read_register(struct amdgpu_device *adev, u32 se_num,
1049                              u32 sh_num, u32 reg_offset, u32 *value)
1050 {
1051         uint32_t i;
1052
1053         *value = 0;
1054         for (i = 0; i < ARRAY_SIZE(cik_allowed_read_registers); i++) {
1055                 if (reg_offset != cik_allowed_read_registers[i].reg_offset)
1056                         continue;
1057
1058                 if (!cik_allowed_read_registers[i].untouched)
1059                         *value = cik_allowed_read_registers[i].grbm_indexed ?
1060                                  cik_read_indexed_register(adev, se_num,
1061                                                            sh_num, reg_offset) :
1062                                  RREG32(reg_offset);
1063                 return 0;
1064         }
1065         return -EINVAL;
1066 }
1067
1068 struct kv_reset_save_regs {
1069         u32 gmcon_reng_execute;
1070         u32 gmcon_misc;
1071         u32 gmcon_misc3;
1072 };
1073
1074 static void kv_save_regs_for_reset(struct amdgpu_device *adev,
1075                                    struct kv_reset_save_regs *save)
1076 {
1077         save->gmcon_reng_execute = RREG32(mmGMCON_RENG_EXECUTE);
1078         save->gmcon_misc = RREG32(mmGMCON_MISC);
1079         save->gmcon_misc3 = RREG32(mmGMCON_MISC3);
1080
1081         WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute &
1082                 ~GMCON_RENG_EXECUTE__RENG_EXECUTE_ON_PWR_UP_MASK);
1083         WREG32(mmGMCON_MISC, save->gmcon_misc &
1084                 ~(GMCON_MISC__RENG_EXECUTE_ON_REG_UPDATE_MASK |
1085                         GMCON_MISC__STCTRL_STUTTER_EN_MASK));
1086 }
1087
1088 static void kv_restore_regs_for_reset(struct amdgpu_device *adev,
1089                                       struct kv_reset_save_regs *save)
1090 {
1091         int i;
1092
1093         WREG32(mmGMCON_PGFSM_WRITE, 0);
1094         WREG32(mmGMCON_PGFSM_CONFIG, 0x200010ff);
1095
1096         for (i = 0; i < 5; i++)
1097                 WREG32(mmGMCON_PGFSM_WRITE, 0);
1098
1099         WREG32(mmGMCON_PGFSM_WRITE, 0);
1100         WREG32(mmGMCON_PGFSM_CONFIG, 0x300010ff);
1101
1102         for (i = 0; i < 5; i++)
1103                 WREG32(mmGMCON_PGFSM_WRITE, 0);
1104
1105         WREG32(mmGMCON_PGFSM_WRITE, 0x210000);
1106         WREG32(mmGMCON_PGFSM_CONFIG, 0xa00010ff);
1107
1108         for (i = 0; i < 5; i++)
1109                 WREG32(mmGMCON_PGFSM_WRITE, 0);
1110
1111         WREG32(mmGMCON_PGFSM_WRITE, 0x21003);
1112         WREG32(mmGMCON_PGFSM_CONFIG, 0xb00010ff);
1113
1114         for (i = 0; i < 5; i++)
1115                 WREG32(mmGMCON_PGFSM_WRITE, 0);
1116
1117         WREG32(mmGMCON_PGFSM_WRITE, 0x2b00);
1118         WREG32(mmGMCON_PGFSM_CONFIG, 0xc00010ff);
1119
1120         for (i = 0; i < 5; i++)
1121                 WREG32(mmGMCON_PGFSM_WRITE, 0);
1122
1123         WREG32(mmGMCON_PGFSM_WRITE, 0);
1124         WREG32(mmGMCON_PGFSM_CONFIG, 0xd00010ff);
1125
1126         for (i = 0; i < 5; i++)
1127                 WREG32(mmGMCON_PGFSM_WRITE, 0);
1128
1129         WREG32(mmGMCON_PGFSM_WRITE, 0x420000);
1130         WREG32(mmGMCON_PGFSM_CONFIG, 0x100010ff);
1131
1132         for (i = 0; i < 5; i++)
1133                 WREG32(mmGMCON_PGFSM_WRITE, 0);
1134
1135         WREG32(mmGMCON_PGFSM_WRITE, 0x120202);
1136         WREG32(mmGMCON_PGFSM_CONFIG, 0x500010ff);
1137
1138         for (i = 0; i < 5; i++)
1139                 WREG32(mmGMCON_PGFSM_WRITE, 0);
1140
1141         WREG32(mmGMCON_PGFSM_WRITE, 0x3e3e36);
1142         WREG32(mmGMCON_PGFSM_CONFIG, 0x600010ff);
1143
1144         for (i = 0; i < 5; i++)
1145                 WREG32(mmGMCON_PGFSM_WRITE, 0);
1146
1147         WREG32(mmGMCON_PGFSM_WRITE, 0x373f3e);
1148         WREG32(mmGMCON_PGFSM_CONFIG, 0x700010ff);
1149
1150         for (i = 0; i < 5; i++)
1151                 WREG32(mmGMCON_PGFSM_WRITE, 0);
1152
1153         WREG32(mmGMCON_PGFSM_WRITE, 0x3e1332);
1154         WREG32(mmGMCON_PGFSM_CONFIG, 0xe00010ff);
1155
1156         WREG32(mmGMCON_MISC3, save->gmcon_misc3);
1157         WREG32(mmGMCON_MISC, save->gmcon_misc);
1158         WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute);
1159 }
1160
1161 static int cik_gpu_pci_config_reset(struct amdgpu_device *adev)
1162 {
1163         struct kv_reset_save_regs kv_save = { 0 };
1164         u32 i;
1165         int r = -EINVAL;
1166
1167         dev_info(adev->dev, "GPU pci config reset\n");
1168
1169         if (adev->flags & AMD_IS_APU)
1170                 kv_save_regs_for_reset(adev, &kv_save);
1171
1172         /* disable BM */
1173         pci_clear_master(adev->pdev);
1174         /* reset */
1175         amdgpu_pci_config_reset(adev);
1176
1177         udelay(100);
1178
1179         /* wait for asic to come out of reset */
1180         for (i = 0; i < adev->usec_timeout; i++) {
1181                 if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
1182                         /* enable BM */
1183                         pci_set_master(adev->pdev);
1184                         r = 0;
1185                         break;
1186                 }
1187                 udelay(1);
1188         }
1189
1190         /* does asic init need to be run first??? */
1191         if (adev->flags & AMD_IS_APU)
1192                 kv_restore_regs_for_reset(adev, &kv_save);
1193
1194         return r;
1195 }
1196
1197 static void cik_set_bios_scratch_engine_hung(struct amdgpu_device *adev, bool hung)
1198 {
1199         u32 tmp = RREG32(mmBIOS_SCRATCH_3);
1200
1201         if (hung)
1202                 tmp |= ATOM_S3_ASIC_GUI_ENGINE_HUNG;
1203         else
1204                 tmp &= ~ATOM_S3_ASIC_GUI_ENGINE_HUNG;
1205
1206         WREG32(mmBIOS_SCRATCH_3, tmp);
1207 }
1208
1209 /**
1210  * cik_asic_reset - soft reset GPU
1211  *
1212  * @adev: amdgpu_device pointer
1213  *
1214  * Look up which blocks are hung and attempt
1215  * to reset them.
1216  * Returns 0 for success.
1217  */
1218 static int cik_asic_reset(struct amdgpu_device *adev)
1219 {
1220         int r;
1221         cik_set_bios_scratch_engine_hung(adev, true);
1222
1223         r = cik_gpu_pci_config_reset(adev);
1224
1225         cik_set_bios_scratch_engine_hung(adev, false);
1226
1227         return r;
1228 }
1229
1230 static int cik_set_uvd_clock(struct amdgpu_device *adev, u32 clock,
1231                               u32 cntl_reg, u32 status_reg)
1232 {
1233         int r, i;
1234         struct atom_clock_dividers dividers;
1235         uint32_t tmp;
1236
1237         r = amdgpu_atombios_get_clock_dividers(adev,
1238                                                COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
1239                                                clock, false, &dividers);
1240         if (r)
1241                 return r;
1242
1243         tmp = RREG32_SMC(cntl_reg);
1244         tmp &= ~(CG_DCLK_CNTL__DCLK_DIR_CNTL_EN_MASK |
1245                 CG_DCLK_CNTL__DCLK_DIVIDER_MASK);
1246         tmp |= dividers.post_divider;
1247         WREG32_SMC(cntl_reg, tmp);
1248
1249         for (i = 0; i < 100; i++) {
1250                 if (RREG32_SMC(status_reg) & CG_DCLK_STATUS__DCLK_STATUS_MASK)
1251                         break;
1252                 mdelay(10);
1253         }
1254         if (i == 100)
1255                 return -ETIMEDOUT;
1256
1257         return 0;
1258 }
1259
1260 static int cik_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1261 {
1262         int r = 0;
1263
1264         r = cik_set_uvd_clock(adev, vclk, ixCG_VCLK_CNTL, ixCG_VCLK_STATUS);
1265         if (r)
1266                 return r;
1267
1268         r = cik_set_uvd_clock(adev, dclk, ixCG_DCLK_CNTL, ixCG_DCLK_STATUS);
1269         return r;
1270 }
1271
1272 static int cik_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
1273 {
1274         int r, i;
1275         struct atom_clock_dividers dividers;
1276         u32 tmp;
1277
1278         r = amdgpu_atombios_get_clock_dividers(adev,
1279                                                COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
1280                                                ecclk, false, &dividers);
1281         if (r)
1282                 return r;
1283
1284         for (i = 0; i < 100; i++) {
1285                 if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
1286                         break;
1287                 mdelay(10);
1288         }
1289         if (i == 100)
1290                 return -ETIMEDOUT;
1291
1292         tmp = RREG32_SMC(ixCG_ECLK_CNTL);
1293         tmp &= ~(CG_ECLK_CNTL__ECLK_DIR_CNTL_EN_MASK |
1294                 CG_ECLK_CNTL__ECLK_DIVIDER_MASK);
1295         tmp |= dividers.post_divider;
1296         WREG32_SMC(ixCG_ECLK_CNTL, tmp);
1297
1298         for (i = 0; i < 100; i++) {
1299                 if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
1300                         break;
1301                 mdelay(10);
1302         }
1303         if (i == 100)
1304                 return -ETIMEDOUT;
1305
1306         return 0;
1307 }
1308
1309 static void cik_pcie_gen3_enable(struct amdgpu_device *adev)
1310 {
1311         struct pci_dev *root = adev->pdev->bus->self;
1312         int bridge_pos, gpu_pos;
1313         u32 speed_cntl, current_data_rate;
1314         int i;
1315         u16 tmp16;
1316
1317         if (pci_is_root_bus(adev->pdev->bus))
1318                 return;
1319
1320         if (amdgpu_pcie_gen2 == 0)
1321                 return;
1322
1323         if (adev->flags & AMD_IS_APU)
1324                 return;
1325
1326         if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
1327                                         CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
1328                 return;
1329
1330         speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1331         current_data_rate = (speed_cntl & PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK) >>
1332                 PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT;
1333         if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1334                 if (current_data_rate == 2) {
1335                         DRM_INFO("PCIE gen 3 link speeds already enabled\n");
1336                         return;
1337                 }
1338                 DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
1339         } else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
1340                 if (current_data_rate == 1) {
1341                         DRM_INFO("PCIE gen 2 link speeds already enabled\n");
1342                         return;
1343                 }
1344                 DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
1345         }
1346
1347         bridge_pos = pci_pcie_cap(root);
1348         if (!bridge_pos)
1349                 return;
1350
1351         gpu_pos = pci_pcie_cap(adev->pdev);
1352         if (!gpu_pos)
1353                 return;
1354
1355         if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1356                 /* re-try equalization if gen3 is not already enabled */
1357                 if (current_data_rate != 2) {
1358                         u16 bridge_cfg, gpu_cfg;
1359                         u16 bridge_cfg2, gpu_cfg2;
1360                         u32 max_lw, current_lw, tmp;
1361
1362                         pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1363                         pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1364
1365                         tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
1366                         pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1367
1368                         tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
1369                         pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1370
1371                         tmp = RREG32_PCIE(ixPCIE_LC_STATUS1);
1372                         max_lw = (tmp & PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH_MASK) >>
1373                                 PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH__SHIFT;
1374                         current_lw = (tmp & PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH_MASK)
1375                                 >> PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH__SHIFT;
1376
1377                         if (current_lw < max_lw) {
1378                                 tmp = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
1379                                 if (tmp & PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATION_SUPPORT_MASK) {
1380                                         tmp &= ~(PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_MASK |
1381                                                 PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_DIS_MASK);
1382                                         tmp |= (max_lw <<
1383                                                 PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH__SHIFT);
1384                                         tmp |= PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_SUPPORT_MASK |
1385                                         PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATE_EN_MASK |
1386                                         PCIE_LC_LINK_WIDTH_CNTL__LC_RECONFIG_NOW_MASK;
1387                                         WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, tmp);
1388                                 }
1389                         }
1390
1391                         for (i = 0; i < 10; i++) {
1392                                 /* check status */
1393                                 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
1394                                 if (tmp16 & PCI_EXP_DEVSTA_TRPND)
1395                                         break;
1396
1397                                 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1398                                 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1399
1400                                 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
1401                                 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
1402
1403                                 tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1404                                 tmp |= PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
1405                                 WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1406
1407                                 tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1408                                 tmp |= PCIE_LC_CNTL4__LC_REDO_EQ_MASK;
1409                                 WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1410
1411                                 mdelay(100);
1412
1413                                 /* linkctl */
1414                                 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
1415                                 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1416                                 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
1417                                 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1418
1419                                 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
1420                                 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1421                                 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
1422                                 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1423
1424                                 /* linkctl2 */
1425                                 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
1426                                 tmp16 &= ~((1 << 4) | (7 << 9));
1427                                 tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
1428                                 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
1429
1430                                 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1431                                 tmp16 &= ~((1 << 4) | (7 << 9));
1432                                 tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
1433                                 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1434
1435                                 tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1436                                 tmp &= ~PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
1437                                 WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1438                         }
1439                 }
1440         }
1441
1442         /* set the link speed */
1443         speed_cntl |= PCIE_LC_SPEED_CNTL__LC_FORCE_EN_SW_SPEED_CHANGE_MASK |
1444                 PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_HW_SPEED_CHANGE_MASK;
1445         speed_cntl &= ~PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_SW_SPEED_CHANGE_MASK;
1446         WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
1447
1448         pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1449         tmp16 &= ~0xf;
1450         if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
1451                 tmp16 |= 3; /* gen3 */
1452         else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
1453                 tmp16 |= 2; /* gen2 */
1454         else
1455                 tmp16 |= 1; /* gen1 */
1456         pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1457
1458         speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1459         speed_cntl |= PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK;
1460         WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
1461
1462         for (i = 0; i < adev->usec_timeout; i++) {
1463                 speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1464                 if ((speed_cntl & PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK) == 0)
1465                         break;
1466                 udelay(1);
1467         }
1468 }
1469
1470 static void cik_program_aspm(struct amdgpu_device *adev)
1471 {
1472         u32 data, orig;
1473         bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
1474         bool disable_clkreq = false;
1475
1476         if (amdgpu_aspm == 0)
1477                 return;
1478
1479         if (pci_is_root_bus(adev->pdev->bus))
1480                 return;
1481
1482         /* XXX double check APUs */
1483         if (adev->flags & AMD_IS_APU)
1484                 return;
1485
1486         orig = data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
1487         data &= ~PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_MASK;
1488         data |= (0x24 << PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS__SHIFT) |
1489                 PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_OVERRIDE_EN_MASK;
1490         if (orig != data)
1491                 WREG32_PCIE(ixPCIE_LC_N_FTS_CNTL, data);
1492
1493         orig = data = RREG32_PCIE(ixPCIE_LC_CNTL3);
1494         data |= PCIE_LC_CNTL3__LC_GO_TO_RECOVERY_MASK;
1495         if (orig != data)
1496                 WREG32_PCIE(ixPCIE_LC_CNTL3, data);
1497
1498         orig = data = RREG32_PCIE(ixPCIE_P_CNTL);
1499         data |= PCIE_P_CNTL__P_IGNORE_EDB_ERR_MASK;
1500         if (orig != data)
1501                 WREG32_PCIE(ixPCIE_P_CNTL, data);
1502
1503         orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
1504         data &= ~(PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK |
1505                 PCIE_LC_CNTL__LC_L1_INACTIVITY_MASK);
1506         data |= PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
1507         if (!disable_l0s)
1508                 data |= (7 << PCIE_LC_CNTL__LC_L0S_INACTIVITY__SHIFT);
1509
1510         if (!disable_l1) {
1511                 data |= (7 << PCIE_LC_CNTL__LC_L1_INACTIVITY__SHIFT);
1512                 data &= ~PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
1513                 if (orig != data)
1514                         WREG32_PCIE(ixPCIE_LC_CNTL, data);
1515
1516                 if (!disable_plloff_in_l1) {
1517                         bool clk_req_support;
1518
1519                         orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_0);
1520                         data &= ~(PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
1521                                 PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
1522                         data |= (7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
1523                                 (7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
1524                         if (orig != data)
1525                                 WREG32_PCIE(ixPB0_PIF_PWRDOWN_0, data);
1526
1527                         orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_1);
1528                         data &= ~(PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
1529                                 PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
1530                         data |= (7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
1531                                 (7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
1532                         if (orig != data)
1533                                 WREG32_PCIE(ixPB0_PIF_PWRDOWN_1, data);
1534
1535                         orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_0);
1536                         data &= ~(PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
1537                                 PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
1538                         data |= (7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
1539                                 (7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
1540                         if (orig != data)
1541                                 WREG32_PCIE(ixPB1_PIF_PWRDOWN_0, data);
1542
1543                         orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_1);
1544                         data &= ~(PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
1545                                 PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
1546                         data |= (7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
1547                                 (7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
1548                         if (orig != data)
1549                                 WREG32_PCIE(ixPB1_PIF_PWRDOWN_1, data);
1550
1551                         orig = data = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
1552                         data &= ~PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE_MASK;
1553                         data |= ~(3 << PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE__SHIFT);
1554                         if (orig != data)
1555                                 WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, data);
1556
1557                         if (!disable_clkreq) {
1558                                 struct pci_dev *root = adev->pdev->bus->self;
1559                                 u32 lnkcap;
1560
1561                                 clk_req_support = false;
1562                                 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
1563                                 if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
1564                                         clk_req_support = true;
1565                         } else {
1566                                 clk_req_support = false;
1567                         }
1568
1569                         if (clk_req_support) {
1570                                 orig = data = RREG32_PCIE(ixPCIE_LC_CNTL2);
1571                                 data |= PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L1_MASK |
1572                                         PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L23_MASK;
1573                                 if (orig != data)
1574                                         WREG32_PCIE(ixPCIE_LC_CNTL2, data);
1575
1576                                 orig = data = RREG32_SMC(ixTHM_CLK_CNTL);
1577                                 data &= ~(THM_CLK_CNTL__CMON_CLK_SEL_MASK |
1578                                         THM_CLK_CNTL__TMON_CLK_SEL_MASK);
1579                                 data |= (1 << THM_CLK_CNTL__CMON_CLK_SEL__SHIFT) |
1580                                         (1 << THM_CLK_CNTL__TMON_CLK_SEL__SHIFT);
1581                                 if (orig != data)
1582                                         WREG32_SMC(ixTHM_CLK_CNTL, data);
1583
1584                                 orig = data = RREG32_SMC(ixMISC_CLK_CTRL);
1585                                 data &= ~(MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL_MASK |
1586                                         MISC_CLK_CTRL__ZCLK_SEL_MASK);
1587                                 data |= (1 << MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL__SHIFT) |
1588                                         (1 << MISC_CLK_CTRL__ZCLK_SEL__SHIFT);
1589                                 if (orig != data)
1590                                         WREG32_SMC(ixMISC_CLK_CTRL, data);
1591
1592                                 orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL);
1593                                 data &= ~CG_CLKPIN_CNTL__BCLK_AS_XCLK_MASK;
1594                                 if (orig != data)
1595                                         WREG32_SMC(ixCG_CLKPIN_CNTL, data);
1596
1597                                 orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL_2);
1598                                 data &= ~CG_CLKPIN_CNTL_2__FORCE_BIF_REFCLK_EN_MASK;
1599                                 if (orig != data)
1600                                         WREG32_SMC(ixCG_CLKPIN_CNTL_2, data);
1601
1602                                 orig = data = RREG32_SMC(ixMPLL_BYPASSCLK_SEL);
1603                                 data &= ~MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL_MASK;
1604                                 data |= (4 << MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL__SHIFT);
1605                                 if (orig != data)
1606                                         WREG32_SMC(ixMPLL_BYPASSCLK_SEL, data);
1607                         }
1608                 }
1609         } else {
1610                 if (orig != data)
1611                         WREG32_PCIE(ixPCIE_LC_CNTL, data);
1612         }
1613
1614         orig = data = RREG32_PCIE(ixPCIE_CNTL2);
1615         data |= PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
1616                 PCIE_CNTL2__MST_MEM_LS_EN_MASK |
1617                 PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK;
1618         if (orig != data)
1619                 WREG32_PCIE(ixPCIE_CNTL2, data);
1620
1621         if (!disable_l0s) {
1622                 data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
1623                 if ((data & PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) ==
1624                                 PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) {
1625                         data = RREG32_PCIE(ixPCIE_LC_STATUS1);
1626                         if ((data & PCIE_LC_STATUS1__LC_REVERSE_XMIT_MASK) &&
1627                         (data & PCIE_LC_STATUS1__LC_REVERSE_RCVR_MASK)) {
1628                                 orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
1629                                 data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK;
1630                                 if (orig != data)
1631                                         WREG32_PCIE(ixPCIE_LC_CNTL, data);
1632                         }
1633                 }
1634         }
1635 }
1636
1637 static uint32_t cik_get_rev_id(struct amdgpu_device *adev)
1638 {
1639         return (RREG32(mmCC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1640                 >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1641 }
1642
1643 static const struct amdgpu_ip_block_version bonaire_ip_blocks[] =
1644 {
1645         /* ORDER MATTERS! */
1646         {
1647                 .type = AMD_IP_BLOCK_TYPE_COMMON,
1648                 .major = 1,
1649                 .minor = 0,
1650                 .rev = 0,
1651                 .funcs = &cik_common_ip_funcs,
1652         },
1653         {
1654                 .type = AMD_IP_BLOCK_TYPE_GMC,
1655                 .major = 7,
1656                 .minor = 0,
1657                 .rev = 0,
1658                 .funcs = &gmc_v7_0_ip_funcs,
1659         },
1660         {
1661                 .type = AMD_IP_BLOCK_TYPE_IH,
1662                 .major = 2,
1663                 .minor = 0,
1664                 .rev = 0,
1665                 .funcs = &cik_ih_ip_funcs,
1666         },
1667         {
1668                 .type = AMD_IP_BLOCK_TYPE_SMC,
1669                 .major = 7,
1670                 .minor = 0,
1671                 .rev = 0,
1672                 .funcs = &amdgpu_pp_ip_funcs,
1673         },
1674         {
1675                 .type = AMD_IP_BLOCK_TYPE_DCE,
1676                 .major = 8,
1677                 .minor = 2,
1678                 .rev = 0,
1679                 .funcs = &dce_v8_0_ip_funcs,
1680         },
1681         {
1682                 .type = AMD_IP_BLOCK_TYPE_GFX,
1683                 .major = 7,
1684                 .minor = 2,
1685                 .rev = 0,
1686                 .funcs = &gfx_v7_0_ip_funcs,
1687         },
1688         {
1689                 .type = AMD_IP_BLOCK_TYPE_SDMA,
1690                 .major = 2,
1691                 .minor = 0,
1692                 .rev = 0,
1693                 .funcs = &cik_sdma_ip_funcs,
1694         },
1695         {
1696                 .type = AMD_IP_BLOCK_TYPE_UVD,
1697                 .major = 4,
1698                 .minor = 2,
1699                 .rev = 0,
1700                 .funcs = &uvd_v4_2_ip_funcs,
1701         },
1702         {
1703                 .type = AMD_IP_BLOCK_TYPE_VCE,
1704                 .major = 2,
1705                 .minor = 0,
1706                 .rev = 0,
1707                 .funcs = &vce_v2_0_ip_funcs,
1708         },
1709 };
1710
1711 static const struct amdgpu_ip_block_version hawaii_ip_blocks[] =
1712 {
1713         /* ORDER MATTERS! */
1714         {
1715                 .type = AMD_IP_BLOCK_TYPE_COMMON,
1716                 .major = 1,
1717                 .minor = 0,
1718                 .rev = 0,
1719                 .funcs = &cik_common_ip_funcs,
1720         },
1721         {
1722                 .type = AMD_IP_BLOCK_TYPE_GMC,
1723                 .major = 7,
1724                 .minor = 0,
1725                 .rev = 0,
1726                 .funcs = &gmc_v7_0_ip_funcs,
1727         },
1728         {
1729                 .type = AMD_IP_BLOCK_TYPE_IH,
1730                 .major = 2,
1731                 .minor = 0,
1732                 .rev = 0,
1733                 .funcs = &cik_ih_ip_funcs,
1734         },
1735         {
1736                 .type = AMD_IP_BLOCK_TYPE_SMC,
1737                 .major = 7,
1738                 .minor = 0,
1739                 .rev = 0,
1740                 .funcs = &amdgpu_pp_ip_funcs,
1741         },
1742         {
1743                 .type = AMD_IP_BLOCK_TYPE_DCE,
1744                 .major = 8,
1745                 .minor = 5,
1746                 .rev = 0,
1747                 .funcs = &dce_v8_0_ip_funcs,
1748         },
1749         {
1750                 .type = AMD_IP_BLOCK_TYPE_GFX,
1751                 .major = 7,
1752                 .minor = 3,
1753                 .rev = 0,
1754                 .funcs = &gfx_v7_0_ip_funcs,
1755         },
1756         {
1757                 .type = AMD_IP_BLOCK_TYPE_SDMA,
1758                 .major = 2,
1759                 .minor = 0,
1760                 .rev = 0,
1761                 .funcs = &cik_sdma_ip_funcs,
1762         },
1763         {
1764                 .type = AMD_IP_BLOCK_TYPE_UVD,
1765                 .major = 4,
1766                 .minor = 2,
1767                 .rev = 0,
1768                 .funcs = &uvd_v4_2_ip_funcs,
1769         },
1770         {
1771                 .type = AMD_IP_BLOCK_TYPE_VCE,
1772                 .major = 2,
1773                 .minor = 0,
1774                 .rev = 0,
1775                 .funcs = &vce_v2_0_ip_funcs,
1776         },
1777 };
1778
1779 static const struct amdgpu_ip_block_version kabini_ip_blocks[] =
1780 {
1781         /* ORDER MATTERS! */
1782         {
1783                 .type = AMD_IP_BLOCK_TYPE_COMMON,
1784                 .major = 1,
1785                 .minor = 0,
1786                 .rev = 0,
1787                 .funcs = &cik_common_ip_funcs,
1788         },
1789         {
1790                 .type = AMD_IP_BLOCK_TYPE_GMC,
1791                 .major = 7,
1792                 .minor = 0,
1793                 .rev = 0,
1794                 .funcs = &gmc_v7_0_ip_funcs,
1795         },
1796         {
1797                 .type = AMD_IP_BLOCK_TYPE_IH,
1798                 .major = 2,
1799                 .minor = 0,
1800                 .rev = 0,
1801                 .funcs = &cik_ih_ip_funcs,
1802         },
1803         {
1804                 .type = AMD_IP_BLOCK_TYPE_SMC,
1805                 .major = 7,
1806                 .minor = 0,
1807                 .rev = 0,
1808                 .funcs = &amdgpu_pp_ip_funcs,
1809         },
1810         {
1811                 .type = AMD_IP_BLOCK_TYPE_DCE,
1812                 .major = 8,
1813                 .minor = 3,
1814                 .rev = 0,
1815                 .funcs = &dce_v8_0_ip_funcs,
1816         },
1817         {
1818                 .type = AMD_IP_BLOCK_TYPE_GFX,
1819                 .major = 7,
1820                 .minor = 2,
1821                 .rev = 0,
1822                 .funcs = &gfx_v7_0_ip_funcs,
1823         },
1824         {
1825                 .type = AMD_IP_BLOCK_TYPE_SDMA,
1826                 .major = 2,
1827                 .minor = 0,
1828                 .rev = 0,
1829                 .funcs = &cik_sdma_ip_funcs,
1830         },
1831         {
1832                 .type = AMD_IP_BLOCK_TYPE_UVD,
1833                 .major = 4,
1834                 .minor = 2,
1835                 .rev = 0,
1836                 .funcs = &uvd_v4_2_ip_funcs,
1837         },
1838         {
1839                 .type = AMD_IP_BLOCK_TYPE_VCE,
1840                 .major = 2,
1841                 .minor = 0,
1842                 .rev = 0,
1843                 .funcs = &vce_v2_0_ip_funcs,
1844         },
1845 };
1846
1847 static const struct amdgpu_ip_block_version mullins_ip_blocks[] =
1848 {
1849         /* ORDER MATTERS! */
1850         {
1851                 .type = AMD_IP_BLOCK_TYPE_COMMON,
1852                 .major = 1,
1853                 .minor = 0,
1854                 .rev = 0,
1855                 .funcs = &cik_common_ip_funcs,
1856         },
1857         {
1858                 .type = AMD_IP_BLOCK_TYPE_GMC,
1859                 .major = 7,
1860                 .minor = 0,
1861                 .rev = 0,
1862                 .funcs = &gmc_v7_0_ip_funcs,
1863         },
1864         {
1865                 .type = AMD_IP_BLOCK_TYPE_IH,
1866                 .major = 2,
1867                 .minor = 0,
1868                 .rev = 0,
1869                 .funcs = &cik_ih_ip_funcs,
1870         },
1871         {
1872                 .type = AMD_IP_BLOCK_TYPE_SMC,
1873                 .major = 7,
1874                 .minor = 0,
1875                 .rev = 0,
1876                 .funcs = &amdgpu_pp_ip_funcs,
1877         },
1878         {
1879                 .type = AMD_IP_BLOCK_TYPE_DCE,
1880                 .major = 8,
1881                 .minor = 3,
1882                 .rev = 0,
1883                 .funcs = &dce_v8_0_ip_funcs,
1884         },
1885         {
1886                 .type = AMD_IP_BLOCK_TYPE_GFX,
1887                 .major = 7,
1888                 .minor = 2,
1889                 .rev = 0,
1890                 .funcs = &gfx_v7_0_ip_funcs,
1891         },
1892         {
1893                 .type = AMD_IP_BLOCK_TYPE_SDMA,
1894                 .major = 2,
1895                 .minor = 0,
1896                 .rev = 0,
1897                 .funcs = &cik_sdma_ip_funcs,
1898         },
1899         {
1900                 .type = AMD_IP_BLOCK_TYPE_UVD,
1901                 .major = 4,
1902                 .minor = 2,
1903                 .rev = 0,
1904                 .funcs = &uvd_v4_2_ip_funcs,
1905         },
1906         {
1907                 .type = AMD_IP_BLOCK_TYPE_VCE,
1908                 .major = 2,
1909                 .minor = 0,
1910                 .rev = 0,
1911                 .funcs = &vce_v2_0_ip_funcs,
1912         },
1913 };
1914
1915 static const struct amdgpu_ip_block_version kaveri_ip_blocks[] =
1916 {
1917         /* ORDER MATTERS! */
1918         {
1919                 .type = AMD_IP_BLOCK_TYPE_COMMON,
1920                 .major = 1,
1921                 .minor = 0,
1922                 .rev = 0,
1923                 .funcs = &cik_common_ip_funcs,
1924         },
1925         {
1926                 .type = AMD_IP_BLOCK_TYPE_GMC,
1927                 .major = 7,
1928                 .minor = 0,
1929                 .rev = 0,
1930                 .funcs = &gmc_v7_0_ip_funcs,
1931         },
1932         {
1933                 .type = AMD_IP_BLOCK_TYPE_IH,
1934                 .major = 2,
1935                 .minor = 0,
1936                 .rev = 0,
1937                 .funcs = &cik_ih_ip_funcs,
1938         },
1939         {
1940                 .type = AMD_IP_BLOCK_TYPE_SMC,
1941                 .major = 7,
1942                 .minor = 0,
1943                 .rev = 0,
1944                 .funcs = &amdgpu_pp_ip_funcs,
1945         },
1946         {
1947                 .type = AMD_IP_BLOCK_TYPE_DCE,
1948                 .major = 8,
1949                 .minor = 1,
1950                 .rev = 0,
1951                 .funcs = &dce_v8_0_ip_funcs,
1952         },
1953         {
1954                 .type = AMD_IP_BLOCK_TYPE_GFX,
1955                 .major = 7,
1956                 .minor = 1,
1957                 .rev = 0,
1958                 .funcs = &gfx_v7_0_ip_funcs,
1959         },
1960         {
1961                 .type = AMD_IP_BLOCK_TYPE_SDMA,
1962                 .major = 2,
1963                 .minor = 0,
1964                 .rev = 0,
1965                 .funcs = &cik_sdma_ip_funcs,
1966         },
1967         {
1968                 .type = AMD_IP_BLOCK_TYPE_UVD,
1969                 .major = 4,
1970                 .minor = 2,
1971                 .rev = 0,
1972                 .funcs = &uvd_v4_2_ip_funcs,
1973         },
1974         {
1975                 .type = AMD_IP_BLOCK_TYPE_VCE,
1976                 .major = 2,
1977                 .minor = 0,
1978                 .rev = 0,
1979                 .funcs = &vce_v2_0_ip_funcs,
1980         },
1981 };
1982
1983 int cik_set_ip_blocks(struct amdgpu_device *adev)
1984 {
1985         switch (adev->asic_type) {
1986         case CHIP_BONAIRE:
1987                 adev->ip_blocks = bonaire_ip_blocks;
1988                 adev->num_ip_blocks = ARRAY_SIZE(bonaire_ip_blocks);
1989                 break;
1990         case CHIP_HAWAII:
1991                 adev->ip_blocks = hawaii_ip_blocks;
1992                 adev->num_ip_blocks = ARRAY_SIZE(hawaii_ip_blocks);
1993                 break;
1994         case CHIP_KAVERI:
1995                 adev->ip_blocks = kaveri_ip_blocks;
1996                 adev->num_ip_blocks = ARRAY_SIZE(kaveri_ip_blocks);
1997                 break;
1998         case CHIP_KABINI:
1999                 adev->ip_blocks = kabini_ip_blocks;
2000                 adev->num_ip_blocks = ARRAY_SIZE(kabini_ip_blocks);
2001                 break;
2002         case CHIP_MULLINS:
2003                 adev->ip_blocks = mullins_ip_blocks;
2004                 adev->num_ip_blocks = ARRAY_SIZE(mullins_ip_blocks);
2005                 break;
2006         default:
2007                 /* FIXME: not supported yet */
2008                 return -EINVAL;
2009         }
2010
2011         return 0;
2012 }
2013
2014 static const struct amdgpu_asic_funcs cik_asic_funcs =
2015 {
2016         .read_disabled_bios = &cik_read_disabled_bios,
2017         .read_bios_from_rom = &cik_read_bios_from_rom,
2018         .read_register = &cik_read_register,
2019         .reset = &cik_asic_reset,
2020         .set_vga_state = &cik_vga_set_state,
2021         .get_xclk = &cik_get_xclk,
2022         .set_uvd_clocks = &cik_set_uvd_clocks,
2023         .set_vce_clocks = &cik_set_vce_clocks,
2024         .get_virtual_caps = &cik_get_virtual_caps,
2025 };
2026
2027 static int cik_common_early_init(void *handle)
2028 {
2029         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2030
2031         adev->smc_rreg = &cik_smc_rreg;
2032         adev->smc_wreg = &cik_smc_wreg;
2033         adev->pcie_rreg = &cik_pcie_rreg;
2034         adev->pcie_wreg = &cik_pcie_wreg;
2035         adev->uvd_ctx_rreg = &cik_uvd_ctx_rreg;
2036         adev->uvd_ctx_wreg = &cik_uvd_ctx_wreg;
2037         adev->didt_rreg = &cik_didt_rreg;
2038         adev->didt_wreg = &cik_didt_wreg;
2039
2040         adev->asic_funcs = &cik_asic_funcs;
2041
2042         adev->rev_id = cik_get_rev_id(adev);
2043         adev->external_rev_id = 0xFF;
2044         switch (adev->asic_type) {
2045         case CHIP_BONAIRE:
2046                 adev->cg_flags =
2047                         AMD_CG_SUPPORT_GFX_MGCG |
2048                         AMD_CG_SUPPORT_GFX_MGLS |
2049                         /*AMD_CG_SUPPORT_GFX_CGCG |*/
2050                         AMD_CG_SUPPORT_GFX_CGLS |
2051                         AMD_CG_SUPPORT_GFX_CGTS |
2052                         AMD_CG_SUPPORT_GFX_CGTS_LS |
2053                         AMD_CG_SUPPORT_GFX_CP_LS |
2054                         AMD_CG_SUPPORT_MC_LS |
2055                         AMD_CG_SUPPORT_MC_MGCG |
2056                         AMD_CG_SUPPORT_SDMA_MGCG |
2057                         AMD_CG_SUPPORT_SDMA_LS |
2058                         AMD_CG_SUPPORT_BIF_LS |
2059                         AMD_CG_SUPPORT_VCE_MGCG |
2060                         AMD_CG_SUPPORT_UVD_MGCG |
2061                         AMD_CG_SUPPORT_HDP_LS |
2062                         AMD_CG_SUPPORT_HDP_MGCG;
2063                 adev->pg_flags = 0;
2064                 adev->external_rev_id = adev->rev_id + 0x14;
2065                 break;
2066         case CHIP_HAWAII:
2067                 adev->cg_flags =
2068                         AMD_CG_SUPPORT_GFX_MGCG |
2069                         AMD_CG_SUPPORT_GFX_MGLS |
2070                         /*AMD_CG_SUPPORT_GFX_CGCG |*/
2071                         AMD_CG_SUPPORT_GFX_CGLS |
2072                         AMD_CG_SUPPORT_GFX_CGTS |
2073                         AMD_CG_SUPPORT_GFX_CP_LS |
2074                         AMD_CG_SUPPORT_MC_LS |
2075                         AMD_CG_SUPPORT_MC_MGCG |
2076                         AMD_CG_SUPPORT_SDMA_MGCG |
2077                         AMD_CG_SUPPORT_SDMA_LS |
2078                         AMD_CG_SUPPORT_BIF_LS |
2079                         AMD_CG_SUPPORT_VCE_MGCG |
2080                         AMD_CG_SUPPORT_UVD_MGCG |
2081                         AMD_CG_SUPPORT_HDP_LS |
2082                         AMD_CG_SUPPORT_HDP_MGCG;
2083                 adev->pg_flags = 0;
2084                 adev->external_rev_id = 0x28;
2085                 break;
2086         case CHIP_KAVERI:
2087                 adev->cg_flags =
2088                         AMD_CG_SUPPORT_GFX_MGCG |
2089                         AMD_CG_SUPPORT_GFX_MGLS |
2090                         /*AMD_CG_SUPPORT_GFX_CGCG |*/
2091                         AMD_CG_SUPPORT_GFX_CGLS |
2092                         AMD_CG_SUPPORT_GFX_CGTS |
2093                         AMD_CG_SUPPORT_GFX_CGTS_LS |
2094                         AMD_CG_SUPPORT_GFX_CP_LS |
2095                         AMD_CG_SUPPORT_SDMA_MGCG |
2096                         AMD_CG_SUPPORT_SDMA_LS |
2097                         AMD_CG_SUPPORT_BIF_LS |
2098                         AMD_CG_SUPPORT_VCE_MGCG |
2099                         AMD_CG_SUPPORT_UVD_MGCG |
2100                         AMD_CG_SUPPORT_HDP_LS |
2101                         AMD_CG_SUPPORT_HDP_MGCG;
2102                 adev->pg_flags =
2103                         /*AMD_PG_SUPPORT_GFX_PG |
2104                           AMD_PG_SUPPORT_GFX_SMG |
2105                           AMD_PG_SUPPORT_GFX_DMG |*/
2106                         AMD_PG_SUPPORT_UVD |
2107                         /*AMD_PG_SUPPORT_VCE |
2108                           AMD_PG_SUPPORT_CP |
2109                           AMD_PG_SUPPORT_GDS |
2110                           AMD_PG_SUPPORT_RLC_SMU_HS |
2111                           AMD_PG_SUPPORT_ACP |
2112                           AMD_PG_SUPPORT_SAMU |*/
2113                         0;
2114                 if (adev->pdev->device == 0x1312 ||
2115                         adev->pdev->device == 0x1316 ||
2116                         adev->pdev->device == 0x1317)
2117                         adev->external_rev_id = 0x41;
2118                 else
2119                         adev->external_rev_id = 0x1;
2120                 break;
2121         case CHIP_KABINI:
2122         case CHIP_MULLINS:
2123                 adev->cg_flags =
2124                         AMD_CG_SUPPORT_GFX_MGCG |
2125                         AMD_CG_SUPPORT_GFX_MGLS |
2126                         /*AMD_CG_SUPPORT_GFX_CGCG |*/
2127                         AMD_CG_SUPPORT_GFX_CGLS |
2128                         AMD_CG_SUPPORT_GFX_CGTS |
2129                         AMD_CG_SUPPORT_GFX_CGTS_LS |
2130                         AMD_CG_SUPPORT_GFX_CP_LS |
2131                         AMD_CG_SUPPORT_SDMA_MGCG |
2132                         AMD_CG_SUPPORT_SDMA_LS |
2133                         AMD_CG_SUPPORT_BIF_LS |
2134                         AMD_CG_SUPPORT_VCE_MGCG |
2135                         AMD_CG_SUPPORT_UVD_MGCG |
2136                         AMD_CG_SUPPORT_HDP_LS |
2137                         AMD_CG_SUPPORT_HDP_MGCG;
2138                 adev->pg_flags =
2139                         /*AMD_PG_SUPPORT_GFX_PG |
2140                           AMD_PG_SUPPORT_GFX_SMG | */
2141                         AMD_PG_SUPPORT_UVD |
2142                         /*AMD_PG_SUPPORT_VCE |
2143                           AMD_PG_SUPPORT_CP |
2144                           AMD_PG_SUPPORT_GDS |
2145                           AMD_PG_SUPPORT_RLC_SMU_HS |
2146                           AMD_PG_SUPPORT_SAMU |*/
2147                         0;
2148                 if (adev->asic_type == CHIP_KABINI) {
2149                         if (adev->rev_id == 0)
2150                                 adev->external_rev_id = 0x81;
2151                         else if (adev->rev_id == 1)
2152                                 adev->external_rev_id = 0x82;
2153                         else if (adev->rev_id == 2)
2154                                 adev->external_rev_id = 0x85;
2155                 } else
2156                         adev->external_rev_id = adev->rev_id + 0xa1;
2157                 break;
2158         default:
2159                 /* FIXME: not supported yet */
2160                 return -EINVAL;
2161         }
2162
2163         amdgpu_get_pcie_info(adev);
2164
2165         return 0;
2166 }
2167
2168 static int cik_common_sw_init(void *handle)
2169 {
2170         return 0;
2171 }
2172
2173 static int cik_common_sw_fini(void *handle)
2174 {
2175         return 0;
2176 }
2177
2178 static int cik_common_hw_init(void *handle)
2179 {
2180         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2181
2182         /* move the golden regs per IP block */
2183         cik_init_golden_registers(adev);
2184         /* enable pcie gen2/3 link */
2185         cik_pcie_gen3_enable(adev);
2186         /* enable aspm */
2187         cik_program_aspm(adev);
2188
2189         return 0;
2190 }
2191
2192 static int cik_common_hw_fini(void *handle)
2193 {
2194         return 0;
2195 }
2196
2197 static int cik_common_suspend(void *handle)
2198 {
2199         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2200
2201         amdgpu_amdkfd_suspend(adev);
2202
2203         return cik_common_hw_fini(adev);
2204 }
2205
2206 static int cik_common_resume(void *handle)
2207 {
2208         int r;
2209         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2210
2211         r = cik_common_hw_init(adev);
2212         if (r)
2213                 return r;
2214
2215         return amdgpu_amdkfd_resume(adev);
2216 }
2217
2218 static bool cik_common_is_idle(void *handle)
2219 {
2220         return true;
2221 }
2222
2223 static int cik_common_wait_for_idle(void *handle)
2224 {
2225         return 0;
2226 }
2227
2228 static int cik_common_soft_reset(void *handle)
2229 {
2230         /* XXX hard reset?? */
2231         return 0;
2232 }
2233
2234 static int cik_common_set_clockgating_state(void *handle,
2235                                             enum amd_clockgating_state state)
2236 {
2237         return 0;
2238 }
2239
2240 static int cik_common_set_powergating_state(void *handle,
2241                                             enum amd_powergating_state state)
2242 {
2243         return 0;
2244 }
2245
2246 const struct amd_ip_funcs cik_common_ip_funcs = {
2247         .name = "cik_common",
2248         .early_init = cik_common_early_init,
2249         .late_init = NULL,
2250         .sw_init = cik_common_sw_init,
2251         .sw_fini = cik_common_sw_fini,
2252         .hw_init = cik_common_hw_init,
2253         .hw_fini = cik_common_hw_fini,
2254         .suspend = cik_common_suspend,
2255         .resume = cik_common_resume,
2256         .is_idle = cik_common_is_idle,
2257         .wait_for_idle = cik_common_wait_for_idle,
2258         .soft_reset = cik_common_soft_reset,
2259         .set_clockgating_state = cik_common_set_clockgating_state,
2260         .set_powergating_state = cik_common_set_powergating_state,
2261 };