blob: dac6adbd1ec2a07e485b162ae1ca9f3c22f5bebc [file] [log] [blame]
Chanh Nguyenb50fedb2022-10-24 15:29:56 +07001#!/bin/bash
2
3# Helper script to flash FRU and Boot EEPROM devices.
4#
5# Syntax for FRU:
6# ampere_firmware_upgrade.sh fru <image> [<dev>]
7# dev: 1 for MB FRU (default), 2 for BMC FRU.
8#
9# Syntax for EEPROM:
10# ampere_firmware_upgrade.sh eeprom <image> [<dev>]
11# dev: 1 for main Boot EEPROM (default), 2 for secondary Boot EEPROM (if supported)
12#
13# Syntax for Mainboard CPLD:
14# ampere_firmware_upgrade.sh main_cpld <image>
15#
16# Syntax for BMC CPLD:
17# ampere_firmware_upgrade.sh bmc_cpld <image>
18#
19# Syntax for Backplane CPLD:
20# ampere_firmware_upgrade.sh bp_cpld <image> [<target>]
21# target: 1 for Front Backplane 1
22# 2 for Front Backplane 2
23# 3 for Front Backplane 3
24# 4 for Rear Backplane 1
25# 5 for Rear Backplane 2
26#
27
28# shellcheck disable=SC2046
29
30do_eeprom_flash() {
31 FIRMWARE_IMAGE=$IMAGE
32 BACKUP_SEL=$2
33
34 # Turn off the Host if it is currently ON
35 chassisstate=$(obmcutil chassisstate | awk -F. '{print $NF}')
36 echo "Current Chassis State: $chassisstate"
37 if [ "$chassisstate" == 'On' ];
38 then
39 echo "Turning the Chassis off"
40 obmcutil chassisoff
41 sleep 15
42 # Check if HOST was OFF
43 chassisstate_off=$(obmcutil chassisstate | awk -F. '{print $NF}')
44 if [ "$chassisstate_off" == 'On' ];
45 then
46 echo "Error : Failed turning the Chassis off"
47 exit 1
48 fi
49 fi
50
51 # Switch EEPROM control to BMC AST2600 I2C
52 # BMC_GPIOW6_SPI0_PROGRAM_SEL
53 gpioset $(gpiofind spi0-program-sel)=1
54
55 # BMC_GPIOX0_I2C_BACKUP_SEL (GPIO 184)
56 if [[ $BACKUP_SEL == 1 ]]; then
57 echo "Run update Primary EEPROM"
58 gpioset $(gpiofind i2c-backup-sel)=0
59 elif [[ $BACKUP_SEL == 2 ]]; then
60 echo "Run update Failover EEPROM"
61 gpioset $(gpiofind i2c-backup-sel)=1
62 else
63 echo "Please choose Primary EEPROM (1) or Failover EEPROM (2)"
64 exit 0
65 fi
66
67 # The EEPROM (AT24C64WI) with address 0x50 at BMC_I2C11 bus
68 # Write Firmware to EEPROM and read back for validation
69 ampere_eeprom_prog -b 10 -s 0x50 -p -f "$FIRMWARE_IMAGE"
70
71 # Switch to primary EEPROM
72 gpioset $(gpiofind i2c-backup-sel)=0
73
74 # Switch EEPROM control to CPU HOST
75 gpioset $(gpiofind spi0-program-sel)=0
76
77 if [ "$chassisstate" == 'On' ];
78 then
79 sleep 5
80 echo "Turn on the Host"
81 obmcutil poweron
82 fi
83}
84
85do_fru_flash() {
86 FRU_IMAGE=$1
87 FRU_DEV=$2
88
89 if [[ $FRU_DEV == 1 ]]; then
90 if [ -f /sys/bus/i2c/devices/4-0050/eeprom ]; then
91 FRU_DEVICE="/sys/bus/i2c/devices/4-0050/eeprom"
92 else
93 FRU_DEVICE="/sys/bus/i2c/devices/3-0050/eeprom"
94 fi
95 echo "Flash MB FRU with image $IMAGE at $FRU_DEVICE"
96 elif [[ $FRU_DEV == 2 ]]; then
97 FRU_DEVICE="/sys/bus/i2c/devices/14-0050/eeprom"
98 echo "Flash BMC FRU with image $IMAGE at $FRU_DEVICE"
99 else
100 echo "Please select MB FRU (1) or BMC FRU (2)"
101 exit 0
102 fi
103
104 ampere_fru_upgrade -d "$FRU_DEVICE" -f "$FRU_IMAGE"
105
106 systemctl restart xyz.openbmc_project.FruDevice.service
Chanh Nguyenb50fedb2022-10-24 15:29:56 +0700107
108 echo "Done"
109}
110
111do_mb_cpld_flash() {
112 MB_CPLD_IMAGE=$1
113 echo "Flashing MB CPLD"
114 gpioset $(gpiofind hpm-fw-recovery)=1
115 gpioset $(gpiofind jtag-program-sel)=1
116 sleep 2
Thang Q. Nguyene4f1b9c2024-01-26 14:22:37 +0700117 ampere_cpldupdate_jtag -p "$MB_CPLD_IMAGE"
Chanh Nguyenb50fedb2022-10-24 15:29:56 +0700118 gpioset $(gpiofind hpm-fw-recovery)=0
119 echo "Done"
120}
121
122do_bmc_cpld_flash() {
123 BMC_CPLD_IMAGE=$1
124 echo "Flashing BMC CPLD"
125 gpioset $(gpiofind jtag-program-sel)=0
126 sleep 2
Thang Q. Nguyene4f1b9c2024-01-26 14:22:37 +0700127 ampere_cpldupdate_jtag -p "$BMC_CPLD_IMAGE"
Chanh Nguyenb50fedb2022-10-24 15:29:56 +0700128 echo "Done"
129}
130
131do_bp_cpld_flash() {
132 BP_CPLD_IMAGE=$1
133 BP_TARGET=$2
134 if [[ $BP_TARGET == 1 ]]; then
135 echo "Flashing Front Backplane 1 CPLD"
Thang Q. Nguyene4f1b9c2024-01-26 14:22:37 +0700136 ampere_cpldupdate_i2c -b 101 -s 0x40 -p "$BP_CPLD_IMAGE"
Chanh Nguyenb50fedb2022-10-24 15:29:56 +0700137 elif [[ $BP_TARGET == 2 ]]; then
138 echo "Flashing Front Backplane 2 CPLD"
Thang Q. Nguyene4f1b9c2024-01-26 14:22:37 +0700139 ampere_cpldupdate_i2c -b 102 -s 0x40 -p "$BP_CPLD_IMAGE"
Chanh Nguyenb50fedb2022-10-24 15:29:56 +0700140 elif [[ $BP_TARGET == 3 ]]; then
141 echo "Flashing Front Backplane 3 CPLD"
Thang Q. Nguyene4f1b9c2024-01-26 14:22:37 +0700142 ampere_cpldupdate_i2c -b 100 -s 0x40 -p "$BP_CPLD_IMAGE"
Chanh Nguyenb50fedb2022-10-24 15:29:56 +0700143 elif [[ $BP_TARGET == 4 ]]; then
144 echo "Flashing Rear Backplane 1 CPLD"
Thang Q. Nguyene4f1b9c2024-01-26 14:22:37 +0700145 ampere_cpldupdate_i2c -b 103 -s 0x40 -p "$BP_CPLD_IMAGE"
Chanh Nguyenb50fedb2022-10-24 15:29:56 +0700146 elif [[ $BP_TARGET == 5 ]]; then
147 echo "Flashing Rear Backplane 2 CPLD"
Thang Q. Nguyene4f1b9c2024-01-26 14:22:37 +0700148 ampere_cpldupdate_i2c -b 104 -s 0x40 -p "$BP_CPLD_IMAGE"
Chanh Nguyenb50fedb2022-10-24 15:29:56 +0700149 fi
150
151 echo "Done"
152}
153
154if [ $# -eq 0 ]; then
155 echo "Usage:"
156 echo " - Flash Boot EEPROM"
157 echo " $(basename "$0") eeprom <Image file>"
158 echo " - Flash FRU"
159 echo " $(basename "$0") fru <Image file> [dev]"
160 echo " Where:"
161 echo " dev: 1 - MB FRU, 2 - BMC FRU"
162 echo " - Flash Mainboard CPLD"
163 echo " $(basename "$0") mb_cpld <Image file>"
164 echo " - Flash BMC CPLD (only for DC-SCM BMC board)"
165 echo " $(basename "$0") bmc_cpld <Image file>"
166 echo " - Flash Backplane CPLD"
167 echo " $(basename "$0") bp_cpld <Image file> <Target> "
168 echo " Where:"
169 echo " Target: 1 - FrontBP1, 2 - FrontBP2, 3 - FrontBP3"
170 echo " 4 - RearBP1, 5 - RearBP2"
171 exit 0
172fi
173
174TYPE=$1
175IMAGE=$2
176TARGET=$3
177if [ -z "$3" ]; then
178 BACKUP_SEL=1
179else
180 BACKUP_SEL=$3
181fi
182
183if [[ $TYPE == "eeprom" ]]; then
184 # Run EEPROM update: write/read/validation with CRC32 checksum
185 do_eeprom_flash "$IMAGE" "$BACKUP_SEL"
186elif [[ $TYPE == "fru" ]]; then
187 # Run FRU update
188 do_fru_flash "$IMAGE" "$BACKUP_SEL"
189elif [[ $TYPE == "mb_cpld" ]]; then
190 # Run Mainboard CPLD update
191 do_mb_cpld_flash "$IMAGE"
192elif [[ $TYPE == "bmc_cpld" ]]; then
193 # Run CPLD BMC update
194 do_bmc_cpld_flash "$IMAGE"
195elif [[ $TYPE == "bp_cpld" ]]; then
196 # Run Backplane CPLD update
197 do_bp_cpld_flash "$IMAGE" "$TARGET"
198fi
199
200exit 0