aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/rv770.c
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /drivers/gpu/drm/radeon/rv770.c
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff)
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/gpu/drm/radeon/rv770.c')
-rw-r--r--drivers/gpu/drm/radeon/rv770.c406
1 files changed, 261 insertions, 145 deletions
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index b0efd0ddae7a..97958a64df1a 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -27,8 +27,10 @@
27 */ 27 */
28#include <linux/firmware.h> 28#include <linux/firmware.h>
29#include <linux/platform_device.h> 29#include <linux/platform_device.h>
30#include <linux/slab.h>
30#include "drmP.h" 31#include "drmP.h"
31#include "radeon.h" 32#include "radeon.h"
33#include "radeon_asic.h"
32#include "radeon_drm.h" 34#include "radeon_drm.h"
33#include "rv770d.h" 35#include "rv770d.h"
34#include "atom.h" 36#include "atom.h"
@@ -56,6 +58,7 @@ int rv770_pcie_gart_enable(struct radeon_device *rdev)
56 r = radeon_gart_table_vram_pin(rdev); 58 r = radeon_gart_table_vram_pin(rdev);
57 if (r) 59 if (r)
58 return r; 60 return r;
61 radeon_gart_restore(rdev);
59 /* Setup L2 cache */ 62 /* Setup L2 cache */
60 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | 63 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
61 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | 64 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
@@ -92,7 +95,7 @@ int rv770_pcie_gart_enable(struct radeon_device *rdev)
92void rv770_pcie_gart_disable(struct radeon_device *rdev) 95void rv770_pcie_gart_disable(struct radeon_device *rdev)
93{ 96{
94 u32 tmp; 97 u32 tmp;
95 int i; 98 int i, r;
96 99
97 /* Disable all tables */ 100 /* Disable all tables */
98 for (i = 0; i < 7; i++) 101 for (i = 0; i < 7; i++)
@@ -113,16 +116,20 @@ void rv770_pcie_gart_disable(struct radeon_device *rdev)
113 WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); 116 WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
114 WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); 117 WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
115 if (rdev->gart.table.vram.robj) { 118 if (rdev->gart.table.vram.robj) {
116 radeon_object_kunmap(rdev->gart.table.vram.robj); 119 r = radeon_bo_reserve(rdev->gart.table.vram.robj, false);
117 radeon_object_unpin(rdev->gart.table.vram.robj); 120 if (likely(r == 0)) {
121 radeon_bo_kunmap(rdev->gart.table.vram.robj);
122 radeon_bo_unpin(rdev->gart.table.vram.robj);
123 radeon_bo_unreserve(rdev->gart.table.vram.robj);
124 }
118 } 125 }
119} 126}
120 127
121void rv770_pcie_gart_fini(struct radeon_device *rdev) 128void rv770_pcie_gart_fini(struct radeon_device *rdev)
122{ 129{
130 radeon_gart_fini(rdev);
123 rv770_pcie_gart_disable(rdev); 131 rv770_pcie_gart_disable(rdev);
124 radeon_gart_table_vram_free(rdev); 132 radeon_gart_table_vram_free(rdev);
125 radeon_gart_fini(rdev);
126} 133}
127 134
128 135
@@ -269,9 +276,10 @@ static int rv770_cp_load_microcode(struct radeon_device *rdev)
269/* 276/*
270 * Core functions 277 * Core functions
271 */ 278 */
272static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes, 279static u32 r700_get_tile_pipe_to_backend_map(struct radeon_device *rdev,
273 u32 num_backends, 280 u32 num_tile_pipes,
274 u32 backend_disable_mask) 281 u32 num_backends,
282 u32 backend_disable_mask)
275{ 283{
276 u32 backend_map = 0; 284 u32 backend_map = 0;
277 u32 enabled_backends_mask; 285 u32 enabled_backends_mask;
@@ -280,6 +288,7 @@ static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
280 u32 swizzle_pipe[R7XX_MAX_PIPES]; 288 u32 swizzle_pipe[R7XX_MAX_PIPES];
281 u32 cur_backend; 289 u32 cur_backend;
282 u32 i; 290 u32 i;
291 bool force_no_swizzle;
283 292
284 if (num_tile_pipes > R7XX_MAX_PIPES) 293 if (num_tile_pipes > R7XX_MAX_PIPES)
285 num_tile_pipes = R7XX_MAX_PIPES; 294 num_tile_pipes = R7XX_MAX_PIPES;
@@ -309,6 +318,18 @@ static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
309 if (enabled_backends_count != num_backends) 318 if (enabled_backends_count != num_backends)
310 num_backends = enabled_backends_count; 319 num_backends = enabled_backends_count;
311 320
321 switch (rdev->family) {
322 case CHIP_RV770:
323 case CHIP_RV730:
324 force_no_swizzle = false;
325 break;
326 case CHIP_RV710:
327 case CHIP_RV740:
328 default:
329 force_no_swizzle = true;
330 break;
331 }
332
312 memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * R7XX_MAX_PIPES); 333 memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * R7XX_MAX_PIPES);
313 switch (num_tile_pipes) { 334 switch (num_tile_pipes) {
314 case 1: 335 case 1:
@@ -319,49 +340,100 @@ static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
319 swizzle_pipe[1] = 1; 340 swizzle_pipe[1] = 1;
320 break; 341 break;
321 case 3: 342 case 3:
322 swizzle_pipe[0] = 0; 343 if (force_no_swizzle) {
323 swizzle_pipe[1] = 2; 344 swizzle_pipe[0] = 0;
324 swizzle_pipe[2] = 1; 345 swizzle_pipe[1] = 1;
346 swizzle_pipe[2] = 2;
347 } else {
348 swizzle_pipe[0] = 0;
349 swizzle_pipe[1] = 2;
350 swizzle_pipe[2] = 1;
351 }
325 break; 352 break;
326 case 4: 353 case 4:
327 swizzle_pipe[0] = 0; 354 if (force_no_swizzle) {
328 swizzle_pipe[1] = 2; 355 swizzle_pipe[0] = 0;
329 swizzle_pipe[2] = 3; 356 swizzle_pipe[1] = 1;
330 swizzle_pipe[3] = 1; 357 swizzle_pipe[2] = 2;
358 swizzle_pipe[3] = 3;
359 } else {
360 swizzle_pipe[0] = 0;
361 swizzle_pipe[1] = 2;
362 swizzle_pipe[2] = 3;
363 swizzle_pipe[3] = 1;
364 }
331 break; 365 break;
332 case 5: 366 case 5:
333 swizzle_pipe[0] = 0; 367 if (force_no_swizzle) {
334 swizzle_pipe[1] = 2; 368 swizzle_pipe[0] = 0;
335 swizzle_pipe[2] = 4; 369 swizzle_pipe[1] = 1;
336 swizzle_pipe[3] = 1; 370 swizzle_pipe[2] = 2;
337 swizzle_pipe[4] = 3; 371 swizzle_pipe[3] = 3;
372 swizzle_pipe[4] = 4;
373 } else {
374 swizzle_pipe[0] = 0;
375 swizzle_pipe[1] = 2;
376 swizzle_pipe[2] = 4;
377 swizzle_pipe[3] = 1;
378 swizzle_pipe[4] = 3;
379 }
338 break; 380 break;
339 case 6: 381 case 6:
340 swizzle_pipe[0] = 0; 382 if (force_no_swizzle) {
341 swizzle_pipe[1] = 2; 383 swizzle_pipe[0] = 0;
342 swizzle_pipe[2] = 4; 384 swizzle_pipe[1] = 1;
343 swizzle_pipe[3] = 5; 385 swizzle_pipe[2] = 2;
344 swizzle_pipe[4] = 3; 386 swizzle_pipe[3] = 3;
345 swizzle_pipe[5] = 1; 387 swizzle_pipe[4] = 4;
388 swizzle_pipe[5] = 5;
389 } else {
390 swizzle_pipe[0] = 0;
391 swizzle_pipe[1] = 2;
392 swizzle_pipe[2] = 4;
393 swizzle_pipe[3] = 5;
394 swizzle_pipe[4] = 3;
395 swizzle_pipe[5] = 1;
396 }
346 break; 397 break;
347 case 7: 398 case 7:
348 swizzle_pipe[0] = 0; 399 if (force_no_swizzle) {
349 swizzle_pipe[1] = 2; 400 swizzle_pipe[0] = 0;
350 swizzle_pipe[2] = 4; 401 swizzle_pipe[1] = 1;
351 swizzle_pipe[3] = 6; 402 swizzle_pipe[2] = 2;
352 swizzle_pipe[4] = 3; 403 swizzle_pipe[3] = 3;
353 swizzle_pipe[5] = 1; 404 swizzle_pipe[4] = 4;
354 swizzle_pipe[6] = 5; 405 swizzle_pipe[5] = 5;
406 swizzle_pipe[6] = 6;
407 } else {
408 swizzle_pipe[0] = 0;
409 swizzle_pipe[1] = 2;
410 swizzle_pipe[2] = 4;
411 swizzle_pipe[3] = 6;
412 swizzle_pipe[4] = 3;
413 swizzle_pipe[5] = 1;
414 swizzle_pipe[6] = 5;
415 }
355 break; 416 break;
356 case 8: 417 case 8:
357 swizzle_pipe[0] = 0; 418 if (force_no_swizzle) {
358 swizzle_pipe[1] = 2; 419 swizzle_pipe[0] = 0;
359 swizzle_pipe[2] = 4; 420 swizzle_pipe[1] = 1;
360 swizzle_pipe[3] = 6; 421 swizzle_pipe[2] = 2;
361 swizzle_pipe[4] = 3; 422 swizzle_pipe[3] = 3;
362 swizzle_pipe[5] = 1; 423 swizzle_pipe[4] = 4;
363 swizzle_pipe[6] = 7; 424 swizzle_pipe[5] = 5;
364 swizzle_pipe[7] = 5; 425 swizzle_pipe[6] = 6;
426 swizzle_pipe[7] = 7;
427 } else {
428 swizzle_pipe[0] = 0;
429 swizzle_pipe[1] = 2;
430 swizzle_pipe[2] = 4;
431 swizzle_pipe[3] = 6;
432 swizzle_pipe[4] = 3;
433 swizzle_pipe[5] = 1;
434 swizzle_pipe[6] = 7;
435 swizzle_pipe[7] = 5;
436 }
365 break; 437 break;
366 } 438 }
367 439
@@ -381,8 +453,10 @@ static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
381static void rv770_gpu_init(struct radeon_device *rdev) 453static void rv770_gpu_init(struct radeon_device *rdev)
382{ 454{
383 int i, j, num_qd_pipes; 455 int i, j, num_qd_pipes;
456 u32 ta_aux_cntl;
384 u32 sx_debug_1; 457 u32 sx_debug_1;
385 u32 smx_dc_ctl0; 458 u32 smx_dc_ctl0;
459 u32 db_debug3;
386 u32 num_gs_verts_per_thread; 460 u32 num_gs_verts_per_thread;
387 u32 vgt_gs_per_es; 461 u32 vgt_gs_per_es;
388 u32 gs_prim_buffer_depth = 0; 462 u32 gs_prim_buffer_depth = 0;
@@ -511,6 +585,7 @@ static void rv770_gpu_init(struct radeon_device *rdev)
511 585
512 switch (rdev->config.rv770.max_tile_pipes) { 586 switch (rdev->config.rv770.max_tile_pipes) {
513 case 1: 587 case 1:
588 default:
514 gb_tiling_config |= PIPE_TILING(0); 589 gb_tiling_config |= PIPE_TILING(0);
515 break; 590 break;
516 case 2: 591 case 2:
@@ -522,16 +597,17 @@ static void rv770_gpu_init(struct radeon_device *rdev)
522 case 8: 597 case 8:
523 gb_tiling_config |= PIPE_TILING(3); 598 gb_tiling_config |= PIPE_TILING(3);
524 break; 599 break;
525 default:
526 break;
527 } 600 }
601 rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
528 602
529 if (rdev->family == CHIP_RV770) 603 if (rdev->family == CHIP_RV770)
530 gb_tiling_config |= BANK_TILING(1); 604 gb_tiling_config |= BANK_TILING(1);
531 else 605 else
532 gb_tiling_config |= BANK_TILING((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT); 606 gb_tiling_config |= BANK_TILING((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT);
607 rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3);
533 608
534 gb_tiling_config |= GROUP_SIZE(0); 609 gb_tiling_config |= GROUP_SIZE(0);
610 rdev->config.rv770.tiling_group_size = 256;
535 611
536 if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) { 612 if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) {
537 gb_tiling_config |= ROW_TILING(3); 613 gb_tiling_config |= ROW_TILING(3);
@@ -545,18 +621,27 @@ static void rv770_gpu_init(struct radeon_device *rdev)
545 621
546 gb_tiling_config |= BANK_SWAPS(1); 622 gb_tiling_config |= BANK_SWAPS(1);
547 623
548 backend_map = r700_get_tile_pipe_to_backend_map(rdev->config.rv770.max_tile_pipes, 624 cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000;
549 rdev->config.rv770.max_backends, 625 cc_rb_backend_disable |=
550 (0xff << rdev->config.rv770.max_backends) & 0xff); 626 BACKEND_DISABLE((R7XX_MAX_BACKENDS_MASK << rdev->config.rv770.max_backends) & R7XX_MAX_BACKENDS_MASK);
551 gb_tiling_config |= BACKEND_MAP(backend_map);
552 627
553 cc_gc_shader_pipe_config = 628 cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
629 cc_gc_shader_pipe_config |=
554 INACTIVE_QD_PIPES((R7XX_MAX_PIPES_MASK << rdev->config.rv770.max_pipes) & R7XX_MAX_PIPES_MASK); 630 INACTIVE_QD_PIPES((R7XX_MAX_PIPES_MASK << rdev->config.rv770.max_pipes) & R7XX_MAX_PIPES_MASK);
555 cc_gc_shader_pipe_config |= 631 cc_gc_shader_pipe_config |=
556 INACTIVE_SIMDS((R7XX_MAX_SIMDS_MASK << rdev->config.rv770.max_simds) & R7XX_MAX_SIMDS_MASK); 632 INACTIVE_SIMDS((R7XX_MAX_SIMDS_MASK << rdev->config.rv770.max_simds) & R7XX_MAX_SIMDS_MASK);
557 633
558 cc_rb_backend_disable = 634 if (rdev->family == CHIP_RV740)
559 BACKEND_DISABLE((R7XX_MAX_BACKENDS_MASK << rdev->config.rv770.max_backends) & R7XX_MAX_BACKENDS_MASK); 635 backend_map = 0x28;
636 else
637 backend_map = r700_get_tile_pipe_to_backend_map(rdev,
638 rdev->config.rv770.max_tile_pipes,
639 (R7XX_MAX_BACKENDS -
640 r600_count_pipe_bits((cc_rb_backend_disable &
641 R7XX_MAX_BACKENDS_MASK) >> 16)),
642 (cc_rb_backend_disable >> 16));
643 gb_tiling_config |= BACKEND_MAP(backend_map);
644
560 645
561 WREG32(GB_TILING_CONFIG, gb_tiling_config); 646 WREG32(GB_TILING_CONFIG, gb_tiling_config);
562 WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff)); 647 WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
@@ -565,15 +650,15 @@ static void rv770_gpu_init(struct radeon_device *rdev)
565 WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable); 650 WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable);
566 WREG32(CC_GC_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config); 651 WREG32(CC_GC_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
567 WREG32(GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config); 652 WREG32(GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
653 WREG32(CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
568 654
569 WREG32(CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
570 WREG32(CGTS_SYS_TCC_DISABLE, 0); 655 WREG32(CGTS_SYS_TCC_DISABLE, 0);
571 WREG32(CGTS_TCC_DISABLE, 0); 656 WREG32(CGTS_TCC_DISABLE, 0);
572 WREG32(CGTS_USER_SYS_TCC_DISABLE, 0); 657 WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
573 WREG32(CGTS_USER_TCC_DISABLE, 0); 658 WREG32(CGTS_USER_TCC_DISABLE, 0);
574 659
575 num_qd_pipes = 660 num_qd_pipes =
576 R7XX_MAX_BACKENDS - r600_count_pipe_bits(cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK); 661 R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8);
577 WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK); 662 WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK);
578 WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK); 663 WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK);
579 664
@@ -583,10 +668,8 @@ static void rv770_gpu_init(struct radeon_device *rdev)
583 668
584 WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30)); 669 WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
585 670
586 WREG32(TA_CNTL_AUX, (DISABLE_CUBE_ANISO | 671 ta_aux_cntl = RREG32(TA_CNTL_AUX);
587 SYNC_GRADIENT | 672 WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO);
588 SYNC_WALKER |
589 SYNC_ALIGNER));
590 673
591 sx_debug_1 = RREG32(SX_DEBUG_1); 674 sx_debug_1 = RREG32(SX_DEBUG_1);
592 sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS; 675 sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
@@ -597,14 +680,28 @@ static void rv770_gpu_init(struct radeon_device *rdev)
597 smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1); 680 smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1);
598 WREG32(SMX_DC_CTL0, smx_dc_ctl0); 681 WREG32(SMX_DC_CTL0, smx_dc_ctl0);
599 682
600 WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) | 683 if (rdev->family != CHIP_RV740)
601 GS_FLUSH_CTL(4) | 684 WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
602 ACK_FLUSH_CTL(3) | 685 GS_FLUSH_CTL(4) |
603 SYNC_FLUSH_CTL)); 686 ACK_FLUSH_CTL(3) |
687 SYNC_FLUSH_CTL));
604 688
605 if (rdev->family == CHIP_RV770) 689 db_debug3 = RREG32(DB_DEBUG3);
606 WREG32(DB_DEBUG3, DB_CLK_OFF_DELAY(0x1f)); 690 db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
607 else { 691 switch (rdev->family) {
692 case CHIP_RV770:
693 case CHIP_RV740:
694 db_debug3 |= DB_CLK_OFF_DELAY(0x1f);
695 break;
696 case CHIP_RV710:
697 case CHIP_RV730:
698 default:
699 db_debug3 |= DB_CLK_OFF_DELAY(2);
700 break;
701 }
702 WREG32(DB_DEBUG3, db_debug3);
703
704 if (rdev->family != CHIP_RV770) {
608 db_debug4 = RREG32(DB_DEBUG4); 705 db_debug4 = RREG32(DB_DEBUG4);
609 db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER; 706 db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER;
610 WREG32(DB_DEBUG4, db_debug4); 707 WREG32(DB_DEBUG4, db_debug4);
@@ -633,10 +730,10 @@ static void rv770_gpu_init(struct radeon_device *rdev)
633 ALU_UPDATE_FIFO_HIWATER(0x8)); 730 ALU_UPDATE_FIFO_HIWATER(0x8));
634 switch (rdev->family) { 731 switch (rdev->family) {
635 case CHIP_RV770: 732 case CHIP_RV770:
636 sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
637 break;
638 case CHIP_RV730: 733 case CHIP_RV730:
639 case CHIP_RV710: 734 case CHIP_RV710:
735 sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
736 break;
640 case CHIP_RV740: 737 case CHIP_RV740:
641 default: 738 default:
642 sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4); 739 sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4);
@@ -772,10 +869,8 @@ static void rv770_gpu_init(struct radeon_device *rdev)
772 869
773int rv770_mc_init(struct radeon_device *rdev) 870int rv770_mc_init(struct radeon_device *rdev)
774{ 871{
775 fixed20_12 a;
776 u32 tmp; 872 u32 tmp;
777 int chansize, numchan; 873 int chansize, numchan;
778 int r;
779 874
780 /* Get VRAM informations */ 875 /* Get VRAM informations */
781 rdev->mc.vram_is_ddr = true; 876 rdev->mc.vram_is_ddr = true;
@@ -810,56 +905,18 @@ int rv770_mc_init(struct radeon_device *rdev)
810 /* Setup GPU memory space */ 905 /* Setup GPU memory space */
811 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); 906 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
812 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); 907 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
813 908 rdev->mc.visible_vram_size = rdev->mc.aper_size;
814 if (rdev->mc.mc_vram_size > rdev->mc.aper_size) 909 /* FIXME remove this once we support unmappable VRAM */
910 if (rdev->mc.mc_vram_size > rdev->mc.aper_size) {
815 rdev->mc.mc_vram_size = rdev->mc.aper_size; 911 rdev->mc.mc_vram_size = rdev->mc.aper_size;
816
817 if (rdev->mc.real_vram_size > rdev->mc.aper_size)
818 rdev->mc.real_vram_size = rdev->mc.aper_size; 912 rdev->mc.real_vram_size = rdev->mc.aper_size;
819
820 if (rdev->flags & RADEON_IS_AGP) {
821 r = radeon_agp_init(rdev);
822 if (r)
823 return r;
824 /* gtt_size is setup by radeon_agp_init */
825 rdev->mc.gtt_location = rdev->mc.agp_base;
826 tmp = 0xFFFFFFFFUL - rdev->mc.agp_base - rdev->mc.gtt_size;
827 /* Try to put vram before or after AGP because we
828 * we want SYSTEM_APERTURE to cover both VRAM and
829 * AGP so that GPU can catch out of VRAM/AGP access
830 */
831 if (rdev->mc.gtt_location > rdev->mc.mc_vram_size) {
832 /* Enought place before */
833 rdev->mc.vram_location = rdev->mc.gtt_location -
834 rdev->mc.mc_vram_size;
835 } else if (tmp > rdev->mc.mc_vram_size) {
836 /* Enought place after */
837 rdev->mc.vram_location = rdev->mc.gtt_location +
838 rdev->mc.gtt_size;
839 } else {
840 /* Try to setup VRAM then AGP might not
841 * not work on some card
842 */
843 rdev->mc.vram_location = 0x00000000UL;
844 rdev->mc.gtt_location = rdev->mc.mc_vram_size;
845 }
846 } else {
847 rdev->mc.vram_location = 0x00000000UL;
848 rdev->mc.gtt_location = rdev->mc.mc_vram_size;
849 rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
850 } 913 }
851 rdev->mc.vram_start = rdev->mc.vram_location; 914 r600_vram_gtt_location(rdev, &rdev->mc);
852 rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; 915 radeon_update_bandwidth_info(rdev);
853 rdev->mc.gtt_start = rdev->mc.gtt_location; 916
854 rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size - 1;
855 /* FIXME: we should enforce default clock in case GPU is not in
856 * default setup
857 */
858 a.full = rfixed_const(100);
859 rdev->pm.sclk.full = rfixed_const(rdev->clock.default_sclk);
860 rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a);
861 return 0; 917 return 0;
862} 918}
919
863int rv770_gpu_reset(struct radeon_device *rdev) 920int rv770_gpu_reset(struct radeon_device *rdev)
864{ 921{
865 /* FIXME: implement any rv770 specific bits */ 922 /* FIXME: implement any rv770 specific bits */
@@ -870,6 +927,14 @@ static int rv770_startup(struct radeon_device *rdev)
870{ 927{
871 int r; 928 int r;
872 929
930 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
931 r = r600_init_microcode(rdev);
932 if (r) {
933 DRM_ERROR("Failed to load firmware!\n");
934 return r;
935 }
936 }
937
873 rv770_mc_program(rdev); 938 rv770_mc_program(rdev);
874 if (rdev->flags & RADEON_IS_AGP) { 939 if (rdev->flags & RADEON_IS_AGP) {
875 rv770_agp_enable(rdev); 940 rv770_agp_enable(rdev);
@@ -879,13 +944,33 @@ static int rv770_startup(struct radeon_device *rdev)
879 return r; 944 return r;
880 } 945 }
881 rv770_gpu_init(rdev); 946 rv770_gpu_init(rdev);
882 947 r = r600_blit_init(rdev);
883 r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM,
884 &rdev->r600_blit.shader_gpu_addr);
885 if (r) { 948 if (r) {
886 DRM_ERROR("failed to pin blit object %d\n", r); 949 r600_blit_fini(rdev);
950 rdev->asic->copy = NULL;
951 dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
952 }
953 /* pin copy shader into vram */
954 if (rdev->r600_blit.shader_obj) {
955 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
956 if (unlikely(r != 0))
957 return r;
958 r = radeon_bo_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM,
959 &rdev->r600_blit.shader_gpu_addr);
960 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
961 if (r) {
962 DRM_ERROR("failed to pin blit object %d\n", r);
963 return r;
964 }
965 }
966 /* Enable IRQ */
967 r = r600_irq_init(rdev);
968 if (r) {
969 DRM_ERROR("radeon: IH init failed (%d).\n", r);
970 radeon_irq_kms_fini(rdev);
887 return r; 971 return r;
888 } 972 }
973 r600_irq_set(rdev);
889 974
890 r = radeon_ring_init(rdev, rdev->cp.ring_size); 975 r = radeon_ring_init(rdev, rdev->cp.ring_size);
891 if (r) 976 if (r)
@@ -928,19 +1013,36 @@ int rv770_resume(struct radeon_device *rdev)
928 DRM_ERROR("radeon: failled testing IB (%d).\n", r); 1013 DRM_ERROR("radeon: failled testing IB (%d).\n", r);
929 return r; 1014 return r;
930 } 1015 }
1016
1017 r = r600_audio_init(rdev);
1018 if (r) {
1019 dev_err(rdev->dev, "radeon: audio init failed\n");
1020 return r;
1021 }
1022
931 return r; 1023 return r;
932 1024
933} 1025}
934 1026
935int rv770_suspend(struct radeon_device *rdev) 1027int rv770_suspend(struct radeon_device *rdev)
936{ 1028{
1029 int r;
1030
1031 r600_audio_fini(rdev);
937 /* FIXME: we should wait for ring to be empty */ 1032 /* FIXME: we should wait for ring to be empty */
938 r700_cp_stop(rdev); 1033 r700_cp_stop(rdev);
939 rdev->cp.ready = false; 1034 rdev->cp.ready = false;
1035 r600_irq_suspend(rdev);
940 r600_wb_disable(rdev); 1036 r600_wb_disable(rdev);
941 rv770_pcie_gart_disable(rdev); 1037 rv770_pcie_gart_disable(rdev);
942 /* unpin shaders bo */ 1038 /* unpin shaders bo */
943 radeon_object_unpin(rdev->r600_blit.shader_obj); 1039 if (rdev->r600_blit.shader_obj) {
1040 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
1041 if (likely(r == 0)) {
1042 radeon_bo_unpin(rdev->r600_blit.shader_obj);
1043 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
1044 }
1045 }
944 return 0; 1046 return 0;
945} 1047}
946 1048
@@ -975,7 +1077,11 @@ int rv770_init(struct radeon_device *rdev)
975 if (r) 1077 if (r)
976 return r; 1078 return r;
977 /* Post card if necessary */ 1079 /* Post card if necessary */
978 if (!r600_card_posted(rdev) && rdev->bios) { 1080 if (!r600_card_posted(rdev)) {
1081 if (!rdev->bios) {
1082 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
1083 return -EINVAL;
1084 }
979 DRM_INFO("GPU not posted. posting now...\n"); 1085 DRM_INFO("GPU not posted. posting now...\n");
980 atom_asic_init(rdev->mode_info.atom_context); 1086 atom_asic_init(rdev->mode_info.atom_context);
981 } 1087 }
@@ -994,72 +1100,82 @@ int rv770_init(struct radeon_device *rdev)
994 r = radeon_fence_driver_init(rdev); 1100 r = radeon_fence_driver_init(rdev);
995 if (r) 1101 if (r)
996 return r; 1102 return r;
1103 /* initialize AGP */
1104 if (rdev->flags & RADEON_IS_AGP) {
1105 r = radeon_agp_init(rdev);
1106 if (r)
1107 radeon_agp_disable(rdev);
1108 }
997 r = rv770_mc_init(rdev); 1109 r = rv770_mc_init(rdev);
998 if (r) 1110 if (r)
999 return r; 1111 return r;
1000 /* Memory manager */ 1112 /* Memory manager */
1001 r = radeon_object_init(rdev); 1113 r = radeon_bo_init(rdev);
1114 if (r)
1115 return r;
1116
1117 r = radeon_irq_kms_init(rdev);
1002 if (r) 1118 if (r)
1003 return r; 1119 return r;
1120
1004 rdev->cp.ring_obj = NULL; 1121 rdev->cp.ring_obj = NULL;
1005 r600_ring_init(rdev, 1024 * 1024); 1122 r600_ring_init(rdev, 1024 * 1024);
1006 1123
1007 if (!rdev->me_fw || !rdev->pfp_fw) { 1124 rdev->ih.ring_obj = NULL;
1008 r = r600_cp_init_microcode(rdev); 1125 r600_ih_ring_init(rdev, 64 * 1024);
1009 if (r) {
1010 DRM_ERROR("Failed to load firmware!\n");
1011 return r;
1012 }
1013 }
1014 1126
1015 r = r600_pcie_gart_init(rdev); 1127 r = r600_pcie_gart_init(rdev);
1016 if (r) 1128 if (r)
1017 return r; 1129 return r;
1018 1130
1019 rdev->accel_working = true; 1131 rdev->accel_working = true;
1020 r = r600_blit_init(rdev);
1021 if (r) {
1022 DRM_ERROR("radeon: failled blitter (%d).\n", r);
1023 rdev->accel_working = false;
1024 }
1025
1026 r = rv770_startup(rdev); 1132 r = rv770_startup(rdev);
1027 if (r) { 1133 if (r) {
1028 rv770_suspend(rdev); 1134 dev_err(rdev->dev, "disabling GPU acceleration\n");
1135 r600_cp_fini(rdev);
1029 r600_wb_fini(rdev); 1136 r600_wb_fini(rdev);
1030 radeon_ring_fini(rdev); 1137 r600_irq_fini(rdev);
1138 radeon_irq_kms_fini(rdev);
1031 rv770_pcie_gart_fini(rdev); 1139 rv770_pcie_gart_fini(rdev);
1032 rdev->accel_working = false; 1140 rdev->accel_working = false;
1033 } 1141 }
1034 if (rdev->accel_working) { 1142 if (rdev->accel_working) {
1035 r = radeon_ib_pool_init(rdev); 1143 r = radeon_ib_pool_init(rdev);
1036 if (r) { 1144 if (r) {
1037 DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r); 1145 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
1038 rdev->accel_working = false;
1039 }
1040 r = r600_ib_test(rdev);
1041 if (r) {
1042 DRM_ERROR("radeon: failled testing IB (%d).\n", r);
1043 rdev->accel_working = false; 1146 rdev->accel_working = false;
1147 } else {
1148 r = r600_ib_test(rdev);
1149 if (r) {
1150 dev_err(rdev->dev, "IB test failed (%d).\n", r);
1151 rdev->accel_working = false;
1152 }
1044 } 1153 }
1045 } 1154 }
1155
1156 r = r600_audio_init(rdev);
1157 if (r) {
1158 dev_err(rdev->dev, "radeon: audio init failed\n");
1159 return r;
1160 }
1161
1046 return 0; 1162 return 0;
1047} 1163}
1048 1164
1049void rv770_fini(struct radeon_device *rdev) 1165void rv770_fini(struct radeon_device *rdev)
1050{ 1166{
1051 rv770_suspend(rdev); 1167 radeon_pm_fini(rdev);
1052
1053 r600_blit_fini(rdev); 1168 r600_blit_fini(rdev);
1054 radeon_ring_fini(rdev); 1169 r600_cp_fini(rdev);
1055 r600_wb_fini(rdev); 1170 r600_wb_fini(rdev);
1171 r600_irq_fini(rdev);
1172 radeon_irq_kms_fini(rdev);
1056 rv770_pcie_gart_fini(rdev); 1173 rv770_pcie_gart_fini(rdev);
1057 radeon_gem_fini(rdev); 1174 radeon_gem_fini(rdev);
1058 radeon_fence_driver_fini(rdev); 1175 radeon_fence_driver_fini(rdev);
1059 radeon_clocks_fini(rdev); 1176 radeon_clocks_fini(rdev);
1060 if (rdev->flags & RADEON_IS_AGP) 1177 radeon_agp_fini(rdev);
1061 radeon_agp_fini(rdev); 1178 radeon_bo_fini(rdev);
1062 radeon_object_fini(rdev);
1063 radeon_atombios_fini(rdev); 1179 radeon_atombios_fini(rdev);
1064 kfree(rdev->bios); 1180 kfree(rdev->bios);
1065 rdev->bios = NULL; 1181 rdev->bios = NULL;