Initial commit

This commit is contained in:
Your Name
2026-04-23 17:07:55 +08:00
commit b7e39e063b
16725 changed files with 1625565 additions and 0 deletions
@@ -0,0 +1,31 @@
SUMMARY = "Ampere Computing LLC System Firmware Hang Handler"
DESCRIPTION = "A host control implementation suitable for Ampere Computing LLC's systems"
PR = "r1"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
inherit systemd
inherit obmc-phosphor-systemd
RDEPENDS:${PN} = "bash"
FILESEXTRAPATHS:append := "${THISDIR}/${PN}:"
SYSTEMD_PACKAGES = "${PN}"
SRC_URI = " \
file://ampere-sysfw-hang-handler.service \
file://ampere_sysfw_hang_handler.sh \
"
SYSTEMD_SERVICE:${PN} += "ampere-sysfw-hang-handler.service"
SYSFW_HANG_TGT = "ampere-sysfw-hang-handler.service"
SYSFW_HANG_INSTMPL = "ampere-sysfw-hang-handler.service"
AMPER_HOST_RUNNING = "obmc-host-already-on@{0}.target"
SYSFW_HANG_TARGET_FMT = "../${SYSFW_HANG_TGT}:${AMPER_HOST_RUNNING}.wants/${SYSFW_HANG_INSTMPL}"
SYSTEMD_LINK:${PN} += "${@compose_list_zip(d, 'SYSFW_HANG_TARGET_FMT', 'OBMC_HOST_INSTANCES')}"
do_install() {
install -d ${D}/usr/sbin
install -m 0755 ${WORKDIR}/ampere_sysfw_hang_handler.sh ${D}/${sbindir}/
}
@@ -0,0 +1,10 @@
[Unit]
Description=Ampere System Firmware Hang Handler
After=obmc-host-already-on@0.target
BindTo=obmc-host-already-on@0.target
ConditionPathExists=!/var/ampere/sysfw-hang-disable
[Service]
Type=simple
ExecStart=/usr/sbin/ampere_sysfw_hang_handler.sh
SyslogIdentifier=ampere_sysfw_hang
@@ -0,0 +1,42 @@
#!/bin/bash
# shellcheck source=meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/gpio-lib.sh
source /usr/sbin/gpio-lib.sh
# Do event trigger
function sel_trigger()
{
echo "Error: system firmware hang, trigger sel"
ampere_add_redfishevent.sh OpenBMC.0.1.SystemPowerOnFailed.Critical
}
# Do reset the system
function reset_system()
{
echo "Error: system firmware hang, reset the system"
ipmitool chassis power reset
}
s0_last_hb_state=0
cnt=-1
while true
do
# Monitor heart beat GPIO value, GPIOF4 for Socket 0
s0_hb_state=$(gpio_name_get s0-heartbeat)
if [ "$s0_last_hb_state" != "$s0_hb_state" ]; then
cnt=0
else
cnt=$((cnt + 1))
fi
if [ "$cnt" -ge 6 ]; then
echo "Error: system firmware hang"
sel_trigger
reset_system
exit 0
fi
s0_last_hb_state="$s0_hb_state"
sleep 0.5
done
exit 0