diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r600.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 108 |
1 files changed, 57 insertions, 51 deletions
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 609719490ec2..278f646bc18e 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -339,11 +339,10 @@ int r600_mc_init(struct radeon_device *rdev) | |||
| 339 | { | 339 | { |
| 340 | fixed20_12 a; | 340 | fixed20_12 a; |
| 341 | u32 tmp; | 341 | u32 tmp; |
| 342 | int chansize; | 342 | int chansize, numchan; |
| 343 | int r; | 343 | int r; |
| 344 | 344 | ||
| 345 | /* Get VRAM informations */ | 345 | /* Get VRAM informations */ |
| 346 | rdev->mc.vram_width = 128; | ||
| 347 | rdev->mc.vram_is_ddr = true; | 346 | rdev->mc.vram_is_ddr = true; |
| 348 | tmp = RREG32(RAMCFG); | 347 | tmp = RREG32(RAMCFG); |
| 349 | if (tmp & CHANSIZE_OVERRIDE) { | 348 | if (tmp & CHANSIZE_OVERRIDE) { |
| @@ -353,17 +352,23 @@ int r600_mc_init(struct radeon_device *rdev) | |||
| 353 | } else { | 352 | } else { |
| 354 | chansize = 32; | 353 | chansize = 32; |
| 355 | } | 354 | } |
| 356 | if (rdev->family == CHIP_R600) { | 355 | tmp = RREG32(CHMAP); |
| 357 | rdev->mc.vram_width = 8 * chansize; | 356 | switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) { |
| 358 | } else if (rdev->family == CHIP_RV670) { | 357 | case 0: |
| 359 | rdev->mc.vram_width = 4 * chansize; | 358 | default: |
| 360 | } else if ((rdev->family == CHIP_RV610) || | 359 | numchan = 1; |
| 361 | (rdev->family == CHIP_RV620)) { | 360 | break; |
| 362 | rdev->mc.vram_width = chansize; | 361 | case 1: |
| 363 | } else if ((rdev->family == CHIP_RV630) || | 362 | numchan = 2; |
| 364 | (rdev->family == CHIP_RV635)) { | 363 | break; |
| 365 | rdev->mc.vram_width = 2 * chansize; | 364 | case 2: |
| 365 | numchan = 4; | ||
| 366 | break; | ||
| 367 | case 3: | ||
| 368 | numchan = 8; | ||
| 369 | break; | ||
| 366 | } | 370 | } |
| 371 | rdev->mc.vram_width = numchan * chansize; | ||
| 367 | /* Could aper size report 0 ? */ | 372 | /* Could aper size report 0 ? */ |
| 368 | rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); | 373 | rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); |
| 369 | rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); | 374 | rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); |
| @@ -404,35 +409,29 @@ int r600_mc_init(struct radeon_device *rdev) | |||
| 404 | rdev->mc.gtt_location = rdev->mc.mc_vram_size; | 409 | rdev->mc.gtt_location = rdev->mc.mc_vram_size; |
| 405 | } | 410 | } |
| 406 | } else { | 411 | } else { |
| 407 | if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) { | 412 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; |
| 408 | rdev->mc.vram_location = (RREG32(MC_VM_FB_LOCATION) & | 413 | rdev->mc.vram_location = (RREG32(MC_VM_FB_LOCATION) & |
| 409 | 0xFFFF) << 24; | 414 | 0xFFFF) << 24; |
| 410 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | 415 | tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size; |
| 411 | tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size; | 416 | if ((0xFFFFFFFFUL - tmp) >= rdev->mc.gtt_size) { |
| 412 | if ((0xFFFFFFFFUL - tmp) >= rdev->mc.gtt_size) { | 417 | /* Enough place after vram */ |
| 413 | /* Enough place after vram */ | 418 | rdev->mc.gtt_location = tmp; |
| 414 | rdev->mc.gtt_location = tmp; | 419 | } else if (rdev->mc.vram_location >= rdev->mc.gtt_size) { |
| 415 | } else if (rdev->mc.vram_location >= rdev->mc.gtt_size) { | 420 | /* Enough place before vram */ |
| 416 | /* Enough place before vram */ | 421 | rdev->mc.gtt_location = 0; |
| 422 | } else { | ||
| 423 | /* Not enough place after or before shrink | ||
| 424 | * gart size | ||
| 425 | */ | ||
| 426 | if (rdev->mc.vram_location > (0xFFFFFFFFUL - tmp)) { | ||
| 417 | rdev->mc.gtt_location = 0; | 427 | rdev->mc.gtt_location = 0; |
| 428 | rdev->mc.gtt_size = rdev->mc.vram_location; | ||
| 418 | } else { | 429 | } else { |
| 419 | /* Not enough place after or before shrink | 430 | rdev->mc.gtt_location = tmp; |
| 420 | * gart size | 431 | rdev->mc.gtt_size = 0xFFFFFFFFUL - tmp; |
| 421 | */ | ||
| 422 | if (rdev->mc.vram_location > (0xFFFFFFFFUL - tmp)) { | ||
| 423 | rdev->mc.gtt_location = 0; | ||
| 424 | rdev->mc.gtt_size = rdev->mc.vram_location; | ||
| 425 | } else { | ||
| 426 | rdev->mc.gtt_location = tmp; | ||
| 427 | rdev->mc.gtt_size = 0xFFFFFFFFUL - tmp; | ||
| 428 | } | ||
| 429 | } | 432 | } |
| 430 | rdev->mc.gtt_location = rdev->mc.mc_vram_size; | ||
| 431 | } else { | ||
| 432 | rdev->mc.vram_location = 0x00000000UL; | ||
| 433 | rdev->mc.gtt_location = rdev->mc.mc_vram_size; | ||
| 434 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | ||
| 435 | } | 433 | } |
| 434 | rdev->mc.gtt_location = rdev->mc.mc_vram_size; | ||
| 436 | } | 435 | } |
| 437 | rdev->mc.vram_start = rdev->mc.vram_location; | 436 | rdev->mc.vram_start = rdev->mc.vram_location; |
| 438 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; | 437 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; |
| @@ -859,7 +858,8 @@ void r600_gpu_init(struct radeon_device *rdev) | |||
| 859 | ((rdev->family) == CHIP_RV630) || | 858 | ((rdev->family) == CHIP_RV630) || |
| 860 | ((rdev->family) == CHIP_RV610) || | 859 | ((rdev->family) == CHIP_RV610) || |
| 861 | ((rdev->family) == CHIP_RV620) || | 860 | ((rdev->family) == CHIP_RV620) || |
| 862 | ((rdev->family) == CHIP_RS780)) { | 861 | ((rdev->family) == CHIP_RS780) || |
| 862 | ((rdev->family) == CHIP_RS880)) { | ||
| 863 | WREG32(DB_DEBUG, PREZ_MUST_WAIT_FOR_POSTZ_DONE); | 863 | WREG32(DB_DEBUG, PREZ_MUST_WAIT_FOR_POSTZ_DONE); |
| 864 | } else { | 864 | } else { |
| 865 | WREG32(DB_DEBUG, 0); | 865 | WREG32(DB_DEBUG, 0); |
| @@ -876,7 +876,8 @@ void r600_gpu_init(struct radeon_device *rdev) | |||
| 876 | tmp = RREG32(SQ_MS_FIFO_SIZES); | 876 | tmp = RREG32(SQ_MS_FIFO_SIZES); |
| 877 | if (((rdev->family) == CHIP_RV610) || | 877 | if (((rdev->family) == CHIP_RV610) || |
| 878 | ((rdev->family) == CHIP_RV620) || | 878 | ((rdev->family) == CHIP_RV620) || |
| 879 | ((rdev->family) == CHIP_RS780)) { | 879 | ((rdev->family) == CHIP_RS780) || |
| 880 | ((rdev->family) == CHIP_RS880)) { | ||
| 880 | tmp = (CACHE_FIFO_SIZE(0xa) | | 881 | tmp = (CACHE_FIFO_SIZE(0xa) | |
| 881 | FETCH_FIFO_HIWATER(0xa) | | 882 | FETCH_FIFO_HIWATER(0xa) | |
| 882 | DONE_FIFO_HIWATER(0xe0) | | 883 | DONE_FIFO_HIWATER(0xe0) | |
| @@ -919,7 +920,8 @@ void r600_gpu_init(struct radeon_device *rdev) | |||
| 919 | NUM_ES_STACK_ENTRIES(0)); | 920 | NUM_ES_STACK_ENTRIES(0)); |
| 920 | } else if (((rdev->family) == CHIP_RV610) || | 921 | } else if (((rdev->family) == CHIP_RV610) || |
| 921 | ((rdev->family) == CHIP_RV620) || | 922 | ((rdev->family) == CHIP_RV620) || |
| 922 | ((rdev->family) == CHIP_RS780)) { | 923 | ((rdev->family) == CHIP_RS780) || |
| 924 | ((rdev->family) == CHIP_RS880)) { | ||
| 923 | /* no vertex cache */ | 925 | /* no vertex cache */ |
| 924 | sq_config &= ~VC_ENABLE; | 926 | sq_config &= ~VC_ENABLE; |
| 925 | 927 | ||
| @@ -976,7 +978,8 @@ void r600_gpu_init(struct radeon_device *rdev) | |||
| 976 | 978 | ||
| 977 | if (((rdev->family) == CHIP_RV610) || | 979 | if (((rdev->family) == CHIP_RV610) || |
| 978 | ((rdev->family) == CHIP_RV620) || | 980 | ((rdev->family) == CHIP_RV620) || |
| 979 | ((rdev->family) == CHIP_RS780)) { | 981 | ((rdev->family) == CHIP_RS780) || |
| 982 | ((rdev->family) == CHIP_RS880)) { | ||
| 980 | WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(TC_ONLY)); | 983 | WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(TC_ONLY)); |
| 981 | } else { | 984 | } else { |
| 982 | WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC)); | 985 | WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC)); |
| @@ -1002,8 +1005,9 @@ void r600_gpu_init(struct radeon_device *rdev) | |||
| 1002 | tmp = rdev->config.r600.max_pipes * 16; | 1005 | tmp = rdev->config.r600.max_pipes * 16; |
| 1003 | switch (rdev->family) { | 1006 | switch (rdev->family) { |
| 1004 | case CHIP_RV610: | 1007 | case CHIP_RV610: |
| 1005 | case CHIP_RS780: | ||
| 1006 | case CHIP_RV620: | 1008 | case CHIP_RV620: |
| 1009 | case CHIP_RS780: | ||
| 1010 | case CHIP_RS880: | ||
| 1007 | tmp += 32; | 1011 | tmp += 32; |
| 1008 | break; | 1012 | break; |
| 1009 | case CHIP_RV670: | 1013 | case CHIP_RV670: |
| @@ -1044,8 +1048,9 @@ void r600_gpu_init(struct radeon_device *rdev) | |||
| 1044 | 1048 | ||
| 1045 | switch (rdev->family) { | 1049 | switch (rdev->family) { |
| 1046 | case CHIP_RV610: | 1050 | case CHIP_RV610: |
| 1047 | case CHIP_RS780: | ||
| 1048 | case CHIP_RV620: | 1051 | case CHIP_RV620: |
| 1052 | case CHIP_RS780: | ||
| 1053 | case CHIP_RS880: | ||
| 1049 | tmp = TC_L2_SIZE(8); | 1054 | tmp = TC_L2_SIZE(8); |
| 1050 | break; | 1055 | break; |
| 1051 | case CHIP_RV630: | 1056 | case CHIP_RV630: |
| @@ -1267,19 +1272,17 @@ int r600_cp_resume(struct radeon_device *rdev) | |||
| 1267 | 1272 | ||
| 1268 | /* Set ring buffer size */ | 1273 | /* Set ring buffer size */ |
| 1269 | rb_bufsz = drm_order(rdev->cp.ring_size / 8); | 1274 | rb_bufsz = drm_order(rdev->cp.ring_size / 8); |
| 1275 | tmp = RB_NO_UPDATE | (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz; | ||
| 1270 | #ifdef __BIG_ENDIAN | 1276 | #ifdef __BIG_ENDIAN |
| 1271 | WREG32(CP_RB_CNTL, BUF_SWAP_32BIT | RB_NO_UPDATE | | 1277 | tmp |= BUF_SWAP_32BIT; |
| 1272 | (drm_order(4096/8) << 8) | rb_bufsz); | ||
| 1273 | #else | ||
| 1274 | WREG32(CP_RB_CNTL, RB_NO_UPDATE | (drm_order(4096/8) << 8) | rb_bufsz); | ||
| 1275 | #endif | 1278 | #endif |
| 1279 | WREG32(CP_RB_CNTL, tmp); | ||
| 1276 | WREG32(CP_SEM_WAIT_TIMER, 0x4); | 1280 | WREG32(CP_SEM_WAIT_TIMER, 0x4); |
| 1277 | 1281 | ||
| 1278 | /* Set the write pointer delay */ | 1282 | /* Set the write pointer delay */ |
| 1279 | WREG32(CP_RB_WPTR_DELAY, 0); | 1283 | WREG32(CP_RB_WPTR_DELAY, 0); |
| 1280 | 1284 | ||
| 1281 | /* Initialize the ring buffer's read and write pointers */ | 1285 | /* Initialize the ring buffer's read and write pointers */ |
| 1282 | tmp = RREG32(CP_RB_CNTL); | ||
| 1283 | WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA); | 1286 | WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA); |
| 1284 | WREG32(CP_RB_RPTR_WR, 0); | 1287 | WREG32(CP_RB_RPTR_WR, 0); |
| 1285 | WREG32(CP_RB_WPTR, 0); | 1288 | WREG32(CP_RB_WPTR, 0); |
| @@ -1400,7 +1403,7 @@ int r600_wb_enable(struct radeon_device *rdev) | |||
| 1400 | int r; | 1403 | int r; |
| 1401 | 1404 | ||
| 1402 | if (rdev->wb.wb_obj == NULL) { | 1405 | if (rdev->wb.wb_obj == NULL) { |
| 1403 | r = radeon_object_create(rdev, NULL, 4096, true, | 1406 | r = radeon_object_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, true, |
| 1404 | RADEON_GEM_DOMAIN_GTT, false, &rdev->wb.wb_obj); | 1407 | RADEON_GEM_DOMAIN_GTT, false, &rdev->wb.wb_obj); |
| 1405 | if (r) { | 1408 | if (r) { |
| 1406 | dev_warn(rdev->dev, "failed to create WB buffer (%d).\n", r); | 1409 | dev_warn(rdev->dev, "failed to create WB buffer (%d).\n", r); |
| @@ -1450,8 +1453,8 @@ int r600_copy_blit(struct radeon_device *rdev, | |||
| 1450 | uint64_t src_offset, uint64_t dst_offset, | 1453 | uint64_t src_offset, uint64_t dst_offset, |
| 1451 | unsigned num_pages, struct radeon_fence *fence) | 1454 | unsigned num_pages, struct radeon_fence *fence) |
| 1452 | { | 1455 | { |
| 1453 | r600_blit_prepare_copy(rdev, num_pages * 4096); | 1456 | r600_blit_prepare_copy(rdev, num_pages * RADEON_GPU_PAGE_SIZE); |
| 1454 | r600_kms_blit_copy(rdev, src_offset, dst_offset, num_pages * 4096); | 1457 | r600_kms_blit_copy(rdev, src_offset, dst_offset, num_pages * RADEON_GPU_PAGE_SIZE); |
| 1455 | r600_blit_done_copy(rdev, fence); | 1458 | r600_blit_done_copy(rdev, fence); |
| 1456 | return 0; | 1459 | return 0; |
| 1457 | } | 1460 | } |
| @@ -1632,10 +1635,13 @@ int r600_init(struct radeon_device *rdev) | |||
| 1632 | r600_scratch_init(rdev); | 1635 | r600_scratch_init(rdev); |
| 1633 | /* Initialize surface registers */ | 1636 | /* Initialize surface registers */ |
| 1634 | radeon_surface_init(rdev); | 1637 | radeon_surface_init(rdev); |
| 1638 | /* Initialize clocks */ | ||
| 1635 | radeon_get_clock_info(rdev->ddev); | 1639 | radeon_get_clock_info(rdev->ddev); |
| 1636 | r = radeon_clocks_init(rdev); | 1640 | r = radeon_clocks_init(rdev); |
| 1637 | if (r) | 1641 | if (r) |
| 1638 | return r; | 1642 | return r; |
| 1643 | /* Initialize power management */ | ||
| 1644 | radeon_pm_init(rdev); | ||
| 1639 | /* Fence driver */ | 1645 | /* Fence driver */ |
| 1640 | r = radeon_fence_driver_init(rdev); | 1646 | r = radeon_fence_driver_init(rdev); |
| 1641 | if (r) | 1647 | if (r) |
