1/*	$NetBSD: isadma.c,v 1.1.1.1 1997/03/14 02:40:32 perry Exp $	*/
2
3/* from: NetBSD:dev/isa/isadma.c */
4
5#include <sys/types.h>
6#include <machine/pio.h>
7
8#include <lib/libsa/stand.h>
9
10#include "isadmavar.h"
11
12#define	IO_DMA1		0x000		/* 8237A DMA Controller #1 */
13#define	IO_DMA2		0x0C0		/* 8237A DMA Controller #2 */
14#define	DMA37MD_CASCADE	0xc0	/* cascade mode */
15#define	DMA1_SMSK	(IO_DMA1 + 1*10)	/* single mask register */
16#define	DMA1_MODE	(IO_DMA1 + 1*11)	/* mode register */
17#define	DMA2_SMSK	(IO_DMA2 + 2*10)	/* single mask register */
18#define	DMA2_MODE	(IO_DMA2 + 2*11)	/* mode register */
19
20/*
21 * isa_dmacascade(): program 8237 DMA controller channel to accept
22 * external dma control by a board.
23 */
24void
25isa_dmacascade(int chan)
26{
27
28#ifdef ISADMA_DEBUG
29	if (chan < 0 || chan > 7)
30		panic("isa_dmacascade: impossible request");
31#endif
32
33	/* set dma channel mode, and set dma channel mode */
34	if ((chan & 4) == 0) {
35		outb(DMA1_MODE, chan | DMA37MD_CASCADE);
36		outb(DMA1_SMSK, chan);
37	} else {
38		chan &= 3;
39
40		outb(DMA2_MODE, chan | DMA37MD_CASCADE);
41		outb(DMA2_SMSK, chan);
42	}
43}
44