summaryrefslogtreecommitdiff
path: root/sys/arch/vax/uba
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/vax/uba')
-rw-r--r--sys/arch/vax/uba/uba.c42
-rw-r--r--sys/arch/vax/uba/ubavar.h6
2 files changed, 29 insertions, 19 deletions
diff --git a/sys/arch/vax/uba/uba.c b/sys/arch/vax/uba/uba.c
index 491a5f3b58e..a26fca24888 100644
--- a/sys/arch/vax/uba/uba.c
+++ b/sys/arch/vax/uba/uba.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uba.c,v 1.13 2002/01/10 00:11:14 nordin Exp $ */
+/* $OpenBSD: uba.c,v 1.14 2002/01/18 02:09:27 miod Exp $ */
/* $NetBSD: uba.c,v 1.43 2000/01/24 02:40:36 matt Exp $ */
/*
* Copyright (c) 1996 Jonathan Stone.
@@ -42,7 +42,7 @@
#include <sys/types.h>
#include <sys/time.h>
#include <sys/systm.h>
-#include <sys/map.h>
+#include <sys/extent.h>
#include <sys/buf.h>
#include <sys/proc.h>
#include <sys/user.h>
@@ -579,6 +579,7 @@ ubasetup(uh, bp, flags)
int temp;
int reg, bdp;
int a, o, ubinfo;
+ vaddr_t addr;
if (uh->uh_nbdp == 0)
flags &= ~UBA_NEEDBDP;
@@ -588,20 +589,24 @@ ubasetup(uh, bp, flags)
if (npf > UBA_MAXNMR)
panic("uba xfer too big");
a = spluba();
- while ((reg = rmalloc(uh->uh_map, (long)npf)) == 0) {
- if (flags & UBA_CANTWAIT) {
- splx(a);
- return (0);
- }
- uh->uh_mrwant++;
- sleep((caddr_t)&uh->uh_mrwant, PSWP);
+
+ error = extent_alloc(uh->uh_ext, npf * VAX_NBPG, VAX_NBPG, 0,
+ EX_NOBOUNDARY, (flags & UBA_CANTWAIT) ? EX_NOWAIT : EX_WAITOK,
+ (u_long *)addr);
+
+ if (error != 0) {
+ splx(a);
+ return (0);
}
+
+ reg = vax_btoc(addr);
if ((flags & UBA_NEED16) && reg + npf > 128) {
/*
* Could hang around and try again (if we can ever succeed).
* Won't help any current device...
*/
- rmfree(uh->uh_map, (long)npf, (long)reg);
+ extent_free(uh->uh_ext, (u_long)addr, npf * VAX_NBPG,
+ EX_NOWAIT);
splx(a);
return (0);
}
@@ -609,7 +614,8 @@ ubasetup(uh, bp, flags)
if (flags & UBA_NEEDBDP) {
while ((bdp = ffs((long)uh->uh_bdpfree)) == 0) {
if (flags & UBA_CANTWAIT) {
- rmfree(uh->uh_map, (long)npf, (long)reg);
+ extent_free(uh->uh_ext, (u_long)addr,
+ npf * VAX_NBPG, EX_NOWAIT);
splx(a);
return (0);
}
@@ -697,7 +703,7 @@ ubarelse(uh, amr)
*/
npf = UBAI_NMR(mr);
reg = UBAI_MR(mr) + 1;
- rmfree(uh->uh_map, (long)npf, (long)reg);
+ extent_free(uh->uh_ext, reg * VAX_NBPG, npf * VAX_NBPG, EX_NOWAIT);
splx(s);
/*
@@ -720,10 +726,13 @@ void
ubainitmaps(uhp)
register struct uba_softc *uhp;
{
+ int error;
if (uhp->uh_memsize > UBA_MAXMR)
uhp->uh_memsize = UBA_MAXMR;
- rminit(uhp->uh_map, (long)uhp->uh_memsize, (long)1, "uba", UAMSIZ);
+ uhp->uh_ext = extent_create("uba", 0, uhp->uh_memsize * VAX_NBPG,
+ M_DEVBUF, uhp->uh_extspace, EXTENT_FIXED_STORAGE_SIZE(UAMSIZ),
+ EX_NOWAIT);
uhp->uh_bdpfree = (1 << uhp->uh_nbdp) - 1;
}
@@ -812,11 +821,10 @@ uba_attach(sc, iopagephys)
* Initialize the UNIBUS, by freeing the map
* registers and the buffered data path registers
*/
- sc->uh_map = (struct map *)malloc((u_long)
- (UAMSIZ * sizeof(struct map)), M_DEVBUF, M_NOWAIT);
- if (sc->uh_map == NULL)
+ sc->uh_extspace = (char *)malloc(EXTENT_FIXED_STORAGE_SIZE(UAMSIZ),
+ M_DEVBUF, M_NOWAIT);
+ if (sc->uh_extspace == NULL)
panic("uba_attach");
- bzero((caddr_t)sc->uh_map, (unsigned)(UAMSIZ * sizeof (struct map)));
ubainitmaps(sc);
/*
diff --git a/sys/arch/vax/uba/ubavar.h b/sys/arch/vax/uba/ubavar.h
index a6c78d66cb4..f479dd3ec65 100644
--- a/sys/arch/vax/uba/ubavar.h
+++ b/sys/arch/vax/uba/ubavar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ubavar.h,v 1.9 2001/08/12 12:03:03 heko Exp $ */
+/* $OpenBSD: ubavar.h,v 1.10 2002/01/18 02:09:27 miod Exp $ */
/* $NetBSD: ubavar.h,v 1.21 1999/01/19 21:04:48 ragge Exp $ */
/*
@@ -70,6 +70,7 @@
* the unibus driver in resource wait (mrwant, bdpwant); these
* wait states are also recorded here.
*/
+struct extent;
struct uba_softc {
struct device uh_dev; /* Device struct, autoconfig */
SIMPLEQ_HEAD(, uba_unit) uh_resq; /* resource wait chain */
@@ -91,7 +92,8 @@ struct uba_softc {
short uh_users; /* transient bdp use count */
short uh_xclu; /* an rk07 is using this uba! */
int uh_lastmem; /* limit of any unibus memory */
- struct map *uh_map; /* register free map */
+ struct extent *uh_ext; /* register free map */
+ char *uh_extspace; /* storage space for uh_ext */
int (*uh_errchk) __P((struct uba_softc *));
void (*uh_beforescan) __P((struct uba_softc *));
void (*uh_afterscan) __P((struct uba_softc *));