/**************************************************************************
 *									  *
 *		 Copyright (C) 1994, Silicon Graphics, Inc.		  *
 *									  *
 *  These coded instructions, statements, and computer programs  contain  *
 *  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
 *  are protected by Federal copyright law.  They  may  not be disclosed  *
 *  to  third  parties  or copied or duplicated in any form, in whole or  *
 *  in part, without the prior written consent of Silicon Graphics, Inc.  *
 *									  *
 **************************************************************************/

/**************************************************************************
 *
 *  Module: region.h
 *
 *  $Revision: 1.8 $
 *  $Date: 1997/11/26 00:30:56 $
 *  $Author: mitu $
 *  $Source: /hosts/gate3/exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/region.h,v $
 *
 *  Description:
 *      This file contains macros and structure definitions for the region
 *	library.
 *
 **************************************************************************/


#ifndef _REGION_H_
#define _REGION_H_


#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif

#include <PR/ultratypes.h>


/***************************************
 *
 * Global defines 
 *
 */
					/* Alignment sizes */
#define	ALIGNSZ			(sizeof(long long))	/* 8 bytes */
#define	ALIGNOFFST		(ALIGNSZ-1)	

				/* size for storing index to free buffer */
#define	BUF_CTRL_SIZE		ALIGNSZ		

				/* Max bufcount = 32K */
#define	MAX_BUFCOUNT		0x8000	
				/* code for last free buffer */
#define	BUF_FREE_WO_NEXT	0x8000	

/*
 * Global defines for alignment size (default is 8-byte alignment)
 */
#define OS_RG_ALIGN_2B		2	/*  2 bytes =  16-bit alignment */
#define OS_RG_ALIGN_4B		4	/*  4 bytes =  32-bit alignment */
#define OS_RG_ALIGN_8B		8	/*  8 bytes =  64-bit alignment */
#define OS_RG_ALIGN_16B		16	/* 16 bytes = 128-bit alignment */

#define OS_RG_ALIGN_DEFAULT	OS_RG_ALIGN_8B


/***************************************
 *
 * Macro definitions
 *
 */

/* Perform alignment on input 's' */
#define	ALIGN(s, align)	(((u32)(s) + ((align)-1)) & ~((align)-1))


/***************************************
 *
 * Typedefs & structure definitions
 *
 */
/*
 * Structure for region header/control area 
 */
typedef struct _Region_s {
	u8	*r_startBufferAddress;	/* start address to data buffer */
	u8	*r_endAddress;		/* end address of region */
	s32	r_bufferSize;		/* size of buffers for this region */
	s32	r_bufferCount;		/* up to 32K entries; MSB is used for 
					   setting end-of-list/used */
	u16 	r_freeList;		/* point to array index of first 
					   available memory buffer */
	u16 	r_alignSize;		/* alignment size (# of bytes) */
} OSRegion;

/*
 * Macro to simplify accessing region header structure
 */
#define	RP(x)		rp->r_##x


/***************************************
 *
 * Function prototypes
 *
 */
extern void	*osCreateRegion(void *, u32, u32, u32);
extern void 	*osMalloc(void *); 
extern void	osFree(void *, void *); 
extern s32	osGetRegionBufCount(void *); 
extern s32	osGetRegionBufSize(void *); 


#ifdef _LANGUAGE_C_PLUS_PLUS
}
#endif


#endif  /* _REGION_H_ */