|
@@ -0,0 +1,201 @@
|
|
|
+#!/bin/bash
|
|
|
+
|
|
|
+# protect against multiple inclusion
|
|
|
+if [ $FILE_CPUFREQ ]; then
|
|
|
+ return 0
|
|
|
+else
|
|
|
+ FILE_CPUFREQ=DONE
|
|
|
+fi
|
|
|
+
|
|
|
+source cpu.sh
|
|
|
+
|
|
|
+
|
|
|
+# $1: cpu
|
|
|
+cpu_should_have_cpufreq_directory()
|
|
|
+{
|
|
|
+ if [ ! -d $CPUROOT/$1/cpufreq ]; then
|
|
|
+ printf "Warning: No cpufreq directory present for $1\n"
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+cpu_should_not_have_cpufreq_directory()
|
|
|
+{
|
|
|
+ if [ -d $CPUROOT/$1/cpufreq ]; then
|
|
|
+ printf "Warning: cpufreq directory present for $1\n"
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+for_each_policy()
|
|
|
+{
|
|
|
+ policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")
|
|
|
+ for policy in $policies; do
|
|
|
+ $@ $policy
|
|
|
+ done
|
|
|
+}
|
|
|
+
|
|
|
+for_each_policy_concurrent()
|
|
|
+{
|
|
|
+ policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")
|
|
|
+ for policy in $policies; do
|
|
|
+ $@ $policy &
|
|
|
+ done
|
|
|
+}
|
|
|
+
|
|
|
+# $1: Path
|
|
|
+read_cpufreq_files_in_dir()
|
|
|
+{
|
|
|
+ local files=`ls $1`
|
|
|
+
|
|
|
+ printf "Printing directory: $1\n\n"
|
|
|
+
|
|
|
+ for file in $files; do
|
|
|
+ if [ -f $1/$file ]; then
|
|
|
+ printf "$file:"
|
|
|
+ cat $1/$file
|
|
|
+ else
|
|
|
+ printf "\n"
|
|
|
+ read_cpufreq_files_in_dir "$1/$file"
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ printf "\n"
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+read_all_cpufreq_files()
|
|
|
+{
|
|
|
+ printf "** Test: Running ${FUNCNAME[0]} **\n\n"
|
|
|
+
|
|
|
+ read_cpufreq_files_in_dir $CPUFREQROOT
|
|
|
+
|
|
|
+ printf "%s\n\n" "------------------------------------------------"
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+# UPDATE CPUFREQ FILES
|
|
|
+
|
|
|
+# $1: directory path
|
|
|
+update_cpufreq_files_in_dir()
|
|
|
+{
|
|
|
+ local files=`ls $1`
|
|
|
+
|
|
|
+ printf "Updating directory: $1\n\n"
|
|
|
+
|
|
|
+ for file in $files; do
|
|
|
+ if [ -f $1/$file ]; then
|
|
|
+ # file is writable ?
|
|
|
+ local wfile=$(ls -l $1/$file | awk '$1 ~ /^.*w.*/ { print $NF; }')
|
|
|
+
|
|
|
+ if [ ! -z $wfile ]; then
|
|
|
+ # scaling_setspeed is a special file and we
|
|
|
+ # should skip updating it
|
|
|
+ if [ $file != "scaling_setspeed" ]; then
|
|
|
+ local val=$(cat $1/$file)
|
|
|
+ printf "Writing $val to: $file\n"
|
|
|
+ echo $val > $1/$file
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ else
|
|
|
+ printf "\n"
|
|
|
+ update_cpufreq_files_in_dir "$1/$file"
|
|
|
+ fi
|
|
|
+ done
|
|
|
+
|
|
|
+ printf "\n"
|
|
|
+}
|
|
|
+
|
|
|
+# Update all writable files with their existing values
|
|
|
+update_all_cpufreq_files()
|
|
|
+{
|
|
|
+ printf "** Test: Running ${FUNCNAME[0]} **\n\n"
|
|
|
+
|
|
|
+ update_cpufreq_files_in_dir $CPUFREQROOT
|
|
|
+
|
|
|
+ printf "%s\n\n" "------------------------------------------------"
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+# CHANGE CPU FREQUENCIES
|
|
|
+
|
|
|
+# $1: policy
|
|
|
+find_current_freq()
|
|
|
+{
|
|
|
+ cat $CPUFREQROOT/$1/scaling_cur_freq
|
|
|
+}
|
|
|
+
|
|
|
+# $1: policy
|
|
|
+# $2: frequency
|
|
|
+set_cpu_frequency()
|
|
|
+{
|
|
|
+ printf "Change frequency for $1 to $2\n"
|
|
|
+ echo $2 > $CPUFREQROOT/$1/scaling_setspeed
|
|
|
+}
|
|
|
+
|
|
|
+# $1: policy
|
|
|
+test_all_frequencies()
|
|
|
+{
|
|
|
+ local filepath="$CPUFREQROOT/$1"
|
|
|
+
|
|
|
+ backup_governor $1
|
|
|
+
|
|
|
+ local found=$(switch_governor $1 "userspace")
|
|
|
+ if [ $found = 1 ]; then
|
|
|
+ printf "${FUNCNAME[0]}: userspace governor not available for: $1\n"
|
|
|
+ return;
|
|
|
+ fi
|
|
|
+
|
|
|
+ printf "Switched governor for $1 to userspace\n\n"
|
|
|
+
|
|
|
+ local freqs=$(cat $filepath/scaling_available_frequencies)
|
|
|
+ printf "Available frequencies for $1: $freqs\n\n"
|
|
|
+
|
|
|
+ # Set all frequencies one-by-one
|
|
|
+ for freq in $freqs; do
|
|
|
+ set_cpu_frequency $1 $freq
|
|
|
+ done
|
|
|
+
|
|
|
+ printf "\n"
|
|
|
+
|
|
|
+ restore_governor $1
|
|
|
+}
|
|
|
+
|
|
|
+# $1: loop count
|
|
|
+shuffle_frequency_for_all_cpus()
|
|
|
+{
|
|
|
+ printf "** Test: Running ${FUNCNAME[0]} for $1 loops **\n\n"
|
|
|
+
|
|
|
+ for i in `seq 1 $1`; do
|
|
|
+ for_each_policy test_all_frequencies
|
|
|
+ done
|
|
|
+ printf "\n%s\n\n" "------------------------------------------------"
|
|
|
+}
|
|
|
+
|
|
|
+# Basic cpufreq tests
|
|
|
+cpufreq_basic_tests()
|
|
|
+{
|
|
|
+ printf "*** RUNNING CPUFREQ SANITY TESTS ***\n"
|
|
|
+ printf "====================================\n\n"
|
|
|
+
|
|
|
+ count=$(count_cpufreq_managed_cpus)
|
|
|
+ if [ $count = 0 ]; then
|
|
|
+ printf "No cpu is managed by cpufreq core, exiting\n"
|
|
|
+ exit;
|
|
|
+ else
|
|
|
+ printf "CPUFreq manages: $count CPUs\n\n"
|
|
|
+ fi
|
|
|
+
|
|
|
+ # Detect & print which CPUs are not managed by cpufreq
|
|
|
+ print_unmanaged_cpus
|
|
|
+
|
|
|
+ # read/update all cpufreq files
|
|
|
+ read_all_cpufreq_files
|
|
|
+ update_all_cpufreq_files
|
|
|
+
|
|
|
+ # hotplug cpus
|
|
|
+ reboot_cpus 5
|
|
|
+
|
|
|
+ # Test all frequencies
|
|
|
+ shuffle_frequency_for_all_cpus 2
|
|
|
+
|
|
|
+ # Test all governors
|
|
|
+ shuffle_governors_for_all_cpus 1
|
|
|
+}
|