diff options
Diffstat (limited to 'meta-quanta/meta-gbs/recipes-gbs/gbs-detect-fan-fail')
3 files changed, 106 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 diff --git a/meta-quanta/meta-gbs/recipes-gbs/gbs-detect-fan-fail/gbs-detect-fan-fail.bb b/meta-quanta/meta-gbs/recipes-gbs/gbs-detect-fan-fail/gbs-detect-fan-fail.bb new file mode 100644 index 000000000..5befec8d6 --- /dev/null +++ b/meta-quanta/meta-gbs/recipes-gbs/gbs-detect-fan-fail/gbs-detect-fan-fail.bb @@ -0,0 +1,25 @@ +SUMMARY = "OpenBMC Quanta Detect Fan Fail Service" +DESCRIPTION = "OpenBMC Quanta Detect Fan Fail Daemon." +PR = "r1" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +inherit systemd + +DEPENDS += "systemd" +RDEPENDS_${PN} += "bash" + +SRC_URI = " file://gbs-detect-fan-fail.sh \ + file://gbs-detect-fan-fail.service \ + " + +do_install() { + install -d ${D}${bindir} + install -m 0755 ${WORKDIR}/gbs-detect-fan-fail.sh ${D}${bindir}/ + + install -d ${D}${systemd_system_unitdir} + install -m 0644 ${WORKDIR}/gbs-detect-fan-fail.service ${D}${systemd_system_unitdir} +} + +SYSTEMD_PACKAGES = "${PN}" +SYSTEMD_SERVICE_${PN} = "gbs-detect-fan-fail.service" |