diff options
Diffstat (limited to 'linux-core')
| -rw-r--r-- | linux-core/drmP.h | 3 | ||||
| -rw-r--r-- | linux-core/drm_drv.c | 32 | ||||
| -rw-r--r-- | linux-core/drm_memory.c | 7 | 
3 files changed, 32 insertions, 10 deletions
diff --git a/linux-core/drmP.h b/linux-core/drmP.h index af8a544d..ff3fc67f 100644 --- a/linux-core/drmP.h +++ b/linux-core/drmP.h @@ -1127,7 +1127,8 @@ extern void drm_query_memctl(drm_u64_t *cur_used,  			     drm_u64_t *low_threshold,  			     drm_u64_t *high_threshold);   extern void drm_init_memctl(size_t low_threshold, -			    size_t high_threshold); +			    size_t high_threshold, +			    size_t unit_size);  				/* Misc. IOCTL support (drm_ioctl.h) */  extern int drm_irq_by_busid(struct inode *inode, struct file *filp, diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c index 45f563ff..ff9b29e7 100644 --- a/linux-core/drm_drv.c +++ b/linux-core/drm_drv.c @@ -148,10 +148,11 @@ int drm_lastclose(drm_device_t * dev)  	DRM_DEBUG("\n"); -	if (drm_bo_driver_finish(dev)) { -		DRM_ERROR("DRM memory manager still busy. " -			  "System is unstable. Please reboot.\n"); -	} +	/* +	 * We can't do much about this function failing. +	 */ + +	drm_bo_driver_finish(dev);  	if (dev->driver->lastclose)  		dev->driver->lastclose(dev); @@ -450,9 +451,28 @@ static int __init drm_core_init(void)  {  	int ret;  	struct sysinfo si; -	 +	unsigned long avail_memctl_mem; +	unsigned long max_memctl_mem; +  	si_meminfo(&si); -	drm_init_memctl(si.totalram/2, si.totalram*3/4); +	 +	/* +	 * AGP only allows low / DMA32 memory ATM. +	 */ + +	avail_memctl_mem = si.totalram - si.totalhigh; + +	/*  +	 * Avoid overflows  +	 */ + +	max_memctl_mem = 1UL << (32 - PAGE_SHIFT); +	max_memctl_mem = (max_memctl_mem / si.mem_unit) * PAGE_SIZE;  + +	if (avail_memctl_mem >= max_memctl_mem) +		avail_memctl_mem = max_memctl_mem; + +	drm_init_memctl(avail_memctl_mem/2, avail_memctl_mem*3/4, si.mem_unit);  	ret = -ENOMEM;  	drm_cards_limit = diff --git a/linux-core/drm_memory.c b/linux-core/drm_memory.c index 62f54b67..9a53fa82 100644 --- a/linux-core/drm_memory.c +++ b/linux-core/drm_memory.c @@ -95,12 +95,13 @@ void drm_query_memctl(drm_u64_t *cur_used,  EXPORT_SYMBOL(drm_query_memctl);  void drm_init_memctl(size_t p_low_threshold, -		     size_t p_high_threshold) +		     size_t p_high_threshold, +		     size_t unit_size)  {  	spin_lock(&drm_memctl.lock);  	drm_memctl.cur_used = 0; -	drm_memctl.low_threshold = p_low_threshold << PAGE_SHIFT; -	drm_memctl.high_threshold = p_high_threshold << PAGE_SHIFT; +	drm_memctl.low_threshold = p_low_threshold * unit_size; +	drm_memctl.high_threshold = p_high_threshold * unit_size;  	spin_unlock(&drm_memctl.lock);  }  | 
