diff options
Diffstat (limited to 'sys/arch/sparc/dev')
-rw-r--r-- | sys/arch/sparc/dev/amd7930.c | 38 | ||||
-rw-r--r-- | sys/arch/sparc/dev/amd7930var.h | 2 | ||||
-rw-r--r-- | sys/arch/sparc/dev/cgsix.c | 19 | ||||
-rw-r--r-- | sys/arch/sparc/dev/dma.c | 4 | ||||
-rw-r--r-- | sys/arch/sparc/dev/esp.c | 4 | ||||
-rw-r--r-- | sys/arch/sparc/dev/if_le.c | 19 | ||||
-rw-r--r-- | sys/arch/sparc/dev/isp_sbus.c | 31 | ||||
-rw-r--r-- | sys/arch/sparc/dev/kbd.c | 27 | ||||
-rw-r--r-- | sys/arch/sparc/dev/sbusreg.h | 15 | ||||
-rw-r--r-- | sys/arch/sparc/dev/si.c | 4 | ||||
-rw-r--r-- | sys/arch/sparc/dev/zs.c | 18 |
11 files changed, 124 insertions, 57 deletions
diff --git a/sys/arch/sparc/dev/amd7930.c b/sys/arch/sparc/dev/amd7930.c index 998e89f5d1f..f884efed46d 100644 --- a/sys/arch/sparc/dev/amd7930.c +++ b/sys/arch/sparc/dev/amd7930.c @@ -1,5 +1,5 @@ -/* $OpenBSD: amd7930.c,v 1.9 1997/08/08 08:24:37 downsj Exp $ */ -/* $NetBSD: amd7930.c,v 1.10 1996/03/31 22:38:29 pk Exp $ */ +/* $OpenBSD: amd7930.c,v 1.10 1997/09/17 06:47:06 downsj Exp $ */ +/* $NetBSD: amd7930.c,v 1.30 1997/08/27 22:42:23 augustss Exp $ */ /* * Copyright (c) 1995 Rolf Grossmann @@ -50,6 +50,8 @@ #include <dev/ic/am7930reg.h> #include <sparc/dev/amd7930var.h> +#define AUDIO_ROM_NAME "audio" + #ifdef AUDIO_DEBUG extern void Dprintf __P((const char *, ...)); @@ -84,16 +86,25 @@ struct amd7930_softc { /* sc_au is special in that the hardware interrupt handler uses it */ struct auio sc_au; /* recv and xmit buffers, etc */ -#define sc_intrcnt sc_au.au_intrcnt +#define sc_intrcnt sc_au.au_intrcnt /* statistics */ }; /* interrupt interfaces */ #ifdef AUDIO_C_HANDLER int amd7930hwintr __P((void *)); +#if defined(SUN4M) +#define AUDIO_SET_SWINTR do { \ + if (CPU_ISSUN4M) \ + raise(0, 4); \ + else \ + ienab_bis(IE_L4); \ +} while(0); +#else #define AUDIO_SET_SWINTR ienab_bis(IE_L4) +#endif /* defined(SUN4M) */ #else struct auio *auiop; -#endif +#endif /* AUDIO_C_HANDLER */ int amd7930swintr __P((void *)); /* forward declarations */ @@ -104,18 +115,18 @@ static void init_amd __P((volatile struct amd7930 *)); void amd7930attach __P((struct device *, struct device *, void *)); int amd7930match __P((struct device *, void *, void *)); -struct cfattach audio_ca = { +struct cfattach audioamd_ca = { sizeof(struct amd7930_softc), amd7930match, amd7930attach }; -struct cfdriver audio_cd = { - NULL, "audio", DV_DULL +struct cfdriver audioamd_cd = { + NULL, "audioamd", DV_DULL }; struct audio_device amd7930_device = { "amd7930", "x", - "audio" + "audioamd" }; /* Write 16 bits of data from variable v to the data port of the audio chip */ @@ -130,7 +141,7 @@ struct audio_device amd7930_device = { * -18 to 0dB in .16dB steps then 0 to 12dB in .08dB steps. */ static const u_short gx_coeff[256] = { - 0x9008, 0x8b7c, 0x8b51, 0x8b45, 0x8b42, 0x8b3b, 0x8b36, 0x8b33, + 0x9008, 0x8e7c, 0x8e51, 0x8e45, 0x8d42, 0x8d3b, 0x8c36, 0x8c33, 0x8b32, 0x8b2a, 0x8b2b, 0x8b2c, 0x8b25, 0x8b23, 0x8b22, 0x8b22, 0x9122, 0x8b1a, 0x8aa3, 0x8aa3, 0x8b1c, 0x8aa6, 0x912d, 0x912b, 0x8aab, 0x8b12, 0x8aaa, 0x8ab2, 0x9132, 0x8ab4, 0x913c, 0x8abb, @@ -274,13 +285,12 @@ amd7930match(parent, vcf, aux) struct device *parent; void *vcf, *aux; { - struct cfdata *cf = vcf; register struct confargs *ca = aux; register struct romaux *ra = &ca->ca_ra; if (CPU_ISSUN4) return (0); - return (strcmp(cf->cf_driver->cd_name, ra->ra_name) == 0); + return (strcmp(AUDIO_ROM_NAME, ra->ra_name) == 0); } /* @@ -366,9 +376,9 @@ amd7930_open(dev, flags) DPRINTF(("sa_open: unit %d\n",unit)); - if (unit >= audio_cd.cd_ndevs) + if (unit >= audioamd_cd.cd_ndevs) return (ENODEV); - if ((sc = audio_cd.cd_devs[unit]) == NULL) + if ((sc = audioamd_cd.cd_devs[unit]) == NULL) return (ENXIO); if (sc->sc_open) return (EBUSY); @@ -904,7 +914,7 @@ amd7930hwintr(au0) } } - (*au->au_intrcnt)++; + *(au->au_intrcnt)++; return (1); } #endif /* AUDIO_C_HANDLER */ diff --git a/sys/arch/sparc/dev/amd7930var.h b/sys/arch/sparc/dev/amd7930var.h index 8e6cf85e529..d397b51433a 100644 --- a/sys/arch/sparc/dev/amd7930var.h +++ b/sys/arch/sparc/dev/amd7930var.h @@ -1,4 +1,4 @@ -/* $OpenBSD: amd7930var.h,v 1.3 1997/08/08 08:24:38 downsj Exp $ */ +/* $OpenBSD: amd7930var.h,v 1.4 1997/09/17 06:47:07 downsj Exp $ */ /* $NetBSD: amd7930var.h,v 1.3 1996/02/01 22:32:25 mycroft Exp $ */ /* diff --git a/sys/arch/sparc/dev/cgsix.c b/sys/arch/sparc/dev/cgsix.c index f7cf868f8bb..38d5d8a0eef 100644 --- a/sys/arch/sparc/dev/cgsix.c +++ b/sys/arch/sparc/dev/cgsix.c @@ -1,5 +1,5 @@ -/* $OpenBSD: cgsix.c,v 1.8 1997/08/08 08:24:51 downsj Exp $ */ -/* $NetBSD: cgsix.c,v 1.32 1997/07/29 09:58:04 fair Exp $ */ +/* $OpenBSD: cgsix.c,v 1.9 1997/09/17 06:47:07 downsj Exp $ */ +/* $NetBSD: cgsix.c,v 1.33 1997/08/07 19:12:30 pk Exp $ */ /* * Copyright (c) 1993 @@ -142,8 +142,12 @@ static struct fbdriver cg6_fbdriver = { /* * Unlike the bw2 and cg3 drivers, we do not need to provide an rconsole - * interface, as the cg6 is fast enough. + * interface, as the cg6 is fast enough.. but provide a knob to turn it + * on anyway. */ +#ifdef RASTERCONSOLE +int cgsix_use_rasterconsole = 0; +#endif extern int fbnode; @@ -324,9 +328,12 @@ cgsixattach(parent, self, args) if (isconsole) { printf(" (console)\n"); #ifdef RASTERCONSOLE - sc->sc_fb.fb_pixels = (caddr_t) - mapiodev(ca->ca_ra.ra_reg, O(cg6_ram[0]), ramsize); - fbrcons_init(&sc->sc_fb); + if (cgsix_use_rasterconsole) { + sc->sc_fb.fb_pixels = (caddr_t) + mapiodev(ca->ca_ra.ra_reg, + O(cg6_ram[0]), ramsize); + fbrcons_init(&sc->sc_fb); + } #endif } else printf("\n"); diff --git a/sys/arch/sparc/dev/dma.c b/sys/arch/sparc/dev/dma.c index c01200a20c1..ecd8b077f5e 100644 --- a/sys/arch/sparc/dev/dma.c +++ b/sys/arch/sparc/dev/dma.c @@ -1,5 +1,5 @@ -/* $OpenBSD: dma.c,v 1.8 1997/08/08 08:24:57 downsj Exp $ */ -/* $NetBSD: dma.c,v 1.45 1997/07/29 09:58:06 fair Exp $ */ +/* $OpenBSD: dma.c,v 1.9 1997/09/17 06:47:08 downsj Exp $ */ +/* $NetBSD: dma.c,v 1.46 1997/08/27 11:24:16 bouyer Exp $ */ /* * Copyright (c) 1994 Paul Kranenburg. All rights reserved. diff --git a/sys/arch/sparc/dev/esp.c b/sys/arch/sparc/dev/esp.c index 48c211f8ea2..34e91117133 100644 --- a/sys/arch/sparc/dev/esp.c +++ b/sys/arch/sparc/dev/esp.c @@ -1,5 +1,5 @@ -/* $OpenBSD: esp.c,v 1.10 1997/08/08 08:25:00 downsj Exp $ */ -/* $NetBSD: esp.c,v 1.68 1997/07/19 21:57:01 pk Exp $ */ +/* $OpenBSD: esp.c,v 1.11 1997/09/17 06:47:08 downsj Exp $ */ +/* $NetBSD: esp.c,v 1.69 1997/08/27 11:24:18 bouyer Exp $ */ /* * Copyright (c) 1997 Jason R. Thorpe. diff --git a/sys/arch/sparc/dev/if_le.c b/sys/arch/sparc/dev/if_le.c index b0bf63e56e6..e2842f36bad 100644 --- a/sys/arch/sparc/dev/if_le.c +++ b/sys/arch/sparc/dev/if_le.c @@ -1,5 +1,5 @@ -/* $OpenBSD: if_le.c,v 1.7 1997/08/08 08:25:12 downsj Exp $ */ -/* $NetBSD: if_le.c,v 1.49 1997/07/07 16:28:44 pk Exp $ */ +/* $OpenBSD: if_le.c,v 1.8 1997/09/17 06:47:09 downsj Exp $ */ +/* $NetBSD: if_le.c,v 1.50 1997/09/09 20:54:48 pk Exp $ */ /*- * Copyright (c) 1997 Jason R. Thorpe. All rights reserved. @@ -102,9 +102,19 @@ myleintr(arg) void *arg; { register struct le_softc *lesc = arg; +static int dodrain=0; - if (lesc->sc_dma->sc_regs->csr & D_ERR_PEND) + if (lesc->sc_dma->sc_regs->csr & D_ERR_PEND) { + dodrain = 1; return ledmaintr(lesc->sc_dma); + } + + if (dodrain) { /* XXX - is this necessary with D_DSBL_WRINVAL on? */ +#define E_DRAIN 0x400 /* XXX: fix dmareg.h */ + int i = 10; + while (i-- > 0 && (lesc->sc_dma->sc_regs->csr & D_DRAINING)) + delay(1); + } return (am7990_intr(arg)); } @@ -277,6 +287,9 @@ lehwreset(sc) DMA_RESET(lesc->sc_dma); lesc->sc_dma->sc_regs->en_bar = lesc->sc_laddr & 0xff000000; DMA_ENINTR(lesc->sc_dma); +#define D_DSBL_WRINVAL D_DSBL_SCSI_DRN /* XXX: fix dmareg.h */ + /* Disable E-cache invalidates on chip writes */ + lesc->sc_dma->sc_regs->csr |= D_DSBL_WRINVAL; } #endif } diff --git a/sys/arch/sparc/dev/isp_sbus.c b/sys/arch/sparc/dev/isp_sbus.c index 24fcb5caec2..a2d846f7b94 100644 --- a/sys/arch/sparc/dev/isp_sbus.c +++ b/sys/arch/sparc/dev/isp_sbus.c @@ -1,5 +1,5 @@ -/* $OpenBSD: isp_sbus.c,v 1.1 1997/08/08 08:25:15 downsj Exp $ */ -/* $NetBSD: isp_sbus.c,v 1.6 1997/06/08 06:35:45 thorpej Exp $ */ +/* $OpenBSD: isp_sbus.c,v 1.2 1997/09/17 06:47:10 downsj Exp $ */ +/* $NetBSD: isp_sbus.c,v 1.8 1997/08/27 11:24:19 bouyer Exp $ */ /* * SBus specific probe and attach routines for Qlogic ISP SCSI adapters. @@ -57,9 +57,9 @@ static u_int16_t isp_sbus_rd_reg __P((struct ispsoftc *, int)); static void isp_sbus_wr_reg __P((struct ispsoftc *, int, u_int16_t)); static int isp_sbus_mbxdma __P((struct ispsoftc *)); -static int isp_sbus_dmasetup __P((struct ispsoftc *, struct scsi_xfer *, +static int isp_sbus_dmasetup __P((struct ispsoftc *, struct scsipi_xfer *, ispreq_t *, u_int8_t *, u_int8_t)); -static void isp_sbus_dmateardown __P((struct ispsoftc *, struct scsi_xfer *, +static void isp_sbus_dmateardown __P((struct ispsoftc *, struct scsipi_xfer *, u_int32_t)); static struct ispmdvec mdvec = { @@ -70,19 +70,23 @@ static struct ispmdvec mdvec = { isp_sbus_dmateardown, NULL, NULL, + NULL, ISP_RISC_CODE, ISP_CODE_LENGTH, ISP_CODE_ORG, + ISP_CODE_VERSION, + 0, 0 }; struct isp_sbussoftc { struct ispsoftc sbus_isp; + sdparam sbus_dev; struct intrhand sbus_ih; volatile u_char *sbus_reg; int sbus_node; int sbus_pri; - vm_offset_t sbus_kdma_allocs[RQUEST_QUEUE_LEN]; + vm_offset_t sbus_kdma_allocs[MAXISPREQUEST]; }; @@ -137,6 +141,9 @@ isp_sbus_attach(parent, self, aux) sbc->sbus_node = ca->ca_ra.ra_node; sbc->sbus_isp.isp_mdvec = &mdvec; + sbc->sbus_isp.isp_type = ISP_HA_SCSI_UNKNOWN; + sbc->sbus_isp.isp_param = &sbc->sbus_dev; + bzero(sbc->sbus_isp.isp_param, sizeof (sdparam)); isp_reset(&sbc->sbus_isp); if (sbc->sbus_isp.isp_state != ISP_RESETSTATE) { return; @@ -224,7 +231,7 @@ isp_sbus_mbxdma(isp) /* * Allocate and map the request queue. */ - len = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN); + len = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); isp->isp_rquest = (volatile caddr_t)malloc(len, M_DEVBUF, M_NOWAIT); if (isp->isp_rquest == 0) return (1); @@ -236,7 +243,7 @@ isp_sbus_mbxdma(isp) /* * Allocate and map the result queue. */ - len = ISP_QUEUE_SIZE(RESULT_QUEUE_LEN); + len = ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); isp->isp_result = (volatile caddr_t)malloc(len, M_DEVBUF, M_NOWAIT); if (isp->isp_result == 0) return (1); @@ -266,11 +273,11 @@ isp_sbus_dmasetup(isp, xs, rq, iptrp, optr) if (xs->datalen == 0) { rq->req_seg_count = 1; - rq->req_flags |= REQFLAG_DATA_IN; return (0); } - if (rq->req_handle >= RQUEST_QUEUE_LEN) { + if (rq->req_handle > RQUEST_QUEUE_LEN(isp) || + rq->req_handle < 1) { panic("%s: bad handle (%d) in isp_sbus_dmasetup\n", isp->isp_name, rq->req_handle); /* NOTREACHED */ @@ -285,11 +292,11 @@ isp_sbus_dmasetup(isp, xs, rq, iptrp, optr) kdvma = (vm_offset_t) xs->data; } - if (sbc->sbus_kdma_allocs[rq->req_handle] != (vm_offset_t) 0) { + if (sbc->sbus_kdma_allocs[rq->req_handle - 1] != (vm_offset_t) 0) { panic("%s: kdma handle already allocated\n", isp->isp_name); /* NOTREACHED */ } - sbc->sbus_kdma_allocs[rq->req_handle] = kdvma; + sbc->sbus_kdma_allocs[rq->req_handle - 1] = kdvma; if (xs->flags & SCSI_DATA_IN) { rq->req_flags |= REQFLAG_DATA_IN; } else { @@ -314,7 +321,7 @@ isp_sbus_dmateardown(isp, xs, handle) cpuinfo.cache_flush(xs->data, xs->datalen - xs->resid); } - if (handle >= RQUEST_QUEUE_LEN) { + if (handle >= RQUEST_QUEUE_LEN(isp)) { panic("%s: bad handle (%d) in isp_sbus_dmateardown\n", isp->isp_name, handle); /* NOTREACHED */ diff --git a/sys/arch/sparc/dev/kbd.c b/sys/arch/sparc/dev/kbd.c index 9bf291e0a43..b1914a7b09b 100644 --- a/sys/arch/sparc/dev/kbd.c +++ b/sys/arch/sparc/dev/kbd.c @@ -1,5 +1,5 @@ -/* $OpenBSD: kbd.c,v 1.6 1997/08/08 08:25:16 downsj Exp $ */ -/* $NetBSD: kbd.c,v 1.27 1996/10/13 03:00:01 christos Exp $ */ +/* $OpenBSD: kbd.c,v 1.7 1997/09/17 06:47:10 downsj Exp $ */ +/* $NetBSD: kbd.c,v 1.28 1997/09/13 19:12:18 pk Exp $ */ /* * Copyright (c) 1992, 1993 @@ -288,6 +288,18 @@ kbdattach(kbd) if (ttyoutput(KBD_CMD_RESET, tp) >= 0) panic("kbdattach"); (*tp->t_oproc)(tp); /* get it going */ + + /* + * Wait here for the keyboard initialization to complete + * since subsequent kernel console access (ie. cnget()) + * may cause the PROM to interfere with the device. + */ + if (tsleep((caddr_t)&kbd_softc.k_state, + PZERO | PCATCH, devopn, hz) != 0) { + /* no response */ + printf("kbd: reset failed\n"); + kbd_reset(&kbd_softc.k_state); + } } } @@ -296,11 +308,9 @@ kbd_reset(ks) register struct kbd_state *ks; { /* - * On first identification, wake up anyone waiting for type - * and set up the table pointers. + * On first identification, set up the table pointers. */ if (ks->kbd_unshifted == NULL) { - wakeup((caddr_t)ks); ks->kbd_unshifted = kbd_unshifted; ks->kbd_shifted = kbd_shifted; ks->kbd_cur = ks->kbd_unshifted; @@ -447,7 +457,8 @@ kbd_rint(c) /* Arrange to get keyboard layout as well */ (void)ttyoutput(KBD_CMD_GLAYOUT, k->k_kbd); (*k->k_kbd->t_oproc)(k->k_kbd); - } + } else + wakeup((caddr_t)&k->k_state); return; } @@ -455,6 +466,10 @@ kbd_rint(c) if (k->k_state.kbd_pending == KBD_LAYOUT) { k->k_state.kbd_pending = 0; k->k_state.kbd_layout = c; + /* + * Wake up anyone waiting for type. + */ + wakeup((caddr_t)&k->k_state); return; } diff --git a/sys/arch/sparc/dev/sbusreg.h b/sys/arch/sparc/dev/sbusreg.h index 3455f5eb366..25e630e4862 100644 --- a/sys/arch/sparc/dev/sbusreg.h +++ b/sys/arch/sparc/dev/sbusreg.h @@ -1,5 +1,5 @@ -/* $OpenBSD: sbusreg.h,v 1.2 1997/08/08 08:25:27 downsj Exp $ */ -/* $NetBSD: sbusreg.h,v 1.2 1994/11/20 20:52:26 deraadt Exp $ */ +/* $OpenBSD: sbusreg.h,v 1.3 1997/09/17 06:47:11 downsj Exp $ */ +/* $NetBSD: sbusreg.h,v 1.3 1997/09/14 19:17:25 pk Exp $ */ /* * Copyright (c) 1992, 1993 @@ -60,3 +60,14 @@ #define SBUS_ABS(a) ((unsigned)(a) >= SBUS_BASE) #define SBUS_ABS_TO_SLOT(a) (((a) - SBUS_BASE) >> 25) #define SBUS_ABS_TO_OFFSET(a) (((a) - SBUS_BASE) & 0x1ffffff) + +struct sbusreg { + u_int32_t sbus_afsr; /* M-to-S Asynchronous Fault Status */ + u_int32_t sbus_afar; /* M-to-S Asynchronous Fault Address */ + u_int32_t sbus_arbiter; /* Arbiter Enable */ + u_int32_t sbus_reserved1; + +#define NSBUSCFG 20 + /* Actual number dependent on machine model */ + u_int32_t sbus_sbuscfg[NSBUSCFG]; /* Sbus configuration control */ +}; diff --git a/sys/arch/sparc/dev/si.c b/sys/arch/sparc/dev/si.c index a96caafb133..26238e8442d 100644 --- a/sys/arch/sparc/dev/si.c +++ b/sys/arch/sparc/dev/si.c @@ -1,5 +1,5 @@ -/* $OpenBSD: si.c,v 1.10 1997/08/08 08:25:29 downsj Exp $ */ -/* $NetBSD: si.c,v 1.37 1997/07/29 09:58:13 fair Exp $ */ +/* $OpenBSD: si.c,v 1.11 1997/09/17 06:47:11 downsj Exp $ */ +/* $NetBSD: si.c,v 1.38 1997/08/27 11:24:20 bouyer Exp $ */ /*- * Copyright (c) 1996 The NetBSD Foundation, Inc. diff --git a/sys/arch/sparc/dev/zs.c b/sys/arch/sparc/dev/zs.c index 2361c3ea61e..96e095c2854 100644 --- a/sys/arch/sparc/dev/zs.c +++ b/sys/arch/sparc/dev/zs.c @@ -1,5 +1,5 @@ -/* $OpenBSD: zs.c,v 1.16 1997/08/25 08:38:45 downsj Exp $ */ -/* $NetBSD: zs.c,v 1.48 1997/07/29 09:58:18 fair Exp $ */ +/* $OpenBSD: zs.c,v 1.17 1997/09/17 06:47:12 downsj Exp $ */ +/* $NetBSD: zs.c,v 1.49 1997/08/31 21:26:37 pk Exp $ */ /* * Copyright (c) 1992, 1993 @@ -80,6 +80,7 @@ #include <sparc/dev/zsvar.h> #ifdef KGDB +#include <sys/kgdb.h> #include <machine/remote-sl.h> #endif @@ -171,7 +172,7 @@ static int zsrint __P((struct zs_chanstate *, volatile struct zschan *)); static int zsxint __P((struct zs_chanstate *, volatile struct zschan *)); static int zssint __P((struct zs_chanstate *, volatile struct zschan *)); -void zsabort __P((void)); +void zsabort __P((int)); static void zsoverrun __P((int, long *, char *)); static volatile struct zsdevice *zsaddr[NZS]; /* XXX, but saves work */ @@ -902,7 +903,7 @@ zsrint(cs, zc) else if (c == (KBD_L1|KBD_UP)) conk->conk_l1 = 0; /* L1 went up */ else if (c == KBD_A && conk->conk_l1) { - zsabort(); + zsabort(cs->cs_unit); conk->conk_l1 = 0; /* we never see the up */ goto clearit; /* eat the A after L1-A */ } @@ -1006,17 +1007,20 @@ zssint(cs, zc) while (zc->zc_csr & ZSRR0_BREAK) ZS_DELAY(); } - zsabort(); + zsabort(cs->cs_unit); return (0); } return (ZRING_MAKE(ZRING_SINT, rr0)); } void -zsabort() +zsabort(unit) + int unit; { -#ifdef DDB +#if defined(KGDB) + zskgdb(unit); +#elif defined(DDB) Debugger(); #else printf("stopping on keyboard abort\n"); |