/*
 * Copyright (c) 2019 Stephanos Ioannidis <root@stephanos.io>
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef ZEPHYR_BENCHMARK_CMSIS_DSP_COMMON_BENCHMARK_COMMON_H_
#define ZEPHYR_BENCHMARK_CMSIS_DSP_COMMON_BENCHMARK_COMMON_H_

#include <zephyr/ztest.h>
#include <zephyr/kernel.h>

#if defined(CONFIG_CPU_CORTEX_M_HAS_DWT)
/* Use cycle counting on the Cortex-M devices that support DWT */

#include <zephyr/arch/arm/aarch32/cortex_m/cmsis.h>

static ALWAYS_INLINE void benchmark_begin(uint32_t *irq_key, uint32_t *timestamp)
{
	ARG_UNUSED(timestamp);

	/* Lock interrupts to prevent preemption */
	*irq_key = irq_lock();

	/* Start DWT cycle counter */
	DWT->CYCCNT = 0;
	DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
}

static ALWAYS_INLINE uint32_t benchmark_end(uint32_t irq_key, uint32_t timestamp)
{
	/* Stop DWT cycle counter */
	DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk;

	/* Unlock interrupts */
	irq_unlock(irq_key);

	/* Return DWT cycle counter value */
	return DWT->CYCCNT;
}

#define BENCHMARK_TYPE		"Processor Cycles"

#else
/* Use system timer clock on other systems */

static ALWAYS_INLINE void benchmark_begin(uint32_t *irq_key, uint32_t *timestamp)
{
	volatile uint32_t now;

	/* Lock interrupts to prevent preemption */
	*irq_key = irq_lock();

	/* Read timestamp for the beginning of benchmark */
	now = k_cycle_get_32();

	/* Store timestamp */
	*timestamp = now;
}

static ALWAYS_INLINE uint32_t benchmark_end(uint32_t irq_key, uint32_t timestamp)
{
	volatile uint32_t now;

	/* Read timestamp for the end of benchmark */
	now = k_cycle_get_32();

	/* Unlock interrupts */
	irq_unlock(irq_key);

	/* Return timespan between the beginning and the end of benchmark */
	return now - timestamp;
}

#define BENCHMARK_TYPE		"System Timer Cycles"

#endif

#endif /* ZEPHYR_BENCHMARK_CMSIS_DSP_COMMON_BENCHMARK_COMMON_H_ */
