- zs: switch to MI driver
- clock, le, pcc, wdsc, zs: convert to new autoconfig scheme - vme: add vme support Contributed by: Jason R. Thorpe <thorpej@og.org>
This commit is contained in:
parent
34c1e309b6
commit
d80422cd46
133
sys/arch/mvme68k/dev/clock_pcc.c
Normal file
133
sys/arch/mvme68k/dev/clock_pcc.c
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
/* $NetBSD: clock_pcc.c,v 1.1 1996/04/26 18:59:58 chuck Exp $ */
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 1996 The NetBSD Foundation, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to The NetBSD Foundation
|
||||||
|
* by Jason R. Thorpe.
|
||||||
|
*
|
||||||
|
* 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 NetBSD
|
||||||
|
* Foundation, Inc. and its contributors.
|
||||||
|
* 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Glue for the Peripheral Channel Controller timers and the
|
||||||
|
* Mostek clock chip found on the MVME-147.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/kernel.h>
|
||||||
|
#include <sys/systm.h>
|
||||||
|
#include <sys/device.h>
|
||||||
|
|
||||||
|
#include <machine/psl.h>
|
||||||
|
#include <machine/cpu.h>
|
||||||
|
|
||||||
|
#include <mvme68k/mvme68k/clockreg.h>
|
||||||
|
#include <mvme68k/mvme68k/clockvar.h>
|
||||||
|
|
||||||
|
#include <mvme68k/dev/pccreg.h>
|
||||||
|
#include <mvme68k/dev/pccvar.h>
|
||||||
|
|
||||||
|
int clock_pcc_match __P((struct device *, void *, void *));
|
||||||
|
void clock_pcc_attach __P((struct device *, struct device *, void *));
|
||||||
|
int clock_pcc_intr __P((void *));
|
||||||
|
void clock_pcc_initclocks __P((void));
|
||||||
|
|
||||||
|
u_char clock_pcc_lvl;
|
||||||
|
|
||||||
|
struct cfattach clock_pcc_ca = {
|
||||||
|
sizeof(struct device), clock_pcc_match, clock_pcc_attach
|
||||||
|
};
|
||||||
|
|
||||||
|
int
|
||||||
|
clock_pcc_match(parent, match, aux)
|
||||||
|
struct device *parent;
|
||||||
|
void *match, *aux;
|
||||||
|
{
|
||||||
|
struct cfdata *cf = match;
|
||||||
|
struct pcc_attach_args *pa = aux;
|
||||||
|
static int clock_pcc_matched;
|
||||||
|
|
||||||
|
/* Only one clock, please. */
|
||||||
|
if (clock_pcc_matched)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
if (strcmp(pa->pa_name, clock_cd.cd_name))
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
clock_pcc_matched = 1;
|
||||||
|
pa->pa_ipl = cf->pcccf_ipl;
|
||||||
|
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
clock_pcc_attach(parent, self, aux)
|
||||||
|
struct device *parent, *self;
|
||||||
|
void *aux;
|
||||||
|
{
|
||||||
|
struct pcc_attach_args *pa = aux;
|
||||||
|
caddr_t nvram, clockregs;
|
||||||
|
|
||||||
|
if (pa->pa_ipl != CLOCK_LEVEL)
|
||||||
|
panic("clock_pcc_attach: wrong interrupt level");
|
||||||
|
|
||||||
|
nvram = PCC_VADDR(pa->pa_offset);
|
||||||
|
clockregs = PCC_VADDR(pa->pa_offset + PCC_RTC_OFF);
|
||||||
|
|
||||||
|
/* Do common portions of clock config. */
|
||||||
|
clock_config(self, clockregs, nvram, MK48T02_SIZE,
|
||||||
|
clock_pcc_initclocks);
|
||||||
|
|
||||||
|
/* Attach the interrupt handler. */
|
||||||
|
pccintr_establish(PCCV_TIMER1, clock_pcc_intr, pa->pa_ipl, NULL);
|
||||||
|
/* XXX timer2 */
|
||||||
|
clock_pcc_lvl = pa->pa_ipl | PCC_IENABLE | PCC_TIMERACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
clock_pcc_initclocks()
|
||||||
|
{
|
||||||
|
|
||||||
|
sys_pcc->t1_pload = PCC_TIMER100HZ;
|
||||||
|
sys_pcc->t1_cr = PCC_TIMERCLEAR;
|
||||||
|
sys_pcc->t1_cr = PCC_TIMERSTART;
|
||||||
|
sys_pcc->t1_int = clock_pcc_lvl;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
clock_pcc_intr(frame)
|
||||||
|
void *frame;
|
||||||
|
{
|
||||||
|
|
||||||
|
sys_pcc->t1_int = clock_pcc_lvl;
|
||||||
|
hardclock(frame);
|
||||||
|
return (1);
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: if_le.c,v 1.6 1996/04/22 02:28:34 christos Exp $ */
|
/* $NetBSD: if_le.c,v 1.7 1996/04/26 19:00:00 chuck Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1995 Charles M. Hannum. All rights reserved.
|
* Copyright (c) 1995 Charles M. Hannum. All rights reserved.
|
||||||
@ -60,10 +60,12 @@
|
|||||||
#include <machine/cpu.h>
|
#include <machine/cpu.h>
|
||||||
#include <machine/pmap.h>
|
#include <machine/pmap.h>
|
||||||
|
|
||||||
#include <mvme68k/dev/iio.h>
|
|
||||||
#include <mvme68k/dev/pccreg.h>
|
#include <mvme68k/dev/pccreg.h>
|
||||||
|
#include <mvme68k/dev/pccvar.h>
|
||||||
|
|
||||||
#include <mvme68k/dev/if_lereg.h>
|
#include <mvme68k/dev/if_lereg.h>
|
||||||
#include <mvme68k/dev/if_levar.h>
|
#include <mvme68k/dev/if_levar.h>
|
||||||
|
|
||||||
#include <dev/ic/am7990reg.h>
|
#include <dev/ic/am7990reg.h>
|
||||||
#define LE_NEED_BUF_CONTIG
|
#define LE_NEED_BUF_CONTIG
|
||||||
#include <dev/ic/am7990var.h>
|
#include <dev/ic/am7990var.h>
|
||||||
@ -71,12 +73,12 @@
|
|||||||
#define LE_SOFTC(unit) le_cd.cd_devs[unit]
|
#define LE_SOFTC(unit) le_cd.cd_devs[unit]
|
||||||
#define LE_DELAY(x) DELAY(x)
|
#define LE_DELAY(x) DELAY(x)
|
||||||
|
|
||||||
int lematch __P((struct device *, void *, void *));
|
int le_pcc_match __P((struct device *, void *, void *));
|
||||||
void leattach __P((struct device *, struct device *, void *));
|
void le_pcc_attach __P((struct device *, struct device *, void *));
|
||||||
int leintr __P((void *));
|
int leintr __P((void *));
|
||||||
|
|
||||||
struct cfattach le_ca = {
|
struct cfattach le_pcc_ca = {
|
||||||
sizeof(struct le_softc), lematch, leattach
|
sizeof(struct le_softc), le_pcc_match, le_pcc_attach
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cfdriver le_cd = {
|
struct cfdriver le_cd = {
|
||||||
@ -116,30 +118,34 @@ lerdcsr(sc, port)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
lematch(parent, match, aux)
|
le_pcc_match(parent, match, aux)
|
||||||
struct device *parent;
|
struct device *parent;
|
||||||
void *match, *aux;
|
void *match, *aux;
|
||||||
{
|
{
|
||||||
struct cfdata *cf = match;
|
struct cfdata *cf = match;
|
||||||
|
struct pcc_attach_args *pa = aux;
|
||||||
|
|
||||||
return !badbaddr((caddr_t) IIO_CFLOC_ADDR(cf));
|
if (strcmp(pa->pa_name, le_cd.cd_name))
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
pa->pa_ipl = cf->pcccf_ipl;
|
||||||
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
leattach(parent, self, aux)
|
le_pcc_attach(parent, self, aux)
|
||||||
struct device *parent, *self;
|
struct device *parent, *self;
|
||||||
void *aux;
|
void *aux;
|
||||||
{
|
{
|
||||||
struct le_softc *sc = (void *)self;
|
struct le_softc *sc = (void *)self;
|
||||||
struct cfdata *cf = self->dv_cfdata;
|
struct pcc_attach_args *pa = aux;
|
||||||
int pri = IIO_CFLOC_LEVEL(cf);
|
|
||||||
|
|
||||||
/* XXX the following declarations should be elsewhere */
|
/* XXX the following declarations should be elsewhere */
|
||||||
extern void myetheraddr __P((u_char *));
|
extern void myetheraddr __P((u_char *));
|
||||||
|
|
||||||
iio_print(cf);
|
/* Map control registers. */
|
||||||
|
sc->sc_r1 = (struct lereg1 *)PCC_VADDR(pa->pa_offset);
|
||||||
|
|
||||||
sc->sc_r1 = (struct lereg1 *)IIO_CFLOC_ADDR(cf);
|
|
||||||
sc->sc_mem = ledatabuf; /* XXX */
|
sc->sc_mem = ledatabuf; /* XXX */
|
||||||
sc->sc_conf3 = LE_C3_BSWP;
|
sc->sc_conf3 = LE_C3_BSWP;
|
||||||
sc->sc_addr = (u_long)sc->sc_mem;
|
sc->sc_addr = (u_long)sc->sc_mem;
|
||||||
@ -156,8 +162,8 @@ leattach(parent, self, aux)
|
|||||||
sc->sc_arpcom.ac_if.if_name = le_cd.cd_name;
|
sc->sc_arpcom.ac_if.if_name = le_cd.cd_name;
|
||||||
leconfig(sc);
|
leconfig(sc);
|
||||||
|
|
||||||
pccintr_establish(PCCV_LE, leintr, pri, sc);
|
pccintr_establish(PCCV_LE, leintr, pa->pa_ipl, sc);
|
||||||
sys_pcc->le_int = pri | PCC_IENABLE;
|
sys_pcc->le_int = pa->pa_ipl | PCC_IENABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <dev/ic/am7990.c>
|
#include <dev/ic/am7990.c>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* $Id: pcc.c,v 1.2 1996/03/17 01:35:03 thorpej Exp $ */
|
/* $Id: pcc.c,v 1.3 1996/04/26 19:00:06 chuck Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
* Copyright (c) 1996 Jason R. Thorpe
|
||||||
* Copyright (c) 1995 Charles D. Cranor
|
* Copyright (c) 1995 Charles D. Cranor
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@ -50,9 +50,11 @@
|
|||||||
#include <sys/device.h>
|
#include <sys/device.h>
|
||||||
#include <machine/cpu.h>
|
#include <machine/cpu.h>
|
||||||
#include <dev/cons.h>
|
#include <dev/cons.h>
|
||||||
|
|
||||||
#include <mvme68k/mvme68k/isr.h>
|
#include <mvme68k/mvme68k/isr.h>
|
||||||
#include <mvme68k/dev/iio.h>
|
|
||||||
#include <mvme68k/dev/pccreg.h>
|
#include <mvme68k/dev/pccreg.h>
|
||||||
|
#include <mvme68k/dev/pccvar.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Autoconfiguration stuff.
|
* Autoconfiguration stuff.
|
||||||
@ -63,9 +65,9 @@ struct pccsoftc {
|
|||||||
struct pcc *sc_pcc;
|
struct pcc *sc_pcc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void pccattach __P((struct device *, struct device *, void *));
|
||||||
void pccattach __P((struct device *, struct device *, void *));
|
int pccmatch __P((struct device *, void *, void *));
|
||||||
int pccmatch __P((struct device *, void *, void *));
|
int pccprint __P((void *, char *));
|
||||||
|
|
||||||
struct cfattach pcc_ca = {
|
struct cfattach pcc_ca = {
|
||||||
sizeof(struct pccsoftc), pccmatch, pccattach
|
sizeof(struct pccsoftc), pccmatch, pccattach
|
||||||
@ -75,26 +77,40 @@ struct cfdriver pcc_cd = {
|
|||||||
NULL, "pcc", DV_DULL, 0
|
NULL, "pcc", DV_DULL, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int pccintr __P((void *));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* globals
|
* globals
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct pcc *sys_pcc = NULL;
|
struct pcc *sys_pcc = NULL;
|
||||||
|
|
||||||
struct {
|
/*
|
||||||
int (*pcc_fn)();
|
* Devices that live on the PCC, attached in this order.
|
||||||
void *arg;
|
*/
|
||||||
int lvl;
|
struct pcc_device pcc_devices[] = {
|
||||||
} pcc_vecs[PCC_NVEC];
|
{ "clock", PCC_CLOCK_OFF, 1 },
|
||||||
|
{ "zsc", PCC_ZS0_OFF, 1 },
|
||||||
|
{ "zsc", PCC_ZS1_OFF, 1 },
|
||||||
|
{ "le", PCC_LE_OFF, 2 },
|
||||||
|
{ "wdsc", PCC_WDSC_OFF, 1 },
|
||||||
|
{ "lpt", PCC_LPT_OFF, 1 },
|
||||||
|
{ "vmechip", PCC_VME_OFF, 2 },
|
||||||
|
{ NULL, 0, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
int
|
int
|
||||||
pccmatch(parent, vcf, args)
|
pccmatch(parent, vcf, args)
|
||||||
struct device *parent;
|
struct device *parent;
|
||||||
void *vcf, *args;
|
void *vcf, *args;
|
||||||
{
|
{
|
||||||
struct cfdata *cf = vcf;
|
char *ma_name = args;
|
||||||
|
|
||||||
return !badbaddr((caddr_t) IIO_CFLOC_ADDR(cf));
|
/* Only attach one PCC. */
|
||||||
|
if (sys_pcc)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
return (strcmp(ma_name, pcc_cd.cd_name) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -103,72 +119,140 @@ pccattach(parent, self, args)
|
|||||||
void *args;
|
void *args;
|
||||||
{
|
{
|
||||||
struct pccsoftc *pccsc;
|
struct pccsoftc *pccsc;
|
||||||
|
struct pcc_attach_args npa;
|
||||||
|
caddr_t kva;
|
||||||
|
int i, error;
|
||||||
|
|
||||||
if (sys_pcc)
|
if (sys_pcc)
|
||||||
panic("pcc already attached!");
|
panic("pccattach: pcc already attached!");
|
||||||
|
|
||||||
iio_print(self->dv_cfdata);
|
sys_pcc = (struct pcc *)PCC_VADDR(PCC_REG_OFF);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* link into softc and set up interrupt vector base
|
* link into softc and set up interrupt vector base,
|
||||||
|
* and initialize the chip.
|
||||||
*/
|
*/
|
||||||
pccsc = (struct pccsoftc *) self;
|
pccsc = (struct pccsoftc *) self;
|
||||||
sys_pcc = pccsc->sc_pcc = (struct pcc *)IIO_CFLOC_ADDR(self->dv_cfdata);
|
pccsc->sc_pcc = sys_pcc;
|
||||||
pccsc->sc_pcc->int_vectr = PCC_VECBASE;
|
pccsc->sc_pcc->int_vectr = PCC_VECBASE;
|
||||||
bzero(pcc_vecs, sizeof(pcc_vecs));
|
|
||||||
|
|
||||||
printf(" rev %d intbvr 0x%x\n", pccsc->sc_pcc->pcc_rev,
|
printf(": Peripheral Channel Controller, "
|
||||||
|
"rev %d, vecbase 0x%x\n", pccsc->sc_pcc->pcc_rev,
|
||||||
pccsc->sc_pcc->int_vectr);
|
pccsc->sc_pcc->int_vectr);
|
||||||
|
|
||||||
|
/* Hook up interrupt handler for abort button. */
|
||||||
|
pccintr_establish(PCCV_ABORT, pccintr, 7, NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now that the interrupt handler has been established,
|
||||||
|
* enable the ABORT switch interrupt.
|
||||||
|
*/
|
||||||
|
pccsc->sc_pcc->abrt_int = PCC_ABORT_IEN | PCC_ABORT_ACK;
|
||||||
|
|
||||||
|
/* Make sure the global interrupt line is hot. */
|
||||||
|
pccsc->sc_pcc->gen_cr |= PCC_GENCR_IEN;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Attach configured children.
|
||||||
|
*/
|
||||||
|
for (i = 0; pcc_devices[i].pcc_name != NULL; ++i) {
|
||||||
|
/*
|
||||||
|
* Note that IPL is filled in by match function.
|
||||||
|
*/
|
||||||
|
npa.pa_name = pcc_devices[i].pcc_name;
|
||||||
|
npa.pa_offset = pcc_devices[i].pcc_offset;
|
||||||
|
npa.pa_ipl = -1;
|
||||||
|
|
||||||
|
/* Check for hardware. (XXX is this really necessary?) */
|
||||||
|
kva = PCC_VADDR(npa.pa_offset);
|
||||||
|
/* XXX should change interface to badaddr() */
|
||||||
|
switch (pcc_devices[i].pcc_bytes) {
|
||||||
|
case 1:
|
||||||
|
error = badbaddr(kva);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
error = badaddr(kva);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
panic("pccattach: bad probe size");
|
||||||
|
}
|
||||||
|
if (error) {
|
||||||
|
/*
|
||||||
|
* Hardware not present.
|
||||||
|
*/
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Attach the device if configured. */
|
||||||
|
(void)config_found(self, &npa, pccprint);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* pccintr: called from locore with the PC and evec from the trap frame.
|
|
||||||
*/
|
|
||||||
int
|
int
|
||||||
pccintr(pc, evec, frame)
|
pccprint(aux, cp)
|
||||||
int pc;
|
void *aux;
|
||||||
int evec;
|
char *cp;
|
||||||
void *frame;
|
|
||||||
{
|
{
|
||||||
int vec = (evec & 0xfff) >> 2; /* XXX should be m68k macro? */
|
struct pcc_attach_args *pa = aux;
|
||||||
extern u_long intrcnt[]; /* XXX from locore */
|
|
||||||
|
|
||||||
vec = vec & 0xf; /* XXX mask out */
|
if (cp)
|
||||||
if (vec >= PCC_NVEC || pcc_vecs[vec].pcc_fn == NULL)
|
printf("%s at %s", pa->pa_name, cp);
|
||||||
return(straytrap(pc, evec));
|
|
||||||
|
|
||||||
cnt.v_intr++;
|
printf(" offset 0x%lx", pa->pa_offset);
|
||||||
intrcnt[pcc_vecs[vec].lvl]++;
|
if (pa->pa_ipl != -1)
|
||||||
|
printf(" ipl %d", pa->pa_ipl);
|
||||||
/* arg override? only timer1 gets access to frame */
|
|
||||||
if (vec != PCCV_TIMER1)
|
return (UNCONF);
|
||||||
frame = pcc_vecs[vec].arg;
|
|
||||||
return((*pcc_vecs[vec].pcc_fn)(frame));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* pccintr_establish: establish pcc interrupt
|
* pccintr_establish: establish pcc interrupt
|
||||||
*/
|
*/
|
||||||
int
|
void
|
||||||
pccintr_establish(vec, hand, lvl, arg)
|
pccintr_establish(pccvec, hand, lvl, arg)
|
||||||
u_long vec;
|
int pccvec;
|
||||||
int (*hand)(), lvl;
|
int (*hand) __P((void *)), lvl;
|
||||||
void *arg;
|
void *arg;
|
||||||
{
|
{
|
||||||
if (vec >= PCC_NVEC) {
|
|
||||||
printf("pcc: illegal vector: 0x%x\n", vec);
|
if ((pccvec < 0) || (pccvec >= PCC_NVEC)) {
|
||||||
|
printf("pcc: illegal vector offset: 0x%x\n", pccvec);
|
||||||
panic("pccintr_establish");
|
panic("pccintr_establish");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pcc_vecs[vec].pcc_fn) {
|
if ((lvl < 1) || (lvl > 7)) {
|
||||||
printf("pcc: vector 0x%x in use: (0x%x,0x%x) (0x%x,0x%x)\n",
|
printf("pcc: illegal interrupt level: %d\n", lvl);
|
||||||
hand, arg, pcc_vecs[vec].pcc_fn, pcc_vecs[vec].arg);
|
|
||||||
panic("pccintr_establish");
|
panic("pccintr_establish");
|
||||||
}
|
}
|
||||||
|
|
||||||
pcc_vecs[vec].pcc_fn = hand;
|
isrlink_vectored(hand, arg, lvl, pccvec + PCC_VECBASE);
|
||||||
pcc_vecs[vec].lvl = lvl;
|
}
|
||||||
pcc_vecs[vec].arg = arg;
|
|
||||||
|
void
|
||||||
|
pccintr_disestablish(pccvec)
|
||||||
|
int pccvec;
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((pccvec < 0) || (pccvec >= PCC_NVEC)) {
|
||||||
|
printf("pcc: illegal vector offset: 0x%x\n", pccvec);
|
||||||
|
panic("pccintr_establish");
|
||||||
|
}
|
||||||
|
|
||||||
|
isrunlink_vectored(pccvec + PCC_VECBASE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handle NMI from abort switch.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
pccintr(frame)
|
||||||
|
void *frame;
|
||||||
|
{
|
||||||
|
|
||||||
|
/* XXX wait until button pops out */
|
||||||
|
sys_pcc->abrt_int = PCC_ABORT_IEN | PCC_ABORT_ACK;
|
||||||
|
nmihand((struct frame *)frame);
|
||||||
|
return (1);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Id: pccreg.h,v 1.2 1996/04/18 18:07:08 chuck Exp $ */
|
/* $Id: pccreg.h,v 1.3 1996/04/26 19:00:08 chuck Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
@ -32,9 +32,28 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* peripheral channel controller (at pa fffe1000)
|
* peripheral channel controller (at pa fffe0000)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define PCC_BASE 0xfffe0000 /* PA of PCC chip space */
|
||||||
|
#define PCC_CLOCK_OFF 0x0000 /* offset of Mostek clock chip */
|
||||||
|
#define PCC_RTC_OFF 0x07f8 /* offset of clock registers in MK */
|
||||||
|
#define PCC_REG_OFF 0x1000 /* offset of PCC chip registers */
|
||||||
|
#define PCC_LE_OFF 0x1800 /* offset of LANCE ethernet chip */
|
||||||
|
#define PCC_VME_OFF 0x2000 /* offset of VME chip */
|
||||||
|
#define PCC_LPT_OFF 0x2800 /* offset of parallel port register */
|
||||||
|
#define PCC_ZS0_OFF 0x3000 /* offset of first 8530 UART */
|
||||||
|
#define PCC_ZS1_OFF 0x3800 /* offset of second 8530 UART */
|
||||||
|
#define PCC_WDSC_OFF 0x4000 /* offset of 33c93 SCSI chip */
|
||||||
|
|
||||||
|
#define PCC_PADDR(off) ((void *)(PCC_BASE + (off)))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The PCC space is permanently mapped by pmap_bootstrap(). This
|
||||||
|
* macro translates PCC offsets into the corresponding KVA.
|
||||||
|
*/
|
||||||
|
#define PCC_VADDR(off) ((void *)IIOV(PCC_BASE + (off)))
|
||||||
|
|
||||||
struct pcc {
|
struct pcc {
|
||||||
volatile u_long dma_taddr; /* dma table address */
|
volatile u_long dma_taddr; /* dma table address */
|
||||||
volatile u_long dma_daddr; /* dma data address */
|
volatile u_long dma_daddr; /* dma data address */
|
||||||
@ -122,6 +141,7 @@ extern struct pcc *sys_pcc;
|
|||||||
#define PCC_TIMERACK 0x80 /* ack intr */
|
#define PCC_TIMERACK 0x80 /* ack intr */
|
||||||
#define PCC_TIMER100HZ 63936 /* load value for 100Hz */
|
#define PCC_TIMER100HZ 63936 /* load value for 100Hz */
|
||||||
#define PCC_TIMERCLEAR 0x0 /* reset and clear timer */
|
#define PCC_TIMERCLEAR 0x0 /* reset and clear timer */
|
||||||
|
#define PCC_TIMERSTOP 0x1 /* stop clock, but don't clear it */
|
||||||
#define PCC_TIMERSTART 0x3 /* start timer */
|
#define PCC_TIMERSTART 0x3 /* start timer */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -129,3 +149,17 @@ extern struct pcc *sys_pcc;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define PCC_ZSEXTERN 0x10 /* let PCC supply vector */
|
#define PCC_ZSEXTERN 0x10 /* let PCC supply vector */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* abort switch
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PCC_ABORT_IEN 0x08 /* enable interrupt */
|
||||||
|
#define PCC_ABORT_ABS 0x40 /* current state of switch */
|
||||||
|
#define PCC_ABORT_ACK 0x80 /* interrupt active; write to ack */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* general control register
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PCC_GENCR_IEN 0x10 /* global interrupt enable */
|
||||||
|
66
sys/arch/mvme68k/dev/pccvar.h
Normal file
66
sys/arch/mvme68k/dev/pccvar.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/* $NetBSD: pccvar.h,v 1.1 1996/04/26 19:00:11 chuck Exp $ */
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 1996 The NetBSD Foundation, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to The NetBSD Foundation
|
||||||
|
* by Jason R. Thorpe.
|
||||||
|
*
|
||||||
|
* 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 NetBSD
|
||||||
|
* Foundation, Inc. and its contributors.
|
||||||
|
* 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Autoconfiguration definitions for the MVME-147 Peripheral Channel
|
||||||
|
* Controller.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Structure used to describe a device for autoconfiguration purposes.
|
||||||
|
*/
|
||||||
|
struct pcc_device {
|
||||||
|
char *pcc_name; /* name of device (e.g. "clock") */
|
||||||
|
u_long pcc_offset; /* offset from PCC base */
|
||||||
|
int pcc_bytes; /* size of badaddr check */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Structure used to attach PCC devices.
|
||||||
|
*/
|
||||||
|
struct pcc_attach_args {
|
||||||
|
char *pa_name; /* name of device */
|
||||||
|
u_long pa_offset; /* offset from PCC base */
|
||||||
|
int pa_ipl; /* interrupt level */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Shorthand for locators. */
|
||||||
|
#define pcccf_ipl cf_loc[0]
|
||||||
|
|
||||||
|
void pccintr_establish __P((int, int (*)(void *), int, void *));
|
||||||
|
void pccintr_disestablish __P((int));
|
324
sys/arch/mvme68k/dev/vme.c
Normal file
324
sys/arch/mvme68k/dev/vme.c
Normal file
@ -0,0 +1,324 @@
|
|||||||
|
/* $NetBSD: vme.c,v 1.1 1996/04/26 19:00:12 chuck Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1996 Jason R. Thorpe
|
||||||
|
* Copyright (c) 1994 Gordon W. Ross
|
||||||
|
* 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 Gordon Ross
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generic VME support for the Motorola MVME series of computers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/systm.h>
|
||||||
|
#include <sys/device.h>
|
||||||
|
|
||||||
|
#include <machine/cpu.h>
|
||||||
|
|
||||||
|
#include <mvme68k/dev/vmevar.h>
|
||||||
|
|
||||||
|
int vmes_match __P((struct device *, void *, void *));
|
||||||
|
int vmel_match __P((struct device *, void *, void *));
|
||||||
|
|
||||||
|
void vme_attach __P((struct device *, struct device *, void *));
|
||||||
|
|
||||||
|
int vme_search __P((struct device *, void *, void *));
|
||||||
|
int vme_print __P((void *, char *));
|
||||||
|
|
||||||
|
int vmechip_print __P((void *, char *));
|
||||||
|
|
||||||
|
struct cfdriver vmechip_cd = {
|
||||||
|
NULL, "vmechip", DV_DULL
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cfattach vmes_ca = {
|
||||||
|
sizeof(struct device), vmes_match, vme_attach
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cfdriver vmes_cd = {
|
||||||
|
NULL, "vmes", DV_DULL
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cfattach vmel_ca = {
|
||||||
|
sizeof(struct device), vmel_match, vme_attach
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cfdriver vmel_cd = {
|
||||||
|
NULL, "vmel", DV_DULL
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Pointer to the system vmechip softc. */
|
||||||
|
struct vmechip_softc *sys_vmechip;
|
||||||
|
|
||||||
|
void
|
||||||
|
vme_config(sc)
|
||||||
|
struct vmechip_softc *sc;
|
||||||
|
{
|
||||||
|
struct vme_attach_args va;
|
||||||
|
|
||||||
|
/* We can only do this once. */
|
||||||
|
if (sys_vmechip)
|
||||||
|
panic("vme_config: more than one VME bus?");
|
||||||
|
|
||||||
|
sys_vmechip = sc;
|
||||||
|
|
||||||
|
/* Attach D16 space. */
|
||||||
|
bzero(&va, sizeof(va));
|
||||||
|
va.va_bustype = VME_D16;
|
||||||
|
(void)config_found(&sc->sc_dev, &va, vmechip_print);
|
||||||
|
|
||||||
|
/* Attach D32 space. */
|
||||||
|
bzero(&va, sizeof(va));
|
||||||
|
va.va_bustype = VME_D32;
|
||||||
|
(void)config_found(&sc->sc_dev, &va, vmechip_print);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
vmechip_print(aux, cp)
|
||||||
|
void *aux;
|
||||||
|
char *cp;
|
||||||
|
{
|
||||||
|
struct vme_attach_args *va = aux;
|
||||||
|
char *busname;
|
||||||
|
|
||||||
|
if (cp) {
|
||||||
|
switch (va->va_bustype) {
|
||||||
|
case VME_D16:
|
||||||
|
busname = vmes_cd.cd_name;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VME_D32:
|
||||||
|
busname = vmel_cd.cd_name;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
panic("vmechip_print: impossible bustype");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s at %s", busname, cp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (UNCONF);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
vmes_match(parent, vcf, aux)
|
||||||
|
struct device *parent;
|
||||||
|
void *vcf, *aux;
|
||||||
|
{
|
||||||
|
struct vme_attach_args *va = aux;
|
||||||
|
|
||||||
|
if (va->va_bustype != VME_D16)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
vmel_match(parent, vcf, aux)
|
||||||
|
struct device *parent;
|
||||||
|
void *vcf, *aux;
|
||||||
|
{
|
||||||
|
struct vme_attach_args *va = aux;
|
||||||
|
|
||||||
|
if (va->va_bustype != VME_D32)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vme_attach(parent, self, args)
|
||||||
|
struct device *parent;
|
||||||
|
struct device *self;
|
||||||
|
void *args;
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
/* We know va_bustype == VME_Dxx */
|
||||||
|
(void) config_search(vme_search, self, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
vme_search(parent, match, aux)
|
||||||
|
struct device *parent;
|
||||||
|
void *match, *aux;
|
||||||
|
{
|
||||||
|
struct cfdata *cf = match;
|
||||||
|
struct vme_attach_args *va = aux;
|
||||||
|
char *name;
|
||||||
|
int unit, reject = 0;
|
||||||
|
|
||||||
|
name = cf->cf_driver->cd_name;
|
||||||
|
unit = cf->cf_unit;
|
||||||
|
|
||||||
|
/* Send in the clones. */
|
||||||
|
if (cf->cf_fstate == FSTATE_STAR) {
|
||||||
|
printf("vme_search: device `%s' is cloned\n", name);
|
||||||
|
panic("clone devices not allowed on VME");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fill in vme_attach_args */
|
||||||
|
va->va_atype = cf->vmecf_atype;
|
||||||
|
va->va_addr = cf->vmecf_addr;
|
||||||
|
va->va_ipl = cf->vmecf_ipl;
|
||||||
|
va->va_vec = cf->vmecf_vec;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* No wildcards allowed.
|
||||||
|
* XXX Should check for a wildcard on addr, too, but we don't
|
||||||
|
* XXX in (u_int32_t)-1 isn't 0xffffffff on some weird machine.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* atype checked later */
|
||||||
|
|
||||||
|
if (va->va_ipl == -1) {
|
||||||
|
printf("vme_search: device `%s%d' has wildcarded ipl\n",
|
||||||
|
name, unit);
|
||||||
|
reject = 1;
|
||||||
|
}
|
||||||
|
if (va->va_vec == -1) {
|
||||||
|
printf("vme_search: device `%s%d' has wildcarded vec\n",
|
||||||
|
name, unit);
|
||||||
|
reject = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sanity check the atype locator. */
|
||||||
|
if (reject == 0)
|
||||||
|
switch (va->va_atype) {
|
||||||
|
case VME_A16:
|
||||||
|
case VME_A24:
|
||||||
|
case VME_A32:
|
||||||
|
break; /* Just fine. */
|
||||||
|
|
||||||
|
case -1: /* wildcarded */
|
||||||
|
printf("vme_search: device `%s%d' has wildcarded atype\n",
|
||||||
|
name, unit);
|
||||||
|
reject = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
printf("vme_search: device `%s%d' has invalid atype `%d'\n",
|
||||||
|
name, unit, va->va_atype);
|
||||||
|
reject = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reject) {
|
||||||
|
printf("vme_search: rejecting device `%s%d'\n", name, unit);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Attempt to match. If we win, attach the device. */
|
||||||
|
if ((*cf->cf_attach->ca_match)(parent, cf, va) > 0) {
|
||||||
|
config_attach(parent, cf, va, vme_print);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
vme_print(aux, cp)
|
||||||
|
void *aux;
|
||||||
|
char *cp;
|
||||||
|
{
|
||||||
|
struct vme_attach_args *va = aux;
|
||||||
|
|
||||||
|
if (cp)
|
||||||
|
printf("device at %s", cp);
|
||||||
|
|
||||||
|
printf(" atype %d addr 0x%lx ipl %d vec 0x%x", va->va_atype,
|
||||||
|
va->va_addr, va->va_ipl, va->va_vec);
|
||||||
|
|
||||||
|
return (UNCONF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vmeintr_establish(func, arg, ipl, vec)
|
||||||
|
int (*func) __P((void *));
|
||||||
|
void *arg;
|
||||||
|
int ipl, vec;
|
||||||
|
{
|
||||||
|
|
||||||
|
isrlink_vectored(func, arg, ipl, vec);
|
||||||
|
|
||||||
|
/* Enable VME IRQ. */
|
||||||
|
sys_vmechip->sc_irqref[ipl]++;
|
||||||
|
(*sys_vmechip->sc_chip->vme_intrline_enable)(ipl);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vmeintr_disestablish(ipl, vec)
|
||||||
|
int ipl, vec;
|
||||||
|
{
|
||||||
|
|
||||||
|
isrunlink_vectored(vec);
|
||||||
|
|
||||||
|
/* Disable VME IRQ if possible. */
|
||||||
|
switch (sys_vmechip->sc_irqref[ipl]) {
|
||||||
|
case 0:
|
||||||
|
printf("vmeintr_disestablish: nothing using IRQ %d\n", ipl);
|
||||||
|
panic("vmeintr_disestablish");
|
||||||
|
/* NOTREACHED */
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
(*sys_vmechip->sc_chip->vme_intrline_disable)(ipl);
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
|
||||||
|
default:
|
||||||
|
sys_vmechip->sc_irqref[ipl]--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
vmemap(bpa, size, bustype, atype)
|
||||||
|
u_long bpa;
|
||||||
|
size_t size;
|
||||||
|
int bustype, atype;
|
||||||
|
{
|
||||||
|
u_long pa;
|
||||||
|
void *rval;
|
||||||
|
|
||||||
|
/* Translate address. */
|
||||||
|
if ((*sys_vmechip->sc_chip->vme_translate_addr)(bpa, size,
|
||||||
|
bustype, atype, &pa))
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
return (iomap(pa, size));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vmeunmap(kva, size)
|
||||||
|
void *kva;
|
||||||
|
size_t size;
|
||||||
|
{
|
||||||
|
|
||||||
|
iounmap(kva, size);
|
||||||
|
}
|
221
sys/arch/mvme68k/dev/vme_pcc.c
Normal file
221
sys/arch/mvme68k/dev/vme_pcc.c
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
/* $NetBSD: vme_pcc.c,v 1.1 1996/04/26 19:00:14 chuck Exp $ */
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 1996 The NetBSD Foundation, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to The NetBSD Foundation
|
||||||
|
* by Jason R. Thorpe.
|
||||||
|
*
|
||||||
|
* 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 NetBSD
|
||||||
|
* Foundation, Inc. and its contributors.
|
||||||
|
* 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* VME support specific to the Type 1 VMEchip found on the
|
||||||
|
* MVME-147.
|
||||||
|
*
|
||||||
|
* For a manual on the MVME-147, call: 408.991.8634. (Yes, this
|
||||||
|
* is the Sunnyvale sales office.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/kernel.h>
|
||||||
|
#include <sys/systm.h>
|
||||||
|
#include <sys/device.h>
|
||||||
|
|
||||||
|
#include <machine/psl.h>
|
||||||
|
#include <machine/cpu.h>
|
||||||
|
|
||||||
|
#include <mvme68k/dev/pccreg.h>
|
||||||
|
#include <mvme68k/dev/pccvar.h>
|
||||||
|
#include <mvme68k/dev/vme_pccreg.h>
|
||||||
|
#include <mvme68k/dev/vmevar.h>
|
||||||
|
|
||||||
|
int vmechip_pcc_match __P((struct device *, void *, void *));
|
||||||
|
void vmechip_pcc_attach __P((struct device *, struct device *, void *));
|
||||||
|
|
||||||
|
struct cfattach vmechip_pcc_ca = {
|
||||||
|
sizeof(struct vmechip_softc), vmechip_pcc_match, vmechip_pcc_attach
|
||||||
|
};
|
||||||
|
|
||||||
|
int vmechip_pcc_translate_addr __P((u_long, size_t, int, int, u_long *));
|
||||||
|
void vmechip_pcc_intrline_enable __P((int));
|
||||||
|
void vmechip_pcc_intrline_disable __P((int));
|
||||||
|
|
||||||
|
struct vme_chip vme_pcc_switch = {
|
||||||
|
vmechip_pcc_translate_addr,
|
||||||
|
vmechip_pcc_intrline_enable,
|
||||||
|
vmechip_pcc_intrline_disable
|
||||||
|
};
|
||||||
|
|
||||||
|
struct vme_pcc *sys_vme_pcc;
|
||||||
|
|
||||||
|
extern int physmem;
|
||||||
|
|
||||||
|
int
|
||||||
|
vmechip_pcc_match(parent, match, aux)
|
||||||
|
struct device *parent;
|
||||||
|
void *match, *aux;
|
||||||
|
{
|
||||||
|
struct cfdata *cf = match;
|
||||||
|
struct pcc_attach_args *pa = aux;
|
||||||
|
|
||||||
|
/* Only one VME chip, please. */
|
||||||
|
if (sys_vme_pcc)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
if (strcmp(pa->pa_name, vmechip_cd.cd_name))
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vmechip_pcc_attach(parent, self, aux)
|
||||||
|
struct device *parent, *self;
|
||||||
|
void *aux;
|
||||||
|
{
|
||||||
|
struct vmechip_softc *sc = (struct vmechip_softc *)self;
|
||||||
|
struct pcc_attach_args *pa = aux;
|
||||||
|
struct vme_pcc *vme;
|
||||||
|
|
||||||
|
/* Glue into generic VME code. */
|
||||||
|
sc->sc_reg = PCC_VADDR(pa->pa_offset);
|
||||||
|
sc->sc_chip = &vme_pcc_switch;
|
||||||
|
|
||||||
|
/* Initialize the chip. */
|
||||||
|
vme = (struct vme_pcc *)sc->sc_reg;
|
||||||
|
vme->vme_scon &= ~VME1_SCON_SYSFAIL; /* XXX doesn't work */
|
||||||
|
|
||||||
|
sys_vme_pcc = vme;
|
||||||
|
|
||||||
|
printf(": Type 1 VMEchip, scon jumper %s\n",
|
||||||
|
(vme->vme_scon & VME1_SCON_SWITCH) ? "enabled" : "disabled");
|
||||||
|
|
||||||
|
/* Attach children. */
|
||||||
|
vme_config(sc);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
vmechip_pcc_translate_addr(start, len, bustype, atype, addrp)
|
||||||
|
u_long start;
|
||||||
|
size_t len;
|
||||||
|
int bustype, atype;
|
||||||
|
u_long *addrp; /* result */
|
||||||
|
{
|
||||||
|
u_long end = (start + len) - 1;
|
||||||
|
|
||||||
|
switch (bustype) {
|
||||||
|
case VME_D16:
|
||||||
|
switch (atype) {
|
||||||
|
case VME_A16:
|
||||||
|
if (end < VME1_A16D16_LEN) {
|
||||||
|
*addrp = VME1_A16D16_START + start;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VME_A24:
|
||||||
|
if (((end & 0x00ffffff) == end) &&
|
||||||
|
(end < VME1_A32D16_LEN)) {
|
||||||
|
*addrp = VME1_A32D16_START + start;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VME_A32:
|
||||||
|
if (end < VME1_A32D16_LEN) {
|
||||||
|
*addrp = VME1_A32D16_START + start;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
printf("vmechip: impossible atype `%d'\n", atype);
|
||||||
|
panic("vmechip_pcc_translate_addr");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("vmechip: can't map %s atype %d addr 0x%lx len 0x%x\n",
|
||||||
|
vmes_cd.cd_name, atype, start, len);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VME_D32:
|
||||||
|
switch (atype) {
|
||||||
|
case VME_A16:
|
||||||
|
/* Can't map A16D32 */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VME_A24:
|
||||||
|
if (((u_long)physmem < 0x1000000) && /* 16MB */
|
||||||
|
(start >= (u_long)physmem) &&
|
||||||
|
(end < VME1_A32D32_LEN)) {
|
||||||
|
*addrp = start;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VME_A32:
|
||||||
|
if ((start >= (u_long)physmem) &&
|
||||||
|
(end < VME1_A32D32_LEN)) {
|
||||||
|
*addrp = start;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
printf("vmechip: impossible atype `%d'\n", atype);
|
||||||
|
panic("vmechip_pcc_translate_addr");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("vmechip: can't map %s atype %d addr 0x%lx len 0x%x\n",
|
||||||
|
vmel_cd.cd_name, atype, start, len);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
panic("vmechip_pcc_translate_addr: bad bustype");
|
||||||
|
}
|
||||||
|
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vmechip_pcc_intrline_enable(ipl)
|
||||||
|
int ipl;
|
||||||
|
{
|
||||||
|
|
||||||
|
sys_vme_pcc->vme_irqen |= VME1_IRQ_VME(ipl);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vmechip_pcc_intrline_disable(ipl)
|
||||||
|
int ipl;
|
||||||
|
{
|
||||||
|
|
||||||
|
sys_vme_pcc->vme_irqen &= ~VME1_IRQ_VME(ipl);
|
||||||
|
}
|
201
sys/arch/mvme68k/dev/vme_pccreg.h
Normal file
201
sys/arch/mvme68k/dev/vme_pccreg.h
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
/* $NetBSD: vme_pccreg.h,v 1.1 1996/04/26 19:00:16 chuck Exp $ */
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 1996 The NetBSD Foundation, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to The NetBSD Foundation
|
||||||
|
* by Jason R. Thorpe.
|
||||||
|
*
|
||||||
|
* 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 NetBSD
|
||||||
|
* Foundation, Inc. and its contributors.
|
||||||
|
* 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Based IN PART on a 147 VME driver by Theo de Raadt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Register map of the Type 1 VMEchip found on the MVME-147
|
||||||
|
* Peripheral Channel Controller.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct vme_pcc {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Local VME control registers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int8_t pad0;
|
||||||
|
volatile u_int8_t vme_scon;
|
||||||
|
|
||||||
|
#define VME1_SCON_SWITCH 0x01 /* SCON jumper is set */
|
||||||
|
#define VME1_SCON_SRESET 0x02 /* assert SRESET on bus */
|
||||||
|
#define VME1_SCON_SYSFAIL 0x04 /* assert SYSFAIL on bus */
|
||||||
|
#define VME1_SCON_ROBIN 0x08 /* round robin bus requests */
|
||||||
|
|
||||||
|
int8_t pad1;
|
||||||
|
volatile u_int8_t vme_reqconf;
|
||||||
|
|
||||||
|
#define VME1_REQ_IPLMASK 0x03 /* interrupt level for requester */
|
||||||
|
#define VME1_REQ_RNEVER 0x08
|
||||||
|
#define VME1_REQ_RWD 0x10
|
||||||
|
#define VME1_REQ_DHB 0x40
|
||||||
|
#define VME1_REQ_DWB 0x80
|
||||||
|
|
||||||
|
int8_t pad2;
|
||||||
|
volatile u_int8_t vme_masconf;
|
||||||
|
|
||||||
|
#define VME1_MAS_D16 0x01 /* force d8/16 accesses only */
|
||||||
|
#define VME1_MAS_MASA24 0x02 /* send address mod for A24 access */
|
||||||
|
#define VME1_MAS_MASA16 0x04 /* send address mod for A16 access */
|
||||||
|
#define VME1_MAS_MASUAT 0x08 /* handle unaligned VME cycles */
|
||||||
|
#define VME1_MAS_CFILL 0x10 /* DO NOT USE */
|
||||||
|
#define VME1_MAS_MASWP 0x20 /* VME fast mode (DO NOT USE) */
|
||||||
|
|
||||||
|
int8_t pad3;
|
||||||
|
volatile u_int8_t vme_slconf;
|
||||||
|
|
||||||
|
#define VME1_SLAVE_SLVD16 0x01 /* DO NOT USE */
|
||||||
|
#define VME1_SLAVE_SLVWP 0x20 /* DO NOT USE */
|
||||||
|
#define VME1_SLAVE_SLVEN 0x80 /* allow access to onboard DRAM */
|
||||||
|
|
||||||
|
int8_t pad4;
|
||||||
|
volatile u_int8_t vme_timerconf;
|
||||||
|
|
||||||
|
#define VME1_TIMER_LOCAL_MASK 0x03
|
||||||
|
#define VME1_TIMER_LOCAL_T0 0x00 /* local timeout 102 microsec */
|
||||||
|
#define VME1_TIMER_LOCAL_T1 0x01 /* local timeout 205 microsec */
|
||||||
|
#define VME1_TIMER_LOCAL_T2 0x02 /* local timeout 410 microsec */
|
||||||
|
#define VME1_TIMER_LOCAL_T3 0x03 /* local timeout disabled */
|
||||||
|
#define VME1_TIMER_VMEACC_MASK 0x0c
|
||||||
|
#define VME1_TIMER_VMEACC_T0 0x00 /* VME access timeout 102 microsec */
|
||||||
|
#define VME1_TIMER_VMEACC_T1 0x04 /* VME access timeout 1.6 millisec */
|
||||||
|
#define VME1_TIMER_VMEACC_T2 0x08 /* VME access timeout 51 millisec */
|
||||||
|
#define VME1_TIMER_VMEACC_T3 0x0c /* VME access timeout disabled */
|
||||||
|
#define VME1_TIMER_VMEGLO_MASK 0x30
|
||||||
|
#define VME1_TIMER_VMEGLO_T0 0x00 /* VME glob timeout 102 microsec */
|
||||||
|
#define VME1_TIMER_VMEGLO_T1 0x10 /* VME glob timeout 205 microsec */
|
||||||
|
#define VME1_TIMER_VMEGLO_T2 0x20 /* VME glob timeout 410 microsec */
|
||||||
|
#define VME1_TIMER_VMEGLO_T3 0x30 /* VME glob timeout disabled */
|
||||||
|
#define VME1_TIMER_ARBTO 0x40 /* enable VME arbitration timer */
|
||||||
|
|
||||||
|
int8_t pad5;
|
||||||
|
volatile u_int8_t vme_sladdrmod;
|
||||||
|
|
||||||
|
#define VME1_SLMOD_DATA 0x01
|
||||||
|
#define VME1_SLMOD_PRGRM 0x02
|
||||||
|
#define VME1_SLMOD_BLOCK 0x04
|
||||||
|
#define VME1_SLMOD_SHORT 0x08
|
||||||
|
#define VME1_SLMOD_STND 0x10
|
||||||
|
#define VME1_SLMOD_EXTED 0x20
|
||||||
|
#define VME1_SLMOD_USER 0x40
|
||||||
|
#define VME1_SLMOD_SUPER 0x80
|
||||||
|
|
||||||
|
int8_t pad6;
|
||||||
|
volatile u_int8_t vme_msaddrmod;
|
||||||
|
|
||||||
|
#define VME1_MSMOD_AM_MASK 0x3f
|
||||||
|
#define VME1_MSMOD_AMSEL 0x80
|
||||||
|
|
||||||
|
int8_t pad7;
|
||||||
|
volatile u_int8_t vme_irqen;
|
||||||
|
|
||||||
|
#define VME1_IRQ_VME(x) (1 << (x))
|
||||||
|
|
||||||
|
int8_t pad8;
|
||||||
|
volatile u_int8_t vme_uireqen;
|
||||||
|
|
||||||
|
int8_t pad9;
|
||||||
|
volatile u_int8_t vme_uirq;
|
||||||
|
|
||||||
|
int8_t pad10;
|
||||||
|
volatile u_int8_t vme_irq;
|
||||||
|
|
||||||
|
int8_t pad11;
|
||||||
|
volatile u_int8_t vme_vmeid;
|
||||||
|
|
||||||
|
int8_t pad12;
|
||||||
|
volatile u_int8_t vme_buserr;
|
||||||
|
|
||||||
|
int8_t pad13;
|
||||||
|
volatile u_int8_t vme_gcsr;
|
||||||
|
|
||||||
|
int8_t pad14[4];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Global Status and Control registers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int8_t pad15;
|
||||||
|
volatile u_int8_t vme_gcsr_gr0;
|
||||||
|
|
||||||
|
int8_t pad16;
|
||||||
|
volatile u_int8_t vme_gcsr_gr1;
|
||||||
|
|
||||||
|
int8_t pad17;
|
||||||
|
volatile u_int8_t vme_gcsr_boardid;
|
||||||
|
|
||||||
|
int8_t pad18;
|
||||||
|
volatile u_int8_t vme_gcsr_gpr0;
|
||||||
|
|
||||||
|
int8_t pad19;
|
||||||
|
volatile u_int8_t vme_gcsr_gpr1;
|
||||||
|
|
||||||
|
int8_t pad20;
|
||||||
|
volatile u_int8_t vme_gcsr_gpr2;
|
||||||
|
|
||||||
|
int8_t pad21;
|
||||||
|
volatile u_int8_t vme_gcsr_gpr3;
|
||||||
|
|
||||||
|
int8_t pad22;
|
||||||
|
volatile u_int8_t vme_gcsr_gpr4;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The Type 1 VMEchip decoder maps VME address space to system addresses
|
||||||
|
* like this:
|
||||||
|
*
|
||||||
|
* A24/32D32: end of RAM - 0xefffffff
|
||||||
|
* A32D16: 0xf0000000 - 0xff7fffff
|
||||||
|
* A16D16: 0xffff0000 - 0xffffffff
|
||||||
|
*
|
||||||
|
* Note that an A24D32 access on a machine with 16MB of RAM will lose,
|
||||||
|
* since you'll be out of address bits.
|
||||||
|
*/
|
||||||
|
#define VME1_A32D32_START (0x00000000)
|
||||||
|
#define VME1_A32D32_END (0xefffffff)
|
||||||
|
#define VME1_A32D32_LEN ((VME1_A32D32_END - VME1_A32D32_START) + 1)
|
||||||
|
|
||||||
|
#define VME1_A32D16_START (0xf0000000)
|
||||||
|
#define VME1_A32D16_END (0xff7fffff)
|
||||||
|
#define VME1_A32D16_LEN ((VME1_A32D16_END - VME1_A32D16_START) + 1)
|
||||||
|
|
||||||
|
#define VME1_A16D16_START (0xffff0000)
|
||||||
|
#define VME1_A16D16_END (0xffffffff)
|
||||||
|
#define VME1_A16D16_LEN ((VME1_A16D16_END - VME1_A16D16_START) + 1)
|
92
sys/arch/mvme68k/dev/vmevar.h
Normal file
92
sys/arch/mvme68k/dev/vmevar.h
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
/* $NetBSD: vmevar.h,v 1.1 1996/04/26 19:00:19 chuck Exp $ */
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 1996 The NetBSD Foundation, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to The NetBSD Foundation
|
||||||
|
* by Jason R. Thorpe.
|
||||||
|
*
|
||||||
|
* 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 NetBSD
|
||||||
|
* Foundation, Inc. and its contributors.
|
||||||
|
* 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Autoconfiguration and glue definitions for VME support on the
|
||||||
|
* Motorola MVME series of computers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct vmechip_softc {
|
||||||
|
struct device sc_dev; /* generic device info */
|
||||||
|
caddr_t sc_reg; /* chip registers */
|
||||||
|
struct vme_chip *sc_chip; /* controller vector */
|
||||||
|
u_long sc_irqref[8]; /* ipl reference count */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Structure used to describe VME controller chips.
|
||||||
|
*/
|
||||||
|
struct vme_chip {
|
||||||
|
int (*vme_translate_addr) __P((u_long, size_t, int, int, u_long *));
|
||||||
|
void (*vme_intrline_enable) __P((int));
|
||||||
|
void (*vme_intrline_disable) __P((int));
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Structure used to attach childres to the VME busses and controller.
|
||||||
|
*/
|
||||||
|
struct vme_attach_args {
|
||||||
|
int va_bustype; /* VME_D16 or VME_D32 */
|
||||||
|
int va_atype; /* VME_A16, VME_A24, or VME_A32 */
|
||||||
|
u_long va_addr; /* address of card in bus space */
|
||||||
|
int va_ipl; /* card interrupt level */
|
||||||
|
int va_vec; /* card interrupt vector */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define VME_D16 0 /* D16 */
|
||||||
|
#define VME_D32 1 /* D32 */
|
||||||
|
|
||||||
|
#define VME_A16 16 /* A16 */
|
||||||
|
#define VME_A24 24 /* A24 */
|
||||||
|
#define VME_A32 32 /* A32 */
|
||||||
|
|
||||||
|
/* Shorthand for locators. */
|
||||||
|
#define vmecf_atype cf_loc[0]
|
||||||
|
#define vmecf_addr cf_loc[1]
|
||||||
|
#define vmecf_ipl cf_loc[2]
|
||||||
|
#define vmecf_vec cf_loc[3]
|
||||||
|
|
||||||
|
extern struct cfdriver vmechip_cd;
|
||||||
|
extern struct cfdriver vmes_cd;
|
||||||
|
extern struct cfdriver vmel_cd;
|
||||||
|
|
||||||
|
void vme_config __P((struct vmechip_softc *));
|
||||||
|
void *vmemap __P((u_long, size_t, int, int));
|
||||||
|
void vmeunmap __P((void *, size_t));
|
||||||
|
void vmeintr_establish __P((int (*)(void *), void *, int, int));
|
||||||
|
void vmeintr_disestablish __P((int, int));
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: wdsc.c,v 1.1 1996/04/18 18:30:54 chuck Exp $ */
|
/* $NetBSD: wdsc.c,v 1.2 1996/04/26 19:00:20 chuck Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1996 Steve Woodford
|
* Copyright (c) 1996 Steve Woodford
|
||||||
@ -35,30 +35,32 @@
|
|||||||
*
|
*
|
||||||
* @(#)wdsc.c
|
* @(#)wdsc.c
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
#include <sys/kernel.h>
|
#include <sys/kernel.h>
|
||||||
#include <sys/device.h>
|
#include <sys/device.h>
|
||||||
|
|
||||||
#include <scsi/scsi_all.h>
|
#include <scsi/scsi_all.h>
|
||||||
#include <scsi/scsiconf.h>
|
#include <scsi/scsiconf.h>
|
||||||
#include <mvme68k/mvme68k/isr.h>
|
|
||||||
#include <mvme68k/dev/iio.h>
|
|
||||||
#include <mvme68k/dev/pccreg.h>
|
|
||||||
#include <mvme68k/dev/dmavar.h>
|
#include <mvme68k/dev/dmavar.h>
|
||||||
|
#include <mvme68k/dev/pccreg.h>
|
||||||
|
#include <mvme68k/dev/pccvar.h>
|
||||||
#include <mvme68k/dev/sbicreg.h>
|
#include <mvme68k/dev/sbicreg.h>
|
||||||
#include <mvme68k/dev/sbicvar.h>
|
#include <mvme68k/dev/sbicvar.h>
|
||||||
#include <mvme68k/dev/wdscreg.h>
|
#include <mvme68k/dev/wdscreg.h>
|
||||||
|
|
||||||
int wdscprint __P((void *auxp, char *));
|
int wdscprint __P((void *auxp, char *));
|
||||||
void wdscattach __P((struct device *, struct device *, void *));
|
void wdsc_pcc_attach __P((struct device *, struct device *, void *));
|
||||||
int wdscmatch __P((struct device *, struct cfdata *, void *));
|
int wdsc_pcc_match __P((struct device *, void *, void *));
|
||||||
|
|
||||||
void wdsc_enintr __P((struct sbic_softc *));
|
void wdsc_enintr __P((struct sbic_softc *));
|
||||||
int wdsc_dmago __P((struct sbic_softc *, char *, int, int));
|
int wdsc_dmago __P((struct sbic_softc *, char *, int, int));
|
||||||
int wdsc_dmanext __P((struct sbic_softc *));
|
int wdsc_dmanext __P((struct sbic_softc *));
|
||||||
void wdsc_dmastop __P((struct sbic_softc *));
|
void wdsc_dmastop __P((struct sbic_softc *));
|
||||||
int wdsc_dmaintr __P((struct sbic_softc *));
|
int wdsc_dmaintr __P((void *));
|
||||||
int wdsc_scsiintr __P((struct sbic_softc *));
|
int wdsc_scsiintr __P((void *));
|
||||||
|
|
||||||
struct scsi_adapter wdsc_scsiswitch = {
|
struct scsi_adapter wdsc_scsiswitch = {
|
||||||
sbic_scsicmd,
|
sbic_scsicmd,
|
||||||
@ -74,8 +76,8 @@ struct scsi_device wdsc_scsidev = {
|
|||||||
NULL, /* Use default done routine */
|
NULL, /* Use default done routine */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cfattach wdsc_ca = {
|
struct cfattach wdsc_pcc_ca = {
|
||||||
sizeof(struct sbic_softc), (cfmatch_t)wdscmatch, wdscattach
|
sizeof(struct sbic_softc), wdsc_pcc_match, wdsc_pcc_attach
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cfdriver wdsc_cd = {
|
struct cfdriver wdsc_cd = {
|
||||||
@ -93,28 +95,30 @@ int shift_nosync = 0;
|
|||||||
* Match for SCSI devices on the onboard WD33C93 chip
|
* Match for SCSI devices on the onboard WD33C93 chip
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
wdscmatch(pdp, cdp, auxp)
|
wdsc_pcc_match(pdp, match, auxp)
|
||||||
struct device *pdp;
|
struct device *pdp;
|
||||||
struct cfdata *cdp;
|
void *match, *auxp;
|
||||||
void *auxp;
|
|
||||||
{
|
{
|
||||||
/*
|
struct cfdata *cf = match;
|
||||||
* Match everything
|
struct pcc_attach_args *pa = auxp;
|
||||||
*/
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (strcmp(pa->pa_name, wdsc_cd.cd_name))
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
pa->pa_ipl = cf->pcccf_ipl;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attach the wdsc driver
|
* Attach the wdsc driver
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
wdscattach(pdp, dp, auxp)
|
wdsc_pcc_attach(pdp, dp, auxp)
|
||||||
struct device *pdp, *dp;
|
struct device *pdp, *dp;
|
||||||
void *auxp;
|
void *auxp;
|
||||||
{
|
{
|
||||||
struct sbic_softc *sc = (struct sbic_softc *)dp;
|
struct sbic_softc *sc = (struct sbic_softc *)dp;
|
||||||
int ipl;
|
struct pcc_attach_args *pa = auxp;
|
||||||
static int attached = 0;
|
static int attached = 0;
|
||||||
|
|
||||||
if ( attached )
|
if ( attached )
|
||||||
@ -122,8 +126,6 @@ wdscattach(pdp, dp, auxp)
|
|||||||
|
|
||||||
attached = 1;
|
attached = 1;
|
||||||
|
|
||||||
iio_print(dp->dv_cfdata);
|
|
||||||
|
|
||||||
sc->sc_enintr = wdsc_enintr;
|
sc->sc_enintr = wdsc_enintr;
|
||||||
sc->sc_dmago = wdsc_dmago;
|
sc->sc_dmago = wdsc_dmago;
|
||||||
sc->sc_dmanext = wdsc_dmanext;
|
sc->sc_dmanext = wdsc_dmanext;
|
||||||
@ -136,14 +138,13 @@ wdscattach(pdp, dp, auxp)
|
|||||||
sc->sc_link.device = &wdsc_scsidev;
|
sc->sc_link.device = &wdsc_scsidev;
|
||||||
sc->sc_link.openings = 2;
|
sc->sc_link.openings = 2;
|
||||||
|
|
||||||
printf(": target %d\n", sc->sc_link.adapter_target);
|
printf(": WD33C93 SCSI, target %d\n", sc->sc_link.adapter_target);
|
||||||
|
|
||||||
sc->sc_cregs = (volatile void *)sys_pcc;
|
sc->sc_cregs = (volatile void *)sys_pcc;
|
||||||
sc->sc_sbicp = (sbic_regmap_p) IIO_CFLOC_ADDR(dp->dv_cfdata);
|
sc->sc_sbicp = (sbic_regmap_p) PCC_VADDR(pa->pa_offset);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Eveything is a valid dma address.
|
* Eveything is a valid dma address.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
sc->sc_dmamask = 0;
|
sc->sc_dmamask = 0;
|
||||||
|
|
||||||
@ -161,7 +162,7 @@ wdscattach(pdp, dp, auxp)
|
|||||||
/*
|
/*
|
||||||
* Fix up the interrupts
|
* Fix up the interrupts
|
||||||
*/
|
*/
|
||||||
sc->sc_ipl = IIO_CFLOC_LEVEL(dp->dv_cfdata) & PCC_IMASK;
|
sc->sc_ipl = pa->pa_ipl & PCC_IMASK;
|
||||||
|
|
||||||
sys_pcc->scsi_int = sc->sc_ipl | PCC_ICLEAR;
|
sys_pcc->scsi_int = sc->sc_ipl | PCC_ICLEAR;
|
||||||
sys_pcc->dma_int = sc->sc_ipl | PCC_ICLEAR;
|
sys_pcc->dma_int = sc->sc_ipl | PCC_ICLEAR;
|
||||||
@ -175,7 +176,7 @@ wdscattach(pdp, dp, auxp)
|
|||||||
/*
|
/*
|
||||||
* Attach all scsi units on us
|
* Attach all scsi units on us
|
||||||
*/
|
*/
|
||||||
config_found(dp, &sc->sc_link, wdscprint);
|
(void)config_found(dp, &sc->sc_link, wdscprint);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -186,9 +187,12 @@ wdscprint(auxp, pnp)
|
|||||||
void *auxp;
|
void *auxp;
|
||||||
char *pnp;
|
char *pnp;
|
||||||
{
|
{
|
||||||
if (pnp == NULL)
|
|
||||||
return(UNCONF);
|
/* Only scsibusses can attach to wdscs...easy. */
|
||||||
return(QUIET);
|
if (pnp)
|
||||||
|
printf("scsibus at %s", pnp);
|
||||||
|
|
||||||
|
return (UNCONF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -296,9 +300,10 @@ wdsc_dmastop(dev)
|
|||||||
* Come here following a DMA interrupt
|
* Come here following a DMA interrupt
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
wdsc_dmaintr(dev)
|
wdsc_dmaintr(arg)
|
||||||
struct sbic_softc *dev;
|
void *arg;
|
||||||
{
|
{
|
||||||
|
struct sbic_softc *dev = arg;
|
||||||
volatile struct pcc *pc = dev->sc_cregs;
|
volatile struct pcc *pc = dev->sc_cregs;
|
||||||
int found = 0;
|
int found = 0;
|
||||||
|
|
||||||
@ -325,9 +330,10 @@ wdsc_dmaintr(dev)
|
|||||||
* Come here for SCSI interrupts
|
* Come here for SCSI interrupts
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
wdsc_scsiintr(dev)
|
wdsc_scsiintr(arg)
|
||||||
struct sbic_softc *dev;
|
void *arg;
|
||||||
{
|
{
|
||||||
|
struct sbic_softc *dev = arg;
|
||||||
volatile struct pcc *pc = dev->sc_cregs;
|
volatile struct pcc *pc = dev->sc_cregs;
|
||||||
int found;
|
int found;
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
214
sys/arch/mvme68k/dev/zs_pcc.c
Normal file
214
sys/arch/mvme68k/dev/zs_pcc.c
Normal file
@ -0,0 +1,214 @@
|
|||||||
|
/* $NetBSD: zs_pcc.c,v 1.1 1996/04/26 19:00:24 chuck Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1996 Jason R. Thorpe
|
||||||
|
* Copyright (c) 1995 Gordon W. Ross
|
||||||
|
* 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. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
* 4. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by Gordon Ross
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Zilog Z8530 Dual UART driver (machine-dependent part)
|
||||||
|
*
|
||||||
|
* Runs two serial lines per chip using slave drivers.
|
||||||
|
* Plain tty/async lines use the zs_async slave.
|
||||||
|
*
|
||||||
|
* Modified for NetBSD/mvme68k by Jason R. Thorpe <thorpej@NetBSD.ORG>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/systm.h>
|
||||||
|
#include <sys/proc.h>
|
||||||
|
#include <sys/device.h>
|
||||||
|
#include <sys/conf.h>
|
||||||
|
#include <sys/file.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/tty.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/kernel.h>
|
||||||
|
#include <sys/syslog.h>
|
||||||
|
|
||||||
|
#include <dev/cons.h>
|
||||||
|
#include <dev/ic/z8530reg.h>
|
||||||
|
#include <machine/z8530var.h>
|
||||||
|
|
||||||
|
#include <machine/cpu.h>
|
||||||
|
|
||||||
|
#include <mvme68k/dev/pccreg.h>
|
||||||
|
#include <mvme68k/dev/pccvar.h>
|
||||||
|
#include <mvme68k/dev/zsvar.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PCC offsets.
|
||||||
|
*/
|
||||||
|
static int zs_pcc_offsets[NZS] = { PCC_ZS0_OFF, PCC_ZS1_OFF };
|
||||||
|
|
||||||
|
struct zschan *
|
||||||
|
zs_pcc_get_chan_addr(zsc_unit, channel)
|
||||||
|
int zsc_unit, channel;
|
||||||
|
{
|
||||||
|
struct zsdevice *addr;
|
||||||
|
struct zschan *zc;
|
||||||
|
|
||||||
|
if (zsc_unit >= NZS)
|
||||||
|
return NULL;
|
||||||
|
addr = (struct zsdevice *)PCC_VADDR(zs_pcc_offsets[zsc_unit]);
|
||||||
|
if (addr == NULL)
|
||||||
|
return NULL;
|
||||||
|
if (channel == 0) {
|
||||||
|
zc = &addr->zs_chan_a;
|
||||||
|
} else {
|
||||||
|
zc = &addr->zs_chan_b;
|
||||||
|
}
|
||||||
|
return (zc);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
* Autoconfig
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
/* Definition of the driver for autoconfig. */
|
||||||
|
static int zsc_pcc_match __P((struct device *, void *, void *));
|
||||||
|
static void zsc_pcc_attach __P((struct device *, struct device *, void *));
|
||||||
|
|
||||||
|
struct cfattach zsc_pcc_ca = {
|
||||||
|
sizeof(struct zsc_softc), zsc_pcc_match, zsc_pcc_attach
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Is the zs chip present?
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
zsc_pcc_match(parent, vcf, aux)
|
||||||
|
struct device *parent;
|
||||||
|
void *vcf, *aux;
|
||||||
|
{
|
||||||
|
struct cfdata *cf = vcf;
|
||||||
|
struct pcc_attach_args *pa = aux;
|
||||||
|
int unit;
|
||||||
|
|
||||||
|
/* XXX This is bogus; should fix this. */
|
||||||
|
unit = cf->cf_unit;
|
||||||
|
if (unit < 0 || unit >= NZS)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
if (strcmp(pa->pa_name, zsc_cd.cd_name))
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
pa->pa_ipl = cf->pcccf_ipl;
|
||||||
|
if (pa->pa_ipl == -1)
|
||||||
|
pa->pa_ipl = ZSHARD_PRI;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Attach a found zs.
|
||||||
|
*
|
||||||
|
* Match slave number to zs unit number, so that misconfiguration will
|
||||||
|
* not set up the keyboard as ttya, etc.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
zsc_pcc_attach(parent, self, aux)
|
||||||
|
struct device *parent;
|
||||||
|
struct device *self;
|
||||||
|
void *aux;
|
||||||
|
{
|
||||||
|
struct zsc_softc *zsc = (void *) self;
|
||||||
|
struct pcc_attach_args *pa = aux;
|
||||||
|
int zs_level, ir;
|
||||||
|
static int didintr;
|
||||||
|
|
||||||
|
zs_level = pa->pa_ipl;
|
||||||
|
|
||||||
|
/* Do common parts of SCC configuration. */
|
||||||
|
zs_config(zsc, zs_pcc_get_chan_addr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now safe to install interrupt handlers. Note the arguments
|
||||||
|
* to the interrupt handlers aren't used. Note, we only do this
|
||||||
|
* once since both SCCs interrupt at the same level and vector.
|
||||||
|
*/
|
||||||
|
if (didintr == 0) {
|
||||||
|
didintr = 1;
|
||||||
|
pccintr_establish(PCCV_ZS, zshard, zs_level, zsc);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sanity check the interrupt levels. */
|
||||||
|
ir = sys_pcc->zs_int;
|
||||||
|
if (((ir & PCC_IMASK) != 0) &&
|
||||||
|
((ir & PCC_IMASK) != zs_level))
|
||||||
|
panic("zs_pcc_attach: zs configured at different IPLs");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set master interrupt enable. Vector is programmed into
|
||||||
|
* the SCC by the PCC.
|
||||||
|
*/
|
||||||
|
sys_pcc->zs_int = zs_level | PCC_IENABLE | PCC_ZSEXTERN;
|
||||||
|
zs_write_reg(&zsc->zsc_cs[0], 9, zs_init_reg[9]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
* Console support functions (MVME PCC specific!)
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for SCC console. The MVME-147 always uses unit 0 chan 0.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
zsc_pcccnprobe(cp)
|
||||||
|
struct consdev *cp;
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef notyet
|
||||||
|
if (cputyp != CPU_147) {
|
||||||
|
cp->cn_pri = CN_DEAD;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* XXX Shouldn't hardcode the minor number... */
|
||||||
|
|
||||||
|
/* Initialize required fields. */
|
||||||
|
cp->cn_dev = makedev(ZSTTY_MAJOR, 0);
|
||||||
|
cp->cn_pri = CN_NORMAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
zsc_pcccninit(cp)
|
||||||
|
struct consdev *cp;
|
||||||
|
{
|
||||||
|
int unit, chan;
|
||||||
|
struct zschan *zc;
|
||||||
|
|
||||||
|
unit = 0; /* XXX */
|
||||||
|
chan = 0; /* XXX */
|
||||||
|
zc = zs_pcc_get_chan_addr(unit, chan);
|
||||||
|
|
||||||
|
/* Do common parts of console init. */
|
||||||
|
zs_cnconfig(unit, chan, zc);
|
||||||
|
}
|
86
sys/arch/mvme68k/dev/zsvar.h
Normal file
86
sys/arch/mvme68k/dev/zsvar.h
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/* $NetBSD: zsvar.h,v 1.1 1996/04/26 19:00:25 chuck Exp $ */
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 1996 The NetBSD Foundation, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to The NetBSD Foundation
|
||||||
|
* by Jason R. Thorpe.
|
||||||
|
*
|
||||||
|
* 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 NetBSD
|
||||||
|
* Foundation, Inc. and its contributors.
|
||||||
|
* 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Non-exported definitons common to the different attachment
|
||||||
|
* types for the SCC on the Motorola MVME series of computers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The MVME provides a 4.9152 MHz clock to the SCC chips.
|
||||||
|
*/
|
||||||
|
#define PCLK (9600 * 512) /* PCLK pin input clock rate */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SCC should interrupt host at level 4.
|
||||||
|
*/
|
||||||
|
#define ZSHARD_PRI 4
|
||||||
|
|
||||||
|
/*
|
||||||
|
* No delay needed when writing SCC registers.
|
||||||
|
*/
|
||||||
|
#define ZS_DELAY()
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XXX Make cnprobe a little easier.
|
||||||
|
*/
|
||||||
|
#define NZS 2
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The layout of this is hardware-dependent (padding, order).
|
||||||
|
*/
|
||||||
|
struct zschan {
|
||||||
|
volatile u_char zc_csr; /* ctrl,status, and indirect access */
|
||||||
|
volatile u_char zc_data; /* data */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct zsdevice {
|
||||||
|
/* Yes, they are backwards. */
|
||||||
|
struct zschan zs_chan_b;
|
||||||
|
struct zschan zs_chan_a;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Globals exported from zs.c */
|
||||||
|
extern u_char zs_init_reg[];
|
||||||
|
extern struct cfdriver zsc_cd;
|
||||||
|
|
||||||
|
/* Functions exported to ASIC-specific drivers. */
|
||||||
|
void zs_config __P((struct zsc_softc *, struct zschan *(*)(int, int)));
|
||||||
|
void zs_cnconfig __P((int, int, struct zschan *));
|
||||||
|
int zshard __P((void *));
|
||||||
|
int zssoft __P((void *));
|
Loading…
Reference in New Issue
Block a user