/*
 * Copyright (c) 2003 Linuxant inc.
 * Copyright (c) 2001-2003 Conexant Systems, Inc.
 *
 * NOTE: The use and distribution of this software is governed by the terms in
 * the file LICENSE, which is included in the package. You must read this and
 * agree to these terms before using or distributing this software.
 *
 */
#ifndef __MEMORY_H__
#define __MEMORY_H__

#include "osstring_ex.h"

#if ( USE_PRAGMA_PACK == 1 )
#pragma pack(push,1)   /* Packing compatible with WinAC */
#endif
 
#if ( OS_TYPE != OS_LINUX )
/* Define Vtoolsd constants */
#define OS_HEAPZEROINIT		0x00000001    
#define OS_HEAPZEROREINIT	0x00000002  

#define OS_HEAPSWAP			0x00000200 

#define OS_NON_PAGED		(UINT32)0
#define OS_FIXED			0x00000008

#define OS_ZEROINIT			0x00000001	
#define OS_FIXEDZERO		0x00000003		

#define OS_PAGED			OS_HEAPSWAP

#else
#define OS_PAGED			0
#define OS_NON_PAGED		1

#define OS_FIXED			OS_NON_PAGED
#define OS_HEAPSWAP			OS_PAGED

#define OS_ZEROINIT			0x00000001	
#define OS_FIXEDZERO		0x00000003		
#endif

#if (PRJ_FLAVOUR == PRJFLVR_CYPRUS)
#define OsAllocate(x) OsHeapAllocate(x,OS_NON_PAGED)
#define OsFree OsHeapFree
#endif
 
#ifdef __cplusplus
extern "C"
{
#endif
/********************************************************************************
	
	Function Name: OsPageCommit.

	Function Description:The function commits a memory space.

	Arguments: iPage - the base address of the memory space.
			   nPages - number of pages to be commited.
	
	Return Value: BOOL.

	********************************************************************************/
#if (OS_TYPE == OS_LINUX)
#define OsPageCommit(iPage, nPages, PageData, flags) TRUE
#else
	StdCall(BOOL, OsPageCommit(UINT32 iPage, UINT32 nPages, UINT32 PageData, UINT32 flags));
#endif

	/********************************************************************************
	
	Function Name: OsPageDecommit.

	Function Description:The function decommits a given memory space.

	Arguments: iPage - the base address of the memory space.
			   nPages - number of pages to be commited.
	
	Return Value: BOOL.

	********************************************************************************/
#if (OS_TYPE == OS_LINUX)
#define OsPageDecommit(iPage, nPages) TRUE
#else
	StdCall(BOOL,OsPageDecommit(UINT32 iPage, UINT32 nPages)) ;
#endif

	/********************************************************************************
	
	Function Name: OsPageReserve.

	Function Description:The function reserves a given memory space.

	Arguments: Size - the size of memory space to br reserved.
			   Flags - the flags that should be send to the reserve funcyion.
	
	Return Value: BOOL.

	********************************************************************************/
	StdCall(PVOID, OsPageReserve(UINT32 Size, UINT32 Flags));

	/********************************************************************************
	
	Function Name: OsPageFree.

	Function Description:The function frees a given memory space.

	Arguments: iPages - the base address of the memory space.
			   nPages - number of pages to free.
	

	Return Value: BOOL.
	********************************************************************************/
	StdCall(BOOL, OsPageFree(PVOID	pMem, UINT32 nPages));

	/********************************************************************************
	
	Function Name: OsHeapAllocate.

	Function Description:The function allocates a given memory space and initializes it to zero.

	Arguments: Size - the size of memory space (heap) to br allocated.
	
	Return Value: PVOID - a pointer to the allocated memory.

	********************************************************************************/
	StdCall(PVOID, OsHeapAllocate(UINT32 Size, int flags));

	/********************************************************************************
	
	Function Name: OsHeapFree.

	Function Description:The function frees a memory space.

	Arguments: pMem - a pointer to the memory to be frees.
	
	Return Value: None.

	********************************************************************************/
	StdCall(void, OsHeapFree(PVOID pMem));

	/********************************************************************************
	
	Function Name: OsGetPageSize.

	Function Description:The function returns the size of a page in the specific OS.

	Arguments: None.
	
	Return Value: The size of a page in the specific OS.

	********************************************************************************/
	StdCall(UINT32, OsGetPageSize(void));

	/********************************************************************************
	
	Function Name: OsMemDMAAllocate.

	Function Description:The function allocate a dma.

	Arguments: nPages - number of page to allocate..
			   ppPhysAddr - a pointer to be filled with the physical address of the dma.
			   pMemHandle - a pointer to be filled with the memory handle.
			   ppBuffer - a pointer to be filled with the ring-0 linear memory address.
	
	Return Value: boolean.

	********************************************************************************/
#if (PROJECT == PRJ_SDSL)
	StdCall(BOOL, OsMemDMAAllocate(UINT32 nPages,UINT16 **ppPhysAddr, HANDLE *pMemHandle, UINT16 **ppBuffer, PVOID pResources));
#else	
	StdCall(BOOL,OsMemDMAAllocate(UINT32 nPages,PUINT16* ppPhysAddr, HANDLE *pMemHandle, PUINT16* ppBuffer));
#endif

	/********************************************************************************
	
	Function Name: OsMemDMAFree.

	Function Description:The function allocate a dma.

	Arguments: MemHandle - a memory handle.
			   Flags - flags.
	
	Return Value: boolean.

	********************************************************************************/
	StdCall(BOOL, OsMemDMAFree(HANDLE MemHandle, UINT32 nPages));
	/********************************************************************************
	
	Function Name: OsAllignmentAlloc.
 
	Function Description:The function allocate a memory alligned on a 2**AllognLog2.
 
	Arguments: ppMem    -  Actual allocation pointer ( not alligned  ) to be called to 
                            OsFree function
			   ppAllignedMem    - Alligned allocation.
               AllocaSize       - number of bytes to alloc
               AllognLog2       - log2 of number of bytes allignment
	
	Return Value: None  .
 
	********************************************************************************/
	StdCall(VOID, OsAllignmentAlloc(  OUT VOID    **ppMem, 
                                OUT VOID    **ppAllignedMem, 
                                IN  int     AllocaSize,
                                IN  int     AllognLog2));
	/********************************************************************************/
	void    OsDebugBreakpoint   ( const char * szMsg );
	void    OsDebugPrintf       ( const char * szFormat, ...);
	/********************************************************************************/
 
	
#ifdef __cplusplus
}
#endif

#if ( USE_PRAGMA_PACK == 1 )
#pragma pack(pop)   /* Packing compatible with our VXDs */
#endif

#endif /*__MEMORY_H__*/
