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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.dbdma.h 1.8 12/01/01 20:09:11 benh
  3.  */
  4. /*
  5.  * Definitions for using the Apple Descriptor-Based DMA controller
  6.  * in Power Macintosh computers.
  7.  *
  8.  * Copyright (C) 1996 Paul Mackerras.
  9.  */
  10. #ifdef __KERNEL__
  11. #ifndef _ASM_DBDMA_H_
  12. #define _ASM_DBDMA_H_
  13. /*
  14.  * DBDMA control/status registers.  All little-endian.
  15.  */
  16. struct dbdma_regs {
  17.     unsigned int control; /* lets you change bits in status */
  18.     unsigned int status; /* DMA and device status bits (see below) */
  19.     unsigned int cmdptr_hi; /* upper 32 bits of command address */
  20.     unsigned int cmdptr; /* (lower 32 bits of) command address (phys) */
  21.     unsigned int intr_sel; /* select interrupt condition bit */
  22.     unsigned int br_sel; /* select branch condition bit */
  23.     unsigned int wait_sel; /* select wait condition bit */
  24.     unsigned int xfer_mode;
  25.     unsigned int data2ptr_hi;
  26.     unsigned int data2ptr;
  27.     unsigned int res1;
  28.     unsigned int address_hi;
  29.     unsigned int br_addr_hi;
  30.     unsigned int res2[3];
  31. };
  32. /* Bits in control and status registers */
  33. #define RUN 0x8000
  34. #define PAUSE 0x4000
  35. #define FLUSH 0x2000
  36. #define WAKE 0x1000
  37. #define DEAD 0x0800
  38. #define ACTIVE 0x0400
  39. #define BT 0x0100
  40. #define DEVSTAT 0x00ff
  41. /*
  42.  * DBDMA command structure.  These fields are all little-endian!
  43.  */
  44. struct dbdma_cmd {
  45.     unsigned short req_count; /* requested byte transfer count */
  46.     unsigned short command; /* command word (has bit-fields) */
  47.     unsigned int   phy_addr; /* physical data address */
  48.     unsigned int   cmd_dep; /* command-dependent field */
  49.     unsigned short res_count; /* residual count after completion */
  50.     unsigned short xfer_status; /* transfer status */
  51. };
  52. /* DBDMA command values in command field */
  53. #define OUTPUT_MORE 0 /* transfer memory data to stream */
  54. #define OUTPUT_LAST 0x1000 /* ditto followed by end marker */
  55. #define INPUT_MORE 0x2000 /* transfer stream data to memory */
  56. #define INPUT_LAST 0x3000 /* ditto, expect end marker */
  57. #define STORE_WORD 0x4000 /* write word (4 bytes) to device reg */
  58. #define LOAD_WORD 0x5000 /* read word (4 bytes) from device reg */
  59. #define DBDMA_NOP 0x6000 /* do nothing */
  60. #define DBDMA_STOP 0x7000 /* suspend processing */
  61. /* Key values in command field */
  62. #define KEY_STREAM0 0 /* usual data stream */
  63. #define KEY_STREAM1 0x100 /* control/status stream */
  64. #define KEY_STREAM2 0x200 /* device-dependent stream */
  65. #define KEY_STREAM3 0x300 /* device-dependent stream */
  66. #define KEY_REGS 0x500 /* device register space */
  67. #define KEY_SYSTEM 0x600 /* system memory-mapped space */
  68. #define KEY_DEVICE 0x700 /* device memory-mapped space */
  69. /* Interrupt control values in command field */
  70. #define INTR_NEVER 0 /* don't interrupt */
  71. #define INTR_IFSET 0x10 /* intr if condition bit is 1 */
  72. #define INTR_IFCLR 0x20 /* intr if condition bit is 0 */
  73. #define INTR_ALWAYS 0x30 /* always interrupt */
  74. /* Branch control values in command field */
  75. #define BR_NEVER 0 /* don't branch */
  76. #define BR_IFSET 0x4 /* branch if condition bit is 1 */
  77. #define BR_IFCLR 0x8 /* branch if condition bit is 0 */
  78. #define BR_ALWAYS 0xc /* always branch */
  79. /* Wait control values in command field */
  80. #define WAIT_NEVER 0 /* don't wait */
  81. #define WAIT_IFSET 1 /* wait if condition bit is 1 */
  82. #define WAIT_IFCLR 2 /* wait if condition bit is 0 */
  83. #define WAIT_ALWAYS 3 /* always wait */
  84. /* Align an address for a DBDMA command structure */
  85. #define DBDMA_ALIGN(x) (((unsigned)(x) + sizeof(struct dbdma_cmd) - 1) 
  86.  & -sizeof(struct dbdma_cmd))
  87. /* Useful macros */
  88. #define DBDMA_DO_STOP(regs) do {
  89. out_le32(&((regs)->control), (RUN|FLUSH)<<16);
  90. while(in_le32(&((regs)->status)) & (ACTIVE|FLUSH))
  91. ;
  92. } while(0)
  93. #endif /* _ASM_DBDMA_H_ */
  94. #endif /* __KERNEL__ */