33# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
44# SPDX-License-Identifier: BSD-3-Clause-Clear
55
6- . " ${PWD} /init_env"
7- TESTNAME=" CPUFreq_Validation"
8- . " $TOOLS /functestlib.sh"
6+ SCRIPT_DIR=" $( cd " $( dirname " $0 " ) " && pwd) "
7+ ROOT_DIR=" $SCRIPT_DIR "
8+ while [ " $ROOT_DIR " != " /" ]; do
9+ if [ -d " $ROOT_DIR /utils" ] && [ -d " $ROOT_DIR /suites" ]; then
10+ break
11+ fi
12+ ROOT_DIR=$( dirname " $ROOT_DIR " )
13+ done
14+
15+ if [ ! -d " $ROOT_DIR /utils" ] || [ ! -f " $ROOT_DIR /utils/functestlib.sh" ]; then
16+ echo " [ERROR] Could not detect testkit root (missing utils/ or functestlib.sh)" >&2
17+ exit 1
18+ fi
919
20+ TOOLS=" $ROOT_DIR /utils"
21+ INIT_ENV=" $ROOT_DIR /init_env"
22+ FUNCLIB=" $TOOLS /functestlib.sh"
23+
24+ [ -f " $INIT_ENV " ] && . " $INIT_ENV "
25+ . " $FUNCLIB "
26+
27+ __RUNNER_SUITES_DIR=" ${__RUNNER_SUITES_DIR:- $ROOT_DIR / suites} "
28+
29+ TESTNAME=" CPUFreq_Validation"
1030test_path=$( find_test_case_by_name " $TESTNAME " )
31+ cd " $test_path " || exit 1
32+ res_file=" ./$TESTNAME .res"
33+
1134log_info " -----------------------------------------------------------------------------------------"
1235log_info " -------------------Starting $TESTNAME Testcase----------------------------"
13- log_info " === CPUFreq Frequency Walker with Validation ==="
36+ log_info " === CPUFreq Frequency Walker with Retry and Cleanup ==="
1437
15- # Color codes (ANSI escape sequences)
16- GREEN=" \033[32m"
17- RED=" \033[31m"
18- YELLOW=" \033[33m"
19- BLUE=" \033[34m"
20- NC=" \033[0m"
38+ sync
39+ sleep 1
2140
2241NUM_CPUS=$( nproc)
23- printf " ${YELLOW} Detected %s CPU cores.${NC} \n " " $NUM_CPUS "
42+ log_info " Detected $NUM_CPUS CPU cores."
2443
2544overall_pass=0
2645status_dir=" /tmp/cpufreq_status.$$ "
2746mkdir -p " $status_dir "
2847
2948validate_cpu_core () {
30- local cpu=$1
31- local core_id=$2
32- status_file=" $status_dir /core_$core_id "
49+ local cpu=" $1 "
50+ local core_id=" $2 "
51+ local status_file=" $status_dir /core_$core_id "
52+ echo " unknown" > " $status_file "
3353
34- printf " ${BLUE} Processing %s...${NC} \n" " $cpu "
54+ log_info " Processing $cpu ..."
55+
56+ local cpu_num
57+ cpu_num=$( basename " $cpu " | tr -dc ' 0-9' )
58+ if [ -f " /sys/devices/system/cpu/cpu$cpu_num /online" ]; then
59+ echo 1 > " /sys/devices/system/cpu/cpu$cpu_num /online"
60+ fi
3561
3662 if [ ! -d " $cpu /cpufreq" ]; then
37- printf " ${BLUE} [SKIP]${NC} %s does not support cpufreq.\n " " $cpu "
63+ log_info " [SKIP] $cpu does not support cpufreq."
3864 echo " skip" > " $status_file "
3965 return
4066 fi
4167
42- available_freqs= $( cat " $cpu /cpufreq/scaling_available_frequencies" 2> /dev/null )
43-
68+ local freqs_file= " $cpu /cpufreq/scaling_available_frequencies"
69+ read -r available_freqs < " $freqs_file " 2> /dev/null
4470 if [ -z " $available_freqs " ]; then
45- printf " ${YELLOW} [INFO] ${NC} No available frequencies for %s. Skipping...\n " " $cpu "
71+ log_info " [SKIP] No available frequencies for $cpu "
4672 echo " skip" > " $status_file "
4773 return
4874 fi
4975
50- if echo " userspace" | tee " $cpu /cpufreq/scaling_governor" > /dev/null; then
51- printf " ${YELLOW} [INFO]${NC} Set governor to userspace.\n"
76+ local original_governor
77+ original_governor=$( cat " $cpu /cpufreq/scaling_governor" 2> /dev/null)
78+
79+ if echo " userspace" > " $cpu /cpufreq/scaling_governor" ; then
80+ log_info " [INFO] Set governor to userspace."
81+ sync
82+ sleep 0.5
5283 else
53- printf " ${RED} [ERROR] ${NC} Cannot set userspace governor for %s.\n " " $cpu "
84+ log_error " Cannot set userspace governor for $cpu . "
5485 echo " fail" > " $status_file "
5586 return
5687 fi
@@ -59,23 +90,46 @@ validate_cpu_core() {
5990
6091 for freq in $available_freqs ; do
6192 log_info " Setting $cpu to frequency $freq kHz..."
62- if echo " $freq " | tee " $cpu /cpufreq/scaling_setspeed" > /dev/null; then
93+
94+ echo " $freq " > " $cpu /cpufreq/scaling_min_freq" 2> /dev/null
95+ echo " $freq " > " $cpu /cpufreq/scaling_max_freq" 2> /dev/null
96+
97+ if ! echo " $freq " > " $cpu /cpufreq/scaling_setspeed" 2> /dev/null; then
98+ log_error " [SKIP] Kernel rejected freq $freq for $cpu "
99+ continue
100+ fi
101+
102+ retry=0
103+ success=0
104+ while [ " $retry " -lt 5 ]; do
105+ cur=$( cat " $cpu /cpufreq/scaling_cur_freq" )
106+ if [ " $cur " = " $freq " ]; then
107+ log_info " [PASS] $cpu set to $freq kHz."
108+ success=1
109+ break
110+ fi
63111 sleep 0.2
64- actual_freq=$( cat " $cpu /cpufreq/scaling_cur_freq" )
65- if [ " $actual_freq " = " $freq " ]; then
66- printf " ${GREEN} [PASS]${NC} %s set to %s kHz.\n" " $cpu " " $freq "
112+ retry=$(( retry + 1 ))
113+ done
114+
115+ if [ " $success " -eq 0 ]; then
116+ log_info " [RETRY] Re-attempting to set $cpu to $freq kHz..."
117+ echo " $freq " > " $cpu /cpufreq/scaling_setspeed"
118+ sleep 0.3
119+ cur=$( cat " $cpu /cpufreq/scaling_cur_freq" )
120+ if [ " $cur " = " $freq " ]; then
121+ log_info " [PASS-after-retry] $cpu set to $freq kHz."
67122 else
68- printf " ${RED} [FAIL]${NC} Tried to set %s to %s kHz, but current is %s kHz.\n " " $cpu " " $freq " " $actual_freq "
123+ log_error " [FAIL] $cpu failed to set $freq kHz twice. Current: $cur "
69124 echo " fail" > " $status_file "
70125 fi
71- else
72- printf " ${RED} [ERROR]${NC} Failed to set %s to %s kHz.\n" " $cpu " " $freq "
73- echo " fail" > " $status_file "
74126 fi
75127 done
76128
77- echo " Restoring $cpu governor to 'ondemand'..."
78- echo " ondemand" | sudo tee " $cpu /cpufreq/scaling_governor" > /dev/null
129+ log_info " Restoring $cpu governor to '$original_governor '..."
130+ echo " $original_governor " > " $cpu /cpufreq/scaling_governor"
131+ echo 0 > " $cpu /cpufreq/scaling_min_freq" 2> /dev/null
132+ echo 0 > " $cpu /cpufreq/scaling_max_freq" 2> /dev/null
79133}
80134
81135cpu_index=0
@@ -93,36 +147,34 @@ for status_file in "$status_dir"/core_*; do
93147 status=$( cat " $status_file " )
94148 case " $status " in
95149 pass)
96- printf " CPU%s: ${GREEN} [PASS]${NC} \n " " $idx "
150+ log_info " CPU$idx : [PASS]"
97151 ;;
98152 fail)
99- printf " CPU%s: ${RED} [FAIL]${NC} \n " " $idx "
153+ log_error " CPU$idx : [FAIL]"
100154 overall_pass=1
101155 ;;
102156 skip)
103- printf " CPU%s: ${BLUE} [SKIPPED]${NC} \n " " $idx "
157+ log_info " CPU$idx : [SKIPPED]"
104158 ;;
105159 * )
106- printf " CPU%s: ${RED} [UNKNOWN STATUS]${NC} \n " " $idx "
160+ log_error " CPU$idx : [UNKNOWN STATUS]"
107161 overall_pass=1
108162 ;;
109163 esac
110164done
111165
112166log_info " "
113167log_info " === Overall CPUFreq Validation Result ==="
168+
114169if [ " $overall_pass " -eq 0 ]; then
115- printf " ${GREEN} [OVERALL PASS]${NC} All CPUs validated successfully.\n"
116170 log_pass " $TESTNAME : Test Passed"
117- echo " $TESTNAME PASS" > " $test_path /$TESTNAME .res"
118- rm -r " $status_dir "
119- exit 0
171+ echo " $TESTNAME PASS" > " $res_file "
120172else
121- printf " ${RED} [OVERALL FAIL]${NC} Some CPUs failed frequency validation.\n"
122173 log_fail " $TESTNAME : Test Failed"
123- echo " $TESTNAME FAIL" > " $test_path /$TESTNAME .res"
124- rm -r " $status_dir "
125- exit 1
174+ echo " $TESTNAME FAIL" > " $res_file "
126175fi
127176
128- log_info " -------------------Completed $TESTNAME Testcase----------------------------"
177+ rm -r " $status_dir "
178+ sync
179+ sleep 1
180+ exit " $overall_pass "
0 commit comments