xbuf_descriptor.h 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. /******************************************************************************
  2. *
  3. * Author: Xilinx, Inc.
  4. *
  5. *
  6. * This program is free software; you can redistribute it and/or modify it
  7. * under the terms of the GNU General Public License as published by the
  8. * Free Software Foundation; either version 2 of the License, or (at your
  9. * option) any later version.
  10. *
  11. *
  12. * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
  13. * COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
  14. * ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR STANDARD,
  15. * XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION IS FREE
  16. * FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE FOR OBTAINING
  17. * ANY THIRD PARTY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
  18. * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
  19. * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY
  20. * WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM
  21. * CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND
  22. * FITNESS FOR A PARTICULAR PURPOSE.
  23. *
  24. *
  25. * Xilinx hardware products are not intended for use in life support
  26. * appliances, devices, or systems. Use in such applications is
  27. * expressly prohibited.
  28. *
  29. *
  30. * (c) Copyright 2002-2004 Xilinx Inc.
  31. * All rights reserved.
  32. *
  33. *
  34. * You should have received a copy of the GNU General Public License along
  35. * with this program; if not, write to the Free Software Foundation, Inc.,
  36. * 675 Mass Ave, Cambridge, MA 02139, USA.
  37. *
  38. * FILENAME:
  39. *
  40. * xbuf_descriptor.h
  41. *
  42. * DESCRIPTION:
  43. *
  44. * This file contains the interface for the XBufDescriptor component.
  45. * The XBufDescriptor component is a passive component that only maps over
  46. * a buffer descriptor data structure shared by the scatter gather DMA hardware
  47. * and software. The component's primary purpose is to provide encapsulation of
  48. * the buffer descriptor processing. See the source file xbuf_descriptor.c for
  49. * details.
  50. *
  51. * NOTES:
  52. *
  53. * Most of the functions of this component are implemented as macros in order
  54. * to optimize the processing. The names are not all uppercase such that they
  55. * can be switched between macros and functions easily.
  56. *
  57. ******************************************************************************/
  58. #ifndef XBUF_DESCRIPTOR_H /* prevent circular inclusions */
  59. #define XBUF_DESCRIPTOR_H /* by using protection macros */
  60. /***************************** Include Files *********************************/
  61. #include "xbasic_types.h"
  62. #include "xdma_channel_i.h"
  63. /************************** Constant Definitions *****************************/
  64. /* The following constants allow access to all fields of a buffer descriptor
  65. * and are necessary at this level of visibility to allow macros to access
  66. * and modify the fields of a buffer descriptor. It is not expected that the
  67. * user of a buffer descriptor would need to use these constants.
  68. */
  69. #define XBD_DEVICE_STATUS_OFFSET 0
  70. #define XBD_CONTROL_OFFSET 1
  71. #define XBD_SOURCE_OFFSET 2
  72. #define XBD_DESTINATION_OFFSET 3
  73. #define XBD_LENGTH_OFFSET 4
  74. #define XBD_STATUS_OFFSET 5
  75. #define XBD_NEXT_PTR_OFFSET 6
  76. #define XBD_ID_OFFSET 7
  77. #define XBD_FLAGS_OFFSET 8
  78. #define XBD_RQSTED_LENGTH_OFFSET 9
  79. #define XBD_SIZE_IN_WORDS 10
  80. /*
  81. * The following constants define the bits of the flags field of a buffer
  82. * descriptor
  83. */
  84. #define XBD_FLAGS_LOCKED_MASK 1UL
  85. /**************************** Type Definitions *******************************/
  86. typedef u32 XBufDescriptor[XBD_SIZE_IN_WORDS];
  87. /***************** Macros (Inline Functions) Definitions *********************/
  88. /* each of the following macros are named the same as functions rather than all
  89. * upper case in order to allow either the macros or the functions to be
  90. * used, see the source file xbuf_descriptor.c for documentation
  91. */
  92. #define XBufDescriptor_Initialize(InstancePtr) \
  93. { \
  94. (*((u32 *)InstancePtr + XBD_CONTROL_OFFSET) = 0); \
  95. (*((u32 *)InstancePtr + XBD_SOURCE_OFFSET) = 0); \
  96. (*((u32 *)InstancePtr + XBD_DESTINATION_OFFSET) = 0); \
  97. (*((u32 *)InstancePtr + XBD_LENGTH_OFFSET) = 0); \
  98. (*((u32 *)InstancePtr + XBD_STATUS_OFFSET) = 0); \
  99. (*((u32 *)InstancePtr + XBD_DEVICE_STATUS_OFFSET) = 0); \
  100. (*((u32 *)InstancePtr + XBD_NEXT_PTR_OFFSET) = 0); \
  101. (*((u32 *)InstancePtr + XBD_ID_OFFSET) = 0); \
  102. (*((u32 *)InstancePtr + XBD_FLAGS_OFFSET) = 0); \
  103. (*((u32 *)InstancePtr + XBD_RQSTED_LENGTH_OFFSET) = 0); \
  104. }
  105. #define XBufDescriptor_GetControl(InstancePtr) \
  106. (u32)(*((u32 *)InstancePtr + XBD_CONTROL_OFFSET))
  107. #define XBufDescriptor_SetControl(InstancePtr, Control) \
  108. (*((u32 *)InstancePtr + XBD_CONTROL_OFFSET) = (u32)Control)
  109. #define XBufDescriptor_IsLastControl(InstancePtr) \
  110. (u32)(*((u32 *)InstancePtr + XBD_CONTROL_OFFSET) & \
  111. XDC_CONTROL_LAST_BD_MASK)
  112. #define XBufDescriptor_SetLast(InstancePtr) \
  113. (*((u32 *)InstancePtr + XBD_CONTROL_OFFSET) |= XDC_CONTROL_LAST_BD_MASK)
  114. #define XBufDescriptor_GetSrcAddress(InstancePtr) \
  115. ((u32 *)(*((u32 *)InstancePtr + XBD_SOURCE_OFFSET)))
  116. #define XBufDescriptor_SetSrcAddress(InstancePtr, Source) \
  117. (*((u32 *)InstancePtr + XBD_SOURCE_OFFSET) = (u32)Source)
  118. #define XBufDescriptor_GetDestAddress(InstancePtr) \
  119. ((u32 *)(*((u32 *)InstancePtr + XBD_DESTINATION_OFFSET)))
  120. #define XBufDescriptor_SetDestAddress(InstancePtr, Destination) \
  121. (*((u32 *)InstancePtr + XBD_DESTINATION_OFFSET) = (u32)Destination)
  122. #define XBufDescriptor_GetLength(InstancePtr) \
  123. (u32)(*((u32 *)InstancePtr + XBD_RQSTED_LENGTH_OFFSET) - \
  124. *((u32 *)InstancePtr + XBD_LENGTH_OFFSET))
  125. #define XBufDescriptor_SetLength(InstancePtr, Length) \
  126. { \
  127. (*((u32 *)InstancePtr + XBD_LENGTH_OFFSET) = (u32)(Length)); \
  128. (*((u32 *)InstancePtr + XBD_RQSTED_LENGTH_OFFSET) = (u32)(Length));\
  129. }
  130. #define XBufDescriptor_GetStatus(InstancePtr) \
  131. (u32)(*((u32 *)InstancePtr + XBD_STATUS_OFFSET))
  132. #define XBufDescriptor_SetStatus(InstancePtr, Status) \
  133. (*((u32 *)InstancePtr + XBD_STATUS_OFFSET) = (u32)Status)
  134. #define XBufDescriptor_IsLastStatus(InstancePtr) \
  135. (u32)(*((u32 *)InstancePtr + XBD_STATUS_OFFSET) & \
  136. XDC_STATUS_LAST_BD_MASK)
  137. #define XBufDescriptor_GetDeviceStatus(InstancePtr) \
  138. ((u32)(*((u32 *)InstancePtr + XBD_DEVICE_STATUS_OFFSET)))
  139. #define XBufDescriptor_SetDeviceStatus(InstancePtr, Status) \
  140. (*((u32 *)InstancePtr + XBD_DEVICE_STATUS_OFFSET) = (u32)Status)
  141. #define XBufDescriptor_GetNextPtr(InstancePtr) \
  142. (XBufDescriptor *)(*((u32 *)InstancePtr + XBD_NEXT_PTR_OFFSET))
  143. #define XBufDescriptor_SetNextPtr(InstancePtr, NextPtr) \
  144. (*((u32 *)InstancePtr + XBD_NEXT_PTR_OFFSET) = (u32)NextPtr)
  145. #define XBufDescriptor_GetId(InstancePtr) \
  146. (u32)(*((u32 *)InstancePtr + XBD_ID_OFFSET))
  147. #define XBufDescriptor_SetId(InstancePtr, Id) \
  148. (*((u32 *)InstancePtr + XBD_ID_OFFSET) = (u32)Id)
  149. #define XBufDescriptor_GetFlags(InstancePtr) \
  150. (u32)(*((u32 *)InstancePtr + XBD_FLAGS_OFFSET))
  151. #define XBufDescriptor_SetFlags(InstancePtr, Flags) \
  152. (*((u32 *)InstancePtr + XBD_FLAGS_OFFSET) = (u32)Flags)
  153. #define XBufDescriptor_Lock(InstancePtr) \
  154. (*((u32 *)InstancePtr + XBD_FLAGS_OFFSET) |= XBD_FLAGS_LOCKED_MASK)
  155. #define XBufDescriptor_Unlock(InstancePtr) \
  156. (*((u32 *)InstancePtr + XBD_FLAGS_OFFSET) &= ~XBD_FLAGS_LOCKED_MASK)
  157. #define XBufDescriptor_IsLocked(InstancePtr) \
  158. (*((u32 *)InstancePtr + XBD_FLAGS_OFFSET) & XBD_FLAGS_LOCKED_MASK)
  159. /************************** Function Prototypes ******************************/
  160. /* The following prototypes are provided to allow each of the functions to
  161. * be implemented as a function rather than a macro, and to provide the
  162. * syntax to allow users to understand how to call the macros, they are
  163. * commented out to prevent linker errors
  164. *
  165. u32 XBufDescriptor_Initialize(XBufDescriptor* InstancePtr);
  166. u32 XBufDescriptor_GetControl(XBufDescriptor* InstancePtr);
  167. void XBufDescriptor_SetControl(XBufDescriptor* InstancePtr, u32 Control);
  168. u32 XBufDescriptor_IsLastControl(XBufDescriptor* InstancePtr);
  169. void XBufDescriptor_SetLast(XBufDescriptor* InstancePtr);
  170. u32 XBufDescriptor_GetLength(XBufDescriptor* InstancePtr);
  171. void XBufDescriptor_SetLength(XBufDescriptor* InstancePtr, u32 Length);
  172. u32 XBufDescriptor_GetStatus(XBufDescriptor* InstancePtr);
  173. void XBufDescriptor_SetStatus(XBufDescriptor* InstancePtr, u32 Status);
  174. u32 XBufDescriptor_IsLastStatus(XBufDescriptor* InstancePtr);
  175. u32 XBufDescriptor_GetDeviceStatus(XBufDescriptor* InstancePtr);
  176. void XBufDescriptor_SetDeviceStatus(XBufDescriptor* InstancePtr,
  177. u32 Status);
  178. u32 XBufDescriptor_GetSrcAddress(XBufDescriptor* InstancePtr);
  179. void XBufDescriptor_SetSrcAddress(XBufDescriptor* InstancePtr,
  180. u32 SourceAddress);
  181. u32 XBufDescriptor_GetDestAddress(XBufDescriptor* InstancePtr);
  182. void XBufDescriptor_SetDestAddress(XBufDescriptor* InstancePtr,
  183. u32 DestinationAddress);
  184. XBufDescriptor* XBufDescriptor_GetNextPtr(XBufDescriptor* InstancePtr);
  185. void XBufDescriptor_SetNextPtr(XBufDescriptor* InstancePtr,
  186. XBufDescriptor* NextPtr);
  187. u32 XBufDescriptor_GetId(XBufDescriptor* InstancePtr);
  188. void XBufDescriptor_SetId(XBufDescriptor* InstancePtr, u32 Id);
  189. u32 XBufDescriptor_GetFlags(XBufDescriptor* InstancePtr);
  190. void XBufDescriptor_SetFlags(XBufDescriptor* InstancePtr, u32 Flags);
  191. void XBufDescriptor_Lock(XBufDescriptor* InstancePtr);
  192. void XBufDescriptor_Unlock(XBufDescriptor* InstancePtr);
  193. u32 XBufDescriptor_IsLocked(XBufDescriptor* InstancePtr);
  194. void XBufDescriptor_Copy(XBufDescriptor* InstancePtr,
  195. XBufDescriptor* DestinationPtr);
  196. */
  197. #endif /* end of protection macro */