summaryrefslogtreecommitdiffstats
path: root/bsps
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-03-21 06:27:24 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-03-22 07:01:36 +0100
commitbb22a3f3af86c00d70f51b4a3531640c0808261a (patch)
tree11cfc463d71bd86bd28bd1d01e1bd6c15636e893 /bsps
parentbsps/powerpc: Remove bsp_timer_internal_clock (diff)
downloadrtems-bb22a3f3af86c00d70f51b4a3531640c0808261a.tar.bz2
bsp/powerpc: Move libcpu timer to bsps
Use only one timer driver variant based on the standard PowerPC time base. This patch is a part of the BSP source reorganization. Update #3285.
Diffstat (limited to 'bsps')
-rw-r--r--bsps/powerpc/shared/ppc-dec-timer.c88
-rw-r--r--bsps/powerpc/ss555/dev/timer.c104
2 files changed, 88 insertions, 104 deletions
diff --git a/bsps/powerpc/shared/ppc-dec-timer.c b/bsps/powerpc/shared/ppc-dec-timer.c
new file mode 100644
index 0000000000..d161710732
--- /dev/null
+++ b/bsps/powerpc/shared/ppc-dec-timer.c
@@ -0,0 +1,88 @@
+/**
+ * @file
+ * @brief
+ *
+ * This file implements a benchmark timer using the PPC Timebase Register.
+ */
+
+/*
+ * COPYRIGHT (c) 1989-2014.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <bsp.h>
+#include <rtems.h>
+#include <rtems/system.h>
+#include <rtems/btimer.h>
+#include <assert.h>
+#include <libcpu/powerpc-utility.h>
+
+#ifndef BSP_Convert_decrementer
+#define BSP_Convert_decrementer(value) (value)
+#endif
+
+uint64_t Timer_driver_Start_time;
+
+bool benchmark_timer_find_average_overhead = false;
+unsigned clicks_overhead = 0;
+
+/*
+ * Timer Get overhead
+ */
+static int Timer_get_clicks_overhead(void)
+{
+ uint64_t clicks;
+
+ PPC_Set_timebase_register((uint64_t) 0);
+ clicks = PPC_Get_timebase_register();
+ assert(clicks <= 0xffffffff);
+ clicks_overhead = (unsigned) clicks;
+ return clicks_overhead;
+}
+
+/*
+ * benchmark_timer_initialize
+ */
+void benchmark_timer_initialize(void)
+{
+
+ /*
+ * Timer runs long and accurate enough not to require an interrupt.
+ */
+
+ if (clicks_overhead == 0) clicks_overhead = Timer_get_clicks_overhead();
+ PPC_Set_timebase_register((uint64_t) 0);
+}
+
+
+/*
+ * benchmark_timer_read
+ */
+
+benchmark_timer_t benchmark_timer_read(void)
+{
+ uint64_t total64;
+ uint32_t total;
+
+ /* approximately CLOCK_SPEED clicks per microsecond */
+
+ total64 = PPC_Get_timebase_register();
+
+ assert( total64 <= 0xffffffff ); /* fits into a uint32_t */
+
+ total = (uint32_t) total64;
+
+ if ( benchmark_timer_find_average_overhead == true )
+ return total; /* in "clicks" of the decrementer units */
+
+ return (int) BSP_Convert_decrementer(total - clicks_overhead);
+}
+
+void benchmark_timer_disable_subtracting_average_overhead(bool find_flag)
+{
+ benchmark_timer_find_average_overhead = find_flag;
+}
diff --git a/bsps/powerpc/ss555/dev/timer.c b/bsps/powerpc/ss555/dev/timer.c
deleted file mode 100644
index 65deae961e..0000000000
--- a/bsps/powerpc/ss555/dev/timer.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/**
- * @file
- * @brief Timer Driver for the PowerPC MPC5xx.
- *
- * This file manages the interval timer on the PowerPC MPC5xx.
- * @noe This is not the PIT, but rather the RTEMS interval timer.
- * We shall use the bottom 32 bits of the timebase register,
- */
-
-/*
- * MPC5xx port sponsored by Defence Research and Development Canada - Suffield
- * Copyright (C) 2004, Real-Time Systems Inc. (querbach@realtime.bc.ca)
- *
- * Derived from c/src/lib/libcpu/powerpc/mpc8xx/timer/timer.c:
- *
- * Author: Jay Monkman (jmonkman@frasca.com)
- * Copywright (C) 1998 by Frasca International, Inc.
- *
- * Derived from c/src/lib/libcpu/ppc/ppc403/timer/timer.c:
- *
- * Author: Andrew Bray <andy@i-cubed.co.uk>
- *
- * COPYRIGHT (c) 1995 by i-cubed ltd.
- *
- * To anyone who acknowledges that this file is provided "AS IS"
- * without any express or implied warranty:
- * permission to use, copy, modify, and distribute this file
- * for any purpose is hereby granted without fee, provided that
- * the above copyright notice and this notice appears in all
- * copies, and that the name of i-cubed limited not be used in
- * advertising or publicity pertaining to distribution of the
- * software without specific, written prior permission.
- * i-cubed limited makes no representations about the suitability
- * of this software for any purpose.
- *
- * Derived from c/src/lib/libcpu/hppa1_1/timer/timer.c:
- *
- * COPYRIGHT (c) 1989-2007.
- * 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.h>
-#include <rtems/btimer.h>
-#include <mpc5xx.h>
-
-static volatile uint32_t Timer_starting;
-static bool benchmark_timer_find_average_overhead;
-
-extern uint32_t bsp_timer_least_valid;
-extern uint32_t bsp_timer_average_overhead;
-
-/*
- * This is so small that this code will be reproduced where needed.
- */
-static inline uint32_t get_itimer(void)
-{
- uint32_t ret;
-
- __asm__ volatile ("mftb %0" : "=r" ((ret))); /* TBLO */
-
- return ret;
-}
-
-void benchmark_timer_initialize(void)
-{
- /* set interrupt level and enable timebase. This should never */
- /* generate an interrupt however. */
- usiu.tbscrk = USIU_UNLOCK_KEY;
- usiu.tbscr |= USIU_TBSCR_TBIRQ(4) /* interrupt priority level */
- | USIU_TBSCR_TBF /* freeze timebase during debug */
- | USIU_TBSCR_TBE; /* enable timebase */
- usiu.tbscrk = 0;
-
- Timer_starting = get_itimer();
-}
-
-benchmark_timer_t benchmark_timer_read(void)
-{
- uint32_t clicks;
- uint32_t total;
-
- clicks = get_itimer();
-
- total = clicks - Timer_starting;
-
- if ( benchmark_timer_find_average_overhead == 1 )
- return total; /* in XXX microsecond units */
-
- else {
- if ( total < bsp_timer_least_valid ) {
- return 0; /* below timer resolution */
- }
- return (total - bsp_timer_average_overhead);
- }
-}
-
-void benchmark_timer_disable_subtracting_average_overhead(bool find_flag)
-{
- benchmark_timer_find_average_overhead = find_flag;
-}