xref: /openbmc/openbmc/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl (revision 7934b337bec44474960be758cef304727784db5d)
14a0948d0SAllen.Wang#!/bin/bash
24a0948d0SAllen.Wang#
34a0948d0SAllen.Wang# Power Control tool
44a0948d0SAllen.Wang#   Enable/disable AC relay
54a0948d0SAllen.Wang#   On/off System by step moter to press power key
64a0948d0SAllen.Wang
74a0948d0SAllen.Wangexport PATH=$PATH:/usr/sbin:/usr/libexec
84a0948d0SAllen.Wang
9501f4c78SPotin Lai# shellcheck source=meta-facebook/meta-bletchley/recipes-bletchley/plat-tools/files/bletchley-common-functions
10501f4c78SPotin Laisource /usr/libexec/bletchley-common-functions
11501f4c78SPotin Lai
124a0948d0SAllen.WangDELAY_POWER_ON="0.5"
138f2d3f27SPotin LaiDELAY_POWER_OFF="10"
1427083c31SPotin LaiDELAY_POWER_RECOVERY_MODE="10"
15d2e7f202SPotin LaiPOWER_BTN_TIMEOUT_SEC=10
164a0948d0SAllen.Wang
17bb91c1b9SPotin LaiREV_EVT="EVT"
18bb91c1b9SPotin LaiREV_DVT="DVT"
19bb91c1b9SPotin LaiREV_UNKNOW="UNKNOW"
20bb91c1b9SPotin Lai
21bb91c1b9SPotin LaiDBUS_HOST_ST_ON="xyz.openbmc_project.State.Host.HostState.Running"
22bb91c1b9SPotin LaiDBUS_HOST_ST_OFF="xyz.openbmc_project.State.Host.HostState.Off"
23bb91c1b9SPotin Lai
24bb91c1b9SPotin LaiHOST_ST_UNKNOW="Unknow"
25bb91c1b9SPotin LaiHOST_ST_ON="On"
26bb91c1b9SPotin LaiHOST_ST_OFF="Off"
2727083c31SPotin LaiHOST_ST_SLEEP="Sleep"
2827083c31SPotin LaiHOST_ST_DFU="DFU"
2927083c31SPotin LaiHOST_ST_RECOVERY="Recovery"
30bb91c1b9SPotin LaiHOST_AC_ON="AC On"
31bb91c1b9SPotin LaiHOST_AC_OFF="AC Off"
32bb91c1b9SPotin Lai
3327083c31SPotin LaiACTION_ON="on"
3427083c31SPotin LaiACTION_OFF="off"
3527083c31SPotin LaiACTION_DFU="dfu"
3627083c31SPotin LaiACTION_RECOVERY="recovery"
372320b0e0SPotin LaiACTION_CYCLE="cycle"
382320b0e0SPotin LaiACTION_RESET="reset"
3927083c31SPotin LaiACTION_AC_ON="ac-on"
4027083c31SPotin LaiACTION_AC_OFF="ac-off"
4127083c31SPotin LaiACTION_STATUS="status"
426a0b3d3bSPotin LaiACTION_BOOT_MODE="boot-from-bootmode"
4327083c31SPotin Lai
4427083c31SPotin LaiVALID_SLED_ACTIONS="
4527083c31SPotin Lai    $ACTION_ON
4627083c31SPotin Lai    $ACTION_OFF
4727083c31SPotin Lai    $ACTION_AC_ON
4827083c31SPotin Lai    $ACTION_AC_OFF
4927083c31SPotin Lai    $ACTION_STATUS
5027083c31SPotin Lai    $ACTION_DFU
5127083c31SPotin Lai    $ACTION_RECOVERY
522320b0e0SPotin Lai    $ACTION_CYCLE
532320b0e0SPotin Lai    $ACTION_RESET
546a0b3d3bSPotin Lai    $ACTION_BOOT_MODE
5527083c31SPotin Lai"
5627083c31SPotin Lai
576a0b3d3bSPotin LaiBOOT_MODE_REGULAR="\"xyz.openbmc_project.Control.Boot.Mode.Modes.Regular\""
586a0b3d3bSPotin LaiBOOT_MODE_SAFE="\"xyz.openbmc_project.Control.Boot.Mode.Modes.Safe\""
596a0b3d3bSPotin LaiBOOT_MODE_SETUP="\"xyz.openbmc_project.Control.Boot.Mode.Modes.Setup\""
606a0b3d3bSPotin Lai
6127083c31SPotin Laifunction is_valid_sled_action()
6227083c31SPotin Lai{
6327083c31SPotin Lai    local ACTION=$1
6427083c31SPotin Lai    for i in $VALID_SLED_ACTIONS
6527083c31SPotin Lai    do
6627083c31SPotin Lai        if [ "$i" = "$ACTION" ]; then
6727083c31SPotin Lai            return 0
6827083c31SPotin Lai        fi
6927083c31SPotin Lai    done
7027083c31SPotin Lai    return 1
7127083c31SPotin Lai}
7227083c31SPotin Lai
7327083c31SPotin Laifunction get_board_rev()
7427083c31SPotin Lai{
75bb91c1b9SPotin Lai    local rev_id0
76bb91c1b9SPotin Lai    local rev_id1
77bb91c1b9SPotin Lai    local rev_id2
78bb91c1b9SPotin Lai    local rev_val
79bb91c1b9SPotin Lai
80bb91c1b9SPotin Lai    rev_id0=$(get_gpio "REV_ID0")
81bb91c1b9SPotin Lai    rev_id1=$(get_gpio "REV_ID1")
82bb91c1b9SPotin Lai    rev_id2=$(get_gpio "REV_ID2")
83bb91c1b9SPotin Lai    rev_val=$((rev_id0+(rev_id1<<1)+(rev_id2<<2)))
84bb91c1b9SPotin Lai
85bb91c1b9SPotin Lai    case $rev_val in
86bb91c1b9SPotin Lai        0)
87bb91c1b9SPotin Lai            echo "$REV_EVT"
88bb91c1b9SPotin Lai            ;;
89bb91c1b9SPotin Lai        1)
90bb91c1b9SPotin Lai            echo "$REV_DVT"
91bb91c1b9SPotin Lai            ;;
92bb91c1b9SPotin Lai        *)
93bb91c1b9SPotin Lai            echo "$REV_UNKNOW"
94bb91c1b9SPotin Lai            return 1
95bb91c1b9SPotin Lai            ;;
96bb91c1b9SPotin Lai    esac
97bb91c1b9SPotin Lai
98bb91c1b9SPotin Lai    return 0
99bb91c1b9SPotin Lai}
100bb91c1b9SPotin Lai
10127083c31SPotin Laifunction trigger_power_button()
10227083c31SPotin Lai{
1034a0948d0SAllen.Wang    local sled_num=$1
1044a0948d0SAllen.Wang    local delay_time=$2
1054a0948d0SAllen.Wang
1064a0948d0SAllen.Wang    #SLED{N}_MS_DETECT1  (initial position)
1074a0948d0SAllen.Wang    GPIO_DETECT_PIN1="SLED${sled_num}_MS_DETECT1"
1084a0948d0SAllen.Wang    #SLED{N}_MS_DETECT0  (MAC position)
1094a0948d0SAllen.Wang    GPIO_DETECT_PIN0="SLED${sled_num}_MS_DETECT0"
1104a0948d0SAllen.Wang
1114a0948d0SAllen.Wang    echo "Motor go forward to press Power key"
1124a0948d0SAllen.Wang    motor-ctrl "sled${sled_num}" f >/dev/null
113d2e7f202SPotin Lai    wait_gpio_falling "${GPIO_DETECT_PIN0}" "$POWER_BTN_TIMEOUT_SEC"
1144a0948d0SAllen.Wang    motor-ctrl "sled${sled_num}" s >/dev/null
1154a0948d0SAllen.Wang
1164a0948d0SAllen.Wang    if [ "$(get_gpio  "$GPIO_DETECT_PIN0")" -eq 0 ];then
1174a0948d0SAllen.Wang        echo "Power key switch triggered"
1184a0948d0SAllen.Wang        echo "Press power key for Sled${1} ${delay_time} seconds..."
1194a0948d0SAllen.Wang        sleep "$delay_time"
1204a0948d0SAllen.Wang    else
1216af0dff7SAllen.Wang        echo "Power key switch not trigger, back motor to initial position"
1224a0948d0SAllen.Wang    fi
1234a0948d0SAllen.Wang
1244a0948d0SAllen.Wang    motor-ctrl "sled${sled_num}" r >/dev/null
125d2e7f202SPotin Lai    wait_gpio_falling "${GPIO_DETECT_PIN1}" "$POWER_BTN_TIMEOUT_SEC"
1264a0948d0SAllen.Wang    motor-ctrl "sled${sled_num}" s >/dev/null
1274a0948d0SAllen.Wang    if [ "$(get_gpio  "$GPIO_DETECT_PIN1")" -eq 0 ];then
1284a0948d0SAllen.Wang        echo "Motor reverse to initial position successful"
1294a0948d0SAllen.Wang    else
1306af0dff7SAllen.Wang        echo "Initial position switch not trigger, force stop motor"
1314a0948d0SAllen.Wang    fi
1324a0948d0SAllen.Wang}
1334a0948d0SAllen.Wang
13427083c31SPotin Laifunction release_power_button()
13527083c31SPotin Lai{
136db5648e6SPotin Lai    local sled_num=$1
137db5648e6SPotin Lai    GPIO_DETECT_PIN1="SLED${sled_num}_MS_DETECT1"
138db5648e6SPotin Lai
139db5648e6SPotin Lai    if [ "$(get_gpio  "$GPIO_DETECT_PIN1")" -eq 0 ]; then
140db5648e6SPotin Lai        echo "Motor at initial position already"
141db5648e6SPotin Lai        return 0
142db5648e6SPotin Lai    fi
143db5648e6SPotin Lai
144db5648e6SPotin Lai    motor-ctrl "sled${sled_num}" r >/dev/null
145d2e7f202SPotin Lai    wait_gpio_falling "${GPIO_DETECT_PIN1}" "$POWER_BTN_TIMEOUT_SEC"
146db5648e6SPotin Lai    motor-ctrl "sled${sled_num}" s >/dev/null
147db5648e6SPotin Lai    if [ "$(get_gpio  "$GPIO_DETECT_PIN1")" -eq 0 ];then
148db5648e6SPotin Lai        echo "Motor reverse to initial position successful"
149db5648e6SPotin Lai        return 0
150db5648e6SPotin Lai    fi
151db5648e6SPotin Lai
152db5648e6SPotin Lai    echo "Error: Initial position switch not trigger"
153db5648e6SPotin Lai    return 1
154db5648e6SPotin Lai}
155db5648e6SPotin Lai
15627083c31SPotin Laifunction press_power_button()
15727083c31SPotin Lai{
158db5648e6SPotin Lai    local sled_num=$1
159db5648e6SPotin Lai
160db5648e6SPotin Lai    GPIO_DETECT_PIN0="SLED${sled_num}_MS_DETECT0"
161db5648e6SPotin Lai
162db5648e6SPotin Lai    echo "Motor go forward to press Power button"
163db5648e6SPotin Lai    motor-ctrl "sled${sled_num}" f >/dev/null
164d2e7f202SPotin Lai    wait_gpio_falling "${GPIO_DETECT_PIN0}" "$POWER_BTN_TIMEOUT_SEC"
165db5648e6SPotin Lai    motor-ctrl "sled${sled_num}" s >/dev/null
166db5648e6SPotin Lai
167db5648e6SPotin Lai    if [ "$(get_gpio  "$GPIO_DETECT_PIN0")" -eq 0 ];then
168db5648e6SPotin Lai        echo "Power button switch triggered"
169db5648e6SPotin Lai        return 0
170db5648e6SPotin Lai    fi
171db5648e6SPotin Lai
172db5648e6SPotin Lai    echo "Error: Power button switch not trigger"
173db5648e6SPotin Lai    return 1
174db5648e6SPotin Lai}
175db5648e6SPotin Lai
1764a0948d0SAllen.Wang#Get i2c bus number for sledN
17727083c31SPotin Laifunction get_bus_num()
17827083c31SPotin Lai{
1794a0948d0SAllen.Wang    SLED_NUM=$1
1804a0948d0SAllen.Wang    local bus=0
1815ff992efSAllen.Wang    #Mapping Sled number 1~6 to i2c bus number 0~5
1825ff992efSAllen.Wang    if [[ "$SLED_NUM" = [1-6] ]]; then
1835ff992efSAllen.Wang        bus=$(( SLED_NUM - 1 ))
1844a0948d0SAllen.Wang    fi
1854a0948d0SAllen.Wang    echo "$bus"
1864a0948d0SAllen.Wang}
1874a0948d0SAllen.Wang
18827083c31SPotin Laifunction get_ac_status()
18927083c31SPotin Lai{
1904a0948d0SAllen.Wang    i2c_bus=$(get_bus_num "$1")
1914a0948d0SAllen.Wang    p1_output_reg=$(i2cget -f -y "$i2c_bus" 0x76 0x03)
1924a0948d0SAllen.Wang    p1_config_reg=$(i2cget -f -y "$i2c_bus" 0x76 0x07)
1934a0948d0SAllen.Wang    host_pwr="$(( (p1_output_reg & 0x80)>>7 ))"
1944a0948d0SAllen.Wang    is_output="$(( (~p1_config_reg & 0x80)>>7 ))"
1954a0948d0SAllen.Wang
1964a0948d0SAllen.Wang    if [ "$(( host_pwr & is_output ))" -eq 1 ];then
197bb91c1b9SPotin Lai        echo "$HOST_AC_ON"
1984a0948d0SAllen.Wang    else
199bb91c1b9SPotin Lai        echo "$HOST_AC_OFF"
2004a0948d0SAllen.Wang    fi
2014a0948d0SAllen.Wang}
2024a0948d0SAllen.Wang
203bb91c1b9SPotin Laifunction get_host_status_dbus()
204bb91c1b9SPotin Lai{
205bb91c1b9SPotin Lai    local sled_num=$1
206bb91c1b9SPotin Lai    local object="/xyz/openbmc_project/state/host${sled_num}"
207bb91c1b9SPotin Lai    local service="xyz.openbmc_project.State.Host${sled_num}"
208bb91c1b9SPotin Lai    local interface="xyz.openbmc_project.State.Host"
209bb91c1b9SPotin Lai    local property="CurrentHostState"
210bb91c1b9SPotin Lai    local host_state
211bb91c1b9SPotin Lai
212bb91c1b9SPotin Lai    host_state=$(busctl get-property "$service" "$object" "$interface" "$property" | cut -d '"' -f2)
213bb91c1b9SPotin Lai
214bb91c1b9SPotin Lai    if [ "$host_state" = "$DBUS_HOST_ST_ON" ]; then
215bb91c1b9SPotin Lai        echo "$HOST_ST_ON"
216bb91c1b9SPotin Lai    elif [ "$host_state" = "$DBUS_HOST_ST_OFF" ]; then
217bb91c1b9SPotin Lai        echo "$HOST_ST_OFF"
218bb91c1b9SPotin Lai    else
219bb91c1b9SPotin Lai        echo "$HOST_ST_UNKNOW"
220bb91c1b9SPotin Lai        return 1
221bb91c1b9SPotin Lai    fi
222bb91c1b9SPotin Lai
223bb91c1b9SPotin Lai    return 0
224bb91c1b9SPotin Lai}
225bb91c1b9SPotin Lai
226b8f52ae4SPotin Laifunction get_addr_from_dts_aliases()
227b8f52ae4SPotin Lai{
228b8f52ae4SPotin Lai    local node_address
229b8f52ae4SPotin Lai    node_address=$(awk -F '@' '{printf $2}' /sys/firmware/devicetree/base/aliases/"$1")
230b8f52ae4SPotin Lai    echo "$node_address"
231b8f52ae4SPotin Lai}
232b8f52ae4SPotin Lai
233bb91c1b9SPotin Laifunction get_host_status_mdio()
234dc251664SPotin Lai{
23527083c31SPotin Lai    local SLED_NUM=$1
236b8f52ae4SPotin Lai    local MDIO_BUS
237b8f52ae4SPotin Lai
238b8f52ae4SPotin Lai    MDIO_BUS="$(get_addr_from_dts_aliases mdio0).mdio-1"
239bb91c1b9SPotin Lai
240dc251664SPotin Lai    declare -a PORT_MAP=(0 3 2 1 7 6 5)
241dc251664SPotin Lai
242dc251664SPotin Lai    # check /dev/mem
243dc251664SPotin Lai    if ! create_dev_mem; then
244dc251664SPotin Lai        return 1
245dc251664SPotin Lai    fi
246dc251664SPotin Lai
24727083c31SPotin Lai    local CHECK_CNT=0
24827083c31SPotin Lai    local MDIO_ERR_CNT=0
24927083c31SPotin Lai    local CUR_HOST_ST=$HOST_ST_UNKNOW
25027083c31SPotin Lai    local SLED_LAST_ACTION
25127083c31SPotin Lai
25227083c31SPotin Lai    if [ -f /tmp/sled"${SLED_NUM}"-last-action ]; then
25327083c31SPotin Lai        SLED_LAST_ACTION=$(cat /tmp/sled"${SLED_NUM}"-last-action)
25427083c31SPotin Lai    fi
255dc251664SPotin Lai
256dc251664SPotin Lai    while true
257dc251664SPotin Lai    do
258b8f52ae4SPotin Lai        if POST_ST_VAL=$(mdio "$MDIO_BUS" phy "${PORT_MAP[SLED_NUM]}" 0); then
25927083c31SPotin Lai            if [ $((POST_ST_VAL&16#0800)) -eq $((16#0000)) ]; then
26027083c31SPotin Lai                case $SLED_LAST_ACTION in
26127083c31SPotin Lai                    "$ACTION_DFU")
26227083c31SPotin Lai                        TMP_HOST_ST="$HOST_ST_DFU"
26327083c31SPotin Lai                        ;;
26427083c31SPotin Lai                    *)
265dc251664SPotin Lai                        TMP_HOST_ST="$HOST_ST_OFF"
26627083c31SPotin Lai                        ;;
26727083c31SPotin Lai                esac
26827083c31SPotin Lai            elif [ $((POST_ST_VAL&16#0A00)) -eq $((16#0A00)) ]; then
26927083c31SPotin Lai                TMP_HOST_ST="$HOST_ST_ON"
27027083c31SPotin Lai                case $SLED_LAST_ACTION in
27127083c31SPotin Lai                    "$ACTION_RECOVERY")
27227083c31SPotin Lai                        TMP_HOST_ST="$HOST_ST_RECOVERY"
27327083c31SPotin Lai                        ;;
27427083c31SPotin Lai                    *)
27527083c31SPotin Lai                        TMP_HOST_ST="$HOST_ST_ON"
27627083c31SPotin Lai                        ;;
27727083c31SPotin Lai                esac
27827083c31SPotin Lai            elif [ $((POST_ST_VAL&16#0900)) -eq $((16#0900)) ]; then
27927083c31SPotin Lai                TMP_HOST_ST="$HOST_ST_SLEEP"
28027083c31SPotin Lai            else
28127083c31SPotin Lai                TMP_HOST_ST="$HOST_ST_UNKNOW"
282dc251664SPotin Lai            fi
283dc251664SPotin Lai
284dc251664SPotin Lai            if [ "$CUR_HOST_ST" == "$TMP_HOST_ST" ]; then
285dc251664SPotin Lai                CHECK_CNT=$((CHECK_CNT+1))
286dc251664SPotin Lai            else
287dc251664SPotin Lai                CUR_HOST_ST=$TMP_HOST_ST
288dc251664SPotin Lai                CHECK_CNT=0
289dc251664SPotin Lai            fi
290dc251664SPotin Lai
291dc251664SPotin Lai            if [ "$CHECK_CNT" -ge 5 ]; then
292dc251664SPotin Lai                echo "$CUR_HOST_ST"
293dc251664SPotin Lai                break
294dc251664SPotin Lai            fi
295dc251664SPotin Lai        else
296dc251664SPotin Lai            MDIO_ERR_CNT=$((MDIO_ERR_CNT+1))
297dc251664SPotin Lai            if [ "$MDIO_ERR_CNT" -ge 5 ]; then
298dc251664SPotin Lai                echo "$HOST_ST_UNKNOW"
299dc251664SPotin Lai                return 1
300dc251664SPotin Lai            fi
301dc251664SPotin Lai        fi
302dc251664SPotin Lai    done
303dc251664SPotin Lai
304dc251664SPotin Lai    return 0
305dc251664SPotin Lai}
306dc251664SPotin Lai
307bb91c1b9SPotin Laifunction get_host_status()
308bb91c1b9SPotin Lai{
309bb91c1b9SPotin Lai    local sled_num=$1
310bb91c1b9SPotin Lai
31127083c31SPotin Lai    if [ "$(get_ac_status "$SLED_NUM")" == "$HOST_AC_OFF" ];then
31227083c31SPotin Lai        echo "$HOST_AC_OFF"
31327083c31SPotin Lai        return 0
31427083c31SPotin Lai    fi
315bb91c1b9SPotin Lai
31627083c31SPotin Lai    if [ "$(get_board_rev)" = "$REV_EVT" ]; then
317bb91c1b9SPotin Lai        get_host_status_dbus "$sled_num"
318bb91c1b9SPotin Lai    else
319bb91c1b9SPotin Lai        get_host_status_mdio "$sled_num"
320bb91c1b9SPotin Lai    fi
321bb91c1b9SPotin Lai    return $?
322bb91c1b9SPotin Lai}
323bb91c1b9SPotin Lai
3246a0b3d3bSPotin Laifunction get_host_bootmode()
3256a0b3d3bSPotin Lai{
3266a0b3d3bSPotin Lai    local BUS_NAME="xyz.openbmc_project.Settings"
3276a0b3d3bSPotin Lai    local OBJ_PATH="/xyz/openbmc_project/control/host${1}/boot"
3286a0b3d3bSPotin Lai    local INTF_NAME="xyz.openbmc_project.Control.Boot.Mode"
3296a0b3d3bSPotin Lai    busctl get-property "${BUS_NAME}" "${OBJ_PATH}" "${INTF_NAME}" BootMode | awk '{print $2}'
3306a0b3d3bSPotin Lai}
3316a0b3d3bSPotin Lai
3322320b0e0SPotin Laifunction do_action_reset()
3332320b0e0SPotin Lai{
3342320b0e0SPotin Lai    # 1. Power off
3352320b0e0SPotin Lai    # 2. Power on
3362320b0e0SPotin Lai
3372320b0e0SPotin Lai    local SLED_NUM=$1
3382320b0e0SPotin Lai    local CUR_ST=$2
3392320b0e0SPotin Lai
3402320b0e0SPotin Lai    if [ "$CUR_ST" != "$HOST_ST_OFF" ]; then
3412320b0e0SPotin Lai        do_action_off "$SLED_NUM"
3422320b0e0SPotin Lai    else
3432320b0e0SPotin Lai        echo "sled${SLED_NUM}: already powered off"
3442320b0e0SPotin Lai    fi
3452320b0e0SPotin Lai
3462320b0e0SPotin Lai    sleep 3
3472320b0e0SPotin Lai    do_action_on "$SLED_NUM"
3482320b0e0SPotin Lai}
3492320b0e0SPotin Lai
3502320b0e0SPotin Laifunction do_action_cycle()
3512320b0e0SPotin Lai{
3522320b0e0SPotin Lai    # 1. AC off
3532320b0e0SPotin Lai    # 2. AC on
3542320b0e0SPotin Lai    # 3. Power on
3552320b0e0SPotin Lai
3562320b0e0SPotin Lai    local SLED_NUM=$1
3572320b0e0SPotin Lai
3582320b0e0SPotin Lai    do_action_ac_off "$SLED_NUM"
3592320b0e0SPotin Lai    sleep 3
3602320b0e0SPotin Lai    do_action_ac_on "$SLED_NUM"
3612320b0e0SPotin Lai    sleep 3
3622320b0e0SPotin Lai    do_action_on "$SLED_NUM"
3632320b0e0SPotin Lai}
3642320b0e0SPotin Lai
36527083c31SPotin Laifunction do_action_ac_on()
36627083c31SPotin Lai{
36727083c31SPotin Lai    local SLED_NUM=$1
36827083c31SPotin Lai    echo "sled${SLED_NUM}: turn on AC"
36927083c31SPotin Lai    set_gpio "power-host${SLED_NUM}" 1
370*7934b337SPotin Lai    sleep 3 # Newer versions of the managed system needs 3 second delay
37127083c31SPotin Lai    echo "$ACTION_AC_ON" > "/tmp/sled${SLED_NUM}-last-action"
37227083c31SPotin Lai}
37327083c31SPotin Lai
37427083c31SPotin Laifunction do_action_ac_off()
37527083c31SPotin Lai{
37627083c31SPotin Lai    local SLED_NUM=$1
37727083c31SPotin Lai    echo "sled${SLED_NUM}: turn off AC"
37827083c31SPotin Lai    set_gpio "power-host${SLED_NUM}" 0
37927083c31SPotin Lai    echo "$ACTION_AC_OFF" > "/tmp/sled${SLED_NUM}-last-action"
38027083c31SPotin Lai}
38127083c31SPotin Lai
38227083c31SPotin Laifunction do_action_on()
38327083c31SPotin Lai{
38427083c31SPotin Lai    local SLED_NUM=$1
38527083c31SPotin Lai    echo "sled${SLED_NUM}: power on host"
38627083c31SPotin Lai    trigger_power_button  "$SLED_NUM"  "$DELAY_POWER_ON"
387aafe1878SPotin Lai    sleep 10 # Mac mini need about 10 second to stable link status
38827083c31SPotin Lai    echo "$ACTION_ON" > "/tmp/sled${SLED_NUM}-last-action"
38927083c31SPotin Lai}
39027083c31SPotin Lai
39127083c31SPotin Laifunction do_action_off()
39227083c31SPotin Lai{
39327083c31SPotin Lai    local SLED_NUM=$1
39427083c31SPotin Lai    echo "sled${SLED_NUM}: power off host"
39527083c31SPotin Lai    trigger_power_button  "$SLED_NUM"  "$DELAY_POWER_OFF"
39627083c31SPotin Lai    echo "$ACTION_OFF" > "/tmp/sled${SLED_NUM}-last-action"
39727083c31SPotin Lai}
39827083c31SPotin Lai
39927083c31SPotin Laifunction do_action_recovery()
40027083c31SPotin Lai{
40127083c31SPotin Lai    local SLED_NUM=$1
40227083c31SPotin Lai    echo "sled${SLED_NUM}: trigger host recovery mode"
40327083c31SPotin Lai    trigger_power_button  "$SLED_NUM"  "$DELAY_POWER_RECOVERY_MODE"
40427083c31SPotin Lai    echo "$ACTION_RECOVERY" > "/tmp/sled${SLED_NUM}-last-action"
40527083c31SPotin Lai}
40627083c31SPotin Lai
40727083c31SPotin Laifunction do_action_dfu()
40827083c31SPotin Lai{
40927083c31SPotin Lai    local SLED_NUM=$1
41027083c31SPotin Lai    echo "sled${SLED_NUM}: trigger host dfu mode"
41127083c31SPotin Lai
41227083c31SPotin Lai    # turn ac off, and hold for 25 seconds
41327083c31SPotin Lai    do_action_ac_off "$SLED_NUM"
41427083c31SPotin Lai    sleep 25
41527083c31SPotin Lai
41627083c31SPotin Lai    # press power button
41727083c31SPotin Lai    echo "SLED$SLED_NUM: pressing power button"
41827083c31SPotin Lai    if ! press_power_button "$SLED_NUM"; then
41927083c31SPotin Lai        echo "SLED$SLED_NUM: press power button failed"
42027083c31SPotin Lai        echo "SLED$SLED_NUM: releasing power button"
42127083c31SPotin Lai        release_power_button "$SLED_NUM"
4226a0b3d3bSPotin Lai        return 1
42327083c31SPotin Lai    fi
42427083c31SPotin Lai    sleep 1
42527083c31SPotin Lai
42627083c31SPotin Lai    # turn ac on
42727083c31SPotin Lai    echo "SLED$SLED_NUM: turn ac-on"
42827083c31SPotin Lai    do_action_ac_on "$SLED_NUM"
42927083c31SPotin Lai    sleep 3
43027083c31SPotin Lai
43127083c31SPotin Lai    # release power button
43227083c31SPotin Lai    echo "SLED$SLED_NUM: releasing host power button"
43327083c31SPotin Lai    if ! release_power_button "$SLED_NUM"; then
43427083c31SPotin Lai        echo "SLED$SLED_NUM: release power button failed"
4356a0b3d3bSPotin Lai        return 1
43627083c31SPotin Lai    fi
43727083c31SPotin Lai    echo "$ACTION_DFU" > "/tmp/sled${SLED_NUM}-last-action"
43827083c31SPotin Lai}
43927083c31SPotin Lai
44027083c31SPotin Laifunction host_state_on_action_handler()
44127083c31SPotin Lai{
44227083c31SPotin Lai    local SLED_NUM=$1
44327083c31SPotin Lai    local ACTION=$2
44427083c31SPotin Lai
44527083c31SPotin Lai    case $ACTION in
44627083c31SPotin Lai        "$ACTION_OFF")
44727083c31SPotin Lai            do_action_off "$SLED_NUM"
44827083c31SPotin Lai            ;;
44927083c31SPotin Lai        "$ACTION_AC_OFF")
45027083c31SPotin Lai            do_action_ac_off "$SLED_NUM"
45127083c31SPotin Lai            ;;
4522320b0e0SPotin Lai        "$ACTION_RESET")
4532320b0e0SPotin Lai            do_action_reset "$SLED_NUM" "$HOST_ST_ON"
4542320b0e0SPotin Lai            ;;
4552320b0e0SPotin Lai        "$ACTION_CYCLE")
4562320b0e0SPotin Lai            do_action_cycle "$SLED_NUM"
4572320b0e0SPotin Lai            ;;
458*7934b337SPotin Lai        "$ACTION_ON")
459*7934b337SPotin Lai            echo "already on"
460*7934b337SPotin Lai            ;;
46127083c31SPotin Lai        *)
46227083c31SPotin Lai            echo "Invalid action ($ACTION) for current host state (On)"
46327083c31SPotin Lai            return 1
46427083c31SPotin Lai            ;;
46527083c31SPotin Lai    esac
46627083c31SPotin Lai}
46727083c31SPotin Lai
46827083c31SPotin Laifunction host_state_sleep_action_handler()
46927083c31SPotin Lai{
47027083c31SPotin Lai    local SLED_NUM=$1
47127083c31SPotin Lai    local ACTION=$2
47227083c31SPotin Lai
47327083c31SPotin Lai    case $ACTION in
47427083c31SPotin Lai        "$ACTION_ON")
47527083c31SPotin Lai            do_action_on "$SLED_NUM"
47627083c31SPotin Lai            ;;
47727083c31SPotin Lai        "$ACTION_OFF")
47827083c31SPotin Lai            do_action_off "$SLED_NUM"
47927083c31SPotin Lai            ;;
48027083c31SPotin Lai        "$ACTION_AC_OFF")
48127083c31SPotin Lai            do_action_ac_off "$SLED_NUM"
48227083c31SPotin Lai            ;;
4832320b0e0SPotin Lai        "$ACTION_RESET")
4842320b0e0SPotin Lai            do_action_reset "$SLED_NUM" "$HOST_ST_ON"
4852320b0e0SPotin Lai            ;;
4862320b0e0SPotin Lai        "$ACTION_CYCLE")
4872320b0e0SPotin Lai            do_action_cycle "$SLED_NUM"
4882320b0e0SPotin Lai            ;;
48927083c31SPotin Lai        *)
49027083c31SPotin Lai            echo "Invalid action ($ACTION) for current host state (Sleep)"
49127083c31SPotin Lai            return 1
49227083c31SPotin Lai            ;;
49327083c31SPotin Lai    esac
49427083c31SPotin Lai}
49527083c31SPotin Lai
49627083c31SPotin Laifunction host_state_off_action_handler()
49727083c31SPotin Lai{
49827083c31SPotin Lai    local SLED_NUM=$1
49927083c31SPotin Lai    local ACTION=$2
50027083c31SPotin Lai
50127083c31SPotin Lai    case $ACTION in
50227083c31SPotin Lai        "$ACTION_ON")
50327083c31SPotin Lai            do_action_on "$SLED_NUM"
50427083c31SPotin Lai            ;;
50527083c31SPotin Lai        "$ACTION_RECOVERY")
50627083c31SPotin Lai            do_action_recovery "$SLED_NUM"
50727083c31SPotin Lai            ;;
5086a0b3d3bSPotin Lai        "$ACTION_DFU")
5096a0b3d3bSPotin Lai            do_action_dfu "$SLED_NUM"
5106a0b3d3bSPotin Lai            ;;
51127083c31SPotin Lai        "$ACTION_AC_OFF")
51227083c31SPotin Lai            do_action_ac_off "$SLED_NUM"
51327083c31SPotin Lai            ;;
5142320b0e0SPotin Lai        "$ACTION_RESET")
5152320b0e0SPotin Lai            do_action_reset "$SLED_NUM" "$HOST_ST_ON"
5162320b0e0SPotin Lai            ;;
5172320b0e0SPotin Lai        "$ACTION_CYCLE")
5182320b0e0SPotin Lai            do_action_cycle "$SLED_NUM"
5192320b0e0SPotin Lai            ;;
520*7934b337SPotin Lai        "$ACTION_OFF")
521*7934b337SPotin Lai            echo "already off"
522*7934b337SPotin Lai            ;;
52327083c31SPotin Lai        *)
52427083c31SPotin Lai            echo "Invalid action ($ACTION) for current host state (Off)"
52527083c31SPotin Lai            return 1
52627083c31SPotin Lai            ;;
52727083c31SPotin Lai    esac
52827083c31SPotin Lai}
52927083c31SPotin Lai
53027083c31SPotin Laifunction host_state_ac_off_action_handler()
53127083c31SPotin Lai{
53227083c31SPotin Lai    local SLED_NUM=$1
53327083c31SPotin Lai    local ACTION=$2
53427083c31SPotin Lai
53527083c31SPotin Lai    case $ACTION in
53627083c31SPotin Lai        "$ACTION_AC_ON")
53727083c31SPotin Lai            do_action_ac_on "$SLED_NUM"
53827083c31SPotin Lai            ;;
53927083c31SPotin Lai        "$ACTION_DFU")
54027083c31SPotin Lai            do_action_dfu "$SLED_NUM"
54127083c31SPotin Lai            ;;
54227083c31SPotin Lai        "$ACTION_AC_OFF")
54327083c31SPotin Lai            echo "sled${SLED_NUM}: already ac off"
54427083c31SPotin Lai            return 1
54527083c31SPotin Lai            ;;
5462320b0e0SPotin Lai        "$ACTION_CYCLE")
5472320b0e0SPotin Lai            do_action_reset "$SLED_NUM"
5482320b0e0SPotin Lai            ;;
54927083c31SPotin Lai        *)
55027083c31SPotin Lai            echo "Invalid action ($ACTION) for current host state (AC Off)"
55127083c31SPotin Lai            return 1
55227083c31SPotin Lai            ;;
55327083c31SPotin Lai    esac
55427083c31SPotin Lai}
55527083c31SPotin Lai
55627083c31SPotin Laifunction host_state_ac_on_action_handler()
55727083c31SPotin Lai{
55827083c31SPotin Lai    local SLED_NUM=$1
55927083c31SPotin Lai    local ACTION=$2
56027083c31SPotin Lai
56127083c31SPotin Lai    case $ACTION in
56227083c31SPotin Lai        "$ACTION_AC_OFF")
56327083c31SPotin Lai            do_action_ac_off "$SLED_NUM"
56427083c31SPotin Lai            ;;
5656a0b3d3bSPotin Lai        "$ACTION_DFU")
5666a0b3d3bSPotin Lai            do_action_dfu "$SLED_NUM"
5676a0b3d3bSPotin Lai            ;;
5682320b0e0SPotin Lai        "$ACTION_CYCLE")
5692320b0e0SPotin Lai            do_action_cycle "$SLED_NUM"
5702320b0e0SPotin Lai            ;;
57127083c31SPotin Lai        *)
57227083c31SPotin Lai            echo "sled${SLED_NUM}: already ac on"
57327083c31SPotin Lai            return 1
57427083c31SPotin Lai            ;;
57527083c31SPotin Lai    esac
57627083c31SPotin Lai}
57727083c31SPotin Lai
57827083c31SPotin Laifunction host_state_recovery_action_handler()
57927083c31SPotin Lai{
58027083c31SPotin Lai    local SLED_NUM=$1
58127083c31SPotin Lai    local ACTION=$2
58227083c31SPotin Lai
58327083c31SPotin Lai    case $ACTION in
58427083c31SPotin Lai        "$ACTION_OFF")
58527083c31SPotin Lai            do_action_off "$SLED_NUM"
58627083c31SPotin Lai            ;;
58727083c31SPotin Lai        "$ACTION_AC_OFF")
58827083c31SPotin Lai            do_action_ac_off "$SLED_NUM"
58927083c31SPotin Lai            ;;
5902320b0e0SPotin Lai        "$ACTION_RESET")
5912320b0e0SPotin Lai            do_action_reset "$SLED_NUM" "$HOST_ST_ON"
5922320b0e0SPotin Lai            ;;
5932320b0e0SPotin Lai        "$ACTION_CYCLE")
5942320b0e0SPotin Lai            do_action_cycle "$SLED_NUM"
5952320b0e0SPotin Lai            ;;
59627083c31SPotin Lai        *)
59727083c31SPotin Lai            echo "Invalid action ($ACTION) for current host state (Recovery)"
59827083c31SPotin Lai            return 1
59927083c31SPotin Lai            ;;
60027083c31SPotin Lai    esac
60127083c31SPotin Lai}
60227083c31SPotin Lai
60327083c31SPotin Laifunction host_state_dfu_action_handler()
60427083c31SPotin Lai{
60527083c31SPotin Lai    local SLED_NUM=$1
60627083c31SPotin Lai    local ACTION=$2
60727083c31SPotin Lai
60827083c31SPotin Lai    case $ACTION in
60927083c31SPotin Lai        "$ACTION_AC_OFF")
61027083c31SPotin Lai            do_action_ac_off "$SLED_NUM"
61127083c31SPotin Lai            ;;
6122320b0e0SPotin Lai        "$ACTION_CYCLE")
6132320b0e0SPotin Lai            do_action_cycle "$SLED_NUM"
6142320b0e0SPotin Lai            ;;
61527083c31SPotin Lai        *)
61627083c31SPotin Lai            echo "Invalid action ($ACTION) for current host state (DFU)"
61727083c31SPotin Lai            return 1
61827083c31SPotin Lai            ;;
61927083c31SPotin Lai    esac
62027083c31SPotin Lai}
62127083c31SPotin Lai
622dc251664SPotin Laifunction create_dev_mem()
623dc251664SPotin Lai{
624dc251664SPotin Lai    CHECK_CNT=0
625dc251664SPotin Lai    while true
626dc251664SPotin Lai    do
627dc251664SPotin Lai        CHECK_CNT=$((CHECK_CNT+1))
628dc251664SPotin Lai        if [ -c /dev/mem ]; then
629dc251664SPotin Lai            # /dev/mem already exist
630dc251664SPotin Lai            return 0
631dc251664SPotin Lai        elif mknod /dev/mem c 1 1; then
632dc251664SPotin Lai            # mknod success
633dc251664SPotin Lai            return 0
634dc251664SPotin Lai        elif [ "$CHECK_CNT" -ge 5 ]; then
635dc251664SPotin Lai            break
636dc251664SPotin Lai        fi
637dc251664SPotin Lai        sleep 1
638dc251664SPotin Lai    done
639dc251664SPotin Lai
640dc251664SPotin Lai    echo "create /dev/mem failed"
641dc251664SPotin Lai    return 1
642dc251664SPotin Lai}
643dc251664SPotin Lai
6444a0948d0SAllen.Wangfunction show_usage(){
64527083c31SPotin Lai    echo "Usage: power-ctrl [sled1 | sled2 | sled3 | sled4 | sled5 | sled6]  [$VALID_SLED_ACTIONS]"
6464a0948d0SAllen.Wang    echo "       power-ctrl chassis-cycle"
6474a0948d0SAllen.Wang}
6484a0948d0SAllen.Wang
64927083c31SPotin Lai
6504a0948d0SAllen.Wangif [ $# -eq 1 ]; then
6514a0948d0SAllen.Wang    if [ "$1" = "chassis-cycle" ];then
6524a0948d0SAllen.Wang        echo "chassis cycle...."
6534a0948d0SAllen.Wang        i2cset -y -f 12 0x11 0xd9 c
6544a0948d0SAllen.Wang        exit 0
6554a0948d0SAllen.Wang    else
6564a0948d0SAllen.Wang        echo "Invalid argument: [ $1 ]"
6574a0948d0SAllen.Wang        show_usage
6584a0948d0SAllen.Wang        exit  1;
6594a0948d0SAllen.Wang    fi
6604a0948d0SAllen.Wangfi
6614a0948d0SAllen.Wang
6624a0948d0SAllen.Wangif [ $# -gt 2 ]; then
6634a0948d0SAllen.Wang  echo "Too many arguments"
6644a0948d0SAllen.Wang  show_usage
6654a0948d0SAllen.Wang  exit  1;
6664a0948d0SAllen.Wangfi
6674a0948d0SAllen.Wang
6685ff992efSAllen.Wangif [[ "$1" =~ ^(sled[1-6]{1})$ ]]; then
6694a0948d0SAllen.Wang  SLED=$1
6704a0948d0SAllen.Wang  ACTION=$2
6714a0948d0SAllen.Wang  SLED_NUM=${SLED:4}
6724a0948d0SAllen.Wangelse
6734a0948d0SAllen.Wang  echo "invalid sled name: ${1}"
6744a0948d0SAllen.Wang  show_usage
6754a0948d0SAllen.Wang  exit 1;
6764a0948d0SAllen.Wangfi
6774a0948d0SAllen.Wang
6784a0948d0SAllen.Wang#Check if sled is present
679501f4c78SPotin Laiif ! is_sled_present "${SLED_NUM}"; then
6804a0948d0SAllen.Wang    echo "${SLED} is not present!"
6814a0948d0SAllen.Wang    exit 1
68227083c31SPotin Laielif ! is_valid_sled_action "$ACTION"; then
68327083c31SPotin Lai    echo "Unknown action: $ACTION"
6844a0948d0SAllen.Wang    show_usage
68527083c31SPotin Lai    exit 1
68627083c31SPotin Laifi
68727083c31SPotin Lai
688a8d258f6SPotin Laiif [ "$ACTION" = "$ACTION_AC_ON" ]; then
689a8d258f6SPotin Lai    if [ "$(get_ac_status "$SLED_NUM")" = "$HOST_AC_OFF" ]; then
690a8d258f6SPotin Lai        do_action_ac_on "$SLED_NUM"
691a8d258f6SPotin Lai    fi
692a8d258f6SPotin Laielif [ "$ACTION" = "$ACTION_AC_OFF" ]; then
693a8d258f6SPotin Lai    if [ "$(get_ac_status "$SLED_NUM")" != "$HOST_AC_OFF" ]; then
694a8d258f6SPotin Lai        do_action_ac_off "$SLED_NUM"
695a8d258f6SPotin Lai    fi
696a8d258f6SPotin Laielif [ "$ACTION" = "$ACTION_STATUS" ];then
69727083c31SPotin Lai    HOST_CURR_STATUS=$(get_host_status "$SLED_NUM")
69827083c31SPotin Lai    echo "$HOST_CURR_STATUS"
69927083c31SPotin Laielse
700a8d258f6SPotin Lai    HOST_CURR_STATUS=$(get_host_status "$SLED_NUM")
7016a0b3d3bSPotin Lai
7026a0b3d3bSPotin Lai    if [ "$ACTION" = "$ACTION_BOOT_MODE" ]; then
7036a0b3d3bSPotin Lai        BOOT_MODE=$(get_host_bootmode "$SLED_NUM")
7046a0b3d3bSPotin Lai        case "$BOOT_MODE" in
7056a0b3d3bSPotin Lai        "$BOOT_MODE_REGULAR")
7066a0b3d3bSPotin Lai            echo "Boot mode: on (regular)"
7076a0b3d3bSPotin Lai            ACTION="$ACTION_ON"
7086a0b3d3bSPotin Lai            ;;
7096a0b3d3bSPotin Lai        "$BOOT_MODE_SAFE")
7106a0b3d3bSPotin Lai            echo "Boot mode: recovery (safe)"
7116a0b3d3bSPotin Lai            ACTION="$ACTION_RECOVERY"
7126a0b3d3bSPotin Lai            ;;
7136a0b3d3bSPotin Lai        "$BOOT_MODE_SETUP")
7146a0b3d3bSPotin Lai            echo "Boot mode: dfu (setup)"
7156a0b3d3bSPotin Lai            ACTION="$ACTION_DFU"
7166a0b3d3bSPotin Lai            ;;
7176a0b3d3bSPotin Lai        *)
7186a0b3d3bSPotin Lai            echo "Boot mode: unknow"
7196a0b3d3bSPotin Lai            ;;
7206a0b3d3bSPotin Lai        esac
7216a0b3d3bSPotin Lai    fi
7226a0b3d3bSPotin Lai
72327083c31SPotin Lai    case $HOST_CURR_STATUS in
72427083c31SPotin Lai        "$HOST_AC_OFF")
72527083c31SPotin Lai            host_state_ac_off_action_handler "$SLED_NUM" "$ACTION"
72627083c31SPotin Lai            ;;
72727083c31SPotin Lai        "$HOST_AC_ON")
72827083c31SPotin Lai            host_state_ac_on_action_handler "$SLED_NUM" "$ACTION"
72927083c31SPotin Lai            ;;
73027083c31SPotin Lai        "$HOST_ST_OFF")
73127083c31SPotin Lai            host_state_off_action_handler "$SLED_NUM" "$ACTION"
73227083c31SPotin Lai            ;;
73327083c31SPotin Lai        "$HOST_ST_ON")
73427083c31SPotin Lai            host_state_on_action_handler "$SLED_NUM" "$ACTION"
73527083c31SPotin Lai            ;;
73627083c31SPotin Lai        "$HOST_ST_SLEEP")
73727083c31SPotin Lai            host_state_sleep_action_handler "$SLED_NUM" "$ACTION"
73827083c31SPotin Lai            ;;
73927083c31SPotin Lai        "$HOST_ST_DFU")
74027083c31SPotin Lai            host_state_dfu_action_handler "$SLED_NUM" "$ACTION"
74127083c31SPotin Lai            ;;
74227083c31SPotin Lai        "$HOST_ST_RECOVERY")
74327083c31SPotin Lai            host_state_recovery_action_handler "$SLED_NUM" "$ACTION"
74427083c31SPotin Lai            ;;
74527083c31SPotin Lai    esac
7464a0948d0SAllen.Wangfi
747