diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_device.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 64 | 
1 files changed, 28 insertions, 36 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 64a42647f08..e2f5f888c37 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c @@ -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)  { +	uint64_t limit = (uint64_t)radeon_vram_limit << 20; +  	mc->vram_start = base;  	if (mc->mc_vram_size > (0xFFFFFFFF - base + 1)) {  		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  		mc->mc_vram_size = mc->aper_size;  	}  	mc->vram_end = mc->vram_start + mc->mc_vram_size - 1; -	if (radeon_vram_limit && radeon_vram_limit < mc->real_vram_size) -		mc->real_vram_size = radeon_vram_limit; +	if (limit && limit < mc->real_vram_size) +		mc->real_vram_size = limit;  	dev_info(rdev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n",  			mc->mc_vram_size >> 20, mc->vram_start,  			mc->vram_end, mc->real_vram_size >> 20); @@ -835,6 +837,19 @@ static unsigned int radeon_vga_set_decode(void *cookie, bool state)  }  /** + * 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   *   * @rdev: radeon_device pointer @@ -845,52 +860,25 @@ static unsigned int radeon_vga_set_decode(void *cookie, bool state)  static void radeon_check_arguments(struct radeon_device *rdev)  {  	/* vramlimit must be a power of two */ -	switch (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: +	if (!radeon_check_pot_argument(radeon_vram_limit)) {  		dev_warn(rdev->dev, "vram limit (%d) must be a power of 2\n",  				radeon_vram_limit);  		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 */ -	switch (radeon_gart_size) { -	case 4: -	case 8: -	case 16: +	if (radeon_gart_size < 32) {  		dev_warn(rdev->dev, "gart size (%d) too small forcing to 512M\n",  				radeon_gart_size);  		radeon_gart_size = 512; -		break; -	case 32: -	case 64: -	case 128: -	case 256: -	case 512: -	case 1024: -	case 2048: -	case 4096: -		break; -	default: + +	} else if (!radeon_check_pot_argument(radeon_gart_size)) {  		dev_warn(rdev->dev, "gart size (%d) must be a power of 2\n",  				radeon_gart_size);  		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 */  	switch (radeon_agpmode) {  	case -1: @@ -1018,6 +1006,10 @@ int radeon_device_init(struct radeon_device *rdev,  		return r;  	/* initialize vm here */  	mutex_init(&rdev->vm_manager.lock); +	/* Adjust VM size here. +	 * Currently set to 4GB ((1 << 20) 4k pages). +	 * Max GPUVM size for cayman and SI is 40 bits. +	 */  	rdev->vm_manager.max_pfn = 1 << 20;  	INIT_LIST_HEAD(&rdev->vm_manager.lru_vm);  |