original files of m241
This commit is contained in:
@@ -0,0 +1,476 @@
|
||||
/* vxbDmaBufLib.h - buffer and DMA system for VxBus drivers */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2005-2010, 2012 Wind River Systems, Inc.
|
||||
*
|
||||
* The right to copy, distribute, modify or otherwise make use
|
||||
* of this software may be licensed only pursuant to the terms
|
||||
* of an applicable Wind River license agreement.
|
||||
*/
|
||||
|
||||
/*
|
||||
modification history
|
||||
--------------------
|
||||
01t,11jun12,sye Removed duplicate method declaration. (WIND00353762)
|
||||
01s,29apr10,pad Moved extern C statement after include statements.
|
||||
01r,26feb10,h_k added mapSyncPartFunc member in vxbDmaBufMap structure.
|
||||
added vxbDmaBufFragFill().
|
||||
added VXB_DMABUF_CACHESNOOP_BUS and
|
||||
VXB_DMABUF_MEMALLOC_CLEAR_BUF.
|
||||
01q,10feb10,h_k added pBounceSaved in vxbDmaBufMap.
|
||||
added new options related to bounce buffer.
|
||||
added new options for vxbDmaBufSync() to correct the pre-
|
||||
post- DMA sync operations.
|
||||
added vxbDmaBufMapSync().
|
||||
01p,04jan10,h_k replaced FUNCPTR with fully qualified function pointer
|
||||
parameters for mapXxx funcs.
|
||||
01o,21sep09,h_k added VXB_SPACE_MAXADDR macros.
|
||||
01n,01sep09,h_k added fragVirt to vxbDmaBufFrag.
|
||||
changed the type of frag to UINT64.
|
||||
01m,25mar09,h_k added prototype for vxbDmaBufInit().
|
||||
01l,30may08,dlk Access headers under wrn/coreip directly.
|
||||
01k,27mar08,dlk Add mapLoadIpcomFunc member to vxbDmaBufMap, and
|
||||
vxbDmaBufMapIpcomLoad() prototype.
|
||||
01j,31oct07,wap Cache pointer to parent bus controller in DMA map
|
||||
(WIND00104927)
|
||||
01i,21feb07,mil Fixed missing include file vxBus.h.
|
||||
01h,30jan07,wap Use method declaration macros
|
||||
01g,19jul06,wap Refine bounce buffer support
|
||||
01f,18jul06,wap Add some includes to fix project build
|
||||
01e,14jul06,wap Add bounce buffer memory pointer to DMA map structure, move
|
||||
DMA tag structure definition here from vxbDmaBufLib.c
|
||||
01d,29jun06,wap Add support for address translation
|
||||
01c,25may06,wap Add fragment count to map structure
|
||||
01b,30jan06,pdg Updated review comments
|
||||
01a,02Dec05,tor created from FreeBSD DMA system
|
||||
*/
|
||||
|
||||
/*
|
||||
DESCRIPTION
|
||||
|
||||
This file defines the macros, structures and interfaces which can be used
|
||||
by the device drivers to support DMA operations.
|
||||
*/
|
||||
|
||||
#ifndef __INCvxbDmaBufBufLibh
|
||||
#define __INCvxbDmaBufBufLibh
|
||||
|
||||
/* includes */
|
||||
#include <vxBusLib.h>
|
||||
#include <cacheLib.h>
|
||||
#include <hwif/vxbus/vxBus.h>
|
||||
|
||||
#include <net/uio.h>
|
||||
#include <netBufLib.h>
|
||||
#include <net/mbuf.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* defines */
|
||||
|
||||
/* vxbDmaBufTagCreate flags */
|
||||
|
||||
#define VXB_DMABUF_ALLOCNOW 0x00000001 /* (currently no effect) */
|
||||
#define VXB_DMABUF_NOCACHE 0x00000002 /* uncacheable buffer */
|
||||
#define VXB_DMABUF_CACHESNOOP_BUS 0x00000004 /* cache-snoop mode bus
|
||||
* This flag is set by
|
||||
* bus controller driver.
|
||||
*/
|
||||
|
||||
/* vxbDmaBufTagCreate flags for VxBus 5.0.0 or later driver */
|
||||
|
||||
#define VXB_DMABUF_CACHEALIGNCHECK 0x00000010 /* create a bounce buffer
|
||||
* to be used in
|
||||
* cache-unaligned case
|
||||
*/
|
||||
|
||||
/* vxbDmaBufMapCreate flags for VxBus 5.0.0 or later driver */
|
||||
|
||||
#define VXB_DMABUF_MAPCREATE_NOBOUNCE_BUF \
|
||||
0x00000100 /* (internal use by
|
||||
* vxbDmaBufMemAlloc)
|
||||
*/
|
||||
|
||||
/*
|
||||
* vxbDmaBufMapLoad, vxbDmaBufMapMblkLoad, vxbDmaBufMapIoVecLoad flags
|
||||
* for VxBus 5.0.0 or later driver
|
||||
*/
|
||||
|
||||
#define VXB_DMABUF_MAPLOAD_CACHEALIGNCHECK \
|
||||
0x00001000 /* enable bounce buffering
|
||||
* in cache-unaligned case
|
||||
*/
|
||||
|
||||
/* vxbDmaBufMemAlloc flags */
|
||||
|
||||
#define VXB_DMABUF_MEMALLOC_CLEAR_BUF 0x00010000 /* zero clear allocated
|
||||
* buffer
|
||||
*/
|
||||
|
||||
/* vxbDmaBufSync and vxbDmaBufMapSync options */
|
||||
|
||||
#define _VXB_DMABUFSYNC_DMA_PREREAD 0x00000001
|
||||
#define _VXB_DMABUFSYNC_DMA_POSTREAD 0x00000002
|
||||
#define _VXB_DMABUFSYNC_DMA_PREWRITE 0x00000004
|
||||
#define _VXB_DMABUFSYNC_DMA_POSTWRITE 0x00000008
|
||||
|
||||
/*
|
||||
* vxbDmaBufSync options for backward compatibility
|
||||
*
|
||||
* The names of the PRE and POST were not correctly defined nor used.
|
||||
* New macros above (_VXB_DMABUFSYNC_DMA_XXX) are introduced in VxWorks 6.9
|
||||
* as their replacements.
|
||||
* Please use the new options for further development.
|
||||
*/
|
||||
|
||||
#define VXB_DMABUFSYNC_PREREAD (_VXB_DMABUFSYNC_DMA_PREREAD | \
|
||||
_VXB_DMABUFSYNC_DMA_POSTREAD)
|
||||
#define VXB_DMABUFSYNC_POSTWRITE _VXB_DMABUFSYNC_DMA_PREWRITE
|
||||
|
||||
/* not supported */
|
||||
#define VXB_DMABUFSYNC_POSTREAD 0x00010000 /* (no effect) */
|
||||
#define VXB_DMABUFSYNC_PREWRITE 0x00080000 /* (no effect) */
|
||||
|
||||
#define VXB_SPACE_MAXADDR_24BIT 0xFFFFFF
|
||||
#define VXB_SPACE_MAXADDR_32BIT 0xFFFFFFFF
|
||||
#define VXB_SPACE_MAXADDR_64BIT 0xFFFFFFFFFFFFFFFFULL
|
||||
|
||||
#define VXB_SPACE_MAXSIZE_24BIT VXB_SPACE_MAXADDR_24BIT
|
||||
#define VXB_SPACE_MAXSIZE_32BIT VXB_SPACE_MAXADDR_32BIT
|
||||
#define VXB_SPACE_MAXSIZE_64BIT VXB_SPACE_MAXADDR_64BIT
|
||||
|
||||
#define VXB_SPACE_UNRESTRICTED (~0)
|
||||
#define VXB_SPACE_MAXSIZE VXB_SPACE_UNRESTRICTED
|
||||
|
||||
#ifdef _WRS_CONFIG_LP64
|
||||
#define VXB_SPACE_MAXADDR VXB_SPACE_MAXADDR_64BIT
|
||||
#else
|
||||
#define VXB_SPACE_MAXADDR VXB_SPACE_MAXADDR_32BIT
|
||||
#endif /* _WRS_CONFIG_LP64 */
|
||||
|
||||
#define VXB_DMA_VIRT_TO_PHYS(adrs) \
|
||||
(bus_addr_t) ((ULONG)CACHE_DRV_VIRT_TO_PHYS(&cacheDmaFuncs, adrs))
|
||||
|
||||
/* typedefs */
|
||||
|
||||
typedef unsigned long bus_size_t;
|
||||
typedef UINT64 bus_addr_t;
|
||||
typedef unsigned long bus_dmasync_op_t;
|
||||
typedef void (bus_dma_filter_t)();
|
||||
typedef void (bus_dma_lock_t)();
|
||||
|
||||
typedef struct vxbDmaBufTag
|
||||
{
|
||||
struct vxbDmaBufTag * pNext; /* pointer to next tag */
|
||||
VXB_DEVICE_ID pInst; /* instance id */
|
||||
struct vxbDmaBufTag * parent; /* parent tag */
|
||||
BOOL vxbTagValid; /* tag validity flag */
|
||||
bus_size_t alignment; /* alignment for segments */
|
||||
bus_size_t boundary; /* boundary for segments */
|
||||
bus_addr_t lowAddr; /* low restricted address */
|
||||
bus_addr_t highAddr; /* high restricted address */
|
||||
bus_dma_filter_t * filter; /* optional filter function */
|
||||
void * filterArg; /* filter function argument */
|
||||
bus_size_t maxSize; /* maximum mapping size */
|
||||
u_int nSegments; /* number of segments */
|
||||
bus_size_t maxSegSz; /* maximum segment size */
|
||||
int flags; /* flags */
|
||||
int refCount; /* reference count */
|
||||
int mapCount; /* map count */
|
||||
bus_dma_lock_t * lockFunc; /* lock Function */
|
||||
void * lockFuncArg; /* lock function argument */
|
||||
} VXB_DMA_TAG;
|
||||
|
||||
typedef VXB_DMA_TAG * VXB_DMA_TAG_ID;
|
||||
|
||||
typedef struct vxbDmaBufFrag VXB_DMA_FRAG;
|
||||
|
||||
struct vxbDmaBufFrag
|
||||
{
|
||||
bus_addr_t frag; /* fragment pointer physical address */
|
||||
void * fragVirt; /* fragment pointer virtual address */
|
||||
bus_size_t fragLen; /* fragment length */
|
||||
};
|
||||
|
||||
typedef struct vxbDmaBufMap VXB_DMA_MAP;
|
||||
typedef struct vxbDmaBufMap * VXB_DMA_MAP_ID;
|
||||
|
||||
struct Ipcom_pkt_struct;
|
||||
|
||||
struct vxbDmaBufMap
|
||||
{
|
||||
VXB_DMA_TAG_ID dmaTagID;
|
||||
VXB_DEVICE_ID pParent; /* Parent device */
|
||||
VXB_DEVICE_ID pDev; /* map owner */
|
||||
STATUS (*mapLoadFunc)(VXB_DEVICE_ID,
|
||||
VXB_DMA_TAG_ID,
|
||||
VXB_DMA_MAP_ID,
|
||||
void *,
|
||||
bus_size_t,
|
||||
int); /* parent bus load func */
|
||||
STATUS (*mapLoadMblkFunc)(VXB_DEVICE_ID,
|
||||
VXB_DMA_TAG_ID,
|
||||
VXB_DMA_MAP_ID,
|
||||
M_BLK_ID,
|
||||
int); /* parent bus mBlk load */
|
||||
STATUS (*mapLoadIoVecFunc)(VXB_DEVICE_ID,
|
||||
VXB_DMA_TAG_ID,
|
||||
VXB_DMA_MAP_ID,
|
||||
struct uio *,
|
||||
int); /* parent bus iovec load func */
|
||||
STATUS (*mapLoadIpcomFunc)(VXB_DEVICE_ID,
|
||||
VXB_DMA_TAG_ID,
|
||||
VXB_DMA_MAP_ID,
|
||||
struct Ipcom_pkt_struct *,
|
||||
int); /* parent bus Ipcom_pkt load */
|
||||
STATUS (*mapUnloadFunc)(VXB_DEVICE_ID,
|
||||
VXB_DMA_TAG_ID,
|
||||
VXB_DMA_MAP_ID);
|
||||
/* parent bus unload func */
|
||||
STATUS (*mapSyncFunc)(VXB_DEVICE_ID,
|
||||
VXB_DMA_TAG_ID,
|
||||
VXB_DMA_MAP_ID,
|
||||
bus_dmasync_op_t);
|
||||
STATUS (*mapSyncPartFunc)(VXB_DEVICE_ID,
|
||||
VXB_DMA_TAG_ID,
|
||||
VXB_DMA_MAP_ID,
|
||||
off_t,
|
||||
size_t,
|
||||
bus_dmasync_op_t);
|
||||
/* parent bus sync func */
|
||||
void *pMem; /* for alignment fixups */
|
||||
void *pMemBounce; /* for bounce buffering */
|
||||
void *pBounceSaved; /* for alignment fixups */
|
||||
int nFrags; /* number of valid frags */
|
||||
VXB_DMA_FRAG fragList[1]; /* list of buffer fragments */
|
||||
};
|
||||
|
||||
/* globals */
|
||||
|
||||
/* function pointers available to be filled in by BSP */
|
||||
|
||||
IMPORT void * (*vxbDmaBufBspAlloc)
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
size_t size
|
||||
);
|
||||
IMPORT STATUS (*vxbDmaBufBspFree)
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
void * vaddr
|
||||
);
|
||||
|
||||
/* function pointers available to be filled in by arch code */
|
||||
|
||||
IMPORT STATUS (*vxbDmaBufArchInvalidate)
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map,
|
||||
int index,
|
||||
off_t offset,
|
||||
size_t length
|
||||
);
|
||||
IMPORT STATUS (*vxbDmaBufArchFlush)
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map,
|
||||
int index,
|
||||
off_t offset,
|
||||
size_t length
|
||||
);
|
||||
IMPORT STATUS (*vxbDmaBufMapArchInvalidate)
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map
|
||||
);
|
||||
IMPORT STATUS (*vxbDmaBufMapArchFlush)
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map
|
||||
);
|
||||
|
||||
/* locals */
|
||||
|
||||
/* forward declarations */
|
||||
|
||||
IMPORT void vxbDmaBufInit();
|
||||
|
||||
IMPORT VXB_DMA_TAG_ID vxbDmaBufTagParentGet
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
UINT32 pRegBaseIndex
|
||||
);
|
||||
|
||||
IMPORT VXB_DMA_TAG_ID vxbDmaBufTagCreate
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID parent,
|
||||
bus_size_t alignment,
|
||||
bus_size_t boundary,
|
||||
bus_addr_t lowAddr,
|
||||
bus_addr_t highAddr,
|
||||
bus_dma_filter_t * filter,
|
||||
void * filterArg,
|
||||
bus_size_t maxSize,
|
||||
int nSegments,
|
||||
bus_size_t maxSegSz,
|
||||
int flags,
|
||||
bus_dma_lock_t * lockFunc,
|
||||
void * lockFuncArg,
|
||||
VXB_DMA_TAG_ID * ppDmaTag
|
||||
);
|
||||
|
||||
IMPORT STATUS vxbDmaBufTagDestroy
|
||||
(
|
||||
VXB_DMA_TAG_ID dmaTagID
|
||||
);
|
||||
|
||||
IMPORT VXB_DMA_MAP_ID vxbDmaBufMapCreate
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
int flags,
|
||||
VXB_DMA_MAP_ID * pMap
|
||||
);
|
||||
|
||||
IMPORT STATUS vxbDmaBufMapDestroy
|
||||
(
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map
|
||||
);
|
||||
|
||||
IMPORT void * vxbDmaBufMemAlloc
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
void ** vaddr,
|
||||
int flags,
|
||||
VXB_DMA_MAP_ID * pMap
|
||||
);
|
||||
|
||||
IMPORT STATUS vxbDmaBufMemFree
|
||||
(
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
void * vaddr,
|
||||
VXB_DMA_MAP_ID map
|
||||
);
|
||||
|
||||
IMPORT STATUS vxbDmaBufMapLoad
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map,
|
||||
void * buf,
|
||||
bus_size_t bufLen,
|
||||
int flags
|
||||
);
|
||||
|
||||
IMPORT STATUS vxbDmaBufMapMblkLoad
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map,
|
||||
M_BLK_ID pMblk,
|
||||
int flags
|
||||
);
|
||||
|
||||
IMPORT STATUS vxbDmaBufMapIoVecLoad
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map,
|
||||
struct uio * uio,
|
||||
int flags
|
||||
);
|
||||
|
||||
IMPORT STATUS vxbDmaBufMapIpcomLoad
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map,
|
||||
struct Ipcom_pkt_struct * pkt,
|
||||
int flags
|
||||
);
|
||||
|
||||
IMPORT STATUS vxbDmaBufMapUnload
|
||||
(
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map
|
||||
);
|
||||
|
||||
IMPORT STATUS vxbDmaBufMapFlush
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map
|
||||
);
|
||||
|
||||
IMPORT STATUS vxbDmaBufMapInvalidate
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map
|
||||
);
|
||||
|
||||
IMPORT STATUS vxbDmaBufFlush
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map,
|
||||
int index,
|
||||
off_t offset,
|
||||
size_t length
|
||||
);
|
||||
|
||||
IMPORT STATUS vxbDmaBufInvalidate
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map,
|
||||
int index,
|
||||
off_t offset,
|
||||
size_t length
|
||||
);
|
||||
|
||||
IMPORT STATUS vxbDmaBufSync
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map,
|
||||
bus_dmasync_op_t op
|
||||
);
|
||||
|
||||
IMPORT STATUS vxbDmaBufMapSync
|
||||
(
|
||||
VXB_DEVICE_ID pInst,
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map,
|
||||
off_t offset,
|
||||
size_t length,
|
||||
bus_dmasync_op_t op
|
||||
);
|
||||
|
||||
IMPORT STATUS vxbDmaBufFragFill
|
||||
(
|
||||
VXB_DMA_TAG_ID dmaTagID,
|
||||
VXB_DMA_MAP_ID map,
|
||||
void * buf,
|
||||
bus_size_t bufLen,
|
||||
int flags,
|
||||
int * pNSegs,
|
||||
void ** ppBounceBufCur
|
||||
);
|
||||
|
||||
IMPORT void vxbDmaBufInit (void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __INCvxbDmaBufBufLibh */
|
||||
Reference in New Issue
Block a user