Mercurial > ecos
diff packages/hal/arm/aeb/current/include/hal_cache.h @ 44:41bd4f3a90de ecos-sw-1999-10-08
Merge from eCos master repository on 1999-10-08-07:47:04-BST
| author | jlarmour |
|---|---|
| date | Fri, 08 Oct 1999 13:16:25 +0000 |
| parents | 443894e2e912 |
| children | c38311975d4f |
line wrap: on
line diff
--- a/packages/hal/arm/aeb/current/include/hal_cache.h +++ b/packages/hal/arm/aeb/current/include/hal_cache.h @@ -51,24 +51,20 @@ #include <cyg/hal/hal_io.h> //----------------------------------------------------------------------------- -// Cache dimensions +// Cache dimensions - one unified cache -// Data cache -#define HAL_DCACHE_SIZE 0x800 // Size of data cache in bytes -#define HAL_DCACHE_LINE_SIZE 4 // Size of a data cache line -#define HAL_DCACHE_WAYS 4 // Associativity of the cache +#define HAL_CACHE_UNIFIED -// Instruction cache -#define HAL_ICACHE_SIZE 0x800 // Size of cache in bytes -#define HAL_ICACHE_LINE_SIZE 4 // Size of a cache line -#define HAL_ICACHE_WAYS 4 // Associativity of the cache +#define HAL_UCACHE_SIZE 0x800 // Size of cache in bytes +#define HAL_UCACHE_LINE_SIZE 4 // Size of a cache line +#define HAL_UCACHE_WAYS 4 // Associativity of the cache -#define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS)) -#define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS)) +#define HAL_UCACHE_SETS (HAL_UCACHE_SIZE/(HAL_UCACHE_LINE_SIZE*HAL_UCACHE_WAYS)) // Cache & SRAM control -#define CYG_DEVICE_CCR ((volatile cyg_uint8 *)0xFFFFA400) -#define CYG_DEVICE_LSCR ((volatile cyg_uint8 *)0xFFFFA404) +#define CYG_DEVICE_CCR 0xFFFFA400 +#define CYG_DEVICE_LSCR 0xFFFFA404 +#define CYG_DEVICE_CACHE_MEM 0x60000800 #define CCR_E 0x01 // Cache enabled #define CCR_S 0x02 // SRAM mode enabled @@ -79,44 +75,131 @@ #define LCSR_L 0x02 // Local SRAM mapped to high memory //----------------------------------------------------------------------------- -// Global control of data cache +// Global control of cache -// Enable the data cache -#define HAL_DCACHE_ENABLE() \ +// Enable the cache +#define HAL_UCACHE_ENABLE() \ { \ - HAL_WRITE_UINT32(CYG_DEVICE_CCR, CCR_E); \ + HAL_WRITE_UINT8(CYG_DEVICE_CCR, CCR_E); \ } -// Disable the data cache -#define HAL_DCACHE_DISABLE() \ +// Disable the cache +#define HAL_UCACHE_DISABLE() \ { \ - HAL_WRITE_UINT32(CYG_DEVICE_CCR, 0); \ + HAL_WRITE_UINT8(CYG_DEVICE_CCR, 0); \ } // Invalidate the entire cache -#define HAL_DCACHE_INVALIDATE_ALL() \ -{ \ - HAL_WRITE_UINT32(CYG_DEVICE_CCR, CCR_I); \ +#define HAL_UCACHE_INVALIDATE_ALL() \ +{ \ + register cyg_uint8 old_ccr; \ + HAL_READ_UINT8(CYG_DEVICE_CCR, old_ccr); \ + HAL_WRITE_UINT8(CYG_DEVICE_CCR, CCR_I); \ + HAL_WRITE_UINT8(CYG_DEVICE_CCR, old_ccr); \ } // Synchronize the contents of the cache with memory. -#define HAL_DCACHE_SYNC() \ +#define HAL_UCACHE_SYNC() \ { \ - cyg_uint32 *cache_SRAM = (cyg_uint32 *)0x60000800; \ - int i; \ - cyg_uint32 old_ccr; \ - HAL_READ_UINT32(CYG_DEVICE_CCR, old_ccr); \ - HAL_WRITE_UINT32(CYG_DEVICE_CCR, CCR_F); \ + register volatile cyg_uint8 *cache_SRAM = \ + (volatile cyg_uint8*) CYG_DEVICE_CACHE_MEM; \ + register int i; \ + register cyg_uint8 old_ccr; \ + HAL_READ_UINT8(CYG_DEVICE_CCR, old_ccr); \ + HAL_WRITE_UINT8(CYG_DEVICE_CCR, CCR_F); \ for (i = 0; i < HAL_DCACHE_SETS; i++) { \ *cache_SRAM = 0; \ cache_SRAM += HAL_DCACHE_LINE_SIZE; \ } \ - HAL_WRITE_UINT32(CYG_DEVICE_CCR, CCR_I); \ - HAL_WRITE_UINT32(CYG_DEVICE_CCR, old_ccr); \ + HAL_WRITE_UINT8(CYG_DEVICE_CCR, CCR_I); \ + HAL_WRITE_UINT8(CYG_DEVICE_CCR, old_ccr); \ +} + +// Query the state of the cache +#define HAL_UCACHE_IS_ENABLED(_state_) \ +{ \ + cyg_uint8 __ccr; \ + HAL_READ_UINT8(CYG_DEVICE_CCR, __ccr); \ + (_state_) = (CCR_E == __ccr) ? 1 : 0; \ } -// Purge contents of data cache -#define HAL_DCACHE_PURGE_ALL() HAL_DCACHE_INVALIDATE_ALL() +// Purge contents of cache +#define HAL_UCACHE_PURGE_ALL() HAL_UCACHE_INVALIDATE_ALL() + +// Set the cache refill burst size +//#define HAL_UCACHE_BURST_SIZE(_size_) + +// Set the cache write mode +//#define HAL_UCACHE_WRITE_MODE( _mode_ ) + +//#define HAL_UCACHE_WRITETHRU_MODE 0 +//#define HAL_UCACHE_WRITEBACK_MODE 1 + +// Load the contents of the given address range into the cache +// and then lock the cache so that it stays there. +//#define HAL_UCACHE_LOCK(_base_, _size_) + +// Undo a previous lock operation +//#define HAL_UCACHE_UNLOCK(_base_, _size_) + +// Unlock entire cache +//#define HAL_UCACHE_UNLOCK_ALL() + +//----------------------------------------------------------------------------- +// Cache line control + +// Allocate cache lines for the given address range without reading its +// contents from memory. +//#define HAL_UCACHE_ALLOCATE( _base_ , _size_ ) + +// Write dirty cache lines to memory and invalidate the cache entries +// for the given address range. +//#define HAL_UCACHE_FLUSH( _base_ , _size_ ) + +// Invalidate cache lines in the given range without writing to memory. +//#define HAL_UCACHE_INVALIDATE( _base_ , _size_ ) + +// Write dirty cache lines to memory for the given address range. +//#define HAL_UCACHE_STORE( _base_ , _size_ ) + +// Preread the given range into the cache with the intention of reading +// from it later. +//#define HAL_UCACHE_READ_HINT( _base_ , _size_ ) + +// Preread the given range into the cache with the intention of writing +// to it later. +//#define HAL_UCACHE_WRITE_HINT( _base_ , _size_ ) + +// Allocate and zero the cache lines associated with the given range. +//#define HAL_UCACHE_ZERO( _base_ , _size_ ) + +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// Data and instruction cache macros map onto the both-cache macros + +//----------------------------------------------------------------------------- +// Global control of data cache + +#define HAL_DCACHE_SIZE HAL_UCACHE_SIZE +#define HAL_DCACHE_LINE_SIZE HAL_UCACHE_LINE_SIZE +#define HAL_DCACHE_WAYS HAL_UCACHE_WAYS +#define HAL_DCACHE_SETS HAL_UCACHE_SETS + +// Enable the data cache +#define HAL_DCACHE_ENABLE() HAL_UCACHE_ENABLE() + +// Disable the data cache +#define HAL_DCACHE_DISABLE() HAL_UCACHE_DISABLE() + +// Invalidate the entire cache +#define HAL_DCACHE_INVALIDATE_ALL() HAL_UCACHE_INVALIDATE_ALL() + +// Synchronize the contents of the cache with memory. +#define HAL_DCACHE_SYNC() HAL_UCACHE_SYNC() + +// Query the state of the data cache +#define HAL_DCACHE_IS_ENABLED(_state_) HAL_UCACHE_IS_ENABLED(_state_) // Set the data cache refill burst size //#define HAL_DCACHE_BURST_SIZE(_size_) @@ -166,26 +249,35 @@ //#define HAL_DCACHE_ZERO( _base_ , _size_ ) //----------------------------------------------------------------------------- -// Global control of Instruction cache - use Data cache controls since they -// are not separatable. +// Global control of Instruction cache + +#define HAL_ICACHE_SIZE HAL_UCACHE_SIZE +#define HAL_ICACHE_LINE_SIZE HAL_UCACHE_LINE_SIZE +#define HAL_ICACHE_WAYS HAL_UCACHE_WAYS +#define HAL_ICACHE_SETS HAL_UCACHE_SETS // Enable the instruction cache -#define HAL_ICACHE_ENABLE() HAL_DCACHE_ENABLE() +#define HAL_ICACHE_ENABLE() HAL_UCACHE_ENABLE() // Disable the instruction cache -#define HAL_ICACHE_DISABLE() HAL_DCACHE_DISABLE() +#define HAL_ICACHE_DISABLE() HAL_UCACHE_DISABLE() // Invalidate the entire cache -#define HAL_ICACHE_INVALIDATE_ALL() HAL_DCACHE_SYNC(); HAL_DCACHE_INVALIDATE_ALL() +#define HAL_ICACHE_INVALIDATE_ALL() HAL_UCACHE_INVALIDATE_ALL() + // Synchronize the contents of the cache with memory. -#define HAL_ICACHE_SYNC() +#define HAL_ICACHE_SYNC() HAL_UCACHE_SYNC() + +// Query the state of the instruction cache +#define HAL_ICACHE_IS_ENABLED(_state_) HAL_UCACHE_IS_ENABLED(_state_) // Set the instruction cache refill burst size //#define HAL_ICACHE_BURST_SIZE(_size_) // Load the contents of the given address range into the instruction cache // and then lock the cache so that it stays there. + //#define HAL_ICACHE_LOCK(_base_, _size_) // Undo a previous lock operation @@ -200,6 +292,5 @@ // Invalidate cache lines in the given range without writing to memory. //#define HAL_ICACHE_INVALIDATE( _base_ , _size_ ) -//----------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_CACHE_H // End of hal_cache.h
