[201911][mellanox] Extend Mellanox FW utils with CPLD update (#12172)

Porting https://github.com/sonic-net/sonic-buildimage/pull/3723 to 201911

#### Why I did it
Extend Mellanox FW utils with CPLD update feature
Added support for CPLD upgrade to Mellanox FW utility


#### How I did it
Updated Mellanox FW utility

#### How to verify it
mlnx-fw-upgrade.sh --upgrade --cpld # Regular CPLD update flow
UPDATE_MLNX_CPLD_FW=1 mlnx-fw-upgrade.sh --upgrade # Force CPLD refresh only

#### Ensure to add label/tag for the feature raised. example - [PR#2174](https://github.com/sonic-net/sonic-utilities/pull/2174) where, Generic Config and Update feature has been labelled as GCU.
This commit is contained in:
Sudharsan Dhamal Gopalarathnam 2022-09-26 09:10:08 -07:00 committed by GitHub
parent e716b453b3
commit 43096c58b6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -40,6 +40,7 @@ declare -rA FW_REQUIRED_MAP=( \
) )
IMAGE_UPGRADE="${NO_PARAM}" IMAGE_UPGRADE="${NO_PARAM}"
CPLD_UPGRADE="${NO_PARAM}"
VERBOSE_LEVEL="${VERBOSE_MIN}" VERBOSE_LEVEL="${VERBOSE_MIN}"
function PrintHelp() { function PrintHelp() {
@ -48,12 +49,14 @@ function PrintHelp() {
echo echo
echo "OPTIONS:" echo "OPTIONS:"
echo " -u, --upgrade Upgrade ASIC firmware using next boot image (useful after SONiC-To-SONiC update)" echo " -u, --upgrade Upgrade ASIC firmware using next boot image (useful after SONiC-To-SONiC update)"
echo " -c, --cpld Upgrade CPLD firmware (requires -u|--upgrade)"
echo " -v, --verbose Verbose mode" echo " -v, --verbose Verbose mode"
echo " -h, --help Print help" echo " -h, --help Print help"
echo echo
echo "Examples:" echo "Examples:"
echo " ./${SCRIPT_NAME} --verbose" echo " ./${SCRIPT_NAME} --verbose"
echo " ./${SCRIPT_NAME} --upgrade" echo " ./${SCRIPT_NAME} --upgrade"
echo " ./${SCRIPT_NAME} --upgrade --cpld --verbose"
echo " ./${SCRIPT_NAME} --help" echo " ./${SCRIPT_NAME} --help"
echo echo
} }
@ -64,6 +67,9 @@ function ParseArguments() {
-u|--upgrade) -u|--upgrade)
IMAGE_UPGRADE="${YES_PARAM}" IMAGE_UPGRADE="${YES_PARAM}"
;; ;;
-c|--cpld)
CPLD_UPGRADE="${YES_PARAM}"
;;
-v|--verbose) -v|--verbose)
VERBOSE_LEVEL="${VERBOSE_MAX}" VERBOSE_LEVEL="${VERBOSE_MAX}"
;; ;;
@ -120,16 +126,44 @@ function ExitSuccess() {
exit "${EXIT_SUCCESS}" exit "${EXIT_SUCCESS}"
} }
function ParseMachineConf() {
ONIE_MACHINE="$(cat /host/machine.conf | grep 'onie_machine=' | cut -f2 -d'=')"
ONIE_PLATFORM="$(cat /host/machine.conf | grep 'onie_platform=' | cut -f2 -d'=')"
}
function ShowProgressBar() {
local -rA SPIN=(
[0]="-"
[1]="\\"
[2]="|"
[3]="/"
)
if [[ "${VERBOSE_LEVEL}" -lt "${VERBOSE_INFO}" ]]; then
sleep 2s
return "${EXIT_SUCCESS}"
fi
# Print progress bar: use carriage return to overwrite command line content
for i in "${SPIN[@]}"; do
echo -ne "\r[${i}] ${1}"
sleep 0.5s
done
# Clear command line content + carriage return
echo -ne "\033[1K\r"
}
function WaitForDevice() { function WaitForDevice() {
local -i QUERY_RETRY_COUNT_MAX="10" local -i QUERY_RETRY_COUNT_MAX="10"
local -i QUERY_RETRY_COUNT="0" local -i QUERY_RETRY_COUNT="0"
${QUERY_CMD} > /dev/null ${QUERY_CMD} &> /dev/null
while [[ ("${QUERY_RETRY_COUNT}" -lt "${QUERY_RETRY_COUNT_MAX}") && ("$?" -ne "${EXIT_SUCCESS}") ]]; do while [[ ("${QUERY_RETRY_COUNT}" -lt "${QUERY_RETRY_COUNT_MAX}") && ("$?" -ne "${EXIT_SUCCESS}") ]]; do
sleep 1s sleep 1s
((QUERY_RETRY_COUNT++)) ((QUERY_RETRY_COUNT++))
${QUERY_CMD} > /dev/null ${QUERY_CMD} &> /dev/null
done done
} }
@ -170,7 +204,7 @@ function RunCmd() {
fi fi
} }
function UpgradeFW() { function UpgradeASICFW() {
local -r _FS_MOUNTPOINT="$1" local -r _FS_MOUNTPOINT="$1"
local -r _ASIC_TYPE="$(GetAsicType)" local -r _ASIC_TYPE="$(GetAsicType)"
@ -209,30 +243,114 @@ function UpgradeFW() {
fi fi
if [[ "${_FW_CURRENT}" == "${_FW_AVAILABLE}" ]]; then if [[ "${_FW_CURRENT}" == "${_FW_AVAILABLE}" ]]; then
ExitSuccess "firmware is up to date" LogInfo "firmware is up to date"
else else
LogNotice "firmware upgrade is required. Installing compatible version..." LogNotice "firmware upgrade is required. Installing compatible version..."
RunCmd "${BURN_CMD} -i ${_FW_FILE}" RunCmd "${BURN_CMD} -i ${_FW_FILE}"
fi fi
} }
function UpgradeFWFromImage() { function UpgradeCPLDFW_Worker() {
local -r _NEXT_SONIC_IMAGE="$(sonic_installer list | grep "Next: " | cut -f2 -d' ')" local -r _CPLD_BURN_FILE="${1}"
local -r _CURRENT_SONIC_IMAGE="$(sonic_installer list | grep "Current: " | cut -f2 -d' ')" local -r _CPLD_REFRESH_FILE="${2}"
local -r _ASIC_DEV="$(find /dev/mst -iname '*_pciconf0')"
local -r _FS_PATH="/host/image-${_NEXT_SONIC_IMAGE#SONiC-OS-}/fs.squashfs" if [[ -f /tmp/cpld_fw_updated ]]; then
local -r _FS_MOUNTPOINT="/tmp/image-${_NEXT_SONIC_IMAGE#SONiC-OS-}-fs" RunCmd "cpldupdate --dev ${_ASIC_DEV} ${_CPLD_REFRESH_FILE}"
return "${EXIT_SUCCESS}"
fi
if [[ "${_CURRENT_SONIC_IMAGE}" == "${_NEXT_SONIC_IMAGE}" ]]; then RunCmd "cpldupdate --dev ${_ASIC_DEV} ${_CPLD_BURN_FILE}"
ExitSuccess "firmware is up to date" RunCmd "cpldupdate --dev ${_ASIC_DEV} ${_CPLD_REFRESH_FILE}"
}
function UpgradeCPLDFW() {
local -r _CPLD_ARCHIVE="$1"
if [[ -f /tmp/cpld_fw_updated ]]; then
LogWarning "forced CPLD refresh was requested for ${ONIE_PLATFORM}"
CPLD_UPGRADE="${YES_PARAM}"
fi
if [[ "${CPLD_UPGRADE}" != "${YES_PARAM}" ]]; then
LogNotice "CPLD upgrade was not requested for ${ONIE_PLATFORM}"
return "${EXIT_SUCCESS}"
fi
if [[ ! -f "${_CPLD_ARCHIVE}" ]]; then
LogNotice "CPLD update $(basename ${_CPLD_ARCHIVE}) was not provided for ${ONIE_PLATFORM}"
return "${EXIT_SUCCESS}"
fi
CPLD_DIR="$(mktemp -d)"
RunCmd "tar xzf ${_CPLD_ARCHIVE} -C ${CPLD_DIR}"
local -r _CPLD_BURN_FILE="${CPLD_DIR}/$(cat ${CPLD_DIR}/bundle.txt | grep 'burn=' | cut -f2 -d'=')"
local -r _CPLD_REFRESH_FILE="${CPLD_DIR}/$(cat ${CPLD_DIR}/bundle.txt | grep 'refresh=' | cut -f2 -d'=')"
local -r _CPLD_VERSION="$(cat ${CPLD_DIR}/bundle.txt | grep 'version=' | cut -f2 -d'=')"
local _CURRENT_CPLD_VERSION="${_CPLD_VERSION}"
local _TARGET_CPLD_VERSION="${_CPLD_VERSION}"
if [[ -f /bsp/cpld/cpld_mgmt_version ]]; then
_CURRENT_CPLD_VERSION="$(cat /bsp/cpld/cpld_mgmt_version)"
elif [[ -f /var/run/hw-management/system/cpld1_version ]]; then
_CURRENT_CPLD_VERSION="$(cat /var/run/hw-management/system/cpld1_version)"
else else
mkdir -p "${_FS_MOUNTPOINT}" ExitFailure "could not retrieve current CPLD firmware version"
mount -t squashfs "${_FS_PATH}" "${_FS_MOUNTPOINT}" fi
UpgradeFW "${_FS_MOUNTPOINT}" if [[ "${_CURRENT_CPLD_VERSION}" = "${_TARGET_CPLD_VERSION}" ]]; then
LogInfo "CPLD firmware is up to date"
return "${EXIT_SUCCESS}"
fi
umount -rf "${_FS_MOUNTPOINT}" LogNotice "CPLD firmware upgrade is required. Installing compatible version..."
rm -rf "${_FS_MOUNTPOINT}"
LogInfo "current CPLD firmware version: ${_CURRENT_CPLD_VERSION}"
LogInfo "target CPLD firmware version: ${_TARGET_CPLD_VERSION}"
LogInfo "CPLD burn firmware file: ${_CPLD_BURN_FILE}"
LogInfo "CPLD refresh firmware file: ${_CPLD_REFRESH_FILE}"
UpgradeCPLDFW_Worker "${_CPLD_BURN_FILE}" "${_CPLD_REFRESH_FILE}" &
local -r _PID="$!"
while $(ps -e -o pid | grep -E "^[[:blank:]]*${_PID}$" &> /dev/null); do
ShowProgressBar "CPLD update..."
done
RunCmd "wait ${_PID}"
}
function UpgradeFWFromImage() {
local -r _NEXT_SONIC_IMAGE="$(sonic_installer list | grep 'Next: ' | cut -f2 -d' ')"
local -r _CURRENT_SONIC_IMAGE="$(sonic_installer list | grep 'Current: ' | cut -f2 -d' ')"
if [[ "${_CURRENT_SONIC_IMAGE}" = "${_NEXT_SONIC_IMAGE}" ]]; then
ExitSuccess "firmware is up to date"
fi
FS_PATH="/host/image-${_NEXT_SONIC_IMAGE#SONiC-OS-}/fs.squashfs"
FS_MOUNTPOINT="/tmp/image-${_NEXT_SONIC_IMAGE#SONiC-OS-}-fs"
RunCmd "mkdir -p ${FS_MOUNTPOINT}"
RunCmd "mount -t squashfs ${FS_PATH} ${FS_MOUNTPOINT}"
UpgradeASICFW "${FS_MOUNTPOINT}${FW_FILE}"
UpgradeCPLDFW "${FS_MOUNTPOINT}/etc/mlnx/cpld/${ONIE_MACHINE#mlnx_}_cpld.tar.gz"
}
function Cleanup() {
if [[ -d "${FS_MOUNTPOINT}" ]]; then
umount -rf "${FS_MOUNTPOINT}"
rm -rf "${FS_MOUNTPOINT}"
fi
if [[ -d "${CPLD_DIR}" ]]; then
rm -rf "${CPLD_DIR}"
fi fi
} }
@ -242,16 +360,25 @@ function ExitIfQEMU() {
fi fi
} }
trap Cleanup EXIT
ParseMachineConf
ParseArguments "$@" ParseArguments "$@"
ExitIfQEMU ExitIfQEMU
WaitForDevice WaitForDevice
if [ "${IMAGE_UPGRADE}" != "${YES_PARAM}" ]; then if [[ "${CPLD_UPGRADE}" = "${YES_PARAM}" ]]; then
UpgradeFW if [[ "${IMAGE_UPGRADE}" = "${NO_PARAM}" ]]; then
else ExitFailure "mandatory parameter was not provided: -u|--upgrade"
fi
fi
if [[ "${IMAGE_UPGRADE}" = "${YES_PARAM}" ]]; then
UpgradeFWFromImage UpgradeFWFromImage
else
UpgradeASICFW
fi fi
ExitSuccess "firmware upgrade is completed" ExitSuccess "firmware upgrade is completed"