Mercurial > ecos
comparison packages/hal/mips/arch/current/include/hal_cache.h @ 10:d3fbcdfa1b2f ecos-sw-1999-05-29
Merge from eCos master repository on 1999-05-29-00:13:11-BST
| author | jlarmour |
|---|---|
| date | Fri, 28 May 1999 16:43:09 +0000 |
| parents | d376b777e2ce |
| children | 7253dcc42a09 |
comparison
equal
deleted
inserted
replaced
| 9:95cc44ea0068 | 10:d3fbcdfa1b2f |
|---|---|
| 91 // Disable the data cache | 91 // Disable the data cache |
| 92 #ifndef HAL_DCACHE_DISABLE_DEFINED | 92 #ifndef HAL_DCACHE_DISABLE_DEFINED |
| 93 #define HAL_DCACHE_DISABLE() | 93 #define HAL_DCACHE_DISABLE() |
| 94 #endif | 94 #endif |
| 95 | 95 |
| 96 #ifndef HAL_DCACHE_IS_ENABLED_DEFINED | |
| 97 #define HAL_DCACHE_IS_ENABLED(_state_) (_state_) = 1; | |
| 98 #endif | |
| 99 | |
| 96 // Invalidate the entire cache | 100 // Invalidate the entire cache |
| 97 // We simply use HAL_DCACHE_SYNC() to do this. For writeback caches this | 101 // We simply use HAL_DCACHE_SYNC() to do this. For writeback caches this |
| 98 // is not quite what we want, but there is no index-invalidate operation | 102 // is not quite what we want, but there is no index-invalidate operation |
| 99 // available. | 103 // available. |
| 100 #ifndef HAL_DCACHE_INVALIDATE_ALL_DEFINED | 104 #ifndef HAL_DCACHE_INVALIDATE_ALL_DEFINED |
| 107 #define HAL_DCACHE_SYNC() \ | 111 #define HAL_DCACHE_SYNC() \ |
| 108 { \ | 112 { \ |
| 109 register CYG_ADDRESS _baddr_ = 0x80000000; \ | 113 register CYG_ADDRESS _baddr_ = 0x80000000; \ |
| 110 register CYG_ADDRESS _addr_ = 0x80000000; \ | 114 register CYG_ADDRESS _addr_ = 0x80000000; \ |
| 111 register CYG_WORD _size_ = HAL_DCACHE_SIZE; \ | 115 register CYG_WORD _size_ = HAL_DCACHE_SIZE; \ |
| 116 register CYG_WORD _state_; \ | |
| 117 HAL_DCACHE_IS_ENABLED(_state_); \ | |
| 112 HAL_DCACHE_DISABLE(); \ | 118 HAL_DCACHE_DISABLE(); \ |
| 113 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ | 119 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ |
| 114 { \ | 120 { \ |
| 115 asm volatile ("cache 0x01,0(%0)" : : "r"(_addr_) ); \ | 121 asm volatile ("cache 0x01,0(%0)" : : "r"(_addr_) ); \ |
| 116 } \ | 122 } \ |
| 117 HAL_DCACHE_ENABLE(); \ | 123 if( _state_ ) HAL_DCACHE_ENABLE(); \ |
| 118 } | 124 } |
| 119 #endif | 125 #endif |
| 120 | 126 |
| 121 // Set the data cache refill burst size | 127 // Set the data cache refill burst size |
| 122 //#define HAL_DCACHE_BURST_SIZE(_size_) | 128 //#define HAL_DCACHE_BURST_SIZE(_size_) |
| 134 #define HAL_DCACHE_LOCK(_base_, _asize_) \ | 140 #define HAL_DCACHE_LOCK(_base_, _asize_) \ |
| 135 CYG_MACRO_START \ | 141 CYG_MACRO_START \ |
| 136 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ | 142 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ |
| 137 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ | 143 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ |
| 138 register CYG_WORD _size_ = (_asize_); \ | 144 register CYG_WORD _size_ = (_asize_); \ |
| 145 register CYG_WORD _state_; \ | |
| 146 HAL_DCACHE_IS_ENABLED(_state_); \ | |
| 139 HAL_DCACHE_DISABLE(); \ | 147 HAL_DCACHE_DISABLE(); \ |
| 140 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ | 148 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ |
| 141 { \ | 149 { \ |
| 142 asm volatile ("cache 0x1d,0(%0)" : : "r"(_addr_) ); \ | 150 asm volatile ("cache 0x1d,0(%0)" : : "r"(_addr_) ); \ |
| 143 } \ | 151 } \ |
| 144 HAL_DCACHE_ENABLE(); \ | 152 if( _state_ ) HAL_DCACHE_ENABLE(); \ |
| 145 CYG_MACRO_END | 153 CYG_MACRO_END |
| 146 #endif | 154 #endif |
| 147 | 155 |
| 148 // Undo a previous lock operation. | 156 // Undo a previous lock operation. |
| 149 // Do this by flushing the cache, which is defined to clear the lock bit. | 157 // Do this by flushing the cache, which is defined to clear the lock bit. |
| 172 #define HAL_DCACHE_FLUSH( _base_ , _asize_ ) \ | 180 #define HAL_DCACHE_FLUSH( _base_ , _asize_ ) \ |
| 173 { \ | 181 { \ |
| 174 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ | 182 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ |
| 175 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ | 183 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ |
| 176 register CYG_WORD _size_ = (_asize_); \ | 184 register CYG_WORD _size_ = (_asize_); \ |
| 185 register CYG_WORD _state_; \ | |
| 186 HAL_DCACHE_IS_ENABLED(_state_); \ | |
| 177 HAL_DCACHE_DISABLE(); \ | 187 HAL_DCACHE_DISABLE(); \ |
| 178 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ | 188 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ |
| 179 { \ | 189 { \ |
| 180 asm volatile ("cache 0x15,0(%0)" : : "r"(_addr_) ); \ | 190 asm volatile ("cache 0x15,0(%0)" : : "r"(_addr_) ); \ |
| 181 } \ | 191 } \ |
| 182 HAL_DCACHE_ENABLE(); \ | 192 if( _state_ ) HAL_DCACHE_ENABLE(); \ |
| 183 } | 193 } |
| 184 #endif | 194 #endif |
| 185 | 195 |
| 186 // Invalidate cache lines in the given range without writing to memory. | 196 // Invalidate cache lines in the given range without writing to memory. |
| 187 // This uses the hit-invalidate cache operation. | 197 // This uses the hit-invalidate cache operation. |
| 189 #define HAL_DCACHE_INVALIDATE( _base_ , _asize_ ) \ | 199 #define HAL_DCACHE_INVALIDATE( _base_ , _asize_ ) \ |
| 190 { \ | 200 { \ |
| 191 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ | 201 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ |
| 192 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ | 202 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ |
| 193 register CYG_WORD _size_ = (_asize_); \ | 203 register CYG_WORD _size_ = (_asize_); \ |
| 204 register CYG_WORD _state_; \ | |
| 205 HAL_DCACHE_IS_ENABLED(_state_); \ | |
| 194 HAL_DCACHE_DISABLE(); \ | 206 HAL_DCACHE_DISABLE(); \ |
| 195 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ | 207 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ |
| 196 { \ | 208 { \ |
| 197 asm volatile ("cache 0x11,0(%0)" : : "r"(_addr_) ); \ | 209 asm volatile ("cache 0x11,0(%0)" : : "r"(_addr_) ); \ |
| 198 } \ | 210 } \ |
| 199 HAL_DCACHE_ENABLE(); \ | 211 if( _state_ ) HAL_DCACHE_ENABLE(); \ |
| 200 } | 212 } |
| 201 #endif | 213 #endif |
| 202 | 214 |
| 203 // Write dirty cache lines to memory for the given address range. | 215 // Write dirty cache lines to memory for the given address range. |
| 204 // This uses the hit-writeback cache operation. | 216 // This uses the hit-writeback cache operation. |
| 206 #define HAL_DCACHE_STORE( _base_ , _asize_ ) \ | 218 #define HAL_DCACHE_STORE( _base_ , _asize_ ) \ |
| 207 { \ | 219 { \ |
| 208 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ | 220 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ |
| 209 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ | 221 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ |
| 210 register CYG_WORD _size_ = (_asize_); \ | 222 register CYG_WORD _size_ = (_asize_); \ |
| 223 register CYG_WORD _state_; \ | |
| 224 HAL_DCACHE_IS_ENABLED(_state_); \ | |
| 211 HAL_DCACHE_DISABLE(); \ | 225 HAL_DCACHE_DISABLE(); \ |
| 212 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ | 226 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ |
| 213 { \ | 227 { \ |
| 214 asm volatile ("cache 0x19,0(%0)" : : "r"(_addr_) ); \ | 228 asm volatile ("cache 0x19,0(%0)" : : "r"(_addr_) ); \ |
| 215 } \ | 229 } \ |
| 216 HAL_DCACHE_ENABLE(); \ | 230 if( _state_ ) HAL_DCACHE_ENABLE(); \ |
| 217 } | 231 } |
| 218 #endif | 232 #endif |
| 219 | 233 |
| 220 // Preread the given range into the cache with the intention of reading | 234 // Preread the given range into the cache with the intention of reading |
| 221 // from it later. | 235 // from it later. |
| 238 #endif | 252 #endif |
| 239 | 253 |
| 240 // Disable the instruction cache | 254 // Disable the instruction cache |
| 241 #ifndef HAL_ICACHE_DISABLE_DEFINED | 255 #ifndef HAL_ICACHE_DISABLE_DEFINED |
| 242 #define HAL_ICACHE_DISABLE() | 256 #define HAL_ICACHE_DISABLE() |
| 257 #endif | |
| 258 | |
| 259 #ifndef HAL_ICACHE_IS_ENABLED_DEFINED | |
| 260 #define HAL_ICACHE_IS_ENABLED(_state_) (_state_) = 1; | |
| 243 #endif | 261 #endif |
| 244 | 262 |
| 245 // Invalidate the entire cache | 263 // Invalidate the entire cache |
| 246 // This uses the index-invalidate cache operation. | 264 // This uses the index-invalidate cache operation. |
| 247 #ifndef HAL_ICACHE_INVALIDATE_ALL_DEFINED | 265 #ifndef HAL_ICACHE_INVALIDATE_ALL_DEFINED |
| 248 #define HAL_ICACHE_INVALIDATE_ALL() \ | 266 #define HAL_ICACHE_INVALIDATE_ALL() \ |
| 249 { \ | 267 { \ |
| 250 register CYG_ADDRESS _baddr_ = 0x80000000; \ | 268 register CYG_ADDRESS _baddr_ = 0x80000000; \ |
| 251 register CYG_ADDRESS _addr_ = 0x80000000; \ | 269 register CYG_ADDRESS _addr_ = 0x80000000; \ |
| 270 register CYG_WORD _state_; \ | |
| 271 HAL_ICACHE_IS_ENABLED(_state_); \ | |
| 252 HAL_ICACHE_DISABLE(); \ | 272 HAL_ICACHE_DISABLE(); \ |
| 253 for( ; _addr_ < _baddr_+HAL_ICACHE_SIZE; _addr_ += HAL_ICACHE_LINE_SIZE ) \ | 273 for( ; _addr_ < _baddr_+HAL_ICACHE_SIZE; _addr_ += HAL_ICACHE_LINE_SIZE ) \ |
| 254 { \ | 274 { \ |
| 255 asm volatile ("cache 0x00,0(%0)" : : "r"(_addr_) ); \ | 275 asm volatile ("cache 0x00,0(%0)" : : "r"(_addr_) ); \ |
| 256 } \ | 276 } \ |
| 257 HAL_ICACHE_ENABLE(); \ | 277 if( _state_ ) HAL_ICACHE_ENABLE(); \ |
| 258 } | 278 } |
| 259 #endif | 279 #endif |
| 260 | 280 |
| 261 // Synchronize the contents of the cache with memory. | 281 // Synchronize the contents of the cache with memory. |
| 262 // Simply force the cache to reload. | 282 // Simply force the cache to reload. |
| 274 #define HAL_ICACHE_LOCK(_base_, _asize_) \ | 294 #define HAL_ICACHE_LOCK(_base_, _asize_) \ |
| 275 CYG_MACRO_START \ | 295 CYG_MACRO_START \ |
| 276 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ | 296 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ |
| 277 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ | 297 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ |
| 278 register CYG_WORD _size_ = (_asize_); \ | 298 register CYG_WORD _size_ = (_asize_); \ |
| 279 HAL_DCACHE_DISABLE(); \ | 299 register CYG_WORD _state_; \ |
| 300 HAL_ICACHE_IS_ENABLED(_state_); \ | |
| 301 HAL_ICACHE_DISABLE(); \ | |
| 280 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ | 302 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ |
| 281 { \ | 303 { \ |
| 282 asm volatile ("cache 0x1c,0(%0)" : : "r"(_addr_) ); \ | 304 asm volatile ("cache 0x1c,0(%0)" : : "r"(_addr_) ); \ |
| 283 } \ | 305 } \ |
| 284 HAL_DCACHE_ENABLE(); \ | 306 if( _state_ ) HAL_ICACHE_ENABLE(); \ |
| 285 CYG_MACRO_END | 307 CYG_MACRO_END |
| 286 #endif | 308 #endif |
| 287 | 309 |
| 288 // Undo a previous lock operation. | 310 // Undo a previous lock operation. |
| 289 // Do this by invalidating the cache, which is defined to clear the lock bit. | 311 // Do this by invalidating the cache, which is defined to clear the lock bit. |
| 304 #define HAL_ICACHE_INVALIDATE( _base_ , _asize_ ) \ | 326 #define HAL_ICACHE_INVALIDATE( _base_ , _asize_ ) \ |
| 305 { \ | 327 { \ |
| 306 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ | 328 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ |
| 307 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ | 329 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ |
| 308 register CYG_WORD _size_ = (_asize_); \ | 330 register CYG_WORD _size_ = (_asize_); \ |
| 309 HAL_DCACHE_DISABLE(); \ | 331 register CYG_WORD _state_; \ |
| 310 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ | 332 HAL_ICACHE_IS_ENABLED(_state_); \ |
| 333 HAL_ICACHE_DISABLE(); \ | |
| 334 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_ICACHE_LINE_SIZE ) \ | |
| 311 { \ | 335 { \ |
| 312 asm volatile ("cache 0x10,0(%0)" : : "r"(_addr_) ); \ | 336 asm volatile ("cache 0x10,0(%0)" : : "r"(_addr_) ); \ |
| 313 } \ | 337 } \ |
| 314 HAL_DCACHE_ENABLE(); \ | 338 HAL_ICACHE_ENABLE(); \ |
| 315 } | 339 } |
| 316 #endif | 340 #endif |
| 317 | 341 |
| 318 //----------------------------------------------------------------------------- | 342 //----------------------------------------------------------------------------- |
| 319 // Check that a supported configuration has actually defined some macros. | 343 // Check that a supported configuration has actually defined some macros. |
