sparc: Optimize CPU counter support

This commit is contained in:
Sebastian Huber
2016-06-22 13:45:02 +02:00
parent 3d9fd2ce55
commit 655ce0fb00
8 changed files with 104 additions and 53 deletions

View File

@@ -26,6 +26,7 @@
#include <bspopts.h>
#include <rtems/counter.h>
#include <rtems/timecounter.h>
#include <rtems/score/sparcimpl.h>
#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;

View File

@@ -25,6 +25,7 @@
#include <bsp.h>
#include <bspopts.h>
#include <rtems/timecounter.h>
#include <rtems/score/sparcimpl.h>
#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;

View File

@@ -16,6 +16,7 @@
#include <rtems/counter.h>
#include <rtems/sysinit.h>
#include <rtems/score/sparcimpl.h>
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;

View File

@@ -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

View File

@@ -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

View File

@@ -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 )
{

View File

@@ -0,0 +1,90 @@
/*
* Copyright (c) 2016 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.org/license/LICENSE.
*/
#ifndef _RTEMS_SCORE_SPARCIMPL_H
#define _RTEMS_SCORE_SPARCIMPL_H
#include <rtems/score/cpu.h>
#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 */

View File

@@ -16,7 +16,7 @@
#include "config.h"
#endif
#include <rtems/score/cpu.h>
#include <rtems/score/sparcimpl.h>
#include <rtems/config.h>
CPU_Counter_ticks _SPARC_Counter_difference_normal(