summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/or1k/or1ksim/timer/timer.c
diff options
context:
space:
mode:
authorHesham ALMatary <heshamelmatary@gmail.com>2014-08-20 12:23:20 -0500
committerJoel Sherrill <joel.sherrill@oarcorp.com>2014-08-20 14:46:15 -0500
commitfd5701587f7961259253e66e4dd8fa8c44e8ee91 (patch)
treefe7996f2f6321ce1c0515b2b82cf34aa63470117 /c/src/lib/libbsp/or1k/or1ksim/timer/timer.c
parentBSP for TMS570LS31x Hercules Development Kit from TI (TMS570LS3137) (diff)
downloadrtems-fd5701587f7961259253e66e4dd8fa8c44e8ee91.tar.bz2
Add new (first) OpenRISC BSP called or1ksim.
This BSP is intended to run on or1ksim (the main OpenRISC emulator). Fixed version according to Joel comments from the mailing list.
Diffstat (limited to 'c/src/lib/libbsp/or1k/or1ksim/timer/timer.c')
-rw-r--r--c/src/lib/libbsp/or1k/or1ksim/timer/timer.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/or1k/or1ksim/timer/timer.c b/c/src/lib/libbsp/or1k/or1ksim/timer/timer.c
new file mode 100644
index 0000000000..ec3c33ed0f
--- /dev/null
+++ b/c/src/lib/libbsp/or1k/or1ksim/timer/timer.c
@@ -0,0 +1,64 @@
+/**
+ * @file
+ *
+ * @ingroup or1ksim
+ *
+ * @brief Benchmark timer support.
+ */
+
+/*
+ * Copyright (c) 2014 by Hesham ALMatary
+ *
+ * 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 <bsp/or1ksim.h>
+#include <rtems/score/or1k-utility.h>
+
+#define OR1KSIM_NANOSECONDS_PER_CLK_CYCLE 10
+
+static bool benchmark_timer_find_average_overhead = false;
+static uint64_t benchmark_timer_base;
+
+void benchmark_timer_initialize(void)
+{
+ benchmark_timer_base = _OR1K_mfspr(CPU_OR1K_SPR_TTCR);
+}
+
+#define AVG_OVERHEAD 0
+#define LEAST_VALID 1
+
+uint32_t benchmark_timer_read( void )
+{
+ uint64_t clicks;
+ uint64_t total;
+ uint64_t delta;
+ /*
+ * Read the timer and see how many clicks (clock cycles)
+ * has passed since timer initialization.
+ */
+ clicks = _OR1K_mfspr(CPU_OR1K_SPR_TTCR);
+
+ delta = clicks - benchmark_timer_base;
+
+ /* total in nanoseconds */
+ total = OR1KSIM_NANOSECONDS_PER_CLK_CYCLE * (delta);
+
+ if ( benchmark_timer_find_average_overhead == true )
+ return total; /* in nanoseconds microsecond units */
+ else {
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+
+ return (total - AVG_OVERHEAD);
+ }
+}
+
+void benchmark_timer_disable_subtracting_average_overhead(bool find_flag)
+{
+ benchmark_timer_find_average_overhead = find_flag;
+}