diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2010-02-26 14:04:15 -0500 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2010-02-26 14:06:24 -0500 |
commit | a7790532f5b7358c33a6b1834dc2b318de209f31 (patch) | |
tree | 0ceb9e24b3f54cb5c8453fb5a218e2a94a0f1cce /drivers/gpu/drm/radeon/rs400.c | |
parent | 2764fb4244cc1bc08df3667924ca4a972e90ac70 (diff) | |
parent | 60b341b778cc2929df16c0a504c91621b3c6a4ad (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
The SmartMedia FTL code depends on new kfifo bits from 2.6.33
Diffstat (limited to 'drivers/gpu/drm/radeon/rs400.c')
-rw-r--r-- | drivers/gpu/drm/radeon/rs400.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index c1fcdddb6be6..287fcebfb4e6 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
@@ -223,15 +223,31 @@ int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | |||
223 | return 0; | 223 | return 0; |
224 | } | 224 | } |
225 | 225 | ||
226 | int rs400_mc_wait_for_idle(struct radeon_device *rdev) | ||
227 | { | ||
228 | unsigned i; | ||
229 | uint32_t tmp; | ||
230 | |||
231 | for (i = 0; i < rdev->usec_timeout; i++) { | ||
232 | /* read MC_STATUS */ | ||
233 | tmp = RREG32(0x0150); | ||
234 | if (tmp & (1 << 2)) { | ||
235 | return 0; | ||
236 | } | ||
237 | DRM_UDELAY(1); | ||
238 | } | ||
239 | return -1; | ||
240 | } | ||
241 | |||
226 | void rs400_gpu_init(struct radeon_device *rdev) | 242 | void rs400_gpu_init(struct radeon_device *rdev) |
227 | { | 243 | { |
228 | /* FIXME: HDP same place on rs400 ? */ | 244 | /* FIXME: HDP same place on rs400 ? */ |
229 | r100_hdp_reset(rdev); | 245 | r100_hdp_reset(rdev); |
230 | /* FIXME: is this correct ? */ | 246 | /* FIXME: is this correct ? */ |
231 | r420_pipes_init(rdev); | 247 | r420_pipes_init(rdev); |
232 | if (r300_mc_wait_for_idle(rdev)) { | 248 | if (rs400_mc_wait_for_idle(rdev)) { |
233 | printk(KERN_WARNING "Failed to wait MC idle while " | 249 | printk(KERN_WARNING "rs400: Failed to wait MC idle while " |
234 | "programming pipes. Bad things might happen.\n"); | 250 | "programming pipes. Bad things might happen. %08x\n", RREG32(0x150)); |
235 | } | 251 | } |
236 | } | 252 | } |
237 | 253 | ||
@@ -356,6 +372,7 @@ static int rs400_mc_init(struct radeon_device *rdev) | |||
356 | rdev->mc.vram_location = G_00015C_MC_FB_START(tmp) << 16; | 372 | rdev->mc.vram_location = G_00015C_MC_FB_START(tmp) << 16; |
357 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | 373 | rdev->mc.gtt_location = 0xFFFFFFFFUL; |
358 | r = radeon_mc_setup(rdev); | 374 | r = radeon_mc_setup(rdev); |
375 | rdev->mc.igp_sideport_enabled = radeon_combios_sideport_present(rdev); | ||
359 | if (r) | 376 | if (r) |
360 | return r; | 377 | return r; |
361 | return 0; | 378 | return 0; |
@@ -369,8 +386,8 @@ void rs400_mc_program(struct radeon_device *rdev) | |||
369 | r100_mc_stop(rdev, &save); | 386 | r100_mc_stop(rdev, &save); |
370 | 387 | ||
371 | /* Wait for mc idle */ | 388 | /* Wait for mc idle */ |
372 | if (r300_mc_wait_for_idle(rdev)) | 389 | if (rs400_mc_wait_for_idle(rdev)) |
373 | dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); | 390 | dev_warn(rdev->dev, "rs400: Wait MC idle timeout before updating MC.\n"); |
374 | WREG32(R_000148_MC_FB_LOCATION, | 391 | WREG32(R_000148_MC_FB_LOCATION, |
375 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | | 392 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | |
376 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); | 393 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); |
@@ -395,6 +412,7 @@ static int rs400_startup(struct radeon_device *rdev) | |||
395 | return r; | 412 | return r; |
396 | /* Enable IRQ */ | 413 | /* Enable IRQ */ |
397 | r100_irq_set(rdev); | 414 | r100_irq_set(rdev); |
415 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
398 | /* 1M ring buffer */ | 416 | /* 1M ring buffer */ |
399 | r = r100_cp_init(rdev, 1024 * 1024); | 417 | r = r100_cp_init(rdev, 1024 * 1024); |
400 | if (r) { | 418 | if (r) { |
@@ -446,7 +464,6 @@ int rs400_suspend(struct radeon_device *rdev) | |||
446 | 464 | ||
447 | void rs400_fini(struct radeon_device *rdev) | 465 | void rs400_fini(struct radeon_device *rdev) |
448 | { | 466 | { |
449 | rs400_suspend(rdev); | ||
450 | r100_cp_fini(rdev); | 467 | r100_cp_fini(rdev); |
451 | r100_wb_fini(rdev); | 468 | r100_wb_fini(rdev); |
452 | r100_ib_fini(rdev); | 469 | r100_ib_fini(rdev); |
@@ -497,6 +514,8 @@ int rs400_init(struct radeon_device *rdev) | |||
497 | 514 | ||
498 | /* Initialize clocks */ | 515 | /* Initialize clocks */ |
499 | radeon_get_clock_info(rdev->ddev); | 516 | radeon_get_clock_info(rdev->ddev); |
517 | /* Initialize power management */ | ||
518 | radeon_pm_init(rdev); | ||
500 | /* Get vram informations */ | 519 | /* Get vram informations */ |
501 | rs400_vram_info(rdev); | 520 | rs400_vram_info(rdev); |
502 | /* Initialize memory controller (also test AGP) */ | 521 | /* Initialize memory controller (also test AGP) */ |
@@ -523,7 +542,6 @@ int rs400_init(struct radeon_device *rdev) | |||
523 | if (r) { | 542 | if (r) { |
524 | /* Somethings want wront with the accel init stop accel */ | 543 | /* Somethings want wront with the accel init stop accel */ |
525 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 544 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
526 | rs400_suspend(rdev); | ||
527 | r100_cp_fini(rdev); | 545 | r100_cp_fini(rdev); |
528 | r100_wb_fini(rdev); | 546 | r100_wb_fini(rdev); |
529 | r100_ib_fini(rdev); | 547 | r100_ib_fini(rdev); |