Initial commit
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
SUMMARY = "Phosphor OpenBMC Boot Progress Handling Service"
|
||||
DESCRIPTION = "Phosphor OpenBMC Altra Boot Progress Handling Daemon"
|
||||
|
||||
PR = "r1"
|
||||
LICENSE = "Apache-2.0"
|
||||
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
|
||||
|
||||
inherit systemd
|
||||
inherit obmc-phosphor-systemd
|
||||
|
||||
DEPENDS += "systemd"
|
||||
RDEPENDS:${PN} += "libsystemd"
|
||||
RDEPENDS:${PN} += "bash"
|
||||
|
||||
SRC_URI = " \
|
||||
file://ampere_boot_progress.sh \
|
||||
file://dimm_train_fail_log.sh \
|
||||
"
|
||||
|
||||
SYSTEMD_PACKAGES = "${PN}"
|
||||
|
||||
HOST_ON_RESET_HOSTTMPL = "ampere-boot-progress.service"
|
||||
HOST_ON_RESET_HOSTINSTMPL = "ampere-boot-progress.service"
|
||||
HOST_ON_RESET_HOSTTGTFMT = "obmc-host-already-on@{0}.target"
|
||||
HOST_ON_RESET_HOSTFMT = "../${HOST_ON_RESET_HOSTTMPL}:${HOST_ON_RESET_HOSTTGTFMT}.requires/${HOST_ON_RESET_HOSTINSTMPL}"
|
||||
SYSTEMD_LINK:${PN} += "${@compose_list_zip(d, 'HOST_ON_RESET_HOSTFMT', 'OBMC_HOST_INSTANCES')}"
|
||||
|
||||
SYSTEMD_SERVICE:${PN} += "${HOST_ON_RESET_HOSTTMPL}"
|
||||
|
||||
do_install () {
|
||||
install -d ${D}${sbindir}
|
||||
install -m 0755 ${WORKDIR}/ampere_boot_progress.sh ${D}${sbindir}/
|
||||
install -m 0755 ${WORKDIR}/dimm_train_fail_log.sh ${D}${sbindir}/
|
||||
}
|
||||
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
[Unit]
|
||||
Description=Ampere Altra Boot Progress Handling
|
||||
After=obmc-host-already-on@0.target
|
||||
BindTo=obmc-host-already-on@0.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/sbin/ampere_boot_progress.sh
|
||||
SyslogIdentifier=ampere-boot-progress
|
||||
+206
@@ -0,0 +1,206 @@
|
||||
#!/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
|
||||
|
||||
+190
@@ -0,0 +1,190 @@
|
||||
#!/bin/bash
|
||||
smpro_path() {
|
||||
if [ "$1" == 0 ]; then
|
||||
echo "/sys/bus/i2c/drivers/smpro-core/2-004f"
|
||||
else
|
||||
echo "/sys/bus/i2c/drivers/smpro-core/2-004e"
|
||||
fi
|
||||
}
|
||||
|
||||
function log_ampere_oem_redfish_event()
|
||||
{
|
||||
msg=$1
|
||||
priority=$2
|
||||
severity=$3
|
||||
msgID=$4
|
||||
msgArgs1=$5
|
||||
msgArgs2=$6
|
||||
|
||||
logger-systemd --journald << EOF
|
||||
MESSAGE=${msg}
|
||||
PRIORITY=${priority}
|
||||
SEVERITY=${severity}
|
||||
REDFISH_MESSAGE_ID=${msgID}
|
||||
REDFISH_MESSAGE_ARGS=${msgArgs1},${msgArgs2}
|
||||
EOF
|
||||
}
|
||||
|
||||
parse_phy_syndrome_s1_type() {
|
||||
s1=$1
|
||||
slice=$((s1 & 0xf))
|
||||
ubit=$(((s1 & 0x10) >> 4))
|
||||
lbit=$(((s1 & 0x20) >> 5))
|
||||
uMsg="Upper Nibble: No Error"
|
||||
lMsg="Lower Nibble: No Error"
|
||||
if [ $ubit == 1 ]; then
|
||||
uMsg="Upper Nibble: No rising edge error"
|
||||
fi
|
||||
if [ $lbit == 1 ]; then
|
||||
lMsg="Lower Nibble: No rising edge error"
|
||||
fi
|
||||
echo "Slice $slice: $uMsg, $lMsg"
|
||||
}
|
||||
|
||||
parse_phy_syndrome() {
|
||||
s0=$1
|
||||
s1=$2
|
||||
case $s0 in
|
||||
1)
|
||||
echo "PHY Training Setup failure"
|
||||
;;
|
||||
2)
|
||||
s1Msg=$(parse_phy_syndrome_s1_type "$s1")
|
||||
echo "PHY Write Leveling failure: $s1Msg"
|
||||
;;
|
||||
3)
|
||||
echo "PHY Read Gate Leveling failure"
|
||||
;;
|
||||
4)
|
||||
echo "PHY Read Leveling failure"
|
||||
;;
|
||||
5)
|
||||
echo "PHY Software Training failure"
|
||||
;;
|
||||
*)
|
||||
echo "N/A"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
parse_dimm_syndrome() {
|
||||
s0=$1
|
||||
case $s0 in
|
||||
1)
|
||||
echo "DRAM VREFDQ Training failure"
|
||||
;;
|
||||
2)
|
||||
echo "LRDIMM DB Training failure"
|
||||
;;
|
||||
3)
|
||||
echo "LRDIMM DB Software Training failure"
|
||||
;;
|
||||
*)
|
||||
echo "N/A"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
log_err_to_redfish_err() {
|
||||
channel="$(printf '%d' "0x$1" 2>/dev/null)"
|
||||
data="$(printf '%d' "0x$2" 2>/dev/null)"
|
||||
trErrType=$((data & 0x03))
|
||||
rank=$(((data & 0x1C) >> 2))
|
||||
syndrome0=$(((data & 0xE0) >> 5))
|
||||
syndrome1=$(((data & 0xFF00) >> 8))
|
||||
|
||||
# PHY sysdrom errors
|
||||
fType=""
|
||||
redfisComp="DIMM"
|
||||
redfisMsg=""
|
||||
if [ $trErrType == 1 ]; then
|
||||
fType="PHY training failure"
|
||||
redfisMsg=$(parse_phy_syndrome $syndrome0 $syndrome1)
|
||||
# DIMM traning errors
|
||||
elif [ $trErrType == 2 ]; then
|
||||
fType="DIMM training failure"
|
||||
redfisMsg=$(parse_dimm_syndrome $syndrome0)
|
||||
else
|
||||
fType="Invalid DIMM Syndrome error type"
|
||||
redfisMsg="NA"
|
||||
fi
|
||||
|
||||
#smg=$("DDR training: MCU rank $rank: $fType: $redfisMsg")
|
||||
log_ampere_oem_redfish_event \
|
||||
"" 2 "" "OpenBMC.0.1.AmpereCritical.Critical" \
|
||||
$redfisComp "Slot $channel MCU rank $rank: $fType: $redfisMsg"
|
||||
}
|
||||
|
||||
log_err_to_sel_err() {
|
||||
channel="$(printf '%d' "0x$1" 2>/dev/null)"
|
||||
data="$(printf '%d' "0x$2" 2>/dev/null)"
|
||||
byte0=$(((data & 0xff00) >> 8))
|
||||
byte1=$((data & 0xff))
|
||||
evtdata0=$((EVENT_DIR_ASSERTION | OEM_SENSOR_SPECIFIC))
|
||||
evtdata1=$(((channel << 4) | BOOT_SYNDROME_DATA | (socket << 3)))
|
||||
|
||||
# phy sysdrom errors
|
||||
# OEM data bytes
|
||||
# oem id: 3 bytes [0x3a 0xcd 0x00]
|
||||
# sensor num: 1 bytes
|
||||
# sensor type: 1 bytes
|
||||
# data bytes: 4 bytes
|
||||
# sel type: 4 byte [0x00 0x00 0x00 0xC0]
|
||||
busctl call xyz.openbmc_project.Logging.IPMI \
|
||||
/xyz/openbmc_project/Logging/IPMI \
|
||||
xyz.openbmc_project.Logging.IPMI IpmiSelAddOem \
|
||||
sayy "" 12 \
|
||||
0x3a 0xcd 0x00 \
|
||||
"$SENSOR_TYPE_SYSTEM_FW_PROGRESS" "$SENSOR_BOOT_PROGRESS" \
|
||||
"$evtdata0" "$evtdata1" "$byte0" "$byte1" \
|
||||
0x00 0x00 0x00 0xC0
|
||||
}
|
||||
|
||||
BOOT_SYNDROME_DATA=4
|
||||
SENSOR_BOOT_PROGRESS=235
|
||||
EVENT_DIR_ASSERTION=0x00
|
||||
OEM_SENSOR_SPECIFIC=0x70
|
||||
SENSOR_TYPE_SYSTEM_FW_PROGRESS=0x0F
|
||||
|
||||
socket=$1
|
||||
base="$(smpro_path "$socket")"
|
||||
|
||||
# For the second socket, it is required to read out to
|
||||
# clear all old boot progress before query the dimm
|
||||
# training fail info.
|
||||
# Normally, it would take up to 12 times to read them all
|
||||
# Make the value to 16 to make sure it always works.
|
||||
if [ "$socket" == "1" ]; then
|
||||
path=("$base"/smpro-misc.*.auto/boot_progress)
|
||||
filename="${path[0]}"
|
||||
if [ ! -f "$filename" ];
|
||||
then
|
||||
echo "Error: $filename not found"
|
||||
else
|
||||
for ((i=0; i<16; i++))
|
||||
do
|
||||
cat "$filename" > /dev/null 2>&1
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# Checking for DIMM slot 0-15
|
||||
for ((i=0; i<16; i++))
|
||||
do
|
||||
path=("$base"/smpro-errmon.*.auto/event_dimm"${i}"_syndrome)
|
||||
filename="${path[0]}"
|
||||
if [ ! -f "$filename" ];
|
||||
then
|
||||
echo "Error: $filename not found"
|
||||
continue
|
||||
fi
|
||||
|
||||
line=$(cat "$filename")
|
||||
if [ -n "$line" ];
|
||||
then
|
||||
log_err_to_redfish_err "$i" "$line"
|
||||
log_err_to_sel_err "$i" "$line"
|
||||
fi
|
||||
done
|
||||
|
||||
exit 0;
|
||||
@@ -0,0 +1,63 @@
|
||||
SUMMARY = "Ampere Computing LLC Host Control Implementation"
|
||||
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"
|
||||
S = "${WORKDIR}"
|
||||
|
||||
SRC_URI = " \
|
||||
file://ampere-host-force-reset@.service \
|
||||
file://ampere-host-on-host-check@.service \
|
||||
file://ampere_host_check.sh \
|
||||
file://obmc-power-already-on@.target \
|
||||
file://obmc-host-already-on@.target \
|
||||
file://ampere-bmc-reboot-host-check@.service \
|
||||
"
|
||||
|
||||
SYSTEMD_PACKAGES = "${PN}"
|
||||
SYSTEMD_SERVICE:${PN} = " \
|
||||
ampere-host-force-reset@.service \
|
||||
obmc-power-already-on@.target \
|
||||
obmc-host-already-on@.target \
|
||||
ampere-bmc-reboot-host-check@.service \
|
||||
"
|
||||
|
||||
# append force reboot
|
||||
HOST_WARM_REBOOT_FORCE_TGT = "ampere-host-force-reset@.service"
|
||||
HOST_WARM_REBOOT_FORCE_INSTMPL = "ampere-host-force-reset@{0}.service"
|
||||
HOST_WARM_REBOOT_FORCE_TGTFMT = "obmc-host-force-warm-reboot@{0}.target"
|
||||
HOST_WARM_REBOOT_FORCE_TARGET_FMT = "../${HOST_WARM_REBOOT_FORCE_TGT}:${HOST_WARM_REBOOT_FORCE_TGTFMT}.requires/${HOST_WARM_REBOOT_FORCE_INSTMPL}"
|
||||
SYSTEMD_LINK:${PN} += "${@compose_list_zip(d, 'HOST_WARM_REBOOT_FORCE_TARGET_FMT', 'OBMC_HOST_INSTANCES')}"
|
||||
SYSTEMD_SERVICE:${PN} += "${HOST_WARM_REBOOT_FORCE_TGT}"
|
||||
|
||||
HOST_ON_RESET_HOSTTMPL = "ampere-host-on-host-check@.service"
|
||||
HOST_ON_RESET_HOSTINSTMPL = "ampere-host-on-host-check@{0}.service"
|
||||
HOST_ON_RESET_HOSTTGTFMT = "obmc-host-startmin@{0}.target"
|
||||
HOST_ON_RESET_HOSTFMT = "../${HOST_ON_RESET_HOSTTMPL}:${HOST_ON_RESET_HOSTTGTFMT}.requires/${HOST_ON_RESET_HOSTINSTMPL}"
|
||||
SYSTEMD_LINK:${PN} += "${@compose_list_zip(d, 'HOST_ON_RESET_HOSTFMT', 'OBMC_HOST_INSTANCES')}"
|
||||
SYSTEMD_SERVICE:${PN} += "${HOST_ON_RESET_HOSTTMPL}"
|
||||
|
||||
# append on phosphor-wait-power-on
|
||||
AMPERE_POWER_ON_TGT = "obmc-power-already-on@.target"
|
||||
AMPERE_POWER_ON_INSTMPL = "obmc-power-already-on@{0}.target"
|
||||
OP_WAIT_POWER_ON = "phosphor-wait-power-on@{0}.service"
|
||||
AMPERE_POWER_ON_TARGET_FMT = "../${AMPERE_POWER_ON_TGT}:${OP_WAIT_POWER_ON}.wants/${AMPERE_POWER_ON_INSTMPL}"
|
||||
SYSTEMD_LINK:${PN} += "${@compose_list_zip(d, 'AMPERE_POWER_ON_TARGET_FMT', 'OBMC_HOST_INSTANCES')}"
|
||||
|
||||
# append on obmc-chassis-poweron but will start after phosphor-state-manager init
|
||||
# host state as running
|
||||
HOST_CHECK_BMC_REBOOT_HOSTTMPL = "ampere-bmc-reboot-host-check@.service"
|
||||
HOST_CHECK_BMC_REBOOT_HOSTINSTMPL = "ampere-bmc-reboot-host-check@{0}.service"
|
||||
HOST_CHECK_BMC_REBOOT_HOSTTGTFMT = "obmc-chassis-poweron@{0}.target"
|
||||
HOST_CHECK_BMC_REBOOT_HOSTFMT = "../${HOST_CHECK_BMC_REBOOT_HOSTTMPL}:${HOST_CHECK_BMC_REBOOT_HOSTTGTFMT}.requires/${HOST_CHECK_BMC_REBOOT_HOSTINSTMPL}"
|
||||
SYSTEMD_LINK:${PN} += "${@compose_list_zip(d, 'HOST_CHECK_BMC_REBOOT_HOSTFMT', 'OBMC_HOST_INSTANCES')}"
|
||||
|
||||
do_install() {
|
||||
install -d ${D}/usr/sbin
|
||||
install -m 0755 ${WORKDIR}/ampere_host_check.sh ${D}/${sbindir}/
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
[Unit]
|
||||
Description=Check Host%i status after bmc reboot
|
||||
After=obmc-host-reset@%i.target
|
||||
After=obmc-host-reset-running@%i.target
|
||||
After=mapper-wait@-xyz-openbmc_project-state-host%i.service
|
||||
OnSuccess=obmc-host-already-on@%i.target
|
||||
ConditionPathExists=/run/openbmc/chassis@%i-on
|
||||
ConditionPathExists=/run/openbmc/host@%i-on
|
||||
Conflicts=obmc-chassis-poweroff@%i.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/bin/sh -c "if [ $(busctl get-property `mapper get-service /xyz/openbmc_project/state/host0` /xyz/openbmc_project/state/host0 xyz.openbmc_project.State.Host CurrentHostState | grep -i '\.Running' | wc -l) != 0 ]; then exit 0; fi"
|
||||
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
[Unit]
|
||||
Description=Ampere Computing LLC force reset host%i
|
||||
Wants=phosphor-reboot-host@%i.service
|
||||
Conflicts=obmc-chassis-poweroff@%i.target
|
||||
OnFailure=obmc-chassis-powerreset@%i.target
|
||||
|
||||
[Service]
|
||||
RemainAfterExit=no
|
||||
Type=oneshot
|
||||
ExecStart=/bin/sh -c "sleep 3 && /usr/bin/env ampere_power_util.sh mb force_reset"
|
||||
SyslogIdentifier=ampere_power_util.sh
|
||||
|
||||
[Install]
|
||||
WantedBy=obmc-host-force-warm-reboot@%i.target
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
[Unit]
|
||||
Description=Check Host%i status before obmc-host-startmin
|
||||
After=obmc-host-started@%i.target
|
||||
After=obmc-power-start-pre@%i.target
|
||||
Conflicts=obmc-host-stop@%i.target
|
||||
Conflicts=phosphor-reset-host-check@%i.service
|
||||
OnFailure=obmc-host-quiesce@%i.target
|
||||
OnSuccess=obmc-host-already-on@%i.target
|
||||
OnFailureJobMode=flush
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/sbin/ampere_host_check.sh
|
||||
@@ -0,0 +1,30 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Check current Host status. Do nothing when the Host is currently ON
|
||||
st=$(busctl get-property xyz.openbmc_project.State.Host \
|
||||
/xyz/openbmc_project/state/host0 xyz.openbmc_project.State.Host \
|
||||
CurrentHostState | cut -d"." -f6)
|
||||
if [ "$st" == "Running\"" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Time out checking for Host ON is 60s
|
||||
cnt=60
|
||||
while [ "$cnt" -gt 0 ];
|
||||
do
|
||||
cnt=$((cnt - 1))
|
||||
st=$(busctl call xyz.openbmc_project.State.HostCondition.Gpio \
|
||||
/xyz/openbmc_project/Gpios/host0 org.freedesktop.DBus.Properties \
|
||||
Get ss xyz.openbmc_project.Condition.HostFirmware \
|
||||
CurrentFirmwareCondition | cut -d"." -f6)
|
||||
if [ "$st" == "Running\"" ]; then
|
||||
if command -v ampere_driver_binder.sh;
|
||||
then
|
||||
ampere_driver_binder.sh
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
exit 1
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
[Unit]
|
||||
Description=Ampere Host %i already on target
|
||||
Conflicts=obmc-chassis-poweroff@%i.target
|
||||
Conflicts=obmc-host-quiesce@%i.target
|
||||
Conflicts=ampere-host-force-reset@%i.service
|
||||
Conflicts=ampere-host-shutdown-ack@%i.service
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
[Unit]
|
||||
Description=Ampere power %i already on target
|
||||
After=phosphor-wait-power-on@%i.service
|
||||
Conflicts=obmc-chassis-poweroff@%i.target
|
||||
Conflicts=ampere-host-shutdown-ack@%i.service
|
||||
@@ -0,0 +1,28 @@
|
||||
SUMMARY = "Enable USB ethernet"
|
||||
PR = "r1"
|
||||
LICENSE = "Apache-2.0"
|
||||
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
|
||||
|
||||
DEPENDS += "systemd"
|
||||
RDEPENDS:${PN} += "libsystemd bash"
|
||||
|
||||
inherit allarch systemd
|
||||
|
||||
SRC_URI += "file://ampere-usbnet.service \
|
||||
file://ampere_usbnet.sh \
|
||||
file://00-bmc-usb0.network"
|
||||
|
||||
do_install() {
|
||||
install -d ${D}${systemd_unitdir}/system/
|
||||
install -m 0644 ${WORKDIR}/ampere-usbnet.service ${D}${systemd_unitdir}/system
|
||||
|
||||
install -d ${D}${sysconfdir_native}/systemd/network/
|
||||
install -m 0644 ${WORKDIR}/00-bmc-usb0.network ${D}${sysconfdir_native}/systemd/network
|
||||
|
||||
install -d ${D}/${sbindir}
|
||||
install -m 755 ${WORKDIR}/ampere_usbnet.sh ${D}/${sbindir}
|
||||
}
|
||||
|
||||
NATIVE_SYSTEMD_SUPPORT = "1"
|
||||
SYSTEMD_PACKAGES = "${PN}"
|
||||
SYSTEMD_SERVICE:${PN} = "ampere-usbnet.service"
|
||||
@@ -0,0 +1,8 @@
|
||||
[Match]
|
||||
Name=usb0
|
||||
[Address]
|
||||
Address=192.168.0.10/16
|
||||
[Network]
|
||||
LinkLocalAddressing=no
|
||||
IPv6AcceptRA=no
|
||||
DHCP=no
|
||||
@@ -0,0 +1,12 @@
|
||||
[Unit]
|
||||
Description=Ampere Ethernet over USB gadget device
|
||||
After=phosphor-ipmi-host.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
ExecStart=/usr/sbin/ampere_usbnet.sh
|
||||
ExecStop=/usr/bin/usb-ctrl ecm usbnet off
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,18 @@
|
||||
#!/bin/bash
|
||||
|
||||
ENV_MAC_ADDR=$(fw_printenv bmc_macaddr)
|
||||
|
||||
MAC_ADDR=$(echo "$ENV_MAC_ADDR" | cut -d "=" -f 2)
|
||||
|
||||
if [ -n "$MAC_ADDR" ]; then
|
||||
# Generate MAC Address from eth1addr using locally administered MAC
|
||||
# https://en.wikipedia.org/wiki/MAC_address#Universal_vs._local_(U/L_bit
|
||||
SUBMAC=$(echo "$MAC_ADDR" | cut -d ":" -f 2-6)
|
||||
/usr/bin/usb-ctrl ecm usbnet on "06:$SUBMAC" "02:$SUBMAC"
|
||||
else
|
||||
/usr/bin/usb-ctrl ecm usbnet on
|
||||
fi
|
||||
|
||||
# Use NCM (Ethernet) Gadget instead of FunctionFS Gadget
|
||||
echo 0x0103 > /sys/kernel/config/usb_gadget/usbnet/idProduct
|
||||
echo "OpenBMC usbnet Device" > /sys/kernel/config/usb_gadget/usbnet/strings/0x409/product
|
||||
@@ -0,0 +1,35 @@
|
||||
SUMMARY = "Ampere Driver Binder Implementation"
|
||||
DESCRIPTION = "The driver binder 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"
|
||||
S = "${WORKDIR}"
|
||||
|
||||
SRC_URI = " \
|
||||
file://ampere-power-on-driver-binder@.service \
|
||||
file://ampere-host-on-driver-binder@.service \
|
||||
"
|
||||
|
||||
SYSTEMD_PACKAGES = "${PN}"
|
||||
SYSTEMD_SERVICE:${PN} = " \
|
||||
ampere-power-on-driver-binder@.service \
|
||||
ampere-host-on-driver-binder@.service \
|
||||
"
|
||||
# bind driver after the power is on
|
||||
POWER_ON_DRIVER_BINDER_TGT = "ampere-power-on-driver-binder@.service"
|
||||
POWER_ON_DRIVER_BINDER_INSTMPL = "ampere-power-on-driver-binder@{0}.service"
|
||||
AMPER_POWER_ON = "obmc-power-already-on@{0}.target"
|
||||
POWER_ON_DRIVER_BINDER_TARGET_FMT = "../${POWER_ON_DRIVER_BINDER_TGT}:${AMPER_POWER_ON}.wants/${POWER_ON_DRIVER_BINDER_INSTMPL}"
|
||||
SYSTEMD_LINK:${PN} += "${@compose_list_zip(d, 'POWER_ON_DRIVER_BINDER_TARGET_FMT', 'OBMC_HOST_INSTANCES')}"
|
||||
|
||||
# bind driver after the host is on
|
||||
HOST_ON_DRIVER_BINDER_TGT = "ampere-host-on-driver-binder@.service"
|
||||
HOST_ON_DRIVER_BINDER_INSTMPL = "ampere-host-on-driver-binder@{0}.service"
|
||||
AMPER_HOST_RUNNING = "obmc-host-already-on@{0}.target"
|
||||
HOST_ON_DRIVER_BINDER_TARGET_FMT = "../${HOST_ON_DRIVER_BINDER_TGT}:${AMPER_HOST_RUNNING}.wants/${HOST_ON_DRIVER_BINDER_INSTMPL}"
|
||||
SYSTEMD_LINK:${PN} += "${@compose_list_zip(d, 'HOST_ON_DRIVER_BINDER_TARGET_FMT', 'OBMC_HOST_INSTANCES')}"
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
[Unit]
|
||||
Description=Ampere host on driver binder %i
|
||||
After=obmc-host-already-on@%i.target
|
||||
BindTo=obmc-host-already-on@%i.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/bin/sh -c "if command -v ampere_host_on_driver_binder.sh; then echo 'Try to bind driver after host on if does not' && ampere_host_on_driver_binder.sh; fi && exit 0;"
|
||||
SyslogIdentifier=host_on_binder
|
||||
RemainAfterExit=no
|
||||
|
||||
[Install]
|
||||
WantedBy=obmc-host-already-on@%i.target
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
[Unit]
|
||||
Description=Ampere power on driver binder %i
|
||||
After=obmc-power-already-on@%i.target
|
||||
BindTo=obmc-power-already-on@%i.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/bin/sh -c "if command -v ampere_power_on_driver_binder.sh; then echo 'Try to bind driver after power on if does not' && ampere_power_on_driver_binder.sh; fi && exit 0;"
|
||||
SyslogIdentifier=power_on_binder
|
||||
RemainAfterExit=no
|
||||
@@ -0,0 +1,23 @@
|
||||
SUMMARY = "Ampere Computing LLC Fault Monitor"
|
||||
DESCRIPTION = "Monitor fault events and update fault led status for Ampere 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
|
||||
|
||||
FILESEXTRAPATHS:append := "${THISDIR}/${PN}:"
|
||||
|
||||
SYSTEMD_SERVICE:${PN} = "ampere-fault-monitor.service"
|
||||
|
||||
GPIO_FAULT_START_TGT = "ampere-check-gpio-fault@.service"
|
||||
GPIO_FAULT_START_S0_INSTMPL = "ampere-check-gpio-fault@{0}.service"
|
||||
SYSTEMD_SERVICE:${PN} += "${GPIO_FAULT_START_TGT}"
|
||||
|
||||
HOST_ON_STARTMIN_TGTFMT = "obmc-host-startmin@{0}.target"
|
||||
GPIO_FAULT_START_S0_STARTMIN_FMT = "../${GPIO_FAULT_START_TGT}:${HOST_ON_STARTMIN_TGTFMT}.wants/${GPIO_FAULT_START_S0_INSTMPL}"
|
||||
SYSTEMD_LINK:${PN} += "${@compose_list_zip(d, 'GPIO_FAULT_START_S0_STARTMIN_FMT', 'OBMC_HOST_INSTANCES')}"
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
[Unit]
|
||||
Description=Monitor GPIO fault and updade fault LED status %i
|
||||
Before=obmc-host-start-pre@0.target
|
||||
After=obmc-host-already-on@0.target
|
||||
Conflicts=obmc-host-stop@0.target
|
||||
|
||||
[Service]
|
||||
Restart=no
|
||||
ExecStart=/bin/sh -c "if [ -f /usr/sbin/ampere_check_gpio_fault.sh ]; then /usr/sbin/ampere_check_gpio_fault.sh %i; fi"
|
||||
ExecStopPost=/bin/sh -c "if [ -f /tmp/gpio_fault ]; then sleep 5; rm /tmp/gpio_fault; fi"
|
||||
SyslogIdentifier=ampere_check_fault_gpio
|
||||
Type=simple
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
[Unit]
|
||||
Description=Monitor fault events and updade fault LED status
|
||||
After=xyz.openbmc_project.State.Host@0.service
|
||||
|
||||
[Service]
|
||||
Restart=on-failure
|
||||
ExecStart=/usr/sbin/ampere_fault_monitor.sh
|
||||
SyslogIdentifier=ampere_fault_monitor.sh
|
||||
Type=simple
|
||||
|
||||
[Install]
|
||||
WantedBy={SYSTEMD_DEFAULT_TARGET}
|
||||
@@ -0,0 +1,22 @@
|
||||
SUMMARY = "Ampere Platform Environment Definitions"
|
||||
DESCRIPTION = "Ampere Platform Environment Definitions"
|
||||
PR = "r1"
|
||||
LICENSE = "Apache-2.0"
|
||||
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
|
||||
|
||||
SRC_URI = " \
|
||||
file://ampere_add_redfishevent.sh \
|
||||
file://ampere_update_mac.sh \
|
||||
file://ampere_spi_util.sh \
|
||||
file://ampere_power_control_lock.sh \
|
||||
"
|
||||
|
||||
RDEPENDS:${PN} = "bash"
|
||||
|
||||
do_install() {
|
||||
install -d ${D}/usr/sbin
|
||||
install -m 0755 ${WORKDIR}/ampere_add_redfishevent.sh ${D}/${sbindir}/
|
||||
install -m 0755 ${WORKDIR}/ampere_update_mac.sh ${D}/${sbindir}/
|
||||
install -m 0755 ${WORKDIR}/ampere_spi_util.sh ${D}/${sbindir}/
|
||||
install -m 0755 ${WORKDIR}/ampere_power_control_lock.sh ${D}/${sbindir}/
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
#!/bin/bash
|
||||
|
||||
registry=$1
|
||||
msgarg=$2
|
||||
|
||||
if [ -z "$registry" ]; then
|
||||
echo "Usage:"
|
||||
echo " $0 <redfish registry> <argument>"
|
||||
exit
|
||||
fi
|
||||
|
||||
# Check if logger-systemd exist. Do nothing if not exists
|
||||
if ! command -v logger-systemd;
|
||||
then
|
||||
echo "logger-systemd does not exist. Skip log events for $registry $msgarg"
|
||||
exit
|
||||
fi
|
||||
|
||||
# Log events
|
||||
logger-systemd --journald << EOF
|
||||
MESSAGE=
|
||||
PRIORITY=
|
||||
SEVERITY=
|
||||
REDFISH_MESSAGE_ID=$registry
|
||||
REDFISH_MESSAGE_ARGS=$msgarg
|
||||
EOF
|
||||
+99
@@ -0,0 +1,99 @@
|
||||
#!/bin/bash
|
||||
|
||||
declare -a power_reboot_targets=(
|
||||
obmc-host-reboot@0.target
|
||||
obmc-host-warm-reboot@0.target
|
||||
obmc-host-force-warm-reboot@0.target
|
||||
)
|
||||
|
||||
declare -a power_off_targets=(
|
||||
obmc-chassis-hard-poweroff@0.target
|
||||
)
|
||||
|
||||
declare -a power_on_targets=(
|
||||
obmc-host-start@0.target
|
||||
)
|
||||
|
||||
systemd1_service="org.freedesktop.systemd1"
|
||||
systemd1_object_path="/org/freedesktop/systemd1"
|
||||
systemd1_manager_interface="org.freedesktop.systemd1.Manager"
|
||||
mask_method="MaskUnitFiles"
|
||||
unmask_method="UnmaskUnitFiles"
|
||||
|
||||
function mask_reboot_targets()
|
||||
{
|
||||
# To prevent reboot actions, this function will mask all reboot targets
|
||||
for target in "${power_reboot_targets[@]}"
|
||||
do
|
||||
busctl call $systemd1_service $systemd1_object_path $systemd1_manager_interface \
|
||||
$mask_method asbb 1 "$target" true true
|
||||
done
|
||||
}
|
||||
|
||||
function unmask_reboot_targets()
|
||||
{
|
||||
# Allow reboot targets work normal
|
||||
for target in "${power_reboot_targets[@]}"
|
||||
do
|
||||
busctl call $systemd1_service $systemd1_object_path $systemd1_manager_interface \
|
||||
$unmask_method asb 1 "$target" true
|
||||
done
|
||||
}
|
||||
|
||||
function mask_off_targets()
|
||||
{
|
||||
# To prevent off actions,this function will mask all off targets
|
||||
for target in "${power_off_targets[@]}"
|
||||
do
|
||||
busctl call $systemd1_service $systemd1_object_path $systemd1_manager_interface \
|
||||
$mask_method asbb 1 "$target" true true
|
||||
done
|
||||
}
|
||||
|
||||
function unmask_off_targets()
|
||||
{
|
||||
# Allow off targets work normal
|
||||
for target in "${power_off_targets[@]}"
|
||||
do
|
||||
busctl call $systemd1_service $systemd1_object_path $systemd1_manager_interface \
|
||||
$unmask_method asb 1 "$target" true
|
||||
done
|
||||
}
|
||||
|
||||
function mask_on_targets()
|
||||
{
|
||||
# To prevent on actions, this function will mask all on targets
|
||||
systemctl mask "${power_on_targets[@]}" --runtime
|
||||
}
|
||||
|
||||
function unmask_on_targets()
|
||||
{
|
||||
# Allow on targets work normal
|
||||
systemctl unmask "${power_on_targets[@]}" --runtime
|
||||
}
|
||||
|
||||
purpose=$1
|
||||
allow=$2
|
||||
|
||||
if [ "$purpose" == "reboot" ]; then
|
||||
if [ "$allow" == "false" ]
|
||||
then
|
||||
mask_reboot_targets
|
||||
else
|
||||
unmask_reboot_targets
|
||||
fi
|
||||
elif [ "$purpose" == "off" ]; then
|
||||
if [ "$allow" == "false" ]
|
||||
then
|
||||
mask_off_targets
|
||||
else
|
||||
unmask_off_targets
|
||||
fi
|
||||
elif [ "$purpose" == "on" ]; then
|
||||
if [ "$allow" == "false" ]
|
||||
then
|
||||
mask_on_targets
|
||||
else
|
||||
unmask_on_targets
|
||||
fi
|
||||
fi
|
||||
+242
@@ -0,0 +1,242 @@
|
||||
#!/bin/bash
|
||||
|
||||
# shellcheck disable=SC2046
|
||||
# shellcheck source=meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/gpio-lib.sh
|
||||
source /usr/sbin/gpio-lib.sh
|
||||
|
||||
spi_address="1e630000.spi"
|
||||
spi_bind="/sys/bus/platform/drivers/spi-aspeed-smc/bind"
|
||||
spi_unbind="/sys/bus/platform/drivers/spi-aspeed-smc/unbind"
|
||||
spi_lock="/run/platform/spi.lock"
|
||||
spi_lock_dir="/run/platform"
|
||||
|
||||
bind_aspeed_smc_driver() {
|
||||
if [ -f "${spi_lock}" ]; then
|
||||
pid=$1
|
||||
pid_lock=$(cat "${spi_lock}")
|
||||
if [[ "${pid}" != "${pid_lock}" ]]; then
|
||||
echo "SPI-NOR resoure is lock by process $pid_lock"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# BMC access SPI-NOR resource
|
||||
gpio_name_set spi0-program-sel 1
|
||||
sleep 0.1
|
||||
echo "Bind the ASpeed SMC driver"
|
||||
echo "${spi_address}" > "${spi_bind}" 2>/dev/null
|
||||
# Check the HNOR partition available
|
||||
HOST_MTD=$(< /proc/mtd grep "pnor" | sed -n 's/^\(.*\):.*/\1/p')
|
||||
if [ -z "$HOST_MTD" ]; then
|
||||
echo "${spi_address}" > "${spi_unbind}"
|
||||
sleep 0.1
|
||||
echo "${spi_address}" > "${spi_bind}"
|
||||
fi
|
||||
# BMC release SPI-NOR resource
|
||||
gpio_name_set spi0-program-sel 0
|
||||
return 0
|
||||
}
|
||||
|
||||
unbind_aspeed_smc_driver() {
|
||||
if [ -f "${spi_lock}" ]; then
|
||||
pid=$1
|
||||
pid_lock=$(cat "${spi_lock}")
|
||||
if [[ "${pid}" != "${pid_lock}" ]]; then
|
||||
echo "SPI-NOR resoure is lock by process $pid_lock . Wait 10s"
|
||||
# Wait maximum 10 seconds for unlock SPI-NOR
|
||||
cnt=10
|
||||
while [ $cnt -gt 0 ]
|
||||
do
|
||||
if [ -f "${spi_lock}" ]; then
|
||||
sleep 1
|
||||
cnt=$((cnt - 1))
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ "$cnt" -eq "0" ]; then
|
||||
echo "Timeout 10 seconds, SPI-NOR still busy. Force unlock to access SPI"
|
||||
rm -f "${spi_lock}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
HOST_MTD=$(< /proc/mtd grep "pnor" | sed -n 's/^\(.*\):.*/\1/p')
|
||||
if [ -n "$HOST_MTD" ]; then
|
||||
# If the HNOR partition is available, then unbind driver
|
||||
# BMC access SPI-NOR resource
|
||||
gpio_name_set spi0-program-sel 1
|
||||
sleep 0.1
|
||||
echo "Unbind the ASpeed SMC driver"
|
||||
echo "${spi_address}" > "${spi_unbind}"
|
||||
fi
|
||||
# BMC release SPI-NOR resource
|
||||
gpio_name_set spi0-program-sel 0
|
||||
# Deassert BMC access SPI-NOR pin
|
||||
gpio_name_set spi-nor-access 0
|
||||
sleep 0.5
|
||||
return 0
|
||||
}
|
||||
|
||||
lock_spi_resource() {
|
||||
# Wait maximum 10 seconds to lock SPI-NOR
|
||||
cnt=10
|
||||
while [ $cnt -gt 0 ]
|
||||
do
|
||||
if [ -f "${spi_lock}" ]; then
|
||||
sleep 1
|
||||
cnt=$((cnt - 1))
|
||||
else
|
||||
echo "$1" > "${spi_lock}"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$cnt" -eq "0" ]; then
|
||||
echo "Timeout 10 seconds, SPI-NOR is still locked by another process"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
unlock_spi_resource() {
|
||||
if [ ! -f "${spi_lock}" ]; then
|
||||
echo "SPI-NOR is already unlocked"
|
||||
return 0
|
||||
fi
|
||||
|
||||
pid=$1
|
||||
pid_lock=$(cat "${spi_lock}")
|
||||
if [[ "${pid}" == "${pid_lock}" ]]; then
|
||||
rm -f "${spi_lock}"
|
||||
else
|
||||
echo "Cannot unlock, SPI-NOR is locked by another process"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
start_handshake_spi() {
|
||||
if [ -f "${spi_lock}" ]; then
|
||||
pid=$1
|
||||
pid_lock=$(cat "${spi_lock}")
|
||||
if [[ "${pid}" != "${pid_lock}" ]]; then
|
||||
echo "SPI-NOR resoure is lock by process $pid_lock"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Wait maximum 10 seconds to grant access SPI
|
||||
cnt=10
|
||||
while [ $cnt -gt 0 ]
|
||||
do
|
||||
spinor_access=$(gpio_name_get soc-spi-nor-access)
|
||||
if [ "$spinor_access" == "1" ]; then
|
||||
sleep 1
|
||||
cnt=$((cnt - 1))
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$cnt" -eq "0" ]; then
|
||||
echo "Timeout 10 seconds, host is still hold SPI-NOR."
|
||||
return 1
|
||||
fi
|
||||
echo "Start handshake SPI-NOR"
|
||||
# Grant BMC access SPI-NOR. The process call the scripts should only
|
||||
# claim the bus for only maximum period 500ms.
|
||||
gpio_name_set spi-nor-access 1
|
||||
# Switch the Host SPI-NOR to BMC
|
||||
gpio_name_set spi0-program-sel 1
|
||||
}
|
||||
|
||||
stop_handshake_spi() {
|
||||
if [ -f "${spi_lock}" ]; then
|
||||
pid=$1
|
||||
pid_lock=$(cat "${spi_lock}")
|
||||
if [[ "${pid}" != "${pid_lock}" ]]; then
|
||||
echo "SPI-NOR resoure is lock by process $pid_lock"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
echo "Stop handshake SPI-NOR"
|
||||
# Switch the Host SPI-NOR to HOST
|
||||
gpio_name_set spi0-program-sel 0
|
||||
# Deassert BMC access SPI-NOR pin
|
||||
gpio_name_set spi-nor-access 0
|
||||
}
|
||||
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Usage:"
|
||||
echo " - Handshake access SPI-NOR "
|
||||
echo " $(basename "$0") cmd pid"
|
||||
echo " <cmd>:"
|
||||
echo " lock - lock the SPI-NOR resource"
|
||||
echo " unlock - unlock the SPI-NOR resource"
|
||||
echo " bind - bind the SPI-NOR resource"
|
||||
echo " unbind - unbind the SPI-NOR resource"
|
||||
echo " start_handshake - start handshake between BMC and Host"
|
||||
echo " stop_handshake - release handshake between BMC and Host"
|
||||
echo " <pid>: Optional - PID of the process call script"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
CMD=$1
|
||||
|
||||
if [ ! -d "${spi_lock_dir}" ]; then
|
||||
mkdir -p "${spi_lock_dir}"
|
||||
fi
|
||||
|
||||
if [ -z "$2" ]; then
|
||||
PID=$$
|
||||
else
|
||||
PID=$2
|
||||
fi
|
||||
|
||||
if [[ "${CMD}" == "lock" ]]; then
|
||||
lock_spi_resource "${PID}"
|
||||
ret=$?
|
||||
if [[ "${ret}" == "1" ]]; then
|
||||
echo "Cannot lock SPI-NOR, the resource is busy"
|
||||
exit 1
|
||||
fi
|
||||
elif [[ "${CMD}" == "unlock" ]]; then
|
||||
unlock_spi_resource "${PID}"
|
||||
ret=$?
|
||||
if [[ "${ret}" == "1" ]]; then
|
||||
echo "Cannot unlock SPI-NOR, the resource is busy"
|
||||
exit 1
|
||||
fi
|
||||
elif [[ "${CMD}" == "bind" ]]; then
|
||||
bind_aspeed_smc_driver "${PID}"
|
||||
ret=$?
|
||||
if [[ "${ret}" == "1" ]]; then
|
||||
echo "Cannot bind SPI-NOR, the resource is busy"
|
||||
exit 1
|
||||
fi
|
||||
elif [[ "${CMD}" == "unbind" ]]; then
|
||||
unbind_aspeed_smc_driver "${PID}"
|
||||
ret=$?
|
||||
if [[ "${ret}" == "1" ]]; then
|
||||
echo "Cannot unbind SPI-NOR, the resource is busy"
|
||||
exit 1
|
||||
fi
|
||||
elif [[ "${CMD}" == "start_handshake" ]]; then
|
||||
start_handshake_spi "${PID}"
|
||||
ret=$?
|
||||
if [[ "${ret}" == "1" ]]; then
|
||||
echo "Cannot start handshake SPI-NOR"
|
||||
exit 1
|
||||
fi
|
||||
elif [[ "${CMD}" == "stop_handshake" ]]; then
|
||||
stop_handshake_spi "${PID}"
|
||||
ret=$?
|
||||
if [[ "${ret}" == "1" ]]; then
|
||||
echo "Cannot stop handshake SPI-NOR"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,115 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# This script is used to get the BMC MAC Address from FRU EEPROM at Board Extra.
|
||||
# and if the eth address is not exist on U-boot Enviroment, this script will update it.
|
||||
#
|
||||
|
||||
function Usage () {
|
||||
echo "Usage:"
|
||||
echo " ampere_update_mac.sh <ethX> <fru bus> <fru addr>"
|
||||
echo "Example:"
|
||||
echo " ampere_update_mac.sh eth1 3 80"
|
||||
}
|
||||
|
||||
function read_mac_address () {
|
||||
fruBus=$1
|
||||
fruAddr=$2
|
||||
|
||||
if FRU_OBJECT_PATH=$(busctl tree xyz.openbmc_project.FruDevice | grep "/xyz/openbmc_project/FruDevice/" | tr -s '\n' ' ' | tr -d "|-" | tr -d '`')
|
||||
then
|
||||
IFS=' ' read -r -a FRU_OBJ_PATH_ARR <<< "$FRU_OBJECT_PATH"
|
||||
|
||||
for fruObj in "${FRU_OBJ_PATH_ARR[@]}"
|
||||
do
|
||||
BUS_IDX_RW=$(busctl get-property xyz.openbmc_project.FruDevice "$fruObj" xyz.openbmc_project.FruDevice BUS)
|
||||
BUS_ADDR_RW=$(busctl get-property xyz.openbmc_project.FruDevice "$fruObj" xyz.openbmc_project.FruDevice ADDRESS)
|
||||
|
||||
if [ -z "$BUS_IDX_RW" ] || [ -z "$BUS_IDX_RW" ]; then
|
||||
continue
|
||||
else
|
||||
BUS_IDX_CV=$(echo "$BUS_IDX_RW" | cut -d " " -f 2)
|
||||
BUS_ADDR_CV=$(echo "$BUS_ADDR_RW" | cut -d " " -f 2)
|
||||
if [ "$BUS_IDX_CV" != "$fruBus" ] || [ "$BUS_ADDR_CV" != "$fruAddr" ]; then
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
MAC_ADDR_RAW=$(busctl get-property xyz.openbmc_project.FruDevice "$fruObj" xyz.openbmc_project.FruDevice BOARD_INFO_AM1)
|
||||
MAC_ADDR=$(echo "$MAC_ADDR_RAW" | cut -d "\"" -f 2)
|
||||
break
|
||||
done
|
||||
fi
|
||||
echo "$MAC_ADDR"
|
||||
}
|
||||
|
||||
ETHERNET_INTERFACE=$1
|
||||
BMC_FRU_BUS=$2
|
||||
BMC_FRU_ADDR=$3
|
||||
|
||||
if [ -z "$BMC_FRU_ADDR" ];
|
||||
then
|
||||
Usage
|
||||
exit
|
||||
fi
|
||||
|
||||
# Check eth port
|
||||
case ${ETHERNET_INTERFACE} in
|
||||
"eth0")
|
||||
ENV_PORT="1"
|
||||
;;
|
||||
"eth1")
|
||||
ENV_PORT="2"
|
||||
;;
|
||||
"eth2")
|
||||
ENV_PORT="3"
|
||||
;;
|
||||
*)
|
||||
Usage
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
|
||||
# Read FRU Board Custom Field 1 to get the MAC address
|
||||
for i in {1..10}; do
|
||||
MAC_ADDR=$(read_mac_address "$BMC_FRU_BUS" "$BMC_FRU_ADDR")
|
||||
|
||||
# Check if BMC MAC address is exported
|
||||
if [ -z "${MAC_ADDR}" ]; then
|
||||
sleep 2
|
||||
continue
|
||||
fi
|
||||
|
||||
if echo "$MAC_ADDR" | grep -q -vE "^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$" ; then
|
||||
echo "ERROR: No valid BMC MAC Address detected from BMC FRU! $MAC_ADDR"
|
||||
exit 0
|
||||
else
|
||||
echo "mac-update: detect BMC MAC $MAC_ADDR at loop $i"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# Check if the Ethernet port has correct MAC Address
|
||||
ETH_INCLUDE_MAC=$(ifconfig "${ETHERNET_INTERFACE}" | grep -i "$MAC_ADDR")
|
||||
if [ -n "$ETH_INCLUDE_MAC" ]; then
|
||||
echo "BMC MAC Address is already configured"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Request to restart the service
|
||||
ifconfig "${ETHERNET_INTERFACE}" down
|
||||
fw_setenv bmc_macaddr "${MAC_ADDR}"
|
||||
|
||||
ifconfig "${ETHERNET_INTERFACE}" hw ether "${MAC_ADDR}"
|
||||
retval=$?
|
||||
if [[ $retval -ne 0 ]]; then
|
||||
echo "ERROR: Can not update MAC ADDR to ${ETHERNET_INTERFACE}"
|
||||
exit 1
|
||||
fi
|
||||
# Setting LAN MAC Address to xx:xx:xx:xx:xx:xx
|
||||
ipmitool lan set "${ENV_PORT}" macaddr "${ETHERNET_INTERFACE}"
|
||||
# Enableing BMC-generated ARP responses & Setting SNMP Community String to public
|
||||
ipmitool lan set "${ENV_PORT}" arp respond on
|
||||
ipmitool lan set "${ENV_PORT}" snmp public
|
||||
ifconfig "${ETHERNET_INTERFACE}" up
|
||||
|
||||
echo "Successfully update the MAC address ${MAC_ADDR} to ${ETHERNET_INTERFACE}"
|
||||
@@ -0,0 +1,17 @@
|
||||
def run_git(d, cmd):
|
||||
try:
|
||||
oeroot = d.getVar('COREBASE', True)
|
||||
return bb.process.run("git --work-tree %s --git-dir %s/.git %s"
|
||||
% (oeroot, oeroot, cmd))[0].strip('\n')
|
||||
except:
|
||||
pass
|
||||
|
||||
python() {
|
||||
version_id = run_git(d, 'describe --dirty --long --tags')
|
||||
if version_id:
|
||||
versionList = version_id.split('-')
|
||||
|
||||
# Override with tag name only, if built at tag.
|
||||
if 'dirty' not in version_id and versionList[1] == 'ampere':
|
||||
d.setVar('VERSION_ID', versionList[0].split('v')[-1])
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
enforce_for_root
|
||||
minlen=9
|
||||
difok=0
|
||||
lcredit=-1
|
||||
ocredit=-1
|
||||
dcredit=-1
|
||||
ucredit=-1
|
||||
maxrepeat=3
|
||||
@@ -0,0 +1,5 @@
|
||||
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
|
||||
|
||||
SRC_URI += " \
|
||||
file://pwquality.conf \
|
||||
"
|
||||
@@ -0,0 +1,2 @@
|
||||
deny=5
|
||||
unlock_time=1800
|
||||
@@ -0,0 +1,4 @@
|
||||
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
|
||||
|
||||
SRC_URI += " file://faillock.conf \
|
||||
"
|
||||
@@ -0,0 +1,91 @@
|
||||
#Host console log
|
||||
|
||||
module(load="imuxsock" SysSock.Use="off")
|
||||
|
||||
template(name="ConsoleTemplate" type="string" string="%rawmsg%")
|
||||
|
||||
ruleset(name="ConsoleCPURuleset") {
|
||||
action(type="omfile" file="/var/log/obmc-console-cpu.log" template="ConsoleTemplate")
|
||||
}
|
||||
ruleset(name="ConsoleATFRuleset") {
|
||||
action(type="omfile" file="/var/log/obmc-console-atf.log" template="ConsoleTemplate")
|
||||
}
|
||||
ruleset(name="ConsoleSECPRO0Ruleset") {
|
||||
action(type="omfile" file="/var/log/obmc-console-secpro0.log" template="ConsoleTemplate")
|
||||
}
|
||||
ruleset(name="ConsoleSECPRO1Ruleset") {
|
||||
action(type="omfile" file="/var/log/obmc-console-secpro1.log" template="ConsoleTemplate")
|
||||
}
|
||||
ruleset(name="ConsoleMPRO0Ruleset") {
|
||||
action(type="omfile" file="/var/log/obmc-console-mpro0.log" template="ConsoleTemplate")
|
||||
}
|
||||
ruleset(name="ConsoleMPRO1Ruleset") {
|
||||
action(type="omfile" file="/var/log/obmc-console-mpro1.log" template="ConsoleTemplate")
|
||||
}
|
||||
ruleset(name="ConsoleSCP0Ruleset") {
|
||||
action(type="omfile" file="/var/log/obmc-console-scp0.log" template="ConsoleTemplate")
|
||||
}
|
||||
ruleset(name="ConsoleSCP1Ruleset") {
|
||||
action(type="omfile" file="/var/log/obmc-console-scp1.log" template="ConsoleTemplate")
|
||||
}
|
||||
|
||||
# Custom socket for serial console logs.
|
||||
input(type="imuxsock"
|
||||
Socket="/run/rsyslog/console/cpu"
|
||||
CreatePath="on"
|
||||
UseSpecialParser="off"
|
||||
ParseHostname="off"
|
||||
ruleset="ConsoleCPURuleset")
|
||||
|
||||
input(type="imuxsock"
|
||||
Socket="/run/rsyslog/console/atf"
|
||||
CreatePath="on"
|
||||
UseSpecialParser="off"
|
||||
ParseHostname="off"
|
||||
ruleset="ConsoleATFRuleset")
|
||||
|
||||
input(type="imuxsock"
|
||||
Socket="/run/rsyslog/console/secpro0"
|
||||
CreatePath="on"
|
||||
UseSpecialParser="off"
|
||||
ParseHostname="off"
|
||||
ruleset="ConsoleSECPRO0Ruleset")
|
||||
|
||||
input(type="imuxsock"
|
||||
Socket="/run/rsyslog/console/secpro1"
|
||||
CreatePath="on"
|
||||
UseSpecialParser="off"
|
||||
ParseHostname="off"
|
||||
ruleset="ConsoleSECPRO1Ruleset")
|
||||
|
||||
input(type="imuxsock"
|
||||
Socket="/run/rsyslog/console/mpro0"
|
||||
CreatePath="on"
|
||||
UseSpecialParser="off"
|
||||
ParseHostname="off"
|
||||
ruleset="ConsoleMPRO0Ruleset")
|
||||
|
||||
input(type="imuxsock"
|
||||
Socket="/run/rsyslog/console/mpro1"
|
||||
CreatePath="on"
|
||||
UseSpecialParser="off"
|
||||
ParseHostname="off"
|
||||
ruleset="ConsoleMPRO1Ruleset")
|
||||
|
||||
input(type="imuxsock"
|
||||
Socket="/run/rsyslog/console/scp0"
|
||||
CreatePath="on"
|
||||
UseSpecialParser="off"
|
||||
ParseHostname="off"
|
||||
ruleset="ConsoleSCP0Ruleset")
|
||||
|
||||
input(type="imuxsock"
|
||||
Socket="/run/rsyslog/console/scp1"
|
||||
CreatePath="on"
|
||||
UseSpecialParser="off"
|
||||
ParseHostname="off"
|
||||
ruleset="ConsoleSCP1Ruleset")
|
||||
|
||||
$EscapeControlCharactersOnReceive off
|
||||
$DropTrailingLFOnReception off
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
[Unit]
|
||||
Description=Rotate the event logs
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/usr/bin/rotate-event-logs.sh
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,10 @@
|
||||
#!/bin/sh
|
||||
|
||||
while true; do
|
||||
sleep 60
|
||||
/usr/sbin/logrotate /etc/logrotate.d/logrotate.rsyslog
|
||||
ec=$?
|
||||
if [ $ec -ne 0 ] ; then
|
||||
echo "logrotate failed ($ec)"
|
||||
fi
|
||||
done
|
||||
@@ -0,0 +1,2 @@
|
||||
[Service]
|
||||
ExecReload=/bin/kill -HUP $MAINPID
|
||||
@@ -0,0 +1,79 @@
|
||||
# if you experience problems, check
|
||||
# http://www.rsyslog.com/troubleshoot for assistance
|
||||
|
||||
# rsyslog v3: load input modules
|
||||
# If you do not load inputs, nothing happens!
|
||||
# You may need to set the module load path if modules are not found.
|
||||
#
|
||||
# Ported from debian's sysklogd.conf
|
||||
|
||||
# Journal-style logging
|
||||
# Limit to no more than 2000 entries in one minute and enable the
|
||||
# journal workaround to avoid duplicate entries
|
||||
module(load="imjournal" StateFile="/var/log/state"
|
||||
RateLimit.Interval="60"
|
||||
RateLimit.Burst="4000")
|
||||
|
||||
# Template for IPMI SEL messages
|
||||
# "<timestamp> <ID>,<Type>,<EventData>,[<Generator ID>,<Path>,<Direction>]"
|
||||
template(name="IPMISELTemplate" type="list") {
|
||||
property(name="timereported" dateFormat="rfc3339")
|
||||
constant(value=" ")
|
||||
property(name="$!IPMI_SEL_RECORD_ID")
|
||||
constant(value=",")
|
||||
property(name="$!IPMI_SEL_RECORD_TYPE")
|
||||
constant(value=",")
|
||||
property(name="$!IPMI_SEL_DATA")
|
||||
constant(value=",")
|
||||
property(name="$!IPMI_SEL_GENERATOR_ID")
|
||||
constant(value=",")
|
||||
property(name="$!IPMI_SEL_SENSOR_PATH")
|
||||
constant(value=",")
|
||||
property(name="$!IPMI_SEL_EVENT_DIR")
|
||||
constant(value="\n")
|
||||
}
|
||||
|
||||
# Template for Redfish messages
|
||||
# "<timestamp> <MessageId>,<MessageArgs>"
|
||||
template(name="RedfishTemplate" type="list") {
|
||||
property(name="timereported" dateFormat="rfc3339")
|
||||
constant(value=" ")
|
||||
property(name="$!REDFISH_MESSAGE_ID")
|
||||
constant(value=",")
|
||||
property(name="$!REDFISH_MESSAGE_ARGS")
|
||||
constant(value="\n")
|
||||
}
|
||||
|
||||
# Template for Application Crashes
|
||||
# "<timestamp> <MessageId>,<MessageArgs>"
|
||||
template(name="CrashTemplate" type="list") {
|
||||
property(name="timereported" dateFormat="rfc3339")
|
||||
constant(value=" ")
|
||||
constant(value="OpenBMC.0.1.ServiceFailure")
|
||||
constant(value=",")
|
||||
property(name="$!UNIT")
|
||||
constant(value="\n")
|
||||
}
|
||||
|
||||
|
||||
# If the journal entry has the IPMI SEL MESSAGE_ID, save as IPMI SEL
|
||||
# The MESSAGE_ID string is generated using journalctl and must match the
|
||||
# MESSAGE_ID used in IPMI to correctly find the SEL entries.
|
||||
if ($!MESSAGE_ID == "b370836ccf2f4850ac5bee185b77893a") then {
|
||||
action(type="omfile" file="/var/log/ipmi_sel" template="IPMISELTemplate")
|
||||
}
|
||||
|
||||
# If the journal entry has a Redfish MessageId, save as a Redfish event
|
||||
if ($!REDFISH_MESSAGE_ID != "") then {
|
||||
action(type="omfile" file="/var/log/redfish" template="RedfishTemplate")
|
||||
}
|
||||
|
||||
# If the journal entry has a Exit Code, save as a Redfish event
|
||||
if ($!EXIT_STATUS != "" and $!EXIT_STATUS != "0") then {
|
||||
action(type="omfile" file="/var/log/redfish" template="CrashTemplate")
|
||||
}
|
||||
|
||||
#
|
||||
# Include all config files in /etc/rsyslog.d/
|
||||
#
|
||||
$IncludeConfig /etc/rsyslog.d/*.conf
|
||||
@@ -0,0 +1,67 @@
|
||||
# /etc/logrotate.d/rsyslog - Ported from Debian
|
||||
|
||||
# Keep up to four 64k files for ipmi_sel (256k total)
|
||||
/var/log/ipmi_sel
|
||||
{
|
||||
rotate 3
|
||||
size 64k
|
||||
missingok
|
||||
postrotate
|
||||
systemctl reload rsyslog 2> /dev/null || true
|
||||
endscript
|
||||
}
|
||||
# Keep up to four 64k files for redfish (256k total)
|
||||
/var/log/redfish
|
||||
{
|
||||
rotate 3
|
||||
size 64k
|
||||
missingok
|
||||
postrotate
|
||||
systemctl reload rsyslog 2> /dev/null || true
|
||||
endscript
|
||||
}
|
||||
# Keep up to 2 256k files for cpu console logs
|
||||
/var/log/obmc-console-cpu.log
|
||||
{
|
||||
copytruncate
|
||||
rotate 1
|
||||
size 256k
|
||||
missingok
|
||||
postrotate
|
||||
systemctl reload rsyslog 2> /dev/null || true
|
||||
endscript
|
||||
}
|
||||
# Keep up to 2 64k files for atf console logs
|
||||
/var/log/obmc-console-atf.log
|
||||
{
|
||||
copytruncate
|
||||
rotate 1
|
||||
size 64k
|
||||
missingok
|
||||
postrotate
|
||||
systemctl reload rsyslog 2> /dev/null || true
|
||||
endscript
|
||||
}
|
||||
# Keep up to 2 64k files for secpro and mpro console logs
|
||||
/var/log/obmc-console-*pro*.log
|
||||
{
|
||||
copytruncate
|
||||
rotate 1
|
||||
size 64k
|
||||
missingok
|
||||
postrotate
|
||||
systemctl reload rsyslog 2> /dev/null || true
|
||||
endscript
|
||||
}
|
||||
|
||||
# Keep up to 2 64k files for Mt.Jade's scp console logs
|
||||
/var/log/obmc-console-scp*.log
|
||||
{
|
||||
copytruncate
|
||||
rotate 1
|
||||
size 64k
|
||||
missingok
|
||||
postrotate
|
||||
systemctl reload rsyslog 2> /dev/null || true
|
||||
endscript
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
|
||||
|
||||
SRC_URI += "file://rsyslog.conf \
|
||||
file://rsyslog.logrotate \
|
||||
file://rotate-event-logs.service \
|
||||
file://rotate-event-logs.sh \
|
||||
file://rsyslog-override.conf \
|
||||
file://hostconsole.conf \
|
||||
"
|
||||
|
||||
FILES:${PN} += "${systemd_system_unitdir}/rsyslog.service.d/rsyslog-override.conf"
|
||||
|
||||
PACKAGECONFIG:append = " imjournal"
|
||||
|
||||
do_install:append() {
|
||||
install -m 0644 ${WORKDIR}/rotate-event-logs.service ${D}${systemd_system_unitdir}
|
||||
install -d ${D}${systemd_system_unitdir}/rsyslog.service.d
|
||||
install -m 0644 ${WORKDIR}/rsyslog-override.conf \
|
||||
${D}${systemd_system_unitdir}/rsyslog.service.d/rsyslog-override.conf
|
||||
install -d ${D}${bindir}
|
||||
install -m 0755 ${WORKDIR}/rotate-event-logs.sh ${D}/${bindir}/rotate-event-logs.sh
|
||||
install -m 0755 ${WORKDIR}/hostconsole.conf ${D}${sysconfdir}/rsyslog.d/hostconsole.conf
|
||||
rm ${D}${sysconfdir}/rsyslog.d/imjournal.conf
|
||||
}
|
||||
|
||||
SYSTEMD_SERVICE:${PN} += " rotate-event-logs.service"
|
||||
@@ -0,0 +1 @@
|
||||
EXTRA_OEMESON:append = "-Dlong-press-time-ms=5000"
|
||||
@@ -0,0 +1,2 @@
|
||||
PACKAGECONFIG:remove = " intelcpusensor ipmbsensor"
|
||||
PACKAGECONFIG:append = " nvmesensor"
|
||||
@@ -0,0 +1,8 @@
|
||||
FILESEXTRAPATHS:append := "${THISDIR}/${PN}:"
|
||||
|
||||
# To delay turning off host when fan sensors are not detected yet
|
||||
# To use CurrentHostState to decide host state for phosphor-fan-monitor
|
||||
|
||||
PACKAGECONFIG:append = " delay-host-control monitor-use-host-state"
|
||||
PACKAGECONFIG[delay-host-control] = "-Ddelay-host-control=20"
|
||||
PACKAGECONFIG[monitor-use-host-state] = "-Dmonitor-use-host-state=enabled"
|
||||
Executable
+104
@@ -0,0 +1,104 @@
|
||||
#!/bin/bash
|
||||
|
||||
usage () {
|
||||
echo "Usage:"
|
||||
echo " $(basename "$0") <image path> "
|
||||
echo "Where:"
|
||||
echo " <image path>: the path link to folder, which include image file and MANIFEST"
|
||||
echo "Example:"
|
||||
echo " $(basename "$0") /tmp/images/ghdh1393"
|
||||
}
|
||||
|
||||
|
||||
IMG_PATH="$1"
|
||||
if [ ! -d "$IMG_PATH" ]; then
|
||||
echo "The folder $IMG_PATH does not exist"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
MANIFEST_PATH="${IMG_PATH}/MANIFEST"
|
||||
if [ ! -f "$MANIFEST_PATH" ]; then
|
||||
echo "The MANIFEST file $MANIFEST_PATH does not exist"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
EXTENDED_VERSION=$(awk '/ExtendedVersion/ {print}' "${MANIFEST_PATH}" | cut -d "=" -f 2)
|
||||
|
||||
# If the ExtendedVersion is empty, set default to update UEFI/EDKII on primary device
|
||||
if [ -z "$EXTENDED_VERSION" ]
|
||||
then
|
||||
EXTENDED_VERSION="primary"
|
||||
fi
|
||||
|
||||
# Assign the command based on the ExtendedVersion
|
||||
case ${EXTENDED_VERSION} in
|
||||
"primary")
|
||||
IMAGE=$(find "${IMG_PATH}" -type f \( -name "*.img" -o -name "*.bin" -o -name "*.rom" \))
|
||||
CMD="/usr/sbin/ampere_flash_bios.sh $IMAGE 1"
|
||||
;;
|
||||
|
||||
"secondary")
|
||||
IMAGE=$(find "${IMG_PATH}" -type f \( -name "*.img" -o -name "*.bin" -o -name "*.rom" \))
|
||||
CMD="/usr/sbin/ampere_flash_bios.sh $IMAGE 2"
|
||||
;;
|
||||
|
||||
"scp-primary")
|
||||
IMAGE=$(find "${IMG_PATH}" -type f \( -name "*.img" -o -name "*.slim" -o -name "*.rom" \))
|
||||
CMD="/usr/sbin/ampere_firmware_upgrade.sh smpmpro $IMAGE 1"
|
||||
;;
|
||||
|
||||
"scp-secondary")
|
||||
IMAGE=$(find "${IMG_PATH}" -type f \( -name "*.img" -o -name "*.slim" -o -name "*.rom" \))
|
||||
CMD="/usr/sbin/ampere_firmware_upgrade.sh smpmpro $IMAGE 2"
|
||||
;;
|
||||
|
||||
"eeprom" | "eeprom-primary")
|
||||
IMAGE=$(find "${IMG_PATH}" -type f \( -name "*.img" -o -name "*.slim" -o -name "*.rom" -o -name "*.bin" \))
|
||||
CMD="/usr/sbin/ampere_firmware_upgrade.sh eeprom $IMAGE 1"
|
||||
;;
|
||||
|
||||
"eeprom-secondary")
|
||||
IMAGE=$(find "${IMG_PATH}" -type f \( -name "*.img" -o -name "*.slim" -o -name "*.rom" -o -name "*.bin" \))
|
||||
CMD="/usr/sbin/ampere_firmware_upgrade.sh eeprom $IMAGE 2"
|
||||
;;
|
||||
|
||||
"fru" | "mbfru")
|
||||
IMAGE=$(find "${IMG_PATH}" -type f \( -name "*.bin" \))
|
||||
CMD="/usr/sbin/ampere_firmware_upgrade.sh fru $IMAGE 1"
|
||||
;;
|
||||
|
||||
|
||||
"bmcfru")
|
||||
IMAGE=$(find "${IMG_PATH}" -type f \( -name "*.bin" \))
|
||||
CMD="/usr/sbin/ampere_firmware_upgrade.sh fru $IMAGE 2"
|
||||
;;
|
||||
|
||||
"mbcpld")
|
||||
IMAGE=$(find "${IMG_PATH}" -type f \( -name "*.jed" \))
|
||||
CMD="/usr/bin/ampere_firmware_upgrade.sh mb_cpld $IMAGE"
|
||||
;;
|
||||
"bmccpld")
|
||||
IMAGE=$(find "${IMG_PATH}" -type f \( -name "*.jed" \))
|
||||
CMD="/usr/bin/ampere_firmware_upgrade.sh bmc_cpld $IMAGE"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Invalid ExtendedVersion: ${EXTENDED_VERSION}. Please check MANIFEST file!"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
if [ -z "$IMAGE" ]
|
||||
then
|
||||
echo "ERROR: The image file: No such file or directory"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! eval "$CMD";
|
||||
then
|
||||
echo "ERROR: The firmware update not successfull"
|
||||
exit 1
|
||||
fi
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
[Unit]
|
||||
Description=Ampere service for flashing the Host firmware image
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=no
|
||||
ExecStart=/usr/sbin/firmware_update.sh /tmp/images/%I
|
||||
TimeoutSec=300
|
||||
@@ -0,0 +1,18 @@
|
||||
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
|
||||
|
||||
SRC_URI += " \
|
||||
file://firmware_update.sh \
|
||||
"
|
||||
|
||||
PACKAGECONFIG[flash_bios] = "-Dhost-bios-upgrade=enabled, -Dhost-bios-upgrade=disabled"
|
||||
|
||||
PACKAGECONFIG:append = " flash_bios static-dual-image"
|
||||
|
||||
SYSTEMD_SERVICE:${PN}:updater += "${@bb.utils.contains('PACKAGECONFIG', 'flash_bios', 'obmc-flash-host-bios@.service', '', d)}"
|
||||
|
||||
RDEPENDS:${PN} += "bash"
|
||||
|
||||
do_install:append() {
|
||||
install -d ${D}/usr/sbin
|
||||
install -m 0755 ${WORKDIR}/firmware_update.sh ${D}/usr/sbin/firmware_update.sh
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
[Unit]
|
||||
Description=Ampere Computing LLC host shutdown ACK
|
||||
Conflicts=obmc-chassis-poweron@0.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/sbin/ampere_power_util.sh mb shutdown_ack
|
||||
SyslogIdentifier=ampere_host_shutdown_ack
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
[Unit]
|
||||
Description=Ampere Computing LLC HighTempt event
|
||||
|
||||
[Service]
|
||||
Restart=no
|
||||
ExecStart=/usr/sbin/ampere_add_redfishevent.sh OpenBMC.0.1.AmpereEvent.Warning "CPU%i HighTemp asserted"
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
[Unit]
|
||||
Description=Ampere Computing LLC HighTempt event
|
||||
|
||||
[Service]
|
||||
Restart=no
|
||||
ExecStart=/usr/sbin/ampere_add_redfishevent.sh OpenBMC.0.1.AmpereEvent.OK "CPU%i HighTemp deasserted"
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
[Unit]
|
||||
Description=Ampere Computing LLC Overtemp event handling
|
||||
|
||||
[Service]
|
||||
Restart=no
|
||||
ExecStart=/bin/sh -c "touch /tmp/fault_overtemp && obmcutil chassisoff"
|
||||
ExecStartPost=/bin/sh -c "ampere_add_redfishevent.sh OpenBMC.0.1.CPUThermalTrip.Critical %i && sleep 10 && rm /tmp/fault_overtemp"
|
||||
@@ -0,0 +1,11 @@
|
||||
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
|
||||
|
||||
SYSTEMD_SERVICE:${PN}-monitor += " \
|
||||
ampere-host-shutdown-ack@.service \
|
||||
ampere_overtemp@.service \
|
||||
ampere_hightemp_start@.service \
|
||||
ampere_hightemp_stop@.service \
|
||||
"
|
||||
|
||||
SYSTEMD_LINK:${PN}-monitor:append = " ../phosphor-multi-gpio-monitor.service:multi-user.target.requires/phosphor-multi-gpio-monitor.service"
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
SNOOP_DEVICE = ""
|
||||
@@ -0,0 +1,10 @@
|
||||
FILESEXTRAPATHS:append := "${THISDIR}/${PN}:"
|
||||
|
||||
EXTRA_OEMESON:append = " \
|
||||
-Dinsecure-tftp-update=disabled \
|
||||
-Dbmcweb-logging=enabled \
|
||||
-Dredfish-bmc-journal=enabled \
|
||||
-Dhttp-body-limit=65 \
|
||||
-Dredfish-new-powersubsystem-thermalsubsystem=enabled \
|
||||
-Dredfish-allow-deprecated-power-thermal=disabled \
|
||||
"
|
||||
@@ -0,0 +1,17 @@
|
||||
SUMMARY = "Copy the inventory cleanup yaml for inventory manager"
|
||||
PR = "r1"
|
||||
LICENSE = "Apache-2.0"
|
||||
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
|
||||
|
||||
inherit allarch
|
||||
inherit phosphor-inventory-manager
|
||||
|
||||
S = "${WORKDIR}"
|
||||
|
||||
SRC_URI = "file://inventory-cleanup.yaml"
|
||||
|
||||
do_install() {
|
||||
install -D inventory-cleanup.yaml ${D}${base_datadir}/events.d/inventory-cleanup.yaml
|
||||
}
|
||||
|
||||
FILES:${PN} += "${base_datadir}/events.d/inventory-cleanup.yaml"
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
description: >
|
||||
Ampere inventory fixups
|
||||
|
||||
events:
|
||||
- name: Add Chassis interface
|
||||
description: >
|
||||
Add the chassis interface on the chassis inventory path
|
||||
type: startup
|
||||
actions:
|
||||
- name: createObjects
|
||||
objs:
|
||||
/system/chassis:
|
||||
xyz.openbmc_project.Inventory.Item.Chassis:
|
||||
Type:
|
||||
value: "xyz.openbmc_project.Inventory.Item.Chassis.ChassisType.RackMount"
|
||||
type: string
|
||||
@@ -0,0 +1,30 @@
|
||||
SUMMARY = "Ampere OEM IPMI commands"
|
||||
DESCRIPTION = "Ampere OEM IPMI commands"
|
||||
|
||||
LICENSE = "Apache-2.0"
|
||||
S = "${WORKDIR}"
|
||||
|
||||
LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
|
||||
|
||||
DEPENDS = "boost phosphor-ipmi-host phosphor-logging systemd"
|
||||
|
||||
inherit meson pkgconfig obmc-phosphor-ipmiprovider-symlink
|
||||
|
||||
LIBRARY_NAMES = "libzampoemcmds.so"
|
||||
|
||||
S = "${WORKDIR}/git"
|
||||
SRC_URI = "git://github.com/openbmc/ampere-ipmi-oem.git;branch=master;protocol=https"
|
||||
SRCREV = "2a19152956defafd7d9c5344b376a428e878c507"
|
||||
|
||||
HOSTIPMI_PROVIDER_LIBRARY += "${LIBRARY_NAMES}"
|
||||
NETIPMI_PROVIDER_LIBRARY += "${LIBRARY_NAMES}"
|
||||
|
||||
FILES:${PN}:append = " ${libdir}/ipmid-providers/lib*${SOLIBS}"
|
||||
FILES:${PN}:append = " ${libdir}/host-ipmid/lib*${SOLIBS}"
|
||||
FILES:${PN}:append = " ${libdir}/net-ipmid/lib*${SOLIBS}"
|
||||
FILES:${PN}-dev:append = " ${libdir}/ipmid-providers/lib*${SOLIBSDEV}"
|
||||
|
||||
do_install:append(){
|
||||
install -d ${D}${includedir}/ampere-ipmi-oem
|
||||
install -m 0644 -D ${S}/include/*.hpp ${D}${includedir}/ampere-ipmi-oem
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
FILESEXTRAPATHS:append := "${THISDIR}/${PN}:"
|
||||
+178
@@ -0,0 +1,178 @@
|
||||
{
|
||||
"0" : {
|
||||
"name" : "IPMB",
|
||||
"is_valid" : true,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "ipmb",
|
||||
"protocol_type" : "ipmb-1.0",
|
||||
"session_supported" : "session-less",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
},
|
||||
"1" : {
|
||||
"name" : "eth0",
|
||||
"is_valid" : true,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "lan-802.3",
|
||||
"protocol_type" : "ipmb-1.0",
|
||||
"session_supported" : "multi-session",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
},
|
||||
"2" : {
|
||||
"name" : "eth1",
|
||||
"is_valid" : true,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "lan-802.3",
|
||||
"protocol_type" : "ipmb-1.0",
|
||||
"session_supported" : "multi-session",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
},
|
||||
"3" : {
|
||||
"name" : "usb0",
|
||||
"is_valid" : true,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "lan-802.3",
|
||||
"protocol_type" : "ipmb-1.0",
|
||||
"session_supported" : "multi-session",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
},
|
||||
"4" : {
|
||||
"name" : "RESERVED",
|
||||
"is_valid" : false,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "reserved",
|
||||
"protocol_type" : "na",
|
||||
"session_supported" : "session-less",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
},
|
||||
"5" : {
|
||||
"name" : "RESERVED",
|
||||
"is_valid" : false,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "reserved",
|
||||
"protocol_type" : "na",
|
||||
"session_supported" : "session-less",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
},
|
||||
"6" : {
|
||||
"name" : "RESERVED",
|
||||
"is_valid" : false,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "reserved",
|
||||
"protocol_type" : "na",
|
||||
"session_supported" : "session-less",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
},
|
||||
"7" : {
|
||||
"name" : "RESERVED",
|
||||
"is_valid" : false,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "reserved",
|
||||
"protocol_type" : "na",
|
||||
"session_supported" : "session-less",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
},
|
||||
"8" : {
|
||||
"name" : "INTRABMC",
|
||||
"is_valid" : true,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "oem",
|
||||
"protocol_type" : "oem",
|
||||
"session_supported" : "session-less",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
},
|
||||
"9" : {
|
||||
"name" : "RESERVED",
|
||||
"is_valid" : false,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "reserved",
|
||||
"protocol_type" : "na",
|
||||
"session_supported" : "session-less",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
},
|
||||
"10" : {
|
||||
"name" : "RESERVED",
|
||||
"is_valid" : false,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "reserved",
|
||||
"protocol_type" : "na",
|
||||
"session_supported" : "session-less",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
},
|
||||
"11" : {
|
||||
"name" : "RESERVED",
|
||||
"is_valid" : false,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "reserved",
|
||||
"protocol_type" : "na",
|
||||
"session_supported" : "session-less",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
},
|
||||
"12" : {
|
||||
"name" : "RESERVED",
|
||||
"is_valid" : false,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "reserved",
|
||||
"protocol_type" : "na",
|
||||
"session_supported" : "session-less",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
},
|
||||
"13" : {
|
||||
"name" : "RESERVED",
|
||||
"is_valid" : false,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "reserved",
|
||||
"protocol_type" : "na",
|
||||
"session_supported" : "session-less",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
},
|
||||
"14" : {
|
||||
"name" : "SELF",
|
||||
"is_valid" : false,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "ipmb",
|
||||
"protocol_type" : "ipmb-1.0",
|
||||
"session_supported" : "session-less",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
},
|
||||
"15" : {
|
||||
"name" : "ipmi_ssif",
|
||||
"is_valid" : true,
|
||||
"active_sessions" : 0,
|
||||
"channel_info" : {
|
||||
"medium_type" : "smbus-v2.0",
|
||||
"protocol_type" : "ipmi-smbus",
|
||||
"session_supported" : "session-less",
|
||||
"is_ipmi" : true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"path": "/xyz/openbmc_project/sensors/power/total_power"
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
|
||||
|
||||
inherit obmc-phosphor-systemd
|
||||
|
||||
HOSTIPMI_PROVIDER_LIBRARY:remove = "libstrgfnhandler.so"
|
||||
|
||||
do_install:append () {
|
||||
rm -rf ${D}${libdir}/ipmid-providers
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
# Usage of this utility
|
||||
echo "Trigger soft off the host."
|
||||
/usr/sbin/ampere_power_util.sh mb soft_off
|
||||
exit $?;
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
[Unit]
|
||||
Description=Ampere Soft power off of the host
|
||||
Wants=obmc-host-stop-pre@0.target
|
||||
Before=obmc-host-stop-pre@0.target
|
||||
Conflicts=obmc-host-start@0.target
|
||||
ConditionPathExists=!/run/openbmc/host@0-request
|
||||
ConditionPathExists=!/lib/systemd/system/pldmSoftPowerOff.service
|
||||
|
||||
[Service]
|
||||
Restart=no
|
||||
ExecStart=/usr/bin/phosphor-softpoweroff
|
||||
SyslogIdentifier=phosphor-softpoweroff
|
||||
Type=oneshot
|
||||
@@ -0,0 +1,18 @@
|
||||
FILESEXTRAPATHS:append := "${THISDIR}/${PN}:"
|
||||
|
||||
RRECOMMENDS:${PN} += "ipmitool"
|
||||
RDEPENDS:${PN} += "bash"
|
||||
|
||||
SRC_URI += "\
|
||||
file://ampere-phosphor-softpoweroff \
|
||||
file://ampere.xyz.openbmc_project.Ipmi.Internal.SoftPowerOff.service \
|
||||
"
|
||||
|
||||
AMPERE_SOFTPOWEROFF_TMPL = "ampere.xyz.openbmc_project.Ipmi.Internal.SoftPowerOff.service"
|
||||
|
||||
do_install:append(){
|
||||
install -d ${D}${includedir}/phosphor-ipmi-host
|
||||
install -m 0644 -D ${S}/selutility.hpp ${D}${includedir}/phosphor-ipmi-host
|
||||
install -m 0755 ${WORKDIR}/ampere-phosphor-softpoweroff ${D}/${bindir}/phosphor-softpoweroff
|
||||
install -m 0644 ${WORKDIR}/${AMPERE_SOFTPOWEROFF_TMPL} ${D}${systemd_unitdir}/system/xyz.openbmc_project.Ipmi.Internal.SoftPowerOff.service
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
PACKAGECONFIG:append = " log-threshold"
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
/xyz/openbmc_project/ipmi/sol/eth0:
|
||||
- Interface: xyz.openbmc_project.Ipmi.SOL
|
||||
Properties:
|
||||
Enable:
|
||||
Default: 'true'
|
||||
Privilege:
|
||||
Default: 4
|
||||
Progress:
|
||||
Default: 0
|
||||
RetryCount:
|
||||
Default: 7
|
||||
RetryIntervalMS:
|
||||
Default: 100
|
||||
Threshold:
|
||||
Default: 1
|
||||
|
||||
/xyz/openbmc_project/ipmi/sol/eth1:
|
||||
- Interface: xyz.openbmc_project.Ipmi.SOL
|
||||
Properties:
|
||||
Enable:
|
||||
Default: 'true'
|
||||
Privilege:
|
||||
Default: 4
|
||||
Progress:
|
||||
Default: 0
|
||||
RetryCount:
|
||||
Default: 7
|
||||
RetryIntervalMS:
|
||||
Default: 100
|
||||
Threshold:
|
||||
Default: 1
|
||||
|
||||
/xyz/openbmc_project/control/host0/power_restore_policy:
|
||||
- Interface: xyz.openbmc_project.Control.Power.RestorePolicy
|
||||
Properties:
|
||||
PowerRestorePolicy:
|
||||
Default: RestorePolicy::Policy::AlwaysOn
|
||||
@@ -0,0 +1,2 @@
|
||||
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
|
||||
SRC_URI:append = " file://ampere_settings.override.yml"
|
||||
@@ -0,0 +1,3 @@
|
||||
PACKAGECONFIG:append = " smbios-ipmi-blob"
|
||||
|
||||
PACKAGECONFIG:remove = " cpuinfo"
|
||||
@@ -0,0 +1,25 @@
|
||||
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
|
||||
|
||||
DEPENDS += "gpioplus libgpiod"
|
||||
|
||||
EXTRA_OEMESON:append = " \
|
||||
-Dhost-gpios=enabled \
|
||||
-Dboot-count-max-allowed=1 \
|
||||
-Donly-run-apr-on-power-loss=true \
|
||||
"
|
||||
|
||||
FILES:${PN} += "${systemd_system_unitdir}/*"
|
||||
FILES:${PN}-host += "${bindir}/phosphor-host-condition-gpio"
|
||||
SYSTEMD_SERVICE:${PN}-host += "phosphor-host-condition-gpio@.service"
|
||||
|
||||
pkg_postinst:${PN}-obmc-targets:prepend() {
|
||||
mkdir -p $D$systemd_system_unitdir/multi-user.target.requires
|
||||
LINK="$D$systemd_system_unitdir/multi-user.target.requires/phosphor-host-condition-gpio@0.service"
|
||||
TARGET="../phosphor-host-condition-gpio@.service"
|
||||
ln -s $TARGET $LINK
|
||||
}
|
||||
|
||||
pkg_prerm:${PN}-obmc-targets:prepend() {
|
||||
LINK="$D$systemd_system_unitdir/multi-user.target.requires/phosphor-host-condition-gpio@0.service"
|
||||
rm $LINK
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
FILESEXTRAPATHS:append := "${THISDIR}/${PN}:"
|
||||
|
||||
#
|
||||
# Ampere Mt. Jade power control involves different action during
|
||||
# the course of action which does not involve rebooting the Host.
|
||||
# Thus disable the use of Host Power-On watchdog.
|
||||
#
|
||||
WATCHDOG_FMT = ""
|
||||
ENABLE_WATCHDOG_FMT = ""
|
||||
Reference in New Issue
Block a user