sonic-buildimage/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-fanthrml-monitor

417 lines
10 KiB
Plaintext
Raw Normal View History

#!/bin/bash
debug_flag=0
fan_val=0
temp_val=0
ctrl_mode_val=0
fan_pwm_val=0
fan_rpm_val=0
init_threshold=0
byte_hex_test()
{
if ! [[ $1 =~ ^[0-9A-Fa-f]{2}$ ]] ; then
return 0
else
return 1
fi
}
bmc_sensor_read()
{
temp_val=$(ipmitool raw 0x30 0x88 2>>/dev/null)
if [ $? -ne 0 ];then
return 1
fi
fan_val=$(ipmitool raw 0x30 0x22 2>>/dev/null)
if [ $? -ne 0 ];then
return 1
fi
return 0
}
#$1=get(0)/set(1), $2=ctrl_mode(1:manual, 0:auto)
#get rtn: ctrl_mode_val, fan_pwm_val
bmc_fan_speed_ctrl()
{
if [ -e /sys/bus/i2c/devices/0-0044/pwm ];then
if [ $1 -eq 1 ];then
#Set Fan Speed Control
if [ $2 -eq 0 ];then
ipmitool raw 0x30 0x21 0x0 0x0 1>/dev/null 2>/dev/null
else
fan_pwm_input=$(cat /sys/bus/i2c/devices/0-0044/pwm | awk '{printf $1}')
fan_pwm_input=$( printf "%d" 0x$fan_pwm_input )
ipmitool raw 0x30 0x21 0x1 $fan_pwm_input 1>/dev/null 2>/dev/null
fi
else
#Get Fan Speed Control
ctrl_mode_val=$(echo $fan_val | awk '{printf $1}')
fan_pwm_val=$(echo $fan_val | awk '{printf $2}')
byte_hex_test $ctrl_mode_val
if [ $? -eq 0 ]; then
return
fi
byte_hex_test $fan_pwm_val
if [ $? -eq 0 ]; then
return
fi
ctrl_mode_val=$( printf "%d" 0x$ctrl_mode_val )
fan_pwm_val=$( printf "%d" 0x$fan_pwm_val )
echo $fan_pwm_val > /sys/bus/i2c/devices/0-0044/pwm
fi
fi
}
bmc_fan_presence()
{
if [ -e /sys/bus/i2c/devices/0-0044/fan1_present ];then
for i in $(seq 0 6);
do
p=$((31+i))
fan_pre_val=$(echo $fan_val | awk '{print $'"$p"'}')
byte_hex_test $fan_pre_val
if [ $? -eq 0 ]; then
return
fi
fan_pre_val=$( printf "%d" 0x$fan_pre_val )
echo $fan_pre_val > /sys/bus/i2c/devices/0-0044/fan$((i+1))_present
done
fi
}
bmc_fan_speed_rpm()
{
if [ -e /sys/bus/i2c/devices/0-0044/fan1_input ];then
for i in $(seq 0 6);
do
p1=$((3+i*2))
p2=$((4+i*2))
p3=$((17+i*2))
p4=$((18+i*2))
#front
hi_byte=$(echo $fan_val | awk '{print $'"$p1"'}')
lo_byte=$(echo $fan_val | awk '{print $'"$p2"'}')
byte_hex_test $hi_byte
if [ $? -eq 0 ]; then
return
fi
byte_hex_test $lo_byte
if [ $? -eq 0 ]; then
return
fi
hi_byte=$( printf "%d" 0x$hi_byte )
lo_byte=$( printf "%d" 0x$lo_byte )
fan_rpm_val=$((hi_byte<<8))
fan_rpm_val=`expr $fan_rpm_val + $lo_byte`
echo $fan_rpm_val > /sys/bus/i2c/devices/0-0044/fan$((i+1))_input
#rear
hi_byte=$(echo $fan_val | awk '{print $'"$p3"'}')
lo_byte=$(echo $fan_val | awk '{print $'"$p4"'}')
byte_hex_test $hi_byte
if [ $? -eq 0 ]; then
return
fi
byte_hex_test $lo_byte
if [ $? -eq 0 ]; then
return
fi
hi_byte=$( printf "%d" 0x$hi_byte )
lo_byte=$( printf "%d" 0x$lo_byte )
fan_rpm_val=$((hi_byte<<8))
fan_rpm_val=`expr $fan_rpm_val + $lo_byte`
echo $fan_rpm_val > /sys/bus/i2c/devices/0-0044/fan$((i+8))_input
done
fi
}
do_fan_update()
{
#fan presence
bmc_fan_presence
#fan speed rpm
bmc_fan_speed_rpm
if [ $debug_flag -eq 0 ];then
#Get Fan RPM
bmc_fan_speed_ctrl 0
else
bmc_fan_speed_ctrl 1 1
fi
}
do_thermal_update()
{
if [ -e /sys/bus/i2c/devices/0-004f/temp1_input ];then
local check_val=0
#command return check
for i in $(seq 8 7 57); do
thermal_val=$(echo $temp_val | awk '{print $'"$i"'}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
check_val=$((check_val + thermal_val))
if [ $check_val -gt 0 ]; then
break
fi
done
if [ $check_val -eq 0 ]; then
return
fi
#mcp3425
thermal_val=$(echo $temp_val | awk '{printf $8}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-0068/temp1_input
thermal_val=$(echo $temp_val | awk '{printf $15}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-004a/temp1_input
thermal_val=$(echo $temp_val | awk '{printf $22}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-0049/temp1_input
thermal_val=$(echo $temp_val | awk '{printf $29}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-004b/temp1_input
thermal_val=$(echo $temp_val | awk '{printf $36}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-004c/temp1_input
thermal_val=$(echo $temp_val | awk '{printf $43}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-004f/temp1_input
thermal_val=$(echo $temp_val | awk '{printf $50}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-0048/temp1_input
thermal_val=$(echo $temp_val | awk '{printf $57}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
# fan tmp75 should be 0x49, but conflict
echo $thermal_val > /sys/bus/i2c/devices/0-004d/temp1_input
fi
}
do_thermal_threshold_init()
{
if [ $init_threshold -eq 0 ]; then
if [ -e /sys/bus/i2c/devices/0-004f/temp1_max ];then
#mcp3425
thermal_val=$(echo $temp_val | awk '{printf $13}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-0068/temp1_max
thermal_val=$(echo $temp_val | awk '{printf $14}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-0068/temp1_crit
thermal_val=$(echo $temp_val | awk '{printf $20}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-004a/temp1_max
thermal_val=$(echo $temp_val | awk '{printf $21}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-004a/temp1_crit
thermal_val=$(echo $temp_val | awk '{printf $27}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-0049/temp1_max
thermal_val=$(echo $temp_val | awk '{printf $28}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-0049/temp1_crit
thermal_val=$(echo $temp_val | awk '{printf $34}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-004b/temp1_max
thermal_val=$(echo $temp_val | awk '{printf $35}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-004b/temp1_crit
thermal_val=$(echo $temp_val | awk '{printf $41}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-004c/temp1_max
thermal_val=$(echo $temp_val | awk '{printf $42}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-004c/temp1_crit
thermal_val=$(echo $temp_val | awk '{printf $48}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-004f/temp1_max
thermal_val=$(echo $temp_val | awk '{printf $49}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-004f/temp1_crit
thermal_val=$(echo $temp_val | awk '{printf $55}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-0048/temp1_max
thermal_val=$(echo $temp_val | awk '{printf $56}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-0048/temp1_crit
thermal_val=$(echo $temp_val | awk '{printf $62}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-004d/temp1_max
thermal_val=$(echo $temp_val | awk '{printf $63}')
byte_hex_test $thermal_val
if [ $? -eq 0 ]; then
return
fi
thermal_val=$( printf "%d" 0x$thermal_val )
thermal_val=`expr $thermal_val \* 1000`
echo $thermal_val > /sys/bus/i2c/devices/0-004d/temp1_crit
init_threshold=1
fi
fi
}
FAN_Thermal_monitor()
{
if [ $debug_flag -eq 1 ];then
fan_pwm_input=100
echo $fan_pwm_input > /sys/bus/i2c/devices/0-0044/pwm
fi
while true
do
#get bmc sensor value
bmc_sensor_read
if [ $? -eq 0 ];then
do_fan_update
do_thermal_update
do_thermal_threshold_init
fi
sleep 1
done
}
FAN_Thermal_monitor