1#!/bin/bash
2
3# shellcheck disable=SC2120
4
5# Provide source directive to shellcheck.
6# shellcheck source=meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/power-cmd
7source /usr/libexec/phosphor-state-manager/power-cmd
8#IO 0:7 input port for showing slot 1:8 power status
9#IO 8:16 output port for controlling slot 1:8 power status
10CHASSIS_ID=$1
11IO_EXP_SLOT_PWR_STATUS=$((CHASSIS_ID - 1))
12IO_EXP_SLOT_PWR_CTRL=$((IO_EXP_SLOT_PWR_STATUS + 8))
13IO_EXP_SLED_CYCLE=12
14IO_EXP_BIC_PWR_CTRL=32
15
16GPIOCHIP_IO_EXP_SLOT_PWR_CTRL=$(basename "/sys/bus/i2c/devices/$SPIDER_BOARD_IO_EXP_BUS_NUM-00$IO_EXP_SLOT_PWR_CTRL_ADDR/"*gpiochip*)
17GPIOCHIP_IO_EXP_SLED_PWR_CTRL=$(basename "/sys/bus/i2c/devices/$MANAGEMENT_BOARD_IO_EXP_BUS_NUM-00$IO_EXP_SLED_PWR_CTRL_ADDR/"*gpiochip*)
18GPIOCHIP_IO_EXP_BIC_PWR_CTRL=$(basename "/sys/bus/i2c/devices/$IO_EXP_SLOT_PWR_STATUS-00$IO_EXP_BIC_PWR_CTRL_ADDR/"*gpiochip*)
19
20chassis-power-cycle()
21{
22    CHASSIS_ID=$1
23
24    if [ "$CHASSIS_ID" -le 8  ]
25    then
26        chassis_status=$(gpioget "$GPIOCHIP_IO_EXP_SLOT_PWR_CTRL" "$IO_EXP_SLOT_PWR_STATUS")
27        if [ "$chassis_status" == "$STATE_ON" ]
28        then
29            if ! gpioset "$GPIOCHIP_IO_EXP_BIC_PWR_CTRL" "$IO_EXP_BIC_PWR_CTRL"=0
30            then
31                echo "Failed to set slot$1 sentinel dome bic off"
32            fi
33            sleep 1
34            if ! gpioset "$GPIOCHIP_IO_EXP_SLOT_PWR_CTRL" "$IO_EXP_SLOT_PWR_CTRL"=1
35            then
36                echo "Failed to set slot$1 power off"
37            fi
38            sleep 10
39        fi
40        if ! gpioset "$GPIOCHIP_IO_EXP_SLOT_PWR_CTRL" "$IO_EXP_SLOT_PWR_CTRL"=0
41        then
42            echo "Failed to set slot$1 power on"
43        fi
44        sleep 2
45
46        # Check chassis status after doing 12V cycle
47        chassis_status=$(gpioget "$GPIOCHIP_IO_EXP_SLOT_PWR_CTRL" "$IO_EXP_SLOT_PWR_STATUS")
48        if [ "$chassis_status" == "$STATE_ON" ]
49        then
50            busctl set-property "$CHASSIS_BUS_NAME""$CHASSIS_ID" "$CHASSIS_OBJ_PATH""$CHASSIS_ID" "$CHASSIS_INTF_NAME" "$CHASSIS_PROPERTY_NAME" s "$CHASSIS_ON_PROPERTY"
51            exit 0;
52        else
53            busctl set-property "$CHASSIS_BUS_NAME""$CHASSIS_ID" "$CHASSIS_OBJ_PATH""$CHASSIS_ID" "$CHASSIS_INTF_NAME" "$CHASSIS_PROPERTY_NAME" s "$CHASSIS_OFF_PROPERTY"
54            exit 0;
55        fi
56    fi
57
58    echo "Invalid slot id"
59    exit 1;
60}
61
62if [ "$1" == 0 ]
63then
64    echo "Starting sled cycle..."
65    if ! gpioset "$GPIOCHIP_IO_EXP_SLED_PWR_CTRL" "$IO_EXP_SLED_CYCLE"=1
66    then
67        echo "Failed to do sled cycle"
68    fi
69else
70    echo "Starting slot$1 cycle"
71    chassis-power-cycle "$1"
72fi
73