Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 1 | #!/bin/bash |
Charles Boyer | 1c51ca5 | 2021-08-24 11:25:03 -0500 | [diff] [blame] | 2 | |
| 3 | source /usr/sbin/kudo-lib.sh |
| 4 | |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 5 | # Usage of this utility |
| 6 | function usage() { |
Charles Boyer | a3dc550 | 2021-10-29 16:39:16 -0500 | [diff] [blame] | 7 | echo "usage: power-util mb [on|off|graceful_shutdown|force_reset|shutdown_ack|hotswap|power_button]"; |
Charles Boyer | 17b216a | 2021-08-27 16:09:03 -0500 | [diff] [blame] | 8 | } |
| 9 | |
| 10 | hotswap() { |
| 11 | kudo.sh rst hotswap |
Charles Boyer | 1c51ca5 | 2021-08-24 11:25:03 -0500 | [diff] [blame] | 12 | } |
| 13 | |
| 14 | force_off() { |
| 15 | echo "Powering down Server" |
| 16 | |
| 17 | set_gpio_ctrl 203 out 1 |
| 18 | sleep 6 |
| 19 | set_gpio_ctrl 203 out 0 |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 20 | } |
| 21 | |
| 22 | power_off() { |
Charles Boyer | 1c51ca5 | 2021-08-24 11:25:03 -0500 | [diff] [blame] | 23 | 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 |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 24 | 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 |
| 25 | } |
| 26 | |
| 27 | power_on() { |
Charles Boyer | 1c51ca5 | 2021-08-24 11:25:03 -0500 | [diff] [blame] | 28 | echo "Powering on Server" |
| 29 | |
| 30 | set_gpio_ctrl 203 out 1 |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 31 | sleep 1 |
Charles Boyer | 1c51ca5 | 2021-08-24 11:25:03 -0500 | [diff] [blame] | 32 | set_gpio_ctrl 203 out 0 |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 33 | 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 |
| 34 | } |
| 35 | |
| 36 | power_status() { |
Charles Boyer | 1c51ca5 | 2021-08-24 11:25:03 -0500 | [diff] [blame] | 37 | st=$(busctl get-property xyz.openbmc_project.State.Chassis /xyz/openbmc_project/state/chassis0 xyz.openbmc_project.State.Chassis CurrentPowerState | cut -d "." -f6) |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 38 | if [ "$st" == "On\"" ]; then |
| 39 | echo "on" |
| 40 | else |
| 41 | echo "off" |
| 42 | fi |
| 43 | } |
| 44 | |
Charles Boyer | 1c51ca5 | 2021-08-24 11:25:03 -0500 | [diff] [blame] | 45 | host_status() { |
| 46 | BOOT_OK=$(get_gpio_ctrl 194) |
| 47 | S5_N=$(get_gpio_ctrl 204) |
| 48 | if [ $S5_N == 1 ] || [ $BOOT_OK == 1 ]; then |
| 49 | echo "on" |
| 50 | else |
| 51 | echo "off" |
| 52 | fi |
| 53 | } |
| 54 | |
| 55 | timestamp() { |
| 56 | date +"%s" # current time |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 57 | } |
| 58 | |
| 59 | graceful_shutdown() { |
| 60 | if [ -f "/run/openbmc/host@0-request" ]; then |
Charles Boyer | 1c51ca5 | 2021-08-24 11:25:03 -0500 | [diff] [blame] | 61 | echo "Shutdown host immediately" |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 62 | power_off |
| 63 | else |
| 64 | echo "Triggering graceful shutdown" |
Charles Boyer | 1c51ca5 | 2021-08-24 11:25:03 -0500 | [diff] [blame] | 65 | mkdir /run/openbmc |
| 66 | echo "$(timestamp)" > "/run/openbmc/host@0-shutdown-req-time" |
| 67 | set_gpio_ctrl 70 out 0 |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 68 | sleep 3 |
Charles Boyer | 1c51ca5 | 2021-08-24 11:25:03 -0500 | [diff] [blame] | 69 | set_gpio_ctrl 70 out 1 |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 70 | fi |
| 71 | } |
| 72 | |
| 73 | force_reset() { |
Charles Boyer | 1c51ca5 | 2021-08-24 11:25:03 -0500 | [diff] [blame] | 74 | if [ $(host_status) == "on" ]; then |
| 75 | echo "Triggering sysreset pin" |
| 76 | 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 |
| 77 | set_gpio_ctrl 65 out 0 |
| 78 | sleep 1 |
| 79 | set_gpio_ctrl 65 out 1 |
| 80 | else |
| 81 | echo "Host is off, cannot reset." |
| 82 | fi |
| 83 | } |
| 84 | |
| 85 | shutdown_ack() { |
| 86 | echo "Receive shutdown ACK triggered" |
| 87 | power_off |
| 88 | |
| 89 | if [ -f "/run/openbmc/host@0-shutdown-req-time" ]; then |
| 90 | rm -rf "/run/openbmc/host@0-shutdown-req-time" |
| 91 | fi |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 92 | } |
| 93 | |
Charles Boyer | a3dc550 | 2021-10-29 16:39:16 -0500 | [diff] [blame] | 94 | power_button() { |
| 95 | echo "Power button trigger event." |
| 96 | current_time="$(timestamp)" |
| 97 | if [ -f "/run/openbmc/power-button" ]; then |
| 98 | echo "Power button released" |
| 99 | press_time="$(cat /run/openbmc/power-button)" |
| 100 | if [[ "$current_time" -le "(($press_time + 1))" ]]; then |
| 101 | power_on |
| 102 | elif [[ "$current_time" -ge "(($press_time + 5))" ]]; then |
| 103 | power_off |
| 104 | else |
| 105 | echo "Button press did not match interval. |
| 106 | fi |
| 107 | rm "/run/openbmc/power-button" |
| 108 | else |
| 109 | echo "Power button pressed" |
| 110 | echo "$(timestamp)" > "/run/openbmc/power-button" |
| 111 | fi |
| 112 | } |
| 113 | |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 114 | if [ $# -lt 2 ]; then |
| 115 | echo "Total number of parameter=$#" |
| 116 | echo "Insufficient parameter" |
| 117 | usage; |
| 118 | exit 0; |
| 119 | fi |
| 120 | |
| 121 | if [ $1 != "mb" ]; then |
| 122 | echo "Invalid parameter1=$1" |
| 123 | usage; |
| 124 | exit 0; |
| 125 | fi |
| 126 | |
| 127 | if [ $2 = "on" ]; then |
Charles Boyer | 1c51ca5 | 2021-08-24 11:25:03 -0500 | [diff] [blame] | 128 | sleep 3 |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 129 | if [ $(power_status) == "off" ]; then |
| 130 | power_on |
| 131 | fi |
| 132 | elif [ $2 = "off" ]; then |
| 133 | if [ $(power_status) == "on" ]; then |
| 134 | power_off |
Charles Boyer | 1c51ca5 | 2021-08-24 11:25:03 -0500 | [diff] [blame] | 135 | sleep 6 |
| 136 | if [ $(host_status) == "on" ]; then |
| 137 | force_off |
| 138 | fi |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 139 | fi |
Charles Boyer | 17b216a | 2021-08-27 16:09:03 -0500 | [diff] [blame] | 140 | elif [[ $2 == "hotswap" ]]; then |
| 141 | hotswap |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 142 | elif [[ $2 == "graceful_shutdown" ]]; then |
| 143 | graceful_shutdown |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 144 | elif [ $2 == "force_reset" ]; then |
| 145 | force_reset |
Charles Boyer | 1c51ca5 | 2021-08-24 11:25:03 -0500 | [diff] [blame] | 146 | elif [ $2 == "shutdown_ack" ]; then |
| 147 | shutdown_ack |
Charles Boyer | a3dc550 | 2021-10-29 16:39:16 -0500 | [diff] [blame] | 148 | elif [ $2 == "power_button" ]; then |
| 149 | power_button |
Mohaimen Alsamarai | 82a11d8 | 2021-06-24 16:59:29 -0500 | [diff] [blame] | 150 | else |
| 151 | echo "Invalid parameter2=$2" |
| 152 | usage; |
| 153 | fi |
| 154 | |
| 155 | exit 0; |