Home | History | Annotate | Line # | Download | only in marvell
gtmpsc.c revision 1.1
      1 /*	$NetBSD: gtmpsc.c,v 1.1 2003/03/05 22:08:21 matt Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 2002 Allegro Networks, Inc., Wasabi Systems, Inc.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  * 3. All advertising materials mentioning features or use of this software
     16  *    must display the following acknowledgement:
     17  *      This product includes software developed for the NetBSD Project by
     18  *      Allegro Networks, Inc., and Wasabi Systems, Inc.
     19  * 4. The name of Allegro Networks, Inc. may not be used to endorse
     20  *    or promote products derived from this software without specific prior
     21  *    written permission.
     22  * 5. The name of Wasabi Systems, Inc. may not be used to endorse
     23  *    or promote products derived from this software without specific prior
     24  *    written permission.
     25  *
     26  * THIS SOFTWARE IS PROVIDED BY ALLEGRO NETWORKS, INC. AND
     27  * WASABI SYSTEMS, INC. ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
     28  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
     29  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     30  * IN NO EVENT SHALL EITHER ALLEGRO NETWORKS, INC. OR WASABI SYSTEMS, INC.
     31  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     33  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     34  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     35  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     36  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     37  * POSSIBILITY OF SUCH DAMAGE.
     38  */
     39 
     40 /*
     41  * mpsc.c - MPSC serial driver, supports UART mode only
     42  *
     43  *
     44  * creation	Mon Apr  9 19:40:15 PDT 2001	cliff
     45  */
     46 
     47 #include "opt_kgdb.h"
     48 
     49 #include <sys/param.h>
     50 #include <sys/conf.h>
     51 #include <sys/device.h>
     52 #include <sys/proc.h>
     53 #include <sys/systm.h>
     54 #include <sys/tty.h>
     55 #include <sys/callout.h>
     56 #include <sys/fcntl.h>
     57 #ifdef KGDB
     58 #include <sys/kernel.h>
     59 #include <sys/kgdb.h>
     60 #endif
     61 #include <powerpc/atomic.h>
     62 #include <dev/cons.h>
     63 #include <machine/bus.h>
     64 #include <machine/cpu.h>		/* for DELAY */
     65 #include <machine/stdarg.h>
     66 #include "gtmpsc.h"
     67 
     68 
     69 #include <dev/marvell/gtreg.h>
     70 #include <dev/marvell/gtvar.h>
     71 #include <dev/marvell/gtintrreg.h>
     72 #include <dev/marvell/gtmpscreg.h>
     73 #include <dev/marvell/gtsdmareg.h>
     74 #include <dev/marvell/gtmpscvar.h>
     75 #include <dev/marvell/gtbrgreg.h>
     76 
     77 /*
     78  * XXX these delays were derived empiracaly
     79  */
     80 #define GTMPSC_POLL_DELAY	1	/* 1 usec */
     81 #define GTMPSC_RESET_DELAY	100	/* 100 usec */
     82 
     83 #define BURSTLEN 128
     84 
     85 /*
     86  * stat values for gtmpsc_common_pollc
     87  */
     88 #define GTMPSC_STAT_NONE	0
     89 #define GTMPSC_STAT_BREAK	1
     90 
     91 
     92 #define PRINTF(x)	gtmpsc_mem_printf x
     93 
     94 #if defined(DEBUG)
     95 unsigned int mpscdebug = 0;
     96 # define STATIC
     97 # define DPRINTF(x)	do { if (mpscdebug) gtmpsc_mem_printf x ; } while (0)
     98 #else
     99 # define STATIC static
    100 # define DPRINTF(x)
    101 #endif
    102 
    103 #define GTMPSCUNIT_MASK    0x7ffff
    104 #define GTMPSCDIALOUT_MASK 0x80000
    105 
    106 #define GTMPSCUNIT(x)      (minor(x) & GTMPSCUNIT_MASK)
    107 #define GTMPSCDIALOUT(x)   (minor(x) & GTMPSCDIALOUT_MASK)
    108 
    109 STATIC void gtmpscinit __P((struct gtmpsc_softc *));
    110 STATIC int  gtmpscmatch __P((struct device *, struct cfdata *, void *));
    111 STATIC void gtmpscattach __P((struct device *, struct device *, void *));
    112 STATIC int  compute_cdv __P((unsigned int));
    113 STATIC void gtmpsc_loadchannelregs __P((struct gtmpsc_softc *));
    114 STATIC void gtmpscshutdown __P((struct gtmpsc_softc *));
    115 STATIC void gtmpscstart __P((struct tty *));
    116 STATIC int  gtmpscparam __P((struct tty *, struct termios *));
    117 STATIC int  gtmpsc_probe __P((void));
    118 STATIC int  gtmpsc_intr __P((void *));
    119 STATIC int  gtmpsc_softintr(void *);
    120 
    121 STATIC void gtmpsc_common_putn __P((struct gtmpsc_softc *));
    122 STATIC void gtmpsc_common_putc __P((unsigned int, unsigned char));
    123 STATIC int  gtmpsc_common_getc __P((unsigned int));
    124 STATIC int  gtmpsc_common_pollc __P((unsigned int, char *, int *));
    125 STATIC void gtmpsc_poll __P((void *));
    126 #ifdef KGDB
    127 STATIC void gtmpsc_kgdb_poll __P((void *));
    128 #endif
    129 STATIC void gtmpsc_mem_printf __P((const char *, ...));
    130 
    131 STATIC void gtmpsc_txdesc_init(gtmpsc_poll_sdma_t *, gtmpsc_poll_sdma_t *);
    132 STATIC void gtmpsc_rxdesc_init(gtmpsc_poll_sdma_t *, gtmpsc_poll_sdma_t *);
    133 STATIC unsigned int gtmpsc_get_causes(void);
    134 STATIC void gtmpsc_hackinit(struct gtmpsc_softc *);
    135 STATIC void gtmpscinit_stop(struct gtmpsc_softc *, int);
    136 STATIC void gtmpscinit_start(struct gtmpsc_softc *, int);
    137 void gtmpsc_printf(const char *fmt, ...);
    138 void gtmpsc_puts(char *);
    139 
    140 void gtmpsccnprobe __P((struct consdev *));
    141 void gtmpsccninit __P((struct consdev *));
    142 int  gtmpsccngetc __P((dev_t));
    143 void gtmpsccnputc __P((dev_t, int));
    144 void gtmpsccnpollc __P((dev_t, int));
    145 void gtmpsccnhalt __P((dev_t));
    146 
    147 STATIC void gtmpsc_txflush __P((gtmpsc_softc_t *));
    148 STATIC void gtmpsc_iflush __P((gtmpsc_softc_t *));
    149 STATIC void gtmpsc_shutdownhook __P((void *));
    150 
    151 dev_type_open(gtmpscopen);
    152 dev_type_close(gtmpscclose);
    153 dev_type_read(gtmpscread);
    154 dev_type_write(gtmpscwrite);
    155 dev_type_ioctl(gtmpscioctl);
    156 dev_type_stop(gtmpscstop);
    157 dev_type_tty(gtmpsctty);
    158 dev_type_poll(gtmpscpoll);
    159 
    160 const struct cdevsw gtmpsc_cdevsw = {
    161 	gtmpscopen, gtmpscclose, gtmpscread, gtmpscwrite, gtmpscioctl,
    162 	gtmpscstop, gtmpsctty, gtmpscpoll, nommap, ttykqfilter, D_TTY
    163 };
    164 
    165 CFATTACH_DECL(gtmpsc, sizeof(struct gtmpsc_softc),
    166     gtmpscmatch, gtmpscattach, NULL, NULL);
    167 
    168 extern struct cfdriver gtmpsc_cd;
    169 
    170 #if 0
    171 struct consdev consdev_mpsc = {
    172 	gtmpsccnprobe,
    173 	gtmpsccninit,
    174 	gtmpsccngetc,
    175 	gtmpsccnputc,
    176 	gtmpsccnpollc,
    177 	NULL,
    178 	NULL,		/* cn_flush */
    179 	gtmpsccnhalt,
    180 };
    181 #endif
    182 
    183 STATIC int gtmpsc_nattached = 0;
    184 STATIC void *gtmpsc_sdma_ih = NULL;
    185 STATIC void *gtmpsc_soft_ih = NULL;
    186 
    187 gtmpsc_softc_t *gtmpsc_scp[GTMPSC_NCHAN] = { 0 };
    188 
    189 STATIC int gt_reva_gtmpsc_bug;
    190 unsigned int sdma_imask;        /* soft copy of SDMA IMASK reg */
    191 
    192 #ifdef KGDB
    193 #include <sys/kgdb.h>
    194 
    195 static int gtmpsc_kgdb_addr;
    196 static int gtmpsc_kgdb_attached;
    197 
    198 int kgdb_break_immediate /* = 0 */ ;
    199 
    200 STATIC int      gtmpsc_kgdb_getc __P((void *));
    201 STATIC void     gtmpsc_kgdb_putc __P((void *, int));
    202 #endif /* KGDB */
    203 
    204 /*
    205  * hacks for console initialization
    206  * which happens prior to autoconfig "attach"
    207  */
    208 STATIC unsigned int gtmpsccninit_done = 0;
    209 STATIC gtmpsc_softc_t gtmpsc_fake_softc;
    210 STATIC unsigned char gtmpsc_earlybuf[NBPG] __attribute__ ((aligned(NBPG)));
    211 STATIC unsigned char gtmpsc_fake_dmapage[NBPG] __attribute__ ((aligned(NBPG)));
    212 
    213 
    214 #define GTMPSC_PRINT_BUF_SIZE	4096
    215 STATIC unsigned char gtmpsc_print_buf[GTMPSC_PRINT_BUF_SIZE] = { 0 };
    216 
    217 unsigned int gtmpsc_poll_putc_cnt = 0;
    218 unsigned int gtmpsc_poll_putn_cnt = 0;
    219 unsigned int gtmpsc_poll_getc_cnt = 0;
    220 unsigned int gtmpsc_poll_pollc_cnt = 0;
    221 unsigned int gtmpsc_poll_putc_miss = 0;
    222 unsigned int gtmpsc_poll_putn_miss = 0;
    223 unsigned int gtmpsc_poll_getc_miss = 0;
    224 unsigned int gtmpsc_poll_pollc_miss = 0;
    225 
    226 
    227 #ifndef SDMA_COHERENT
    228 /*
    229  * inlines to flush, invalidate cache
    230  * required if DMA cache coherency is broken
    231  * note that pointer `p' args are assumed to be cache aligned
    232  * and the size is assumed to be one CACHELINESIZE block
    233  */
    234 
    235 #define GTMPSC_CACHE_FLUSH(p)		gtmpsc_cache_flush(p)
    236 #define GTMPSC_CACHE_INVALIDATE(p)	gtmpsc_cache_invalidate(p)
    237 
    238 static volatile inline void
    239 gtmpsc_cache_flush(void *p)
    240 {
    241 	__asm __volatile ("eieio; dcbf 0,%0; lwz %0,0(%0); sync;"
    242 					: "+r"(p):);
    243 }
    244 
    245 static volatile inline void
    246 gtmpsc_cache_invalidate(void *p)
    247 {
    248 	__asm __volatile ("eieio; dcbi 0,%0; sync;" :: "r"(p));
    249 }
    250 #else
    251 
    252 #define GTMPSC_CACHE_FLUSH(p)
    253 #define GTMPSC_CACHE_INVALIDATE(p)
    254 
    255 #endif	/* SDMA_COHERENT */
    256 
    257 
    258 extern unsigned int gtbase;
    259 
    260 #define GT_READ(d,a) \
    261 	gtmpsc_reg_read(gtbase, (a))
    262 #define GT_WRITE(d,a,v) \
    263 	gtmpsc_reg_write(gtbase,(a),(v))
    264 
    265 
    266 #define SDMA_IMASK_ENABLE(bit)  ({ \
    267 	unsigned int    r; \
    268 	GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_ICAUSE, ~(bit)); \
    269 	if (gt_reva_gtmpsc_bug) \
    270 		r = sdma_imask; \
    271 	else \
    272 		r = GT_READ(sc->gtmpsc_dev.dv_parent, SDMA_IMASK); \
    273 	r |= (bit); \
    274 	sdma_imask = r; \
    275 	GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_IMASK, r); \
    276 })
    277 
    278 #define SDMA_IMASK_DISABLE(bit)  ({ \
    279 	unsigned int    r; \
    280 	if (gt_reva_gtmpsc_bug) \
    281 		r = sdma_imask; \
    282 	else \
    283 		r = GT_READ(sc->gtmpsc_dev.dv_parent, SDMA_IMASK); \
    284 	r &= ~(bit); \
    285 	sdma_imask = r; \
    286 	GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_IMASK, r); \
    287 })
    288 
    289 static volatile inline unsigned int
    290 gtmpsc_reg_read(unsigned int p, unsigned int off)
    291 {
    292 	unsigned int rv;
    293 
    294 #undef GCC_R0_OFF_NOT_BROKEN
    295 #ifdef GCC_R0_OFF_NOT_BROKEN
    296 	asm volatile("lwbrx %0,%1,%2; eieio;"
    297 		: "=r"(rv) : "r"(off), "r"(p));
    298 #else
    299 	asm volatile("lwbrx %0,0,%1; eieio;"
    300 		: "=r"(rv) : "r"(p + off));
    301 #endif
    302 	DPRINTF(("READ 0x%x 0x%x\n", off, rv));
    303 
    304 	return rv;
    305 }
    306 
    307 static volatile inline void
    308 gtmpsc_reg_write(unsigned int p, unsigned int off, unsigned int v)
    309 {
    310 #ifdef GCC_R0_OFF_NOT_BROKEN
    311 	asm volatile("stwbrx %0,%1,%2; eieio;"
    312 		:: "r"(v), "r"(off), "r"(p));
    313 #else
    314 	asm volatile("stwbrx %0,0,%1; eieio;"
    315 		:: "r"(v), "r"(p+off));
    316 #endif
    317 	DPRINTF(("WRITE 0x%x 0x%x\n", off, v));
    318 }
    319 
    320 
    321 
    322 static volatile inline unsigned int
    323 desc_read(unsigned int *ip)
    324 {
    325 	unsigned int rv;
    326 
    327 	asm volatile ("lwzx %0,0,%1; eieio;"
    328 		: "=r"(rv) : "r"(ip));
    329 	return rv;
    330 }
    331 
    332 static volatile inline void
    333 desc_write(unsigned int *ip, unsigned int val)
    334 {
    335 	asm volatile ("stwx %0,0,%1; eieio;"
    336 		:: "r"(val), "r"(ip));
    337 }
    338 
    339 
    340 /*
    341  * gtmpsc_txdesc_init - set up TX descriptor ring
    342  */
    343 STATIC void
    344 gtmpsc_txdesc_init(gtmpsc_poll_sdma_t *vmps, gtmpsc_poll_sdma_t *pmps)
    345 {
    346 	int n;
    347 	sdma_desc_t *dp;
    348 	gtmpsc_polltx_t *vtxp;
    349 	gtmpsc_polltx_t *ptxp;
    350 	gtmpsc_polltx_t *next_ptxp;
    351 	gtmpsc_polltx_t *first_ptxp;
    352 
    353 	first_ptxp = ptxp = &pmps->tx[0];
    354 	vtxp = &vmps->tx[0];
    355 	next_ptxp = ptxp + 1;
    356 	for (n = (GTMPSC_NTXDESC - 1); n--; ) {
    357 		dp = &vtxp->txdesc;
    358 		desc_write(&dp->sdma_csr, 0);
    359 		desc_write(&dp->sdma_cnt, 0);
    360 		desc_write(&dp->sdma_bufp, (u_int32_t)&ptxp->txbuf);
    361 		desc_write(&dp->sdma_next, (u_int32_t)&next_ptxp->txdesc);
    362 		GTMPSC_CACHE_FLUSH(dp);
    363 		vtxp++;
    364 		ptxp++;
    365 		next_ptxp++;
    366 	}
    367 	dp = &vtxp->txdesc;
    368 	desc_write(&dp->sdma_csr, 0);
    369 	desc_write(&dp->sdma_cnt, 0);
    370 	desc_write(&dp->sdma_bufp, (u_int32_t)&ptxp->txbuf);
    371 	desc_write(&dp->sdma_next, (u_int32_t)&first_ptxp->txdesc);
    372 	GTMPSC_CACHE_FLUSH(dp);
    373 }
    374 
    375 /*
    376  * gtmpsc_rxdesc_init - set up RX descriptor ring
    377  */
    378 STATIC void
    379 gtmpsc_rxdesc_init(gtmpsc_poll_sdma_t *vmps, gtmpsc_poll_sdma_t *pmps)
    380 {
    381 	int n;
    382 	sdma_desc_t *dp;
    383 	gtmpsc_pollrx_t *vrxp;
    384 	gtmpsc_pollrx_t *prxp;
    385 	gtmpsc_pollrx_t *next_prxp;
    386 	gtmpsc_pollrx_t *first_prxp;
    387 	unsigned int csr;
    388 
    389 	csr = SDMA_CSR_RX_L|SDMA_CSR_RX_F|SDMA_CSR_RX_OWN|SDMA_CSR_RX_EI;
    390 	first_prxp = prxp = &pmps->rx[0];
    391 	vrxp = &vmps->rx[0];
    392 	next_prxp = prxp + 1;
    393 	for (n = (GTMPSC_NRXDESC - 1); n--; ) {
    394 		dp = &vrxp->rxdesc;
    395 		desc_write(&dp->sdma_csr, csr);
    396 		desc_write(&dp->sdma_cnt,
    397 			GTMPSC_RXBUFSZ << SDMA_RX_CNT_BUFSZ_SHIFT);
    398 		desc_write(&dp->sdma_bufp, (u_int32_t)&prxp->rxbuf);
    399 		desc_write(&dp->sdma_next, (u_int32_t)&next_prxp->rxdesc);
    400 		GTMPSC_CACHE_FLUSH(dp);
    401 		vrxp++;
    402 		prxp++;
    403 		next_prxp++;
    404 	}
    405 	dp = &vrxp->rxdesc;
    406 	desc_write(&dp->sdma_csr, SDMA_CSR_RX_OWN);
    407 	desc_write(&dp->sdma_cnt,
    408 		GTMPSC_RXBUFSZ << SDMA_RX_CNT_BUFSZ_SHIFT);
    409 	desc_write(&dp->sdma_bufp, (u_int32_t)&prxp->rxbuf);
    410 	desc_write(&dp->sdma_next, (u_int32_t)&first_prxp->rxdesc);
    411 	GTMPSC_CACHE_FLUSH(dp);
    412 }
    413 
    414 /*
    415  * Compute the BRG countdown value (CDV in BRG_BCR)
    416  */
    417 
    418 STATIC int
    419 compute_cdv(unsigned int baud)
    420 {
    421 	unsigned int    cdv;
    422 
    423 	if (baud == 0)
    424 		return 0;
    425 	cdv = (BRG_DEFAULT_INPUT_RATE / (baud * GTMPSC_CLOCK_DIVIDER) + 1) / 2 - 1;
    426 	if (cdv > BRG_BCR_CDV_MAX)
    427 		return -1;
    428 	return cdv;
    429 }
    430 
    431 STATIC void
    432 gtmpsc_loadchannelregs(struct gtmpsc_softc *sc)
    433 {
    434 	u_int   brg_bcr;
    435 	u_int   unit;
    436 
    437 	unit = sc->gtmpsc_unit;
    438 	brg_bcr = unit ? BRG_BCR1 : BRG_BCR0;
    439 
    440 	GT_WRITE(sc->gtmpsc_dev.dv_parent, brg_bcr, sc->gtmpsc_brg_bcr);
    441 	GT_WRITE(sc->gtmpsc_dev.dv_parent, GTMPSC_U_CHRN(unit, 3), sc->gtmpsc_chr3);
    442 }
    443 
    444 STATIC int
    445 gtmpscmatch(struct device *parent, struct cfdata *self, void *aux)
    446 {
    447 	struct gt_attach_args *ga = aux;
    448 
    449 	if (gtmpsc_nattached >= GTMPSC_NCHAN) {
    450 		return 0;
    451 	}
    452 
    453 	if (strcmp(ga->ga_name, gtmpsc_cd.cd_name) != 0) {
    454 		return 0;
    455 	}
    456 
    457 	return 1;
    458 }
    459 
    460 STATIC void
    461 gtmpscattach(struct device *parent, struct device *self, void *aux)
    462 {
    463 	struct gt_attach_args *ga = aux;
    464 	struct gt_softc *gt = (struct gt_softc *) parent;
    465 	struct gtmpsc_softc *sc = (struct gtmpsc_softc *) self;
    466 	gtmpsc_poll_sdma_t *vmps;
    467 	gtmpsc_poll_sdma_t *pmps;
    468 	struct tty *tp;
    469 	caddr_t kva;
    470 	int rsegs;
    471 	int err;
    472 	int s;
    473 
    474 	DPRINTF(("mpscattach\n"));
    475 	if (ga->ga_unit >= GTMPSC_NCHAN)
    476 		return;
    477 
    478 	s = splhigh();
    479 
    480 	sc->gtmpsc_gt = gt;
    481 	sc->gtmpsc_memt = ga->ga_memt;
    482 	sc->gtmpsc_dmat = ga->ga_dmat;
    483 	sc->gtmpsc_unit = ga->ga_unit;
    484 
    485 	printf(", SDMA");
    486 	err = bus_dmamem_alloc(sc->gtmpsc_dmat, NBPG, NBPG, NBPG,
    487 		sc->gtmpsc_dma_segs, 1, &rsegs,
    488 		BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW);
    489 	if (err) {
    490 		PRINTF(("mpscattach: bus_dmamem_alloc error 0x%x\n", err));
    491 		splx(s);
    492 		return;
    493 	}
    494 #ifndef SDMA_COHERENT
    495 	err = bus_dmamem_map(sc->gtmpsc_dmat, sc->gtmpsc_dma_segs, 1, NBPG,
    496 		&kva, BUS_DMA_NOWAIT);
    497 #else
    498 	err = bus_dmamem_map(sc->gtmpsc_dmat, sc->gtmpsc_dma_segs, 1, NBPG,
    499 		&kva, BUS_DMA_NOWAIT|BUS_DMA_COHERENT);
    500 #endif
    501 	if (err) {
    502 		PRINTF(("mpscattach: bus_dmamem_map error 0x%x\n", err));
    503 		splx(s);
    504 		return;
    505 	}
    506 
    507 	bzero(kva, NBPG);	/* paranoid/superfluous */
    508 
    509 	vmps = (gtmpsc_poll_sdma_t *)kva;				    /* KVA */
    510 	pmps = (gtmpsc_poll_sdma_t *)sc->gtmpsc_dma_segs[0].ds_addr;    /* PA */
    511 #ifdef DEBUG
    512 	printf(" at %p/%p", vmps, pmps);
    513 #endif
    514 	gtmpsc_txdesc_init(vmps, pmps);
    515 	gtmpsc_rxdesc_init(vmps, pmps);
    516 	sc->gtmpsc_poll_sdmapage = vmps;
    517 
    518 	if (gtmpsc_scp[sc->gtmpsc_unit] != NULL)
    519 		gtmpsc_txflush(gtmpsc_scp[sc->gtmpsc_unit]);
    520 
    521 	sc->gtmpsc_tty = tp = ttymalloc();
    522 	tp->t_oproc = gtmpscstart;
    523 	tp->t_param = gtmpscparam;
    524 	tty_attach(tp);
    525 
    526 	gtmpsc_nattached++;
    527 	gtmpscinit(sc);
    528 
    529 	gtmpsc_scp[sc->gtmpsc_unit] = sc;
    530 
    531 	if (gtmpsc_nattached == 1) {
    532 		void *ih;
    533 
    534 		KASSERT(gtmpsc_sdma_ih == NULL);
    535 		ih = intr_establish(IRQ_SDMA, IST_LEVEL, IPL_SERIAL,
    536 			gtmpsc_intr, &sc);
    537 		if (ih == NULL)
    538 			panic("mpscattach: cannot intr_establish IRQ_SDMA");
    539 		gtmpsc_sdma_ih = ih;
    540 
    541 		KASSERT(gtmpsc_soft_ih == NULL);
    542 		ih = intr_establish(SIR_SERIAL, IST_SOFT, IPL_SOFTSERIAL,
    543 			gtmpsc_softintr, NULL);
    544 		if (ih == NULL)
    545 			panic("mpscattach: cannot intr_establish SIR_SERIAL");
    546 		gtmpsc_soft_ih = ih;
    547 	}
    548 	printf(" irqs %d, %d", IRQ_SDMA, SIR_SERIAL);
    549 
    550 	shutdownhook_establish(gtmpsc_shutdownhook, sc);
    551 
    552 #ifdef DDB
    553 	if (sc->gtmpsc_unit == 0)
    554 		SDMA_IMASK_ENABLE(SDMA_INTR_RXBUF(sc->gtmpsc_unit));
    555 #endif	/* DDB */
    556 
    557 	printf("%s\n", (gt_reva_gtmpsc_bug) ? " [Rev A. bug]" : "");
    558 
    559 	splx(s);
    560 #ifdef KGDB
    561 	/*
    562 	 * Allow kgdb to "take over" this port.  If this is
    563 	 * the kgdb device, it has exclusive use.
    564 	 */
    565 	if (sc->gtmpsc_unit == comkgdbport) {
    566 		if (comkgdbport == 0) { /* FIXME */
    567 			printf("%s(kgdb): cannot share with console\n",
    568 				sc->gtmpsc_dev.dv_xname);
    569 			return;
    570 		}
    571 
    572 		sc->gtmpsc_flags |= GTMPSCF_KGDB;
    573 		printf("%s: kgdb\n", sc->gtmpsc_dev.dv_xname);
    574 		gtmpsc_txflush(gtmpsc_scp[0]);
    575 		kgdb_attach(gtmpsc_kgdb_getc, gtmpsc_kgdb_putc, NULL);
    576 		kgdb_dev = 123; /* unneeded, only to satisfy some tests */
    577 		gtmpsc_kgdb_attached = 1;
    578 		SDMA_IMASK_ENABLE(SDMA_INTR_RXBUF(sc->gtmpsc_unit));
    579 		kgdb_connect(1);
    580 	}
    581 #endif /* KGDB */
    582 
    583 }
    584 
    585 STATIC void
    586 gtmpscshutdown(struct gtmpsc_softc *sc)
    587 {
    588 	struct tty *tp;
    589 	int     s;
    590 
    591 #ifdef KGDB
    592 	if (sc->gtmpsc_flags & GTMPSCF_KGDB != 0)
    593 		return;
    594 #endif
    595 	tp = sc->gtmpsc_tty;
    596 	s = splserial();
    597 	/* Fake carrier off */
    598 	(void) (*tp->t_linesw->l_modem)(tp, 0);
    599 	SDMA_IMASK_DISABLE(SDMA_INTR_RXBUF(sc->gtmpsc_unit));
    600 	splx(s);
    601 }
    602 
    603 int
    604 gtmpscopen(dev_t dev, int flag, int mode, struct proc *p)
    605 {
    606 	struct gtmpsc_softc *sc;
    607 	int unit = GTMPSCUNIT(dev);
    608 	struct tty *tp;
    609 	int s;
    610 	int s2;
    611 	int error;
    612 
    613 	if (unit >= gtmpsc_cd.cd_ndevs)
    614 		return ENXIO;
    615 	sc = gtmpsc_cd.cd_devs[unit];
    616 	if (!sc)
    617 		return ENXIO;
    618 #ifdef KGDB
    619 	/*
    620 	 * If this is the kgdb port, no other use is permitted.
    621 	 */
    622 	if (sc->gtmpsc_flags & GTMPSCF_KGDB != 0)
    623 		return (EBUSY);
    624 #endif
    625 	tp = sc->gtmpsc_tty;
    626 	if (ISSET(tp->t_state, TS_ISOPEN) &&
    627 	    ISSET(tp->t_state, TS_XCLUDE) &&
    628 	    p->p_ucred->cr_uid != 0)
    629 		return (EBUSY);
    630 
    631 	s = spltty();
    632 
    633 	if (!(tp->t_state & TS_ISOPEN)) {
    634 		struct termios t;
    635 
    636 		tp->t_dev = dev;
    637 		s2 = splserial();
    638 		SDMA_IMASK_ENABLE(SDMA_INTR_RXBUF(unit));
    639 		splx(s2);
    640 		t.c_ispeed = 0;
    641 #if 0
    642 		t.c_ospeed = TTYDEF_SPEED;
    643 #else
    644 		t.c_ospeed = GT_MPSC_DEFAULT_BAUD_RATE;
    645 #endif
    646 		t.c_cflag = TTYDEF_CFLAG;
    647 		/* Make sure gtmpscparam() will do something. */
    648 		tp->t_ospeed = 0;
    649 		(void) gtmpscparam(tp, &t);
    650 		tp->t_iflag = TTYDEF_IFLAG;
    651 		tp->t_oflag = TTYDEF_OFLAG;
    652 		tp->t_lflag = TTYDEF_LFLAG;
    653 		ttychars(tp);
    654 		ttsetwater(tp);
    655 		s2 = splserial();
    656 		/* Clear the input ring */
    657 		sc->gtmpsc_rxfifo_putix = 0;
    658 		sc->gtmpsc_rxfifo_getix = 0;
    659 		sc->gtmpsc_rxfifo_navail = GTMPSC_RXFIFOSZ;
    660 		gtmpsc_iflush(sc);
    661 		splx(s2);
    662 	}
    663 	splx(s);
    664 	error = ttyopen(tp, GTMPSCDIALOUT(dev), ISSET(flag, O_NONBLOCK));
    665 	if (error)
    666 		goto bad;
    667 
    668 	error = (*tp->t_linesw->l_open)(dev, tp);
    669 	if (error)
    670 		goto bad;
    671 
    672 	return (0);
    673 
    674 bad:
    675 	if (!ISSET(tp->t_state, TS_ISOPEN) && tp->t_wopen == 0) {
    676 		/*
    677 		 * We failed to open the device, and nobody else had it opened.
    678 		 * Clean up the state as appropriate.
    679 		 */
    680 		gtmpscshutdown(sc);
    681 	}
    682 
    683 	return (error);
    684 }
    685 
    686 int
    687 gtmpscclose(dev_t dev, int flag, int mode, struct proc *p)
    688 {
    689 	int unit = GTMPSCUNIT(dev);
    690 	struct gtmpsc_softc *sc = gtmpsc_cd.cd_devs[unit];
    691 	struct tty *tp = sc->gtmpsc_tty;
    692 	int s;
    693 
    694 	s = splserial();
    695 	if (!ISSET(tp->t_state, TS_ISOPEN)) {
    696 		splx(s);
    697 		return (0);
    698 	}
    699 
    700 	(*tp->t_linesw->l_close)(tp, flag);
    701 	ttyclose(tp);
    702 	if (!ISSET(tp->t_state, TS_ISOPEN) && tp->t_wopen == 0) {
    703 		/*
    704 		 * Although we got a last close, the device may still be in
    705 		 * use; e.g. if this was the dialout node, and there are still
    706 		 * processes waiting for carrier on the non-dialout node.
    707 		 */
    708 		gtmpscshutdown(sc);
    709 	}
    710 
    711 	splx(s);
    712 	return (0);
    713 }
    714 
    715 int
    716 gtmpscread(dev_t dev, struct uio *uio, int flag)
    717 {
    718 	struct gtmpsc_softc *sc = gtmpsc_cd.cd_devs[GTMPSCUNIT(dev)];
    719 	struct tty *tp = sc->gtmpsc_tty;
    720 
    721 	return (*tp->t_linesw->l_read)(tp, uio, flag);
    722 }
    723 
    724 int
    725 gtmpscwrite(dev_t dev, struct uio *uio, int flag)
    726 {
    727 	struct gtmpsc_softc *sc = gtmpsc_cd.cd_devs[GTMPSCUNIT(dev)];
    728 	struct tty *tp = sc->gtmpsc_tty;
    729 
    730 	return (*tp->t_linesw->l_write)(tp, uio, flag);
    731 }
    732 
    733 int
    734 gtmpscpoll(dev_t dev, int events, struct proc *p)
    735 {
    736 	struct gtmpsc_softc *sc = gtmpsc_cd.cd_devs[GTMPSCUNIT(dev)];
    737 	struct tty *tp = sc->gtmpsc_tty;
    738 
    739 	return ((*tp->t_linesw->l_poll)(tp, events, p));
    740 }
    741 
    742 int
    743 gtmpscioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
    744 {
    745 	struct gtmpsc_softc *sc = gtmpsc_cd.cd_devs[GTMPSCUNIT(dev)];
    746 	struct tty *tp = sc->gtmpsc_tty;
    747 	int error;
    748 
    749 	if ((error = (*tp->t_linesw->l_ioctl)(tp, cmd, data, flag, p)) >= 0)
    750 		return error;
    751 	if ((error = ttioctl(tp, cmd, data, flag, p)) >= 0)
    752 		return error;
    753 	return ENOTTY;
    754 }
    755 
    756 struct tty *
    757 gtmpsctty(dev_t dev)
    758 {
    759 	struct gtmpsc_softc *sc = gtmpsc_cd.cd_devs[GTMPSCUNIT(dev)];
    760 
    761 	return sc->gtmpsc_tty;
    762 }
    763 
    764 void
    765 gtmpscstop(struct tty *tp, int flag)
    766 {
    767 }
    768 
    769 STATIC void
    770 gtmpscstart(struct tty *tp)
    771 {
    772 	struct gtmpsc_softc       *sc;
    773 	unsigned char *tba;
    774 	unsigned int unit;
    775 	int s, s2, tbc;
    776 
    777 	unit = GTMPSCUNIT(tp->t_dev);
    778 	if (unit >= GTMPSC_NCHAN)
    779 		return;
    780 	sc = gtmpsc_scp[unit];
    781 	if (sc == NULL)
    782 		return;
    783 
    784 	s = spltty();
    785 	if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP))
    786 		goto out;
    787 	if (sc->sc_tx_stopped)
    788 		goto out;
    789 	if (tp->t_outq.c_cc <= tp->t_lowat) {
    790 		if ((tp->t_state & TS_ASLEEP) != 0) {
    791 			tp->t_state &= ~TS_ASLEEP;
    792 			wakeup(&tp->t_outq);
    793 		}
    794 		selwakeup(&tp->t_wsel);
    795 		if (tp->t_outq.c_cc == 0)
    796 			goto out;
    797 	}
    798 
    799 	/* Grab the first contiguous region of buffer space. */
    800 	tba = tp->t_outq.c_cf;
    801 	tbc = ndqb(&tp->t_outq, 0);
    802 
    803 	s2 = splserial();
    804 
    805 	sc->sc_tba = tba;
    806 	sc->sc_tbc = tbc;
    807 	sc->cnt_tx_from_ldisc += tbc;
    808 	SDMA_IMASK_ENABLE(SDMA_INTR_TXBUF(unit));
    809 	tp->t_state |= TS_BUSY;
    810 	sc->sc_tx_busy = 1;
    811 	gtmpsc_common_putn(sc);
    812 
    813 	splx(s2);
    814 out:
    815 	splx(s);
    816 }
    817 
    818 STATIC int
    819 gtmpscparam(struct tty *tp, struct termios *t)
    820 {
    821 	struct gtmpsc_softc *sc = gtmpsc_cd.cd_devs[GTMPSCUNIT(tp->t_dev)];
    822 	int ospeed = compute_cdv(t->c_ospeed);
    823 	int s;
    824 
    825 	/* Check requested parameters. */
    826 	if (ospeed < 0)
    827 		return (EINVAL);
    828 	if (t->c_ispeed && t->c_ispeed != t->c_ospeed)
    829 		return (EINVAL);
    830 
    831 	/*
    832 	 * If there were no changes, don't do anything.  This avoids dropping
    833 	 * input and improves performance when all we did was frob things like
    834 	 * VMIN and VTIME.
    835 	 */
    836 	if (tp->t_ospeed == t->c_ospeed &&
    837 	    tp->t_cflag == t->c_cflag)
    838 		return (0);
    839 
    840 	s = splserial();
    841 
    842 	sc->gtmpsc_brg_bcr = BRG_BCR_EN | BRG_BCR_CLKS_TCLK | ospeed;
    843 	sc->gtmpsc_chr3 = GTMPSC_MAXIDLE(t->c_ospeed);
    844 
    845 	/* And copy to tty. */
    846 	tp->t_ispeed = 0;
    847 	tp->t_ospeed = t->c_ospeed;
    848 	tp->t_cflag = t->c_cflag;
    849 
    850 	if (!sc->sc_heldchange) {
    851 		if (sc->sc_tx_busy) {
    852 			sc->sc_heldtbc = sc->sc_tbc;
    853 			sc->sc_tbc = 0;
    854 			sc->sc_heldchange = 1;
    855 		} else
    856 			gtmpsc_loadchannelregs(sc);
    857 	}
    858 
    859 	splx(s);
    860 
    861 	/* Fake carrier on */
    862 	(void) (*tp->t_linesw->l_modem)(tp, 1);
    863 
    864 	return 0;
    865 }
    866 
    867 STATIC int
    868 gtmpsc_probe(void)
    869 {
    870 	return 1;		/* XXX */
    871 }
    872 
    873 STATIC unsigned int
    874 gtmpsc_get_causes(void)
    875 {
    876 	int                     i;
    877 	struct gtmpsc_softc       *sc;
    878 	unsigned int            cause = 0;
    879 	static unsigned int     bits[4] = {
    880 				SDMA_INTR_RXBUF(0),
    881 				SDMA_INTR_TXBUF(0),
    882 				SDMA_INTR_RXBUF(1),
    883 				SDMA_INTR_TXBUF(1),
    884 	};
    885 	sdma_desc_t             *desc_addr[4];
    886 	static unsigned int     fake_once = SDMA_INTR_RXBUF(0)
    887 						| SDMA_INTR_RXBUF(1);
    888 
    889 	desc_addr[0] = 0;
    890 	desc_addr[1] = 0;
    891 	desc_addr[2] = 0;
    892 	desc_addr[3] = 0;
    893 	sc = gtmpsc_cd.cd_devs[0];
    894 	if (sc != 0) {
    895 	    if (sdma_imask & SDMA_INTR_RXBUF(0)) {
    896 		desc_addr[0] =
    897 		    &sc->gtmpsc_poll_sdmapage->rx[sc->gtmpsc_poll_rxix].rxdesc;
    898 		    GTMPSC_CACHE_INVALIDATE(desc_addr[0]);
    899 		    asm volatile ("dcbt 0,%0" :: "r"(desc_addr[0]));
    900 	    }
    901 	    if (sdma_imask & SDMA_INTR_TXBUF(0)) {
    902 		desc_addr[1] =
    903 		    &sc->gtmpsc_poll_sdmapage->tx[sc->gtmpsc_poll_txix].txdesc;
    904 		    GTMPSC_CACHE_INVALIDATE(desc_addr[1]);
    905 		    asm volatile ("dcbt 0,%0" :: "r"(desc_addr[1]));
    906 	    }
    907 	}
    908 	sc = gtmpsc_cd.cd_devs[1];
    909 	if (sc != 0) {
    910 	    if (sdma_imask & SDMA_INTR_RXBUF(1)) {
    911 		desc_addr[2] =
    912 		    &sc->gtmpsc_poll_sdmapage->rx[sc->gtmpsc_poll_rxix].rxdesc;
    913 		    GTMPSC_CACHE_INVALIDATE(desc_addr[2]);
    914 		    asm volatile ("dcbt 0,%0" :: "r"(desc_addr[2]));
    915 	    }
    916 	    if (sdma_imask & SDMA_INTR_TXBUF(1)) {
    917 		desc_addr[3] =
    918 		    &sc->gtmpsc_poll_sdmapage->tx[sc->gtmpsc_poll_txix].txdesc;
    919 		    GTMPSC_CACHE_INVALIDATE(desc_addr[3]);
    920 		    asm volatile ("dcbt 0,%0" :: "r"(desc_addr[3]));
    921 	    }
    922 	}
    923 
    924 	for (i = 0; i < 4; ++i)
    925 		if ((sdma_imask & bits[i]) && desc_addr[i] != 0 &&
    926 			    (desc_addr[i]->sdma_csr & SDMA_CSR_TX_OWN) == 0)
    927 			cause |= bits[i];
    928 	if (fake_once & sdma_imask) {
    929 		cause |= fake_once & sdma_imask;
    930 	/*	fake_once &= ~(cause & fake_once); */
    931 	}
    932 	return cause;
    933 }
    934 
    935 STATIC int
    936 gtmpsc_intr(void *arg)
    937 {
    938 	struct gtmpsc_softc       *sc;
    939 	unsigned int            unit;
    940 	int                     spurious = 1;
    941 	unsigned int            r;
    942 	unsigned int            cause=0;
    943 
    944 	if (gt_reva_gtmpsc_bug)
    945 		cause = gtmpsc_get_causes();
    946 
    947 #ifdef KGDB
    948 	if (kgdb_break_immediate) {
    949 		unit = comkgdbport;
    950 		sc = gtmpsc_cd.cd_devs[unit];
    951 		if (sc == 0 || (sc->gtmpsc_flags & GTMPSCF_KGDB) == 0)
    952 			goto skip_kgdb;
    953 		if (gt_reva_gtmpsc_bug)
    954 			r = cause & sdma_imask;
    955 		else {
    956 			r = GT_READ(sc->gtmpsc_dev.dv_parent, SDMA_ICAUSE);
    957 			r &= GT_READ(sc->gtmpsc_dev.dv_parent, SDMA_IMASK);
    958 		}
    959 		r &= SDMA_INTR_RXBUF(unit);
    960 		if (r == 0)
    961 			goto skip_kgdb;
    962 		GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_ICAUSE, ~r);
    963 		spurious = 0;
    964 		gtmpsc_kgdb_poll(sc);
    965 	}
    966 skip_kgdb:
    967 #endif
    968 	for (unit = 0; unit < GTMPSC_NCHAN; ++unit) {
    969 		sc = gtmpsc_cd.cd_devs[unit];
    970 		if (sc == 0)
    971 			continue;
    972 		if (gt_reva_gtmpsc_bug)
    973 			r = cause & sdma_imask;
    974 		else {
    975 			r = GT_READ(sc->gtmpsc_dev.dv_parent, SDMA_ICAUSE);
    976 			r &= GT_READ(sc->gtmpsc_dev.dv_parent, SDMA_IMASK);
    977 		}
    978 		r &= SDMA_U_INTR_MASK(unit);
    979 		if (r == 0)
    980 			continue;
    981 		GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_ICAUSE, ~r);
    982 		spurious = 0;
    983 		if (r & SDMA_INTR_RXBUF(unit)) {
    984 #ifdef KGDB
    985 			if (sc->gtmpsc_flags & GTMPSCF_KGDB)
    986 				gtmpsc_kgdb_poll(sc);
    987 			else
    988 #endif
    989 				gtmpsc_poll(sc);
    990 		}
    991 		if (r & SDMA_INTR_TXBUF(unit)) {
    992 			/*
    993 			 * If we've delayed a parameter change, do it now,
    994 			 * and restart output.
    995 			 */
    996 			if (sc->sc_heldchange) {
    997 				gtmpsc_loadchannelregs(sc);
    998 				sc->sc_heldchange = 0;
    999 				sc->sc_tbc = sc->sc_heldtbc;
   1000 				sc->sc_heldtbc = 0;
   1001 			}
   1002 
   1003 			/* Output the next chunk of the contiguous buffer,
   1004 								if any. */
   1005 			if (sc->sc_tbc > 0)
   1006 				gtmpsc_common_putn(sc);
   1007 			if (sc->sc_tbc == 0 && sc->sc_tx_busy) {
   1008 				sc->sc_tx_busy = 0;
   1009 				sc->sc_tx_done = 1;
   1010 				setsoftserial();
   1011 				SDMA_IMASK_DISABLE(SDMA_INTR_TXBUF(unit));
   1012 			}
   1013 		}
   1014 	}
   1015 	return 1;
   1016 	/* return !spurious; */
   1017 }
   1018 
   1019 STATIC int
   1020 gtmpsc_softintr(void *unused)
   1021 {
   1022 	unsigned int            unit;
   1023 	struct gtmpsc_softc       *sc;
   1024 	struct tty              *tp;
   1025 	int                     (*rint) __P((int c, struct tty *tp));
   1026 	int                     jobs;
   1027 	int                     s;
   1028 
   1029 	for (unit = 0; unit < GTMPSC_NCHAN; ++unit) {
   1030 		sc = gtmpsc_cd.cd_devs[unit];
   1031 		if (sc == 0)
   1032 			continue;
   1033 		tp = sc->gtmpsc_tty;
   1034 		rint = tp->t_linesw->l_rint;
   1035 		do {
   1036 		    jobs = 0;
   1037 		    if (sc->gtmpsc_rxfifo_navail < GTMPSC_RXFIFOSZ) {
   1038 			s = spltty();
   1039 			rint(sc->gtmpsc_rxfifo[sc->gtmpsc_rxfifo_getix++],
   1040 								tp);
   1041 			if (sc->gtmpsc_rxfifo_getix >= GTMPSC_RXFIFOSZ)
   1042 				sc->gtmpsc_rxfifo_getix = 0;
   1043 			++sc->cnt_rx_from_fifo;
   1044 			/* atomic_add() returns the previous value */
   1045 			jobs += atomic_add(&sc->gtmpsc_rxfifo_navail, 1) + 1
   1046 								< GTMPSC_RXFIFOSZ;
   1047 			splx(s);
   1048 		    }
   1049 		    if (sc->sc_tx_done) {
   1050 			++jobs;
   1051 			sc->sc_tx_done = 0;
   1052 			s = spltty();
   1053 			tp->t_state &= ~TS_BUSY;
   1054 			if ((tp->t_state & TS_FLUSH) != 0)
   1055 			    tp->t_state &= ~TS_FLUSH;
   1056 			else
   1057 			    ndflush(&tp->t_outq, (int)(sc->sc_tba - tp->t_outq.c_cf));
   1058 			(*tp->t_linesw->l_start)(tp);
   1059 			splx(s);
   1060 		    }
   1061 		} while (jobs);
   1062 	}
   1063 	return 1;
   1064 }
   1065 
   1066 /*
   1067  * Console support functions
   1068  */
   1069 void
   1070 gtmpsccnprobe(struct consdev *cd)
   1071 {
   1072 	int maj;
   1073 /* {extern void return_to_dink(int); return_to_dink(gtbase);} */
   1074 
   1075 	if (!gtmpsc_probe())
   1076 		return;
   1077 
   1078 	maj = cdevsw_lookup_major(&gtmpsc_cdevsw);
   1079 	cd->cn_dev = makedev(maj, 0);
   1080 	cd->cn_pri = CN_INTERNAL;
   1081 }
   1082 
   1083 /*
   1084  * gtmpsc_hackinit - hacks required to supprt GTMPSC console
   1085  */
   1086 STATIC void
   1087 gtmpsc_hackinit(struct gtmpsc_softc *sc)
   1088 {
   1089 	gtmpsc_poll_sdma_t *vmps;
   1090 	gtmpsc_poll_sdma_t *pmps;
   1091 
   1092 	DPRINTF(("hackinit\n"));
   1093 
   1094 	bzero(sc, sizeof(struct gtmpsc_softc));
   1095 	gtmpsc_scp[sc->gtmpsc_unit] = sc;
   1096 
   1097 	vmps = (gtmpsc_poll_sdma_t *)gtmpsc_fake_dmapage;	/* KVA */
   1098 	pmps = (gtmpsc_poll_sdma_t *)gtmpsc_fake_dmapage;	/* PA */
   1099 
   1100 	gtmpsc_txdesc_init(vmps, pmps);
   1101 	gtmpsc_rxdesc_init(vmps, pmps);
   1102 
   1103 	sc->gtmpsc_poll_sdmapage = vmps;
   1104 }
   1105 
   1106 /*
   1107  * gtmpsc_txflush - wait for output to drain
   1108  */
   1109 STATIC void
   1110 gtmpsc_txflush(gtmpsc_softc_t *sc)
   1111 {
   1112 	unsigned int csr;
   1113 	unsigned int *csrp;
   1114 	gtmpsc_polltx_t *vtxp;
   1115 	int limit = 4000000;	/* 4 seconds */
   1116 	int ix;
   1117 
   1118 	ix = sc->gtmpsc_poll_txix - 1;
   1119 	if (ix < 0)
   1120 		ix = GTMPSC_NTXDESC - 1;
   1121 
   1122 	vtxp = &sc->gtmpsc_poll_sdmapage->tx[ix];
   1123 	csrp = &vtxp->txdesc.sdma_csr;
   1124 	while (limit > 0) {
   1125 		GTMPSC_CACHE_INVALIDATE(csrp);
   1126 		csr = desc_read(csrp);
   1127 		if ((csr & SDMA_CSR_TX_OWN) == 0)
   1128 			break;
   1129 		DELAY(GTMPSC_POLL_DELAY);
   1130 		limit -= GTMPSC_POLL_DELAY;
   1131 	}
   1132 }
   1133 
   1134 STATIC void
   1135 gtmpsc_iflush(gtmpsc_softc_t *sc)
   1136 {
   1137 	int     timo;
   1138 	char    c;
   1139 	int     stat;
   1140 
   1141 	for (timo = 50000; timo; timo--)
   1142 		if (gtmpsc_common_pollc(sc->gtmpsc_unit, &c, &stat) == 0)
   1143 			return;
   1144 #ifdef DIAGNOSTIC
   1145 	printf("%s: gtmpsc_iflush timeout %02x\n", sc->gtmpsc_dev.dv_xname, c);
   1146 #endif
   1147 }
   1148 
   1149 STATIC void
   1150 gtmpscinit_stop(struct gtmpsc_softc *sc, int once)
   1151 {
   1152 	unsigned int r;
   1153 	unsigned int unit = sc->gtmpsc_unit;
   1154 
   1155 	/*
   1156 	 * XXX HACK FIXME
   1157 	 * PMON output has not been flushed.  give him a chance
   1158 	 */
   1159 #if 1
   1160 	if (! once)
   1161 		DELAY(100000);	/* XXX */
   1162 #endif
   1163 
   1164 	DPRINTF(("mpscinit: unit 0x%x\n", unit));
   1165 	if (unit >= GTMPSC_NCHAN) {
   1166 		PRINTF(("mpscinit: undefined unit %d\n", sc->gtmpsc_unit));
   1167 		return;
   1168 	}
   1169 
   1170 	sc->gtmpsc_chr2 = 0;      /* Default value of CHR2 */
   1171 
   1172 	/*
   1173 	 * stop GTMPSC unit
   1174 	 */
   1175 	r = sc->gtmpsc_chr2 | GTMPSC_CHR2_RXABORT|GTMPSC_CHR2_TXABORT;
   1176 	GT_WRITE(sc->gtmpsc_dev.dv_parent, GTMPSC_U_CHRN(unit, 2), r);
   1177 
   1178 	DELAY(GTMPSC_RESET_DELAY);
   1179 
   1180 	/*
   1181 	 * abort SDMA TX, RX for GTMPSC unit
   1182 	 */
   1183 	GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_U_SDCM(unit),
   1184 		SDMA_SDCM_AR|SDMA_SDCM_AT);
   1185 
   1186 	if (once == 0) {
   1187 		/*
   1188 		 * Determine if this is the buggy GT-64260A case.
   1189 		 * If this is, then most of GTMPSC and SDMA registers
   1190 		 * are unreadable.
   1191 		 * (They always yield -1).
   1192 		 */
   1193 		GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_IMASK, 0);
   1194 		r = GT_READ(sc->gtmpsc_dev.dv_parent, SDMA_IMASK);
   1195 		gt_reva_gtmpsc_bug = r == ~0;
   1196 		sdma_imask = 0;
   1197 	}
   1198 	/*
   1199 	 * poll for GTMPSC RX abort completion
   1200 	 */
   1201 	if (gt_reva_gtmpsc_bug) {
   1202 		/* Sync up with the device first */
   1203 		r = GT_READ(sc->gtmpsc_dev.dv_parent, GTMPSC_U_CHRN(unit, 2));
   1204 		DELAY(GTMPSC_RESET_DELAY);
   1205 	} else
   1206 		for (;;) {
   1207 			r = GT_READ(sc->gtmpsc_dev.dv_parent,
   1208 							GTMPSC_U_CHRN(unit, 2));
   1209 			if (! (r & GTMPSC_CHR2_RXABORT))
   1210 				break;
   1211 		}
   1212 
   1213 	/*
   1214 	 * poll for SDMA RX abort completion
   1215 	 */
   1216 	for (;;) {
   1217 		r = GT_READ(sc->gtmpsc_dev.dv_parent, SDMA_U_SDCM(unit));
   1218 		if (! (r & SDMA_SDCM_AR))
   1219 			break;
   1220 	}
   1221 
   1222 }
   1223 
   1224 STATIC void
   1225 gtmpscinit_start(struct gtmpsc_softc *sc, int once)
   1226 {
   1227 	unsigned int r;
   1228 	unsigned int unit = sc->gtmpsc_unit;
   1229 
   1230 	/*
   1231 	 * initialize softc's "current" transfer indicies & counts
   1232 	 */
   1233 	sc->gtmpsc_cx = 0;
   1234 	sc->gtmpsc_nc = 0;
   1235 	sc->gtmpsc_poll_txix = 0;
   1236 	sc->gtmpsc_poll_rxix = 0;
   1237 
   1238 	/*
   1239 	 * initialize softc's RX softintr FIFO
   1240 	 */
   1241 	sc->gtmpsc_rxfifo_putix = 0;
   1242 	sc->gtmpsc_rxfifo_getix = 0;
   1243 	sc->gtmpsc_rxfifo_navail = GTMPSC_RXFIFOSZ;
   1244 	memset(&sc->gtmpsc_rxfifo[0], 0, GTMPSC_RXFIFOSZ);
   1245 
   1246 	/*
   1247 	 * set SDMA unit port TX descriptor pointers
   1248 	 * "next" pointer of last descriptor is start of ring
   1249 	 */
   1250 	r = desc_read(
   1251 		&sc->gtmpsc_poll_sdmapage->tx[GTMPSC_NTXDESC-1].txdesc.sdma_next);
   1252 	GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_U_SCTDP(unit), r);   /* current */
   1253 	GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_U_SFTDP(unit), r);   /* first   */
   1254 	/*
   1255 	 * set SDMA unit port RX descriptor pointer
   1256 	 * "next" pointer of last descriptor is start of ring
   1257 	 */
   1258 	r = desc_read(
   1259 		&sc->gtmpsc_poll_sdmapage->rx[GTMPSC_NRXDESC-1].rxdesc.sdma_next);
   1260 	GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_U_SCRDP(unit), r);   /* current */
   1261 
   1262 	/*
   1263 	 * initialize SDMA unit Configuration Register
   1264 	 */
   1265 	r = SDMA_SDC_BSZ_8x64|SDMA_SDC_SFM|SDMA_SDC_RFT;
   1266 	GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_U_SDC(unit), r);
   1267 
   1268 	/*
   1269 	 * enable SDMA receive
   1270 	 */
   1271 	GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_U_SDCM(unit), SDMA_SDCM_ERD);
   1272 
   1273 	if (once++ == 0) {
   1274 		/*
   1275 		 * GTMPSC Routing:
   1276 		 *	MR0 --> Serial Port 0
   1277 		 *	MR1 --> Serial Port 1
   1278 		 */
   1279 		GT_WRITE(sc->gtmpsc_dev.dv_parent, GTMPSC_MRR, GTMPSC_MRR_RES);
   1280 
   1281 		/*
   1282 		 * RX and TX Clock Routing:
   1283 		 *      CRR0 --> BRG0
   1284 		 *      CRR1 --> BRG1
   1285 		 */
   1286 		r = GTMPSC_CRR_BRG0 | (GTMPSC_CRR_BRG1 << GTMPSC_CRR1_SHIFT);
   1287 		GT_WRITE(sc->gtmpsc_dev.dv_parent, GTMPSC_RCRR, r);
   1288 		GT_WRITE(sc->gtmpsc_dev.dv_parent, GTMPSC_TCRR, r);
   1289 	}
   1290 	sc->gtmpsc_brg_bcr =
   1291 	  BRG_BCR_EN | BRG_BCR_CLKS_TCLK | compute_cdv(GT_MPSC_DEFAULT_BAUD_RATE);
   1292 	sc->gtmpsc_chr3 = GTMPSC_MAXIDLE(GT_MPSC_DEFAULT_BAUD_RATE);
   1293 	gtmpsc_loadchannelregs(sc);
   1294 
   1295 	/*
   1296 	 * set MPSC Protocol configuration register for GTMPSC unit
   1297 	 */
   1298 	GT_WRITE(sc->gtmpsc_dev.dv_parent, GTMPSC_U_MPCR(unit), GTMPSC_MPCR_CL_8);
   1299 
   1300 	/*
   1301 	 * set MPSC LO and HI port config registers for GTMPSC unit
   1302  	 */
   1303 	r = GTMPSC_MMCR_LO_MODE_UART
   1304 	   |GTMPSC_MMCR_LO_ET
   1305 	   |GTMPSC_MMCR_LO_ER
   1306 	   |GTMPSC_MMCR_LO_NLM;
   1307 	GT_WRITE(sc->gtmpsc_dev.dv_parent, GTMPSC_U_MMCR_LO(unit), r);
   1308 
   1309 	r =
   1310 	    GTMPSC_MMCR_HI_TCDV_DEFAULT
   1311 	   |GTMPSC_MMCR_HI_RDW
   1312 	   |GTMPSC_MMCR_HI_RCDV_DEFAULT;
   1313 	GT_WRITE(sc->gtmpsc_dev.dv_parent, GTMPSC_U_MMCR_HI(unit), r);
   1314 
   1315 	/*
   1316 	 * tell MPSC receive the Enter Hunt
   1317 	 */
   1318 	r = sc->gtmpsc_chr2 | GTMPSC_CHR2_EH;
   1319 	GT_WRITE(sc->gtmpsc_dev.dv_parent, GTMPSC_U_CHRN(unit, 2), r);
   1320 
   1321 	/*
   1322 	 * clear any pending SDMA interrupts for this unit
   1323 	 */
   1324 	r = GT_READ(sc->gtmpsc_dev.dv_parent, SDMA_ICAUSE);
   1325 	r &= ~SDMA_U_INTR_MASK(unit);
   1326 	GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_ICAUSE, r);	/* ??? */
   1327 
   1328 	DPRINTF(("gtmpscinit: OK\n"));
   1329 }
   1330 
   1331 /*
   1332  * gtmpscinit - prepare MPSC for operation
   1333  *
   1334  *	assumes we are called at ipl >= IPL_SERIAL
   1335  */
   1336 STATIC void
   1337 gtmpscinit(struct gtmpsc_softc *sc)
   1338 {
   1339 	static int once = 0;
   1340 
   1341 	gtmpscinit_stop(sc, once);
   1342 	gtmpscinit_start(sc, once);
   1343 	once++;
   1344 }
   1345 
   1346 /*
   1347  * gtmpsccninit - initialize the driver and the mpsc device
   1348  */
   1349 void
   1350 gtmpsccninit(struct consdev *cd)
   1351 {
   1352 	struct gtmpsc_softc *sc;
   1353 	unsigned int unit;
   1354 	int s;
   1355 
   1356 	unit = GTMPSCUNIT(cd->cn_dev);
   1357 	DPRINTF(("gtmpsccninit unit 0x%x\n", unit));
   1358 
   1359 	s = splserial();
   1360 
   1361 	if (gtmpsc_nattached == 0) {
   1362 		unsigned char *cp;
   1363 		unsigned char c;
   1364 		unsigned int i;
   1365 
   1366 		sc = &gtmpsc_fake_softc;
   1367 		gtmpsc_hackinit(sc);
   1368 		gtmpscinit(sc);
   1369 		gtmpsccninit_done = 1;
   1370 		cp = gtmpsc_earlybuf;
   1371 		for (i=0; i < sizeof(gtmpsc_earlybuf); i++) {
   1372 			c = *cp++;
   1373 			if (c == 0)
   1374 				break;
   1375 			gtmpsc_common_putc(0, c);
   1376 		}
   1377 	} else {
   1378 		gtmpsc_poll_sdma_t *vmps;
   1379 		gtmpsc_poll_sdma_t *pmps;
   1380 
   1381 		sc = gtmpsc_scp[unit];
   1382 
   1383 		gtmpsc_txflush(gtmpsc_scp[sc->gtmpsc_unit]);
   1384 		SDMA_IMASK_DISABLE(SDMA_INTR_RXBUF(sc->gtmpsc_unit)
   1385 			| SDMA_INTR_TXBUF(sc->gtmpsc_unit));
   1386 
   1387 		gtmpscinit_stop(sc, 1);
   1388 
   1389 		pmps = (gtmpsc_poll_sdma_t *)sc->gtmpsc_dma_segs[0].ds_addr;
   1390 		vmps = sc->gtmpsc_poll_sdmapage;
   1391 		gtmpsc_txdesc_init(vmps, pmps);
   1392 		gtmpsc_rxdesc_init(vmps, pmps);
   1393 
   1394 		gtmpscinit_start(sc, 1);
   1395 	}
   1396 
   1397 	splx(s);
   1398 }
   1399 
   1400 int
   1401 gtmpsccngetc(dev_t dev)
   1402 {
   1403 	int s;
   1404 	int c;
   1405 	unsigned int unit;
   1406 
   1407 	unit = GTMPSCUNIT(dev);
   1408 	if (unit >= GTMPSC_NCHAN)
   1409 		return 0;
   1410 	s = splserial();
   1411 	c = gtmpsc_common_getc(unit);
   1412 	splx(s);
   1413 
   1414 	return c;
   1415 }
   1416 
   1417 void
   1418 gtmpsccnputc(dev_t dev, int c)
   1419 {
   1420 	char ch = c;
   1421 	int s;
   1422 	unsigned int unit;
   1423 	static int ix = 0;
   1424 
   1425 	if (gtmpsccninit_done == 0) {
   1426 		if ((minor(dev) == 0) && (ix < sizeof(gtmpsc_earlybuf)))
   1427 			gtmpsc_earlybuf[ix++] = (unsigned char)c;
   1428 		return;
   1429 	}
   1430 
   1431 	unit = GTMPSCUNIT(dev);
   1432 	DPRINTF(("gtmpsccninit unit 0x%x\n", unit));
   1433 
   1434 	if (unit >= GTMPSC_NCHAN)
   1435 		return;
   1436 	s = splserial();
   1437 	gtmpsc_common_putc(unit, ch);
   1438 	splx(s);
   1439 }
   1440 
   1441 void
   1442 gtmpsccnpollc(dev_t dev, int on)
   1443 {
   1444 }
   1445 
   1446 /*
   1447  * gtmpsc_common_pollc - non-blocking console read
   1448  *
   1449  *	if there is an RX char, return it in *cp
   1450  *	set *statp if Break detected
   1451  *
   1452  *	assumes we are called at ipl >= IPL_SERIAL
   1453  *
   1454  * return 1 if there is RX data
   1455  * otherwise return 0
   1456  */
   1457 STATIC int
   1458 gtmpsc_common_pollc(unsigned int unit, char *cp, int *statp)
   1459 {
   1460 	struct gtmpsc_softc *sc = gtmpsc_scp[unit];
   1461 	gtmpsc_pollrx_t *vrxp;
   1462 	unsigned int ix;
   1463 	unsigned int cx;
   1464 	unsigned int nc;
   1465 
   1466 	*statp = GTMPSC_STAT_NONE;
   1467 	ix = sc->gtmpsc_poll_rxix;
   1468 	nc = sc->gtmpsc_nc;
   1469 	cx = sc->gtmpsc_cx;
   1470 	if (nc == 0) {
   1471 		unsigned int *csrp;
   1472 		unsigned int csr;
   1473 
   1474 		vrxp = &sc->gtmpsc_poll_sdmapage->rx[ix];
   1475 		csrp = &vrxp->rxdesc.sdma_csr;
   1476 		cx = 0;
   1477 
   1478 		GTMPSC_CACHE_INVALIDATE(csrp);
   1479 		csr = desc_read(csrp);
   1480 		if (csr & SDMA_CSR_RX_OWN)
   1481 			return 0;
   1482 		if (csr & SDMA_CSR_RX_BR)
   1483 			*statp = GTMPSC_STAT_BREAK;
   1484 		if (csr & SDMA_CSR_RX_ES)
   1485 			PRINTF(("mpsc 0 RX error, rxdesc csr 0x%x\n", csr));
   1486 
   1487 		nc = desc_read(&vrxp->rxdesc.sdma_cnt);
   1488 		nc &= SDMA_RX_CNT_BCNT_MASK;
   1489 		csr = SDMA_CSR_RX_L|SDMA_CSR_RX_F|SDMA_CSR_RX_OWN
   1490 							      |SDMA_CSR_RX_EI;
   1491 		if (nc == 0) {
   1492 			if ((++ix) >= GTMPSC_NRXDESC)
   1493 				ix = 0;
   1494 			sc->gtmpsc_poll_rxix = ix;
   1495 			desc_write(csrp, csr);
   1496 			GTMPSC_CACHE_FLUSH(csrp);
   1497 			return 0;
   1498 		}
   1499 		bcopy(vrxp->rxbuf, sc->gtmpsc_rxbuf, nc);
   1500 		desc_write(csrp, csr);
   1501 		GTMPSC_CACHE_FLUSH(csrp);
   1502 	}
   1503 	gtmpsc_poll_pollc_cnt++;
   1504 	nc--;
   1505 	*cp = sc->gtmpsc_rxbuf[cx++];
   1506 	if (nc == 0) {
   1507 		if ((++ix) >= GTMPSC_NRXDESC)
   1508 			ix = 0;
   1509 		sc->gtmpsc_poll_rxix = ix;
   1510 	}
   1511 	sc->gtmpsc_cx = cx;
   1512 	sc->gtmpsc_nc = nc;
   1513 	return 1;
   1514 }
   1515 
   1516 /*
   1517  * gtmpsc_common_getc - polled console read
   1518  *
   1519  *	We copy data from the DMA buffers into a buffer in the softc
   1520  *	to reduce descriptor ownership turnaround time
   1521  *	MPSC can crater if it wraps descriptor rings,
   1522  *	which is asynchronous and throttled only by line speed.
   1523  *
   1524  *	This code assumes the buffer PA==KVA
   1525  *	and assumes we are called at ipl >= IPL_SERIAL
   1526  */
   1527 STATIC int
   1528 gtmpsc_common_getc(unsigned int unit)
   1529 {
   1530 	struct gtmpsc_softc *sc = gtmpsc_scp[unit];
   1531 	gtmpsc_pollrx_t *vrxp;
   1532 	unsigned int ix;
   1533 	unsigned int cx;
   1534 	unsigned int nc;
   1535 	int c;
   1536 
   1537 	ix = sc->gtmpsc_poll_rxix;
   1538 	nc = sc->gtmpsc_nc;
   1539 	cx = sc->gtmpsc_cx;
   1540 	while (nc == 0) {
   1541 		unsigned int *csrp;
   1542 		unsigned int csr;
   1543 		unsigned int r;
   1544 
   1545 		vrxp = &sc->gtmpsc_poll_sdmapage->rx[ix];
   1546 		csrp = &vrxp->rxdesc.sdma_csr;
   1547 		cx = 0;
   1548 
   1549 		GTMPSC_CACHE_INVALIDATE(csrp);
   1550 		csr = desc_read(csrp);
   1551 		if (csr & SDMA_CSR_RX_OWN) {
   1552 			r = sc->gtmpsc_chr2 | GTMPSC_CHR2_CRD;
   1553 			GT_WRITE(sc->gtmpsc_dev.dv_parent,
   1554 				GTMPSC_U_CHRN(unit, 2), r);
   1555 			do {
   1556 
   1557 				gtmpsc_poll_getc_miss++;
   1558 				GTMPSC_CACHE_INVALIDATE(csrp);
   1559 				csr = desc_read(csrp);
   1560 			} while (csr & SDMA_CSR_RX_OWN);
   1561 		}
   1562 		if (csr & SDMA_CSR_RX_ES)
   1563 			PRINTF(("mpsc 0 RX error, rxdesc csr 0x%x\n", csr));
   1564 
   1565 		nc = desc_read(&vrxp->rxdesc.sdma_cnt);
   1566 		nc &= SDMA_RX_CNT_BCNT_MASK;
   1567 		if (nc) {
   1568 			bcopy(vrxp->rxbuf, sc->gtmpsc_rxbuf, nc);
   1569 		} else {
   1570 			if ((++ix) >= GTMPSC_NRXDESC)
   1571 				ix = 0;
   1572 			sc->gtmpsc_poll_rxix = ix;
   1573 		}
   1574 		csr = SDMA_CSR_RX_L|SDMA_CSR_RX_F|SDMA_CSR_RX_OWN
   1575 							|SDMA_CSR_RX_EI;
   1576 		desc_write(csrp, csr);
   1577 		GTMPSC_CACHE_FLUSH(csrp);
   1578 #ifdef KGDB
   1579 		if (unit == comkgdbport && gt_reva_gtmpsc_bug)
   1580 			GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_ICAUSE,
   1581 						~SDMA_INTR_RXBUF(unit));
   1582 #endif
   1583 	}
   1584 	gtmpsc_poll_getc_cnt++;
   1585 	nc--;
   1586 	c = (int)sc->gtmpsc_rxbuf[cx++];
   1587 	if (nc == 0) {
   1588 		if ((++ix) >= GTMPSC_NRXDESC)
   1589 			ix = 0;
   1590 		sc->gtmpsc_poll_rxix = ix;
   1591 	}
   1592 	sc->gtmpsc_cx = cx;
   1593 	sc->gtmpsc_nc = nc;
   1594 	return c;
   1595 }
   1596 
   1597 /*
   1598  * gtmpsc_common_putn - write a buffer into the hardware
   1599  *
   1600  *	assumes we are called at ipl >= IPL_SERIAL
   1601  */
   1602 STATIC void
   1603 gtmpsc_common_putn(struct gtmpsc_softc *sc)
   1604 
   1605 {
   1606 	int     unit = sc->gtmpsc_unit;
   1607 	int     n;
   1608 	int     kick;
   1609 	gtmpsc_polltx_t *vtxp;
   1610 	unsigned int *csrp;
   1611 	unsigned int csr;
   1612 	unsigned int ix;
   1613 	unsigned int sdcm;
   1614 
   1615 	kick = 0;
   1616 	for (ix = sc->gtmpsc_poll_txix; sc->sc_tbc;) {
   1617 		vtxp = &sc->gtmpsc_poll_sdmapage->tx[ix];
   1618 		csrp = &vtxp->txdesc.sdma_csr;
   1619 		GTMPSC_CACHE_INVALIDATE(csrp);
   1620 		csr = desc_read(csrp);
   1621 		if ((csr & SDMA_CSR_TX_OWN) != 0)
   1622 			break;
   1623 		n = sc->sc_tbc;
   1624 		if (n > GTMPSC_TXBUFSZ)
   1625 			n = GTMPSC_TXBUFSZ;
   1626 		bcopy(sc->sc_tba, vtxp->txbuf, n);
   1627 		csr = SDMA_CSR_TX_L | SDMA_CSR_TX_F
   1628 					| SDMA_CSR_TX_EI | SDMA_CSR_TX_OWN;
   1629 		desc_write(&vtxp->txdesc.sdma_cnt,
   1630 				(n << SDMA_TX_CNT_BCNT_SHIFT) | n);
   1631 		desc_write(csrp, csr);
   1632 		GTMPSC_CACHE_FLUSH(csrp);
   1633 		sc->sc_tbc -= n;
   1634 		sc->sc_tba += n;
   1635 		gtmpsc_poll_putn_cnt += n;
   1636 		sc->cnt_tx_to_sdma += n;
   1637 		kick = 1;
   1638 
   1639 		if (++ix >= GTMPSC_NTXDESC)
   1640 			ix = 0;
   1641 	}
   1642 	if (kick) {
   1643 		sc->gtmpsc_poll_txix = ix;
   1644 
   1645 		/*
   1646 		 * now kick some SDMA
   1647 		 */
   1648 		sdcm = GT_READ(sc->gtmpsc_dev.dv_parent, SDMA_U_SDCM(unit));
   1649 
   1650 		if ((sdcm & SDMA_SDCM_TXD) == 0) {
   1651 			GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_U_SDCM(unit),
   1652 							       SDMA_SDCM_TXD);
   1653 		}
   1654 	}
   1655 }
   1656 
   1657 /*
   1658  * gtmpsc_common_putc - polled console putc
   1659  *
   1660  *	assumes we are called at ipl >= IPL_SERIAL
   1661  */
   1662 STATIC void
   1663 gtmpsc_common_putc(unsigned int unit, unsigned char c)
   1664 {
   1665 	struct gtmpsc_softc *sc = gtmpsc_scp[unit];
   1666 	gtmpsc_polltx_t *vtxp;
   1667 	unsigned int *csrp;
   1668 	unsigned int csr;
   1669 	unsigned int ix;
   1670 	unsigned int nix;
   1671 	unsigned int sdcm;
   1672 
   1673 	ix = sc->gtmpsc_poll_txix;
   1674 	nix = ix + 1;
   1675 	if (nix >= GTMPSC_NTXDESC)
   1676 		nix = 0;
   1677 	sc->gtmpsc_poll_txix = nix;
   1678 	vtxp = &sc->gtmpsc_poll_sdmapage->tx[ix];
   1679 	csrp = &vtxp->txdesc.sdma_csr;
   1680 
   1681 	for (;;) {
   1682 
   1683 		GTMPSC_CACHE_INVALIDATE(csrp);
   1684 		csr = desc_read(csrp);
   1685 		if ((csr & SDMA_CSR_TX_OWN) == 0)
   1686 			break;
   1687 		gtmpsc_poll_putc_miss++;
   1688 	}
   1689 	if (csr & SDMA_CSR_TX_ES)
   1690 		PRINTF(("mpsc 0 TX error, txdesc csr 0x%x\n", csr));
   1691 
   1692 	gtmpsc_poll_putc_cnt++;
   1693 	vtxp->txbuf[0] = c;
   1694 	csr = SDMA_CSR_TX_L | SDMA_CSR_TX_F
   1695 					| SDMA_CSR_TX_EI | SDMA_CSR_TX_OWN;
   1696 	desc_write(&vtxp->txdesc.sdma_cnt, (1 << SDMA_TX_CNT_BCNT_SHIFT) | 1);
   1697 	desc_write(csrp, csr);
   1698 	GTMPSC_CACHE_FLUSH(csrp);
   1699 
   1700 	/*
   1701 	 * now kick some SDMA
   1702 	 */
   1703 	sdcm = GT_READ(sc->gtmpsc_dev.dv_parent, SDMA_U_SDCM(unit));
   1704 
   1705 	if ((sdcm & SDMA_SDCM_TXD) == 0) {
   1706 		GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_U_SDCM(unit),
   1707 						       SDMA_SDCM_TXD);
   1708 	}
   1709 }
   1710 
   1711 
   1712 STATIC void
   1713 gtmpsc_poll(void *arg)
   1714 {
   1715 	struct gtmpsc_softc *sc = (struct gtmpsc_softc *)arg;
   1716 	int kick;
   1717 	char ch;
   1718 	int stat;
   1719 	static struct timeval   msg_time = {0,0};
   1720 	static struct timeval   cur_time;
   1721 	static int fifo_full = 0;
   1722 
   1723 	kick = 0;
   1724 	while (gtmpsc_common_pollc(sc->gtmpsc_unit, &ch, &stat)) {
   1725 #ifdef DDB
   1726 		if (stat)
   1727 			break;
   1728 #endif
   1729 		++sc->cnt_rx_from_sdma;
   1730 		if (sc->gtmpsc_rxfifo_navail != 0) {
   1731 			sc->gtmpsc_rxfifo[sc->gtmpsc_rxfifo_putix++] = ch;
   1732 			if (sc->gtmpsc_rxfifo_putix == GTMPSC_RXFIFOSZ)
   1733 				sc->gtmpsc_rxfifo_putix = 0;
   1734 			atomic_add(&sc->gtmpsc_rxfifo_navail, -1);
   1735 			++sc->cnt_rx_to_fifo;
   1736 			fifo_full = 0;
   1737 			kick = 1;
   1738 		} else {
   1739 			if (fifo_full == 0) {
   1740 				fifo_full = 1;
   1741 				microtime(&cur_time);
   1742 				if (cur_time.tv_sec - msg_time.tv_sec >= 5) {
   1743 					/* Only do this once in 5 sec */
   1744 					msg_time = cur_time;
   1745 					printf("mpsc%d: input FIFO full, "
   1746 					       "dropping incoming characters\n",
   1747 					       sc->gtmpsc_unit);
   1748 				}
   1749 			}
   1750 		}
   1751 	}
   1752 #ifdef DDB
   1753 	if (stat) {
   1754 		struct consdev *ocd = cn_tab;
   1755 		if (ocd->cn_init != gtmpsccninit) {
   1756 			cn_tab = &constab[0];
   1757 			Debugger();
   1758 			cn_tab = ocd;
   1759 		} else {
   1760 			Debugger();
   1761 		}
   1762 	}
   1763 #endif
   1764 	if (kick)
   1765 		setsoftserial();
   1766 }
   1767 
   1768 #ifdef KGDB
   1769 /* ARGSUSED */
   1770 STATIC int
   1771 gtmpsc_kgdb_getc(arg)
   1772 	void *arg;
   1773 {
   1774 
   1775 	return (gtmpsc_common_getc(comkgdbport));
   1776 }
   1777 
   1778 /* ARGSUSED */
   1779 STATIC void
   1780 gtmpsc_kgdb_putc(arg, c)
   1781 	void *arg;
   1782 	int c;
   1783 {
   1784 
   1785 	return (gtmpsc_common_putc(comkgdbport, c));
   1786 }
   1787 
   1788 STATIC void
   1789 gtmpsc_kgdb_poll(void *arg)
   1790 {
   1791 	struct gtmpsc_softc       *sc = (struct gtmpsc_softc *)arg;
   1792 	int                     s;
   1793 	char                    c;
   1794 	int                     brk;
   1795 
   1796 	s = splserial();
   1797 	if (kgdb_recover == 0) { /* gdb is not currently talking to its agent */
   1798 		while (gtmpsc_common_pollc(sc->gtmpsc_unit, &c, &brk)) {
   1799 			if (c == CTRL('c'))
   1800 				brk = GTMPSC_STAT_BREAK;
   1801 			if (brk == GTMPSC_STAT_BREAK)
   1802 				break;
   1803 		}
   1804 		if (brk == GTMPSC_STAT_BREAK) {
   1805 			if (kgdb_break_immediate)
   1806 				breakpoint();
   1807 			else {
   1808 				printf("connecting to kgdb\n");
   1809 				kgdb_connect(1);
   1810 			}
   1811 		}
   1812 	}
   1813 	splx(s);
   1814 }
   1815 
   1816 #endif /* KGDB */
   1817 
   1818 void
   1819 #ifdef __STDC__
   1820 gtmpsc_printf(const char *fmt, ...)
   1821 #else
   1822 gtmpsc_printf(fmt, va_alist)
   1823         char *fmt;
   1824         va_dcl
   1825 #endif
   1826 
   1827 {
   1828 	struct consdev *ocd;
   1829 	int s;
   1830 	va_list ap;
   1831 
   1832 	s = splserial();
   1833 	ocd = cn_tab;
   1834 	cn_tab = &constab[0];
   1835 	va_start(ap, fmt);
   1836 	printf(fmt, ap);
   1837 	va_end(ap);
   1838 	cn_tab = ocd;
   1839 	splx(s);
   1840 }
   1841 
   1842 void
   1843 #ifdef __STDC__
   1844 gtmpsc_mem_printf(const char *fmt, ...)
   1845 #else
   1846 gtmpsc_mem_printf(fmt, va_alist)
   1847         char *fmt;
   1848         va_dcl
   1849 #endif
   1850 {
   1851 	int s;
   1852 	va_list ap;
   1853 	static unsigned char *p = gtmpsc_print_buf;
   1854 
   1855 	s = splserial();
   1856 	if (p >= &gtmpsc_print_buf[GTMPSC_PRINT_BUF_SIZE - 128]) {
   1857 		bzero(gtmpsc_print_buf, GTMPSC_PRINT_BUF_SIZE);
   1858 		p = gtmpsc_print_buf;
   1859 	}
   1860 	va_start(ap, fmt);
   1861 	p += vsprintf(p, fmt, ap);
   1862 	va_end(ap);
   1863 	splx(s);
   1864 }
   1865 
   1866 void
   1867 gtmpsc_shutdownhook(void *arg)
   1868 {
   1869 	gtmpsc_softc_t *sc = (gtmpsc_softc_t *)arg;
   1870 
   1871 	gtmpsc_txflush(sc);
   1872 }
   1873 
   1874 void
   1875 gtmpsccnhalt(dev_t dev)
   1876 {
   1877 	unsigned int unit;
   1878 	gtmpsc_softc_t *sc = gtmpsc_scp[unit];
   1879 	u_int32_t r;
   1880 
   1881 	for (unit = 0; unit < GTMPSC_NCHAN; unit++) {
   1882 		sc = gtmpsc_scp[unit];
   1883 		if (sc == NULL)
   1884 			continue;
   1885 
   1886 		/*
   1887 		 * flush TX buffers
   1888 		 */
   1889 		gtmpsc_txflush(sc);
   1890 
   1891 		/*
   1892 		 * stop MPSC unit RX
   1893 		 */
   1894 		r = GT_READ(sc->gtmpsc_dev.dv_parent, GTMPSC_U_CHRN(unit, 2));
   1895 		r &= ~GTMPSC_CHR2_EH;
   1896 		r |= GTMPSC_CHR2_RXABORT;
   1897 		GT_WRITE(sc->gtmpsc_dev.dv_parent, GTMPSC_U_CHRN(unit, 2), r);
   1898 
   1899 		DELAY(GTMPSC_RESET_DELAY);
   1900 
   1901 		/*
   1902 		 * abort SDMA RX for MPSC unit
   1903 		 */
   1904 		GT_WRITE(sc->gtmpsc_dev.dv_parent, SDMA_U_SDCM(unit),
   1905 			SDMA_SDCM_AR);
   1906 	}
   1907 }
   1908 
   1909 void
   1910 gtmpsc_puts(char *str)
   1911 {
   1912 	char c;
   1913 
   1914 	if (str == NULL)
   1915 		return;
   1916 	while ((c = *str++) != 0)
   1917 		gtmpsccnputc(0, c);
   1918 }
   1919