summaryrefslogtreecommitdiffstats
path: root/sys/dev/drm
diff options
context:
space:
mode:
authormux <mux@FreeBSD.org>2003-02-25 03:21:22 +0000
committermux <mux@FreeBSD.org>2003-02-25 03:21:22 +0000
commit541937cf7373ff6a61c871266ea041503bb02233 (patch)
treea4ad6d456fdd984cdf9c6c6abd5e4654a9b7e3e0 /sys/dev/drm
parentf52965fa5d8b4bdc23c2e702d17f5537a81f6d01 (diff)
downloadFreeBSD-src-541937cf7373ff6a61c871266ea041503bb02233.zip
FreeBSD-src-541937cf7373ff6a61c871266ea041503bb02233.tar.gz
Cleanup of the d_mmap_t interface.
- Get rid of the useless atop() / pmap_phys_address() detour. The device mmap handlers must now give back the physical address without atop()'ing it. - Don't borrow the physical address of the mapping in the returned int. Now we properly pass a vm_offset_t * and expect it to be filled by the mmap handler when the mapping was successful. The mmap handler must now return 0 when successful, any other value is considered as an error. Previously, returning -1 was the only way to fail. This change thus accidentally fixes some devices which were bogusly returning errno constants which would have been considered as addresses by the device pager. - Garbage collect the poorly named pmap_phys_address() now that it's no longer used. - Convert all the d_mmap_t consumers to the new API. I'm still not sure wheter we need a __FreeBSD_version bump for this, since and we didn't guarantee API/ABI stability until 5.1-RELEASE. Discussed with: alc, phk, jake Reviewed by: peter Compile-tested on: LINT (i386), GENERIC (alpha and sparc64) Runtime-tested on: i386
Diffstat (limited to 'sys/dev/drm')
-rw-r--r--sys/dev/drm/drm_vm.h16
1 files changed, 10 insertions, 6 deletions
diff --git a/sys/dev/drm/drm_vm.h b/sys/dev/drm/drm_vm.h
index 5fd9a39..705ca48 100644
--- a/sys/dev/drm/drm_vm.h
+++ b/sys/dev/drm/drm_vm.h
@@ -5,7 +5,8 @@
#include <vm/vm.h>
#include <vm/pmap.h>
-static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot)
+static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, vm_offset_t *paddr,
+ int prot)
{
drm_device_t *dev = kdev->si_drv1;
drm_device_dma_t *dma = dev->dma;
@@ -19,10 +20,11 @@ static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot)
physical = dma->pagelist[page];
DRM_DEBUG("0x%08x (page %lu) => 0x%08lx\n", offset, page, physical);
- return atop(physical);
+ *paddr = physical;
+ return 0;
}
-int DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot)
+int DRM(mmap)(dev_t kdev, vm_offset_t offset, vm_offset_t *paddr, int prot)
{
drm_device_t *dev = kdev->si_drv1;
drm_map_t *map = NULL;
@@ -43,7 +45,7 @@ int DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot)
if (dev->dma
&& offset >= 0
&& offset < ptoa(dev->dma->page_count))
- return DRM(dma_mmap)(kdev, offset, prot);
+ return DRM(dma_mmap)(kdev, offset, paddr, prot);
/* A sequential search of a linked list is
fine here because: 1) there will only be
@@ -72,9 +74,11 @@ int DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot)
case _DRM_FRAME_BUFFER:
case _DRM_REGISTERS:
case _DRM_AGP:
- return atop(offset);
+ *paddr = offset;
+ return 0;
case _DRM_SHM:
- return atop(vtophys(offset));
+ *paddr = vtophys(offset);
+ return 0;
default:
return -1; /* This should never happen. */
}
OpenPOWER on IntegriCloud