From 655ce0fb00c75c523dd81466a2dcf611171e4650 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 22 Jun 2016 13:45:02 +0200 Subject: sparc: Optimize CPU counter support --- c/src/lib/libbsp/sparc/erc32/clock/ckinit.c | 7 +- c/src/lib/libbsp/sparc/leon2/clock/ckinit.c | 7 +- c/src/lib/libbsp/sparc/leon3/startup/cpucounter.c | 7 +- cpukit/score/cpu/sparc/Makefile.am | 1 + cpukit/score/cpu/sparc/preinstall.am | 4 + cpukit/score/cpu/sparc/rtems/score/cpu.h | 39 +--------- cpukit/score/cpu/sparc/rtems/score/sparcimpl.h | 90 +++++++++++++++++++++++ cpukit/score/cpu/sparc/sparc-counter.c | 2 +- 8 files changed, 104 insertions(+), 53 deletions(-) create mode 100644 cpukit/score/cpu/sparc/rtems/score/sparcimpl.h diff --git a/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c b/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c index cb5cee86fc..fd05a2cf59 100644 --- a/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c +++ b/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c @@ -26,6 +26,7 @@ #include #include #include +#include #if SIMSPARC_FAST_IDLE==1 #define CLOCK_DRIVER_USE_FAST_IDLE 1 @@ -133,8 +134,4 @@ static void erc32_counter_initialize( uint32_t frequency ) #include "../../../shared/clockdrv_shell.h" -SPARC_Counter _SPARC_Counter = { - .counter_read = _SPARC_Counter_read_address, - .counter_difference = _SPARC_Counter_difference_one, - .counter_address = (uint32_t *) &_SPARC_Counter -}; +SPARC_COUNTER_DEFINITION; diff --git a/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c index f21bd18720..ced5d3fa06 100644 --- a/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c +++ b/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c @@ -25,6 +25,7 @@ #include #include #include +#include #if SIMSPARC_FAST_IDLE==1 #define CLOCK_DRIVER_USE_FAST_IDLE 1 @@ -106,8 +107,4 @@ extern int CLOCK_SPEED; #include "../../../shared/clockdrv_shell.h" -SPARC_Counter _SPARC_Counter = { - .counter_read = _SPARC_Counter_read_address, - .counter_difference = _SPARC_Counter_difference_one, - .counter_address = (uint32_t *) &_SPARC_Counter -}; +SPARC_COUNTER_DEFINITION; diff --git a/c/src/lib/libbsp/sparc/leon3/startup/cpucounter.c b/c/src/lib/libbsp/sparc/leon3/startup/cpucounter.c index 53d921a66a..7aaf98a2fc 100644 --- a/c/src/lib/libbsp/sparc/leon3/startup/cpucounter.c +++ b/c/src/lib/libbsp/sparc/leon3/startup/cpucounter.c @@ -16,6 +16,7 @@ #include #include +#include static void leon3_counter_initialize(void) { @@ -73,8 +74,4 @@ RTEMS_SYSINIT_ITEM( RTEMS_SYSINIT_ORDER_THIRD ); -SPARC_Counter _SPARC_Counter = { - .counter_read = _SPARC_Counter_read_address, - .counter_difference = _SPARC_Counter_difference_one, - .counter_address = (uint32_t *) &_SPARC_Counter -}; +SPARC_COUNTER_DEFINITION; diff --git a/cpukit/score/cpu/sparc/Makefile.am b/cpukit/score/cpu/sparc/Makefile.am index 11b5d11d7f..2de5fcad73 100644 --- a/cpukit/score/cpu/sparc/Makefile.am +++ b/cpukit/score/cpu/sparc/Makefile.am @@ -6,6 +6,7 @@ include_rtems_HEADERS = rtems/asm.h include_rtems_scoredir = $(includedir)/rtems/score include_rtems_score_HEADERS = rtems/score/sparc.h include_rtems_score_HEADERS += rtems/score/cpu.h +include_rtems_score_HEADERS += rtems/score/sparcimpl.h include_rtems_score_HEADERS += rtems/score/types.h include_rtems_score_HEADERS += rtems/score/cpuatomic.h diff --git a/cpukit/score/cpu/sparc/preinstall.am b/cpukit/score/cpu/sparc/preinstall.am index a2bb01bfd2..c2df31c6c5 100644 --- a/cpukit/score/cpu/sparc/preinstall.am +++ b/cpukit/score/cpu/sparc/preinstall.am @@ -35,6 +35,10 @@ $(PROJECT_INCLUDE)/rtems/score/cpu.h: rtems/score/cpu.h $(PROJECT_INCLUDE)/rtems $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/cpu.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/cpu.h +$(PROJECT_INCLUDE)/rtems/score/sparcimpl.h: rtems/score/sparcimpl.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/sparcimpl.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/sparcimpl.h + $(PROJECT_INCLUDE)/rtems/score/types.h: rtems/score/types.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/types.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/types.h diff --git a/cpukit/score/cpu/sparc/rtems/score/cpu.h b/cpukit/score/cpu/sparc/rtems/score/cpu.h index c87618db85..5823544a80 100644 --- a/cpukit/score/cpu/sparc/rtems/score/cpu.h +++ b/cpukit/score/cpu/sparc/rtems/score/cpu.h @@ -1306,7 +1306,7 @@ typedef uint32_t CPU_Counter_ticks; typedef CPU_Counter_ticks ( *SPARC_Counter_read )( void ); -typedef CPU_Counter_ticks (*SPARC_Counter_difference)( +typedef CPU_Counter_ticks ( *SPARC_Counter_difference )( CPU_Counter_ticks second, CPU_Counter_ticks first ); @@ -1324,42 +1324,7 @@ typedef struct { volatile const CPU_Counter_ticks *counter_address; } SPARC_Counter; -extern SPARC_Counter _SPARC_Counter; - -CPU_Counter_ticks _SPARC_Counter_read_address( void ); - -CPU_Counter_ticks _SPARC_Counter_read_asr23( void ); - -CPU_Counter_ticks _SPARC_Counter_difference_normal( - CPU_Counter_ticks second, - CPU_Counter_ticks first -); - -CPU_Counter_ticks _SPARC_Counter_difference_clock_period( - CPU_Counter_ticks second, - CPU_Counter_ticks first -); - -/* - * Returns always a value of one regardless of the parameters. This prevents - * an infinite loop in rtems_counter_delay_ticks(). Its only a reasonably safe - * default. - */ -CPU_Counter_ticks _SPARC_Counter_difference_one( - CPU_Counter_ticks second, - CPU_Counter_ticks first -); - -static inline void _SPARC_Counter_initialize( - SPARC_Counter_read counter_read, - SPARC_Counter_difference counter_difference, - volatile const CPU_Counter_ticks *counter_address -) -{ - _SPARC_Counter.counter_read = counter_read; - _SPARC_Counter.counter_difference = counter_difference; - _SPARC_Counter.counter_address = counter_address; -} +extern const SPARC_Counter _SPARC_Counter; static inline CPU_Counter_ticks _CPU_Counter_read( void ) { diff --git a/cpukit/score/cpu/sparc/rtems/score/sparcimpl.h b/cpukit/score/cpu/sparc/rtems/score/sparcimpl.h new file mode 100644 index 0000000000..9f9999b063 --- /dev/null +++ b/cpukit/score/cpu/sparc/rtems/score/sparcimpl.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2016 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * 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 _RTEMS_SCORE_SPARCIMPL_H +#define _RTEMS_SCORE_SPARCIMPL_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* + * Provides a mutable alias to _SPARC_Counter for use in + * _SPARC_Counter_initialize(). The _SPARC_Counter and _SPARC_Counter_mutable + * are defined via the SPARC_COUNTER_DEFINITION define. + */ +extern SPARC_Counter _SPARC_Counter_mutable; + +CPU_Counter_ticks _SPARC_Counter_read_address( void ); + +CPU_Counter_ticks _SPARC_Counter_read_asr23( void ); + +CPU_Counter_ticks _SPARC_Counter_difference_normal( + CPU_Counter_ticks second, + CPU_Counter_ticks first +); + +CPU_Counter_ticks _SPARC_Counter_difference_clock_period( + CPU_Counter_ticks second, + CPU_Counter_ticks first +); + +/* + * Returns always a value of one regardless of the parameters. This prevents + * an infinite loop in rtems_counter_delay_ticks(). Its only a reasonably safe + * default. + */ +CPU_Counter_ticks _SPARC_Counter_difference_one( + CPU_Counter_ticks second, + CPU_Counter_ticks first +); + +static inline void _SPARC_Counter_initialize( + SPARC_Counter_read counter_read, + SPARC_Counter_difference counter_difference, + volatile const CPU_Counter_ticks *counter_address +) +{ + _SPARC_Counter_mutable.counter_read = counter_read; + _SPARC_Counter_mutable.counter_difference = counter_difference; + _SPARC_Counter_mutable.counter_address = counter_address; +} + +/* + * Defines the _SPARC_Counter and _SPARC_Counter_mutable global variables. + * Place this define in the global file scope of the CPU counter support file + * of the BSP. + */ +#define SPARC_COUNTER_DEFINITION \ + __asm__ ( \ + "\t.global\t_SPARC_Counter\n" \ + "\t.global\t_SPARC_Counter_mutable\n" \ + "\t.section\t.data._SPARC_Counter,\"aw\",@progbits\n" \ + "\t.align\t4\n" \ + "\t.type\t_SPARC_Counter, #object\n" \ + "\t.size\t_SPARC_Counter, 12\n" \ + "_SPARC_Counter:\n" \ + "_SPARC_Counter_mutable:\n" \ + "\t.long\t_SPARC_Counter_read_address\n" \ + "\t.long\t_SPARC_Counter_difference_one\n" \ + "\t.long\t_SPARC_Counter\n" \ + ) + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _RTEMS_SCORE_SPARCIMPL_H */ diff --git a/cpukit/score/cpu/sparc/sparc-counter.c b/cpukit/score/cpu/sparc/sparc-counter.c index 658a47c37e..9bc4061e9e 100644 --- a/cpukit/score/cpu/sparc/sparc-counter.c +++ b/cpukit/score/cpu/sparc/sparc-counter.c @@ -16,7 +16,7 @@ #include "config.h" #endif -#include +#include #include CPU_Counter_ticks _SPARC_Counter_difference_normal( -- cgit v1.2.3