xref: /openbmc/openbmc/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/power-cmd (revision 744d50ce1b21faf6d45a3f5a232ded42d5a4075f)
1#!/bin/bash
2
3# shellcheck source=meta-facebook/recipes-fb/obmc_functions/files/fb-common-functions
4source /usr/libexec/fb-common-functions
5
6check_valid_sgpio() {
7    sgpio_vaild0=$(gpioget 2 146)
8    sgpio_vaild1=$(gpioget 2 198)
9    sgpio_vaild2=$(gpioget 2 18)
10
11    if [[ "$sgpio_vaild0" == "0" && "$sgpio_vaild1" == "0" && "$sgpio_vaild2" == "1" ]]; then
12        return 0  # true
13    else
14        return 1  # false
15    fi
16}
17
18# Power Good Status
19power_status() {
20    check_valid_sgpio
21    valid_sgpio=$?
22
23    if [ "$(get_gpio "host0-ready")" -eq 1 ] && [ "$valid_sgpio" -eq 0 ] ; then
24        echo "on"
25    else
26        echo "off"
27    fi
28}
29
30# Force DC off
31force_power_off() {
32    if [ "$(power_status)" == "on" ]; then
33        set_gpio power-host-control 0
34        sleep 6
35        set_gpio power-host-control 1
36        sleep 6
37    fi
38
39    # Workaround for AMD force shutdown failure.
40    if [ "$(power_status)" == "on" ]; then
41        set_gpio reset-control 0
42        sleep 1
43        set_gpio reset-control 1
44        sleep 3
45
46        set_gpio power-host-control 0
47        sleep 1
48        set_gpio power-host-control 1
49        sleep 1
50
51        for i in $(seq 1 10)
52        do
53            sleep 1
54            if [ "$(power_status)" == "off" ]; then
55               return 0
56            fi
57
58            if [ "$i" -eq 10 ]; then
59               return 1
60            fi
61        done
62    fi
63}
64
65# Graceful DC off
66graceful_power_off() {
67    if [ "$(power_status)" == "on" ]; then
68        set_gpio power-host-control 0
69        sleep 1
70        set_gpio power-host-control 1
71        sleep 1
72
73        # wait host power off
74        for i in $(seq 1 20)
75        do
76            sleep 1
77            if [ "$(power_status)" == "off" ]; then
78               break
79            fi
80        done
81    fi
82}
83
84# DC on
85power_on() {
86    if [ "$(power_status)" == "off" ]; then
87        set_gpio power-host-control 0
88        sleep 1
89        set_gpio power-host-control 1
90        sleep 1
91
92        for i in $(seq 1 10)
93        do
94            sleep 1
95            if [ "$(power_status)" == "on" ]; then
96               return 0
97            fi
98
99            if [ "$i" -eq 10 ]; then
100               return 1
101            fi
102        done
103    fi
104    return 0
105}
106
107# Host reset
108power_reset() {
109    set_gpio reset-control 0
110    sleep 1
111    set_gpio reset-control 1
112    sleep 1
113    return 0
114}
115