Lines Matching refs:chan

66 static int isa_dmarangecheck(caddr_t va, u_int length, int chan);
86 isa_dma_init(int chan, u_int bouncebufsize, int flag)
92 if (chan & ~VALID_DMA_MASK)
100 if (isa_dmarangecheck(buf, bouncebufsize, chan) != 0) {
109 1ul, chan & 4 ? 0x20000ul : 0x10000ul);
125 if (dma_bouncebuf[chan] != NULL) {
134 dma_bouncebufsize[chan] = bouncebufsize;
135 dma_bouncebuf[chan] = buf;
147 isa_dma_acquire(int chan)
150 if (chan & ~VALID_DMA_MASK)
155 if (dma_inuse & (1 << chan)) {
156 printf("isa_dma_acquire: channel %d already in use\n", chan);
160 dma_inuse |= (1 << chan);
161 dma_auto_mode &= ~(1 << chan);
172 isa_dma_release(int chan)
175 if (chan & ~VALID_DMA_MASK)
179 if ((dma_inuse & (1 << chan)) == 0)
180 printf("isa_dma_release: channel %d not in use\n", chan);
185 if (dma_busy & (1 << chan)) {
186 dma_busy &= ~(1 << chan);
188 * XXX We should also do "dma_bounced &= (1 << chan);"
195 dma_inuse &= ~(1 << chan);
196 dma_auto_mode &= ~(1 << chan);
206 isa_dmacascade(int chan)
209 if (chan & ~VALID_DMA_MASK)
215 if ((chan & 4) == 0) {
216 outb(DMA1_MODE, DMA37MD_CASCADE | chan);
217 outb(DMA1_SMSK, chan);
219 outb(DMA2_MODE, DMA37MD_CASCADE | (chan & 3));
220 outb(DMA2_SMSK, chan & 3);
230 isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan)
237 dma_range_checked = isa_dmarangecheck(addr, nbytes, chan);
240 if (chan & ~VALID_DMA_MASK)
243 if ((chan < 4 && nbytes > (1<<16))
244 || (chan >= 4 && (nbytes > (1<<17) || (uintptr_t)addr & 1)))
248 if ((dma_inuse & (1 << chan)) == 0)
249 printf("isa_dmastart: channel %d not acquired\n", chan);
260 if (dma_busy & (1 << chan))
261 printf("isa_dmastart: channel %d busy\n", chan);
264 dma_busy |= (1 << chan);
267 if (dma_bouncebuf[chan] == NULL
268 || dma_bouncebufsize[chan] < nbytes)
270 dma_bounced |= (1 << chan);
271 newaddr = dma_bouncebuf[chan];
283 dma_auto_mode |= (1 << chan);
285 dma_auto_mode &= ~(1 << chan);
288 if ((chan & 4) == 0) {
298 outb(DMA1_MODE, DMA37MD_AUTO|DMA37MD_WRITE|chan);
300 outb(DMA1_MODE, DMA37MD_AUTO|DMA37MD_READ|chan);
304 outb(DMA1_MODE, DMA37MD_SINGLE|DMA37MD_WRITE|chan);
306 outb(DMA1_MODE, DMA37MD_SINGLE|DMA37MD_READ|chan);
310 waport = DMA1_CHN(chan);
313 outb(dmapageport[chan], phys>>16);
320 outb(DMA1_SMSK, chan);
331 outb(DMA2_MODE, DMA37MD_AUTO|DMA37MD_WRITE|(chan&3));
333 outb(DMA2_MODE, DMA37MD_AUTO|DMA37MD_READ|(chan&3));
337 outb(DMA2_MODE, DMA37MD_SINGLE|DMA37MD_WRITE|(chan&3));
339 outb(DMA2_MODE, DMA37MD_SINGLE|DMA37MD_READ|(chan&3));
343 waport = DMA2_CHN(chan - 4);
346 outb(dmapageport[chan], phys>>16);
354 outb(DMA2_SMSK, chan & 3);
360 isa_dmadone(int flags, caddr_t addr, int nbytes, int chan)
363 if (chan & ~VALID_DMA_MASK)
366 if ((dma_inuse & (1 << chan)) == 0)
367 printf("isa_dmadone: channel %d not acquired\n", chan);
371 if (((dma_busy & (1 << chan)) == 0) &&
372 (dma_auto_mode & (1 << chan)) == 0 )
373 printf("isa_dmadone: channel %d not busy\n", chan);
375 if ((dma_auto_mode & (1 << chan)) == 0)
376 outb(chan & 4 ? DMA2_SMSK : DMA1_SMSK, (chan & 3) | 4);
378 if (dma_bounced & (1 << chan)) {
381 bcopy(dma_bouncebuf[chan], addr, nbytes);
383 dma_bounced &= ~(1 << chan);
385 dma_busy &= ~(1 << chan);
397 isa_dmarangecheck(caddr_t va, u_int length, int chan)
401 u_int dma_pgmsk = (chan & 4) ? ~(128*1024-1) : ~(64*1024-1);
455 isa_dmastatus_locked(int chan)
464 if ((dma_inuse & (1 << chan)) == 0) {
465 printf("isa_dmastatus: channel %d not active\n", chan);
470 if (((dma_busy & (1 << chan)) == 0) &&
471 (dma_auto_mode & (1 << chan)) == 0 ) {
472 printf("chan %d not busy\n", chan);
475 if (chan < 4) { /* low DMA controller */
477 waport = DMA1_CHN(chan) + 1;
480 waport = DMA2_CHN(chan - 4) + 2;
503 if (chan >= 4) /* high channels move words */
509 isa_dmastatus(int chan)
514 status = isa_dmastatus_locked(chan);
524 isa_dmatc(int chan)
527 if (chan < 4)
528 return(inb(DMA1_STATUS) & (1 << chan));
530 return(inb(DMA2_STATUS) & (1 << (chan & 3)));
537 isa_dmastop(int chan)
542 if ((dma_inuse & (1 << chan)) == 0)
543 printf("isa_dmastop: channel %d not acquired\n", chan);
545 if (((dma_busy & (1 << chan)) == 0) &&
546 ((dma_auto_mode & (1 << chan)) == 0)) {
547 printf("chan %d not busy\n", chan);
552 if ((chan & 4) == 0) {
553 outb(DMA1_SMSK, (chan & 3) | 4 /* disable mask */);
555 outb(DMA2_SMSK, (chan & 3) | 4 /* disable mask */);
558 status = isa_dmastatus_locked(chan);