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