/* vxbDmaLib.h - vxBus DMA interfaces header file */ /* * Copyright (c) 2006-2007, 2010, 2018 Wind River Systems, Inc. * * The right to copy, distribute or otherwise make use of this software * may be licensed only pursuant to the terms of an applicable Wind River * license agreement. */ /* modification history -------------------- 01i,26sep18,syt add a new API vxbDmaChanAllocAdvance() (VXW6-86923) 01h,12jan18,lyx modify DMA_CHAN_ALLOCATED diffrent from DMA_CHAINED_BUFFERS 01g,29apr10,pad Moved extern C statement after include statements. 01f,25mar09,h_k updated for LP64 support. 01e,26jul07,h_k added includes for vxBusLib.h & vxBus.h 01d,13jun07,tor remove VIRT_ADDR 01c,06feb07,wap Cleanup 01b,05oct06,pdg updated review comments 01a,22Jun06,pdg written */ /* DESCRIPTION This file defines the macros, structures and interfaces which can be used by the device drivers for performing DMA tramsfers. */ #ifndef __INCvxbDmaLibh #define __INCvxbDmaLibh /* includes */ #include #include #ifdef __cplusplus extern "C" { #endif /* mask values used */ #define DMA_INITIATOR_INDEX_MASK 0x000000FF /* index mask */ #define DMA_COPY_MODE_MASK 0x00000300 /* copy mode mask */ #define DMA_TRANSFER_TYPE_MASK 0x00003000 /* transfer type mask */ /* 'flags' values in dmaChanAlloc () */ #define DMA_COPY_MODE_DEVBUF 0x00000000 #define DMA_COPY_MODE_FIFO 0x00000100 #define DMA_COPY_MODE_NO_SOFT 0x00000200 #define DMA_COPY_MODE_NO_HW 0x00000300 #define DMA_TRANSFER_TYPE_RD 0x00001000 #define DMA_TRANSFER_TYPE_WR 0x00002000 /* flag value used during dedicated DMA channel allocation */ #define DMA_CHAN_ALLOCATED 0x02000000 #define DMA_CHAINED_BUFFERS 0x01000000 /* the dma engine supports */ /* chained buffers */ #define DMA_INDEX_MASK 0x000000FF #define DMA_CRC_MASK 0x0000FF00 /* crc mask value */ #define DMA_CONVERSION_MASK 0x00FF0000 /* features & flags mask */ /* DMA transfer status values */ #define DMA_STATUS_OK 0 #define DMA_STATUS_ERROR 1 #define DMA_STATUS_CANCELLED 2 /* channel status values */ #define DMA_NOT_USED 1 /* DMA channel is not in use */ #define DMA_IDLE 2 /* DMA channel is inactive */ #define DMA_RUNNING 3 /* DMA engine is running */ #define DMA_PAUSED 4 /* DMA is currently paused */ typedef void (* pVXB_DMA_COMPLETE_FN) ( void * pArg, UINT32 actualTransferSize, UINT32 transferStatus ); typedef struct vxbDmaResource VXB_DMA_RESOURCE, * VXB_DMA_RESOURCE_ID; /* * This structure holds the function pointers which can be used by IO * device driver instances to perform read and write operations * through the DMA engine, pause, resume dma operations and retrieve * the status of dma operations. */ struct vxbDmaFuncs { STATUS (*dmaRead) /* read from device */ ( VXB_DMA_RESOURCE_ID dmaChan, char * src, char * dest, int transferSize, int unitSize, UINT32 flags, pVXB_DMA_COMPLETE_FN pDmaComplete, void * pArg ); STATUS (*dmaReadAndWait) /* read from device and wait for completion */ ( VXB_DMA_RESOURCE_ID dmaChan, char * src, char * dest, int * pTransferSize, int unitSize, UINT32 flags ); STATUS (*dmaWrite) /* write to device */ ( VXB_DMA_RESOURCE_ID dmaChan, char * src, char * dest, int transferSize, int unitSize, UINT32 flags, pVXB_DMA_COMPLETE_FN pDmaComplete, void * pArg ); STATUS (*dmaWriteAndWait) /* write to device and wait for completion */ ( VXB_DMA_RESOURCE_ID dmaChan, char * src, char * dest, int * pTransferSize, int unitSize, UINT32 flags ); STATUS (*dmaCancel) /* cancel a dma transfer */ ( VXB_DMA_RESOURCE_ID dmaChan ); STATUS (*dmaPause) /* pause a dma transfer */ ( VXB_DMA_RESOURCE_ID dmaChan ); STATUS (*dmaResume) /* resume a dma transfer */ ( VXB_DMA_RESOURCE_ID dmaChan ); int (*dmaStatus) /* get the status of DMA channel */ ( VXB_DMA_RESOURCE_ID dmaChan ); }; #define vxbDmaRead(a,b,c,d,e,f,g,h) (a)->dmaFuncs.dmaRead(a,b,c,d,e,f,g,h) #define vxbDmaWrite(a,b,c,d,e,f,g,h) (a)->dmaFuncs.dmaWrite(a,b,c,d,e,f,g,h) #define vxbDmaReadAndWait(a,b,c,d,e,f) \ (a)->dmaFuncs.dmaReadAndWait(a,b,c,d,e,f) #define vxbDmaWriteAndWait(a,b,c,d,e,f) \ (a)->dmaFuncs.dmaWriteAndWait(a,b,c,d,e,f) #define vxbDmaCancel(x) (x)->dmaFuncs.dmaCancel(x) #define vxbDmaPause(x) (x)->dmaFuncs.dmaPause(x) #define vxbDmaResume(x) (x)->dmaFuncs.dmaResume(x) #define vxbDmaStatus(x) (x)->dmaFuncs.dmaStatus(x) /* * Pointer to struct vxbDmaResource is returned by dmaChanAlloc (). * This has to be used for communication with the DMA engine. */ struct vxbDmaResource { struct vxbDmaFuncs dmaFuncs;/* structure holding dma function pointers */ void * pDmaChan;/* channel specific data-used by DMA driver */ VXB_DEVICE_ID dmaInst; /* dma engine instance ID */ }; /* * if multiple buffers are used during a transfer, * 'src' should point to a list of the following structures. In the case * of multiple buffers, 'destn' need not be used. */ struct vxbDmaBufferDesc { char * srcAddr; /* source address */ char * destAddr; /* destination address */ int transferSize; /* size of transfer */ UINT32 transferStatus; /* status of dma transfer */ struct vxbDmaBufferDesc * pNextDesc; /* pointer to the next desc */ void * pDmaChanData; /* pointer to the driver data */ }; IMPORT VXB_DMA_RESOURCE_ID vxbDmaChanAlloc (VXB_DEVICE_ID pDev, UINT32 minQueueDepth, UINT32 flags, void * pDedicatedChanInfo); IMPORT VXB_DMA_RESOURCE_ID vxbDmaChanAllocAdvance (VXB_DEVICE_ID pDev, VXB_DEVICE_ID pDmaInst, UINT32 minQueueDepth, UINT32 flags, void * pDedicatedChanInfo); IMPORT void vxbDmaChanFree (VXB_DMA_RESOURCE_ID dmaChan); IMPORT void vxbDmaLibInit (void); /* Backwards compatibility. */ #define dmaChanAlloc vxbDmaChanAlloc #define dmaChanFree vxbDmaChanFree #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __INCvxbDmaLibh */