aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/rv770.c
diff options
context:
space:
mode:
authorAlex Deucher <alexdeucher@gmail.com>2010-02-19 16:22:31 -0500
committerDave Airlie <airlied@redhat.com>2010-02-22 18:46:23 -0500
commitd03f5d5971f2dd4bd259c46e065299661d8fdc9f (patch)
treedd4164b08a02261e7360a6b0c1bf1177dc92bb80 /drivers/gpu/drm/radeon/rv770.c
parent6271901d828b34b27607314026deaf417f9f9b75 (diff)
drm/radeon: fixes for r6xx/r7xx gfx init
- updated swizzle modes for backend map setup - fix programming of a few gfx regs - properly handle pipe/backend setup on LE cards Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/rv770.c')
-rw-r--r--drivers/gpu/drm/radeon/rv770.c218
1 files changed, 148 insertions, 70 deletions
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index f4bb0b129a0f..88356b0a1f63 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -274,9 +274,10 @@ static int rv770_cp_load_microcode(struct radeon_device *rdev)
274/* 274/*
275 * Core functions 275 * Core functions
276 */ 276 */
277static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes, 277static u32 r700_get_tile_pipe_to_backend_map(struct radeon_device *rdev,
278 u32 num_backends, 278 u32 num_tile_pipes,
279 u32 backend_disable_mask) 279 u32 num_backends,
280 u32 backend_disable_mask)
280{ 281{
281 u32 backend_map = 0; 282 u32 backend_map = 0;
282 u32 enabled_backends_mask; 283 u32 enabled_backends_mask;
@@ -285,6 +286,7 @@ static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
285 u32 swizzle_pipe[R7XX_MAX_PIPES]; 286 u32 swizzle_pipe[R7XX_MAX_PIPES];
286 u32 cur_backend; 287 u32 cur_backend;
287 u32 i; 288 u32 i;
289 bool force_no_swizzle;
288 290
289 if (num_tile_pipes > R7XX_MAX_PIPES) 291 if (num_tile_pipes > R7XX_MAX_PIPES)
290 num_tile_pipes = R7XX_MAX_PIPES; 292 num_tile_pipes = R7XX_MAX_PIPES;
@@ -314,6 +316,18 @@ static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
314 if (enabled_backends_count != num_backends) 316 if (enabled_backends_count != num_backends)
315 num_backends = enabled_backends_count; 317 num_backends = enabled_backends_count;
316 318
319 switch (rdev->family) {
320 case CHIP_RV770:
321 case CHIP_RV730:
322 force_no_swizzle = false;
323 break;
324 case CHIP_RV710:
325 case CHIP_RV740:
326 default:
327 force_no_swizzle = true;
328 break;
329 }
330
317 memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * R7XX_MAX_PIPES); 331 memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * R7XX_MAX_PIPES);
318 switch (num_tile_pipes) { 332 switch (num_tile_pipes) {
319 case 1: 333 case 1:
@@ -324,49 +338,100 @@ static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
324 swizzle_pipe[1] = 1; 338 swizzle_pipe[1] = 1;
325 break; 339 break;
326 case 3: 340 case 3:
327 swizzle_pipe[0] = 0; 341 if (force_no_swizzle) {
328 swizzle_pipe[1] = 2; 342 swizzle_pipe[0] = 0;
329 swizzle_pipe[2] = 1; 343 swizzle_pipe[1] = 1;
344 swizzle_pipe[2] = 2;
345 } else {
346 swizzle_pipe[0] = 0;
347 swizzle_pipe[1] = 2;
348 swizzle_pipe[2] = 1;
349 }
330 break; 350 break;
331 case 4: 351 case 4:
332 swizzle_pipe[0] = 0; 352 if (force_no_swizzle) {
333 swizzle_pipe[1] = 2; 353 swizzle_pipe[0] = 0;
334 swizzle_pipe[2] = 3; 354 swizzle_pipe[1] = 1;
335 swizzle_pipe[3] = 1; 355 swizzle_pipe[2] = 2;
356 swizzle_pipe[3] = 3;
357 } else {
358 swizzle_pipe[0] = 0;
359 swizzle_pipe[1] = 2;
360 swizzle_pipe[2] = 3;
361 swizzle_pipe[3] = 1;
362 }
336 break; 363 break;
337 case 5: 364 case 5:
338 swizzle_pipe[0] = 0; 365 if (force_no_swizzle) {
339 swizzle_pipe[1] = 2; 366 swizzle_pipe[0] = 0;
340 swizzle_pipe[2] = 4; 367 swizzle_pipe[1] = 1;
341 swizzle_pipe[3] = 1; 368 swizzle_pipe[2] = 2;
342 swizzle_pipe[4] = 3; 369 swizzle_pipe[3] = 3;
370 swizzle_pipe[4] = 4;
371 } else {
372 swizzle_pipe[0] = 0;
373 swizzle_pipe[1] = 2;
374 swizzle_pipe[2] = 4;
375 swizzle_pipe[3] = 1;
376 swizzle_pipe[4] = 3;
377 }
343 break; 378 break;
344 case 6: 379 case 6:
345 swizzle_pipe[0] = 0; 380 if (force_no_swizzle) {
346 swizzle_pipe[1] = 2; 381 swizzle_pipe[0] = 0;
347 swizzle_pipe[2] = 4; 382 swizzle_pipe[1] = 1;
348 swizzle_pipe[3] = 5; 383 swizzle_pipe[2] = 2;
349 swizzle_pipe[4] = 3; 384 swizzle_pipe[3] = 3;
350 swizzle_pipe[5] = 1; 385 swizzle_pipe[4] = 4;
386 swizzle_pipe[5] = 5;
387 } else {
388 swizzle_pipe[0] = 0;
389 swizzle_pipe[1] = 2;
390 swizzle_pipe[2] = 4;
391 swizzle_pipe[3] = 5;
392 swizzle_pipe[4] = 3;
393 swizzle_pipe[5] = 1;
394 }
351 break; 395 break;
352 case 7: 396 case 7:
353 swizzle_pipe[0] = 0; 397 if (force_no_swizzle) {
354 swizzle_pipe[1] = 2; 398 swizzle_pipe[0] = 0;
355 swizzle_pipe[2] = 4; 399 swizzle_pipe[1] = 1;
356 swizzle_pipe[3] = 6; 400 swizzle_pipe[2] = 2;
357 swizzle_pipe[4] = 3; 401 swizzle_pipe[3] = 3;
358 swizzle_pipe[5] = 1; 402 swizzle_pipe[4] = 4;
359 swizzle_pipe[6] = 5; 403 swizzle_pipe[5] = 5;
404 swizzle_pipe[6] = 6;
405 } else {
406 swizzle_pipe[0] = 0;
407 swizzle_pipe[1] = 2;
408 swizzle_pipe[2] = 4;
409 swizzle_pipe[3] = 6;
410 swizzle_pipe[4] = 3;
411 swizzle_pipe[5] = 1;
412 swizzle_pipe[6] = 5;
413 }
360 break; 414 break;
361 case 8: 415 case 8:
362 swizzle_pipe[0] = 0; 416 if (force_no_swizzle) {
363 swizzle_pipe[1] = 2; 417 swizzle_pipe[0] = 0;
364 swizzle_pipe[2] = 4; 418 swizzle_pipe[1] = 1;
365 swizzle_pipe[3] = 6; 419 swizzle_pipe[2] = 2;
366 swizzle_pipe[4] = 3; 420 swizzle_pipe[3] = 3;
367 swizzle_pipe[5] = 1; 421 swizzle_pipe[4] = 4;
368 swizzle_pipe[6] = 7; 422 swizzle_pipe[5] = 5;
369 swizzle_pipe[7] = 5; 423 swizzle_pipe[6] = 6;
424 swizzle_pipe[7] = 7;
425 } else {
426 swizzle_pipe[0] = 0;
427 swizzle_pipe[1] = 2;
428 swizzle_pipe[2] = 4;
429 swizzle_pipe[3] = 6;
430 swizzle_pipe[4] = 3;
431 swizzle_pipe[5] = 1;
432 swizzle_pipe[6] = 7;
433 swizzle_pipe[7] = 5;
434 }
370 break; 435 break;
371 } 436 }
372 437
@@ -386,8 +451,10 @@ static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
386static void rv770_gpu_init(struct radeon_device *rdev) 451static void rv770_gpu_init(struct radeon_device *rdev)
387{ 452{
388 int i, j, num_qd_pipes; 453 int i, j, num_qd_pipes;
454 u32 ta_aux_cntl;
389 u32 sx_debug_1; 455 u32 sx_debug_1;
390 u32 smx_dc_ctl0; 456 u32 smx_dc_ctl0;
457 u32 db_debug3;
391 u32 num_gs_verts_per_thread; 458 u32 num_gs_verts_per_thread;
392 u32 vgt_gs_per_es; 459 u32 vgt_gs_per_es;
393 u32 gs_prim_buffer_depth = 0; 460 u32 gs_prim_buffer_depth = 0;
@@ -516,24 +583,20 @@ static void rv770_gpu_init(struct radeon_device *rdev)
516 583
517 switch (rdev->config.rv770.max_tile_pipes) { 584 switch (rdev->config.rv770.max_tile_pipes) {
518 case 1: 585 case 1:
586 default:
519 gb_tiling_config |= PIPE_TILING(0); 587 gb_tiling_config |= PIPE_TILING(0);
520 rdev->config.rv770.tiling_npipes = 1;
521 break; 588 break;
522 case 2: 589 case 2:
523 gb_tiling_config |= PIPE_TILING(1); 590 gb_tiling_config |= PIPE_TILING(1);
524 rdev->config.rv770.tiling_npipes = 2;
525 break; 591 break;
526 case 4: 592 case 4:
527 gb_tiling_config |= PIPE_TILING(2); 593 gb_tiling_config |= PIPE_TILING(2);
528 rdev->config.rv770.tiling_npipes = 4;
529 break; 594 break;
530 case 8: 595 case 8:
531 gb_tiling_config |= PIPE_TILING(3); 596 gb_tiling_config |= PIPE_TILING(3);
532 rdev->config.rv770.tiling_npipes = 8;
533 break;
534 default:
535 break; 597 break;
536 } 598 }
599 rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
537 600
538 if (rdev->family == CHIP_RV770) 601 if (rdev->family == CHIP_RV770)
539 gb_tiling_config |= BANK_TILING(1); 602 gb_tiling_config |= BANK_TILING(1);
@@ -556,21 +619,27 @@ static void rv770_gpu_init(struct radeon_device *rdev)
556 619
557 gb_tiling_config |= BANK_SWAPS(1); 620 gb_tiling_config |= BANK_SWAPS(1);
558 621
559 if (rdev->family == CHIP_RV740) 622 cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000;
560 backend_map = 0x28; 623 cc_rb_backend_disable |=
561 else 624 BACKEND_DISABLE((R7XX_MAX_BACKENDS_MASK << rdev->config.rv770.max_backends) & R7XX_MAX_BACKENDS_MASK);
562 backend_map = r700_get_tile_pipe_to_backend_map(rdev->config.rv770.max_tile_pipes,
563 rdev->config.rv770.max_backends,
564 (0xff << rdev->config.rv770.max_backends) & 0xff);
565 gb_tiling_config |= BACKEND_MAP(backend_map);
566 625
567 cc_gc_shader_pipe_config = 626 cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
627 cc_gc_shader_pipe_config |=
568 INACTIVE_QD_PIPES((R7XX_MAX_PIPES_MASK << rdev->config.rv770.max_pipes) & R7XX_MAX_PIPES_MASK); 628 INACTIVE_QD_PIPES((R7XX_MAX_PIPES_MASK << rdev->config.rv770.max_pipes) & R7XX_MAX_PIPES_MASK);
569 cc_gc_shader_pipe_config |= 629 cc_gc_shader_pipe_config |=
570 INACTIVE_SIMDS((R7XX_MAX_SIMDS_MASK << rdev->config.rv770.max_simds) & R7XX_MAX_SIMDS_MASK); 630 INACTIVE_SIMDS((R7XX_MAX_SIMDS_MASK << rdev->config.rv770.max_simds) & R7XX_MAX_SIMDS_MASK);
571 631
572 cc_rb_backend_disable = 632 if (rdev->family == CHIP_RV740)
573 BACKEND_DISABLE((R7XX_MAX_BACKENDS_MASK << rdev->config.rv770.max_backends) & R7XX_MAX_BACKENDS_MASK); 633 backend_map = 0x28;
634 else
635 backend_map = r700_get_tile_pipe_to_backend_map(rdev,
636 rdev->config.rv770.max_tile_pipes,
637 (R7XX_MAX_BACKENDS -
638 r600_count_pipe_bits((cc_rb_backend_disable &
639 R7XX_MAX_BACKENDS_MASK) >> 16)),
640 (cc_rb_backend_disable >> 16));
641 gb_tiling_config |= BACKEND_MAP(backend_map);
642
574 643
575 WREG32(GB_TILING_CONFIG, gb_tiling_config); 644 WREG32(GB_TILING_CONFIG, gb_tiling_config);
576 WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff)); 645 WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
@@ -578,16 +647,13 @@ static void rv770_gpu_init(struct radeon_device *rdev)
578 647
579 WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable); 648 WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable);
580 WREG32(CC_GC_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config); 649 WREG32(CC_GC_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
581 WREG32(GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config); 650 WREG32(CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
582 651
583 WREG32(CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
584 WREG32(CGTS_SYS_TCC_DISABLE, 0); 652 WREG32(CGTS_SYS_TCC_DISABLE, 0);
585 WREG32(CGTS_TCC_DISABLE, 0); 653 WREG32(CGTS_TCC_DISABLE, 0);
586 WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
587 WREG32(CGTS_USER_TCC_DISABLE, 0);
588 654
589 num_qd_pipes = 655 num_qd_pipes =
590 R7XX_MAX_BACKENDS - r600_count_pipe_bits(cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK); 656 R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8);
591 WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK); 657 WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK);
592 WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK); 658 WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK);
593 659
@@ -597,10 +663,8 @@ static void rv770_gpu_init(struct radeon_device *rdev)
597 663
598 WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30)); 664 WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
599 665
600 WREG32(TA_CNTL_AUX, (DISABLE_CUBE_ANISO | 666 ta_aux_cntl = RREG32(TA_CNTL_AUX);
601 SYNC_GRADIENT | 667 WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO);
602 SYNC_WALKER |
603 SYNC_ALIGNER));
604 668
605 sx_debug_1 = RREG32(SX_DEBUG_1); 669 sx_debug_1 = RREG32(SX_DEBUG_1);
606 sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS; 670 sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
@@ -611,14 +675,28 @@ static void rv770_gpu_init(struct radeon_device *rdev)
611 smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1); 675 smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1);
612 WREG32(SMX_DC_CTL0, smx_dc_ctl0); 676 WREG32(SMX_DC_CTL0, smx_dc_ctl0);
613 677
614 WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) | 678 if (rdev->family != CHIP_RV740)
615 GS_FLUSH_CTL(4) | 679 WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
616 ACK_FLUSH_CTL(3) | 680 GS_FLUSH_CTL(4) |
617 SYNC_FLUSH_CTL)); 681 ACK_FLUSH_CTL(3) |
682 SYNC_FLUSH_CTL));
618 683
619 if (rdev->family == CHIP_RV770) 684 db_debug3 = RREG32(DB_DEBUG3);
620 WREG32(DB_DEBUG3, DB_CLK_OFF_DELAY(0x1f)); 685 db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
621 else { 686 switch (rdev->family) {
687 case CHIP_RV770:
688 case CHIP_RV740:
689 db_debug3 |= DB_CLK_OFF_DELAY(0x1f);
690 break;
691 case CHIP_RV710:
692 case CHIP_RV730:
693 default:
694 db_debug3 |= DB_CLK_OFF_DELAY(2);
695 break;
696 }
697 WREG32(DB_DEBUG3, db_debug3);
698
699 if (rdev->family != CHIP_RV770) {
622 db_debug4 = RREG32(DB_DEBUG4); 700 db_debug4 = RREG32(DB_DEBUG4);
623 db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER; 701 db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER;
624 WREG32(DB_DEBUG4, db_debug4); 702 WREG32(DB_DEBUG4, db_debug4);
@@ -647,10 +725,10 @@ static void rv770_gpu_init(struct radeon_device *rdev)
647 ALU_UPDATE_FIFO_HIWATER(0x8)); 725 ALU_UPDATE_FIFO_HIWATER(0x8));
648 switch (rdev->family) { 726 switch (rdev->family) {
649 case CHIP_RV770: 727 case CHIP_RV770:
650 sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
651 break;
652 case CHIP_RV730: 728 case CHIP_RV730:
653 case CHIP_RV710: 729 case CHIP_RV710:
730 sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
731 break;
654 case CHIP_RV740: 732 case CHIP_RV740:
655 default: 733 default:
656 sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4); 734 sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4);