diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /drivers/gpu/drm/radeon/rv770.c | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (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.c | 406 |
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) | |||
92 | void rv770_pcie_gart_disable(struct radeon_device *rdev) | 95 | void 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 | ||
121 | void rv770_pcie_gart_fini(struct radeon_device *rdev) | 128 | void 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 | */ |
272 | static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes, | 279 | static 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, | |||
381 | static void rv770_gpu_init(struct radeon_device *rdev) | 453 | static 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 | ||
773 | int rv770_mc_init(struct radeon_device *rdev) | 870 | int 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 | |||
863 | int rv770_gpu_reset(struct radeon_device *rdev) | 920 | int 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 | ||
935 | int rv770_suspend(struct radeon_device *rdev) | 1027 | int 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 | ||
1049 | void rv770_fini(struct radeon_device *rdev) | 1165 | void 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; |