blob: 401b5bc9c800436abcd3d14e80991ed2bb30ad01 [file] [log] [blame]
Grant Williamsa8c0af02022-04-29 12:03:41 -05001#!/bin/bash
2
3# Provide source directive to shellcheck.
4# shellcheck source=meta-fii/meta-mori/recipes-mori/mori-fw-utility/mori-fw/mori-lib.sh
5# Disable check for globbing and word splitting within double quotes
6# shellcheck disable=SC2086
7source /usr/libexec/mori-fw/mori-lib.sh
8
9function fwbios() {
10 KERNEL_FIU_ID="c0000000.spi"
11 KERNEL_SYSFS_FIU="/sys/bus/platform/drivers/NPCM-FIU"
12
13 # switch the SPI mux from Host to BMC
14 set_gpio_ctrl FM_BIOS_FLASH_SPI_MUX_R_SEL 1
15
16 # rescan the spi bus
17 if [ -d "${KERNEL_SYSFS_FIU}/${KERNEL_FIU_ID}" ]; then
18 echo "${KERNEL_FIU_ID}" > "${KERNEL_SYSFS_FIU}"/unbind
19 sleep 1
20 fi
21 echo "${KERNEL_FIU_ID}" > "${KERNEL_SYSFS_FIU}"/bind
22
23 # write to the mtd device
24 BIOS_MTD=$(grep "bios" /proc/mtd | sed -n 's/^\(.*\):.*/\1/p')
25
26 if [ ! -f "$1" ]; then
27 echo " Cannot find the" "$1" "image file"
28 return 1
29
30 fi
31 echo "Flashing BIOS @/dev/${BIOS_MTD}"
32 if [ "$(flashcp -v $1 /dev/${BIOS_MTD})" -ne 0 ]; then
33 echo "Flashing the bios failed " >&2
34 return 1
35 fi
36 wait
37
38 # switch the SPI mux from BMC to Host
39 if [ -d "${KERNEL_SYSFS_FIU}/${KERNEL_FIU_ID}" ]; then
40 echo "${KERNEL_FIU_ID}" > "${KERNEL_SYSFS_FIU}"/unbind
41 fi
42 set_gpio_ctrl FM_BIOS_FLASH_SPI_MUX_R_SEL 0
43
44 return 0
45}
46
47function fwbmccpld() {
48 # MB_JTAG_MUX 0:CPU 1:MB
49 # BMC_JTAG_MUX 0:GF/MB 1:BMC
50 set_gpio_ctrl MB_JTAG_MUX_SEL 0
51 set_gpio_ctrl BMC_JTAG_MUX_SEL 1
52 if [ "$(loadsvf -d /dev/jtag0 -s $1 -m 0)" -ne 0 ]; then
53 echo "BMC CPLD update failed" >&2
54 return 1
55 fi
56 wait
57
58 return 0
59}
60
61function fwmbcpld() {
62 # MB_JTAG_MUX 0:CPU 1:MB
63 # BMC_JTAG_MUX 0:GF/MB 1:BMC
64 set_gpio_ctrl MB_JTAG_MUX_SEL 1
65 set_gpio_ctrl BMC_JTAG_MUX_SEL 0
66 if [ "$(loadsvf -d /dev/jtag0 -s $1 -m 0)" -ne 0 ]; then
67 echo "Mobo CPLD update failed" >&2
68 return 1
69 fi
70 wait
71 set_gpio_ctrl MB_JTAG_MUX_SEL 0
72
73 return 0
74}
75
76function fwbootstrap() {
77 # to flash the CPU EEPROM
78 #unbind bootstrap EEPROM
79 echo ${I2C_CPU_EEPROM[0]}-00${I2C_CPU_EEPROM[1]} > /sys/bus/i2c/drivers/at24/unbind
80
81 #switch access to BMC
82 set_gpio_ctrl CPU_EEPROM_SEL 0
83
84 if [ "$(ampere_eeprom_prog -b ${I2C_CPU_EEPROM[0]} -s 0x${I2C_CPU_EEPROM[1]} -p -f $1)" -ne 0 ]; then
85 echo "CPU bootstrap EEPROM update failed" >&2
86 return 1
87 fi
88 wait
89
90 #bind bootstrap EEPROM
91 echo ${I2C_CPU_EEPROM[0]}-00${I2C_CPU_EEPROM[1]} > /sys/bus/i2c/drivers/at24/bind
92
93 #switch back access to CPU
94 set_gpio_ctrl CPU_EEPROM_SEL 1
95 return 0
96
97}
98
99function fwmb_pwr_seq(){
100 #$1 PS seq config file
101 if [[ ! -e "$1" ]]; then
102 echo "The file $1 does not exist"
103 return 1
104 fi
105 echo "${I2C_MB_PWRSEQ[0]}"-00"${I2C_MB_PWRSEQ[1]}" > /sys/bus/i2c/drivers/adm1266/unbind
106 if [ "$(adm1266_fw_fx $1)" -ne 0 ]; then
107
108 echo "The power seq flash failed" >&2
109 return 1
110 fi
111 echo "${I2C_MB_PWRSEQ[0]}"-00"${I2C_MB_PWRSEQ[1]}" > /sys/bus/i2c/drivers/adm1266/bind
112
113 return 0
114}
115
116if [[ ! $(which flashcp) ]]; then
117 echo "flashcp utility not installed"
118 exit 1
119fi
120if [[ ! $(which loadsvf) ]]; then
121 echo "loadsvf utility not installed"
122 exit 1
123fi
124if [[ ! -e /dev/jtag0 ]]; then
125 echo "Jtag device driver not functional"
126 exit 1
127fi
128
129case $1 in
130 bios)
131 fwbios "$2"
132 ;;
133 bmccpld)
134 fwbmccpld "$2"
135 ;;
136 mbcpld)
137 fwmbcpld "$2"
138 ;;
139 bootstrap)
140 fwbootstrap "$2"
141 ;;
142 mbseq)
143 fwmb_pwr_seq "$2"
144 ;;
145 *)
146 ;;
147esac
148ret=$?
149
150rm -f "$2"
151
152exit $ret