diff options
Diffstat (limited to 'meta-quanta/meta-gbs/recipes-gbs/gbs-detect-fan-fail/files')
-rw-r--r-- | meta-quanta/meta-gbs/recipes-gbs/gbs-detect-fan-fail/files/gbs-detect-fan-fail.service | 11 | ||||
-rw-r--r-- | meta-quanta/meta-gbs/recipes-gbs/gbs-detect-fan-fail/files/gbs-detect-fan-fail.sh | 70 |
2 files changed, 81 insertions, 0 deletions
diff --git a/meta-quanta/meta-gbs/recipes-gbs/gbs-detect-fan-fail/files/gbs-detect-fan-fail.service b/meta-quanta/meta-gbs/recipes-gbs/gbs-detect-fan-fail/files/gbs-detect-fan-fail.service new file mode 100644 index 000000000..ecdc95399 --- /dev/null +++ b/meta-quanta/meta-gbs/recipes-gbs/gbs-detect-fan-fail/files/gbs-detect-fan-fail.service @@ -0,0 +1,11 @@ +[Unit] +Description=Detect Fan Fail Manager +After=phosphor-pid-control.service + +[Service] +ExecStart=/usr/bin/gbs-detect-fan-fail.sh +Restart=always +StandardOutput=syslog + +[Install] +WantedBy=multi-user.target diff --git a/meta-quanta/meta-gbs/recipes-gbs/gbs-detect-fan-fail/files/gbs-detect-fan-fail.sh b/meta-quanta/meta-gbs/recipes-gbs/gbs-detect-fan-fail/files/gbs-detect-fan-fail.sh new file mode 100644 index 000000000..56ae7bbc5 --- /dev/null +++ b/meta-quanta/meta-gbs/recipes-gbs/gbs-detect-fan-fail/files/gbs-detect-fan-fail.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +## + # This script is to handle fan fail condition which is described below. + # Fan fail means one fan RPM is under its CriticalLow. If BMC encounters + # such situation, then sets other fans to full speed. + # + +# get fan state +function get_fan_state() { + get_property_path='xyz.openbmc_project.Sensor.Threshold.Critical CriticalAlarmLow' + fan_state="$(busctl get-property $1 $2 $get_property_path | awk '{print $2}')" + echo "$fan_state" +} + +# check fan fail +function is_fan_fail() { + fan_state=("$@") + + for i in "${fan_state[@]}" + do + if [ ! -z "$i" ] + then + if [ $i == "true" ] + then + echo 1 + return + fi + fi + done + echo 0 +} + +fan_tach_path=( '/xyz/openbmc_project/sensors/fan_tach/fan0' + '/xyz/openbmc_project/sensors/fan_tach/fan1' + '/xyz/openbmc_project/sensors/fan_tach/fb_fan0' + '/xyz/openbmc_project/sensors/fan_tach/fb_fan1' + '/xyz/openbmc_project/sensors/fan_tach/fb_fan2' + ) + +check_fail_flag=0 +is_fan_fail_flag=0 +current_fan_state=() + +while true +do + for i in ${!fan_tach_path[@]} + do + mapper wait ${fan_tach_path[$i]} + hwmon_path="$(mapper get-service ${fan_tach_path[0]})" + current_fan_state[$i]=$(get_fan_state $hwmon_path ${fan_tach_path[$i]}) + done + + is_fan_fail_flag=$(is_fan_fail "${current_fan_state[@]}") + + # if fan fails then set all fans to full speed + if [ $is_fan_fail_flag -eq 1 ] && [ $check_fail_flag -eq 0 ] + then + check_fail_flag=1 + systemctl stop phosphor-pid-control.service + + # fans recover to normal state + elif [ $is_fan_fail_flag -eq 0 ] && [ $check_fail_flag -eq 1 ] + then + check_fail_flag=0 + systemctl restart phosphor-pid-control.service + fi + + sleep 2 +done |