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_ */