/*
 * node.h
 *
 * DSP-BIOS Bridge driver support functions for TI OMAP processors.
 *
 * DSP/BIOS Bridge Node Manager.
 *
 * Copyright (C) 2005-2006 Texas Instruments, Inc.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

#ifndef NODE_
#define NODE_

#include <dspbridge/procpriv.h>

#include <dspbridge/nodedefs.h>
#include <dspbridge/disp.h>
#include <dspbridge/nldrdefs.h>
#include <dspbridge/drv.h>

/*
 *  ======== node_allocate ========
 *  Purpose:
 *      Allocate GPP resources to manage a node on the DSP.
 *  Parameters:
 *      hprocessor:         Handle of processor that is allocating the node.
 *      node_uuid:          Pointer to a dsp_uuid for the node.
 *      pargs:              Optional arguments to be passed to the node.
 *      attr_in:            Optional pointer to node attributes (priority,
 *                          timeout...)
 *      noderes:             Location to store node resource info.
 *  Returns:
 *      0:            Success.
 *      -ENOMEM:        Insufficient memory on GPP.
 *      -ENOKEY:          Node UUID has not been registered.
 *      -ESPIPE:        iAlg functions not found for a DAIS node.
 *      -EDOM:         attr_in != NULL and attr_in->prio out of
 *                          range.
 *      -EPERM:          A failure occurred, unable to allocate node.
 *      -EBADR:    Proccessor is not in the running state.
 *  Requires:
 *      node_init(void) called.
 *      hprocessor != NULL.
 *      node_uuid != NULL.
 *      noderes != NULL.
 *  Ensures:
 *      0:            IsValidNode(*ph_node).
 *      error:              *noderes == NULL.
 */
extern int node_allocate(struct proc_object *hprocessor,
				const struct dsp_uuid *node_uuid,
				const struct dsp_cbdata
				*pargs, const struct dsp_nodeattrin
				*attr_in,
				struct node_res_object **noderes,
				struct process_context *pr_ctxt);

/*
 *  ======== node_alloc_msg_buf ========
 *  Purpose:
 *      Allocate and Prepare a buffer whose descriptor will be passed to a
 *      Node within a (dsp_msg)message
 *  Parameters:
 *      hnode:          The node handle.
 *      usize:          The size of the buffer to be allocated.
 *      pattr:          Pointer to a dsp_bufferattr structure.
 *      pbuffer:        Location to store the address of the allocated
 *                      buffer on output.
 *  Returns:
 *      0:        Success.
 *      -EFAULT:    Invalid node handle.
 *      -ENOMEM:    Insufficent memory.
 *      -EPERM:      General Failure.
 *      -EINVAL:      Invalid Size.
 *  Requires:
 *      node_init(void) called.
 *      pbuffer != NULL.
 *  Ensures:
 */
extern int node_alloc_msg_buf(struct node_object *hnode,
				     u32 usize, struct dsp_bufferattr
				     *pattr, u8 **pbuffer);

/*
 *  ======== node_change_priority ========
 *  Purpose:
 *      Change the priority of an allocated node.
 *  Parameters:
 *      hnode:              Node handle returned from node_allocate.
 *      prio:          New priority level to set node's priority to.
 *  Returns:
 *      0:            Success.
 *      -EFAULT:        Invalid hnode.
 *      -EDOM:         prio is out of range.
 *      -EPERM: The specified node is not a task node.
 *              Unable to change node's runtime priority level.
 *      -EBADR:    Node is not in the NODE_ALLOCATED, NODE_PAUSED,
 *                          or NODE_RUNNING state.
 *      -ETIME:       A timeout occurred before the DSP responded.
 *  Requires:
 *      node_init(void) called.
 *  Ensures:
 *      0 && (Node's current priority == prio)
 */
extern int node_change_priority(struct node_object *hnode, s32 prio);

/*
 *  ======== node_connect ========
 *  Purpose:
 *      Connect two nodes on the DSP, or a node on the DSP to the GPP. In the
 *      case that the connection is being made between a node on the DSP and
 *      the GPP, one of the node handles (either node1 or node2) must be
 *      the constant NODE_HGPPNODE.
 *  Parameters:
 *      node1:         Handle of first node to connect to second node. If
 *                      this is a connection from the GPP to node2, node1
 *                      must be the constant NODE_HGPPNODE. Otherwise, node1
 *                      must be a node handle returned from a successful call
 *                      to Node_Allocate().
 *      node2:         Handle of second node. Must be either NODE_HGPPNODE
 *                      if this is a connection from DSP node to GPP, or a
 *                      node handle returned from a successful call to
 *                      node_allocate().
 *      stream1:        Output stream index on first node, to be connected
 *                      to second node's input stream. Value must range from
 *                      0 <= stream1 < number of output streams.
 *      stream2:        Input stream index on second node. Value must range
 *                      from 0 <= stream2 < number of input streams.
 *      pattrs:         Stream attributes (NULL ==> use defaults).
 *      conn_param:     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 tp
 *                      pass binary data.
 *  Returns:
 *      0:                Success.
 *      -EFAULT:            Invalid node1 or node2.
 *      -ENOMEM:            Insufficient host memory.
 *      -EINVAL:             A stream index parameter is invalid.
 *      -EISCONN:  A connection already exists for one of the
 *                              indices stream1 or stream2.
 *      -EBADR:        Either node1 or node2 is not in the
 *                              NODE_ALLOCATED state.
 *      -ECONNREFUSED: No more connections available.
 *      -EPERM:              Attempt to make an illegal connection (eg,
 *                              Device node to device node, or device node to
 *                              GPP), the two nodes are on different DSPs.
 *  Requires:
 *      node_init(void) called.
 *  Ensures:
 */
extern int node_connect(struct node_object *node1,
			       u32 stream1,
			       struct node_object *node2,
			       u32 stream2,
			       struct dsp_strmattr *pattrs,
			       struct dsp_cbdata
			       *conn_param);

/*
 *  ======== node_create ========
 *  Purpose:
 *      Create a node on the DSP by remotely calling the node's create
 *      function. If necessary, load code that contains the node's create
 *      function.
 *  Parameters:
 *      hnode:              Node handle returned from node_allocate().
 *  Returns:
 *      0:            Success.
 *      -EFAULT:        Invalid hnode.
 *      -ESPIPE:        Create function not found in the COFF file.
 *      -EBADR:    Node is not in the NODE_ALLOCATED state.
 *      -ENOMEM:        Memory allocation failure on the DSP.
 *      -ETIME:       A timeout occurred before the DSP responded.
 *      -EPERM:          A failure occurred, unable to create node.
 *  Requires:
 *      node_init(void) called.
 *  Ensures:
 */
extern int node_create(struct node_object *hnode);

/*
 *  ======== node_create_mgr ========
 *  Purpose:
 *      Create a NODE Manager object. This object handles the creation,
 *      deletion, and execution of nodes on the DSP target. The NODE Manager
 *      also maintains a pipe map of used and available node connections.
 *      Each DEV object should have exactly one NODE Manager object.
 *
 *  Parameters:
 *      node_man:       Location to store node manager handle on output.
 *      hdev_obj:     Device for this processor.
 *  Returns:
 *      0:        Success;
 *      -ENOMEM:    Insufficient memory for requested resources.
 *      -EPERM:      General failure.
 *  Requires:
 *      node_init(void) called.
 *      node_man != NULL.
 *      hdev_obj != NULL.
 *  Ensures:
 *      0:        Valide *node_man.
 *      error:          *node_man == NULL.
 */
extern int node_create_mgr(struct node_mgr **node_man,
				  struct dev_object *hdev_obj);

/*
 *  ======== node_delete ========
 *  Purpose:
 *      Delete resources allocated in node_allocate(). If the node was
 *      created, delete the node on the DSP by remotely calling the node's
 *      delete function. Loads the node's delete function if necessary.
 *      GPP side resources are freed after node's delete function returns.
 *  Parameters:
 *      noderes:              Node resource info handle returned from
 *                                 node_allocate().
 *      pr_ctxt:                Poninter to process context data.
 *  Returns:
 *      0:            Success.
 *      -EFAULT:        Invalid hnode.
 *      -ETIME:       A timeout occurred before the DSP responded.
 *      -EPERM:          A failure occurred in deleting the node.
 *      -ESPIPE:        Delete function not found in the COFF file.
 *  Requires:
 *      node_init(void) called.
 *  Ensures:
 *      0:            hnode is invalid.
 */
extern int node_delete(struct node_res_object *noderes,
			      struct process_context *pr_ctxt);

/*
 *  ======== node_delete_mgr ========
 *  Purpose:
 *      Delete the NODE Manager.
 *  Parameters:
 *      hnode_mgr:       Node manager object.
 *  Returns:
 *      0:        Success.
 *  Requires:
 *      node_init(void) called.
 *      Valid hnode_mgr.
 *  Ensures:
 */
extern int node_delete_mgr(struct node_mgr *hnode_mgr);

/*
 *  ======== node_enum_nodes ========
 *  Purpose:
 *      Enumerate the nodes currently allocated for the DSP.
 *  Parameters:
 *      hnode_mgr:       Node manager returned from node_create_mgr().
 *      node_tab:       Array to copy node handles into.
 *      node_tab_size:   Number of handles that can be written to node_tab.
 *      pu_num_nodes:     Location where number of node handles written to
 *                      node_tab will be written.
 *      pu_allocated:    Location to write total number of allocated nodes.
 *  Returns:
 *      0:        Success.
 *      -EINVAL:      node_tab is too small to hold all node handles.
 *  Requires:
 *      Valid hnode_mgr.
 *      node_tab != NULL || node_tab_size == 0.
 *      pu_num_nodes != NULL.
 *      pu_allocated != NULL.
 *  Ensures:
 *      - (-EINVAL && *pu_num_nodes == 0)
 *      - || (0 && *pu_num_nodes <= node_tab_size)  &&
 *        (*pu_allocated == *pu_num_nodes)
 */
extern int node_enum_nodes(struct node_mgr *hnode_mgr,
				  void **node_tab,
				  u32 node_tab_size,
				  u32 *pu_num_nodes,
				  u32 *pu_allocated);

/*
 *  ======== node_exit ========
 *  Purpose:
 *      Discontinue usage of NODE module.
 *  Parameters:
 *  Returns:
 *  Requires:
 *      node_init(void) successfully called before.
 *  Ensures:
 *      Any resources acquired in node_init(void) will be freed when last NODE
 *      client calls node_exit(void).
 */
extern void node_exit(void);

/*
 *  ======== node_free_msg_buf ========
 *  Purpose:
 *      Free a message buffer previously allocated with node_alloc_msg_buf.
 *  Parameters:
 *      hnode:          The node handle.
 *      pbuffer:        (Address) Buffer allocated by node_alloc_msg_buf.
 *      pattr:          Same buffer attributes passed to node_alloc_msg_buf.
 *  Returns:
 *      0:        Success.
 *      -EFAULT:    Invalid node handle.
 *      -EPERM:      Failure to free the buffer.
 *  Requires:
 *      node_init(void) called.
 *      pbuffer != NULL.
 *  Ensures:
 */
extern int node_free_msg_buf(struct node_object *hnode,
				    u8 *pbuffer,
				    struct dsp_bufferattr
				    *pattr);

/*
 *  ======== node_get_attr ========
 *  Purpose:
 *      Copy the current attributes of the specified node into a dsp_nodeattr
 *      structure.
 *  Parameters:
 *      hnode:          Node object allocated from node_allocate().
 *      pattr:          Pointer to dsp_nodeattr structure to copy node's
 *                      attributes.
 *      attr_size:      Size of pattr.
 *  Returns:
 *      0:        Success.
 *      -EFAULT:    Invalid hnode.
 *  Requires:
 *      node_init(void) called.
 *      pattr != NULL.
 *  Ensures:
 *      0:        *pattrs contains the node's current attributes.
 */
extern int node_get_attr(struct node_object *hnode,
				struct dsp_nodeattr *pattr, u32 attr_size);

/*
 *  ======== node_get_message ========
 *  Purpose:
 *      Retrieve a message from a node on the DSP. The node must be either a
 *      message node, task node, or XDAIS socket node.
 *      If a message is not available, this function will block until a
 *      message is available, or the node's timeout value is reached.
 *  Parameters:
 *      hnode:          Node handle returned from node_allocate().
 *      message:       Pointer to dsp_msg structure to copy the
 *                      message into.
 *      utimeout:       Timeout in milliseconds to wait for message.
 *  Returns:
 *      0:        Success.
 *      -EFAULT:    Invalid hnode.
 *      -EPERM: Cannot retrieve messages from this type of node.
 *              Error occurred while trying to retrieve a message.
 *      -ETIME:   Timeout occurred and no message is available.
 *  Requires:
 *      node_init(void) called.
 *      message != NULL.
 *  Ensures:
 */
extern int node_get_message(struct node_object *hnode,
				   struct dsp_msg *message, u32 utimeout);

/*
 *  ======== node_get_nldr_obj ========
 *  Purpose:
 *      Retrieve the Nldr manager
 *  Parameters:
 *      hnode_mgr:       Node Manager
 *      nldr_ovlyobj:   Pointer to a Nldr manager handle
 *  Returns:
 *      0:        Success.
 *      -EFAULT:    Invalid hnode.
 *  Ensures:
 */
extern int node_get_nldr_obj(struct node_mgr *hnode_mgr,
				    struct nldr_object **nldr_ovlyobj);

/*
 *  ======== node_init ========
 *  Purpose:
 *      Initialize the NODE module.
 *  Parameters:
 *  Returns:
 *      TRUE if initialization succeeded, FALSE otherwise.
 *  Ensures:
 */
extern bool node_init(void);

/*
 *  ======== node_on_exit ========
 *  Purpose:
 *      Gets called when RMS_EXIT is received for a node. PROC needs to pass
 *      this function as a parameter to msg_create(). This function then gets
 *      called by the Bridge driver when an exit message for a node is received.
 *  Parameters:
 *      hnode:      Handle of the node that the exit message is for.
 *      node_status:    Return status of the node's execute phase.
 *  Returns:
 *  Ensures:
 */
void node_on_exit(struct node_object *hnode, s32 node_status);

/*
 *  ======== node_pause ========
 *  Purpose:
 *      Suspend execution of a node currently running on the DSP.
 *  Parameters:
 *      hnode:              Node object representing a node currently
 *                          running on the DSP.
 *  Returns:
 *      0:            Success.
 *      -EFAULT:        Invalid hnode.
 *      -EPERM: Node is not a task or socket node.
 *              Failed to pause node.
 *      -ETIME:       A timeout occurred before the DSP responded.
 *      DSP_EWRONGSTSATE:   Node is not in NODE_RUNNING state.
 *  Requires:
 *      node_init(void) called.
 *  Ensures:
 */
extern int node_pause(struct node_object *hnode);

/*
 *  ======== node_put_message ========
 *  Purpose:
 *      Send a message to a message node, task node, or XDAIS socket node.
 *      This function will block until the message stream can accommodate
 *      the message, or a timeout occurs. The message will be copied, so Msg
 *      can be re-used immediately after return.
 *  Parameters:
 *      hnode:              Node handle returned by node_allocate().
 *      pmsg:               Location of message to be sent to the node.
 *      utimeout:           Timeout in msecs to wait.
 *  Returns:
 *      0:            Success.
 *      -EFAULT:        Invalid hnode.
 *      -EPERM: Messages can't be sent to this type of node.
 *              Unable to send message.
 *      -ETIME:       Timeout occurred before message could be set.
 *      -EBADR:    Node is in invalid state for sending messages.
 *  Requires:
 *      node_init(void) called.
 *      pmsg != NULL.
 *  Ensures:
 */
extern int node_put_message(struct node_object *hnode,
				   const struct dsp_msg *pmsg, u32 utimeout);

/*
 *  ======== node_register_notify ========
 *  Purpose:
 *      Register to be notified on specific events for this node.
 *  Parameters:
 *      hnode:          Node handle returned by node_allocate().
 *      event_mask:     Mask of types of events to be notified about.
 *      notify_type:    Type of notification to be sent.
 *      hnotification:  Handle to be used for notification.
 *  Returns:
 *      0:        Success.
 *      -EFAULT:    Invalid hnode.
 *      -ENOMEM:    Insufficient memory on GPP.
 *      -EINVAL:     event_mask is invalid.
 *      -ENOSYS:   Notification type specified by notify_type is not
 *                      supported.
 *  Requires:
 *      node_init(void) called.
 *      hnotification != NULL.
 *  Ensures:
 */
extern int node_register_notify(struct node_object *hnode,
				       u32 event_mask, u32 notify_type,
				       struct dsp_notification
				       *hnotification);

/*
 *  ======== node_run ========
 *  Purpose:
 *      Start execution of a node's execute phase, or resume execution of
 *      a node that has been suspended (via node_pause()) on the DSP. Load
 *      the node's execute function if necessary.
 *  Parameters:
 *      hnode:              Node object representing a node currently
 *                          running on the DSP.
 *  Returns:
 *      0:            Success.
 *      -EFAULT:        Invalid hnode.
 *      -EPERM: hnode doesn't represent a message, task or dais socket node.
 *              Unable to start or resume execution.
 *      -ETIME:       A timeout occurred before the DSP responded.
 *      DSP_EWRONGSTSATE:   Node is not in NODE_PAUSED or NODE_CREATED state.
 *      -ESPIPE:        Execute function not found in the COFF file.
 *  Requires:
 *      node_init(void) called.
 *  Ensures:
 */
extern int node_run(struct node_object *hnode);

/*
 *  ======== node_terminate ========
 *  Purpose:
 *      Signal a node running on the DSP that it should exit its execute
 *      phase function.
 *  Parameters:
 *      hnode:              Node object representing a node currently
 *                          running on the DSP.
 *      pstatus:            Location to store execute-phase function return
 *                          value.
 *  Returns:
 *      0:            Success.
 *      -EFAULT:        Invalid hnode.
 *      -ETIME:       A timeout occurred before the DSP responded.
 *      -EPERM: Type of node specified cannot be terminated.
 *              Unable to terminate the node.
 *      -EBADR:    Operation not valid for the current node state.
 *  Requires:
 *      node_init(void) called.
 *      pstatus != NULL.
 *  Ensures:
 */
extern int node_terminate(struct node_object *hnode,
				 int *pstatus);

/*
 *  ======== node_get_uuid_props ========
 *  Purpose:
 *      Fetch Node properties given the UUID
 *  Parameters:
 *
 */
extern int node_get_uuid_props(void *hprocessor,
				      const struct dsp_uuid *node_uuid,
				      struct dsp_ndbprops
				      *node_props);

#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
/**
 * node_find_addr() - Find the closest symbol to the given address.
 *
 * @node_mgr:		Node manager handle
 * @sym_addr:		Given address to find the closest symbol
 * @offset_range:		offset range to look fo the closest symbol
 * @sym_addr_output:	Symbol Output address
 * @sym_name:		String with the symbol name of the closest symbol
 *
 * 	This function finds the closest symbol to the address where a MMU
 *	Fault occurred on the DSP side.
 */
int node_find_addr(struct node_mgr *node_mgr, u32 sym_addr,
				u32 offset_range, void *sym_addr_output,
				char *sym_name);

enum node_state node_get_state(void *hnode);
#endif

#endif /* NODE_ */
