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

477 lines
13 KiB
C

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