diff options
Diffstat (limited to 'sys/dev/drm/drm_vm.h')
-rw-r--r-- | sys/dev/drm/drm_vm.h | 54 |
1 files changed, 40 insertions, 14 deletions
diff --git a/sys/dev/drm/drm_vm.h b/sys/dev/drm/drm_vm.h index 705ca48..a2ea15d 100644 --- a/sys/dev/drm/drm_vm.h +++ b/sys/dev/drm/drm_vm.h @@ -2,13 +2,16 @@ * $FreeBSD$ */ -#include <vm/vm.h> -#include <vm/pmap.h> - -static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, vm_offset_t *paddr, +#if defined(__FreeBSD__) && __FreeBSD_version >= 500102 +static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, vm_offset_t *paddr, int prot) +#elif defined(__FreeBSD__) +static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot) +#elif defined(__NetBSD__) +static paddr_t DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot) +#endif { - drm_device_t *dev = kdev->si_drv1; + DRM_DEVICE; drm_device_dma_t *dma = dev->dma; unsigned long physical; unsigned long page; @@ -19,33 +22,47 @@ static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, vm_offset_t *paddr, page = offset >> PAGE_SHIFT; physical = dma->pagelist[page]; - DRM_DEBUG("0x%08x (page %lu) => 0x%08lx\n", offset, page, physical); + DRM_DEBUG("0x%08lx (page %lu) => 0x%08lx\n", (long)offset, page, physical); +#if defined(__FreeBSD__) && __FreeBSD_version >= 500102 *paddr = physical; return 0; +#else + return atop(physical); +#endif } -int DRM(mmap)(dev_t kdev, vm_offset_t offset, vm_offset_t *paddr, int prot) +#if defined(__FreeBSD__) && __FreeBSD_version >= 500102 +int DRM(mmap)(dev_t kdev, vm_offset_t offset, vm_offset_t *paddr, + int prot) +#elif defined(__FreeBSD__) +int DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot) +#elif defined(__NetBSD__) +paddr_t DRM(mmap)(dev_t kdev, off_t offset, int prot) +#endif { - drm_device_t *dev = kdev->si_drv1; - drm_map_t *map = NULL; + DRM_DEVICE; + drm_local_map_t *map = NULL; drm_map_list_entry_t *listentry=NULL; - /*drm_file_t *priv;*/ + drm_file_t *priv; /* DRM_DEBUG("offset = 0x%x\n", offset);*/ - /*XXX Fixme */ - /*priv = DRM(find_file_by_proc)(dev, p); + priv = DRM(find_file_by_proc)(dev, DRM_CURPROC); if (!priv) { DRM_DEBUG("can't find authenticator\n"); return EINVAL; } - if (!priv->authenticated) return DRM_OS_ERR(EACCES);*/ + if (!priv->authenticated) return DRM_ERR(EACCES); if (dev->dma && offset >= 0 && offset < ptoa(dev->dma->page_count)) +#if defined(__FreeBSD__) && __FreeBSD_version >= 500102 return DRM(dma_mmap)(kdev, offset, paddr, prot); +#else + return DRM(dma_mmap)(kdev, offset, prot); +#endif /* A sequential search of a linked list is fine here because: 1) there will only be @@ -65,7 +82,7 @@ int DRM(mmap)(dev_t kdev, vm_offset_t offset, vm_offset_t *paddr, int prot) DRM_DEBUG("can't find map\n"); return -1; } - if (((map->flags&_DRM_RESTRICTED) && suser(DRM_OS_CURPROC))) { + if (((map->flags&_DRM_RESTRICTED) && DRM_SUSER(DRM_CURPROC))) { DRM_DEBUG("restricted map\n"); return -1; } @@ -74,11 +91,20 @@ int DRM(mmap)(dev_t kdev, vm_offset_t offset, vm_offset_t *paddr, int prot) case _DRM_FRAME_BUFFER: case _DRM_REGISTERS: case _DRM_AGP: +#if defined(__FreeBSD__) && __FreeBSD_version >= 500102 *paddr = offset; return 0; +#else + return atop(offset); +#endif + case _DRM_SCATTER_GATHER: case _DRM_SHM: +#if defined(__FreeBSD__) && __FreeBSD_version >= 500102 *paddr = vtophys(offset); return 0; +#else + return atop(vtophys(offset)); +#endif default: return -1; /* This should never happen. */ } |