drm_bufs.c (196464) | drm_bufs.c (207066) |
---|---|
1/*- 2 * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas. 3 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation --- 15 unchanged lines hidden (view full) --- 24 * 25 * Authors: 26 * Rickard E. (Rik) Faith <faith@valinux.com> 27 * Gareth Hughes <gareth@valinux.com> 28 * 29 */ 30 31#include <sys/cdefs.h> | 1/*- 2 * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas. 3 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation --- 15 unchanged lines hidden (view full) --- 24 * 25 * Authors: 26 * Rickard E. (Rik) Faith <faith@valinux.com> 27 * Gareth Hughes <gareth@valinux.com> 28 * 29 */ 30 31#include <sys/cdefs.h> |
32__FBSDID("$FreeBSD: head/sys/dev/drm/drm_bufs.c 196464 2009-08-23 14:27:46Z rnoland $"); | 32__FBSDID("$FreeBSD: head/sys/dev/drm/drm_bufs.c 207066 2010-04-22 18:21:25Z rnoland $"); |
33 34/** @file drm_bufs.c 35 * Implementation of the ioctls for setup of DRM mappings and DMA buffers. 36 */ 37 38#include "dev/pci/pcireg.h" 39 40#include "dev/drm/drmP.h" --- 110 unchanged lines hidden (view full) --- 151 DRM_LOCK(); 152 return ENOMEM; 153 } 154 155 map->offset = offset; 156 map->size = size; 157 map->type = type; 158 map->flags = flags; | 33 34/** @file drm_bufs.c 35 * Implementation of the ioctls for setup of DRM mappings and DMA buffers. 36 */ 37 38#include "dev/pci/pcireg.h" 39 40#include "dev/drm/drmP.h" --- 110 unchanged lines hidden (view full) --- 151 DRM_LOCK(); 152 return ENOMEM; 153 } 154 155 map->offset = offset; 156 map->size = size; 157 map->type = type; 158 map->flags = flags; |
159 map->handle = (void *)((unsigned long)alloc_unr(dev->map_unrhdr) << 160 DRM_MAP_HANDLE_SHIFT); |
|
159 160 switch (map->type) { 161 case _DRM_REGISTERS: | 161 162 switch (map->type) { 163 case _DRM_REGISTERS: |
162 map->handle = drm_ioremap(dev, map); | 164 map->virtual = drm_ioremap(dev, map); |
163 if (!(map->flags & _DRM_WRITE_COMBINING)) 164 break; 165 /* FALLTHROUGH */ 166 case _DRM_FRAME_BUFFER: 167 if (drm_mtrr_add(map->offset, map->size, DRM_MTRR_WC) == 0) 168 map->mtrr = 1; 169 break; 170 case _DRM_SHM: | 165 if (!(map->flags & _DRM_WRITE_COMBINING)) 166 break; 167 /* FALLTHROUGH */ 168 case _DRM_FRAME_BUFFER: 169 if (drm_mtrr_add(map->offset, map->size, DRM_MTRR_WC) == 0) 170 map->mtrr = 1; 171 break; 172 case _DRM_SHM: |
171 map->handle = malloc(map->size, DRM_MEM_MAPS, M_NOWAIT); | 173 map->virtual = malloc(map->size, DRM_MEM_MAPS, M_NOWAIT); |
172 DRM_DEBUG("%lu %d %p\n", | 174 DRM_DEBUG("%lu %d %p\n", |
173 map->size, drm_order(map->size), map->handle); 174 if (!map->handle) { | 175 map->size, drm_order(map->size), map->virtual); 176 if (!map->virtual) { |
175 free(map, DRM_MEM_MAPS); 176 DRM_LOCK(); 177 return ENOMEM; 178 } | 177 free(map, DRM_MEM_MAPS); 178 DRM_LOCK(); 179 return ENOMEM; 180 } |
179 map->offset = (unsigned long)map->handle; | 181 map->offset = (unsigned long)map->virtual; |
180 if (map->flags & _DRM_CONTAINS_LOCK) { 181 /* Prevent a 2nd X Server from creating a 2nd lock */ 182 DRM_LOCK(); 183 if (dev->lock.hw_lock != NULL) { 184 DRM_UNLOCK(); | 182 if (map->flags & _DRM_CONTAINS_LOCK) { 183 /* Prevent a 2nd X Server from creating a 2nd lock */ 184 DRM_LOCK(); 185 if (dev->lock.hw_lock != NULL) { 186 DRM_UNLOCK(); |
185 free(map->handle, DRM_MEM_MAPS); | 187 free(map->virtual, DRM_MEM_MAPS); |
186 free(map, DRM_MEM_MAPS); 187 return EBUSY; 188 } | 188 free(map, DRM_MEM_MAPS); 189 return EBUSY; 190 } |
189 dev->lock.hw_lock = map->handle; /* Pointer to lock */ | 191 dev->lock.hw_lock = map->virtual; /* Pointer to lock */ |
190 DRM_UNLOCK(); 191 } 192 break; 193 case _DRM_AGP: 194 /*valid = 0;*/ 195 /* In some cases (i810 driver), user space may have already 196 * added the AGP base itself, because dev->agp->base previously 197 * only got set during AGP enable. So, only add the base --- 21 unchanged lines hidden (view full) --- 219 }*/ 220 break; 221 case _DRM_SCATTER_GATHER: 222 if (!dev->sg) { 223 free(map, DRM_MEM_MAPS); 224 DRM_LOCK(); 225 return EINVAL; 226 } | 192 DRM_UNLOCK(); 193 } 194 break; 195 case _DRM_AGP: 196 /*valid = 0;*/ 197 /* In some cases (i810 driver), user space may have already 198 * added the AGP base itself, because dev->agp->base previously 199 * only got set during AGP enable. So, only add the base --- 21 unchanged lines hidden (view full) --- 221 }*/ 222 break; 223 case _DRM_SCATTER_GATHER: 224 if (!dev->sg) { 225 free(map, DRM_MEM_MAPS); 226 DRM_LOCK(); 227 return EINVAL; 228 } |
227 map->offset += dev->sg->handle; | 229 map->virtual = (void *)(dev->sg->handle + offset); 230 map->offset = dev->sg->handle + offset; |
228 break; 229 case _DRM_CONSISTENT: 230 /* Unfortunately, we don't get any alignment specification from 231 * the caller, so we have to guess. drm_pci_alloc requires 232 * a power-of-two alignment, so try to align the bus address of 233 * the map to it size if possible, otherwise just assume 234 * PAGE_SIZE alignment. 235 */ 236 align = map->size; 237 if ((align & (align - 1)) != 0) 238 align = PAGE_SIZE; 239 map->dmah = drm_pci_alloc(dev, map->size, align, 0xfffffffful); 240 if (map->dmah == NULL) { 241 free(map, DRM_MEM_MAPS); 242 DRM_LOCK(); 243 return ENOMEM; 244 } | 231 break; 232 case _DRM_CONSISTENT: 233 /* Unfortunately, we don't get any alignment specification from 234 * the caller, so we have to guess. drm_pci_alloc requires 235 * a power-of-two alignment, so try to align the bus address of 236 * the map to it size if possible, otherwise just assume 237 * PAGE_SIZE alignment. 238 */ 239 align = map->size; 240 if ((align & (align - 1)) != 0) 241 align = PAGE_SIZE; 242 map->dmah = drm_pci_alloc(dev, map->size, align, 0xfffffffful); 243 if (map->dmah == NULL) { 244 free(map, DRM_MEM_MAPS); 245 DRM_LOCK(); 246 return ENOMEM; 247 } |
245 map->handle = map->dmah->vaddr; | 248 map->virtual = map->dmah->vaddr; |
246 map->offset = map->dmah->busaddr; 247 break; 248 default: 249 DRM_ERROR("Bad map type %d\n", map->type); 250 free(map, DRM_MEM_MAPS); 251 DRM_LOCK(); 252 return EINVAL; 253 } --- 32 unchanged lines hidden (view full) --- 286 if (err != 0) 287 return err; 288 289 request->offset = map->offset; 290 request->size = map->size; 291 request->type = map->type; 292 request->flags = map->flags; 293 request->mtrr = map->mtrr; | 249 map->offset = map->dmah->busaddr; 250 break; 251 default: 252 DRM_ERROR("Bad map type %d\n", map->type); 253 free(map, DRM_MEM_MAPS); 254 DRM_LOCK(); 255 return EINVAL; 256 } --- 32 unchanged lines hidden (view full) --- 289 if (err != 0) 290 return err; 291 292 request->offset = map->offset; 293 request->size = map->size; 294 request->type = map->type; 295 request->flags = map->flags; 296 request->mtrr = map->mtrr; |
294 request->handle = map->handle; | 297 request->handle = (void *)map->handle; |
295 | 298 |
296 if (request->type != _DRM_SHM) { 297 request->handle = (void *)request->offset; 298 } 299 | |
300 return 0; 301} 302 303void drm_rmmap(struct drm_device *dev, drm_local_map_t *map) 304{ 305 DRM_SPINLOCK_ASSERT(&dev->dev_lock); 306 307 if (map == NULL) --- 11 unchanged lines hidden (view full) --- 319 int __unused retcode; 320 321 retcode = drm_mtrr_del(0, map->offset, map->size, 322 DRM_MTRR_WC); 323 DRM_DEBUG("mtrr_del = %d\n", retcode); 324 } 325 break; 326 case _DRM_SHM: | 299 return 0; 300} 301 302void drm_rmmap(struct drm_device *dev, drm_local_map_t *map) 303{ 304 DRM_SPINLOCK_ASSERT(&dev->dev_lock); 305 306 if (map == NULL) --- 11 unchanged lines hidden (view full) --- 318 int __unused retcode; 319 320 retcode = drm_mtrr_del(0, map->offset, map->size, 321 DRM_MTRR_WC); 322 DRM_DEBUG("mtrr_del = %d\n", retcode); 323 } 324 break; 325 case _DRM_SHM: |
327 free(map->handle, DRM_MEM_MAPS); | 326 free(map->virtual, DRM_MEM_MAPS); |
328 break; 329 case _DRM_AGP: 330 case _DRM_SCATTER_GATHER: 331 break; 332 case _DRM_CONSISTENT: 333 drm_pci_free(dev, map->dmah); 334 break; 335 default: 336 DRM_ERROR("Bad map type %d\n", map->type); 337 break; 338 } 339 340 if (map->bsr != NULL) { 341 bus_release_resource(dev->device, SYS_RES_MEMORY, map->rid, 342 map->bsr); 343 } 344 | 327 break; 328 case _DRM_AGP: 329 case _DRM_SCATTER_GATHER: 330 break; 331 case _DRM_CONSISTENT: 332 drm_pci_free(dev, map->dmah); 333 break; 334 default: 335 DRM_ERROR("Bad map type %d\n", map->type); 336 break; 337 } 338 339 if (map->bsr != NULL) { 340 bus_release_resource(dev->device, SYS_RES_MEMORY, map->rid, 341 map->bsr); 342 } 343 |
344 DRM_UNLOCK(); 345 if (map->handle) 346 free_unr(dev->map_unrhdr, (unsigned long)map->handle >> 347 DRM_MAP_HANDLE_SHIFT); 348 DRM_LOCK(); 349 |
|
345 free(map, DRM_MEM_MAPS); 346} 347 348/* Remove a map private from list and deallocate resources if the mapping 349 * isn't in use. 350 */ 351 352int drm_rmmap_ioctl(struct drm_device *dev, void *data, --- 696 unchanged lines hidden (view full) --- 1049 (dma->flags & _DRM_DMA_USE_SG))) { 1050 drm_local_map_t *map = dev->agp_buffer_map; 1051 1052 if (map == NULL) { 1053 retcode = EINVAL; 1054 goto done; 1055 } 1056 size = round_page(map->size); | 350 free(map, DRM_MEM_MAPS); 351} 352 353/* Remove a map private from list and deallocate resources if the mapping 354 * isn't in use. 355 */ 356 357int drm_rmmap_ioctl(struct drm_device *dev, void *data, --- 696 unchanged lines hidden (view full) --- 1054 (dma->flags & _DRM_DMA_USE_SG))) { 1055 drm_local_map_t *map = dev->agp_buffer_map; 1056 1057 if (map == NULL) { 1058 retcode = EINVAL; 1059 goto done; 1060 } 1061 size = round_page(map->size); |
1057 foff = map->offset; | 1062 foff = (unsigned long)map->handle; |
1058 } else { 1059 size = round_page(dma->byte_count), 1060 foff = 0; 1061 } 1062 1063 vaddr = round_page((vm_offset_t)vms->vm_daddr + MAXDSIZ); 1064#if __FreeBSD_version >= 600023 1065 retcode = vm_mmap(&vms->vm_map, &vaddr, size, PROT_READ | PROT_WRITE, --- 60 unchanged lines hidden --- | 1063 } else { 1064 size = round_page(dma->byte_count), 1065 foff = 0; 1066 } 1067 1068 vaddr = round_page((vm_offset_t)vms->vm_daddr + MAXDSIZ); 1069#if __FreeBSD_version >= 600023 1070 retcode = vm_mmap(&vms->vm_map, &vaddr, size, PROT_READ | PROT_WRITE, --- 60 unchanged lines hidden --- |