~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/alpha/include/asm/dma.h

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/alpha/include/asm/dma.h (Architecture sparc64) and /arch/ppc/include/asm-ppc/dma.h (Architecture ppc)


  1 /* SPDX-License-Identifier: GPL-2.0 */              1 
  2 /*                                                
  3  * include/asm-alpha/dma.h                        
  4  *                                                
  5  * This is essentially the same as the i386 DM    
  6  * use ISA-compatible dma.  The only extension    
  7  * registers that allow to set the top 8 bits     
  8  * This register should be written last when s    
  9  * as this will also enable DMA across 64 KB b    
 10  */                                               
 11                                                   
 12 /* $Id: dma.h,v 1.7 1992/12/14 00:29:34 root E    
 13  * linux/include/asm/dma.h: Defines for using     
 14  * Written by Hennus Bergman, 1992.               
 15  * High DMA channel support & info by Hannu Sa    
 16  * and John Boyd, Nov. 1992.                      
 17  */                                               
 18                                                   
 19 #ifndef _ASM_DMA_H                                
 20 #define _ASM_DMA_H                                
 21                                                   
 22 #include <linux/spinlock.h>                       
 23 #include <asm/io.h>                               
 24                                                   
 25 #define dma_outb        outb                      
 26 #define dma_inb         inb                       
 27                                                   
 28 /*                                                
 29  * NOTES about DMA transfers:                     
 30  *                                                
 31  *  controller 1: channels 0-3, byte operation    
 32  *  controller 2: channels 4-7, word operation    
 33  *                                                
 34  *  - ALL registers are 8 bits only, regardles    
 35  *  - channel 4 is not used - cascades 1 into     
 36  *  - channels 0-3 are byte - addresses/counts    
 37  *  - channels 5-7 are word - addresses/counts    
 38  *  - transfers must not cross physical 64K (0    
 39  *  - transfer count loaded to registers is 1     
 40  *  - controller 2 offsets are all even (2x of    
 41  *  - page registers for 5-7 don't use data bi    
 42  *  - page registers for 0-3 use bit 0, repres    
 43  *                                                
 44  * DMA transfers are limited to the lower 16MB    
 45  * Note that addresses loaded into registers m    
 46  * not logical addresses (which may differ if     
 47  *                                                
 48  *  Address mapping for channels 0-3:             
 49  *                                                
 50  *   A23 ... A16 A15 ... A8  A7 ... A0    (Phy    
 51  *    |  ...  |   |  ... |   |  ... |             
 52  *    |  ...  |   |  ... |   |  ... |             
 53  *    |  ...  |   |  ... |   |  ... |             
 54  *   P7  ...  P0  A7 ... A0  A7 ... A0            
 55  * |    Page    | Addr MSB | Addr LSB |   (DMA    
 56  *                                                
 57  *  Address mapping for channels 5-7:             
 58  *                                                
 59  *   A23 ... A17 A16 A15 ... A9 A8 A7 ... A1 A    
 60  *    |  ...  |   \   \   ... \  \  \  ... \      
 61  *    |  ...  |    \   \   ... \  \  \  ... \     
 62  *    |  ...  |     \   \   ... \  \  \  ... \    
 63  *   P7  ...  P1 (0) A7 A6  ... A0 A7 A6 ... A    
 64  * |      Page      |  Addr MSB   |  Addr LSB     
 65  *                                                
 66  * Again, channels 5-7 transfer _physical_ wor    
 67  * and counts _must_ be word-aligned (the lowe    
 68  * the hardware level, so odd-byte transfers a    
 69  *                                                
 70  * Transfer count (_not # bytes_) is limited t    
 71  * count - 1 : 64K => 0xFFFF, 1 => 0x0000.  Th    
 72  * and up to 128K bytes may be transferred on     
 73  *                                                
 74  */                                               
 75                                                   
 76 #define MAX_DMA_CHANNELS        8                 
 77                                                   
 78 /*                                                
 79   ISA DMA limitations on Alpha platforms,         
 80                                                   
 81   These may be due to SIO (PCI<->ISA bridge) c    
 82   just a wiring limit.                            
 83 */                                                
 84                                                   
 85 /* The maximum address for ISA DMA transfer on    
 86    due to an hardware SIO limitation, is 16MB.    
 87 */                                                
 88 #define ALPHA_RUFFIAN_MAX_ISA_DMA_ADDRESS         
 89                                                   
 90 /* The maximum address for ISA DMA transfer on    
 91    due to an hardware SIO chip limitation, is     
 92 */                                                
 93 #define ALPHA_SABLE_MAX_ISA_DMA_ADDRESS           
 94 #define ALPHA_ALCOR_MAX_ISA_DMA_ADDRESS           
 95                                                   
 96 /*                                                
 97   Maximum address for all the others is the co    
 98   address space.                                  
 99 */                                                
100 #define ALPHA_MAX_ISA_DMA_ADDRESS                 
101                                                   
102 #ifdef CONFIG_ALPHA_GENERIC                       
103 # define MAX_ISA_DMA_ADDRESS            (alpha    
104 #else                                             
105 # if defined(CONFIG_ALPHA_RUFFIAN)                
106 #  define MAX_ISA_DMA_ADDRESS           ALPHA_    
107 # elif defined(CONFIG_ALPHA_SABLE)                
108 #  define MAX_ISA_DMA_ADDRESS           ALPHA_    
109 # elif defined(CONFIG_ALPHA_ALCOR)                
110 #  define MAX_ISA_DMA_ADDRESS           ALPHA_    
111 # else                                            
112 #  define MAX_ISA_DMA_ADDRESS           ALPHA_    
113 # endif                                           
114 #endif                                            
115                                                   
116 /* If we have the iommu, we don't have any add    
117    Otherwise (Nautilus, RX164), we have to hav    
118    like i386. */                                  
119 #define MAX_DMA_ADDRESS         (alpha_mv.mv_p    
120                                  ~0UL : IDENT_    
121                                                   
122 /* 8237 DMA controllers */                        
123 #define IO_DMA1_BASE    0x00    /* 8 bit slave    
124 #define IO_DMA2_BASE    0xC0    /* 16 bit mast    
125                                                   
126 /* DMA controller registers */                    
127 #define DMA1_CMD_REG            0x08    /* com    
128 #define DMA1_STAT_REG           0x08    /* sta    
129 #define DMA1_REQ_REG            0x09    /* req    
130 #define DMA1_MASK_REG           0x0A    /* sin    
131 #define DMA1_MODE_REG           0x0B    /* mod    
132 #define DMA1_CLEAR_FF_REG       0x0C    /* cle    
133 #define DMA1_TEMP_REG           0x0D    /* Tem    
134 #define DMA1_RESET_REG          0x0D    /* Mas    
135 #define DMA1_CLR_MASK_REG       0x0E    /* Cle    
136 #define DMA1_MASK_ALL_REG       0x0F    /* all    
137 #define DMA1_EXT_MODE_REG       (0x400 | DMA1_    
138                                                   
139 #define DMA2_CMD_REG            0xD0    /* com    
140 #define DMA2_STAT_REG           0xD0    /* sta    
141 #define DMA2_REQ_REG            0xD2    /* req    
142 #define DMA2_MASK_REG           0xD4    /* sin    
143 #define DMA2_MODE_REG           0xD6    /* mod    
144 #define DMA2_CLEAR_FF_REG       0xD8    /* cle    
145 #define DMA2_TEMP_REG           0xDA    /* Tem    
146 #define DMA2_RESET_REG          0xDA    /* Mas    
147 #define DMA2_CLR_MASK_REG       0xDC    /* Cle    
148 #define DMA2_MASK_ALL_REG       0xDE    /* all    
149 #define DMA2_EXT_MODE_REG       (0x400 | DMA2_    
150                                                   
151 #define DMA_ADDR_0              0x00    /* DMA    
152 #define DMA_ADDR_1              0x02              
153 #define DMA_ADDR_2              0x04              
154 #define DMA_ADDR_3              0x06              
155 #define DMA_ADDR_4              0xC0              
156 #define DMA_ADDR_5              0xC4              
157 #define DMA_ADDR_6              0xC8              
158 #define DMA_ADDR_7              0xCC              
159                                                   
160 #define DMA_CNT_0               0x01    /* DMA    
161 #define DMA_CNT_1               0x03              
162 #define DMA_CNT_2               0x05              
163 #define DMA_CNT_3               0x07              
164 #define DMA_CNT_4               0xC2              
165 #define DMA_CNT_5               0xC6              
166 #define DMA_CNT_6               0xCA              
167 #define DMA_CNT_7               0xCE              
168                                                   
169 #define DMA_PAGE_0              0x87    /* DMA    
170 #define DMA_PAGE_1              0x83              
171 #define DMA_PAGE_2              0x81              
172 #define DMA_PAGE_3              0x82              
173 #define DMA_PAGE_5              0x8B              
174 #define DMA_PAGE_6              0x89              
175 #define DMA_PAGE_7              0x8A              
176                                                   
177 #define DMA_HIPAGE_0            (0x400 | DMA_P    
178 #define DMA_HIPAGE_1            (0x400 | DMA_P    
179 #define DMA_HIPAGE_2            (0x400 | DMA_P    
180 #define DMA_HIPAGE_3            (0x400 | DMA_P    
181 #define DMA_HIPAGE_4            (0x400 | DMA_P    
182 #define DMA_HIPAGE_5            (0x400 | DMA_P    
183 #define DMA_HIPAGE_6            (0x400 | DMA_P    
184 #define DMA_HIPAGE_7            (0x400 | DMA_P    
185                                                   
186 #define DMA_MODE_READ   0x44    /* I/O to memo    
187 #define DMA_MODE_WRITE  0x48    /* memory to I    
188 #define DMA_MODE_CASCADE 0xC0   /* pass thru D    
189                                                   
190 #define DMA_AUTOINIT    0x10                      
191                                                   
192 extern spinlock_t  dma_spin_lock;                 
193                                                   
194 static __inline__ unsigned long claim_dma_lock    
195 {                                                 
196         unsigned long flags;                      
197         spin_lock_irqsave(&dma_spin_lock, flag    
198         return flags;                             
199 }                                                 
200                                                   
201 static __inline__ void release_dma_lock(unsign    
202 {                                                 
203         spin_unlock_irqrestore(&dma_spin_lock,    
204 }                                                 
205                                                   
206 /* enable/disable a specific DMA channel */       
207 static __inline__ void enable_dma(unsigned int    
208 {                                                 
209         if (dmanr<=3)                             
210                 dma_outb(dmanr,  DMA1_MASK_REG    
211         else                                      
212                 dma_outb(dmanr & 3,  DMA2_MASK    
213 }                                                 
214                                                   
215 static __inline__ void disable_dma(unsigned in    
216 {                                                 
217         if (dmanr<=3)                             
218                 dma_outb(dmanr | 4,  DMA1_MASK    
219         else                                      
220                 dma_outb((dmanr & 3) | 4,  DMA    
221 }                                                 
222                                                   
223 /* Clear the 'DMA Pointer Flip Flop'.             
224  * Write 0 for LSB/MSB, 1 for MSB/LSB access.     
225  * Use this once to initialize the FF to a kno    
226  * After that, keep track of it. :-)              
227  * --- In order to do that, the DMA routines b    
228  * --- only be used while interrupts are disab    
229  */                                               
230 static __inline__ void clear_dma_ff(unsigned i    
231 {                                                 
232         if (dmanr<=3)                             
233                 dma_outb(0,  DMA1_CLEAR_FF_REG    
234         else                                      
235                 dma_outb(0,  DMA2_CLEAR_FF_REG    
236 }                                                 
237                                                   
238 /* set mode (above) for a specific DMA channel    
239 static __inline__ void set_dma_mode(unsigned i    
240 {                                                 
241         if (dmanr<=3)                             
242                 dma_outb(mode | dmanr,  DMA1_M    
243         else                                      
244                 dma_outb(mode | (dmanr&3),  DM    
245 }                                                 
246                                                   
247 /* set extended mode for a specific DMA channe    
248 static __inline__ void set_dma_ext_mode(unsign    
249 {                                                 
250         if (dmanr<=3)                             
251                 dma_outb(ext_mode | dmanr,  DM    
252         else                                      
253                 dma_outb(ext_mode | (dmanr&3),    
254 }                                                 
255                                                   
256 /* Set only the page register bits of the tran    
257  * This is used for successive transfers when     
258  * the lower 16 bits of the DMA current addres    
259  */                                               
260 static __inline__ void set_dma_page(unsigned i    
261 {                                                 
262         switch(dmanr) {                           
263                 case 0:                           
264                         dma_outb(pagenr, DMA_P    
265                         dma_outb((pagenr >> 8)    
266                         break;                    
267                 case 1:                           
268                         dma_outb(pagenr, DMA_P    
269                         dma_outb((pagenr >> 8)    
270                         break;                    
271                 case 2:                           
272                         dma_outb(pagenr, DMA_P    
273                         dma_outb((pagenr >> 8)    
274                         break;                    
275                 case 3:                           
276                         dma_outb(pagenr, DMA_P    
277                         dma_outb((pagenr >> 8)    
278                         break;                    
279                 case 5:                           
280                         dma_outb(pagenr & 0xfe    
281                         dma_outb((pagenr >> 8)    
282                         break;                    
283                 case 6:                           
284                         dma_outb(pagenr & 0xfe    
285                         dma_outb((pagenr >> 8)    
286                         break;                    
287                 case 7:                           
288                         dma_outb(pagenr & 0xfe    
289                         dma_outb((pagenr >> 8)    
290                         break;                    
291         }                                         
292 }                                                 
293                                                   
294                                                   
295 /* Set transfer address & page bits for specif    
296  * Assumes dma flipflop is clear.                 
297  */                                               
298 static __inline__ void set_dma_addr(unsigned i    
299 {                                                 
300         if (dmanr <= 3)  {                        
301             dma_outb( a & 0xff, ((dmanr&3)<<1)    
302             dma_outb( (a>>8) & 0xff, ((dmanr&3    
303         }  else  {                                
304             dma_outb( (a>>1) & 0xff, ((dmanr&3    
305             dma_outb( (a>>9) & 0xff, ((dmanr&3    
306         }                                         
307         set_dma_page(dmanr, a>>16);     /* set    
308 }                                                 
309                                                   
310                                                   
311 /* Set transfer size (max 64k for DMA1..3, 128    
312  * a specific DMA channel.                        
313  * You must ensure the parameters are valid.      
314  * NOTE: from a manual: "the number of transfe    
315  * than the initial word count"! This is taken    
316  * Assumes dma flip-flop is clear.                
317  * NOTE 2: "count" represents _bytes_ and must    
318  */                                               
319 static __inline__ void set_dma_count(unsigned     
320 {                                                 
321         count--;                                  
322         if (dmanr <= 3)  {                        
323             dma_outb( count & 0xff, ((dmanr&3)    
324             dma_outb( (count>>8) & 0xff, ((dma    
325         } else {                                  
326             dma_outb( (count>>1) & 0xff, ((dma    
327             dma_outb( (count>>9) & 0xff, ((dma    
328         }                                         
329 }                                                 
330                                                   
331                                                   
332 /* Get DMA residue count. After a DMA transfer    
333  * should return zero. Reading this while a DM    
334  * still in progress will return unpredictable    
335  * If called before the channel has been used,    
336  * Otherwise, it returns the number of _bytes_    
337  *                                                
338  * Assumes DMA flip-flop is clear.                
339  */                                               
340 static __inline__ int get_dma_residue(unsigned    
341 {                                                 
342         unsigned int io_port = (dmanr<=3)? ((d    
343                                          : ((d    
344                                                   
345         /* using short to get 16-bit wrap arou    
346         unsigned short count;                     
347                                                   
348         count = 1 + dma_inb(io_port);             
349         count += dma_inb(io_port) << 8;           
350                                                   
351         return (dmanr<=3)? count : (count<<1);    
352 }                                                 
353                                                   
354                                                   
355 /* These are in kernel/dma.c: */                  
356 extern int request_dma(unsigned int dmanr, con    
357 extern void free_dma(unsigned int dmanr);         
358 #define KERNEL_HAVE_CHECK_DMA                     
359 extern int check_dma(unsigned int dmanr);         
360                                                   
361 #endif /* _ASM_DMA_H */                           
362                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php