sysL2Cache.c
上传用户:dqzhongke1
上传日期:2022-06-26
资源大小:667k
文件大小:6k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* sysL2Cache.c -  L2 cache routines */
  2. /*
  3.  * Copyright (c) 2005-2006 Wind River Systems, Inc.
  4.  *
  5.  * The right to copy, distribute, modify, or otherwise make use
  6.  * of this software may be licensed only pursuant to the terms
  7.  * of an applicable Wind River license agreement.
  8.  */
  9. /*
  10. modification history
  11. --------------------
  12. 01c,30aug06,dtr  Support for rev2 silicon changes.
  13.                  No support for 36 phys with L2.
  14. 01b,27jan06,dtr  Tidy up - coding standards.
  15. 01a,11oct05,dtr  Created from cds85xx/01f
  16. */
  17. /*
  18. DESCRIPTION 
  19. L2 cache support routines including populating hooks for cache 
  20. library access.
  21. INCLUDE FILES: sysL2Cache.h
  22. */
  23. #include <vxWorks.h>
  24. #include "config.h"
  25. #include <cacheLib.h>
  26. #include "sysL2Cache.h"
  27. /* L2 Cache Routines */
  28. IMPORT VOIDFUNCPTR _pSysL2CacheInvFunc;
  29. IMPORT VOIDFUNCPTR _pSysL2CacheEnable;
  30. IMPORT VOIDFUNCPTR _pSysL2CacheDisable;
  31. IMPORT VOIDFUNCPTR _pSysL2CacheFlush;
  32. IMPORT UINT32 vxL2CTLGet(VUINT32 *);
  33. IMPORT void vxL2CTLSet(UINT32,VUINT32*);
  34. IMPORT char * cachePpcReadOrigin;
  35. LOCAL void sysL2CacheInvFunc();
  36. LOCAL void sysL2CacheEnable();
  37. LOCAL void sysL2CacheDisable();
  38. LOCAL void sysL2CacheFlush(int cacheType);
  39. IMPORT void sysCacheFlush();
  40. STATUS sysL2ExtWriteBufferAlloc (char *adrs,UINT size,BOOL lock);
  41. /* 512/64  == (Min Cache Size / L2 Cache Line Size) */
  42. int l2CacheLineNum = ((4096 + 8192) * L2_CACHE_SIZE); 
  43. /******************************************************************************
  44. *
  45. * sysL2CacheInit - L2 cache initialization
  46. *
  47. * L2 cache initialization routine of blk size etc if only L2 cache
  48. * else expect L2 setup by sysL2SramEnable. Attaches hooks into kernel 
  49. * cache code.
  50. *
  51. * RETURNS: N/A
  52. *
  53. * ERRNO: N/A
  54. */  
  55. void sysL2CacheInit
  56.     (
  57.     )
  58.     {
  59.     volatile UINT32 l2CtlVal;
  60.     int n;
  61.     /* Get L2 cache parameters */
  62.     l2CtlVal = vxL2CTLGet(M85XX_L2CTL(CCSBAR));
  63. #ifndef INCLUDE_L2_SRAM
  64.     vxL2CTLSet(l2CtlVal&(~M85XX_L2CTL_L2E_MSK),M85XX_L2CTL(CCSBAR));
  65.     l2CtlVal = (L2_CACHE_SIZE << M85XX_L2CTL_L2BLKSIZ_BIT);
  66.      /* Set L2CTL */
  67.     vxL2CTLSet(l2CtlVal,M85XX_L2CTL(CCSBAR));
  68. #endif
  69.     _pSysL2CacheInvFunc = (VOIDFUNCPTR)sysL2CacheInvFunc;
  70.     _pSysL2CacheEnable = sysL2CacheEnable;
  71.     _pSysL2CacheDisable = sysL2CacheDisable;
  72.     _pSysL2CacheFlush = sysL2CacheFlush;
  73.     /* Clean external write region registers */
  74.     for ( n=0 ; n < NO_L2_EXT_WRITE_REGIONS ; n++)
  75.         {
  76.         *M85XX_L2CEWARn(CCSBAR,n) = 0;
  77.         *M85XX_L2CEWCRn(CCSBAR,n) = 0;
  78.         }
  79.     }
  80. /******************************************************************************
  81. *
  82. * sysL2CacheInvFunc - Invalidates L2 cache
  83. *
  84. * This routine Invalidates the L2 Cache.
  85. *
  86. * RETURNS: N/A
  87. *
  88. * ERRNO: N/A
  89. */  
  90. LOCAL void sysL2CacheInvFunc
  91.     (
  92.     )
  93.     {
  94.     volatile UINT32 l2CtlVal;
  95.     /* Get present value */
  96.     l2CtlVal = vxL2CTLGet(M85XX_L2CTL(CCSBAR));
  97.     /* Invalidate entire L2 */
  98.     l2CtlVal |=  M85XX_L2CTL_L2I_MSK;
  99.     /* Set L2CTL */
  100.     vxL2CTLSet(l2CtlVal,M85XX_L2CTL(CCSBAR));
  101.     while (vxL2CTLGet(M85XX_L2CTL(CCSBAR)) & M85XX_L2CTL_L2I_MSK);
  102.     }
  103. /******************************************************************************
  104. *
  105. * sysL2CacheEnable - Enables L2 cache
  106. *
  107. * This routine Enables the L2 cache.
  108. *
  109. * RETURNS: N/A
  110. *
  111. * ERRNO: N/A
  112. */  
  113. LOCAL void sysL2CacheEnable
  114.     (
  115.     int cacheType
  116.     )
  117.     {
  118.     volatile UINT32 l2CtlVal;
  119.     int key;
  120.     key = intLock();
  121.     l2CtlVal = vxL2CTLGet(M85XX_L2CTL(CCSBAR));
  122.     l2CtlVal |= M85XX_L2CTL_L2E_MSK ;
  123.      /* Set L2CTL */
  124.     vxL2CTLSet(l2CtlVal,M85XX_L2CTL(CCSBAR));
  125.     intUnlock(key);
  126.     
  127.     }
  128. /******************************************************************************
  129. *
  130. * sysL2CacheDisable - Disables L2 cache
  131. *
  132. * This routine Disables the L2 cache.
  133. *
  134. * RETURNS: N/A
  135. *
  136. * ERRNO: N/A
  137. */  
  138. LOCAL void sysL2CacheDisable
  139.     (
  140.     int cacheType
  141.     )
  142.     {
  143.     volatile UINT32 l2CtlVal;
  144.     int key;
  145.     key = intLock();
  146.     /* Set L2E to disabled */
  147.     l2CtlVal = vxL2CTLGet(M85XX_L2CTL(CCSBAR));
  148.     l2CtlVal &= ~((UINT32)M85XX_L2CTL_L2E_MSK);
  149.     /* Set L2CTL */
  150.     vxL2CTLSet(l2CtlVal,M85XX_L2CTL(CCSBAR));
  151.     intUnlock(key);
  152.     }
  153. /******************************************************************************
  154. *
  155. * sysL2CacheDisables - Flushes L1 and L2 cache lines
  156. *
  157. * This routine Flushes L1 and L2 cache lines.  Required to make sure L2
  158. * is actually flushed. Uses cachePpcReadOrigin as a safe region which 
  159. * equates to start of text section.
  160. *
  161. * RETURNS: N/A
  162. *
  163. * ERRNO: N/A
  164. */  
  165. LOCAL void sysL2CacheFlush
  166.     (
  167.     int cacheType
  168.     )
  169.     {
  170.     int noOfCacheLines,key;
  171.     key = intLock();
  172.     noOfCacheLines = (ppcE500DCACHE_LINE_NUM + l2CacheLineNum );
  173.     sysCacheFlush(noOfCacheLines,cachePpcReadOrigin, ppcE500CACHE_ALIGN_SIZE);
  174.     intUnlock(key);
  175.     }
  176. /************************************************************************
  177. *
  178. * sysL2ExtWriteBufferAlloc - get an L2 address to write
  179. *
  180. * Establishes address which can be written direct to L2 externally. 
  181. * Optionally lock into L2.  Requires power of 2 size and address 
  182. * alignment >= 256 bytes.
  183. *
  184. * RETURNS: OK, or ERROR
  185. *
  186. * ERRNO: N/A
  187. */  
  188. STATUS sysL2ExtWriteBufferAlloc
  189.     (
  190.     char *adrs,
  191.     UINT size,
  192.     BOOL lock
  193.     )
  194.     {
  195.     int n;
  196.     if (((UINT)ROUND_DOWN((UINT)adrs,size) != (UINT)adrs) ||
  197.         ((UINT)ROUND_DOWN((UINT)adrs,0x100) != (UINT)adrs))
  198.         {
  199.         printf ("l2 external write region setup failed - check alignmentn"); 
  200.         return(ERROR);
  201.         }
  202.     n = 0;
  203.     while ( (*M85XX_L2CEWCRn(CCSBAR,n) & M85XX_L2CEWCR_E_MSK) == 
  204.             M85XX_L2CEWCR_E_MSK)
  205.         {
  206.         n++;
  207.         if ( n >= NO_L2_EXT_WRITE_REGIONS )
  208.             break;
  209.         }
  210.     if ( n >= NO_L2_EXT_WRITE_REGIONS )
  211.         {
  212.         printf ("l2 external write region setup failed-no more availablen"); 
  213.         return(ERROR);
  214.         }
  215. #ifndef REV2_SILICON
  216.     *M85XX_L2CEWARn(CCSBAR,n) = (((UINT)adrs >> 4)& M85XX_L2CEWAR_ADDR_MSK);
  217. #else
  218.     *M85XX_L2CEWARn(CCSBAR,n) = ((UINT)adrs & M85XX_L2CEWAR_ADDR_MSK);
  219. #endif
  220.     *M85XX_L2CEWCRn(CCSBAR,n) =  M85XX_L2CEWCR_E_MSK  | 
  221.                                  ((~(size - 1)) >> 8) | 
  222.                                  (lock << M85XX_L2CEWCR_LOCK_BIT);
  223.     
  224.     return(OK);
  225.     }