Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/bi Copied from ../../arch/vax/bi/uba_bi.c,v



details:   https://anonhg.NetBSD.org/src/rev/7d66bafaf9ef
branches:  trunk
changeset: 474594:7d66bafaf9ef
user:      ragge <ragge%NetBSD.org@localhost>
date:      Mon Jul 12 13:43:40 1999 +0000

description:
Copied from ../../arch/vax/bi/uba_bi.c,v

diffstat:

 sys/dev/bi/uba_bi.c |  199 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 199 insertions(+), 0 deletions(-)

diffs (203 lines):

diff -r 275a03e8c143 -r 7d66bafaf9ef sys/dev/bi/uba_bi.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/dev/bi/uba_bi.c       Mon Jul 12 13:43:40 1999 +0000
@@ -0,0 +1,199 @@
+/*     $NetBSD: uba_bi.c,v 1.4 1999/07/12 13:43:40 ragge Exp $ */
+/*
+ * Copyright (c) 1998 Ludd, University of Lule}, Sweden.
+ * 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 at Ludd, University of 
+ *     Lule}, Sweden and its contributors.
+ * 4. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+/*
+ * DWBUA BI-Unibus adapter
+ */
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/buf.h>
+#include <sys/device.h>
+#include <sys/proc.h>
+#include <sys/user.h>
+#include <sys/malloc.h>
+#include <sys/systm.h>
+
+#include <machine/sid.h>
+#include <machine/pte.h>
+#include <machine/pcb.h>
+#include <machine/trap.h>
+#include <machine/scb.h>
+
+#include <vax/bi/bireg.h>
+#include <vax/bi/bivar.h>
+
+#include <vax/uba/ubareg.h>
+#include <vax/uba/ubavar.h>
+
+#include "locators.h"
+
+#define        BUA(uba)        ((struct dwbua_regs *)(uba))
+
+static int uba_bi_match __P((struct device *, struct cfdata *, void *));
+static void uba_bi_attach __P((struct device *, struct device *, void *));
+static void bua_init __P((struct uba_softc *));
+static void bua_purge __P((struct uba_softc *, int));
+
+/* bua_csr */
+#define BUACSR_ERR      0x80000000      /* composite error */
+#define BUACSR_BIF      0x10000000      /* BI failure */
+#define BUACSR_SSYNTO   0x08000000      /* slave sync timeout */
+#define BUACSR_UIE      0x04000000      /* unibus interlock error */
+#define BUACSR_IVMR     0x02000000      /* invalid map register */
+#define BUACSR_BADBDP   0x01000000      /* bad BDP select */
+#define BUACSR_BUAEIE   0x00100000      /* bua error interrupt enable (?) */
+#define BUACSR_UPI      0x00020000      /* unibus power init */
+#define BUACSR_UREGDUMP 0x00010000      /* microdiag register dump */
+#define BUACSR_IERRNO   0x000000ff      /* mask for internal errror number */
+
+/* bua_offset */
+#define BUAOFFSET_MASK  0x00003e00      /* hence max offset = 15872 */
+
+/* bua_dpr */
+#define BUADPR_DPSEL    0x00e00000      /* data path select (?) */
+#define BUADPR_PURGE    0x00000001      /* purge bdp */
+
+/* bua_map -- in particular, those bits that are not in DW780s & DW750s */
+#define BUAMR_IOADR     0x40000000      /* I/O address space */
+#define BUAMR_LAE       0x04000000      /* longword access enable */
+
+static int allocvec;
+
+struct cfattach uba_bi_ca = {
+       sizeof(struct uba_softc), uba_bi_match, uba_bi_attach,
+};
+
+struct dwbua_regs {
+       struct  biiregs bn_biic;   /* interface */
+       int     pad1[396];
+       int     bn_csr;
+       int     bn_vor;         /* Vector offset from SCB */
+       int     bn_fubar;       /* Failed Unibus address register */
+       int     bn_bifar;       /* BI failed address register */
+       int     bn_mdiag[5];    /* microdiag regs for BDP */
+       int     pad2[3];
+       int     bn_dpcsr[6];    /* Data path control and status register */
+       int     pad3[38];
+       struct  pte bn_map[UBAPAGES];   /* Unibus map registers */
+       int     pad4[UBAIOPAGES];
+};
+
+/*
+ * Poke at a supposed DWBUA to see if it is there.
+ */
+static int
+uba_bi_match(parent, cf, aux)
+       struct  device *parent;
+       struct  cfdata *cf;
+       void    *aux;
+{
+       struct bi_attach_args *ba = aux;
+
+       if ((ba->ba_node->biic.bi_dtype != BIDT_DWBUA) &&
+           (ba->ba_node->biic.bi_dtype != BIDT_KLESI))
+               return 0;
+
+       if (cf->cf_loc[BICF_NODE] != BICF_NODE_DEFAULT &&
+           cf->cf_loc[BICF_NODE] != ba->ba_nodenr)
+               return 0;
+
+       return 1;
+}
+
+void
+uba_bi_attach(parent, self, aux)
+       struct device *parent, *self;
+       void *aux;
+{
+       struct  uba_softc *sc = (void *)self;
+       struct  bi_attach_args *ba = aux;
+       volatile int timo;
+
+       if (ba->ba_node->biic.bi_dtype == BIDT_DWBUA)
+               printf(": DWBUA\n");
+       else
+               printf(": KLESI-B\n");
+
+       /*
+        * Fill in bus specific data.
+        */
+       sc->uh_uba = (void *)ba->ba_node;
+       sc->uh_nbdp = NBDPBUA;
+/*     sc->uh_nr is 0; uninteresting here */
+/*     sc->uh_afterscan; not used */
+/*     sc->uh_errchk; not used */
+/*     sc->uh_beforescan */
+       sc->uh_ubapurge = bua_purge;
+       sc->uh_ubainit = bua_init;
+/*     sc->uh_type not used */
+       sc->uh_memsize = UBAPAGES;
+       sc->uh_mr = BUA(sc->uh_uba)->bn_map;
+
+#ifdef notdef
+       /* Can we get separate interrupts? */
+       scb->scb_nexvec[1][ba->ba_nodenr] = &sc->sc_ivec;
+#endif
+       BUA(sc->uh_uba)->bn_biic.bi_csr |= BICSR_ARB_NONE;
+       BUA(sc->uh_uba)->bn_biic.bi_csr |= BICSR_STS | BICSR_INIT;
+       DELAY(1000);
+       timo = 1000;
+       while (BUA(sc->uh_uba)->bn_biic.bi_csr & BICSR_BROKE)
+               if (timo == 0) {
+                       printf("%s: BROKE bit set\n", self->dv_xname);
+                       return;
+               }
+
+       BUA(sc->uh_uba)->bn_biic.bi_intrdes = ba->ba_intcpu;
+       BUA(sc->uh_uba)->bn_biic.bi_csr = 
+           (BUA(sc->uh_uba)->bn_biic.bi_csr&~BICSR_ARB_MASK) | BICSR_ARB_HIGH;
+       BUA(sc->uh_uba)->bn_vor = VAX_NBPG + (VAX_NBPG * allocvec++);
+
+       uba_attach(sc, BUA(sc->uh_uba)->bn_biic.bi_sadr + UBAPAGES * VAX_NBPG);
+}
+
+
+void
+bua_init(sc)
+       struct uba_softc *sc;
+{
+       BUA(sc->uh_uba)->bn_csr |= BUACSR_UPI;
+       DELAY(500000);
+};
+
+void
+bua_purge(sc, bdp)
+       struct uba_softc *sc;
+       int bdp;
+{
+       BUA(sc->uh_uba)->bn_dpcsr[bdp] |= BUADPR_PURGE;
+}



Home | Main Index | Thread Index | Old Index