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

/*
 *  ======== DSPNode.h ========
 *  DSP-BIOS Bridge driver support functions for TI OMAP processors.
 *  Description:
 *      This is the header for the DSP/BIOS Bridge node module.
 *
 *  Public Functions:
 *      DSPNode_Allocate
 *      DSPNode_AllocMsgBuf
 *      DSPNode_ChangePriority
 *      DSPNode_Connect
 *      DSPNode_ConnectEx
 *      DSPNode_Create
 *      DSPNode_Delete
 *      DSPNode_FreeMsgBuf
 *      DSPNode_GetAttr
 *      DSPNode_GetMessage
 *      DSPNode_Pause
 *      DSPNode_PutMessage
 *      DSPNode_RegisterNotify
 *      DSPNode_Run
 *      DSPNode_Terminate
 *
 *  Notes:
 *
 *! Revision History:
 *! ================
 *! 23-Nov-2002 gp: Comment change: uEventMask now referred to as a "type".
 *!                 Comment cleanup, correspondence to db_api.doc.
 *! 12-Dec-2001 ag  DSP_ENOTIMPL added to DSPNode_Connect().
 *! 11-Sep-2001 ag  Added new error codes.
 *! 23-Apr-2001 jeh Added pStatus parameter to DSPNode_Terminate.
 *! 16-Feb-2001 jeh Added new error codes.
 *! 13-Feb-2001 kc: DSP/BIOS Bridge name updates.
 *! 27-Oct-2000 jeh Updated to version 0.9 API spec.
 *! 07-Sep-2000 jeh Changed type HANDLE in DSPNode_RegisterNotify to
 *!                 DSP_HNOTIFICATION. Added DSP_STRMATTR parameter to
 *!                 DSPNode_Connect().
 *! 27-Jul-2000 rr: Updated to ver 0.8 of DSPAPI.
 *! 27-Jun-2000 rr: Created from DBAPI.h
 */

#ifndef DSPNode_
#define DSPNode_

#ifdef __cplusplus
extern "C" {
#endif

/*
 *  ======== DSPNode_Allocate ========
 *  Purpose:
 *      Allocate data structures for controlling and communicating with a node
 *      on a specific DSP processor.
 *  Parameters:
 *      hProcessor:         The processor handle.
 *      pNodeID:            Ptr to DSP_UUID for the node.
 *      pArgs:              Ptr to optional node arguments.
 *      pAttrIn:            Ptr to optional node attributes.
 *      phNode:             Ptr to location to store node handle on return.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EPOINTER:       One of the input parameters pointers is invalid.
 *      DSP_EHANDLE:        Invalid processor handle.
 *      DSP_EMEMORY:        Memory is not available to allocate a node
 *      DSP_EUUID:          The node with the specified UUID is not registered.
 *      DSP_EWRONGSTATE:    The specified processor is in the wrong state
 *                          (not running)
 *      DSP_ERANGE:         The iPriority field specified in pAttrIn is out
 *                          of range.
 *      DSP_EFAIL:          General failure.
 */
extern DBAPI
DSPNode_Allocate(DSP_HPROCESSOR hProcessor,
		 IN CONST struct DSP_UUID * pNodeID,
		 IN CONST OPTIONAL struct DSP_CBDATA * pArgs,
		 IN OPTIONAL struct DSP_NODEATTRIN * pAttrIn,
		 OUT DSP_HNODE * phNode);

/*
 *  ======== DSPNode_AllocMsgBuf ========
 *  Purpose:
 *      Allocate and prepare a buffer whose descriptor will be passed to a DSP
 *      Node within a (DSP_MSG) message
 *  Parameters:
 *      hNode:              The node handle.
 *      uSize:              The size of the buffer (GPP bytes) to be allocated.
 *      pAttr:              Pointer to a DSP_BUFFERATTR structure.
 *      pBuffer:            Location to store the address of the allocated
 *                          buffer on output.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid node handle.
 *      DSP_EMEMORY:        Insufficent memory.
 *      DSP_EPOINTER:       pBuffer is not a valid address.
 *      DSP_EFAIL:          General Failure.
 *      DSP_EALIGNMENT:     Alignment value not supported.(Must be 0, 1, 2, 4)
 *      DSP_EBADSEGID:      Invalid Segment Id.
 *      DSP_ESIZE:          Invalid Size. Must be greater than zero.
 */
	extern DBAPI DSPNode_AllocMsgBuf(DSP_HNODE hNode, UINT uSize,
					 IN OPTIONAL struct DSP_BUFFERATTR * pAttr,
					 OUT BYTE ** pBuffer);

/*
 *  ======== DSPNode_ChangePriority ========
 *  Purpose:
 *      Change a task node's runtime priority within the DSP RTOS.
 *  Parameters:
 *      hNode:              The node handle.
 *      iPriority:          New runtime priority level.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid node handle.
 *      DSP_ERANGE:         iPriority is out of range.
 *      DSP_ENODETYPE:      Operation is invalid for this node type.
 *      DSP_ETIMEOUT:       A timeout occured before DSP responded.
 *      DSP_ERESTART:       A critical error occurred and the DSP is being
 *                          restarted.
 *      DSP_EWRONGSTATE:    The node is not allocated, paused, or running.
 *      DSP_EFAIL:          Unable to change the priority level.
 */
	extern DBAPI DSPNode_ChangePriority(DSP_HNODE hNode, INT iPriority);

/*
 *  ======== DSPNode_Connect ========
 *  Purpose:
 *      Make a stream connection, either between two nodes on a DSP,
 *      or between a node on a DSP and the GPP.
 *  Parameters:
 *      hNode:                  The first node handle.
 *      uStream:                Output stream index on first node (0 based).
 *      hOtherNode:             The second node handle.
 *      uOtherStream:           Input stream index on second node (0 based).
 *      pAttrs:                 Stream attributes. If NULL, defaults used.
 *  Returns:
 *      DSP_SOK:                Success.
 *      DSP_EHANDLE:            Invalid node handle.
 *      DSP_EMEMORY:            GPP memory allocation failure.
 *      DSP_EALREADYCONNCECTED: One of the specified connections has already
 *                              been made.
 *      DSP_EWRONGSTATE:        The node is not in the NODE_ALLOCATED state.
 *      DSP_EVALUE:             A Stream index is not valid.
 *      DSP_ENOMORECONNECTIONS: No more connections are allowed
 *      DSP_EFAIL:              Unable to make connection.
 *      DSP_ENOTIMPL:           Stream mode valid but not supported.
 *      DSP_ESTRMMODE           Illegal Stream mode specified.
 *
 */
	extern DBAPI DSPNode_Connect(DSP_HNODE hNode, UINT uStream,
				     DSP_HNODE hOtherNode, UINT uOtherStream,
				     IN OPTIONAL struct DSP_STRMATTR * pAttr);

/*
 *  ======== DSPNode_ConnectEx ========
 *  Purpose:
 *      Make a stream connection, either between two nodes on a DSP,
 *      or between a node on a DSP and the GPP.
 *  Parameters:
 *      hNode:                  The first node handle.
 *      uStream:                Output stream index on first node (0 based).
 *      hOtherNode:             The second node handle.
 *      uOtherStream:           Input stream index on second node (0 based).
 *      pAttrs:                 Stream attributes. If NULL, defaults used.
 *      pConnParam:             A pointer to a DSP_CBDATA structure that defines 
 *                              connection parameter for device nodes to pass to DSP side. 
 *                              If the value of this parameter is NULL, then this API behaves 
 *                              like DSPNode_Connect. This parameter will have length of the 
 *                              string and the null terminated string in DSP_CBDATA struct. 
 *                              This can be extended in future to pass binary data.
 *
 *  Returns:
 *      DSP_SOK:                Success.
 *      DSP_EHANDLE:            Invalid node handle.
 *      DSP_EMEMORY:            GPP memory allocation failure.
 *      DSP_EALREADYCONNCECTED: One of the specified connections has already
 *                              been made.
 *      DSP_EWRONGSTATE:        The node is not in the NODE_ALLOCATED state.
 *      DSP_EVALUE:             A Stream index is not valid.
 *      DSP_ENOMORECONNECTIONS: No more connections are allowed
 *      DSP_EFAIL:              Unable to make connection.
 *      DSP_ENOTIMPL:           Stream mode valid but not supported.
 *      DSP_ESTRMMODE           Illegal Stream mode specified.
 *
 */
	extern DBAPI DSPNode_ConnectEx(DSP_HNODE hNode, UINT uStream,
				       DSP_HNODE hOtherNode, UINT uOtherStream,
				       IN OPTIONAL struct DSP_STRMATTR * pAttr,
				       IN OPTIONAL struct DSP_CBDATA * pConnParam);

/*
 *  ======== DSPNode_Create ========
 *  Purpose:
 *      Create a node in a pre-run (i.e., inactive) state on its DSP processor.
 *  Parameters:
 *      hNode:              The node handle.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid node handle.
 *      DSP_ESYMBOL:        Create function, or iAlg, not found in the COFF file
 *      DSP_WRONGSTATE:     Operation is invalid for the current node state.
 *      DSP_ETASK:          Unable to create the task or process on the DSP.
 *      DSP_EMEMORY:        Memory Allocation failure on the DSP.
 *      DSP_ERESOURCE:      A requested resource is not available.
 *      DSP_EMULINST:       Multiple instances are not allowed.
 *      DSP_ENOTFOUND:      A specified entity was not found.
 *      DSP_EOUTOFIO:       An I/O resource is not available.
 *      DSP_ESTREAM:        Stream creation failure on the DSP.
 *      DSP_ETIMEOUT:       A timeout occurred before the DSP responded.
 *      DSP_ERESTART:       A critical error has occurred and the DSP is
 *                          being restarted.
 *      DSP_EOVERLAYMEMORY: Overlay region for this phase in use by another node
 *      DSP_EUSER1-16:      A node-specific failure occurred on the DSP.
 *      DSP_EFAIL:          Unable to Create the node.
 *  Details:
 */

	extern DBAPI DSPNode_Create(DSP_HNODE hNode);

/*
 *  ======== DSPNode_Delete ========
 *  Purpose:
 *      Delete all DSP-side and GPP-side resources for the node.
 *  Parameters:
 *      hNode:              The node handle.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid node handle.
 *      DSP_EDELETE:        A Deletion failure occured.
 *      DSP_EFREE:          A DSP memory free operation failed.
 *      DSP_EIOFREE:        A DSP I/O free operation failed.
 *      DSP_ETIMEOUT:       Timeout occured before the DSP responded.
 *      DSP_ERESTART:       A critical error has occurred and the DSP is
 *                          being restarted.
 *      DSP_EUSER1-16:      A node-specific failure occurred on the DSP.
 *      DSP_EOVERLAYMEMORY: Overlay region for this phase in use by another node
 *      DSP_EFAIL:          Unable to delete the node.
 *      DSP_ESYMBOL:        Delete function not found in the COFF file.
 */
	extern DBAPI DSPNode_Delete(DSP_HNODE hNode);

/*
 *  ======== DSPNode_FreeMsgBuf ========
 *  Purpose:
 *      Free a message buffer previously allocated by DSPNode_AllocMsgBuf..
 *  Parameters:
 *      hNode:              The node handle.
 *      pBuffer:            (Address) Buffer allocated by DSP_AllocMsgBuf.
 *      pAttr:              Same buffer attributes passed to DSP_AllocMsgBuf.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid node handle.
 *      DSP_EPOINTER:       pBuffer is not valid.
 *      DSP_EBADSEGID:      Invalid Segment Id.
 *      DSP_EFAIL:          Failure to free the buffer.
 */
	extern DBAPI DSPNode_FreeMsgBuf(DSP_HNODE hNode, IN BYTE * pBuffer,
					IN OPTIONAL struct DSP_BUFFERATTR * pAttr);

/*
 *  ======== DSPNode_GetAttr ========
 *  Purpose:
 *      Copy the current attributes of the specified node.
 *  Parameters:
 *      hNode:              The node handle.
 *      pAttr:              Location to store the node attributes.
 *      uAttrSize:          The size of structure.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid node handle.
 *      DSP_EPOINTER:       Parameter pAttr is not valid.
 *      DSP_EFAIL:          Unable to retrieve node attributes.
 *      DSP_ESIZE:          The size of the specified DSP_NODEATTR structure
 *                          is too small to hold all node information.
 */
	extern DBAPI DSPNode_GetAttr(DSP_HNODE hNode,
				     OUT struct DSP_NODEATTR * pAttr, UINT uAttrSize);

/*
 *  ======== DSPNode_GetMessage ========
 *  Purpose:
 *      Retrieve an event message from a task node.
 *  Parameters:
 *      hNode:              The node handle.
 *      pMessage:           The message structure.
 *      uTimeout:           Timeout to wait for message.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid node handle.
 *      DSP_EPOINTER:       Parameter pMessage is not valid.
 *      DSP_ENODETYPE:      Messages cannot be retrieved from this type of
 *                          node (eg a device node).
 *      DSP_ETIMEOUT:       A timeout occurred and there is no message ready.
 *      DSP_ERESTART:       A critical error has occurred and the DSP is
 *                          being restarted.
 *      DSP_EFAIL:          An error occurred trying to retrieve a message.
 *      DSP_ETRANSLATE      Message contains a shared memory buffer and unable
 *                          to map buffer to process.
 */
	extern DBAPI DSPNode_GetMessage(DSP_HNODE hNode, OUT struct DSP_MSG * pMessage,
					UINT uTimeout);

/*
 *  ======== DSPNode_Pause ========
 *  Purpose:
 *      Temporarily suspend execution of a task node that is
 *      currently running on a DSP.
 *  Parameters:
 *      hNode:              The node handle.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid node handle.
 *      DSP_ENODETYPE:      Invalid operation for this node type.
 *      DSP_ETIMEOUT:       A timeout occured before the DSP responded.
 *      DSP_EWRONGSTATE:    Operation is invalid for the current node state.
 *      DSP_ERESTART:       A critical error has occurred and the DSP is
 *                          being restarted.
 *      DSP_EFAIL:          General failure.
 */
	extern DBAPI DSPNode_Pause(DSP_HNODE hNode);

/*
 *  ======== DSPNode_PutMessage ========
 *  Purpose:
 *      Send an event message to a task node.
 *  Parameters:
 *      hNode:              The node handle.
 *      pMessage:           The message structure.
 *      uTimeout:           Timeout (msecs) waiting for message to be queued.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid node handle.
 *      DSP_EPOINTER:       Parameter pMessage is not valid.
 *      DSP_ENODETYPE:      Invalid operation for this node type
 *      DSP_EWRONGSTATE:    Node is in an invalid state to send a message.
 *      DSP_ETIMEOUT:       Time out occured.
 *      DSP_ERESTART:       A critical error has occurred and the DSP is
 *                          being restarted.
 *      DSP_ETRANSLATE      The shared memory buffer contained in the message
 *                          could not be mapped into the clients address space.
 *      DSP_EFAIL:          General failure.
 */
	extern DBAPI DSPNode_PutMessage(DSP_HNODE hNode,
					IN CONST struct DSP_MSG * pMessage,
					UINT uTimeout);

/*
 *  ======== DSPNode_RegisterNotify ========
 *  Purpose:
 *      Register to be notified of specific events for this node.
 *  Parameters:
 *      hNode:              The node handle.
 *      uEventMask:         Type of event about which to be notified.
 *      uNotifyType:        Type of notification to be sent.
 *      hNotification:      Handle of DSP_NOTIFICATION object.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid node handle or hNotification.
 *      DSP_EVALUE:         Invalid uEventMask.
 *      DSP_ENOTIMP:        The specifed uNotifyType is not supported.
 *      DSP_EFAIL:          Unable to register for notification.
 */
	extern DBAPI DSPNode_RegisterNotify(DSP_HNODE hNode, UINT uEventMask,
					    UINT uNotifyType,
					    struct DSP_NOTIFICATION* hNotification);

/*
 *  ======== DSPNode_Run ========
 *  Purpose:
 *      Start a node running, or resume execution of a previously paused node.
 *  Parameters:
 *      hNode:              The node handle.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid node handle.
 *      DSP_ENODETYPE:      Invalid operation for this type of node.
 *      DSP_ESYMBOL:        Execute function not found in the COFF file.
 *      DSP_EWRONGSTATE:    The node is not in the Created or Paused state.
 *      DSP_ETIMEOUT:       A timeout occured before the DSP responded.
 *      DSP_ERESTART:       A critical error has occurred and the DSP is
 *                          being restarted.
 *      DSP_EOVERLAYMEMORY: Overlay region for this phase in use by another node
 *      DSP_EFAIL:          Unable to start or resume execution.
 */
	extern DBAPI DSPNode_Run(DSP_HNODE hNode);

/*
 *  ======== DSPNode_Terminate ========
 *  Purpose:
 *      Signal a task or xDAIS socket node running on a DSP processor that
 *      it should exit its execute-phase function.
 *  Parameters:
 *      hNode:              Handle of node to terminate.
 *      pStatus:            Location to execute-phase function return value.
 *                          Possible values are between DSP_EUSER1-16.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EHANDLE:        Invalid node handle.
 *      DSP_ENODETYPE:      Invalid operation for this type of node.
 *      DSP_EWRONGSTATE:    The node is not in the Created or Paused state.
 *      DSP_ETIMEOUT:       A timeout occured before the DSP responded.
 *      DSP_ERESTART:       A critical error has occurred and the DSP is
 *                          being restarted.
 *      DSP_EFAIL:          Unable to Terminate the node.
 */
	extern DBAPI DSPNode_Terminate(DSP_HNODE hNode, DSP_STATUS * pStatus);



/*
 *  ======== DSPNode_GetUUIDProps ========
 *  Purpose:
 *      Fetch the Node Properties from the DCD/DOF file, give the UUID
 *  Parameters:
 *      hProcessor:         The processor handle.
 *      pNodeID:            Ptr to DSP_UUID for the node.
 *      pNodeProps:         Ptr to location to store node properties.
 *  Returns:
 *      DSP_SOK:            Success.
 *      DSP_EPOINTER:       One of the input parameters pointers is invalid.
 *      DSP_EHANDLE:        Invalid processor handle.
 *      DSP_EMEMORY:        Memory is not available to allocate a node
 *      DSP_EUUID:          The node with the specified UUID is not registered.
 *      DSP_EWRONGSTATE:    The specified processor is in the wrong state
 *                          (not running)
 *      DSP_ERANGE:         The iPriority field specified in pAttrIn is out
 *                          of range.
 *      DSP_EFAIL:          General failure.
 */
	extern DBAPI DSPNode_GetUUIDProps(DSP_HPROCESSOR hProcessor,
				      IN CONST struct DSP_UUID * pNodeID,
				      OUT struct DSP_NDBPROPS * pNodeProps);
#ifdef __cplusplus
}
#endif
#endif				/* DSPNode_ */