1 /* $NetBSD: gtmpsc.c,v 1.26 2007/10/19 12:00:33 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.26 2007/10/19 12:00:33 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, >mpsc_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 == >mpsc_consdev && 528 cn_tab->cn_dev == makedev(0, sc->gtmpsc_unit)) { 529 cn_tab->cn_dev = makedev(cdevsw_lookup_major(>mpsc_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 (tp->t_outq.c_cc <= tp->t_lowat) { 772 if ((tp->t_state & TS_ASLEEP) != 0) { 773 tp->t_state &= ~TS_ASLEEP; 774 wakeup(&tp->t_outq); 775 } 776 selwakeup(&tp->t_wsel); 777 if (tp->t_outq.c_cc == 0) 778 goto out; 779 } 780 781 /* Grab the first contiguous region of buffer space. */ 782 tba = tp->t_outq.c_cf; 783 tbc = ndqb(&tp->t_outq, 0); 784 785 s2 = splserial(); 786 787 sc->sc_tba = tba; 788 sc->sc_tbc = tbc; 789 sc->cnt_tx_from_ldisc += tbc; 790 SDMA_IMASK_ENABLE(sc, SDMA_INTR_TXBUF(unit)); 791 tp->t_state |= TS_BUSY; 792 sc->sc_tx_busy = 1; 793 gtmpsc_common_putn(sc); 794 795 splx(s2); 796 out: 797 splx(s); 798 } 799 800 STATIC int 801 gtmpscparam(struct tty *tp, struct termios *t) 802 { 803 struct gtmpsc_softc *sc = gtmpsc_cd.cd_devs[GTMPSCUNIT(tp->t_dev)]; 804 int ospeed = compute_cdv(t->c_ospeed); 805 int s; 806 807 /* Check requested parameters. */ 808 if (ospeed < 0) 809 return (EINVAL); 810 if (t->c_ispeed && t->c_ispeed != t->c_ospeed) 811 return (EINVAL); 812 813 /* 814 * If there were no changes, don't do anything. This avoids dropping 815 * input and improves performance when all we did was frob things like 816 * VMIN and VTIME. 817 */ 818 if (tp->t_ospeed == t->c_ospeed && 819 tp->t_cflag == t->c_cflag) 820 return (0); 821 822 s = splserial(); 823 824 sc->gtmpsc_brg_bcr = BRG_BCR_EN | GT_MPSC_CLOCK_SOURCE | ospeed; 825 sc->gtmpsc_chr3 = GTMPSC_MAXIDLE(t->c_ospeed); 826 827 /* And copy to tty. */ 828 tp->t_ispeed = 0; 829 tp->t_ospeed = t->c_ospeed; 830 tp->t_cflag = t->c_cflag; 831 832 if (!sc->sc_heldchange) { 833 if (sc->sc_tx_busy) { 834 sc->sc_heldtbc = sc->sc_tbc; 835 sc->sc_tbc = 0; 836 sc->sc_heldchange = 1; 837 } else 838 gtmpsc_loadchannelregs(sc); 839 } 840 841 splx(s); 842 843 /* Fake carrier on */ 844 (void) (*tp->t_linesw->l_modem)(tp, 1); 845 846 return 0; 847 } 848 849 STATIC int 850 gtmpsc_probe(void) 851 { 852 return 1; /* XXX */ 853 } 854 855 STATIC unsigned int 856 gtmpsc_get_causes(void) 857 { 858 int i; 859 struct gtmpsc_softc *sc; 860 unsigned int cause = 0; 861 static unsigned int bits[4] = { 862 SDMA_INTR_RXBUF(0), 863 SDMA_INTR_TXBUF(0), 864 SDMA_INTR_RXBUF(1), 865 SDMA_INTR_TXBUF(1), 866 }; 867 sdma_desc_t *desc_addr[4]; 868 static unsigned int fake_once = SDMA_INTR_RXBUF(0) 869 | SDMA_INTR_RXBUF(1); 870 871 desc_addr[0] = 0; 872 desc_addr[1] = 0; 873 desc_addr[2] = 0; 874 desc_addr[3] = 0; 875 sc = gtmpsc_cd.cd_devs[0]; 876 if (sc != 0) { 877 if (sdma_imask & SDMA_INTR_RXBUF(0)) { 878 desc_addr[0] = 879 &sc->gtmpsc_poll_sdmapage->rx[sc->gtmpsc_poll_rxix].rxdesc; 880 GTMPSC_CACHE_INVALIDATE(desc_addr[0]); 881 __asm volatile ("dcbt 0,%0" :: "r"(desc_addr[0])); 882 } 883 if (sdma_imask & SDMA_INTR_TXBUF(0)) { 884 desc_addr[1] = 885 &sc->gtmpsc_poll_sdmapage->tx[sc->gtmpsc_poll_txix].txdesc; 886 GTMPSC_CACHE_INVALIDATE(desc_addr[1]); 887 __asm volatile ("dcbt 0,%0" :: "r"(desc_addr[1])); 888 } 889 } 890 sc = gtmpsc_cd.cd_devs[1]; 891 if (sc != 0) { 892 if (sdma_imask & SDMA_INTR_RXBUF(1)) { 893 desc_addr[2] = 894 &sc->gtmpsc_poll_sdmapage->rx[sc->gtmpsc_poll_rxix].rxdesc; 895 GTMPSC_CACHE_INVALIDATE(desc_addr[2]); 896 __asm volatile ("dcbt 0,%0" :: "r"(desc_addr[2])); 897 } 898 if (sdma_imask & SDMA_INTR_TXBUF(1)) { 899 desc_addr[3] = 900 &sc->gtmpsc_poll_sdmapage->tx[sc->gtmpsc_poll_txix].txdesc; 901 GTMPSC_CACHE_INVALIDATE(desc_addr[3]); 902 __asm volatile ("dcbt 0,%0" :: "r"(desc_addr[3])); 903 } 904 } 905 906 for (i = 0; i < 4; ++i) 907 if ((sdma_imask & bits[i]) && desc_addr[i] != 0 && 908 (desc_addr[i]->sdma_csr & SDMA_CSR_TX_OWN) == 0) 909 cause |= bits[i]; 910 if (fake_once & sdma_imask) { 911 cause |= fake_once & sdma_imask; 912 /* fake_once &= ~(cause & fake_once); */ 913 } 914 return cause; 915 } 916 917 STATIC int 918 gtmpsc_intr(void *arg) 919 { 920 struct gtmpsc_softc *sc; 921 unsigned int unit; 922 int spurious = 1; 923 unsigned int r; 924 unsigned int cause=0; 925 926 if (gt_reva_gtmpsc_bug) 927 cause = gtmpsc_get_causes(); 928 929 #ifdef KGDB 930 if (kgdb_break_immediate) { 931 unit = comkgdbport; 932 sc = gtmpsc_cd.cd_devs[unit]; 933 if (sc == 0 || (sc->gtmpsc_flags & GTMPSCF_KGDB) == 0) 934 goto skip_kgdb; 935 if (gt_reva_gtmpsc_bug) 936 r = cause & sdma_imask; 937 else { 938 r = GT_READ(sc, SDMA_ICAUSE); 939 r &= GT_READ(sc, SDMA_IMASK); 940 } 941 r &= SDMA_INTR_RXBUF(unit); 942 if (r == 0) 943 goto skip_kgdb; 944 GT_WRITE(sc, SDMA_ICAUSE, ~r); 945 spurious = 0; 946 gtmpsc_kgdb_poll(sc); 947 } 948 skip_kgdb: 949 #endif 950 for (unit = 0; unit < GTMPSC_NCHAN; ++unit) { 951 sc = gtmpsc_cd.cd_devs[unit]; 952 if (sc == 0) 953 continue; 954 if (gt_reva_gtmpsc_bug) 955 r = cause & sdma_imask; 956 else { 957 r = GT_READ(sc, SDMA_ICAUSE); 958 r &= GT_READ(sc, SDMA_IMASK); 959 } 960 r &= SDMA_U_INTR_MASK(unit); 961 if (r == 0) 962 continue; 963 GT_WRITE(sc, SDMA_ICAUSE, ~r); 964 spurious = 0; 965 if (r & SDMA_INTR_RXBUF(unit)) { 966 #ifdef KGDB 967 if (sc->gtmpsc_flags & GTMPSCF_KGDB) 968 gtmpsc_kgdb_poll(sc); 969 else 970 #endif 971 gtmpsc_poll(sc); 972 } 973 if (r & SDMA_INTR_TXBUF(unit)) { 974 /* 975 * If we've delayed a parameter change, do it now, 976 * and restart output. 977 */ 978 if (sc->sc_heldchange) { 979 gtmpsc_loadchannelregs(sc); 980 sc->sc_heldchange = 0; 981 sc->sc_tbc = sc->sc_heldtbc; 982 sc->sc_heldtbc = 0; 983 } 984 985 /* Output the next chunk of the contiguous buffer, 986 if any. */ 987 if (sc->sc_tbc > 0) 988 gtmpsc_common_putn(sc); 989 if (sc->sc_tbc == 0 && sc->sc_tx_busy) { 990 sc->sc_tx_busy = 0; 991 sc->sc_tx_done = 1; 992 softint_schedule(sc->sc_si); 993 SDMA_IMASK_DISABLE(sc, SDMA_INTR_TXBUF(unit)); 994 } 995 } 996 } 997 return 1; 998 /* return !spurious; */ 999 } 1000 1001 STATIC void 1002 gtmpsc_softintr(void *arg) 1003 { 1004 struct gtmpsc_softc *sc = arg; 1005 struct tty *tp; 1006 int (*rint)(int, struct tty *); 1007 int jobs; 1008 int s; 1009 1010 tp = sc->gtmpsc_tty; 1011 rint = tp->t_linesw->l_rint; 1012 do { 1013 jobs = 0; 1014 if (sc->gtmpsc_rxfifo_navail < GTMPSC_RXFIFOSZ) { 1015 s = spltty(); 1016 rint(sc->gtmpsc_rxfifo[sc->gtmpsc_rxfifo_getix++], 1017 tp); 1018 if (sc->gtmpsc_rxfifo_getix >= GTMPSC_RXFIFOSZ) 1019 sc->gtmpsc_rxfifo_getix = 0; 1020 ++sc->cnt_rx_from_fifo; 1021 /* atomic_add() returns the previous value */ 1022 jobs += atomic_add(&sc->gtmpsc_rxfifo_navail, 1) + 1 1023 < GTMPSC_RXFIFOSZ; 1024 splx(s); 1025 } 1026 if (sc->sc_tx_done) { 1027 ++jobs; 1028 sc->sc_tx_done = 0; 1029 s = spltty(); 1030 tp->t_state &= ~TS_BUSY; 1031 if ((tp->t_state & TS_FLUSH) != 0) 1032 tp->t_state &= ~TS_FLUSH; 1033 else 1034 ndflush(&tp->t_outq, (int)(sc->sc_tba - tp->t_outq.c_cf)); 1035 (*tp->t_linesw->l_start)(tp); 1036 splx(s); 1037 } 1038 } while (jobs); 1039 } 1040 1041 /* 1042 * Console support functions 1043 */ 1044 void 1045 gtmpsccnprobe(struct consdev *cd) 1046 { 1047 int maj; 1048 /* {extern void return_to_dink(int); return_to_dink(gtbase);} */ 1049 1050 if (!gtmpsc_probe()) 1051 return; 1052 1053 maj = cdevsw_lookup_major(>mpsc_cdevsw); 1054 cd->cn_dev = makedev(maj, 0); 1055 cd->cn_pri = CN_INTERNAL; 1056 } 1057 1058 /* 1059 * gtmpsc_hackinit - hacks required to supprt GTMPSC console 1060 */ 1061 STATIC void 1062 gtmpsc_hackinit(struct gtmpsc_softc *sc, bus_space_tag_t memt, 1063 bus_space_handle_t memh, int unit) 1064 { 1065 gtmpsc_poll_sdma_t *vmps; 1066 gtmpsc_poll_sdma_t *pmps; 1067 1068 DPRINTF(("hackinit\n")); 1069 1070 bzero(sc, sizeof(struct gtmpsc_softc)); 1071 sc->gtmpsc_memt = memt; 1072 sc->gtmpsc_memh = memh; 1073 sc->gtmpsc_unit = unit; 1074 gtmpsc_scp[sc->gtmpsc_unit] = sc; 1075 1076 vmps = (gtmpsc_poll_sdma_t *)gtmpsc_fake_dmapage; /* KVA */ 1077 pmps = (gtmpsc_poll_sdma_t *)gtmpsc_fake_dmapage; /* PA */ 1078 1079 gtmpsc_txdesc_init(vmps, pmps); 1080 gtmpsc_rxdesc_init(vmps, pmps); 1081 1082 sc->gtmpsc_poll_sdmapage = vmps; 1083 } 1084 1085 /* 1086 * gtmpsc_txflush - wait for output to drain 1087 */ 1088 STATIC void 1089 gtmpsc_txflush(gtmpsc_softc_t *sc) 1090 { 1091 unsigned int csr; 1092 unsigned int *csrp; 1093 gtmpsc_polltx_t *vtxp; 1094 int limit = 4000000; /* 4 seconds */ 1095 int ix; 1096 1097 ix = sc->gtmpsc_poll_txix - 1; 1098 if (ix < 0) 1099 ix = GTMPSC_NTXDESC - 1; 1100 1101 vtxp = &sc->gtmpsc_poll_sdmapage->tx[ix]; 1102 csrp = &vtxp->txdesc.sdma_csr; 1103 while (limit > 0) { 1104 GTMPSC_CACHE_INVALIDATE(csrp); 1105 csr = desc_read(csrp); 1106 if ((csr & SDMA_CSR_TX_OWN) == 0) 1107 break; 1108 DELAY(GTMPSC_POLL_DELAY); 1109 limit -= GTMPSC_POLL_DELAY; 1110 } 1111 } 1112 1113 STATIC void 1114 gtmpsc_iflush(gtmpsc_softc_t *sc) 1115 { 1116 int timo; 1117 char c; 1118 int stat; 1119 1120 for (timo = 50000; timo; timo--) 1121 if (gtmpsc_common_pollc(sc->gtmpsc_unit, &c, &stat) == 0) 1122 return; 1123 #ifdef DIAGNOSTIC 1124 printf("%s: gtmpsc_iflush timeout %02x\n", sc->gtmpsc_dev.dv_xname, c); 1125 #endif 1126 } 1127 1128 STATIC void 1129 gtmpscinit_stop(struct gtmpsc_softc *sc, int once) 1130 { 1131 unsigned int r; 1132 unsigned int unit = sc->gtmpsc_unit; 1133 1134 /* 1135 * XXX HACK FIXME 1136 * PMON output has not been flushed. give him a chance 1137 */ 1138 #if 1 1139 if (! once) 1140 DELAY(100000); /* XXX */ 1141 #endif 1142 1143 DPRINTF(("gtmpscinit_stop: unit 0x%x\n", unit)); 1144 if (unit >= GTMPSC_NCHAN) { 1145 PRINTF(("mpscinit: undefined unit %d\n", sc->gtmpsc_unit)); 1146 return; 1147 } 1148 1149 sc->gtmpsc_chr2 = 0; /* Default value of CHR2 */ 1150 1151 /* 1152 * stop GTMPSC unit 1153 */ 1154 r = sc->gtmpsc_chr2 | GTMPSC_CHR2_RXABORT|GTMPSC_CHR2_TXABORT; 1155 GT_WRITE(sc, GTMPSC_U_CHRN(unit, 2), r); 1156 1157 DELAY(GTMPSC_RESET_DELAY); 1158 1159 /* 1160 * abort SDMA TX, RX for GTMPSC unit 1161 */ 1162 GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_AR|SDMA_SDCM_AT); 1163 1164 if (once == 0) { 1165 /* 1166 * Determine if this is the buggy GT-64260A case. 1167 * If this is, then most of GTMPSC and SDMA registers 1168 * are unreadable. 1169 * (They always yield -1). 1170 */ 1171 GT_WRITE(sc, SDMA_IMASK, 0); 1172 r = GT_READ(sc, SDMA_IMASK); 1173 gt_reva_gtmpsc_bug = r == ~0; 1174 sdma_imask = 0; 1175 } 1176 1177 /* 1178 * If Rx is disabled, we don't need to wait around for 1179 * abort completion. 1180 */ 1181 if ((GT_READ(sc, GTMPSC_U_MMCR_LO(unit)) & GTMPSC_MMCR_LO_ER) == 0) 1182 return; 1183 1184 /* 1185 * poll for GTMPSC RX abort completion 1186 */ 1187 if (gt_reva_gtmpsc_bug) { 1188 /* Sync up with the device first */ 1189 r = GT_READ(sc, GTMPSC_U_CHRN(unit, 2)); 1190 DELAY(GTMPSC_RESET_DELAY); 1191 } else 1192 for (;;) { 1193 r = GT_READ(sc, GTMPSC_U_CHRN(unit, 2)); 1194 if (! (r & GTMPSC_CHR2_RXABORT)) 1195 break; 1196 } 1197 1198 /* 1199 * poll for SDMA RX abort completion 1200 */ 1201 for (;;) { 1202 r = GT_READ(sc, SDMA_U_SDCM(unit)); 1203 if (! (r & (SDMA_SDCM_AR|SDMA_SDCM_AT))) 1204 break; 1205 DELAY(50); 1206 } 1207 1208 } 1209 1210 STATIC void 1211 gtmpscinit_start(struct gtmpsc_softc *sc, int once) 1212 { 1213 unsigned int r; 1214 unsigned int unit = sc->gtmpsc_unit; 1215 1216 /* 1217 * initialize softc's "current" transfer indicies & counts 1218 */ 1219 sc->gtmpsc_cx = 0; 1220 sc->gtmpsc_nc = 0; 1221 sc->gtmpsc_poll_txix = 0; 1222 sc->gtmpsc_poll_rxix = 0; 1223 1224 /* 1225 * initialize softc's RX softintr FIFO 1226 */ 1227 sc->gtmpsc_rxfifo_putix = 0; 1228 sc->gtmpsc_rxfifo_getix = 0; 1229 sc->gtmpsc_rxfifo_navail = GTMPSC_RXFIFOSZ; 1230 memset(&sc->gtmpsc_rxfifo[0], 0, GTMPSC_RXFIFOSZ); 1231 1232 /* 1233 * set SDMA unit port TX descriptor pointers 1234 * "next" pointer of last descriptor is start of ring 1235 */ 1236 r = desc_read( 1237 &sc->gtmpsc_poll_sdmapage->tx[GTMPSC_NTXDESC-1].txdesc.sdma_next); 1238 GT_WRITE(sc, SDMA_U_SCTDP(unit), r); /* current */ 1239 (void)GT_READ(sc, SDMA_U_SCTDP(unit)); 1240 GT_WRITE(sc, SDMA_U_SFTDP(unit), r); /* first */ 1241 (void)GT_READ(sc, SDMA_U_SFTDP(unit)); 1242 /* 1243 * set SDMA unit port RX descriptor pointer 1244 * "next" pointer of last descriptor is start of ring 1245 */ 1246 r = desc_read( 1247 &sc->gtmpsc_poll_sdmapage->rx[GTMPSC_NRXDESC-1].rxdesc.sdma_next); 1248 GT_WRITE(sc, SDMA_U_SCRDP(unit), r); /* current */ 1249 1250 /* 1251 * initialize SDMA unit Configuration Register 1252 */ 1253 r = SDMA_SDC_BSZ_8x64|SDMA_SDC_SFM|SDMA_SDC_RFT; 1254 GT_WRITE(sc, SDMA_U_SDC(unit), r); 1255 1256 /* 1257 * enable SDMA receive 1258 */ 1259 GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_ERD); 1260 1261 if (once == 0) { 1262 /* 1263 * GTMPSC Routing: 1264 * MR0 --> Serial Port 0 1265 * MR1 --> Serial Port 1 1266 */ 1267 GT_WRITE(sc, GTMPSC_MRR, GTMPSC_MRR_RES); 1268 1269 /* 1270 * RX and TX Clock Routing: 1271 * CRR0 --> BRG0 1272 * CRR1 --> BRG1 1273 */ 1274 r = GTMPSC_CRR_BRG0 | (GTMPSC_CRR_BRG1 << GTMPSC_CRR1_SHIFT); 1275 GT_WRITE(sc, GTMPSC_RCRR, r); 1276 GT_WRITE(sc, GTMPSC_TCRR, r); 1277 } 1278 sc->gtmpsc_brg_bcr = BRG_BCR_EN | GT_MPSC_CLOCK_SOURCE | 1279 compute_cdv(GT_MPSC_DEFAULT_BAUD_RATE); 1280 sc->gtmpsc_chr3 = GTMPSC_MAXIDLE(GT_MPSC_DEFAULT_BAUD_RATE); 1281 gtmpsc_loadchannelregs(sc); 1282 1283 /* 1284 * set MPSC Protocol configuration register for GTMPSC unit 1285 */ 1286 GT_WRITE(sc, GTMPSC_U_MPCR(unit), GTMPSC_MPCR_CL_8); 1287 1288 /* 1289 * set MPSC LO and HI port config registers for GTMPSC unit 1290 */ 1291 r = GTMPSC_MMCR_LO_MODE_UART 1292 |GTMPSC_MMCR_LO_ET 1293 |GTMPSC_MMCR_LO_ER 1294 |GTMPSC_MMCR_LO_NLM; 1295 GT_WRITE(sc, GTMPSC_U_MMCR_LO(unit), r); 1296 1297 r = 1298 GTMPSC_MMCR_HI_TCDV_DEFAULT 1299 |GTMPSC_MMCR_HI_RDW 1300 |GTMPSC_MMCR_HI_RCDV_DEFAULT; 1301 GT_WRITE(sc, GTMPSC_U_MMCR_HI(unit), r); 1302 1303 /* 1304 * tell MPSC receive the Enter Hunt 1305 */ 1306 r = sc->gtmpsc_chr2 | GTMPSC_CHR2_EH; 1307 GT_WRITE(sc, GTMPSC_U_CHRN(unit, 2), r); 1308 1309 /* 1310 * clear any pending SDMA interrupts for this unit 1311 */ 1312 r = GT_READ(sc, SDMA_ICAUSE); 1313 r &= ~SDMA_U_INTR_MASK(unit); 1314 GT_WRITE(sc, SDMA_ICAUSE, r); /* ??? */ 1315 1316 DPRINTF(("gtmpscinit: OK\n")); 1317 } 1318 1319 /* 1320 * gtmpscinit - prepare MPSC for operation 1321 * 1322 * assumes we are called at ipl >= IPL_SERIAL 1323 */ 1324 STATIC void 1325 gtmpscinit(struct gtmpsc_softc *sc) 1326 { 1327 static int once = 0; 1328 1329 gtmpscinit_stop(sc, once); 1330 gtmpscinit_start(sc, once); 1331 once = 1; 1332 } 1333 1334 /* 1335 * gtmpsccninit - initialize the driver and the mpsc device 1336 */ 1337 void 1338 gtmpsccninit(struct consdev *cd) 1339 { 1340 } 1341 1342 int 1343 gtmpsccngetc(dev_t dev) 1344 { 1345 unsigned int unit = 0; 1346 int c; 1347 1348 unit = GTMPSCUNIT(dev); 1349 if (major(dev) != 0) { 1350 struct gtmpsc_softc *sc = device_lookup(>mpsc_cd, unit); 1351 if (sc == NULL) 1352 return 0; 1353 unit = sc->gtmpsc_unit; 1354 } 1355 if (unit >= GTMPSC_NCHAN) 1356 return 0; 1357 c = gtmpsc_common_getc(unit); 1358 1359 return c; 1360 } 1361 1362 void 1363 gtmpsccnputc(dev_t dev, int c) 1364 { 1365 unsigned int unit = 0; 1366 char ch = c; 1367 static int ix = 0; 1368 1369 if (gtmpsccninit_done == 0) { 1370 if ((minor(dev) == 0) && (ix < sizeof(gtmpsc_earlybuf))) 1371 gtmpsc_earlybuf[ix++] = (unsigned char)c; 1372 return; 1373 } 1374 1375 unit = GTMPSCUNIT(dev); 1376 if (major(dev) != 0) { 1377 struct gtmpsc_softc *sc = device_lookup(>mpsc_cd, unit); 1378 if (sc == NULL) 1379 return; 1380 unit = sc->gtmpsc_unit; 1381 } 1382 1383 if (unit >= GTMPSC_NCHAN) 1384 return; 1385 1386 gtmpsc_common_putc(unit, ch); 1387 } 1388 1389 void 1390 gtmpsccnpollc(dev_t dev, int on) 1391 { 1392 } 1393 1394 int 1395 gtmpsccnattach(bus_space_tag_t memt, bus_space_handle_t memh, int unit, 1396 int speed, tcflag_t tcflag) 1397 { 1398 struct gtmpsc_softc *sc = >mpsc_fake_softc; 1399 unsigned char *cp; 1400 unsigned char c; 1401 unsigned int i; 1402 1403 if (gtmpsccninit_done) 1404 return 0; 1405 1406 DPRINTF(("gtmpsccnattach\n")); 1407 gtmpsc_hackinit(sc, memt, memh, unit); 1408 DPRINTF(("gtmpscinit\n")); 1409 gtmpscinit(sc); 1410 gtmpsccninit_done = 1; 1411 cp = gtmpsc_earlybuf; 1412 strcpy(gtmpsc_earlybuf, "\r\nMPSC Lives!\r\n"); 1413 for (i=0; i < sizeof(gtmpsc_earlybuf); i++) { 1414 c = *cp++; 1415 if (c == 0) 1416 break; 1417 gtmpsc_common_putc(unit, c); 1418 } 1419 DPRINTF(("switching cn_tab\n")); 1420 gtmpsc_consdev.cn_dev = makedev(0, unit); 1421 cn_tab = >mpsc_consdev; 1422 DPRINTF(("switched cn_tab!\n")); 1423 return 0; 1424 } 1425 1426 /* 1427 * gtmpsc_common_pollc - non-blocking console read 1428 * 1429 * if there is an RX char, return it in *cp 1430 * set *statp if Break detected 1431 * 1432 * assumes we are called at ipl >= IPL_SERIAL 1433 * 1434 * return 1 if there is RX data 1435 * otherwise return 0 1436 */ 1437 STATIC int 1438 gtmpsc_common_pollc(unsigned int unit, char *cp, int *statp) 1439 { 1440 struct gtmpsc_softc *sc = gtmpsc_scp[unit]; 1441 gtmpsc_pollrx_t *vrxp; 1442 unsigned int ix; 1443 unsigned int cx; 1444 unsigned int nc; 1445 1446 *statp = GTMPSC_STAT_NONE; 1447 ix = sc->gtmpsc_poll_rxix; 1448 nc = sc->gtmpsc_nc; 1449 cx = sc->gtmpsc_cx; 1450 if (nc == 0) { 1451 unsigned int *csrp; 1452 unsigned int csr; 1453 1454 vrxp = &sc->gtmpsc_poll_sdmapage->rx[ix]; 1455 csrp = &vrxp->rxdesc.sdma_csr; 1456 cx = 0; 1457 1458 GTMPSC_CACHE_INVALIDATE(csrp); 1459 csr = desc_read(csrp); 1460 if (csr & SDMA_CSR_RX_OWN) 1461 return 0; 1462 if (csr & SDMA_CSR_RX_BR) 1463 *statp = GTMPSC_STAT_BREAK; 1464 if (csr & SDMA_CSR_RX_ES) 1465 PRINTF(("mpsc 0 RX error, rxdesc csr 0x%x\n", csr)); 1466 1467 nc = desc_read(&vrxp->rxdesc.sdma_cnt); 1468 nc &= SDMA_RX_CNT_BCNT_MASK; 1469 csr = SDMA_CSR_RX_L|SDMA_CSR_RX_F|SDMA_CSR_RX_OWN 1470 |SDMA_CSR_RX_EI; 1471 if (nc == 0) { 1472 if ((++ix) >= GTMPSC_NRXDESC) 1473 ix = 0; 1474 sc->gtmpsc_poll_rxix = ix; 1475 desc_write(csrp, csr); 1476 GTMPSC_CACHE_FLUSH(csrp); 1477 return 0; 1478 } 1479 bcopy(vrxp->rxbuf, sc->gtmpsc_rxbuf, nc); 1480 desc_write(csrp, csr); 1481 GTMPSC_CACHE_FLUSH(csrp); 1482 } 1483 gtmpsc_poll_pollc_cnt++; 1484 nc--; 1485 *cp = sc->gtmpsc_rxbuf[cx++]; 1486 if (nc == 0) { 1487 if ((++ix) >= GTMPSC_NRXDESC) 1488 ix = 0; 1489 sc->gtmpsc_poll_rxix = ix; 1490 } 1491 sc->gtmpsc_cx = cx; 1492 sc->gtmpsc_nc = nc; 1493 return 1; 1494 } 1495 1496 /* 1497 * gtmpsc_common_getc - polled console read 1498 * 1499 * We copy data from the DMA buffers into a buffer in the softc 1500 * to reduce descriptor ownership turnaround time 1501 * MPSC can crater if it wraps descriptor rings, 1502 * which is asynchronous and throttled only by line speed. 1503 * 1504 * This code assumes the buffer PA==KVA 1505 * and assumes we are called at ipl >= IPL_SERIAL 1506 */ 1507 STATIC int 1508 gtmpsc_common_getc(unsigned int unit) 1509 { 1510 struct gtmpsc_softc *sc = gtmpsc_scp[unit]; 1511 gtmpsc_pollrx_t *vrxp; 1512 unsigned int ix; 1513 unsigned int cx; 1514 unsigned int nc; 1515 unsigned int wdog_interval; 1516 int c; 1517 1518 ix = sc->gtmpsc_poll_rxix; 1519 nc = sc->gtmpsc_nc; 1520 cx = sc->gtmpsc_cx; 1521 wdog_interval = 0; 1522 while (nc == 0) { 1523 unsigned int *csrp; 1524 unsigned int csr; 1525 unsigned int r; 1526 1527 vrxp = &sc->gtmpsc_poll_sdmapage->rx[ix]; 1528 csrp = &vrxp->rxdesc.sdma_csr; 1529 cx = 0; 1530 1531 GTMPSC_CACHE_INVALIDATE(csrp); 1532 csr = desc_read(csrp); 1533 if (csr & SDMA_CSR_RX_OWN) { 1534 r = sc->gtmpsc_chr2 | GTMPSC_CHR2_CRD; 1535 GT_WRITE(sc, GTMPSC_U_CHRN(unit, 2), r); 1536 do { 1537 if (wdog_interval++ % 32) 1538 gt_watchdog_service(); 1539 gtmpsc_poll_getc_miss++; 1540 GTMPSC_CACHE_INVALIDATE(csrp); 1541 DELAY(50); 1542 csr = desc_read(csrp); 1543 } while (csr & SDMA_CSR_RX_OWN); 1544 } else 1545 if (wdog_interval++ % 32) 1546 gt_watchdog_service(); 1547 if (csr & SDMA_CSR_RX_ES) 1548 PRINTF(("mpsc 0 RX error, rxdesc csr 0x%x\n", csr)); 1549 1550 nc = desc_read(&vrxp->rxdesc.sdma_cnt); 1551 nc &= SDMA_RX_CNT_BCNT_MASK; 1552 if (nc) { 1553 bcopy(vrxp->rxbuf, sc->gtmpsc_rxbuf, nc); 1554 } else { 1555 if ((++ix) >= GTMPSC_NRXDESC) 1556 ix = 0; 1557 sc->gtmpsc_poll_rxix = ix; 1558 } 1559 csr = SDMA_CSR_RX_L|SDMA_CSR_RX_F|SDMA_CSR_RX_OWN 1560 |SDMA_CSR_RX_EI; 1561 desc_write(csrp, csr); 1562 GTMPSC_CACHE_FLUSH(csrp); 1563 #ifdef KGDB 1564 if (unit == comkgdbport && gt_reva_gtmpsc_bug) 1565 GT_WRITE(sc, SDMA_ICAUSE, ~SDMA_INTR_RXBUF(unit)); 1566 #endif 1567 } 1568 gtmpsc_poll_getc_cnt++; 1569 nc--; 1570 c = (int)sc->gtmpsc_rxbuf[cx++]; 1571 if (nc == 0) { 1572 if ((++ix) >= GTMPSC_NRXDESC) 1573 ix = 0; 1574 sc->gtmpsc_poll_rxix = ix; 1575 } 1576 sc->gtmpsc_cx = cx; 1577 sc->gtmpsc_nc = nc; 1578 gt_watchdog_service(); 1579 return c; 1580 } 1581 1582 /* 1583 * gtmpsc_common_putn - write a buffer into the hardware 1584 * 1585 * assumes we are called at ipl >= IPL_SERIAL 1586 */ 1587 STATIC void 1588 gtmpsc_common_putn(struct gtmpsc_softc *sc) 1589 1590 { 1591 int unit = sc->gtmpsc_unit; 1592 int n; 1593 int kick; 1594 gtmpsc_polltx_t *vtxp; 1595 unsigned int *csrp; 1596 unsigned int csr; 1597 unsigned int ix; 1598 unsigned int sdcm; 1599 1600 kick = 0; 1601 for (ix = sc->gtmpsc_poll_txix; sc->sc_tbc;) { 1602 vtxp = &sc->gtmpsc_poll_sdmapage->tx[ix]; 1603 csrp = &vtxp->txdesc.sdma_csr; 1604 GTMPSC_CACHE_INVALIDATE(csrp); 1605 csr = desc_read(csrp); 1606 if ((csr & SDMA_CSR_TX_OWN) != 0) 1607 break; 1608 n = sc->sc_tbc; 1609 if (n > GTMPSC_TXBUFSZ) 1610 n = GTMPSC_TXBUFSZ; 1611 bcopy(sc->sc_tba, vtxp->txbuf, n); 1612 csr = SDMA_CSR_TX_L | SDMA_CSR_TX_F 1613 | SDMA_CSR_TX_EI | SDMA_CSR_TX_OWN; 1614 desc_write(&vtxp->txdesc.sdma_cnt, 1615 (n << SDMA_TX_CNT_BCNT_SHIFT) | n); 1616 desc_write(csrp, csr); 1617 GTMPSC_CACHE_FLUSH(csrp); 1618 sc->sc_tbc -= n; 1619 sc->sc_tba += n; 1620 gtmpsc_poll_putn_cnt += n; 1621 sc->cnt_tx_to_sdma += n; 1622 kick = 1; 1623 1624 if (++ix >= GTMPSC_NTXDESC) 1625 ix = 0; 1626 } 1627 if (kick) { 1628 sc->gtmpsc_poll_txix = ix; 1629 1630 /* 1631 * now kick some SDMA 1632 */ 1633 sdcm = GT_READ(sc, SDMA_U_SDCM(unit)); 1634 1635 if ((sdcm & SDMA_SDCM_TXD) == 0) { 1636 GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_TXD); 1637 } 1638 } 1639 } 1640 1641 /* 1642 * gtmpsc_common_putc - polled console putc 1643 * 1644 * assumes we are called at ipl >= IPL_SERIAL 1645 */ 1646 STATIC void 1647 gtmpsc_common_putc(unsigned int unit, unsigned char c) 1648 { 1649 struct gtmpsc_softc *sc = gtmpsc_scp[unit]; 1650 gtmpsc_polltx_t *vtxp; 1651 unsigned int *csrp; 1652 unsigned int csr; 1653 unsigned int ix; 1654 unsigned int nix; 1655 unsigned int wdog_interval = 0; 1656 1657 DPRINTF(("gtmpsc_common_putc(%d, '%c'): cur=%#x, first=%#x", unit, c, 1658 GT_READ(sc, SDMA_U_SCTDP(unit)), /* current */ 1659 GT_READ(sc, SDMA_U_SFTDP(unit)))); /* first */ 1660 ix = sc->gtmpsc_poll_txix; 1661 nix = ix + 1; 1662 if (nix >= GTMPSC_NTXDESC) 1663 nix = 0; 1664 sc->gtmpsc_poll_txix = nix; 1665 vtxp = &sc->gtmpsc_poll_sdmapage->tx[ix]; 1666 csrp = &vtxp->txdesc.sdma_csr; 1667 1668 1669 for (;;) { 1670 GTMPSC_CACHE_INVALIDATE(csrp); 1671 csr = desc_read(csrp); 1672 if ((csr & SDMA_CSR_TX_OWN) == 0) 1673 break; 1674 gtmpsc_poll_putc_miss++; 1675 DELAY(40); 1676 DPRINTF((".")); 1677 if (wdog_interval++ % 32) 1678 gt_watchdog_service(); 1679 } 1680 if (csr & SDMA_CSR_TX_ES) 1681 PRINTF(("mpsc %d TX error, txdesc csr 0x%x\n", unit, csr)); 1682 1683 gtmpsc_poll_putc_cnt++; 1684 vtxp->txbuf[0] = c; 1685 csr = SDMA_CSR_TX_L | SDMA_CSR_TX_F | SDMA_CSR_TX_EI | SDMA_CSR_TX_OWN; 1686 desc_write(&vtxp->txdesc.sdma_cnt, (1 << SDMA_TX_CNT_BCNT_SHIFT) | 1); 1687 desc_write(csrp, csr); 1688 GTMPSC_CACHE_FLUSH(csrp); 1689 1690 /* 1691 * now kick some SDMA 1692 */ 1693 GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_TXD); 1694 gt_watchdog_service(); 1695 } 1696 1697 1698 STATIC void 1699 gtmpsc_poll(void *arg) 1700 { 1701 struct gtmpsc_softc *sc = (struct gtmpsc_softc *)arg; 1702 int kick; 1703 char ch; 1704 int stat; 1705 static struct timeval msg_time = {0,0}; 1706 static struct timeval cur_time; 1707 static int fifo_full = 0; 1708 1709 kick = 0; 1710 while (gtmpsc_common_pollc(sc->gtmpsc_unit, &ch, &stat)) { 1711 #ifdef DDB 1712 if (stat) 1713 break; 1714 #endif 1715 ++sc->cnt_rx_from_sdma; 1716 if (sc->gtmpsc_rxfifo_navail != 0) { 1717 sc->gtmpsc_rxfifo[sc->gtmpsc_rxfifo_putix++] = ch; 1718 if (sc->gtmpsc_rxfifo_putix == GTMPSC_RXFIFOSZ) 1719 sc->gtmpsc_rxfifo_putix = 0; 1720 atomic_add(&sc->gtmpsc_rxfifo_navail, -1); 1721 ++sc->cnt_rx_to_fifo; 1722 fifo_full = 0; 1723 kick = 1; 1724 } else { 1725 if (fifo_full == 0) { 1726 fifo_full = 1; 1727 microtime(&cur_time); 1728 if (cur_time.tv_sec - msg_time.tv_sec >= 5) { 1729 /* Only do this once in 5 sec */ 1730 msg_time = cur_time; 1731 printf("mpsc%d: input FIFO full, " 1732 "dropping incoming characters\n", 1733 sc->gtmpsc_unit); 1734 } 1735 } 1736 } 1737 } 1738 #ifdef DDB 1739 if (stat) { 1740 if (cn_tab == >mpsc_consdev) { 1741 Debugger(); 1742 } 1743 } 1744 #endif 1745 if (kick) 1746 softint_schedule(sc->sc_si); 1747 } 1748 1749 #ifdef KGDB 1750 /* ARGSUSED */ 1751 STATIC int 1752 gtmpsc_kgdb_getc(arg) 1753 void *arg; 1754 { 1755 1756 return (gtmpsc_common_getc(comkgdbport)); 1757 } 1758 1759 /* ARGSUSED */ 1760 STATIC void 1761 gtmpsc_kgdb_putc(arg, c) 1762 void *arg; 1763 int c; 1764 { 1765 1766 return (gtmpsc_common_putc(comkgdbport, c)); 1767 } 1768 1769 STATIC void 1770 gtmpsc_kgdb_poll(void *arg) 1771 { 1772 struct gtmpsc_softc *sc = (struct gtmpsc_softc *)arg; 1773 int s; 1774 char c; 1775 int brk; 1776 1777 s = splserial(); 1778 if (kgdb_recover == 0) { /* gdb is not currently talking to its agent */ 1779 while (gtmpsc_common_pollc(sc->gtmpsc_unit, &c, &brk)) { 1780 if (c == CTRL('c')) 1781 brk = GTMPSC_STAT_BREAK; 1782 if (brk == GTMPSC_STAT_BREAK) 1783 break; 1784 } 1785 if (brk == GTMPSC_STAT_BREAK) { 1786 if (kgdb_break_immediate) 1787 breakpoint(); 1788 else { 1789 printf("connecting to kgdb\n"); 1790 kgdb_connect(1); 1791 } 1792 } 1793 } 1794 splx(s); 1795 } 1796 1797 #endif /* KGDB */ 1798 1799 #if 0 1800 void 1801 gtmpsc_printf(const char *fmt, ...) 1802 { 1803 struct consdev *ocd; 1804 int s; 1805 va_list ap; 1806 1807 s = splserial(); 1808 ocd = cn_tab; 1809 cn_tab = &constab[0]; 1810 va_start(ap, fmt); 1811 printf(fmt, ap); 1812 va_end(ap); 1813 cn_tab = ocd; 1814 splx(s); 1815 } 1816 #endif 1817 1818 void 1819 gtmpsc_mem_printf(const char *fmt, ...) 1820 { 1821 va_list ap; 1822 static unsigned char *p = gtmpsc_print_buf; 1823 1824 if (p >= >mpsc_print_buf[GTMPSC_PRINT_BUF_SIZE - 128]) { 1825 bzero(gtmpsc_print_buf, GTMPSC_PRINT_BUF_SIZE); 1826 p = gtmpsc_print_buf; 1827 } 1828 va_start(ap, fmt); 1829 p += vsprintf(p, fmt, ap); 1830 va_end(ap); 1831 } 1832 1833 void 1834 gtmpsc_shutdownhook(void *arg) 1835 { 1836 gtmpsc_softc_t *sc = (gtmpsc_softc_t *)arg; 1837 1838 gtmpsc_txflush(sc); 1839 } 1840 1841 void 1842 gtmpsccnhalt(dev_t dev) 1843 { 1844 unsigned int unit; 1845 u_int32_t r; 1846 1847 for (unit = 0; unit < GTMPSC_NCHAN; unit++) { 1848 gtmpsc_softc_t *sc = gtmpsc_scp[unit]; 1849 if (sc == NULL) 1850 continue; 1851 1852 /* 1853 * flush TX buffers 1854 */ 1855 gtmpsc_txflush(sc); 1856 1857 /* 1858 * stop MPSC unit RX 1859 */ 1860 r = GT_READ(sc, GTMPSC_U_CHRN(unit, 2)); 1861 r &= ~GTMPSC_CHR2_EH; 1862 r |= GTMPSC_CHR2_RXABORT; 1863 GT_WRITE(sc, GTMPSC_U_CHRN(unit, 2), r); 1864 1865 DELAY(GTMPSC_RESET_DELAY); 1866 1867 /* 1868 * abort SDMA RX for MPSC unit 1869 */ 1870 GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_AR); 1871 } 1872 } 1873 1874 void 1875 gtmpsc_puts(char *str) 1876 { 1877 char c; 1878 1879 if (str == NULL) 1880 return; 1881 while ((c = *str++) != 0) 1882 gtmpsccnputc(0, c); 1883 } 1884