diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-05-23 14:17:25 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-06-15 13:02:44 +0200 |
commit | 65f868cac6f7fd5c3ad02046574c19f8f4673255 (patch) | |
tree | 15103fb87ed2e7161c17006e2c077f35e3506a95 /bsps/arm | |
parent | Add RTEMS_SYSINIT_CPU_COUNTER (diff) | |
download | rtems-65f868cac6f7fd5c3ad02046574c19f8f4673255.tar.bz2 |
Add _CPU_Counter_frequency()
Add rtems_counter_frequency() API function. Use it to initialize the
counter value converter via the new system initialization step
(RTEMS_SYSINIT_CPU_COUNTER). This decouples the counter implementation
and the counter converter. It avoids an unnecessary pull in of the
64-bit integer division from libgcc.
Update #3456.
Diffstat (limited to 'bsps/arm')
-rw-r--r-- | bsps/arm/altera-cyclone-v/start/bspstart.c | 2 | ||||
-rw-r--r-- | bsps/arm/include/bsp/arm-a9mpcore-clock.h | 9 | ||||
-rw-r--r-- | bsps/arm/lpc176x/start/system-clocks.c | 5 | ||||
-rw-r--r-- | bsps/arm/lpc24xx/start/system-clocks.c | 5 | ||||
-rw-r--r-- | bsps/arm/lpc32xx/start/bspstart.c | 6 | ||||
-rw-r--r-- | bsps/arm/realview-pbx-a9/start/bspstart.c | 2 | ||||
-rw-r--r-- | bsps/arm/shared/clock/clock-a9mpcore.c | 5 | ||||
-rw-r--r-- | bsps/arm/shared/clock/clock-generic-timer.c | 11 | ||||
-rw-r--r-- | bsps/arm/shared/cpucounter/cpucounter-armv7m.c | 23 | ||||
-rw-r--r-- | bsps/arm/tms570/cpucounter/cpucounterread.c | 7 | ||||
-rw-r--r-- | bsps/arm/xilinx-zynq/start/bspstart.c | 2 |
11 files changed, 43 insertions, 34 deletions
diff --git a/bsps/arm/altera-cyclone-v/start/bspstart.c b/bsps/arm/altera-cyclone-v/start/bspstart.c index 0345a4c0a7..c7eae97fdc 100644 --- a/bsps/arm/altera-cyclone-v/start/bspstart.c +++ b/bsps/arm/altera-cyclone-v/start/bspstart.c @@ -13,7 +13,6 @@ */ #include <bsp/bootcard.h> -#include <bsp/arm-a9mpcore-clock.h> #include <bsp/fdt.h> #include <bsp/irq-generic.h> #include <bsp/linker-symbols.h> @@ -95,7 +94,6 @@ static void update_clocks(void) void bsp_start(void) { update_clocks(); - a9mpcore_clock_initialize_early(); bsp_interrupt_initialize(); rtems_cache_coherent_add_area( bsp_section_nocacheheap_begin, diff --git a/bsps/arm/include/bsp/arm-a9mpcore-clock.h b/bsps/arm/include/bsp/arm-a9mpcore-clock.h index 9a8c653801..8d6007ba03 100644 --- a/bsps/arm/include/bsp/arm-a9mpcore-clock.h +++ b/bsps/arm/include/bsp/arm-a9mpcore-clock.h @@ -22,15 +22,6 @@ extern "C" { */ uint32_t a9mpcore_clock_periphclk(void); -/** - * @brief Do early clock initialization so that the CPU counter conversion - * works. - */ -static inline void a9mpcore_clock_initialize_early(void) -{ - rtems_counter_initialize_converter(a9mpcore_clock_periphclk()); -} - #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/bsps/arm/lpc176x/start/system-clocks.c b/bsps/arm/lpc176x/start/system-clocks.c index dd1a0308c6..2ec58727eb 100644 --- a/bsps/arm/lpc176x/start/system-clocks.c +++ b/bsps/arm/lpc176x/start/system-clocks.c @@ -109,6 +109,11 @@ unsigned lpc176x_cclk( void ) return cclk; } +uint32_t _CPU_Counter_frequency(void) +{ + return LPC176X_PCLK; +} + CPU_Counter_ticks _CPU_Counter_read( void ) { return lpc176x_get_timer1(); diff --git a/bsps/arm/lpc24xx/start/system-clocks.c b/bsps/arm/lpc24xx/start/system-clocks.c index f64fca1bed..8a2f62b4b0 100644 --- a/bsps/arm/lpc24xx/start/system-clocks.c +++ b/bsps/arm/lpc24xx/start/system-clocks.c @@ -61,8 +61,11 @@ void lpc24xx_timer_initialize(void) /* Start timer */ T1TCR = TCR_EN; +} - rtems_counter_initialize_converter(LPC24XX_PCLK); +uint32_t _CPU_Counter_frequency(void) +{ + return LPC24XX_PCLK; } CPU_Counter_ticks _CPU_Counter_read(void) diff --git a/bsps/arm/lpc32xx/start/bspstart.c b/bsps/arm/lpc32xx/start/bspstart.c index 7ade16bbb8..c535f766d7 100644 --- a/bsps/arm/lpc32xx/start/bspstart.c +++ b/bsps/arm/lpc32xx/start/bspstart.c @@ -26,6 +26,11 @@ #include <bsp/bootcard.h> #include <bsp/irq-generic.h> +uint32_t _CPU_Counter_frequency(void) +{ + return LPC32XX_PERIPH_CLK; +} + CPU_Counter_ticks _CPU_Counter_read(void) { return lpc32xx_timer(); @@ -33,6 +38,5 @@ CPU_Counter_ticks _CPU_Counter_read(void) void bsp_start(void) { - rtems_counter_initialize_converter(LPC32XX_PERIPH_CLK); bsp_interrupt_initialize(); } diff --git a/bsps/arm/realview-pbx-a9/start/bspstart.c b/bsps/arm/realview-pbx-a9/start/bspstart.c index 0be515c057..8660c661c9 100644 --- a/bsps/arm/realview-pbx-a9/start/bspstart.c +++ b/bsps/arm/realview-pbx-a9/start/bspstart.c @@ -14,11 +14,9 @@ #include <bsp.h> #include <bsp/bootcard.h> -#include <bsp/arm-a9mpcore-clock.h> #include <bsp/irq-generic.h> void bsp_start(void) { - a9mpcore_clock_initialize_early(); bsp_interrupt_initialize(); } diff --git a/bsps/arm/shared/clock/clock-a9mpcore.c b/bsps/arm/shared/clock/clock-a9mpcore.c index f9b2d08c9b..a68a627c5b 100644 --- a/bsps/arm/shared/clock/clock-a9mpcore.c +++ b/bsps/arm/shared/clock/clock-a9mpcore.c @@ -157,6 +157,11 @@ static void a9mpcore_clock_initialize(void) rtems_timecounter_install(&a9mpcore_tc); } +uint32_t _CPU_Counter_frequency(void) +{ + return a9mpcore_clock_periphclk(); +} + CPU_Counter_ticks _CPU_Counter_read(void) { volatile a9mpcore_gt *gt = A9MPCORE_GT; diff --git a/bsps/arm/shared/clock/clock-generic-timer.c b/bsps/arm/shared/clock/clock-generic-timer.c index 8a992d44f4..2cb85003e1 100644 --- a/bsps/arm/shared/clock/clock-generic-timer.c +++ b/bsps/arm/shared/clock/clock-generic-timer.c @@ -166,6 +166,11 @@ static void arm_gt_clock_initialize(void) rtems_timecounter_install(tc); } +uint32_t _CPU_Counter_frequency(void) +{ + return arm_gt_clock_instance.interval; +} + CPU_Counter_ticks _CPU_Counter_read(void) { return (uint32_t) arm_gt_clock_get_count(); @@ -179,14 +184,12 @@ static void arm_gt_clock_early_init(void) &arm_gt_clock_instance.interval, &arm_gt_clock_instance.irq ); - - rtems_counter_initialize_converter(arm_gt_clock_instance.interval); } RTEMS_SYSINIT_ITEM( arm_gt_clock_early_init, - RTEMS_SYSINIT_BSP_START, - RTEMS_SYSINIT_ORDER_LAST + RTEMS_SYSINIT_CPU_COUNTER, + RTEMS_SYSINIT_ORDER_FIRST ); #define Clock_driver_support_at_tick() \ diff --git a/bsps/arm/shared/cpucounter/cpucounter-armv7m.c b/bsps/arm/shared/cpucounter/cpucounter-armv7m.c index 7d2581879f..b7593602ed 100644 --- a/bsps/arm/shared/cpucounter/cpucounter-armv7m.c +++ b/bsps/arm/shared/cpucounter/cpucounter-armv7m.c @@ -19,6 +19,16 @@ #include <bsp.h> #include <bsp/fatal.h> +uint32_t _CPU_Counter_frequency(void) +{ +#ifdef BSP_ARMV7M_SYSTICK_FREQUENCY + return = BSP_ARMV7M_SYSTICK_FREQUENCY; +#else + volatile ARMV7M_Systick *systick = _ARMV7M_Systick; + return ARMV7M_SYSTICK_CALIB_TENMS_GET(systick->calib) * 100; +#endif +} + CPU_Counter_ticks _CPU_Counter_read(void) { volatile ARMV7M_DWT *dwt = _ARMV7M_DWT; @@ -32,22 +42,13 @@ static void armv7m_cpu_counter_initialize(void) cyccnt_enabled = _ARMV7M_DWT_Enable_CYCCNT(); - if (cyccnt_enabled) { - #ifdef BSP_ARMV7M_SYSTICK_FREQUENCY - uint64_t freq = BSP_ARMV7M_SYSTICK_FREQUENCY; - #else - volatile ARMV7M_Systick *systick = _ARMV7M_Systick; - uint64_t freq = ARMV7M_SYSTICK_CALIB_TENMS_GET(systick->calib) * 100ULL; - #endif - - rtems_counter_initialize_converter(freq); - } else { + if (!cyccnt_enabled) { bsp_fatal(BSP_ARM_ARMV7M_CPU_COUNTER_INIT); } } RTEMS_SYSINIT_ITEM( armv7m_cpu_counter_initialize, - RTEMS_SYSINIT_BSP_START, + RTEMS_SYSINIT_CPU_COUNTER, RTEMS_SYSINIT_ORDER_FIRST ); diff --git a/bsps/arm/tms570/cpucounter/cpucounterread.c b/bsps/arm/tms570/cpucounter/cpucounterread.c index c5e62d382d..ada65a87ed 100644 --- a/bsps/arm/tms570/cpucounter/cpucounterread.c +++ b/bsps/arm/tms570/cpucounter/cpucounterread.c @@ -46,8 +46,11 @@ static void tms570_cpu_counter_initialize(void) pmcr &= ~ARM_CP15_PMCR_D; pmcr |= ARM_CP15_PMCR_E; arm_cp15_set_performance_monitors_control(pmcr); +} - rtems_counter_initialize_converter(2 * BSP_PLL_OUT_CLOCK); +uint32_t _CPU_Counter_frequency(void) +{ + return 2 * BSP_PLL_OUT_CLOCK; } CPU_Counter_ticks _CPU_Counter_read(void) @@ -57,6 +60,6 @@ CPU_Counter_ticks _CPU_Counter_read(void) RTEMS_SYSINIT_ITEM( tms570_cpu_counter_initialize, - RTEMS_SYSINIT_BSP_START, + RTEMS_SYSINIT_CPU_COUNTER, RTEMS_SYSINIT_ORDER_FIRST ); diff --git a/bsps/arm/xilinx-zynq/start/bspstart.c b/bsps/arm/xilinx-zynq/start/bspstart.c index 14a20df7ef..4e975e872b 100644 --- a/bsps/arm/xilinx-zynq/start/bspstart.c +++ b/bsps/arm/xilinx-zynq/start/bspstart.c @@ -14,7 +14,6 @@ #include <bsp.h> #include <bsp/bootcard.h> -#include <bsp/arm-a9mpcore-clock.h> #include <bsp/irq-generic.h> #include <bsp/linker-symbols.h> @@ -25,7 +24,6 @@ __attribute__ ((weak)) uint32_t zynq_clock_cpu_1x(void) void bsp_start(void) { - a9mpcore_clock_initialize_early(); bsp_interrupt_initialize(); rtems_cache_coherent_add_area( bsp_section_nocacheheap_begin, |