diff options
| author | Stephane Marchesin <marchesin@icps.u-strasbg.fr> | 2007-01-08 03:50:34 +0100 | 
|---|---|---|
| committer | Stephane Marchesin <marchesin@icps.u-strasbg.fr> | 2007-01-08 03:50:34 +0100 | 
| commit | 6eaa1272b4159a547d6da21f14cbcc5b5d0f600c (patch) | |
| tree | 04dd69ca7fed310a1e5719e738a3b893f782d3b2 /linux-core | |
| parent | 1f0f7d7a180af088d6c79d55da04402f0eff0416 (diff) | |
| parent | 5bf60c9d6c2e04a65085a0a332de24b06043fcb8 (diff) | |
Merge branch 'master' of git+ssh://marcheu@git.freedesktop.org/git/mesa/drm
Diffstat (limited to 'linux-core')
| -rw-r--r-- | linux-core/drmP.h | 22 | ||||
| -rw-r--r-- | linux-core/drm_bufs.c | 8 | ||||
| -rw-r--r-- | linux-core/drm_memory.c | 23 | ||||
| -rw-r--r-- | linux-core/drm_memory.h | 76 | ||||
| -rw-r--r-- | linux-core/drm_memory_debug.c | 73 | ||||
| -rw-r--r-- | linux-core/drm_memory_debug.h | 68 | ||||
| -rw-r--r-- | linux-core/drm_vm.c | 2 | ||||
| -rw-r--r-- | linux-core/i810_dma.c | 34 | ||||
| -rw-r--r-- | linux-core/i810_drv.h | 2 | ||||
| -rw-r--r-- | linux-core/i830_dma.c | 32 | ||||
| -rw-r--r-- | linux-core/i830_drv.h | 2 | 
11 files changed, 80 insertions, 262 deletions
| diff --git a/linux-core/drmP.h b/linux-core/drmP.h index ecb03181..af8a544d 100644 --- a/linux-core/drmP.h +++ b/linux-core/drmP.h @@ -1457,26 +1457,8 @@ extern int drm_fence_buffer_objects(drm_file_t * priv,  				    drm_fence_object_t *fence,  				    drm_fence_object_t **used_fence); - -/* Inline replacements for DRM_IOREMAP macros */ -static __inline__ void drm_core_ioremap(struct drm_map *map, -					struct drm_device *dev) -{ -	map->handle = drm_ioremap(map->offset, map->size, dev); -} - -static __inline__ void drm_core_ioremap_nocache(struct drm_map *map, -						struct drm_device *dev) -{ -	map->handle = drm_ioremap_nocache(map->offset, map->size, dev); -} - -static __inline__ void drm_core_ioremapfree(struct drm_map *map, -					    struct drm_device *dev) -{ -	if (map->handle && map->size) -		drm_ioremapfree(map->handle, map->size, dev); -} +extern void drm_core_ioremap(struct drm_map *map, struct drm_device *dev); +extern void drm_core_ioremapfree(struct drm_map *map, struct drm_device *dev);  static __inline__ struct drm_map *drm_core_findmap(struct drm_device *dev,  						   unsigned int token) diff --git a/linux-core/drm_bufs.c b/linux-core/drm_bufs.c index 1ff191ad..8793ba0e 100644 --- a/linux-core/drm_bufs.c +++ b/linux-core/drm_bufs.c @@ -179,7 +179,7 @@ static int drm_addmap_core(drm_device_t * dev, unsigned int offset,  			}  		}  		if (map->type == _DRM_REGISTERS) -			map->handle = drm_ioremap(map->offset, map->size, dev); +			map->handle = ioremap(map->offset, map->size);  		break;  	case _DRM_SHM:  		list = drm_find_matching_map(dev, map); @@ -279,6 +279,8 @@ static int drm_addmap_core(drm_device_t * dev, unsigned int offset,  	list = drm_alloc(sizeof(*list), DRM_MEM_MAPS);  	if (!list) { +		if (map->type == _DRM_REGISTERS) +			iounmap(map->handle);  		drm_free(map, sizeof(*map), DRM_MEM_MAPS);  		return -EINVAL;  	} @@ -295,6 +297,8 @@ static int drm_addmap_core(drm_device_t * dev, unsigned int offset,  	ret = drm_map_handle(dev, &list->hash, user_token, 0);  	if (ret) { +		if (map->type == _DRM_REGISTERS) +			iounmap(map->handle);  		drm_free(map, sizeof(*map), DRM_MEM_MAPS);  		drm_free(list, sizeof(*list), DRM_MEM_MAPS);  		mutex_unlock(&dev->struct_mutex); @@ -402,7 +406,7 @@ int drm_rmmap_locked(drm_device_t *dev, drm_local_map_t *map)  	switch (map->type) {  	case _DRM_REGISTERS: -		drm_ioremapfree(map->handle, map->size, dev); +		iounmap(map->handle);  		/* FALLTHROUGH */  	case _DRM_FRAME_BUFFER:  		if (drm_core_has_MTRR(dev) && map->mtrr >= 0) { diff --git a/linux-core/drm_memory.c b/linux-core/drm_memory.c index 10f43f41..62f54b67 100644 --- a/linux-core/drm_memory.c +++ b/linux-core/drm_memory.c @@ -244,3 +244,26 @@ int drm_unbind_agp(DRM_AGP_MEM * handle)  }  #endif				/* agp */  #endif				/* debug_memory */ + +void drm_core_ioremap(struct drm_map *map, struct drm_device *dev) +{ +	if (drm_core_has_AGP(dev) && +	    dev->agp && dev->agp->cant_use_aperture && map->type == _DRM_AGP) +		map->handle = agp_remap(map->offset, map->size, dev); +	else +		map->handle = ioremap(map->offset, map->size); +} +EXPORT_SYMBOL_GPL(drm_core_ioremap); + +void drm_core_ioremapfree(struct drm_map *map, struct drm_device *dev) +{ +	if (!map->handle || !map->size) +		return; + +	if (drm_core_has_AGP(dev) && +	    dev->agp && dev->agp->cant_use_aperture && map->type == _DRM_AGP) +		vunmap(map->handle); +	else +		iounmap(map->handle); +} +EXPORT_SYMBOL_GPL(drm_core_ioremapfree); diff --git a/linux-core/drm_memory.h b/linux-core/drm_memory.h index c299e25a..32b89e5f 100644 --- a/linux-core/drm_memory.h +++ b/linux-core/drm_memory.h @@ -122,19 +122,6 @@ static inline void *agp_remap(unsigned long offset, unsigned long size,  	return addr;  } -static inline unsigned long drm_follow_page(void *vaddr) -{ -	pgd_t *pgd = pgd_offset_k((unsigned long) vaddr); -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,10) -	pmd_t *pmd = pmd_offset(pgd, (unsigned long)vaddr); -#else -	pud_t *pud = pud_offset(pgd, (unsigned long) vaddr); -	pmd_t *pmd = pmd_offset(pud, (unsigned long) vaddr); -#endif -	pte_t *ptep = pte_offset_kernel(pmd, (unsigned long) vaddr); -	return pte_pfn(*ptep) << PAGE_SHIFT; -} -  #else				/* __OS_HAS_AGP */  static inline drm_map_t *drm_lookup_map(unsigned long offset, @@ -149,67 +136,4 @@ static inline void *agp_remap(unsigned long offset, unsigned long size,  	return NULL;  } -static inline unsigned long drm_follow_page(void *vaddr) -{ -	return 0; -} -#endif - -#ifndef DEBUG_MEMORY -static inline void *drm_ioremap(unsigned long offset, unsigned long size, -				drm_device_t * dev) -{ -	if (drm_core_has_AGP(dev) && dev->agp && dev->agp->cant_use_aperture) { -		drm_map_t *map = drm_lookup_map(offset, size, dev); - -		if (map && map->type == _DRM_AGP) -			return agp_remap(offset, size, dev); -	} - -	return ioremap(offset, size); -} - -static inline void *drm_ioremap_nocache(unsigned long offset, -					unsigned long size, drm_device_t * dev) -{ -	if (drm_core_has_AGP(dev) && dev->agp && dev->agp->cant_use_aperture) { -		drm_map_t *map = drm_lookup_map(offset, size, dev); - -		if (map && map->type == _DRM_AGP) -			return agp_remap(offset, size, dev); -	} - -	return ioremap_nocache(offset, size); -} - -static inline void drm_ioremapfree(void *pt, unsigned long size, -				   drm_device_t * dev) -{ -	/* -	 * This is a bit ugly.  It would be much cleaner if the DRM API would use separate -	 * routines for handling mappings in the AGP space.  Hopefully this can be done in -	 * a future revision of the interface... -	 */ -	if (drm_core_has_AGP(dev) && dev->agp && dev->agp->cant_use_aperture -	    && ((unsigned long)pt >= VMALLOC_START -		&& (unsigned long)pt < VMALLOC_END)) { -		unsigned long offset; -		drm_map_t *map; - -		offset = drm_follow_page(pt) | ((unsigned long)pt & ~PAGE_MASK); -		map = drm_lookup_map(offset, size, dev); -		if (map && map->type == _DRM_AGP) { -			vunmap(pt); -			return; -		} -	} -	iounmap(pt); -} -#else -extern void *drm_ioremap(unsigned long offset, unsigned long size, -				drm_device_t * dev); -extern void *drm_ioremap_nocache(unsigned long offset, -					unsigned long size, drm_device_t * dev); -extern void drm_ioremapfree(void *pt, unsigned long size, -				   drm_device_t * dev);  #endif diff --git a/linux-core/drm_memory_debug.c b/linux-core/drm_memory_debug.c index aa1b2922..c124f8f8 100644 --- a/linux-core/drm_memory_debug.c +++ b/linux-core/drm_memory_debug.c @@ -289,79 +289,6 @@ void drm_free_pages(unsigned long address, int order, int area)  	}  } -void *drm_ioremap(unsigned long offset, unsigned long size, drm_device_t * dev) -{ -	void *pt; - -	if (!size) { -		DRM_MEM_ERROR(DRM_MEM_MAPPINGS, -			      "Mapping 0 bytes at 0x%08lx\n", offset); -		return NULL; -	} - -	if (!(pt = drm_ioremap(offset, size, dev))) { -		spin_lock(&drm_mem_lock); -		++drm_mem_stats[DRM_MEM_MAPPINGS].fail_count; -		spin_unlock(&drm_mem_lock); -		return NULL; -	} -	spin_lock(&drm_mem_lock); -	++drm_mem_stats[DRM_MEM_MAPPINGS].succeed_count; -	drm_mem_stats[DRM_MEM_MAPPINGS].bytes_allocated += size; -	spin_unlock(&drm_mem_lock); -	return pt; -} -EXPORT_SYMBOL(drm_ioremap); - -void *drm_ioremap_nocache(unsigned long offset, unsigned long size, -			  drm_device_t * dev) -{ -	void *pt; - -	if (!size) { -		DRM_MEM_ERROR(DRM_MEM_MAPPINGS, -			      "Mapping 0 bytes at 0x%08lx\n", offset); -		return NULL; -	} - -	if (!(pt = drm_ioremap_nocache(offset, size, dev))) { -		spin_lock(&drm_mem_lock); -		++drm_mem_stats[DRM_MEM_MAPPINGS].fail_count; -		spin_unlock(&drm_mem_lock); -		return NULL; -	} -	spin_lock(&drm_mem_lock); -	++drm_mem_stats[DRM_MEM_MAPPINGS].succeed_count; -	drm_mem_stats[DRM_MEM_MAPPINGS].bytes_allocated += size; -	spin_unlock(&drm_mem_lock); -	return pt; -} -EXPORT_SYMBOL(drm_ioremap_nocache); - -void drm_ioremapfree(void *pt, unsigned long size, drm_device_t * dev) -{ -	int alloc_count; -	int free_count; - -	if (!pt) -		DRM_MEM_ERROR(DRM_MEM_MAPPINGS, -			      "Attempt to free NULL pointer\n"); -	else -		drm_ioremapfree(pt, size, dev); - -	spin_lock(&drm_mem_lock); -	drm_mem_stats[DRM_MEM_MAPPINGS].bytes_freed += size; -	free_count = ++drm_mem_stats[DRM_MEM_MAPPINGS].free_count; -	alloc_count = drm_mem_stats[DRM_MEM_MAPPINGS].succeed_count; -	spin_unlock(&drm_mem_lock); -	if (free_count > alloc_count) { -		DRM_MEM_ERROR(DRM_MEM_MAPPINGS, -			      "Excess frees: %d frees, %d allocs\n", -			      free_count, alloc_count); -	} -} -EXPORT_SYMBOL(drm_ioremapfree); -  #if __OS_HAS_AGP  DRM_AGP_MEM *drm_alloc_agp(drm_device_t *dev, int pages, u32 type) diff --git a/linux-core/drm_memory_debug.h b/linux-core/drm_memory_debug.h index 1e0a63b7..9d0dedfb 100644 --- a/linux-core/drm_memory_debug.h +++ b/linux-core/drm_memory_debug.h @@ -275,74 +275,6 @@ void drm_free_pages (unsigned long address, int order, int area) {  	}  } -void *drm_ioremap (unsigned long offset, unsigned long size, -		    drm_device_t * dev) { -	void *pt; - -	if (!size) { -		DRM_MEM_ERROR(DRM_MEM_MAPPINGS, -			      "Mapping 0 bytes at 0x%08lx\n", offset); -		return NULL; -	} - -	if (!(pt = drm_ioremap(offset, size, dev))) { -		spin_lock(&drm_mem_lock); -		++drm_mem_stats[DRM_MEM_MAPPINGS].fail_count; -		spin_unlock(&drm_mem_lock); -		return NULL; -	} -	spin_lock(&drm_mem_lock); -	++drm_mem_stats[DRM_MEM_MAPPINGS].succeed_count; -	drm_mem_stats[DRM_MEM_MAPPINGS].bytes_allocated += size; -	spin_unlock(&drm_mem_lock); -	return pt; -} - -void *drm_ioremap_nocache (unsigned long offset, unsigned long size, -			    drm_device_t * dev) { -	void *pt; - -	if (!size) { -		DRM_MEM_ERROR(DRM_MEM_MAPPINGS, -			      "Mapping 0 bytes at 0x%08lx\n", offset); -		return NULL; -	} - -	if (!(pt = drm_ioremap_nocache(offset, size, dev))) { -		spin_lock(&drm_mem_lock); -		++drm_mem_stats[DRM_MEM_MAPPINGS].fail_count; -		spin_unlock(&drm_mem_lock); -		return NULL; -	} -	spin_lock(&drm_mem_lock); -	++drm_mem_stats[DRM_MEM_MAPPINGS].succeed_count; -	drm_mem_stats[DRM_MEM_MAPPINGS].bytes_allocated += size; -	spin_unlock(&drm_mem_lock); -	return pt; -} - -void drm_ioremapfree (void *pt, unsigned long size, drm_device_t * dev) { -	int alloc_count; -	int free_count; - -	if (!pt) -		DRM_MEM_ERROR(DRM_MEM_MAPPINGS, -			      "Attempt to free NULL pointer\n"); -	else -		drm_ioremapfree(pt, size, dev); - -	spin_lock(&drm_mem_lock); -	drm_mem_stats[DRM_MEM_MAPPINGS].bytes_freed += size; -	free_count = ++drm_mem_stats[DRM_MEM_MAPPINGS].free_count; -	alloc_count = drm_mem_stats[DRM_MEM_MAPPINGS].succeed_count; -	spin_unlock(&drm_mem_lock); -	if (free_count > alloc_count) { -		DRM_MEM_ERROR(DRM_MEM_MAPPINGS, -			      "Excess frees: %d frees, %d allocs\n", -			      free_count, alloc_count); -	} -} -  #if __OS_HAS_AGP  DRM_AGP_MEM *drm_alloc_agp (drm_device_t *dev, int pages, u32 type) { diff --git a/linux-core/drm_vm.c b/linux-core/drm_vm.c index 24130162..827a7bdb 100644 --- a/linux-core/drm_vm.c +++ b/linux-core/drm_vm.c @@ -349,7 +349,7 @@ static void drm_vm_shm_close(struct vm_area_struct *vma)  							   map->size);  					DRM_DEBUG("mtrr_del = %d\n", retcode);  				} -				drm_ioremapfree(map->handle, map->size, dev); +				iounmap(map->handle);  				break;  			case _DRM_SHM:  				vfree(map->handle); diff --git a/linux-core/i810_dma.c b/linux-core/i810_dma.c index 3126796b..ad4d2fce 100644 --- a/linux-core/i810_dma.c +++ b/linux-core/i810_dma.c @@ -238,8 +238,7 @@ static int i810_dma_cleanup(drm_device_t * dev)  		    (drm_i810_private_t *) dev->dev_private;  		if (dev_priv->ring.virtual_start) { -			drm_ioremapfree((void *)dev_priv->ring.virtual_start, -					dev_priv->ring.Size, dev); +			drm_core_ioremapfree(&dev_priv->ring.map, dev);  		}  		if (dev_priv->hw_status_page) {  			pci_free_consistent(dev->pdev, PAGE_SIZE, @@ -255,9 +254,9 @@ static int i810_dma_cleanup(drm_device_t * dev)  		for (i = 0; i < dma->buf_count; i++) {  			drm_buf_t *buf = dma->buflist[i];  			drm_i810_buf_priv_t *buf_priv = buf->dev_private; +  			if (buf_priv->kernel_virtual && buf->total) -				drm_ioremapfree(buf_priv->kernel_virtual, -						buf->total, dev); +				drm_core_ioremapfree(&buf_priv->map, dev);  		}  	}  	return 0; @@ -330,8 +329,15 @@ static int i810_freelist_init(drm_device_t * dev, drm_i810_private_t * dev_priv)  		*buf_priv->in_use = I810_BUF_FREE; -		buf_priv->kernel_virtual = drm_ioremap(buf->bus_address, -						       buf->total, dev); +		buf_priv->map.offset = buf->bus_address; +		buf_priv->map.size = buf->total; +		buf_priv->map.type = _DRM_AGP; +		buf_priv->map.flags = 0; +		buf_priv->map.mtrr = 0; + +		drm_core_ioremap(&buf_priv->map, dev); +		buf_priv->kernel_virtual = buf_priv->map.handle; +  	}  	return 0;  } @@ -382,18 +388,24 @@ static int i810_dma_initialize(drm_device_t * dev,  	dev_priv->ring.End = init->ring_end;  	dev_priv->ring.Size = init->ring_size; -	dev_priv->ring.virtual_start = drm_ioremap(dev->agp->base + -						   init->ring_start, -						   init->ring_size, dev); +	dev_priv->ring.map.offset = dev->agp->base + init->ring_start; +	dev_priv->ring.map.size = init->ring_size; +	dev_priv->ring.map.type = _DRM_AGP; +	dev_priv->ring.map.flags = 0; +	dev_priv->ring.map.mtrr = 0; -	if (dev_priv->ring.virtual_start == NULL) { +	drm_core_ioremap(&dev_priv->ring.map, dev); + +	if (dev_priv->ring.map.handle == NULL) {  		dev->dev_private = (void *)dev_priv;  		i810_dma_cleanup(dev);  		DRM_ERROR("can not ioremap virtual address for"  			  " ring buffer\n"); -		return -ENOMEM; +		return DRM_ERR(ENOMEM);  	} +	dev_priv->ring.virtual_start = dev_priv->ring.map.handle; +  	dev_priv->ring.tail_mask = dev_priv->ring.Size - 1;  	dev_priv->w = init->w; diff --git a/linux-core/i810_drv.h b/linux-core/i810_drv.h index bb7358d2..69d79499 100644 --- a/linux-core/i810_drv.h +++ b/linux-core/i810_drv.h @@ -61,6 +61,7 @@ typedef struct drm_i810_buf_priv {  	int currently_mapped;  	void *virtual;  	void *kernel_virtual; +	drm_local_map_t map;  } drm_i810_buf_priv_t;  typedef struct _drm_i810_ring_buffer { @@ -72,6 +73,7 @@ typedef struct _drm_i810_ring_buffer {  	int head;  	int tail;  	int space; +	drm_local_map_t map;  } drm_i810_ring_buffer_t;  typedef struct drm_i810_private { diff --git a/linux-core/i830_dma.c b/linux-core/i830_dma.c index a1b70794..e93307fb 100644 --- a/linux-core/i830_dma.c +++ b/linux-core/i830_dma.c @@ -226,8 +226,7 @@ static int i830_dma_cleanup(drm_device_t * dev)  		    (drm_i830_private_t *) dev->dev_private;  		if (dev_priv->ring.virtual_start) { -			drm_ioremapfree((void *)dev_priv->ring.virtual_start, -					dev_priv->ring.Size, dev); +			drm_core_ioremapfree(&dev_priv->ring.map, dev);  		}  		if (dev_priv->hw_status_page) {  			pci_free_consistent(dev->pdev, PAGE_SIZE, @@ -245,8 +244,7 @@ static int i830_dma_cleanup(drm_device_t * dev)  			drm_buf_t *buf = dma->buflist[i];  			drm_i830_buf_priv_t *buf_priv = buf->dev_private;  			if (buf_priv->kernel_virtual && buf->total) -				drm_ioremapfree(buf_priv->kernel_virtual, -						buf->total, dev); +				drm_core_ioremapfree(&buf_priv->map, dev);  		}  	}  	return 0; @@ -323,8 +321,14 @@ static int i830_freelist_init(drm_device_t * dev, drm_i830_private_t * dev_priv)  		*buf_priv->in_use = I830_BUF_FREE; -		buf_priv->kernel_virtual = drm_ioremap(buf->bus_address, -						       buf->total, dev); +		buf_priv->map.offset = buf->bus_address; +		buf_priv->map.size = buf->total; +		buf_priv->map.type = _DRM_AGP; +		buf_priv->map.flags = 0; +		buf_priv->map.mtrr = 0; + +		drm_core_ioremap(&buf_priv->map, dev); +		buf_priv->kernel_virtual = buf_priv->map.handle;  	}  	return 0;  } @@ -376,18 +380,24 @@ static int i830_dma_initialize(drm_device_t * dev,  	dev_priv->ring.End = init->ring_end;  	dev_priv->ring.Size = init->ring_size; -	dev_priv->ring.virtual_start = drm_ioremap(dev->agp->base + -						   init->ring_start, -						   init->ring_size, dev); +	dev_priv->ring.map.offset = dev->agp->base + init->ring_start; +	dev_priv->ring.map.size = init->ring_size; +	dev_priv->ring.map.type = _DRM_AGP; +	dev_priv->ring.map.flags = 0; +	dev_priv->ring.map.mtrr = 0; + +	drm_core_ioremap(&dev_priv->ring.map, dev); -	if (dev_priv->ring.virtual_start == NULL) { +	if (dev_priv->ring.map.handle == NULL) {  		dev->dev_private = (void *)dev_priv;  		i830_dma_cleanup(dev);  		DRM_ERROR("can not ioremap virtual address for"  			  " ring buffer\n"); -		return -ENOMEM; +		return DRM_ERR(ENOMEM);  	} +	dev_priv->ring.virtual_start = dev_priv->ring.map.handle; +  	dev_priv->ring.tail_mask = dev_priv->ring.Size - 1;  	dev_priv->w = init->w; diff --git a/linux-core/i830_drv.h b/linux-core/i830_drv.h index 85bc5be6..e91f94af 100644 --- a/linux-core/i830_drv.h +++ b/linux-core/i830_drv.h @@ -68,6 +68,7 @@ typedef struct drm_i830_buf_priv {  	int currently_mapped;  	void __user *virtual;  	void *kernel_virtual; +	drm_local_map_t map;  } drm_i830_buf_priv_t;  typedef struct _drm_i830_ring_buffer { @@ -79,6 +80,7 @@ typedef struct _drm_i830_ring_buffer {  	int head;  	int tail;  	int space; +	drm_local_map_t map;  } drm_i830_ring_buffer_t;  typedef struct drm_i830_private { | 
