0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _ASM_X86_DMA_H
0010 #define _ASM_X86_DMA_H
0011
0012 #include <linux/spinlock.h> /* And spinlocks */
0013 #include <asm/io.h> /* need byte IO */
0014
0015 #ifdef HAVE_REALLY_SLOW_DMA_CONTROLLER
0016 #define dma_outb outb_p
0017 #else
0018 #define dma_outb outb
0019 #endif
0020
0021 #define dma_inb inb
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071 #define MAX_DMA_CHANNELS 8
0072
0073
0074 #define MAX_DMA_PFN ((16UL * 1024 * 1024) >> PAGE_SHIFT)
0075
0076
0077 #define MAX_DMA32_PFN (1UL << (32 - PAGE_SHIFT))
0078
0079 #ifdef CONFIG_X86_32
0080
0081 #define MAX_DMA_ADDRESS (PAGE_OFFSET + 0x1000000)
0082 #else
0083
0084 #define MAX_DMA_ADDRESS ((unsigned long)__va(MAX_DMA_PFN << PAGE_SHIFT))
0085 #endif
0086
0087
0088 #define IO_DMA1_BASE 0x00
0089 #define IO_DMA2_BASE 0xC0
0090
0091
0092 #define DMA1_CMD_REG 0x08
0093 #define DMA1_STAT_REG 0x08
0094 #define DMA1_REQ_REG 0x09
0095 #define DMA1_MASK_REG 0x0A
0096 #define DMA1_MODE_REG 0x0B
0097 #define DMA1_CLEAR_FF_REG 0x0C
0098 #define DMA1_TEMP_REG 0x0D
0099 #define DMA1_RESET_REG 0x0D
0100 #define DMA1_CLR_MASK_REG 0x0E
0101 #define DMA1_MASK_ALL_REG 0x0F
0102
0103 #define DMA2_CMD_REG 0xD0
0104 #define DMA2_STAT_REG 0xD0
0105 #define DMA2_REQ_REG 0xD2
0106 #define DMA2_MASK_REG 0xD4
0107 #define DMA2_MODE_REG 0xD6
0108 #define DMA2_CLEAR_FF_REG 0xD8
0109 #define DMA2_TEMP_REG 0xDA
0110 #define DMA2_RESET_REG 0xDA
0111 #define DMA2_CLR_MASK_REG 0xDC
0112 #define DMA2_MASK_ALL_REG 0xDE
0113
0114 #define DMA_ADDR_0 0x00
0115 #define DMA_ADDR_1 0x02
0116 #define DMA_ADDR_2 0x04
0117 #define DMA_ADDR_3 0x06
0118 #define DMA_ADDR_4 0xC0
0119 #define DMA_ADDR_5 0xC4
0120 #define DMA_ADDR_6 0xC8
0121 #define DMA_ADDR_7 0xCC
0122
0123 #define DMA_CNT_0 0x01
0124 #define DMA_CNT_1 0x03
0125 #define DMA_CNT_2 0x05
0126 #define DMA_CNT_3 0x07
0127 #define DMA_CNT_4 0xC2
0128 #define DMA_CNT_5 0xC6
0129 #define DMA_CNT_6 0xCA
0130 #define DMA_CNT_7 0xCE
0131
0132 #define DMA_PAGE_0 0x87
0133 #define DMA_PAGE_1 0x83
0134 #define DMA_PAGE_2 0x81
0135 #define DMA_PAGE_3 0x82
0136 #define DMA_PAGE_5 0x8B
0137 #define DMA_PAGE_6 0x89
0138 #define DMA_PAGE_7 0x8A
0139
0140
0141 #define DMA_MODE_READ 0x44
0142
0143 #define DMA_MODE_WRITE 0x48
0144
0145 #define DMA_MODE_CASCADE 0xC0
0146
0147 #define DMA_AUTOINIT 0x10
0148
0149
0150 #ifdef CONFIG_ISA_DMA_API
0151 extern spinlock_t dma_spin_lock;
0152
0153 static inline unsigned long claim_dma_lock(void)
0154 {
0155 unsigned long flags;
0156 spin_lock_irqsave(&dma_spin_lock, flags);
0157 return flags;
0158 }
0159
0160 static inline void release_dma_lock(unsigned long flags)
0161 {
0162 spin_unlock_irqrestore(&dma_spin_lock, flags);
0163 }
0164 #endif
0165
0166
0167 static inline void enable_dma(unsigned int dmanr)
0168 {
0169 if (dmanr <= 3)
0170 dma_outb(dmanr, DMA1_MASK_REG);
0171 else
0172 dma_outb(dmanr & 3, DMA2_MASK_REG);
0173 }
0174
0175 static inline void disable_dma(unsigned int dmanr)
0176 {
0177 if (dmanr <= 3)
0178 dma_outb(dmanr | 4, DMA1_MASK_REG);
0179 else
0180 dma_outb((dmanr & 3) | 4, DMA2_MASK_REG);
0181 }
0182
0183
0184
0185
0186
0187
0188
0189
0190 static inline void clear_dma_ff(unsigned int dmanr)
0191 {
0192 if (dmanr <= 3)
0193 dma_outb(0, DMA1_CLEAR_FF_REG);
0194 else
0195 dma_outb(0, DMA2_CLEAR_FF_REG);
0196 }
0197
0198
0199 static inline void set_dma_mode(unsigned int dmanr, char mode)
0200 {
0201 if (dmanr <= 3)
0202 dma_outb(mode | dmanr, DMA1_MODE_REG);
0203 else
0204 dma_outb(mode | (dmanr & 3), DMA2_MODE_REG);
0205 }
0206
0207
0208
0209
0210
0211
0212 static inline void set_dma_page(unsigned int dmanr, char pagenr)
0213 {
0214 switch (dmanr) {
0215 case 0:
0216 dma_outb(pagenr, DMA_PAGE_0);
0217 break;
0218 case 1:
0219 dma_outb(pagenr, DMA_PAGE_1);
0220 break;
0221 case 2:
0222 dma_outb(pagenr, DMA_PAGE_2);
0223 break;
0224 case 3:
0225 dma_outb(pagenr, DMA_PAGE_3);
0226 break;
0227 case 5:
0228 dma_outb(pagenr & 0xfe, DMA_PAGE_5);
0229 break;
0230 case 6:
0231 dma_outb(pagenr & 0xfe, DMA_PAGE_6);
0232 break;
0233 case 7:
0234 dma_outb(pagenr & 0xfe, DMA_PAGE_7);
0235 break;
0236 }
0237 }
0238
0239
0240
0241
0242
0243 static inline void set_dma_addr(unsigned int dmanr, unsigned int a)
0244 {
0245 set_dma_page(dmanr, a>>16);
0246 if (dmanr <= 3) {
0247 dma_outb(a & 0xff, ((dmanr & 3) << 1) + IO_DMA1_BASE);
0248 dma_outb((a >> 8) & 0xff, ((dmanr & 3) << 1) + IO_DMA1_BASE);
0249 } else {
0250 dma_outb((a >> 1) & 0xff, ((dmanr & 3) << 2) + IO_DMA2_BASE);
0251 dma_outb((a >> 9) & 0xff, ((dmanr & 3) << 2) + IO_DMA2_BASE);
0252 }
0253 }
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264 static inline void set_dma_count(unsigned int dmanr, unsigned int count)
0265 {
0266 count--;
0267 if (dmanr <= 3) {
0268 dma_outb(count & 0xff, ((dmanr & 3) << 1) + 1 + IO_DMA1_BASE);
0269 dma_outb((count >> 8) & 0xff,
0270 ((dmanr & 3) << 1) + 1 + IO_DMA1_BASE);
0271 } else {
0272 dma_outb((count >> 1) & 0xff,
0273 ((dmanr & 3) << 2) + 2 + IO_DMA2_BASE);
0274 dma_outb((count >> 9) & 0xff,
0275 ((dmanr & 3) << 2) + 2 + IO_DMA2_BASE);
0276 }
0277 }
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288 static inline int get_dma_residue(unsigned int dmanr)
0289 {
0290 unsigned int io_port;
0291
0292 unsigned short count;
0293
0294 io_port = (dmanr <= 3) ? ((dmanr & 3) << 1) + 1 + IO_DMA1_BASE
0295 : ((dmanr & 3) << 2) + 2 + IO_DMA2_BASE;
0296
0297 count = 1 + dma_inb(io_port);
0298 count += dma_inb(io_port) << 8;
0299
0300 return (dmanr <= 3) ? count : (count << 1);
0301 }
0302
0303
0304
0305 #ifdef CONFIG_ISA_DMA_API
0306 extern int request_dma(unsigned int dmanr, const char *device_id);
0307 extern void free_dma(unsigned int dmanr);
0308 #endif
0309
0310 #endif