diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/rs600.c')
-rw-r--r-- | drivers/gpu/drm/radeon/rs600.c | 99 |
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 @@ | |||
45 | void rs600_gpu_init(struct radeon_device *rdev); | 45 | void rs600_gpu_init(struct radeon_device *rdev); |
46 | int rs600_mc_wait_for_idle(struct radeon_device *rdev); | 46 | int rs600_mc_wait_for_idle(struct radeon_device *rdev); |
47 | 47 | ||
48 | int 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 | ||
147 | void rs600_gart_disable(struct radeon_device *rdev) | 162 | void 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 | ||
302 | void rs600_gpu_init(struct radeon_device *rdev) | 322 | void 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 | ||
313 | void rs600_vram_info(struct radeon_device *rdev) | 331 | void 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 | ||
320 | void rs600_bandwidth_update(struct radeon_device *rdev) | 349 | void 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); |