Files
m241Neelima/vxworks-6.9/target/h/hwif/util/vxbDmaLib.h
T
2026-07-30 11:19:44 +05:30

225 lines
6.6 KiB
C

/* 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 <vxBusLib.h>
#include <hwif/vxbus/vxBus.h>
#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 */