📄 m82xxdpramlib.c
字号:
/* m82xxDpramLib.c - 82xx DPRAM memory allocation driver */
/* Copyright 1984-2001 Wind River Systems, Inc. */
/*
modification history
--------------------
01e,27may05,fhc add head file for memset, bug fix in line 135 to avoid
run time hang
01d,26nov01,rcs renamed m82xxDpramLib.c and moved to target/src/drv/mem
01c,12oct01,g_h Cleaning for T2.2
01b,17jul01,g_h Cleaning and renaming to sys82xxDpramLib.c
01a,16jul01,p_h Created
*/
/*
DESCRIPTION
This module contains 82xx DPRAM memory allocation driver.
INCLUDES: m82xxDpramLib.h
*/
/* include */
#include "vxWorks.h"
#include "string.h" /* for memset */
#include "drv/mem/m82xxDpramLib.h"
/* gobals */
/* external */
IMPORT UINT32 vxImmrGet(void);
/* local */
LOCAL ADDR_RESOURCE addrResPool[ALLOCTABLESIZE];
LOCAL POOL dprMainPool;
LOCAL POOL dprFccPool;
/* forward declaration */
/*******************************************************************************
*
* m82xxDpramAlignedAddr - aligned a given address
*
* This routine aligned a given address.
*
* RETURNS: new aligned address
*
* SEE ALSO: m82xxDpramAllocRange(), m82xxDpramFindFreeEntry(),
* m82xxDpramAllocateRange(), m82xxDpramReleaseRenage(),
* m82xxDpramLibInit(), m82xxDpramMalloc(),
* m82xxDpramAlignedMalloc(), m82xxDpramFree(),
* m82xxDpramFccMalloc(), m82xxDpramFccFree()
*/
LOCAL UINT32 m82xxDpramAlignedAddr
(
UINT32 addr,
UINT32 alignment
)
{
if (alignment)
{
return ((addr + alignment - 1) & ~(alignment - 1));
}
return (addr);
}
/*******************************************************************************
*
* m82xxDpramAllocRange - alloc aligned memeory
*
* This routine alloc aligned memory
*
* RETURNS: OK
*
* SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramFindFreeEntry(),
* m82xxDpramAllocateRange(), m82xxDpramReleaseRenage(),
* m82xxDpramLibInit(), m82xxDpramMalloc(),
* m82xxDpramAlignedMalloc(), m82xxDpramFree(),
* m82xxDpramFccMalloc(), m82xxDpramFccFree()
*/
LOCAL void * m82xxDpramAllocRange
(
ADDR_RESOURCE * pNew,
UINT32 length,
UINT32 alignment,
POOL * pPool
)
{
ADDR_RESOURCE * pPrev;
ADDR_RESOURCE * pCurr;
UINT32 gapEnd;
UINT32 gapStart = 0;
pCurr = pPool->pHead;
pPrev = 0;
do
{
if (pPrev)
{
gapStart = m82xxDpramAlignedAddr (pPrev->start + pPrev->size, alignment);
}
else
{
gapStart = m82xxDpramAlignedAddr (pPool->start, alignment);
}
if (pCurr)
{
gapEnd = pCurr->start;
}
else
{
gapEnd = pPool->limit;
}
if (gapEnd > gapStart)
{
if ((gapEnd - gapStart) >= length)
{
pNew->start = gapStart;
pNew->size = length;
pNew->pNext = pCurr;
if (pPrev)
{
pPrev->pNext = pNew;
}
if (NULL == pPool->pHead)
{
pPool->pHead = pNew;
}
return ((void*)(pNew->start));
}
}
pPrev = pCurr;
if (pCurr)
{
pCurr = pCurr->pNext;
}
} while (pCurr || pPrev);
return (OK);
}
/*******************************************************************************
*
* m82xxDpramFindFreeEntry - find first entry in the linked list
*
* RETURNS: pointer to first free entry or 0 if every thing full
*
* SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
* m82xxDpramAllocateRange(), m82xxDpramReleaseRenage(),
* m82xxDpramLibInit(), m82xxDpramMalloc(),
* m82xxDpramAlignedMalloc(), m82xxDpramFree(),
* m82xxDpramFccMalloc(), m82xxDpramFccFree()
*/
LOCAL ADDR_RESOURCE * m82xxDpramFindFreeEntry
(
void
)
{
int index;
for (index=0;index<ALLOCTABLESIZE;index++)
{
if (addrResPool[index].start == 0)
{
return &addrResPool[index];
}
}
return (0);
}
/*******************************************************************************
*
* m82xxDpramAllocateRange - allocate a reange of memory
*
* This routine allocate a reange of memory from the DPRAM.
*
* RETURNS: pointer to allocated memory or 0 if the is no free memory
*
* SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
* m82xxDpramFindFreeEntry(), m82xxDpramReleaseRenage(),
* m82xxDpramLibInit(), m82xxDpramMalloc(),
* m82xxDpramAlignedMalloc(), m82xxDpramFree(),
* m82xxDpramFccMalloc(), m82xxDpramFccFree()
*/
LOCAL void * m82xxDpramAllocateRange
(
UINT32 requestedLength,
UINT32 alignment,
POOL * pPool
)
{
ADDR_RESOURCE * pNew;
if ((pNew = m82xxDpramFindFreeEntry ()) != NULL)
{
return m82xxDpramAllocRange (pNew, requestedLength, alignment ,pPool);
}
return 0;
}
/*******************************************************************************
*
* m82xxDpramReleaseRenage - release allocated reange of memory
*
* This routine release allocated reange of memory from the DPRAM.
*
* RETURNS: N/A
*
* SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
* m82xxDpramFindFreeEntry(), m82xxDpramAllocateRange(),
* m82xxDpramLibInit(), m82xxDpramMalloc(),
* m82xxDpramAlignedMalloc(), m82xxDpramFree(),
* m82xxDpramFccMalloc(), m82xxDpramFccFree()
*/
LOCAL void m82xxDpramReleaseRenage
(
UINT32 start,
POOL * pPool
)
{
ADDR_RESOURCE *pCurr, *pPrev;
pCurr = pPool->pHead;
pPrev = 0;
while (pCurr)
{
if (pCurr->start == start)
{
if (pPrev)
{
pPrev->pNext = pCurr->pNext;
}
else
{
pPool->pHead = pCurr->pNext;
}
/* clear the released AddrResource structure */
memset (pCurr,0,sizeof(ADDR_RESOURCE));
return;
}
pPrev = pCurr;
pCurr = pCurr->pNext;
}
return;
}
/*******************************************************************************
*
* m82xxDpramLibInit - init DPRAM memory allocation driver
*
* This routine init the DPRAM memory allocation driver.
*
* RETURNS: N/A
*
* SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
* m82xxDpramFindFreeEntry(), m82xxDpramAllocateRange(),
* m82xxDpramReleaseRenage(), m82xxDpramMalloc(),
* m82xxDpramAlignedMalloc(), m82xxDpramFree(),
* m82xxDpramFccMalloc(), m82xxDpramFccFree()
*/
void m82xxDpramLibInit
(
void
)
{
UINT32 immr = vxImmrGet (); /* find the DPRAM start address */
/* check for uCode */
UINT32 rccr = (*(UINT32 *)(immr + 0x119C4) & 0xE000) >> 2;
/* init the main dpram memory pool */
dprMainPool.start = immr + rccr + 0x100;
dprMainPool.limit = immr + 0x4000 -1;
dprMainPool.pHead = 0;
/* init the spesial section memory pool (need for FCC in ATM or ETH mode)*/
dprFccPool.start = immr + 0xb000;
dprFccPool.limit = immr + 0xc000 - 1;
dprFccPool.pHead = 0;
/* clear the AddrResource pool */
memset (addrResPool,0,sizeof(ADDR_RESOURCE) * ALLOCTABLESIZE);
}
/*******************************************************************************
*
* m82xxDpramMalloc - allocate memory from DPRAM main pool
*
* This routine allocate memory from DPRAM main pool.
*
* RETURNS: pointer to allocated memory
*
* SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
* m82xxDpramFindFreeEntry(), m82xxDpramAllocateRange(),
* m82xxDpramReleaseRenage(), m82xxDpramLibInit(),
* m82xxDpramAlignedMalloc(), m82xxDpramFree(),
* m82xxDpramFccMalloc(), m82xxDpramFccFree()
*/
void * m82xxDpramMalloc
(
size_t length
)
{
return (m82xxDpramAllocateRange (length,0,&dprMainPool));
}
/*******************************************************************************
*
* m82xxDpramAlignedMalloc - allocate aligned memory from DPRAM main pool
*
* This routine allocate aligned memory from DRPAM main pool.
*
* RETURNS: pointer to allocated aligend memory
*
* SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
* m82xxDpramFindFreeEntry(), m82xxDpramAllocateRange(),
* m82xxDpramReleaseRenage(), m82xxDpramLibInit(),
* m82xxDpramMalloc(), m82xxDpramFree(),
* m82xxDpramFccMalloc(), m82xxDpramFccFree()
*/
void * m82xxDpramAlignedMalloc
(
size_t length,
size_t alignment
)
{
return (m82xxDpramAllocateRange (length, alignment,&dprMainPool));
}
/*******************************************************************************
*
* m82xxDpramFree - free allocated memory from DPRAM main pool
*
* This routine free allocated memory from DPRAM main pool.
*
* RETURNS: N/A
*
* SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
* m82xxDpramFindFreeEntry(), m82xxDpramAllocateRange(),
* m82xxDpramReleaseRenage(), m82xxDpramLibInit(),
* m82xxDpramMalloc(), m82xxDpramAlignedMalloc(),
* m82xxDpramFccMalloc(), m82xxDpramFccFree()
*/
void m82xxDpramFree
(
void * addr
)
{
m82xxDpramReleaseRenage ((UINT32)addr,&dprMainPool);
}
/*******************************************************************************
*
* m82xxDpramFccMalloc - allocate memory from DPRAM FCC special pool
*
* This routine allocate memory from DPRAM FCC special pool.
*
* RETURNS: pointer to allocated memory
*
* SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
* m82xxDpramFindFreeEntry(), m82xxDpramAllocateRange(),
* m82xxDpramReleaseRenage(), m82xxDpramLibInit(),
* m82xxDpramMalloc(), m82xxDpramAlignedMalloc(),
* m82xxDpramFree(), m82xxDpramFccFree()
*/
void * m82xxDpramFccMalloc
(
size_t length,
size_t alignment
)
{
return (m82xxDpramAllocateRange(length, alignment,&dprFccPool));
}
/*******************************************************************************
*
* m82xxDpramFccFree - free allocated memory from DPRAM FCC special pool
*
* This routine free alocated memory from DPRAM FCC special pool.
*
* RETURNS: pointer to allocated memory
*
* SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
* m82xxDpramFindFreeEntry(), m82xxDpramAllocateRange(),
* m82xxDpramReleaseRenage(), m82xxDpramLibInit(),
* m82xxDpramMalloc(), m82xxDpramAlignedMalloc(),
* m82xxDpramFree(), m82xxDpramFccMalloc()
*/
void m82xxDpramFccFree
(
void * addr
)
{
m82xxDpramReleaseRenage ((UINT32)addr,&dprFccPool);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -