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