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