radeon_ni.c revision 1.1.1.1 1 /* $NetBSD: radeon_ni.c,v 1.1.1.1 2021/12/18 20:15:49 riastradh Exp $ */
2
3 /*
4 * Copyright 2010 Advanced Micro Devices, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 *
24 * Authors: Alex Deucher
25 */
26
27 #include <sys/cdefs.h>
28 __KERNEL_RCSID(0, "$NetBSD: radeon_ni.c,v 1.1.1.1 2021/12/18 20:15:49 riastradh Exp $");
29
30 #include <linux/firmware.h>
31 #include <linux/module.h>
32 #include <linux/pci.h>
33 #include <linux/slab.h>
34
35 #include <drm/radeon_drm.h>
36
37 #include "atom.h"
38 #include "cayman_blit_shaders.h"
39 #include "clearstate_cayman.h"
40 #include "ni_reg.h"
41 #include "nid.h"
42 #include "radeon.h"
43 #include "radeon_asic.h"
44 #include "radeon_audio.h"
45 #include "radeon_ucode.h"
46
47 /*
48 * Indirect registers accessor
49 */
50 u32 tn_smc_rreg(struct radeon_device *rdev, u32 reg)
51 {
52 unsigned long flags;
53 u32 r;
54
55 spin_lock_irqsave(&rdev->smc_idx_lock, flags);
56 WREG32(TN_SMC_IND_INDEX_0, (reg));
57 r = RREG32(TN_SMC_IND_DATA_0);
58 spin_unlock_irqrestore(&rdev->smc_idx_lock, flags);
59 return r;
60 }
61
62 void tn_smc_wreg(struct radeon_device *rdev, u32 reg, u32 v)
63 {
64 unsigned long flags;
65
66 spin_lock_irqsave(&rdev->smc_idx_lock, flags);
67 WREG32(TN_SMC_IND_INDEX_0, (reg));
68 WREG32(TN_SMC_IND_DATA_0, (v));
69 spin_unlock_irqrestore(&rdev->smc_idx_lock, flags);
70 }
71
72 static const u32 tn_rlc_save_restore_register_list[] =
73 {
74 0x98fc,
75 0x98f0,
76 0x9834,
77 0x9838,
78 0x9870,
79 0x9874,
80 0x8a14,
81 0x8b24,
82 0x8bcc,
83 0x8b10,
84 0x8c30,
85 0x8d00,
86 0x8d04,
87 0x8c00,
88 0x8c04,
89 0x8c10,
90 0x8c14,
91 0x8d8c,
92 0x8cf0,
93 0x8e38,
94 0x9508,
95 0x9688,
96 0x9608,
97 0x960c,
98 0x9610,
99 0x9614,
100 0x88c4,
101 0x8978,
102 0x88d4,
103 0x900c,
104 0x9100,
105 0x913c,
106 0x90e8,
107 0x9354,
108 0xa008,
109 0x98f8,
110 0x9148,
111 0x914c,
112 0x3f94,
113 0x98f4,
114 0x9b7c,
115 0x3f8c,
116 0x8950,
117 0x8954,
118 0x8a18,
119 0x8b28,
120 0x9144,
121 0x3f90,
122 0x915c,
123 0x9160,
124 0x9178,
125 0x917c,
126 0x9180,
127 0x918c,
128 0x9190,
129 0x9194,
130 0x9198,
131 0x919c,
132 0x91a8,
133 0x91ac,
134 0x91b0,
135 0x91b4,
136 0x91b8,
137 0x91c4,
138 0x91c8,
139 0x91cc,
140 0x91d0,
141 0x91d4,
142 0x91e0,
143 0x91e4,
144 0x91ec,
145 0x91f0,
146 0x91f4,
147 0x9200,
148 0x9204,
149 0x929c,
150 0x8030,
151 0x9150,
152 0x9a60,
153 0x920c,
154 0x9210,
155 0x9228,
156 0x922c,
157 0x9244,
158 0x9248,
159 0x91e8,
160 0x9294,
161 0x9208,
162 0x9224,
163 0x9240,
164 0x9220,
165 0x923c,
166 0x9258,
167 0x9744,
168 0xa200,
169 0xa204,
170 0xa208,
171 0xa20c,
172 0x8d58,
173 0x9030,
174 0x9034,
175 0x9038,
176 0x903c,
177 0x9040,
178 0x9654,
179 0x897c,
180 0xa210,
181 0xa214,
182 0x9868,
183 0xa02c,
184 0x9664,
185 0x9698,
186 0x949c,
187 0x8e10,
188 0x8e18,
189 0x8c50,
190 0x8c58,
191 0x8c60,
192 0x8c68,
193 0x89b4,
194 0x9830,
195 0x802c,
196 };
197
198 extern bool evergreen_is_display_hung(struct radeon_device *rdev);
199 extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
200 extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
201 extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
202 extern int evergreen_mc_wait_for_idle(struct radeon_device *rdev);
203 extern void evergreen_mc_program(struct radeon_device *rdev);
204 extern void evergreen_irq_suspend(struct radeon_device *rdev);
205 extern int evergreen_mc_init(struct radeon_device *rdev);
206 extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
207 extern void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
208 extern void evergreen_program_aspm(struct radeon_device *rdev);
209 extern void sumo_rlc_fini(struct radeon_device *rdev);
210 extern int sumo_rlc_init(struct radeon_device *rdev);
211 extern void evergreen_gpu_pci_config_reset(struct radeon_device *rdev);
212
213 /* Firmware Names */
214 MODULE_FIRMWARE("radeon/BARTS_pfp.bin");
215 MODULE_FIRMWARE("radeon/BARTS_me.bin");
216 MODULE_FIRMWARE("radeon/BARTS_mc.bin");
217 MODULE_FIRMWARE("radeon/BARTS_smc.bin");
218 MODULE_FIRMWARE("radeon/BTC_rlc.bin");
219 MODULE_FIRMWARE("radeon/TURKS_pfp.bin");
220 MODULE_FIRMWARE("radeon/TURKS_me.bin");
221 MODULE_FIRMWARE("radeon/TURKS_mc.bin");
222 MODULE_FIRMWARE("radeon/TURKS_smc.bin");
223 MODULE_FIRMWARE("radeon/CAICOS_pfp.bin");
224 MODULE_FIRMWARE("radeon/CAICOS_me.bin");
225 MODULE_FIRMWARE("radeon/CAICOS_mc.bin");
226 MODULE_FIRMWARE("radeon/CAICOS_smc.bin");
227 MODULE_FIRMWARE("radeon/CAYMAN_pfp.bin");
228 MODULE_FIRMWARE("radeon/CAYMAN_me.bin");
229 MODULE_FIRMWARE("radeon/CAYMAN_mc.bin");
230 MODULE_FIRMWARE("radeon/CAYMAN_rlc.bin");
231 MODULE_FIRMWARE("radeon/CAYMAN_smc.bin");
232 MODULE_FIRMWARE("radeon/ARUBA_pfp.bin");
233 MODULE_FIRMWARE("radeon/ARUBA_me.bin");
234 MODULE_FIRMWARE("radeon/ARUBA_rlc.bin");
235
236
237 static const u32 cayman_golden_registers2[] =
238 {
239 0x3e5c, 0xffffffff, 0x00000000,
240 0x3e48, 0xffffffff, 0x00000000,
241 0x3e4c, 0xffffffff, 0x00000000,
242 0x3e64, 0xffffffff, 0x00000000,
243 0x3e50, 0xffffffff, 0x00000000,
244 0x3e60, 0xffffffff, 0x00000000
245 };
246
247 static const u32 cayman_golden_registers[] =
248 {
249 0x5eb4, 0xffffffff, 0x00000002,
250 0x5e78, 0x8f311ff1, 0x001000f0,
251 0x3f90, 0xffff0000, 0xff000000,
252 0x9148, 0xffff0000, 0xff000000,
253 0x3f94, 0xffff0000, 0xff000000,
254 0x914c, 0xffff0000, 0xff000000,
255 0xc78, 0x00000080, 0x00000080,
256 0xbd4, 0x70073777, 0x00011003,
257 0xd02c, 0xbfffff1f, 0x08421000,
258 0xd0b8, 0x73773777, 0x02011003,
259 0x5bc0, 0x00200000, 0x50100000,
260 0x98f8, 0x33773777, 0x02011003,
261 0x98fc, 0xffffffff, 0x76541032,
262 0x7030, 0x31000311, 0x00000011,
263 0x2f48, 0x33773777, 0x42010001,
264 0x6b28, 0x00000010, 0x00000012,
265 0x7728, 0x00000010, 0x00000012,
266 0x10328, 0x00000010, 0x00000012,
267 0x10f28, 0x00000010, 0x00000012,
268 0x11b28, 0x00000010, 0x00000012,
269 0x12728, 0x00000010, 0x00000012,
270 0x240c, 0x000007ff, 0x00000000,
271 0x8a14, 0xf000001f, 0x00000007,
272 0x8b24, 0x3fff3fff, 0x00ff0fff,
273 0x8b10, 0x0000ff0f, 0x00000000,
274 0x28a4c, 0x07ffffff, 0x06000000,
275 0x10c, 0x00000001, 0x00010003,
276 0xa02c, 0xffffffff, 0x0000009b,
277 0x913c, 0x0000010f, 0x01000100,
278 0x8c04, 0xf8ff00ff, 0x40600060,
279 0x28350, 0x00000f01, 0x00000000,
280 0x9508, 0x3700001f, 0x00000002,
281 0x960c, 0xffffffff, 0x54763210,
282 0x88c4, 0x001f3ae3, 0x00000082,
283 0x88d0, 0xffffffff, 0x0f40df40,
284 0x88d4, 0x0000001f, 0x00000010,
285 0x8974, 0xffffffff, 0x00000000
286 };
287
288 static const u32 dvst_golden_registers2[] =
289 {
290 0x8f8, 0xffffffff, 0,
291 0x8fc, 0x00380000, 0,
292 0x8f8, 0xffffffff, 1,
293 0x8fc, 0x0e000000, 0
294 };
295
296 static const u32 dvst_golden_registers[] =
297 {
298 0x690, 0x3fff3fff, 0x20c00033,
299 0x918c, 0x0fff0fff, 0x00010006,
300 0x91a8, 0x0fff0fff, 0x00010006,
301 0x9150, 0xffffdfff, 0x6e944040,
302 0x917c, 0x0fff0fff, 0x00030002,
303 0x9198, 0x0fff0fff, 0x00030002,
304 0x915c, 0x0fff0fff, 0x00010000,
305 0x3f90, 0xffff0001, 0xff000000,
306 0x9178, 0x0fff0fff, 0x00070000,
307 0x9194, 0x0fff0fff, 0x00070000,
308 0x9148, 0xffff0001, 0xff000000,
309 0x9190, 0x0fff0fff, 0x00090008,
310 0x91ac, 0x0fff0fff, 0x00090008,
311 0x3f94, 0xffff0000, 0xff000000,
312 0x914c, 0xffff0000, 0xff000000,
313 0x929c, 0x00000fff, 0x00000001,
314 0x55e4, 0xff607fff, 0xfc000100,
315 0x8a18, 0xff000fff, 0x00000100,
316 0x8b28, 0xff000fff, 0x00000100,
317 0x9144, 0xfffc0fff, 0x00000100,
318 0x6ed8, 0x00010101, 0x00010000,
319 0x9830, 0xffffffff, 0x00000000,
320 0x9834, 0xf00fffff, 0x00000400,
321 0x9838, 0xfffffffe, 0x00000000,
322 0xd0c0, 0xff000fff, 0x00000100,
323 0xd02c, 0xbfffff1f, 0x08421000,
324 0xd0b8, 0x73773777, 0x12010001,
325 0x5bb0, 0x000000f0, 0x00000070,
326 0x98f8, 0x73773777, 0x12010001,
327 0x98fc, 0xffffffff, 0x00000010,
328 0x9b7c, 0x00ff0000, 0x00fc0000,
329 0x8030, 0x00001f0f, 0x0000100a,
330 0x2f48, 0x73773777, 0x12010001,
331 0x2408, 0x00030000, 0x000c007f,
332 0x8a14, 0xf000003f, 0x00000007,
333 0x8b24, 0x3fff3fff, 0x00ff0fff,
334 0x8b10, 0x0000ff0f, 0x00000000,
335 0x28a4c, 0x07ffffff, 0x06000000,
336 0x4d8, 0x00000fff, 0x00000100,
337 0xa008, 0xffffffff, 0x00010000,
338 0x913c, 0xffff03ff, 0x01000100,
339 0x8c00, 0x000000ff, 0x00000003,
340 0x8c04, 0xf8ff00ff, 0x40600060,
341 0x8cf0, 0x1fff1fff, 0x08e00410,
342 0x28350, 0x00000f01, 0x00000000,
343 0x9508, 0xf700071f, 0x00000002,
344 0x960c, 0xffffffff, 0x54763210,
345 0x20ef8, 0x01ff01ff, 0x00000002,
346 0x20e98, 0xfffffbff, 0x00200000,
347 0x2015c, 0xffffffff, 0x00000f40,
348 0x88c4, 0x001f3ae3, 0x00000082,
349 0x8978, 0x3fffffff, 0x04050140,
350 0x88d4, 0x0000001f, 0x00000010,
351 0x8974, 0xffffffff, 0x00000000
352 };
353
354 static const u32 scrapper_golden_registers[] =
355 {
356 0x690, 0x3fff3fff, 0x20c00033,
357 0x918c, 0x0fff0fff, 0x00010006,
358 0x918c, 0x0fff0fff, 0x00010006,
359 0x91a8, 0x0fff0fff, 0x00010006,
360 0x91a8, 0x0fff0fff, 0x00010006,
361 0x9150, 0xffffdfff, 0x6e944040,
362 0x9150, 0xffffdfff, 0x6e944040,
363 0x917c, 0x0fff0fff, 0x00030002,
364 0x917c, 0x0fff0fff, 0x00030002,
365 0x9198, 0x0fff0fff, 0x00030002,
366 0x9198, 0x0fff0fff, 0x00030002,
367 0x915c, 0x0fff0fff, 0x00010000,
368 0x915c, 0x0fff0fff, 0x00010000,
369 0x3f90, 0xffff0001, 0xff000000,
370 0x3f90, 0xffff0001, 0xff000000,
371 0x9178, 0x0fff0fff, 0x00070000,
372 0x9178, 0x0fff0fff, 0x00070000,
373 0x9194, 0x0fff0fff, 0x00070000,
374 0x9194, 0x0fff0fff, 0x00070000,
375 0x9148, 0xffff0001, 0xff000000,
376 0x9148, 0xffff0001, 0xff000000,
377 0x9190, 0x0fff0fff, 0x00090008,
378 0x9190, 0x0fff0fff, 0x00090008,
379 0x91ac, 0x0fff0fff, 0x00090008,
380 0x91ac, 0x0fff0fff, 0x00090008,
381 0x3f94, 0xffff0000, 0xff000000,
382 0x3f94, 0xffff0000, 0xff000000,
383 0x914c, 0xffff0000, 0xff000000,
384 0x914c, 0xffff0000, 0xff000000,
385 0x929c, 0x00000fff, 0x00000001,
386 0x929c, 0x00000fff, 0x00000001,
387 0x55e4, 0xff607fff, 0xfc000100,
388 0x8a18, 0xff000fff, 0x00000100,
389 0x8a18, 0xff000fff, 0x00000100,
390 0x8b28, 0xff000fff, 0x00000100,
391 0x8b28, 0xff000fff, 0x00000100,
392 0x9144, 0xfffc0fff, 0x00000100,
393 0x9144, 0xfffc0fff, 0x00000100,
394 0x6ed8, 0x00010101, 0x00010000,
395 0x9830, 0xffffffff, 0x00000000,
396 0x9830, 0xffffffff, 0x00000000,
397 0x9834, 0xf00fffff, 0x00000400,
398 0x9834, 0xf00fffff, 0x00000400,
399 0x9838, 0xfffffffe, 0x00000000,
400 0x9838, 0xfffffffe, 0x00000000,
401 0xd0c0, 0xff000fff, 0x00000100,
402 0xd02c, 0xbfffff1f, 0x08421000,
403 0xd02c, 0xbfffff1f, 0x08421000,
404 0xd0b8, 0x73773777, 0x12010001,
405 0xd0b8, 0x73773777, 0x12010001,
406 0x5bb0, 0x000000f0, 0x00000070,
407 0x98f8, 0x73773777, 0x12010001,
408 0x98f8, 0x73773777, 0x12010001,
409 0x98fc, 0xffffffff, 0x00000010,
410 0x98fc, 0xffffffff, 0x00000010,
411 0x9b7c, 0x00ff0000, 0x00fc0000,
412 0x9b7c, 0x00ff0000, 0x00fc0000,
413 0x8030, 0x00001f0f, 0x0000100a,
414 0x8030, 0x00001f0f, 0x0000100a,
415 0x2f48, 0x73773777, 0x12010001,
416 0x2f48, 0x73773777, 0x12010001,
417 0x2408, 0x00030000, 0x000c007f,
418 0x8a14, 0xf000003f, 0x00000007,
419 0x8a14, 0xf000003f, 0x00000007,
420 0x8b24, 0x3fff3fff, 0x00ff0fff,
421 0x8b24, 0x3fff3fff, 0x00ff0fff,
422 0x8b10, 0x0000ff0f, 0x00000000,
423 0x8b10, 0x0000ff0f, 0x00000000,
424 0x28a4c, 0x07ffffff, 0x06000000,
425 0x28a4c, 0x07ffffff, 0x06000000,
426 0x4d8, 0x00000fff, 0x00000100,
427 0x4d8, 0x00000fff, 0x00000100,
428 0xa008, 0xffffffff, 0x00010000,
429 0xa008, 0xffffffff, 0x00010000,
430 0x913c, 0xffff03ff, 0x01000100,
431 0x913c, 0xffff03ff, 0x01000100,
432 0x90e8, 0x001fffff, 0x010400c0,
433 0x8c00, 0x000000ff, 0x00000003,
434 0x8c00, 0x000000ff, 0x00000003,
435 0x8c04, 0xf8ff00ff, 0x40600060,
436 0x8c04, 0xf8ff00ff, 0x40600060,
437 0x8c30, 0x0000000f, 0x00040005,
438 0x8cf0, 0x1fff1fff, 0x08e00410,
439 0x8cf0, 0x1fff1fff, 0x08e00410,
440 0x900c, 0x00ffffff, 0x0017071f,
441 0x28350, 0x00000f01, 0x00000000,
442 0x28350, 0x00000f01, 0x00000000,
443 0x9508, 0xf700071f, 0x00000002,
444 0x9508, 0xf700071f, 0x00000002,
445 0x9688, 0x00300000, 0x0017000f,
446 0x960c, 0xffffffff, 0x54763210,
447 0x960c, 0xffffffff, 0x54763210,
448 0x20ef8, 0x01ff01ff, 0x00000002,
449 0x20e98, 0xfffffbff, 0x00200000,
450 0x2015c, 0xffffffff, 0x00000f40,
451 0x88c4, 0x001f3ae3, 0x00000082,
452 0x88c4, 0x001f3ae3, 0x00000082,
453 0x8978, 0x3fffffff, 0x04050140,
454 0x8978, 0x3fffffff, 0x04050140,
455 0x88d4, 0x0000001f, 0x00000010,
456 0x88d4, 0x0000001f, 0x00000010,
457 0x8974, 0xffffffff, 0x00000000,
458 0x8974, 0xffffffff, 0x00000000
459 };
460
461 static void ni_init_golden_registers(struct radeon_device *rdev)
462 {
463 switch (rdev->family) {
464 case CHIP_CAYMAN:
465 radeon_program_register_sequence(rdev,
466 cayman_golden_registers,
467 (const u32)ARRAY_SIZE(cayman_golden_registers));
468 radeon_program_register_sequence(rdev,
469 cayman_golden_registers2,
470 (const u32)ARRAY_SIZE(cayman_golden_registers2));
471 break;
472 case CHIP_ARUBA:
473 if ((rdev->pdev->device == 0x9900) ||
474 (rdev->pdev->device == 0x9901) ||
475 (rdev->pdev->device == 0x9903) ||
476 (rdev->pdev->device == 0x9904) ||
477 (rdev->pdev->device == 0x9905) ||
478 (rdev->pdev->device == 0x9906) ||
479 (rdev->pdev->device == 0x9907) ||
480 (rdev->pdev->device == 0x9908) ||
481 (rdev->pdev->device == 0x9909) ||
482 (rdev->pdev->device == 0x990A) ||
483 (rdev->pdev->device == 0x990B) ||
484 (rdev->pdev->device == 0x990C) ||
485 (rdev->pdev->device == 0x990D) ||
486 (rdev->pdev->device == 0x990E) ||
487 (rdev->pdev->device == 0x990F) ||
488 (rdev->pdev->device == 0x9910) ||
489 (rdev->pdev->device == 0x9913) ||
490 (rdev->pdev->device == 0x9917) ||
491 (rdev->pdev->device == 0x9918)) {
492 radeon_program_register_sequence(rdev,
493 dvst_golden_registers,
494 (const u32)ARRAY_SIZE(dvst_golden_registers));
495 radeon_program_register_sequence(rdev,
496 dvst_golden_registers2,
497 (const u32)ARRAY_SIZE(dvst_golden_registers2));
498 } else {
499 radeon_program_register_sequence(rdev,
500 scrapper_golden_registers,
501 (const u32)ARRAY_SIZE(scrapper_golden_registers));
502 radeon_program_register_sequence(rdev,
503 dvst_golden_registers2,
504 (const u32)ARRAY_SIZE(dvst_golden_registers2));
505 }
506 break;
507 default:
508 break;
509 }
510 }
511
512 #define BTC_IO_MC_REGS_SIZE 29
513
514 static const u32 barts_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
515 {0x00000077, 0xff010100},
516 {0x00000078, 0x00000000},
517 {0x00000079, 0x00001434},
518 {0x0000007a, 0xcc08ec08},
519 {0x0000007b, 0x00040000},
520 {0x0000007c, 0x000080c0},
521 {0x0000007d, 0x09000000},
522 {0x0000007e, 0x00210404},
523 {0x00000081, 0x08a8e800},
524 {0x00000082, 0x00030444},
525 {0x00000083, 0x00000000},
526 {0x00000085, 0x00000001},
527 {0x00000086, 0x00000002},
528 {0x00000087, 0x48490000},
529 {0x00000088, 0x20244647},
530 {0x00000089, 0x00000005},
531 {0x0000008b, 0x66030000},
532 {0x0000008c, 0x00006603},
533 {0x0000008d, 0x00000100},
534 {0x0000008f, 0x00001c0a},
535 {0x00000090, 0xff000001},
536 {0x00000094, 0x00101101},
537 {0x00000095, 0x00000fff},
538 {0x00000096, 0x00116fff},
539 {0x00000097, 0x60010000},
540 {0x00000098, 0x10010000},
541 {0x00000099, 0x00006000},
542 {0x0000009a, 0x00001000},
543 {0x0000009f, 0x00946a00}
544 };
545
546 static const u32 turks_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
547 {0x00000077, 0xff010100},
548 {0x00000078, 0x00000000},
549 {0x00000079, 0x00001434},
550 {0x0000007a, 0xcc08ec08},
551 {0x0000007b, 0x00040000},
552 {0x0000007c, 0x000080c0},
553 {0x0000007d, 0x09000000},
554 {0x0000007e, 0x00210404},
555 {0x00000081, 0x08a8e800},
556 {0x00000082, 0x00030444},
557 {0x00000083, 0x00000000},
558 {0x00000085, 0x00000001},
559 {0x00000086, 0x00000002},
560 {0x00000087, 0x48490000},
561 {0x00000088, 0x20244647},
562 {0x00000089, 0x00000005},
563 {0x0000008b, 0x66030000},
564 {0x0000008c, 0x00006603},
565 {0x0000008d, 0x00000100},
566 {0x0000008f, 0x00001c0a},
567 {0x00000090, 0xff000001},
568 {0x00000094, 0x00101101},
569 {0x00000095, 0x00000fff},
570 {0x00000096, 0x00116fff},
571 {0x00000097, 0x60010000},
572 {0x00000098, 0x10010000},
573 {0x00000099, 0x00006000},
574 {0x0000009a, 0x00001000},
575 {0x0000009f, 0x00936a00}
576 };
577
578 static const u32 caicos_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
579 {0x00000077, 0xff010100},
580 {0x00000078, 0x00000000},
581 {0x00000079, 0x00001434},
582 {0x0000007a, 0xcc08ec08},
583 {0x0000007b, 0x00040000},
584 {0x0000007c, 0x000080c0},
585 {0x0000007d, 0x09000000},
586 {0x0000007e, 0x00210404},
587 {0x00000081, 0x08a8e800},
588 {0x00000082, 0x00030444},
589 {0x00000083, 0x00000000},
590 {0x00000085, 0x00000001},
591 {0x00000086, 0x00000002},
592 {0x00000087, 0x48490000},
593 {0x00000088, 0x20244647},
594 {0x00000089, 0x00000005},
595 {0x0000008b, 0x66030000},
596 {0x0000008c, 0x00006603},
597 {0x0000008d, 0x00000100},
598 {0x0000008f, 0x00001c0a},
599 {0x00000090, 0xff000001},
600 {0x00000094, 0x00101101},
601 {0x00000095, 0x00000fff},
602 {0x00000096, 0x00116fff},
603 {0x00000097, 0x60010000},
604 {0x00000098, 0x10010000},
605 {0x00000099, 0x00006000},
606 {0x0000009a, 0x00001000},
607 {0x0000009f, 0x00916a00}
608 };
609
610 static const u32 cayman_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
611 {0x00000077, 0xff010100},
612 {0x00000078, 0x00000000},
613 {0x00000079, 0x00001434},
614 {0x0000007a, 0xcc08ec08},
615 {0x0000007b, 0x00040000},
616 {0x0000007c, 0x000080c0},
617 {0x0000007d, 0x09000000},
618 {0x0000007e, 0x00210404},
619 {0x00000081, 0x08a8e800},
620 {0x00000082, 0x00030444},
621 {0x00000083, 0x00000000},
622 {0x00000085, 0x00000001},
623 {0x00000086, 0x00000002},
624 {0x00000087, 0x48490000},
625 {0x00000088, 0x20244647},
626 {0x00000089, 0x00000005},
627 {0x0000008b, 0x66030000},
628 {0x0000008c, 0x00006603},
629 {0x0000008d, 0x00000100},
630 {0x0000008f, 0x00001c0a},
631 {0x00000090, 0xff000001},
632 {0x00000094, 0x00101101},
633 {0x00000095, 0x00000fff},
634 {0x00000096, 0x00116fff},
635 {0x00000097, 0x60010000},
636 {0x00000098, 0x10010000},
637 {0x00000099, 0x00006000},
638 {0x0000009a, 0x00001000},
639 {0x0000009f, 0x00976b00}
640 };
641
642 int ni_mc_load_microcode(struct radeon_device *rdev)
643 {
644 const __be32 *fw_data;
645 u32 mem_type, running, blackout = 0;
646 u32 *io_mc_regs;
647 int i, ucode_size, regs_size;
648
649 if (!rdev->mc_fw)
650 return -EINVAL;
651
652 switch (rdev->family) {
653 case CHIP_BARTS:
654 io_mc_regs = (u32 *)&barts_io_mc_regs;
655 ucode_size = BTC_MC_UCODE_SIZE;
656 regs_size = BTC_IO_MC_REGS_SIZE;
657 break;
658 case CHIP_TURKS:
659 io_mc_regs = (u32 *)&turks_io_mc_regs;
660 ucode_size = BTC_MC_UCODE_SIZE;
661 regs_size = BTC_IO_MC_REGS_SIZE;
662 break;
663 case CHIP_CAICOS:
664 default:
665 io_mc_regs = (u32 *)&caicos_io_mc_regs;
666 ucode_size = BTC_MC_UCODE_SIZE;
667 regs_size = BTC_IO_MC_REGS_SIZE;
668 break;
669 case CHIP_CAYMAN:
670 io_mc_regs = (u32 *)&cayman_io_mc_regs;
671 ucode_size = CAYMAN_MC_UCODE_SIZE;
672 regs_size = BTC_IO_MC_REGS_SIZE;
673 break;
674 }
675
676 mem_type = (RREG32(MC_SEQ_MISC0) & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT;
677 running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
678
679 if ((mem_type == MC_SEQ_MISC0_GDDR5_VALUE) && (running == 0)) {
680 if (running) {
681 blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
682 WREG32(MC_SHARED_BLACKOUT_CNTL, 1);
683 }
684
685 /* reset the engine and set to writable */
686 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
687 WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
688
689 /* load mc io regs */
690 for (i = 0; i < regs_size; i++) {
691 WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
692 WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
693 }
694 /* load the MC ucode */
695 fw_data = (const __be32 *)rdev->mc_fw->data;
696 for (i = 0; i < ucode_size; i++)
697 WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
698
699 /* put the engine back into the active state */
700 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
701 WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
702 WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
703
704 /* wait for training to complete */
705 for (i = 0; i < rdev->usec_timeout; i++) {
706 if (RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD)
707 break;
708 udelay(1);
709 }
710
711 if (running)
712 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
713 }
714
715 return 0;
716 }
717
718 int ni_init_microcode(struct radeon_device *rdev)
719 {
720 const char *chip_name;
721 const char *rlc_chip_name;
722 size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size;
723 size_t smc_req_size = 0;
724 char fw_name[30];
725 int err;
726
727 DRM_DEBUG("\n");
728
729 switch (rdev->family) {
730 case CHIP_BARTS:
731 chip_name = "BARTS";
732 rlc_chip_name = "BTC";
733 pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
734 me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
735 rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
736 mc_req_size = BTC_MC_UCODE_SIZE * 4;
737 smc_req_size = ALIGN(BARTS_SMC_UCODE_SIZE, 4);
738 break;
739 case CHIP_TURKS:
740 chip_name = "TURKS";
741 rlc_chip_name = "BTC";
742 pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
743 me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
744 rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
745 mc_req_size = BTC_MC_UCODE_SIZE * 4;
746 smc_req_size = ALIGN(TURKS_SMC_UCODE_SIZE, 4);
747 break;
748 case CHIP_CAICOS:
749 chip_name = "CAICOS";
750 rlc_chip_name = "BTC";
751 pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
752 me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
753 rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
754 mc_req_size = BTC_MC_UCODE_SIZE * 4;
755 smc_req_size = ALIGN(CAICOS_SMC_UCODE_SIZE, 4);
756 break;
757 case CHIP_CAYMAN:
758 chip_name = "CAYMAN";
759 rlc_chip_name = "CAYMAN";
760 pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
761 me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
762 rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4;
763 mc_req_size = CAYMAN_MC_UCODE_SIZE * 4;
764 smc_req_size = ALIGN(CAYMAN_SMC_UCODE_SIZE, 4);
765 break;
766 case CHIP_ARUBA:
767 chip_name = "ARUBA";
768 rlc_chip_name = "ARUBA";
769 /* pfp/me same size as CAYMAN */
770 pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
771 me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
772 rlc_req_size = ARUBA_RLC_UCODE_SIZE * 4;
773 mc_req_size = 0;
774 break;
775 default: BUG();
776 }
777
778 DRM_INFO("Loading %s Microcode\n", chip_name);
779
780 snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
781 err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
782 if (err)
783 goto out;
784 if (rdev->pfp_fw->size != pfp_req_size) {
785 pr_err("ni_cp: Bogus length %zu in firmware \"%s\"\n",
786 rdev->pfp_fw->size, fw_name);
787 err = -EINVAL;
788 goto out;
789 }
790
791 snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
792 err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
793 if (err)
794 goto out;
795 if (rdev->me_fw->size != me_req_size) {
796 pr_err("ni_cp: Bogus length %zu in firmware \"%s\"\n",
797 rdev->me_fw->size, fw_name);
798 err = -EINVAL;
799 }
800
801 snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
802 err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
803 if (err)
804 goto out;
805 if (rdev->rlc_fw->size != rlc_req_size) {
806 pr_err("ni_rlc: Bogus length %zu in firmware \"%s\"\n",
807 rdev->rlc_fw->size, fw_name);
808 err = -EINVAL;
809 }
810
811 /* no MC ucode on TN */
812 if (!(rdev->flags & RADEON_IS_IGP)) {
813 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
814 err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
815 if (err)
816 goto out;
817 if (rdev->mc_fw->size != mc_req_size) {
818 pr_err("ni_mc: Bogus length %zu in firmware \"%s\"\n",
819 rdev->mc_fw->size, fw_name);
820 err = -EINVAL;
821 }
822 }
823
824 if ((rdev->family >= CHIP_BARTS) && (rdev->family <= CHIP_CAYMAN)) {
825 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
826 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
827 if (err) {
828 pr_err("smc: error loading firmware \"%s\"\n", fw_name);
829 release_firmware(rdev->smc_fw);
830 rdev->smc_fw = NULL;
831 err = 0;
832 } else if (rdev->smc_fw->size != smc_req_size) {
833 pr_err("ni_mc: Bogus length %zu in firmware \"%s\"\n",
834 rdev->mc_fw->size, fw_name);
835 err = -EINVAL;
836 }
837 }
838
839 out:
840 if (err) {
841 if (err != -EINVAL)
842 pr_err("ni_cp: Failed to load firmware \"%s\"\n",
843 fw_name);
844 release_firmware(rdev->pfp_fw);
845 rdev->pfp_fw = NULL;
846 release_firmware(rdev->me_fw);
847 rdev->me_fw = NULL;
848 release_firmware(rdev->rlc_fw);
849 rdev->rlc_fw = NULL;
850 release_firmware(rdev->mc_fw);
851 rdev->mc_fw = NULL;
852 }
853 return err;
854 }
855
856 /**
857 * cayman_get_allowed_info_register - fetch the register for the info ioctl
858 *
859 * @rdev: radeon_device pointer
860 * @reg: register offset in bytes
861 * @val: register value
862 *
863 * Returns 0 for success or -EINVAL for an invalid register
864 *
865 */
866 int cayman_get_allowed_info_register(struct radeon_device *rdev,
867 u32 reg, u32 *val)
868 {
869 switch (reg) {
870 case GRBM_STATUS:
871 case GRBM_STATUS_SE0:
872 case GRBM_STATUS_SE1:
873 case SRBM_STATUS:
874 case SRBM_STATUS2:
875 case (DMA_STATUS_REG + DMA0_REGISTER_OFFSET):
876 case (DMA_STATUS_REG + DMA1_REGISTER_OFFSET):
877 case UVD_STATUS:
878 *val = RREG32(reg);
879 return 0;
880 default:
881 return -EINVAL;
882 }
883 }
884
885 int tn_get_temp(struct radeon_device *rdev)
886 {
887 u32 temp = RREG32_SMC(TN_CURRENT_GNB_TEMP) & 0x7ff;
888 int actual_temp = (temp / 8) - 49;
889
890 return actual_temp * 1000;
891 }
892
893 /*
894 * Core functions
895 */
896 static void cayman_gpu_init(struct radeon_device *rdev)
897 {
898 u32 gb_addr_config = 0;
899 u32 mc_shared_chmap, mc_arb_ramcfg;
900 u32 cgts_tcc_disable;
901 u32 sx_debug_1;
902 u32 smx_dc_ctl0;
903 u32 cgts_sm_ctrl_reg;
904 u32 hdp_host_path_cntl;
905 u32 tmp;
906 u32 disabled_rb_mask;
907 int i, j;
908
909 switch (rdev->family) {
910 case CHIP_CAYMAN:
911 rdev->config.cayman.max_shader_engines = 2;
912 rdev->config.cayman.max_pipes_per_simd = 4;
913 rdev->config.cayman.max_tile_pipes = 8;
914 rdev->config.cayman.max_simds_per_se = 12;
915 rdev->config.cayman.max_backends_per_se = 4;
916 rdev->config.cayman.max_texture_channel_caches = 8;
917 rdev->config.cayman.max_gprs = 256;
918 rdev->config.cayman.max_threads = 256;
919 rdev->config.cayman.max_gs_threads = 32;
920 rdev->config.cayman.max_stack_entries = 512;
921 rdev->config.cayman.sx_num_of_sets = 8;
922 rdev->config.cayman.sx_max_export_size = 256;
923 rdev->config.cayman.sx_max_export_pos_size = 64;
924 rdev->config.cayman.sx_max_export_smx_size = 192;
925 rdev->config.cayman.max_hw_contexts = 8;
926 rdev->config.cayman.sq_num_cf_insts = 2;
927
928 rdev->config.cayman.sc_prim_fifo_size = 0x100;
929 rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
930 rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
931 gb_addr_config = CAYMAN_GB_ADDR_CONFIG_GOLDEN;
932 break;
933 case CHIP_ARUBA:
934 default:
935 rdev->config.cayman.max_shader_engines = 1;
936 rdev->config.cayman.max_pipes_per_simd = 4;
937 rdev->config.cayman.max_tile_pipes = 2;
938 if ((rdev->pdev->device == 0x9900) ||
939 (rdev->pdev->device == 0x9901) ||
940 (rdev->pdev->device == 0x9905) ||
941 (rdev->pdev->device == 0x9906) ||
942 (rdev->pdev->device == 0x9907) ||
943 (rdev->pdev->device == 0x9908) ||
944 (rdev->pdev->device == 0x9909) ||
945 (rdev->pdev->device == 0x990B) ||
946 (rdev->pdev->device == 0x990C) ||
947 (rdev->pdev->device == 0x990F) ||
948 (rdev->pdev->device == 0x9910) ||
949 (rdev->pdev->device == 0x9917) ||
950 (rdev->pdev->device == 0x9999) ||
951 (rdev->pdev->device == 0x999C)) {
952 rdev->config.cayman.max_simds_per_se = 6;
953 rdev->config.cayman.max_backends_per_se = 2;
954 rdev->config.cayman.max_hw_contexts = 8;
955 rdev->config.cayman.sx_max_export_size = 256;
956 rdev->config.cayman.sx_max_export_pos_size = 64;
957 rdev->config.cayman.sx_max_export_smx_size = 192;
958 } else if ((rdev->pdev->device == 0x9903) ||
959 (rdev->pdev->device == 0x9904) ||
960 (rdev->pdev->device == 0x990A) ||
961 (rdev->pdev->device == 0x990D) ||
962 (rdev->pdev->device == 0x990E) ||
963 (rdev->pdev->device == 0x9913) ||
964 (rdev->pdev->device == 0x9918) ||
965 (rdev->pdev->device == 0x999D)) {
966 rdev->config.cayman.max_simds_per_se = 4;
967 rdev->config.cayman.max_backends_per_se = 2;
968 rdev->config.cayman.max_hw_contexts = 8;
969 rdev->config.cayman.sx_max_export_size = 256;
970 rdev->config.cayman.sx_max_export_pos_size = 64;
971 rdev->config.cayman.sx_max_export_smx_size = 192;
972 } else if ((rdev->pdev->device == 0x9919) ||
973 (rdev->pdev->device == 0x9990) ||
974 (rdev->pdev->device == 0x9991) ||
975 (rdev->pdev->device == 0x9994) ||
976 (rdev->pdev->device == 0x9995) ||
977 (rdev->pdev->device == 0x9996) ||
978 (rdev->pdev->device == 0x999A) ||
979 (rdev->pdev->device == 0x99A0)) {
980 rdev->config.cayman.max_simds_per_se = 3;
981 rdev->config.cayman.max_backends_per_se = 1;
982 rdev->config.cayman.max_hw_contexts = 4;
983 rdev->config.cayman.sx_max_export_size = 128;
984 rdev->config.cayman.sx_max_export_pos_size = 32;
985 rdev->config.cayman.sx_max_export_smx_size = 96;
986 } else {
987 rdev->config.cayman.max_simds_per_se = 2;
988 rdev->config.cayman.max_backends_per_se = 1;
989 rdev->config.cayman.max_hw_contexts = 4;
990 rdev->config.cayman.sx_max_export_size = 128;
991 rdev->config.cayman.sx_max_export_pos_size = 32;
992 rdev->config.cayman.sx_max_export_smx_size = 96;
993 }
994 rdev->config.cayman.max_texture_channel_caches = 2;
995 rdev->config.cayman.max_gprs = 256;
996 rdev->config.cayman.max_threads = 256;
997 rdev->config.cayman.max_gs_threads = 32;
998 rdev->config.cayman.max_stack_entries = 512;
999 rdev->config.cayman.sx_num_of_sets = 8;
1000 rdev->config.cayman.sq_num_cf_insts = 2;
1001
1002 rdev->config.cayman.sc_prim_fifo_size = 0x40;
1003 rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
1004 rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
1005 gb_addr_config = ARUBA_GB_ADDR_CONFIG_GOLDEN;
1006 break;
1007 }
1008
1009 /* Initialize HDP */
1010 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
1011 WREG32((0x2c14 + j), 0x00000000);
1012 WREG32((0x2c18 + j), 0x00000000);
1013 WREG32((0x2c1c + j), 0x00000000);
1014 WREG32((0x2c20 + j), 0x00000000);
1015 WREG32((0x2c24 + j), 0x00000000);
1016 }
1017
1018 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
1019 WREG32(SRBM_INT_CNTL, 0x1);
1020 WREG32(SRBM_INT_ACK, 0x1);
1021
1022 evergreen_fix_pci_max_read_req_size(rdev);
1023
1024 mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
1025 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1026
1027 tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
1028 rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
1029 if (rdev->config.cayman.mem_row_size_in_kb > 4)
1030 rdev->config.cayman.mem_row_size_in_kb = 4;
1031 /* XXX use MC settings? */
1032 rdev->config.cayman.shader_engine_tile_size = 32;
1033 rdev->config.cayman.num_gpus = 1;
1034 rdev->config.cayman.multi_gpu_tile_size = 64;
1035
1036 tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT;
1037 rdev->config.cayman.num_tile_pipes = (1 << tmp);
1038 tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT;
1039 rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
1040 tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT;
1041 rdev->config.cayman.num_shader_engines = tmp + 1;
1042 tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT;
1043 rdev->config.cayman.num_gpus = tmp + 1;
1044 tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT;
1045 rdev->config.cayman.multi_gpu_tile_size = 1 << tmp;
1046 tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT;
1047 rdev->config.cayman.mem_row_size_in_kb = 1 << tmp;
1048
1049
1050 /* setup tiling info dword. gb_addr_config is not adequate since it does
1051 * not have bank info, so create a custom tiling dword.
1052 * bits 3:0 num_pipes
1053 * bits 7:4 num_banks
1054 * bits 11:8 group_size
1055 * bits 15:12 row_size
1056 */
1057 rdev->config.cayman.tile_config = 0;
1058 switch (rdev->config.cayman.num_tile_pipes) {
1059 case 1:
1060 default:
1061 rdev->config.cayman.tile_config |= (0 << 0);
1062 break;
1063 case 2:
1064 rdev->config.cayman.tile_config |= (1 << 0);
1065 break;
1066 case 4:
1067 rdev->config.cayman.tile_config |= (2 << 0);
1068 break;
1069 case 8:
1070 rdev->config.cayman.tile_config |= (3 << 0);
1071 break;
1072 }
1073
1074 /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */
1075 if (rdev->flags & RADEON_IS_IGP)
1076 rdev->config.cayman.tile_config |= 1 << 4;
1077 else {
1078 switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
1079 case 0: /* four banks */
1080 rdev->config.cayman.tile_config |= 0 << 4;
1081 break;
1082 case 1: /* eight banks */
1083 rdev->config.cayman.tile_config |= 1 << 4;
1084 break;
1085 case 2: /* sixteen banks */
1086 default:
1087 rdev->config.cayman.tile_config |= 2 << 4;
1088 break;
1089 }
1090 }
1091 rdev->config.cayman.tile_config |=
1092 ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
1093 rdev->config.cayman.tile_config |=
1094 ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
1095
1096 tmp = 0;
1097 for (i = (rdev->config.cayman.max_shader_engines - 1); i >= 0; i--) {
1098 u32 rb_disable_bitmap;
1099
1100 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1101 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1102 rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16;
1103 tmp <<= 4;
1104 tmp |= rb_disable_bitmap;
1105 }
1106 /* enabled rb are just the one not disabled :) */
1107 disabled_rb_mask = tmp;
1108 tmp = 0;
1109 for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
1110 tmp |= (1 << i);
1111 /* if all the backends are disabled, fix it up here */
1112 if ((disabled_rb_mask & tmp) == tmp) {
1113 for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
1114 disabled_rb_mask &= ~(1 << i);
1115 }
1116
1117 for (i = 0; i < rdev->config.cayman.max_shader_engines; i++) {
1118 u32 simd_disable_bitmap;
1119
1120 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1121 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1122 simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
1123 simd_disable_bitmap |= 0xffffffff << rdev->config.cayman.max_simds_per_se;
1124 tmp <<= 16;
1125 tmp |= simd_disable_bitmap;
1126 }
1127 rdev->config.cayman.active_simds = hweight32(~tmp);
1128
1129 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1130 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1131
1132 WREG32(GB_ADDR_CONFIG, gb_addr_config);
1133 WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
1134 if (ASIC_IS_DCE6(rdev))
1135 WREG32(DMIF_ADDR_CALC, gb_addr_config);
1136 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
1137 WREG32(DMA_TILING_CONFIG + DMA0_REGISTER_OFFSET, gb_addr_config);
1138 WREG32(DMA_TILING_CONFIG + DMA1_REGISTER_OFFSET, gb_addr_config);
1139 WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
1140 WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
1141 WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
1142
1143 if ((rdev->config.cayman.max_backends_per_se == 1) &&
1144 (rdev->flags & RADEON_IS_IGP)) {
1145 if ((disabled_rb_mask & 3) == 2) {
1146 /* RB1 disabled, RB0 enabled */
1147 tmp = 0x00000000;
1148 } else {
1149 /* RB0 disabled, RB1 enabled */
1150 tmp = 0x11111111;
1151 }
1152 } else {
1153 tmp = gb_addr_config & NUM_PIPES_MASK;
1154 tmp = r6xx_remap_render_backend(rdev, tmp,
1155 rdev->config.cayman.max_backends_per_se *
1156 rdev->config.cayman.max_shader_engines,
1157 CAYMAN_MAX_BACKENDS, disabled_rb_mask);
1158 }
1159 rdev->config.cayman.backend_map = tmp;
1160 WREG32(GB_BACKEND_MAP, tmp);
1161
1162 cgts_tcc_disable = 0xffff0000;
1163 for (i = 0; i < rdev->config.cayman.max_texture_channel_caches; i++)
1164 cgts_tcc_disable &= ~(1 << (16 + i));
1165 WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable);
1166 WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable);
1167 WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable);
1168 WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable);
1169
1170 /* reprogram the shader complex */
1171 cgts_sm_ctrl_reg = RREG32(CGTS_SM_CTRL_REG);
1172 for (i = 0; i < 16; i++)
1173 WREG32(CGTS_SM_CTRL_REG, OVERRIDE);
1174 WREG32(CGTS_SM_CTRL_REG, cgts_sm_ctrl_reg);
1175
1176 /* set HW defaults for 3D engine */
1177 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
1178
1179 sx_debug_1 = RREG32(SX_DEBUG_1);
1180 sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
1181 WREG32(SX_DEBUG_1, sx_debug_1);
1182
1183 smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
1184 smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
1185 smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.cayman.sx_num_of_sets);
1186 WREG32(SMX_DC_CTL0, smx_dc_ctl0);
1187
1188 WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4) | CRC_SIMD_ID_WADDR_DISABLE);
1189
1190 /* need to be explicitly zero-ed */
1191 WREG32(VGT_OFFCHIP_LDS_BASE, 0);
1192 WREG32(SQ_LSTMP_RING_BASE, 0);
1193 WREG32(SQ_HSTMP_RING_BASE, 0);
1194 WREG32(SQ_ESTMP_RING_BASE, 0);
1195 WREG32(SQ_GSTMP_RING_BASE, 0);
1196 WREG32(SQ_VSTMP_RING_BASE, 0);
1197 WREG32(SQ_PSTMP_RING_BASE, 0);
1198
1199 WREG32(TA_CNTL_AUX, DISABLE_CUBE_ANISO);
1200
1201 WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.cayman.sx_max_export_size / 4) - 1) |
1202 POSITION_BUFFER_SIZE((rdev->config.cayman.sx_max_export_pos_size / 4) - 1) |
1203 SMX_BUFFER_SIZE((rdev->config.cayman.sx_max_export_smx_size / 4) - 1)));
1204
1205 WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.cayman.sc_prim_fifo_size) |
1206 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_hiz_tile_fifo_size) |
1207 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_earlyz_tile_fifo_size)));
1208
1209
1210 WREG32(VGT_NUM_INSTANCES, 1);
1211
1212 WREG32(CP_PERFMON_CNTL, 0);
1213
1214 WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.cayman.sq_num_cf_insts) |
1215 FETCH_FIFO_HIWATER(0x4) |
1216 DONE_FIFO_HIWATER(0xe0) |
1217 ALU_UPDATE_FIFO_HIWATER(0x8)));
1218
1219 WREG32(SQ_GPR_RESOURCE_MGMT_1, NUM_CLAUSE_TEMP_GPRS(4));
1220 WREG32(SQ_CONFIG, (VC_ENABLE |
1221 EXPORT_SRC_C |
1222 GFX_PRIO(0) |
1223 CS1_PRIO(0) |
1224 CS2_PRIO(1)));
1225 WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, DYN_GPR_ENABLE);
1226
1227 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1228 FORCE_EOV_MAX_REZ_CNT(255)));
1229
1230 WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
1231 AUTO_INVLD_EN(ES_AND_GS_AUTO));
1232
1233 WREG32(VGT_GS_VERTEX_REUSE, 16);
1234 WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1235
1236 WREG32(CB_PERF_CTR0_SEL_0, 0);
1237 WREG32(CB_PERF_CTR0_SEL_1, 0);
1238 WREG32(CB_PERF_CTR1_SEL_0, 0);
1239 WREG32(CB_PERF_CTR1_SEL_1, 0);
1240 WREG32(CB_PERF_CTR2_SEL_0, 0);
1241 WREG32(CB_PERF_CTR2_SEL_1, 0);
1242 WREG32(CB_PERF_CTR3_SEL_0, 0);
1243 WREG32(CB_PERF_CTR3_SEL_1, 0);
1244
1245 tmp = RREG32(HDP_MISC_CNTL);
1246 tmp |= HDP_FLUSH_INVALIDATE_CACHE;
1247 WREG32(HDP_MISC_CNTL, tmp);
1248
1249 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1250 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1251
1252 WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
1253
1254 udelay(50);
1255
1256 /* set clockgating golden values on TN */
1257 if (rdev->family == CHIP_ARUBA) {
1258 tmp = RREG32_CG(CG_CGTT_LOCAL_0);
1259 tmp &= ~0x00380000;
1260 WREG32_CG(CG_CGTT_LOCAL_0, tmp);
1261 tmp = RREG32_CG(CG_CGTT_LOCAL_1);
1262 tmp &= ~0x0e000000;
1263 WREG32_CG(CG_CGTT_LOCAL_1, tmp);
1264 }
1265 }
1266
1267 /*
1268 * GART
1269 */
1270 void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev)
1271 {
1272 /* flush hdp cache */
1273 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
1274
1275 /* bits 0-7 are the VM contexts0-7 */
1276 WREG32(VM_INVALIDATE_REQUEST, 1);
1277 }
1278
1279 static int cayman_pcie_gart_enable(struct radeon_device *rdev)
1280 {
1281 int i, r;
1282
1283 if (rdev->gart.robj == NULL) {
1284 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
1285 return -EINVAL;
1286 }
1287 r = radeon_gart_table_vram_pin(rdev);
1288 if (r)
1289 return r;
1290 /* Setup TLB control */
1291 WREG32(MC_VM_MX_L1_TLB_CNTL,
1292 (0xA << 7) |
1293 ENABLE_L1_TLB |
1294 ENABLE_L1_FRAGMENT_PROCESSING |
1295 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1296 ENABLE_ADVANCED_DRIVER_MODEL |
1297 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1298 /* Setup L2 cache */
1299 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
1300 ENABLE_L2_FRAGMENT_PROCESSING |
1301 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1302 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1303 EFFECTIVE_L2_QUEUE_SIZE(7) |
1304 CONTEXT1_IDENTITY_ACCESS_MODE(1));
1305 WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
1306 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1307 BANK_SELECT(6) |
1308 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1309 /* setup context0 */
1310 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
1311 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
1312 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
1313 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
1314 (u32)(rdev->dummy_page.addr >> 12));
1315 WREG32(VM_CONTEXT0_CNTL2, 0);
1316 WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
1317 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
1318
1319 WREG32(0x15D4, 0);
1320 WREG32(0x15D8, 0);
1321 WREG32(0x15DC, 0);
1322
1323 /* empty context1-7 */
1324 /* Assign the pt base to something valid for now; the pts used for
1325 * the VMs are determined by the application and setup and assigned
1326 * on the fly in the vm part of radeon_gart.c
1327 */
1328 for (i = 1; i < 8; i++) {
1329 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (i << 2), 0);
1330 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (i << 2),
1331 rdev->vm_manager.max_pfn - 1);
1332 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
1333 rdev->vm_manager.saved_table_addr[i]);
1334 }
1335
1336 /* enable context1-7 */
1337 WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
1338 (u32)(rdev->dummy_page.addr >> 12));
1339 WREG32(VM_CONTEXT1_CNTL2, 4);
1340 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
1341 PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) |
1342 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1343 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1344 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1345 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1346 PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
1347 PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
1348 VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
1349 VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
1350 READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
1351 READ_PROTECTION_FAULT_ENABLE_DEFAULT |
1352 WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1353 WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
1354
1355 cayman_pcie_gart_tlb_flush(rdev);
1356 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
1357 (unsigned)(rdev->mc.gtt_size >> 20),
1358 (unsigned long long)rdev->gart.table_addr);
1359 rdev->gart.ready = true;
1360 return 0;
1361 }
1362
1363 static void cayman_pcie_gart_disable(struct radeon_device *rdev)
1364 {
1365 unsigned i;
1366
1367 for (i = 1; i < 8; ++i) {
1368 rdev->vm_manager.saved_table_addr[i] = RREG32(
1369 VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2));
1370 }
1371
1372 /* Disable all tables */
1373 WREG32(VM_CONTEXT0_CNTL, 0);
1374 WREG32(VM_CONTEXT1_CNTL, 0);
1375 /* Setup TLB control */
1376 WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING |
1377 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1378 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1379 /* Setup L2 cache */
1380 WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1381 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1382 EFFECTIVE_L2_QUEUE_SIZE(7) |
1383 CONTEXT1_IDENTITY_ACCESS_MODE(1));
1384 WREG32(VM_L2_CNTL2, 0);
1385 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1386 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1387 radeon_gart_table_vram_unpin(rdev);
1388 }
1389
1390 static void cayman_pcie_gart_fini(struct radeon_device *rdev)
1391 {
1392 cayman_pcie_gart_disable(rdev);
1393 radeon_gart_table_vram_free(rdev);
1394 radeon_gart_fini(rdev);
1395 }
1396
1397 void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
1398 int ring, u32 cp_int_cntl)
1399 {
1400 WREG32(SRBM_GFX_CNTL, RINGID(ring));
1401 WREG32(CP_INT_CNTL, cp_int_cntl);
1402 }
1403
1404 /*
1405 * CP.
1406 */
1407 void cayman_fence_ring_emit(struct radeon_device *rdev,
1408 struct radeon_fence *fence)
1409 {
1410 struct radeon_ring *ring = &rdev->ring[fence->ring];
1411 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
1412 u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
1413 PACKET3_SH_ACTION_ENA;
1414
1415 /* flush read cache over gart for this vmid */
1416 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1417 radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
1418 radeon_ring_write(ring, 0xFFFFFFFF);
1419 radeon_ring_write(ring, 0);
1420 radeon_ring_write(ring, 10); /* poll interval */
1421 /* EVENT_WRITE_EOP - flush caches, send int */
1422 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
1423 radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
1424 radeon_ring_write(ring, lower_32_bits(addr));
1425 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
1426 radeon_ring_write(ring, fence->seq);
1427 radeon_ring_write(ring, 0);
1428 }
1429
1430 void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
1431 {
1432 struct radeon_ring *ring = &rdev->ring[ib->ring];
1433 unsigned vm_id = ib->vm ? ib->vm->ids[ib->ring].id : 0;
1434 u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
1435 PACKET3_SH_ACTION_ENA;
1436
1437 /* set to DX10/11 mode */
1438 radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
1439 radeon_ring_write(ring, 1);
1440
1441 if (ring->rptr_save_reg) {
1442 uint32_t next_rptr = ring->wptr + 3 + 4 + 8;
1443 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
1444 radeon_ring_write(ring, ((ring->rptr_save_reg -
1445 PACKET3_SET_CONFIG_REG_START) >> 2));
1446 radeon_ring_write(ring, next_rptr);
1447 }
1448
1449 radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
1450 radeon_ring_write(ring,
1451 #ifdef __BIG_ENDIAN
1452 (2 << 0) |
1453 #endif
1454 (ib->gpu_addr & 0xFFFFFFFC));
1455 radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF);
1456 radeon_ring_write(ring, ib->length_dw | (vm_id << 24));
1457
1458 /* flush read cache over gart for this vmid */
1459 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1460 radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
1461 radeon_ring_write(ring, 0xFFFFFFFF);
1462 radeon_ring_write(ring, 0);
1463 radeon_ring_write(ring, (vm_id << 24) | 10); /* poll interval */
1464 }
1465
1466 static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
1467 {
1468 if (enable)
1469 WREG32(CP_ME_CNTL, 0);
1470 else {
1471 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1472 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1473 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1474 WREG32(SCRATCH_UMSK, 0);
1475 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1476 }
1477 }
1478
1479 u32 cayman_gfx_get_rptr(struct radeon_device *rdev,
1480 struct radeon_ring *ring)
1481 {
1482 u32 rptr;
1483
1484 if (rdev->wb.enabled)
1485 rptr = rdev->wb.wb[ring->rptr_offs/4];
1486 else {
1487 if (ring->idx == RADEON_RING_TYPE_GFX_INDEX)
1488 rptr = RREG32(CP_RB0_RPTR);
1489 else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX)
1490 rptr = RREG32(CP_RB1_RPTR);
1491 else
1492 rptr = RREG32(CP_RB2_RPTR);
1493 }
1494
1495 return rptr;
1496 }
1497
1498 u32 cayman_gfx_get_wptr(struct radeon_device *rdev,
1499 struct radeon_ring *ring)
1500 {
1501 u32 wptr;
1502
1503 if (ring->idx == RADEON_RING_TYPE_GFX_INDEX)
1504 wptr = RREG32(CP_RB0_WPTR);
1505 else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX)
1506 wptr = RREG32(CP_RB1_WPTR);
1507 else
1508 wptr = RREG32(CP_RB2_WPTR);
1509
1510 return wptr;
1511 }
1512
1513 void cayman_gfx_set_wptr(struct radeon_device *rdev,
1514 struct radeon_ring *ring)
1515 {
1516 if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) {
1517 WREG32(CP_RB0_WPTR, ring->wptr);
1518 (void)RREG32(CP_RB0_WPTR);
1519 } else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) {
1520 WREG32(CP_RB1_WPTR, ring->wptr);
1521 (void)RREG32(CP_RB1_WPTR);
1522 } else {
1523 WREG32(CP_RB2_WPTR, ring->wptr);
1524 (void)RREG32(CP_RB2_WPTR);
1525 }
1526 }
1527
1528 static int cayman_cp_load_microcode(struct radeon_device *rdev)
1529 {
1530 const __be32 *fw_data;
1531 int i;
1532
1533 if (!rdev->me_fw || !rdev->pfp_fw)
1534 return -EINVAL;
1535
1536 cayman_cp_enable(rdev, false);
1537
1538 fw_data = (const __be32 *)rdev->pfp_fw->data;
1539 WREG32(CP_PFP_UCODE_ADDR, 0);
1540 for (i = 0; i < CAYMAN_PFP_UCODE_SIZE; i++)
1541 WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1542 WREG32(CP_PFP_UCODE_ADDR, 0);
1543
1544 fw_data = (const __be32 *)rdev->me_fw->data;
1545 WREG32(CP_ME_RAM_WADDR, 0);
1546 for (i = 0; i < CAYMAN_PM4_UCODE_SIZE; i++)
1547 WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1548
1549 WREG32(CP_PFP_UCODE_ADDR, 0);
1550 WREG32(CP_ME_RAM_WADDR, 0);
1551 WREG32(CP_ME_RAM_RADDR, 0);
1552 return 0;
1553 }
1554
1555 static int cayman_cp_start(struct radeon_device *rdev)
1556 {
1557 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1558 int r, i;
1559
1560 r = radeon_ring_lock(rdev, ring, 7);
1561 if (r) {
1562 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1563 return r;
1564 }
1565 radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
1566 radeon_ring_write(ring, 0x1);
1567 radeon_ring_write(ring, 0x0);
1568 radeon_ring_write(ring, rdev->config.cayman.max_hw_contexts - 1);
1569 radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
1570 radeon_ring_write(ring, 0);
1571 radeon_ring_write(ring, 0);
1572 radeon_ring_unlock_commit(rdev, ring, false);
1573
1574 cayman_cp_enable(rdev, true);
1575
1576 r = radeon_ring_lock(rdev, ring, cayman_default_size + 19);
1577 if (r) {
1578 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1579 return r;
1580 }
1581
1582 /* setup clear context state */
1583 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1584 radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
1585
1586 for (i = 0; i < cayman_default_size; i++)
1587 radeon_ring_write(ring, cayman_default_state[i]);
1588
1589 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1590 radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
1591
1592 /* set clear context state */
1593 radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
1594 radeon_ring_write(ring, 0);
1595
1596 /* SQ_VTX_BASE_VTX_LOC */
1597 radeon_ring_write(ring, 0xc0026f00);
1598 radeon_ring_write(ring, 0x00000000);
1599 radeon_ring_write(ring, 0x00000000);
1600 radeon_ring_write(ring, 0x00000000);
1601
1602 /* Clear consts */
1603 radeon_ring_write(ring, 0xc0036f00);
1604 radeon_ring_write(ring, 0x00000bc4);
1605 radeon_ring_write(ring, 0xffffffff);
1606 radeon_ring_write(ring, 0xffffffff);
1607 radeon_ring_write(ring, 0xffffffff);
1608
1609 radeon_ring_write(ring, 0xc0026900);
1610 radeon_ring_write(ring, 0x00000316);
1611 radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
1612 radeon_ring_write(ring, 0x00000010); /* */
1613
1614 radeon_ring_unlock_commit(rdev, ring, false);
1615
1616 /* XXX init other rings */
1617
1618 return 0;
1619 }
1620
1621 static void cayman_cp_fini(struct radeon_device *rdev)
1622 {
1623 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1624 cayman_cp_enable(rdev, false);
1625 radeon_ring_fini(rdev, ring);
1626 radeon_scratch_free(rdev, ring->rptr_save_reg);
1627 }
1628
1629 static int cayman_cp_resume(struct radeon_device *rdev)
1630 {
1631 static const int ridx[] = {
1632 RADEON_RING_TYPE_GFX_INDEX,
1633 CAYMAN_RING_TYPE_CP1_INDEX,
1634 CAYMAN_RING_TYPE_CP2_INDEX
1635 };
1636 static const unsigned cp_rb_cntl[] = {
1637 CP_RB0_CNTL,
1638 CP_RB1_CNTL,
1639 CP_RB2_CNTL,
1640 };
1641 static const unsigned cp_rb_rptr_addr[] = {
1642 CP_RB0_RPTR_ADDR,
1643 CP_RB1_RPTR_ADDR,
1644 CP_RB2_RPTR_ADDR
1645 };
1646 static const unsigned cp_rb_rptr_addr_hi[] = {
1647 CP_RB0_RPTR_ADDR_HI,
1648 CP_RB1_RPTR_ADDR_HI,
1649 CP_RB2_RPTR_ADDR_HI
1650 };
1651 static const unsigned cp_rb_base[] = {
1652 CP_RB0_BASE,
1653 CP_RB1_BASE,
1654 CP_RB2_BASE
1655 };
1656 static const unsigned cp_rb_rptr[] = {
1657 CP_RB0_RPTR,
1658 CP_RB1_RPTR,
1659 CP_RB2_RPTR
1660 };
1661 static const unsigned cp_rb_wptr[] = {
1662 CP_RB0_WPTR,
1663 CP_RB1_WPTR,
1664 CP_RB2_WPTR
1665 };
1666 struct radeon_ring *ring;
1667 int i, r;
1668
1669 /* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
1670 WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
1671 SOFT_RESET_PA |
1672 SOFT_RESET_SH |
1673 SOFT_RESET_VGT |
1674 SOFT_RESET_SPI |
1675 SOFT_RESET_SX));
1676 RREG32(GRBM_SOFT_RESET);
1677 mdelay(15);
1678 WREG32(GRBM_SOFT_RESET, 0);
1679 RREG32(GRBM_SOFT_RESET);
1680
1681 WREG32(CP_SEM_WAIT_TIMER, 0x0);
1682 WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
1683
1684 /* Set the write pointer delay */
1685 WREG32(CP_RB_WPTR_DELAY, 0);
1686
1687 WREG32(CP_DEBUG, (1 << 27));
1688
1689 /* set the wb address whether it's enabled or not */
1690 WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
1691 WREG32(SCRATCH_UMSK, 0xff);
1692
1693 for (i = 0; i < 3; ++i) {
1694 uint32_t rb_cntl;
1695 uint64_t addr;
1696
1697 /* Set ring buffer size */
1698 ring = &rdev->ring[ridx[i]];
1699 rb_cntl = order_base_2(ring->ring_size / 8);
1700 rb_cntl |= order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8;
1701 #ifdef __BIG_ENDIAN
1702 rb_cntl |= BUF_SWAP_32BIT;
1703 #endif
1704 WREG32(cp_rb_cntl[i], rb_cntl);
1705
1706 /* set the wb address whether it's enabled or not */
1707 addr = rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET;
1708 WREG32(cp_rb_rptr_addr[i], addr & 0xFFFFFFFC);
1709 WREG32(cp_rb_rptr_addr_hi[i], upper_32_bits(addr) & 0xFF);
1710 }
1711
1712 /* set the rb base addr, this causes an internal reset of ALL rings */
1713 for (i = 0; i < 3; ++i) {
1714 ring = &rdev->ring[ridx[i]];
1715 WREG32(cp_rb_base[i], ring->gpu_addr >> 8);
1716 }
1717
1718 for (i = 0; i < 3; ++i) {
1719 /* Initialize the ring buffer's read and write pointers */
1720 ring = &rdev->ring[ridx[i]];
1721 WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA);
1722
1723 ring->wptr = 0;
1724 WREG32(cp_rb_rptr[i], 0);
1725 WREG32(cp_rb_wptr[i], ring->wptr);
1726
1727 mdelay(1);
1728 WREG32_P(cp_rb_cntl[i], 0, ~RB_RPTR_WR_ENA);
1729 }
1730
1731 /* start the rings */
1732 cayman_cp_start(rdev);
1733 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
1734 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1735 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1736 /* this only test cp0 */
1737 r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
1738 if (r) {
1739 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1740 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1741 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1742 return r;
1743 }
1744
1745 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1746 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
1747
1748 return 0;
1749 }
1750
1751 u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev)
1752 {
1753 u32 reset_mask = 0;
1754 u32 tmp;
1755
1756 /* GRBM_STATUS */
1757 tmp = RREG32(GRBM_STATUS);
1758 if (tmp & (PA_BUSY | SC_BUSY |
1759 SH_BUSY | SX_BUSY |
1760 TA_BUSY | VGT_BUSY |
1761 DB_BUSY | CB_BUSY |
1762 GDS_BUSY | SPI_BUSY |
1763 IA_BUSY | IA_BUSY_NO_DMA))
1764 reset_mask |= RADEON_RESET_GFX;
1765
1766 if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING |
1767 CP_BUSY | CP_COHERENCY_BUSY))
1768 reset_mask |= RADEON_RESET_CP;
1769
1770 if (tmp & GRBM_EE_BUSY)
1771 reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
1772
1773 /* DMA_STATUS_REG 0 */
1774 tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET);
1775 if (!(tmp & DMA_IDLE))
1776 reset_mask |= RADEON_RESET_DMA;
1777
1778 /* DMA_STATUS_REG 1 */
1779 tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET);
1780 if (!(tmp & DMA_IDLE))
1781 reset_mask |= RADEON_RESET_DMA1;
1782
1783 /* SRBM_STATUS2 */
1784 tmp = RREG32(SRBM_STATUS2);
1785 if (tmp & DMA_BUSY)
1786 reset_mask |= RADEON_RESET_DMA;
1787
1788 if (tmp & DMA1_BUSY)
1789 reset_mask |= RADEON_RESET_DMA1;
1790
1791 /* SRBM_STATUS */
1792 tmp = RREG32(SRBM_STATUS);
1793 if (tmp & (RLC_RQ_PENDING | RLC_BUSY))
1794 reset_mask |= RADEON_RESET_RLC;
1795
1796 if (tmp & IH_BUSY)
1797 reset_mask |= RADEON_RESET_IH;
1798
1799 if (tmp & SEM_BUSY)
1800 reset_mask |= RADEON_RESET_SEM;
1801
1802 if (tmp & GRBM_RQ_PENDING)
1803 reset_mask |= RADEON_RESET_GRBM;
1804
1805 if (tmp & VMC_BUSY)
1806 reset_mask |= RADEON_RESET_VMC;
1807
1808 if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
1809 MCC_BUSY | MCD_BUSY))
1810 reset_mask |= RADEON_RESET_MC;
1811
1812 if (evergreen_is_display_hung(rdev))
1813 reset_mask |= RADEON_RESET_DISPLAY;
1814
1815 /* VM_L2_STATUS */
1816 tmp = RREG32(VM_L2_STATUS);
1817 if (tmp & L2_BUSY)
1818 reset_mask |= RADEON_RESET_VMC;
1819
1820 /* Skip MC reset as it's mostly likely not hung, just busy */
1821 if (reset_mask & RADEON_RESET_MC) {
1822 DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
1823 reset_mask &= ~RADEON_RESET_MC;
1824 }
1825
1826 return reset_mask;
1827 }
1828
1829 static void cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
1830 {
1831 struct evergreen_mc_save save;
1832 u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
1833 u32 tmp;
1834
1835 if (reset_mask == 0)
1836 return;
1837
1838 dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
1839
1840 evergreen_print_gpu_status_regs(rdev);
1841 dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_ADDR 0x%08X\n",
1842 RREG32(0x14F8));
1843 dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n",
1844 RREG32(0x14D8));
1845 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
1846 RREG32(0x14FC));
1847 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
1848 RREG32(0x14DC));
1849
1850 /* Disable CP parsing/prefetching */
1851 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
1852
1853 if (reset_mask & RADEON_RESET_DMA) {
1854 /* dma0 */
1855 tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
1856 tmp &= ~DMA_RB_ENABLE;
1857 WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp);
1858 }
1859
1860 if (reset_mask & RADEON_RESET_DMA1) {
1861 /* dma1 */
1862 tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
1863 tmp &= ~DMA_RB_ENABLE;
1864 WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp);
1865 }
1866
1867 udelay(50);
1868
1869 evergreen_mc_stop(rdev, &save);
1870 if (evergreen_mc_wait_for_idle(rdev)) {
1871 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1872 }
1873
1874 if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) {
1875 grbm_soft_reset = SOFT_RESET_CB |
1876 SOFT_RESET_DB |
1877 SOFT_RESET_GDS |
1878 SOFT_RESET_PA |
1879 SOFT_RESET_SC |
1880 SOFT_RESET_SPI |
1881 SOFT_RESET_SH |
1882 SOFT_RESET_SX |
1883 SOFT_RESET_TC |
1884 SOFT_RESET_TA |
1885 SOFT_RESET_VGT |
1886 SOFT_RESET_IA;
1887 }
1888
1889 if (reset_mask & RADEON_RESET_CP) {
1890 grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT;
1891
1892 srbm_soft_reset |= SOFT_RESET_GRBM;
1893 }
1894
1895 if (reset_mask & RADEON_RESET_DMA)
1896 srbm_soft_reset |= SOFT_RESET_DMA;
1897
1898 if (reset_mask & RADEON_RESET_DMA1)
1899 srbm_soft_reset |= SOFT_RESET_DMA1;
1900
1901 if (reset_mask & RADEON_RESET_DISPLAY)
1902 srbm_soft_reset |= SOFT_RESET_DC;
1903
1904 if (reset_mask & RADEON_RESET_RLC)
1905 srbm_soft_reset |= SOFT_RESET_RLC;
1906
1907 if (reset_mask & RADEON_RESET_SEM)
1908 srbm_soft_reset |= SOFT_RESET_SEM;
1909
1910 if (reset_mask & RADEON_RESET_IH)
1911 srbm_soft_reset |= SOFT_RESET_IH;
1912
1913 if (reset_mask & RADEON_RESET_GRBM)
1914 srbm_soft_reset |= SOFT_RESET_GRBM;
1915
1916 if (reset_mask & RADEON_RESET_VMC)
1917 srbm_soft_reset |= SOFT_RESET_VMC;
1918
1919 if (!(rdev->flags & RADEON_IS_IGP)) {
1920 if (reset_mask & RADEON_RESET_MC)
1921 srbm_soft_reset |= SOFT_RESET_MC;
1922 }
1923
1924 if (grbm_soft_reset) {
1925 tmp = RREG32(GRBM_SOFT_RESET);
1926 tmp |= grbm_soft_reset;
1927 dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
1928 WREG32(GRBM_SOFT_RESET, tmp);
1929 tmp = RREG32(GRBM_SOFT_RESET);
1930
1931 udelay(50);
1932
1933 tmp &= ~grbm_soft_reset;
1934 WREG32(GRBM_SOFT_RESET, tmp);
1935 tmp = RREG32(GRBM_SOFT_RESET);
1936 }
1937
1938 if (srbm_soft_reset) {
1939 tmp = RREG32(SRBM_SOFT_RESET);
1940 tmp |= srbm_soft_reset;
1941 dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
1942 WREG32(SRBM_SOFT_RESET, tmp);
1943 tmp = RREG32(SRBM_SOFT_RESET);
1944
1945 udelay(50);
1946
1947 tmp &= ~srbm_soft_reset;
1948 WREG32(SRBM_SOFT_RESET, tmp);
1949 tmp = RREG32(SRBM_SOFT_RESET);
1950 }
1951
1952 /* Wait a little for things to settle down */
1953 udelay(50);
1954
1955 evergreen_mc_resume(rdev, &save);
1956 udelay(50);
1957
1958 evergreen_print_gpu_status_regs(rdev);
1959 }
1960
1961 int cayman_asic_reset(struct radeon_device *rdev, bool hard)
1962 {
1963 u32 reset_mask;
1964
1965 if (hard) {
1966 evergreen_gpu_pci_config_reset(rdev);
1967 return 0;
1968 }
1969
1970 reset_mask = cayman_gpu_check_soft_reset(rdev);
1971
1972 if (reset_mask)
1973 r600_set_bios_scratch_engine_hung(rdev, true);
1974
1975 cayman_gpu_soft_reset(rdev, reset_mask);
1976
1977 reset_mask = cayman_gpu_check_soft_reset(rdev);
1978
1979 if (reset_mask)
1980 evergreen_gpu_pci_config_reset(rdev);
1981
1982 r600_set_bios_scratch_engine_hung(rdev, false);
1983
1984 return 0;
1985 }
1986
1987 /**
1988 * cayman_gfx_is_lockup - Check if the GFX engine is locked up
1989 *
1990 * @rdev: radeon_device pointer
1991 * @ring: radeon_ring structure holding ring information
1992 *
1993 * Check if the GFX engine is locked up.
1994 * Returns true if the engine appears to be locked up, false if not.
1995 */
1996 bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
1997 {
1998 u32 reset_mask = cayman_gpu_check_soft_reset(rdev);
1999
2000 if (!(reset_mask & (RADEON_RESET_GFX |
2001 RADEON_RESET_COMPUTE |
2002 RADEON_RESET_CP))) {
2003 radeon_ring_lockup_update(rdev, ring);
2004 return false;
2005 }
2006 return radeon_ring_test_lockup(rdev, ring);
2007 }
2008
2009 static void cayman_uvd_init(struct radeon_device *rdev)
2010 {
2011 int r;
2012
2013 if (!rdev->has_uvd)
2014 return;
2015
2016 r = radeon_uvd_init(rdev);
2017 if (r) {
2018 dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
2019 /*
2020 * At this point rdev->uvd.vcpu_bo is NULL which trickles down
2021 * to early fails uvd_v2_2_resume() and thus nothing happens
2022 * there. So it is pointless to try to go through that code
2023 * hence why we disable uvd here.
2024 */
2025 rdev->has_uvd = false;
2026 return;
2027 }
2028 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
2029 r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
2030 }
2031
2032 static void cayman_uvd_start(struct radeon_device *rdev)
2033 {
2034 int r;
2035
2036 if (!rdev->has_uvd)
2037 return;
2038
2039 r = uvd_v2_2_resume(rdev);
2040 if (r) {
2041 dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
2042 goto error;
2043 }
2044 r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
2045 if (r) {
2046 dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
2047 goto error;
2048 }
2049 return;
2050
2051 error:
2052 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
2053 }
2054
2055 static void cayman_uvd_resume(struct radeon_device *rdev)
2056 {
2057 struct radeon_ring *ring;
2058 int r;
2059
2060 if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
2061 return;
2062
2063 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
2064 r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0));
2065 if (r) {
2066 dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
2067 return;
2068 }
2069 r = uvd_v1_0_init(rdev);
2070 if (r) {
2071 dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
2072 return;
2073 }
2074 }
2075
2076 static void cayman_vce_init(struct radeon_device *rdev)
2077 {
2078 int r;
2079
2080 /* Only set for CHIP_ARUBA */
2081 if (!rdev->has_vce)
2082 return;
2083
2084 r = radeon_vce_init(rdev);
2085 if (r) {
2086 dev_err(rdev->dev, "failed VCE (%d) init.\n", r);
2087 /*
2088 * At this point rdev->vce.vcpu_bo is NULL which trickles down
2089 * to early fails cayman_vce_start() and thus nothing happens
2090 * there. So it is pointless to try to go through that code
2091 * hence why we disable vce here.
2092 */
2093 rdev->has_vce = false;
2094 return;
2095 }
2096 rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_obj = NULL;
2097 r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE1_INDEX], 4096);
2098 rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_obj = NULL;
2099 r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE2_INDEX], 4096);
2100 }
2101
2102 static void cayman_vce_start(struct radeon_device *rdev)
2103 {
2104 int r;
2105
2106 if (!rdev->has_vce)
2107 return;
2108
2109 r = radeon_vce_resume(rdev);
2110 if (r) {
2111 dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
2112 goto error;
2113 }
2114 r = vce_v1_0_resume(rdev);
2115 if (r) {
2116 dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
2117 goto error;
2118 }
2119 r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE1_INDEX);
2120 if (r) {
2121 dev_err(rdev->dev, "failed initializing VCE1 fences (%d).\n", r);
2122 goto error;
2123 }
2124 r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE2_INDEX);
2125 if (r) {
2126 dev_err(rdev->dev, "failed initializing VCE2 fences (%d).\n", r);
2127 goto error;
2128 }
2129 return;
2130
2131 error:
2132 rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
2133 rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
2134 }
2135
2136 static void cayman_vce_resume(struct radeon_device *rdev)
2137 {
2138 struct radeon_ring *ring;
2139 int r;
2140
2141 if (!rdev->has_vce || !rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size)
2142 return;
2143
2144 ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
2145 r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0);
2146 if (r) {
2147 dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
2148 return;
2149 }
2150 ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
2151 r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0);
2152 if (r) {
2153 dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
2154 return;
2155 }
2156 r = vce_v1_0_init(rdev);
2157 if (r) {
2158 dev_err(rdev->dev, "failed initializing VCE (%d).\n", r);
2159 return;
2160 }
2161 }
2162
2163 static int cayman_startup(struct radeon_device *rdev)
2164 {
2165 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2166 int r;
2167
2168 /* enable pcie gen2 link */
2169 evergreen_pcie_gen2_enable(rdev);
2170 /* enable aspm */
2171 evergreen_program_aspm(rdev);
2172
2173 /* scratch needs to be initialized before MC */
2174 r = r600_vram_scratch_init(rdev);
2175 if (r)
2176 return r;
2177
2178 evergreen_mc_program(rdev);
2179
2180 if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) {
2181 r = ni_mc_load_microcode(rdev);
2182 if (r) {
2183 DRM_ERROR("Failed to load MC firmware!\n");
2184 return r;
2185 }
2186 }
2187
2188 r = cayman_pcie_gart_enable(rdev);
2189 if (r)
2190 return r;
2191 cayman_gpu_init(rdev);
2192
2193 /* allocate rlc buffers */
2194 if (rdev->flags & RADEON_IS_IGP) {
2195 rdev->rlc.reg_list = tn_rlc_save_restore_register_list;
2196 rdev->rlc.reg_list_size =
2197 (u32)ARRAY_SIZE(tn_rlc_save_restore_register_list);
2198 rdev->rlc.cs_data = cayman_cs_data;
2199 r = sumo_rlc_init(rdev);
2200 if (r) {
2201 DRM_ERROR("Failed to init rlc BOs!\n");
2202 return r;
2203 }
2204 }
2205
2206 /* allocate wb buffer */
2207 r = radeon_wb_init(rdev);
2208 if (r)
2209 return r;
2210
2211 r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
2212 if (r) {
2213 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
2214 return r;
2215 }
2216
2217 cayman_uvd_start(rdev);
2218 cayman_vce_start(rdev);
2219
2220 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
2221 if (r) {
2222 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
2223 return r;
2224 }
2225
2226 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
2227 if (r) {
2228 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
2229 return r;
2230 }
2231
2232 r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
2233 if (r) {
2234 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
2235 return r;
2236 }
2237
2238 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
2239 if (r) {
2240 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
2241 return r;
2242 }
2243
2244 /* Enable IRQ */
2245 if (!rdev->irq.installed) {
2246 r = radeon_irq_kms_init(rdev);
2247 if (r)
2248 return r;
2249 }
2250
2251 r = r600_irq_init(rdev);
2252 if (r) {
2253 DRM_ERROR("radeon: IH init failed (%d).\n", r);
2254 radeon_irq_kms_fini(rdev);
2255 return r;
2256 }
2257 evergreen_irq_set(rdev);
2258
2259 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
2260 RADEON_CP_PACKET2);
2261 if (r)
2262 return r;
2263
2264 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2265 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
2266 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2267 if (r)
2268 return r;
2269
2270 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
2271 r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
2272 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2273 if (r)
2274 return r;
2275
2276 r = cayman_cp_load_microcode(rdev);
2277 if (r)
2278 return r;
2279 r = cayman_cp_resume(rdev);
2280 if (r)
2281 return r;
2282
2283 r = cayman_dma_resume(rdev);
2284 if (r)
2285 return r;
2286
2287 cayman_uvd_resume(rdev);
2288 cayman_vce_resume(rdev);
2289
2290 r = radeon_ib_pool_init(rdev);
2291 if (r) {
2292 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
2293 return r;
2294 }
2295
2296 r = radeon_vm_manager_init(rdev);
2297 if (r) {
2298 dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
2299 return r;
2300 }
2301
2302 r = radeon_audio_init(rdev);
2303 if (r)
2304 return r;
2305
2306 return 0;
2307 }
2308
2309 int cayman_resume(struct radeon_device *rdev)
2310 {
2311 int r;
2312
2313 /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
2314 * posting will perform necessary task to bring back GPU into good
2315 * shape.
2316 */
2317 /* post card */
2318 atom_asic_init(rdev->mode_info.atom_context);
2319
2320 /* init golden registers */
2321 ni_init_golden_registers(rdev);
2322
2323 if (rdev->pm.pm_method == PM_METHOD_DPM)
2324 radeon_pm_resume(rdev);
2325
2326 rdev->accel_working = true;
2327 r = cayman_startup(rdev);
2328 if (r) {
2329 DRM_ERROR("cayman startup failed on resume\n");
2330 rdev->accel_working = false;
2331 return r;
2332 }
2333 return r;
2334 }
2335
2336 int cayman_suspend(struct radeon_device *rdev)
2337 {
2338 radeon_pm_suspend(rdev);
2339 radeon_audio_fini(rdev);
2340 radeon_vm_manager_fini(rdev);
2341 cayman_cp_enable(rdev, false);
2342 cayman_dma_stop(rdev);
2343 if (rdev->has_uvd) {
2344 uvd_v1_0_fini(rdev);
2345 radeon_uvd_suspend(rdev);
2346 }
2347 evergreen_irq_suspend(rdev);
2348 radeon_wb_disable(rdev);
2349 cayman_pcie_gart_disable(rdev);
2350 return 0;
2351 }
2352
2353 /* Plan is to move initialization in that function and use
2354 * helper function so that radeon_device_init pretty much
2355 * do nothing more than calling asic specific function. This
2356 * should also allow to remove a bunch of callback function
2357 * like vram_info.
2358 */
2359 int cayman_init(struct radeon_device *rdev)
2360 {
2361 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2362 int r;
2363
2364 /* Read BIOS */
2365 if (!radeon_get_bios(rdev)) {
2366 if (ASIC_IS_AVIVO(rdev))
2367 return -EINVAL;
2368 }
2369 /* Must be an ATOMBIOS */
2370 if (!rdev->is_atom_bios) {
2371 dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
2372 return -EINVAL;
2373 }
2374 r = radeon_atombios_init(rdev);
2375 if (r)
2376 return r;
2377
2378 /* Post card if necessary */
2379 if (!radeon_card_posted(rdev)) {
2380 if (!rdev->bios) {
2381 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
2382 return -EINVAL;
2383 }
2384 DRM_INFO("GPU not posted. posting now...\n");
2385 atom_asic_init(rdev->mode_info.atom_context);
2386 }
2387 /* init golden registers */
2388 ni_init_golden_registers(rdev);
2389 /* Initialize scratch registers */
2390 r600_scratch_init(rdev);
2391 /* Initialize surface registers */
2392 radeon_surface_init(rdev);
2393 /* Initialize clocks */
2394 radeon_get_clock_info(rdev->ddev);
2395 /* Fence driver */
2396 r = radeon_fence_driver_init(rdev);
2397 if (r)
2398 return r;
2399 /* initialize memory controller */
2400 r = evergreen_mc_init(rdev);
2401 if (r)
2402 return r;
2403 /* Memory manager */
2404 r = radeon_bo_init(rdev);
2405 if (r)
2406 return r;
2407
2408 if (rdev->flags & RADEON_IS_IGP) {
2409 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
2410 r = ni_init_microcode(rdev);
2411 if (r) {
2412 DRM_ERROR("Failed to load firmware!\n");
2413 return r;
2414 }
2415 }
2416 } else {
2417 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
2418 r = ni_init_microcode(rdev);
2419 if (r) {
2420 DRM_ERROR("Failed to load firmware!\n");
2421 return r;
2422 }
2423 }
2424 }
2425
2426 /* Initialize power management */
2427 radeon_pm_init(rdev);
2428
2429 ring->ring_obj = NULL;
2430 r600_ring_init(rdev, ring, 1024 * 1024);
2431
2432 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2433 ring->ring_obj = NULL;
2434 r600_ring_init(rdev, ring, 64 * 1024);
2435
2436 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
2437 ring->ring_obj = NULL;
2438 r600_ring_init(rdev, ring, 64 * 1024);
2439
2440 cayman_uvd_init(rdev);
2441 cayman_vce_init(rdev);
2442
2443 rdev->ih.ring_obj = NULL;
2444 r600_ih_ring_init(rdev, 64 * 1024);
2445
2446 r = r600_pcie_gart_init(rdev);
2447 if (r)
2448 return r;
2449
2450 rdev->accel_working = true;
2451 r = cayman_startup(rdev);
2452 if (r) {
2453 dev_err(rdev->dev, "disabling GPU acceleration\n");
2454 cayman_cp_fini(rdev);
2455 cayman_dma_fini(rdev);
2456 r600_irq_fini(rdev);
2457 if (rdev->flags & RADEON_IS_IGP)
2458 sumo_rlc_fini(rdev);
2459 radeon_wb_fini(rdev);
2460 radeon_ib_pool_fini(rdev);
2461 radeon_vm_manager_fini(rdev);
2462 radeon_irq_kms_fini(rdev);
2463 cayman_pcie_gart_fini(rdev);
2464 rdev->accel_working = false;
2465 }
2466
2467 /* Don't start up if the MC ucode is missing.
2468 * The default clocks and voltages before the MC ucode
2469 * is loaded are not suffient for advanced operations.
2470 *
2471 * We can skip this check for TN, because there is no MC
2472 * ucode.
2473 */
2474 if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
2475 DRM_ERROR("radeon: MC ucode required for NI+.\n");
2476 return -EINVAL;
2477 }
2478
2479 return 0;
2480 }
2481
2482 void cayman_fini(struct radeon_device *rdev)
2483 {
2484 radeon_pm_fini(rdev);
2485 cayman_cp_fini(rdev);
2486 cayman_dma_fini(rdev);
2487 r600_irq_fini(rdev);
2488 if (rdev->flags & RADEON_IS_IGP)
2489 sumo_rlc_fini(rdev);
2490 radeon_wb_fini(rdev);
2491 radeon_vm_manager_fini(rdev);
2492 radeon_ib_pool_fini(rdev);
2493 radeon_irq_kms_fini(rdev);
2494 uvd_v1_0_fini(rdev);
2495 radeon_uvd_fini(rdev);
2496 if (rdev->has_vce)
2497 radeon_vce_fini(rdev);
2498 cayman_pcie_gart_fini(rdev);
2499 r600_vram_scratch_fini(rdev);
2500 radeon_gem_fini(rdev);
2501 radeon_fence_driver_fini(rdev);
2502 radeon_bo_fini(rdev);
2503 radeon_atombios_fini(rdev);
2504 kfree(rdev->bios);
2505 rdev->bios = NULL;
2506 }
2507
2508 /*
2509 * vm
2510 */
2511 int cayman_vm_init(struct radeon_device *rdev)
2512 {
2513 /* number of VMs */
2514 rdev->vm_manager.nvm = 8;
2515 /* base offset of vram pages */
2516 if (rdev->flags & RADEON_IS_IGP) {
2517 u64 tmp = RREG32(FUS_MC_VM_FB_OFFSET);
2518 tmp <<= 22;
2519 rdev->vm_manager.vram_base_offset = tmp;
2520 } else
2521 rdev->vm_manager.vram_base_offset = 0;
2522 return 0;
2523 }
2524
2525 void cayman_vm_fini(struct radeon_device *rdev)
2526 {
2527 }
2528
2529 /**
2530 * cayman_vm_decode_fault - print human readable fault info
2531 *
2532 * @rdev: radeon_device pointer
2533 * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
2534 * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
2535 *
2536 * Print human readable fault information (cayman/TN).
2537 */
2538 void cayman_vm_decode_fault(struct radeon_device *rdev,
2539 u32 status, u32 addr)
2540 {
2541 u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
2542 u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
2543 u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
2544 char *block;
2545
2546 switch (mc_id) {
2547 case 32:
2548 case 16:
2549 case 96:
2550 case 80:
2551 case 160:
2552 case 144:
2553 case 224:
2554 case 208:
2555 block = "CB";
2556 break;
2557 case 33:
2558 case 17:
2559 case 97:
2560 case 81:
2561 case 161:
2562 case 145:
2563 case 225:
2564 case 209:
2565 block = "CB_FMASK";
2566 break;
2567 case 34:
2568 case 18:
2569 case 98:
2570 case 82:
2571 case 162:
2572 case 146:
2573 case 226:
2574 case 210:
2575 block = "CB_CMASK";
2576 break;
2577 case 35:
2578 case 19:
2579 case 99:
2580 case 83:
2581 case 163:
2582 case 147:
2583 case 227:
2584 case 211:
2585 block = "CB_IMMED";
2586 break;
2587 case 36:
2588 case 20:
2589 case 100:
2590 case 84:
2591 case 164:
2592 case 148:
2593 case 228:
2594 case 212:
2595 block = "DB";
2596 break;
2597 case 37:
2598 case 21:
2599 case 101:
2600 case 85:
2601 case 165:
2602 case 149:
2603 case 229:
2604 case 213:
2605 block = "DB_HTILE";
2606 break;
2607 case 38:
2608 case 22:
2609 case 102:
2610 case 86:
2611 case 166:
2612 case 150:
2613 case 230:
2614 case 214:
2615 block = "SX";
2616 break;
2617 case 39:
2618 case 23:
2619 case 103:
2620 case 87:
2621 case 167:
2622 case 151:
2623 case 231:
2624 case 215:
2625 block = "DB_STEN";
2626 break;
2627 case 40:
2628 case 24:
2629 case 104:
2630 case 88:
2631 case 232:
2632 case 216:
2633 case 168:
2634 case 152:
2635 block = "TC_TFETCH";
2636 break;
2637 case 41:
2638 case 25:
2639 case 105:
2640 case 89:
2641 case 233:
2642 case 217:
2643 case 169:
2644 case 153:
2645 block = "TC_VFETCH";
2646 break;
2647 case 42:
2648 case 26:
2649 case 106:
2650 case 90:
2651 case 234:
2652 case 218:
2653 case 170:
2654 case 154:
2655 block = "VC";
2656 break;
2657 case 112:
2658 block = "CP";
2659 break;
2660 case 113:
2661 case 114:
2662 block = "SH";
2663 break;
2664 case 115:
2665 block = "VGT";
2666 break;
2667 case 178:
2668 block = "IH";
2669 break;
2670 case 51:
2671 block = "RLC";
2672 break;
2673 case 55:
2674 block = "DMA";
2675 break;
2676 case 56:
2677 block = "HDP";
2678 break;
2679 default:
2680 block = "unknown";
2681 break;
2682 }
2683
2684 printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n",
2685 protections, vmid, addr,
2686 (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
2687 block, mc_id);
2688 }
2689
2690 /**
2691 * cayman_vm_flush - vm flush using the CP
2692 *
2693 * @rdev: radeon_device pointer
2694 *
2695 * Update the page table base and flush the VM TLB
2696 * using the CP (cayman-si).
2697 */
2698 void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
2699 unsigned vm_id, uint64_t pd_addr)
2700 {
2701 radeon_ring_write(ring, PACKET0(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2), 0));
2702 radeon_ring_write(ring, pd_addr >> 12);
2703
2704 /* flush hdp cache */
2705 radeon_ring_write(ring, PACKET0(HDP_MEM_COHERENCY_FLUSH_CNTL, 0));
2706 radeon_ring_write(ring, 0x1);
2707
2708 /* bits 0-7 are the VM contexts0-7 */
2709 radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0));
2710 radeon_ring_write(ring, 1 << vm_id);
2711
2712 /* wait for the invalidate to complete */
2713 radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
2714 radeon_ring_write(ring, (WAIT_REG_MEM_FUNCTION(0) | /* always */
2715 WAIT_REG_MEM_ENGINE(0))); /* me */
2716 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
2717 radeon_ring_write(ring, 0);
2718 radeon_ring_write(ring, 0); /* ref */
2719 radeon_ring_write(ring, 0); /* mask */
2720 radeon_ring_write(ring, 0x20); /* poll interval */
2721
2722 /* sync PFP to ME, otherwise we might get invalid PFP reads */
2723 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
2724 radeon_ring_write(ring, 0x0);
2725 }
2726
2727 int tn_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk)
2728 {
2729 struct atom_clock_dividers dividers;
2730 int r, i;
2731
2732 r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
2733 ecclk, false, ÷rs);
2734 if (r)
2735 return r;
2736
2737 for (i = 0; i < 100; i++) {
2738 if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS)
2739 break;
2740 mdelay(10);
2741 }
2742 if (i == 100)
2743 return -ETIMEDOUT;
2744
2745 WREG32_P(CG_ECLK_CNTL, dividers.post_div, ~(ECLK_DIR_CNTL_EN|ECLK_DIVIDER_MASK));
2746
2747 for (i = 0; i < 100; i++) {
2748 if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS)
2749 break;
2750 mdelay(10);
2751 }
2752 if (i == 100)
2753 return -ETIMEDOUT;
2754
2755 return 0;
2756 }
2757