| /* | 
 |  * Copyright (c) 2025 Analog Devices, Inc. | 
 |  * | 
 |  * SPDX-License-Identifier: Apache-2.0 | 
 |  */ | 
 |  | 
 | #include <zephyr/kernel.h> | 
 | #include <zephyr/logging/log.h> | 
 |  | 
 | LOG_MODULE_REGISTER(cpu_load_metric, CONFIG_CPU_LOAD_LOG_LEVEL); | 
 |  | 
 | static uint64_t execution_cycles_prev[CONFIG_MP_MAX_NUM_CPUS]; | 
 | static uint64_t total_cycles_prev[CONFIG_MP_MAX_NUM_CPUS]; | 
 |  | 
 | static struct k_spinlock lock[CONFIG_MP_MAX_NUM_CPUS]; | 
 |  | 
 | int cpu_load_get(int cpu_id) | 
 | { | 
 | 	int ret; | 
 | 	int load; | 
 | 	uint64_t execution_cycles; | 
 | 	uint64_t total_cycles; | 
 | 	k_spinlock_key_t key; | 
 |  | 
 | 	struct k_thread_runtime_stats cpu_query; | 
 |  | 
 | 	ret = k_thread_runtime_stats_cpu_get(cpu_id, &cpu_query); | 
 | 	if (ret) { | 
 | 		LOG_ERR("Could not retrieve runtime statistics from scheduler"); | 
 | 		return ret; | 
 | 	} | 
 |  | 
 | 	key = k_spin_lock(&lock[cpu_id]); | 
 |  | 
 | 	execution_cycles = cpu_query.execution_cycles - execution_cycles_prev[cpu_id]; | 
 | 	total_cycles = cpu_query.total_cycles - total_cycles_prev[cpu_id]; | 
 |  | 
 | 	execution_cycles_prev[cpu_id] = cpu_query.execution_cycles; | 
 | 	total_cycles_prev[cpu_id] = cpu_query.total_cycles; | 
 |  | 
 | 	k_spin_unlock(&lock[cpu_id], key); | 
 |  | 
 | 	LOG_DBG("CPU%d Execution cycles: %llu, Total cycles: %llu", | 
 | 		cpu_id, execution_cycles, total_cycles); | 
 |  | 
 | 	if (execution_cycles == 0) { | 
 | 		load = 0; | 
 | 	} else { | 
 | 		load = (int)((100 * total_cycles) / execution_cycles); | 
 | 	} | 
 |  | 
 | 	return load; | 
 | } |