This source file includes following definitions.
- enable_dma
- disable_dma
- clear_dma_ff
- set_dma_mode
- set_dma_page
- set_dma_addr
- set_dma_count
- get_dma_residue
1
2
3
4
5
6
7
8 #ifndef _ASM_DMA_H
9 #define _ASM_DMA_H
10
11 #include <asm/io.h>
12
13 #define deb_outb(x,y) {printk("out %02x, %02x\n", x, y);outb(x,y);}
14
15
16 #ifdef HAVE_REALLY_SLOW_DMA_CONTROLLER
17 #define outb outb_p
18 #endif
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 #define MAX_DMA_CHANNELS 8
69
70
71 #define IO_DMA1_BASE 0x00
72 #define IO_DMA2_BASE 0xC0
73
74
75 #define DMA1_CMD_REG 0x08
76 #define DMA1_STAT_REG 0x08
77 #define DMA1_REQ_REG 0x09
78 #define DMA1_MASK_REG 0x0A
79 #define DMA1_MODE_REG 0x0B
80 #define DMA1_CLEAR_FF_REG 0x0C
81 #define DMA1_TEMP_REG 0x0D
82 #define DMA1_RESET_REG 0x0D
83 #define DMA1_CLR_MASK_REG 0x0E
84 #define DMA1_MASK_ALL_REG 0x0F
85
86 #define DMA2_CMD_REG 0xD0
87 #define DMA2_STAT_REG 0xD0
88 #define DMA2_REQ_REG 0xD2
89 #define DMA2_MASK_REG 0xD4
90 #define DMA2_MODE_REG 0xD6
91 #define DMA2_CLEAR_FF_REG 0xD8
92 #define DMA2_TEMP_REG 0xDA
93 #define DMA2_RESET_REG 0xDA
94 #define DMA2_CLR_MASK_REG 0xDC
95 #define DMA2_MASK_ALL_REG 0xDE
96
97 #define DMA_ADDR_0 0x00
98 #define DMA_ADDR_1 0x02
99 #define DMA_ADDR_2 0x04
100 #define DMA_ADDR_3 0x06
101 #define DMA_ADDR_4 0xC0
102 #define DMA_ADDR_5 0xC4
103 #define DMA_ADDR_6 0xC8
104 #define DMA_ADDR_7 0xCC
105
106 #define DMA_CNT_0 0x01
107 #define DMA_CNT_1 0x03
108 #define DMA_CNT_2 0x05
109 #define DMA_CNT_3 0x07
110 #define DMA_CNT_4 0xC2
111 #define DMA_CNT_5 0xC6
112 #define DMA_CNT_6 0xCA
113 #define DMA_CNT_7 0xCE
114
115 #define DMA_PAGE_0 0x87
116 #define DMA_PAGE_1 0x83
117 #define DMA_PAGE_2 0x81
118 #define DMA_PAGE_3 0x82
119 #define DMA_PAGE_5 0x8B
120 #define DMA_PAGE_6 0x89
121 #define DMA_PAGE_7 0x8A
122
123 #define DMA_MODE_READ 0x44
124 #define DMA_MODE_WRITE 0x48
125 #define DMA_MODE_CASCADE 0xC0
126
127
128 static __inline__ void enable_dma(unsigned int dmanr)
129 {
130 if (dmanr<=3)
131 deb_outb(dmanr, DMA1_MASK_REG)
132 else
133 deb_outb(dmanr & 3, DMA2_MASK_REG);
134 }
135
136 static __inline__ void disable_dma(unsigned int dmanr)
137 {
138 if (dmanr<=3)
139 deb_outb(dmanr | 4, DMA1_MASK_REG)
140 else
141 deb_outb((dmanr & 3) | 4, DMA2_MASK_REG);
142 }
143
144
145
146
147
148
149
150
151 static __inline__ void clear_dma_ff(unsigned int dmanr)
152 {
153 if (dmanr<=3)
154 deb_outb(0, DMA1_CLEAR_FF_REG)
155 else
156 deb_outb(0, DMA2_CLEAR_FF_REG);
157 }
158
159
160 static __inline__ void set_dma_mode(unsigned int dmanr, char mode)
161 {
162 if (dmanr<=3)
163 deb_outb(mode | dmanr, DMA1_MODE_REG)
164 else
165 deb_outb(mode | (dmanr&3), DMA2_MODE_REG);
166 }
167
168
169
170
171
172
173 static __inline__ void set_dma_page(unsigned int dmanr, char pagenr)
174 {
175 switch(dmanr) {
176 case 0:
177 deb_outb(pagenr, DMA_PAGE_0);
178 break;
179 case 1:
180 deb_outb(pagenr, DMA_PAGE_1);
181 break;
182 case 2:
183 deb_outb(pagenr, DMA_PAGE_2);
184 break;
185 case 3:
186 deb_outb(pagenr, DMA_PAGE_3);
187 break;
188 case 5:
189 deb_outb(pagenr & 0xfe, DMA_PAGE_5);
190 break;
191 case 6:
192 deb_outb(pagenr & 0xfe, DMA_PAGE_6);
193 break;
194 case 7:
195 deb_outb(pagenr & 0xfe, DMA_PAGE_7);
196 break;
197 }
198 }
199
200
201
202
203
204 static __inline__ void set_dma_addr(unsigned int dmanr, unsigned int a)
205 {
206 set_dma_page(dmanr, a>>16);
207 if (dmanr <= 3) {
208 deb_outb( a & 0xff, ((dmanr&3)<<1) + IO_DMA1_BASE );
209 deb_outb( (a>>8) & 0xff, ((dmanr&3)<<1) + IO_DMA1_BASE )
210 } else {
211 deb_outb( (a>>1) & 0xff, ((dmanr&3)<<2) + IO_DMA2_BASE );
212 deb_outb( (a>>9) & 0xff, ((dmanr&3)<<2) + IO_DMA2_BASE );
213 }
214 }
215
216
217
218
219
220
221
222
223
224
225 static __inline__ void set_dma_count(unsigned int dmanr, unsigned int count)
226 {
227 count--;
228 if (dmanr <= 3) {
229 deb_outb( count & 0xff, ((dmanr&3)<<1) + 1 + IO_DMA1_BASE );
230 deb_outb( (count>>8) & 0xff, ((dmanr&3)<<1) + 1 + IO_DMA1_BASE );
231 } else {
232 deb_outb( (count>>1) & 0xff, ((dmanr&3)<<2) + 2 + IO_DMA2_BASE );
233 deb_outb( (count>>9) & 0xff, ((dmanr&3)<<2) + 2 + IO_DMA2_BASE );
234 }
235 }
236
237
238
239
240
241
242
243
244
245
246 static __inline__ int get_dma_residue(unsigned int dmanr)
247 {
248 unsigned int io_port = (dmanr<=3)? ((dmanr&3)<<1) + 1 + IO_DMA1_BASE
249 : ((dmanr&3)<<2) + 2 + IO_DMA2_BASE;
250
251
252 unsigned short count;
253
254 count = 1 + inb(io_port);
255 count += inb(io_port) << 8;
256
257 return (dmanr<=3)? count : (count<<1);
258 }
259
260
261
262 extern int request_dma(unsigned int dmanr);
263 extern void free_dma(unsigned int dmanr);
264
265
266 #endif