summaryrefslogtreecommitdiffstats
path: root/sys/i386
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/i386
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/i386')
-rw-r--r--sys/i386/i386/elan-mmcr.c5
-rw-r--r--sys/i386/i386/mem.c9
-rw-r--r--sys/i386/i386/pmap.c7
-rw-r--r--sys/i386/isa/pcvt/pcvt_drv.c5
-rw-r--r--sys/i386/isa/spigot.c5
-rw-r--r--sys/i386/isa/vesa.c13
6 files changed, 20 insertions, 24 deletions
diff --git a/sys/i386/i386/elan-mmcr.c b/sys/i386/i386/elan-mmcr.c
index c36a154..cf324d3 100644
--- a/sys/i386/i386/elan-mmcr.c
+++ b/sys/i386/i386/elan-mmcr.c
@@ -309,14 +309,15 @@ elan_write(dev_t dev, struct uio *uio, int ioflag)
}
static int
-elan_mmap(dev_t dev, vm_offset_t offset, int nprot)
+elan_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot)
{
if (minor(dev) != ELAN_MMCR)
return (EOPNOTSUPP);
if (offset >= 0x1000)
return (-1);
- return (i386_btop(0xfffef000));
+ *paddr = 0xfffef000;
+ return (0);
}
static int
diff --git a/sys/i386/i386/mem.c b/sys/i386/i386/mem.c
index 41fa636..a045d96 100644
--- a/sys/i386/i386/mem.c
+++ b/sys/i386/i386/mem.c
@@ -215,22 +215,25 @@ mmrw(dev_t dev, struct uio *uio, int flags)
* instead of going through read/write *
\*******************************************************/
static int
-memmmap(dev_t dev, vm_offset_t offset, int prot)
+memmmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int prot)
{
switch (minor(dev))
{
/* minor device 0 is physical memory */
case 0:
- return (i386_btop(offset));
+ *paddr = offset;
+ break;
/* minor device 1 is kernel memory */
case 1:
- return (i386_btop(vtophys(offset)));
+ *paddr = vtophys(offset);
+ break;
default:
return (-1);
}
+ return (0);
}
/*
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 8d6df39..ca469aa 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -3124,13 +3124,6 @@ pmap_page_protect(vm_page_t m, vm_prot_t prot)
}
}
-vm_offset_t
-pmap_phys_address(ppn)
- int ppn;
-{
- return (i386_ptob(ppn));
-}
-
/*
* pmap_ts_referenced:
*
diff --git a/sys/i386/isa/pcvt/pcvt_drv.c b/sys/i386/isa/pcvt/pcvt_drv.c
index 45b74b3..72a23e0 100644
--- a/sys/i386/isa/pcvt/pcvt_drv.c
+++ b/sys/i386/isa/pcvt/pcvt_drv.c
@@ -420,11 +420,12 @@ pcvt_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td)
* driver mmap
*---------------------------------------------------------------------------*/
static int
-pcvt_mmap(dev_t dev, vm_offset_t offset, int nprot)
+pcvt_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot)
{
if (offset > 0x20000 - PAGE_SIZE)
return -1;
- return i386_btop((0xa0000 + offset));
+ *paddr = 0xa0000 + offset;
+ return 0;
}
/*---------------------------------------------------------------------------*
diff --git a/sys/i386/isa/spigot.c b/sys/i386/isa/spigot.c
index bc6df62..79ad930 100644
--- a/sys/i386/isa/spigot.c
+++ b/sys/i386/isa/spigot.c
@@ -273,7 +273,7 @@ struct spigot_softc *ss = (struct spigot_softc *)&spigot_softc[unit];
}
static int
-spigot_mmap(dev_t dev, vm_offset_t offset, int nprot)
+spigot_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot)
{
struct spigot_softc *ss = (struct spigot_softc *)&spigot_softc[0];
@@ -285,5 +285,6 @@ struct spigot_softc *ss = (struct spigot_softc *)&spigot_softc[0];
if(nprot & PROT_EXEC)
return -1;
- return i386_btop(ss->maddr);
+ *paddr = ss->maddr;
+ return 0;
}
diff --git a/sys/i386/isa/vesa.c b/sys/i386/isa/vesa.c
index 5284cec..3c3f604 100644
--- a/sys/i386/isa/vesa.c
+++ b/sys/i386/isa/vesa.c
@@ -1278,7 +1278,8 @@ vesa_blank_display(video_adapter_t *adp, int mode)
}
static int
-vesa_mmap(video_adapter_t *adp, vm_offset_t offset, int prot)
+vesa_mmap(video_adapter_t *adp, vm_offset_t offset, vm_offset_t *paddr,
+ int prot)
{
#if VESA_DEBUG > 0
printf("vesa_mmap(): window:0x%x, buffer:0x%x, offset:0x%x\n",
@@ -1290,14 +1291,10 @@ vesa_mmap(video_adapter_t *adp, vm_offset_t offset, int prot)
/* XXX: is this correct? */
if (offset > adp->va_window_size - PAGE_SIZE)
return -1;
-#ifdef __i386__
- return i386_btop(adp->va_info.vi_buffer + offset);
-#endif
-#ifdef __alpha__ /* XXX */
- return alpha_btop(adp->va_info.vi_buffer + offset);
-#endif
+ *paddr = adp->va_info.vi_buffer + offset;
+ return 0;
} else {
- return (*prevvidsw->mmap)(adp, offset, prot);
+ return (*prevvidsw->mmap)(adp, offset, paddr, prot);
}
}
OpenPOWER on IntegriCloud