patch-2.4.0-test7 linux/drivers/char/drm/ffb_drv.c
Next file: linux/drivers/char/drm/lists.c
Previous file: linux/drivers/char/drm/drmP.h
Back to the patch index
Back to the overall index
- Lines: 103
- Date:
Thu Aug 10 12:43:12 2000
- Orig file:
v2.4.0-test6/linux/drivers/char/drm/ffb_drv.c
- Orig date:
Thu Jul 27 17:38:00 2000
diff -u --recursive --new-file v2.4.0-test6/linux/drivers/char/drm/ffb_drv.c linux/drivers/char/drm/ffb_drv.c
@@ -1,4 +1,4 @@
-/* $Id: ffb_drv.c,v 1.5 2000/07/26 01:03:57 davem Exp $
+/* $Id: ffb_drv.c,v 1.6 2000/08/10 05:26:23 davem Exp $
* ffb_drv.c: Creator/Creator3D direct rendering driver.
*
* Copyright (C) 2000 David S. Miller (davem@redhat.com)
@@ -754,6 +754,7 @@
extern struct vm_operations_struct drm_vm_ops;
extern struct vm_operations_struct drm_vm_shm_ops;
+extern struct vm_operations_struct drm_vm_shm_lock_ops;
static int ffb_mmap(struct file *filp, struct vm_area_struct *vma)
{
@@ -766,7 +767,6 @@
DRM_DEBUG("start = 0x%lx, end = 0x%lx, offset = 0x%lx\n",
vma->vm_start, vma->vm_end, VM_OFFSET(vma));
- lock_kernel();
minor = MINOR(filp->f_dentry->d_inode->i_rdev);
ffb_priv = NULL;
for (i = 0; i < ffb_dev_table_size; i++) {
@@ -774,15 +774,13 @@
if (ffb_priv->miscdev.minor == minor)
break;
}
- if (i >= ffb_dev_table_size) {
- unlock_kernel();
+ if (i >= ffb_dev_table_size)
return -EINVAL;
- }
+
/* We don't support/need dma mappings, so... */
- if (!VM_OFFSET(vma)) {
- unlock_kernel();
+ if (!VM_OFFSET(vma))
return -EINVAL;
- }
+
for (i = 0; i < dev->map_count; i++) {
unsigned long off;
@@ -794,19 +792,16 @@
break;
}
- if (i >= dev->map_count) {
- unlock_kernel();
+ if (i >= dev->map_count)
return -EINVAL;
- }
+
if (!map ||
- ((map->flags & _DRM_RESTRICTED) && !capable(CAP_SYS_ADMIN))) {
- unlock_kernel();
+ ((map->flags & _DRM_RESTRICTED) && !capable(CAP_SYS_ADMIN)))
return -EPERM;
- }
- if (map->size != (vma->vm_end - vma->vm_start)) {
- unlock_kernel();
+
+ if (map->size != (vma->vm_end - vma->vm_start))
return -EINVAL;
- }
+
/* Set read-only attribute before mappings are created
* so it works for fb/reg maps too.
*/
@@ -829,15 +824,19 @@
if (io_remap_page_range(vma->vm_start,
ffb_priv->card_phys_base + VM_OFFSET(vma),
vma->vm_end - vma->vm_start,
- vma->vm_page_prot, 0)) {
- unlock_kernel();
+ vma->vm_page_prot, 0))
return -EAGAIN;
- }
+
vma->vm_ops = &drm_vm_ops;
break;
case _DRM_SHM:
align_shm_mapping(vma, (unsigned long)dev->lock.hw_lock);
- vma->vm_ops = &drm_vm_shm_ops;
+ if (map->flags & _DRM_CONTAINS_LOCK)
+ vma->vm_ops = &drm_vm_shm_lock_ops;
+ else {
+ vma->vm_ops = &drm_vm_shm_ops;
+ vma->vm_private_data = (void *) map;
+ }
/* Don't let this area swap. Change when
* DRM_KERNEL advisory is supported.
@@ -845,10 +844,8 @@
vma->vm_flags |= VM_LOCKED;
break;
default:
- unlock_kernel();
return -EINVAL; /* This should never happen. */
};
- unlock_kernel();
vma->vm_flags |= VM_LOCKED | VM_SHM; /* Don't swap */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)