blob: 9dcc6d822e567f94e45014ca1a185301e78ee32c [file] [log] [blame]
#!/bin/bash
fanSensorService="xyz.openbmc_project.FanSensor"
sensorPath="/xyz/openbmc_project/sensors/fan_tach/"
pwmTargetPath="/xyz/openbmc_project/control/fanpwm/"
sensorValueInterfaceName="xyz.openbmc_project.Sensor.Value"
sensorValuePropertyName="Value"
pwmTargetInterfaceName="xyz.openbmc_project.Control.FanPwm"
pwmTargetPropertyName="Target"
function stop_phosphor_fan_services() {
systemctl stop phosphor-fan-control@0.service
systemctl stop phosphor-fan-monitor@0.service
systemctl stop phosphor-fan-presence-tach@0.service
}
function start_phosphor_fan_services() {
systemctl start phosphor-fan-control@0.service
systemctl start phosphor-fan-monitor@0.service
systemctl start phosphor-fan-presence-tach@0.service
}
function read_speed() {
fan_val=$(busctl get-property "$fanSensorService" "${sensorPath}$1" "$sensorValueInterfaceName" "$sensorValuePropertyName")
busctl_error=$?
if (( busctl_error != 0 )); then
echo "Error: get-property $sensorValuePropertyName failed! "
exit 1
fi
pwm_target=$(busctl get-property "$fanSensorService" "${pwmTargetPath}$2" "$pwmTargetInterfaceName" "$pwmTargetPropertyName")
busctl_error=$?
if (( busctl_error != 0 )); then
echo "Error: get-property $pwmTargetPropertyName failed! "
exit 1
fi
fan_val=$(echo "$fan_val" | cut -d " " -f 2)
pwm_target=$(echo "$pwm_target" | cut -d " " -f 2)
# Convert fan PWM to Duty cycle, adding 127 for rounding.
pwm_duty_cyle=$(((("$pwm_target" * 100) + 127) / 255))
echo "$1, PWM: $pwm_target, Duty cycle: $pwm_duty_cyle%, Speed(RPM): $fan_val"
}
function set_pwm() {
# Convert Fan Duty cycle to PWM, adding 50 for rounding.
fan_pwm=$(((($2 * 255) + 50) / 100))
busctl set-property "$fanSensorService" "${pwmTargetPath}$1" "$pwmTargetInterfaceName" "$pwmTargetPropertyName" t "$fan_pwm"
busctl_error=$?
if (( busctl_error != 0 )); then
echo "Error: set-property $pwmTargetPropertyName failed! "
exit 255
fi
}
function getstatus() {
fan_ctl_stt=$(systemctl is-active phosphor-fan-control@0.service | grep inactive)
fan_monitor_stt=$(systemctl is-active phosphor-fan-monitor@0.service | grep inactive)
if [[ -z "$fan_ctl_stt" && -z "$fan_monitor_stt" ]]; then
echo "Thermal Control operational status: Enabled"
exit 0
else
echo "Thermal Control operational status: Disabled"
exit 1
fi
}
function setstatus() {
if [ "$1" == 0 ]; then
# Enable fan services
start_phosphor_fan_services
else
# Disable fan services
stop_phosphor_fan_services
fi
}
function setspeed() {
# Get fan_pwm value of the fan
case "$1" in
0) fan_pwm=PWM7
;;
1) fan_pwm=PWM5
;;
2) fan_pwm=PWM4
;;
3) fan_pwm=PWM3
;;
4) fan_pwm=PWM1
;;
5) fan_pwm=PWM0
;;
*) echo "fan $1 doesn't exit"
exit 1
;;
esac
set_pwm "$fan_pwm" "$2"
exit 0
}
function getspeed() {
# Mapping fan number to fan_input and fan_pwm index
case "$1" in
0) fan_input_f=FAN0_F
fan_input_r=FAN0_R
fan_pwm=PWM7
;;
1) fan_input_f=FAN1_F
fan_input_r=FAN1_R
fan_pwm=PWM5
;;
2) fan_input_f=FAN2_F
fan_input_r=FAN2_R
fan_pwm=PWM4
;;
3) fan_input_f=FAN3_F
fan_input_r=FAN3_R
fan_pwm=PWM3
;;
4) fan_input_f=FAN4_F
fan_input_r=FAN4_R
fan_pwm=PWM1
;;
5) fan_input_f=FAN5_F
fan_input_r=FAN5_F
fan_pwm=PWM0
;;
*) echo "fan $1 doesn't exit"
exit 1
;;
esac
# Get fan speed, each fan number has two values is front and rear
read_speed "$fan_input_f" "$fan_pwm"
read_speed "$fan_input_r" "$fan_pwm"
exit 0
}
# Usage of this utility
function usage() {
echo "Usage:"
echo " ampere_fanctrl.sh [getstatus] [setstatus <0|1>] [setspeed <fan> <duty>] [getspeed <fan>]"
echo " fan: 0-5"
echo " duty: 1-100"
}
if [ "$1" == "getstatus" ]; then
getstatus
elif [ "$1" == "setstatus" ]; then
setstatus "$2"
elif [ "$1" == "setspeed" ]; then
stop_phosphor_fan_services
setspeed "$2" "$3"
elif [ "$1" == "getspeed" ]; then
getspeed "$2"
else
usage
fi