BAL and Maple Release 2.2
Signed-off-by: Shad Ansari <developer@Carbon.local>
diff --git a/bcm68620_release/release/host_reference/time_measurement/Makefile b/bcm68620_release/release/host_reference/time_measurement/Makefile
new file mode 100755
index 0000000..b7b50da
--- /dev/null
+++ b/bcm68620_release/release/host_reference/time_measurement/Makefile
@@ -0,0 +1,11 @@
+# Common API
+#
+MOD_NAME = time_measurement
+MOD_TYPE = lib
+MOD_DEPS = dev_log
+
+ifeq ("$(ENABLE_LOG)", "y")
+ srcs = bcmolt_time_measurement.c
+endif
+
+USE_LINT = yes
diff --git a/bcm68620_release/release/host_reference/time_measurement/bcmolt_time_measurement.c b/bcm68620_release/release/host_reference/time_measurement/bcmolt_time_measurement.c
new file mode 100755
index 0000000..9665095
--- /dev/null
+++ b/bcm68620_release/release/host_reference/time_measurement/bcmolt_time_measurement.c
@@ -0,0 +1,117 @@
+/*
+<:copyright-BRCM:2014:proprietary:standard
+
+ Copyright (c) 2014 Broadcom Corporation
+ All Rights Reserved
+
+This program is the proprietary software of Broadcom Corporation and/or its
+licensors, and may only be used, duplicated, modified or distributed pursuant
+to the terms and conditions of a separate, written license agreement executed
+between you and Broadcom (an "Authorized License"). Except as set forth in
+an Authorized License, Broadcom grants no license (express or implied), right
+to use, or waiver of any kind with respect to the Software, and Broadcom
+expressly reserves all rights in and to the Software and all intellectual
+property rights therein. IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU HAVE
+NO RIGHT TO USE THIS SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY NOTIFY
+BROADCOM AND DISCONTINUE ALL USE OF THE SOFTWARE.
+
+Except as expressly set forth in the Authorized License,
+
+1. This program, including its structure, sequence and organization,
+ constitutes the valuable trade secrets of Broadcom, and you shall use
+ all reasonable efforts to protect the confidentiality thereof, and to
+ use this information only in connection with your use of Broadcom
+ integrated circuit products.
+
+2. TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
+ AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, REPRESENTATIONS OR
+ WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH
+ RESPECT TO THE SOFTWARE. BROADCOM SPECIFICALLY DISCLAIMS ANY AND
+ ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, NONINFRINGEMENT,
+ FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR
+ COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR CORRESPONDENCE
+ TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT OF USE OR
+ PERFORMANCE OF THE SOFTWARE.
+
+3. TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM OR
+ ITS LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL,
+ INDIRECT, OR EXEMPLARY DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY
+ WAY RELATING TO YOUR USE OF OR INABILITY TO USE THE SOFTWARE EVEN
+ IF BROADCOM HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES;
+ OR (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT ACTUALLY PAID FOR THE
+ SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE LIMITATIONS
+ SHALL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY
+ LIMITED REMEDY.
+:>
+*/
+
+#include <bcmos_system.h>
+#include "bcmolt_time_measurement.h"
+
+typedef struct
+{
+ dev_log_id log_id;
+ uint32_t num_cycles_for_average;
+ F_bcmolt_time_measurement_ticks_to_ns ticks_to_ns;
+ F_bcmolt_time_measurement_avg_done avg_done;
+ uint32_t cycle_num;
+} bcmolt_time_measurement_context;
+
+static bcmolt_time_measurement_context time_measurement_context = { DEV_LOG_INVALID_ID, 0, NULL, NULL, 0 };
+
+void bcmolt_time_measurement_init(
+ dev_log_id log_id,
+ uint32_t num_cycles_for_average,
+ F_bcmolt_time_measurement_ticks_to_ns ticks_to_ns,
+ F_bcmolt_time_measurement_avg_done avg_done)
+{
+ time_measurement_context = (bcmolt_time_measurement_context)
+ { log_id, num_cycles_for_average, ticks_to_ns, avg_done, 0 };
+}
+
+void bcmolt_time_measurement_sample_end(uint64_t *total_ticks, uint32_t *num_of_samples, const char *measurement_name)
+{
+ /* Don't do anything if we haven't run enough cycles to produce an average. */
+ if (time_measurement_context.cycle_num < (time_measurement_context.num_cycles_for_average - 1))
+ {
+ return;
+ }
+
+ if (*num_of_samples != 0 && time_measurement_context.ticks_to_ns != NULL)
+ {
+ /* Convert the sample time from ticks to ns. */
+ uint64_t duration_average_ns = time_measurement_context.ticks_to_ns(*total_ticks / *num_of_samples);
+
+ /* The ":" is used as delimiter when importing to excel. */
+ BCM_LOG(
+ DEBUG,
+ time_measurement_context.log_id,
+ ":%s: %llu.%03llu us (%u hits)\n",
+ measurement_name,
+ (long long unsigned int)(duration_average_ns / 1000),
+ (long long unsigned int)(duration_average_ns % 1000),
+ *num_of_samples);
+ }
+
+ *total_ticks = 0;
+ *num_of_samples = 0;
+}
+
+void bcmolt_time_measurement_cycle_end(void)
+{
+ if (time_measurement_context.cycle_num == (time_measurement_context.num_cycles_for_average - 1))
+ {
+ if (time_measurement_context.avg_done != NULL)
+ {
+ time_measurement_context.avg_done();
+ }
+
+ /* Print a delimiting line. */
+ BCM_LOG(DEBUG, time_measurement_context.log_id, "\n");
+ time_measurement_context.cycle_num = 0;
+ }
+ else
+ {
+ ++time_measurement_context.cycle_num;
+ }
+}
diff --git a/bcm68620_release/release/host_reference/time_measurement/bcmolt_time_measurement.h b/bcm68620_release/release/host_reference/time_measurement/bcmolt_time_measurement.h
new file mode 100755
index 0000000..bb41b84
--- /dev/null
+++ b/bcm68620_release/release/host_reference/time_measurement/bcmolt_time_measurement.h
@@ -0,0 +1,143 @@
+/*
+<:copyright-BRCM:2014:proprietary:standard
+
+ Copyright (c) 2014 Broadcom Corporation
+ All Rights Reserved
+
+This program is the proprietary software of Broadcom Corporation and/or its
+licensors, and may only be used, duplicated, modified or distributed pursuant
+to the terms and conditions of a separate, written license agreement executed
+between you and Broadcom (an "Authorized License"). Except as set forth in
+an Authorized License, Broadcom grants no license (express or implied), right
+to use, or waiver of any kind with respect to the Software, and Broadcom
+expressly reserves all rights in and to the Software and all intellectual
+property rights therein. IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU HAVE
+NO RIGHT TO USE THIS SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY NOTIFY
+BROADCOM AND DISCONTINUE ALL USE OF THE SOFTWARE.
+
+Except as expressly set forth in the Authorized License,
+
+1. This program, including its structure, sequence and organization,
+ constitutes the valuable trade secrets of Broadcom, and you shall use
+ all reasonable efforts to protect the confidentiality thereof, and to
+ use this information only in connection with your use of Broadcom
+ integrated circuit products.
+
+2. TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
+ AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, REPRESENTATIONS OR
+ WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH
+ RESPECT TO THE SOFTWARE. BROADCOM SPECIFICALLY DISCLAIMS ANY AND
+ ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, NONINFRINGEMENT,
+ FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR
+ COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR CORRESPONDENCE
+ TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT OF USE OR
+ PERFORMANCE OF THE SOFTWARE.
+
+3. TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM OR
+ ITS LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL,
+ INDIRECT, OR EXEMPLARY DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY
+ WAY RELATING TO YOUR USE OF OR INABILITY TO USE THE SOFTWARE EVEN
+ IF BROADCOM HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES;
+ OR (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT ACTUALLY PAID FOR THE
+ SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE LIMITATIONS
+ SHALL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY
+ LIMITED REMEDY.
+:>
+*/
+#ifndef _BCMOLT_TIME_MEASUREMENT_H_
+#define _BCMOLT_TIME_MEASUREMENT_H_
+
+#include <bcmos_common.h>
+#include <bcm_dev_log.h>
+
+/* How to use the time measurement library:
+ *
+ * Before including bcmolt_time_measurement.h, you must define BCMOLT_TIME_MEASUREMENT_TIMESTAMP. This macro must be
+ * defined in such a way that this is legal: "uint32_t timestamp_in_ticks = BCMOLT_TIME_MEASUREMENT_TIMESTAMP()". We
+ * use a macro instead of a function to optimize for time (we want to avoid the overhead of a function call).
+ *
+ * You can have as many named measurement categories as desired. For each category, you need to call either:
+ * - BCMOLT_TIME_MEASUREMENT_SAMPLE_DECL_STATIC() - if the measurements are all taken in the same file
+ * or:
+ * - BCMOLT_TIME_MEASUREMENT_SAMPLE_DECL() + BCMOLT_TIME_MEASUREMENT_SAMPLE_DECL_EXTERN()
+ *
+ * At init time, you must call bcmolt_time_measurement_init().
+ *
+ * For the actual measurements, you must surround the code you're trying to measure with
+ * BCMOLT_TIME_MEASUREMENTS_SAMPLE_BEFORE() and BCMOLT_TIME_MEASUREMENTS_SAMPLE_AFTER(). At the end of a full
+ * measurement cycle, you must call BCMOLT_TIME_MEASUREMENTS_SAMPLE_END() for each named measurement category, then
+ * finally call BCMOLT_TIME_MEASUREMENTS_CYCLE_END().
+ */
+
+typedef uint64_t (*F_bcmolt_time_measurement_ticks_to_ns)(uint64_t ticks);
+typedef void (*F_bcmolt_time_measurement_avg_done)(void);
+
+/** Called for each measurement category at compile time (see how-to at top of file). */
+#define BCMOLT_TIME_MEASUREMENT_SAMPLE_DECL_STATIC(measurement_name) \
+ static uint32_t measurement_name ## _start_tick; \
+ static uint64_t measurement_name ## _total_ticks; \
+ static uint32_t measurement_name ## _num_of_samples;
+
+/** Called for each measurement category at compile time (see how-to at top of file). */
+#define BCMOLT_TIME_MEASUREMENT_SAMPLE_DECL(measurement_name) \
+ uint32_t measurement_name ## _start_tick; \
+ uint64_t measurement_name ## _total_ticks; \
+ uint32_t measurement_name ## _num_of_samples;
+
+/** Called for each measurement category at compile time (see how-to at top of file). */
+#define BCMOLT_TIME_MEASUREMENT_SAMPLE_DECL_EXTERN(measurement_name) \
+ extern uint32_t measurement_name ## _start_tick; \
+ extern uint64_t measurement_name ## _total_ticks; \
+ extern uint32_t measurement_name ## _num_of_samples;
+
+/** Called before each block of code that needs to be timed (see how-to at top of file). */
+#define BCMOLT_TIME_MEASUREMENTS_SAMPLE_BEFORE(measurement_name) \
+ do \
+ { \
+ measurement_name ## _start_tick = BCMOLT_TIME_MEASUREMENT_TIMESTAMP(); \
+ } \
+ while (0)
+
+/** Called after each block of code that needs to be timed (see how-to at top of file). */
+#define BCMOLT_TIME_MEASUREMENTS_SAMPLE_AFTER(measurement_name) \
+ do \
+ { \
+ /* Even if timestamp overflows we are still ok - unsigned arithmetic will still be valid. */ \
+ measurement_name ## _total_ticks += BCMOLT_TIME_MEASUREMENT_TIMESTAMP() - measurement_name ## _start_tick; \
+ ++measurement_name ## _num_of_samples; \
+ } \
+ while (0)
+
+/** Called for each measurement category at the end of a cycle (see how-to at top of file). */
+#define BCMOLT_TIME_MEASUREMENTS_SAMPLE_END(measurement_name) \
+ do \
+ { \
+ bcmolt_time_measurement_sample_end( \
+ &measurement_name ## _total_ticks, \
+ &measurement_name ## _num_of_samples, \
+ # measurement_name); \
+ } \
+ while (0)
+
+/** Called when the entire measurement cycle is complete (see how-to at top of file). */
+#define BCMOLT_TIME_MEASUREMENTS_CYCLE_END() bcmolt_time_measurement_cycle_end()
+
+/** Must be called at init time to initialize the time measurement library.
+ * \param log_id Log ID to use for displaying data (will use 'DEBUG' log level).
+ * \param num_cycles_for_average Number of measurement cycles to run before calculating and logging averages.
+ * \param ticks_to_ns Function that translates timestamp resolution (ticks) into nanoseconds.
+ * \param avg_done Function to call after averages have been computed (e.g. to log a custom header).
+ */
+void bcmolt_time_measurement_init(
+ dev_log_id log_id,
+ uint32_t num_cycles_for_average,
+ F_bcmolt_time_measurement_ticks_to_ns ticks_to_ns,
+ F_bcmolt_time_measurement_avg_done avg_done);
+
+/** Do not call this directly - call BCMOLT_TIME_MEASUREMENTS_SAMPLE_END() instead. */
+void bcmolt_time_measurement_sample_end(uint64_t *total_ticks, uint32_t *num_of_samples, const char *measurement_name);
+
+/** Do not call this directly - call BCMOLT_TIME_MEASUREMENTS_CYCLE_END() instead. */
+void bcmolt_time_measurement_cycle_end(void);
+
+#endif /* _BCMOLT_TIME_MEASUREMENT_H_ */