Skip to content

Commit f908dfe

Browse files
[Mellanox] Place FW binaries under platform directory instead of squashfs (#13837)
Fixes #13568 Upgrade from old image always requires squashfs mount to get the next image FW binary. This can be avoided if we put FW binary under platform directory which is easily accessible after installation: admin@r-spider-05:~$ ls /host/image-fw-new-loc.0-dirty-20230208.193534/platform/fw-SPC.mfa /host/image-fw-new-loc.0-dirty-20230208.193534/platform/fw-SPC.mfa admin@r-spider-05:~$ ls -al /tmp/image-fw-new-loc.0-dirty-20230208.193534-fs/etc/mlnx/fw-SPC.mfa lrwxrwxrwx 1 root root 66 Feb 8 17:57 /tmp/image-fw-new-loc.0-dirty-20230208.193534-fs/etc/mlnx/fw-SPC.mfa -> /host/image-fw-new-loc.0-dirty-20230208.193534/platform/fw-SPC.mfa - Why I did it 202211 and above uses different squashfs compression type that 201911 kernel can not handle. Therefore, we avoid mounting squashfs altogether with this change. - How I did it Place FW binary under /host/image-/platform/mlnx/, soft links in /etc/mlnx are created to avoid breaking existing scripts/automation. /etc/mlnx/fw-SPCX.mfa is a soft link always pointing to the FW that should be used in current image mlnx-fw-upgrade.sh is updated to prefer /host/image-/platform/mlnx location and fallback to /etc/mlnx in squashfs in case new location does not exist. This is necessary to do image downgrade. - How to verify it Upgrade from 201911 to master master to 201911 downgrade master -> master reboot ONIE -> master boot (First FW burn) Which release branch to backport (provide reason below if selected)
1 parent 506f372 commit f908dfe

File tree

2 files changed

+36
-15
lines changed

2 files changed

+36
-15
lines changed

files/build_templates/sonic_debian_extension.j2

+12-4
Original file line numberDiff line numberDiff line change
@@ -928,10 +928,18 @@ sudo cp {{src}} $FILESYSTEM_ROOT/{{dst}}
928928
{% endfor -%}
929929

930930
{% if sonic_asic_platform == "mellanox" %}
931-
sudo mkdir -p $FILESYSTEM_ROOT/etc/mlnx/
932-
sudo cp $files_path/$MLNX_SPC_FW_FILE $FILESYSTEM_ROOT/etc/mlnx/fw-SPC.mfa
933-
sudo cp $files_path/$MLNX_SPC2_FW_FILE $FILESYSTEM_ROOT/etc/mlnx/fw-SPC2.mfa
934-
sudo cp $files_path/$MLNX_SPC3_FW_FILE $FILESYSTEM_ROOT/etc/mlnx/fw-SPC3.mfa
931+
declare -rA FW_FILE_MAP=( \
932+
[$MLNX_SPC_FW_FILE]="fw-SPC.mfa" \
933+
[$MLNX_SPC2_FW_FILE]="fw-SPC2.mfa" \
934+
[$MLNX_SPC3_FW_FILE]="fw-SPC3.mfa" \
935+
)
936+
sudo mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR/fw/asic/
937+
sudo mkdir -p $FILESYSTEM_ROOT_ETC/mlnx/
938+
for fw_file_name in ${!FW_FILE_MAP[@]}; do
939+
sudo cp $files_path/$fw_file_name $FILESYSTEM_ROOT/$PLATFORM_DIR/fw/asic/${FW_FILE_MAP[$fw_file_name]}
940+
# Link old FW location to not break existing automation/scripts
941+
sudo ln -s /host/image-$SONIC_IMAGE_VERSION/$PLATFORM_DIR/fw/asic/${FW_FILE_MAP[$fw_file_name]} $FILESYSTEM_ROOT/etc/mlnx/${FW_FILE_MAP[$fw_file_name]}
942+
done
935943
sudo cp $files_path/$ISSU_VERSION_FILE $FILESYSTEM_ROOT/etc/mlnx/issu-version
936944
sudo cp $files_path/$MLNX_FFB_SCRIPT $FILESYSTEM_ROOT/usr/bin/mlnx-ffb.sh
937945
sudo cp $files_path/$MLNX_ONIE_FW_UPDATE $FILESYSTEM_ROOT/usr/bin/$MLNX_ONIE_FW_UPDATE

platform/mellanox/mlnx-fw-upgrade.j2

+24-11
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ declare -r UNKN_ASIC="unknown"
3232
declare -r UNKN_MST="unknown"
3333

3434
declare -rA FW_FILE_MAP=( \
35-
[$SPC1_ASIC]="/etc/mlnx/fw-SPC.mfa" \
36-
[$SPC2_ASIC]="/etc/mlnx/fw-SPC2.mfa" \
37-
[$SPC3_ASIC]="/etc/mlnx/fw-SPC3.mfa" \
35+
[$SPC1_ASIC]="fw-SPC.mfa" \
36+
[$SPC2_ASIC]="fw-SPC2.mfa" \
37+
[$SPC3_ASIC]="fw-SPC3.mfa" \
3838
)
3939

4040
IMAGE_UPGRADE="${NO_PARAM}"
@@ -221,17 +221,17 @@ function RunFwUpdateCmd() {
221221
}
222222

223223
function UpgradeFW() {
224-
local -r _FS_MOUNTPOINT="$1"
224+
local -r _FW_BIN_PATH="$1"
225225

226226
local -r _ASIC_TYPE="$(GetAsicType)"
227227
if [[ "${_ASIC_TYPE}" = "${UNKN_ASIC}" ]]; then
228228
ExitFailure "failed to detect ASIC type"
229229
fi
230230

231-
if [ ! -z "${_FS_MOUNTPOINT}" ]; then
232-
local -r _FW_FILE="${_FS_MOUNTPOINT}/${FW_FILE_MAP[$_ASIC_TYPE]}"
231+
if [ ! -z "${_FW_BIN_PATH}" ]; then
232+
local -r _FW_FILE="${_FW_BIN_PATH}/${FW_FILE_MAP[$_ASIC_TYPE]}"
233233
else
234-
local -r _FW_FILE="${FW_FILE_MAP[$_ASIC_TYPE]}"
234+
local -r _FW_FILE="/etc/mlnx/${FW_FILE_MAP[$_ASIC_TYPE]}"
235235
fi
236236

237237
if [ ! -f "${_FW_FILE}" ]; then
@@ -274,16 +274,29 @@ function UpgradeFWFromImage() {
274274
local -r _NEXT_SONIC_IMAGE="$(sonic-installer list | grep "Next: " | cut -f2 -d' ')"
275275
local -r _CURRENT_SONIC_IMAGE="$(sonic-installer list | grep "Current: " | cut -f2 -d' ')"
276276

277-
local -r _FS_PATH="/host/image-${_NEXT_SONIC_IMAGE#SONiC-OS-}/fs.squashfs"
278-
local -r _FS_MOUNTPOINT="/tmp/image-${_NEXT_SONIC_IMAGE#SONiC-OS-}-fs"
279-
280277
if [[ "${_CURRENT_SONIC_IMAGE}" == "${_NEXT_SONIC_IMAGE}" ]]; then
281278
ExitSuccess "firmware is up to date"
279+
fi
280+
281+
# /host/image-<version>/platform/fw/asic is now the new location for FW binaries.
282+
# Prefere this path and if it does not exist use squashfs as a fallback.
283+
local -r _PLATFORM_FW_BIN_PATH="/host/image-${_NEXT_SONIC_IMAGE#SONiC-OS-}/platform/fw/asic/"
284+
285+
if [[ -d "${_PLATFORM_FW_BIN_PATH}" ]]; then
286+
LogInfo "Using FW binaries from ${_PLATFORM_FW_BIN_PATH}"
287+
288+
UpgradeFW "${_PLATFORM_FW_BIN_PATH}"
282289
else
290+
local -r _FS_PATH="/host/image-${_NEXT_SONIC_IMAGE#SONiC-OS-}/fs.squashfs"
291+
local -r _FS_MOUNTPOINT="/tmp/image-${_NEXT_SONIC_IMAGE#SONiC-OS-}-fs"
292+
local -r _FW_BIN_PATH="${_FS_MOUNTPOINT}/etc/mlnx/"
293+
294+
LogInfo "Using FW binaries from ${_FW_BIN_PATH}"
295+
283296
mkdir -p "${_FS_MOUNTPOINT}"
284297
mount -t squashfs "${_FS_PATH}" "${_FS_MOUNTPOINT}"
285298

286-
UpgradeFW "${_FS_MOUNTPOINT}"
299+
UpgradeFW "${_FW_BIN_PATH}"
287300

288301
umount -rf "${_FS_MOUNTPOINT}"
289302
rm -rf "${_FS_MOUNTPOINT}"

0 commit comments

Comments
 (0)