/*
 * Copyright (c) 2017 Oticon A/S
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * Driver for the timer model of the POSIX native_posix board
 * It provides the interfaces required by the kernel and the sanity testcases
 * It also provides a custom k_busy_wait() which can be used with the
 * POSIX arch and InfClock SOC
 */

#include "zephyr/types.h"
#include "irq.h"
#include "device.h"
#include "drivers/system_timer.h"
#include "sys_clock.h"
#include "timer_model.h"
#include "soc.h"
#include "posix_trace.h"

#include "legacy_api.h"

static u64_t tick_period; /* System tick period in number of hw cycles */
static s64_t silent_ticks;
static s32_t _sys_idle_elapsed_ticks = 1;

/**
 * Return the current HW cycle counter
 * (number of microseconds since boot in 32bits)
 */
u32_t z_timer_cycle_get_32(void)
{
	return hwm_get_time();
}

#ifdef CONFIG_TICKLESS_IDLE

/*
 * Do not raise another ticker interrupt until the sys_ticks'th one
 * e.g. if sys_ticks is 10, do not raise the next 9 ones
 *
 * if sys_ticks is K_FOREVER (or another negative number),
 * we will effectively silence the tick interrupts forever
 */
void _timer_idle_enter(s32_t sys_ticks)
{
	if (silent_ticks > 0) { /* LCOV_EXCL_BR_LINE */
		/* LCOV_EXCL_START */
		posix_print_warning("native timer: Re-entering idle mode with "
				    "%i ticks pending\n",
				    silent_ticks);
		z_clock_idle_exit();
		/* LCOV_EXCL_STOP */
	}
	if (sys_ticks < 0) {
		silent_ticks = INT64_MAX;
	} else if (sys_ticks > 0) {
		silent_ticks = sys_ticks - 1;
	} else {
		silent_ticks = 0;
	}
	hwtimer_set_silent_ticks(silent_ticks);
}

/*
 * Exit from idle mode
 *
 * If we have been silent for a number of ticks, announce immediately to the
 * kernel how many silent ticks have passed.
 * If this is called due to the 1st non silent timer interrupt, sp_timer_isr()
 * will be called right away, which will announce that last (non silent) one.
 *
 * Note that we do not assume this function is called before the interrupt is
 * raised (the interrupt can handle it announcing all ticks)
 */
void z_clock_idle_exit(void)
{
	silent_ticks -= hwtimer_get_pending_silent_ticks();
	if (silent_ticks > 0) {
		_sys_idle_elapsed_ticks = silent_ticks;
		z_clock_announce(_sys_idle_elapsed_ticks);
	}
	silent_ticks = 0;
	hwtimer_set_silent_ticks(0);
}
#endif

/**
 * Interrupt handler for the timer interrupt
 * Announce to the kernel that a tick has passed
 */
static void sp_timer_isr(void *arg)
{
	ARG_UNUSED(arg);
	_sys_idle_elapsed_ticks = silent_ticks + 1;
	silent_ticks = 0;
	z_clock_announce(_sys_idle_elapsed_ticks);
}

/*
 * Enable the hw timer, setting its tick period, and setup its interrupt
 */
int z_clock_driver_init(struct device *device)
{
	ARG_UNUSED(device);

	tick_period = 1000000ul / CONFIG_SYS_CLOCK_TICKS_PER_SEC;

	hwtimer_enable(tick_period);

	IRQ_CONNECT(TIMER_TICK_IRQ, 1, sp_timer_isr, 0, 0);
	irq_enable(TIMER_TICK_IRQ);

	return 0;
}


#if defined(CONFIG_ARCH_HAS_CUSTOM_BUSY_WAIT)
/**
 * Replacement to the kernel k_busy_wait()
 * Will block this thread (and therefore the whole zephyr) during usec_to_wait
 *
 * Note that interrupts may be received in the meanwhile and that therefore this
 * thread may loose context
 */
void z_arch_busy_wait(u32_t usec_to_wait)
{
	u64_t time_end = hwm_get_time() + usec_to_wait;

	while (hwm_get_time() < time_end) {
		/*There may be wakes due to other interrupts*/
		hwtimer_wake_in_time(time_end);
		posix_halt_cpu();
	}
}
#endif

#if defined(CONFIG_SYSTEM_CLOCK_DISABLE)
/**
 *
 * @brief Stop announcing sys ticks into the kernel
 *
 * Disable the system ticks generation
 *
 * @return N/A
 */
void sys_clock_disable(void)
{
	irq_disable(TIMER_TICK_IRQ);
	hwtimer_set_silent_ticks(INT64_MAX);
}
#endif /* CONFIG_SYSTEM_CLOCK_DISABLE */
