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


/*
 *  ======== DSPStream.h ========
 *  DSP-BIOS Bridge driver support functions for TI OMAP processors.
 *  Description: 
 *      This is the header for the DSP/BIOS Bridge stream module.
 *
 *  Public Functions:
 *      DSPStream_AllocateBuffers
 *      DSPStream_Close
 *      DSPStream_FreeBuffers
 *      DSPStream_GetInfo
 *      DSPStream_Idle
 *      DSPStream_Issue
 *      DSPStream_Open
 *      DSPStream_Reclaim
 *      DSPStream_RegisterNotify
 *      DSPStream_Select
 *
 *  Notes:
 *
 *! Revision History:
 *! ================
 *! 23-Nov-2002 gp: Comment change: uEventMask is really a "type".
 *! 17-Dec-2001 ag  Fix return codes in DSPStream_[Issue][Reclaim]
 *! 12-Dec-2001 ag  Added DSP_ENOTIMPL error code to DSPStream_Open().
 *! 17-Nov-2001 ag  Added DSP_ETRANSLATE error.
 *!                 Added bufSize param and renamed dwBytes to dwDataSize in
 *!                 DSPStream_[Issue][Reclaim]().
 *! 07-Jun-2001 sg: Made buffer alloc/free fxn names plural.
 *! 13-Feb-2001 kc: DSP/BIOS Bridge name updates.
 *! 27-Sep-2000 jeh Removed DSP_BUFFERATTR parameter from DSPStream_Allocate-
 *!                 Buffer(), since these have been moved to DSP_STREAMATTRIN.
 *! 07-Sep-2000 jeh Changed type HANDLE in DSPStream_RegisterNotify to
 *!                 DSP_HNOTIFICATION.
 *! 20-Jul-2000 rr: Updated to version 0.8
 *! 27-Jun-2000 rr: Created from DBAPI.h
 */
#include <host_os.h>
#ifndef DSPStream_
#define DSPStream_

#ifdef __cplusplus
extern "C" {
#endif

/*
 *  ======== DSPStream_AllocateBuffers ========
 *  Purpose:
 *      Allocate data buffers for use with a specific stream.
 *  Parameters:
 *      hStream:            The stream handle.
 *      uSize:              Size of the buffer
 *      apBuffer:           Ptr to location to hold array of buffers.
 *      uNumBufs:           The number of buffers to allocate of size uSize.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid Stream handle.
 *      DSP_EMEMORY:        Insufficient memory
 *      DSP_EPOINTER:       Parameter apBuffer is not valid.
 *      DSP_EALIGNMENT:     Stream's alignment value not supported.
 *      DSP_ESIZE:          Illegal size.
 *      DSP_EFAIL:          General failure to allocate buffer.
 *  Details:
 */
	extern DBAPI DSPStream_AllocateBuffers(DSP_HSTREAM hStream,
					       UINT uSize, OUT BYTE ** apBuffer,
					       UINT uNumBufs);

/*
 *  ======== DSPStream_Close ========
 *  Purpose:
 *      Close a stream and free the underlying stream object.
 *  Parameters:
 *      hStream:            The stream handle.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid Stream handle.
 *      DSP_EPENDING:       Not all stream buffers have been reclaimed
 *      DSP_EFAIL:          Failure to Close the Stream
 *  Details:
 */
	extern DBAPI DSPStream_Close(DSP_HSTREAM hStream);

/*
 *  ======== DSPStream_FreeBuffers ========
 *  Purpose:
 *      Free a previously allocated stream data buffer.
 *  Parameters:
 *      hStream:            The stream handle.
 *      apBuffer:           The array of buffers to free.
 *      uNumBufs:           The number of buffers.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid Stream handle.
 *      DSP_EPOINTER:       Parameter apBuffer is not valid.
 *      DSP_EFAIL:          Failure to free the data buffers
 *  Details:
 */
	extern DBAPI DSPStream_FreeBuffers(DSP_HSTREAM hStream,
					   IN BYTE ** apBuffer, UINT uNumBufs);

/*
 *  ======== DSPStream_GetInfo ========
 *  Purpose:
 *      Get information about a stream.
 *  Parameters:
 *      hStream:            The stream handle.
 *      pStreamInfo:        Ptr to the DSP_STREAMINFO structure.
 *      uStreamInfoSize:    The size of structure.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid Stream handle.
 *      DSP_EPOINTER:       Parameter pStreamInfo is invalid.
 *      DSP_ESIZE:          uStreamInfoSize is too small to hold all stream
 *                          information.
 *      DSP_EFAIL:          Unable to retrieve Stream info
 *  Details:
 */
	extern DBAPI DSPStream_GetInfo(DSP_HSTREAM hStream,
				       OUT struct DSP_STREAMINFO * pStreamInfo,
				       UINT uStreamInfoSize);

/*
 *  ======== DSPStream_Idle ========
 *  Purpose:
 *      Terminate I/O with a particular stream, and (optionally)
 *      flush output data buffers.
 *  Parameters:
 *      hStream:            The stream handle.
 *      bFlush:             Boolean flag
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid Stream handle.
 *      DSP_ETIMEOUT:       Time out occurred.
 *      DSP_ERESTART:       A critical error has
 *                          occurred and the DSP is being restarted.
 *      DSP_EFAIL:          Unable to Idle the stream
 *  Details:
 */
	extern DBAPI DSPStream_Idle(DSP_HSTREAM hStream, bool bFlush);

/*
 *  ======== DSPStream_Issue ========
 *  Purpose:
 *      Send a buffer of data to a stream.
 *  Parameters:
 *      hStream:            The stream handle.
 *      pBuffer:            Ptr to the buffer.
 *      dwDataSize:         Size of data in buffer in bytes.
 *      dwBufSize:          Size of actual buffer in bytes.
 *      dwArg:              User defined buffer context.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid Stream handle.
 *      DSP_EPOINTER:       Invalid pBuffer pointer
 *      DSP_ESTREAMFULL:    The stream has been issued the maximum number
 *                          of buffers allowed in the stream at once;
 *                          buffers must be reclaimed from the stream
 *                          before any more can be issued.
 *      DSP_EFAIL:          Unable to issue the buffer.
 *      DSP_ETRANSLATE:     Unable to map shared buffer to client process.
 *  Details:
 */
	extern DBAPI DSPStream_Issue(DSP_HSTREAM hStream, IN BYTE * pBuffer,
				     ULONG dwDataSize, ULONG dwBufSize,
				     IN DWORD dwArg);

/*
 *  ======== DSPStream_Open ========
 *  Purpose:
 *      Retrieve a stream handle for sending/receiving data buffers
 *      to/from a task node on a DSP.
 *  Parameters:
 *      hNode:              The node handle.
 *      uDirection:         Stream direction: {DSP_TONODE | DSP_FROMNODE}.
 *      uIndex:             Stream index (zero based).
 *      pAttrIn:            Ptr to the stream attributes (optional)
 *      phStream:           Ptr to location to store the stream handle.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EPOINTER:       Invalid phStream pointer.
 *      DSP_ENODETYPE:      Stream can not be opened for this node type/
 *      DSP_EDIRECTION:     uDirection is invalid
 *      DSP_EVALUE:         uIndex is invalid, or, if pAttrIn != NULL,
 *                          pAttrIn->uSegment is invalid.
 *      DSP_EFAIL:          General failure.
 *      DSP_ESTRMMODE:      Stream mode is invalid.
 *      DSP_EDMACHNL:       DMAChnlId is invalid, if STRMMODE is LDMA or RDMA.
 *      DSP_EHANDLE:        Invalid Stream handle.
 *      DSP_ENOTIMPL:       Stream mode is not supported.
 *
 *  Details:
 */
	extern DBAPI DSPStream_Open(DSP_HNODE hNode, UINT uDirection,
				    UINT uIndex,
				    IN OPTIONAL struct DSP_STREAMATTRIN * pAttrIn,
				    OUT DSP_HSTREAM * phStream);

/*
 *  ======== DSPStream_PrepareBuffer ========
 *  Purpose:
 *      Prepare a buffer that was not allocated by DSPStream_AllocateBuffers
 *      for use with a stream
 *  Parameters:
 *      hStream:            Stream handle
 *      uSize:              Size of the allocated buffer(GPP bytes)
 *      pBffer:             Address of the Allocated buffer
 *  Returns:
 *      DSP_SOK:            Success
 *      DSP_EHANDLE:        Invalid Stream handle
 *      DSP_EPOINTER:       Invalid pBuffer
 *      DSP_EFAIL:          Failure to Prepare a buffer
 */
	extern DBAPI DSPStream_PrepareBuffer(DSP_HSTREAM hStream, UINT uSize,
					     BYTE * pBuffer);

/*
 *  ======== DSPStream_Reclaim ========
 *  Purpose:
 *      Request a buffer back from a stream.
 *  Parameters:
 *      hStream:            The stream handle.
 *      pBufPtr:            Ptr to location to store stream buffer.
 *      pDataSize:          Ptr to location to store data size of the buffer.
 *      pBufSize:           Ptr to location to store actual size of the buffer.
 *      pdwArg:             Ptr to location to store user defined context.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid Stream handle.
 *      DSP_EPOINTER:       One of pBufPtr or pBytes is invalid.
 *      DSP_ETIMEOUT:       Timeout waiting from I/O completion.
 *      DSP_ERESTART:       A critical error has occurred and
 *                          the DSP is being restarted.
 *      DSP_EFAIL:          Unable to Reclaim buffer.
 *      DSP_ETRANSLATE:     Unable to map shared buffer to client process.
 *  Details:
 */
	extern DBAPI DSPStream_Reclaim(DSP_HSTREAM hStream,
				       OUT BYTE ** pBufPtr,
				       OUT ULONG * pDataSize,
				       OUT ULONG * pBufSize,
				       OUT DWORD * pdwArg);

/*
 *  ======== DSPStream_RegisterNotify ========
 *  Purpose:
 *      Register to be notified of specific events for this stream.
 *  Parameters:
 *      hStream:            The stream handle.
 *      uEventMask:         Type of event to be notified about.
 *      uNotifyType:        Type of notification to be sent.
 *      hNotification:      Handle to be used for notification.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid stream handle or invalid hNotification
 *      DSP_EVALUE:         uEventMask is invalid
 *      DSP_ENOTIMP:        Not supported as specified in uNotifyType
 *      DSP_EFAIL:          Unable to Register for notification
 *  Details:
 */
	extern DBAPI DSPStream_RegisterNotify(DSP_HSTREAM hStream,
					      UINT uEventMask, UINT uNotifyType,
					      struct DSP_NOTIFICATION* hNotification);

/*
 *  ======== DSPStream_Select ========
 *  Purpose:
 *      Select a ready stream.
 *  Parameters:
 *      aStreamTab:         Array of stream handles.
 *      nStreams:           Number of streams in array.
 *      pMask:              Pointer to the mask of ready streams.
 *      uTimeout:           Timeout value in milliseconds.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_ERANGE:         nStreams is out of range
 *      DSP_EPOINTER:       Invalid aStreamTab or pMask pointer.
 *      DSP_ETIMEOUT        Timeout occured.
 *      DSP_EFAIL:          Failure to select a stream.
 *      DSP_ERESTART:       A critical error has occurred and
 *                          the DSP is being restarted.
 *  Details:
 */
	extern DBAPI DSPStream_Select(IN DSP_HSTREAM * aStreamTab,
				      UINT nStreams, OUT UINT * pMask,
				      UINT uTimeout);

/*
 *  ======== DSPStream_UnprepareBuffer ========
 *  Purpose:
 *      UnPrepare a buffer that was prepared by DSPStream_PrepareBuffer
 *      and will no longer be used with the stream
 *  Parameters:
 *      hStream:            Stream handle
 *      uSize:              Size of the allocated buffer(GPP bytes)
 *      pBffer:             Address of the Allocated buffer
 *  Returns:
 *      DSP_SOK:            Success
 *      DSP_EHANDLE:        Invalid Stream handle
 *      DSP_EPOINTER:       Invalid pBuffer
 *      DSP_EFAIL:          Failure to UnPrepare a buffer
 */
	extern DBAPI DSPStream_UnprepareBuffer(DSP_HSTREAM hStream, UINT uSize,
					       BYTE * pBuffer);

#ifdef __cplusplus
}
#endif
#endif				/* DSPStream_ */