From e96820d5379bf9ca80ace325f9a1ec9e51cc3c66 Mon Sep 17 00:00:00 2001 From: "Thang Q. Nguyen" Date: Fri, 17 Dec 2021 02:24:24 +0000 Subject: meta-ampere: mtjade: Add more Host firmware support Add support SCP firmware update with checking if the ampere_fru_upgrade available to execute the update. This commit also supports 2nd Host SPI-NOR update ability. Tested: 1. Manually copy ampere_fru_upgrade to the /usr/sbin folder and run SCP firmware update via Redfish. 2. Flash UEFI firmware update on the secondary Host SPI-NOR. Signed-off-by: Thang Q. Nguyen Change-Id: Ic335ee2d21625239c3df1937ed5333708233845b --- .../0001-flashcp-support-offset-option.patch | 141 -------------------- .../recipes-devtools/mtd/mtd-utils_%.bbappend | 3 - meta-ampere/meta-jade/conf/machine/mtjade.conf | 1 - .../recipes-ampere/flash/ampere-flash-utils.bb | 2 + .../ampere-flash-utils/ampere_firmware_upgrade.sh | 144 +++++++++++++++++++++ .../flash/ampere-flash-utils/ampere_flash_bios.sh | 31 ++++- 6 files changed, 170 insertions(+), 152 deletions(-) delete mode 100644 meta-ampere/meta-common/recipes-devtools/mtd/mtd-utils/0001-flashcp-support-offset-option.patch delete mode 100644 meta-ampere/meta-common/recipes-devtools/mtd/mtd-utils_%.bbappend create mode 100755 meta-ampere/meta-jade/recipes-ampere/flash/ampere-flash-utils/ampere_firmware_upgrade.sh diff --git a/meta-ampere/meta-common/recipes-devtools/mtd/mtd-utils/0001-flashcp-support-offset-option.patch b/meta-ampere/meta-common/recipes-devtools/mtd/mtd-utils/0001-flashcp-support-offset-option.patch deleted file mode 100644 index 0edae05f8..000000000 --- a/meta-ampere/meta-common/recipes-devtools/mtd/mtd-utils/0001-flashcp-support-offset-option.patch +++ /dev/null @@ -1,141 +0,0 @@ -From 32c17dd886a5b506781b86c6227bb059ce33420b Mon Sep 17 00:00:00 2001 -From: Tung Nguyen -Date: Sun, 5 Sep 2021 09:22:08 +0000 -Subject: [PATCH] flashcp support offset option - -The flashcp command from mtd-utils just support to flash from offset 0. -Add offset option to specify the start offset so that firmware can be -flashed correctly - -Signed-off-by: Tung Nguyen ---- - misc-utils/flashcp.c | 50 +++++++++++++++++++++++++++++++++++++++++--- - 1 file changed, 47 insertions(+), 3 deletions(-) - -diff --git a/misc-utils/flashcp.c b/misc-utils/flashcp.c -index 341c210..0a0e75b 100644 ---- a/misc-utils/flashcp.c -+++ b/misc-utils/flashcp.c -@@ -91,7 +91,7 @@ static NORETURN void showusage(bool error) - "\n" - "Flash Copy - Written by Abraham van der Merwe \n" - "\n" -- "usage: %1$s [ -v | --verbose | -A | --erase-all ] \n" -+ "usage: %1$s [ -v | --verbose | -A | --erase-all ] \n" - " %1$s -h | --help\n" - " %1$s -V | --version\n" - "\n" -@@ -102,6 +102,7 @@ static NORETURN void showusage(bool error) - " -V | --version Show version information and exit\n" - " File which you want to copy to flash\n" - " Flash device to write to (e.g. /dev/mtd0, /dev/mtd1, etc.)\n" -+ " The start offset. Optional, default: 0\n" - "\n", - PROGRAM_NAME); - -@@ -156,6 +157,16 @@ static void safe_rewind (int fd,const char *filename) - } - } - -+static int safe_rewind_offset(int fd, const char *filename, off_t offset) -+{ -+ if (lseek(fd, offset, SEEK_SET) < 0) { -+ log_printf(LOG_ERROR, "While seeking to start of %s: %m\n", filename); -+ return EXIT_FAILURE; -+ } -+ -+ return EXIT_SUCCESS; -+} -+ - /******************************************************************************/ - - static int dev_fd = -1,fil_fd = -1; -@@ -169,6 +180,8 @@ static void cleanup (void) - int main (int argc,char *argv[]) - { - const char *filename = NULL,*device = NULL; -+ off_t offset; -+ - int i,flags = FLAG_NONE; - ssize_t result; - size_t size,written; -@@ -225,6 +238,20 @@ int main (int argc,char *argv[]) - showusage(true); - } - } -+ -+ if (optind + 3 == argc) { -+ flags |= FLAG_FILENAME; -+ filename = argv[optind]; -+ DEBUG("Got filename: %s\n", filename); -+ -+ flags |= FLAG_DEVICE; -+ device = argv[optind + 1]; -+ DEBUG("Got device: %s\n", device); -+ -+ offset = strtoul(argv[optind + 2], NULL, 16); -+ DEBUG("Got offset: 0x%x\n", offset); -+ } -+ - if (optind+2 == argc) { - flags |= FLAG_FILENAME; - filename = argv[optind]; -@@ -233,6 +260,8 @@ int main (int argc,char *argv[]) - flags |= FLAG_DEVICE; - device = argv[optind+1]; - DEBUG("Got device: %s\n",device); -+ -+ offset = 0; - } - - if (flags & FLAG_HELP || device == NULL) -@@ -264,6 +293,12 @@ int main (int argc,char *argv[]) - exit (EXIT_FAILURE); - } - -+ /* does offset is out of the mtd */ -+ if (offset > mtd.size) { -+ log_printf(LOG_ERROR, "%s offset won't fit into %s!\n", offset, device); -+ exit(EXIT_FAILURE); -+ } -+ - /* diff block flashcp */ - if (flags & FLAG_PARTITION) - { -@@ -284,6 +319,8 @@ int main (int argc,char *argv[]) - } - else - { -+ /* Erase from the offset */ -+ erase.start = offset; - erase.length = (filestat.st_size + mtd.erasesize - 1) / mtd.erasesize; - erase.length *= mtd.erasesize; - } -@@ -330,6 +367,12 @@ int main (int argc,char *argv[]) - size = filestat.st_size; - i = BUFSIZE; - written = 0; -+ -+ /* if offset is greater than 0 */ -+ if (offset) -+ if (safe_rewind_offset(dev_fd, device, offset) != EXIT_SUCCESS) -+ return EXIT_FAILURE; -+ - while (size) - { - if (size < BUFSIZE) i = size; -@@ -374,8 +417,9 @@ int main (int argc,char *argv[]) - * verify that flash == file data * - **********************************/ - -- safe_rewind (fil_fd,filename); -- safe_rewind (dev_fd,device); -+ safe_rewind(fil_fd, filename); -+ safe_rewind_offset(dev_fd, device, offset); -+ - size = filestat.st_size; - i = BUFSIZE; - written = 0; --- -2.25.1 - diff --git a/meta-ampere/meta-common/recipes-devtools/mtd/mtd-utils_%.bbappend b/meta-ampere/meta-common/recipes-devtools/mtd/mtd-utils_%.bbappend deleted file mode 100644 index 6f3e20319..000000000 --- a/meta-ampere/meta-common/recipes-devtools/mtd/mtd-utils_%.bbappend +++ /dev/null @@ -1,3 +0,0 @@ -FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" - -SRC_URI += "file://0001-flashcp-support-offset-option.patch " diff --git a/meta-ampere/meta-jade/conf/machine/mtjade.conf b/meta-ampere/meta-jade/conf/machine/mtjade.conf index 633efa012..ede176ad0 100644 --- a/meta-ampere/meta-jade/conf/machine/mtjade.conf +++ b/meta-ampere/meta-jade/conf/machine/mtjade.conf @@ -32,7 +32,6 @@ OBMC_IMAGE_EXTRA_INSTALL:append = "\ ampere-flash-utils \ ampere-mac-update \ mtjade-gpio-config \ - mtd-utils \ ampere-platform-init \ ampere-ipmi-oem \ " diff --git a/meta-ampere/meta-jade/recipes-ampere/flash/ampere-flash-utils.bb b/meta-ampere/meta-jade/recipes-ampere/flash/ampere-flash-utils.bb index 241070c4e..844709b91 100644 --- a/meta-ampere/meta-jade/recipes-ampere/flash/ampere-flash-utils.bb +++ b/meta-ampere/meta-jade/recipes-ampere/flash/ampere-flash-utils.bb @@ -9,6 +9,7 @@ RDEPENDS:${PN} = "bash" DEPENDS = "zlib" SRC_URI += "\ + file://ampere_firmware_upgrade.sh \ file://ampere_flash_bios.sh \ " @@ -19,5 +20,6 @@ LDFLAGS += "-L ${ROOT}/usr/lib/ -lz " do_install:append() { install -d ${D}/usr/sbin + install -m 0755 ${WORKDIR}/ampere_firmware_upgrade.sh ${D}/${sbindir}/ampere_firmware_upgrade.sh install -m 0755 ${S}/ampere_flash_bios.sh ${D}/${sbindir}/ampere_flash_bios.sh } diff --git a/meta-ampere/meta-jade/recipes-ampere/flash/ampere-flash-utils/ampere_firmware_upgrade.sh b/meta-ampere/meta-jade/recipes-ampere/flash/ampere-flash-utils/ampere_firmware_upgrade.sh new file mode 100755 index 000000000..130682d12 --- /dev/null +++ b/meta-ampere/meta-jade/recipes-ampere/flash/ampere-flash-utils/ampere_firmware_upgrade.sh @@ -0,0 +1,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") [SECPRO]" + echo "Where:" + echo " : 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 diff --git a/meta-ampere/meta-jade/recipes-ampere/flash/ampere-flash-utils/ampere_flash_bios.sh b/meta-ampere/meta-jade/recipes-ampere/flash/ampere-flash-utils/ampere_flash_bios.sh index b7f4bc52e..b13e4b50a 100755 --- a/meta-ampere/meta-jade/recipes-ampere/flash/ampere-flash-utils/ampere_flash_bios.sh +++ b/meta-ampere/meta-jade/recipes-ampere/flash/ampere-flash-utils/ampere_flash_bios.sh @@ -15,10 +15,8 @@ # limitations under the License. do_flash () { - OFFSET=$1 - # Check the PNOR partition available - HOST_MTD=$(< /proc/mtd grep "pnor" | sed -n 's/^\(.*\):.*/\1/p') + HOST_MTD=$(< /proc/mtd grep "pnor-uefi" | sed -n 's/^\(.*\):.*/\1/p') if [ -z "$HOST_MTD" ]; then # If the PNOR partition is not available, then bind again driver @@ -26,7 +24,7 @@ do_flash () { echo 1e630000.spi > /sys/bus/platform/drivers/aspeed-smc/bind sleep 2 - HOST_MTD=$(< /proc/mtd grep "pnor" | sed -n 's/^\(.*\):.*/\1/p') + HOST_MTD=$(< /proc/mtd grep "pnor-uefi" | sed -n 's/^\(.*\):.*/\1/p') if [ -z "$HOST_MTD" ]; then echo "Fail to probe Host SPI-NOR device" @@ -34,8 +32,8 @@ do_flash () { fi fi - echo "--- Flashing firmware to @/dev/$HOST_MTD offset=$OFFSET" - flashcp -v "$IMAGE" /dev/"$HOST_MTD" "$OFFSET" + echo "--- Flashing firmware to @/dev/$HOST_MTD" + flashcp -v "$IMAGE" /dev/"$HOST_MTD" } @@ -50,6 +48,12 @@ if [ ! -f "$IMAGE" ]; then exit 1 fi +if [ -z "$2" ]; then + DEV_SEL="1" # by default, select primary device +else + DEV_SEL="$2" +fi + # Turn off the Host if it is currently ON chassisstate=$(obmcutil chassisstate | awk -F. '{print $NF}') echo "--- Current Chassis State: $chassisstate" @@ -74,8 +78,21 @@ if ! gpioset 0 226=0; then exit 1 fi +# Switch the host SPI bus (between primary and secondary) +# 227 is BMC_SPI0_BACKUP_SEL +if [[ $DEV_SEL == 1 ]]; then + echo "Run update primary Host SPI-NOR" + gpioset 0 227=0 # Primary SPI +elif [[ $DEV_SEL == 2 ]]; then + echo "Run update secondary Host SPI-NOR" + gpioset 0 227=1 # Second SPI +else + echo "Please choose primary SPI (1) or second SPI (2)" + exit 0 +fi + # Flash the firmware -do_flash 0x400000 +do_flash # Switch the host SPI bus to HOST." echo "--- Switch the host SPI bus to HOST." -- cgit v1.2.3