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


/*
 *  ======== rms_sh.h ========
 *  DSP-BIOS Bridge driver support functions for TI OMAP processors.
 *
 *  DSP/BIOS Bridge Resource Manager Server shared definitions (used on both 
 *  GPP and DSP sides).
 *
 *! Revision History
 *! ================
 *! 24-Mar-2003 vp  Merged updates required for CCS2.2 transition.
 *! 24-Feb-2003 kc  Rearranged order of node types to temporarily support legacy message
 *!                 node code
 *! 23-Nov-2002 gp  Converted tabs -> spaces, to fix formatting.
 *! 13-Feb-2002 jeh Added sysstacksize element to RMS_MoreTaskArgs.
 *! 11-Dec-2000 sg  Added 'misc' element to RMS_MoreTaskArgs.
 *! 04-Dec-2000 ag  Added RMS_BUFDESC command code.
 *!                 C/R code value changed to allow ORing of system/user codes.
 *! 10-Oct-2000 sg  Added 'align' field to RMS_StrmDef.
 *! 09-Oct-2000 sg  Moved pre-defined message codes here from rmsdefs.h.
 *! 02-Oct-2000 sg  Changed ticks to msec.
 *! 24-Aug-2000 sg  Moved definitions that will be exposed to app developers
 *!  		    to a separate file, rmsdefs.h.
 *! 10-Aug-2000 sg  Added RMS_COMMANDBUFSIZE and RMS_RESPONSEBUFSIZE; added
 *!		    pre-defined command/response codes; more comments.
 *! 09-Aug-2000 sg  Added RMS_ETASK.
 *! 08-Aug-2000 jeh Define RMS_WORD for GPP, rename DSP_MSG to RMS_DSPMSG.
 *!                 Added RMS_MsgArgs, RMS_MoreTaskArgs.
 *! 25-Jul-2000 sg: Changed SIO to STRM.
 *! 30-Jun-2000 sg: Initial.
 */

#ifndef RMS_SH_
#define RMS_SH_

#ifdef __cplusplus
extern "C" {
#endif

#include <rmstypes.h>

/* Node Types: */
#define RMS_TASK                1	/* Task node */
#define RMS_DAIS                2	/* xDAIS socket node */
#define RMS_MSG                 3	/* Message node */

/* Memory Types: */
#define RMS_CODE                0	/* Program space */
#define RMS_DATA                1	/* Data space */
#define RMS_IO                	2	/* I/O space */

/* RM Server Command and Response Buffer Sizes: */
#define RMS_COMMANDBUFSIZE     256	/* Size of command buffer */
#define RMS_RESPONSEBUFSIZE    16	/* Size of response buffer */

/* Pre-Defined Command/Response Codes: */
#define RMS_EXIT                0x80000000	/* GPP->Node: shutdown */
#define RMS_EXITACK             0x40000000	/* Node->GPP: ack shutdown */
#define RMS_BUFDESC             0x20000000	/* Arg1 SM buf, Arg2 is SM size */
#define RMS_USER                0x0	/* Start of user-defined msg codes */
#define RMS_MAXUSERCODES        0xfff	/* Maximum user defined C/R Codes */


/* RM Server RPC Command Structure: */
	struct RMS_Command {
		RMS_WORD fxn;	/* Server function address */
		RMS_WORD arg1;	/* First argument */
		RMS_WORD arg2;	/* Second argument */
		RMS_WORD data;	/* Function-specific data array */
	} ;

/*
 *  The RMS_StrmDef structure defines the parameters for both input and output
 *  streams, and is passed to a node's create function.  
 */
	struct RMS_StrmDef {
		RMS_WORD bufsize;	/* Buffer size (in DSP words) */
		RMS_WORD nbufs;	/* Max number of bufs in stream */
		RMS_WORD segid;	/* Segment to allocate buffers */
		RMS_WORD align;	/* Alignment for allocated buffers */
		RMS_WORD timeout;	/* Timeout (msec) for blocking calls */
		RMS_CHAR name[1];	/* Device Name (terminated by '\0') */
	} ;

/* Message node create args structure: */
	struct RMS_MsgArgs {
		RMS_WORD maxMessages;	/* Max # simultaneous msgs to node */
		RMS_WORD segid;	/* Mem segment for NODE_allocMsgBuf */
		RMS_WORD notifyType;	/* Type of message notification */
		RMS_WORD argLength;	/* Length (in DSP chars) of arg data */
		RMS_WORD argData;	/* Arg data for node */
	} ;

/* Partial task create args structure */
	struct RMS_MoreTaskArgs {
		RMS_WORD priority;	/* Task's runtime priority level */
		RMS_WORD stackSize;	/* Task's stack size */
		RMS_WORD sysstackSize;	/* Task's system stack size (55x) */
		RMS_WORD stackSeg;	/* Memory segment for task's stack */
#if defined (OMAP_2430) || defined (OMAP_3430)
		RMS_WORD heapAddr;	/* base address of the node memory heap in
					 * external memory (DSP virtual address) */
		RMS_WORD heapSize;	/* size in MAUs of the node memory heap in
					 * external memory */
#endif
		RMS_WORD misc;	/* Misc field.  Not used for 'normal'
				 * task nodes; for xDAIS socket nodes
				 * specifies the IALG_Fxn pointer. 
				 */
		RMS_WORD numInputStreams;	/* # input STRM definition structures */
	} ;

#ifdef __cplusplus
}
#endif
#endif				/* RMS_SH_ */

