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

# source the config to get CONFIG_CPUFREQ and CONFIG_HZ
. .config

if [ "$CONFIG_DYNAMIC_TICK" = "y" ]; then
	exit 0
fi
if [ "$CONFIG_HZ" = "" ]; then
	exit 0
fi
#CONFIG_CPUFREQ=3686400
#CONFIG_HZ=14400
TIMER_RANGE=256
PRESCALER=1

VERBOSE=0
if [ "$1" != "" ]; then
	CONFIG_HZ=$1
	VERBOSE=1
fi

CPUCLOCKS_PER_JIFFY=$[(CONFIG_CPUFREQ+CONFIG_HZ-1)/CONFIG_HZ]
MINIMUM_PRESCALER=$[(CPUCLOCKS_PER_JIFFY+TIMER_RANGE-1)/TIMER_RANGE]
MINIMUM_PRESCALER1=$[(CPUCLOCKS_PER_JIFFY+TIMER_RANGE-1)*100/TIMER_RANGE]
MINIMUM_PRESCALER2=$[CPUCLOCKS_PER_JIFFY*100/TIMER_RANGE]

if [ $MINIMUM_PRESCALER -gt 1024 ]; then
	echo "Minimum Prescaler too big. $MINIMUM_PRESCALER" >&2
#	exit 1
	PRESCALER=1024
elif [ $MINIMUM_PRESCALER -gt 256 ]; then
	PRESCALER=1024
elif [ $MINIMUM_PRESCALER -gt 64 ]; then
	PRESCALER=256
elif [ $MINIMUM_PRESCALER -gt 8 ]; then
	PRESCALER=64
elif [ $MINIMUM_PRESCALER -gt 1 ]; then
	PRESCALER=8
elif [ $MINIMUM_PRESCALER = 1 ]; then
	PRESCALER=1
else
	echo "Minimum Prescaler too small. $MINIMUM_PRESCALER $MINIMUM_PRESCALER1/100" >&2
#	exit 1
	PRESCALER=1
fi

CLOCKS_PER_JIFFY=$[CONFIG_CPUFREQ/PRESCALER/CONFIG_HZ]

# Theory says:
# CONFIG_CPUFREQ = CONFIG_HZ * PRESCALER * CLOCKS_PER_JIFFIES
# and max(CLOCKS_PER_JIFFIES=TIMER_RANGE
# and
# CONFIG_HZ = CONFIG_CPUFREQ / PRESCALER / CLOCKS_PER_JIFFES
# and we need
# CLOCKS_PER_JIFFIES=CONFIG_CPUFREQ/PRESCALER/CONFIG_HZ


#echo "CONFIG_HZ=$CONFIG_HZ"
#echo "CONFIG_CPUFREQ=$CONFIG_CPUFREQ"

ACCURACY=$[CLOCKS_PER_JIFFY*CONFIG_HZ*PRESCALER]
ACCURACY=$[(CONFIG_CPUFREQ-ACCURACY)*1000000/CONFIG_CPUFREQ]

if [ $VERBOSE = 1 ]; then
	echo "CPU Clocks per jiffy=$CPUCLOCKS_PER_JIFFY"
	echo "Minimum prescaler=$MINIMUM_PRESCALER"
	echo "Minimum prescaler1=$MINIMUM_PRESCALER1"
	echo "Minimum prescaler2=$MINIMUM_PRESCALER2"
	echo "Clocks per jiffy with prescaler $PRESCALER=$CLOCKS_PER_JIFFY"
fi
echo "Timer Drift:  $ACCURACY ppm with prescaler $PRESCALER:$CLOCKS_PER_JIFFY"

# If CPUFREQ = 3686400, we have perfect accuracy with the following values,
# and possibly multiples of them.
# 2^12*3^2*5^2
# 18432 9216 4608 2304 1152 576 288 144 72 36 18 9
#
#
#Values close to 1000:
# 5^0 * 3^0 * 2^10 = 1024   +24 /* inaccurate due to  (max(2) = 8 */
# 5^1 * 3^1 * 2^ 6 =  960   -40
# 5^2 * 3^2 * 2^ 2 =  900  -100
# 5^0 * 3^2 * 2^ 7 = 1152  +152
# 5^2 * 3^0 * 2^ 5 =  800  -200
# 5^2 * 3^1 * 2^ 4 = 1200  +200
# 5^0 * 3^1 * 2^ 8 =  768  -232
# 5^1 * 3^0 * 2^ 8 = 1280  +280
# 5^1 * 3^2 * 2^ 4 =  720  -280


