2 * Copyright 2010 Advanced Micro Devices, Inc.
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:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
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.
22 * Authors: Alex Deucher
24 #include <linux/firmware.h>
25 #include <linux/slab.h>
26 #include <linux/module.h>
29 #include "radeon_asic.h"
30 #include "radeon_audio.h"
31 #include <drm/radeon_drm.h>
35 #include "cayman_blit_shaders.h"
36 #include "radeon_ucode.h"
37 #include "clearstate_cayman.h"
40 * Indirect registers accessor
42 u32 tn_smc_rreg(struct radeon_device *rdev, u32 reg)
47 spin_lock_irqsave(&rdev->smc_idx_lock, flags);
48 WREG32(TN_SMC_IND_INDEX_0, (reg));
49 r = RREG32(TN_SMC_IND_DATA_0);
50 spin_unlock_irqrestore(&rdev->smc_idx_lock, flags);
54 void tn_smc_wreg(struct radeon_device *rdev, u32 reg, u32 v)
58 spin_lock_irqsave(&rdev->smc_idx_lock, flags);
59 WREG32(TN_SMC_IND_INDEX_0, (reg));
60 WREG32(TN_SMC_IND_DATA_0, (v));
61 spin_unlock_irqrestore(&rdev->smc_idx_lock, flags);
64 static const u32 tn_rlc_save_restore_register_list[] =
190 extern bool evergreen_is_display_hung(struct radeon_device *rdev);
191 extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
192 extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
193 extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
194 extern int evergreen_mc_wait_for_idle(struct radeon_device *rdev);
195 extern void evergreen_mc_program(struct radeon_device *rdev);
196 extern void evergreen_irq_suspend(struct radeon_device *rdev);
197 extern int evergreen_mc_init(struct radeon_device *rdev);
198 extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
199 extern void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
200 extern void evergreen_program_aspm(struct radeon_device *rdev);
201 extern void sumo_rlc_fini(struct radeon_device *rdev);
202 extern int sumo_rlc_init(struct radeon_device *rdev);
203 extern void evergreen_gpu_pci_config_reset(struct radeon_device *rdev);
209 static const u32 cayman_golden_registers2[] =
211 0x3e5c, 0xffffffff, 0x00000000,
212 0x3e48, 0xffffffff, 0x00000000,
213 0x3e4c, 0xffffffff, 0x00000000,
214 0x3e64, 0xffffffff, 0x00000000,
215 0x3e50, 0xffffffff, 0x00000000,
216 0x3e60, 0xffffffff, 0x00000000
219 static const u32 cayman_golden_registers[] =
221 0x5eb4, 0xffffffff, 0x00000002,
222 0x5e78, 0x8f311ff1, 0x001000f0,
223 0x3f90, 0xffff0000, 0xff000000,
224 0x9148, 0xffff0000, 0xff000000,
225 0x3f94, 0xffff0000, 0xff000000,
226 0x914c, 0xffff0000, 0xff000000,
227 0xc78, 0x00000080, 0x00000080,
228 0xbd4, 0x70073777, 0x00011003,
229 0xd02c, 0xbfffff1f, 0x08421000,
230 0xd0b8, 0x73773777, 0x02011003,
231 0x5bc0, 0x00200000, 0x50100000,
232 0x98f8, 0x33773777, 0x02011003,
233 0x98fc, 0xffffffff, 0x76541032,
234 0x7030, 0x31000311, 0x00000011,
235 0x2f48, 0x33773777, 0x42010001,
236 0x6b28, 0x00000010, 0x00000012,
237 0x7728, 0x00000010, 0x00000012,
238 0x10328, 0x00000010, 0x00000012,
239 0x10f28, 0x00000010, 0x00000012,
240 0x11b28, 0x00000010, 0x00000012,
241 0x12728, 0x00000010, 0x00000012,
242 0x240c, 0x000007ff, 0x00000000,
243 0x8a14, 0xf000001f, 0x00000007,
244 0x8b24, 0x3fff3fff, 0x00ff0fff,
245 0x8b10, 0x0000ff0f, 0x00000000,
246 0x28a4c, 0x07ffffff, 0x06000000,
247 0x10c, 0x00000001, 0x00010003,
248 0xa02c, 0xffffffff, 0x0000009b,
249 0x913c, 0x0000010f, 0x01000100,
250 0x8c04, 0xf8ff00ff, 0x40600060,
251 0x28350, 0x00000f01, 0x00000000,
252 0x9508, 0x3700001f, 0x00000002,
253 0x960c, 0xffffffff, 0x54763210,
254 0x88c4, 0x001f3ae3, 0x00000082,
255 0x88d0, 0xffffffff, 0x0f40df40,
256 0x88d4, 0x0000001f, 0x00000010,
257 0x8974, 0xffffffff, 0x00000000
260 static const u32 dvst_golden_registers2[] =
262 0x8f8, 0xffffffff, 0,
263 0x8fc, 0x00380000, 0,
264 0x8f8, 0xffffffff, 1,
268 static const u32 dvst_golden_registers[] =
270 0x690, 0x3fff3fff, 0x20c00033,
271 0x918c, 0x0fff0fff, 0x00010006,
272 0x91a8, 0x0fff0fff, 0x00010006,
273 0x9150, 0xffffdfff, 0x6e944040,
274 0x917c, 0x0fff0fff, 0x00030002,
275 0x9198, 0x0fff0fff, 0x00030002,
276 0x915c, 0x0fff0fff, 0x00010000,
277 0x3f90, 0xffff0001, 0xff000000,
278 0x9178, 0x0fff0fff, 0x00070000,
279 0x9194, 0x0fff0fff, 0x00070000,
280 0x9148, 0xffff0001, 0xff000000,
281 0x9190, 0x0fff0fff, 0x00090008,
282 0x91ac, 0x0fff0fff, 0x00090008,
283 0x3f94, 0xffff0000, 0xff000000,
284 0x914c, 0xffff0000, 0xff000000,
285 0x929c, 0x00000fff, 0x00000001,
286 0x55e4, 0xff607fff, 0xfc000100,
287 0x8a18, 0xff000fff, 0x00000100,
288 0x8b28, 0xff000fff, 0x00000100,
289 0x9144, 0xfffc0fff, 0x00000100,
290 0x6ed8, 0x00010101, 0x00010000,
291 0x9830, 0xffffffff, 0x00000000,
292 0x9834, 0xf00fffff, 0x00000400,
293 0x9838, 0xfffffffe, 0x00000000,
294 0xd0c0, 0xff000fff, 0x00000100,
295 0xd02c, 0xbfffff1f, 0x08421000,
296 0xd0b8, 0x73773777, 0x12010001,
297 0x5bb0, 0x000000f0, 0x00000070,
298 0x98f8, 0x73773777, 0x12010001,
299 0x98fc, 0xffffffff, 0x00000010,
300 0x9b7c, 0x00ff0000, 0x00fc0000,
301 0x8030, 0x00001f0f, 0x0000100a,
302 0x2f48, 0x73773777, 0x12010001,
303 0x2408, 0x00030000, 0x000c007f,
304 0x8a14, 0xf000003f, 0x00000007,
305 0x8b24, 0x3fff3fff, 0x00ff0fff,
306 0x8b10, 0x0000ff0f, 0x00000000,
307 0x28a4c, 0x07ffffff, 0x06000000,
308 0x4d8, 0x00000fff, 0x00000100,
309 0xa008, 0xffffffff, 0x00010000,
310 0x913c, 0xffff03ff, 0x01000100,
311 0x8c00, 0x000000ff, 0x00000003,
312 0x8c04, 0xf8ff00ff, 0x40600060,
313 0x8cf0, 0x1fff1fff, 0x08e00410,
314 0x28350, 0x00000f01, 0x00000000,
315 0x9508, 0xf700071f, 0x00000002,
316 0x960c, 0xffffffff, 0x54763210,
317 0x20ef8, 0x01ff01ff, 0x00000002,
318 0x20e98, 0xfffffbff, 0x00200000,
319 0x2015c, 0xffffffff, 0x00000f40,
320 0x88c4, 0x001f3ae3, 0x00000082,
321 0x8978, 0x3fffffff, 0x04050140,
322 0x88d4, 0x0000001f, 0x00000010,
323 0x8974, 0xffffffff, 0x00000000
326 static const u32 scrapper_golden_registers[] =
328 0x690, 0x3fff3fff, 0x20c00033,
329 0x918c, 0x0fff0fff, 0x00010006,
330 0x918c, 0x0fff0fff, 0x00010006,
331 0x91a8, 0x0fff0fff, 0x00010006,
332 0x91a8, 0x0fff0fff, 0x00010006,
333 0x9150, 0xffffdfff, 0x6e944040,
334 0x9150, 0xffffdfff, 0x6e944040,
335 0x917c, 0x0fff0fff, 0x00030002,
336 0x917c, 0x0fff0fff, 0x00030002,
337 0x9198, 0x0fff0fff, 0x00030002,
338 0x9198, 0x0fff0fff, 0x00030002,
339 0x915c, 0x0fff0fff, 0x00010000,
340 0x915c, 0x0fff0fff, 0x00010000,
341 0x3f90, 0xffff0001, 0xff000000,
342 0x3f90, 0xffff0001, 0xff000000,
343 0x9178, 0x0fff0fff, 0x00070000,
344 0x9178, 0x0fff0fff, 0x00070000,
345 0x9194, 0x0fff0fff, 0x00070000,
346 0x9194, 0x0fff0fff, 0x00070000,
347 0x9148, 0xffff0001, 0xff000000,
348 0x9148, 0xffff0001, 0xff000000,
349 0x9190, 0x0fff0fff, 0x00090008,
350 0x9190, 0x0fff0fff, 0x00090008,
351 0x91ac, 0x0fff0fff, 0x00090008,
352 0x91ac, 0x0fff0fff, 0x00090008,
353 0x3f94, 0xffff0000, 0xff000000,
354 0x3f94, 0xffff0000, 0xff000000,
355 0x914c, 0xffff0000, 0xff000000,
356 0x914c, 0xffff0000, 0xff000000,
357 0x929c, 0x00000fff, 0x00000001,
358 0x929c, 0x00000fff, 0x00000001,
359 0x55e4, 0xff607fff, 0xfc000100,
360 0x8a18, 0xff000fff, 0x00000100,
361 0x8a18, 0xff000fff, 0x00000100,
362 0x8b28, 0xff000fff, 0x00000100,
363 0x8b28, 0xff000fff, 0x00000100,
364 0x9144, 0xfffc0fff, 0x00000100,
365 0x9144, 0xfffc0fff, 0x00000100,
366 0x6ed8, 0x00010101, 0x00010000,
367 0x9830, 0xffffffff, 0x00000000,
368 0x9830, 0xffffffff, 0x00000000,
369 0x9834, 0xf00fffff, 0x00000400,
370 0x9834, 0xf00fffff, 0x00000400,
371 0x9838, 0xfffffffe, 0x00000000,
372 0x9838, 0xfffffffe, 0x00000000,
373 0xd0c0, 0xff000fff, 0x00000100,
374 0xd02c, 0xbfffff1f, 0x08421000,
375 0xd02c, 0xbfffff1f, 0x08421000,
376 0xd0b8, 0x73773777, 0x12010001,
377 0xd0b8, 0x73773777, 0x12010001,
378 0x5bb0, 0x000000f0, 0x00000070,
379 0x98f8, 0x73773777, 0x12010001,
380 0x98f8, 0x73773777, 0x12010001,
381 0x98fc, 0xffffffff, 0x00000010,
382 0x98fc, 0xffffffff, 0x00000010,
383 0x9b7c, 0x00ff0000, 0x00fc0000,
384 0x9b7c, 0x00ff0000, 0x00fc0000,
385 0x8030, 0x00001f0f, 0x0000100a,
386 0x8030, 0x00001f0f, 0x0000100a,
387 0x2f48, 0x73773777, 0x12010001,
388 0x2f48, 0x73773777, 0x12010001,
389 0x2408, 0x00030000, 0x000c007f,
390 0x8a14, 0xf000003f, 0x00000007,
391 0x8a14, 0xf000003f, 0x00000007,
392 0x8b24, 0x3fff3fff, 0x00ff0fff,
393 0x8b24, 0x3fff3fff, 0x00ff0fff,
394 0x8b10, 0x0000ff0f, 0x00000000,
395 0x8b10, 0x0000ff0f, 0x00000000,
396 0x28a4c, 0x07ffffff, 0x06000000,
397 0x28a4c, 0x07ffffff, 0x06000000,
398 0x4d8, 0x00000fff, 0x00000100,
399 0x4d8, 0x00000fff, 0x00000100,
400 0xa008, 0xffffffff, 0x00010000,
401 0xa008, 0xffffffff, 0x00010000,
402 0x913c, 0xffff03ff, 0x01000100,
403 0x913c, 0xffff03ff, 0x01000100,
404 0x90e8, 0x001fffff, 0x010400c0,
405 0x8c00, 0x000000ff, 0x00000003,
406 0x8c00, 0x000000ff, 0x00000003,
407 0x8c04, 0xf8ff00ff, 0x40600060,
408 0x8c04, 0xf8ff00ff, 0x40600060,
409 0x8c30, 0x0000000f, 0x00040005,
410 0x8cf0, 0x1fff1fff, 0x08e00410,
411 0x8cf0, 0x1fff1fff, 0x08e00410,
412 0x900c, 0x00ffffff, 0x0017071f,
413 0x28350, 0x00000f01, 0x00000000,
414 0x28350, 0x00000f01, 0x00000000,
415 0x9508, 0xf700071f, 0x00000002,
416 0x9508, 0xf700071f, 0x00000002,
417 0x9688, 0x00300000, 0x0017000f,
418 0x960c, 0xffffffff, 0x54763210,
419 0x960c, 0xffffffff, 0x54763210,
420 0x20ef8, 0x01ff01ff, 0x00000002,
421 0x20e98, 0xfffffbff, 0x00200000,
422 0x2015c, 0xffffffff, 0x00000f40,
423 0x88c4, 0x001f3ae3, 0x00000082,
424 0x88c4, 0x001f3ae3, 0x00000082,
425 0x8978, 0x3fffffff, 0x04050140,
426 0x8978, 0x3fffffff, 0x04050140,
427 0x88d4, 0x0000001f, 0x00000010,
428 0x88d4, 0x0000001f, 0x00000010,
429 0x8974, 0xffffffff, 0x00000000,
430 0x8974, 0xffffffff, 0x00000000
433 static void ni_init_golden_registers(struct radeon_device *rdev)
435 switch (rdev->family) {
437 radeon_program_register_sequence(rdev,
438 cayman_golden_registers,
439 (const u32)ARRAY_SIZE(cayman_golden_registers));
440 radeon_program_register_sequence(rdev,
441 cayman_golden_registers2,
442 (const u32)ARRAY_SIZE(cayman_golden_registers2));
445 if ((rdev->pdev->device == 0x9900) ||
446 (rdev->pdev->device == 0x9901) ||
447 (rdev->pdev->device == 0x9903) ||
448 (rdev->pdev->device == 0x9904) ||
449 (rdev->pdev->device == 0x9905) ||
450 (rdev->pdev->device == 0x9906) ||
451 (rdev->pdev->device == 0x9907) ||
452 (rdev->pdev->device == 0x9908) ||
453 (rdev->pdev->device == 0x9909) ||
454 (rdev->pdev->device == 0x990A) ||
455 (rdev->pdev->device == 0x990B) ||
456 (rdev->pdev->device == 0x990C) ||
457 (rdev->pdev->device == 0x990D) ||
458 (rdev->pdev->device == 0x990E) ||
459 (rdev->pdev->device == 0x990F) ||
460 (rdev->pdev->device == 0x9910) ||
461 (rdev->pdev->device == 0x9913) ||
462 (rdev->pdev->device == 0x9917) ||
463 (rdev->pdev->device == 0x9918)) {
464 radeon_program_register_sequence(rdev,
465 dvst_golden_registers,
466 (const u32)ARRAY_SIZE(dvst_golden_registers));
467 radeon_program_register_sequence(rdev,
468 dvst_golden_registers2,
469 (const u32)ARRAY_SIZE(dvst_golden_registers2));
471 radeon_program_register_sequence(rdev,
472 scrapper_golden_registers,
473 (const u32)ARRAY_SIZE(scrapper_golden_registers));
474 radeon_program_register_sequence(rdev,
475 dvst_golden_registers2,
476 (const u32)ARRAY_SIZE(dvst_golden_registers2));
484 #define BTC_IO_MC_REGS_SIZE 29
486 static const u32 barts_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
487 {0x00000077, 0xff010100},
488 {0x00000078, 0x00000000},
489 {0x00000079, 0x00001434},
490 {0x0000007a, 0xcc08ec08},
491 {0x0000007b, 0x00040000},
492 {0x0000007c, 0x000080c0},
493 {0x0000007d, 0x09000000},
494 {0x0000007e, 0x00210404},
495 {0x00000081, 0x08a8e800},
496 {0x00000082, 0x00030444},
497 {0x00000083, 0x00000000},
498 {0x00000085, 0x00000001},
499 {0x00000086, 0x00000002},
500 {0x00000087, 0x48490000},
501 {0x00000088, 0x20244647},
502 {0x00000089, 0x00000005},
503 {0x0000008b, 0x66030000},
504 {0x0000008c, 0x00006603},
505 {0x0000008d, 0x00000100},
506 {0x0000008f, 0x00001c0a},
507 {0x00000090, 0xff000001},
508 {0x00000094, 0x00101101},
509 {0x00000095, 0x00000fff},
510 {0x00000096, 0x00116fff},
511 {0x00000097, 0x60010000},
512 {0x00000098, 0x10010000},
513 {0x00000099, 0x00006000},
514 {0x0000009a, 0x00001000},
515 {0x0000009f, 0x00946a00}
518 static const u32 turks_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
519 {0x00000077, 0xff010100},
520 {0x00000078, 0x00000000},
521 {0x00000079, 0x00001434},
522 {0x0000007a, 0xcc08ec08},
523 {0x0000007b, 0x00040000},
524 {0x0000007c, 0x000080c0},
525 {0x0000007d, 0x09000000},
526 {0x0000007e, 0x00210404},
527 {0x00000081, 0x08a8e800},
528 {0x00000082, 0x00030444},
529 {0x00000083, 0x00000000},
530 {0x00000085, 0x00000001},
531 {0x00000086, 0x00000002},
532 {0x00000087, 0x48490000},
533 {0x00000088, 0x20244647},
534 {0x00000089, 0x00000005},
535 {0x0000008b, 0x66030000},
536 {0x0000008c, 0x00006603},
537 {0x0000008d, 0x00000100},
538 {0x0000008f, 0x00001c0a},
539 {0x00000090, 0xff000001},
540 {0x00000094, 0x00101101},
541 {0x00000095, 0x00000fff},
542 {0x00000096, 0x00116fff},
543 {0x00000097, 0x60010000},
544 {0x00000098, 0x10010000},
545 {0x00000099, 0x00006000},
546 {0x0000009a, 0x00001000},
547 {0x0000009f, 0x00936a00}
550 static const u32 caicos_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
551 {0x00000077, 0xff010100},
552 {0x00000078, 0x00000000},
553 {0x00000079, 0x00001434},
554 {0x0000007a, 0xcc08ec08},
555 {0x0000007b, 0x00040000},
556 {0x0000007c, 0x000080c0},
557 {0x0000007d, 0x09000000},
558 {0x0000007e, 0x00210404},
559 {0x00000081, 0x08a8e800},
560 {0x00000082, 0x00030444},
561 {0x00000083, 0x00000000},
562 {0x00000085, 0x00000001},
563 {0x00000086, 0x00000002},
564 {0x00000087, 0x48490000},
565 {0x00000088, 0x20244647},
566 {0x00000089, 0x00000005},
567 {0x0000008b, 0x66030000},
568 {0x0000008c, 0x00006603},
569 {0x0000008d, 0x00000100},
570 {0x0000008f, 0x00001c0a},
571 {0x00000090, 0xff000001},
572 {0x00000094, 0x00101101},
573 {0x00000095, 0x00000fff},
574 {0x00000096, 0x00116fff},
575 {0x00000097, 0x60010000},
576 {0x00000098, 0x10010000},
577 {0x00000099, 0x00006000},
578 {0x0000009a, 0x00001000},
579 {0x0000009f, 0x00916a00}
582 static const u32 cayman_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
583 {0x00000077, 0xff010100},
584 {0x00000078, 0x00000000},
585 {0x00000079, 0x00001434},
586 {0x0000007a, 0xcc08ec08},
587 {0x0000007b, 0x00040000},
588 {0x0000007c, 0x000080c0},
589 {0x0000007d, 0x09000000},
590 {0x0000007e, 0x00210404},
591 {0x00000081, 0x08a8e800},
592 {0x00000082, 0x00030444},
593 {0x00000083, 0x00000000},
594 {0x00000085, 0x00000001},
595 {0x00000086, 0x00000002},
596 {0x00000087, 0x48490000},
597 {0x00000088, 0x20244647},
598 {0x00000089, 0x00000005},
599 {0x0000008b, 0x66030000},
600 {0x0000008c, 0x00006603},
601 {0x0000008d, 0x00000100},
602 {0x0000008f, 0x00001c0a},
603 {0x00000090, 0xff000001},
604 {0x00000094, 0x00101101},
605 {0x00000095, 0x00000fff},
606 {0x00000096, 0x00116fff},
607 {0x00000097, 0x60010000},
608 {0x00000098, 0x10010000},
609 {0x00000099, 0x00006000},
610 {0x0000009a, 0x00001000},
611 {0x0000009f, 0x00976b00}
614 int ni_mc_load_microcode(struct radeon_device *rdev)
616 const __be32 *fw_data;
617 u32 mem_type, running, blackout = 0;
619 int i, ucode_size, regs_size;
624 switch (rdev->family) {
626 io_mc_regs = (u32 *)&barts_io_mc_regs;
627 ucode_size = BTC_MC_UCODE_SIZE;
628 regs_size = BTC_IO_MC_REGS_SIZE;
631 io_mc_regs = (u32 *)&turks_io_mc_regs;
632 ucode_size = BTC_MC_UCODE_SIZE;
633 regs_size = BTC_IO_MC_REGS_SIZE;
637 io_mc_regs = (u32 *)&caicos_io_mc_regs;
638 ucode_size = BTC_MC_UCODE_SIZE;
639 regs_size = BTC_IO_MC_REGS_SIZE;
642 io_mc_regs = (u32 *)&cayman_io_mc_regs;
643 ucode_size = CAYMAN_MC_UCODE_SIZE;
644 regs_size = BTC_IO_MC_REGS_SIZE;
648 mem_type = (RREG32(MC_SEQ_MISC0) & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT;
649 running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
651 if ((mem_type == MC_SEQ_MISC0_GDDR5_VALUE) && (running == 0)) {
653 blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
654 WREG32(MC_SHARED_BLACKOUT_CNTL, 1);
657 /* reset the engine and set to writable */
658 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
659 WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
661 /* load mc io regs */
662 for (i = 0; i < regs_size; i++) {
663 WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
664 WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
666 /* load the MC ucode */
667 fw_data = (const __be32 *)rdev->mc_fw->data;
668 for (i = 0; i < ucode_size; i++)
669 WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
671 /* put the engine back into the active state */
672 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
673 WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
674 WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
676 /* wait for training to complete */
677 for (i = 0; i < rdev->usec_timeout; i++) {
678 if (RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD)
684 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
690 int ni_init_microcode(struct radeon_device *rdev)
692 const char *chip_name;
693 const char *rlc_chip_name;
694 size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size;
695 size_t smc_req_size = 0;
701 switch (rdev->family) {
704 rlc_chip_name = "BTC";
705 pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
706 me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
707 rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
708 mc_req_size = BTC_MC_UCODE_SIZE * 4;
709 smc_req_size = ALIGN(BARTS_SMC_UCODE_SIZE, 4);
713 rlc_chip_name = "BTC";
714 pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
715 me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
716 rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
717 mc_req_size = BTC_MC_UCODE_SIZE * 4;
718 smc_req_size = ALIGN(TURKS_SMC_UCODE_SIZE, 4);
721 chip_name = "CAICOS";
722 rlc_chip_name = "BTC";
723 pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
724 me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
725 rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
726 mc_req_size = BTC_MC_UCODE_SIZE * 4;
727 smc_req_size = ALIGN(CAICOS_SMC_UCODE_SIZE, 4);
730 chip_name = "CAYMAN";
731 rlc_chip_name = "CAYMAN";
732 pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
733 me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
734 rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4;
735 mc_req_size = CAYMAN_MC_UCODE_SIZE * 4;
736 smc_req_size = ALIGN(CAYMAN_SMC_UCODE_SIZE, 4);
740 rlc_chip_name = "ARUBA";
741 /* pfp/me same size as CAYMAN */
742 pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
743 me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
744 rlc_req_size = ARUBA_RLC_UCODE_SIZE * 4;
750 DRM_INFO("Loading %s Microcode\n", chip_name);
752 snprintf(fw_name, sizeof(fw_name), "/*(DEBLOBBED)*/", chip_name);
753 err = reject_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
756 if (rdev->pfp_fw->size != pfp_req_size) {
758 "ni_cp: Bogus length %zu in firmware \"%s\"\n",
759 rdev->pfp_fw->size, fw_name);
764 snprintf(fw_name, sizeof(fw_name), "/*(DEBLOBBED)*/", chip_name);
765 err = reject_firmware(&rdev->me_fw, fw_name, rdev->dev);
768 if (rdev->me_fw->size != me_req_size) {
770 "ni_cp: Bogus length %zu in firmware \"%s\"\n",
771 rdev->me_fw->size, fw_name);
775 snprintf(fw_name, sizeof(fw_name), "/*(DEBLOBBED)*/", rlc_chip_name);
776 err = reject_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
779 if (rdev->rlc_fw->size != rlc_req_size) {
781 "ni_rlc: Bogus length %zu in firmware \"%s\"\n",
782 rdev->rlc_fw->size, fw_name);
786 /* no MC ucode on TN */
787 if (!(rdev->flags & RADEON_IS_IGP)) {
788 snprintf(fw_name, sizeof(fw_name), "/*(DEBLOBBED)*/", chip_name);
789 err = reject_firmware(&rdev->mc_fw, fw_name, rdev->dev);
792 if (rdev->mc_fw->size != mc_req_size) {
794 "ni_mc: Bogus length %zu in firmware \"%s\"\n",
795 rdev->mc_fw->size, fw_name);
800 if ((rdev->family >= CHIP_BARTS) && (rdev->family <= CHIP_CAYMAN)) {
801 snprintf(fw_name, sizeof(fw_name), "/*(DEBLOBBED)*/", chip_name);
802 err = reject_firmware(&rdev->smc_fw, fw_name, rdev->dev);
805 "smc: error loading firmware \"%s\"\n",
807 release_firmware(rdev->smc_fw);
810 } else if (rdev->smc_fw->size != smc_req_size) {
812 "ni_mc: Bogus length %zu in firmware \"%s\"\n",
813 rdev->mc_fw->size, fw_name);
822 "ni_cp: Failed to load firmware \"%s\"\n",
824 release_firmware(rdev->pfp_fw);
826 release_firmware(rdev->me_fw);
828 release_firmware(rdev->rlc_fw);
830 release_firmware(rdev->mc_fw);
837 * cayman_get_allowed_info_register - fetch the register for the info ioctl
839 * @rdev: radeon_device pointer
840 * @reg: register offset in bytes
841 * @val: register value
843 * Returns 0 for success or -EINVAL for an invalid register
846 int cayman_get_allowed_info_register(struct radeon_device *rdev,
851 case GRBM_STATUS_SE0:
852 case GRBM_STATUS_SE1:
855 case (DMA_STATUS_REG + DMA0_REGISTER_OFFSET):
856 case (DMA_STATUS_REG + DMA1_REGISTER_OFFSET):
865 int tn_get_temp(struct radeon_device *rdev)
867 u32 temp = RREG32_SMC(TN_CURRENT_GNB_TEMP) & 0x7ff;
868 int actual_temp = (temp / 8) - 49;
870 return actual_temp * 1000;
876 static void cayman_gpu_init(struct radeon_device *rdev)
878 u32 gb_addr_config = 0;
879 u32 mc_shared_chmap, mc_arb_ramcfg;
880 u32 cgts_tcc_disable;
883 u32 cgts_sm_ctrl_reg;
884 u32 hdp_host_path_cntl;
886 u32 disabled_rb_mask;
889 switch (rdev->family) {
891 rdev->config.cayman.max_shader_engines = 2;
892 rdev->config.cayman.max_pipes_per_simd = 4;
893 rdev->config.cayman.max_tile_pipes = 8;
894 rdev->config.cayman.max_simds_per_se = 12;
895 rdev->config.cayman.max_backends_per_se = 4;
896 rdev->config.cayman.max_texture_channel_caches = 8;
897 rdev->config.cayman.max_gprs = 256;
898 rdev->config.cayman.max_threads = 256;
899 rdev->config.cayman.max_gs_threads = 32;
900 rdev->config.cayman.max_stack_entries = 512;
901 rdev->config.cayman.sx_num_of_sets = 8;
902 rdev->config.cayman.sx_max_export_size = 256;
903 rdev->config.cayman.sx_max_export_pos_size = 64;
904 rdev->config.cayman.sx_max_export_smx_size = 192;
905 rdev->config.cayman.max_hw_contexts = 8;
906 rdev->config.cayman.sq_num_cf_insts = 2;
908 rdev->config.cayman.sc_prim_fifo_size = 0x100;
909 rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
910 rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
911 gb_addr_config = CAYMAN_GB_ADDR_CONFIG_GOLDEN;
915 rdev->config.cayman.max_shader_engines = 1;
916 rdev->config.cayman.max_pipes_per_simd = 4;
917 rdev->config.cayman.max_tile_pipes = 2;
918 if ((rdev->pdev->device == 0x9900) ||
919 (rdev->pdev->device == 0x9901) ||
920 (rdev->pdev->device == 0x9905) ||
921 (rdev->pdev->device == 0x9906) ||
922 (rdev->pdev->device == 0x9907) ||
923 (rdev->pdev->device == 0x9908) ||
924 (rdev->pdev->device == 0x9909) ||
925 (rdev->pdev->device == 0x990B) ||
926 (rdev->pdev->device == 0x990C) ||
927 (rdev->pdev->device == 0x990F) ||
928 (rdev->pdev->device == 0x9910) ||
929 (rdev->pdev->device == 0x9917) ||
930 (rdev->pdev->device == 0x9999) ||
931 (rdev->pdev->device == 0x999C)) {
932 rdev->config.cayman.max_simds_per_se = 6;
933 rdev->config.cayman.max_backends_per_se = 2;
934 rdev->config.cayman.max_hw_contexts = 8;
935 rdev->config.cayman.sx_max_export_size = 256;
936 rdev->config.cayman.sx_max_export_pos_size = 64;
937 rdev->config.cayman.sx_max_export_smx_size = 192;
938 } else if ((rdev->pdev->device == 0x9903) ||
939 (rdev->pdev->device == 0x9904) ||
940 (rdev->pdev->device == 0x990A) ||
941 (rdev->pdev->device == 0x990D) ||
942 (rdev->pdev->device == 0x990E) ||
943 (rdev->pdev->device == 0x9913) ||
944 (rdev->pdev->device == 0x9918) ||
945 (rdev->pdev->device == 0x999D)) {
946 rdev->config.cayman.max_simds_per_se = 4;
947 rdev->config.cayman.max_backends_per_se = 2;
948 rdev->config.cayman.max_hw_contexts = 8;
949 rdev->config.cayman.sx_max_export_size = 256;
950 rdev->config.cayman.sx_max_export_pos_size = 64;
951 rdev->config.cayman.sx_max_export_smx_size = 192;
952 } else if ((rdev->pdev->device == 0x9919) ||
953 (rdev->pdev->device == 0x9990) ||
954 (rdev->pdev->device == 0x9991) ||
955 (rdev->pdev->device == 0x9994) ||
956 (rdev->pdev->device == 0x9995) ||
957 (rdev->pdev->device == 0x9996) ||
958 (rdev->pdev->device == 0x999A) ||
959 (rdev->pdev->device == 0x99A0)) {
960 rdev->config.cayman.max_simds_per_se = 3;
961 rdev->config.cayman.max_backends_per_se = 1;
962 rdev->config.cayman.max_hw_contexts = 4;
963 rdev->config.cayman.sx_max_export_size = 128;
964 rdev->config.cayman.sx_max_export_pos_size = 32;
965 rdev->config.cayman.sx_max_export_smx_size = 96;
967 rdev->config.cayman.max_simds_per_se = 2;
968 rdev->config.cayman.max_backends_per_se = 1;
969 rdev->config.cayman.max_hw_contexts = 4;
970 rdev->config.cayman.sx_max_export_size = 128;
971 rdev->config.cayman.sx_max_export_pos_size = 32;
972 rdev->config.cayman.sx_max_export_smx_size = 96;
974 rdev->config.cayman.max_texture_channel_caches = 2;
975 rdev->config.cayman.max_gprs = 256;
976 rdev->config.cayman.max_threads = 256;
977 rdev->config.cayman.max_gs_threads = 32;
978 rdev->config.cayman.max_stack_entries = 512;
979 rdev->config.cayman.sx_num_of_sets = 8;
980 rdev->config.cayman.sq_num_cf_insts = 2;
982 rdev->config.cayman.sc_prim_fifo_size = 0x40;
983 rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
984 rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
985 gb_addr_config = ARUBA_GB_ADDR_CONFIG_GOLDEN;
990 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
991 WREG32((0x2c14 + j), 0x00000000);
992 WREG32((0x2c18 + j), 0x00000000);
993 WREG32((0x2c1c + j), 0x00000000);
994 WREG32((0x2c20 + j), 0x00000000);
995 WREG32((0x2c24 + j), 0x00000000);
998 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
999 WREG32(SRBM_INT_CNTL, 0x1);
1000 WREG32(SRBM_INT_ACK, 0x1);
1002 evergreen_fix_pci_max_read_req_size(rdev);
1004 mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
1005 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1007 tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
1008 rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
1009 if (rdev->config.cayman.mem_row_size_in_kb > 4)
1010 rdev->config.cayman.mem_row_size_in_kb = 4;
1011 /* XXX use MC settings? */
1012 rdev->config.cayman.shader_engine_tile_size = 32;
1013 rdev->config.cayman.num_gpus = 1;
1014 rdev->config.cayman.multi_gpu_tile_size = 64;
1016 tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT;
1017 rdev->config.cayman.num_tile_pipes = (1 << tmp);
1018 tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT;
1019 rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
1020 tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT;
1021 rdev->config.cayman.num_shader_engines = tmp + 1;
1022 tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT;
1023 rdev->config.cayman.num_gpus = tmp + 1;
1024 tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT;
1025 rdev->config.cayman.multi_gpu_tile_size = 1 << tmp;
1026 tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT;
1027 rdev->config.cayman.mem_row_size_in_kb = 1 << tmp;
1030 /* setup tiling info dword. gb_addr_config is not adequate since it does
1031 * not have bank info, so create a custom tiling dword.
1032 * bits 3:0 num_pipes
1033 * bits 7:4 num_banks
1034 * bits 11:8 group_size
1035 * bits 15:12 row_size
1037 rdev->config.cayman.tile_config = 0;
1038 switch (rdev->config.cayman.num_tile_pipes) {
1041 rdev->config.cayman.tile_config |= (0 << 0);
1044 rdev->config.cayman.tile_config |= (1 << 0);
1047 rdev->config.cayman.tile_config |= (2 << 0);
1050 rdev->config.cayman.tile_config |= (3 << 0);
1054 /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */
1055 if (rdev->flags & RADEON_IS_IGP)
1056 rdev->config.cayman.tile_config |= 1 << 4;
1058 switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
1059 case 0: /* four banks */
1060 rdev->config.cayman.tile_config |= 0 << 4;
1062 case 1: /* eight banks */
1063 rdev->config.cayman.tile_config |= 1 << 4;
1065 case 2: /* sixteen banks */
1067 rdev->config.cayman.tile_config |= 2 << 4;
1071 rdev->config.cayman.tile_config |=
1072 ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
1073 rdev->config.cayman.tile_config |=
1074 ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
1077 for (i = (rdev->config.cayman.max_shader_engines - 1); i >= 0; i--) {
1078 u32 rb_disable_bitmap;
1080 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1081 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1082 rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16;
1084 tmp |= rb_disable_bitmap;
1086 /* enabled rb are just the one not disabled :) */
1087 disabled_rb_mask = tmp;
1089 for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
1091 /* if all the backends are disabled, fix it up here */
1092 if ((disabled_rb_mask & tmp) == tmp) {
1093 for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
1094 disabled_rb_mask &= ~(1 << i);
1097 for (i = 0; i < rdev->config.cayman.max_shader_engines; i++) {
1098 u32 simd_disable_bitmap;
1100 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1101 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1102 simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
1103 simd_disable_bitmap |= 0xffffffff << rdev->config.cayman.max_simds_per_se;
1105 tmp |= simd_disable_bitmap;
1107 rdev->config.cayman.active_simds = hweight32(~tmp);
1109 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1110 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1112 WREG32(GB_ADDR_CONFIG, gb_addr_config);
1113 WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
1114 if (ASIC_IS_DCE6(rdev))
1115 WREG32(DMIF_ADDR_CALC, gb_addr_config);
1116 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
1117 WREG32(DMA_TILING_CONFIG + DMA0_REGISTER_OFFSET, gb_addr_config);
1118 WREG32(DMA_TILING_CONFIG + DMA1_REGISTER_OFFSET, gb_addr_config);
1119 WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
1120 WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
1121 WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
1123 if ((rdev->config.cayman.max_backends_per_se == 1) &&
1124 (rdev->flags & RADEON_IS_IGP)) {
1125 if ((disabled_rb_mask & 3) == 2) {
1126 /* RB1 disabled, RB0 enabled */
1129 /* RB0 disabled, RB1 enabled */
1133 tmp = gb_addr_config & NUM_PIPES_MASK;
1134 tmp = r6xx_remap_render_backend(rdev, tmp,
1135 rdev->config.cayman.max_backends_per_se *
1136 rdev->config.cayman.max_shader_engines,
1137 CAYMAN_MAX_BACKENDS, disabled_rb_mask);
1139 WREG32(GB_BACKEND_MAP, tmp);
1141 cgts_tcc_disable = 0xffff0000;
1142 for (i = 0; i < rdev->config.cayman.max_texture_channel_caches; i++)
1143 cgts_tcc_disable &= ~(1 << (16 + i));
1144 WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable);
1145 WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable);
1146 WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable);
1147 WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable);
1149 /* reprogram the shader complex */
1150 cgts_sm_ctrl_reg = RREG32(CGTS_SM_CTRL_REG);
1151 for (i = 0; i < 16; i++)
1152 WREG32(CGTS_SM_CTRL_REG, OVERRIDE);
1153 WREG32(CGTS_SM_CTRL_REG, cgts_sm_ctrl_reg);
1155 /* set HW defaults for 3D engine */
1156 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
1158 sx_debug_1 = RREG32(SX_DEBUG_1);
1159 sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
1160 WREG32(SX_DEBUG_1, sx_debug_1);
1162 smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
1163 smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
1164 smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.cayman.sx_num_of_sets);
1165 WREG32(SMX_DC_CTL0, smx_dc_ctl0);
1167 WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4) | CRC_SIMD_ID_WADDR_DISABLE);
1169 /* need to be explicitly zero-ed */
1170 WREG32(VGT_OFFCHIP_LDS_BASE, 0);
1171 WREG32(SQ_LSTMP_RING_BASE, 0);
1172 WREG32(SQ_HSTMP_RING_BASE, 0);
1173 WREG32(SQ_ESTMP_RING_BASE, 0);
1174 WREG32(SQ_GSTMP_RING_BASE, 0);
1175 WREG32(SQ_VSTMP_RING_BASE, 0);
1176 WREG32(SQ_PSTMP_RING_BASE, 0);
1178 WREG32(TA_CNTL_AUX, DISABLE_CUBE_ANISO);
1180 WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.cayman.sx_max_export_size / 4) - 1) |
1181 POSITION_BUFFER_SIZE((rdev->config.cayman.sx_max_export_pos_size / 4) - 1) |
1182 SMX_BUFFER_SIZE((rdev->config.cayman.sx_max_export_smx_size / 4) - 1)));
1184 WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.cayman.sc_prim_fifo_size) |
1185 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_hiz_tile_fifo_size) |
1186 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_earlyz_tile_fifo_size)));
1189 WREG32(VGT_NUM_INSTANCES, 1);
1191 WREG32(CP_PERFMON_CNTL, 0);
1193 WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.cayman.sq_num_cf_insts) |
1194 FETCH_FIFO_HIWATER(0x4) |
1195 DONE_FIFO_HIWATER(0xe0) |
1196 ALU_UPDATE_FIFO_HIWATER(0x8)));
1198 WREG32(SQ_GPR_RESOURCE_MGMT_1, NUM_CLAUSE_TEMP_GPRS(4));
1199 WREG32(SQ_CONFIG, (VC_ENABLE |
1204 WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, DYN_GPR_ENABLE);
1206 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1207 FORCE_EOV_MAX_REZ_CNT(255)));
1209 WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
1210 AUTO_INVLD_EN(ES_AND_GS_AUTO));
1212 WREG32(VGT_GS_VERTEX_REUSE, 16);
1213 WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1215 WREG32(CB_PERF_CTR0_SEL_0, 0);
1216 WREG32(CB_PERF_CTR0_SEL_1, 0);
1217 WREG32(CB_PERF_CTR1_SEL_0, 0);
1218 WREG32(CB_PERF_CTR1_SEL_1, 0);
1219 WREG32(CB_PERF_CTR2_SEL_0, 0);
1220 WREG32(CB_PERF_CTR2_SEL_1, 0);
1221 WREG32(CB_PERF_CTR3_SEL_0, 0);
1222 WREG32(CB_PERF_CTR3_SEL_1, 0);
1224 tmp = RREG32(HDP_MISC_CNTL);
1225 tmp |= HDP_FLUSH_INVALIDATE_CACHE;
1226 WREG32(HDP_MISC_CNTL, tmp);
1228 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1229 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1231 WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
1235 /* set clockgating golden values on TN */
1236 if (rdev->family == CHIP_ARUBA) {
1237 tmp = RREG32_CG(CG_CGTT_LOCAL_0);
1239 WREG32_CG(CG_CGTT_LOCAL_0, tmp);
1240 tmp = RREG32_CG(CG_CGTT_LOCAL_1);
1242 WREG32_CG(CG_CGTT_LOCAL_1, tmp);
1249 void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev)
1251 /* flush hdp cache */
1252 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
1254 /* bits 0-7 are the VM contexts0-7 */
1255 WREG32(VM_INVALIDATE_REQUEST, 1);
1258 static int cayman_pcie_gart_enable(struct radeon_device *rdev)
1262 if (rdev->gart.robj == NULL) {
1263 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
1266 r = radeon_gart_table_vram_pin(rdev);
1269 /* Setup TLB control */
1270 WREG32(MC_VM_MX_L1_TLB_CNTL,
1273 ENABLE_L1_FRAGMENT_PROCESSING |
1274 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1275 ENABLE_ADVANCED_DRIVER_MODEL |
1276 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1277 /* Setup L2 cache */
1278 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
1279 ENABLE_L2_FRAGMENT_PROCESSING |
1280 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1281 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1282 EFFECTIVE_L2_QUEUE_SIZE(7) |
1283 CONTEXT1_IDENTITY_ACCESS_MODE(1));
1284 WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
1285 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1287 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1288 /* setup context0 */
1289 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
1290 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
1291 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
1292 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
1293 (u32)(rdev->dummy_page.addr >> 12));
1294 WREG32(VM_CONTEXT0_CNTL2, 0);
1295 WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
1296 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
1302 /* empty context1-7 */
1303 /* Assign the pt base to something valid for now; the pts used for
1304 * the VMs are determined by the application and setup and assigned
1305 * on the fly in the vm part of radeon_gart.c
1307 for (i = 1; i < 8; i++) {
1308 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (i << 2), 0);
1309 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (i << 2),
1310 rdev->vm_manager.max_pfn - 1);
1311 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
1312 rdev->vm_manager.saved_table_addr[i]);
1315 /* enable context1-7 */
1316 WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
1317 (u32)(rdev->dummy_page.addr >> 12));
1318 WREG32(VM_CONTEXT1_CNTL2, 4);
1319 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
1320 PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) |
1321 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1322 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1323 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1324 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1325 PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
1326 PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
1327 VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
1328 VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
1329 READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
1330 READ_PROTECTION_FAULT_ENABLE_DEFAULT |
1331 WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1332 WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
1334 cayman_pcie_gart_tlb_flush(rdev);
1335 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
1336 (unsigned)(rdev->mc.gtt_size >> 20),
1337 (unsigned long long)rdev->gart.table_addr);
1338 rdev->gart.ready = true;
1342 static void cayman_pcie_gart_disable(struct radeon_device *rdev)
1346 for (i = 1; i < 8; ++i) {
1347 rdev->vm_manager.saved_table_addr[i] = RREG32(
1348 VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2));
1351 /* Disable all tables */
1352 WREG32(VM_CONTEXT0_CNTL, 0);
1353 WREG32(VM_CONTEXT1_CNTL, 0);
1354 /* Setup TLB control */
1355 WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING |
1356 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1357 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1358 /* Setup L2 cache */
1359 WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1360 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1361 EFFECTIVE_L2_QUEUE_SIZE(7) |
1362 CONTEXT1_IDENTITY_ACCESS_MODE(1));
1363 WREG32(VM_L2_CNTL2, 0);
1364 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1365 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1366 radeon_gart_table_vram_unpin(rdev);
1369 static void cayman_pcie_gart_fini(struct radeon_device *rdev)
1371 cayman_pcie_gart_disable(rdev);
1372 radeon_gart_table_vram_free(rdev);
1373 radeon_gart_fini(rdev);
1376 void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
1377 int ring, u32 cp_int_cntl)
1379 WREG32(SRBM_GFX_CNTL, RINGID(ring));
1380 WREG32(CP_INT_CNTL, cp_int_cntl);
1386 void cayman_fence_ring_emit(struct radeon_device *rdev,
1387 struct radeon_fence *fence)
1389 struct radeon_ring *ring = &rdev->ring[fence->ring];
1390 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
1391 u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
1392 PACKET3_SH_ACTION_ENA;
1394 /* flush read cache over gart for this vmid */
1395 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1396 radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
1397 radeon_ring_write(ring, 0xFFFFFFFF);
1398 radeon_ring_write(ring, 0);
1399 radeon_ring_write(ring, 10); /* poll interval */
1400 /* EVENT_WRITE_EOP - flush caches, send int */
1401 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
1402 radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
1403 radeon_ring_write(ring, lower_32_bits(addr));
1404 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
1405 radeon_ring_write(ring, fence->seq);
1406 radeon_ring_write(ring, 0);
1409 void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
1411 struct radeon_ring *ring = &rdev->ring[ib->ring];
1412 unsigned vm_id = ib->vm ? ib->vm->ids[ib->ring].id : 0;
1413 u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
1414 PACKET3_SH_ACTION_ENA;
1416 /* set to DX10/11 mode */
1417 radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
1418 radeon_ring_write(ring, 1);
1420 if (ring->rptr_save_reg) {
1421 uint32_t next_rptr = ring->wptr + 3 + 4 + 8;
1422 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
1423 radeon_ring_write(ring, ((ring->rptr_save_reg -
1424 PACKET3_SET_CONFIG_REG_START) >> 2));
1425 radeon_ring_write(ring, next_rptr);
1428 radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
1429 radeon_ring_write(ring,
1433 (ib->gpu_addr & 0xFFFFFFFC));
1434 radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF);
1435 radeon_ring_write(ring, ib->length_dw | (vm_id << 24));
1437 /* flush read cache over gart for this vmid */
1438 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1439 radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
1440 radeon_ring_write(ring, 0xFFFFFFFF);
1441 radeon_ring_write(ring, 0);
1442 radeon_ring_write(ring, (vm_id << 24) | 10); /* poll interval */
1445 static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
1448 WREG32(CP_ME_CNTL, 0);
1450 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1451 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1452 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1453 WREG32(SCRATCH_UMSK, 0);
1454 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1458 u32 cayman_gfx_get_rptr(struct radeon_device *rdev,
1459 struct radeon_ring *ring)
1463 if (rdev->wb.enabled)
1464 rptr = rdev->wb.wb[ring->rptr_offs/4];
1466 if (ring->idx == RADEON_RING_TYPE_GFX_INDEX)
1467 rptr = RREG32(CP_RB0_RPTR);
1468 else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX)
1469 rptr = RREG32(CP_RB1_RPTR);
1471 rptr = RREG32(CP_RB2_RPTR);
1477 u32 cayman_gfx_get_wptr(struct radeon_device *rdev,
1478 struct radeon_ring *ring)
1482 if (ring->idx == RADEON_RING_TYPE_GFX_INDEX)
1483 wptr = RREG32(CP_RB0_WPTR);
1484 else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX)
1485 wptr = RREG32(CP_RB1_WPTR);
1487 wptr = RREG32(CP_RB2_WPTR);
1492 void cayman_gfx_set_wptr(struct radeon_device *rdev,
1493 struct radeon_ring *ring)
1495 if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) {
1496 WREG32(CP_RB0_WPTR, ring->wptr);
1497 (void)RREG32(CP_RB0_WPTR);
1498 } else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) {
1499 WREG32(CP_RB1_WPTR, ring->wptr);
1500 (void)RREG32(CP_RB1_WPTR);
1502 WREG32(CP_RB2_WPTR, ring->wptr);
1503 (void)RREG32(CP_RB2_WPTR);
1507 static int cayman_cp_load_microcode(struct radeon_device *rdev)
1509 const __be32 *fw_data;
1512 if (!rdev->me_fw || !rdev->pfp_fw)
1515 cayman_cp_enable(rdev, false);
1517 fw_data = (const __be32 *)rdev->pfp_fw->data;
1518 WREG32(CP_PFP_UCODE_ADDR, 0);
1519 for (i = 0; i < CAYMAN_PFP_UCODE_SIZE; i++)
1520 WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1521 WREG32(CP_PFP_UCODE_ADDR, 0);
1523 fw_data = (const __be32 *)rdev->me_fw->data;
1524 WREG32(CP_ME_RAM_WADDR, 0);
1525 for (i = 0; i < CAYMAN_PM4_UCODE_SIZE; i++)
1526 WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1528 WREG32(CP_PFP_UCODE_ADDR, 0);
1529 WREG32(CP_ME_RAM_WADDR, 0);
1530 WREG32(CP_ME_RAM_RADDR, 0);
1534 static int cayman_cp_start(struct radeon_device *rdev)
1536 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1539 r = radeon_ring_lock(rdev, ring, 7);
1541 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1544 radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
1545 radeon_ring_write(ring, 0x1);
1546 radeon_ring_write(ring, 0x0);
1547 radeon_ring_write(ring, rdev->config.cayman.max_hw_contexts - 1);
1548 radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
1549 radeon_ring_write(ring, 0);
1550 radeon_ring_write(ring, 0);
1551 radeon_ring_unlock_commit(rdev, ring, false);
1553 cayman_cp_enable(rdev, true);
1555 r = radeon_ring_lock(rdev, ring, cayman_default_size + 19);
1557 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1561 /* setup clear context state */
1562 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1563 radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
1565 for (i = 0; i < cayman_default_size; i++)
1566 radeon_ring_write(ring, cayman_default_state[i]);
1568 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1569 radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
1571 /* set clear context state */
1572 radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
1573 radeon_ring_write(ring, 0);
1575 /* SQ_VTX_BASE_VTX_LOC */
1576 radeon_ring_write(ring, 0xc0026f00);
1577 radeon_ring_write(ring, 0x00000000);
1578 radeon_ring_write(ring, 0x00000000);
1579 radeon_ring_write(ring, 0x00000000);
1582 radeon_ring_write(ring, 0xc0036f00);
1583 radeon_ring_write(ring, 0x00000bc4);
1584 radeon_ring_write(ring, 0xffffffff);
1585 radeon_ring_write(ring, 0xffffffff);
1586 radeon_ring_write(ring, 0xffffffff);
1588 radeon_ring_write(ring, 0xc0026900);
1589 radeon_ring_write(ring, 0x00000316);
1590 radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
1591 radeon_ring_write(ring, 0x00000010); /* */
1593 radeon_ring_unlock_commit(rdev, ring, false);
1595 /* XXX init other rings */
1600 static void cayman_cp_fini(struct radeon_device *rdev)
1602 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1603 cayman_cp_enable(rdev, false);
1604 radeon_ring_fini(rdev, ring);
1605 radeon_scratch_free(rdev, ring->rptr_save_reg);
1608 static int cayman_cp_resume(struct radeon_device *rdev)
1610 static const int ridx[] = {
1611 RADEON_RING_TYPE_GFX_INDEX,
1612 CAYMAN_RING_TYPE_CP1_INDEX,
1613 CAYMAN_RING_TYPE_CP2_INDEX
1615 static const unsigned cp_rb_cntl[] = {
1620 static const unsigned cp_rb_rptr_addr[] = {
1625 static const unsigned cp_rb_rptr_addr_hi[] = {
1626 CP_RB0_RPTR_ADDR_HI,
1627 CP_RB1_RPTR_ADDR_HI,
1630 static const unsigned cp_rb_base[] = {
1635 static const unsigned cp_rb_rptr[] = {
1640 static const unsigned cp_rb_wptr[] = {
1645 struct radeon_ring *ring;
1648 /* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
1649 WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
1655 RREG32(GRBM_SOFT_RESET);
1657 WREG32(GRBM_SOFT_RESET, 0);
1658 RREG32(GRBM_SOFT_RESET);
1660 WREG32(CP_SEM_WAIT_TIMER, 0x0);
1661 WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
1663 /* Set the write pointer delay */
1664 WREG32(CP_RB_WPTR_DELAY, 0);
1666 WREG32(CP_DEBUG, (1 << 27));
1668 /* set the wb address whether it's enabled or not */
1669 WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
1670 WREG32(SCRATCH_UMSK, 0xff);
1672 for (i = 0; i < 3; ++i) {
1676 /* Set ring buffer size */
1677 ring = &rdev->ring[ridx[i]];
1678 rb_cntl = order_base_2(ring->ring_size / 8);
1679 rb_cntl |= order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8;
1681 rb_cntl |= BUF_SWAP_32BIT;
1683 WREG32(cp_rb_cntl[i], rb_cntl);
1685 /* set the wb address whether it's enabled or not */
1686 addr = rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET;
1687 WREG32(cp_rb_rptr_addr[i], addr & 0xFFFFFFFC);
1688 WREG32(cp_rb_rptr_addr_hi[i], upper_32_bits(addr) & 0xFF);
1691 /* set the rb base addr, this causes an internal reset of ALL rings */
1692 for (i = 0; i < 3; ++i) {
1693 ring = &rdev->ring[ridx[i]];
1694 WREG32(cp_rb_base[i], ring->gpu_addr >> 8);
1697 for (i = 0; i < 3; ++i) {
1698 /* Initialize the ring buffer's read and write pointers */
1699 ring = &rdev->ring[ridx[i]];
1700 WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA);
1703 WREG32(cp_rb_rptr[i], 0);
1704 WREG32(cp_rb_wptr[i], ring->wptr);
1707 WREG32_P(cp_rb_cntl[i], 0, ~RB_RPTR_WR_ENA);
1710 /* start the rings */
1711 cayman_cp_start(rdev);
1712 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
1713 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1714 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1715 /* this only test cp0 */
1716 r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
1718 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1719 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1720 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1724 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1725 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
1730 u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev)
1736 tmp = RREG32(GRBM_STATUS);
1737 if (tmp & (PA_BUSY | SC_BUSY |
1739 TA_BUSY | VGT_BUSY |
1741 GDS_BUSY | SPI_BUSY |
1742 IA_BUSY | IA_BUSY_NO_DMA))
1743 reset_mask |= RADEON_RESET_GFX;
1745 if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING |
1746 CP_BUSY | CP_COHERENCY_BUSY))
1747 reset_mask |= RADEON_RESET_CP;
1749 if (tmp & GRBM_EE_BUSY)
1750 reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
1752 /* DMA_STATUS_REG 0 */
1753 tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET);
1754 if (!(tmp & DMA_IDLE))
1755 reset_mask |= RADEON_RESET_DMA;
1757 /* DMA_STATUS_REG 1 */
1758 tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET);
1759 if (!(tmp & DMA_IDLE))
1760 reset_mask |= RADEON_RESET_DMA1;
1763 tmp = RREG32(SRBM_STATUS2);
1765 reset_mask |= RADEON_RESET_DMA;
1767 if (tmp & DMA1_BUSY)
1768 reset_mask |= RADEON_RESET_DMA1;
1771 tmp = RREG32(SRBM_STATUS);
1772 if (tmp & (RLC_RQ_PENDING | RLC_BUSY))
1773 reset_mask |= RADEON_RESET_RLC;
1776 reset_mask |= RADEON_RESET_IH;
1779 reset_mask |= RADEON_RESET_SEM;
1781 if (tmp & GRBM_RQ_PENDING)
1782 reset_mask |= RADEON_RESET_GRBM;
1785 reset_mask |= RADEON_RESET_VMC;
1787 if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
1788 MCC_BUSY | MCD_BUSY))
1789 reset_mask |= RADEON_RESET_MC;
1791 if (evergreen_is_display_hung(rdev))
1792 reset_mask |= RADEON_RESET_DISPLAY;
1795 tmp = RREG32(VM_L2_STATUS);
1797 reset_mask |= RADEON_RESET_VMC;
1799 /* Skip MC reset as it's mostly likely not hung, just busy */
1800 if (reset_mask & RADEON_RESET_MC) {
1801 DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
1802 reset_mask &= ~RADEON_RESET_MC;
1808 static void cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
1810 struct evergreen_mc_save save;
1811 u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
1814 if (reset_mask == 0)
1817 dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
1819 evergreen_print_gpu_status_regs(rdev);
1820 dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_ADDR 0x%08X\n",
1822 dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n",
1824 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
1826 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
1829 /* Disable CP parsing/prefetching */
1830 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
1832 if (reset_mask & RADEON_RESET_DMA) {
1834 tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
1835 tmp &= ~DMA_RB_ENABLE;
1836 WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp);
1839 if (reset_mask & RADEON_RESET_DMA1) {
1841 tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
1842 tmp &= ~DMA_RB_ENABLE;
1843 WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp);
1848 evergreen_mc_stop(rdev, &save);
1849 if (evergreen_mc_wait_for_idle(rdev)) {
1850 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1853 if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) {
1854 grbm_soft_reset = SOFT_RESET_CB |
1868 if (reset_mask & RADEON_RESET_CP) {
1869 grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT;
1871 srbm_soft_reset |= SOFT_RESET_GRBM;
1874 if (reset_mask & RADEON_RESET_DMA)
1875 srbm_soft_reset |= SOFT_RESET_DMA;
1877 if (reset_mask & RADEON_RESET_DMA1)
1878 srbm_soft_reset |= SOFT_RESET_DMA1;
1880 if (reset_mask & RADEON_RESET_DISPLAY)
1881 srbm_soft_reset |= SOFT_RESET_DC;
1883 if (reset_mask & RADEON_RESET_RLC)
1884 srbm_soft_reset |= SOFT_RESET_RLC;
1886 if (reset_mask & RADEON_RESET_SEM)
1887 srbm_soft_reset |= SOFT_RESET_SEM;
1889 if (reset_mask & RADEON_RESET_IH)
1890 srbm_soft_reset |= SOFT_RESET_IH;
1892 if (reset_mask & RADEON_RESET_GRBM)
1893 srbm_soft_reset |= SOFT_RESET_GRBM;
1895 if (reset_mask & RADEON_RESET_VMC)
1896 srbm_soft_reset |= SOFT_RESET_VMC;
1898 if (!(rdev->flags & RADEON_IS_IGP)) {
1899 if (reset_mask & RADEON_RESET_MC)
1900 srbm_soft_reset |= SOFT_RESET_MC;
1903 if (grbm_soft_reset) {
1904 tmp = RREG32(GRBM_SOFT_RESET);
1905 tmp |= grbm_soft_reset;
1906 dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
1907 WREG32(GRBM_SOFT_RESET, tmp);
1908 tmp = RREG32(GRBM_SOFT_RESET);
1912 tmp &= ~grbm_soft_reset;
1913 WREG32(GRBM_SOFT_RESET, tmp);
1914 tmp = RREG32(GRBM_SOFT_RESET);
1917 if (srbm_soft_reset) {
1918 tmp = RREG32(SRBM_SOFT_RESET);
1919 tmp |= srbm_soft_reset;
1920 dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
1921 WREG32(SRBM_SOFT_RESET, tmp);
1922 tmp = RREG32(SRBM_SOFT_RESET);
1926 tmp &= ~srbm_soft_reset;
1927 WREG32(SRBM_SOFT_RESET, tmp);
1928 tmp = RREG32(SRBM_SOFT_RESET);
1931 /* Wait a little for things to settle down */
1934 evergreen_mc_resume(rdev, &save);
1937 evergreen_print_gpu_status_regs(rdev);
1940 int cayman_asic_reset(struct radeon_device *rdev, bool hard)
1945 evergreen_gpu_pci_config_reset(rdev);
1949 reset_mask = cayman_gpu_check_soft_reset(rdev);
1952 r600_set_bios_scratch_engine_hung(rdev, true);
1954 cayman_gpu_soft_reset(rdev, reset_mask);
1956 reset_mask = cayman_gpu_check_soft_reset(rdev);
1959 evergreen_gpu_pci_config_reset(rdev);
1961 r600_set_bios_scratch_engine_hung(rdev, false);
1967 * cayman_gfx_is_lockup - Check if the GFX engine is locked up
1969 * @rdev: radeon_device pointer
1970 * @ring: radeon_ring structure holding ring information
1972 * Check if the GFX engine is locked up.
1973 * Returns true if the engine appears to be locked up, false if not.
1975 bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
1977 u32 reset_mask = cayman_gpu_check_soft_reset(rdev);
1979 if (!(reset_mask & (RADEON_RESET_GFX |
1980 RADEON_RESET_COMPUTE |
1981 RADEON_RESET_CP))) {
1982 radeon_ring_lockup_update(rdev, ring);
1985 return radeon_ring_test_lockup(rdev, ring);
1988 static void cayman_uvd_init(struct radeon_device *rdev)
1995 r = radeon_uvd_init(rdev);
1997 dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
1999 * At this point rdev->uvd.vcpu_bo is NULL which trickles down
2000 * to early fails uvd_v2_2_resume() and thus nothing happens
2001 * there. So it is pointless to try to go through that code
2002 * hence why we disable uvd here.
2007 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
2008 r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
2011 static void cayman_uvd_start(struct radeon_device *rdev)
2018 r = uvd_v2_2_resume(rdev);
2020 dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
2023 r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
2025 dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
2031 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
2034 static void cayman_uvd_resume(struct radeon_device *rdev)
2036 struct radeon_ring *ring;
2039 if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
2042 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
2043 r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0));
2045 dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
2048 r = uvd_v1_0_init(rdev);
2050 dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
2055 static void cayman_vce_init(struct radeon_device *rdev)
2059 /* Only set for CHIP_ARUBA */
2063 r = radeon_vce_init(rdev);
2065 dev_err(rdev->dev, "failed VCE (%d) init.\n", r);
2067 * At this point rdev->vce.vcpu_bo is NULL which trickles down
2068 * to early fails cayman_vce_start() and thus nothing happens
2069 * there. So it is pointless to try to go through that code
2070 * hence why we disable vce here.
2075 rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_obj = NULL;
2076 r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE1_INDEX], 4096);
2077 rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_obj = NULL;
2078 r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE2_INDEX], 4096);
2081 static void cayman_vce_start(struct radeon_device *rdev)
2088 r = radeon_vce_resume(rdev);
2090 dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
2093 r = vce_v1_0_resume(rdev);
2095 dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
2098 r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE1_INDEX);
2100 dev_err(rdev->dev, "failed initializing VCE1 fences (%d).\n", r);
2103 r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE2_INDEX);
2105 dev_err(rdev->dev, "failed initializing VCE2 fences (%d).\n", r);
2111 rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
2112 rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
2115 static void cayman_vce_resume(struct radeon_device *rdev)
2117 struct radeon_ring *ring;
2120 if (!rdev->has_vce || !rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size)
2123 ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
2124 r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0);
2126 dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
2129 ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
2130 r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0);
2132 dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
2135 r = vce_v1_0_init(rdev);
2137 dev_err(rdev->dev, "failed initializing VCE (%d).\n", r);
2142 static int cayman_startup(struct radeon_device *rdev)
2144 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2147 /* enable pcie gen2 link */
2148 evergreen_pcie_gen2_enable(rdev);
2150 evergreen_program_aspm(rdev);
2152 /* scratch needs to be initialized before MC */
2153 r = r600_vram_scratch_init(rdev);
2157 evergreen_mc_program(rdev);
2159 if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) {
2160 r = ni_mc_load_microcode(rdev);
2162 DRM_ERROR("Failed to load MC firmware!\n");
2167 r = cayman_pcie_gart_enable(rdev);
2170 cayman_gpu_init(rdev);
2172 /* allocate rlc buffers */
2173 if (rdev->flags & RADEON_IS_IGP) {
2174 rdev->rlc.reg_list = tn_rlc_save_restore_register_list;
2175 rdev->rlc.reg_list_size =
2176 (u32)ARRAY_SIZE(tn_rlc_save_restore_register_list);
2177 rdev->rlc.cs_data = cayman_cs_data;
2178 r = sumo_rlc_init(rdev);
2180 DRM_ERROR("Failed to init rlc BOs!\n");
2185 /* allocate wb buffer */
2186 r = radeon_wb_init(rdev);
2190 r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
2192 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
2196 cayman_uvd_start(rdev);
2197 cayman_vce_start(rdev);
2199 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
2201 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
2205 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
2207 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
2211 r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
2213 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
2217 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
2219 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
2224 if (!rdev->irq.installed) {
2225 r = radeon_irq_kms_init(rdev);
2230 r = r600_irq_init(rdev);
2232 DRM_ERROR("radeon: IH init failed (%d).\n", r);
2233 radeon_irq_kms_fini(rdev);
2236 evergreen_irq_set(rdev);
2238 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
2243 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2244 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
2245 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2249 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
2250 r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
2251 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2255 r = cayman_cp_load_microcode(rdev);
2258 r = cayman_cp_resume(rdev);
2262 r = cayman_dma_resume(rdev);
2266 cayman_uvd_resume(rdev);
2267 cayman_vce_resume(rdev);
2269 r = radeon_ib_pool_init(rdev);
2271 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
2275 r = radeon_vm_manager_init(rdev);
2277 dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
2281 r = radeon_audio_init(rdev);
2288 int cayman_resume(struct radeon_device *rdev)
2292 /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
2293 * posting will perform necessary task to bring back GPU into good
2297 atom_asic_init(rdev->mode_info.atom_context);
2299 /* init golden registers */
2300 ni_init_golden_registers(rdev);
2302 if (rdev->pm.pm_method == PM_METHOD_DPM)
2303 radeon_pm_resume(rdev);
2305 rdev->accel_working = true;
2306 r = cayman_startup(rdev);
2308 DRM_ERROR("cayman startup failed on resume\n");
2309 rdev->accel_working = false;
2315 int cayman_suspend(struct radeon_device *rdev)
2317 radeon_pm_suspend(rdev);
2318 radeon_audio_fini(rdev);
2319 radeon_vm_manager_fini(rdev);
2320 cayman_cp_enable(rdev, false);
2321 cayman_dma_stop(rdev);
2322 if (rdev->has_uvd) {
2323 uvd_v1_0_fini(rdev);
2324 radeon_uvd_suspend(rdev);
2326 evergreen_irq_suspend(rdev);
2327 radeon_wb_disable(rdev);
2328 cayman_pcie_gart_disable(rdev);
2332 /* Plan is to move initialization in that function and use
2333 * helper function so that radeon_device_init pretty much
2334 * do nothing more than calling asic specific function. This
2335 * should also allow to remove a bunch of callback function
2338 int cayman_init(struct radeon_device *rdev)
2340 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2344 if (!radeon_get_bios(rdev)) {
2345 if (ASIC_IS_AVIVO(rdev))
2348 /* Must be an ATOMBIOS */
2349 if (!rdev->is_atom_bios) {
2350 dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
2353 r = radeon_atombios_init(rdev);
2357 /* Post card if necessary */
2358 if (!radeon_card_posted(rdev)) {
2360 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
2363 DRM_INFO("GPU not posted. posting now...\n");
2364 atom_asic_init(rdev->mode_info.atom_context);
2366 /* init golden registers */
2367 ni_init_golden_registers(rdev);
2368 /* Initialize scratch registers */
2369 r600_scratch_init(rdev);
2370 /* Initialize surface registers */
2371 radeon_surface_init(rdev);
2372 /* Initialize clocks */
2373 radeon_get_clock_info(rdev->ddev);
2375 r = radeon_fence_driver_init(rdev);
2378 /* initialize memory controller */
2379 r = evergreen_mc_init(rdev);
2382 /* Memory manager */
2383 r = radeon_bo_init(rdev);
2387 if (rdev->flags & RADEON_IS_IGP) {
2388 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
2389 r = ni_init_microcode(rdev);
2391 DRM_ERROR("Failed to load firmware!\n");
2396 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
2397 r = ni_init_microcode(rdev);
2399 DRM_ERROR("Failed to load firmware!\n");
2405 /* Initialize power management */
2406 radeon_pm_init(rdev);
2408 ring->ring_obj = NULL;
2409 r600_ring_init(rdev, ring, 1024 * 1024);
2411 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2412 ring->ring_obj = NULL;
2413 r600_ring_init(rdev, ring, 64 * 1024);
2415 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
2416 ring->ring_obj = NULL;
2417 r600_ring_init(rdev, ring, 64 * 1024);
2419 cayman_uvd_init(rdev);
2420 cayman_vce_init(rdev);
2422 rdev->ih.ring_obj = NULL;
2423 r600_ih_ring_init(rdev, 64 * 1024);
2425 r = r600_pcie_gart_init(rdev);
2429 rdev->accel_working = true;
2430 r = cayman_startup(rdev);
2432 dev_err(rdev->dev, "disabling GPU acceleration\n");
2433 cayman_cp_fini(rdev);
2434 cayman_dma_fini(rdev);
2435 r600_irq_fini(rdev);
2436 if (rdev->flags & RADEON_IS_IGP)
2437 sumo_rlc_fini(rdev);
2438 radeon_wb_fini(rdev);
2439 radeon_ib_pool_fini(rdev);
2440 radeon_vm_manager_fini(rdev);
2441 radeon_irq_kms_fini(rdev);
2442 cayman_pcie_gart_fini(rdev);
2443 rdev->accel_working = false;
2446 /* Don't start up if the MC ucode is missing.
2447 * The default clocks and voltages before the MC ucode
2448 * is loaded are not suffient for advanced operations.
2450 * We can skip this check for TN, because there is no MC
2453 if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
2454 DRM_ERROR("radeon: MC ucode required for NI+.\n");
2461 void cayman_fini(struct radeon_device *rdev)
2463 radeon_pm_fini(rdev);
2464 cayman_cp_fini(rdev);
2465 cayman_dma_fini(rdev);
2466 r600_irq_fini(rdev);
2467 if (rdev->flags & RADEON_IS_IGP)
2468 sumo_rlc_fini(rdev);
2469 radeon_wb_fini(rdev);
2470 radeon_vm_manager_fini(rdev);
2471 radeon_ib_pool_fini(rdev);
2472 radeon_irq_kms_fini(rdev);
2473 uvd_v1_0_fini(rdev);
2474 radeon_uvd_fini(rdev);
2476 radeon_vce_fini(rdev);
2477 cayman_pcie_gart_fini(rdev);
2478 r600_vram_scratch_fini(rdev);
2479 radeon_gem_fini(rdev);
2480 radeon_fence_driver_fini(rdev);
2481 radeon_bo_fini(rdev);
2482 radeon_atombios_fini(rdev);
2490 int cayman_vm_init(struct radeon_device *rdev)
2493 rdev->vm_manager.nvm = 8;
2494 /* base offset of vram pages */
2495 if (rdev->flags & RADEON_IS_IGP) {
2496 u64 tmp = RREG32(FUS_MC_VM_FB_OFFSET);
2498 rdev->vm_manager.vram_base_offset = tmp;
2500 rdev->vm_manager.vram_base_offset = 0;
2504 void cayman_vm_fini(struct radeon_device *rdev)
2509 * cayman_vm_decode_fault - print human readable fault info
2511 * @rdev: radeon_device pointer
2512 * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
2513 * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
2515 * Print human readable fault information (cayman/TN).
2517 void cayman_vm_decode_fault(struct radeon_device *rdev,
2518 u32 status, u32 addr)
2520 u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
2521 u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
2522 u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
2614 block = "TC_TFETCH";
2624 block = "TC_VFETCH";
2663 printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n",
2664 protections, vmid, addr,
2665 (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
2670 * cayman_vm_flush - vm flush using the CP
2672 * @rdev: radeon_device pointer
2674 * Update the page table base and flush the VM TLB
2675 * using the CP (cayman-si).
2677 void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
2678 unsigned vm_id, uint64_t pd_addr)
2680 radeon_ring_write(ring, PACKET0(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2), 0));
2681 radeon_ring_write(ring, pd_addr >> 12);
2683 /* flush hdp cache */
2684 radeon_ring_write(ring, PACKET0(HDP_MEM_COHERENCY_FLUSH_CNTL, 0));
2685 radeon_ring_write(ring, 0x1);
2687 /* bits 0-7 are the VM contexts0-7 */
2688 radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0));
2689 radeon_ring_write(ring, 1 << vm_id);
2691 /* wait for the invalidate to complete */
2692 radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
2693 radeon_ring_write(ring, (WAIT_REG_MEM_FUNCTION(0) | /* always */
2694 WAIT_REG_MEM_ENGINE(0))); /* me */
2695 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
2696 radeon_ring_write(ring, 0);
2697 radeon_ring_write(ring, 0); /* ref */
2698 radeon_ring_write(ring, 0); /* mask */
2699 radeon_ring_write(ring, 0x20); /* poll interval */
2701 /* sync PFP to ME, otherwise we might get invalid PFP reads */
2702 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
2703 radeon_ring_write(ring, 0x0);
2706 int tn_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk)
2708 struct atom_clock_dividers dividers;
2711 r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
2712 ecclk, false, ÷rs);
2716 for (i = 0; i < 100; i++) {
2717 if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS)
2724 WREG32_P(CG_ECLK_CNTL, dividers.post_div, ~(ECLK_DIR_CNTL_EN|ECLK_DIVIDER_MASK));
2726 for (i = 0; i < 100; i++) {
2727 if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS)