summaryrefslogtreecommitdiff
path: root/meta-ampere/meta-jade/recipes-ampere/flash/ampere-flash-utils/ampere_firmware_upgrade.sh
blob: 130682d12a89d561d8b55578a802efae54ba71bf (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
144
#!/bin/bash

do_fru_upgrade() {
	FRU_DEVICE="/sys/bus/i2c/devices/3-0050/eeprom"

	if ! command -v ampere_fru_upgrade;
	then
		echo "Bypass fru update as no ampere_fru_upgrade available"
		exit
	fi
	ampere_fru_upgrade -d $FRU_DEVICE -f "$IMAGE"

	systemctl restart xyz.openbmc_project.FruDevice.service
	systemctl restart phosphor-ipmi-host.service
}

do_smpmpro_upgrade() {
	I2C_BUS_DEV="1"
	EEPROM_ADDR="0x50"

	if ! command -v ampere_eeprom_prog;
	then
		echo "Bypass SCP firmware update as no ampere_eeprom_prog available"
		exit
	fi
	echo "SECPRO mode: $SECPRO"
	# Turn off the Host if it is currently ON
	chassisstate=$(obmcutil chassisstate | awk -F. '{print $NF}')
	echo "Current Chassis State: $chassisstate"
	if [ "$chassisstate" == 'On' ];
	then
		echo "Turning the Chassis off"
		obmcutil chassisoff
		sleep 15
		# Check if HOST was OFF
		chassisstate_off=$(obmcutil chassisstate | awk -F. '{print $NF}')
		if [ "$chassisstate_off" == 'On' ];
		then
			echo "Error : Failed turning the Chassis off"
			exit
		fi
	fi

	if [[ $SECPRO == 1 ]]; then
		# 3 is S0_SPECIAL_BOOT
		gpioset 0 3=1
		# 66 is S1_SPECIAL_BOOT
		gpioset 0 66=1
	fi

	# Switch EEPROM control to BMC AST2500 I2C
	# 226 is BMC_GPIOAC2_SPI0_PROGRAM_SEL
	gpioset 0 226=0

	# 08 is BMC_GPIOB0_I2C_BACKUP_SEL
	if [[ $DEV_SEL == 1 ]]; then
		echo "Run update primary Boot EEPROM"
		gpioset 0 8=1       # Main EEPROM
	elif [[ $DEV_SEL == 2 ]]; then
		echo "Run update secondary Boot EEPROM"
		gpioset 0 8=0       # Second EEPROM
	else
		echo "Please choose Main (1) or Second EEPROM (2)"
		exit 0
	fi

	# Write Firmware to EEPROM and read back for validation
	ampere_eeprom_prog -b $I2C_BUS_DEV -s $EEPROM_ADDR -p -f "$IMAGE"

	# Switch EEPROM control to Host
	# 08 is BMC_GPIOB0_I2C_BACKUP_SEL
	gpioset 0 8=1
	# 226 is BMC_GPIOAC2_SPI0_PROGRAM_SEL
	gpioset 0 226=1

	if [ "$chassisstate" == 'On' ];
	then
		sleep 5
		echo "Turn on the Host"
		obmcutil poweron
	fi

	# Deassert SECPRO GPIO PINs
	if [[ $SECPRO == 1 ]]; then
		chassisstate=$(obmcutil chassisstate | awk -F. '{print $NF}')
		if [ "$chassisstate_off" == 'Off' ]; then
			obmcutil poweron
		fi

		sleep 30s
		echo "De-asserting special GPIO PINs"
		# 3 is S0_SPECIAL_BOOT
		gpioset 0 3=0
		# 66 is S1_SPECIAL_BOOT
		gpioset 0 66=0
	fi
}


if [ $# -eq 0 ]; then
	echo "Usage:"
	echo "      $(basename "$0") <Type> <Image file> <DEV_SEL> [SECPRO]"
	echo "Where:"
	echo "    <Type>: smpmpro or fru"
	echo "            If Type is smpmpro, then DEV_SEL must is 1 (MAIN EEPROM), 2 (Failover)"
	echo "    SECPRO: Optional, input '1' to enter & flash secpro mode. Default: 0"
	exit 0
fi

TYPE=$1
IMAGE=$2
if [ -z "$3" ]
then
	DEV_SEL="1"    # by default, select Main image
else
	DEV_SEL=$3
fi

SECPRO=0
if [ -n "$4" ]; then
	if [[ "$4" == "1" ]]; then
		SECPRO=1
	fi
fi

MANIFEST="$(echo "$IMAGE" | cut -d'/' -f-4)/MANIFEST"
if [ -f "$MANIFEST" ]; then
	echo "MANIFEST: $MANIFEST"
	if grep -qF "SECPRO" "$MANIFEST"; then
		SECPRO=1
	fi
fi

# Restrict to flash failover in case of SECPRO
if [ $SECPRO == 1 ] && [ "$DEV_SEL" == 2 ]; then
	echo "Not allow to flash the failover with SECPRO image"
	exit
fi

if [[ $TYPE == "smpmpro" ]]; then
	do_smpmpro_upgrade
elif [[ $TYPE == "fru" ]]; then
	do_fru_upgrade
fi