]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/gpu/drm/amd/amdgpu/cik.c
memremap: fix highmem support
[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 (amdgpu_pcie_gen2 == 0)
1571                 return;
1572
1573         if (adev->flags & AMD_IS_APU)
1574                 return;
1575
1576         ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
1577         if (ret != 0)
1578                 return;
1579
1580         if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80)))
1581                 return;
1582
1583         speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1584         current_data_rate = (speed_cntl & PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK) >>
1585                 PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT;
1586         if (mask & DRM_PCIE_SPEED_80) {
1587                 if (current_data_rate == 2) {
1588                         DRM_INFO("PCIE gen 3 link speeds already enabled\n");
1589                         return;
1590                 }
1591                 DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
1592         } else if (mask & DRM_PCIE_SPEED_50) {
1593                 if (current_data_rate == 1) {
1594                         DRM_INFO("PCIE gen 2 link speeds already enabled\n");
1595                         return;
1596                 }
1597                 DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
1598         }
1599
1600         bridge_pos = pci_pcie_cap(root);
1601         if (!bridge_pos)
1602                 return;
1603
1604         gpu_pos = pci_pcie_cap(adev->pdev);
1605         if (!gpu_pos)
1606                 return;
1607
1608         if (mask & DRM_PCIE_SPEED_80) {
1609                 /* re-try equalization if gen3 is not already enabled */
1610                 if (current_data_rate != 2) {
1611                         u16 bridge_cfg, gpu_cfg;
1612                         u16 bridge_cfg2, gpu_cfg2;
1613                         u32 max_lw, current_lw, tmp;
1614
1615                         pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1616                         pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1617
1618                         tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
1619                         pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1620
1621                         tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
1622                         pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1623
1624                         tmp = RREG32_PCIE(ixPCIE_LC_STATUS1);
1625                         max_lw = (tmp & PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH_MASK) >>
1626                                 PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH__SHIFT;
1627                         current_lw = (tmp & PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH_MASK)
1628                                 >> PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH__SHIFT;
1629
1630                         if (current_lw < max_lw) {
1631                                 tmp = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
1632                                 if (tmp & PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATION_SUPPORT_MASK) {
1633                                         tmp &= ~(PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_MASK |
1634                                                 PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_DIS_MASK);
1635                                         tmp |= (max_lw <<
1636                                                 PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH__SHIFT);
1637                                         tmp |= PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_SUPPORT_MASK |
1638                                         PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATE_EN_MASK |
1639                                         PCIE_LC_LINK_WIDTH_CNTL__LC_RECONFIG_NOW_MASK;
1640                                         WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, tmp);
1641                                 }
1642                         }
1643
1644                         for (i = 0; i < 10; i++) {
1645                                 /* check status */
1646                                 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
1647                                 if (tmp16 & PCI_EXP_DEVSTA_TRPND)
1648                                         break;
1649
1650                                 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1651                                 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1652
1653                                 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
1654                                 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
1655
1656                                 tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1657                                 tmp |= PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
1658                                 WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1659
1660                                 tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1661                                 tmp |= PCIE_LC_CNTL4__LC_REDO_EQ_MASK;
1662                                 WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1663
1664                                 mdelay(100);
1665
1666                                 /* linkctl */
1667                                 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
1668                                 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1669                                 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
1670                                 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1671
1672                                 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
1673                                 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1674                                 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
1675                                 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1676
1677                                 /* linkctl2 */
1678                                 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
1679                                 tmp16 &= ~((1 << 4) | (7 << 9));
1680                                 tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
1681                                 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
1682
1683                                 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1684                                 tmp16 &= ~((1 << 4) | (7 << 9));
1685                                 tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
1686                                 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1687
1688                                 tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1689                                 tmp &= ~PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
1690                                 WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1691                         }
1692                 }
1693         }
1694
1695         /* set the link speed */
1696         speed_cntl |= PCIE_LC_SPEED_CNTL__LC_FORCE_EN_SW_SPEED_CHANGE_MASK |
1697                 PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_HW_SPEED_CHANGE_MASK;
1698         speed_cntl &= ~PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_SW_SPEED_CHANGE_MASK;
1699         WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
1700
1701         pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1702         tmp16 &= ~0xf;
1703         if (mask & DRM_PCIE_SPEED_80)
1704                 tmp16 |= 3; /* gen3 */
1705         else if (mask & DRM_PCIE_SPEED_50)
1706                 tmp16 |= 2; /* gen2 */
1707         else
1708                 tmp16 |= 1; /* gen1 */
1709         pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1710
1711         speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1712         speed_cntl |= PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK;
1713         WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
1714
1715         for (i = 0; i < adev->usec_timeout; i++) {
1716                 speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1717                 if ((speed_cntl & PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK) == 0)
1718                         break;
1719                 udelay(1);
1720         }
1721 }
1722
1723 static void cik_program_aspm(struct amdgpu_device *adev)
1724 {
1725         u32 data, orig;
1726         bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
1727         bool disable_clkreq = false;
1728
1729         if (amdgpu_aspm == 0)
1730                 return;
1731
1732         /* XXX double check APUs */
1733         if (adev->flags & AMD_IS_APU)
1734                 return;
1735
1736         orig = data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
1737         data &= ~PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_MASK;
1738         data |= (0x24 << PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS__SHIFT) |
1739                 PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_OVERRIDE_EN_MASK;
1740         if (orig != data)
1741                 WREG32_PCIE(ixPCIE_LC_N_FTS_CNTL, data);
1742
1743         orig = data = RREG32_PCIE(ixPCIE_LC_CNTL3);
1744         data |= PCIE_LC_CNTL3__LC_GO_TO_RECOVERY_MASK;
1745         if (orig != data)
1746                 WREG32_PCIE(ixPCIE_LC_CNTL3, data);
1747
1748         orig = data = RREG32_PCIE(ixPCIE_P_CNTL);
1749         data |= PCIE_P_CNTL__P_IGNORE_EDB_ERR_MASK;
1750         if (orig != data)
1751                 WREG32_PCIE(ixPCIE_P_CNTL, data);
1752
1753         orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
1754         data &= ~(PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK |
1755                 PCIE_LC_CNTL__LC_L1_INACTIVITY_MASK);
1756         data |= PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
1757         if (!disable_l0s)
1758                 data |= (7 << PCIE_LC_CNTL__LC_L0S_INACTIVITY__SHIFT);
1759
1760         if (!disable_l1) {
1761                 data |= (7 << PCIE_LC_CNTL__LC_L1_INACTIVITY__SHIFT);
1762                 data &= ~PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
1763                 if (orig != data)
1764                         WREG32_PCIE(ixPCIE_LC_CNTL, data);
1765
1766                 if (!disable_plloff_in_l1) {
1767                         bool clk_req_support;
1768
1769                         orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_0);
1770                         data &= ~(PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
1771                                 PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
1772                         data |= (7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
1773                                 (7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
1774                         if (orig != data)
1775                                 WREG32_PCIE(ixPB0_PIF_PWRDOWN_0, data);
1776
1777                         orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_1);
1778                         data &= ~(PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
1779                                 PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
1780                         data |= (7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
1781                                 (7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
1782                         if (orig != data)
1783                                 WREG32_PCIE(ixPB0_PIF_PWRDOWN_1, data);
1784
1785                         orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_0);
1786                         data &= ~(PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
1787                                 PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
1788                         data |= (7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
1789                                 (7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
1790                         if (orig != data)
1791                                 WREG32_PCIE(ixPB1_PIF_PWRDOWN_0, data);
1792
1793                         orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_1);
1794                         data &= ~(PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
1795                                 PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
1796                         data |= (7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
1797                                 (7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
1798                         if (orig != data)
1799                                 WREG32_PCIE(ixPB1_PIF_PWRDOWN_1, data);
1800
1801                         orig = data = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
1802                         data &= ~PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE_MASK;
1803                         data |= ~(3 << PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE__SHIFT);
1804                         if (orig != data)
1805                                 WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, data);
1806
1807                         if (!disable_clkreq) {
1808                                 struct pci_dev *root = adev->pdev->bus->self;
1809                                 u32 lnkcap;
1810
1811                                 clk_req_support = false;
1812                                 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
1813                                 if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
1814                                         clk_req_support = true;
1815                         } else {
1816                                 clk_req_support = false;
1817                         }
1818
1819                         if (clk_req_support) {
1820                                 orig = data = RREG32_PCIE(ixPCIE_LC_CNTL2);
1821                                 data |= PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L1_MASK |
1822                                         PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L23_MASK;
1823                                 if (orig != data)
1824                                         WREG32_PCIE(ixPCIE_LC_CNTL2, data);
1825
1826                                 orig = data = RREG32_SMC(ixTHM_CLK_CNTL);
1827                                 data &= ~(THM_CLK_CNTL__CMON_CLK_SEL_MASK |
1828                                         THM_CLK_CNTL__TMON_CLK_SEL_MASK);
1829                                 data |= (1 << THM_CLK_CNTL__CMON_CLK_SEL__SHIFT) |
1830                                         (1 << THM_CLK_CNTL__TMON_CLK_SEL__SHIFT);
1831                                 if (orig != data)
1832                                         WREG32_SMC(ixTHM_CLK_CNTL, data);
1833
1834                                 orig = data = RREG32_SMC(ixMISC_CLK_CTRL);
1835                                 data &= ~(MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL_MASK |
1836                                         MISC_CLK_CTRL__ZCLK_SEL_MASK);
1837                                 data |= (1 << MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL__SHIFT) |
1838                                         (1 << MISC_CLK_CTRL__ZCLK_SEL__SHIFT);
1839                                 if (orig != data)
1840                                         WREG32_SMC(ixMISC_CLK_CTRL, data);
1841
1842                                 orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL);
1843                                 data &= ~CG_CLKPIN_CNTL__BCLK_AS_XCLK_MASK;
1844                                 if (orig != data)
1845                                         WREG32_SMC(ixCG_CLKPIN_CNTL, data);
1846
1847                                 orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL_2);
1848                                 data &= ~CG_CLKPIN_CNTL_2__FORCE_BIF_REFCLK_EN_MASK;
1849                                 if (orig != data)
1850                                         WREG32_SMC(ixCG_CLKPIN_CNTL_2, data);
1851
1852                                 orig = data = RREG32_SMC(ixMPLL_BYPASSCLK_SEL);
1853                                 data &= ~MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL_MASK;
1854                                 data |= (4 << MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL__SHIFT);
1855                                 if (orig != data)
1856                                         WREG32_SMC(ixMPLL_BYPASSCLK_SEL, data);
1857                         }
1858                 }
1859         } else {
1860                 if (orig != data)
1861                         WREG32_PCIE(ixPCIE_LC_CNTL, data);
1862         }
1863
1864         orig = data = RREG32_PCIE(ixPCIE_CNTL2);
1865         data |= PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
1866                 PCIE_CNTL2__MST_MEM_LS_EN_MASK |
1867                 PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK;
1868         if (orig != data)
1869                 WREG32_PCIE(ixPCIE_CNTL2, data);
1870
1871         if (!disable_l0s) {
1872                 data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
1873                 if ((data & PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) ==
1874                                 PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) {
1875                         data = RREG32_PCIE(ixPCIE_LC_STATUS1);
1876                         if ((data & PCIE_LC_STATUS1__LC_REVERSE_XMIT_MASK) &&
1877                         (data & PCIE_LC_STATUS1__LC_REVERSE_RCVR_MASK)) {
1878                                 orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
1879                                 data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK;
1880                                 if (orig != data)
1881                                         WREG32_PCIE(ixPCIE_LC_CNTL, data);
1882                         }
1883                 }
1884         }
1885 }
1886
1887 static uint32_t cik_get_rev_id(struct amdgpu_device *adev)
1888 {
1889         return (RREG32(mmCC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1890                 >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1891 }
1892
1893 static const struct amdgpu_ip_block_version bonaire_ip_blocks[] =
1894 {
1895         /* ORDER MATTERS! */
1896         {
1897                 .type = AMD_IP_BLOCK_TYPE_COMMON,
1898                 .major = 1,
1899                 .minor = 0,
1900                 .rev = 0,
1901                 .funcs = &cik_common_ip_funcs,
1902         },
1903         {
1904                 .type = AMD_IP_BLOCK_TYPE_GMC,
1905                 .major = 7,
1906                 .minor = 0,
1907                 .rev = 0,
1908                 .funcs = &gmc_v7_0_ip_funcs,
1909         },
1910         {
1911                 .type = AMD_IP_BLOCK_TYPE_IH,
1912                 .major = 2,
1913                 .minor = 0,
1914                 .rev = 0,
1915                 .funcs = &cik_ih_ip_funcs,
1916         },
1917         {
1918                 .type = AMD_IP_BLOCK_TYPE_SMC,
1919                 .major = 7,
1920                 .minor = 0,
1921                 .rev = 0,
1922                 .funcs = &ci_dpm_ip_funcs,
1923         },
1924         {
1925                 .type = AMD_IP_BLOCK_TYPE_DCE,
1926                 .major = 8,
1927                 .minor = 2,
1928                 .rev = 0,
1929                 .funcs = &dce_v8_0_ip_funcs,
1930         },
1931         {
1932                 .type = AMD_IP_BLOCK_TYPE_GFX,
1933                 .major = 7,
1934                 .minor = 2,
1935                 .rev = 0,
1936                 .funcs = &gfx_v7_0_ip_funcs,
1937         },
1938         {
1939                 .type = AMD_IP_BLOCK_TYPE_SDMA,
1940                 .major = 2,
1941                 .minor = 0,
1942                 .rev = 0,
1943                 .funcs = &cik_sdma_ip_funcs,
1944         },
1945         {
1946                 .type = AMD_IP_BLOCK_TYPE_UVD,
1947                 .major = 4,
1948                 .minor = 2,
1949                 .rev = 0,
1950                 .funcs = &uvd_v4_2_ip_funcs,
1951         },
1952         {
1953                 .type = AMD_IP_BLOCK_TYPE_VCE,
1954                 .major = 2,
1955                 .minor = 0,
1956                 .rev = 0,
1957                 .funcs = &vce_v2_0_ip_funcs,
1958         },
1959 };
1960
1961 static const struct amdgpu_ip_block_version hawaii_ip_blocks[] =
1962 {
1963         /* ORDER MATTERS! */
1964         {
1965                 .type = AMD_IP_BLOCK_TYPE_COMMON,
1966                 .major = 1,
1967                 .minor = 0,
1968                 .rev = 0,
1969                 .funcs = &cik_common_ip_funcs,
1970         },
1971         {
1972                 .type = AMD_IP_BLOCK_TYPE_GMC,
1973                 .major = 7,
1974                 .minor = 0,
1975                 .rev = 0,
1976                 .funcs = &gmc_v7_0_ip_funcs,
1977         },
1978         {
1979                 .type = AMD_IP_BLOCK_TYPE_IH,
1980                 .major = 2,
1981                 .minor = 0,
1982                 .rev = 0,
1983                 .funcs = &cik_ih_ip_funcs,
1984         },
1985         {
1986                 .type = AMD_IP_BLOCK_TYPE_SMC,
1987                 .major = 7,
1988                 .minor = 0,
1989                 .rev = 0,
1990                 .funcs = &ci_dpm_ip_funcs,
1991         },
1992         {
1993                 .type = AMD_IP_BLOCK_TYPE_DCE,
1994                 .major = 8,
1995                 .minor = 5,
1996                 .rev = 0,
1997                 .funcs = &dce_v8_0_ip_funcs,
1998         },
1999         {
2000                 .type = AMD_IP_BLOCK_TYPE_GFX,
2001                 .major = 7,
2002                 .minor = 3,
2003                 .rev = 0,
2004                 .funcs = &gfx_v7_0_ip_funcs,
2005         },
2006         {
2007                 .type = AMD_IP_BLOCK_TYPE_SDMA,
2008                 .major = 2,
2009                 .minor = 0,
2010                 .rev = 0,
2011                 .funcs = &cik_sdma_ip_funcs,
2012         },
2013         {
2014                 .type = AMD_IP_BLOCK_TYPE_UVD,
2015                 .major = 4,
2016                 .minor = 2,
2017                 .rev = 0,
2018                 .funcs = &uvd_v4_2_ip_funcs,
2019         },
2020         {
2021                 .type = AMD_IP_BLOCK_TYPE_VCE,
2022                 .major = 2,
2023                 .minor = 0,
2024                 .rev = 0,
2025                 .funcs = &vce_v2_0_ip_funcs,
2026         },
2027 };
2028
2029 static const struct amdgpu_ip_block_version kabini_ip_blocks[] =
2030 {
2031         /* ORDER MATTERS! */
2032         {
2033                 .type = AMD_IP_BLOCK_TYPE_COMMON,
2034                 .major = 1,
2035                 .minor = 0,
2036                 .rev = 0,
2037                 .funcs = &cik_common_ip_funcs,
2038         },
2039         {
2040                 .type = AMD_IP_BLOCK_TYPE_GMC,
2041                 .major = 7,
2042                 .minor = 0,
2043                 .rev = 0,
2044                 .funcs = &gmc_v7_0_ip_funcs,
2045         },
2046         {
2047                 .type = AMD_IP_BLOCK_TYPE_IH,
2048                 .major = 2,
2049                 .minor = 0,
2050                 .rev = 0,
2051                 .funcs = &cik_ih_ip_funcs,
2052         },
2053         {
2054                 .type = AMD_IP_BLOCK_TYPE_SMC,
2055                 .major = 7,
2056                 .minor = 0,
2057                 .rev = 0,
2058                 .funcs = &kv_dpm_ip_funcs,
2059         },
2060         {
2061                 .type = AMD_IP_BLOCK_TYPE_DCE,
2062                 .major = 8,
2063                 .minor = 3,
2064                 .rev = 0,
2065                 .funcs = &dce_v8_0_ip_funcs,
2066         },
2067         {
2068                 .type = AMD_IP_BLOCK_TYPE_GFX,
2069                 .major = 7,
2070                 .minor = 2,
2071                 .rev = 0,
2072                 .funcs = &gfx_v7_0_ip_funcs,
2073         },
2074         {
2075                 .type = AMD_IP_BLOCK_TYPE_SDMA,
2076                 .major = 2,
2077                 .minor = 0,
2078                 .rev = 0,
2079                 .funcs = &cik_sdma_ip_funcs,
2080         },
2081         {
2082                 .type = AMD_IP_BLOCK_TYPE_UVD,
2083                 .major = 4,
2084                 .minor = 2,
2085                 .rev = 0,
2086                 .funcs = &uvd_v4_2_ip_funcs,
2087         },
2088         {
2089                 .type = AMD_IP_BLOCK_TYPE_VCE,
2090                 .major = 2,
2091                 .minor = 0,
2092                 .rev = 0,
2093                 .funcs = &vce_v2_0_ip_funcs,
2094         },
2095 };
2096
2097 static const struct amdgpu_ip_block_version mullins_ip_blocks[] =
2098 {
2099         /* ORDER MATTERS! */
2100         {
2101                 .type = AMD_IP_BLOCK_TYPE_COMMON,
2102                 .major = 1,
2103                 .minor = 0,
2104                 .rev = 0,
2105                 .funcs = &cik_common_ip_funcs,
2106         },
2107         {
2108                 .type = AMD_IP_BLOCK_TYPE_GMC,
2109                 .major = 7,
2110                 .minor = 0,
2111                 .rev = 0,
2112                 .funcs = &gmc_v7_0_ip_funcs,
2113         },
2114         {
2115                 .type = AMD_IP_BLOCK_TYPE_IH,
2116                 .major = 2,
2117                 .minor = 0,
2118                 .rev = 0,
2119                 .funcs = &cik_ih_ip_funcs,
2120         },
2121         {
2122                 .type = AMD_IP_BLOCK_TYPE_SMC,
2123                 .major = 7,
2124                 .minor = 0,
2125                 .rev = 0,
2126                 .funcs = &kv_dpm_ip_funcs,
2127         },
2128         {
2129                 .type = AMD_IP_BLOCK_TYPE_DCE,
2130                 .major = 8,
2131                 .minor = 3,
2132                 .rev = 0,
2133                 .funcs = &dce_v8_0_ip_funcs,
2134         },
2135         {
2136                 .type = AMD_IP_BLOCK_TYPE_GFX,
2137                 .major = 7,
2138                 .minor = 2,
2139                 .rev = 0,
2140                 .funcs = &gfx_v7_0_ip_funcs,
2141         },
2142         {
2143                 .type = AMD_IP_BLOCK_TYPE_SDMA,
2144                 .major = 2,
2145                 .minor = 0,
2146                 .rev = 0,
2147                 .funcs = &cik_sdma_ip_funcs,
2148         },
2149         {
2150                 .type = AMD_IP_BLOCK_TYPE_UVD,
2151                 .major = 4,
2152                 .minor = 2,
2153                 .rev = 0,
2154                 .funcs = &uvd_v4_2_ip_funcs,
2155         },
2156         {
2157                 .type = AMD_IP_BLOCK_TYPE_VCE,
2158                 .major = 2,
2159                 .minor = 0,
2160                 .rev = 0,
2161                 .funcs = &vce_v2_0_ip_funcs,
2162         },
2163 };
2164
2165 static const struct amdgpu_ip_block_version kaveri_ip_blocks[] =
2166 {
2167         /* ORDER MATTERS! */
2168         {
2169                 .type = AMD_IP_BLOCK_TYPE_COMMON,
2170                 .major = 1,
2171                 .minor = 0,
2172                 .rev = 0,
2173                 .funcs = &cik_common_ip_funcs,
2174         },
2175         {
2176                 .type = AMD_IP_BLOCK_TYPE_GMC,
2177                 .major = 7,
2178                 .minor = 0,
2179                 .rev = 0,
2180                 .funcs = &gmc_v7_0_ip_funcs,
2181         },
2182         {
2183                 .type = AMD_IP_BLOCK_TYPE_IH,
2184                 .major = 2,
2185                 .minor = 0,
2186                 .rev = 0,
2187                 .funcs = &cik_ih_ip_funcs,
2188         },
2189         {
2190                 .type = AMD_IP_BLOCK_TYPE_SMC,
2191                 .major = 7,
2192                 .minor = 0,
2193                 .rev = 0,
2194                 .funcs = &kv_dpm_ip_funcs,
2195         },
2196         {
2197                 .type = AMD_IP_BLOCK_TYPE_DCE,
2198                 .major = 8,
2199                 .minor = 1,
2200                 .rev = 0,
2201                 .funcs = &dce_v8_0_ip_funcs,
2202         },
2203         {
2204                 .type = AMD_IP_BLOCK_TYPE_GFX,
2205                 .major = 7,
2206                 .minor = 1,
2207                 .rev = 0,
2208                 .funcs = &gfx_v7_0_ip_funcs,
2209         },
2210         {
2211                 .type = AMD_IP_BLOCK_TYPE_SDMA,
2212                 .major = 2,
2213                 .minor = 0,
2214                 .rev = 0,
2215                 .funcs = &cik_sdma_ip_funcs,
2216         },
2217         {
2218                 .type = AMD_IP_BLOCK_TYPE_UVD,
2219                 .major = 4,
2220                 .minor = 2,
2221                 .rev = 0,
2222                 .funcs = &uvd_v4_2_ip_funcs,
2223         },
2224         {
2225                 .type = AMD_IP_BLOCK_TYPE_VCE,
2226                 .major = 2,
2227                 .minor = 0,
2228                 .rev = 0,
2229                 .funcs = &vce_v2_0_ip_funcs,
2230         },
2231 };
2232
2233 int cik_set_ip_blocks(struct amdgpu_device *adev)
2234 {
2235         switch (adev->asic_type) {
2236         case CHIP_BONAIRE:
2237                 adev->ip_blocks = bonaire_ip_blocks;
2238                 adev->num_ip_blocks = ARRAY_SIZE(bonaire_ip_blocks);
2239                 break;
2240         case CHIP_HAWAII:
2241                 adev->ip_blocks = hawaii_ip_blocks;
2242                 adev->num_ip_blocks = ARRAY_SIZE(hawaii_ip_blocks);
2243                 break;
2244         case CHIP_KAVERI:
2245                 adev->ip_blocks = kaveri_ip_blocks;
2246                 adev->num_ip_blocks = ARRAY_SIZE(kaveri_ip_blocks);
2247                 break;
2248         case CHIP_KABINI:
2249                 adev->ip_blocks = kabini_ip_blocks;
2250                 adev->num_ip_blocks = ARRAY_SIZE(kabini_ip_blocks);
2251                 break;
2252         case CHIP_MULLINS:
2253                 adev->ip_blocks = mullins_ip_blocks;
2254                 adev->num_ip_blocks = ARRAY_SIZE(mullins_ip_blocks);
2255                 break;
2256         default:
2257                 /* FIXME: not supported yet */
2258                 return -EINVAL;
2259         }
2260
2261         return 0;
2262 }
2263
2264 static const struct amdgpu_asic_funcs cik_asic_funcs =
2265 {
2266         .read_disabled_bios = &cik_read_disabled_bios,
2267         .read_register = &cik_read_register,
2268         .reset = &cik_asic_reset,
2269         .set_vga_state = &cik_vga_set_state,
2270         .get_xclk = &cik_get_xclk,
2271         .set_uvd_clocks = &cik_set_uvd_clocks,
2272         .set_vce_clocks = &cik_set_vce_clocks,
2273         .get_cu_info = &gfx_v7_0_get_cu_info,
2274         /* these should be moved to their own ip modules */
2275         .get_gpu_clock_counter = &gfx_v7_0_get_gpu_clock_counter,
2276         .wait_for_mc_idle = &gmc_v7_0_mc_wait_for_idle,
2277 };
2278
2279 static int cik_common_early_init(void *handle)
2280 {
2281         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2282
2283         adev->smc_rreg = &cik_smc_rreg;
2284         adev->smc_wreg = &cik_smc_wreg;
2285         adev->pcie_rreg = &cik_pcie_rreg;
2286         adev->pcie_wreg = &cik_pcie_wreg;
2287         adev->uvd_ctx_rreg = &cik_uvd_ctx_rreg;
2288         adev->uvd_ctx_wreg = &cik_uvd_ctx_wreg;
2289         adev->didt_rreg = &cik_didt_rreg;
2290         adev->didt_wreg = &cik_didt_wreg;
2291
2292         adev->asic_funcs = &cik_asic_funcs;
2293
2294         adev->has_uvd = true;
2295
2296         adev->rev_id = cik_get_rev_id(adev);
2297         adev->external_rev_id = 0xFF;
2298         switch (adev->asic_type) {
2299         case CHIP_BONAIRE:
2300                 adev->cg_flags =
2301                         AMDGPU_CG_SUPPORT_GFX_MGCG |
2302                         AMDGPU_CG_SUPPORT_GFX_MGLS |
2303                         /*AMDGPU_CG_SUPPORT_GFX_CGCG |*/
2304                         AMDGPU_CG_SUPPORT_GFX_CGLS |
2305                         AMDGPU_CG_SUPPORT_GFX_CGTS |
2306                         AMDGPU_CG_SUPPORT_GFX_CGTS_LS |
2307                         AMDGPU_CG_SUPPORT_GFX_CP_LS |
2308                         AMDGPU_CG_SUPPORT_MC_LS |
2309                         AMDGPU_CG_SUPPORT_MC_MGCG |
2310                         AMDGPU_CG_SUPPORT_SDMA_MGCG |
2311                         AMDGPU_CG_SUPPORT_SDMA_LS |
2312                         AMDGPU_CG_SUPPORT_BIF_LS |
2313                         AMDGPU_CG_SUPPORT_VCE_MGCG |
2314                         AMDGPU_CG_SUPPORT_UVD_MGCG |
2315                         AMDGPU_CG_SUPPORT_HDP_LS |
2316                         AMDGPU_CG_SUPPORT_HDP_MGCG;
2317                 adev->pg_flags = 0;
2318                 adev->external_rev_id = adev->rev_id + 0x14;
2319                 break;
2320         case CHIP_HAWAII:
2321                 adev->cg_flags =
2322                         AMDGPU_CG_SUPPORT_GFX_MGCG |
2323                         AMDGPU_CG_SUPPORT_GFX_MGLS |
2324                         /*AMDGPU_CG_SUPPORT_GFX_CGCG |*/
2325                         AMDGPU_CG_SUPPORT_GFX_CGLS |
2326                         AMDGPU_CG_SUPPORT_GFX_CGTS |
2327                         AMDGPU_CG_SUPPORT_GFX_CP_LS |
2328                         AMDGPU_CG_SUPPORT_MC_LS |
2329                         AMDGPU_CG_SUPPORT_MC_MGCG |
2330                         AMDGPU_CG_SUPPORT_SDMA_MGCG |
2331                         AMDGPU_CG_SUPPORT_SDMA_LS |
2332                         AMDGPU_CG_SUPPORT_BIF_LS |
2333                         AMDGPU_CG_SUPPORT_VCE_MGCG |
2334                         AMDGPU_CG_SUPPORT_UVD_MGCG |
2335                         AMDGPU_CG_SUPPORT_HDP_LS |
2336                         AMDGPU_CG_SUPPORT_HDP_MGCG;
2337                 adev->pg_flags = 0;
2338                 adev->external_rev_id = 0x28;
2339                 break;
2340         case CHIP_KAVERI:
2341                 adev->cg_flags =
2342                         AMDGPU_CG_SUPPORT_GFX_MGCG |
2343                         AMDGPU_CG_SUPPORT_GFX_MGLS |
2344                         /*AMDGPU_CG_SUPPORT_GFX_CGCG |*/
2345                         AMDGPU_CG_SUPPORT_GFX_CGLS |
2346                         AMDGPU_CG_SUPPORT_GFX_CGTS |
2347                         AMDGPU_CG_SUPPORT_GFX_CGTS_LS |
2348                         AMDGPU_CG_SUPPORT_GFX_CP_LS |
2349                         AMDGPU_CG_SUPPORT_SDMA_MGCG |
2350                         AMDGPU_CG_SUPPORT_SDMA_LS |
2351                         AMDGPU_CG_SUPPORT_BIF_LS |
2352                         AMDGPU_CG_SUPPORT_VCE_MGCG |
2353                         AMDGPU_CG_SUPPORT_UVD_MGCG |
2354                         AMDGPU_CG_SUPPORT_HDP_LS |
2355                         AMDGPU_CG_SUPPORT_HDP_MGCG;
2356                 adev->pg_flags =
2357                         /*AMDGPU_PG_SUPPORT_GFX_PG |
2358                           AMDGPU_PG_SUPPORT_GFX_SMG |
2359                           AMDGPU_PG_SUPPORT_GFX_DMG |*/
2360                         AMDGPU_PG_SUPPORT_UVD |
2361                         /*AMDGPU_PG_SUPPORT_VCE |
2362                           AMDGPU_PG_SUPPORT_CP |
2363                           AMDGPU_PG_SUPPORT_GDS |
2364                           AMDGPU_PG_SUPPORT_RLC_SMU_HS |
2365                           AMDGPU_PG_SUPPORT_ACP |
2366                           AMDGPU_PG_SUPPORT_SAMU |*/
2367                         0;
2368                 if (adev->pdev->device == 0x1312 ||
2369                         adev->pdev->device == 0x1316 ||
2370                         adev->pdev->device == 0x1317)
2371                         adev->external_rev_id = 0x41;
2372                 else
2373                         adev->external_rev_id = 0x1;
2374                 break;
2375         case CHIP_KABINI:
2376         case CHIP_MULLINS:
2377                 adev->cg_flags =
2378                         AMDGPU_CG_SUPPORT_GFX_MGCG |
2379                         AMDGPU_CG_SUPPORT_GFX_MGLS |
2380                         /*AMDGPU_CG_SUPPORT_GFX_CGCG |*/
2381                         AMDGPU_CG_SUPPORT_GFX_CGLS |
2382                         AMDGPU_CG_SUPPORT_GFX_CGTS |
2383                         AMDGPU_CG_SUPPORT_GFX_CGTS_LS |
2384                         AMDGPU_CG_SUPPORT_GFX_CP_LS |
2385                         AMDGPU_CG_SUPPORT_SDMA_MGCG |
2386                         AMDGPU_CG_SUPPORT_SDMA_LS |
2387                         AMDGPU_CG_SUPPORT_BIF_LS |
2388                         AMDGPU_CG_SUPPORT_VCE_MGCG |
2389                         AMDGPU_CG_SUPPORT_UVD_MGCG |
2390                         AMDGPU_CG_SUPPORT_HDP_LS |
2391                         AMDGPU_CG_SUPPORT_HDP_MGCG;
2392                 adev->pg_flags =
2393                         /*AMDGPU_PG_SUPPORT_GFX_PG |
2394                           AMDGPU_PG_SUPPORT_GFX_SMG | */
2395                         AMDGPU_PG_SUPPORT_UVD |
2396                         /*AMDGPU_PG_SUPPORT_VCE |
2397                           AMDGPU_PG_SUPPORT_CP |
2398                           AMDGPU_PG_SUPPORT_GDS |
2399                           AMDGPU_PG_SUPPORT_RLC_SMU_HS |
2400                           AMDGPU_PG_SUPPORT_SAMU |*/
2401                         0;
2402                 if (adev->asic_type == CHIP_KABINI) {
2403                         if (adev->rev_id == 0)
2404                                 adev->external_rev_id = 0x81;
2405                         else if (adev->rev_id == 1)
2406                                 adev->external_rev_id = 0x82;
2407                         else if (adev->rev_id == 2)
2408                                 adev->external_rev_id = 0x85;
2409                 } else
2410                         adev->external_rev_id = adev->rev_id + 0xa1;
2411                 break;
2412         default:
2413                 /* FIXME: not supported yet */
2414                 return -EINVAL;
2415         }
2416
2417         return 0;
2418 }
2419
2420 static int cik_common_sw_init(void *handle)
2421 {
2422         return 0;
2423 }
2424
2425 static int cik_common_sw_fini(void *handle)
2426 {
2427         return 0;
2428 }
2429
2430 static int cik_common_hw_init(void *handle)
2431 {
2432         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2433
2434         /* move the golden regs per IP block */
2435         cik_init_golden_registers(adev);
2436         /* enable pcie gen2/3 link */
2437         cik_pcie_gen3_enable(adev);
2438         /* enable aspm */
2439         cik_program_aspm(adev);
2440
2441         return 0;
2442 }
2443
2444 static int cik_common_hw_fini(void *handle)
2445 {
2446         return 0;
2447 }
2448
2449 static int cik_common_suspend(void *handle)
2450 {
2451         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2452
2453         amdgpu_amdkfd_suspend(adev);
2454
2455         return cik_common_hw_fini(adev);
2456 }
2457
2458 static int cik_common_resume(void *handle)
2459 {
2460         int r;
2461         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2462
2463         r = cik_common_hw_init(adev);
2464         if (r)
2465                 return r;
2466
2467         return amdgpu_amdkfd_resume(adev);
2468 }
2469
2470 static bool cik_common_is_idle(void *handle)
2471 {
2472         return true;
2473 }
2474
2475 static int cik_common_wait_for_idle(void *handle)
2476 {
2477         return 0;
2478 }
2479
2480 static void cik_common_print_status(void *handle)
2481 {
2482
2483 }
2484
2485 static int cik_common_soft_reset(void *handle)
2486 {
2487         /* XXX hard reset?? */
2488         return 0;
2489 }
2490
2491 static int cik_common_set_clockgating_state(void *handle,
2492                                             enum amd_clockgating_state state)
2493 {
2494         return 0;
2495 }
2496
2497 static int cik_common_set_powergating_state(void *handle,
2498                                             enum amd_powergating_state state)
2499 {
2500         return 0;
2501 }
2502
2503 const struct amd_ip_funcs cik_common_ip_funcs = {
2504         .early_init = cik_common_early_init,
2505         .late_init = NULL,
2506         .sw_init = cik_common_sw_init,
2507         .sw_fini = cik_common_sw_fini,
2508         .hw_init = cik_common_hw_init,
2509         .hw_fini = cik_common_hw_fini,
2510         .suspend = cik_common_suspend,
2511         .resume = cik_common_resume,
2512         .is_idle = cik_common_is_idle,
2513         .wait_for_idle = cik_common_wait_for_idle,
2514         .soft_reset = cik_common_soft_reset,
2515         .print_status = cik_common_print_status,
2516         .set_clockgating_state = cik_common_set_clockgating_state,
2517         .set_powergating_state = cik_common_set_powergating_state,
2518 };