]>
Commit | Line | Data |
---|---|---|
ed2d26d7 | 1 | #!/bin/bash |
b2441318 | 2 | # SPDX-License-Identifier: GPL-2.0 |
ed2d26d7 PB |
3 | # |
4 | # This test runs on Intel x86 based hardware which support the intel_pstate | |
5 | # driver. The test checks the frequency settings from the maximum turbo | |
6 | # state to the minimum supported frequency, in decrements of 100MHz. The | |
7 | # test runs the aperf.c program to put load on each processor. | |
8 | # | |
9 | # The results are displayed in a table which indicate the "Target" state, | |
10 | # or the requested frequency in MHz, the Actual frequency, as read from | |
11 | # /proc/cpuinfo, the difference between the Target and Actual frequencies, | |
12 | # and the value of MSR 0x199 (MSR_IA32_PERF_CTL) which indicates what | |
13 | # pstate the cpu is in, and the value of | |
14 | # /sys/devices/system/cpu/intel_pstate/max_perf_pct X maximum turbo state | |
15 | # | |
16 | # Notes: In some cases several frequency values may be placed in the | |
17 | # /tmp/result.X files. This is done on purpose in order to catch cases | |
18 | # where the pstate driver may not be working at all. There is the case | |
19 | # where, for example, several "similar" frequencies are in the file: | |
20 | # | |
21 | # | |
22 | #/tmp/result.3100:1:cpu MHz : 2899.980 | |
23 | #/tmp/result.3100:2:cpu MHz : 2900.000 | |
24 | #/tmp/result.3100:3:msr 0x199: 0x1e00 | |
25 | #/tmp/result.3100:4:max_perf_pct 94 | |
26 | # | |
27 | # and the test will error out in those cases. The result.X file can be checked | |
28 | # for consistency and modified to remove the extra MHz values. The result.X | |
29 | # files can be re-evaluated by setting EVALUATE_ONLY to 1 below. | |
30 | ||
31 | EVALUATE_ONLY=0 | |
32 | ||
67b2e30e DD |
33 | if ! uname -m | sed -e s/i.86/x86/ -e s/x86_64/x86/ | grep -q x86; then |
34 | echo "$0 # Skipped: Test can only run on x86 architectures." | |
35 | exit 0 | |
36 | fi | |
37 | ||
ed2d26d7 PB |
38 | max_cpus=$(($(nproc)-1)) |
39 | ||
ed2d26d7 PB |
40 | function run_test () { |
41 | ||
42 | file_ext=$1 | |
43 | for cpu in `seq 0 $max_cpus` | |
44 | do | |
45 | echo "launching aperf load on $cpu" | |
46 | ./aperf $cpu & | |
47 | done | |
48 | ||
49 | echo "sleeping for 5 seconds" | |
50 | sleep 5 | |
51 | num_freqs=$(cat /proc/cpuinfo | grep MHz | sort -u | wc -l) | |
52 | if [ $num_freqs -le 2 ]; then | |
53 | cat /proc/cpuinfo | grep MHz | sort -u | tail -1 > /tmp/result.$1 | |
54 | else | |
55 | cat /proc/cpuinfo | grep MHz | sort -u > /tmp/result.$1 | |
56 | fi | |
57 | ./msr 0 >> /tmp/result.$1 | |
58 | ||
59 | max_perf_pct=$(cat /sys/devices/system/cpu/intel_pstate/max_perf_pct) | |
60 | echo "max_perf_pct $max_perf_pct" >> /tmp/result.$1 | |
61 | ||
62 | for job in `jobs -p` | |
63 | do | |
64 | echo "waiting for job id $job" | |
65 | wait $job | |
66 | done | |
67 | } | |
68 | ||
69 | # | |
70 | # MAIN (ALL UNITS IN MHZ) | |
71 | # | |
72 | ||
73 | # Get the marketing frequency | |
74 | _mkt_freq=$(cat /proc/cpuinfo | grep -m 1 "model name" | awk '{print $NF}') | |
75 | _mkt_freq=$(echo $_mkt_freq | tr -d [:alpha:][:punct:]) | |
76 | mkt_freq=${_mkt_freq}0 | |
77 | ||
78 | # Get the ranges from cpupower | |
79 | _min_freq=$(cpupower frequency-info -l | tail -1 | awk ' { print $1 } ') | |
80 | min_freq=$(($_min_freq / 1000)) | |
81 | _max_freq=$(cpupower frequency-info -l | tail -1 | awk ' { print $2 } ') | |
82 | max_freq=$(($_max_freq / 1000)) | |
83 | ||
84 | ||
85 | for freq in `seq $max_freq -100 $min_freq` | |
86 | do | |
87 | echo "Setting maximum frequency to $freq" | |
88 | cpupower frequency-set -g powersave --max=${freq}MHz >& /dev/null | |
89 | [ $EVALUATE_ONLY -eq 0 ] && run_test $freq | |
90 | done | |
91 | ||
92 | echo "==============================================================================" | |
93 | ||
94 | echo "The marketing frequency of the cpu is $mkt_freq MHz" | |
95 | echo "The maximum frequency of the cpu is $max_freq MHz" | |
96 | echo "The minimum frequency of the cpu is $min_freq MHz" | |
97 | ||
98 | cpupower frequency-set -g powersave --max=${max_freq}MHz >& /dev/null | |
99 | ||
100 | # make a pretty table | |
101 | echo "Target Actual Difference MSR(0x199) max_perf_pct" | |
102 | for freq in `seq $max_freq -100 $min_freq` | |
103 | do | |
104 | result_freq=$(cat /tmp/result.${freq} | grep "cpu MHz" | awk ' { print $4 } ' | awk -F "." ' { print $1 } ') | |
105 | msr=$(cat /tmp/result.${freq} | grep "msr" | awk ' { print $3 } ') | |
106 | max_perf_pct=$(cat /tmp/result.${freq} | grep "max_perf_pct" | awk ' { print $2 } ' ) | |
107 | if [ $result_freq -eq $freq ]; then | |
108 | echo " $freq $result_freq 0 $msr $(($max_perf_pct*3300))" | |
109 | else | |
110 | echo " $freq $result_freq $(($result_freq-$freq)) $msr $(($max_perf_pct*$max_freq))" | |
111 | fi | |
112 | done | |
113 | exit 0 |