Commit 4d357abb authored by Dave Airlie's avatar Dave Airlie Committed by Dave Airlie

drm/radeon/kms: stop putting VRAM at 0 in MC space on r600s.

The Lenovo W500 laptop hangs inside an SMI on brightness changes,
I thought it just needed the VGA disable but it turned out to require
slightly more work, setting the MC locations up just like the IGP
chip requirements seems to make it all happy again and I can boot
and play with brightness.

We should probably just do this for all chips and give up the VRAM
at 0x0 idea, it never seems to buy us anything but pain.
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 8a9832e8
...@@ -409,35 +409,29 @@ int r600_mc_init(struct radeon_device *rdev) ...@@ -409,35 +409,29 @@ int r600_mc_init(struct radeon_device *rdev)
rdev->mc.gtt_location = rdev->mc.mc_vram_size; rdev->mc.gtt_location = rdev->mc.mc_vram_size;
} }
} else { } else {
if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) { rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
rdev->mc.vram_location = (RREG32(MC_VM_FB_LOCATION) & rdev->mc.vram_location = (RREG32(MC_VM_FB_LOCATION) &
0xFFFF) << 24; 0xFFFF) << 24;
rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size;
tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size; if ((0xFFFFFFFFUL - tmp) >= rdev->mc.gtt_size) {
if ((0xFFFFFFFFUL - tmp) >= rdev->mc.gtt_size) { /* Enough place after vram */
/* Enough place after vram */ rdev->mc.gtt_location = tmp;
rdev->mc.gtt_location = tmp; } else if (rdev->mc.vram_location >= rdev->mc.gtt_size) {
} else if (rdev->mc.vram_location >= rdev->mc.gtt_size) { /* Enough place before vram */
/* Enough place before vram */ rdev->mc.gtt_location = 0;
} else {
/* Not enough place after or before shrink
* gart size
*/
if (rdev->mc.vram_location > (0xFFFFFFFFUL - tmp)) {
rdev->mc.gtt_location = 0; rdev->mc.gtt_location = 0;
rdev->mc.gtt_size = rdev->mc.vram_location;
} else { } else {
/* Not enough place after or before shrink rdev->mc.gtt_location = tmp;
* gart size rdev->mc.gtt_size = 0xFFFFFFFFUL - tmp;
*/
if (rdev->mc.vram_location > (0xFFFFFFFFUL - tmp)) {
rdev->mc.gtt_location = 0;
rdev->mc.gtt_size = rdev->mc.vram_location;
} else {
rdev->mc.gtt_location = tmp;
rdev->mc.gtt_size = 0xFFFFFFFFUL - tmp;
}
} }
rdev->mc.gtt_location = rdev->mc.mc_vram_size;
} else {
rdev->mc.vram_location = 0x00000000UL;
rdev->mc.gtt_location = rdev->mc.mc_vram_size;
rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
} }
rdev->mc.gtt_location = rdev->mc.mc_vram_size;
} }
rdev->mc.vram_start = rdev->mc.vram_location; rdev->mc.vram_start = rdev->mc.vram_location;
rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment