diff options
Diffstat (limited to 'sys/dev/pci')
-rw-r--r-- | sys/dev/pci/drm/drmP.h | 38 | ||||
-rw-r--r-- | sys/dev/pci/drm/drm_bufs.c | 14 | ||||
-rw-r--r-- | sys/dev/pci/drm/drm_memory.c | 28 |
3 files changed, 36 insertions, 44 deletions
diff --git a/sys/dev/pci/drm/drmP.h b/sys/dev/pci/drm/drmP.h index 1cd39eae8e1..6e9b3345f77 100644 --- a/sys/dev/pci/drm/drmP.h +++ b/sys/dev/pci/drm/drmP.h @@ -481,8 +481,12 @@ void *drm_alloc(size_t); void *drm_calloc(size_t, size_t); void *drm_realloc(void *, size_t, size_t); void drm_free(void *); -void *drm_ioremap(struct drm_device *, struct drm_local_map *); -void drm_ioremapfree(struct drm_local_map *); + +/* XXX until we get PAT support */ +#define drm_core_ioremap_wc drm_core_ioremap +void drm_core_ioremap(struct drm_local_map *, struct drm_device *); +void drm_core_ioremapfree(struct drm_local_map *); + int drm_mtrr_add(unsigned long, size_t, int); int drm_mtrr_del(int, unsigned long, size_t, int); @@ -506,6 +510,7 @@ int drm_lock_free(struct drm_lock_data *, unsigned int); /* Buffer management and DMA support (drm_bufs.c) */ int drm_order(unsigned long); +struct drm_local_map *drm_core_findmap(struct drm_device *, unsigned long); int drm_rmmap_ioctl(struct drm_device *, void *, struct drm_file *); void drm_rmmap(struct drm_device *, struct drm_local_map *); void drm_rmmap_locked(struct drm_device *, struct drm_local_map *); @@ -588,34 +593,5 @@ int drm_agp_bind_ioctl(struct drm_device *, void *, struct drm_file *); int drm_sg_alloc_ioctl(struct drm_device *, void *, struct drm_file *); int drm_sg_free(struct drm_device *, void *, struct drm_file *); -/* Inline replacements for DRM_IOREMAP macros */ -#define drm_core_ioremap_wc drm_core_ioremap -static __inline__ void -drm_core_ioremap(struct drm_local_map *map, struct drm_device *dev) -{ - map->handle = drm_ioremap(dev, map); -} - -static __inline__ void -drm_core_ioremapfree(struct drm_local_map *map) -{ - if ( map->handle && map->size ) - drm_ioremapfree(map); -} - -static __inline__ struct drm_local_map * -drm_core_findmap(struct drm_device *dev, unsigned long offset) -{ - struct drm_local_map *map; - - DRM_LOCK(); - TAILQ_FOREACH(map, &dev->maplist, link) { - if (offset == map->ext) - break; - } - DRM_UNLOCK(); - return (map); -} - #endif /* __KERNEL__ */ #endif /* _DRM_P_H_ */ diff --git a/sys/dev/pci/drm/drm_bufs.c b/sys/dev/pci/drm/drm_bufs.c index 32a15d11f2b..d5c2cad02ee 100644 --- a/sys/dev/pci/drm/drm_bufs.c +++ b/sys/dev/pci/drm/drm_bufs.c @@ -59,6 +59,20 @@ drm_order(unsigned long size) return order; } +struct drm_local_map * +drm_core_findmap(struct drm_device *dev, unsigned long offset) +{ + struct drm_local_map *map; + + DRM_LOCK(); + TAILQ_FOREACH(map, &dev->maplist, link) { + if (offset == map->ext) + break; + } + DRM_UNLOCK(); + return (map); +} + int drm_addmap(struct drm_device * dev, unsigned long offset, unsigned long size, enum drm_map_type type, enum drm_map_flags flags, diff --git a/sys/dev/pci/drm/drm_memory.c b/sys/dev/pci/drm/drm_memory.c index 3194c235e92..19fea19d38d 100644 --- a/sys/dev/pci/drm/drm_memory.c +++ b/sys/dev/pci/drm/drm_memory.c @@ -75,12 +75,16 @@ drm_free(void *pt) free(pt, M_DRM); } -void * -drm_ioremap(struct drm_device *dev, struct drm_local_map *map) +/* Inline replacements for DRM_IOREMAP macros */ +void +drm_core_ioremap(struct drm_local_map *map, struct drm_device *dev) { DRM_DEBUG("offset: 0x%x size: 0x%x type: %d\n", map->offset, map->size, map->type); + /* default to failure. */ + map->handle = 0; + if (map->type == _DRM_AGP || map->type == _DRM_FRAME_BUFFER) { /* * there can be multiple agp maps in the same BAR, agp also @@ -92,23 +96,21 @@ drm_ioremap(struct drm_device *dev, struct drm_local_map *map) if (bus_space_map(map->bst, map->offset, map->size, BUS_SPACE_MAP_LINEAR, &map->bsh)) { DRM_ERROR("ioremap fail\n"); - return (NULL); + return; } - } else { - return (NULL); + /* handles are still supposed to be kernel virtual addresses */ + map->handle = bus_space_vaddr(map->bst, map->bsh); } - /* handles are still supposed to be kernel virtual addresses */ - return bus_space_vaddr(map->bst, map->bsh); } void -drm_ioremapfree(struct drm_local_map *map) +drm_core_ioremapfree(struct drm_local_map *map) { - if (map == NULL || (map->type != _DRM_AGP && map->type != - _DRM_FRAME_BUFFER)) - return; - - bus_space_unmap(map->bst, map->bsh, map->size); + if (map->handle && map->size && (map->type == _DRM_AGP || + map->type == _DRM_FRAME_BUFFER)) { + bus_space_unmap(map->bst, map->bsh, map->size); + map->handle = 0; + } } int |