blob: 32a595f5b15977696af7c3f5c2bad048c37cf9ed [file] [log] [blame]
#!/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