Initial commit
This commit is contained in:
@@ -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}"
|
||||
Reference in New Issue
Block a user