cacheLib.c
上传用户:yuanda199
上传日期:2022-06-26
资源大小:412k
文件大小:11k
源码类别:

VxWorks

开发平台:

C/C++

  1. /*
  2.     EXTERNAL SOURCE RELEASE on 12/03/2001 3.0 - Subject to change without notice.
  3. */
  4. /*
  5.     Copyright 2001, Broadcom Corporation
  6.     All Rights Reserved.
  7.     
  8.     This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
  9.     the contents of this file may not be disclosed to third parties, copied or
  10.     duplicated in any form, in whole or in part, without the prior written
  11.     permission of Broadcom Corporation.
  12. */
  13. /* $Id: cacheLib.c,v 1.1 Broadcom SDK $ */
  14. /* include files */
  15. #include    <vxWorks.h>
  16. #include    <cacheLib.h>
  17. #include    <memLib.h>
  18. #include    <stdlib.h>
  19. #include    <errnoLib.h>
  20. #include    <intLib.h>
  21. #define UNCACHED(_a) ((unsigned long)(_a) | 0xA0000000)
  22. /* externals */
  23. IMPORT void EnableCache(void);
  24. IMPORT void DisableCache(void);
  25. IMPORT void sysWbFlush(void);
  26. IMPORT void FlushAll_Dcache(void);
  27. IMPORT void FlushAll_Icache(void);
  28. IMPORT void Invalidate_Icache(void * base_addr, size_t bcount);
  29. IMPORT void Invalidate_Dcache(void * base_addr, size_t bcount);
  30. IMPORT void Clear_Dcache(void * base_addr, size_t bcount);
  31. IMPORT void Flush_Dcache(void * base_addr, size_t bcount);
  32. /* forward declarations */
  33. LOCAL void *    cacheBcm47xxMalloc (size_t bytes);
  34. LOCAL STATUS    cacheBcm47xxFree (void * pBuf);
  35. LOCAL STATUS    cacheBcm47xxInvalidate (CACHE_TYPE cache, void * pVirtAdrs, 
  36.                                      size_t bytes);
  37. LOCAL STATUS    cacheBcm47xxFlush (CACHE_TYPE cache, void * pVirtAdrs, 
  38.                                      size_t bytes);
  39. LOCAL STATUS    cacheBcm47xxClear (CACHE_TYPE cache, void * pVirtAdrs, 
  40.                                      size_t bytes);
  41. LOCAL void *  cacheBcm47xxPhysToVirt (void * address);
  42. LOCAL void *  cacheBcm47xxVirtToPhys (void * address);
  43. LOCAL STATUS  cacheBcm47xxTextUpdate (void * address, size_t bytes);
  44. LOCAL STATUS    cacheBcm47xxEnable (CACHE_TYPE  cache);
  45. LOCAL STATUS    cacheBcm47xxDisable (CACHE_TYPE  cache);
  46. /**************************************************************************
  47. *
  48. * cacheBcm47xxLibInit - initialize the BCM47xx cache library
  49. *
  50. * This routine initializes the function pointers for the BCM47xx cache
  51. * library.  The board support package can select this cache library 
  52. * by calling this routine.
  53. *
  54. * RETURNS: OK.
  55. */
  56. STATUS cacheBcm47xxLibInit ( 
  57.     CACHE_MODE instMode, 
  58.     CACHE_MODE dataMode )
  59. {
  60.     cacheLib.enableRtn     = cacheBcm47xxEnable;     /* cacheEnable() */
  61.     cacheLib.disableRtn    = cacheBcm47xxDisable;    /* cacheDisable() */
  62.     cacheLib.lockRtn       = NULL;                   /* cacheLock() */
  63.     cacheLib.unlockRtn     = NULL;                   /* cacheUnlock() */
  64.     cacheLib.flushRtn      = cacheBcm47xxFlush;      /* cacheFlush() */
  65.     cacheLib.pipeFlushRtn  = NULL;                   /* cachePipeFlush() */
  66.     cacheLib.textUpdateRtn = cacheBcm47xxTextUpdate; /* cacheTextUpdate() */
  67.     cacheLib.invalidateRtn = cacheBcm47xxInvalidate; /* cacheInvalidate() */
  68.     cacheLib.clearRtn      = cacheBcm47xxClear;      /* cacheClear() */
  69.     cacheLib.dmaMallocRtn  = (FUNCPTR) cacheBcm47xxMalloc; /* cacheDmaMalloc() */
  70.     cacheLib.dmaFreeRtn    = cacheBcm47xxFree;             /* cacheDmaFree() */
  71.     cacheLib.dmaVirtToPhysRtn = (FUNCPTR) cacheBcm47xxVirtToPhys;
  72.     cacheLib.dmaPhysToVirtRtn = (FUNCPTR) cacheBcm47xxPhysToVirt;
  73.     /* Check if caches are already on - if not then init the caches */
  74.     if ( (readConfig() & 0x3) == 0x2)
  75.         reset_caches();
  76.     
  77.     cacheDataMode       = dataMode;     /* save dataMode for enable */
  78.     cacheDataEnabled    = FALSE; 
  79.     cacheMmuAvailable   = TRUE;         /* mmu support is provided */
  80.     return (OK);
  81. }
  82. /**************************************************************************
  83. *
  84. * cacheBcm47xxEnable - enable the selected cache
  85. *
  86. * The instruction or data cache tags are invalidated and the cache is
  87. * enabled.
  88. *
  89. * RETURNS: OK, or ERROR if cache or cache control is not supported.
  90. */
  91. LOCAL STATUS cacheBcm47xxEnable ( CACHE_TYPE  cache )
  92. {
  93.     unsigned int   status;
  94.     switch (cache)
  95.     {
  96.         case INSTRUCTION_CACHE:
  97.         case DATA_CACHE:
  98.                 status = intLock ();        /* LOCK INTS */
  99.                 FlushAll_Dcache();             /* reset data cache */
  100.                 FlushAll_Icache();             /* reset i cache */
  101.                 EnableCache();             /* enable data cache */
  102.                 intUnlock (status);         /* UNLOCK INTS */
  103.                 cacheDataEnabled = TRUE;    /* d-cache is currently on */
  104.                 cacheFuncsSet ();           /* update cache func pointers */
  105.                 break;
  106.         
  107.         default:
  108.             errnoSet (S_cacheLib_INVALID_CACHE);
  109.             return (ERROR);
  110.             break;
  111.     }
  112.     return (OK);
  113. }
  114. /**************************************************************************
  115. *
  116. * cacheDisable - disable the selected cache
  117. *
  118. * The instruction or data cache is invalidated and disabled.
  119. *
  120. * RETURNS: OK, or ERROR if cache or cache control is not supported.
  121. */
  122. LOCAL STATUS cacheBcm47xxDisable ( CACHE_TYPE  cache )
  123. {
  124.     unsigned int   status;
  125.     switch (cache)
  126.     {
  127.         case INSTRUCTION_CACHE:
  128.         case DATA_CACHE:
  129.             status = intLock ();        /* LOCK INTS */
  130.             FlushAll_Dcache();             /* reset data cache */
  131.             FlushAll_Icache();             /* reset data cache */
  132.             DisableCache();            /* disable data cache */
  133.             intUnlock (status);         /* UNLOCK INTS */
  134.             cacheDataEnabled = FALSE;   /* d-cache is currently off */
  135.             cacheFuncsSet ();           /* update cache func pointers */
  136.             break;
  137.         default:
  138.             errnoSet (S_cacheLib_INVALID_CACHE);
  139.             return (ERROR);
  140.             break;
  141.     }
  142.     return (OK);
  143. }
  144. /**************************************************************************
  145. *
  146. * cacheBcm47xxMalloc - allocate a cache-safe buffer, if possible
  147. *
  148. * This function will attempt to return a pointer to a section of memory
  149. * that will not experience any cache coherency problems.  It also sets
  150. * the flush and invalidate function pointers to NULL or to the respective
  151. * flush and invalidate routines.  Since the cache is write-through, the
  152. * flush function pointer will always be NULL.
  153. *
  154. * RETURNS: pointer to non-cached buffer, or NULL
  155. */
  156. LOCAL void * cacheBcm47xxMalloc ( size_t bytes )
  157. {
  158.     char * pBuffer;
  159.     if ((pBuffer = (char *) malloc (bytes)) == NULL)
  160.         return ((void *) pBuffer);
  161.     else {
  162.         cacheBcm47xxFlush(DATA_CACHE, pBuffer, bytes);
  163.         cacheBcm47xxInvalidate(DATA_CACHE, pBuffer, bytes);
  164.         return ((void *) K0_TO_K1(pBuffer));
  165.     }
  166. }
  167. /**************************************************************************
  168. *
  169. * cacheBcm47xxFree - free the buffer acquired by cacheMalloc ()
  170. *
  171. * This routine restores the non-cached buffer to its original state
  172. * and does whatever else is necessary to undo the allocate function.
  173. *
  174. * RETURNS: OK, or ERROR if not able to undo cacheMalloc() operation
  175. */
  176. LOCAL STATUS cacheBcm47xxFree ( void * pBuf )
  177. {
  178.     free ((void *) K1_TO_K0(pBuf));
  179.     return (OK);
  180. }
  181. /**************************************************************************
  182. *
  183. * cacheBcm47xxInvalidate - invalidate all or some entries in a cache
  184. *
  185. * This routine invalidates all or some of the entries in the
  186. * specified cache.
  187. *
  188. * RETURNS: OK, or ERROR if cache or cache control is not supported.
  189. */
  190. LOCAL STATUS cacheBcm47xxInvalidate ( CACHE_TYPE cache, void *pVirtAdrs,
  191.                                          size_t  bytes )
  192. {                                                           
  193.     switch (cache)
  194.     {
  195.     case DATA_CACHE:
  196.         Invalidate_Dcache (pVirtAdrs, bytes);
  197.         break;
  198.     case INSTRUCTION_CACHE:
  199.         Invalidate_Icache (pVirtAdrs, bytes);
  200.         break;
  201.     default:
  202.         errno = S_cacheLib_INVALID_CACHE;
  203.         return (ERROR);
  204.         break;
  205.     }
  206.     
  207.     return (OK);
  208. }
  209. /**************************************************************************
  210. *
  211. * cacheBcm47xxFlush - invalidate all or some entries in a cache
  212. *
  213. * This routine flushes all or some of the entries in the
  214. * specified cache.
  215. *
  216. * RETURNS: OK, or ERROR if cache or cache control is not supported.
  217. */
  218. LOCAL STATUS cacheBcm47xxFlush ( CACHE_TYPE cache, void *pVirtAdrs,
  219.                                          size_t  bytes )
  220. {
  221.     switch (cache)
  222.     {
  223.     case DATA_CACHE:
  224.         Flush_Dcache (pVirtAdrs, bytes);
  225.         break;
  226.     default:
  227.         errno = S_cacheLib_INVALID_CACHE;
  228.         return (ERROR);
  229.         break;
  230.     }
  231.     return (OK);
  232. }
  233. /**************************************************************************
  234. *
  235. * cacheBcm47xxClear - invalidate and flush all or some entries in a cache
  236. *
  237. * This routine invalidates and flushes all or some of the entries in the
  238. * specified cache.
  239. *
  240. * RETURNS: OK, or ERROR if cache or cache control is not supported.
  241. */
  242. LOCAL STATUS cacheBcm47xxClear ( CACHE_TYPE cache, void *pVirtAdrs,
  243.                                          size_t  bytes )
  244. {
  245.     switch (cache)
  246.     {
  247.     case DATA_CACHE:
  248.         Clear_Dcache (pVirtAdrs, bytes);
  249.         break;
  250.     default:
  251.         errno = S_cacheLib_INVALID_CACHE;
  252.         return (ERROR);
  253.         break;
  254.     }
  255.     return (OK);
  256. }
  257. /**************************************************************************
  258. *
  259. * cacheBcm47xxVirtToPhys - virtual-to-physical address translation
  260. *
  261. * This routine may be attached to the CACHE_DRV structure virtToPhysRtn
  262. * function pointer by cacheBcm47xxMalloc().  This implies that the virtual
  263. * memory library is not installed, and that the "cache-safe" buffer has
  264. * been created through the use of the R3900 K1 segment.
  265. *
  266. * NOMANUAL
  267. */
  268. LOCAL void * cacheBcm47xxVirtToPhys ( void * address )
  269. {
  270.     return ((void *) K1_TO_PHYS(address));
  271. }
  272. /**************************************************************************
  273. *
  274. * cacheBcm47xxPhysToVirt - physical-to-virtual address translation
  275. *
  276. * This routine may be attached to the CACHE_DRV structure physToVirtRtn
  277. * function pointer by cacheBcm47xxMalloc().  This implies that the virtual
  278. * memory library is not installed, and that the "cache-safe" buffer has
  279. * been created through the use of the BCM47xx K1 segment.
  280. *
  281. * NOMANUAL
  282. */
  283. LOCAL void * cacheBcm47xxPhysToVirt ( void * address )
  284. {
  285.     return ((void *) PHYS_TO_K1(address));
  286. }
  287. /**************************************************************************
  288. *
  289. * cacheBcm47xxTextUpdate - invalidate updated text section
  290. *
  291. * This routine invalidates the specified text section so that
  292. * the correct updated text is executed.
  293. *
  294. * NOMANUAL
  295. */
  296. LOCAL STATUS cacheBcm47xxTextUpdate ( void * address, size_t bytes )
  297. {
  298.     FlushAll_Dcache();
  299.     return (cacheBcm47xxInvalidate (INSTRUCTION_CACHE, address, bytes));
  300. }