| #!/bin/bash |
| |
| # shim system-level operations to allow for unit testing |
| function MkDir() { mkdir "$@"; } |
| function Mv() { mv "$@"; } |
| function Sleep() { sleep "$@"; } |
| function SystemCtl() { systemctl "$@"; } |
| |
| # Store commanded rpm as thermal set-point. |
| # |
| # Arg: |
| # rpm - rpm set-point. |
| function CommandRpm() { |
| printf '%d\n' "$1" > /etc/thermal.d/set-point |
| } |
| |
| # Sweep or step rpm over range. |
| # |
| # Args: |
| # start_rpm: start RPM value |
| # stop_rpm: stop RPM value |
| # num_steps: number of control steps; i.e., not including start. |
| # dwell: dwell time at each point, in seconds |
| function RunRpmSteps() { |
| local -i start_rpm=$1 |
| local -i stop_rpm=$2 |
| local -i num_steps=$3 |
| local -i dwell=$4 |
| |
| # Rounding offset when dividing range into num_steps |
| local -i h=$((num_steps / 2)) |
| |
| # To avoid asymmetrical division behavior for negative numbers, |
| # rearrange negative slope to positive slope running backward; |
| # I.e., to run using loop variable p: {num_steps downto 0}. |
| local -i rpm0=$((start_rpm)) |
| local -i range=$((stop_rpm - start_rpm)) |
| local -i s=1 |
| if ((range < 0)); then |
| ((rpm0 = stop_rpm)) |
| ((range = -range)) |
| ((s = -1)) |
| fi |
| |
| echo "Running RPM from ${start_rpm} to ${stop_rpm} in ${num_steps} steps" |
| CommandRpm "${start_rpm}" |
| SystemCtl start phosphor-pid-control.service |
| Sleep 60 |
| |
| local i |
| for ((i = 0; i <= num_steps; ++i)); do |
| local -i p=$((s < 0 ? num_steps - i : i)) |
| local -i rpm=$((rpm0 + (range * p + h) / num_steps)) |
| echo "Setting RPM to ${rpm} and sleep ${dwell} seconds" |
| CommandRpm "${rpm}" |
| Sleep "${dwell}" |
| done |
| |
| SystemCtl stop phosphor-pid-control.service |
| Mv /tmp/swampd.log ~/"${start_rpm}_${stop_rpm}_${num_steps}_${dwell}.csv" |
| echo "Done!!" |
| } |
| |
| # Sweep and step fans from min to max and max to min. |
| # |
| # Args: |
| # min_rpm: min RPM for the platform |
| # max_rpm: max RPM for the platform |
| function main() { |
| local min_rpm=$1 |
| local max_rpm=$2 |
| |
| if ((min_rpm < 1 || max_rpm < min_rpm)); then |
| echo "Invalid arguments. Usage: fan_rpm_loop_test.sh <MIN_RPM> <MAX_RPM>" |
| return 1 |
| fi |
| |
| MkDir -p /etc/thermal.d/ |
| SystemCtl stop phosphor-pid-control.service |
| |
| RunRpmSteps "${min_rpm}" "${max_rpm}" 10 30 |
| RunRpmSteps "${max_rpm}" "${min_rpm}" 10 30 |
| RunRpmSteps "${min_rpm}" "${max_rpm}" 1 30 |
| RunRpmSteps "${max_rpm}" "${min_rpm}" 1 30 |
| } |
| |
| if [ "$0" = "${BASH_SOURCE[0]}" ]; then |
| # not sourced, execute main function |
| main "$@" |
| fi |