/* * Copyright 2001-2008 Texas Instruments - http://www.ti.com/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * ======== cmm.h ======== * DSP-BIOS Bridge driver support functions for TI OMAP processors. * Purpose: * The Communication Memory Management(CMM) module provides shared memory * management services for DSP/BIOS Bridge data streaming and messaging. * Multiple shared memory segments can be registered with CMM. Memory is * coelesced back to the appropriate pool when a buffer is freed. * * The CMM_Xlator[xxx] functions are used for node messaging and data * streaming address translation to perform zero-copy inter-processor * data transfer(GPP<->DSP). A "translator" object is created for a node or * stream object that contains per thread virtual address information. This * translator info is used at runtime to perform SM address translation * to/from the DSP address space. * * * Public Functions: * CMM_CallocBuf * CMM_Create * CMM_Destroy * CMM_Exit * CMM_FreeBuf * CMM_GetHandle * CMM_GetInfo * CMM_Init * CMM_RegisterGPPSMSeg * CMM_UnRegisterGPPSMSeg * CMM_XlatorAllocBuf (Note #1 below) * CMM_XlatorCreate " * CMM_XlatorDelete " * CMM_XlatorFreeBuf " * CMM_XlatorTranslate " * * * Notes: * #1: Used by Node and Stream modules for SM address translation. * *! Revision History: *! ================ *! 30-Jan-2002 ag Removed unused CMM_Alloc[Free]Desc & CMM_XlatorRegisterPa. *! Renamed CMM_AllocBuf() to CMM_CallocBuf(). *! 29-Aug-2001 ag: Added dsp virt base and size to CMM_RegisterGPPSMSeg(). *! 12-Aug-2001 ag: Added CMM_UnRegisterGPP[DSP}SMSeg[s](). *! 05-Dec-2000 ag: Added param to CMM_XlatorDelete() to force buf cleanup. *! 30-Oct-2000 ag: Added conversion factor to CMM_RegisterDSP[GPP]SMSeg(). *! 12-Oct-2000 ag: Added CMM_Xlator[xxx] functions. *! 10-Aug-2000 ag: Created. *! */ #ifndef CMM_ #define CMM_ #ifdef __cplusplus extern "C" { #endif #include #include #include /* * ======== CMM_CallocBuf ======== * Purpose: * Allocate memory buffers that can be used for data streaming or * messaging. * Parameters: * hCmmMgr: Cmm Mgr handle. * uSize: Number of bytes to allocate. * pAttr: Attributes of memory to allocate. * ppBufVA: Address of where to place VA. * Returns: * Pointer to a zero'd block of SM memory; * NULL if memory couldn't be allocated, * or if cBytes == 0, * Requires: * Valid hCmmMgr. * CMM initialized. * Ensures: * The returned pointer, if not NULL, points to a valid memory block of * the size requested. * */ extern PVOID CMM_CallocBuf(struct CMM_OBJECT* hCmmMgr, UINT uSize, struct CMM_ATTRS * pAttrs, OUT PVOID * ppBufVA); /* * ======== CMM_Create ======== * Purpose: * Create a communication memory manager object. * Parameters: * phCmmMgr: Location to store a communication manager handle on output. * hDevObject: Handle to a device object. * pMgrAttrs: Comm mem manager attributes. * Returns: * DSP_SOK: Success; * DSP_EMEMORY: Insufficient memory for requested resources. * DSP_EFAIL: Failed to initialize critical sect sync object. * * Requires: * CMM_Init() called. * phCmmMgr != NULL. * pMgrAttrs->ulMinBlockSize >= 4 bytes. * Ensures: * */ extern DSP_STATUS CMM_Create(OUT struct CMM_OBJECT** phCmmMgr, struct DEV_OBJECT* hDevObject, IN CONST struct CMM_MGRATTRS *pMgrAttrs); /* * ======== CMM_Destroy ======== * Purpose: * Destroy the communication memory manager object. * Parameters: * hCmmMgr: Cmm Mgr handle. * bForce: Force deallocation of all cmm memory immediately if set TRUE. * If FALSE, and outstanding allocations will return DSP_EFAIL * status. * Returns: * DSP_SOK: CMM object & resources deleted. * DSP_EFAIL: Unable to free CMM object due to outstanding allocation. * DSP_EHANDLE: Unable to free CMM due to bad handle. * Requires: * CMM is initialized. * hCmmMgr != NULL. * Ensures: * Memory resources used by Cmm Mgr are freed. */ extern DSP_STATUS CMM_Destroy(struct CMM_OBJECT* hCmmMgr, bool bForce); /* * ======== CMM_Exit ======== * Purpose: * Discontinue usage of module. Cleanup CMM module if CMM cRef reaches zero. * Parameters: * n/a * Returns: * n/a * Requires: * CMM is initialized. * Ensures: */ extern VOID CMM_Exit(); /* * ======== CMM_FreeBuf ======== * Purpose: * Free the given buffer. * Parameters: * hCmmMgr: Cmm Mgr handle. * pBuf: Pointer to memory allocated by CMM_CallocBuf(). * ulSegId: SM segment Id used in CMM_Calloc() attrs. * Set to 0 to use default segment. * Returns: * DSP_SOK * DSP_EFAIL * Requires: * CMM initialized. * pBufPA != NULL * Ensures: * */ extern DSP_STATUS CMM_FreeBuf(struct CMM_OBJECT* hCmmMgr, PVOID pBufPA, ULONG ulSegId); /* * ======== CMM_GetHandle ======== * Purpose: * Return the handle to the cmm mgr for the given device obj. * Parameters: * hProcessor: Handle to a Processor. * phCmmMgr: Location to store the shared memory mgr handle on output. * * Returns: * DSP_SOK: Cmm Mgr opaque handle returned. * DSP_EHANDLE: Invalid handle. * Requires: * phCmmMgr != NULL * hDevObject != NULL * Ensures: */ extern DSP_STATUS CMM_GetHandle(DSP_HPROCESSOR hProcessor, OUT struct CMM_OBJECT** phCmmMgr); /* * ======== CMM_GetInfo ======== * Purpose: * Return the current SM and VM utilization information. * Parameters: * hCmmMgr: Handle to a Cmm Mgr. * pCmmInfo: Location to store the Cmm information on output. * * Returns: * DSP_SOK: Success. * DSP_EHANDLE: Invalid handle. * DSP_EINVALIDARG Invalid input argument. * Requires: * Ensures: * */ extern DSP_STATUS CMM_GetInfo(struct CMM_OBJECT* hCmmMgr, OUT struct CMM_INFO * pCmmInfo); /* * ======== CMM_Init ======== * Purpose: * Initializes private state of CMM module. * Parameters: * Returns: * TRUE if initialized; FALSE if error occured. * Requires: * Ensures: * CMM initialized. */ extern bool CMM_Init(); /* * ======== CMM_KernConvert ======== * Purpose: * Convert between Kernel Va & DSP Address. * Used internally by Bridge. * Parameters: * hCmmMgr: Handle to a Cmm Mgr. * pAddr Kernel or DSP address to convert. * pAttrs Attrs contains segment ID.Default if NULL. * xType Conversion type. CMM_KERNVA2DSP or CMM_DSP2KERNVA. * Returns: * NULL on failure. non-null on success. * Requires: * pAddr != NULL, * ulSegId > 0, * xType CMM_KERNVA2DSP | CMM_DSP2KERNVA. * Ensures: * */ extern PVOID CMM_KernConvert(struct CMM_OBJECT* hCmmMgr, PVOID pAddr, struct CMM_ATTRS * pAttrs, CMM_KERNMAPTYPE xType); /* * ======== CMM_RegisterGPPSMSeg ======== * Purpose: * Register a block of SM with the CMM. * Parameters: * hCmmMgr: Handle to a Cmm Mgr. * lpGPPBasePA: GPP Base Physical address. * ulSize: Size in GPP bytes. * dwDSPAddrOffset GPP PA to DSP PA Offset. * cFactor: Add offset if CMM_ADDTODSPPA, sub if CMM_SUBFROMDSPPA. * dwDSPBase: DSP virtual base byte address. * ulDSPSize: Size of DSP segment in bytes. * pulSegId: Address to store segment Id. * * Returns: * DSP_SOK: Success. * DSP_EHANDLE: Invalid hCmmMgr handle. * DSP_EINVALIDARG: Invalid input argument. * DSP_EFAIL: Unable to register. * - On success *pulSegId is a valid SM segment ID. * Requires: * ulSize > 0 * pulSegId != NULL * dwGPPBasePA != 0 * cFactor = CMM_ADDTODSPPA || cFactor = CMM_SUBFROMDSPPA * Ensures: * */ extern DSP_STATUS CMM_RegisterGPPSMSeg(struct CMM_OBJECT* hCmmMgr, DWORD dwGPPBasePA, ULONG ulSize, DWORD dwDSPAddrOffset, CMM_CNVTTYPE cFactor, DWORD dwDSPBase, ULONG ulDSPSize, ULONG * pulSegId, DWORD dwGPPBaseBA); /* * ======== CMM_UnRegisterGPPSMSeg ======== * Purpose: * Unregister the given memory segment that was previously registered * by CMM_RegisterGPPSMSeg. * Parameters: * hCmmMgr: Handle to a Cmm Mgr. * ulSegId Segment identifier returned by CMM_RegisterGPPSMSeg. * Returns: * DSP_SOK: Success. * DSP_EHANDLE: Invalid handle. * DSP_EINVALIDARG: Invalid ulSegId. * DSP_EFAIL: Unable to unregister for unknown reason. * Requires: * Ensures: * */ extern DSP_STATUS CMM_UnRegisterGPPSMSeg(struct CMM_OBJECT* hCmmMgr, ULONG ulSegId); /* * ======== CMM_XlatorAllocBuf ======== * Purpose: * Allocate the specified SM buffer and create a local memory descriptor. * Place on the descriptor on the translator's HaQ (Host Alloc'd Queue). * Parameters: * hXlator: Handle to a Xlator object. * pVaBuf: Virtual address ptr(client context) * uPaSize: Size of SM memory to allocate. * Returns: * Ptr to valid physical address(Pa) of uPaSize bytes, NULL if failed. * Requires: * pVaBuf != 0. * uPaSize != 0. * Ensures: * */ extern PVOID CMM_XlatorAllocBuf(struct CMM_XLATOROBJECT* hXlator, PVOID pVaBuf, UINT uPaSize); /* * ======== CMM_XlatorCreate ======== * Purpose: * Create a translator(xlator) object used for process specific Va<->Pa * address translation. Node messaging and streams use this to perform * inter-processor(GPP<->DSP) zero-copy data transfer. * Parameters: * phXlator: Address to place handle to a new Xlator handle. * hCmmMgr: Handle to Cmm Mgr associated with this translator. * pXlatorAttrs: Translator attributes used for the client NODE or STREAM. * Returns: * DSP_SOK: Success. * DSP_EINVALIDARG: Bad input Attrs. * DSP_EMEMORY: Insufficient memory(local) for requested resources. * Requires: * phXlator != NULL * hCmmMgr != NULL * pXlatorAttrs != NULL * Ensures: * */ extern DSP_STATUS CMM_XlatorCreate(OUT struct CMM_XLATOROBJECT** phXlator, struct CMM_OBJECT* hCmmMgr, struct CMM_XLATORATTRS *pXlatorAttrs); /* * ======== CMM_XlatorDelete ======== * Purpose: * Delete translator resources * Parameters: * hXlator: handle to translator. * bForce: bForce = TRUE will free XLators SM buffers/dscriptrs. * Returns: * DSP_SOK: Success. * DSP_EHANDLE: Bad translator handle. * DSP_EFAIL: Unable to free translator resources. * Requires: * cRefs > 0 * Ensures: * */ extern DSP_STATUS CMM_XlatorDelete(struct CMM_XLATOROBJECT* hXlator, bool bForce); /* * ======== CMM_XlatorFreeBuf ======== * Purpose: * Free SM buffer and descriptor. * Does not free client process VM. * Parameters: * hXlator: handle to translator. * pBufVa Virtual address of PA to free. * Returns: * DSP_SOK: Success. * DSP_EHANDLE: Bad translator handle. * Requires: * Ensures: * */ extern DSP_STATUS CMM_XlatorFreeBuf(struct CMM_XLATOROBJECT* hXlator, PVOID pBufVa); /* * ======== CMM_XlatorInfo ======== * Purpose: * Set/Get process specific "translator" address info. * This is used to perform fast virtaul address translation * for shared memory buffers between the GPP and DSP. * Parameters: * hXlator: handle to translator. * pAddr: Virtual base address of segment. * ulSize: Size in bytes. * uSegId: Segment identifier of SM segment(s) * bSetInfo Set xlator fields if TRUE, else return base addr * Returns: * DSP_SOK: Success. * DSP_EHANDLE: Bad translator handle. * Requires: * (cRefs > 0) * (pAddr != NULL) * (ulSize > 0) * Ensures: * */ extern DSP_STATUS CMM_XlatorInfo(struct CMM_XLATOROBJECT* hXlator, IN OUT BYTE ** pAddr, ULONG ulSize, UINT uSegId, bool bSetInfo); /* * ======== CMM_XlatorTranslate ======== * Purpose: * Perform address translation VA<->PA for the specified stream or * message shared memory buffer. * Parameters: * hXlator: handle to translator. * pAddr address of buffer to translate. * xType Type of address xlation. CMM_PA2VA or CMM_VA2PA. * Returns: * Valid address on success, else NULL. * Requires: * cRefs > 0 * pAddr != NULL * xType >= CMM_VA2PA) && (xType <= CMM_DSPPA2PA) * Ensures: * */ extern PVOID CMM_XlatorTranslate(struct CMM_XLATOROBJECT* hXlator, PVOID pAddr, CMM_XLATETYPE xType); #ifdef __cplusplus } #endif #endif /* CMM_ */