/*
 * Copyright (c) 2018 Intel Corporation.
 * Copyright (c) 2021 Nordic Semiconductor ASA.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include "pm_stats.h"

#include <init.h>
#include <kernel_structs.h>
#include <stats/stats.h>
#include <sys/printk.h>

STATS_SECT_START(pm_stats)
STATS_SECT_ENTRY32(state_count)
STATS_SECT_ENTRY32(state_last_cycles)
STATS_SECT_ENTRY32(state_total_cycles)
STATS_SECT_END;

STATS_NAME_START(pm_stats)
STATS_NAME(pm_stats, state_count)
STATS_NAME(pm_stats, state_last_cycles)
STATS_NAME(pm_stats, state_total_cycles)
STATS_NAME_END(pm_stats);

static STATS_SECT_DECL(pm_stats) stats[CONFIG_MP_NUM_CPUS][PM_STATE_COUNT];

#define PM_STAT_NAME_LEN sizeof("pm_cpu_XXX_state_X_stats")
static char names[CONFIG_MP_NUM_CPUS][PM_STATE_COUNT][PM_STAT_NAME_LEN];
static uint32_t time_start[CONFIG_MP_NUM_CPUS];
static uint32_t time_stop[CONFIG_MP_NUM_CPUS];

static int pm_stats_init(const struct device *dev)
{
	ARG_UNUSED(dev);

	for (uint8_t i = 0U; i < CONFIG_MP_NUM_CPUS; i++) {
		for (uint8_t j = 0U; j < PM_STATE_COUNT; j++) {
			snprintk(names[i][j], PM_STAT_NAME_LEN,
				 "pm_cpu_%03d_state_%1d_stats", i, j);
			stats_init(&(stats[i][j].s_hdr), STATS_SIZE_32, 3U,
				   STATS_NAME_INIT_PARMS(stats));
			stats_register(names[i][j], &(stats[i][j].s_hdr));
		}
	}

	return 0;
}

SYS_INIT(pm_stats_init, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT);

void pm_stats_start(void)
{
	time_start[_current_cpu->id] = k_cycle_get_32();
}

void pm_stats_stop(void)
{
	time_stop[_current_cpu->id] = k_cycle_get_32();
}

void pm_stats_update(enum pm_state state)
{
	uint8_t cpu = _current_cpu->id;
	uint32_t time_total = time_stop[cpu] - time_start[cpu];

	STATS_INC(stats[cpu][state], state_count);
	STATS_INCN(stats[cpu][state], state_total_cycles, time_total);
	STATS_SET(stats[cpu][state], state_last_cycles, time_total);
}
