dma.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:12k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.dma.h 1.8 05/17/01 18:14:24 cort
  3.  */
  4. /*
  5.  * linux/include/asm/dma.h: Defines for using and allocating dma channels.
  6.  * Written by Hennus Bergman, 1992.
  7.  * High DMA channel support & info by Hannu Savolainen
  8.  * and John Boyd, Nov. 1992.
  9.  * Changes for ppc sound by Christoph Nadig
  10.  */
  11. #ifdef __KERNEL__
  12. #include <linux/config.h>
  13. #include <asm/io.h>
  14. #include <linux/spinlock.h>
  15. #include <asm/system.h>
  16. /*
  17.  * Note: Adapted for PowerPC by Gary Thomas
  18.  * Modified by Cort Dougan <cort@cs.nmt.edu>
  19.  *
  20.  * None of this really applies for Power Macintoshes.  There is
  21.  * basically just enough here to get kernel/dma.c to compile.
  22.  *
  23.  * There may be some comments or restrictions made here which are
  24.  * not valid for the PReP platform.  Take what you read
  25.  * with a grain of salt.
  26.  */
  27.  
  28. #ifndef _ASM_DMA_H
  29. #define _ASM_DMA_H
  30. #ifndef MAX_DMA_CHANNELS
  31. #define MAX_DMA_CHANNELS 8
  32. #endif
  33. /* The maximum address that we can perform a DMA transfer to on this platform */
  34. /* Doesn't really apply... */
  35. #define MAX_DMA_ADDRESS      0xFFFFFFFF
  36. /* in arch/ppc/kernel/setup.c -- Cort */
  37. extern unsigned long DMA_MODE_WRITE, DMA_MODE_READ;
  38. extern unsigned long ISA_DMA_THRESHOLD;
  39. #ifdef HAVE_REALLY_SLOW_DMA_CONTROLLER
  40. #define dma_outb outb_p
  41. #else
  42. #define dma_outb outb
  43. #endif
  44. #define dma_inb inb
  45. /*
  46.  * NOTES about DMA transfers:
  47.  *
  48.  *  controller 1: channels 0-3, byte operations, ports 00-1F
  49.  *  controller 2: channels 4-7, word operations, ports C0-DF
  50.  *
  51.  *  - ALL registers are 8 bits only, regardless of transfer size
  52.  *  - channel 4 is not used - cascades 1 into 2.
  53.  *  - channels 0-3 are byte - addresses/counts are for physical bytes
  54.  *  - channels 5-7 are word - addresses/counts are for physical words
  55.  *  - transfers must not cross physical 64K (0-3) or 128K (5-7) boundaries
  56.  *  - transfer count loaded to registers is 1 less than actual count
  57.  *  - controller 2 offsets are all even (2x offsets for controller 1)
  58.  *  - page registers for 5-7 don't use data bit 0, represent 128K pages
  59.  *  - page registers for 0-3 use bit 0, represent 64K pages
  60.  *
  61.  * On PReP, DMA transfers are limited to the lower 16MB of _physical_ memory.  
  62.  * On CHRP, the W83C553F (and VLSI Tollgate?) support full 32 bit addressing.
  63.  * Note that addresses loaded into registers must be _physical_ addresses,
  64.  * not logical addresses (which may differ if paging is active).
  65.  *
  66.  *  Address mapping for channels 0-3:
  67.  *
  68.  *   A23 ... A16 A15 ... A8  A7 ... A0    (Physical addresses)
  69.  *    |  ...  |   |  ... |   |  ... |
  70.  *    |  ...  |   |  ... |   |  ... |
  71.  *    |  ...  |   |  ... |   |  ... |
  72.  *   P7  ...  P0  A7 ... A0  A7 ... A0   
  73.  * |    Page    | Addr MSB | Addr LSB |   (DMA registers)
  74.  *
  75.  *  Address mapping for channels 5-7:
  76.  *
  77.  *   A23 ... A17 A16 A15 ... A9 A8 A7 ... A1 A0    (Physical addresses)
  78.  *    |  ...  |         ...       ...   
  79.  *    |  ...  |          ...       ...   (not used)
  80.  *    |  ...  |           ...       ... 
  81.  *   P7  ...  P1 (0) A7 A6  ... A0 A7 A6 ... A0   
  82.  * |      Page      |  Addr MSB   |  Addr LSB  |   (DMA registers)
  83.  *
  84.  * Again, channels 5-7 transfer _physical_ words (16 bits), so addresses
  85.  * and counts _must_ be word-aligned (the lowest address bit is _ignored_ at
  86.  * the hardware level, so odd-byte transfers aren't possible).
  87.  *
  88.  * Transfer count (_not # bytes_) is limited to 64K, represented as actual
  89.  * count - 1 : 64K => 0xFFFF, 1 => 0x0000.  Thus, count is always 1 or more,
  90.  * and up to 128K bytes may be transferred on channels 5-7 in one operation. 
  91.  *
  92.  */
  93. /* used in nasty hack for sound - see prep_setup_arch() -- Cort */
  94. extern long ppc_cs4232_dma, ppc_cs4232_dma2;
  95. #if defined(CONFIG_CS4232)
  96. #if defined(CONFIG_ALL_PPC)
  97. #define SND_DMA1 ppc_cs4232_dma
  98. #define SND_DMA2 ppc_cs4232_dma2
  99. #else /* !CONFIG_ALL_PPC */
  100. #define SND_DMA1 -1
  101. #define SND_DMA2 -1
  102. #endif /* CONFIG_ALL_PPC */
  103. #elif defined(CONFIG_MSS)
  104. #define SND_DMA1 CONFIG_MSS_DMA
  105. #define SND_DMA2 CONFIG_MSS_DMA2
  106. #else
  107. #define SND_DMA1 -1
  108. #define SND_DMA2 -1
  109. #endif
  110. /* 8237 DMA controllers */
  111. #define IO_DMA1_BASE 0x00 /* 8 bit slave DMA, channels 0..3 */
  112. #define IO_DMA2_BASE 0xC0 /* 16 bit master DMA, ch 4(=slave input)..7 */
  113. /* DMA controller registers */
  114. #define DMA1_CMD_REG 0x08 /* command register (w) */
  115. #define DMA1_STAT_REG 0x08 /* status register (r) */
  116. #define DMA1_REQ_REG            0x09    /* request register (w) */
  117. #define DMA1_MASK_REG 0x0A /* single-channel mask (w) */
  118. #define DMA1_MODE_REG 0x0B /* mode register (w) */
  119. #define DMA1_CLEAR_FF_REG 0x0C /* clear pointer flip-flop (w) */
  120. #define DMA1_TEMP_REG           0x0D    /* Temporary Register (r) */
  121. #define DMA1_RESET_REG 0x0D /* Master Clear (w) */
  122. #define DMA1_CLR_MASK_REG       0x0E    /* Clear Mask */
  123. #define DMA1_MASK_ALL_REG       0x0F    /* all-channels mask (w) */
  124. #define DMA2_CMD_REG 0xD0 /* command register (w) */
  125. #define DMA2_STAT_REG 0xD0 /* status register (r) */
  126. #define DMA2_REQ_REG            0xD2    /* request register (w) */
  127. #define DMA2_MASK_REG 0xD4 /* single-channel mask (w) */
  128. #define DMA2_MODE_REG 0xD6 /* mode register (w) */
  129. #define DMA2_CLEAR_FF_REG 0xD8 /* clear pointer flip-flop (w) */
  130. #define DMA2_TEMP_REG           0xDA    /* Temporary Register (r) */
  131. #define DMA2_RESET_REG 0xDA /* Master Clear (w) */
  132. #define DMA2_CLR_MASK_REG       0xDC    /* Clear Mask */
  133. #define DMA2_MASK_ALL_REG       0xDE    /* all-channels mask (w) */
  134. #define DMA_ADDR_0              0x00    /* DMA address registers */
  135. #define DMA_ADDR_1              0x02
  136. #define DMA_ADDR_2              0x04
  137. #define DMA_ADDR_3              0x06
  138. #define DMA_ADDR_4              0xC0
  139. #define DMA_ADDR_5              0xC4
  140. #define DMA_ADDR_6              0xC8
  141. #define DMA_ADDR_7              0xCC
  142. #define DMA_CNT_0               0x01    /* DMA count registers */
  143. #define DMA_CNT_1               0x03
  144. #define DMA_CNT_2               0x05
  145. #define DMA_CNT_3               0x07
  146. #define DMA_CNT_4               0xC2
  147. #define DMA_CNT_5               0xC6
  148. #define DMA_CNT_6               0xCA
  149. #define DMA_CNT_7               0xCE
  150. #define DMA_LO_PAGE_0              0x87    /* DMA page registers */
  151. #define DMA_LO_PAGE_1              0x83
  152. #define DMA_LO_PAGE_2              0x81
  153. #define DMA_LO_PAGE_3              0x82
  154. #define DMA_LO_PAGE_5              0x8B
  155. #define DMA_LO_PAGE_6              0x89
  156. #define DMA_LO_PAGE_7              0x8A
  157. #define DMA_HI_PAGE_0              0x487    /* DMA page registers */
  158. #define DMA_HI_PAGE_1              0x483
  159. #define DMA_HI_PAGE_2              0x481
  160. #define DMA_HI_PAGE_3              0x482
  161. #define DMA_HI_PAGE_5              0x48B
  162. #define DMA_HI_PAGE_6              0x489
  163. #define DMA_HI_PAGE_7              0x48A
  164. #define DMA1_EXT_REG               0x40B
  165. #define DMA2_EXT_REG               0x4D6
  166. #define DMA_MODE_CASCADE 0xC0   /* pass thru DREQ->HRQ, DACK<-HLDA only */
  167. #define DMA_AUTOINIT     0x10
  168. extern spinlock_t  dma_spin_lock;
  169. static __inline__ unsigned long claim_dma_lock(void)
  170. {
  171. unsigned long flags;
  172. spin_lock_irqsave(&dma_spin_lock, flags);
  173. return flags;
  174. }
  175. static __inline__ void release_dma_lock(unsigned long flags)
  176. {
  177. spin_unlock_irqrestore(&dma_spin_lock, flags);
  178. }
  179. /* enable/disable a specific DMA channel */
  180. static __inline__ void enable_dma(unsigned int dmanr)
  181. {
  182. unsigned char ucDmaCmd=0x00;
  183. if (dmanr != 4)
  184. {
  185. dma_outb(0, DMA2_MASK_REG);  /* This may not be enabled */
  186. dma_outb(ucDmaCmd, DMA2_CMD_REG);  /* Enable group */
  187. }
  188. if (dmanr<=3)
  189. {
  190. dma_outb(dmanr,  DMA1_MASK_REG);
  191. dma_outb(ucDmaCmd, DMA1_CMD_REG);  /* Enable group */
  192. } else
  193. {
  194. dma_outb(dmanr & 3,  DMA2_MASK_REG);
  195. }
  196. }
  197. static __inline__ void disable_dma(unsigned int dmanr)
  198. {
  199. if (dmanr<=3)
  200. dma_outb(dmanr | 4,  DMA1_MASK_REG);
  201. else
  202. dma_outb((dmanr & 3) | 4,  DMA2_MASK_REG);
  203. }
  204. /* Clear the 'DMA Pointer Flip Flop'.
  205.  * Write 0 for LSB/MSB, 1 for MSB/LSB access.
  206.  * Use this once to initialize the FF to a known state.
  207.  * After that, keep track of it. :-)
  208.  * --- In order to do that, the DMA routines below should ---
  209.  * --- only be used while interrupts are disabled! ---
  210.  */
  211. static __inline__ void clear_dma_ff(unsigned int dmanr)
  212. {
  213. if (dmanr<=3)
  214. dma_outb(0,  DMA1_CLEAR_FF_REG);
  215. else
  216. dma_outb(0,  DMA2_CLEAR_FF_REG);
  217. }
  218. /* set mode (above) for a specific DMA channel */
  219. static __inline__ void set_dma_mode(unsigned int dmanr, char mode)
  220. {
  221. if (dmanr<=3)
  222. dma_outb(mode | dmanr,  DMA1_MODE_REG);
  223. else
  224. dma_outb(mode | (dmanr&3),  DMA2_MODE_REG);
  225. }
  226. /* Set only the page register bits of the transfer address.
  227.  * This is used for successive transfers when we know the contents of
  228.  * the lower 16 bits of the DMA current address register, but a 64k boundary
  229.  * may have been crossed.
  230.  */
  231. static __inline__ void set_dma_page(unsigned int dmanr, int pagenr)
  232. {
  233. switch(dmanr) {
  234. case 0:
  235. dma_outb(pagenr, DMA_LO_PAGE_0);
  236.                         dma_outb(pagenr>>8, DMA_HI_PAGE_0);
  237. break;
  238. case 1:
  239. dma_outb(pagenr, DMA_LO_PAGE_1);
  240.                         dma_outb(pagenr>>8, DMA_HI_PAGE_1);
  241. break;
  242. case 2:
  243. dma_outb(pagenr, DMA_LO_PAGE_2);
  244. dma_outb(pagenr>>8, DMA_HI_PAGE_2); 
  245. break;
  246. case 3:
  247. dma_outb(pagenr, DMA_LO_PAGE_3);
  248. dma_outb(pagenr>>8, DMA_HI_PAGE_3); 
  249. break;
  250.         case 5:
  251.         if (SND_DMA1 == 5 || SND_DMA2 == 5)
  252. dma_outb(pagenr, DMA_LO_PAGE_5);
  253. else
  254. dma_outb(pagenr & 0xfe, DMA_LO_PAGE_5);
  255.                         dma_outb(pagenr>>8, DMA_HI_PAGE_5);
  256. break;
  257. case 6:
  258.         if (SND_DMA1 == 6 || SND_DMA2 == 6)
  259. dma_outb(pagenr, DMA_LO_PAGE_6);
  260. else
  261. dma_outb(pagenr & 0xfe, DMA_LO_PAGE_6);
  262. dma_outb(pagenr>>8, DMA_HI_PAGE_6);
  263. break;
  264. case 7:
  265. if (SND_DMA1 == 7 || SND_DMA2 == 7)
  266. dma_outb(pagenr, DMA_LO_PAGE_7);
  267. else
  268. dma_outb(pagenr & 0xfe, DMA_LO_PAGE_7);
  269. dma_outb(pagenr>>8, DMA_HI_PAGE_7);
  270.   break;
  271. }
  272. }
  273. /* Set transfer address & page bits for specific DMA channel.
  274.  * Assumes dma flipflop is clear.
  275.  */
  276. static __inline__ void set_dma_addr(unsigned int dmanr, unsigned int phys)
  277. {
  278. if (dmanr <= 3)  {
  279.     dma_outb( phys & 0xff, ((dmanr&3)<<1) + IO_DMA1_BASE );
  280.             dma_outb( (phys>>8) & 0xff, ((dmanr&3)<<1) + IO_DMA1_BASE );
  281. }  else  {
  282.   if (dmanr == SND_DMA1 || dmanr == SND_DMA2) {
  283.     dma_outb( phys  & 0xff, ((dmanr&3)<<2) + IO_DMA2_BASE );
  284.     dma_outb( (phys>>8)  & 0xff, ((dmanr&3)<<2) + IO_DMA2_BASE );
  285.     dma_outb( (dmanr&3), DMA2_EXT_REG);
  286.   } else {
  287.     dma_outb( (phys>>1) & 0xff, ((dmanr&3)<<2) + IO_DMA2_BASE );
  288.     dma_outb( (phys>>9) & 0xff, ((dmanr&3)<<2) + IO_DMA2_BASE );
  289.   }
  290. }
  291. set_dma_page(dmanr, phys>>16);
  292. }
  293. /* Set transfer size (max 64k for DMA1..3, 128k for DMA5..7) for
  294.  * a specific DMA channel.
  295.  * You must ensure the parameters are valid.
  296.  * NOTE: from a manual: "the number of transfers is one more
  297.  * than the initial word count"! This is taken into account.
  298.  * Assumes dma flip-flop is clear.
  299.  * NOTE 2: "count" represents _bytes_ and must be even for channels 5-7.
  300.  */
  301. static __inline__ void set_dma_count(unsigned int dmanr, unsigned int count)
  302. {
  303.         count--;
  304. if (dmanr <= 3)  {
  305.     dma_outb( count & 0xff, ((dmanr&3)<<1) + 1 + IO_DMA1_BASE );
  306.     dma_outb( (count>>8) & 0xff, ((dmanr&3)<<1) + 1 + IO_DMA1_BASE );
  307.         } else {
  308.   if (dmanr == SND_DMA1 || dmanr == SND_DMA2) {
  309.     dma_outb( count & 0xff, ((dmanr&3)<<2) + 2 + IO_DMA2_BASE );
  310.     dma_outb( (count>>8) & 0xff, ((dmanr&3)<<2) + 2 + IO_DMA2_BASE );
  311.   } else {
  312.     dma_outb( (count>>1) & 0xff, ((dmanr&3)<<2) + 2 + IO_DMA2_BASE );
  313.     dma_outb( (count>>9) & 0xff, ((dmanr&3)<<2) + 2 + IO_DMA2_BASE );
  314.   }
  315.         }
  316. }
  317. /* Get DMA residue count. After a DMA transfer, this
  318.  * should return zero. Reading this while a DMA transfer is
  319.  * still in progress will return unpredictable results.
  320.  * If called before the channel has been used, it may return 1.
  321.  * Otherwise, it returns the number of _bytes_ left to transfer.
  322.  *
  323.  * Assumes DMA flip-flop is clear.
  324.  */
  325. static __inline__ int get_dma_residue(unsigned int dmanr)
  326. {
  327. unsigned int io_port = (dmanr<=3)? ((dmanr&3)<<1) + 1 + IO_DMA1_BASE
  328.  : ((dmanr&3)<<2) + 2 + IO_DMA2_BASE;
  329. /* using short to get 16-bit wrap around */
  330. unsigned short count;
  331. count = 1 + dma_inb(io_port);
  332. count += dma_inb(io_port) << 8;
  333. return (dmanr <= 3 || dmanr == SND_DMA1 || dmanr == SND_DMA2)
  334.   ? count : (count<<1);
  335. }
  336. /* These are in kernel/dma.c: */
  337. extern int request_dma(unsigned int dmanr, const char * device_id); /* reserve a DMA channel */
  338. extern void free_dma(unsigned int dmanr); /* release it again */
  339. #ifdef CONFIG_PCI
  340. extern int isa_dma_bridge_buggy;                                        
  341. #else                                                         
  342. #define isa_dma_bridge_buggy   (0)
  343. #endif
  344. #endif /* _ASM_DMA_H */
  345. #endif /* __KERNEL__ */