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* xdma_channel.h 41* 42* DESCRIPTION: 43* 44* This file contains the DMA channel component implementation. This component 45* supports a distributed DMA design in which each device can have it's own 46* dedicated DMA channel, as opposed to a centralized DMA design. 47* A device which uses DMA typically contains two DMA channels, one for 48* sending data and the other for receiving data. 49* 50* This component is designed to be used as a basic building block for 51* designing a device driver. It provides registers accesses such that all 52* DMA processing can be maintained easier, but the device driver designer 53* must still understand all the details of the DMA channel. 54* 55* The DMA channel allows a CPU to minimize the CPU interaction required to move 56* data between a memory and a device. The CPU requests the DMA channel to 57* perform a DMA operation and typically continues performing other processing 58* until the DMA operation completes. DMA could be considered a primitive form 59* of multiprocessing such that caching and address translation can be an issue. 60* 61* Scatter Gather Operations 62* 63* The DMA channel may support scatter gather operations. A scatter gather 64* operation automates the DMA channel such that multiple buffers can be 65* sent or received with minimal software interaction with the hardware. Buffer 66* descriptors, contained in the XBufDescriptor component, are used by the 67* scatter gather operations of the DMA channel to describe the buffers to be 68* processed. 69* 70* Scatter Gather List Operations 71* 72* A scatter gather list may be supported by each DMA channel. The scatter 73* gather list allows buffer descriptors to be put into the list by a device 74* driver which requires scatter gather. The hardware processes the buffer 75* descriptors which are contained in the list and modifies the buffer 76* descriptors to reflect the status of the DMA operations. The device driver 77* is notified by interrupt that specific DMA events occur including scatter 78* gather events. The device driver removes the completed buffer descriptors 79* from the scatter gather list to evaluate the status of each DMA operation. 80* 81* The scatter gather list is created and buffer descriptors are inserted into 82* the list. Buffer descriptors are never removed from the list after it's 83* creation such that a put operation copies from a temporary buffer descriptor 84* to a buffer descriptor in the list. Get operations don't copy from the list 85* to a temporary, but return a pointer to the buffer descriptor in the list. 86* A buffer descriptor in the list may be locked to prevent it from being 87* overwritten by a put operation. This allows the device driver to get a 88* descriptor from a scatter gather list and prevent it from being overwritten 89* until the buffer associated with the buffer descriptor has been processed. 90* 91* Typical Scatter Gather Processing 92* 93* The following steps illustrate the typical processing to use the 94* scatter gather features of a DMA channel. 95* 96* 1. Create a scatter gather list for the DMA channel which puts empty buffer 97* descriptors into the list. 98* 2. Create buffer descriptors which describe the buffers to be filled with 99* receive data or the buffers which contain data to be sent. 100* 3. Put buffer descriptors into the DMA channel scatter list such that scatter 101* gather operations are requested. 102* 4. Commit the buffer descriptors in the list such that they are ready to be 103* used by the DMA channel hardware. 104* 5. Start the scatter gather operations of the DMA channel. 105* 6. Process any interrupts which occur as a result of the scatter gather 106* operations or poll the DMA channel to determine the status. 107* 108* Interrupts 109* 110* Each DMA channel has the ability to generate an interrupt. This component 111* does not perform processing for the interrupt as this processing is typically 112* tightly coupled with the device which is using the DMA channel. It is the 113* responsibility of the caller of DMA functions to manage the interrupt 114* including connecting to the interrupt and enabling/disabling the interrupt. 115* 116* Critical Sections 117* 118* It is the responsibility of the device driver designer to use critical 119* sections as necessary when calling functions of the DMA channel. This 120* component does not use critical sections and it does access registers using 121* read-modify-write operations. Calls to DMA functions from a main thread 122* and from an interrupt context could produce unpredictable behavior such that 123* the caller must provide the appropriate critical sections. 124* 125* Address Translation 126* 127* All addresses of data structures which are passed to DMA functions must 128* be physical (real) addresses as opposed to logical (virtual) addresses. 129* 130* Caching 131* 132* The memory which is passed to the function which creates the scatter gather 133* list must not be cached such that buffer descriptors are non-cached. This 134* is necessary because the buffer descriptors are kept in a ring buffer and 135* not directly accessible to the caller of DMA functions. 136* 137* The caller of DMA functions is responsible for ensuring that any data 138* buffers which are passed to the DMA channel are cache-line aligned if 139* necessary. 140* 141* The caller of DMA functions is responsible for ensuring that any data 142* buffers which are passed to the DMA channel have been flushed from the cache. 143* 144* The caller of DMA functions is responsible for ensuring that the cache is 145* invalidated prior to using any data buffers which are the result of a DMA 146* operation. 147* 148* Memory Alignment 149* 150* The addresses of data buffers which are passed to DMA functions must be 151* 32 bit word aligned since the DMA hardware performs 32 bit word transfers. 152* 153* Mutual Exclusion 154* 155* The functions of the DMA channel are not thread safe such that the caller 156* of all DMA functions is responsible for ensuring mutual exclusion for a 157* DMA channel. Mutual exclusion across multiple DMA channels is not 158* necessary. 159* 160* NOTES: 161* 162* Many of the provided functions which are register accessors don't provide 163* a lot of error detection. The caller is expected to understand the impact 164* of a function call based upon the current state of the DMA channel. This 165* is done to minimize the overhead in this component. 166* 167******************************************************************************/ 168 169#ifndef XDMA_CHANNEL_H /* prevent circular inclusions */ 170#define XDMA_CHANNEL_H /* by using protection macros */ 171 172/***************************** Include Files *********************************/ 173 174#include "xdma_channel_i.h" /* constants shared with buffer descriptor */ 175#include "xbasic_types.h" 176#include "xstatus.h" 177#include "xversion.h" 178#include "xbuf_descriptor.h" 179 180/************************** Constant Definitions *****************************/ 181 182/* the following constants provide access to the bit fields of the DMA control 183 * register (DMACR) 184 */ 185#define XDC_DMACR_SOURCE_INCR_MASK 0x80000000UL /* increment source address */ 186#define XDC_DMACR_DEST_INCR_MASK 0x40000000UL /* increment dest address */ 187#define XDC_DMACR_SOURCE_LOCAL_MASK 0x20000000UL /* local source address */ 188#define XDC_DMACR_DEST_LOCAL_MASK 0x10000000UL /* local dest address */ 189#define XDC_DMACR_SG_DISABLE_MASK 0x08000000UL /* scatter gather disable */ 190#define XDC_DMACR_GEN_BD_INTR_MASK 0x04000000UL /* descriptor interrupt */ 191#define XDC_DMACR_LAST_BD_MASK XDC_CONTROL_LAST_BD_MASK /* last buffer */ 192 /* descriptor */ 193 194/* the following constants provide access to the bit fields of the DMA status 195 * register (DMASR) 196 */ 197#define XDC_DMASR_BUSY_MASK 0x80000000UL /* channel is busy */ 198#define XDC_DMASR_BUS_ERROR_MASK 0x40000000UL /* bus error occurred */ 199#define XDC_DMASR_BUS_TIMEOUT_MASK 0x20000000UL /* bus timeout occurred */ 200#define XDC_DMASR_LAST_BD_MASK XDC_STATUS_LAST_BD_MASK /* last buffer */ 201 /* descriptor */ 202#define XDC_DMASR_SG_BUSY_MASK 0x08000000UL /* scatter gather is busy */ 203 204/* the following constants provide access to the bit fields of the interrupt 205 * status register (ISR) and the interrupt enable register (IER), bit masks 206 * match for both registers such that they are named IXR 207 */ 208#define XDC_IXR_DMA_DONE_MASK 0x1UL /* dma operation done */ 209#define XDC_IXR_DMA_ERROR_MASK 0x2UL /* dma operation error */ 210#define XDC_IXR_PKT_DONE_MASK 0x4UL /* packet done */ 211#define XDC_IXR_PKT_THRESHOLD_MASK 0x8UL /* packet count threshold */ 212#define XDC_IXR_PKT_WAIT_BOUND_MASK 0x10UL /* packet wait bound reached */ 213#define XDC_IXR_SG_DISABLE_ACK_MASK 0x20UL /* scatter gather disable 214 acknowledge occurred */ 215#define XDC_IXR_SG_END_MASK 0x40UL /* last buffer descriptor 216 disabled scatter gather */ 217#define XDC_IXR_BD_MASK 0x80UL /* buffer descriptor done */ 218 219/**************************** Type Definitions *******************************/ 220 221/* 222 * the following structure contains data which is on a per instance basis 223 * for the XDmaChannel component 224 */ 225typedef struct XDmaChannelTag { 226 XVersion Version; /* version of the driver */ 227 u32 RegBaseAddress; /* base address of registers */ 228 u32 IsReady; /* device is initialized and ready */ 229 230 XBufDescriptor *PutPtr; /* keep track of where to put into list */ 231 XBufDescriptor *GetPtr; /* keep track of where to get from list */ 232 XBufDescriptor *CommitPtr; /* keep track of where to commit in list */ 233 XBufDescriptor *LastPtr; /* keep track of the last put in the list */ 234 u32 TotalDescriptorCount; /* total # of descriptors in the list */ 235 u32 ActiveDescriptorCount; /* # of descriptors pointing to buffers 236 * in the buffer descriptor list */ 237} XDmaChannel; 238 239/***************** Macros (Inline Functions) Definitions *********************/ 240 241/************************** Function Prototypes ******************************/ 242 243XStatus XDmaChannel_Initialize(XDmaChannel * InstancePtr, u32 BaseAddress); 244u32 XDmaChannel_IsReady(XDmaChannel * InstancePtr); 245XVersion *XDmaChannel_GetVersion(XDmaChannel * InstancePtr); 246XStatus XDmaChannel_SelfTest(XDmaChannel * InstancePtr); 247void XDmaChannel_Reset(XDmaChannel * InstancePtr); 248 249/* Control functions */ 250 251u32 XDmaChannel_GetControl(XDmaChannel * InstancePtr); 252void XDmaChannel_SetControl(XDmaChannel * InstancePtr, u32 Control); 253 254/* Status functions */ 255 256u32 XDmaChannel_GetStatus(XDmaChannel * InstancePtr); 257void XDmaChannel_SetIntrStatus(XDmaChannel * InstancePtr, u32 Status); 258u32 XDmaChannel_GetIntrStatus(XDmaChannel * InstancePtr); 259void XDmaChannel_SetIntrEnable(XDmaChannel * InstancePtr, u32 Enable); 260u32 XDmaChannel_GetIntrEnable(XDmaChannel * InstancePtr); 261 262/* DMA without scatter gather functions */ 263 264void XDmaChannel_Transfer(XDmaChannel * InstancePtr, 265 u32 * SourcePtr, u32 * DestinationPtr, u32 ByteCount); 266 267/* Scatter gather functions */ 268 269XStatus XDmaChannel_SgStart(XDmaChannel * InstancePtr); 270XStatus XDmaChannel_SgStop(XDmaChannel * InstancePtr, 271 XBufDescriptor ** BufDescriptorPtr); 272XStatus XDmaChannel_CreateSgList(XDmaChannel * InstancePtr, 273 u32 * MemoryPtr, u32 ByteCount); 274u32 XDmaChannel_IsSgListEmpty(XDmaChannel * InstancePtr); 275 276XStatus XDmaChannel_PutDescriptor(XDmaChannel * InstancePtr, 277 XBufDescriptor * BufDescriptorPtr); 278XStatus XDmaChannel_CommitPuts(XDmaChannel * InstancePtr); 279XStatus XDmaChannel_GetDescriptor(XDmaChannel * InstancePtr, 280 XBufDescriptor ** BufDescriptorPtr); 281 282/* Packet functions for interrupt collescing */ 283 284u32 XDmaChannel_GetPktCount(XDmaChannel * InstancePtr); 285void XDmaChannel_DecrementPktCount(XDmaChannel * InstancePtr); 286XStatus XDmaChannel_SetPktThreshold(XDmaChannel * InstancePtr, u8 Threshold); 287u8 XDmaChannel_GetPktThreshold(XDmaChannel * InstancePtr); 288void XDmaChannel_SetPktWaitBound(XDmaChannel * InstancePtr, u32 WaitBound); 289u32 XDmaChannel_GetPktWaitBound(XDmaChannel * InstancePtr); 290 291#endif /* end of protection macro */ 292