#!/bin/bash source /usr/sbin/kudo-lib.sh # Usage of this utility function usage() { echo "usage: power-util mb [on|off|graceful_shutdown|force_reset|shutdown_ack|hotswap|power_button]"; } hotswap() { kudo.sh rst hotswap } force_off() { echo "Powering down Server" set_gpio_ctrl 203 out 1 sleep 6 set_gpio_ctrl 203 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 203 out 1 sleep 1 set_gpio_ctrl 203 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 194) S5_N=$(get_gpio_ctrl 204) 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 echo "$(timestamp)" > "/run/openbmc/host@0-shutdown-req-time" set_gpio_ctrl 70 out 0 sleep 3 set_gpio_ctrl 70 out 1 fi } force_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 65 out 0 sleep 1 set_gpio_ctrl 65 out 1 else echo "Host is off, cannot reset." fi } 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" echo "$(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 == "force_reset" ]; then force_reset elif [ $2 == "shutdown_ack" ]; then shutdown_ack elif [ $2 == "power_button" ]; then power_button else echo "Invalid parameter2=$2" usage; fi exit 0;