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