aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/rs600.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/rs600.c')
-rw-r--r--drivers/gpu/drm/radeon/rs600.c99
1 files changed, 63 insertions, 36 deletions
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
index 5f117cd8736a..84b26376027d 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -45,6 +45,21 @@
45void rs600_gpu_init(struct radeon_device *rdev); 45void rs600_gpu_init(struct radeon_device *rdev);
46int rs600_mc_wait_for_idle(struct radeon_device *rdev); 46int rs600_mc_wait_for_idle(struct radeon_device *rdev);
47 47
48int rs600_mc_init(struct radeon_device *rdev)
49{
50 /* read back the MC value from the hw */
51 int r;
52 u32 tmp;
53
54 /* Setup GPU memory space */
55 tmp = RREG32_MC(R_000004_MC_FB_LOCATION);
56 rdev->mc.vram_location = G_000004_MC_FB_START(tmp) << 16;
57 rdev->mc.gtt_location = 0xffffffffUL;
58 r = radeon_mc_setup(rdev);
59 if (r)
60 return r;
61 return 0;
62}
48/* 63/*
49 * GART. 64 * GART.
50 */ 65 */
@@ -100,40 +115,40 @@ int rs600_gart_enable(struct radeon_device *rdev)
100 WREG32(R_00004C_BUS_CNTL, tmp); 115 WREG32(R_00004C_BUS_CNTL, tmp);
101 /* FIXME: setup default page */ 116 /* FIXME: setup default page */
102 WREG32_MC(R_000100_MC_PT0_CNTL, 117 WREG32_MC(R_000100_MC_PT0_CNTL,
103 (S_000100_EFFECTIVE_L2_CACHE_SIZE(6) | 118 (S_000100_EFFECTIVE_L2_CACHE_SIZE(6) |
104 S_000100_EFFECTIVE_L2_QUEUE_SIZE(6))); 119 S_000100_EFFECTIVE_L2_QUEUE_SIZE(6)));
120
105 for (i = 0; i < 19; i++) { 121 for (i = 0; i < 19; i++) {
106 WREG32_MC(R_00016C_MC_PT0_CLIENT0_CNTL + i, 122 WREG32_MC(R_00016C_MC_PT0_CLIENT0_CNTL + i,
107 S_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE(1) | 123 S_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE(1) |
108 S_00016C_SYSTEM_ACCESS_MODE_MASK( 124 S_00016C_SYSTEM_ACCESS_MODE_MASK(
109 V_00016C_SYSTEM_ACCESS_MODE_IN_SYS) | 125 V_00016C_SYSTEM_ACCESS_MODE_NOT_IN_SYS) |
110 S_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS( 126 S_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS(
111 V_00016C_SYSTEM_APERTURE_UNMAPPED_DEFAULT_PAGE) | 127 V_00016C_SYSTEM_APERTURE_UNMAPPED_PASSTHROUGH) |
112 S_00016C_EFFECTIVE_L1_CACHE_SIZE(1) | 128 S_00016C_EFFECTIVE_L1_CACHE_SIZE(3) |
113 S_00016C_ENABLE_FRAGMENT_PROCESSING(1) | 129 S_00016C_ENABLE_FRAGMENT_PROCESSING(1) |
114 S_00016C_EFFECTIVE_L1_QUEUE_SIZE(1)); 130 S_00016C_EFFECTIVE_L1_QUEUE_SIZE(3));
115 } 131 }
116
117 /* System context map to GART space */
118 WREG32_MC(R_000112_MC_PT0_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.gtt_start);
119 WREG32_MC(R_000114_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR, rdev->mc.gtt_end);
120
121 /* enable first context */ 132 /* enable first context */
122 WREG32_MC(R_00013C_MC_PT0_CONTEXT0_FLAT_START_ADDR, rdev->mc.gtt_start);
123 WREG32_MC(R_00014C_MC_PT0_CONTEXT0_FLAT_END_ADDR, rdev->mc.gtt_end);
124 WREG32_MC(R_000102_MC_PT0_CONTEXT0_CNTL, 133 WREG32_MC(R_000102_MC_PT0_CONTEXT0_CNTL,
125 S_000102_ENABLE_PAGE_TABLE(1) | 134 S_000102_ENABLE_PAGE_TABLE(1) |
126 S_000102_PAGE_TABLE_DEPTH(V_000102_PAGE_TABLE_FLAT)); 135 S_000102_PAGE_TABLE_DEPTH(V_000102_PAGE_TABLE_FLAT));
136
127 /* disable all other contexts */ 137 /* disable all other contexts */
128 for (i = 1; i < 8; i++) { 138 for (i = 1; i < 8; i++)
129 WREG32_MC(R_000102_MC_PT0_CONTEXT0_CNTL + i, 0); 139 WREG32_MC(R_000102_MC_PT0_CONTEXT0_CNTL + i, 0);
130 }
131 140
132 /* setup the page table */ 141 /* setup the page table */
133 WREG32_MC(R_00012C_MC_PT0_CONTEXT0_FLAT_BASE_ADDR, 142 WREG32_MC(R_00012C_MC_PT0_CONTEXT0_FLAT_BASE_ADDR,
134 rdev->gart.table_addr); 143 rdev->gart.table_addr);
144 WREG32_MC(R_00013C_MC_PT0_CONTEXT0_FLAT_START_ADDR, rdev->mc.gtt_start);
145 WREG32_MC(R_00014C_MC_PT0_CONTEXT0_FLAT_END_ADDR, rdev->mc.gtt_end);
135 WREG32_MC(R_00011C_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR, 0); 146 WREG32_MC(R_00011C_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR, 0);
136 147
148 /* System context maps to VRAM space */
149 WREG32_MC(R_000112_MC_PT0_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start);
150 WREG32_MC(R_000114_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR, rdev->mc.vram_end);
151
137 /* enable page tables */ 152 /* enable page tables */
138 tmp = RREG32_MC(R_000100_MC_PT0_CNTL); 153 tmp = RREG32_MC(R_000100_MC_PT0_CNTL);
139 WREG32_MC(R_000100_MC_PT0_CNTL, (tmp | S_000100_ENABLE_PT(1))); 154 WREG32_MC(R_000100_MC_PT0_CNTL, (tmp | S_000100_ENABLE_PT(1)));
@@ -146,15 +161,20 @@ int rs600_gart_enable(struct radeon_device *rdev)
146 161
147void rs600_gart_disable(struct radeon_device *rdev) 162void rs600_gart_disable(struct radeon_device *rdev)
148{ 163{
149 uint32_t tmp; 164 u32 tmp;
165 int r;
150 166
151 /* FIXME: disable out of gart access */ 167 /* FIXME: disable out of gart access */
152 WREG32_MC(R_000100_MC_PT0_CNTL, 0); 168 WREG32_MC(R_000100_MC_PT0_CNTL, 0);
153 tmp = RREG32_MC(R_000009_MC_CNTL1); 169 tmp = RREG32_MC(R_000009_MC_CNTL1);
154 WREG32_MC(R_000009_MC_CNTL1, tmp & C_000009_ENABLE_PAGE_TABLES); 170 WREG32_MC(R_000009_MC_CNTL1, tmp & C_000009_ENABLE_PAGE_TABLES);
155 if (rdev->gart.table.vram.robj) { 171 if (rdev->gart.table.vram.robj) {
156 radeon_object_kunmap(rdev->gart.table.vram.robj); 172 r = radeon_bo_reserve(rdev->gart.table.vram.robj, false);
157 radeon_object_unpin(rdev->gart.table.vram.robj); 173 if (r == 0) {
174 radeon_bo_kunmap(rdev->gart.table.vram.robj);
175 radeon_bo_unpin(rdev->gart.table.vram.robj);
176 radeon_bo_unreserve(rdev->gart.table.vram.robj);
177 }
158 } 178 }
159} 179}
160 180
@@ -301,9 +321,7 @@ int rs600_mc_wait_for_idle(struct radeon_device *rdev)
301 321
302void rs600_gpu_init(struct radeon_device *rdev) 322void rs600_gpu_init(struct radeon_device *rdev)
303{ 323{
304 /* FIXME: HDP same place on rs600 ? */
305 r100_hdp_reset(rdev); 324 r100_hdp_reset(rdev);
306 /* FIXME: is this correct ? */
307 r420_pipes_init(rdev); 325 r420_pipes_init(rdev);
308 /* Wait for mc idle */ 326 /* Wait for mc idle */
309 if (rs600_mc_wait_for_idle(rdev)) 327 if (rs600_mc_wait_for_idle(rdev))
@@ -312,9 +330,20 @@ void rs600_gpu_init(struct radeon_device *rdev)
312 330
313void rs600_vram_info(struct radeon_device *rdev) 331void rs600_vram_info(struct radeon_device *rdev)
314{ 332{
315 /* FIXME: to do or is these values sane ? */
316 rdev->mc.vram_is_ddr = true; 333 rdev->mc.vram_is_ddr = true;
317 rdev->mc.vram_width = 128; 334 rdev->mc.vram_width = 128;
335
336 rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE);
337 rdev->mc.mc_vram_size = rdev->mc.real_vram_size;
338
339 rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0);
340 rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0);
341
342 if (rdev->mc.mc_vram_size > rdev->mc.aper_size)
343 rdev->mc.mc_vram_size = rdev->mc.aper_size;
344
345 if (rdev->mc.real_vram_size > rdev->mc.aper_size)
346 rdev->mc.real_vram_size = rdev->mc.aper_size;
318} 347}
319 348
320void rs600_bandwidth_update(struct radeon_device *rdev) 349void rs600_bandwidth_update(struct radeon_device *rdev)
@@ -388,7 +417,6 @@ static int rs600_startup(struct radeon_device *rdev)
388 if (r) 417 if (r)
389 return r; 418 return r;
390 /* Enable IRQ */ 419 /* Enable IRQ */
391 rdev->irq.sw_int = true;
392 rs600_irq_set(rdev); 420 rs600_irq_set(rdev);
393 /* 1M ring buffer */ 421 /* 1M ring buffer */
394 r = r100_cp_init(rdev, 1024 * 1024); 422 r = r100_cp_init(rdev, 1024 * 1024);
@@ -445,7 +473,7 @@ void rs600_fini(struct radeon_device *rdev)
445 rs600_gart_fini(rdev); 473 rs600_gart_fini(rdev);
446 radeon_irq_kms_fini(rdev); 474 radeon_irq_kms_fini(rdev);
447 radeon_fence_driver_fini(rdev); 475 radeon_fence_driver_fini(rdev);
448 radeon_object_fini(rdev); 476 radeon_bo_fini(rdev);
449 radeon_atombios_fini(rdev); 477 radeon_atombios_fini(rdev);
450 kfree(rdev->bios); 478 kfree(rdev->bios);
451 rdev->bios = NULL; 479 rdev->bios = NULL;
@@ -482,10 +510,9 @@ int rs600_init(struct radeon_device *rdev)
482 RREG32(R_0007C0_CP_STAT)); 510 RREG32(R_0007C0_CP_STAT));
483 } 511 }
484 /* check if cards are posted or not */ 512 /* check if cards are posted or not */
485 if (!radeon_card_posted(rdev) && rdev->bios) { 513 if (radeon_boot_test_post_card(rdev) == false)
486 DRM_INFO("GPU not posted. posting now...\n"); 514 return -EINVAL;
487 atom_asic_init(rdev->mode_info.atom_context); 515
488 }
489 /* Initialize clocks */ 516 /* Initialize clocks */
490 radeon_get_clock_info(rdev->ddev); 517 radeon_get_clock_info(rdev->ddev);
491 /* Initialize power management */ 518 /* Initialize power management */
@@ -493,7 +520,7 @@ int rs600_init(struct radeon_device *rdev)
493 /* Get vram informations */ 520 /* Get vram informations */
494 rs600_vram_info(rdev); 521 rs600_vram_info(rdev);
495 /* Initialize memory controller (also test AGP) */ 522 /* Initialize memory controller (also test AGP) */
496 r = r420_mc_init(rdev); 523 r = rs600_mc_init(rdev);
497 if (r) 524 if (r)
498 return r; 525 return r;
499 rs600_debugfs(rdev); 526 rs600_debugfs(rdev);
@@ -505,7 +532,7 @@ int rs600_init(struct radeon_device *rdev)
505 if (r) 532 if (r)
506 return r; 533 return r;
507 /* Memory manager */ 534 /* Memory manager */
508 r = radeon_object_init(rdev); 535 r = radeon_bo_init(rdev);
509 if (r) 536 if (r)
510 return r; 537 return r;
511 r = rs600_gart_init(rdev); 538 r = rs600_gart_init(rdev);