60 lines
1.5 KiB
Bash
60 lines
1.5 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
|
||
|
|
# Usage of this utility
|
||
|
|
usage() {
|
||
|
|
echo "Usage: $(basename "$0") [on|off|forceoff]";
|
||
|
|
}
|
||
|
|
|
||
|
|
#Check CPU boot done pin drop in 30s
|
||
|
|
timeout=30
|
||
|
|
wait_graceful_off(){
|
||
|
|
echo "Wait for host shutdown in ${timeout}s"
|
||
|
|
while [ "${timeout}" -gt 0 ]; do
|
||
|
|
host_state=$(gpioget --numeric host0-ready)
|
||
|
|
timeout=$((timeout-1))
|
||
|
|
if [ "${host_state}" -eq 0 ]; then
|
||
|
|
echo "Host is graceful off"
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
sleep 1
|
||
|
|
done
|
||
|
|
echo "Host still on, but reach timeout"
|
||
|
|
}
|
||
|
|
|
||
|
|
set_gpio_power_off() {
|
||
|
|
echo "Set GPIO to power off chassis"
|
||
|
|
gpioset --hold-period 50ms -t0 power-chassis-control0=1
|
||
|
|
gpioset --hold-period 50ms -t0 power-chassis-control1=1
|
||
|
|
}
|
||
|
|
|
||
|
|
set_gpio_power_on() {
|
||
|
|
echo "Set GPIO to power on chassis"
|
||
|
|
val=$(gpioget --numeric host0-ready)
|
||
|
|
if [ "$val" == 1 ]; then
|
||
|
|
exit 0
|
||
|
|
fi
|
||
|
|
|
||
|
|
gpioset --hold-period 50ms -t0 power-chassis-control0=0
|
||
|
|
gpioset --hold-period 50ms -t0 power-chassis-control1=0
|
||
|
|
|
||
|
|
#Record IPMI power cycle SEL
|
||
|
|
busctl call xyz.openbmc_project.Logging.IPMI \
|
||
|
|
/xyz/openbmc_project/Logging/IPMI \
|
||
|
|
xyz.openbmc_project.Logging.IPMI IpmiSelAdd ssaybq \
|
||
|
|
"Power Cycle" "/xyz/openbmc_project/state/host0" \
|
||
|
|
3 0x01 0xff 0xff true 0x0020
|
||
|
|
}
|
||
|
|
|
||
|
|
if [ "$1" == "on" ]; then
|
||
|
|
set_gpio_power_on
|
||
|
|
elif [ "$1" == "off" ]; then
|
||
|
|
wait_graceful_off
|
||
|
|
set_gpio_power_off
|
||
|
|
elif [ "$1" == "forceoff" ]; then
|
||
|
|
set_gpio_power_off
|
||
|
|
else
|
||
|
|
echo "Invalid parameter"
|
||
|
|
usage
|
||
|
|
fi
|
||
|
|
exit 0
|