diff options
Diffstat (limited to 'drivers/char/drm/drm_bufs.c')
-rw-r--r-- | drivers/char/drm/drm_bufs.c | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/drivers/char/drm/drm_bufs.c b/drivers/char/drm/drm_bufs.c index 319bdea8de8a..1845dd062816 100644 --- a/drivers/char/drm/drm_bufs.c +++ b/drivers/char/drm/drm_bufs.c | |||
@@ -36,22 +36,21 @@ | |||
36 | #include <linux/vmalloc.h> | 36 | #include <linux/vmalloc.h> |
37 | #include "drmP.h" | 37 | #include "drmP.h" |
38 | 38 | ||
39 | unsigned long drm_get_resource_start(drm_device_t * dev, unsigned int resource) | 39 | unsigned long drm_get_resource_start(drm_device_t *dev, unsigned int resource) |
40 | { | 40 | { |
41 | return pci_resource_start(dev->pdev, resource); | 41 | return pci_resource_start(dev->pdev, resource); |
42 | } | 42 | } |
43 | |||
44 | EXPORT_SYMBOL(drm_get_resource_start); | 43 | EXPORT_SYMBOL(drm_get_resource_start); |
45 | 44 | ||
46 | unsigned long drm_get_resource_len(drm_device_t * dev, unsigned int resource) | 45 | unsigned long drm_get_resource_len(drm_device_t *dev, unsigned int resource) |
47 | { | 46 | { |
48 | return pci_resource_len(dev->pdev, resource); | 47 | return pci_resource_len(dev->pdev, resource); |
49 | } | 48 | } |
50 | 49 | ||
51 | EXPORT_SYMBOL(drm_get_resource_len); | 50 | EXPORT_SYMBOL(drm_get_resource_len); |
52 | 51 | ||
53 | static drm_map_list_t *drm_find_matching_map(drm_device_t * dev, | 52 | static drm_map_list_t *drm_find_matching_map(drm_device_t *dev, |
54 | drm_local_map_t * map) | 53 | drm_local_map_t *map) |
55 | { | 54 | { |
56 | struct list_head *list; | 55 | struct list_head *list; |
57 | 56 | ||
@@ -74,7 +73,7 @@ static drm_map_list_t *drm_find_matching_map(drm_device_t * dev, | |||
74 | 73 | ||
75 | #ifdef _LP64 | 74 | #ifdef _LP64 |
76 | static __inline__ unsigned int HandleID(unsigned long lhandle, | 75 | static __inline__ unsigned int HandleID(unsigned long lhandle, |
77 | drm_device_t * dev) | 76 | drm_device_t *dev) |
78 | { | 77 | { |
79 | static unsigned int map32_handle = START_RANGE; | 78 | static unsigned int map32_handle = START_RANGE; |
80 | unsigned int hash; | 79 | unsigned int hash; |
@@ -301,6 +300,9 @@ int drm_addmap_ioctl(struct inode *inode, struct file *filp, | |||
301 | return -EFAULT; | 300 | return -EFAULT; |
302 | } | 301 | } |
303 | 302 | ||
303 | if (!(capable(CAP_SYS_ADMIN) || map.type == _DRM_AGP)) | ||
304 | return -EPERM; | ||
305 | |||
304 | err = drm_addmap_core(dev, map.offset, map.size, map.type, map.flags, | 306 | err = drm_addmap_core(dev, map.offset, map.size, map.type, map.flags, |
305 | &maplist); | 307 | &maplist); |
306 | 308 | ||
@@ -332,7 +334,7 @@ int drm_addmap_ioctl(struct inode *inode, struct file *filp, | |||
332 | * | 334 | * |
333 | * \sa drm_addmap | 335 | * \sa drm_addmap |
334 | */ | 336 | */ |
335 | int drm_rmmap_locked(drm_device_t * dev, drm_local_map_t * map) | 337 | int drm_rmmap_locked(drm_device_t *dev, drm_local_map_t *map) |
336 | { | 338 | { |
337 | struct list_head *list; | 339 | struct list_head *list; |
338 | drm_map_list_t *r_list = NULL; | 340 | drm_map_list_t *r_list = NULL; |
@@ -384,10 +386,9 @@ int drm_rmmap_locked(drm_device_t * dev, drm_local_map_t * map) | |||
384 | 386 | ||
385 | return 0; | 387 | return 0; |
386 | } | 388 | } |
387 | |||
388 | EXPORT_SYMBOL(drm_rmmap_locked); | 389 | EXPORT_SYMBOL(drm_rmmap_locked); |
389 | 390 | ||
390 | int drm_rmmap(drm_device_t * dev, drm_local_map_t * map) | 391 | int drm_rmmap(drm_device_t *dev, drm_local_map_t *map) |
391 | { | 392 | { |
392 | int ret; | 393 | int ret; |
393 | 394 | ||
@@ -397,7 +398,6 @@ int drm_rmmap(drm_device_t * dev, drm_local_map_t * map) | |||
397 | 398 | ||
398 | return ret; | 399 | return ret; |
399 | } | 400 | } |
400 | |||
401 | EXPORT_SYMBOL(drm_rmmap); | 401 | EXPORT_SYMBOL(drm_rmmap); |
402 | 402 | ||
403 | /* The rmmap ioctl appears to be unnecessary. All mappings are torn down on | 403 | /* The rmmap ioctl appears to be unnecessary. All mappings are torn down on |
@@ -548,7 +548,7 @@ int drm_addbufs_agp(drm_device_t * dev, drm_buf_desc_t * request) | |||
548 | DRM_DEBUG("count: %d\n", count); | 548 | DRM_DEBUG("count: %d\n", count); |
549 | DRM_DEBUG("order: %d\n", order); | 549 | DRM_DEBUG("order: %d\n", order); |
550 | DRM_DEBUG("size: %d\n", size); | 550 | DRM_DEBUG("size: %d\n", size); |
551 | DRM_DEBUG("agp_offset: %lu\n", agp_offset); | 551 | DRM_DEBUG("agp_offset: %lx\n", agp_offset); |
552 | DRM_DEBUG("alignment: %d\n", alignment); | 552 | DRM_DEBUG("alignment: %d\n", alignment); |
553 | DRM_DEBUG("page_order: %d\n", page_order); | 553 | DRM_DEBUG("page_order: %d\n", page_order); |
554 | DRM_DEBUG("total: %d\n", total); | 554 | DRM_DEBUG("total: %d\n", total); |
@@ -649,6 +649,8 @@ int drm_addbufs_agp(drm_device_t * dev, drm_buf_desc_t * request) | |||
649 | } | 649 | } |
650 | 650 | ||
651 | dma->buf_count += entry->buf_count; | 651 | dma->buf_count += entry->buf_count; |
652 | dma->seg_count += entry->seg_count; | ||
653 | dma->page_count += byte_count >> PAGE_SHIFT; | ||
652 | dma->byte_count += byte_count; | 654 | dma->byte_count += byte_count; |
653 | 655 | ||
654 | DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count); | 656 | DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count); |
@@ -664,7 +666,6 @@ int drm_addbufs_agp(drm_device_t * dev, drm_buf_desc_t * request) | |||
664 | atomic_dec(&dev->buf_alloc); | 666 | atomic_dec(&dev->buf_alloc); |
665 | return 0; | 667 | return 0; |
666 | } | 668 | } |
667 | |||
668 | EXPORT_SYMBOL(drm_addbufs_agp); | 669 | EXPORT_SYMBOL(drm_addbufs_agp); |
669 | #endif /* __OS_HAS_AGP */ | 670 | #endif /* __OS_HAS_AGP */ |
670 | 671 | ||
@@ -689,9 +690,13 @@ int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request) | |||
689 | 690 | ||
690 | if (!drm_core_check_feature(dev, DRIVER_PCI_DMA)) | 691 | if (!drm_core_check_feature(dev, DRIVER_PCI_DMA)) |
691 | return -EINVAL; | 692 | return -EINVAL; |
693 | |||
692 | if (!dma) | 694 | if (!dma) |
693 | return -EINVAL; | 695 | return -EINVAL; |
694 | 696 | ||
697 | if (!capable(CAP_SYS_ADMIN)) | ||
698 | return -EPERM; | ||
699 | |||
695 | count = request->count; | 700 | count = request->count; |
696 | order = drm_order(request->size); | 701 | order = drm_order(request->size); |
697 | size = 1 << order; | 702 | size = 1 << order; |
@@ -882,7 +887,6 @@ int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request) | |||
882 | return 0; | 887 | return 0; |
883 | 888 | ||
884 | } | 889 | } |
885 | |||
886 | EXPORT_SYMBOL(drm_addbufs_pci); | 890 | EXPORT_SYMBOL(drm_addbufs_pci); |
887 | 891 | ||
888 | static int drm_addbufs_sg(drm_device_t * dev, drm_buf_desc_t * request) | 892 | static int drm_addbufs_sg(drm_device_t * dev, drm_buf_desc_t * request) |
@@ -908,6 +912,9 @@ static int drm_addbufs_sg(drm_device_t * dev, drm_buf_desc_t * request) | |||
908 | if (!dma) | 912 | if (!dma) |
909 | return -EINVAL; | 913 | return -EINVAL; |
910 | 914 | ||
915 | if (!capable(CAP_SYS_ADMIN)) | ||
916 | return -EPERM; | ||
917 | |||
911 | count = request->count; | 918 | count = request->count; |
912 | order = drm_order(request->size); | 919 | order = drm_order(request->size); |
913 | size = 1 << order; | 920 | size = 1 << order; |
@@ -1026,6 +1033,8 @@ static int drm_addbufs_sg(drm_device_t * dev, drm_buf_desc_t * request) | |||
1026 | } | 1033 | } |
1027 | 1034 | ||
1028 | dma->buf_count += entry->buf_count; | 1035 | dma->buf_count += entry->buf_count; |
1036 | dma->seg_count += entry->seg_count; | ||
1037 | dma->page_count += byte_count >> PAGE_SHIFT; | ||
1029 | dma->byte_count += byte_count; | 1038 | dma->byte_count += byte_count; |
1030 | 1039 | ||
1031 | DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count); | 1040 | DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count); |
@@ -1042,7 +1051,7 @@ static int drm_addbufs_sg(drm_device_t * dev, drm_buf_desc_t * request) | |||
1042 | return 0; | 1051 | return 0; |
1043 | } | 1052 | } |
1044 | 1053 | ||
1045 | static int drm_addbufs_fb(drm_device_t * dev, drm_buf_desc_t * request) | 1054 | int drm_addbufs_fb(drm_device_t * dev, drm_buf_desc_t * request) |
1046 | { | 1055 | { |
1047 | drm_device_dma_t *dma = dev->dma; | 1056 | drm_device_dma_t *dma = dev->dma; |
1048 | drm_buf_entry_t *entry; | 1057 | drm_buf_entry_t *entry; |
@@ -1065,6 +1074,9 @@ static int drm_addbufs_fb(drm_device_t * dev, drm_buf_desc_t * request) | |||
1065 | if (!dma) | 1074 | if (!dma) |
1066 | return -EINVAL; | 1075 | return -EINVAL; |
1067 | 1076 | ||
1077 | if (!capable(CAP_SYS_ADMIN)) | ||
1078 | return -EPERM; | ||
1079 | |||
1068 | count = request->count; | 1080 | count = request->count; |
1069 | order = drm_order(request->size); | 1081 | order = drm_order(request->size); |
1070 | size = 1 << order; | 1082 | size = 1 << order; |
@@ -1181,6 +1193,8 @@ static int drm_addbufs_fb(drm_device_t * dev, drm_buf_desc_t * request) | |||
1181 | } | 1193 | } |
1182 | 1194 | ||
1183 | dma->buf_count += entry->buf_count; | 1195 | dma->buf_count += entry->buf_count; |
1196 | dma->seg_count += entry->seg_count; | ||
1197 | dma->page_count += byte_count >> PAGE_SHIFT; | ||
1184 | dma->byte_count += byte_count; | 1198 | dma->byte_count += byte_count; |
1185 | 1199 | ||
1186 | DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count); | 1200 | DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count); |
@@ -1196,6 +1210,8 @@ static int drm_addbufs_fb(drm_device_t * dev, drm_buf_desc_t * request) | |||
1196 | atomic_dec(&dev->buf_alloc); | 1210 | atomic_dec(&dev->buf_alloc); |
1197 | return 0; | 1211 | return 0; |
1198 | } | 1212 | } |
1213 | EXPORT_SYMBOL(drm_addbufs_fb); | ||
1214 | |||
1199 | 1215 | ||
1200 | /** | 1216 | /** |
1201 | * Add buffers for DMA transfers (ioctl). | 1217 | * Add buffers for DMA transfers (ioctl). |
@@ -1577,5 +1593,6 @@ int drm_order(unsigned long size) | |||
1577 | 1593 | ||
1578 | return order; | 1594 | return order; |
1579 | } | 1595 | } |
1580 | |||
1581 | EXPORT_SYMBOL(drm_order); | 1596 | EXPORT_SYMBOL(drm_order); |
1597 | |||
1598 | |||