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/kdb.c,v



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

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

diffstat:

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

diffs (truncated from 318 to 300 lines):

diff -r f60ef9eaba52 -r dae18eb8d484 sys/dev/bi/kdb.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/dev/bi/kdb.c  Mon Jul 12 13:43:11 1999 +0000
@@ -0,0 +1,314 @@
+/*     $NetBSD: kdb.c,v 1.16 1999/07/12 13:43:11 ragge Exp $ */
+/*
+ * Copyright (c) 1996 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.
+ */
+
+/*
+ * KDB50 disk device driver
+ */
+/*
+ * TODO
+ *   Implement node reset routine.
+ *   Nices hardware error handling.
+ */
+
+#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 <vm/vm.h>
+#include <vm/vm_kern.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/bi/kdbreg.h>
+
+#include <vax/mscp/mscp.h>
+#include <vax/mscp/mscpvar.h>
+#include <vax/mscp/mscpreg.h>
+
+#include "locators.h"
+
+#define            b_forw  b_hash.le_next
+/*
+ * Software status, per controller.
+ */
+struct kdb_softc {
+       struct  device sc_dev;          /* Autoconfig info */
+       struct  ivec_dsp sc_ivec;       /* Interrupt vector handler */
+       struct  mscp_pack sc_kdb;       /* Struct for kdb communication */
+       struct  mscp_softc *sc_softc;   /* MSCP info (per mscpvar.h) */
+       struct  kdb_regs *sc_kr;        /* KDB controller registers */
+       struct  mscp *sc_mscp;          /* Keep pointer to active mscp */
+};
+
+int    kdbmatch __P((struct device *, struct cfdata *, void *));
+void   kdbattach __P((struct device *, struct device *, void *));
+void   kdbreset __P((int));
+void   kdbintr __P((int));
+void   kdbctlrdone __P((struct device *, int));
+int    kdbprint __P((void *, const char *));
+void   kdbsaerror __P((struct device *, int));
+int    kdbgo __P((struct device *, struct buf *));
+
+struct cfattach kdb_ca = {
+       sizeof(struct kdb_softc), kdbmatch, kdbattach
+};
+
+extern struct cfdriver kdb_cd;
+
+/*
+ * More driver definitions, for generic MSCP code.
+ */
+struct mscp_ctlr kdb_mscp_ctlr = {
+       kdbctlrdone,
+       kdbgo,
+       kdbsaerror,
+};
+
+int
+kdbprint(aux, name)
+       void    *aux;
+       const char      *name;
+{
+       if (name)
+               printf("%s: mscpbus", name);
+       return UNCONF;
+}
+
+/*
+ * Poke at a supposed KDB to see if it is there.
+ */
+int
+kdbmatch(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_KDB50)
+               return 0;
+
+       if (cf->cf_loc[BICF_NODE] != BICF_NODE_DEFAULT &&
+           cf->cf_loc[BICF_NODE] != ba->ba_nodenr)
+               return 0;
+
+       return 1;
+}
+
+void
+kdbattach(parent, self, aux)
+       struct device *parent, *self;
+       void *aux;
+{
+       struct  kdb_softc *sc = (void *)self;
+       struct  bi_attach_args *ba = aux;
+       struct  mscp_attach_args ma;
+       extern  struct ivec_dsp idsptch;
+       volatile int i = 10000;
+
+       printf("\n");
+       bcopy(&idsptch, &sc->sc_ivec, sizeof(struct ivec_dsp));
+       scb->scb_nexvec[1][ba->ba_nodenr] = &sc->sc_ivec;
+       sc->sc_ivec.hoppaddr = kdbintr;
+       sc->sc_ivec.pushlarg = self->dv_unit;
+       sc->sc_kr = (void *)ba->ba_node;
+
+       bzero(&sc->sc_kdb, sizeof (struct mscp_pack));
+
+       ma.ma_mc = &kdb_mscp_ctlr;
+       ma.ma_type = MSCPBUS_DISK|MSCPBUS_KDB;
+       ma.ma_uuda = (struct mscp_pack *)kvtophys(&sc->sc_kdb);
+       ma.ma_uda = &sc->sc_kdb;
+       ma.ma_ip = &sc->sc_kr->kdb_ip;
+       ma.ma_sa = &sc->sc_kr->kdb_sa;
+       ma.ma_sw = &sc->sc_kr->kdb_sw;
+       ma.ma_softc = &sc->sc_softc;
+       ma.ma_ivec = (int)&scb->scb_nexvec[1][ba->ba_nodenr] - (int)scb;
+       ma.ma_ctlrnr = ba->ba_nodenr;
+       sc->sc_kr->kdb_bi.bi_csr |= BICSR_NRST;
+       while (i--) /* Need delay??? */
+               ;
+       sc->sc_kr->kdb_bi.bi_intrdes = ba->ba_intcpu;
+       sc->sc_kr->kdb_bi.bi_bcicsr |= BCI_STOPEN | BCI_IDENTEN | BCI_UINTEN |
+           BCI_INTEN;
+       sc->sc_kr->kdb_bi.bi_uintrcsr = ma.ma_ivec;
+       config_found(&sc->sc_dev, &ma, kdbprint);
+}
+
+int
+kdbgo(usc, bp)
+       struct device *usc;
+       struct buf *bp;
+{
+       struct kdb_softc *sc = (void *)usc;
+       struct mscp_softc *mi = sc->sc_softc;
+       struct mscp *mp = (void *)bp->b_actb;
+       struct  pcb *pcb;
+       pt_entry_t *pte;
+       int     npf, o, i;
+       unsigned info = 0;
+       caddr_t addr;
+
+       o = (int)bp->b_un.b_addr & VAX_PGOFSET;
+       npf = vax_btoc(bp->b_bcount + o) + 1;
+       addr = bp->b_un.b_addr;
+
+       /*
+        * Get a pointer to the pte pointing out the first virtual address.
+        * Use different ways in kernel and user space.
+        */
+       if ((bp->b_flags & B_PHYS) == 0) {
+               pte = kvtopte(addr);
+       } else {
+               pcb = &bp->b_proc->p_addr->u_pcb;
+               pte = uvtopte(addr, pcb);
+       }
+
+       /*
+        * When we are doing DMA to user space, be sure that all pages
+        * we want to transfer to is mapped. WHY DO WE NEED THIS???
+        * SHOULDN'T THEY ALWAYS BE MAPPED WHEN DOING THIS???
+        */
+       for (i = 0; i < (npf - 1); i++) {
+               if ((pte + i)->pg_pfn == 0) {
+                       int rv;
+                       rv = uvm_fault(&bp->b_proc->p_vmspace->vm_map,
+                           (unsigned)addr + i * VAX_NBPG, 0,
+                           VM_PROT_READ|VM_PROT_WRITE);
+                       if (rv)
+                               panic("KDB DMA to nonexistent page, %d", rv);
+               }
+       }
+       /*
+        * pte's for userspace isn't necessary positioned
+        * in consecutive physical pages. We check if they 
+        * are, otherwise we need to copy the pte's to a
+        * physically contigouos page area.
+        * XXX some copying here may be unneccessary. Subject to fix.
+        */
+       if (bp->b_flags & B_PHYS) {
+               int i = kvtophys(pte);
+               unsigned k;
+
+               if (trunc_page(i) != trunc_page(kvtophys(pte) + npf * 4)) {
+                       info = (unsigned)malloc(2 * VAX_NBPG, M_DEVBUF, M_WAITOK);
+                       k = (info + VAX_PGOFSET) & ~VAX_PGOFSET;
+                       bcopy(pte, (void *)k, VAX_NBPG);
+                       i = kvtophys(k);
+               }
+               mp->mscp_seq.seq_mapbase = i;
+       } else
+               mp->mscp_seq.seq_mapbase = (unsigned)pte;
+       mscp_dgo(mi, KDB_MAP | o, info, bp);
+       return 1;
+}
+
+void
+kdbsaerror(usc, doreset)
+       struct device *usc;
+       int doreset;
+{
+       struct  kdb_softc *sc = (void *)usc;
+       register int code = sc->sc_kr->kdb_sa;
+
+       if ((code & MP_ERR) == 0)
+               return;
+       printf("%s: controller error, sa=0x%x\n", sc->sc_dev.dv_xname, code);
+       /* What to do now??? */
+}
+
+/*
+ * Interrupt routine.  Depending on the state of the controller,
+ * continue initialisation, or acknowledge command and response
+ * interrupts, and process responses.
+ */
+void
+kdbintr(ctlr)
+       int     ctlr;
+{
+       struct kdb_softc *sc = kdb_cd.cd_devs[ctlr];
+
+       if (sc->sc_kr->kdb_sa & MP_ERR) {       /* ctlr fatal error */
+               kdbsaerror(&sc->sc_dev, 1);
+               return;
+       }
+       mscp_intr(sc->sc_softc);
+}
+
+#ifdef notyet
+/*
+ * The KDB50 has been reset.  Reinitialise the controller
+ * and requeue outstanding I/O.
+ */
+void
+kdbreset(ctlr)
+       int ctlr;
+{
+       register struct kdb_softc *sc;
+
+       sc = kdb_cd.cd_devs[ctlr];
+       printf(" kdb%d", ctlr);
+
+
+       /* reset queues and requeue pending transfers */
+       mscp_requeue(sc->sc_softc);
+
+       /*



Home | Main Index | Thread Index | Old Index