blob: 130682d12a89d561d8b55578a802efae54ba71bf [file] [log] [blame]
Thang Q. Nguyene96820d2021-12-17 02:24:24 +00001#!/bin/bash
2
3do_fru_upgrade() {
4 FRU_DEVICE="/sys/bus/i2c/devices/3-0050/eeprom"
5
6 if ! command -v ampere_fru_upgrade;
7 then
8 echo "Bypass fru update as no ampere_fru_upgrade available"
9 exit
10 fi
11 ampere_fru_upgrade -d $FRU_DEVICE -f "$IMAGE"
12
13 systemctl restart xyz.openbmc_project.FruDevice.service
14 systemctl restart phosphor-ipmi-host.service
15}
16
17do_smpmpro_upgrade() {
18 I2C_BUS_DEV="1"
19 EEPROM_ADDR="0x50"
20
21 if ! command -v ampere_eeprom_prog;
22 then
23 echo "Bypass SCP firmware update as no ampere_eeprom_prog available"
24 exit
25 fi
26 echo "SECPRO mode: $SECPRO"
27 # Turn off the Host if it is currently ON
28 chassisstate=$(obmcutil chassisstate | awk -F. '{print $NF}')
29 echo "Current Chassis State: $chassisstate"
30 if [ "$chassisstate" == 'On' ];
31 then
32 echo "Turning the Chassis off"
33 obmcutil chassisoff
34 sleep 15
35 # Check if HOST was OFF
36 chassisstate_off=$(obmcutil chassisstate | awk -F. '{print $NF}')
37 if [ "$chassisstate_off" == 'On' ];
38 then
39 echo "Error : Failed turning the Chassis off"
40 exit
41 fi
42 fi
43
44 if [[ $SECPRO == 1 ]]; then
45 # 3 is S0_SPECIAL_BOOT
46 gpioset 0 3=1
47 # 66 is S1_SPECIAL_BOOT
48 gpioset 0 66=1
49 fi
50
51 # Switch EEPROM control to BMC AST2500 I2C
52 # 226 is BMC_GPIOAC2_SPI0_PROGRAM_SEL
53 gpioset 0 226=0
54
55 # 08 is BMC_GPIOB0_I2C_BACKUP_SEL
56 if [[ $DEV_SEL == 1 ]]; then
57 echo "Run update primary Boot EEPROM"
58 gpioset 0 8=1 # Main EEPROM
59 elif [[ $DEV_SEL == 2 ]]; then
60 echo "Run update secondary Boot EEPROM"
61 gpioset 0 8=0 # Second EEPROM
62 else
63 echo "Please choose Main (1) or Second EEPROM (2)"
64 exit 0
65 fi
66
67 # Write Firmware to EEPROM and read back for validation
68 ampere_eeprom_prog -b $I2C_BUS_DEV -s $EEPROM_ADDR -p -f "$IMAGE"
69
70 # Switch EEPROM control to Host
71 # 08 is BMC_GPIOB0_I2C_BACKUP_SEL
72 gpioset 0 8=1
73 # 226 is BMC_GPIOAC2_SPI0_PROGRAM_SEL
74 gpioset 0 226=1
75
76 if [ "$chassisstate" == 'On' ];
77 then
78 sleep 5
79 echo "Turn on the Host"
80 obmcutil poweron
81 fi
82
83 # Deassert SECPRO GPIO PINs
84 if [[ $SECPRO == 1 ]]; then
85 chassisstate=$(obmcutil chassisstate | awk -F. '{print $NF}')
86 if [ "$chassisstate_off" == 'Off' ]; then
87 obmcutil poweron
88 fi
89
90 sleep 30s
91 echo "De-asserting special GPIO PINs"
92 # 3 is S0_SPECIAL_BOOT
93 gpioset 0 3=0
94 # 66 is S1_SPECIAL_BOOT
95 gpioset 0 66=0
96 fi
97}
98
99
100if [ $# -eq 0 ]; then
101 echo "Usage:"
102 echo " $(basename "$0") <Type> <Image file> <DEV_SEL> [SECPRO]"
103 echo "Where:"
104 echo " <Type>: smpmpro or fru"
105 echo " If Type is smpmpro, then DEV_SEL must is 1 (MAIN EEPROM), 2 (Failover)"
106 echo " SECPRO: Optional, input '1' to enter & flash secpro mode. Default: 0"
107 exit 0
108fi
109
110TYPE=$1
111IMAGE=$2
112if [ -z "$3" ]
113then
114 DEV_SEL="1" # by default, select Main image
115else
116 DEV_SEL=$3
117fi
118
119SECPRO=0
120if [ -n "$4" ]; then
121 if [[ "$4" == "1" ]]; then
122 SECPRO=1
123 fi
124fi
125
126MANIFEST="$(echo "$IMAGE" | cut -d'/' -f-4)/MANIFEST"
127if [ -f "$MANIFEST" ]; then
128 echo "MANIFEST: $MANIFEST"
129 if grep -qF "SECPRO" "$MANIFEST"; then
130 SECPRO=1
131 fi
132fi
133
134# Restrict to flash failover in case of SECPRO
135if [ $SECPRO == 1 ] && [ "$DEV_SEL" == 2 ]; then
136 echo "Not allow to flash the failover with SECPRO image"
137 exit
138fi
139
140if [[ $TYPE == "smpmpro" ]]; then
141 do_smpmpro_upgrade
142elif [[ $TYPE == "fru" ]]; then
143 do_fru_upgrade
144fi