#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# CPU helpers

# protect against multiple inclusion
if [ $FILE_CPU ]; then
	return 0
else
	FILE_CPU=DONE
fi

source cpufreq.sh

for_each_cpu()
{
	cpus=$(ls $CPUROOT | grep "cpu[0-9].*")
	for cpu in $cpus; do
		$@ $cpu
	done
}

for_each_non_boot_cpu()
{
	cpus=$(ls $CPUROOT | grep "cpu[1-9].*")
	for cpu in $cpus; do
		$@ $cpu
	done
}

#$1: cpu
offline_cpu()
{
	printf "Offline $1\n"
	echo 0 > $CPUROOT/$1/online
}

#$1: cpu
online_cpu()
{
	printf "Online $1\n"
	echo 1 > $CPUROOT/$1/online
}

#$1: cpu
reboot_cpu()
{
	offline_cpu $1
	online_cpu $1
}

# Reboot CPUs
# param: number of times we want to run the loop
reboot_cpus()
{
	printf "** Test: Running ${FUNCNAME[0]} for $1 loops **\n\n"

	for i in `seq 1 $1`; do
		for_each_non_boot_cpu offline_cpu
		for_each_non_boot_cpu online_cpu
		printf "\n"
	done

	printf "\n%s\n\n" "------------------------------------------------"
}

# Prints warning for all CPUs with missing cpufreq directory
print_unmanaged_cpus()
{
	for_each_cpu cpu_should_have_cpufreq_directory
}

# Counts CPUs with cpufreq directories
count_cpufreq_managed_cpus()
{
	count=0;

	for cpu in `ls $CPUROOT | grep "cpu[0-9].*"`; do
		if [ -d $CPUROOT/$cpu/cpufreq ]; then
			let count=count+1;
		fi
	done

	echo $count;
}
