| /****************************************************************************** |
| * |
| * 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 */ |