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>
This commit is contained in:
@@ -359,7 +359,7 @@ void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64
|
||||
uint64_t limit = (uint64_t)radeon_vram_limit << 20;
|
||||
|
||||
mc->vram_start = base;
|
||||
if (mc->mc_vram_size > (0xFFFFFFFF - base + 1)) {
|
||||
if (mc->mc_vram_size > (rdev->mc.mc_mask - base + 1)) {
|
||||
dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n");
|
||||
mc->real_vram_size = mc->aper_size;
|
||||
mc->mc_vram_size = mc->aper_size;
|
||||
@@ -394,7 +394,7 @@ void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
|
||||
{
|
||||
u64 size_af, size_bf;
|
||||
|
||||
size_af = ((0xFFFFFFFF - mc->vram_end) + mc->gtt_base_align) & ~mc->gtt_base_align;
|
||||
size_af = ((rdev->mc.mc_mask - mc->vram_end) + mc->gtt_base_align) & ~mc->gtt_base_align;
|
||||
size_bf = mc->vram_start & ~mc->gtt_base_align;
|
||||
if (size_bf > size_af) {
|
||||
if (mc->gtt_size > size_bf) {
|
||||
@@ -1068,6 +1068,17 @@ int radeon_device_init(struct radeon_device *rdev,
|
||||
radeon_agp_disable(rdev);
|
||||
}
|
||||
|
||||
/* Set the internal MC address mask
|
||||
* This is the max address of the GPU's
|
||||
* internal address space.
|
||||
*/
|
||||
if (rdev->family >= CHIP_CAYMAN)
|
||||
rdev->mc.mc_mask = 0xffffffffffULL; /* 40 bit MC */
|
||||
else if (rdev->family >= CHIP_CEDAR)
|
||||
rdev->mc.mc_mask = 0xfffffffffULL; /* 36 bit MC */
|
||||
else
|
||||
rdev->mc.mc_mask = 0xffffffffULL; /* 32 bit MC */
|
||||
|
||||
/* set DMA mask + need_dma32 flags.
|
||||
* PCIE - can handle 40-bits.
|
||||
* IGP - can handle 40-bits
|
||||
|
||||
Reference in New Issue
Block a user