1*053f45beSAndroid Build Coastguard Worker#!/bin/bash 2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0 3*053f45beSAndroid Build Coastguard Worker 4*053f45beSAndroid Build Coastguard Worker# protect against multiple inclusion 5*053f45beSAndroid Build Coastguard Workerif [ $FILE_CPUFREQ ]; then 6*053f45beSAndroid Build Coastguard Worker return 0 7*053f45beSAndroid Build Coastguard Workerelse 8*053f45beSAndroid Build Coastguard Worker FILE_CPUFREQ=DONE 9*053f45beSAndroid Build Coastguard Workerfi 10*053f45beSAndroid Build Coastguard Worker 11*053f45beSAndroid Build Coastguard Workersource cpu.sh 12*053f45beSAndroid Build Coastguard Worker 13*053f45beSAndroid Build Coastguard Worker 14*053f45beSAndroid Build Coastguard Worker# $1: cpu 15*053f45beSAndroid Build Coastguard Workercpu_should_have_cpufreq_directory() 16*053f45beSAndroid Build Coastguard Worker{ 17*053f45beSAndroid Build Coastguard Worker if [ ! -d $CPUROOT/$1/cpufreq ]; then 18*053f45beSAndroid Build Coastguard Worker printf "Warning: No cpufreq directory present for $1\n" 19*053f45beSAndroid Build Coastguard Worker fi 20*053f45beSAndroid Build Coastguard Worker} 21*053f45beSAndroid Build Coastguard Worker 22*053f45beSAndroid Build Coastguard Workercpu_should_not_have_cpufreq_directory() 23*053f45beSAndroid Build Coastguard Worker{ 24*053f45beSAndroid Build Coastguard Worker if [ -d $CPUROOT/$1/cpufreq ]; then 25*053f45beSAndroid Build Coastguard Worker printf "Warning: cpufreq directory present for $1\n" 26*053f45beSAndroid Build Coastguard Worker fi 27*053f45beSAndroid Build Coastguard Worker} 28*053f45beSAndroid Build Coastguard Worker 29*053f45beSAndroid Build Coastguard Workerfor_each_policy() 30*053f45beSAndroid Build Coastguard Worker{ 31*053f45beSAndroid Build Coastguard Worker policies=$(ls $CPUFREQROOT| grep "policy[0-9].*") 32*053f45beSAndroid Build Coastguard Worker for policy in $policies; do 33*053f45beSAndroid Build Coastguard Worker $@ $policy 34*053f45beSAndroid Build Coastguard Worker done 35*053f45beSAndroid Build Coastguard Worker} 36*053f45beSAndroid Build Coastguard Worker 37*053f45beSAndroid Build Coastguard Workerfor_each_policy_concurrent() 38*053f45beSAndroid Build Coastguard Worker{ 39*053f45beSAndroid Build Coastguard Worker policies=$(ls $CPUFREQROOT| grep "policy[0-9].*") 40*053f45beSAndroid Build Coastguard Worker for policy in $policies; do 41*053f45beSAndroid Build Coastguard Worker $@ $policy & 42*053f45beSAndroid Build Coastguard Worker done 43*053f45beSAndroid Build Coastguard Worker} 44*053f45beSAndroid Build Coastguard Worker 45*053f45beSAndroid Build Coastguard Worker# $1: Path 46*053f45beSAndroid Build Coastguard Workerread_cpufreq_files_in_dir() 47*053f45beSAndroid Build Coastguard Worker{ 48*053f45beSAndroid Build Coastguard Worker local files=`ls $1` 49*053f45beSAndroid Build Coastguard Worker 50*053f45beSAndroid Build Coastguard Worker printf "Printing directory: $1\n\n" 51*053f45beSAndroid Build Coastguard Worker 52*053f45beSAndroid Build Coastguard Worker for file in $files; do 53*053f45beSAndroid Build Coastguard Worker if [ -f $1/$file ]; then 54*053f45beSAndroid Build Coastguard Worker printf "$file:" 55*053f45beSAndroid Build Coastguard Worker cat $1/$file 56*053f45beSAndroid Build Coastguard Worker else 57*053f45beSAndroid Build Coastguard Worker printf "\n" 58*053f45beSAndroid Build Coastguard Worker read_cpufreq_files_in_dir "$1/$file" 59*053f45beSAndroid Build Coastguard Worker fi 60*053f45beSAndroid Build Coastguard Worker done 61*053f45beSAndroid Build Coastguard Worker printf "\n" 62*053f45beSAndroid Build Coastguard Worker} 63*053f45beSAndroid Build Coastguard Worker 64*053f45beSAndroid Build Coastguard Worker 65*053f45beSAndroid Build Coastguard Workerread_all_cpufreq_files() 66*053f45beSAndroid Build Coastguard Worker{ 67*053f45beSAndroid Build Coastguard Worker printf "** Test: Running ${FUNCNAME[0]} **\n\n" 68*053f45beSAndroid Build Coastguard Worker 69*053f45beSAndroid Build Coastguard Worker read_cpufreq_files_in_dir $CPUFREQROOT 70*053f45beSAndroid Build Coastguard Worker 71*053f45beSAndroid Build Coastguard Worker printf "%s\n\n" "------------------------------------------------" 72*053f45beSAndroid Build Coastguard Worker} 73*053f45beSAndroid Build Coastguard Worker 74*053f45beSAndroid Build Coastguard Worker 75*053f45beSAndroid Build Coastguard Worker# UPDATE CPUFREQ FILES 76*053f45beSAndroid Build Coastguard Worker 77*053f45beSAndroid Build Coastguard Worker# $1: directory path 78*053f45beSAndroid Build Coastguard Workerupdate_cpufreq_files_in_dir() 79*053f45beSAndroid Build Coastguard Worker{ 80*053f45beSAndroid Build Coastguard Worker local files=`ls $1` 81*053f45beSAndroid Build Coastguard Worker 82*053f45beSAndroid Build Coastguard Worker printf "Updating directory: $1\n\n" 83*053f45beSAndroid Build Coastguard Worker 84*053f45beSAndroid Build Coastguard Worker for file in $files; do 85*053f45beSAndroid Build Coastguard Worker if [ -f $1/$file ]; then 86*053f45beSAndroid Build Coastguard Worker # file is writable ? 87*053f45beSAndroid Build Coastguard Worker local wfile=$(ls -l $1/$file | awk '$1 ~ /^.*w.*/ { print $NF; }') 88*053f45beSAndroid Build Coastguard Worker 89*053f45beSAndroid Build Coastguard Worker if [ ! -z $wfile ]; then 90*053f45beSAndroid Build Coastguard Worker # scaling_setspeed is a special file and we 91*053f45beSAndroid Build Coastguard Worker # should skip updating it 92*053f45beSAndroid Build Coastguard Worker if [ $file != "scaling_setspeed" ]; then 93*053f45beSAndroid Build Coastguard Worker local val=$(cat $1/$file) 94*053f45beSAndroid Build Coastguard Worker printf "Writing $val to: $file\n" 95*053f45beSAndroid Build Coastguard Worker echo $val > $1/$file 96*053f45beSAndroid Build Coastguard Worker fi 97*053f45beSAndroid Build Coastguard Worker fi 98*053f45beSAndroid Build Coastguard Worker else 99*053f45beSAndroid Build Coastguard Worker printf "\n" 100*053f45beSAndroid Build Coastguard Worker update_cpufreq_files_in_dir "$1/$file" 101*053f45beSAndroid Build Coastguard Worker fi 102*053f45beSAndroid Build Coastguard Worker done 103*053f45beSAndroid Build Coastguard Worker 104*053f45beSAndroid Build Coastguard Worker printf "\n" 105*053f45beSAndroid Build Coastguard Worker} 106*053f45beSAndroid Build Coastguard Worker 107*053f45beSAndroid Build Coastguard Worker# Update all writable files with their existing values 108*053f45beSAndroid Build Coastguard Workerupdate_all_cpufreq_files() 109*053f45beSAndroid Build Coastguard Worker{ 110*053f45beSAndroid Build Coastguard Worker printf "** Test: Running ${FUNCNAME[0]} **\n\n" 111*053f45beSAndroid Build Coastguard Worker 112*053f45beSAndroid Build Coastguard Worker update_cpufreq_files_in_dir $CPUFREQROOT 113*053f45beSAndroid Build Coastguard Worker 114*053f45beSAndroid Build Coastguard Worker printf "%s\n\n" "------------------------------------------------" 115*053f45beSAndroid Build Coastguard Worker} 116*053f45beSAndroid Build Coastguard Worker 117*053f45beSAndroid Build Coastguard Worker 118*053f45beSAndroid Build Coastguard Worker# CHANGE CPU FREQUENCIES 119*053f45beSAndroid Build Coastguard Worker 120*053f45beSAndroid Build Coastguard Worker# $1: policy 121*053f45beSAndroid Build Coastguard Workerfind_current_freq() 122*053f45beSAndroid Build Coastguard Worker{ 123*053f45beSAndroid Build Coastguard Worker cat $CPUFREQROOT/$1/scaling_cur_freq 124*053f45beSAndroid Build Coastguard Worker} 125*053f45beSAndroid Build Coastguard Worker 126*053f45beSAndroid Build Coastguard Worker# $1: policy 127*053f45beSAndroid Build Coastguard Worker# $2: frequency 128*053f45beSAndroid Build Coastguard Workerset_cpu_frequency() 129*053f45beSAndroid Build Coastguard Worker{ 130*053f45beSAndroid Build Coastguard Worker printf "Change frequency for $1 to $2\n" 131*053f45beSAndroid Build Coastguard Worker echo $2 > $CPUFREQROOT/$1/scaling_setspeed 132*053f45beSAndroid Build Coastguard Worker} 133*053f45beSAndroid Build Coastguard Worker 134*053f45beSAndroid Build Coastguard Worker# $1: policy 135*053f45beSAndroid Build Coastguard Workertest_all_frequencies() 136*053f45beSAndroid Build Coastguard Worker{ 137*053f45beSAndroid Build Coastguard Worker local filepath="$CPUFREQROOT/$1" 138*053f45beSAndroid Build Coastguard Worker 139*053f45beSAndroid Build Coastguard Worker backup_governor $1 140*053f45beSAndroid Build Coastguard Worker 141*053f45beSAndroid Build Coastguard Worker local found=$(switch_governor $1 "userspace") 142*053f45beSAndroid Build Coastguard Worker if [ $found = 1 ]; then 143*053f45beSAndroid Build Coastguard Worker printf "${FUNCNAME[0]}: userspace governor not available for: $1\n" 144*053f45beSAndroid Build Coastguard Worker return; 145*053f45beSAndroid Build Coastguard Worker fi 146*053f45beSAndroid Build Coastguard Worker 147*053f45beSAndroid Build Coastguard Worker printf "Switched governor for $1 to userspace\n\n" 148*053f45beSAndroid Build Coastguard Worker 149*053f45beSAndroid Build Coastguard Worker local freqs=$(cat $filepath/scaling_available_frequencies) 150*053f45beSAndroid Build Coastguard Worker printf "Available frequencies for $1: $freqs\n\n" 151*053f45beSAndroid Build Coastguard Worker 152*053f45beSAndroid Build Coastguard Worker # Set all frequencies one-by-one 153*053f45beSAndroid Build Coastguard Worker for freq in $freqs; do 154*053f45beSAndroid Build Coastguard Worker set_cpu_frequency $1 $freq 155*053f45beSAndroid Build Coastguard Worker done 156*053f45beSAndroid Build Coastguard Worker 157*053f45beSAndroid Build Coastguard Worker printf "\n" 158*053f45beSAndroid Build Coastguard Worker 159*053f45beSAndroid Build Coastguard Worker restore_governor $1 160*053f45beSAndroid Build Coastguard Worker} 161*053f45beSAndroid Build Coastguard Worker 162*053f45beSAndroid Build Coastguard Worker# $1: loop count 163*053f45beSAndroid Build Coastguard Workershuffle_frequency_for_all_cpus() 164*053f45beSAndroid Build Coastguard Worker{ 165*053f45beSAndroid Build Coastguard Worker printf "** Test: Running ${FUNCNAME[0]} for $1 loops **\n\n" 166*053f45beSAndroid Build Coastguard Worker 167*053f45beSAndroid Build Coastguard Worker for i in `seq 1 $1`; do 168*053f45beSAndroid Build Coastguard Worker for_each_policy test_all_frequencies 169*053f45beSAndroid Build Coastguard Worker done 170*053f45beSAndroid Build Coastguard Worker printf "\n%s\n\n" "------------------------------------------------" 171*053f45beSAndroid Build Coastguard Worker} 172*053f45beSAndroid Build Coastguard Worker 173*053f45beSAndroid Build Coastguard Worker# Basic cpufreq tests 174*053f45beSAndroid Build Coastguard Workercpufreq_basic_tests() 175*053f45beSAndroid Build Coastguard Worker{ 176*053f45beSAndroid Build Coastguard Worker printf "*** RUNNING CPUFREQ SANITY TESTS ***\n" 177*053f45beSAndroid Build Coastguard Worker printf "====================================\n\n" 178*053f45beSAndroid Build Coastguard Worker 179*053f45beSAndroid Build Coastguard Worker count=$(count_cpufreq_managed_cpus) 180*053f45beSAndroid Build Coastguard Worker if [ $count = 0 ]; then 181*053f45beSAndroid Build Coastguard Worker printf "No cpu is managed by cpufreq core, exiting\n" 182*053f45beSAndroid Build Coastguard Worker exit; 183*053f45beSAndroid Build Coastguard Worker else 184*053f45beSAndroid Build Coastguard Worker printf "CPUFreq manages: $count CPUs\n\n" 185*053f45beSAndroid Build Coastguard Worker fi 186*053f45beSAndroid Build Coastguard Worker 187*053f45beSAndroid Build Coastguard Worker # Detect & print which CPUs are not managed by cpufreq 188*053f45beSAndroid Build Coastguard Worker print_unmanaged_cpus 189*053f45beSAndroid Build Coastguard Worker 190*053f45beSAndroid Build Coastguard Worker # read/update all cpufreq files 191*053f45beSAndroid Build Coastguard Worker read_all_cpufreq_files 192*053f45beSAndroid Build Coastguard Worker update_all_cpufreq_files 193*053f45beSAndroid Build Coastguard Worker 194*053f45beSAndroid Build Coastguard Worker # hotplug cpus 195*053f45beSAndroid Build Coastguard Worker reboot_cpus 5 196*053f45beSAndroid Build Coastguard Worker 197*053f45beSAndroid Build Coastguard Worker # Test all frequencies 198*053f45beSAndroid Build Coastguard Worker shuffle_frequency_for_all_cpus 2 199*053f45beSAndroid Build Coastguard Worker 200*053f45beSAndroid Build Coastguard Worker # Test all governors 201*053f45beSAndroid Build Coastguard Worker shuffle_governors_for_all_cpus 1 202*053f45beSAndroid Build Coastguard Worker} 203*053f45beSAndroid Build Coastguard Worker 204*053f45beSAndroid Build Coastguard Worker# Suspend/resume 205*053f45beSAndroid Build Coastguard Worker# $1: "suspend" or "hibernate", $2: loop count 206*053f45beSAndroid Build Coastguard Workerdo_suspend() 207*053f45beSAndroid Build Coastguard Worker{ 208*053f45beSAndroid Build Coastguard Worker printf "** Test: Running ${FUNCNAME[0]}: Trying $1 for $2 loops **\n\n" 209*053f45beSAndroid Build Coastguard Worker 210*053f45beSAndroid Build Coastguard Worker # Is the directory available 211*053f45beSAndroid Build Coastguard Worker if [ ! -d $SYSFS/power/ -o ! -f $SYSFS/power/state ]; then 212*053f45beSAndroid Build Coastguard Worker printf "$SYSFS/power/state not available\n" 213*053f45beSAndroid Build Coastguard Worker return 1 214*053f45beSAndroid Build Coastguard Worker fi 215*053f45beSAndroid Build Coastguard Worker 216*053f45beSAndroid Build Coastguard Worker if [ $1 = "suspend" ]; then 217*053f45beSAndroid Build Coastguard Worker filename="mem" 218*053f45beSAndroid Build Coastguard Worker elif [ $1 = "hibernate" ]; then 219*053f45beSAndroid Build Coastguard Worker filename="disk" 220*053f45beSAndroid Build Coastguard Worker else 221*053f45beSAndroid Build Coastguard Worker printf "$1 is not a valid option\n" 222*053f45beSAndroid Build Coastguard Worker return 1 223*053f45beSAndroid Build Coastguard Worker fi 224*053f45beSAndroid Build Coastguard Worker 225*053f45beSAndroid Build Coastguard Worker if [ -n $filename ]; then 226*053f45beSAndroid Build Coastguard Worker present=$(cat $SYSFS/power/state | grep $filename) 227*053f45beSAndroid Build Coastguard Worker 228*053f45beSAndroid Build Coastguard Worker if [ -z "$present" ]; then 229*053f45beSAndroid Build Coastguard Worker printf "Tried to $1 but $filename isn't present in $SYSFS/power/state\n" 230*053f45beSAndroid Build Coastguard Worker return 1; 231*053f45beSAndroid Build Coastguard Worker fi 232*053f45beSAndroid Build Coastguard Worker 233*053f45beSAndroid Build Coastguard Worker for i in `seq 1 $2`; do 234*053f45beSAndroid Build Coastguard Worker printf "Starting $1\n" 235*053f45beSAndroid Build Coastguard Worker echo $filename > $SYSFS/power/state 236*053f45beSAndroid Build Coastguard Worker printf "Came out of $1\n" 237*053f45beSAndroid Build Coastguard Worker 238*053f45beSAndroid Build Coastguard Worker printf "Do basic tests after finishing $1 to verify cpufreq state\n\n" 239*053f45beSAndroid Build Coastguard Worker cpufreq_basic_tests 240*053f45beSAndroid Build Coastguard Worker done 241*053f45beSAndroid Build Coastguard Worker fi 242*053f45beSAndroid Build Coastguard Worker} 243