Mercurial > flash_v2
diff packages/hal/mips/arch/current/include/hal_cache.h @ 92:08ffab08d2ee ecos-sw-2000-05-26
Merge from eCos master repository on 2000-05-26-07:47:03-BST
| author | jlarmour |
|---|---|
| date | Fri, 26 May 2000 13:46:34 +0000 |
| parents | 435cced73e2f |
| children | 6bd9d475ed4b |
line wrap: on
line diff
--- a/packages/hal/mips/arch/current/include/hal_cache.h +++ b/packages/hal/mips/arch/current/include/hal_cache.h @@ -91,6 +91,49 @@ #endif //----------------------------------------------------------------------------- +// Cache instruction uses LSB to specify which WAY to affect. This macro +// defines the necessary cache instructions to affect all ways. +#if (HAL_DCACHE_WAYS == 1) +#define _HAL_ASM_DCACHE_ALL_WAYS( _cmd_ , _addr_ ) \ + asm volatile ("cache %0,0(%1);" \ + : : "I" (_cmd_), "r"(_addr_) ) +#elif (HAL_DCACHE_WAYS == 2) +#define _HAL_ASM_DCACHE_ALL_WAYS( _cmd_ , _addr_ ) \ + asm volatile ("cache %0,0(%1);" \ + "cache %0,1(%1);" \ + : : "I" (_cmd_), "r"(_addr_) ) +#elif (HAL_DCACHE_WAYS == 4) +#define _HAL_ASM_DCACHE_ALL_WAYS( _cmd_ , _addr_ ) \ + asm volatile ("cache %0,0(%1);" \ + "cache %0,1(%1);" \ + "cache %0,2(%1);" \ + "cache %0,3(%1);" \ + : : "I" (_cmd_), "r"(_addr_) ) +#else +# error "Unsupported number of ways" +#endif + +#if (HAL_ICACHE_WAYS == 1) +#define _HAL_ASM_ICACHE_ALL_WAYS( _cmd_ , _addr_ ) \ + asm volatile ("cache %0,0(%1);" \ + : : "I" (_cmd_), "r"(_addr_) ) +#elif (HAL_ICACHE_WAYS == 2) +#define _HAL_ASM_ICACHE_ALL_WAYS( _cmd_ , _addr_ ) \ + asm volatile ("cache %0,0(%1);" \ + "cache %0,1(%1);" \ + : : "I" (_cmd_), "r"(_addr_) ) +#elif (HAL_ICACHE_WAYS == 4) +#define _HAL_ASM_ICACHE_ALL_WAYS( _cmd_ , _addr_ ) \ + asm volatile ("cache %0,0(%1);" \ + "cache %0,1(%1);" \ + "cache %0,2(%1);" \ + "cache %0,3(%1);" \ + : : "I" (_cmd_), "r"(_addr_) ) +#else +# error "Unsupported number of ways" +#endif + +//----------------------------------------------------------------------------- // Global control of data cache // Enable the data cache @@ -119,16 +162,16 @@ // Synchronize the contents of the cache with memory. // This uses the index-writeback-invalidate operation. #ifndef HAL_DCACHE_SYNC_DEFINED -#define HAL_DCACHE_SYNC() \ -{ \ - register CYG_ADDRESS _baddr_ = 0x80000000; \ - register CYG_ADDRESS _addr_ = 0x80000000; \ - register CYG_WORD _size_ = HAL_DCACHE_SIZE; \ - _HAL_ASM_SET_MIPS_ISA(3); \ - for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ - { asm volatile ("cache 0x01,0(%0)" : : "r"(_addr_) ); } \ - _HAL_ASM_SET_MIPS_ISA(0); \ -} +#define HAL_DCACHE_SYNC() \ + CYG_MACRO_START \ + register CYG_ADDRESS _baddr_ = 0x80000000; \ + register CYG_ADDRESS _addr_ = 0x80000000; \ + register CYG_WORD _size_ = HAL_DCACHE_SIZE; \ + _HAL_ASM_SET_MIPS_ISA(3); \ + for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ + { _HAL_ASM_DCACHE_ALL_WAYS(0x01, _addr_); } \ + _HAL_ASM_SET_MIPS_ISA(0); \ + CYG_MACRO_END #endif // Set the data cache refill burst size @@ -144,20 +187,20 @@ // and then lock the cache so that it stays there. // This uses the fetch-and-lock cache operation. #ifndef HAL_DCACHE_LOCK_DEFINED -#define HAL_DCACHE_LOCK(_base_, _asize_) \ -CYG_MACRO_START \ - register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ - register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ - register CYG_WORD _size_ = (_asize_); \ - register CYG_WORD _state_; \ - HAL_DCACHE_IS_ENABLED( _state_ ); \ - if( _state_ ) { \ - _HAL_ASM_SET_MIPS_ISA(3); \ - for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ - { asm volatile ("cache 0x1d,0(%0)" : : "r"(_addr_) ); } \ - _HAL_ASM_SET_MIPS_ISA(0); \ - } \ -CYG_MACRO_END +#define HAL_DCACHE_LOCK(_base_, _asize_) \ + CYG_MACRO_START \ + register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ + register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ + register CYG_WORD _size_ = (_asize_); \ + register CYG_WORD _state_; \ + HAL_DCACHE_IS_ENABLED( _state_ ); \ + if( _state_ ) { \ + _HAL_ASM_SET_MIPS_ISA(3); \ + for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ + { _HAL_ASM_DCACHE_ALL_WAYS(0x1d, _addr_); } \ + _HAL_ASM_SET_MIPS_ISA(0); \ + } \ + CYG_MACRO_END #endif // Undo a previous lock operation. @@ -184,54 +227,54 @@ CYG_MACRO_END // for the given address range. // This uses the hit-writeback-invalidate cache operation. #ifndef HAL_DCACHE_FLUSH_DEFINED -#define HAL_DCACHE_FLUSH( _base_ , _asize_ ) \ -CYG_MACRO_START \ - register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ - register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ - register CYG_WORD _size_ = (_asize_); \ - register CYG_WORD _state_; \ - HAL_DCACHE_IS_ENABLED( _state_ ); \ - if( _state_ ) { \ - _HAL_ASM_SET_MIPS_ISA(3); \ - for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ - { asm volatile ("cache 0x15,0(%0)" : : "r"(_addr_) ); } \ - _HAL_ASM_SET_MIPS_ISA(0); \ - } \ -CYG_MACRO_END +#define HAL_DCACHE_FLUSH( _base_ , _asize_ ) \ + CYG_MACRO_START \ + register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ + register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ + register CYG_WORD _size_ = (_asize_); \ + register CYG_WORD _state_; \ + HAL_DCACHE_IS_ENABLED( _state_ ); \ + if( _state_ ) { \ + _HAL_ASM_SET_MIPS_ISA(3); \ + for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ + { _HAL_ASM_DCACHE_ALL_WAYS(0x15, _addr_); } \ + _HAL_ASM_SET_MIPS_ISA(0); \ + } \ + CYG_MACRO_END #endif // Invalidate cache lines in the given range without writing to memory. // This uses the hit-invalidate cache operation. #ifndef HAL_DCACHE_INVALIDATE_DEFINED -#define HAL_DCACHE_INVALIDATE( _base_ , _asize_ ) \ -{ \ - register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ - register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ - register CYG_WORD _size_ = (_asize_); \ - _HAL_ASM_SET_MIPS_ISA(3); \ - for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ - { asm volatile ("cache 0x11,0(%0)" : : "r"(_addr_) ); } \ - _HAL_ASM_SET_MIPS_ISA(0); \ -} +#define HAL_DCACHE_INVALIDATE( _base_ , _asize_ ) \ + CYG_MACRO_START \ + register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ + register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ + register CYG_WORD _size_ = (_asize_); \ + _HAL_ASM_SET_MIPS_ISA(3); \ + for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ + { _HAL_ASM_DCACHE_ALL_WAYS(0x11, _addr_); } \ + _HAL_ASM_SET_MIPS_ISA(0); \ + CYG_MACRO_END #endif // Write dirty cache lines to memory for the given address range. // This uses the hit-writeback cache operation. #ifndef HAL_DCACHE_STORE_DEFINED -#define HAL_DCACHE_STORE( _base_ , _asize_ ) \ -CYG_MACRO_START \ - register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ - register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ - register CYG_WORD _size_ = (_asize_); \ - register CYG_WORD _state_; \ - HAL_DCACHE_IS_ENABLED( _state_ ); \ - if( _state_ ) { \ - _HAL_ASM_SET_MIPS_ISA(3); \ - for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ - { asm volatile ("cache 0x19,0(%0)" : : "r"(_addr_) ); } \ - _HAL_ASM_SET_MIPS_ISA(0); \ - } \ -CYG_MACRO_END +#define HAL_DCACHE_STORE( _base_ , _asize_ ) \ + CYG_MACRO_START \ + register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ + register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ + register CYG_WORD _size_ = (_asize_); \ + register CYG_WORD _state_; \ + HAL_DCACHE_IS_ENABLED( _state_ ); \ + if( _state_ ) { \ + _HAL_ASM_SET_MIPS_ISA(3); \ + for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ + { _HAL_ASM_DCACHE_ALL_WAYS(0x19, _addr_); } \ + _HAL_ASM_SET_MIPS_ISA(0); \ + } \ + CYG_MACRO_END #endif // Preread the given range into the cache with the intention of reading @@ -266,15 +309,15 @@ CYG_MACRO_END // Invalidate the entire cache // This uses the index-invalidate cache operation. #ifndef HAL_ICACHE_INVALIDATE_ALL_DEFINED -#define HAL_ICACHE_INVALIDATE_ALL() \ -{ \ - register CYG_ADDRESS _baddr_ = 0x80000000; \ - register CYG_ADDRESS _addr_ = 0x80000000; \ - _HAL_ASM_SET_MIPS_ISA(3); \ - for( ; _addr_ < _baddr_+HAL_ICACHE_SIZE; _addr_ += HAL_ICACHE_LINE_SIZE ) \ - { asm volatile ("cache 0x00,0(%0)" : : "r"(_addr_) ); } \ - _HAL_ASM_SET_MIPS_ISA(0); \ -} +#define HAL_ICACHE_INVALIDATE_ALL() \ + CYG_MACRO_START \ + register CYG_ADDRESS _baddr_ = 0x80000000; \ + register CYG_ADDRESS _addr_ = 0x80000000; \ + _HAL_ASM_SET_MIPS_ISA(3); \ + for( ; _addr_ < _baddr_+HAL_ICACHE_SIZE; _addr_ += HAL_ICACHE_LINE_SIZE ) \ + { _HAL_ASM_ICACHE_ALL_WAYS(0x00, _addr_); } \ + _HAL_ASM_SET_MIPS_ISA(0); \ + CYG_MACRO_END #endif // Synchronize the contents of the cache with memory. @@ -290,20 +333,20 @@ CYG_MACRO_END // and then lock the cache so that it stays there. // This uses the fetch-and-lock cache operation. #ifndef HAL_ICACHE_LOCK_DEFINED -#define HAL_ICACHE_LOCK(_base_, _asize_) \ -CYG_MACRO_START \ - register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ - register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ - register CYG_WORD _size_ = (_asize_); \ - register CYG_WORD _state_; \ - HAL_ICACHE_IS_ENABLED( _state_ ); \ - if( _state_ ) { \ - _HAL_ASM_SET_MIPS_ISA(3); \ - for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ - { asm volatile ("cache 0x1c,0(%0)" : : "r"(_addr_) ); } \ - _HAL_ASM_SET_MIPS_ISA(0); \ - } \ -CYG_MACRO_END +#define HAL_ICACHE_LOCK(_base_, _asize_) \ + CYG_MACRO_START \ + register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ + register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ + register CYG_WORD _size_ = (_asize_); \ + register CYG_WORD _state_; \ + HAL_ICACHE_IS_ENABLED( _state_ ); \ + if( _state_ ) { \ + _HAL_ASM_SET_MIPS_ISA(3); \ + for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ + { _HAL_ASM_ICACHE_ALL_WAYS(0x1c, _addr_); } \ + _HAL_ASM_SET_MIPS_ISA(0); \ + } \ + CYG_MACRO_END #endif // Undo a previous lock operation. @@ -322,16 +365,16 @@ CYG_MACRO_END // Invalidate cache lines in the given range without writing to memory. // This uses the hit-invalidate cache operation. #ifndef HAL_ICACHE_INVALIDATE_DEFINED -#define HAL_ICACHE_INVALIDATE( _base_ , _asize_ ) \ -{ \ - register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ - register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ - register CYG_WORD _size_ = (_asize_); \ - _HAL_ASM_SET_MIPS_ISA(3); \ - for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_ICACHE_LINE_SIZE ) \ - { asm volatile ("cache 0x10,0(%0)" : : "r"(_addr_) ); } \ - _HAL_ASM_SET_MIPS_ISA(0); \ -} +#define HAL_ICACHE_INVALIDATE( _base_ , _asize_ ) \ + CYG_MACRO_START \ + register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ + register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ + register CYG_WORD _size_ = (_asize_); \ + _HAL_ASM_SET_MIPS_ISA(3); \ + for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_ICACHE_LINE_SIZE ) \ + { _HAL_ASM_ICACHE_ALL_WAYS(0x10, _addr_); } \ + _HAL_ASM_SET_MIPS_ISA(0); \ + CYG_MACRO_END #endif //-----------------------------------------------------------------------------
