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