summaryrefslogtreecommitdiff
path: root/bin
diff options
authorKai-Chuan Hsieh <kaichuan.hsieh@canonical.com>2021-05-25 15:30:48 +0800
committerKai-Chuan Hsieh <kaichuan.hsieh@canonical.com>2021-05-27 18:53:52 +0800
commit188023521d796352e9e6ac78e0e5e0952bf3c452 (patch)
treeee1f4cbc4a557890da0efa827ae568d697ca9453 /bin
parent5a17cac9dc3b4b940cac95dd2978c3c8166a9e59 (diff)
Add: check package cstate during short idle
LP: #1928053 According to Intel blog [1], the system can reach at least PC8 when screen on. The test job check if the device can reach PC8 during idle screen on. For platform has no PC8, the target shoule be as deeper as possible. [1] https://01.org/blogs/qwang59/2020/linux-s0ix-troubleshooting
Diffstat (limited to 'bin')
-rwxr-xr-xbin/short-idle-check.sh193
1 files changed, 193 insertions, 0 deletions
diff --git a/bin/short-idle-check.sh b/bin/short-idle-check.sh
new file mode 100755
index 0000000..34069e3
--- /dev/null
+++ b/bin/short-idle-check.sh
@@ -0,0 +1,193 @@
+#!/bin/bash
+
+usage() {
+ cat <<EOU
+
+${0} - check short idle residency
+
+ Usage: ${0} [ -s <interval> ]
+
+ -s <interval> -- specify a idle time interval in seconds
+
+EOU
+}
+
+re='^[0-9]+$'
+sleep_time=20
+
+while [ $# -gt 0 ]
+do
+ case "$1" in
+ -s)
+ if ! [[ $2 =~ $re ]]; then
+ usage
+ exit 1
+ fi
+ sleep_time=${2}
+ break
+ ;;
+ --help)
+ usage
+ exit 1
+ ;;
+ *)
+ usage
+ exit 1
+ ;;
+ esac
+ shift
+done
+
+msr_support=$(find /dev/cpu -name msr)
+if [ -z "$msr_support" ]; then
+ echo "Attempting to load Intel MSR kernel module..."
+ modprobe msr
+fi
+
+cstate_pkg_list=$(ls /sys/bus/event_source/devices/cstate_pkg/events/)
+msr_pc2=0
+msr_pc3=0
+msr_pc6=0
+msr_pc7=0
+msr_pc8=0
+msr_pc9=0
+msr_pc10=0
+
+for event in $cstate_pkg_list;
+do
+ case "$event" in
+ "c2-residency")
+ msr_pc2=1
+ ;;
+ "c3-residency")
+ msr_pc3=1
+ ;;
+ "c6-residency")
+ msr_pc6=1
+ ;;
+ "c7-residency")
+ msr_pc7=1
+ ;;
+ "c8-residency")
+ msr_pc8=1
+ ;;
+ "c9-residency")
+ msr_pc9=1
+ ;;
+ "c10-residency")
+ msr_pc10=1
+ ;;
+ esac
+done
+
+# Find the platform's cstate accroding to
+# registered event node
+# https://elixir.bootlin.com/linux/latest/source/arch/x86/events/intel/cstate.c#L504
+#
+# Find the MSR register in
+# https://elixir.bootlin.com/linux/latest/source/arch/x86/include/asm/msr-index.h#L285
+# NHM support
+if [ $((msr_pc2+msr_pc8+msr_pc9+msr_pc10)) -eq 0 ] && [ $msr_pc3 -eq 1 ] && [ $msr_pc6 -eq 1 ] && [ $msr_pc7 -eq 1 ]; then
+ echo "Identified device as supporting Intel Nehalem C-states"
+ counter_pc7=$(rdmsr -p 0 -o 0x3fa)
+ sleep "$sleep_time"
+ new_counter_pc7=$(rdmsr -p 0 -o 0x3fa)
+ delt_pc7=$((new_counter_pc7-counter_pc7))
+ echo "Target MSR PC7 residency delta before/after idle is $delt_pc7"
+ if [ $delt_pc7 -gt 0 ]; then
+ echo "PASS: Time spent in PC7 state"
+ exit 0
+ else
+ exit 1
+ fi
+fi
+
+# SNB support
+if [ $((msr_pc8+msr_pc9+msr_pc10)) -eq 0 ] && [ $msr_pc2 -eq 1 ] && [ $msr_pc3 -eq 1 ] && [ $msr_pc6 -eq 1 ] && [ $msr_pc7 -eq 1 ]; then
+ echo "Identified device as supporting Intel Sandybridge C-states"
+ counter_pc7=$(rdmsr -p 0 -o 0x3fa)
+ sleep "$sleep_time"
+ new_counter_pc7=$(rdmsr -p 0 -o 0x3fa)
+ delt_pc7=$((new_counter_pc7-counter_pc7))
+ echo "Target MSR PC7 residency delta before/after idle is $delt_pc7"
+ if [ $delt_pc7 -gt 0 ]; then
+ echo "PASS: Time spent in PC7 state"
+ exit 0
+ else
+ exit 1
+ fi
+fi
+
+# SLM support with SLM_PKG_C6_USE_C7_MSR
+if [ $((msr_pc2+msr_pc3+msr_pc7+msr_pc8+msr_pc9+msr_pc10)) -eq 0 ] && [ $msr_pc6 -eq 1 ]; then
+ echo "Identified device as supporting Intel Silvermont C-states"
+ counter_pc6=$(rdmsr -p 0 -o 0x3fa)
+ sleep "$sleep_time"
+ new_counter_pc6=$(rdmsr -p 0 -o 0x3fa)
+ delt_pc6=$((new_counter_pc6-counter_pc6))
+ echo "Target MSR PC6 residency delta before/after idle is $delt_pc6"
+ if [ $delt_pc6 -gt 0 ]; then
+ echo "PASS: Time spent in PC6 state"
+ exit 0
+ else
+ exit 1
+ fi
+fi
+
+# KNL support
+if [ $((msr_pc7+msr_pc8+msr_pc9+msr_pc10)) -eq 0 ] && [ $msr_pc2 -eq 1 ] && [ $msr_pc3 -eq 1 ] && [ $msr_pc6 -eq 1 ]; then
+ echo "Identified device as supporting Intel Knights Landing C-states"
+ counter_pc6=$(rdmsr -p 0 -o 0x3f9)
+ sleep "$sleep_time"
+ new_counter_pc6=$(rdmsr -p 0 -o 0x3f9)
+ delt_pc6=$((new_counter_pc6-counter_pc6))
+ echo "Target MSR PC6 residency delta before/after idle is $delt_pc6"
+ if [ $delt_pc6 -gt 0 ]; then
+ echo "PASS: Time spent in PC6 state"
+ exit 0
+ else
+ exit 1
+ fi
+fi
+
+# GLM support
+if [ $((msr_pc7+msr_pc8+msr_pc9)) -eq 0 ] && [ $msr_pc2 -eq 1 ] && [ $msr_pc3 -eq 1 ] && [ $msr_pc6 -eq 1 ] && [ $msr_pc10 -eq 1 ]; then
+ echo "Identified device as supporting Intel Goldmont C-states"
+ counter_pc6=$(rdmsr -p 0 -o 0x3f9)
+ counter_pc10=$(rdmsr -p 0 -o 0x632)
+ sleep "$sleep_time"
+ new_counter_pc6=$(rdmsr -p 0 -o 0x3f9)
+ new_counter_pc10=$(rdmsr -p 0 -o 0x632)
+ delt_pc6=$((new_counter_pc6-counter_pc6))
+ delt_pc10=$((new_counter_pc10-counter_pc10))
+ echo "Target MSR PC6 residency delta before/after idle is $delt_pc6"
+ if [ $((delt_pc6+delt_pc10)) -gt 0 ]; then
+ echo "PASS: Time spent in at least one of PC6 or PC10 state"
+ exit 0
+ else
+ exit 1
+ fi
+fi
+
+# ADL/ICL/CNL/HSWULT
+echo "Assuming device supports one of Alderlake/Icelake/Cannonlake/Haswell C-states"
+counter_pc8=$(rdmsr -p 0 -o 0x630)
+counter_pc9=$(rdmsr -p 0 -o 0x631)
+counter_pc10=$(rdmsr -p 0 -o 0x632)
+sleep "$sleep_time"
+new_counter_pc8=$(rdmsr -p 0 -o 0x630)
+new_counter_pc9=$(rdmsr -p 0 -o 0x631)
+new_counter_pc10=$(rdmsr -p 0 -o 0x632)
+delt_pc8=$((new_counter_pc8-counter_pc8))
+delt_pc9=$((new_counter_pc9-counter_pc9))
+delt_pc10=$((new_counter_pc10-counter_pc10))
+echo "PC8 MSR residency delta before/after idle is $delt_pc8"
+echo "PC9 MSR residency delta before/after idle is $delt_pc9"
+echo "PC10 MSR residency delta before/after idle is $delt_pc10"
+
+if [ $((delt_pc8+delt_pc9+delt_pc10)) -gt 0 ]; then
+ echo "PASS: Time spent in at least one of PC8, PC9 or PC10 states"
+ exit 0
+fi
+
+exit 1