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