blob: 3ff3e1fc6a03199b2360842866d3f0cd988d3fae [file] [log] [blame]
#!/bin/sh
# When system only use single PSU ( ex : PSU1 ) to power ON normal 12V,
# HSC2 will be trigged Fault event (FET health).
# At this time, to plug-in PSU2 in system, PSU2 won't deliver power to
# +12V_MB because HSC2 is protected by Fault event.
# Due to HSC2 protected, the PSU redundancy mechanism can't be created.
# Once PSU1 is plugged out at this moment, system will crash ( reset )
# because +12V_MB dropped.
# BMC SW work-around solution:
# - When BMC detect event PSU is plugged in system, BMC will reset HSC
# by disbale HOT SWAP and then enable HOT SWAP through pmbus command to clear
# Fault event.
# Note:
# In case hot swap occurs during BMC reset, BMC still not in operation state,
# BMC can't detect PSU plug/unplug, then the work-around won't be executed
# Author: Chanh Nguyen <chnguyen@amperecomputing.com>
HSC1_PMBUS_NUM=10
HSC2_PMBUS_NUM=10
HSC1_SLAVE_ADDR=0x10
HSC2_SLAVE_ADDR=0x11
OPERATION=0x01
STATUS_MFR_SPECIFIC=0x80
# $1 will be the name of the psu
PSU=$1
if [ "$PSU" = 0 ]; then
HSC_PMBUS_NUM=$HSC1_PMBUS_NUM
HSC_SLAVE_ADDR=$HSC1_SLAVE_ADDR
elif [ "$PSU" = 1 ]; then
HSC_PMBUS_NUM=$HSC2_PMBUS_NUM
HSC_SLAVE_ADDR=$HSC2_SLAVE_ADDR
else
echo "Please choose PSU1 (0) or PSU2 (1)"
echo "Ex: ampere_psu_reset_hotswap.sh 0"
exit 0
fi
# Check HOST state
chassisstate=$(obmcutil chassisstate | awk -F. '{print $NF}')
if [ "$chassisstate" = 'Off' ]; then
echo "HOST is being OFF, so can't access the i2c $HSC_PMBUS_NUM. Please Turn ON HOST !"
exit 1
fi
# Check FET health problems
if ! data=$(i2cget -f -y $HSC_PMBUS_NUM $HSC_SLAVE_ADDR $STATUS_MFR_SPECIFIC); then
echo "ERROR: Can't access the i2c. Please check /dev/i2c-$HSC_PMBUS_NUM"
exit 1
fi
psu_sts=$(((data & 0x80) != 0))
if [ $psu_sts = 1 ]; then
echo "PSU $PSU: FET health problems have been detected"
echo "Reset Hot swap output on PSU $PSU"
# Disable Hot swap output
write_data=0x00
i2cset -f -y $HSC_PMBUS_NUM $HSC_SLAVE_ADDR $OPERATION $write_data b
# Enable Hot swap output
write_data=0x80;
i2cset -f -y $HSC_PMBUS_NUM $HSC_SLAVE_ADDR $OPERATION $write_data b
else
echo "PSU $PSU: FET health problems have not been detected"
fi