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+ # shellcheck disable=SC1090
25+ [ -f " $INIT_ENV " ] && . " $INIT_ENV "
26+ # shellcheck disable=SC1090
27+ . " $FUNCLIB "
28+ __RUNNER_SUITES_DIR=" ${__RUNNER_SUITES_DIR:- $ROOT_DIR / suites} "
29+
30+ TESTNAME=" CPUFreq_Validation"
1031test_path=$( find_test_case_by_name " $TESTNAME " )
32+ cd " $test_path " || exit 1
33+ # shellcheck disable=SC2034
34+ res_file=" ./$TESTNAME .res"
35+
1136log_info " -----------------------------------------------------------------------------------------"
1237log_info " -------------------Starting $TESTNAME Testcase----------------------------"
13- log_info " === CPUFreq Frequency Walker with Validation ==="
38+ log_info " === CPUFreq Frequency Walker with Retry and Cleanup ==="
1439
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"
40+ sync
41+ sleep 1
2142
2243NUM_CPUS=$( nproc)
23- printf " ${YELLOW} Detected %s CPU cores.${NC} \n " " $NUM_CPUS "
44+ log_info " Detected $NUM_CPUS CPU cores."
2445
2546overall_pass=0
2647status_dir=" /tmp/cpufreq_status.$$ "
2748mkdir -p " $status_dir "
2849
2950validate_cpu_core () {
30- local cpu=$1
31- local core_id=$2
32- status_file=" $status_dir /core_$core_id "
51+ local cpu=" $1 "
52+ local core_id=" $2 "
53+ local status_file=" $status_dir /core_$core_id "
54+ echo " unknown" > " $status_file "
3355
34- printf " ${BLUE} Processing %s...${NC} \n" " $cpu "
56+ log_info " Processing $cpu ..."
57+
58+ local cpu_num
59+ cpu_num=$( basename " $cpu " | tr -dc ' 0-9' )
60+ if [ -f " /sys/devices/system/cpu/cpu$cpu_num /online" ]; then
61+ echo 1 > " /sys/devices/system/cpu/cpu$cpu_num /online"
62+ fi
3563
3664 if [ ! -d " $cpu /cpufreq" ]; then
37- printf " ${BLUE} [SKIP]${NC} %s does not support cpufreq.\n " " $cpu "
65+ log_info " [SKIP] $cpu does not support cpufreq."
3866 echo " skip" > " $status_file "
3967 return
4068 fi
4169
42- available_freqs= $( cat " $cpu /cpufreq/scaling_available_frequencies" 2> /dev/null )
43-
70+ local freqs_file= " $cpu /cpufreq/scaling_available_frequencies"
71+ read -r available_freqs < " $freqs_file " 2> /dev/null
4472 if [ -z " $available_freqs " ]; then
45- printf " ${YELLOW} [INFO] ${NC} No available frequencies for %s. Skipping...\n " " $cpu "
73+ log_info " [SKIP] No available frequencies for $cpu "
4674 echo " skip" > " $status_file "
4775 return
4876 fi
4977
50- if echo " userspace" | tee " $cpu /cpufreq/scaling_governor" > /dev/null; then
51- printf " ${YELLOW} [INFO]${NC} Set governor to userspace.\n"
78+ local original_governor
79+ original_governor=$( cat " $cpu /cpufreq/scaling_governor" 2> /dev/null)
80+
81+ if echo " userspace" > " $cpu /cpufreq/scaling_governor" ; then
82+ log_info " [INFO] Set governor to userspace."
83+ sync
84+ sleep 0.5
5285 else
53- printf " ${RED} [ERROR] ${NC} Cannot set userspace governor for %s.\n " " $cpu "
86+ log_error " Cannot set userspace governor for $cpu . "
5487 echo " fail" > " $status_file "
5588 return
5689 fi
@@ -59,23 +92,46 @@ validate_cpu_core() {
5992
6093 for freq in $available_freqs ; do
6194 log_info " Setting $cpu to frequency $freq kHz..."
62- if echo " $freq " | tee " $cpu /cpufreq/scaling_setspeed" > /dev/null; then
95+
96+ echo " $freq " > " $cpu /cpufreq/scaling_min_freq" 2> /dev/null
97+ echo " $freq " > " $cpu /cpufreq/scaling_max_freq" 2> /dev/null
98+
99+ if ! echo " $freq " > " $cpu /cpufreq/scaling_setspeed" 2> /dev/null; then
100+ log_error " [SKIP] Kernel rejected freq $freq for $cpu "
101+ continue
102+ fi
103+
104+ retry=0
105+ success=0
106+ while [ " $retry " -lt 5 ]; do
107+ cur=$( cat " $cpu /cpufreq/scaling_cur_freq" )
108+ if [ " $cur " = " $freq " ]; then
109+ log_info " [PASS] $cpu set to $freq kHz."
110+ success=1
111+ break
112+ fi
63113 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 "
114+ retry=$(( retry + 1 ))
115+ done
116+
117+ if [ " $success " -eq 0 ]; then
118+ log_info " [RETRY] Re-attempting to set $cpu to $freq kHz..."
119+ echo " $freq " > " $cpu /cpufreq/scaling_setspeed"
120+ sleep 0.3
121+ cur=$( cat " $cpu /cpufreq/scaling_cur_freq" )
122+ if [ " $cur " = " $freq " ]; then
123+ log_info " [PASS-after-retry] $cpu set to $freq kHz."
67124 else
68- printf " ${RED} [FAIL]${NC} Tried to set %s to %s kHz, but current is %s kHz.\n " " $cpu " " $freq " " $actual_freq "
125+ log_error " [FAIL] $cpu failed to set $freq kHz twice. Current: $cur "
69126 echo " fail" > " $status_file "
70127 fi
71- else
72- printf " ${RED} [ERROR]${NC} Failed to set %s to %s kHz.\n" " $cpu " " $freq "
73- echo " fail" > " $status_file "
74128 fi
75129 done
76130
77- echo " Restoring $cpu governor to 'ondemand'..."
78- echo " ondemand" | sudo tee " $cpu /cpufreq/scaling_governor" > /dev/null
131+ log_info " Restoring $cpu governor to '$original_governor '..."
132+ echo " $original_governor " > " $cpu /cpufreq/scaling_governor"
133+ echo 0 > " $cpu /cpufreq/scaling_min_freq" 2> /dev/null
134+ echo 0 > " $cpu /cpufreq/scaling_max_freq" 2> /dev/null
79135}
80136
81137cpu_index=0
@@ -93,36 +149,34 @@ for status_file in "$status_dir"/core_*; do
93149 status=$( cat " $status_file " )
94150 case " $status " in
95151 pass)
96- printf " CPU%s: ${GREEN} [PASS]${NC} \n " " $idx "
152+ log_info " CPU$idx : [PASS]"
97153 ;;
98154 fail)
99- printf " CPU%s: ${RED} [FAIL]${NC} \n " " $idx "
155+ log_error " CPU$idx : [FAIL]"
100156 overall_pass=1
101157 ;;
102158 skip)
103- printf " CPU%s: ${BLUE} [SKIPPED]${NC} \n " " $idx "
159+ log_info " CPU$idx : [SKIPPED]"
104160 ;;
105161 * )
106- printf " CPU%s: ${RED} [UNKNOWN STATUS]${NC} \n " " $idx "
162+ log_error " CPU$idx : [UNKNOWN STATUS]"
107163 overall_pass=1
108164 ;;
109165 esac
110166done
111167
112168log_info " "
113169log_info " === Overall CPUFreq Validation Result ==="
170+
114171if [ " $overall_pass " -eq 0 ]; then
115- printf " ${GREEN} [OVERALL PASS]${NC} All CPUs validated successfully.\n"
116172 log_pass " $TESTNAME : Test Passed"
117- echo " $TESTNAME PASS" > " $test_path /$TESTNAME .res"
118- rm -r " $status_dir "
119- exit 0
173+ echo " $TESTNAME PASS" > " $res_file "
120174else
121- printf " ${RED} [OVERALL FAIL]${NC} Some CPUs failed frequency validation.\n"
122175 log_fail " $TESTNAME : Test Failed"
123- echo " $TESTNAME FAIL" > " $test_path /$TESTNAME .res"
124- rm -r " $status_dir "
125- exit 1
176+ echo " $TESTNAME FAIL" > " $res_file "
126177fi
127178
128- log_info " -------------------Completed $TESTNAME Testcase----------------------------"
179+ rm -r " $status_dir "
180+ sync
181+ sleep 1
182+ exit " $overall_pass "
0 commit comments