aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_device.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2013-04-08 11:13:01 -0400
committerAlex Deucher <alexander.deucher@amd.com>2013-04-09 10:23:50 -0400
commit9ed8b1f93ca3a274079cb36826af1331f83cd118 (patch)
treee993a18bf16c041da976e16871cd3fb5eeadf6c2 /drivers/gpu/drm/radeon/radeon_device.c
parent367cbe2fec9b57b72605e2ac4cfd4f2fa823a256 (diff)
drm/radeon: clean up vram/gtt location handling
Add a per-asic MC (memory controller) mask which holds the mak address mask the asic is capable of. Use this when calculating the vram and gtt locations rather using asic specific functions or limiting everything to 32 bits. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_device.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index 44b8034a400d..62d0ba338582 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -359,7 +359,7 @@ void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64
359 uint64_t limit = (uint64_t)radeon_vram_limit << 20; 359 uint64_t limit = (uint64_t)radeon_vram_limit << 20;
360 360
361 mc->vram_start = base; 361 mc->vram_start = base;
362 if (mc->mc_vram_size > (0xFFFFFFFF - base + 1)) { 362 if (mc->mc_vram_size > (rdev->mc.mc_mask - base + 1)) {
363 dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n"); 363 dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n");
364 mc->real_vram_size = mc->aper_size; 364 mc->real_vram_size = mc->aper_size;
365 mc->mc_vram_size = mc->aper_size; 365 mc->mc_vram_size = mc->aper_size;
@@ -394,7 +394,7 @@ void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
394{ 394{
395 u64 size_af, size_bf; 395 u64 size_af, size_bf;
396 396
397 size_af = ((0xFFFFFFFF - mc->vram_end) + mc->gtt_base_align) & ~mc->gtt_base_align; 397 size_af = ((rdev->mc.mc_mask - mc->vram_end) + mc->gtt_base_align) & ~mc->gtt_base_align;
398 size_bf = mc->vram_start & ~mc->gtt_base_align; 398 size_bf = mc->vram_start & ~mc->gtt_base_align;
399 if (size_bf > size_af) { 399 if (size_bf > size_af) {
400 if (mc->gtt_size > size_bf) { 400 if (mc->gtt_size > size_bf) {
@@ -1068,6 +1068,17 @@ int radeon_device_init(struct radeon_device *rdev,
1068 radeon_agp_disable(rdev); 1068 radeon_agp_disable(rdev);
1069 } 1069 }
1070 1070
1071 /* Set the internal MC address mask
1072 * This is the max address of the GPU's
1073 * internal address space.
1074 */
1075 if (rdev->family >= CHIP_CAYMAN)
1076 rdev->mc.mc_mask = 0xffffffffffULL; /* 40 bit MC */
1077 else if (rdev->family >= CHIP_CEDAR)
1078 rdev->mc.mc_mask = 0xfffffffffULL; /* 36 bit MC */
1079 else
1080 rdev->mc.mc_mask = 0xffffffffULL; /* 32 bit MC */
1081
1071 /* set DMA mask + need_dma32 flags. 1082 /* set DMA mask + need_dma32 flags.
1072 * PCIE - can handle 40-bits. 1083 * PCIE - can handle 40-bits.
1073 * IGP - can handle 40-bits 1084 * IGP - can handle 40-bits