diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 117 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600d.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/rv770.c | 79 |
4 files changed, 157 insertions, 41 deletions
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 2cef638fa069..6b43a95a5fb2 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -65,16 +65,11 @@ MODULE_FIRMWARE("radeon/RV710_me.bin"); | |||
65 | 65 | ||
66 | int r600_debugfs_mc_info_init(struct radeon_device *rdev); | 66 | int r600_debugfs_mc_info_init(struct radeon_device *rdev); |
67 | 67 | ||
68 | /* This files gather functions specifics to: | 68 | /* r600,rv610,rv630,rv620,rv635,rv670 */ |
69 | * r600,rv610,rv630,rv620,rv635,rv670 | ||
70 | * | ||
71 | * Some of these functions might be used by newer ASICs. | ||
72 | */ | ||
73 | int r600_mc_wait_for_idle(struct radeon_device *rdev); | 69 | int r600_mc_wait_for_idle(struct radeon_device *rdev); |
74 | void r600_gpu_init(struct radeon_device *rdev); | 70 | void r600_gpu_init(struct radeon_device *rdev); |
75 | void r600_fini(struct radeon_device *rdev); | 71 | void r600_fini(struct radeon_device *rdev); |
76 | 72 | ||
77 | |||
78 | /* | 73 | /* |
79 | * R600 PCIE GART | 74 | * R600 PCIE GART |
80 | */ | 75 | */ |
@@ -168,7 +163,7 @@ int r600_pcie_gart_enable(struct radeon_device *rdev) | |||
168 | WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); | 163 | WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); |
169 | WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); | 164 | WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); |
170 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); | 165 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); |
171 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, (rdev->mc.gtt_end - 1) >> 12); | 166 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12); |
172 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); | 167 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); |
173 | WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | | 168 | WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | |
174 | RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); | 169 | RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); |
@@ -225,6 +220,40 @@ void r600_pcie_gart_fini(struct radeon_device *rdev) | |||
225 | radeon_gart_fini(rdev); | 220 | radeon_gart_fini(rdev); |
226 | } | 221 | } |
227 | 222 | ||
223 | void r600_agp_enable(struct radeon_device *rdev) | ||
224 | { | ||
225 | u32 tmp; | ||
226 | int i; | ||
227 | |||
228 | /* Setup L2 cache */ | ||
229 | WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | | ||
230 | ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | | ||
231 | EFFECTIVE_L2_QUEUE_SIZE(7)); | ||
232 | WREG32(VM_L2_CNTL2, 0); | ||
233 | WREG32(VM_L2_CNTL3, BANK_SELECT_0(0) | BANK_SELECT_1(1)); | ||
234 | /* Setup TLB control */ | ||
235 | tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING | | ||
236 | SYSTEM_ACCESS_MODE_NOT_IN_SYS | | ||
237 | EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5) | | ||
238 | ENABLE_WAIT_L2_QUERY; | ||
239 | WREG32(MC_VM_L1_TLB_MCB_RD_SYS_CNTL, tmp); | ||
240 | WREG32(MC_VM_L1_TLB_MCB_WR_SYS_CNTL, tmp); | ||
241 | WREG32(MC_VM_L1_TLB_MCB_RD_HDP_CNTL, tmp | ENABLE_L1_STRICT_ORDERING); | ||
242 | WREG32(MC_VM_L1_TLB_MCB_WR_HDP_CNTL, tmp); | ||
243 | WREG32(MC_VM_L1_TLB_MCD_RD_A_CNTL, tmp); | ||
244 | WREG32(MC_VM_L1_TLB_MCD_WR_A_CNTL, tmp); | ||
245 | WREG32(MC_VM_L1_TLB_MCD_RD_B_CNTL, tmp); | ||
246 | WREG32(MC_VM_L1_TLB_MCD_WR_B_CNTL, tmp); | ||
247 | WREG32(MC_VM_L1_TLB_MCB_RD_GFX_CNTL, tmp); | ||
248 | WREG32(MC_VM_L1_TLB_MCB_WR_GFX_CNTL, tmp); | ||
249 | WREG32(MC_VM_L1_TLB_MCB_RD_PDMA_CNTL, tmp); | ||
250 | WREG32(MC_VM_L1_TLB_MCB_WR_PDMA_CNTL, tmp); | ||
251 | WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); | ||
252 | WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); | ||
253 | for (i = 0; i < 7; i++) | ||
254 | WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); | ||
255 | } | ||
256 | |||
228 | int r600_mc_wait_for_idle(struct radeon_device *rdev) | 257 | int r600_mc_wait_for_idle(struct radeon_device *rdev) |
229 | { | 258 | { |
230 | unsigned i; | 259 | unsigned i; |
@@ -263,18 +292,34 @@ static void r600_mc_program(struct radeon_device *rdev) | |||
263 | /* Lockout access through VGA aperture (doesn't exist before R600) */ | 292 | /* Lockout access through VGA aperture (doesn't exist before R600) */ |
264 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); | 293 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); |
265 | /* Update configuration */ | 294 | /* Update configuration */ |
266 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12); | 295 | if (rdev->flags & RADEON_IS_AGP) { |
267 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, (rdev->mc.vram_end - 1) >> 12); | 296 | if (rdev->mc.vram_start < rdev->mc.gtt_start) { |
297 | /* VRAM before AGP */ | ||
298 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
299 | rdev->mc.vram_start >> 12); | ||
300 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
301 | rdev->mc.gtt_end >> 12); | ||
302 | } else { | ||
303 | /* VRAM after AGP */ | ||
304 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
305 | rdev->mc.gtt_start >> 12); | ||
306 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
307 | rdev->mc.vram_end >> 12); | ||
308 | } | ||
309 | } else { | ||
310 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12); | ||
311 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, rdev->mc.vram_end >> 12); | ||
312 | } | ||
268 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); | 313 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); |
269 | tmp = (((rdev->mc.vram_end - 1) >> 24) & 0xFFFF) << 16; | 314 | tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; |
270 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); | 315 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); |
271 | WREG32(MC_VM_FB_LOCATION, tmp); | 316 | WREG32(MC_VM_FB_LOCATION, tmp); |
272 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); | 317 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); |
273 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); | 318 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); |
274 | WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF); | 319 | WREG32(HDP_NONSURFACE_SIZE, rdev->mc.mc_vram_size | 0x3FF); |
275 | if (rdev->flags & RADEON_IS_AGP) { | 320 | if (rdev->flags & RADEON_IS_AGP) { |
276 | WREG32(MC_VM_AGP_TOP, (rdev->mc.gtt_end - 1) >> 16); | 321 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 22); |
277 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); | 322 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 22); |
278 | WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); | 323 | WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); |
279 | } else { | 324 | } else { |
280 | WREG32(MC_VM_AGP_BASE, 0); | 325 | WREG32(MC_VM_AGP_BASE, 0); |
@@ -390,9 +435,9 @@ int r600_mc_init(struct radeon_device *rdev) | |||
390 | } | 435 | } |
391 | } | 436 | } |
392 | rdev->mc.vram_start = rdev->mc.vram_location; | 437 | rdev->mc.vram_start = rdev->mc.vram_location; |
393 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size; | 438 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; |
394 | rdev->mc.gtt_start = rdev->mc.gtt_location; | 439 | rdev->mc.gtt_start = rdev->mc.gtt_location; |
395 | rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size; | 440 | rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; |
396 | /* FIXME: we should enforce default clock in case GPU is not in | 441 | /* FIXME: we should enforce default clock in case GPU is not in |
397 | * default setup | 442 | * default setup |
398 | */ | 443 | */ |
@@ -428,9 +473,13 @@ int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
428 | u32 srbm_reset = 0; | 473 | u32 srbm_reset = 0; |
429 | u32 tmp; | 474 | u32 tmp; |
430 | 475 | ||
431 | dev_info(rdev->dev, "GPU softreset (R_008010_GRBM_STATUS=0x%08X " | 476 | dev_info(rdev->dev, "GPU softreset \n"); |
432 | "R_008014_GRBM_STATUS2=0x%08X)\n", RREG32(R_008010_GRBM_STATUS), | 477 | dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n", |
478 | RREG32(R_008010_GRBM_STATUS)); | ||
479 | dev_info(rdev->dev, " R_008014_GRBM_STATUS2=0x%08X\n", | ||
433 | RREG32(R_008014_GRBM_STATUS2)); | 480 | RREG32(R_008014_GRBM_STATUS2)); |
481 | dev_info(rdev->dev, " R_000E50_SRBM_STATUS=0x%08X\n", | ||
482 | RREG32(R_000E50_SRBM_STATUS)); | ||
434 | rv515_mc_stop(rdev, &save); | 483 | rv515_mc_stop(rdev, &save); |
435 | if (r600_mc_wait_for_idle(rdev)) { | 484 | if (r600_mc_wait_for_idle(rdev)) { |
436 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); | 485 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
@@ -453,7 +502,7 @@ int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
453 | S_008020_SOFT_RESET_TA(1) | | 502 | S_008020_SOFT_RESET_TA(1) | |
454 | S_008020_SOFT_RESET_VC(1) | | 503 | S_008020_SOFT_RESET_VC(1) | |
455 | S_008020_SOFT_RESET_VGT(1); | 504 | S_008020_SOFT_RESET_VGT(1); |
456 | dev_info(rdev->dev, "R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp); | 505 | dev_info(rdev->dev, " R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp); |
457 | WREG32(R_008020_GRBM_SOFT_RESET, tmp); | 506 | WREG32(R_008020_GRBM_SOFT_RESET, tmp); |
458 | (void)RREG32(R_008020_GRBM_SOFT_RESET); | 507 | (void)RREG32(R_008020_GRBM_SOFT_RESET); |
459 | udelay(50); | 508 | udelay(50); |
@@ -491,7 +540,14 @@ int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
491 | srbm_reset |= S_000E60_SOFT_RESET_RLC(1); | 540 | srbm_reset |= S_000E60_SOFT_RESET_RLC(1); |
492 | if (G_000E50_SEM_BUSY(RREG32(R_000E50_SRBM_STATUS))) | 541 | if (G_000E50_SEM_BUSY(RREG32(R_000E50_SRBM_STATUS))) |
493 | srbm_reset |= S_000E60_SOFT_RESET_SEM(1); | 542 | srbm_reset |= S_000E60_SOFT_RESET_SEM(1); |
494 | dev_info(rdev->dev, "R_000E60_SRBM_SOFT_RESET=0x%08X\n", srbm_reset); | 543 | if (G_000E50_BIF_BUSY(RREG32(R_000E50_SRBM_STATUS))) |
544 | srbm_reset |= S_000E60_SOFT_RESET_BIF(1); | ||
545 | dev_info(rdev->dev, " R_000E60_SRBM_SOFT_RESET=0x%08X\n", srbm_reset); | ||
546 | WREG32(R_000E60_SRBM_SOFT_RESET, srbm_reset); | ||
547 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); | ||
548 | udelay(50); | ||
549 | WREG32(R_000E60_SRBM_SOFT_RESET, 0); | ||
550 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); | ||
495 | WREG32(R_000E60_SRBM_SOFT_RESET, srbm_reset); | 551 | WREG32(R_000E60_SRBM_SOFT_RESET, srbm_reset); |
496 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); | 552 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); |
497 | udelay(50); | 553 | udelay(50); |
@@ -499,6 +555,12 @@ int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
499 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); | 555 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); |
500 | /* Wait a little for things to settle down */ | 556 | /* Wait a little for things to settle down */ |
501 | udelay(50); | 557 | udelay(50); |
558 | dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n", | ||
559 | RREG32(R_008010_GRBM_STATUS)); | ||
560 | dev_info(rdev->dev, " R_008014_GRBM_STATUS2=0x%08X\n", | ||
561 | RREG32(R_008014_GRBM_STATUS2)); | ||
562 | dev_info(rdev->dev, " R_000E50_SRBM_STATUS=0x%08X\n", | ||
563 | RREG32(R_000E50_SRBM_STATUS)); | ||
502 | /* After reset we need to reinit the asic as GPU often endup in an | 564 | /* After reset we need to reinit the asic as GPU often endup in an |
503 | * incoherent state. | 565 | * incoherent state. |
504 | */ | 566 | */ |
@@ -1442,9 +1504,13 @@ int r600_startup(struct radeon_device *rdev) | |||
1442 | int r; | 1504 | int r; |
1443 | 1505 | ||
1444 | r600_mc_program(rdev); | 1506 | r600_mc_program(rdev); |
1445 | r = r600_pcie_gart_enable(rdev); | 1507 | if (rdev->flags & RADEON_IS_AGP) { |
1446 | if (r) | 1508 | r600_agp_enable(rdev); |
1447 | return r; | 1509 | } else { |
1510 | r = r600_pcie_gart_enable(rdev); | ||
1511 | if (r) | ||
1512 | return r; | ||
1513 | } | ||
1448 | r600_gpu_init(rdev); | 1514 | r600_gpu_init(rdev); |
1449 | 1515 | ||
1450 | r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, | 1516 | r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, |
@@ -1472,9 +1538,10 @@ int r600_resume(struct radeon_device *rdev) | |||
1472 | { | 1538 | { |
1473 | int r; | 1539 | int r; |
1474 | 1540 | ||
1475 | if (r600_gpu_reset(rdev)) { | 1541 | /* Do not reset GPU before posting, on r600 hw unlike on r500 hw, |
1476 | /* FIXME: what do we want to do here ? */ | 1542 | * posting will perform necessary task to bring back GPU into good |
1477 | } | 1543 | * shape. |
1544 | */ | ||
1478 | /* post card */ | 1545 | /* post card */ |
1479 | atom_asic_init(rdev->mode_info.atom_context); | 1546 | atom_asic_init(rdev->mode_info.atom_context); |
1480 | /* Initialize clocks */ | 1547 | /* Initialize clocks */ |
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index 723295f59281..5084595eb919 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
@@ -642,6 +642,7 @@ | |||
642 | #define G_000E50_MCDW_BUSY(x) (((x) >> 13) & 1) | 642 | #define G_000E50_MCDW_BUSY(x) (((x) >> 13) & 1) |
643 | #define G_000E50_SEM_BUSY(x) (((x) >> 14) & 1) | 643 | #define G_000E50_SEM_BUSY(x) (((x) >> 14) & 1) |
644 | #define G_000E50_RLC_BUSY(x) (((x) >> 15) & 1) | 644 | #define G_000E50_RLC_BUSY(x) (((x) >> 15) & 1) |
645 | #define G_000E50_BIF_BUSY(x) (((x) >> 29) & 1) | ||
645 | #define R_000E60_SRBM_SOFT_RESET 0x0E60 | 646 | #define R_000E60_SRBM_SOFT_RESET 0x0E60 |
646 | #define S_000E60_SOFT_RESET_BIF(x) (((x) & 1) << 1) | 647 | #define S_000E60_SOFT_RESET_BIF(x) (((x) & 1) << 1) |
647 | #define S_000E60_SOFT_RESET_CG(x) (((x) & 1) << 2) | 648 | #define S_000E60_SOFT_RESET_CG(x) (((x) & 1) << 2) |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index a6b80eb236ee..d1cdda9b5586 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -575,6 +575,7 @@ int radeon_device_init(struct radeon_device *rdev, | |||
575 | /* Acceleration not working on AGP card try again | 575 | /* Acceleration not working on AGP card try again |
576 | * with fallback to PCI or PCIE GART | 576 | * with fallback to PCI or PCIE GART |
577 | */ | 577 | */ |
578 | radeon_gpu_reset(rdev); | ||
578 | radeon_fini(rdev); | 579 | radeon_fini(rdev); |
579 | radeon_agp_disable(rdev); | 580 | radeon_agp_disable(rdev); |
580 | r = radeon_init(rdev); | 581 | r = radeon_init(rdev); |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 5c597dfa5d49..595ac638039d 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -75,7 +75,7 @@ int rv770_pcie_gart_enable(struct radeon_device *rdev) | |||
75 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); | 75 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); |
76 | WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); | 76 | WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); |
77 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); | 77 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); |
78 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, (rdev->mc.gtt_end - 1) >> 12); | 78 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12); |
79 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); | 79 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); |
80 | WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | | 80 | WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | |
81 | RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); | 81 | RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); |
@@ -126,9 +126,33 @@ void rv770_pcie_gart_fini(struct radeon_device *rdev) | |||
126 | } | 126 | } |
127 | 127 | ||
128 | 128 | ||
129 | /* | 129 | void rv770_agp_enable(struct radeon_device *rdev) |
130 | * MC | 130 | { |
131 | */ | 131 | u32 tmp; |
132 | int i; | ||
133 | |||
134 | /* Setup L2 cache */ | ||
135 | WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | | ||
136 | ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | | ||
137 | EFFECTIVE_L2_QUEUE_SIZE(7)); | ||
138 | WREG32(VM_L2_CNTL2, 0); | ||
139 | WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2)); | ||
140 | /* Setup TLB control */ | ||
141 | tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING | | ||
142 | SYSTEM_ACCESS_MODE_NOT_IN_SYS | | ||
143 | SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU | | ||
144 | EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); | ||
145 | WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); | ||
146 | WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); | ||
147 | WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); | ||
148 | WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); | ||
149 | WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); | ||
150 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); | ||
151 | WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); | ||
152 | for (i = 0; i < 7; i++) | ||
153 | WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); | ||
154 | } | ||
155 | |||
132 | static void rv770_mc_program(struct radeon_device *rdev) | 156 | static void rv770_mc_program(struct radeon_device *rdev) |
133 | { | 157 | { |
134 | struct rv515_mc_save save; | 158 | struct rv515_mc_save save; |
@@ -152,17 +176,35 @@ static void rv770_mc_program(struct radeon_device *rdev) | |||
152 | /* Lockout access through VGA aperture*/ | 176 | /* Lockout access through VGA aperture*/ |
153 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); | 177 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); |
154 | /* Update configuration */ | 178 | /* Update configuration */ |
155 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12); | 179 | if (rdev->flags & RADEON_IS_AGP) { |
156 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, (rdev->mc.vram_end - 1) >> 12); | 180 | if (rdev->mc.vram_start < rdev->mc.gtt_start) { |
181 | /* VRAM before AGP */ | ||
182 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
183 | rdev->mc.vram_start >> 12); | ||
184 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
185 | rdev->mc.gtt_end >> 12); | ||
186 | } else { | ||
187 | /* VRAM after AGP */ | ||
188 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
189 | rdev->mc.gtt_start >> 12); | ||
190 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
191 | rdev->mc.vram_end >> 12); | ||
192 | } | ||
193 | } else { | ||
194 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
195 | rdev->mc.vram_start >> 12); | ||
196 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
197 | rdev->mc.vram_end >> 12); | ||
198 | } | ||
157 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); | 199 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); |
158 | tmp = (((rdev->mc.vram_end - 1) >> 24) & 0xFFFF) << 16; | 200 | tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; |
159 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); | 201 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); |
160 | WREG32(MC_VM_FB_LOCATION, tmp); | 202 | WREG32(MC_VM_FB_LOCATION, tmp); |
161 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); | 203 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); |
162 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); | 204 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); |
163 | WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF); | 205 | WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF); |
164 | if (rdev->flags & RADEON_IS_AGP) { | 206 | if (rdev->flags & RADEON_IS_AGP) { |
165 | WREG32(MC_VM_AGP_TOP, (rdev->mc.gtt_end - 1) >> 16); | 207 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); |
166 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); | 208 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); |
167 | WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); | 209 | WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); |
168 | } else { | 210 | } else { |
@@ -785,9 +827,9 @@ int rv770_mc_init(struct radeon_device *rdev) | |||
785 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | 827 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; |
786 | } | 828 | } |
787 | rdev->mc.vram_start = rdev->mc.vram_location; | 829 | rdev->mc.vram_start = rdev->mc.vram_location; |
788 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size; | 830 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; |
789 | rdev->mc.gtt_start = rdev->mc.gtt_location; | 831 | rdev->mc.gtt_start = rdev->mc.gtt_location; |
790 | rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size; | 832 | rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; |
791 | /* FIXME: we should enforce default clock in case GPU is not in | 833 | /* FIXME: we should enforce default clock in case GPU is not in |
792 | * default setup | 834 | * default setup |
793 | */ | 835 | */ |
@@ -807,9 +849,13 @@ static int rv770_startup(struct radeon_device *rdev) | |||
807 | int r; | 849 | int r; |
808 | 850 | ||
809 | rv770_mc_program(rdev); | 851 | rv770_mc_program(rdev); |
810 | r = rv770_pcie_gart_enable(rdev); | 852 | if (rdev->flags & RADEON_IS_AGP) { |
811 | if (r) | 853 | rv770_agp_enable(rdev); |
812 | return r; | 854 | } else { |
855 | r = rv770_pcie_gart_enable(rdev); | ||
856 | if (r) | ||
857 | return r; | ||
858 | } | ||
813 | rv770_gpu_init(rdev); | 859 | rv770_gpu_init(rdev); |
814 | 860 | ||
815 | r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, | 861 | r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, |
@@ -837,9 +883,10 @@ int rv770_resume(struct radeon_device *rdev) | |||
837 | { | 883 | { |
838 | int r; | 884 | int r; |
839 | 885 | ||
840 | if (rv770_gpu_reset(rdev)) { | 886 | /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw, |
841 | /* FIXME: what do we want to do here ? */ | 887 | * posting will perform necessary task to bring back GPU into good |
842 | } | 888 | * shape. |
889 | */ | ||
843 | /* post card */ | 890 | /* post card */ |
844 | atom_asic_init(rdev->mode_info.atom_context); | 891 | atom_asic_init(rdev->mode_info.atom_context); |
845 | /* Initialize clocks */ | 892 | /* Initialize clocks */ |