| #!/bin/bash |
| |
| # Provide source directive to shellcheck. |
| # shellcheck source=meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-fw/kudo-lib.sh |
| source /usr/libexec/kudo-fw/kudo-lib.sh |
| |
| # Usage of this utility |
| function usage() { |
| echo "usage: power-util mb [on|off|graceful_shutdown|host_reset|host_cycle|shutdown_ack|hotswap|power_button]"; |
| } |
| |
| hotswap() { |
| kudo.sh rst hotswap |
| } |
| |
| force_off() { |
| echo "Powering down Server" |
| |
| set_gpio_ctrl POWER_OUT 1 |
| sleep 6 |
| set_gpio_ctrl POWER_OUT 0 |
| } |
| |
| power_off() { |
| busctl set-property xyz.openbmc_project.Watchdog /xyz/openbmc_project/watchdog/host0 xyz.openbmc_project.State.Watchdog ExpireAction s xyz.openbmc_project.State.Watchdog.Action.None |
| busctl set-property xyz.openbmc_project.State.Chassis /xyz/openbmc_project/state/chassis0 xyz.openbmc_project.State.Chassis RequestedPowerTransition s xyz.openbmc_project.State.Chassis.Transition.Off |
| } |
| |
| power_on() { |
| echo "Powering on Server" |
| |
| set_gpio_ctrl POWER_OUT 1 |
| sleep 1 |
| set_gpio_ctrl POWER_OUT 0 |
| busctl set-property xyz.openbmc_project.State.Chassis /xyz/openbmc_project/state/chassis0 xyz.openbmc_project.State.Chassis RequestedPowerTransition s xyz.openbmc_project.State.Chassis.Transition.On |
| } |
| |
| power_status() { |
| st=$(busctl get-property xyz.openbmc_project.State.Chassis /xyz/openbmc_project/state/chassis0 xyz.openbmc_project.State.Chassis CurrentPowerState | cut -d "." -f6) |
| if [ "${st}" == "On\"" ]; then |
| echo "on" |
| else |
| echo "off" |
| fi |
| } |
| |
| host_status() { |
| BOOT_OK=$(get_gpio_ctrl S0_FW_BOOT_OK) |
| S5_N=$(get_gpio_ctrl S0_SLPS5_N) |
| if [ "$S5_N" == 1 ] || [ "$BOOT_OK" == 1 ]; then |
| echo "on" |
| else |
| echo "off" |
| fi |
| } |
| |
| timestamp() { |
| date +"%s" # current time |
| } |
| |
| graceful_shutdown() { |
| if [ -f "/run/openbmc/host@0-request" ]; then |
| echo "Shutdown host immediately" |
| power_off |
| else |
| echo "Triggering graceful shutdown" |
| mkdir /run/openbmc |
| timestamp > "/run/openbmc/host@0-shutdown-req-time" |
| set_gpio_ctrl S0_SHD_REQ 0 |
| sleep 3 |
| set_gpio_ctrl S0_SHD_REQ 1 |
| fi |
| } |
| |
| host_reset() { |
| if [ "$(host_status)" == "on" ]; then |
| echo "Triggering sysreset pin" |
| busctl set-property xyz.openbmc_project.Watchdog /xyz/openbmc_project/watchdog/host0 xyz.openbmc_project.State.Watchdog ExpireAction s xyz.openbmc_project.State.Watchdog.Action.None |
| set_gpio_ctrl S0_SYSRESET 0 |
| sleep 1 |
| set_gpio_ctrl S0_SYSRESET 1 |
| else |
| echo "Host is off, cannot reset." |
| fi |
| } |
| |
| host_cycle() { |
| echo "DC cycling host" |
| force_off |
| sleep 2 |
| power_on |
| } |
| |
| shutdown_ack() { |
| echo "Receive shutdown ACK triggered" |
| power_off |
| |
| if [ -f "/run/openbmc/host@0-shutdown-req-time" ]; then |
| rm -rf "/run/openbmc/host@0-shutdown-req-time" |
| fi |
| } |
| |
| power_button() { |
| echo "Power button trigger event." |
| current_time="$(timestamp)" |
| if [ -f "/run/openbmc/power-button" ]; then |
| echo "Power button released" |
| press_time="$(cat /run/openbmc/power-button)" |
| if [[ "$current_time" -le "(($press_time + 1))" ]]; then |
| power_on |
| elif [[ "$current_time" -ge "(($press_time + 5))" ]]; then |
| power_off |
| else |
| echo "Button press did not match interval." |
| fi |
| rm "/run/openbmc/power-button" |
| else |
| echo "Power button pressed" |
| timestamp > "/run/openbmc/power-button" |
| fi |
| } |
| |
| if [ $# -lt 2 ]; then |
| echo "Total number of parameter=$#" |
| echo "Insufficient parameter" |
| usage; |
| exit 0; |
| fi |
| |
| if [ "$1" != "mb" ]; then |
| echo "Invalid parameter1=$1" |
| usage; |
| exit 0; |
| fi |
| |
| if [ "$2" = "on" ]; then |
| sleep 3 |
| if [ "$(power_status)" == "off" ]; then |
| power_on |
| fi |
| elif [ "$2" = "off" ]; then |
| if [ "$(power_status)" == "on" ]; then |
| power_off |
| sleep 6 |
| if [ "$(host_status)" == "on" ]; then |
| force_off |
| fi |
| fi |
| elif [ "$2" == "hotswap" ]; then |
| hotswap |
| elif [ "$2" == "graceful_shutdown" ]; then |
| graceful_shutdown |
| elif [ "$2" == "host_reset" ]; then |
| host_reset |
| elif [ "$2" == "host_cycle" ]; then |
| host_cycle |
| elif [ "$2" == "shutdown_ack" ]; then |
| shutdown_ack |
| elif [ "$2" == "power_button" ]; then |
| power_button |
| else |
| echo "Invalid parameter2=$2" |
| usage; |
| fi |
| |
| exit 0; |