m82xxDpramLib.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:10k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* m82xxDpramLib.c - 82xx DPRAM memory allocation driver */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01d,26nov01,rcs   renamed m82xxDpramLib.c and moved to target/src/drv/mem
  7. 01c,12oct01,g_h   Cleaning for T2.2
  8. 01b,17jul01,g_h   Cleaning and renaming to sys82xxDpramLib.c
  9. 01a,16jul01,p_h   Created
  10. */
  11. /*
  12. DESCRIPTION
  13. This module contains 82xx DPRAM memory allocation driver.
  14. INCLUDES: m82xxDpramLib.h
  15. */
  16. /* include */
  17. #include "drv/mem/m82xxDpramLib.h"
  18. /* gobals */
  19. /* external */
  20. IMPORT UINT32 vxImmrGet(void); 
  21. /* local */
  22. LOCAL ADDR_RESOURCE addrResPool[ALLOCTABLESIZE];
  23. LOCAL POOL dprMainPool;
  24. LOCAL POOL dprFccPool;
  25. /* forward declaration */
  26. /*******************************************************************************
  27. *
  28. * m82xxDpramAlignedAddr - aligned a given address
  29. *
  30. * This routine aligned a given address.
  31. *
  32. * RETURNS: new aligned address
  33. *
  34. * SEE ALSO: m82xxDpramAllocRange(), m82xxDpramFindFreeEntry(),
  35. *           m82xxDpramAllocateRange(), m82xxDpramReleaseRenage(),
  36. *           m82xxDpramLibInit(), m82xxDpramMalloc(), 
  37. *           m82xxDpramAlignedMalloc(), m82xxDpramFree(),
  38. *           m82xxDpramFccMalloc(), m82xxDpramFccFree()
  39. */
  40. LOCAL UINT32 m82xxDpramAlignedAddr
  41.     (
  42.     UINT32 addr, 
  43.     UINT32 alignment
  44.     )
  45.     {
  46.     if (alignment) 
  47. {
  48. return ((addr + alignment - 1) & ~(alignment - 1));
  49. }
  50.     return (addr);
  51.     }
  52. /*******************************************************************************
  53. *
  54. * m82xxDpramAllocRange - alloc aligned memeory
  55. *
  56. * This routine alloc aligned memory
  57. *
  58. * RETURNS: OK
  59. *
  60. * SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramFindFreeEntry(),
  61. *           m82xxDpramAllocateRange(), m82xxDpramReleaseRenage(),
  62. *           m82xxDpramLibInit(), m82xxDpramMalloc(), 
  63. *           m82xxDpramAlignedMalloc(), m82xxDpramFree(),
  64. *           m82xxDpramFccMalloc(), m82xxDpramFccFree()
  65. */
  66. LOCAL void * m82xxDpramAllocRange
  67.     (
  68.     ADDR_RESOURCE * pNew, 
  69.     UINT32          length, 
  70.     UINT32          alignment, 
  71.     POOL          * pPool
  72.     )
  73.     {
  74.     
  75.     ADDR_RESOURCE * pPrev;
  76.     ADDR_RESOURCE * pCurr;
  77.     UINT32          gapEnd;
  78.     UINT32          gapStart = 0;
  79.     pCurr = pPool->pHead;
  80.     pPrev = 0;
  81.     do
  82.         {
  83. if (pPrev) 
  84.     {
  85.     gapStart = m82xxDpramAlignedAddr (pPrev->start + pPrev->size, alignment);
  86.             }
  87. else 
  88.     {
  89.     gapStart = m82xxDpramAlignedAddr (pPool->start, alignment);
  90.             }
  91. if (pCurr) 
  92.     {
  93.     gapEnd = pCurr->start;
  94.     }
  95. else 
  96.     {
  97.     gapEnd = pPool->limit;
  98.     }
  99.         if (gapEnd > gapStart) 
  100.     {
  101.     if ((gapEnd - gapStart) >= length) 
  102.         {
  103. pNew->start = gapStart;
  104. pNew->size = length;
  105. pNew->pNext = pCurr;
  106. if (pPrev) 
  107.     {
  108.     pPrev->pNext = pNew;
  109.     }
  110. if (!pPool->pHead) 
  111.     {
  112.     pPool->pHead = pNew;
  113.     }
  114. return ((void*)(pNew->start));
  115. }
  116.     }
  117.             pPrev = pCurr;
  118.             if (pCurr) 
  119. {
  120. pCurr = pCurr->pNext;
  121. }
  122.         } while (pCurr || pPrev);
  123.     return (OK);
  124.     }
  125. /*******************************************************************************
  126. *
  127. * m82xxDpramFindFreeEntry - find first entry in the linked list
  128. *
  129. * RETURNS: pointer to first free entry or 0 if every thing full
  130. *
  131. * SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
  132. *           m82xxDpramAllocateRange(), m82xxDpramReleaseRenage(),
  133. *           m82xxDpramLibInit(), m82xxDpramMalloc(), 
  134. *           m82xxDpramAlignedMalloc(), m82xxDpramFree(),
  135. *           m82xxDpramFccMalloc(), m82xxDpramFccFree()
  136. */
  137. LOCAL ADDR_RESOURCE * m82xxDpramFindFreeEntry 
  138.     (
  139.     void
  140.     )
  141.     {
  142.     int index;
  143.     for (index=0;index<ALLOCTABLESIZE;index++) 
  144. {
  145. if (addrResPool[index].start == 0) 
  146.     {
  147.     return &addrResPool[index];
  148.     }
  149. }
  150.     return (0);
  151.     }
  152. /*******************************************************************************
  153. *
  154. * m82xxDpramAllocateRange - allocate a reange of memory
  155. *
  156. * This routine allocate a reange of memory from the DPRAM.
  157. *
  158. * RETURNS: pointer to allocated memory or 0 if the is no free memory
  159. *
  160. * SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
  161. *           m82xxDpramFindFreeEntry(), m82xxDpramReleaseRenage(),
  162. *           m82xxDpramLibInit(), m82xxDpramMalloc(), 
  163. *           m82xxDpramAlignedMalloc(), m82xxDpramFree(),
  164. *           m82xxDpramFccMalloc(), m82xxDpramFccFree()
  165. */
  166. LOCAL void * m82xxDpramAllocateRange
  167.     (
  168.     UINT32  requestedLength, 
  169.     UINT32  alignment, 
  170.     POOL  * pPool
  171.     )
  172.     {
  173.     ADDR_RESOURCE * pNew;
  174.     if ((pNew = m82xxDpramFindFreeEntry ()) != NULL)
  175.         { 
  176. return m82xxDpramAllocRange (pNew, requestedLength, alignment ,pPool);
  177. }
  178.     return 0;
  179.     }
  180. /*******************************************************************************
  181. *
  182. * m82xxDpramReleaseRenage - release allocated reange of memory
  183. *
  184. * This routine release allocated reange of memory from the DPRAM.
  185. *
  186. * RETURNS: N/A
  187. *
  188. * SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
  189. *           m82xxDpramFindFreeEntry(), m82xxDpramAllocateRange(),
  190. *           m82xxDpramLibInit(), m82xxDpramMalloc(), 
  191. *           m82xxDpramAlignedMalloc(), m82xxDpramFree(),
  192. *           m82xxDpramFccMalloc(), m82xxDpramFccFree()
  193. */
  194. LOCAL void m82xxDpramReleaseRenage
  195.     (
  196.     UINT32  start, 
  197.     POOL  * pPool
  198.     )
  199.     {
  200.     ADDR_RESOURCE *pCurr, *pPrev;
  201.     pCurr = pPool->pHead;
  202.     pPrev = 0;
  203.     while (pCurr) 
  204. {
  205. if (pCurr->start == start) 
  206.             {
  207.     if (pPrev) 
  208. {
  209. pPrev->pNext = pCurr->pNext;
  210. }
  211.             else 
  212. {
  213. pPool->pHead = pCurr->pNext;
  214. }
  215.             /* clear the released AddrResource structure */
  216.             memset (pCurr,0,sizeof(ADDR_RESOURCE));
  217.             return;
  218.     }
  219.         pPrev = pCurr;
  220. pCurr = pCurr->pNext;
  221. }
  222.     return;
  223.     }
  224. /*******************************************************************************
  225. *
  226. * m82xxDpramLibInit - init DPRAM memory allocation driver
  227. *
  228. * This routine init the DPRAM memory allocation driver.
  229. *
  230. * RETURNS: N/A
  231. *
  232. * SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
  233. *           m82xxDpramFindFreeEntry(), m82xxDpramAllocateRange(),
  234. *           m82xxDpramReleaseRenage(), m82xxDpramMalloc(), 
  235. *           m82xxDpramAlignedMalloc(), m82xxDpramFree(),
  236. *           m82xxDpramFccMalloc(), m82xxDpramFccFree()
  237. */
  238. void m82xxDpramLibInit
  239.     (
  240.     void
  241.     )
  242.     {
  243.     UINT32 immr = vxImmrGet ();        /* find the DPRAM start address */
  244.     /* check for uCode */
  245.     UINT32 rccr = (*(UINT32 *)(immr + 0x119C4) & 0xE000) >> 2; 
  246.     /* init the main dpram memory pool */
  247.     dprMainPool.start = immr + rccr + 0x100;
  248.     dprMainPool.limit = immr + 0x4000 -1;
  249.     dprMainPool.pHead = 0;
  250.     /* init the spesial section memory pool (need for FCC in ATM or ETH mode)*/
  251.     dprFccPool.start = immr + 0xb000;
  252.     dprFccPool.limit = immr + 0xc000 - 1;
  253.     dprFccPool.pHead = 0;
  254.     /* clear the AddrResource pool */
  255.     memset (addrResPool,0,sizeof(ADDR_RESOURCE) * ALLOCTABLESIZE);
  256.     }
  257. /*******************************************************************************
  258. *
  259. * m82xxDpramMalloc - allocate memory from DPRAM main pool
  260. *
  261. * This routine allocate memory from DPRAM main pool.
  262. *
  263. * RETURNS: pointer to allocated memory 
  264. *
  265. * SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
  266. *           m82xxDpramFindFreeEntry(), m82xxDpramAllocateRange(),
  267. *           m82xxDpramReleaseRenage(), m82xxDpramLibInit(), 
  268. *           m82xxDpramAlignedMalloc(), m82xxDpramFree(),
  269. *           m82xxDpramFccMalloc(), m82xxDpramFccFree()
  270. */
  271. void * m82xxDpramMalloc
  272.     (
  273.     size_t length
  274.     )
  275.     {
  276.     return (m82xxDpramAllocateRange (length,0,&dprMainPool));
  277.     }
  278. /*******************************************************************************
  279. *
  280. * m82xxDpramAlignedMalloc - allocate aligned memory from DPRAM main pool
  281. *
  282. * This routine allocate aligned memory from DRPAM main pool.
  283. *
  284. * RETURNS: pointer to allocated aligend memory 
  285. *
  286. * SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
  287. *           m82xxDpramFindFreeEntry(), m82xxDpramAllocateRange(),
  288. *           m82xxDpramReleaseRenage(), m82xxDpramLibInit(), 
  289. *           m82xxDpramMalloc(), m82xxDpramFree(),
  290. *           m82xxDpramFccMalloc(), m82xxDpramFccFree()
  291. */
  292. void * m82xxDpramAlignedMalloc
  293.     (
  294.     size_t length, 
  295.     size_t alignment
  296.     )
  297.     {
  298.     return (m82xxDpramAllocateRange (length, alignment,&dprMainPool));
  299.     }
  300. /*******************************************************************************
  301. *
  302. * m82xxDpramFree -  free allocated memory from DPRAM main pool
  303. *
  304. * This routine free allocated memory from DPRAM main pool.
  305. *
  306. * RETURNS: N/A
  307. *
  308. * SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
  309. *           m82xxDpramFindFreeEntry(), m82xxDpramAllocateRange(),
  310. *           m82xxDpramReleaseRenage(), m82xxDpramLibInit(), 
  311. *           m82xxDpramMalloc(), m82xxDpramAlignedMalloc(),
  312. *           m82xxDpramFccMalloc(), m82xxDpramFccFree()
  313. */
  314. void m82xxDpramFree 
  315.     (
  316.     void * addr
  317.     )
  318.     {
  319.     m82xxDpramReleaseRenage ((UINT32)addr,&dprMainPool);
  320.     }
  321. /*******************************************************************************
  322. *
  323. * m82xxDpramFccMalloc -  allocate memory from DPRAM FCC special pool
  324. *
  325. * This routine allocate memory from DPRAM FCC special pool.
  326. *
  327. * RETURNS: pointer to allocated memory
  328. *
  329. * SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
  330. *           m82xxDpramFindFreeEntry(), m82xxDpramAllocateRange(),
  331. *           m82xxDpramReleaseRenage(), m82xxDpramLibInit(), 
  332. *           m82xxDpramMalloc(), m82xxDpramAlignedMalloc(),
  333. *           m82xxDpramFree(), m82xxDpramFccFree()
  334. */
  335. void * m82xxDpramFccMalloc
  336.     (
  337.     size_t length, 
  338.     size_t alignment
  339.     )
  340.     {
  341.     return (m82xxDpramAllocateRange(length, alignment,&dprFccPool));
  342.     }
  343. /*******************************************************************************
  344. *
  345. * m82xxDpramFccFree -  free allocated memory from DPRAM FCC special pool
  346. *
  347. * This routine free alocated memory from DPRAM FCC special pool.
  348. *
  349. * RETURNS: pointer to allocated memory 
  350. *
  351. * SEE ALSO: m82xxDpramAlignedAddr(), m82xxDpramAllocRange(),
  352. *           m82xxDpramFindFreeEntry(), m82xxDpramAllocateRange(),
  353. *           m82xxDpramReleaseRenage(), m82xxDpramLibInit(), 
  354. *           m82xxDpramMalloc(), m82xxDpramAlignedMalloc(),
  355. *           m82xxDpramFree(), m82xxDpramFccMalloc()
  356. */
  357. void m82xxDpramFccFree
  358.     (
  359.     void * addr
  360.     )
  361.     {
  362.     m82xxDpramReleaseRenage ((UINT32)addr,&dprFccPool);
  363.     }