diff --git a/sys/arch/vax/conf/GENERIC b/sys/arch/vax/conf/GENERIC index 82300b8a0143..a74b0d36f20d 100644 --- a/sys/arch/vax/conf/GENERIC +++ b/sys/arch/vax/conf/GENERIC @@ -1,11 +1,11 @@ -# $NetBSD: GENERIC,v 1.63 2000/04/22 16:48:53 ragge Exp $ +# $NetBSD: GENERIC,v 1.64 2000/04/23 16:38:52 matt Exp $ # # GENERIC VAX configuration file; all supported devices. # include "arch/vax/conf/std.vax" -#ident "GENERIC-$Revision: 1.63 $" +#ident "GENERIC-$Revision: 1.64 $" # Here are all different supported CPU types listed. options "VAX8600" @@ -125,7 +125,8 @@ dz0 at vsbus0 csr 0x200a0000 # DC-367 DZ-11 lookalike ctlr dz0 at vsbus0 csr 0x25000000 # VS4000/90 serial line #hdc0 at vsbus0 csr 0x200c0000 # HDC9224 MFM/floppy ctlr ncr0 at vsbus0 csr 0x200c0080 # VS2000/3100 SCSI-ctlr -asc0 at vsbus0 csr 0x200c0080 # VS4000 SCSI-ctlr +asc0 at vsbus0 csr 0x200c0080 # VS4000/60 (or VLC) SCSI-ctlr +asc0 at vsbus0 csr 0x26000080 # VS4000/90 SCSI-ctlr ncr1 at vsbus0 csr 0x200c0180 # VS2000/3100 SCSI-ctlr smg0 at vsbus0 csr 0x200f0000 # Small monochrome display ctlr. #clr0 at vsbus0 csr 0x30000000 # 4- or 8-bitplans color graphics diff --git a/sys/arch/vax/include/vsbus.h b/sys/arch/vax/include/vsbus.h index 75665355f782..088ea1e4793e 100644 --- a/sys/arch/vax/include/vsbus.h +++ b/sys/arch/vax/include/vsbus.h @@ -1,4 +1,4 @@ -/* $NetBSD: vsbus.h,v 1.11 2000/03/04 07:27:49 matt Exp $ */ +/* $NetBSD: vsbus.h,v 1.12 2000/04/23 16:38:53 matt Exp $ */ /* * Copyright (c) 1996 Ludd, University of Lule}, Sweden. * All rights reserved. @@ -65,6 +65,7 @@ struct vsbus_attach_args { #define NI_BASE 0x200e0000 /* LANCE CSRs */ #define NI_IOSIZE (128 * VAX_NBPG) /* IO address size */ +#define KA49_SCSIMAP 0x27000000 /* KA49 SCSI SGMAP */ /* * Small monochrome graphics framebuffer, present on all machines. */ @@ -77,12 +78,13 @@ struct vsbus_softc { u_char *sc_intclr; /* Clear interrupt register */ u_char *sc_intreq; /* Interrupt request register */ u_char sc_mask; /* Interrupts to enable after autoconf */ + vaddr_t sc_vsregs; /* Where the VS_REGS are mapped */ struct vax_bus_dma_tag sc_dmatag; struct vax_sgmap sc_sgmap; }; #ifdef _KERNEL -void vsbus_dma_init __P((struct vsbus_softc *)); +void vsbus_dma_init __P((struct vsbus_softc *, unsigned ptecnt)); u_char vsbus_setmask __P((int)); void vsbus_clrintr __P((int)); void vsbus_copytoproc __P((struct proc *, caddr_t, caddr_t, int)); diff --git a/sys/arch/vax/vsa/asc_vsbus.c b/sys/arch/vax/vsa/asc_vsbus.c index 27456f988563..d5ecca6ea5a1 100644 --- a/sys/arch/vax/vsa/asc_vsbus.c +++ b/sys/arch/vax/vsa/asc_vsbus.c @@ -1,4 +1,4 @@ -/* $NetBSD: asc_vsbus.c,v 1.10 2000/04/18 21:25:31 matt Exp $ */ +/* $NetBSD: asc_vsbus.c,v 1.11 2000/04/23 16:38:54 matt Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -40,7 +40,7 @@ #include /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: asc_vsbus.c,v 1.10 2000/04/18 21:25:31 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: asc_vsbus.c,v 1.11 2000/04/23 16:38:54 matt Exp $"); #include #include @@ -76,6 +76,8 @@ struct asc_vsbus_softc { struct ncr53c9x_softc sc_ncr53c9x; /* Must be first */ bus_space_tag_t sc_bst; /* bus space tag */ bus_space_handle_t sc_bsh; /* bus space handle */ + bus_space_handle_t sc_dirh; /* scsi direction handle */ + bus_space_handle_t sc_adrh; /* scsi address handle */ bus_space_handle_t sc_ncrh; /* ncr bus space handle */ bus_dma_tag_t sc_dmat; /* bus dma tag */ bus_dmamap_t sc_dmamap; @@ -89,8 +91,10 @@ struct asc_vsbus_softc { unsigned long sc_xfers; }; -#define ASC_REG_ADR 0x0000 -#define ASC_REG_DIR 0x000C +#define ASC_REG_KA46_ADR 0x0000 +#define ASC_REG_KA46_DIR 0x000C +#define ASC_REG_KA49_ADR 0x0004 +#define ASC_REG_KA49_DIR 0x0008 #define ASC_REG_NCR 0x0080 #define ASC_REG_END 0x00B0 @@ -147,7 +151,7 @@ asc_vsbus_match( struct device *parent, struct cfdata *cf, void *aux) if (vax_boardtype != VAX_BTYP_46 && vax_boardtype != VAX_BTYP_48 - /* && vax_boardtype != VAX_BTYP_49 */) + && vax_boardtype != VAX_BTYP_49) return 0; ncr_regs = (volatile u_int8_t *) va->va_addr; @@ -203,6 +207,34 @@ asc_vsbus_attach(struct device *parent, struct device *self, void *aux) printf(": failed to map ncr registers: error=%d\n", error); return; } + if (vax_boardtype == VAX_BTYP_46 || vax_boardtype == VAX_BTYP_48) { + error = bus_space_subregion(asc->sc_bst, asc->sc_bsh, + ASC_REG_KA46_ADR, sizeof(u_int32_t), &asc->sc_adrh); + if (error) { + printf(": failed to map adr register: error=%d\n", + error); + return; + } + error = bus_space_subregion(asc->sc_bst, asc->sc_bsh, + ASC_REG_KA46_DIR, sizeof(u_int32_t), &asc->sc_dirh); + if (error) { + printf(": failed to map dir register: error=%d\n", + error); + return; + } + } else { + /* This is a gross and disgusting kludge but it'll + * save a bunch of ugly code. Unlike the VS4000/60, + * the SCSI Address and direction registers are not + * near the SCSI NCR registers and are inside the + * block of general VAXstation registers. So we grab + * them from there and knowing the internals of the + * bus_space implementation, we cast to bus_space_handles. + */ + struct vsbus_softc *vsc = (struct vsbus_softc *) parent; + asc->sc_adrh = (bus_space_handle_t) (vsc->sc_vsregs + ASC_REG_KA49_ADR); + asc->sc_dirh = (bus_space_handle_t) (vsc->sc_vsregs + ASC_REG_KA49_DIR); + } error = bus_dmamap_create(asc->sc_dmat, ASC_MAXXFERSIZE, 1, ASC_MAXXFERSIZE, 0, BUS_DMA_NOWAIT, &asc->sc_dmamap); @@ -398,9 +430,9 @@ asc_vsbus_dma_setup(struct ncr53c9x_softc *sc, caddr_t *addr, size_t *len, asc->sc_flags & ASC_FROMMEMORY ? BUS_DMASYNC_PREWRITE : BUS_DMASYNC_PREREAD); - bus_space_write_4(asc->sc_bst, asc->sc_bsh, ASC_REG_ADR, + bus_space_write_4(asc->sc_bst, asc->sc_adrh, 0, asc->sc_dmamap->dm_segs[0].ds_addr); - bus_space_write_4(asc->sc_bst, asc->sc_bsh, ASC_REG_DIR, + bus_space_write_4(asc->sc_bst, asc->sc_dirh, 0, asc->sc_flags & ASC_FROMMEMORY); asc->sc_flags |= ASC_MAPLOADED; } diff --git a/sys/arch/vax/vsa/if_ze_vsbus.c b/sys/arch/vax/vsa/if_ze_vsbus.c index 68c1136c5c65..338c505c8919 100644 --- a/sys/arch/vax/vsa/if_ze_vsbus.c +++ b/sys/arch/vax/vsa/if_ze_vsbus.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_ze_vsbus.c,v 1.2 2000/01/24 02:40:35 matt Exp $ */ +/* $NetBSD: if_ze_vsbus.c,v 1.3 2000/04/23 16:38:54 matt Exp $ */ /* * Copyright (c) 1999 Ludd, University of Lule}, Sweden. All rights reserved. * @@ -104,6 +104,7 @@ zeattach(parent, self, aux) { struct ze_softc *sc = (struct ze_softc *)self; struct vsbus_attach_args *va = aux; + extern struct vax_bus_dma_tag vax_bus_dma_tag; int *ea, i; /* @@ -111,7 +112,7 @@ zeattach(parent, self, aux) */ sc->sc_ioh = vax_map_physmem(SGECADDR, 1); sc->sc_iot = 0; /* :-) */ - sc->sc_dmat = va->va_dmat; + sc->sc_dmat = &vax_bus_dma_tag; sc->sc_intvec = SGECVEC; scb_vecalloc(va->va_cvec, (void (*)(void *)) sgec_intr, sc, SCB_ISTACK); diff --git a/sys/arch/vax/vsa/vsbus.c b/sys/arch/vax/vsa/vsbus.c index dd203cfb1001..238349909c9a 100644 --- a/sys/arch/vax/vsa/vsbus.c +++ b/sys/arch/vax/vsa/vsbus.c @@ -1,4 +1,4 @@ -/* $NetBSD: vsbus.c,v 1.23 2000/03/08 23:50:51 matt Exp $ */ +/* $NetBSD: vsbus.c,v 1.24 2000/04/23 16:38:54 matt Exp $ */ /* * Copyright (c) 1996, 1999 Ludd, University of Lule}, Sweden. * All rights reserved. @@ -132,7 +132,6 @@ vsbus_attach(parent, self, aux) void *aux; { struct vsbus_softc *sc = (void *)self; - vaddr_t temp; printf("\n"); @@ -141,28 +140,29 @@ vsbus_attach(parent, self, aux) switch (vax_boardtype) { #if VAX49 case VAX_BTYP_49: - temp = vax_map_physmem(0x25c00000, 1); - sc->sc_intreq = (char *)temp + 12; - sc->sc_intclr = (char *)temp + 12; - sc->sc_intmsk = (char *)temp + 8; -#if 0 - vsbus_dma_init(sc); /* not yet */ -#endif + sc->sc_vsregs = vax_map_physmem(0x25c00000, 1); + sc->sc_intreq = (char *)sc->sc_vsregs + 12; + sc->sc_intclr = (char *)sc->sc_vsregs + 12; + sc->sc_intmsk = (char *)sc->sc_vsregs + 8; + vsbus_dma_init(sc, 8192); break; #endif #if VAX46 || VAX48 case VAX_BTYP_48: case VAX_BTYP_46: - vsbus_dma_init(sc); - /* FALL THROUGH */ + sc->sc_vsregs = vax_map_physmem(VS_REGS, 1); + sc->sc_intreq = (char *)sc->sc_vsregs + 15; + sc->sc_intclr = (char *)sc->sc_vsregs + 15; + sc->sc_intmsk = (char *)sc->sc_vsregs + 12; + vsbus_dma_init(sc, 32768); #endif default: - temp = vax_map_physmem(VS_REGS, 1); - sc->sc_intreq = (char *)temp + 15; - sc->sc_intclr = (char *)temp + 15; - sc->sc_intmsk = (char *)temp + 12; + sc->sc_vsregs = vax_map_physmem(VS_REGS, 1); + sc->sc_intreq = (char *)sc->sc_vsregs + 15; + sc->sc_intclr = (char *)sc->sc_vsregs + 15; + sc->sc_intmsk = (char *)sc->sc_vsregs + 12; break; } diff --git a/sys/arch/vax/vsa/vsbus_dma.c b/sys/arch/vax/vsa/vsbus_dma.c index 4cf1e5c0047b..8146140b7f70 100644 --- a/sys/arch/vax/vsa/vsbus_dma.c +++ b/sys/arch/vax/vsa/vsbus_dma.c @@ -1,4 +1,4 @@ -/* $NetBSD: vsbus_dma.c,v 1.3 2000/03/07 00:07:16 matt Exp $ */ +/* $NetBSD: vsbus_dma.c,v 1.4 2000/04/23 16:38:54 matt Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -48,6 +48,7 @@ #define _VAX_BUS_DMA_PRIVATE #include #include +#include #include #include @@ -74,14 +75,15 @@ static void vsbus_bus_dmamap_sync __P((bus_dma_tag_t, bus_dmamap_t, bus_addr_t, bus_size_t, int)); void -vsbus_dma_init(sc) +vsbus_dma_init(sc, ptecnt) struct vsbus_softc *sc; + unsigned ptecnt; { bus_dma_tag_t t; bus_dma_segment_t segs[1]; struct pte *pte; int nsegs, error; - vaddr_t vs_regs; + unsigned mapsize = ptecnt * sizeof(struct pte); /* * Initialize the DMA tag used for sgmap-mapped DMA. @@ -89,7 +91,7 @@ vsbus_dma_init(sc) t = &sc->sc_dmatag; t->_cookie = sc; t->_wbase = 0; - t->_wsize = 16*1024*1024; + t->_wsize = ptecnt * VAX_NBPG; t->_boundary = 0; t->_sgmap = &sc->sc_sgmap; t->_dmamap_create = vsbus_bus_dmamap_create_sgmap; @@ -107,28 +109,34 @@ vsbus_dma_init(sc) t->_dmamem_unmap = _bus_dmamem_unmap; t->_dmamem_mmap = _bus_dmamem_mmap; - /* - * Allocate and map the VS4000 scatter gather map. - */ - error = bus_dmamem_alloc(t, 0x20000, 0x20000, 0x20000, - segs, 1, &nsegs, BUS_DMA_NOWAIT); - if (error) { - panic("vsbus_dma_init: error allocating memory for hw sgmap" - ": error=%d", error); - } + if (vax_boardtype == VAX_BTYP_46 || vax_boardtype == VAX_BTYP_48) { + /* + * Allocate and map the VS4000 scatter gather map. + */ + error = bus_dmamem_alloc(t, mapsize, mapsize, mapsize, + segs, 1, &nsegs, BUS_DMA_NOWAIT); + if (error) { + panic("vsbus_dma_init: error allocating memory for " + "hw sgmap: error=%d", error); + } - error = bus_dmamem_map(t, segs, nsegs, 0x20000, - (caddr_t *) &pte, BUS_DMA_NOWAIT|BUS_DMA_COHERENT); - if (error) { - panic("vsbus_dma_init: error mapping memory for hw sgmap" - ": error=%d", error); + error = bus_dmamem_map(t, segs, nsegs, mapsize, + (caddr_t *) &pte, BUS_DMA_NOWAIT|BUS_DMA_COHERENT); + if (error) { + panic("vsbus_dma_init: error mapping memory for " + "hw sgmap: error=%d", error); + } + memset(pte, 0, mapsize); + *(int *) (sc->sc_vsregs + 8) = segs->ds_addr; /* set MAP BASE 0x2008008 */ + } else { + pte = (struct pte *) vax_map_physmem(KA49_SCSIMAP, mapsize / VAX_NBPG); + for (; ptecnt > 0; ) { + ((u_int32_t *) pte)[--ptecnt] = 0; + } + segs->ds_addr = KA49_SCSIMAP; } - printf("%s: 32K entry DMA SGMAP at PA 0x%lx (VA %p)\n", - sc->sc_dev.dv_xname, segs->ds_addr, pte); - memset(pte, 0, 0x20000); - vs_regs = vax_map_physmem(VS_REGS, 1); - *(int *) (vs_regs + 8) = segs->ds_addr; /* set MAP BASE 0x2008008 */ - vax_unmap_physmem(vs_regs, 1); + printf("%s: %uK entry DMA SGMAP at PA 0x%lx (VA %p)\n", + sc->sc_dev.dv_xname, ptecnt / 1024, segs->ds_addr, pte); /* * Initialize the SGMAP.