Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/dec/qbus Moved to uba.c,v
details: https://anonhg.NetBSD.org/src/rev/a122929902fe
branches: trunk
changeset: 473288:a122929902fe
user: ragge <ragge%NetBSD.org@localhost>
date: Thu May 27 16:04:14 1999 +0000
description:
Moved to uba.c,v
diffstat:
sys/dev/dec/qbus/uba.c | 472 -------------------------------------------------
1 files changed, 0 insertions(+), 472 deletions(-)
diffs (truncated from 476 to 300 lines):
diff -r b1befda09cb8 -r a122929902fe sys/dev/dec/qbus/uba.c
--- a/sys/dev/dec/qbus/uba.c Thu May 27 16:04:13 1999 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,472 +0,0 @@
-/* $NetBSD: uba.c,v 1.45 1999/05/27 03:45:21 ragge Exp $ */
-/*
- * Copyright (c) 1996 Jonathan Stone.
- * Copyright (c) 1994, 1996 Ludd, University of Lule}, Sweden.
- * Copyright (c) 1982, 1986 The Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)uba.c 7.10 (Berkeley) 12/16/90
- * @(#)autoconf.c 7.20 (Berkeley) 5/9/91
- */
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/systm.h>
-#include <sys/map.h>
-#include <sys/buf.h>
-#include <sys/proc.h>
-#include <sys/user.h>
-#include <sys/conf.h>
-#include <sys/dkstat.h>
-#include <sys/kernel.h>
-#include <sys/malloc.h>
-#include <sys/device.h>
-
-#include <vm/vm.h>
-#include <vm/vm_kern.h>
-
-#include <machine/bus.h>
-#include <machine/scb.h>
-#include <machine/cpu.h>
-
-#ifdef __vax__
-#include <machine/pte.h>
-#endif
-
-#include <dev/dec/qbus/ubareg.h>
-#include <dev/dec/qbus/ubavar.h>
-
-static int ubasearch __P((struct device *, struct cfdata *, void *));
-static int ubaprint __P((void *, const char *));
-static void ubainitmaps __P((struct uba_softc *));
-
-extern struct cfdriver uba_cd;
-
-#define spluba spl7
-
-/*
- * Do transfer on device argument. The controller
- * and uba involved are implied by the device.
- * We queue for resource wait in the uba code if necessary.
- * We return 1 if the transfer was started, 0 if it was not.
- *
- * The onq argument must be zero iff the device is not on the
- * queue for this UBA. If onq is set, the device must be at the
- * head of the queue. In any case, if the transfer is started,
- * the device will be off the queue, and if not, it will be on.
- *
- * Drivers that allocate one BDP and hold it for some time should
- * set ud_keepbdp. In this case um_bdp tells which BDP is allocated
- * to the controller, unless it is zero, indicating that the controller
- * does not now have a BDP.
- */
-int
-ubaqueue(uu, bp)
- register struct uba_unit *uu;
- struct buf *bp;
-{
- register struct uba_softc *uh;
- register int s;
-
- uh = (void *)((struct device *)(uu->uu_softc))->dv_parent;
- s = spluba();
- /*
- * Honor exclusive BDP use requests.
- */
- if ((uu->uu_xclu && uh->uh_users > 0) || uh->uh_xclu)
- goto rwait;
- if (uu->uu_keepbdp) {
- /*
- * First get just a BDP (though in fact it comes with
- * one map register too).
- */
- if (uu->uu_bdp == 0) {
- uu->uu_bdp = uballoc(uh, (caddr_t)0, 0,
- UBA_NEEDBDP|UBA_CANTWAIT);
- if (uu->uu_bdp == 0)
- goto rwait;
- }
- /* now share it with this transfer */
- uu->uu_ubinfo = ubasetup(uh, bp,
- uu->uu_bdp|UBA_HAVEBDP|UBA_CANTWAIT);
- } else
- uu->uu_ubinfo = ubasetup(uh, bp, UBA_NEEDBDP|UBA_CANTWAIT);
- if (uu->uu_ubinfo == 0)
- goto rwait;
- uh->uh_users++;
- if (uu->uu_xclu)
- uh->uh_xclu = 1;
-
- splx(s);
- return (1);
-
-rwait:
- SIMPLEQ_INSERT_TAIL(&uh->uh_resq, uu, uu_resq);
- splx(s);
- return (0);
-}
-
-void
-ubadone(uu)
- struct uba_unit *uu;
-{
- struct uba_softc *uh = (void *)((struct device *)
- (uu->uu_softc))->dv_parent;
-
- if (uu->uu_xclu)
- uh->uh_xclu = 0;
- uh->uh_users--;
- if (uu->uu_keepbdp)
- uu->uu_ubinfo &= ~BDPMASK; /* keep BDP for misers */
- ubarelse(uh, &uu->uu_ubinfo);
-}
-
-/*
- * Allocate and setup UBA map registers, and bdp's
- * Flags says whether bdp is needed, whether the caller can't
- * wait (e.g. if the caller is at interrupt level).
- * Return value encodes map register plus page offset,
- * bdp number and number of map registers.
- */
-int
-ubasetup(uh, bp, flags)
- struct uba_softc *uh;
- struct buf *bp;
- int flags;
-{
- int npf;
- int temp;
- int reg, bdp;
- int a, o, ubinfo;
-
- if (uh->uh_nbdp == 0)
- flags &= ~UBA_NEEDBDP;
-
- o = (int)bp->b_un.b_addr & VAX_PGOFSET;
- npf = vax_btoc(bp->b_bcount + o) + 1;
- 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);
- }
- 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);
- splx(a);
- return (0);
- }
- bdp = 0;
- if (flags & UBA_NEEDBDP) {
- while ((bdp = ffs((long)uh->uh_bdpfree)) == 0) {
- if (flags & UBA_CANTWAIT) {
- rmfree(uh->uh_map, (long)npf, (long)reg);
- splx(a);
- return (0);
- }
- uh->uh_bdpwant++;
- sleep((caddr_t)&uh->uh_bdpwant, PSWP);
- }
- uh->uh_bdpfree &= ~(1 << (bdp-1));
- } else if (flags & UBA_HAVEBDP)
- bdp = (flags >> 28) & 0xf;
- splx(a);
- reg--;
- ubinfo = UBAI_INFO(o, reg, npf, bdp);
- temp = (bdp << 21) | UBAMR_MRV;
- if (bdp && (o & 01))
- temp |= UBAMR_BO;
-
- disk_reallymapin(bp, uh->uh_mr, reg, temp | PG_V);
-
- return (ubinfo);
-}
-
-/*
- * Non buffer setup interface... set up a buffer and call ubasetup.
- */
-int
-uballoc(uh, addr, bcnt, flags)
- struct uba_softc *uh;
- caddr_t addr;
- int bcnt, flags;
-{
- struct buf ubabuf;
-
- ubabuf.b_un.b_addr = addr;
- ubabuf.b_flags = B_BUSY;
- ubabuf.b_bcount = bcnt;
- /* that's all the fields ubasetup() needs */
- return (ubasetup(uh, &ubabuf, flags));
-}
-
-/*
- * Release resources on uba uban, and then unblock resource waiters.
- * The map register parameter is by value since we need to block
- * against uba resets on 11/780's.
- */
-void
-ubarelse(uh, amr)
- struct uba_softc *uh;
- int *amr;
-{
- struct uba_unit *uu;
- register int bdp, reg, npf, s;
- int mr;
-
- /*
- * Carefully see if we should release the space, since
- * it may be released asynchronously at uba reset time.
- */
- s = spluba();
- mr = *amr;
- if (mr == 0) {
- /*
- * A ubareset() occurred before we got around
- * to releasing the space... no need to bother.
- */
- splx(s);
- return;
- }
- *amr = 0;
- bdp = UBAI_BDP(mr);
- if (bdp) {
- if (uh->uh_ubapurge)
- (*uh->uh_ubapurge)(uh, bdp);
-
- uh->uh_bdpfree |= 1 << (bdp-1); /* atomic */
- if (uh->uh_bdpwant) {
- uh->uh_bdpwant = 0;
- wakeup((caddr_t)&uh->uh_bdpwant);
- }
- }
- /*
- * Put back the registers in the resource map.
- * The map code must not be reentered,
- * nor can the registers be freed twice.
- * Unblock interrupts once this is done.
- */
- npf = UBAI_NMR(mr);
- reg = UBAI_MR(mr) + 1;
- rmfree(uh->uh_map, (long)npf, (long)reg);
- splx(s);
-
- /*
- * Wakeup sleepers for map registers,
- * and also, if there are processes blocked in dgo(),
- * give them a chance at the UNIBUS.
- */
- if (uh->uh_mrwant) {
Home |
Main Index |
Thread Index |
Old Index