/*
 *  Copyright (c) 2009 Mindspeed Technologies, Inc.
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or (at your option) any later version.

 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.

 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 *
 */


#ifndef _FASTPART_H_
#define _FASTPART_H_

#include "types.h"
#include "system.h"

typedef struct tagFASTPART {
	volatile U8 lock;
	U8 reserved1;
	U32 * volatile freeblk;	// free block to allocate
	U32 *storage;			// storage start address
	U32 blksz;				// block size DWORDs!
	U32 blkcnt;				// block count 
	U32 *end_of_storage;	// storage end address
	U16 reserved2;	
	U16 reserved3;	
	U16 freecnt;			 // number of available blocks
} FASTPART, *PFASTPART;


void	SFL_defpart(FASTPART *fp, void *storage, U32 blksz, U32 blkcnt) __attribute__ ((noinline));

static __inline void *SFL_alloc_part_lock(FASTPART *fp)
{
	U32 *p;
	DISABLE_INTERRUPTS();
	
	p = fp->freeblk;
	if (p){
		fp->freeblk = (U32 *)(*p);
		//fp->freecnt--;
	}
	ENABLE_INTERRUPTS();
	return (void *)p;
}



static __inline void *SFL_alloc_part(FASTPART *fp)
{
	U32 *p;

	p = fp->freeblk;
	if (p){
		fp->freeblk = (U32 *)(*p);
		//fp->freecnt--;
	}
	return (void *)p;
}


static __inline void SFL_free_part(FASTPART *fp, void *blk)
{

	*(U32 *)blk = (U32)fp->freeblk;
	fp->freeblk =  blk;
	//fp->freecnt++;
}

void *SFL_alloc_partlist(FASTPART *fp, U32 cnt, U32* nb);
U32 SFL_free_partlist(FASTPART *fp, void *blk, void* last, U32 n);

static __inline int SFL_querysize_part(FASTPART *fp) {
    // report max number of poolA buffers which are held under mtds
    return fp->blkcnt;
}

#endif /* _FASTPART_H_ */
