diff options
author | mux <mux@FreeBSD.org> | 2003-02-25 03:21:22 +0000 |
---|---|---|
committer | mux <mux@FreeBSD.org> | 2003-02-25 03:21:22 +0000 |
commit | 541937cf7373ff6a61c871266ea041503bb02233 (patch) | |
tree | a4ad6d456fdd984cdf9c6c6abd5e4654a9b7e3e0 /sys/pci | |
parent | f52965fa5d8b4bdc23c2e702d17f5537a81f6d01 (diff) | |
download | FreeBSD-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/pci')
-rw-r--r-- | sys/pci/agp.c | 5 | ||||
-rw-r--r-- | sys/pci/meteor.c | 5 | ||||
-rw-r--r-- | sys/pci/xrpu.c | 5 |
3 files changed, 9 insertions, 6 deletions
diff --git a/sys/pci/agp.c b/sys/pci/agp.c index f821026..be2f7f8 100644 --- a/sys/pci/agp.c +++ b/sys/pci/agp.c @@ -722,14 +722,15 @@ agp_ioctl(dev_t kdev, u_long cmd, caddr_t data, int fflag, struct thread *td) } static int -agp_mmap(dev_t kdev, vm_offset_t offset, int prot) +agp_mmap(dev_t kdev, vm_offset_t offset, vm_offset_t *paddr, int prot) { device_t dev = KDEV2DEV(kdev); struct agp_softc *sc = device_get_softc(dev); if (offset > AGP_GET_APERTURE(dev)) return -1; - return atop(rman_get_start(sc->as_aperture) + offset); + *paddr = rman_get_start(sc->as_aperture) + offset; + return 0; } /* Implementation of the kernel api */ diff --git a/sys/pci/meteor.c b/sys/pci/meteor.c index 340c709..fd1f7f6 100644 --- a/sys/pci/meteor.c +++ b/sys/pci/meteor.c @@ -2107,7 +2107,7 @@ meteor_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) } int -meteor_mmap(dev_t dev, vm_offset_t offset, int nprot) +meteor_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot) { int unit; @@ -2126,6 +2126,7 @@ meteor_mmap(dev_t dev, vm_offset_t offset, int nprot) if(offset >= mtr->alloc_pages * PAGE_SIZE) return -1; - return i386_btop(vtophys(mtr->bigbuf) + offset); + *paddr = vtophys(mtr->bigbuf) + offset; + return 0; } #endif diff --git a/sys/pci/xrpu.c b/sys/pci/xrpu.c index dc21896..379a749 100644 --- a/sys/pci/xrpu.c +++ b/sys/pci/xrpu.c @@ -136,12 +136,13 @@ xrpu_close(dev_t dev, int flag, int mode, struct thread *td) } static int -xrpu_mmap(dev_t dev, vm_offset_t offset, int nprot) +xrpu_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot) { struct softc *sc = dev->si_drv1; if (offset >= 0x1000000) return (-1); - return (i386_btop(sc->physbase + offset)); + *paddr = sc->physbase + offset; + return (0); } static int |