/*
 * Copyright (c) 2013-2015 Wind River Systems, Inc.
 * Copyright (c) 2016 Intel Corporation.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Measure boot time
 *
 * Measuring the boot time
 *  1. From reset to kernel's __start
 *  2. From __start to main()
 *  3. From __start to task
 *  4. From __start to idle
 */

#include <zephyr.h>

#include <tc_util.h>

/* externs */
extern u64_t __start_time_stamp;    /* timestamp when kernel begins executing */
extern u64_t __main_time_stamp;     /* timestamp when main() begins executing */
extern u64_t __idle_time_stamp;     /* timestamp when CPU went idle */

void main(void)
{
	u64_t task_time_stamp;      /* timestamp at beginning of first task  */
	u64_t _start_us;     /* being of __start timestamp in us	 */
	u64_t main_us;       /* begin of main timestamp in us	 */
	u64_t task_us;       /* begin of task timestamp in us	 */
	u64_t s_main_time_stamp;    /* __start->main timestamp		 */
	u64_t s_task_time_stamp;    /*__start->task timestamp		 */
	u64_t idle_us;       /* begin of idle timestamp in us	 */
	u64_t s_idle_time_stamp;    /*__start->idle timestamp		 */

	task_time_stamp = (u64_t)k_cycle_get_32();

	/*
	 * Go to sleep for 1 tick in order to timestamp when idle thread halts.
	 */
	k_sleep(1);

	int freq = sys_clock_hw_cycles_per_sec() / 1000000;

	_start_us  =  __start_time_stamp / freq;
	s_main_time_stamp =  __main_time_stamp - __start_time_stamp;
	main_us    =  s_main_time_stamp / freq;
	s_task_time_stamp =  task_time_stamp   - __start_time_stamp;
	task_us    =  s_task_time_stamp / freq;
	s_idle_time_stamp =  __idle_time_stamp - __start_time_stamp;
	idle_us    =  s_idle_time_stamp / freq;

	/* Indicate start for sanity test suite */
	TC_START("Boot Time Measurement");

	/* Only print lower 32bit of time result */
	TC_PRINT("Boot Result: Clock Frequency: %d MHz\n",
		 freq);
	TC_PRINT("__start       : %u cycles, %u us\n",
		 (u32_t)(__start_time_stamp & 0xFFFFFFFFULL),
		 (u32_t) (_start_us  & 0xFFFFFFFFULL));
	TC_PRINT("_start->main(): %u cycles, %u us\n",
		 (u32_t)(s_main_time_stamp & 0xFFFFFFFFULL),
		 (u32_t)  (main_us  & 0xFFFFFFFFULL));
	TC_PRINT("_start->task  : %u cycles, %u us\n",
		 (u32_t)(s_task_time_stamp & 0xFFFFFFFFULL),
		 (u32_t)  (task_us  & 0xFFFFFFFFULL));
	TC_PRINT("_start->idle  : %u cycles, %u us\n",
		 (u32_t)(s_idle_time_stamp & 0xFFFFFFFFULL),
		 (u32_t)  (idle_us  & 0xFFFFFFFFULL));

	TC_PRINT("Boot Time Measurement finished\n");

	/* for sanity regression test utility. */
	TC_END_RESULT(TC_PASS);
	TC_END_REPORT(TC_PASS);

}
