Commit 1bcb04f7 authored by Christian König's avatar Christian König Committed by Alex Deucher

drm/radeon: fix and simplify pot argument checks v3

GART and VRAM size limits need to be a power of two.
Fix values greater than 1GB and simplify those checks a bit.

v2: also fix radeon_vram_limit usage, and simplify test even more.
v3: agd5f: fix spelling as noticed by Klaus Schnass
Signed-off-by: default avatarChristian König <deathsimple@vodafone.de>
Reviewed-by: default avatarMichel Dänzer <michel.daenzer@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 08eda32b
...@@ -355,6 +355,8 @@ int radeon_wb_init(struct radeon_device *rdev) ...@@ -355,6 +355,8 @@ int radeon_wb_init(struct radeon_device *rdev)
*/ */
void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 base) void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 base)
{ {
uint64_t limit = (uint64_t)radeon_vram_limit << 20;
mc->vram_start = base; mc->vram_start = base;
if (mc->mc_vram_size > (0xFFFFFFFF - base + 1)) { if (mc->mc_vram_size > (0xFFFFFFFF - base + 1)) {
dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n"); dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n");
...@@ -368,8 +370,8 @@ void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 ...@@ -368,8 +370,8 @@ void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64
mc->mc_vram_size = mc->aper_size; mc->mc_vram_size = mc->aper_size;
} }
mc->vram_end = mc->vram_start + mc->mc_vram_size - 1; mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
if (radeon_vram_limit && radeon_vram_limit < mc->real_vram_size) if (limit && limit < mc->real_vram_size)
mc->real_vram_size = radeon_vram_limit; mc->real_vram_size = limit;
dev_info(rdev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n", dev_info(rdev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n",
mc->mc_vram_size >> 20, mc->vram_start, mc->mc_vram_size >> 20, mc->vram_start,
mc->vram_end, mc->real_vram_size >> 20); mc->vram_end, mc->real_vram_size >> 20);
...@@ -834,6 +836,19 @@ static unsigned int radeon_vga_set_decode(void *cookie, bool state) ...@@ -834,6 +836,19 @@ static unsigned int radeon_vga_set_decode(void *cookie, bool state)
return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM; return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
} }
/**
* radeon_check_pot_argument - check that argument is a power of two
*
* @arg: value to check
*
* Validates that a certain argument is a power of two (all asics).
* Returns true if argument is valid.
*/
static bool radeon_check_pot_argument(int arg)
{
return (arg & (arg - 1)) == 0;
}
/** /**
* radeon_check_arguments - validate module params * radeon_check_arguments - validate module params
* *
...@@ -845,52 +860,25 @@ static unsigned int radeon_vga_set_decode(void *cookie, bool state) ...@@ -845,52 +860,25 @@ static unsigned int radeon_vga_set_decode(void *cookie, bool state)
static void radeon_check_arguments(struct radeon_device *rdev) static void radeon_check_arguments(struct radeon_device *rdev)
{ {
/* vramlimit must be a power of two */ /* vramlimit must be a power of two */
switch (radeon_vram_limit) { if (!radeon_check_pot_argument(radeon_vram_limit)) {
case 0:
case 4:
case 8:
case 16:
case 32:
case 64:
case 128:
case 256:
case 512:
case 1024:
case 2048:
case 4096:
break;
default:
dev_warn(rdev->dev, "vram limit (%d) must be a power of 2\n", dev_warn(rdev->dev, "vram limit (%d) must be a power of 2\n",
radeon_vram_limit); radeon_vram_limit);
radeon_vram_limit = 0; radeon_vram_limit = 0;
break;
} }
radeon_vram_limit = radeon_vram_limit << 20;
/* gtt size must be power of two and greater or equal to 32M */ /* gtt size must be power of two and greater or equal to 32M */
switch (radeon_gart_size) { if (radeon_gart_size < 32) {
case 4:
case 8:
case 16:
dev_warn(rdev->dev, "gart size (%d) too small forcing to 512M\n", dev_warn(rdev->dev, "gart size (%d) too small forcing to 512M\n",
radeon_gart_size); radeon_gart_size);
radeon_gart_size = 512; radeon_gart_size = 512;
break;
case 32: } else if (!radeon_check_pot_argument(radeon_gart_size)) {
case 64:
case 128:
case 256:
case 512:
case 1024:
case 2048:
case 4096:
break;
default:
dev_warn(rdev->dev, "gart size (%d) must be a power of 2\n", dev_warn(rdev->dev, "gart size (%d) must be a power of 2\n",
radeon_gart_size); radeon_gart_size);
radeon_gart_size = 512; radeon_gart_size = 512;
break;
} }
rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; rdev->mc.gtt_size = (uint64_t)radeon_gart_size << 20;
/* AGP mode can only be -1, 1, 2, 4, 8 */ /* AGP mode can only be -1, 1, 2, 4, 8 */
switch (radeon_agpmode) { switch (radeon_agpmode) {
case -1: case -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