#!/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 for fname in $(find ${KERNEL_SYSFS_FIU} -type l) do if [ "${fname##*\.}" == "fiu" ] then KERNEL_FIU_ID="c0000000.fiu" break fi done 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 flashcp -v $IMAGE_FILE /dev/"${bios_mtd}" if [ $? -eq 0 ]; then echo "bios update successfully..." else echo "bios update failed..." exit 1 fi } # Exit without running main() if sourced return 0 2>/dev/null main "$@"