Implement new cache functions for or1k and create new bspstart function for or1ksim to initialize instruction and data caches. Also, sim.cfg is modified to enable/confiure cache units. --- c/src/lib/libbsp/or1k/or1ksim/Makefile.am | 14 +- c/src/lib/libbsp/or1k/or1ksim/preinstall.am | 4 + c/src/lib/libbsp/or1k/or1ksim/sim.cfg | 21 +- c/src/lib/libbsp/or1k/or1ksim/startup/bspstart.c | 25 +++ c/src/lib/libbsp/or1k/shared/include/cache_.h | 43 ++++ c/src/lib/libcpu/or1k/Makefile.am | 3 +- c/src/lib/libcpu/or1k/preinstall.am | 4 + c/src/lib/libcpu/or1k/shared/cache/cache.c | 241 +++++++++++++++++++++++ c/src/lib/libcpu/or1k/shared/cache/cache_.h | 2 +- 9 files changed, 339 insertions(+), 18 deletions(-) create mode 100644 c/src/lib/libbsp/or1k/or1ksim/startup/bspstart.c create mode 100644 c/src/lib/libbsp/or1k/shared/include/cache_.h create mode 100644 c/src/lib/libcpu/or1k/shared/cache/cache.c
diff --git a/c/src/lib/libbsp/or1k/or1ksim/Makefile.am b/c/src/lib/libbsp/or1k/or1ksim/Makefile.am index 7af4fd0..cf6b8b8 100644 --- a/c/src/lib/libbsp/or1k/or1ksim/Makefile.am +++ b/c/src/lib/libbsp/or1k/or1ksim/Makefile.am @@ -30,6 +30,7 @@ include_bsp_HEADERS += ../../shared/include/irq-info.h include_bsp_HEADERS += ../../shared/include/stackalloc.h include_bsp_HEADERS += ../../shared/include/uart-output-char.h include_bsp_HEADERS += ../../shared/tod.h +include_bsp_HEADERS += ../shared/include/cache_.h include_bsp_HEADERS += include/irq.h include_bsp_HEADERS += include/uart.h include_bsp_HEADERS += include/or1ksim.h @@ -61,8 +62,8 @@ libbsp_a_CPPFLAGS = libbsp_a_LIBADD = # Startup -libbsp_a_SOURCES += ../../shared/bspstart.c libbsp_a_SOURCES += ../../shared/bspreset.c +libbsp_a_SOURCES += startup/bspstart.c # Shared libbsp_a_SOURCES += ../../shared/bootcard.c @@ -72,8 +73,6 @@ libbsp_a_SOURCES += ../../shared/bsplibc.c libbsp_a_SOURCES += ../../shared/bsppost.c libbsp_a_SOURCES += ../../shared/bsppredriverhook.c libbsp_a_SOURCES += ../../shared/bsppretaskinghook.c -libbsp_a_SOURCES += ../../shared/cpucounterread.c -libbsp_a_SOURCES += ../../shared/cpucounterdiff.c libbsp_a_SOURCES += ../../shared/gnatinstallhandler.c libbsp_a_SOURCES += ../../shared/sbrk.c libbsp_a_SOURCES += ../../shared/src/stackalloc.c @@ -100,9 +99,12 @@ libbsp_a_SOURCES += ../../shared/src/irq-info.c libbsp_a_SOURCES += irq/irq.c # Cache -libbsp_a_SOURCES += ../../../libcpu/shared/src/cache_manager.c -libbsp_a_SOURCES += ../../shared/include/cache_.h -libbsp_a_CPPFLAGS += -I$(srcdir)/../../shared/include +# Cache +libbsp_a_LIBADD += ../../../libcpu/@RTEMS_CPU@/shared/cache.rel + +#libbsp_a_SOURCES += ../../../libcpu/shared/src/cache_manager.c +#libbsp_a_SOURCES += ../../shared/include/cache_.h +#libbsp_a_CPPFLAGS += -I$(srcdir)/../../shared/include ############################################################################### # Special Rules # diff --git a/c/src/lib/libbsp/or1k/or1ksim/preinstall.am b/c/src/lib/libbsp/or1k/or1ksim/preinstall.am index 1561b18..c0fa6b8 100644 --- a/c/src/lib/libbsp/or1k/or1ksim/preinstall.am +++ b/c/src/lib/libbsp/or1k/or1ksim/preinstall.am @@ -86,6 +86,10 @@ $(PROJECT_INCLUDE)/bsp/tod.h: ../../shared/tod.h $(PROJECT_INCLUDE)/bsp/$(dirsta $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/tod.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/tod.h +$(PROJECT_INCLUDE)/bsp/cache_.h: ../shared/include/cache_.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/cache_.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/cache_.h + $(PROJECT_INCLUDE)/bsp/irq.h: include/irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq.h diff --git a/c/src/lib/libbsp/or1k/or1ksim/sim.cfg b/c/src/lib/libbsp/or1k/or1ksim/sim.cfg index 061f61a..ec73e3d 100644 --- a/c/src/lib/libbsp/or1k/or1ksim/sim.cfg +++ b/c/src/lib/libbsp/or1k/or1ksim/sim.cfg @@ -35,23 +35,23 @@ section mc end section ic - enabled = 0 + enabled = 1 nsets = 256 nways = 1 - blocksize = 16 + blocksize = 32 hitdelay = 20 - missdelay = 20 + missdelay = 60 end section dc - enabled = 0 - nsets = 256 + enabled = 1 + nsets = 256 nways = 1 - blocksize = 16 - load_hitdelay = 0 - load_missdelay = 0 - store_hitdelay = 0 - store_missdelay = 0 + blocksize = 32 + load_hitdelay = 40 + load_missdelay = 120 + store_hitdelay = 40 + store_missdelay = 120 end section pic @@ -78,6 +78,7 @@ section cpu ver = 0x12 cfg = 0x00 rev = 0x0001 + upr = 0x0000075f superscalar = 0 hazards = 0 dependstats = 0 diff --git a/c/src/lib/libbsp/or1k/or1ksim/startup/bspstart.c b/c/src/lib/libbsp/or1k/or1ksim/startup/bspstart.c new file mode 100644 index 0000000..d9fb7a7 --- /dev/null +++ b/c/src/lib/libbsp/or1k/or1ksim/startup/bspstart.c @@ -0,0 +1,25 @@ +/** + * @file + * + * @ingroup or1ksim + * + * @brief Benchmark timer support. + */ + +/* + * Copyright (c) 2014 by Hesham ALMatary + * + * 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 <bsp.h> +#include <bsp/bootcard.h> +#include <libcpu/cache.h> + +void bsp_start( void ) +{ + _CPU_cache_enable_instruction(); + _CPU_cache_enable_data(); +} diff --git a/c/src/lib/libbsp/or1k/shared/include/cache_.h b/c/src/lib/libbsp/or1k/shared/include/cache_.h new file mode 100644 index 0000000..ee54227 --- /dev/null +++ b/c/src/lib/libbsp/or1k/shared/include/cache_.h @@ -0,0 +1,43 @@ +/* + * COPYRIGHT (c) 2014 Hesham ALMatary <heshamelmat...@gmail.com> + * + * 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. + */ + +#ifndef LIBBSP_OR1K_SHARED_CACHE_H +#define LIBBSP_OR1K_SHARED_CACHE_H + +#include <assert.h> +#include <bsp.h> +#include <rtems/rtems/intr.h> + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* These two defines also ensure that the rtems_cache_* functions have bodies */ +#define CPU_DATA_CACHE_ALIGNMENT 32 +#define CPU_INSTRUCTION_CACHE_ALIGNMENT 32 + +#define CPU_CACHE_SUPPORT_PROVIDES_CACHE_SIZE_FUNCTIONS 1 + +static inline size_t +_CPU_cache_get_data_cache_size( const uint32_t level ) +{ + return (level == 0 || level == 1)? 8192 : 0; +} + +static inline size_t +_CPU_cache_get_instruction_cache_size( const uint32_t level ) +{ + return (level == 0 || level == 1)? 8192 : 0; +} + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* LIBBSP_OR1K_SHARED_CACHE_H */ diff --git a/c/src/lib/libcpu/or1k/Makefile.am b/c/src/lib/libcpu/or1k/Makefile.am index f4a6372..0148548 100644 --- a/c/src/lib/libcpu/or1k/Makefile.am +++ b/c/src/lib/libcpu/or1k/Makefile.am @@ -10,8 +10,9 @@ include_libcpudir = $(includedir)/libcpu ## shared/cache include_libcpu_HEADERS = ../shared/include/cache.h +include_libcpu_HEADERS += shared/cache/cache_.h noinst_PROGRAMS += shared/cache.rel -shared_cache_rel_SOURCES = ../shared/src/no_cache.c shared/cache/cache_.h +shared_cache_rel_SOURCES = shared/cache/cache.c ../shared/src/cache_manager.c shared_cache_rel_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/shared/cache shared_cache_rel_LDFLAGS = $(RTEMS_RELLDFLAGS) diff --git a/c/src/lib/libcpu/or1k/preinstall.am b/c/src/lib/libcpu/or1k/preinstall.am index ee9d0da..84864cb 100644 --- a/c/src/lib/libcpu/or1k/preinstall.am +++ b/c/src/lib/libcpu/or1k/preinstall.am @@ -22,3 +22,7 @@ $(PROJECT_INCLUDE)/libcpu/cache.h: ../shared/include/cache.h $(PROJECT_INCLUDE)/ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/cache.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/cache.h +$(PROJECT_INCLUDE)/libcpu/cache_.h: shared/cache/cache_.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/cache_.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/cache_.h + diff --git a/c/src/lib/libcpu/or1k/shared/cache/cache.c b/c/src/lib/libcpu/or1k/shared/cache/cache.c new file mode 100644 index 0000000..fdc67ce --- /dev/null +++ b/c/src/lib/libcpu/or1k/shared/cache/cache.c @@ -0,0 +1,241 @@ +/* + * COPYRIGHT (c) 2014 Hesham ALMatary <heshamelmat...@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 <libcpu/cache.h> + +static inline void _CPU_OR1K_Cache_enable_data(void) +{ + uint32_t sr; + ISR_Level level; + + _ISR_Disable (level); + sr = _OR1K_mfspr(CPU_OR1K_SPR_SR); + _OR1K_mtspr(CPU_OR1K_SPR_SR, sr | CPU_OR1K_SPR_SR_DCE); + + _ISR_Enable(level); +} + +static inline void _CPU_OR1K_Cache_disable_data(void) +{ + uint32_t sr; + ISR_Level level; + + _ISR_Disable (level); + + sr = _OR1K_mfspr(CPU_OR1K_SPR_SR); + _OR1K_mtspr(CPU_OR1K_SPR_SR, (sr & ~CPU_OR1K_SPR_SR_DCE)); + + _ISR_Enable(level); +} + +static inline void _CPU_OR1K_Cache_enable_instruction(void) +{ + uint32_t sr; + ISR_Level level; + + _ISR_Disable (level); + + sr = _OR1K_mfspr(CPU_OR1K_SPR_SR); + _OR1K_mtspr(CPU_OR1K_SPR_SR, sr | CPU_OR1K_SPR_SR_ICE); + + _ISR_Enable(level); +} + +static inline void _CPU_OR1K_Cache_disable_instruction(void) +{ + uint32_t sr; + ISR_Level level; + + _ISR_Disable (level); + + sr = _OR1K_mfspr(CPU_OR1K_SPR_SR); + _OR1K_mtspr(CPU_OR1K_SPR_SR, (sr & ~CPU_OR1K_SPR_SR_ICE)); + + _ISR_Enable(level); +} + +static inline void _CPU_OR1K_Cache_data_block_prefetch(const void *d_addr) +{ + ISR_Level level; + + _ISR_Disable (level); + + _OR1K_mtspr(CPU_OR1K_SPR_DCBPR, d_addr); + + _ISR_Enable(level); +} + +static inline void _CPU_OR1K_Cache_data_block_flush(const void *d_addr) +{ + ISR_Level level; + _ISR_Disable (level); + + _OR1K_mtspr(CPU_OR1K_SPR_DCBFR, d_addr); + + _ISR_Enable(level); +} + +static inline void _CPU_OR1K_Cache_data_block_invalidate(const void *d_addr) +{ + ISR_Level level; + _ISR_Disable (level); + + _OR1K_mtspr(CPU_OR1K_SPR_DCBIR, d_addr); + + _ISR_Enable(level); +} + +static inline void _CPU_OR1K_Cache_data_block_writeback(const void *d_addr) +{ + ISR_Level level; + _ISR_Disable (level); + + _OR1K_mtspr(CPU_OR1K_SPR_DCBWR, d_addr); + + _ISR_Enable(level); +} + +static inline void _CPU_OR1K_Cache_data_block_lock(const void *d_addr) +{ + ISR_Level level; + _ISR_Disable (level); + + _OR1K_mtspr(CPU_OR1K_SPR_DCBLR, d_addr); + + _ISR_Enable(level); +} + +static inline void _CPU_OR1K_Cache_instruction_block_prefetch +(const void *d_addr) +{ + ISR_Level level; + _ISR_Disable (level); + + _OR1K_mtspr(CPU_OR1K_SPR_ICBPR, d_addr); + + _ISR_Enable(level); +} + +static inline void _CPU_OR1K_Cache_instruction_block_invalidate +(const void *d_addr) +{ + ISR_Level level; + _ISR_Disable (level); + + _OR1K_mtspr(CPU_OR1K_SPR_ICBIR, d_addr); + + _ISR_Enable(level); +} + +static inline void _CPU_OR1K_Cache_instruction_block_lock +(const void *d_addr) +{ + ISR_Level level; + _ISR_Disable (level); + + _OR1K_mtspr(CPU_OR1K_SPR_ICBLR, d_addr); + + _ISR_Enable(level); +} + +/* Implement RTEMS cache manager functions */ + +void _CPU_cache_flush_1_data_line(const void *d_addr) +{ + ISR_Level level; + _ISR_Disable (level); + + _CPU_OR1K_Cache_data_block_flush(d_addr); + + //asm volatile("l.csync"); + + _ISR_Enable(level); +} + +void _CPU_cache_invalidate_1_data_line(const void *d_addr) +{ + ISR_Level level; + _ISR_Disable (level); + + _CPU_OR1K_Cache_data_block_invalidate(d_addr); + + _ISR_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_Disable (level); + + _CPU_OR1K_Cache_instruction_block_invalidate(d_addr); + + _ISR_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) +{ + +} + +void _CPU_cache_invalidate_entire_data(void) +{ + +} + +void _CPU_cache_invalidate_entire_instruction(void) +{ + +} + +void _CPU_cache_enable_data(void) +{ + _CPU_OR1K_Cache_enable_data(); +} + +void _CPU_cache_disable_data(void) +{ + _CPU_OR1K_Cache_disable_data(); + +} + +void _CPU_cache_enable_instruction(void) +{ + + _CPU_OR1K_Cache_enable_instruction(); +} + +void _CPU_cache_disable_instruction(void) +{ + _CPU_OR1K_Cache_disable_instruction(); +} diff --git a/c/src/lib/libcpu/or1k/shared/cache/cache_.h b/c/src/lib/libcpu/or1k/shared/cache/cache_.h index 08d9ecc..5f08410 100644 --- a/c/src/lib/libcpu/or1k/shared/cache/cache_.h +++ b/c/src/lib/libcpu/or1k/shared/cache/cache_.h @@ -5,7 +5,7 @@ #ifndef __OR1K_CACHE_H #define __OR1K_CACHE_H -#include <libcpu/cache.h> +#include <bsp/cache_.h> #endif /* end of include file */ -- 1.9.3 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel