aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/rs400.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/rs400.c')
-rw-r--r--drivers/gpu/drm/radeon/rs400.c92
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
203void rs400_gart_fini(struct radeon_device *rdev) 205void 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
210int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) 212int 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
228int 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
226void rs400_gpu_init(struct radeon_device *rdev) 244void 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
238void rs400_vram_info(struct radeon_device *rdev) 256void 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
248uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg) 272uint32_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
349static 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
364void rs400_mc_program(struct radeon_device *rdev) 373void 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
445void rs400_fini(struct radeon_device *rdev) 459void 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);