169 lines
4.2 KiB
Bash
169 lines
4.2 KiB
Bash
|
|
#!/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
|