diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-02-24 12:45:00 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-02-24 16:12:02 +0100 |
commit | a4bc90af4ee55e72b18de4b64da6338634490760 (patch) | |
tree | 64cd9a60f941054d469ce5061d9d77847de2e308 /cpukit | |
parent | score: Fix thread TLS area initialization (diff) | |
download | rtems-a4bc90af4ee55e72b18de4b64da6338634490760.tar.bz2 |
sparc: Fix CPU counter support
The SPARC processors supported by RTEMS have no built-in CPU counter
support. We have to use some hardware counter module for this purpose.
The BSP must provide a 32-bit register which contains the current CPU
counter value and a function for the difference calculation. It can use
for example the GPTIMER instance used for the clock driver.
Diffstat (limited to 'cpukit')
-rw-r--r-- | cpukit/score/cpu/sparc/Makefile.am | 1 | ||||
-rw-r--r-- | cpukit/score/cpu/sparc/rtems/score/cpu.h | 51 | ||||
-rw-r--r-- | cpukit/score/cpu/sparc/sparc-counter.c | 34 |
3 files changed, 84 insertions, 2 deletions
diff --git a/cpukit/score/cpu/sparc/Makefile.am b/cpukit/score/cpu/sparc/Makefile.am index 504a5752fe..c6ea1c3da9 100644 --- a/cpukit/score/cpu/sparc/Makefile.am +++ b/cpukit/score/cpu/sparc/Makefile.am @@ -11,6 +11,7 @@ include_rtems_score_HEADERS += rtems/score/cpuatomic.h noinst_LIBRARIES = libscorecpu.a libscorecpu_a_SOURCES = cpu.c cpu_asm.S +libscorecpu_a_SOURCES += sparc-counter.c libscorecpu_a_SOURCES += sparcv8-atomic.c libscorecpu_a_CPPFLAGS = $(AM_CPPFLAGS) diff --git a/cpukit/score/cpu/sparc/rtems/score/cpu.h b/cpukit/score/cpu/sparc/rtems/score/cpu.h index ee6f7136e6..47529c3b9e 100644 --- a/cpukit/score/cpu/sparc/rtems/score/cpu.h +++ b/cpukit/score/cpu/sparc/rtems/score/cpu.h @@ -1273,14 +1273,61 @@ static inline uint32_t CPU_swap_u32( typedef uint32_t CPU_Counter_ticks; -CPU_Counter_ticks _CPU_Counter_read( void ); +typedef CPU_Counter_ticks (*SPARC_Counter_difference)( + CPU_Counter_ticks second, + CPU_Counter_ticks first +); + +/* + * The SPARC processors supported by RTEMS have no built-in CPU counter + * support. We have to use some hardware counter module for this purpose. The + * BSP must provide a 32-bit register which contains the current CPU counter + * value and a function for the difference calculation. It can use for example + * the GPTIMER instance used for the clock driver. + */ +typedef struct { + volatile const CPU_Counter_ticks *counter_register; + SPARC_Counter_difference counter_difference; +} SPARC_Counter; + +extern SPARC_Counter _SPARC_Counter; + +/* + * 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_default( + CPU_Counter_ticks second, + CPU_Counter_ticks first +); + +static inline bool _SPARC_Counter_is_default( void ) +{ + return _SPARC_Counter.counter_difference + == _SPARC_Counter_difference_default; +} + +static inline void _SPARC_Counter_initialize( + volatile const CPU_Counter_ticks *counter_register, + SPARC_Counter_difference counter_difference +) +{ + _SPARC_Counter.counter_register = counter_register; + _SPARC_Counter.counter_difference = counter_difference; +} + +static inline CPU_Counter_ticks _CPU_Counter_read( void ) +{ + return *_SPARC_Counter.counter_register; +} static inline CPU_Counter_ticks _CPU_Counter_difference( CPU_Counter_ticks second, CPU_Counter_ticks first ) { - return second - first; + return (*_SPARC_Counter.counter_difference)( second, first ); } #endif /* ASM */ diff --git a/cpukit/score/cpu/sparc/sparc-counter.c b/cpukit/score/cpu/sparc/sparc-counter.c new file mode 100644 index 0000000000..dc69b6baeb --- /dev/null +++ b/cpukit/score/cpu/sparc/sparc-counter.c @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2014 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * <rtems@embedded-brains.de> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#if HAVE_CONFIG_H + #include "config.h" +#endif + +#include <rtems/score/cpu.h> + +static CPU_Counter_ticks _SPARC_Counter_register_dummy; + +CPU_Counter_ticks _SPARC_Counter_difference_default( + CPU_Counter_ticks second, + CPU_Counter_ticks first +) +{ + return 1; +} + +SPARC_Counter _SPARC_Counter = { + .counter_register = &_SPARC_Counter_register_dummy, + .counter_difference = _SPARC_Counter_difference_default +}; |