summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/or1k/shared/cache/cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libcpu/or1k/shared/cache/cache.c')
-rw-r--r--c/src/lib/libcpu/or1k/shared/cache/cache.c369
1 files changed, 0 insertions, 369 deletions
diff --git a/c/src/lib/libcpu/or1k/shared/cache/cache.c b/c/src/lib/libcpu/or1k/shared/cache/cache.c
deleted file mode 100644
index 898955f041..0000000000
--- a/c/src/lib/libcpu/or1k/shared/cache/cache.c
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * COPYRIGHT (c) 2014, 2016 ÅAC Microtec AB <www.aacmicrotec.com>
- * Contributor(s):
- * Karol Gugala <kgugala@antmicro.com>
- * Martin Werner <martin.werner@aacmicrotec.com>
- *
- * COPYRIGHT (c) 2014 Hesham ALMatary <heshamelmatary@gmail.com>
- *
- * COPYRIGHT (c) 1989-2006
- * On-Line Applications Research Corporation (OAR).
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
- */
-
-#include <rtems/score/cpu.h>
-#include <rtems/score/interr.h>
-#include <rtems/score/or1k-utility.h>
-#include <rtems/score/percpu.h>
-#include "cache_.h"
-
-static inline void _CPU_OR1K_Cache_data_block_prefetch(const void *d_addr)
-{
- ISR_Level level;
-
- _ISR_Local_disable (level);
-
- _OR1K_mtspr(CPU_OR1K_SPR_DCBPR, (uintptr_t) d_addr);
-
- _ISR_Local_enable(level);
-}
-
-static inline void _CPU_OR1K_Cache_data_block_writeback(const void *d_addr)
-{
- ISR_Level level;
-
- _ISR_Local_disable (level);
-
- _OR1K_mtspr(CPU_OR1K_SPR_DCBWR, (uintptr_t) d_addr);
-
- _ISR_Local_enable(level);
-}
-
-static inline void _CPU_OR1K_Cache_data_block_lock(const void *d_addr)
-{
- ISR_Level level;
-
- _ISR_Local_disable (level);
-
- _OR1K_mtspr(CPU_OR1K_SPR_DCBLR, (uintptr_t) d_addr);
-
- _ISR_Local_enable(level);
-}
-
-static inline void _CPU_OR1K_Cache_instruction_block_prefetch
-(const void *d_addr)
-{
- ISR_Level level;
-
- _ISR_Local_disable (level);
-
- _OR1K_mtspr(CPU_OR1K_SPR_ICBPR, (uintptr_t) d_addr);
-
- _ISR_Local_enable(level);
-}
-
-static inline void _CPU_OR1K_Cache_instruction_block_lock
-(const void *d_addr)
-{
- ISR_Level level;
-
- _ISR_Local_disable (level);
-
- _OR1K_mtspr(CPU_OR1K_SPR_ICBLR, (uintptr_t) d_addr);
-
- _ISR_Local_enable(level);
-}
-
-/* Implement RTEMS cache manager functions */
-
-void _CPU_cache_flush_1_data_line(const void *d_addr)
-{
- ISR_Level level;
-
- _ISR_Local_disable (level);
-
- _OR1K_mtspr(CPU_OR1K_SPR_DCBFR, (uintptr_t) d_addr);
-
- //__asm__ volatile("l.csync");
-
- _ISR_Local_enable(level);
-}
-
-void _CPU_cache_invalidate_1_data_line(const void *d_addr)
-{
- ISR_Level level;
-
- _ISR_Local_disable (level);
-
- _OR1K_mtspr(CPU_OR1K_SPR_DCBIR, (uintptr_t) d_addr);
-
- _ISR_Local_enable(level);
-}
-
-void _CPU_cache_freeze_data(void)
-{
- /* Do nothing */
-}
-
-void _CPU_cache_unfreeze_data(void)
-{
- /* Do nothing */
-}
-
-void _CPU_cache_invalidate_1_instruction_line(const void *d_addr)
-{
- ISR_Level level;
-
- _ISR_Local_disable (level);
-
- _OR1K_mtspr(CPU_OR1K_SPR_ICBIR, (uintptr_t) d_addr);
-
- _ISR_Local_enable(level);
-}
-
-void _CPU_cache_freeze_instruction(void)
-{
- /* Do nothing */
-}
-
-void _CPU_cache_unfreeze_instruction(void)
-{
- /* Do nothing */
-}
-
-void _CPU_cache_flush_entire_data(void)
-{
- size_t addr;
- ISR_Level level;
-
- _ISR_Local_disable (level);
-
- /* We have only 0 level cache so we do not need to invalidate others */
- for (
- addr = _CPU_cache_get_data_cache_size(0);
- addr > 0;
- addr -= CPU_DATA_CACHE_ALIGNMENT
- ) {
- _OR1K_mtspr(CPU_OR1K_SPR_DCBFR, (uintptr_t) addr);
- }
-
- _ISR_Local_enable (level);
-}
-
-void _CPU_cache_invalidate_entire_data(void)
-{
- size_t addr;
- ISR_Level level;
-
- _ISR_Local_disable (level);
-
- /* We have only 0 level cache so we do not need to invalidate others */
- for (
- addr = _CPU_cache_get_data_cache_size(0);
- addr > 0;
- addr -= CPU_DATA_CACHE_ALIGNMENT
- ) {
- _OR1K_mtspr(CPU_OR1K_SPR_DCBIR, (uintptr_t) addr);
- }
-
- _ISR_Local_enable (level);
-}
-
-void _CPU_cache_invalidate_entire_instruction(void)
-{
- size_t addr;
- ISR_Level level;
-
- _ISR_Local_disable (level);
-
- /* We have only 0 level cache so we do not need to invalidate others */
- for (
- addr = _CPU_cache_get_instruction_cache_size(0);
- addr > 0;
- addr -= CPU_INSTRUCTION_CACHE_ALIGNMENT
- ) {
- _OR1K_mtspr(CPU_OR1K_SPR_ICBIR, (uintptr_t) addr);
- }
-
- /* Flush instructions out of instruction buffer */
- __asm__ volatile("l.nop");
- __asm__ volatile("l.nop");
- __asm__ volatile("l.nop");
- __asm__ volatile("l.nop");
- __asm__ volatile("l.nop");
-
- _ISR_Local_enable (level);
-}
-
-/*
- * The range functions are copied almost verbatim from the generic
- * implementations in c/src/lib/libcpu/shared/src/cache_manager.c. The main
- * modification here is avoiding reapeated off/on toggling of the ISR for each
- * cache line operation.
- */
-
-void _CPU_cache_flush_data_range(const void *d_addr, size_t n_bytes)
-{
- const void * final_address;
- ISR_Level level;
-
- /*
- * Set d_addr to the beginning of the cache line; final_address indicates
- * the last address_t which needs to be pushed. Increment d_addr and push
- * the resulting line until final_address is passed.
- */
-
- if( n_bytes == 0 )
- /* Do nothing if number of bytes to flush is zero */
- return;
-
- final_address = (void *)((size_t)d_addr + n_bytes - 1);
- d_addr = (void *)((size_t)d_addr & ~(CPU_DATA_CACHE_ALIGNMENT - 1));
-
- if( final_address - d_addr > _CPU_cache_get_data_cache_size(0) ) {
- /*
- * Avoid iterating over the whole cache multiple times if the range is
- * larger than the cache size.
- */
- _CPU_cache_flush_entire_data();
- return;
- }
-
- _ISR_Local_disable (level);
-
- while( d_addr <= final_address ) {
- _OR1K_mtspr(CPU_OR1K_SPR_DCBFR, (uintptr_t) d_addr);
- d_addr = (void *)((size_t)d_addr + CPU_DATA_CACHE_ALIGNMENT);
- }
-
- _ISR_Local_enable (level);
-}
-
-void _CPU_cache_invalidate_data_range(const void *d_addr, size_t n_bytes)
-{
- const void * final_address;
- ISR_Level level;
-
- /*
- * Set d_addr to the beginning of the cache line; final_address indicates
- * the last address_t which needs to be pushed. Increment d_addr and push
- * the resulting line until final_address is passed.
- */
-
- if( n_bytes == 0 )
- /* Do nothing if number of bytes to flush is zero */
- return;
-
- final_address = (void *)((size_t)d_addr + n_bytes - 1);
- d_addr = (void *)((size_t)d_addr & ~(CPU_DATA_CACHE_ALIGNMENT - 1));
-
- if( final_address - d_addr > _CPU_cache_get_data_cache_size(0) ) {
- /*
- * Avoid iterating over the whole cache multiple times if the range is
- * larger than the cache size.
- */
- _CPU_cache_invalidate_entire_data();
- return;
- }
-
- _ISR_Local_disable (level);
-
- while( d_addr <= final_address ) {
- _OR1K_mtspr(CPU_OR1K_SPR_DCBIR, (uintptr_t) d_addr);
- d_addr = (void *)((size_t)d_addr + CPU_DATA_CACHE_ALIGNMENT);
- }
-
- _ISR_Local_enable (level);
-}
-
-void _CPU_cache_invalidate_instruction_range(const void *i_addr, size_t n_bytes)
-{
- const void * final_address;
- ISR_Level level;
-
- /*
- * Set i_addr to the beginning of the cache line; final_address indicates
- * the last address_t which needs to be pushed. Increment i_addr and push
- * the resulting line until final_address is passed.
- */
-
- if( n_bytes == 0 )
- /* Do nothing if number of bytes to flush is zero */
- return;
-
- final_address = (void *)((size_t)i_addr + n_bytes - 1);
- i_addr = (void *)((size_t)i_addr & ~(CPU_INSTRUCTION_CACHE_ALIGNMENT - 1));
-
- if( final_address - i_addr > _CPU_cache_get_data_cache_size(0) ) {
- /*
- * Avoid iterating over the whole cache multiple times if the range is
- * larger than the cache size.
- */
- _CPU_cache_invalidate_entire_instruction();
- return;
- }
-
- _ISR_Local_disable (level);
-
- while( i_addr <= final_address ) {
- _OR1K_mtspr(CPU_OR1K_SPR_ICBIR, (uintptr_t) i_addr);
- i_addr = (void *)((size_t)i_addr + CPU_DATA_CACHE_ALIGNMENT);
- }
-
- _ISR_Local_enable (level);
-}
-
-void _CPU_cache_enable_data(void)
-{
- uint32_t sr;
- ISR_Level level;
-
- _ISR_Local_disable (level);
-
- sr = _OR1K_mfspr(CPU_OR1K_SPR_SR);
- _OR1K_mtspr(CPU_OR1K_SPR_SR, sr | CPU_OR1K_SPR_SR_DCE);
-
- _ISR_Local_enable(level);
-}
-
-void _CPU_cache_disable_data(void)
-{
- uint32_t sr;
- ISR_Level level;
-
- _ISR_Local_disable (level);
-
- sr = _OR1K_mfspr(CPU_OR1K_SPR_SR);
- _OR1K_mtspr(CPU_OR1K_SPR_SR, (sr & ~CPU_OR1K_SPR_SR_DCE));
-
- _ISR_Local_enable(level);
-}
-
-void _CPU_cache_enable_instruction(void)
-{
- uint32_t sr;
- ISR_Level level;
-
- _ISR_Local_disable (level);
-
- sr = _OR1K_mfspr(CPU_OR1K_SPR_SR);
- _OR1K_mtspr(CPU_OR1K_SPR_SR, sr | CPU_OR1K_SPR_SR_ICE);
-
- _ISR_Local_enable(level);
-}
-
-void _CPU_cache_disable_instruction(void)
-{
- uint32_t sr;
- ISR_Level level;
-
- _ISR_Local_disable (level);
-
- sr = _OR1K_mfspr(CPU_OR1K_SPR_SR);
- _OR1K_mtspr(CPU_OR1K_SPR_SR, (sr & ~CPU_OR1K_SPR_SR_ICE));
-
- _ISR_Local_enable(level);
-}