2020-09-30 17:17:25 +02:00

135 lines
4.8 KiB
C

#ifndef _HEAP_H_
#define _HEAP_H_
//
// (C) Copyright NVIDIA Corporation Inc., 1995-2000. All rights reserved.
//
/*********************** Heap manager data structures **********************\
* *
* Module: HEAP.H *
* Heap manager for allocating memory based on usage and *
* memory configuration. *
* *
*****************************************************************************
* *
* History: *
* David Schmenk (dschmenk) 05/19/98 - wrote it. *
* *
\***************************************************************************/
typedef struct
{
U032 offset;
U032 size;
U032 flags;
} MEMBANK, *PMEMBANK;
typedef struct def_block
{
U032 owner;
U032 mhandle;
U032 begin;
U032 align;
U032 end;
union
{
U032 type;
struct def_block *prevFree;
} u0;
union
{
U032 hwres;
struct def_block *nextFree;
} u1;
struct def_block *prev;
struct def_block *next;
} MEMBLOCK, *PMEMBLOCK;
typedef struct
{
U008 *base;
U032 total;
U032 free;
MEMBLOCK *pBlockList;
MEMBLOCK *pFreeBlockList;
U032 numBanks;
U032 memHandle;
U032 memTypeFlags[11];
MEMBANK Bank[1];
} HEAP, *PHEAP;
//
// Handy heap macros.
//
//#define BLOCK_OFFSET(bp) ((bp)->offset+(bp)->align)
//#define BLOCK_ADDRESS(hp,bp) ((hp)->base+(bp)->offset+(bp)->align)
//
// Pre-defined no-owner ID - i.e. free.
//
#define FREE_BLOCK 0xFFFFFFFF
//
// Types of memory to allocate.
//
#ifndef BIT
#define BIT(b) (1<<(b))
#endif
#define MEM_GROW_UP 0x00000000
#define MEM_GROW_DOWN 0x80000000
#define MEM_GROW_MASK 0x80000000
#define MEM_TYPE_IMAGE 0
#define MEM_TYPE_DEPTH 1
#define MEM_TYPE_TEXTURE 2
#define MEM_TYPE_OVERLAY 3
#define MEM_TYPE_FONT 4
#define MEM_TYPE_CURSOR 5
#define MEM_TYPE_DMA 6
#define MEM_TYPE_INSTANCE 7
#define MEM_TYPE_PRIMARY 8
#define MEM_TYPE_IMAGE_TILED 9
#define MEM_TYPE_DEPTH_COMPR16 10
#define MEM_TYPE_DEPTH_COMPR32 11
#define MEM_TYPE_MAX 11
#define MEM_TYPE_MASK 0x0000FFFF
#define MEM_TYPE_IGNORE_BANK_PLACEMENT_FLAG 0x00010000
#define MEM_TYPE_FORCE_MEM_GROWS_UP_FLAG 0x00020000
#define MEM_TYPE_FORCE_MEM_GROWS_DOWN_FLAG 0x00040000
#define MEM_FLAG_IMAGE BIT(MEM_TYPE_IMAGE)
#define MEM_FLAG_DEPTH BIT(MEM_TYPE_DEPTH)
#define MEM_FLAG_TEXTURE BIT(MEM_TYPE_TEXTURE)
#define MEM_FLAG_OVERLAY BIT(MEM_TYPE_OVERLAY)
#define MEM_FLAG_FONT BIT(MEM_TYPE_FONT)
#define MEM_FLAG_CURSOR BIT(MEM_TYPE_CURSOR)
#define MEM_FLAG_DMA BIT(MEM_TYPE_DMA)
#define MEM_FLAG_INSTANCE BIT(MEM_TYPE_INSTANCE)
#define MEM_FLAG_PRIMARY BIT(MEM_TYPE_PRIMARY)
#define MEM_FLAG_IMAGE_TILED BIT(MEM_TYPE_IMAGE_TILED)
#define MEM_FLAG_DEPTH_COMPR16 BIT(MEM_TYPE_DEPTH_COMPR16)
#define MEM_FLAG_DEPTH_COMPR32 BIT(MEM_TYPE_DEPTH_COMPR32)
#define MEM_TYPE_HEAD_MASK 0x80000000
#define MEM_TYPE_HEAD_SHIFT 31
// bits kept in MEMBLOCK->type indicating if/which HW tile range was allocated
#define MEM_TYPE_TILE_RANGE_SHIFT(i) (1 << (24+(i)))
#define MEM_TYPE_TILE_RANGE_MASK 0xFF000000
//---------------------------------------------------------------------------
//
// Function prototypes.
//
//---------------------------------------------------------------------------
RM_STATUS heapCreate(PHWINFO, U008 *, U032, U032, PHEAP *);
RM_STATUS heapDestroy(PHWINFO, PHEAP);
RM_STATUS heapAlloc(PHWINFO, PHEAP, U032, U032 *, U032, U032, U032 *, U032 *);
RM_STATUS heapFbSetAllocParameters(PHWINFO, PFBALLOCINFO);
RM_STATUS blockFree(PHWINFO, PHEAP, PMEMBLOCK);
RM_STATUS heapFree(PHWINFO, PHEAP, U032, U032, U032 *);
RM_STATUS heapPurge(PHWINFO, PHEAP, U032);
RM_STATUS heapInfo(PHEAP, U032 *, U032 *, VOID**, U032 *, U032 *);
RM_STATUS heapInfoFreeBlocks(PHEAP, U032 *, U032 *, U032, U032, U032 *);
RM_STATUS heapCompact(PHEAP);
RM_STATUS heapGetSize(PHEAP, U032 *);
RM_STATUS heapGetFree(PHEAP, U032 *);
RM_STATUS heapGetMaxFree(PHEAP, U032 *, U032 *);
RM_STATUS heapGetBase(PHEAP, U008 **);
#endif // _HEAP_H_