summaryrefslogtreecommitdiff
path: root/meta-facebook/recipes-phosphor/flash/phosphor-software-manager/bios-update.sh
blob: 4b99f0be4ade9662eb40d03216230640c365084a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/bin/bash

set -e

POWER_CMD="/usr/sbin/power-util mb"
IMAGE_FILE=$1/bios.bin
GPIO=389

IPMB_OBJ="xyz.openbmc_project.Ipmi.Channel.Ipmb"
IPMB_PATH="/xyz/openbmc_project/Ipmi/Channel/Ipmb"
IPMB_INTF="org.openbmc.Ipmb"
IPMB_CALL="sendRequest yyyyay"
ME_CMD_RECOVER="1 0x2e 0 0xdf 4 0x57 0x01 0x00 0x01"
ME_CMD_RESET="1 6 0 0x2 0"
SPI_DEV="1e630000.spi"
SPI_PATH="/sys/bus/platform/drivers/aspeed-smc"

set_gpio_to_bmc()
{
    echo "switch bios GPIO to bmc"
    if [ ! -d /sys/class/gpio/gpio$GPIO ]; then
        cd /sys/class/gpio
        echo $GPIO > "export"
        cd gpio$GPIO
    else
        cd /sys/class/gpio/gpio$GPIO
    fi
    direc=$(cat direction)
    if [ "$direc" == "in" ]; then
        echo "out" > direction
    fi
    data=$(cat value)
    if [ "$data" == "0" ]; then
        echo 1 > value
    fi
    return 0
}

set_gpio_to_pch()
{
    echo "switch bios GPIO to pch"
    if [ ! -d /sys/class/gpio/gpio$GPIO ]; then
        cd /sys/class/gpio
        echo $GPIO > "export"
        cd gpio$GPIO
    else
        cd /sys/class/gpio/gpio$GPIO
    fi
    direc=$(cat direction)
    if [ "$direc" == "in" ]; then
        echo "out" > direction
    fi
    data=$(cat value)
    if [ "$data" == "1" ]; then
        echo 0 > value
    fi
    echo "in" > direction
    echo $GPIO > /sys/class/gpio/unexport
    return 0
}

echo "Bios upgrade started at $(date)"

#Power off host server.
echo "Power off host server"
$POWER_CMD off
sleep 15
if [ "$($POWER_CMD status)" != "off" ];
then
    echo "Host server didn't power off"
    echo "Bios upgrade failed"
    exit 1
fi
echo "Host server powered off"

#Set ME to recovery mode
echo "Set ME to recovery mode"
# shellcheck disable=SC2086
busctl call "$IPMB_OBJ" "$IPMB_PATH" "$IPMB_INTF" $IPMB_CALL $ME_CMD_RECOVER
sleep 5

#Flip GPIO to access SPI flash used by host.
echo "Set GPIO $GPIO to access SPI flash from BMC used by host"
set_gpio_to_bmc

#Bind spi driver to access flash
echo "bind aspeed-smc spi driver"
echo -n $SPI_DEV > $SPI_PATH/bind
sleep 1

#Flashcp image to device.
if [ -e "$IMAGE_FILE" ];
then
    echo "Bios image is $IMAGE_FILE"
    for d in mtd6 mtd7 ; do
        if [ -e "/dev/$d" ]; then
            mtd=$(cat /sys/class/mtd/$d/name)
            if [ "$mtd" == "pnor" ]; then
                echo "Flashing bios image to $d..."
                if flashcp -v "$IMAGE_FILE" /dev/$d; then
                    echo "bios updated successfully..."
                else
                    echo "bios update failed..."
                fi
                break
            fi
            echo "$d is not a pnor device"
        fi
        echo "$d not available"
    done
else
    echo "Bios image $IMAGE_FILE doesn't exist"
fi

#Unbind spi driver
sleep 1
echo "Unbind aspeed-smc spi driver"
echo -n $SPI_DEV > $SPI_PATH/unbind
sleep 10

#Flip GPIO back for host to access SPI flash
echo "Set GPIO $GPIO back for host to access SPI flash"
set_gpio_to_pch
sleep 5

#Reset ME to boot from new bios
echo "Reset ME to boot from new bios"
# shellcheck disable=SC2086
busctl call "$IPMB_OBJ" "$IPMB_PATH" "$IPMB_INTF" $IPMB_CALL $ME_CMD_RESET
sleep 10

#Power on server
echo "Power on server"
$POWER_CMD on
sleep 5

# Retry to power on once again if server didn't powered on
if [ "$($POWER_CMD status)" != "on" ];
then
    sleep 5
    echo "Powering on server again"
    $POWER_CMD on
fi