207 lines
4.1 KiB
Bash
207 lines
4.1 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# Initialize variables
|
||
|
|
boot_stage=00
|
||
|
|
boot_status=00
|
||
|
|
uefi_code=00000000
|
||
|
|
|
||
|
|
function set_postcode()
|
||
|
|
{
|
||
|
|
# shellcheck disable=SC2086
|
||
|
|
busctl set-property xyz.openbmc_project.State.Boot.Raw \
|
||
|
|
/xyz/openbmc_project/state/boot/raw0 \
|
||
|
|
xyz.openbmc_project.State.Boot.Raw Value \(tay\) "$1" 0
|
||
|
|
}
|
||
|
|
|
||
|
|
function update_boot_progress_last_state_time()
|
||
|
|
{
|
||
|
|
# Get BMC current time
|
||
|
|
bp_last_state_time=$(busctl get-property xyz.openbmc_project.Time.Manager \
|
||
|
|
/xyz/openbmc_project/time/bmc \
|
||
|
|
xyz.openbmc_project.Time.EpochTime \
|
||
|
|
Elapsed | cut -d' ' -f2)
|
||
|
|
|
||
|
|
# Update the Boot Progress LastStateTime
|
||
|
|
busctl set-property xyz.openbmc_project.State.Host \
|
||
|
|
/xyz/openbmc_project/state/host0 \
|
||
|
|
xyz.openbmc_project.State.Boot.Progress \
|
||
|
|
BootProgressLastUpdate t \
|
||
|
|
"$bp_last_state_time"
|
||
|
|
}
|
||
|
|
|
||
|
|
function update_boot_progress()
|
||
|
|
{
|
||
|
|
bootprog=$1
|
||
|
|
|
||
|
|
busctl set-property xyz.openbmc_project.State.Host \
|
||
|
|
/xyz/openbmc_project/state/host0 \
|
||
|
|
xyz.openbmc_project.State.Boot.Progress \
|
||
|
|
BootProgress s \
|
||
|
|
"xyz.openbmc_project.State.Boot.Progress.ProgressStages.$bootprog"
|
||
|
|
|
||
|
|
# Update Boot Progress LastStateTime
|
||
|
|
update_boot_progress_last_state_time
|
||
|
|
}
|
||
|
|
|
||
|
|
function get_boot_stage_string()
|
||
|
|
{
|
||
|
|
bootstage=$1
|
||
|
|
ueficode=$2
|
||
|
|
|
||
|
|
case $bootstage in
|
||
|
|
|
||
|
|
00)
|
||
|
|
boot_stage_str="SMpro"
|
||
|
|
;;
|
||
|
|
|
||
|
|
01)
|
||
|
|
boot_stage_str="PMpro"
|
||
|
|
;;
|
||
|
|
|
||
|
|
02)
|
||
|
|
boot_stage_str="ATF BL1 (Code=${ueficode})"
|
||
|
|
;;
|
||
|
|
|
||
|
|
03)
|
||
|
|
boot_stage_str="DDR initialization (Code=${ueficode})"
|
||
|
|
;;
|
||
|
|
|
||
|
|
04)
|
||
|
|
boot_stage_str="DDR training progress (Code=${ueficode})"
|
||
|
|
;;
|
||
|
|
|
||
|
|
05)
|
||
|
|
boot_stage_str="ATF BL2 (Code=${ueficode})"
|
||
|
|
;;
|
||
|
|
|
||
|
|
06)
|
||
|
|
boot_stage_str="ATF BL31 (Code=${ueficode})"
|
||
|
|
;;
|
||
|
|
|
||
|
|
07)
|
||
|
|
boot_stage_str="ATF BL32 (Code=${ueficode})"
|
||
|
|
;;
|
||
|
|
|
||
|
|
08)
|
||
|
|
boot_stage_str="UEFI booting (UEFI Code=${ueficode})"
|
||
|
|
;;
|
||
|
|
09)
|
||
|
|
boot_stage_str="OS booting"
|
||
|
|
;;
|
||
|
|
|
||
|
|
esac
|
||
|
|
|
||
|
|
echo "$boot_stage_str"
|
||
|
|
}
|
||
|
|
|
||
|
|
function set_boot_progress()
|
||
|
|
{
|
||
|
|
boot_stage=$1
|
||
|
|
uefi_code=$2
|
||
|
|
|
||
|
|
case $boot_stage in
|
||
|
|
|
||
|
|
02)
|
||
|
|
update_boot_progress "PrimaryProcInit"
|
||
|
|
;;
|
||
|
|
|
||
|
|
03)
|
||
|
|
update_boot_progress "MemoryInit"
|
||
|
|
;;
|
||
|
|
|
||
|
|
08)
|
||
|
|
if [[ "$uefi_code" =~ 0201* ]]; then
|
||
|
|
update_boot_progress "PCIInit"
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
09)
|
||
|
|
update_boot_progress "OSStart"
|
||
|
|
;;
|
||
|
|
|
||
|
|
esac
|
||
|
|
}
|
||
|
|
|
||
|
|
function log_redfish_biosboot_ok_event()
|
||
|
|
{
|
||
|
|
logger-systemd --journald << EOF
|
||
|
|
MESSAGE=
|
||
|
|
PRIORITY=2
|
||
|
|
SEVERITY=
|
||
|
|
REDFISH_MESSAGE_ID=OpenBMC.0.1.BIOSBoot.OK
|
||
|
|
REDFISH_MESSAGE_ARGS="UEFI firmware booting done"
|
||
|
|
EOF
|
||
|
|
}
|
||
|
|
|
||
|
|
function log_redfish_bios_panic_event()
|
||
|
|
{
|
||
|
|
boot_state_str=$(get_boot_stage_string "$1" "$2")
|
||
|
|
|
||
|
|
logger-systemd --journald << EOF
|
||
|
|
MESSAGE=
|
||
|
|
PRIORITY=2
|
||
|
|
SEVERITY=
|
||
|
|
REDFISH_MESSAGE_ID=OpenBMC.0.1.BIOSFirmwarePanicReason.Warning
|
||
|
|
REDFISH_MESSAGE_ARGS=${boot_state_str}
|
||
|
|
EOF
|
||
|
|
}
|
||
|
|
|
||
|
|
cnt=0
|
||
|
|
# If any reason makes SCP fail to access in 6s, break the service.
|
||
|
|
while [ $cnt -lt 30 ];
|
||
|
|
do
|
||
|
|
# Sleep 200ms
|
||
|
|
sleep 1s
|
||
|
|
if ! read -r bg <<< "$(cat /sys/bus/platform/devices/smpro-misc.2.auto/boot_progress)";
|
||
|
|
then
|
||
|
|
cnt=$((cnt + 1))
|
||
|
|
continue
|
||
|
|
fi
|
||
|
|
cnt=0
|
||
|
|
|
||
|
|
# Check if any update from previous check
|
||
|
|
if [ "$last_bg" == "$bg" ]; then
|
||
|
|
continue
|
||
|
|
fi
|
||
|
|
last_bg=$bg
|
||
|
|
|
||
|
|
# Check if the Host is already ON or not. If Host is already boot, update boot progress and break.
|
||
|
|
if [ "${boot_stage}" == "00" ] && [ "${bg[0]}" == "09" ];
|
||
|
|
then
|
||
|
|
update_boot_progress "OSRunning"
|
||
|
|
break
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Update current boot progress
|
||
|
|
boot_stage=${bg:2:2}
|
||
|
|
boot_status=${bg:0:2}
|
||
|
|
uefi_code=${bg:4}
|
||
|
|
echo "Boot Progress = ${boot_stage} ${boot_status} ${uefi_code}"
|
||
|
|
|
||
|
|
# Log Boot Progress to dbus
|
||
|
|
if [ "${boot_status}" == "03" ]; then
|
||
|
|
# Log Redfish Event if failure.
|
||
|
|
log_redfish_bios_panic_event "$boot_stage" "$uefi_code"
|
||
|
|
# Dimm training failed, check errors
|
||
|
|
if [ "${boot_stage}" == "04" ]; then
|
||
|
|
/usr/sbin/dimm_train_fail_log.sh 0
|
||
|
|
/usr/sbin/dimm_train_fail_log.sh 1
|
||
|
|
fi
|
||
|
|
elif [ "${boot_status}" == "01" ]; then
|
||
|
|
# Check and set boot progress to dbus
|
||
|
|
set_boot_progress "$boot_stage" "$uefi_code"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Log POST Code to dbus.
|
||
|
|
set_postcode "0x$boot_stage$boot_status$uefi_code"
|
||
|
|
|
||
|
|
# Stop the service when booting to OS
|
||
|
|
if [ "${boot_stage}" == "08" ] && [ "${boot_status}" == "02" ]; then
|
||
|
|
update_boot_progress "SystemInitComplete"
|
||
|
|
log_redfish_biosboot_ok_event
|
||
|
|
elif [ "${boot_stage}" == "09" ] && [ "${boot_status}" == "02" ];
|
||
|
|
then
|
||
|
|
update_boot_progress "OSRunning"
|
||
|
|
break
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|