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/rs400.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/rs400.c')
-rw-r--r-- | drivers/gpu/drm/radeon/rs400.c | 92 |
1 files changed, 51 insertions, 41 deletions
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index ca037160a582..1a41cb268b72 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
@@ -26,8 +26,10 @@ | |||
26 | * Jerome Glisse | 26 | * Jerome Glisse |
27 | */ | 27 | */ |
28 | #include <linux/seq_file.h> | 28 | #include <linux/seq_file.h> |
29 | #include <linux/slab.h> | ||
29 | #include <drm/drmP.h> | 30 | #include <drm/drmP.h> |
30 | #include "radeon.h" | 31 | #include "radeon.h" |
32 | #include "radeon_asic.h" | ||
31 | #include "rs400d.h" | 33 | #include "rs400d.h" |
32 | 34 | ||
33 | /* This files gather functions specifics to : rs400,rs480 */ | 35 | /* This files gather functions specifics to : rs400,rs480 */ |
@@ -113,6 +115,7 @@ int rs400_gart_enable(struct radeon_device *rdev) | |||
113 | uint32_t size_reg; | 115 | uint32_t size_reg; |
114 | uint32_t tmp; | 116 | uint32_t tmp; |
115 | 117 | ||
118 | radeon_gart_restore(rdev); | ||
116 | tmp = RREG32_MC(RS690_AIC_CTRL_SCRATCH); | 119 | tmp = RREG32_MC(RS690_AIC_CTRL_SCRATCH); |
117 | tmp |= RS690_DIS_OUT_OF_PCI_GART_ACCESS; | 120 | tmp |= RS690_DIS_OUT_OF_PCI_GART_ACCESS; |
118 | WREG32_MC(RS690_AIC_CTRL_SCRATCH, tmp); | 121 | WREG32_MC(RS690_AIC_CTRL_SCRATCH, tmp); |
@@ -150,9 +153,8 @@ int rs400_gart_enable(struct radeon_device *rdev) | |||
150 | WREG32(RADEON_AGP_BASE, 0xFFFFFFFF); | 153 | WREG32(RADEON_AGP_BASE, 0xFFFFFFFF); |
151 | WREG32(RS480_AGP_BASE_2, 0); | 154 | WREG32(RS480_AGP_BASE_2, 0); |
152 | } | 155 | } |
153 | tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; | 156 | tmp = REG_SET(RS690_MC_AGP_TOP, rdev->mc.gtt_end >> 16); |
154 | tmp = REG_SET(RS690_MC_AGP_TOP, tmp >> 16); | 157 | tmp |= REG_SET(RS690_MC_AGP_START, rdev->mc.gtt_start >> 16); |
155 | tmp |= REG_SET(RS690_MC_AGP_START, rdev->mc.gtt_location >> 16); | ||
156 | if ((rdev->family == CHIP_RS690) || (rdev->family == CHIP_RS740)) { | 158 | if ((rdev->family == CHIP_RS690) || (rdev->family == CHIP_RS740)) { |
157 | WREG32_MC(RS690_MCCFG_AGP_LOCATION, tmp); | 159 | WREG32_MC(RS690_MCCFG_AGP_LOCATION, tmp); |
158 | tmp = RREG32(RADEON_BUS_CNTL) & ~RS600_BUS_MASTER_DIS; | 160 | tmp = RREG32(RADEON_BUS_CNTL) & ~RS600_BUS_MASTER_DIS; |
@@ -202,9 +204,9 @@ void rs400_gart_disable(struct radeon_device *rdev) | |||
202 | 204 | ||
203 | void rs400_gart_fini(struct radeon_device *rdev) | 205 | void rs400_gart_fini(struct radeon_device *rdev) |
204 | { | 206 | { |
207 | radeon_gart_fini(rdev); | ||
205 | rs400_gart_disable(rdev); | 208 | rs400_gart_disable(rdev); |
206 | radeon_gart_table_ram_free(rdev); | 209 | radeon_gart_table_ram_free(rdev); |
207 | radeon_gart_fini(rdev); | ||
208 | } | 210 | } |
209 | 211 | ||
210 | int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | 212 | int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) |
@@ -223,26 +225,48 @@ int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | |||
223 | return 0; | 225 | return 0; |
224 | } | 226 | } |
225 | 227 | ||
228 | int rs400_mc_wait_for_idle(struct radeon_device *rdev) | ||
229 | { | ||
230 | unsigned i; | ||
231 | uint32_t tmp; | ||
232 | |||
233 | for (i = 0; i < rdev->usec_timeout; i++) { | ||
234 | /* read MC_STATUS */ | ||
235 | tmp = RREG32(0x0150); | ||
236 | if (tmp & (1 << 2)) { | ||
237 | return 0; | ||
238 | } | ||
239 | DRM_UDELAY(1); | ||
240 | } | ||
241 | return -1; | ||
242 | } | ||
243 | |||
226 | void rs400_gpu_init(struct radeon_device *rdev) | 244 | void rs400_gpu_init(struct radeon_device *rdev) |
227 | { | 245 | { |
228 | /* FIXME: HDP same place on rs400 ? */ | 246 | /* FIXME: HDP same place on rs400 ? */ |
229 | r100_hdp_reset(rdev); | 247 | r100_hdp_reset(rdev); |
230 | /* FIXME: is this correct ? */ | 248 | /* FIXME: is this correct ? */ |
231 | r420_pipes_init(rdev); | 249 | r420_pipes_init(rdev); |
232 | if (r300_mc_wait_for_idle(rdev)) { | 250 | if (rs400_mc_wait_for_idle(rdev)) { |
233 | printk(KERN_WARNING "Failed to wait MC idle while " | 251 | printk(KERN_WARNING "rs400: Failed to wait MC idle while " |
234 | "programming pipes. Bad things might happen.\n"); | 252 | "programming pipes. Bad things might happen. %08x\n", RREG32(0x150)); |
235 | } | 253 | } |
236 | } | 254 | } |
237 | 255 | ||
238 | void rs400_vram_info(struct radeon_device *rdev) | 256 | void rs400_mc_init(struct radeon_device *rdev) |
239 | { | 257 | { |
258 | u64 base; | ||
259 | |||
240 | rs400_gart_adjust_size(rdev); | 260 | rs400_gart_adjust_size(rdev); |
261 | rdev->mc.igp_sideport_enabled = radeon_combios_sideport_present(rdev); | ||
241 | /* DDR for all card after R300 & IGP */ | 262 | /* DDR for all card after R300 & IGP */ |
242 | rdev->mc.vram_is_ddr = true; | 263 | rdev->mc.vram_is_ddr = true; |
243 | rdev->mc.vram_width = 128; | 264 | rdev->mc.vram_width = 128; |
244 | |||
245 | r100_vram_init_sizes(rdev); | 265 | r100_vram_init_sizes(rdev); |
266 | base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16; | ||
267 | radeon_vram_location(rdev, &rdev->mc, base); | ||
268 | radeon_gtt_location(rdev, &rdev->mc); | ||
269 | radeon_update_bandwidth_info(rdev); | ||
246 | } | 270 | } |
247 | 271 | ||
248 | uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg) | 272 | uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg) |
@@ -346,21 +370,6 @@ static int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev) | |||
346 | #endif | 370 | #endif |
347 | } | 371 | } |
348 | 372 | ||
349 | static int rs400_mc_init(struct radeon_device *rdev) | ||
350 | { | ||
351 | int r; | ||
352 | u32 tmp; | ||
353 | |||
354 | /* Setup GPU memory space */ | ||
355 | tmp = G_00015C_MC_FB_START(RREG32(R_00015C_NB_TOM)); | ||
356 | rdev->mc.vram_location = G_00015C_MC_FB_START(tmp) << 16; | ||
357 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | ||
358 | r = radeon_mc_setup(rdev); | ||
359 | if (r) | ||
360 | return r; | ||
361 | return 0; | ||
362 | } | ||
363 | |||
364 | void rs400_mc_program(struct radeon_device *rdev) | 373 | void rs400_mc_program(struct radeon_device *rdev) |
365 | { | 374 | { |
366 | struct r100_mc_save save; | 375 | struct r100_mc_save save; |
@@ -369,8 +378,8 @@ void rs400_mc_program(struct radeon_device *rdev) | |||
369 | r100_mc_stop(rdev, &save); | 378 | r100_mc_stop(rdev, &save); |
370 | 379 | ||
371 | /* Wait for mc idle */ | 380 | /* Wait for mc idle */ |
372 | if (r300_mc_wait_for_idle(rdev)) | 381 | if (rs400_mc_wait_for_idle(rdev)) |
373 | dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); | 382 | dev_warn(rdev->dev, "rs400: Wait MC idle timeout before updating MC.\n"); |
374 | WREG32(R_000148_MC_FB_LOCATION, | 383 | WREG32(R_000148_MC_FB_LOCATION, |
375 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | | 384 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | |
376 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); | 385 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); |
@@ -382,19 +391,22 @@ static int rs400_startup(struct radeon_device *rdev) | |||
382 | { | 391 | { |
383 | int r; | 392 | int r; |
384 | 393 | ||
394 | r100_set_common_regs(rdev); | ||
395 | |||
385 | rs400_mc_program(rdev); | 396 | rs400_mc_program(rdev); |
386 | /* Resume clock */ | 397 | /* Resume clock */ |
387 | r300_clock_startup(rdev); | 398 | r300_clock_startup(rdev); |
388 | /* Initialize GPU configuration (# pipes, ...) */ | 399 | /* Initialize GPU configuration (# pipes, ...) */ |
389 | rs400_gpu_init(rdev); | 400 | rs400_gpu_init(rdev); |
401 | r100_enable_bm(rdev); | ||
390 | /* Initialize GART (initialize after TTM so we can allocate | 402 | /* Initialize GART (initialize after TTM so we can allocate |
391 | * memory through TTM but finalize after TTM) */ | 403 | * memory through TTM but finalize after TTM) */ |
392 | r = rs400_gart_enable(rdev); | 404 | r = rs400_gart_enable(rdev); |
393 | if (r) | 405 | if (r) |
394 | return r; | 406 | return r; |
395 | /* Enable IRQ */ | 407 | /* Enable IRQ */ |
396 | rdev->irq.sw_int = true; | ||
397 | r100_irq_set(rdev); | 408 | r100_irq_set(rdev); |
409 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
398 | /* 1M ring buffer */ | 410 | /* 1M ring buffer */ |
399 | r = r100_cp_init(rdev, 1024 * 1024); | 411 | r = r100_cp_init(rdev, 1024 * 1024); |
400 | if (r) { | 412 | if (r) { |
@@ -430,6 +442,8 @@ int rs400_resume(struct radeon_device *rdev) | |||
430 | radeon_combios_asic_init(rdev->ddev); | 442 | radeon_combios_asic_init(rdev->ddev); |
431 | /* Resume clock after posting */ | 443 | /* Resume clock after posting */ |
432 | r300_clock_startup(rdev); | 444 | r300_clock_startup(rdev); |
445 | /* Initialize surface registers */ | ||
446 | radeon_surface_init(rdev); | ||
433 | return rs400_startup(rdev); | 447 | return rs400_startup(rdev); |
434 | } | 448 | } |
435 | 449 | ||
@@ -444,7 +458,7 @@ int rs400_suspend(struct radeon_device *rdev) | |||
444 | 458 | ||
445 | void rs400_fini(struct radeon_device *rdev) | 459 | void rs400_fini(struct radeon_device *rdev) |
446 | { | 460 | { |
447 | rs400_suspend(rdev); | 461 | radeon_pm_fini(rdev); |
448 | r100_cp_fini(rdev); | 462 | r100_cp_fini(rdev); |
449 | r100_wb_fini(rdev); | 463 | r100_wb_fini(rdev); |
450 | r100_ib_fini(rdev); | 464 | r100_ib_fini(rdev); |
@@ -452,7 +466,7 @@ void rs400_fini(struct radeon_device *rdev) | |||
452 | rs400_gart_fini(rdev); | 466 | rs400_gart_fini(rdev); |
453 | radeon_irq_kms_fini(rdev); | 467 | radeon_irq_kms_fini(rdev); |
454 | radeon_fence_driver_fini(rdev); | 468 | radeon_fence_driver_fini(rdev); |
455 | radeon_object_fini(rdev); | 469 | radeon_bo_fini(rdev); |
456 | radeon_atombios_fini(rdev); | 470 | radeon_atombios_fini(rdev); |
457 | kfree(rdev->bios); | 471 | kfree(rdev->bios); |
458 | rdev->bios = NULL; | 472 | rdev->bios = NULL; |
@@ -490,18 +504,15 @@ int rs400_init(struct radeon_device *rdev) | |||
490 | RREG32(R_0007C0_CP_STAT)); | 504 | RREG32(R_0007C0_CP_STAT)); |
491 | } | 505 | } |
492 | /* check if cards are posted or not */ | 506 | /* check if cards are posted or not */ |
493 | if (!radeon_card_posted(rdev) && rdev->bios) { | 507 | if (radeon_boot_test_post_card(rdev) == false) |
494 | DRM_INFO("GPU not posted. posting now...\n"); | 508 | return -EINVAL; |
495 | radeon_combios_asic_init(rdev->ddev); | 509 | |
496 | } | ||
497 | /* Initialize clocks */ | 510 | /* Initialize clocks */ |
498 | radeon_get_clock_info(rdev->ddev); | 511 | radeon_get_clock_info(rdev->ddev); |
499 | /* Get vram informations */ | 512 | /* Initialize power management */ |
500 | rs400_vram_info(rdev); | 513 | radeon_pm_init(rdev); |
501 | /* Initialize memory controller (also test AGP) */ | 514 | /* initialize memory controller */ |
502 | r = rs400_mc_init(rdev); | 515 | rs400_mc_init(rdev); |
503 | if (r) | ||
504 | return r; | ||
505 | /* Fence driver */ | 516 | /* Fence driver */ |
506 | r = radeon_fence_driver_init(rdev); | 517 | r = radeon_fence_driver_init(rdev); |
507 | if (r) | 518 | if (r) |
@@ -510,7 +521,7 @@ int rs400_init(struct radeon_device *rdev) | |||
510 | if (r) | 521 | if (r) |
511 | return r; | 522 | return r; |
512 | /* Memory manager */ | 523 | /* Memory manager */ |
513 | r = radeon_object_init(rdev); | 524 | r = radeon_bo_init(rdev); |
514 | if (r) | 525 | if (r) |
515 | return r; | 526 | return r; |
516 | r = rs400_gart_init(rdev); | 527 | r = rs400_gart_init(rdev); |
@@ -522,7 +533,6 @@ int rs400_init(struct radeon_device *rdev) | |||
522 | if (r) { | 533 | if (r) { |
523 | /* Somethings want wront with the accel init stop accel */ | 534 | /* Somethings want wront with the accel init stop accel */ |
524 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 535 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
525 | rs400_suspend(rdev); | ||
526 | r100_cp_fini(rdev); | 536 | r100_cp_fini(rdev); |
527 | r100_wb_fini(rdev); | 537 | r100_wb_fini(rdev); |
528 | r100_ib_fini(rdev); | 538 | r100_ib_fini(rdev); |