diff options
| author | Robert Noland <rnoland@FreeBSD.org> | 2009-01-10 14:53:47 +0000 |
|---|---|---|
| committer | Robert Noland <rnoland@FreeBSD.org> | 2009-01-10 14:53:47 +0000 |
| commit | 77e9cff98359f248755d6e2c3bd86d9c910cb647 (patch) | |
| tree | cde0c61a47dce8d92e00271ae78a065cf40c8a65 /sys/dev/drm/drm_vm.c | |
| parent | 7ea3329d5f138138384c6b8a5c2feeddf4251dd1 (diff) | |
Notes
Diffstat (limited to 'sys/dev/drm/drm_vm.c')
| -rw-r--r-- | sys/dev/drm/drm_vm.c | 48 |
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 } |
