summaryrefslogtreecommitdiff
path: root/sys/dev/drm/drm_vm.c
diff options
context:
space:
mode:
authorRobert Noland <rnoland@FreeBSD.org>2009-01-10 14:53:47 +0000
committerRobert Noland <rnoland@FreeBSD.org>2009-01-10 14:53:47 +0000
commit77e9cff98359f248755d6e2c3bd86d9c910cb647 (patch)
treecde0c61a47dce8d92e00271ae78a065cf40c8a65 /sys/dev/drm/drm_vm.c
parent7ea3329d5f138138384c6b8a5c2feeddf4251dd1 (diff)
Notes
Diffstat (limited to 'sys/dev/drm/drm_vm.c')
-rw-r--r--sys/dev/drm/drm_vm.c48
1 files changed, 18 insertions, 30 deletions
diff --git a/sys/dev/drm/drm_vm.c b/sys/dev/drm/drm_vm.c
index e01257a37d8d..e00684b96a82 100644
--- a/sys/dev/drm/drm_vm.c
+++ b/sys/dev/drm/drm_vm.c
@@ -24,38 +24,35 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+/** @file drm_vm.c
+ * Support code for mmaping of DRM maps.
+ */
+
#include "dev/drm/drmP.h"
#include "dev/drm/drm.h"
-#if defined(__FreeBSD__) && __FreeBSD_version >= 500102
int drm_mmap(struct cdev *kdev, vm_offset_t offset, vm_paddr_t *paddr,
int prot)
-#elif defined(__FreeBSD__)
-int drm_mmap(dev_t kdev, vm_offset_t offset, int prot)
-#elif defined(__NetBSD__) || defined(__OpenBSD__)
-paddr_t drm_mmap(dev_t kdev, off_t offset, int prot)
-#endif
{
- DRM_DEVICE;
+ struct drm_device *dev = drm_get_device_from_kdev(kdev);
+ struct drm_file *file_priv = NULL;
drm_local_map_t *map;
- drm_file_t *priv;
- drm_map_type_t type;
-#ifdef __FreeBSD__
+ enum drm_map_type type;
vm_paddr_t phys;
-#else
- paddr_t phys;
-#endif
+ int error;
- DRM_LOCK();
- priv = drm_find_file_by_proc(dev, DRM_CURPROC);
- DRM_UNLOCK();
- if (priv == NULL) {
- DRM_ERROR("can't find authenticator\n");
+ /* d_mmap gets called twice, we can only reference file_priv during
+ * the first call. We need to assume that if error is EBADF the
+ * call was succesful and the client is authenticated.
+ */
+ error = devfs_get_cdevpriv((void **)&file_priv);
+ if (error == ENOENT) {
+ DRM_ERROR("Could not find authenticator!\n");
return EINVAL;
}
- if (!priv->authenticated)
- return DRM_ERR(EACCES);
+ if (file_priv && !file_priv->authenticated)
+ return EACCES;
if (dev->dma && offset >= 0 && offset < ptoa(dev->dma->page_count)) {
drm_device_dma_t *dma = dev->dma;
@@ -66,18 +63,13 @@ paddr_t drm_mmap(dev_t kdev, off_t offset, int prot)
unsigned long page = offset >> PAGE_SHIFT;
unsigned long phys = dma->pagelist[page];
-#if defined(__FreeBSD__) && __FreeBSD_version >= 500102
- *paddr = phys;
DRM_SPINUNLOCK(&dev->dma_lock);
+ *paddr = phys;
return 0;
-#else
- return atop(phys);
-#endif
} else {
DRM_SPINUNLOCK(&dev->dma_lock);
return -1;
}
- DRM_SPINUNLOCK(&dev->dma_lock);
}
/* A sequential search of a linked list is
@@ -124,11 +116,7 @@ paddr_t drm_mmap(dev_t kdev, off_t offset, int prot)
return -1; /* This should never happen. */
}
-#if defined(__FreeBSD__) && __FreeBSD_version >= 500102
*paddr = phys;
return 0;
-#else
- return atop(phys);
-#endif
}