Add test which verifies capacity calculation on arm architecture platforms.
Since there isn't yet a similar calculation done for arm64 platforms, this architecture isn't supported by this test (at least as of now).
Signed-off-by: Larry Bassel larry.bassel@linaro.org --- cputopology/cputopology_04.sh | 127 +++++++++++++++++++++++++++++++++++++++++ cputopology/cputopology_04.txt | 1 + 2 files changed, 128 insertions(+) create mode 100755 cputopology/cputopology_04.sh create mode 100644 cputopology/cputopology_04.txt
diff --git a/cputopology/cputopology_04.sh b/cputopology/cputopology_04.sh new file mode 100755 index 0000000..d66c1c8 --- /dev/null +++ b/cputopology/cputopology_04.sh @@ -0,0 +1,127 @@ +#!/bin/bash +# +# PM-QA validation test suite for the power management on Linux +# +# Copyright (C) 2015, Linaro Limited. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributors: +# Larry Bassel larry.bassel@linaro.org +# + +# URL : https://wiki.linaro.org/WorkingGroups/PowerManagement/Resources/TestSuite/Pm... + +source ../include/functions.sh + +calc_freq() +{ + byte1=$1 + byte2=$2 + byte3=$3 + byte4=$4 + freq=$((byte1*0x1000000+byte2*0x10000+byte3*0x100+byte4)) +} + +set_eff() { + type=$1 + + case $type in + arm,cortex-a15) eff=3891 ;; + arm,cortex-a7) eff=2048 ;; + * ) eff=1024 ;; + esac +} + +calc_mid_capacity() +{ + dt_cpus=$(ls /sys/firmware/devicetree/base/cpus | grep "cpu@[0-9].*") + min_capacity=$((0xffffffff)) + max_capacity=0 + sched_capacity_shift=10 + + for dt_cpu in $dt_cpus; do + if [ ! -f /sys/firmware/devicetree/base/cpus/$dt_cpu/clock-frequency ]; then + log_skip "no clock frequency file present" + return + fi + if [ ! -f /sys/firmware/devicetree/base/cpus/$dt_cpu/compatible ]; then + log_skip "no compatible file present" + return + fi + filename=/sys/firmware/devicetree/base/cpus/$dt_cpu/clock-frequency + bytes=$(od -t u1 -A n $filename) + calc_freq $bytes + cpu_type=$(cat /sys/firmware/devicetree/base/cpus/$dt_cpu/compatible) + set_eff $cpu_type + capacity=$((($freq>>20)*$eff)) + if [ $capacity -gt $max_capacity ]; then + max_capacity=$capacity + fi + if [ $capacity -lt $min_capacity ]; then + min_capacity=$capacity + fi + if [ $(((4 * $max_capacity))) -lt $(((3 * ($max_capacity + $min_capacity)))) ]; then + middle_capacity=$((($min_capacity + $max_capacity)>>($sched_capacity_shift+1))) + else + middle_capacity=$(((($max_capacity / 3)>>($sched_capacity_shift-1))+1)) + fi + done +} + +cpu_num=0 + +verify_cpu_capacity() +{ + for dt_cpu in $dt_cpus; do + if [ ! -f /sys/firmware/devicetree/base/cpus/$dt_cpu/clock-frequency ]; then + log_skip "no clock frequency file present" + return + fi + if [ ! -f /sys/firmware/devicetree/base/cpus/$dt_cpu/compatible ]; then + log_skip "no compatible file present" + return + fi + filename=/sys/firmware/devicetree/base/cpus/$dt_cpu/clock-frequency + bytes=$(od -t u1 -A n $filename) + calc_freq $bytes + cpu_type=$(cat /sys/firmware/devicetree/base/cpus/$dt_cpu/compatible) + set_eff $cpu_type + capacity=$((($freq>>20)*$eff/$middle_capacity)) + expected_capacity_string=$(dmesg | grep "CPU$cpu_num: update cpu_capacity") + expected_capacity=${expected_capacity_string##*cpu_capacity} + echo "cpu num: $cpu_num capacity $capacity expected capacity $expected_capacity" + check "expected capacity for cpu$cpu_num equal to computed capacity" "test $expected_capacity -eq $capacity" + + cpu_num=$((cpu_num+1)) + done +} + +verify_capacity() +{ + if ! [ -d /sys/firmware/devicetree/base/cpus ]; then + log_skip "no cpus directory present" + return + fi + + calc_mid_capacity + dt_cpus=$(ls -1 /sys/firmware/devicetree/base/cpus | egrep "cpu@.{1,2}$") + verify_cpu_capacity + dt_cpus=$(ls -1 /sys/firmware/devicetree/base/cpus | egrep "cpu@.{3,4}$") + verify_cpu_capacity +} + +verify_capacity || exit 1 +test_status_show diff --git a/cputopology/cputopology_04.txt b/cputopology/cputopology_04.txt new file mode 100644 index 0000000..36647db --- /dev/null +++ b/cputopology/cputopology_04.txt @@ -0,0 +1 @@ +test capacity calculation
On Fri, Apr 3, 2015 at 1:09 AM, Larry Bassel larry.bassel@linaro.org wrote:
Add test which verifies capacity calculation on arm architecture platforms.
Since there isn't yet a similar calculation done for arm64 platforms, this architecture isn't supported by this test (at least as of now).
Rephrase to "This will work on any platform that uses foo() arch hook to set cpu capacity. Currently only arm32 platforms use this." ?
Signed-off-by: Larry Bassel larry.bassel@linaro.org
cputopology/cputopology_04.sh | 127 +++++++++++++++++++++++++++++++++++++++++ cputopology/cputopology_04.txt | 1 + 2 files changed, 128 insertions(+) create mode 100755 cputopology/cputopology_04.sh create mode 100644 cputopology/cputopology_04.txt
diff --git a/cputopology/cputopology_04.sh b/cputopology/cputopology_04.sh new file mode 100755 index 0000000..d66c1c8 --- /dev/null +++ b/cputopology/cputopology_04.sh @@ -0,0 +1,127 @@ +#!/bin/bash +#
Nack! Please replace with /bin/sh and test to make sure it still works. Lisa, please pay attention to this one for future patches from anybody.
+# PM-QA validation test suite for the power management on Linux +# +# Copyright (C) 2015, Linaro Limited. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributors: +# Larry Bassel larry.bassel@linaro.org +#
+# URL : https://wiki.linaro.org/WorkingGroups/PowerManagement/Resources/TestSuite/Pm...
This link is not present. Can you add a section to the spec (and mark it as draft). Otherwise, once patches get accepted, we'll forget to update the spec.
Similarly, cputopology_03 section is also missing. So we're already forgetting to update the spec.
+source ../include/functions.sh
+calc_freq() +{
- byte1=$1
- byte2=$2
- byte3=$3
- byte4=$4
- freq=$((byte1*0x1000000+byte2*0x10000+byte3*0x100+byte4))
+}
+set_eff() {
what is eff? perhaps a comment?
- type=$1
- case $type in
arm,cortex-a15) eff=3891 ;;
arm,cortex-a7) eff=2048 ;;
* ) eff=1024 ;;
- esac
+}
+calc_mid_capacity()
What is the significance of middle capacity? A comment perhaps?
+{
- dt_cpus=$(ls /sys/firmware/devicetree/base/cpus | grep "cpu@[0-9].*")
- min_capacity=$((0xffffffff))
- max_capacity=0
- sched_capacity_shift=10
- for dt_cpu in $dt_cpus; do
if [ ! -f /sys/firmware/devicetree/base/cpus/$dt_cpu/clock-frequency ]; then
log_skip "no clock frequency file present"
return
fi
if [ ! -f /sys/firmware/devicetree/base/cpus/$dt_cpu/compatible ]; then
log_skip "no compatible file present"
return
fi
filename=/sys/firmware/devicetree/base/cpus/$dt_cpu/clock-frequency
bytes=$(od -t u1 -A n $filename)
calc_freq $bytes
cpu_type=$(cat /sys/firmware/devicetree/base/cpus/$dt_cpu/compatible)
set_eff $cpu_type
capacity=$((($freq>>20)*$eff))
if [ $capacity -gt $max_capacity ]; then
max_capacity=$capacity
fi
if [ $capacity -lt $min_capacity ]; then
min_capacity=$capacity
fi
if [ $(((4 * $max_capacity))) -lt $(((3 * ($max_capacity + $min_capacity)))) ]; then
middle_capacity=$((($min_capacity + $max_capacity)>>($sched_capacity_shift+1)))
else
middle_capacity=$(((($max_capacity / 3)>>($sched_capacity_shift-1))+1))
fi
- done
+}
+cpu_num=0
+verify_cpu_capacity() +{
- for dt_cpu in $dt_cpus; do
if [ ! -f /sys/firmware/devicetree/base/cpus/$dt_cpu/clock-frequency ]; then
log_skip "no clock frequency file present"
return
fi
if [ ! -f /sys/firmware/devicetree/base/cpus/$dt_cpu/compatible ]; then
log_skip "no compatible file present"
return
fi
filename=/sys/firmware/devicetree/base/cpus/$dt_cpu/clock-frequency
bytes=$(od -t u1 -A n $filename)
calc_freq $bytes
cpu_type=$(cat /sys/firmware/devicetree/base/cpus/$dt_cpu/compatible)
set_eff $cpu_type
capacity=$((($freq>>20)*$eff/$middle_capacity))
expected_capacity_string=$(dmesg | grep "CPU$cpu_num: update cpu_capacity")
expected_capacity=${expected_capacity_string##*cpu_capacity}
echo "cpu num: $cpu_num capacity $capacity expected capacity $expected_capacity"
check "expected capacity for cpu$cpu_num equal to computed capacity" "test $expected_capacity -eq $capacity"
cpu_num=$((cpu_num+1))
- done
+}
+verify_capacity() +{
- if ! [ -d /sys/firmware/devicetree/base/cpus ]; then
log_skip "no cpus directory present"
return
- fi
- calc_mid_capacity
- dt_cpus=$(ls -1 /sys/firmware/devicetree/base/cpus | egrep "cpu@.{1,2}$")
- verify_cpu_capacity
- dt_cpus=$(ls -1 /sys/firmware/devicetree/base/cpus | egrep "cpu@.{3,4}$")
- verify_cpu_capacity
+}
+verify_capacity || exit 1 +test_status_show diff --git a/cputopology/cputopology_04.txt b/cputopology/cputopology_04.txt new file mode 100644 index 0000000..36647db --- /dev/null +++ b/cputopology/cputopology_04.txt @@ -0,0 +1 @@ +test capacity calculation
Some more elaboration on how it does the test? i.e what it calculates and what it matches from existing data passed to the kernel?
-- 1.8.3.2
On 5 April 2015 at 22:43, Amit Kucheria amit.kucheria@linaro.org wrote:
On Fri, Apr 3, 2015 at 1:09 AM, Larry Bassel larry.bassel@linaro.org wrote:
Add test which verifies capacity calculation on arm architecture platforms.
Since there isn't yet a similar calculation done for arm64 platforms, this architecture isn't supported by this test (at least as of now).
Rephrase to "This will work on any platform that uses foo() arch hook to set cpu capacity. Currently only arm32 platforms use this." ?
Signed-off-by: Larry Bassel larry.bassel@linaro.org
cputopology/cputopology_04.sh | 127 +++++++++++++++++++++++++++++++++++++++++ cputopology/cputopology_04.txt | 1 + 2 files changed, 128 insertions(+) create mode 100755 cputopology/cputopology_04.sh create mode 100644 cputopology/cputopology_04.txt
diff --git a/cputopology/cputopology_04.sh b/cputopology/cputopology_04.sh new file mode 100755 index 0000000..d66c1c8 --- /dev/null +++ b/cputopology/cputopology_04.sh @@ -0,0 +1,127 @@ +#!/bin/bash +#
Nack! Please replace with /bin/sh and test to make sure it still works. Lisa, please pay attention to this one for future patches from anybody.
Apologies. It was something I overlooked in previous versions.
+# PM-QA validation test suite for the power management on Linux +# +# Copyright (C) 2015, Linaro Limited. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributors: +# Larry Bassel larry.bassel@linaro.org +#
+# URL : https://wiki.linaro.org/WorkingGroups/PowerManagement/Resources/TestSuite/Pm...
This link is not present. Can you add a section to the spec (and mark it as draft). Otherwise, once patches get accepted, we'll forget to update the spec.
Similarly, cputopology_03 section is also missing. So we're already forgetting to update the spec.
I can update the cputopology_03 spec since the PM-QA wiki page needs to be updated anyway. It's on my TODO list for today.
+source ../include/functions.sh
Another bashism to be removed. Should be .. ./include/functions.sh; don't include 'source' keyword.
+calc_freq() +{
- byte1=$1
- byte2=$2
- byte3=$3
- byte4=$4
- freq=$((byte1*0x1000000+byte2*0x10000+byte3*0x100+byte4))
+}
+set_eff() {
what is eff? perhaps a comment?
- type=$1
- case $type in
arm,cortex-a15) eff=3891 ;;
arm,cortex-a7) eff=2048 ;;
* ) eff=1024 ;;
- esac
+}
+calc_mid_capacity()
What is the significance of middle capacity? A comment perhaps?
+{
- dt_cpus=$(ls /sys/firmware/devicetree/base/cpus | grep "cpu@[0-9].*")
- min_capacity=$((0xffffffff))
- max_capacity=0
- sched_capacity_shift=10
- for dt_cpu in $dt_cpus; do
if [ ! -f /sys/firmware/devicetree/base/cpus/$dt_cpu/clock-frequency ]; then
log_skip "no clock frequency file present"
return
fi
if [ ! -f /sys/firmware/devicetree/base/cpus/$dt_cpu/compatible ]; then
log_skip "no compatible file present"
return
fi
filename=/sys/firmware/devicetree/base/cpus/$dt_cpu/clock-frequency
bytes=$(od -t u1 -A n $filename)
calc_freq $bytes
cpu_type=$(cat /sys/firmware/devicetree/base/cpus/$dt_cpu/compatible)
set_eff $cpu_type
capacity=$((($freq>>20)*$eff))
if [ $capacity -gt $max_capacity ]; then
max_capacity=$capacity
fi
if [ $capacity -lt $min_capacity ]; then
min_capacity=$capacity
fi
if [ $(((4 * $max_capacity))) -lt $(((3 * ($max_capacity + $min_capacity)))) ]; then
middle_capacity=$((($min_capacity + $max_capacity)>>($sched_capacity_shift+1)))
else
middle_capacity=$(((($max_capacity / 3)>>($sched_capacity_shift-1))+1))
fi
- done
+}
+cpu_num=0
+verify_cpu_capacity() +{
- for dt_cpu in $dt_cpus; do
if [ ! -f /sys/firmware/devicetree/base/cpus/$dt_cpu/clock-frequency ]; then
log_skip "no clock frequency file present"
return
fi
if [ ! -f /sys/firmware/devicetree/base/cpus/$dt_cpu/compatible ]; then
log_skip "no compatible file present"
return
fi
filename=/sys/firmware/devicetree/base/cpus/$dt_cpu/clock-frequency
bytes=$(od -t u1 -A n $filename)
calc_freq $bytes
cpu_type=$(cat /sys/firmware/devicetree/base/cpus/$dt_cpu/compatible)
set_eff $cpu_type
capacity=$((($freq>>20)*$eff/$middle_capacity))
expected_capacity_string=$(dmesg | grep "CPU$cpu_num: update cpu_capacity")
expected_capacity=${expected_capacity_string##*cpu_capacity}
echo "cpu num: $cpu_num capacity $capacity expected capacity $expected_capacity"
check "expected capacity for cpu$cpu_num equal to computed capacity" "test $expected_capacity -eq $capacity"
cpu_num=$((cpu_num+1))
- done
+}
+verify_capacity() +{
- if ! [ -d /sys/firmware/devicetree/base/cpus ]; then
log_skip "no cpus directory present"
return
- fi
- calc_mid_capacity
- dt_cpus=$(ls -1 /sys/firmware/devicetree/base/cpus | egrep "cpu@.{1,2}$")
- verify_cpu_capacity
- dt_cpus=$(ls -1 /sys/firmware/devicetree/base/cpus | egrep "cpu@.{3,4}$")
- verify_cpu_capacity
+}
+verify_capacity || exit 1 +test_status_show diff --git a/cputopology/cputopology_04.txt b/cputopology/cputopology_04.txt new file mode 100644 index 0000000..36647db --- /dev/null +++ b/cputopology/cputopology_04.txt @@ -0,0 +1 @@ +test capacity calculation
Some more elaboration on how it does the test? i.e what it calculates and what it matches from existing data passed to the kernel?
-- 1.8.3.2