1 1.40 thorpej /* $NetBSD: lsi64854.c,v 1.40 2022/09/25 18:43:32 thorpej Exp $ */ 2 1.13 eeh 3 1.1 pk /*- 4 1.1 pk * Copyright (c) 1998 The NetBSD Foundation, Inc. 5 1.1 pk * All rights reserved. 6 1.1 pk * 7 1.1 pk * This code is derived from software contributed to The NetBSD Foundation 8 1.1 pk * by Paul Kranenburg. 9 1.1 pk * 10 1.1 pk * Redistribution and use in source and binary forms, with or without 11 1.1 pk * modification, are permitted provided that the following conditions 12 1.1 pk * are met: 13 1.1 pk * 1. Redistributions of source code must retain the above copyright 14 1.1 pk * notice, this list of conditions and the following disclaimer. 15 1.1 pk * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 pk * notice, this list of conditions and the following disclaimer in the 17 1.1 pk * documentation and/or other materials provided with the distribution. 18 1.1 pk * 19 1.1 pk * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 pk * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 pk * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 pk * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 pk * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 pk * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 pk * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 pk * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 pk * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 pk * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 pk * POSSIBILITY OF SUCH DAMAGE. 30 1.1 pk */ 31 1.19 lukem 32 1.19 lukem #include <sys/cdefs.h> 33 1.40 thorpej __KERNEL_RCSID(0, "$NetBSD: lsi64854.c,v 1.40 2022/09/25 18:43:32 thorpej Exp $"); 34 1.1 pk 35 1.1 pk #include <sys/param.h> 36 1.1 pk #include <sys/systm.h> 37 1.1 pk #include <sys/kernel.h> 38 1.1 pk #include <sys/errno.h> 39 1.1 pk #include <sys/device.h> 40 1.1 pk 41 1.30 ad #include <sys/bus.h> 42 1.1 pk #include <machine/autoconf.h> 43 1.30 ad #include <sys/cpu.h> 44 1.1 pk 45 1.1 pk #include <dev/scsipi/scsi_all.h> 46 1.1 pk #include <dev/scsipi/scsipi_all.h> 47 1.1 pk #include <dev/scsipi/scsiconf.h> 48 1.1 pk 49 1.1 pk #include <dev/ic/lsi64854reg.h> 50 1.1 pk #include <dev/ic/lsi64854var.h> 51 1.1 pk 52 1.1 pk #include <dev/ic/ncr53c9xreg.h> 53 1.1 pk #include <dev/ic/ncr53c9xvar.h> 54 1.1 pk 55 1.24 perry void lsi64854_reset(struct lsi64854_softc *); 56 1.32 tsutsui int lsi64854_setup(struct lsi64854_softc *, uint8_t **, size_t *, 57 1.24 perry int, size_t *); 58 1.32 tsutsui int lsi64854_setup_pp(struct lsi64854_softc *, uint8_t **, size_t *, 59 1.24 perry int, size_t *); 60 1.1 pk 61 1.1 pk #ifdef DEBUG 62 1.12 eeh #define LDB_SCSI 1 63 1.12 eeh #define LDB_ENET 2 64 1.12 eeh #define LDB_PP 4 65 1.12 eeh #define LDB_ANY 0xff 66 1.1 pk int lsi64854debug = 0; 67 1.12 eeh #define DPRINTF(a,x) do { if (lsi64854debug & (a)) printf x ; } while (0) 68 1.1 pk #else 69 1.12 eeh #define DPRINTF(a,x) 70 1.1 pk #endif 71 1.1 pk 72 1.32 tsutsui #define MAX_DMA_SZ (16 * 1024 * 1024) 73 1.1 pk 74 1.1 pk /* 75 1.1 pk * Finish attaching this DMA device. 76 1.1 pk * Front-end must fill in these fields: 77 1.1 pk * sc_bustag 78 1.1 pk * sc_dmatag 79 1.1 pk * sc_regs 80 1.1 pk * sc_burst 81 1.1 pk * sc_channel (one of SCSI, ENET, PP) 82 1.1 pk * sc_client (one of SCSI, ENET, PP `soft_c' pointers) 83 1.1 pk */ 84 1.1 pk void 85 1.32 tsutsui lsi64854_attach(struct lsi64854_softc *sc) 86 1.1 pk { 87 1.32 tsutsui uint32_t csr; 88 1.1 pk 89 1.1 pk /* Indirect functions */ 90 1.1 pk switch (sc->sc_channel) { 91 1.1 pk case L64854_CHANNEL_SCSI: 92 1.1 pk sc->intr = lsi64854_scsi_intr; 93 1.4 pk sc->setup = lsi64854_setup; 94 1.1 pk break; 95 1.1 pk case L64854_CHANNEL_ENET: 96 1.1 pk sc->intr = lsi64854_enet_intr; 97 1.1 pk break; 98 1.1 pk case L64854_CHANNEL_PP: 99 1.4 pk sc->setup = lsi64854_setup_pp; 100 1.1 pk break; 101 1.1 pk default: 102 1.32 tsutsui aprint_error(": unknown channel"); 103 1.1 pk } 104 1.1 pk sc->reset = lsi64854_reset; 105 1.1 pk 106 1.1 pk /* Allocate a dmamap */ 107 1.1 pk if (bus_dmamap_create(sc->sc_dmatag, MAX_DMA_SZ, 1, MAX_DMA_SZ, 108 1.32 tsutsui 0, BUS_DMA_WAITOK, &sc->sc_dmamap) != 0) { 109 1.32 tsutsui aprint_error(": DMA map create failed\n"); 110 1.1 pk return; 111 1.1 pk } 112 1.1 pk 113 1.15 petrov csr = L64854_GCSR(sc); 114 1.15 petrov sc->sc_rev = csr & L64854_DEVID; 115 1.21 chs if (sc->sc_rev == DMAREV_HME) { 116 1.21 chs return; 117 1.21 chs } 118 1.32 tsutsui aprint_normal(": DMA rev "); 119 1.1 pk switch (sc->sc_rev) { 120 1.1 pk case DMAREV_0: 121 1.32 tsutsui aprint_normal("0"); 122 1.1 pk break; 123 1.1 pk case DMAREV_ESC: 124 1.32 tsutsui aprint_normal("esc"); 125 1.1 pk break; 126 1.1 pk case DMAREV_1: 127 1.32 tsutsui aprint_normal("1"); 128 1.1 pk break; 129 1.1 pk case DMAREV_PLUS: 130 1.32 tsutsui aprint_normal("1+"); 131 1.1 pk break; 132 1.1 pk case DMAREV_2: 133 1.32 tsutsui aprint_normal("2"); 134 1.15 petrov break; 135 1.1 pk default: 136 1.32 tsutsui aprint_normal("unknown (0x%x)", sc->sc_rev); 137 1.1 pk } 138 1.1 pk 139 1.17 tsutsui DPRINTF(LDB_ANY, (", burst 0x%x, csr 0x%x", sc->sc_burst, csr)); 140 1.32 tsutsui aprint_normal("\n"); 141 1.1 pk } 142 1.1 pk 143 1.15 petrov /* 144 1.15 petrov * DMAWAIT waits while condition is true 145 1.15 petrov */ 146 1.1 pk #define DMAWAIT(SC, COND, MSG, DONTPANIC) do if (COND) { \ 147 1.1 pk int count = 500000; \ 148 1.1 pk while ((COND) && --count > 0) DELAY(1); \ 149 1.1 pk if (count == 0) { \ 150 1.1 pk printf("%s: line %d: CSR = 0x%lx\n", __FILE__, __LINE__, \ 151 1.1 pk (u_long)L64854_GCSR(SC)); \ 152 1.1 pk if (DONTPANIC) \ 153 1.1 pk printf(MSG); \ 154 1.1 pk else \ 155 1.1 pk panic(MSG); \ 156 1.1 pk } \ 157 1.32 tsutsui } while (/* CONSTCOND */ 0) 158 1.1 pk 159 1.1 pk #define DMA_DRAIN(sc, dontpanic) do { \ 160 1.32 tsutsui uint32_t _csr; \ 161 1.1 pk /* \ 162 1.1 pk * DMA rev0 & rev1: we are not allowed to touch the DMA "flush" \ 163 1.1 pk * and "drain" bits while it is still thinking about a \ 164 1.1 pk * request. \ 165 1.1 pk * other revs: D_ESC_R_PEND bit reads as 0 \ 166 1.1 pk */ \ 167 1.1 pk DMAWAIT(sc, L64854_GCSR(sc) & D_ESC_R_PEND, "R_PEND", dontpanic);\ 168 1.15 petrov if (sc->sc_rev != DMAREV_HME) { \ 169 1.15 petrov /* \ 170 1.15 petrov * Select drain bit based on revision \ 171 1.15 petrov * also clears errors and D_TC flag \ 172 1.15 petrov */ \ 173 1.26 christos _csr = L64854_GCSR(sc); \ 174 1.15 petrov if (sc->sc_rev == DMAREV_1 || sc->sc_rev == DMAREV_0) \ 175 1.26 christos _csr |= D_ESC_DRAIN; \ 176 1.15 petrov else \ 177 1.26 christos _csr |= L64854_INVALIDATE; \ 178 1.1 pk \ 179 1.26 christos L64854_SCSR(sc,_csr); \ 180 1.15 petrov } \ 181 1.1 pk /* \ 182 1.1 pk * Wait for draining to finish \ 183 1.1 pk * rev0 & rev1 call this PACKCNT \ 184 1.1 pk */ \ 185 1.1 pk DMAWAIT(sc, L64854_GCSR(sc) & L64854_DRAINING, "DRAINING", dontpanic);\ 186 1.32 tsutsui } while (/* CONSTCOND */ 0) 187 1.1 pk 188 1.1 pk #define DMA_FLUSH(sc, dontpanic) do { \ 189 1.32 tsutsui uint32_t _csr; \ 190 1.1 pk /* \ 191 1.1 pk * DMA rev0 & rev1: we are not allowed to touch the DMA "flush" \ 192 1.1 pk * and "drain" bits while it is still thinking about a \ 193 1.1 pk * request. \ 194 1.1 pk * other revs: D_ESC_R_PEND bit reads as 0 \ 195 1.1 pk */ \ 196 1.1 pk DMAWAIT(sc, L64854_GCSR(sc) & D_ESC_R_PEND, "R_PEND", dontpanic);\ 197 1.26 christos _csr = L64854_GCSR(sc); \ 198 1.32 tsutsui _csr &= ~(L64854_WRITE | L64854_EN_DMA); /* no-ops on ENET */ \ 199 1.26 christos _csr |= L64854_INVALIDATE; /* XXX FAS ? */ \ 200 1.26 christos L64854_SCSR(sc,_csr); \ 201 1.32 tsutsui } while (/* CONSTCOND */ 0) 202 1.1 pk 203 1.1 pk void 204 1.32 tsutsui lsi64854_reset(struct lsi64854_softc *sc) 205 1.1 pk { 206 1.32 tsutsui uint32_t csr; 207 1.1 pk 208 1.1 pk DMA_FLUSH(sc, 1); 209 1.1 pk csr = L64854_GCSR(sc); 210 1.15 petrov 211 1.32 tsutsui DPRINTF(LDB_ANY, ("%s: csr 0x%x\n", __func__, csr)); 212 1.15 petrov 213 1.15 petrov /* 214 1.15 petrov * XXX is sync needed? 215 1.15 petrov */ 216 1.15 petrov if (sc->sc_dmamap->dm_nsegs > 0) 217 1.15 petrov bus_dmamap_unload(sc->sc_dmatag, sc->sc_dmamap); 218 1.15 petrov 219 1.15 petrov if (sc->sc_rev == DMAREV_HME) 220 1.15 petrov L64854_SCSR(sc, csr | D_HW_RESET_FAS366); 221 1.15 petrov 222 1.15 petrov 223 1.1 pk csr |= L64854_RESET; /* reset DMA */ 224 1.1 pk L64854_SCSR(sc, csr); 225 1.1 pk DELAY(200); /* > 10 Sbus clocks(?) */ 226 1.1 pk 227 1.1 pk /*DMAWAIT1(sc); why was this here? */ 228 1.1 pk csr = L64854_GCSR(sc); 229 1.1 pk csr &= ~L64854_RESET; /* de-assert reset line */ 230 1.1 pk L64854_SCSR(sc, csr); 231 1.1 pk DELAY(5); /* allow a few ticks to settle */ 232 1.1 pk 233 1.1 pk csr = L64854_GCSR(sc); 234 1.1 pk csr |= L64854_INT_EN; /* enable interrupts */ 235 1.15 petrov if (sc->sc_rev > DMAREV_1 && sc->sc_channel == L64854_CHANNEL_SCSI) { 236 1.15 petrov if (sc->sc_rev == DMAREV_HME) 237 1.15 petrov csr |= D_TWO_CYCLE; 238 1.15 petrov else 239 1.15 petrov csr |= D_FASTER; 240 1.15 petrov } 241 1.1 pk 242 1.1 pk /* Set burst */ 243 1.1 pk switch (sc->sc_rev) { 244 1.15 petrov case DMAREV_HME: 245 1.1 pk case DMAREV_2: 246 1.1 pk csr &= ~L64854_BURST_SIZE; 247 1.1 pk if (sc->sc_burst == 32) { 248 1.1 pk csr |= L64854_BURST_32; 249 1.1 pk } else if (sc->sc_burst == 16) { 250 1.1 pk csr |= L64854_BURST_16; 251 1.1 pk } else { 252 1.1 pk csr |= L64854_BURST_0; 253 1.1 pk } 254 1.1 pk break; 255 1.1 pk case DMAREV_ESC: 256 1.1 pk csr |= D_ESC_AUTODRAIN; /* Auto-drain */ 257 1.1 pk if (sc->sc_burst == 32) { 258 1.1 pk csr &= ~D_ESC_BURST; 259 1.1 pk } else 260 1.1 pk csr |= D_ESC_BURST; 261 1.1 pk break; 262 1.1 pk default: 263 1.18 mrg break; 264 1.1 pk } 265 1.1 pk L64854_SCSR(sc, csr); 266 1.1 pk 267 1.15 petrov if (sc->sc_rev == DMAREV_HME) { 268 1.32 tsutsui bus_space_write_4(sc->sc_bustag, sc->sc_regs, 269 1.32 tsutsui L64854_REG_ADDR, 0); 270 1.15 petrov sc->sc_dmactl = csr; 271 1.15 petrov } 272 1.1 pk sc->sc_active = 0; 273 1.15 petrov 274 1.32 tsutsui DPRINTF(LDB_ANY, ("%s: done, csr 0x%x\n", __func__, csr)); 275 1.1 pk } 276 1.1 pk 277 1.1 pk 278 1.1 pk #define DMAMAX(a) (MAX_DMA_SZ - ((a) & (MAX_DMA_SZ-1))) 279 1.1 pk /* 280 1.23 wiz * setup a DMA transfer 281 1.1 pk */ 282 1.1 pk int 283 1.32 tsutsui lsi64854_setup(struct lsi64854_softc *sc, uint8_t **addr, size_t *len, 284 1.32 tsutsui int datain, size_t *dmasize) 285 1.1 pk { 286 1.32 tsutsui uint32_t csr; 287 1.1 pk 288 1.1 pk DMA_FLUSH(sc, 0); 289 1.1 pk 290 1.1 pk #if 0 291 1.1 pk DMACSR(sc) &= ~D_INT_EN; 292 1.1 pk #endif 293 1.1 pk sc->sc_dmaaddr = addr; 294 1.1 pk sc->sc_dmalen = len; 295 1.1 pk 296 1.1 pk /* 297 1.1 pk * the rules say we cannot transfer more than the limit 298 1.1 pk * of this DMA chip (64k for old and 16Mb for new), 299 1.1 pk * and we cannot cross a 16Mb boundary. 300 1.1 pk */ 301 1.1 pk *dmasize = sc->sc_dmasize = 302 1.39 riastrad uimin(*dmasize, DMAMAX((size_t)*sc->sc_dmaaddr)); 303 1.1 pk 304 1.32 tsutsui DPRINTF(LDB_ANY, ("%s: dmasize = %ld\n", 305 1.32 tsutsui __func__, (long)sc->sc_dmasize)); 306 1.1 pk 307 1.15 petrov /* 308 1.25 perry * XXX what length? 309 1.15 petrov */ 310 1.15 petrov if (sc->sc_rev == DMAREV_HME) { 311 1.15 petrov 312 1.15 petrov L64854_SCSR(sc, sc->sc_dmactl | L64854_RESET); 313 1.15 petrov L64854_SCSR(sc, sc->sc_dmactl); 314 1.15 petrov 315 1.32 tsutsui bus_space_write_4(sc->sc_bustag, sc->sc_regs, 316 1.32 tsutsui L64854_REG_CNT, *dmasize); 317 1.15 petrov } 318 1.15 petrov 319 1.1 pk /* Program the DMA address */ 320 1.1 pk if (sc->sc_dmasize) { 321 1.1 pk sc->sc_dvmaaddr = *sc->sc_dmaaddr; 322 1.1 pk if (bus_dmamap_load(sc->sc_dmatag, sc->sc_dmamap, 323 1.32 tsutsui *sc->sc_dmaaddr, sc->sc_dmasize, 324 1.32 tsutsui NULL /* kernel address */, 325 1.32 tsutsui BUS_DMA_NOWAIT | BUS_DMA_STREAMING)) 326 1.1 pk panic("%s: cannot allocate DVMA address", 327 1.32 tsutsui device_xname(sc->sc_dev)); 328 1.16 tsutsui bus_dmamap_sync(sc->sc_dmatag, sc->sc_dmamap, 0, sc->sc_dmasize, 329 1.32 tsutsui datain ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE); 330 1.1 pk bus_space_write_4(sc->sc_bustag, sc->sc_regs, L64854_REG_ADDR, 331 1.32 tsutsui sc->sc_dmamap->dm_segs[0].ds_addr); 332 1.1 pk } 333 1.1 pk 334 1.1 pk if (sc->sc_rev == DMAREV_ESC) { 335 1.1 pk /* DMA ESC chip bug work-around */ 336 1.1 pk long bcnt = sc->sc_dmasize; 337 1.1 pk long eaddr = bcnt + (long)*sc->sc_dmaaddr; 338 1.32 tsutsui 339 1.1 pk if ((eaddr & PGOFSET) != 0) 340 1.14 thorpej bcnt = roundup(bcnt, PAGE_SIZE); 341 1.1 pk bus_space_write_4(sc->sc_bustag, sc->sc_regs, L64854_REG_CNT, 342 1.32 tsutsui bcnt); 343 1.1 pk } 344 1.15 petrov 345 1.1 pk /* Setup DMA control register */ 346 1.1 pk csr = L64854_GCSR(sc); 347 1.15 petrov 348 1.1 pk if (datain) 349 1.1 pk csr |= L64854_WRITE; 350 1.1 pk else 351 1.1 pk csr &= ~L64854_WRITE; 352 1.1 pk csr |= L64854_INT_EN; 353 1.15 petrov 354 1.15 petrov if (sc->sc_rev == DMAREV_HME) { 355 1.15 petrov csr |= (D_DSBL_SCSI_DRN | D_EN_DMA); 356 1.15 petrov } 357 1.15 petrov 358 1.1 pk L64854_SCSR(sc, csr); 359 1.1 pk 360 1.32 tsutsui return 0; 361 1.1 pk } 362 1.1 pk 363 1.1 pk /* 364 1.1 pk * Pseudo (chained) interrupt from the esp driver to kick the 365 1.4 pk * current running DMA transfer. Called from ncr53c9x_intr() 366 1.4 pk * for now. 367 1.1 pk * 368 1.1 pk * return 1 if it was a DMA continue. 369 1.1 pk */ 370 1.1 pk int 371 1.32 tsutsui lsi64854_scsi_intr(void *arg) 372 1.1 pk { 373 1.1 pk struct lsi64854_softc *sc = arg; 374 1.1 pk struct ncr53c9x_softc *nsc = sc->sc_client; 375 1.1 pk char bits[64]; 376 1.1 pk int trans, resid; 377 1.32 tsutsui uint32_t csr; 378 1.1 pk 379 1.1 pk csr = L64854_GCSR(sc); 380 1.34 christos #ifdef DEBUG 381 1.34 christos snprintb(bits, sizeof(bits), DDMACSR_BITS, csr); 382 1.34 christos #endif 383 1.32 tsutsui DPRINTF(LDB_SCSI, ("%s: %s: addr 0x%x, csr %s\n", 384 1.32 tsutsui device_xname(sc->sc_dev), __func__, 385 1.32 tsutsui bus_space_read_4(sc->sc_bustag, sc->sc_regs, L64854_REG_ADDR), 386 1.34 christos bits)); 387 1.34 christos 388 1.1 pk 389 1.5 pk if (csr & (D_ERR_PEND|D_SLAVE_ERR)) { 390 1.34 christos snprintb(bits, sizeof(bits), DDMACSR_BITS, csr); 391 1.34 christos printf("%s: error: csr=%s\n", device_xname(sc->sc_dev), bits); 392 1.1 pk csr &= ~D_EN_DMA; /* Stop DMA */ 393 1.5 pk /* Invalidate the queue; SLAVE_ERR bit is write-to-clear */ 394 1.5 pk csr |= D_INVALIDATE|D_SLAVE_ERR; 395 1.1 pk L64854_SCSR(sc, csr); 396 1.32 tsutsui return -1; 397 1.1 pk } 398 1.1 pk 399 1.1 pk /* This is an "assertion" :) */ 400 1.1 pk if (sc->sc_active == 0) 401 1.32 tsutsui panic("%s: DMA wasn't active", __func__); 402 1.1 pk 403 1.1 pk DMA_DRAIN(sc, 0); 404 1.1 pk 405 1.1 pk /* DMA has stopped */ 406 1.1 pk csr &= ~D_EN_DMA; 407 1.1 pk L64854_SCSR(sc, csr); 408 1.1 pk sc->sc_active = 0; 409 1.1 pk 410 1.1 pk if (sc->sc_dmasize == 0) { 411 1.1 pk /* A "Transfer Pad" operation completed */ 412 1.32 tsutsui DPRINTF(LDB_SCSI, ("%s: discarded %d bytes (tcl=%d, tcm=%d)\n", 413 1.32 tsutsui __func__, 414 1.32 tsutsui NCR_READ_REG(nsc, NCR_TCL) | 415 1.32 tsutsui (NCR_READ_REG(nsc, NCR_TCM) << 8), 416 1.32 tsutsui NCR_READ_REG(nsc, NCR_TCL), 417 1.32 tsutsui NCR_READ_REG(nsc, NCR_TCM))); 418 1.1 pk return 0; 419 1.1 pk } 420 1.1 pk 421 1.1 pk resid = 0; 422 1.1 pk /* 423 1.1 pk * If a transfer onto the SCSI bus gets interrupted by the device 424 1.1 pk * (e.g. for a SAVEPOINTER message), the data in the FIFO counts 425 1.1 pk * as residual since the NCR53C9X counter registers get decremented 426 1.1 pk * as bytes are clocked into the FIFO. 427 1.1 pk */ 428 1.1 pk if (!(csr & D_WRITE) && 429 1.1 pk (resid = (NCR_READ_REG(nsc, NCR_FFLAG) & NCRFIFO_FF)) != 0) { 430 1.32 tsutsui DPRINTF(LDB_SCSI, ("%s: empty esp FIFO of %d ", 431 1.32 tsutsui __func__, resid)); 432 1.22 petrov if (nsc->sc_rev == NCR_VARIANT_FAS366 && 433 1.22 petrov (NCR_READ_REG(nsc, NCR_CFG3) & NCRFASCFG3_EWIDE)) 434 1.22 petrov resid <<= 1; 435 1.1 pk } 436 1.1 pk 437 1.1 pk if ((nsc->sc_espstat & NCRSTAT_TC) == 0) { 438 1.1 pk /* 439 1.1 pk * `Terminal count' is off, so read the residue 440 1.1 pk * out of the NCR53C9X counter registers. 441 1.1 pk */ 442 1.1 pk resid += (NCR_READ_REG(nsc, NCR_TCL) | 443 1.1 pk (NCR_READ_REG(nsc, NCR_TCM) << 8) | 444 1.32 tsutsui ((nsc->sc_cfg2 & NCRCFG2_FE) ? 445 1.32 tsutsui (NCR_READ_REG(nsc, NCR_TCH) << 16) : 0)); 446 1.1 pk 447 1.1 pk if (resid == 0 && sc->sc_dmasize == 65536 && 448 1.1 pk (nsc->sc_cfg2 & NCRCFG2_FE) == 0) 449 1.1 pk /* A transfer of 64K is encoded as `TCL=TCM=0' */ 450 1.1 pk resid = 65536; 451 1.1 pk } 452 1.1 pk 453 1.1 pk trans = sc->sc_dmasize - resid; 454 1.1 pk if (trans < 0) { /* transferred < 0 ? */ 455 1.1 pk #if 0 456 1.1 pk /* 457 1.1 pk * This situation can happen in perfectly normal operation 458 1.1 pk * if the ESP is reselected while using DMA to select 459 1.1 pk * another target. As such, don't print the warning. 460 1.1 pk */ 461 1.1 pk printf("%s: xfer (%d) > req (%d)\n", 462 1.38 chs device_xname(sc->sc_dev), trans, sc->sc_dmasize); 463 1.1 pk #endif 464 1.1 pk trans = sc->sc_dmasize; 465 1.1 pk } 466 1.1 pk 467 1.32 tsutsui DPRINTF(LDB_SCSI, ("%s: tcl=%d, tcm=%d, tch=%d; trans=%d, resid=%d\n", 468 1.32 tsutsui __func__, 469 1.32 tsutsui NCR_READ_REG(nsc, NCR_TCL), 470 1.32 tsutsui NCR_READ_REG(nsc, NCR_TCM), 471 1.32 tsutsui (nsc->sc_cfg2 & NCRCFG2_FE) ? 472 1.32 tsutsui NCR_READ_REG(nsc, NCR_TCH) : 0, 473 1.32 tsutsui trans, resid)); 474 1.1 pk 475 1.1 pk if (sc->sc_dmamap->dm_nsegs > 0) { 476 1.16 tsutsui bus_dmamap_sync(sc->sc_dmatag, sc->sc_dmamap, 0, sc->sc_dmasize, 477 1.32 tsutsui (csr & D_WRITE) != 0 ? 478 1.32 tsutsui BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE); 479 1.1 pk bus_dmamap_unload(sc->sc_dmatag, sc->sc_dmamap); 480 1.1 pk } 481 1.1 pk 482 1.1 pk *sc->sc_dmalen -= trans; 483 1.32 tsutsui *sc->sc_dmaaddr += trans; 484 1.1 pk 485 1.1 pk #if 0 /* this is not normal operation just yet */ 486 1.1 pk if (*sc->sc_dmalen == 0 || 487 1.1 pk nsc->sc_phase != nsc->sc_prevphase) 488 1.1 pk return 0; 489 1.1 pk 490 1.1 pk /* and again */ 491 1.1 pk dma_start(sc, sc->sc_dmaaddr, sc->sc_dmalen, DMACSR(sc) & D_WRITE); 492 1.1 pk return 1; 493 1.1 pk #endif 494 1.1 pk return 0; 495 1.1 pk } 496 1.1 pk 497 1.1 pk /* 498 1.1 pk * Pseudo (chained) interrupt to le driver to handle DMA errors. 499 1.1 pk */ 500 1.1 pk int 501 1.32 tsutsui lsi64854_enet_intr(void *arg) 502 1.1 pk { 503 1.1 pk struct lsi64854_softc *sc = arg; 504 1.1 pk char bits[64]; 505 1.32 tsutsui uint32_t csr; 506 1.10 mrg static int dodrain = 0; 507 1.11 pk int rv; 508 1.1 pk 509 1.1 pk csr = L64854_GCSR(sc); 510 1.1 pk 511 1.11 pk /* If the DMA logic shows an interrupt, claim it */ 512 1.11 pk rv = ((csr & E_INT_PEND) != 0) ? 1 : 0; 513 1.11 pk 514 1.5 pk if (csr & (E_ERR_PEND|E_SLAVE_ERR)) { 515 1.34 christos snprintb(bits, sizeof(bits), EDMACSR_BITS, csr); 516 1.34 christos printf("%s: error: csr=%s\n", device_xname(sc->sc_dev), bits); 517 1.1 pk csr &= ~L64854_EN_DMA; /* Stop DMA */ 518 1.5 pk /* Invalidate the queue; SLAVE_ERR bit is write-to-clear */ 519 1.5 pk csr |= E_INVALIDATE|E_SLAVE_ERR; 520 1.1 pk L64854_SCSR(sc, csr); 521 1.1 pk DMA_RESET(sc); 522 1.1 pk dodrain = 1; 523 1.32 tsutsui return 1; 524 1.1 pk } 525 1.1 pk 526 1.1 pk if (dodrain) { /* XXX - is this necessary with D_DSBL_WRINVAL on? */ 527 1.1 pk int i = 10; 528 1.1 pk csr |= E_DRAIN; 529 1.1 pk L64854_SCSR(sc, csr); 530 1.1 pk while (i-- > 0 && (L64854_GCSR(sc) & D_DRAINING)) 531 1.1 pk delay(1); 532 1.1 pk } 533 1.1 pk 534 1.32 tsutsui return rv | (*sc->sc_intrchain)(sc->sc_intrchainarg); 535 1.4 pk } 536 1.4 pk 537 1.4 pk /* 538 1.23 wiz * setup a DMA transfer 539 1.4 pk */ 540 1.4 pk int 541 1.32 tsutsui lsi64854_setup_pp(struct lsi64854_softc *sc, uint8_t **addr, size_t *len, 542 1.32 tsutsui int datain, size_t *dmasize) 543 1.4 pk { 544 1.32 tsutsui uint32_t csr; 545 1.4 pk 546 1.4 pk DMA_FLUSH(sc, 0); 547 1.4 pk 548 1.4 pk sc->sc_dmaaddr = addr; 549 1.4 pk sc->sc_dmalen = len; 550 1.4 pk 551 1.32 tsutsui DPRINTF(LDB_PP, ("%s: pp start %ld@%p,%d\n", device_xname(sc->sc_dev), 552 1.32 tsutsui (long)*sc->sc_dmalen, *sc->sc_dmaaddr, datain ? 1 : 0)); 553 1.4 pk 554 1.4 pk /* 555 1.4 pk * the rules say we cannot transfer more than the limit 556 1.4 pk * of this DMA chip (64k for old and 16Mb for new), 557 1.4 pk * and we cannot cross a 16Mb boundary. 558 1.4 pk */ 559 1.4 pk *dmasize = sc->sc_dmasize = 560 1.39 riastrad uimin(*dmasize, DMAMAX((size_t) *sc->sc_dmaaddr)); 561 1.4 pk 562 1.32 tsutsui DPRINTF(LDB_PP, ("%s: dmasize = %ld\n", 563 1.32 tsutsui __func__, (long)sc->sc_dmasize)); 564 1.4 pk 565 1.4 pk /* Program the DMA address */ 566 1.4 pk if (sc->sc_dmasize) { 567 1.4 pk sc->sc_dvmaaddr = *sc->sc_dmaaddr; 568 1.4 pk if (bus_dmamap_load(sc->sc_dmatag, sc->sc_dmamap, 569 1.32 tsutsui *sc->sc_dmaaddr, sc->sc_dmasize, 570 1.32 tsutsui NULL /* kernel address */, 571 1.32 tsutsui BUS_DMA_NOWAIT/*|BUS_DMA_COHERENT*/)) 572 1.12 eeh panic("%s: pp cannot allocate DVMA address", 573 1.32 tsutsui device_xname(sc->sc_dev)); 574 1.16 tsutsui bus_dmamap_sync(sc->sc_dmatag, sc->sc_dmamap, 0, sc->sc_dmasize, 575 1.32 tsutsui datain ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE); 576 1.4 pk bus_space_write_4(sc->sc_bustag, sc->sc_regs, L64854_REG_ADDR, 577 1.32 tsutsui sc->sc_dmamap->dm_segs[0].ds_addr); 578 1.4 pk 579 1.4 pk bus_space_write_4(sc->sc_bustag, sc->sc_regs, L64854_REG_CNT, 580 1.32 tsutsui sc->sc_dmasize); 581 1.4 pk } 582 1.4 pk 583 1.4 pk /* Setup DMA control register */ 584 1.4 pk csr = L64854_GCSR(sc); 585 1.12 eeh csr &= ~L64854_BURST_SIZE; 586 1.12 eeh if (sc->sc_burst == 32) { 587 1.12 eeh csr |= L64854_BURST_32; 588 1.12 eeh } else if (sc->sc_burst == 16) { 589 1.12 eeh csr |= L64854_BURST_16; 590 1.12 eeh } else { 591 1.12 eeh csr |= L64854_BURST_0; 592 1.12 eeh } 593 1.12 eeh csr |= P_EN_DMA|P_INT_EN|P_EN_CNT; 594 1.4 pk #if 0 595 1.4 pk /* This bit is read-only in PP csr register */ 596 1.4 pk if (datain) 597 1.12 eeh csr |= P_WRITE; 598 1.4 pk else 599 1.12 eeh csr &= ~P_WRITE; 600 1.4 pk #endif 601 1.4 pk L64854_SCSR(sc, csr); 602 1.4 pk 603 1.32 tsutsui return 0; 604 1.4 pk } 605 1.4 pk /* 606 1.4 pk * Parallel port DMA interrupt. 607 1.4 pk */ 608 1.4 pk int 609 1.32 tsutsui lsi64854_pp_intr(void *arg) 610 1.4 pk { 611 1.4 pk struct lsi64854_softc *sc = arg; 612 1.4 pk char bits[64]; 613 1.4 pk int ret, trans, resid = 0; 614 1.32 tsutsui uint32_t csr; 615 1.4 pk 616 1.4 pk csr = L64854_GCSR(sc); 617 1.4 pk 618 1.34 christos #ifdef DEBUG 619 1.34 christos snprintb(bits, sizeof(bits), PDMACSR_BITS, csr); 620 1.34 christos #endif 621 1.32 tsutsui DPRINTF(LDB_PP, ("%s: pp intr: addr 0x%x, csr %s\n", 622 1.32 tsutsui device_xname(sc->sc_dev), 623 1.32 tsutsui bus_space_read_4(sc->sc_bustag, sc->sc_regs, L64854_REG_ADDR), 624 1.34 christos bits)); 625 1.4 pk 626 1.5 pk if (csr & (P_ERR_PEND|P_SLAVE_ERR)) { 627 1.12 eeh resid = bus_space_read_4(sc->sc_bustag, sc->sc_regs, 628 1.32 tsutsui L64854_REG_CNT); 629 1.34 christos snprintb(bits, sizeof(bits), PDMACSR_BITS, csr); 630 1.32 tsutsui printf("%s: pp error: resid %d csr=%s\n", 631 1.34 christos device_xname(sc->sc_dev), resid, bits); 632 1.4 pk csr &= ~P_EN_DMA; /* Stop DMA */ 633 1.5 pk /* Invalidate the queue; SLAVE_ERR bit is write-to-clear */ 634 1.5 pk csr |= P_INVALIDATE|P_SLAVE_ERR; 635 1.4 pk L64854_SCSR(sc, csr); 636 1.32 tsutsui return 1; 637 1.4 pk } 638 1.4 pk 639 1.4 pk ret = (csr & P_INT_PEND) != 0; 640 1.4 pk 641 1.4 pk if (sc->sc_active != 0) { 642 1.4 pk DMA_DRAIN(sc, 0); 643 1.4 pk resid = bus_space_read_4(sc->sc_bustag, sc->sc_regs, 644 1.32 tsutsui L64854_REG_CNT); 645 1.4 pk } 646 1.4 pk 647 1.4 pk /* DMA has stopped */ 648 1.4 pk csr &= ~D_EN_DMA; 649 1.4 pk L64854_SCSR(sc, csr); 650 1.4 pk sc->sc_active = 0; 651 1.4 pk 652 1.4 pk trans = sc->sc_dmasize - resid; 653 1.4 pk if (trans < 0) { /* transferred < 0 ? */ 654 1.4 pk trans = sc->sc_dmasize; 655 1.4 pk } 656 1.4 pk *sc->sc_dmalen -= trans; 657 1.32 tsutsui *sc->sc_dmaaddr += trans; 658 1.4 pk 659 1.4 pk if (sc->sc_dmamap->dm_nsegs > 0) { 660 1.16 tsutsui bus_dmamap_sync(sc->sc_dmatag, sc->sc_dmamap, 0, sc->sc_dmasize, 661 1.32 tsutsui (csr & D_WRITE) != 0 ? 662 1.32 tsutsui BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE); 663 1.4 pk bus_dmamap_unload(sc->sc_dmatag, sc->sc_dmamap); 664 1.4 pk } 665 1.4 pk 666 1.32 tsutsui return ret != 0; 667 1.1 pk } 668