hnddma.h
上传用户:yuanda199
上传日期:2022-06-26
资源大小:412k
文件大小:6k
源码类别:

VxWorks

开发平台:

C/C++

  1. /*
  2.     Copyright 2001, Broadcom Corporation
  3.     All Rights Reserved.
  4.     
  5.     This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
  6.     the contents of this file may not be disclosed to third parties, copied or
  7.     duplicated in any form, in whole or in part, without the prior written
  8.     permission of Broadcom Corporation.
  9. */
  10. /*
  11.  * Generic Broadcom Home Networking Division (HND) DMA engine definitions.
  12.  * This supports the following chips: BCM42xx, 44xx, 47xx .
  13.  *
  14.  * $Id: hnddma.h,v 1.1 Broadcom SDK $
  15.  * Copyright(c) 2001 Broadcom Corporation
  16.  */
  17. #ifndef _hnddma_h_
  18. #define _hnddma_h_
  19. /*
  20.  * Each DMA processor consists of a transmit channel and a receive channel.
  21.  */
  22. typedef volatile struct {
  23. /* transmit channel */
  24. uint32 xmtcontrol; /* enable, et al */
  25. uint32 xmtaddr; /* descriptor ring base address (4K aligned) */
  26. uint32 xmtptr; /* last descriptor posted to chip */
  27. uint32 xmtstatus; /* current active descriptor, et al */
  28. /* receive channel */
  29. uint32 rcvcontrol; /* enable, et al */
  30. uint32 rcvaddr; /* descriptor ring base address (4K aligned) */
  31. uint32 rcvptr; /* last descriptor posted to chip */
  32. uint32 rcvstatus; /* current active descriptor, et al */
  33. } dmaregs_t;
  34. typedef volatile struct {
  35. /* diag access */
  36. uint32 fifoaddr; /* diag address */
  37. uint32 fifodatalow; /* low 32bits of data */
  38. uint32 fifodatahigh; /* high 32bits of data */
  39. uint32 pad; /* reserved */
  40. } dmafifo_t;
  41. /* transmit channel control */
  42. #define XC_XE ((uint32)1 << 0) /* transmit enable */
  43. #define XC_SE ((uint32)1 << 1) /* transmit suspend request */
  44. #define XC_LE ((uint32)1 << 2) /* loopback enable */
  45. #define XC_FPRI ((uint32)1 << 3) /* fair priority */
  46. #define XC_FL ((uint32)1 << 4) /* flush request */
  47. /* transmit descriptor table pointer */
  48. #define XP_LD_MASK 0xfff /* last valid descriptor */
  49. /* transmit channel status */
  50. #define XS_CD_MASK 0x0fff /* current descriptor pointer */
  51. #define XS_XS_MASK 0xf000 /* transmit state */
  52. #define XS_XS_SHIFT 12
  53. #define XS_XS_DISABLED 0x0000 /* disabled */
  54. #define XS_XS_ACTIVE 0x1000 /* active */
  55. #define XS_XS_IDLE 0x2000 /* idle wait */
  56. #define XS_XS_STOPPED 0x3000 /* stopped */
  57. #define XS_XS_SUSP 0x4000 /* suspend pending */
  58. #define XS_XE_MASK 0xf0000 /* transmit errors */
  59. #define XS_XE_SHIFT 16
  60. #define XS_XE_NOERR 0x00000 /* no error */
  61. #define XS_XE_DPE 0x10000 /* descriptor protocol error */
  62. #define XS_XE_DFU 0x20000 /* data fifo underrun */
  63. #define XS_XE_BEBR 0x30000 /* bus error on buffer read */
  64. #define XS_XE_BEDA 0x40000 /* bus error on descriptor access */
  65. #define XS_FL ((uint32)1 << 20) /* flushed */
  66. /* receive channel control */
  67. #define RC_RE ((uint32)1 << 0) /* receive enable */
  68. #define RC_RO_MASK 0xfe /* receive frame offset */
  69. #define RC_RO_SHIFT 1
  70. #define RC_FM ((uint32)1 << 8) /* direct fifo receive (pio) mode */
  71. /* receive descriptor table pointer */
  72. #define RP_LD_MASK 0xfff /* last valid descriptor */
  73. /* receive channel status */
  74. #define RS_CD_MASK 0x0fff /* current descriptor pointer */
  75. #define RS_RS_MASK 0xf000 /* receive state */
  76. #define RS_RS_SHIFT 12
  77. #define RS_RS_DISABLED 0x0000 /* disabled */
  78. #define RS_RS_ACTIVE 0x1000 /* active */
  79. #define RS_RS_IDLE 0x2000 /* idle wait */
  80. #define RS_RS_STOPPED 0x3000 /* reserved */
  81. #define RS_RE_MASK 0xf0000 /* receive errors */
  82. #define RS_RE_SHIFT 16
  83. #define RS_RE_NOERR 0x00000 /* no error */
  84. #define RS_RE_DPE 0x10000 /* descriptor protocol error */
  85. #define RS_RE_DFO 0x20000 /* data fifo overflow */
  86. #define RS_RE_BEBW 0x30000 /* bus error on buffer write */
  87. #define RS_RE_BEDA 0x40000 /* bus error on descriptor access */
  88. /* fifoaddr */
  89. #define FA_OFF_MASK 0xffff /* offset */
  90. #define FA_SEL_MASK 0xf0000 /* select */
  91. #define FA_SEL_SHIFT 16
  92. #define FA_SEL_XDD 0x00000 /* transmit dma data */
  93. #define FA_SEL_XDP 0x10000 /* transmit dma pointers */
  94. #define FA_SEL_RDD 0x40000 /* receive dma data */
  95. #define FA_SEL_RDP 0x50000 /* receive dma pointers */
  96. #define FA_SEL_XFD 0x80000 /* transmit fifo data */
  97. #define FA_SEL_XFP 0x90000 /* transmit fifo pointers */
  98. #define FA_SEL_RFD 0xc0000 /* receive fifo data */
  99. #define FA_SEL_RFP 0xd0000 /* receive fifo pointers */
  100. /*
  101.  * DMA Descriptor
  102.  * Descriptors are only read by the hardware, never written back.
  103.  */
  104. typedef volatile struct {
  105. uint32 ctrl; /* misc control bits & bufcount */
  106. uint32 addr; /* data buffer address */
  107. } dmadd_t;
  108. /*
  109.  * Each descriptor ring must be 4096byte aligned
  110.  * and fit within a single 4096byte page.
  111.  */
  112. #define DMAMAXRINGSZ 4096
  113. #define DMARINGALIGN 4096
  114. /* control flags */
  115. #define CTRL_BC_MASK 0x1fff /* buffer byte count */
  116. #define CTRL_EOT ((uint32)1 << 28) /* end of descriptor table */
  117. #define CTRL_IOC ((uint32)1 << 29) /* interrupt on completion */
  118. #define CTRL_EOF ((uint32)1 << 30) /* end of frame */
  119. #define CTRL_SOF ((uint32)1 << 31) /* start of frame */
  120. /* control flags in the range [27:20] are core-specific and not defined here */
  121. #define CTRL_CORE_MASK 0x0ff00000
  122. /* export structure */
  123. typedef volatile struct {
  124. /* rx error counters */
  125. uint rxgiants; /* rx giant frames */
  126. uint rxnobuf; /* rx out of dma descriptors */
  127. /* tx error counters */
  128. uint txnobuf; /* tx out of dma descriptors */
  129. } hnddma_t;
  130. #ifndef di_t
  131. #define di_t void
  132. #endif
  133. /* externs */
  134. extern void *dma_attach(void *drv, void *dev, char *name, dmaregs_t *dmaregs,
  135. uint ntxd, uint nrxd, uint rxbufsize, uint nrxpost, uint rxoffset,
  136. uint ddoffset, uint dataoffset, uint *msg_level);
  137. extern void dma_detach(di_t *di);
  138. extern void dma_txreset(di_t *di);
  139. extern void dma_rxreset(di_t *di);
  140. extern void dma_txinit(di_t *di);
  141. extern bool dma_txenabled(di_t *di);
  142. extern void dma_rxinit(di_t *di);
  143. extern void dma_rxenable(di_t *di);
  144. extern bool dma_rxenabled(di_t *di);
  145. extern void dma_txsuspend(di_t *di);
  146. extern void dma_txresume(di_t *di);
  147. extern bool dma_txsuspended(di_t *di);
  148. extern bool dma_txstopped(di_t *di);
  149. extern bool dma_rxstopped(di_t *di);
  150. extern int dma_txfast(di_t *di, void *p, uint32 coreflags);
  151. extern int dma_tx(di_t *di, void *p, uint32 coreflags);
  152. extern void dma_fifoloopbackenable(di_t *di);
  153. extern void *dma_rx(di_t *di);
  154. extern void dma_rxfill(di_t *di);
  155. extern void dma_txreclaim(di_t *di, bool forceall);
  156. extern void dma_rxreclaim(di_t *di);
  157. extern char *dma_dump(di_t *di, char *buf);
  158. extern uint dma_getvar(di_t *di, char *name);
  159. extern void *dma_getnexttxp(di_t *di, bool forceall);
  160. extern void *dma_getnextrxp(di_t *di, bool forceall);
  161. #endif /* _hnddma_h_ */