dbdma.h 3.7 KB

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