#!/bin/bash # Copyright 2020 Google LLC # Copyright 2020 Quanta Computer Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Global variables # GPIO to control the host SPI mux SPI_SW_SELECT=169 # Kernel control string for bind/unbind KERNEL_FIU_ID="c0000000.spi" # Kernel sysfs path for bind/unbind KERNEL_SYSFS_FIU="/sys/bus/platform/drivers/NPCM-FIU" # the node of FIU is spi for kernel 5.10, but # for less than or equal kernel 5.4, the node # is fiu if ls "$KERNEL_SYSFS_FIU"/*.fiu 1> /dev/null 2>&1; then KERNEL_FIU_ID="c0000000.fiu" fi IMAGE_FILE="/tmp/image-bios" # Taken from /run/initramfs/update # Given label name, return mtd node. e.g. `findmtd bmc` returns 'mtd0' findmtd() { m=$(grep -xl "$1" /sys/class/mtd/*/name) m=${m%/name} m=${m##*/} echo "$m" } cleanup() { if [ -d "${KERNEL_SYSFS_FIU}/${KERNEL_FIU_ID}" ]; then echo "${KERNEL_FIU_ID}" > "${KERNEL_SYSFS_FIU}"/unbind fi echo low > /sys/class/gpio/gpio${SPI_SW_SELECT}/direction # Switch mux to host rm -f ${IMAGE_FILE} } trap cleanup EXIT SIGHUP SIGINT SIGTERM main() { if [ ! -f ${IMAGE_FILE} ]; then echo "Invalid bios image file!" exit 1 fi echo "Starting bios update..." if [ ! -d "/sys/class/gpio/gpio${SPI_SW_SELECT}" ]; then echo "${SPI_SW_SELECT}" > /sys/class/gpio/export fi echo high > /sys/class/gpio/gpio${SPI_SW_SELECT}/direction # Switch mux to BMC if [ -d "${KERNEL_SYSFS_FIU}/${KERNEL_FIU_ID}" ]; then echo "${KERNEL_FIU_ID}" > "${KERNEL_SYSFS_FIU}"/unbind fi echo "${KERNEL_FIU_ID}" > "${KERNEL_SYSFS_FIU}"/bind # BIOS flash is labelled 'bios-primary' bios_mtd=$(findmtd bios-primary) if [ -z "${bios_mtd}" ]; then echo "Cannot find bios flash mtd partition!" exit 1 fi if flashcp -v $IMAGE_FILE /dev/"${bios_mtd}" ; then echo "bios update successfully..." else echo "bios update failed..." exit 1 fi } # Exit without running main() if sourced if ! (return 0 2>/dev/null); then main "$@" fi