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