/*
 * dspbridge/mpu_api/inc/wcdioctl.h
 *
 * DSP-BIOS Bridge driver support functions for TI OMAP processors.
 *
 * Copyright (C) 2007 Texas Instruments, Inc.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation version 2.1 of the License.
 *
 * This program is distributed .as is. WITHOUT ANY WARRANTY of any kind,
 * whether express or implied; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 */


/*
 *  ======== wcdioctl.h ========
 *  Purpose:
 *      Contains structures and commands that are used for interaction
 *      between the DDSP API and class driver.
 *
 *! Revision History
 *! ================
 *! 19-Apr-2004 sb  Aligned DMM definitions with Symbian
 *! 08-Mar-2004 sb  Added the Dynamic Memory Mapping structs & offsets
 *! 15-Oct-2002 kc  Updated definitions for private PERF module.
 *! 16-Aug-2002 map Added ARGS_MGR_REGISTEROBJECT & ARGS_MGR_UNREGISTEROBJECT
 *!                 Added CMD_MGR_REGISTEROBJECT_OFFSET &
 *!                 CMD_MGR_UNREGISTEROBJECT_OFFSET
 *! 15-Jan-2002 ag  Added actaul bufSize to ARGS_STRM_[RECLAIM][ISSUE].
 *! 15-Nov-2001 ag  change to STRMINFO in ARGS_STRM_GETINFO.
 *! 11-Sep-2001 ag  ARGS_CMM_GETHANDLE defn uses DSP_HPROCESSOR.
 *! 23-Apr-2001 jeh Added pStatus to NODE_TERMINATE args.
 *! 13-Feb-2001 kc  DSP/BIOS Bridge name updates.
 *! 22-Nov-2000 kc: Added CMD_MGR_GETPERF_DATA_OFFSET for acquiring PERF stats.
 *! 27-Oct-2000 jeh Added timeouts to NODE_GETMESSAGE, NODE_PUTMESSAGE args.
 *!                 Removed NODE_GETMESSAGESTRM args.
 *! 11-Oct-2000 ag: Added SM mgr(CMM) args.
 *! 27-Sep-2000 jeh Removed struct DSP_BUFFERATTR param from ARGS_STRM_ALLOCATEBUFFER.
 *! 25-Sep-2000 rr: Updated to Version 0.9
 *! 07-Sep-2000 jeh Changed HANDLE to DSP_HNOTIFICATION in RegisterNotify args.
 *!                 Added DSP_STRMATTR to DSPNode_Connect args.
 *! 04-Aug-2000 rr: MEM and UTIL added to RM.
 *! 27-Jul-2000 rr: NODE, MGR,STRM and PROC added
 *! 27-Jun-2000 rr: Modifed to Use either PM or DSP/BIOS Bridge
 *!                 IFDEF to build for PM or DSP/BIOS Bridge
 *! 28-Jan-2000 rr: NT_CMD_FROM_OFFSET moved out to dsptrap.h
 *! 24-Jan-2000 rr: Merged with Scott's code.
 *! 21-Jan-2000 sg: In ARGS_CHNL_GETMODE changed mode to be ULONG to be
 *!                 consistent with chnldefs.h.
 *! 11-Jan-2000 rr: CMD_CFG_GETCDVERSION_OFFSET added.
 *! 12-Nov-1999 rr: CMD_BRD_MONITOR_OFFSET added
 *! 09-Nov-1999 kc: Added MEMRY and enabled CMD_BRD_IOCTL_OFFSET.
 *! 05-Nov-1999 ag: Added CHNL.
 *! 02-Nov-1999 kc: Removed field from ARGS_UTIL_TESTDLL.
 *! 29-Oct-1999 kc: Cleaned up for code review.
 *! 08-Oct-1999 rr: Util control offsets added.
 *! 13-Sep-1999 kc: Added ARGS_UTIL_TESTDLL for PM test infrastructure.
 *! 19-Aug-1999 rr: Created from WSX. Minimal Implementaion of BRD_Start and BRD
 *!                 and BRD_Stop. IOCTL Offsets and CTRL Code.
 */

#ifndef WCDIOCTL_
#define WCDIOCTL_

#include <mem.h>
#include <cmm.h>
#include <strmdefs.h>
#include <dbdcd.h>

typedef union {

	/* MGR Module */
	struct {
		UINT uNode;
		struct DSP_NDBPROPS *pNDBProps;
		UINT uNDBPropsSize;
		UINT *puNumNodes;
	} ARGS_MGR_ENUMNODE_INFO;

	struct {
		UINT uProcessor;
		struct DSP_PROCESSORINFO *pProcessorInfo;
		UINT uProcessorInfoSize;
		UINT *puNumProcs;
	} ARGS_MGR_ENUMPROC_INFO;

	struct {
		struct DSP_UUID *pUuid;
		DSP_DCDOBJTYPE objType;
		CHAR *pszPathName;
	} ARGS_MGR_REGISTEROBJECT;

	struct {
		struct DSP_UUID *pUuid;
		DSP_DCDOBJTYPE objType;
	} ARGS_MGR_UNREGISTEROBJECT;

	struct {
		struct DSP_NOTIFICATION* *aNotifications;
		UINT uCount;
		UINT *puIndex;
		UINT uTimeout;
	} ARGS_MGR_WAIT;

	/* PROC Module */
	struct {
		UINT uProcessor;
		struct DSP_PROCESSORATTRIN *pAttrIn;
		DSP_HPROCESSOR *phProcessor;
	} ARGS_PROC_ATTACH;

	struct {
		DSP_HPROCESSOR hProcessor;
		ULONG dwCmd;
		struct DSP_CBDATA *pArgs;
	} ARGS_PROC_CTRL;

	struct {
		DSP_HPROCESSOR hProcessor;
	} ARGS_PROC_DETACH;

	struct {
		DSP_HPROCESSOR hProcessor;
		DSP_HNODE *aNodeTab;
		UINT uNodeTabSize;
		UINT *puNumNodes;
		UINT *puAllocated;
	} ARGS_PROC_ENUMNODE_INFO;

	struct {
		DSP_HPROCESSOR hProcessor;
		UINT uResourceType;
		struct DSP_RESOURCEINFO *pResourceInfo;
		UINT uResourceInfoSize;
	} ARGS_PROC_ENUMRESOURCES;

	struct {
		DSP_HPROCESSOR hProcessor;
		struct DSP_PROCESSORSTATE *pProcStatus;
		UINT uStateInfoSize;
	} ARGS_PROC_GETSTATE;

	struct {
		DSP_HPROCESSOR hProcessor;
		BYTE *pBuf;

	#ifndef RES_CLEANUP_DISABLE
	    BYTE *  pSize;
    #endif
		UINT uMaxSize;
	} ARGS_PROC_GETTRACE;

	struct {
		DSP_HPROCESSOR hProcessor;
		INT iArgc;
		CHAR **aArgv;
		CHAR **aEnvp;
	} ARGS_PROC_LOAD;

	struct {
		DSP_HPROCESSOR hProcessor;
		UINT uEventMask;
		UINT uNotifyType;
		struct DSP_NOTIFICATION* hNotification;
	} ARGS_PROC_REGISTER_NOTIFY;

	struct {
		DSP_HPROCESSOR hProcessor;
	} ARGS_PROC_START;

	struct {
		DSP_HPROCESSOR hProcessor;
		ULONG ulSize;
		PVOID *ppRsvAddr;
	} ARGS_PROC_RSVMEM;

	struct {
		DSP_HPROCESSOR hProcessor;
		ULONG ulSize;
		PVOID pRsvAddr;
	} ARGS_PROC_UNRSVMEM;

	struct {
		DSP_HPROCESSOR hProcessor;
		PVOID pMpuAddr;
		ULONG ulSize;
		PVOID pReqAddr;
		PVOID *ppMapAddr;
		ULONG ulMapAttr;
	} ARGS_PROC_MAPMEM;

	struct {
		DSP_HPROCESSOR hProcessor;
		ULONG ulSize;
		PVOID pMapAddr;
	} ARGS_PROC_UNMAPMEM;

	struct {
		DSP_HPROCESSOR hProcessor;
		PVOID pMpuAddr;
		ULONG ulSize;
		ULONG ulFlags;
	} ARGS_PROC_FLUSHMEMORY;

	struct {
		DSP_HPROCESSOR hProcessor;
	} ARGS_PROC_STOP;

	struct {
                DSP_HPROCESSOR hProcessor;
                PVOID pMpuAddr;
                ULONG ulSize;
        } ARGS_PROC_INVALIDATEMEMORY;


	/* NODE Module */
	struct {
		DSP_HPROCESSOR hProcessor;
		struct DSP_UUID *pNodeID;
		struct DSP_CBDATA *pArgs;
		struct DSP_NODEATTRIN *pAttrIn;
		DSP_HNODE *phNode;
	} ARGS_NODE_ALLOCATE;

	struct {
		DSP_HNODE hNode;
		UINT uSize;
		struct DSP_BUFFERATTR *pAttr;
		BYTE **pBuffer;
	} ARGS_NODE_ALLOCMSGBUF;

	struct {
		DSP_HNODE hNode;
		INT iPriority;
	} ARGS_NODE_CHANGEPRIORITY;

	struct {
		DSP_HNODE hNode;
		UINT uStream;
		DSP_HNODE hOtherNode;
		UINT uOtherStream;
		struct DSP_STRMATTR *pAttrs;
		struct DSP_CBDATA *pConnParam;
	} ARGS_NODE_CONNECT;

	struct {
		DSP_HNODE hNode;
	} ARGS_NODE_CREATE;

	struct {
		DSP_HNODE hNode;
	} ARGS_NODE_DELETE;

	struct {
		DSP_HNODE hNode;
		struct DSP_BUFFERATTR *pAttr;
		BYTE *pBuffer;
	} ARGS_NODE_FREEMSGBUF;

	struct {
		DSP_HNODE hNode;
		struct DSP_NODEATTR *pAttr;
		UINT uAttrSize;
	} ARGS_NODE_GETATTR;

	struct {
		DSP_HNODE hNode;
		struct DSP_MSG *pMessage;
		UINT uTimeout;
	} ARGS_NODE_GETMESSAGE;

	struct {
		DSP_HNODE hNode;
	} ARGS_NODE_PAUSE;

	struct {
		DSP_HNODE hNode;
		struct DSP_MSG *pMessage;
		UINT uTimeout;
	} ARGS_NODE_PUTMESSAGE;

	struct {
		DSP_HNODE hNode;
		UINT uEventMask;
		UINT uNotifyType;
		struct DSP_NOTIFICATION* hNotification;
	} ARGS_NODE_REGISTERNOTIFY;

	struct {
		DSP_HNODE hNode;
	} ARGS_NODE_RUN;

	struct {
		DSP_HNODE hNode;
		DSP_STATUS *pStatus;
	} ARGS_NODE_TERMINATE;

	struct {
		DSP_HPROCESSOR hProcessor;
		struct DSP_UUID *pNodeID;
		struct DSP_NDBPROPS *pNodeProps;
	} ARGS_NODE_GETUUIDPROPS;

        /* STRM module */

	struct {
		DSP_HSTREAM hStream;
		UINT uSize;
		BYTE **apBuffer;
		UINT uNumBufs;
	} ARGS_STRM_ALLOCATEBUFFER;

	struct {
		DSP_HSTREAM hStream;
	} ARGS_STRM_CLOSE;

	struct {
		DSP_HSTREAM hStream;
		BYTE **apBuffer;
		UINT uNumBufs;
	} ARGS_STRM_FREEBUFFER;

	struct {
		DSP_HSTREAM hStream;
		HANDLE *phEvent;
	} ARGS_STRM_GETEVENTHANDLE;

	struct {
		DSP_HSTREAM hStream;
		struct STRM_INFO *pStreamInfo;
		UINT uStreamInfoSize;
	} ARGS_STRM_GETINFO;

	struct {
		DSP_HSTREAM hStream;
		bool bFlush;
	} ARGS_STRM_IDLE;

	struct {
		DSP_HSTREAM hStream;
		BYTE *pBuffer;
		ULONG dwBytes;
		ULONG dwBufSize;
		DWORD dwArg;
	} ARGS_STRM_ISSUE;

	struct {
		DSP_HNODE hNode;
		UINT uDirection;
		UINT uIndex;
		struct STRM_ATTR *pAttrIn;
		DSP_HSTREAM *phStream;
	} ARGS_STRM_OPEN;

	struct {
		DSP_HSTREAM hStream;
		BYTE **pBufPtr;
		ULONG *pBytes;
		ULONG *pBufSize;
		DWORD *pdwArg;
	} ARGS_STRM_RECLAIM;

	struct {
		DSP_HSTREAM hStream;
		UINT uEventMask;
		UINT uNotifyType;
		struct DSP_NOTIFICATION* hNotification;
	} ARGS_STRM_REGISTERNOTIFY;

	struct {
		DSP_HSTREAM *aStreamTab;
		UINT nStreams;
		UINT *pMask;
		UINT uTimeout;
	} ARGS_STRM_SELECT;

	/* CMM Module */
	struct {
		struct CMM_OBJECT* hCmmMgr;
		UINT uSize;
		struct CMM_ATTRS *pAttrs;
		OUT PVOID *ppBufVA;
	} ARGS_CMM_ALLOCBUF;

	struct {
		struct CMM_OBJECT* hCmmMgr;
		PVOID pBufPA;
		ULONG ulSegId;
	} ARGS_CMM_FREEBUF;

	struct {
		DSP_HPROCESSOR hProcessor;
		struct CMM_OBJECT* *phCmmMgr;
	} ARGS_CMM_GETHANDLE;

	struct {
		struct CMM_OBJECT* hCmmMgr;
		struct CMM_INFO *pCmmInfo;
	} ARGS_CMM_GETINFO;

	/* MEM Module */
	struct {
		ULONG cBytes;
		MEM_POOLATTRS type;
		PVOID pMem;
	} ARGS_MEM_ALLOC;

	struct {
		ULONG cBytes;
		MEM_POOLATTRS type;
		PVOID pMem;
	} ARGS_MEM_CALLOC;

	struct {
		PVOID pMem;
	} ARGS_MEM_FREE;

	struct {
		PVOID pBuffer;
		ULONG cSize;
		PVOID pLockedBuffer;
	} ARGS_MEM_PAGELOCK;

	struct {
		PVOID pBuffer;
		ULONG cSize;
	} ARGS_MEM_PAGEUNLOCK;

	/* UTIL module */
	struct {
		INT cArgc;
		CHAR **ppArgv;
	} ARGS_UTIL_TESTDLL;

} Trapped_Args;

#define CMD_BASE                    100

/* MGR module offsets */
#define CMD_MGR_BASE_OFFSET             CMD_BASE
#define CMD_MGR_ENUMNODE_INFO_OFFSET    (CMD_MGR_BASE_OFFSET + 0)
#define CMD_MGR_ENUMPROC_INFO_OFFSET    (CMD_MGR_BASE_OFFSET + 1)
#define CMD_MGR_REGISTEROBJECT_OFFSET   (CMD_MGR_BASE_OFFSET + 2)
#define CMD_MGR_UNREGISTEROBJECT_OFFSET (CMD_MGR_BASE_OFFSET + 3)
#define CMD_MGR_WAIT_OFFSET             (CMD_MGR_BASE_OFFSET + 4)

#ifndef RES_CLEANUP_DISABLE
#define CMD_MGR_RESOUCES_OFFSET         (CMD_MGR_BASE_OFFSET + 5)
#define CMD_MGR_END_OFFSET              CMD_MGR_RESOUCES_OFFSET
#else
#define CMD_MGR_END_OFFSET              CMD_MGR_WAIT_OFFSET
#endif

#define CMD_PROC_BASE_OFFSET            (CMD_MGR_END_OFFSET + 1)
#define CMD_PROC_ATTACH_OFFSET          (CMD_PROC_BASE_OFFSET + 0)
#define CMD_PROC_CTRL_OFFSET            (CMD_PROC_BASE_OFFSET + 1)
#define CMD_PROC_DETACH_OFFSET          (CMD_PROC_BASE_OFFSET + 2)
#define CMD_PROC_ENUMNODE_OFFSET        (CMD_PROC_BASE_OFFSET + 3)
#define CMD_PROC_ENUMRESOURCES_OFFSET   (CMD_PROC_BASE_OFFSET + 4)
#define CMD_PROC_GETSTATE_OFFSET        (CMD_PROC_BASE_OFFSET + 5)
#define CMD_PROC_GETTRACE_OFFSET        (CMD_PROC_BASE_OFFSET + 6)
#define CMD_PROC_LOAD_OFFSET            (CMD_PROC_BASE_OFFSET + 7)
#define CMD_PROC_REGISTERNOTIFY_OFFSET  (CMD_PROC_BASE_OFFSET + 8)
#define CMD_PROC_START_OFFSET           (CMD_PROC_BASE_OFFSET + 9)
#define CMD_PROC_RSVMEM_OFFSET          (CMD_PROC_BASE_OFFSET + 10)
#define CMD_PROC_UNRSVMEM_OFFSET        (CMD_PROC_BASE_OFFSET + 11)
#define CMD_PROC_MAPMEM_OFFSET          (CMD_PROC_BASE_OFFSET + 12)
#define CMD_PROC_UNMAPMEM_OFFSET        (CMD_PROC_BASE_OFFSET + 13)
#define CMD_PROC_FLUSHMEMORY_OFFSET      (CMD_PROC_BASE_OFFSET + 14)
#define CMD_PROC_STOP_OFFSET            (CMD_PROC_BASE_OFFSET + 15)
#define CMD_PROC_INVALIDATEMEMORY_OFFSET (CMD_PROC_BASE_OFFSET + 16)
#define CMD_PROC_END_OFFSET             CMD_PROC_INVALIDATEMEMORY_OFFSET


#define CMD_NODE_BASE_OFFSET            (CMD_PROC_END_OFFSET + 1)
#define CMD_NODE_ALLOCATE_OFFSET        (CMD_NODE_BASE_OFFSET + 0)
#define CMD_NODE_ALLOCMSGBUF_OFFSET     (CMD_NODE_BASE_OFFSET + 1)
#define CMD_NODE_CHANGEPRIORITY_OFFSET  (CMD_NODE_BASE_OFFSET + 2)
#define CMD_NODE_CONNECT_OFFSET         (CMD_NODE_BASE_OFFSET + 3)
#define CMD_NODE_CREATE_OFFSET          (CMD_NODE_BASE_OFFSET + 4)
#define CMD_NODE_DELETE_OFFSET          (CMD_NODE_BASE_OFFSET + 5)
#define CMD_NODE_FREEMSGBUF_OFFSET      (CMD_NODE_BASE_OFFSET + 6)
#define CMD_NODE_GETATTR_OFFSET         (CMD_NODE_BASE_OFFSET + 7)
#define CMD_NODE_GETMESSAGE_OFFSET      (CMD_NODE_BASE_OFFSET + 8)
#define CMD_NODE_PAUSE_OFFSET           (CMD_NODE_BASE_OFFSET + 9)
#define CMD_NODE_PUTMESSAGE_OFFSET      (CMD_NODE_BASE_OFFSET + 10)
#define CMD_NODE_REGISTERNOTIFY_OFFSET  (CMD_NODE_BASE_OFFSET + 11)
#define CMD_NODE_RUN_OFFSET             (CMD_NODE_BASE_OFFSET + 12)
#define CMD_NODE_TERMINATE_OFFSET       (CMD_NODE_BASE_OFFSET + 13)
#define CMD_NODE_GETUUIDPROPS_OFFSET    (CMD_NODE_BASE_OFFSET + 14)
#define CMD_NODE_END_OFFSET             CMD_NODE_GETUUIDPROPS_OFFSET

#define CMD_STRM_BASE_OFFSET            (CMD_NODE_END_OFFSET + 1)
#define CMD_STRM_ALLOCATEBUFFER_OFFSET  (CMD_STRM_BASE_OFFSET + 0)
#define CMD_STRM_CLOSE_OFFSET           (CMD_STRM_BASE_OFFSET + 1)
#define CMD_STRM_FREEBUFFER_OFFSET      (CMD_STRM_BASE_OFFSET + 2)
#define CMD_STRM_GETEVENTHANDLE_OFFSET  (CMD_STRM_BASE_OFFSET + 3)
#define CMD_STRM_GETINFO_OFFSET         (CMD_STRM_BASE_OFFSET + 4)
#define CMD_STRM_IDLE_OFFSET            (CMD_STRM_BASE_OFFSET + 5)
#define CMD_STRM_ISSUE_OFFSET           (CMD_STRM_BASE_OFFSET + 6)
#define CMD_STRM_OPEN_OFFSET            (CMD_STRM_BASE_OFFSET + 7)
#define CMD_STRM_RECLAIM_OFFSET         (CMD_STRM_BASE_OFFSET + 8)
#define CMD_STRM_REGISTERNOTIFY_OFFSET  (CMD_STRM_BASE_OFFSET + 9)
#define CMD_STRM_SELECT_OFFSET          (CMD_STRM_BASE_OFFSET + 10)
#define CMD_STRM_END_OFFSET             CMD_STRM_SELECT_OFFSET

/* Communication Memory Manager (UCMM) */
#define CMD_CMM_BASE_OFFSET             (CMD_STRM_END_OFFSET + 1)
#define CMD_CMM_ALLOCBUF_OFFSET         (CMD_CMM_BASE_OFFSET + 0)
#define CMD_CMM_FREEBUF_OFFSET          (CMD_CMM_BASE_OFFSET + 1)
#define CMD_CMM_GETHANDLE_OFFSET        (CMD_CMM_BASE_OFFSET + 2)
#define CMD_CMM_GETINFO_OFFSET          (CMD_CMM_BASE_OFFSET + 3)
#define CMD_CMM_END_OFFSET              CMD_CMM_GETINFO_OFFSET

/* MEMRY module offsets */
#define CMD_MEM_BASE_OFFSET             (CMD_CMM_END_OFFSET + 1)
#define CMD_MEM_ALLOC_OFFSET            (CMD_MEM_BASE_OFFSET + 0)
#define CMD_MEM_CALLOC_OFFSET           (CMD_MEM_BASE_OFFSET + 1)
#define CMD_MEM_FREE_OFFSET             (CMD_MEM_BASE_OFFSET + 2)
#define CMD_MEM_PAGELOCK_OFFSET         (CMD_MEM_BASE_OFFSET + 3)
#define CMD_MEM_PAGEUNLOCK_OFFSET       (CMD_MEM_BASE_OFFSET + 4)
#define CMD_MEM_END_OFFSET              CMD_MEM_PAGEUNLOCK_OFFSET

/* UTIL module */
#define CMD_UTIL_BASE_OFFSET            (CMD_MEM_END_OFFSET + 1)
#define CMD_UTIL_TESTDLL_OFFSET         (CMD_UTIL_BASE_OFFSET + 0)
#define CMD_UTIL_END_OFFSET             CMD_UTIL_TESTDLL_OFFSET

/* !!! place all command modules before CMD_BASE_END_OFFSET */
#define CMD_BASE_END_OFFSET             CMD_UTIL_END_OFFSET

#endif				/* WCDIOCTL_ */