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,21 @@
SUMMARY = "Bletchley board type checker"
DESCRIPTION = "Bletchley board type checker to probe i2c device with correct driver in user-space"
PR = "r1"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
inherit allarch systemd obmc-phosphor-systemd
RDEPENDS:${PN} += " bash i2c-tools"
SRC_URI = " file://board-type-checker-fpb \
file://board-type-checker-fpb.service \
"
SYSTEMD_PACKAGES = "${PN}"
SYSTEMD_SERVICE:${PN}:append = " board-type-checker-fpb.service"
do_install() {
install -d ${D}${libexecdir}
install -m 0755 ${WORKDIR}/board-type-checker-fpb ${D}${libexecdir}/
}
@@ -0,0 +1,68 @@
#!/bin/bash
is_valid_hdc1080()
{
local I2C_BUS=$1
local DEV_ADDR=$2
MFR_ID=$(i2ctransfer -y -f "${I2C_BUS}" w1@"${DEV_ADDR}" 0xfe r2)
if [ "$MFR_ID" != "0x54 0x49" ]; then
return 1;
fi
DEV_ID=$(i2ctransfer -y -f "${I2C_BUS}" w1@"${DEV_ADDR}" 0xff r2)
if [ "$DEV_ID" != "0x10 0x50" ]; then
return 1;
fi
return 0;
}
set_frontpanel_model()
{
busctl set-property xyz.openbmc_project.Settings /xyz/openbmc_project/inventory/system/chassis0/frontpanel xyz.openbmc_project.Inventory.Decorator.Asset Model s "Bletchley_FPB_${1}"
}
I2C_BUS=10
DEV_ADDR=0x40
VIRT_SNR_CONF="/var/lib/phosphor-virtual-sensor/virtual_sensor_config.json"
HDC1080_VIRT_SNR_CONF="/usr/share/phosphor-virtual-sensor/virtual_sensor_config_hdc1080.json"
SI7021_VIRT_SNR_CONF="/usr/share/phosphor-virtual-sensor/virtual_sensor_config_si7021.json"
# Check chip type
if is_valid_hdc1080 "$I2C_BUS" "$DEV_ADDR"; then
CHIP_TYPE="HDC1080"
else
CHIP_TYPE="SI7021"
fi
# Set Frontpanel board model
set_frontpanel_model "$CHIP_TYPE"
# Setup virtual_sensor_config.json for phosphor-virtual-sensor
case "$CHIP_TYPE" in
"HDC1080")
REQUIRED_CONF_PATH="$HDC1080_VIRT_SNR_CONF"
;;
"SI7021")
REQUIRED_CONF_PATH="$SI7021_VIRT_SNR_CONF"
;;
*)
REQUIRED_CONF_PATH="$HDC1080_VIRT_SNR_CONF"
;;
esac
if [ ! -d "$(dirname $VIRT_SNR_CONF)" ]; then
mkdir -p "$(dirname $VIRT_SNR_CONF)"
fi
if [ ! -e "$VIRT_SNR_CONF" ]; then
ln -s "$REQUIRED_CONF_PATH" "$VIRT_SNR_CONF"
else
REAL_CONF_PATH="$(realpath $VIRT_SNR_CONF)"
if [ "$REAL_CONF_PATH" != "$REQUIRED_CONF_PATH" ]; then
rm "$VIRT_SNR_CONF"
ln -s "$REQUIRED_CONF_PATH" "$VIRT_SNR_CONF"
fi
fi
@@ -0,0 +1,19 @@
[Unit]
Description=Front Panel Board Checker
StartLimitIntervalSec=90
StartLimitBurst=5
Before=phosphor-virtual-sensor.service
Before=xyz.openbmc_project.EntityManager.service
Wants=mapper-wait@-xyz-openbmc_project-inventory-system-chassis0-frontpanel.service
After=mapper-wait@-xyz-openbmc_project-inventory-system-chassis0-frontpanel.service
[Service]
ExecStart=/usr/libexec/board-type-checker-fpb
SyslogIdentifier=Front Panel Board Checker
Type=oneshot
RemainAfterExit=yes
Restart=on-failure
RestartSec=1
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,40 @@
SUMMARY = "Bletchley SLED Present Service"
DESCRIPTION = "OpenBMC Quanta Detect Present Daemon."
PR = "r1"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
inherit obmc-phosphor-systemd
DEPENDS += "systemd"
RDEPENDS:${PN} += " bash phosphor-gpio-monitor-presence"
SRC_URI = " file://detect-sled-present \
file://detect-sled-present@.service \
file://bletchley-sled-insertion@.target \
file://bletchley-sled-removal@.target \
"
do_install() {
install -d ${D}${bindir}
install -m 0755 ${WORKDIR}/detect-sled-present ${D}${bindir}/
install -d ${D}${systemd_system_unitdir}
install -m 0644 ${WORKDIR}/detect-sled-present@.service ${D}${systemd_system_unitdir}
install -m 0644 ${WORKDIR}/bletchley-sled-insertion@.target ${D}${systemd_system_unitdir}
install -m 0644 ${WORKDIR}/bletchley-sled-removal@.target ${D}${systemd_system_unitdir}
}
TGT = "${SYSTEMD_DEFAULT_TARGET}"
SLED_PRESENT_INSTFMT="../detect-sled-present@.service:${TGT}.wants/detect-sled-present@{0}.service"
SYSTEMD_SERVICE:${PN} += "detect-sled-present@.service"
SYSTEMD_LINK:${PN} += "${@compose_list(d, 'SLED_PRESENT_INSTFMT', 'OBMC_HOST_INSTANCES')}"
SLED_INSERT_INSTFMT="../bletchley-sled-insertion@.target:${TGT}.wants/bletchley-sled-insertion@{0}.target"
SYSTEMD_SERVICE:${PN} += "bletchley-sled-insertion@.target"
SYSTEMD_LINK:${PN} += "${@compose_list(d, 'SLED_INSERT_INSTFMT', 'OBMC_HOST_INSTANCES')}"
SLED_REMOVE_INSTFMT="bletchley-sled-removal@.target:bletchley-sled-removal@{0}.target"
SYSTEMD_SERVICE:${PN} += "bletchley-sled-removal@.target"
SYSTEMD_LINK:${PN} += "${@compose_list(d, 'SLED_REMOVE_INSTFMT', 'OBMC_HOST_INSTANCES')}"
@@ -0,0 +1,10 @@
[Unit]
Description=Bletchlet SLED%i insertion target
Requires=chassis-poweron@%i.service
After=chassis-poweron@%i.service
Requires=motor-init-calibration@%i.service
After=motor-init-calibration@%i.service
Conflicts=bletchley-sled-removed@%i.target
RefuseManualStop=yes
@@ -0,0 +1,8 @@
[Unit]
Description=Bletchlet SLED%i removal target
Conflicts=motor-init-calibration@%i.service
Conflicts=chassis-poweron@%i.service
Conflicts=bletchley-sled-insertion@%i.target
RefuseManualStop=yes
@@ -0,0 +1,109 @@
#!/bin/bash
SLED_ID=$1
SERVICE_NAME="xyz.openbmc_project.Inventory.Manager"
PRESENT_OBJPATH="/xyz/openbmc_project/inventory/system/chassis/presence/presence_sled${SLED_ID}"
DBUS_PROPERTY_INTF="org.freedesktop.DBus.Properties"
bind_i2c_driver()
{
I2C_BUS_ADDR=$1
DRIVER_NAME=$2
DRIVER_DIR="/sys/bus/i2c/drivers/${DRIVER_NAME}"
if [ ! -e "${DRIVER_DIR}/${I2C_BUS_ADDR}" ]; then
echo "${I2C_BUS_ADDR}" > "${DRIVER_DIR}"/bind
fi
}
unbind_i2c_driver()
{
I2C_BUS_ADDR=$1
DRIVER_NAME=$2
DRIVER_DIR="/sys/bus/i2c/drivers/${DRIVER_NAME}"
if [ -e "${DRIVER_DIR}/${I2C_BUS_ADDR}" ]; then
echo "${I2C_BUS_ADDR}" > "${DRIVER_DIR}"/unbind
fi
}
sled_insert_action()
{
SLED_ID=$1
I2C_BUS_NUM=$((SLED_ID-1))
# 0022: fusb302
bind_i2c_driver "${I2C_BUS_NUM}-0022" "typec_fusb302"
# 0045: ina230
bind_i2c_driver "${I2C_BUS_NUM}-0045" "ina2xx"
# 0040: mp5023
bind_i2c_driver "${I2C_BUS_NUM}-0040" "mp5023"
# 0041: pca9536
bind_i2c_driver "${I2C_BUS_NUM}-0041" "pca953x"
# 0076: pca9539
bind_i2c_driver "${I2C_BUS_NUM}-0076" "pca953x"
# 004f: tmp421
bind_i2c_driver "${I2C_BUS_NUM}-004f" "tmp421"
# 0067: pca9552
bind_i2c_driver "${I2C_BUS_NUM}-0067" "leds-pca955x"
# 0054: 24c64
bind_i2c_driver "${I2C_BUS_NUM}-0054" "at24"
# start bletchley-sled-insertion target
/bin/systemctl start bletchley-sled-insertion@"${SLED_ID}".target
}
sled_remove_action()
{
SLED_ID=$1
I2C_BUS_NUM=$((SLED_ID-1))
# 0022: fusb302
unbind_i2c_driver "${I2C_BUS_NUM}-0022" "typec_fusb302"
# # 0045: ina230
# unbind_i2c_driver "${I2C_BUS_NUM}-0045" "ina2xx"
# # 0040: mp5023
# unbind_i2c_driver "${I2C_BUS_NUM}-0040" "mp5023"
# # 0041: pca9536
# unbind_i2c_driver "${I2C_BUS_NUM}-0041" "pca953x"
# # 0076: pca9539
# unbind_i2c_driver "${I2C_BUS_NUM}-0076" "pca953x"
# # 004f: tmp421
# unbind_i2c_driver "${I2C_BUS_NUM}-004f" "tmp421"
# # 0067: pca9552
# unbind_i2c_driver "${I2C_BUS_NUM}-0067" "leds-pca955x"
# # 0054: 24c64
# unbind_i2c_driver "${I2C_BUS_NUM}-0054" "at24"
# start bletchley-sled-removal target
/bin/systemctl start bletchley-sled-removal@"${SLED_ID}".target
}
dbus-monitor --system "type=signal,interface=${DBUS_PROPERTY_INTF},sender=${SERVICE_NAME},path=${PRESENT_OBJPATH}" |
while read -r line; do
case "$line" in
*"boolean false"*)
echo "SLED${SLED_ID} Removal"
sled_remove_action "$SLED_ID"
;;
*"boolean true"*)
echo "SLED${SLED_ID} Insertion"
sled_insert_action "$SLED_ID"
;;
esac
done
exit 0
@@ -0,0 +1,13 @@
[Unit]
Description=SLED%i Present Manager
After=phosphor-gpio-presence@presence-sled%i.service
Wants=phosphor-gpio-presence@presence-sled%i.service
After=mapper-wait@-xyz-openbmc_project-inventory-system-chassis-presence-presence_sled%i.service
Wants=mapper-wait@-xyz-openbmc_project-inventory-system-chassis-presence-presence_sled%i.service
[Service]
ExecStart=/usr/bin/detect-sled-present %i
Type=simple
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,7 @@
[Unit]
Description=Flash usb controller image on SLED %i
[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/usr/sbin/usb-controller-update %i
@@ -0,0 +1,140 @@
#!/bin/bash
is_valid_sled_num()
{
var=$1
if [[ $var =~ ^-?[0-9]+$ ]]; then
if [ "$var" -ge 1 ] && [ "$var" -le 6 ]; then
return 0
fi
fi
return 1
}
set_gpio()
{
local pin_info
read -r -a pin_info < <(gpiofind "$1")
gpioset "${pin_info[0]}" "${pin_info[1]}"="$2"
}
bind_flash()
{
local sled_index=$1
if [ "$sled_index" -eq 1 ]; then
set_gpio SEL_SPI2_MUX 0
set_gpio SPI2_MUX1 0
set_gpio SPI2_MUX2 1
set_gpio SPI2_MUX3 1
elif [ "$sled_index" -eq 2 ]; then
set_gpio SEL_SPI2_MUX 1
set_gpio SPI2_MUX1 0
set_gpio SPI2_MUX2 1
set_gpio SPI2_MUX3 1
elif [ "$sled_index" -eq 3 ]; then
set_gpio SEL_SPI2_MUX 0
set_gpio SPI2_MUX1 1
set_gpio SPI2_MUX2 0
set_gpio SPI2_MUX3 1
elif [ "$sled_index" -eq 4 ]; then
set_gpio SEL_SPI2_MUX 1
set_gpio SPI2_MUX1 1
set_gpio SPI2_MUX2 0
set_gpio SPI2_MUX3 1
elif [ "$sled_index" -eq 5 ]; then
set_gpio SEL_SPI2_MUX 0
set_gpio SPI2_MUX1 1
set_gpio SPI2_MUX2 1
set_gpio SPI2_MUX3 0
elif [ "$sled_index" -eq 6 ]; then
set_gpio SEL_SPI2_MUX 1
set_gpio SPI2_MUX1 1
set_gpio SPI2_MUX2 1
set_gpio SPI2_MUX3 0
else
echo "Error: Invalid sled index $sled_index"
return 1
fi
if ! echo -n spi1.0 > /sys/bus/spi/drivers/spi-nor/bind; then
echo "Error: flash bind failed"
return 1
fi
return 0
}
unbind_flash()
{
echo -n spi1.0 > /sys/bus/spi/drivers/spi-nor/unbind
set_gpio SEL_SPI2_MUX 1
set_gpio SPI2_MUX1 1
set_gpio SPI2_MUX2 1
set_gpio SPI2_MUX3 1
return 0
}
findmtd()
{
m=$(grep -xl "$1" /sys/class/mtd/*/name)
m=${m%/name}
m=${m##*/}
echo "$m"
}
error_cleanup()
{
unbind_flash
exit 1
}
SLED_INDEX=$1
IMAGE_FILE="/run/initramfs/image-usb"
MTD_NAME="pnor"
FLASH_CP_CMD="/usr/sbin/flashcp"
FLASH_ERASEALL_CMD="/usr/sbin/flash_eraseall"
if ! is_valid_sled_num "$SLED_INDEX"; then
echo "Invalid sled number: $SLED_INDEX"
echo "Usage: usb-controller-update <SLED_NUM>"
echo ""
echo " SLED_NUM [1-6]"
echo ""
exit 1
fi
if ! bind_flash "$SLED_INDEX"; then
error_cleanup
fi
sleep 1
pnormtd="$(findmtd $MTD_NAME)"
if test -z "$pnormtd"; then
echo "Error: can not find pnor mtd device"
error_cleanup
fi
sleep 1
MTD_NODE_PATH="/dev/$pnormtd"
if [ ! -c "$MTD_NODE_PATH" ]; then
echo "Error: /dev/$pnormtd device node not exist"
error_cleanup
fi
echo "Bind mtd node success, path: $MTD_NODE_PATH"
sleep 1
$FLASH_ERASEALL_CMD "$MTD_NODE_PATH" || error_cleanup
echo "Erase flash block done"
sleep 1
$FLASH_CP_CMD -v $IMAGE_FILE "$MTD_NODE_PATH" || error_cleanup
echo "Write firmware image done"
sync
sleep 1
unbind_flash
exit 0
@@ -0,0 +1,23 @@
SUMMARY = "Firmware update tools"
PR = "r1"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
inherit obmc-phosphor-systemd
RDEPENDS:${PN} += "bash"
RDEPENDS:${PN} += "libgpiod-tools"
S = "${WORKDIR}"
SRC_URI += " \
file://usb-controller-update \
"
do_install() {
install -d ${D}${sbindir}
install -m 0755 ${WORKDIR}/usb-controller-update ${D}${sbindir}
}
FLASH_USB_CONTROLLER_INSTFMT="flash-usb-controller@.service:flash-usb-controller@{0}.service"
SYSTEMD_SERVICE:${PN} += "flash-usb-controller@.service"
SYSTEMD_LINK:${PN} += "${@compose_list(d, 'FLASH_USB_CONTROLLER_INSTFMT', 'OBMC_HOST_INSTANCES')}"
@@ -0,0 +1,214 @@
#!/bin/bash
#
# mdio-util - MDIO Utility for AST2600
#
# This shell script provides the ability to access MDIO bus over devmem
#
# TODO: A read/write action contains multiple MDIO operations, it needs a
# lock to protect entire action.
RETRY_CNT=30
RETRY_DEALY_SEC="0.1"
MDIO_BASE_REG=$((16#1e650000))
C22_READ_CMD=$((16#98000000))
C22_WRITE_CMD=$((16#94000000))
C45_ADDR_CMD=$((16#80000000))
C45_WRITE_CMD=$((16#84000000))
C45_PREAD_CMD=$((16#88000000))
C45_READ_CMD=$((16#8C000000))
PHY_ADDR_STEP=$((16#200000))
DEV_ADDR_STEP=$((16#10000))
REG_ADDR_STEP=$((16#10000))
aspeed_mdio_c22_read() {
BUS=$1
PHY_ADDR=$2
REG_ADDR=$3
MDIO_CTRL_REG=$((MDIO_BASE_REG+BUS*8))
MDIO_DATA_REG=$((MDIO_CTRL_REG+4))
CMD=$((C22_READ_CMD+PHY_ADDR*PHY_ADDR_STEP+REG_ADDR*REG_ADDR_STEP))
# write control register
devmem $MDIO_CTRL_REG 32 $CMD
for i in $(seq 1 1 $RETRY_CNT)
do
CHECK_STR=$(devmem $MDIO_CTRL_REG)
CHECK_VAL=$((16#${CHECK_STR#"0x"}))
if [ $((CHECK_VAL&16#80000000)) -eq 0 ]; then
break
elif [ "$i" -eq "${RETRY_CNT}" ]; then
echo "[c22] read operation timeout"
return 1
fi
sleep "$RETRY_DEALY_SEC"
done
# read data register
for i in $(seq 1 1 $RETRY_CNT)
do
DATA_STR=$(devmem $MDIO_DATA_REG)
DATA_VAL=$((16#${DATA_STR#"0x"}))
if [ $((DATA_VAL&16#00010000)) -ne 0 ]; then
DATA_VAL=$((DATA_VAL&16#0000FFFF))
echo "0x$(printf %04x $DATA_VAL)"
break
elif [ "$i" -eq "$RETRY_CNT" ]; then
echo "[c22] read data timeout"
return 1
fi
sleep "$RETRY_DEALY_SEC"
done
return 0
}
aspeed_mdio_c22_write() {
BUS=$1
PHY_ADDR=$2
REG_ADDR=$3
WR_DATA=$4
MDIO_CTRL_REG=$((MDIO_BASE_REG+BUS*8))
MDIO_DATA_REG=$((MDIO_CTRL_REG+4))
CMD=$((C22_WRITE_CMD+PHY_ADDR*PHY_ADDR_STEP+REG_ADDR*REG_ADDR_STEP+WR_DATA))
# write control register
devmem $MDIO_CTRL_REG 32 $CMD
for i in $(seq 1 1 $RETRY_CNT)
do
CHECK_STR=$(devmem $MDIO_CTRL_REG)
CHECK_VAL=$((16#${CHECK_STR#"0x"}))
if [ $((CHECK_VAL&16#80000000)) -eq 0 ]; then
break
elif [ "$i" -eq "$RETRY_CNT" ]; then
echo "[c22] write operation timeout"
return 1
fi
sleep "$RETRY_DEALY_SEC"
done
return 0
}
aspeed_mdio_c45_ctrl() {
BUS=$1
C45_OP=$2
PHY_ADDR=$3
DEV_ADDR=$4
CMD_DATA=$5
MDIO_CTRL_REG=$((MDIO_BASE_REG+BUS*8))
case "$C45_OP" in
0)
CMD=$C45_ADDR_CMD
;;
1)
CMD=$C45_WRITE_CMD
;;
2)
CMD=$C45_PREAD_CMD
;;
3)
CMD=$C45_READ_CMD
;;
*)
echo "[c45] unknow operator $C45_OP"
return 1
;;
esac
CMD=$((CMD+PHY_ADDR*PHY_ADDR_STEP+DEV_ADDR*DEV_ADDR_STEP+CMD_DATA))
# write control register
devmem $MDIO_CTRL_REG 32 $CMD
for i in $(seq 1 1 $RETRY_CNT)
do
CHECK_STR=$(devmem $MDIO_CTRL_REG)
CHECK_VAL=$((16#${CHECK_STR#"0x"}))
if [ $((CHECK_VAL&16#80000000)) -eq 0 ]; then
break
elif [ "$i" -eq "$RETRY_CNT" ]; then
echo "[c45] operation timeout, op: $C45_OP"
return 1
fi
sleep "$RETRY_DEALY_SEC"
done
return 0
}
aspeed_mdio_c45_data() {
BUS=$1
PHY_ADDR=$2
DEV_ADDR=$3
MDIO_CTRL_REG=$((MDIO_BASE_REG+BUS*8))
MDIO_DATA_REG=$((MDIO_CTRL_REG+4))
# read data register
for i in $(seq 1 1 $RETRY_CNT)
do
DATA_STR=$(devmem $MDIO_DATA_REG)
DATA_VAL=$((16#${DATA_STR#"0x"}))
if [ $((DATA_VAL&16#00010000)) -ne 0 ]; then
DATA_VAL=$((DATA_VAL&16#0000FFFF))
echo "0x$(printf %04x $DATA_VAL)"
break
elif [ "$i" -eq "$RETRY_CNT" ]; then
echo "[c45] read data timeout"
return 1
fi
sleep "$RETRY_DEALY_SEC"
done
return 0
}
print_usage() {
echo "Usage:"
echo " [clause 22]"
echo " $0 c22 r <BUS> <PHY_ADDR> <REG_ADDR>"
echo " $0 c22 w <BUS> <PHY_ADDR> <REG_ADDR> <DATA>"
echo " [clause 45]"
echo " $0 c45 r <BUS> <PHY_ADDR> <DEV_ADDR> <REG_ADDR>"
echo " $0 c45 w <BUS> <PHY_ADDR> <DEV_ADDR> <REG_ADDR> <DATA>"
}
CLAUSE_VER=${1}
CMD_TYPE=${2}
BUS=$3
PHY_ADDR=$4
if [ ! -c /dev/mem ]; then
mknod /dev/mem c 1 1
fi
if [ "$CLAUSE_VER" == "c22" ] && [ "$CMD_TYPE" == "r" ] && [ "$#" -eq 5 ]; then
REG_ADDR=${5}
aspeed_mdio_c22_read "$BUS" "$PHY_ADDR" "$REG_ADDR" || exit 1
elif [ "$CLAUSE_VER" == "c22" ] && [ "$CMD_TYPE" == "w" ] && [ "$#" -eq 6 ]; then
REG_ADDR=${5}
DATA=${6}
aspeed_mdio_c22_write "$BUS" "$PHY_ADDR" "$REG_ADDR" "$DATA" || exit 1
elif [ "$CLAUSE_VER" == "c45" ] && [ "$CMD_TYPE" == "r" ] && [ "$#" -eq 6 ]; then
DEV_ADDR=${5}
REG_ADDR=${6}
aspeed_mdio_c45_ctrl "$BUS" 0 "$PHY_ADDR" "$DEV_ADDR" "$REG_ADDR" || exit 1
aspeed_mdio_c45_ctrl "$BUS" 3 "$PHY_ADDR" "$DEV_ADDR" "$REG_ADDR" || exit 1
aspeed_mdio_c45_data "$BUS" "$PHY_ADDR" "$DEV_ADDR" || exit 1
elif [ "$CLAUSE_VER" == "c45" ] && [ "$CMD_TYPE" == "w" ] && [ "$#" -eq 7 ]; then
DEV_ADDR=${5}
REG_ADDR=${6}
DATA=${7}
aspeed_mdio_c45_ctrl "$BUS" 0 "$PHY_ADDR" "$DEV_ADDR" "$REG_ADDR" || exit 1
aspeed_mdio_c45_ctrl "$BUS" 1 "$PHY_ADDR" "$DEV_ADDR" "$DATA" || exit 1
else
print_usage
fi
@@ -0,0 +1,16 @@
SUMMARY = "MDIO utility for AST2600"
PR = "r1"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
RDEPENDS:${PN} += "bash"
SRC_URI += " \
file://mdio-util \
"
S = "${WORKDIR}"
do_install() {
install -d ${D}${sbindir}
install -m 0755 ${S}/mdio-util ${D}${sbindir}/
}
@@ -0,0 +1,70 @@
#!/bin/bash -e
#
# Control step motor rotate of sled
# shellcheck source=meta-facebook/meta-bletchley/recipes-bletchley/plat-tools/files/bletchley-common-functions
source /usr/libexec/bletchley-common-functions
#######################################
# Setting step motor control pins to start/stop motor
# Arguments:
# 1. SLED NUMBER
# 2. Value of STBY RESET PIN
# 3. Value of ENABLE PIN
# 4. Value of DIRECTION PIN
# 5. Value of Motor Driver VREF PIN
#######################################
function set_motor() {
STBY_PIN="SLED${1}_MD_STBY_RESET"
EN_PIN="SLED${1}_MD_IOEXP_EN_FAULT"
DIR_PIN="SLED${1}_MD_DIR"
VREF_PIN="SLED${1}_MD_REF_PWM"
set_gpio "$STBY_PIN" "$2"
set_gpio "$EN_PIN" "$3"
set_gpio "$DIR_PIN" "$4"
set_gpio "$VREF_PIN" "$5"
}
function show_usage(){
echo "Usage: motor-ctrl [sled1 | sled2 | sled3 | sled4 | sled5 | sled6] [f r s]"
echo " f : Step Motor go forward"
echo " r : Step Motor go reverse"
echo " s : Step Motor stop "
}
if [ $# -ne 2 ]; then
show_usage
exit 1;
fi
if [[ "$1" =~ ^(sled[1-6]{1})$ ]]; then
SLED=$1
SLED_NUM=${SLED:4}
ACTION=$2
else
echo "invalid sled name: $1"
exit 1;
fi
#Check if sled is present
if ! is_sled_present "${SLED_NUM}"; then
echo "${SLED} is not present!"
exit 1
fi
if [[ "$ACTION" == "s" ]]; then
echo "stop motor"
set_motor "$SLED_NUM" 1 0 0 1
elif [[ "$ACTION" == "f" ]];then
echo "start motor, direction:forward"
set_motor "$SLED_NUM" 1 1 0 0
elif [[ "$ACTION" == "r" ]];then
echo "start motor, direction:reverse"
set_motor "$SLED_NUM" 1 1 1 0
else
echo "Error: Unknown action!"
exit 1
fi
exit 0
@@ -0,0 +1,107 @@
#!/bin/bash -e
# Initialize for step motor of sled:
# Enable pwm and setup pwm duty
# Setup gpio pins for step motor control
# Moving step motor back to initial position
export PATH=$PATH:/usr/libexec
# shellcheck source=meta-facebook/meta-bletchley/recipes-bletchley/plat-tools/files/bletchley-common-functions
source /usr/libexec/bletchley-common-functions
PWM_CLASS_PATH="/sys/class/pwm/pwmchip0"
#Sleld 1~6 using bmc pwm8~13 as motor driver stick
PWM_NUM_OFFSET=7
PWM_PERIOD=2500000 #400HZ
PWM_DUTY=250000 #PWM_PERIOD X 10%
CALIBRATE_TIMEOUT=120
#Enable pwm for sledN
function open_pwm() {
local SLED_NUM="$1"
echo "Open pwm of sled$SLED_NUM"
PWM_NUM=$(( SLED_NUM + PWM_NUM_OFFSET ))
PWM_PATH="${PWM_CLASS_PATH}/pwm${PWM_NUM}"
if [ ! -d "$PWM_PATH" ];then
echo "$PWM_NUM" > "${PWM_CLASS_PATH}/export"
fi
if [ -d "$PWM_PATH" ];then
echo "set pwm period to $PWM_PERIOD ns"
if ! echo "$PWM_PERIOD" > "${PWM_PATH}/period"; then
echo "Error: set pwm period fail"
return 1
fi
if ! echo 1 > "${PWM_PATH}/enable"; then
echo "Error: set pwm enable fail"
return 1
fi
if ! echo "$PWM_DUTY" > "${PWM_PATH}/duty_cycle"; then
echo "Error: set pwm duty_cycle fail"
return 1
fi
else
echo "Error: ${PWM_PATH} not exist, export pwm${PWM_NUM} fail"
return 1
fi
}
#Init gpio pins for step motor control
function init_gpios() {
echo "Init GPIOs:"
motor_ctrl_gpio_pins_names=( "SLED${1}_MD_STBY_RESET"
"SLED${1}_MD_IOEXP_EN_FAULT"
"SLED${1}_MD_DIR"
"SLED${1}_MD_DECAY"
"SLED${1}_MD_MODE1"
"SLED${1}_MD_MODE2"
"SLED${1}_MD_MODE3" )
for gpio_name in "${motor_ctrl_gpio_pins_names[@]}"; do
set_gpio "$gpio_name" 0
done
}
if [[ "$1" =~ ^(sled[1-6]{1})$ ]]; then
SLED=$1
SLED_NUM=${SLED:4}
else
#show_usage
echo "invalid sled name: ${1}"
exit 1;
fi
#Check if sled is present
if ! is_sled_present "${SLED_NUM}"; then
echo "${SLED} is not present, skip motor initialize"
exit 1
fi
#Init gpios
init_gpios "$SLED_NUM"
#enable pwm
open_pwm "$SLED_NUM"
#SLED{N}_MS_DETECT1 (initial position)
DETECT_PIN1="SLED${SLED_NUM}_MS_DETECT1"
INIT_POS=$(get_gpio "$DETECT_PIN1")
if [ "$INIT_POS" -eq 1 ];then
echo "Making motor back to initial position..."
motor-ctrl "$SLED" r >/dev/null
wait_gpio_falling "$DETECT_PIN1" "$CALIBRATE_TIMEOUT"
motor-ctrl "$SLED" s >/dev/null
fi
INIT_POS=$(get_gpio "$DETECT_PIN1")
if [ "$INIT_POS" -eq 0 ];then
echo "Motor calibrated to initial position."
exit 0
else
echo "Error: Step motor run over 1 cycle but switch never triggered"
echo "Find motor initial position failed"
exit 1
fi
@@ -0,0 +1,20 @@
[Unit]
Description=Motor Initialize for sled%i
StartLimitIntervalSec=90
StartLimitBurst=2
Requires=phosphor-gpio-presence@presence-sled%i.service
After=phosphor-gpio-presence@presence-sled%i.service
Wants=mapper-wait@-xyz-openbmc_project-inventory-system-chassis-presence-presence_sled%i.service
After=mapper-wait@-xyz-openbmc_project-inventory-system-chassis-presence-presence_sled%i.service
[Service]
ExecStart=/usr/libexec/motor-init sled%i
SyslogIdentifier=Motor Initialize sled%i
Type=oneshot
RemainAfterExit=yes
ExecStopPost=/usr/libexec/motor-ctrl sled%i s
Restart=on-failure
RestartSec=1
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,739 @@
#!/bin/bash
#
# Power Control tool
# Enable/disable AC relay
# On/off System by step moter to press power key
export PATH=$PATH:/usr/sbin:/usr/libexec
# shellcheck source=meta-facebook/meta-bletchley/recipes-bletchley/plat-tools/files/bletchley-common-functions
source /usr/libexec/bletchley-common-functions
DELAY_POWER_ON="0.5"
DELAY_POWER_OFF="10"
DELAY_POWER_RECOVERY_MODE="10"
POWER_BTN_TIMEOUT_SEC=10
REV_EVT="EVT"
REV_DVT="DVT"
REV_UNKNOW="UNKNOW"
DBUS_HOST_ST_ON="xyz.openbmc_project.State.Host.HostState.Running"
DBUS_HOST_ST_OFF="xyz.openbmc_project.State.Host.HostState.Off"
HOST_ST_UNKNOW="Unknow"
HOST_ST_ON="On"
HOST_ST_OFF="Off"
HOST_ST_SLEEP="Sleep"
HOST_ST_DFU="DFU"
HOST_ST_RECOVERY="Recovery"
HOST_AC_ON="AC On"
HOST_AC_OFF="AC Off"
ACTION_ON="on"
ACTION_OFF="off"
ACTION_DFU="dfu"
ACTION_RECOVERY="recovery"
ACTION_CYCLE="cycle"
ACTION_RESET="reset"
ACTION_AC_ON="ac-on"
ACTION_AC_OFF="ac-off"
ACTION_STATUS="status"
ACTION_BOOT_MODE="boot-from-bootmode"
VALID_SLED_ACTIONS="
$ACTION_ON
$ACTION_OFF
$ACTION_AC_ON
$ACTION_AC_OFF
$ACTION_STATUS
$ACTION_DFU
$ACTION_RECOVERY
$ACTION_CYCLE
$ACTION_RESET
$ACTION_BOOT_MODE
"
BOOT_MODE_REGULAR="\"xyz.openbmc_project.Control.Boot.Mode.Modes.Regular\""
BOOT_MODE_SAFE="\"xyz.openbmc_project.Control.Boot.Mode.Modes.Safe\""
BOOT_MODE_SETUP="\"xyz.openbmc_project.Control.Boot.Mode.Modes.Setup\""
function is_valid_sled_action()
{
local ACTION=$1
for i in $VALID_SLED_ACTIONS
do
if [ "$i" = "$ACTION" ]; then
return 0
fi
done
return 1
}
function get_board_rev()
{
local rev_id0
local rev_id1
local rev_id2
local rev_val
rev_id0=$(get_gpio "REV_ID0")
rev_id1=$(get_gpio "REV_ID1")
rev_id2=$(get_gpio "REV_ID2")
rev_val=$((rev_id0+(rev_id1<<1)+(rev_id2<<2)))
case $rev_val in
0)
echo "$REV_EVT"
;;
1)
echo "$REV_DVT"
;;
*)
echo "$REV_UNKNOW"
return 1
;;
esac
return 0
}
function trigger_power_button()
{
local sled_num=$1
local delay_time=$2
#SLED{N}_MS_DETECT1 (initial position)
GPIO_DETECT_PIN1="SLED${sled_num}_MS_DETECT1"
#SLED{N}_MS_DETECT0 (MAC position)
GPIO_DETECT_PIN0="SLED${sled_num}_MS_DETECT0"
echo "Motor go forward to press Power key"
motor-ctrl "sled${sled_num}" f >/dev/null
wait_gpio_falling "${GPIO_DETECT_PIN0}" "$POWER_BTN_TIMEOUT_SEC"
motor-ctrl "sled${sled_num}" s >/dev/null
if [ "$(get_gpio "$GPIO_DETECT_PIN0")" -eq 0 ];then
echo "Power key switch triggered"
echo "Press power key for Sled${1} ${delay_time} seconds..."
sleep "$delay_time"
else
echo "Power key switch not trigger, back motor to initial position"
fi
motor-ctrl "sled${sled_num}" r >/dev/null
wait_gpio_falling "${GPIO_DETECT_PIN1}" "$POWER_BTN_TIMEOUT_SEC"
motor-ctrl "sled${sled_num}" s >/dev/null
if [ "$(get_gpio "$GPIO_DETECT_PIN1")" -eq 0 ];then
echo "Motor reverse to initial position successful"
else
echo "Initial position switch not trigger, force stop motor"
fi
}
function release_power_button()
{
local sled_num=$1
GPIO_DETECT_PIN1="SLED${sled_num}_MS_DETECT1"
if [ "$(get_gpio "$GPIO_DETECT_PIN1")" -eq 0 ]; then
echo "Motor at initial position already"
return 0
fi
motor-ctrl "sled${sled_num}" r >/dev/null
wait_gpio_falling "${GPIO_DETECT_PIN1}" "$POWER_BTN_TIMEOUT_SEC"
motor-ctrl "sled${sled_num}" s >/dev/null
if [ "$(get_gpio "$GPIO_DETECT_PIN1")" -eq 0 ];then
echo "Motor reverse to initial position successful"
return 0
fi
echo "Error: Initial position switch not trigger"
return 1
}
function press_power_button()
{
local sled_num=$1
GPIO_DETECT_PIN0="SLED${sled_num}_MS_DETECT0"
echo "Motor go forward to press Power button"
motor-ctrl "sled${sled_num}" f >/dev/null
wait_gpio_falling "${GPIO_DETECT_PIN0}" "$POWER_BTN_TIMEOUT_SEC"
motor-ctrl "sled${sled_num}" s >/dev/null
if [ "$(get_gpio "$GPIO_DETECT_PIN0")" -eq 0 ];then
echo "Power button switch triggered"
return 0
fi
echo "Error: Power button switch not trigger"
return 1
}
#Get i2c bus number for sledN
function get_bus_num()
{
SLED_NUM=$1
local bus=0
#Mapping Sled number 1~6 to i2c bus number 0~5
if [[ "$SLED_NUM" = [1-6] ]]; then
bus=$(( SLED_NUM - 1 ))
fi
echo "$bus"
}
function get_ac_status()
{
i2c_bus=$(get_bus_num "$1")
p1_output_reg=$(i2cget -f -y "$i2c_bus" 0x76 0x03)
p1_config_reg=$(i2cget -f -y "$i2c_bus" 0x76 0x07)
host_pwr="$(( (p1_output_reg & 0x80)>>7 ))"
is_output="$(( (~p1_config_reg & 0x80)>>7 ))"
if [ "$(( host_pwr & is_output ))" -eq 1 ];then
echo "$HOST_AC_ON"
else
echo "$HOST_AC_OFF"
fi
}
function get_host_status_dbus()
{
local sled_num=$1
local object="/xyz/openbmc_project/state/host${sled_num}"
local service="xyz.openbmc_project.State.Host${sled_num}"
local interface="xyz.openbmc_project.State.Host"
local property="CurrentHostState"
local host_state
host_state=$(busctl get-property "$service" "$object" "$interface" "$property" | cut -d '"' -f2)
if [ "$host_state" = "$DBUS_HOST_ST_ON" ]; then
echo "$HOST_ST_ON"
elif [ "$host_state" = "$DBUS_HOST_ST_OFF" ]; then
echo "$HOST_ST_OFF"
else
echo "$HOST_ST_UNKNOW"
return 1
fi
return 0
}
function get_addr_from_dts_aliases()
{
local node_address
node_address=$(awk -F '@' '{printf $2}' /sys/firmware/devicetree/base/aliases/"$1")
echo "$node_address"
}
function get_host_status_mdio()
{
local SLED_NUM=$1
local MDIO_BUS
MDIO_BUS="$(get_addr_from_dts_aliases mdio0).mdio-1"
declare -a PORT_MAP=(0 3 2 1 7 6 5)
# check /dev/mem
if ! create_dev_mem; then
return 1
fi
local CHECK_CNT=0
local MDIO_ERR_CNT=0
local CUR_HOST_ST=$HOST_ST_UNKNOW
local SLED_LAST_ACTION
if [ -f /tmp/sled"${SLED_NUM}"-last-action ]; then
SLED_LAST_ACTION=$(cat /tmp/sled"${SLED_NUM}"-last-action)
fi
while true
do
if POST_ST_VAL=$(mdio "$MDIO_BUS" phy "${PORT_MAP[SLED_NUM]}" 0); then
if [ $((POST_ST_VAL&16#0800)) -eq $((16#0000)) ]; then
case $SLED_LAST_ACTION in
"$ACTION_DFU")
TMP_HOST_ST="$HOST_ST_DFU"
;;
*)
TMP_HOST_ST="$HOST_ST_OFF"
;;
esac
elif [ $((POST_ST_VAL&16#0A00)) -eq $((16#0A00)) ]; then
TMP_HOST_ST="$HOST_ST_ON"
case $SLED_LAST_ACTION in
"$ACTION_RECOVERY")
TMP_HOST_ST="$HOST_ST_RECOVERY"
;;
*)
TMP_HOST_ST="$HOST_ST_ON"
;;
esac
elif [ $((POST_ST_VAL&16#0900)) -eq $((16#0900)) ]; then
TMP_HOST_ST="$HOST_ST_SLEEP"
else
TMP_HOST_ST="$HOST_ST_UNKNOW"
fi
if [ "$CUR_HOST_ST" == "$TMP_HOST_ST" ]; then
CHECK_CNT=$((CHECK_CNT+1))
else
CUR_HOST_ST=$TMP_HOST_ST
CHECK_CNT=0
fi
if [ "$CHECK_CNT" -ge 5 ]; then
echo "$CUR_HOST_ST"
break
fi
else
MDIO_ERR_CNT=$((MDIO_ERR_CNT+1))
if [ "$MDIO_ERR_CNT" -ge 5 ]; then
echo "$HOST_ST_UNKNOW"
return 1
fi
fi
done
return 0
}
function get_host_status()
{
local sled_num=$1
if [ "$(get_ac_status "$SLED_NUM")" == "$HOST_AC_OFF" ];then
echo "$HOST_AC_OFF"
return 0
fi
if [ "$(get_board_rev)" = "$REV_EVT" ]; then
get_host_status_dbus "$sled_num"
else
get_host_status_mdio "$sled_num"
fi
return $?
}
function get_host_bootmode()
{
local BUS_NAME="xyz.openbmc_project.Settings"
local OBJ_PATH="/xyz/openbmc_project/control/host${1}/boot"
local INTF_NAME="xyz.openbmc_project.Control.Boot.Mode"
busctl get-property "${BUS_NAME}" "${OBJ_PATH}" "${INTF_NAME}" BootMode | awk '{print $2}'
}
function do_action_reset()
{
# 1. Power off
# 2. Power on
local SLED_NUM=$1
local CUR_ST=$2
if [ "$CUR_ST" != "$HOST_ST_OFF" ]; then
do_action_off "$SLED_NUM"
else
echo "sled${SLED_NUM}: already powered off"
fi
sleep 3
do_action_on "$SLED_NUM"
}
function do_action_cycle()
{
# 1. AC off
# 2. AC on
# 3. Power on
local SLED_NUM=$1
do_action_ac_off "$SLED_NUM"
sleep 3
do_action_ac_on "$SLED_NUM"
sleep 3
do_action_on "$SLED_NUM"
}
function do_action_ac_on()
{
local SLED_NUM=$1
echo "sled${SLED_NUM}: turn on AC"
set_gpio "power-host${SLED_NUM}" 1
echo "$ACTION_AC_ON" > "/tmp/sled${SLED_NUM}-last-action"
}
function do_action_ac_off()
{
local SLED_NUM=$1
echo "sled${SLED_NUM}: turn off AC"
set_gpio "power-host${SLED_NUM}" 0
echo "$ACTION_AC_OFF" > "/tmp/sled${SLED_NUM}-last-action"
}
function do_action_on()
{
local SLED_NUM=$1
echo "sled${SLED_NUM}: power on host"
trigger_power_button "$SLED_NUM" "$DELAY_POWER_ON"
sleep 10 # Mac mini need about 10 second to stable link status
echo "$ACTION_ON" > "/tmp/sled${SLED_NUM}-last-action"
}
function do_action_off()
{
local SLED_NUM=$1
echo "sled${SLED_NUM}: power off host"
trigger_power_button "$SLED_NUM" "$DELAY_POWER_OFF"
echo "$ACTION_OFF" > "/tmp/sled${SLED_NUM}-last-action"
}
function do_action_recovery()
{
local SLED_NUM=$1
echo "sled${SLED_NUM}: trigger host recovery mode"
trigger_power_button "$SLED_NUM" "$DELAY_POWER_RECOVERY_MODE"
echo "$ACTION_RECOVERY" > "/tmp/sled${SLED_NUM}-last-action"
}
function do_action_dfu()
{
local SLED_NUM=$1
echo "sled${SLED_NUM}: trigger host dfu mode"
# turn ac off, and hold for 25 seconds
do_action_ac_off "$SLED_NUM"
sleep 25
# press power button
echo "SLED$SLED_NUM: pressing power button"
if ! press_power_button "$SLED_NUM"; then
echo "SLED$SLED_NUM: press power button failed"
echo "SLED$SLED_NUM: releasing power button"
release_power_button "$SLED_NUM"
return 1
fi
sleep 1
# turn ac on
echo "SLED$SLED_NUM: turn ac-on"
do_action_ac_on "$SLED_NUM"
sleep 3
# release power button
echo "SLED$SLED_NUM: releasing host power button"
if ! release_power_button "$SLED_NUM"; then
echo "SLED$SLED_NUM: release power button failed"
return 1
fi
echo "$ACTION_DFU" > "/tmp/sled${SLED_NUM}-last-action"
}
function host_state_on_action_handler()
{
local SLED_NUM=$1
local ACTION=$2
case $ACTION in
"$ACTION_OFF")
do_action_off "$SLED_NUM"
;;
"$ACTION_AC_OFF")
do_action_ac_off "$SLED_NUM"
;;
"$ACTION_RESET")
do_action_reset "$SLED_NUM" "$HOST_ST_ON"
;;
"$ACTION_CYCLE")
do_action_cycle "$SLED_NUM"
;;
*)
echo "Invalid action ($ACTION) for current host state (On)"
return 1
;;
esac
}
function host_state_sleep_action_handler()
{
local SLED_NUM=$1
local ACTION=$2
case $ACTION in
"$ACTION_ON")
do_action_on "$SLED_NUM"
;;
"$ACTION_OFF")
do_action_off "$SLED_NUM"
;;
"$ACTION_AC_OFF")
do_action_ac_off "$SLED_NUM"
;;
"$ACTION_RESET")
do_action_reset "$SLED_NUM" "$HOST_ST_ON"
;;
"$ACTION_CYCLE")
do_action_cycle "$SLED_NUM"
;;
*)
echo "Invalid action ($ACTION) for current host state (Sleep)"
return 1
;;
esac
}
function host_state_off_action_handler()
{
local SLED_NUM=$1
local ACTION=$2
case $ACTION in
"$ACTION_ON")
do_action_on "$SLED_NUM"
;;
"$ACTION_RECOVERY")
do_action_recovery "$SLED_NUM"
;;
"$ACTION_DFU")
do_action_dfu "$SLED_NUM"
;;
"$ACTION_AC_OFF")
do_action_ac_off "$SLED_NUM"
;;
"$ACTION_RESET")
do_action_reset "$SLED_NUM" "$HOST_ST_ON"
;;
"$ACTION_CYCLE")
do_action_cycle "$SLED_NUM"
;;
*)
echo "Invalid action ($ACTION) for current host state (Off)"
return 1
;;
esac
}
function host_state_ac_off_action_handler()
{
local SLED_NUM=$1
local ACTION=$2
case $ACTION in
"$ACTION_AC_ON")
do_action_ac_on "$SLED_NUM"
;;
"$ACTION_DFU")
do_action_dfu "$SLED_NUM"
;;
"$ACTION_AC_OFF")
echo "sled${SLED_NUM}: already ac off"
return 1
;;
"$ACTION_CYCLE")
do_action_reset "$SLED_NUM"
;;
*)
echo "Invalid action ($ACTION) for current host state (AC Off)"
return 1
;;
esac
}
function host_state_ac_on_action_handler()
{
local SLED_NUM=$1
local ACTION=$2
case $ACTION in
"$ACTION_AC_OFF")
do_action_ac_off "$SLED_NUM"
;;
"$ACTION_DFU")
do_action_dfu "$SLED_NUM"
;;
"$ACTION_CYCLE")
do_action_cycle "$SLED_NUM"
;;
*)
echo "sled${SLED_NUM}: already ac on"
return 1
;;
esac
}
function host_state_recovery_action_handler()
{
local SLED_NUM=$1
local ACTION=$2
case $ACTION in
"$ACTION_OFF")
do_action_off "$SLED_NUM"
;;
"$ACTION_AC_OFF")
do_action_ac_off "$SLED_NUM"
;;
"$ACTION_RESET")
do_action_reset "$SLED_NUM" "$HOST_ST_ON"
;;
"$ACTION_CYCLE")
do_action_cycle "$SLED_NUM"
;;
*)
echo "Invalid action ($ACTION) for current host state (Recovery)"
return 1
;;
esac
}
function host_state_dfu_action_handler()
{
local SLED_NUM=$1
local ACTION=$2
case $ACTION in
"$ACTION_AC_OFF")
do_action_ac_off "$SLED_NUM"
;;
"$ACTION_CYCLE")
do_action_cycle "$SLED_NUM"
;;
*)
echo "Invalid action ($ACTION) for current host state (DFU)"
return 1
;;
esac
}
function create_dev_mem()
{
CHECK_CNT=0
while true
do
CHECK_CNT=$((CHECK_CNT+1))
if [ -c /dev/mem ]; then
# /dev/mem already exist
return 0
elif mknod /dev/mem c 1 1; then
# mknod success
return 0
elif [ "$CHECK_CNT" -ge 5 ]; then
break
fi
sleep 1
done
echo "create /dev/mem failed"
return 1
}
function show_usage(){
echo "Usage: power-ctrl [sled1 | sled2 | sled3 | sled4 | sled5 | sled6] [$VALID_SLED_ACTIONS]"
echo " power-ctrl chassis-cycle"
}
if [ $# -eq 1 ]; then
if [ "$1" = "chassis-cycle" ];then
echo "chassis cycle...."
i2cset -y -f 12 0x11 0xd9 c
exit 0
else
echo "Invalid argument: [ $1 ]"
show_usage
exit 1;
fi
fi
if [ $# -gt 2 ]; then
echo "Too many arguments"
show_usage
exit 1;
fi
if [[ "$1" =~ ^(sled[1-6]{1})$ ]]; then
SLED=$1
ACTION=$2
SLED_NUM=${SLED:4}
else
echo "invalid sled name: ${1}"
show_usage
exit 1;
fi
#Check if sled is present
if ! is_sled_present "${SLED_NUM}"; then
echo "${SLED} is not present!"
exit 1
elif ! is_valid_sled_action "$ACTION"; then
echo "Unknown action: $ACTION"
show_usage
exit 1
fi
if [ "$ACTION" = "$ACTION_AC_ON" ]; then
if [ "$(get_ac_status "$SLED_NUM")" = "$HOST_AC_OFF" ]; then
do_action_ac_on "$SLED_NUM"
fi
elif [ "$ACTION" = "$ACTION_AC_OFF" ]; then
if [ "$(get_ac_status "$SLED_NUM")" != "$HOST_AC_OFF" ]; then
do_action_ac_off "$SLED_NUM"
fi
elif [ "$ACTION" = "$ACTION_STATUS" ];then
HOST_CURR_STATUS=$(get_host_status "$SLED_NUM")
echo "$HOST_CURR_STATUS"
else
HOST_CURR_STATUS=$(get_host_status "$SLED_NUM")
if [ "$ACTION" = "$ACTION_BOOT_MODE" ]; then
BOOT_MODE=$(get_host_bootmode "$SLED_NUM")
case "$BOOT_MODE" in
"$BOOT_MODE_REGULAR")
echo "Boot mode: on (regular)"
ACTION="$ACTION_ON"
;;
"$BOOT_MODE_SAFE")
echo "Boot mode: recovery (safe)"
ACTION="$ACTION_RECOVERY"
;;
"$BOOT_MODE_SETUP")
echo "Boot mode: dfu (setup)"
ACTION="$ACTION_DFU"
;;
*)
echo "Boot mode: unknow"
;;
esac
fi
case $HOST_CURR_STATUS in
"$HOST_AC_OFF")
host_state_ac_off_action_handler "$SLED_NUM" "$ACTION"
;;
"$HOST_AC_ON")
host_state_ac_on_action_handler "$SLED_NUM" "$ACTION"
;;
"$HOST_ST_OFF")
host_state_off_action_handler "$SLED_NUM" "$ACTION"
;;
"$HOST_ST_ON")
host_state_on_action_handler "$SLED_NUM" "$ACTION"
;;
"$HOST_ST_SLEEP")
host_state_sleep_action_handler "$SLED_NUM" "$ACTION"
;;
"$HOST_ST_DFU")
host_state_dfu_action_handler "$SLED_NUM" "$ACTION"
;;
"$HOST_ST_RECOVERY")
host_state_recovery_action_handler "$SLED_NUM" "$ACTION"
;;
esac
fi
@@ -0,0 +1,33 @@
SUMMARY = "Bletchley Motor control"
PR = "r1"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
inherit obmc-phosphor-systemd
RDEPENDS:${PN} += "bash"
RDEPENDS:${PN} += "i2c-tools"
RDEPENDS:${PN} += "libgpiod-tools"
RDEPENDS:${PN} += "mdio-tools"
RDEPENDS:${PN} += "bletchley-common-functions"
S = "${WORKDIR}"
SRC_URI += " \
file://motor-ctrl \
file://motor-init \
file://power-ctrl \
"
do_install() {
install -d ${D}${sbindir}
install -m 0755 ${WORKDIR}/power-ctrl ${D}${sbindir}
install -d ${D}${libexecdir}
install -m 0755 ${WORKDIR}/motor-ctrl ${D}${libexecdir}
install -m 0755 ${WORKDIR}/motor-init ${D}${libexecdir}
}
TGT = "${SYSTEMD_DEFAULT_TARGET}"
MOTOR_INIT_INSTFMT="../motor-init-calibration@.service:${TGT}.wants/motor-init-calibration@{0}.service"
SYSTEMD_SERVICE:${PN} += "motor-init-calibration@.service"
SYSTEMD_LINK:${PN} += "${@compose_list(d, 'MOTOR_INIT_INSTFMT', 'OBMC_HOST_INSTANCES')}"
@@ -0,0 +1,28 @@
#!/bin/bash -e
# shellcheck source=meta-facebook/meta-bletchley/recipes-bletchley/plat-tools/files/bletchley-common-functions
source /usr/libexec/bletchley-common-functions
# set initial value for GPIO output pins
set_gpio SEL_SPI2_MUX 1
set_gpio SPI2_MUX1 1
set_gpio SPI2_MUX2 1
set_gpio SPI2_MUX3 1
set_gpio SWITCH_FRU_MUX 1
set_gpio BAT_DETECT 1
set_gpio BMC_BT_WP0_N 1
set_gpio BMC_BT_WP1_N 1
set_gpio USB2_SEL0_A 1
set_gpio USB2_SEL1_A 1
set_gpio USB2_SEL0_B 1
set_gpio USB2_SEL1_B 1
set_gpio RST_FRONT_IOEXP_N 1
set_gpio BSM_FLASH_LATCH_N 1
# set initial duty value for each fan
set_fan 0 70
set_fan 1 70
set_fan 2 70
set_fan 3 70
exit 0;
@@ -0,0 +1,161 @@
#!/bin/bash
export PATH=$PATH:/usr/sbin:/usr/libexec
# shellcheck source=meta-facebook/meta-bletchley/recipes-bletchley/plat-tools/files/bletchley-common-functions
source /usr/libexec/bletchley-common-functions
MDIO_TOOL="/usr/sbin/mdio"
SWITCH_MDIO_BUS="1e650000.mdio-1"
declare -a PORT_NUM_MAP=(10 3 2 1 7 6 5)
declare -a HOST_PREVIOUS_STATE=("" "" "" "" "" "" "")
declare -a HOST_STATE_CHANGE_CHECK=(0 0 0 0 0 0 0)
HOST_STATE_CHANGE_CHECH_CNT=5
declare -A HOST_ACPI_ST_MAP
HOST_ACPI_ST_MAP["UNKNOW"]="Unknow"
HOST_ACPI_ST_MAP["NOT_PRESENT"]="G3"
HOST_ACPI_ST_MAP["AC_OFF"]="G3"
HOST_ACPI_ST_MAP["OFF"]="G3"
HOST_ACPI_ST_MAP["SLEEP"]="SLEEP"
HOST_ACPI_ST_MAP["ON"]="S0_G0_D0"
declare -A HOST_STATE_MAP
HOST_STATE_MAP["UNKNOW"]="Quiesced"
HOST_STATE_MAP["NOT_PRESENT"]="Off"
HOST_STATE_MAP["AC_OFF"]="Off"
HOST_STATE_MAP["OFF"]="Off"
HOST_STATE_MAP["SLEEP"]="Standby"
HOST_STATE_MAP["ON"]="Running"
declare -A CHASSIS_PWR_STATE_MAP
CHASSIS_PWR_STATE_MAP["UNKNOW"]="On"
CHASSIS_PWR_STATE_MAP["NOT_PRESENT"]="Off"
CHASSIS_PWR_STATE_MAP["AC_OFF"]="Off"
CHASSIS_PWR_STATE_MAP["OFF"]="On"
CHASSIS_PWR_STATE_MAP["SLEEP"]="On"
CHASSIS_PWR_STATE_MAP["ON"]="On"
is_host_ac_on()
{
local HOST_ID=$1
local I2C_BUS
local P1_OUTPUT_REG
local P1_CONFIG_REG
local HOST_PWR
local IS_OUTPUT
I2C_BUS=$((HOST_ID-1))
P1_OUTPUT_REG=$(i2cget -f -y "$I2C_BUS" 0x76 0x03)
P1_CONFIG_REG=$(i2cget -f -y "$I2C_BUS" 0x76 0x07)
HOST_PWR="$(( (P1_OUTPUT_REG & 0x80)>>7 ))"
IS_OUTPUT="$(( (~P1_CONFIG_REG & 0x80)>>7 ))"
if [ "$((HOST_PWR & IS_OUTPUT))" -eq 1 ];then
return 0
fi
return 1
}
update_host_acpi_power_state()
{
local BUS_NAME="xyz.openbmc_project.Settings"
local OBJ_PATH="/xyz/openbmc_project/control/host$1/acpi_power_state"
local DBUS_PROPERTIES_INTF_NAME="org.freedesktop.DBus.Properties"
local INTF_NAME="xyz.openbmc_project.Control.Power.ACPIPowerState"
local PROPERTY_NAME="SysACPIStatus"
local PROPERTY_VAL="xyz.openbmc_project.Control.Power.ACPIPowerState.ACPI.$2"
busctl call "$BUS_NAME" "$OBJ_PATH" "$DBUS_PROPERTIES_INTF_NAME" Set ssv "$INTF_NAME" "$PROPERTY_NAME" s "$PROPERTY_VAL"
}
update_host_state()
{
local BUS_NAME="xyz.openbmc_project.State.Host$1"
local OBJ_PATH="/xyz/openbmc_project/state/host$1"
local DBUS_PROPERTIES_INTF_NAME="org.freedesktop.DBus.Properties"
local INTF_NAME="xyz.openbmc_project.State.Host"
local PROPERTY_NAME="CurrentHostState"
local PROPERTY_VAL="xyz.openbmc_project.State.Host.HostState.$2"
busctl call "$BUS_NAME" "$OBJ_PATH" "$DBUS_PROPERTIES_INTF_NAME" Set ssv "$INTF_NAME" "$PROPERTY_NAME" s "$PROPERTY_VAL"
}
update_chassis_power_state()
{
local BUS_NAME="xyz.openbmc_project.State.Chassis$1"
local OBJ_PATH="/xyz/openbmc_project/state/chassis$1"
local DBUS_PROPERTIES_INTF_NAME="org.freedesktop.DBus.Properties"
local INTF_NAME="xyz.openbmc_project.State.Chassis"
local PROPERTY_NAME="CurrentPowerState"
local PROPERTY_VAL="xyz.openbmc_project.State.Chassis.PowerState.$2"
busctl call "$BUS_NAME" "$OBJ_PATH" "$DBUS_PROPERTIES_INTF_NAME" Set ssv "$INTF_NAME" "$PROPERTY_NAME" s "$PROPERTY_VAL"
}
update_sled_led_state()
{
local HOST_ID=$1
local HOST_STATE=$2
case "$HOST_STATE" in
ON|SLEEP)
systemctl start obmc-led-group-start@sled"$i"_good.service
;;
AC_OFF|OFF)
systemctl start obmc-led-group-stop@sled"$i"_good.service
;;
*)
;;
esac
}
check_host_state()
{
if ! PORT_ST_VAL=$("$MDIO_TOOL" "$SWITCH_MDIO_BUS" phy "${PORT_NUM_MAP[$1]}" 0x00); then
# failed to get port status via mdio
echo "UNKNOW"
return 1
fi
if [ $((PORT_ST_VAL&16#0800)) -eq $((16#0000)) ]; then
echo "OFF"
elif [ $((PORT_ST_VAL&16#0A00)) -eq $((16#0A00)) ]; then
echo "ON"
elif [ $((PORT_ST_VAL&16#0900)) -eq $((16#0900)) ]; then
echo "SLEEP"
else
echo "UNKNOW"
fi
return 0
}
while true
do
for i in {1..6}
do
HOST_STATE=""
if ! is_sled_present "$i"; then
HOST_STATE="NOT_PRESENT"
elif ! is_host_ac_on "$i"; then
HOST_STATE="AC_OFF"
else
HOST_STATE=$(check_host_state "$i")
fi
if [ "$HOST_STATE" = "${HOST_PREVIOUS_STATE[$i]}" ]; then
HOST_STATE_CHANGE_CHECK[i]="$HOST_STATE_CHANGE_CHECH_CNT"
elif [ "${HOST_STATE_CHANGE_CHECK[$i]}" -gt "0" ]; then
echo "SLED$i: detected state changed (previous:${HOST_PREVIOUS_STATE[$i]}, current:$HOST_STATE), check count: ${HOST_STATE_CHANGE_CHECK[$i]}"
HOST_STATE_CHANGE_CHECK[i]=$((HOST_STATE_CHANGE_CHECK[i]-1))
else
echo "SLED$i: detected state changed, update host state to $HOST_STATE"
update_host_acpi_power_state "$i" "${HOST_ACPI_ST_MAP[$HOST_STATE]}"
update_host_state "$i" "${HOST_STATE_MAP[$HOST_STATE]}"
update_chassis_power_state "$i" "${CHASSIS_PWR_STATE_MAP[$HOST_STATE]}"
update_sled_led_state "$i" "$HOST_STATE"
HOST_STATE_CHANGE_CHECK[i]="$HOST_STATE_CHANGE_CHECH_CNT"
HOST_PREVIOUS_STATE[i]="$HOST_STATE"
fi
done
sleep 1
done
@@ -0,0 +1,38 @@
[Unit]
Description=Bletchley host state monitoring
Wants=xyz.openbmc_project.State.Chassis@1.service
After=xyz.openbmc_project.State.Chassis@1.service
Wants=xyz.openbmc_project.State.Chassis@2.service
After=xyz.openbmc_project.State.Chassis@2.service
Wants=xyz.openbmc_project.State.Chassis@3.service
After=xyz.openbmc_project.State.Chassis@3.service
Wants=xyz.openbmc_project.State.Chassis@4.service
After=xyz.openbmc_project.State.Chassis@4.service
Wants=xyz.openbmc_project.State.Chassis@5.service
After=xyz.openbmc_project.State.Chassis@5.service
Wants=xyz.openbmc_project.State.Chassis@6.service
After=xyz.openbmc_project.State.Chassis@6.service
Wants=xyz.openbmc_project.State.Host@1.service
After=xyz.openbmc_project.State.Host@1.service
Wants=xyz.openbmc_project.State.Host@2.service
After=xyz.openbmc_project.State.Host@2.service
Wants=xyz.openbmc_project.State.Host@3.service
After=xyz.openbmc_project.State.Host@3.service
Wants=xyz.openbmc_project.State.Host@4.service
After=xyz.openbmc_project.State.Host@4.service
Wants=xyz.openbmc_project.State.Host@5.service
After=xyz.openbmc_project.State.Host@5.service
Wants=xyz.openbmc_project.State.Host@6.service
After=xyz.openbmc_project.State.Host@6.service
Wants=xyz.openbmc_project.Settings.service
After=xyz.openbmc_project.Settings.service
[Service]
ExecStart=/usr/libexec/bletchley-host-state-monitor
SyslogIdentifier=bletchley-host-state-monitor
Type=simple
Restart=on-failure
RestartSec=1
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,11 @@
[Unit]
Wants=xyz.openbmc_project.LED.GroupManager.service
After=xyz.openbmc_project.LED.GroupManager.service
Wants=obmc-led-group-start@fan0_good.service
After=obmc-led-group-start@fan0_good.service
Wants=obmc-led-group-start@fan1_good.service
After=obmc-led-group-start@fan1_good.service
Wants=obmc-led-group-start@fan2_good.service
After=obmc-led-group-start@fan2_good.service
Wants=obmc-led-group-start@fan3_good.service
After=obmc-led-group-start@fan3_good.service
@@ -0,0 +1,11 @@
[Unit]
Description=Bletchley Early System Init
Before=phosphor-pid-control.service
[Service]
Type=oneshot
ExecStart=/usr/libexec/bletchley-early-sys-init
SyslogIdentifier=Bletchley Early Init
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,30 @@
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
inherit allarch systemd obmc-phosphor-systemd
RDEPENDS:${PN} += "bash"
RDEPENDS:${PN} += "libgpiod-tools"
RDEPENDS:${PN} += "bletchley-common-functions"
RDEPENDS:${PN} += "mdio-tools"
SRC_URI += " \
file://bletchley-early-sys-init \
file://bletchley-sys-init.service \
file://bletchley-host-state-monitor \
file://bletchley-host-state-monitor.service \
"
SYSTEMD_PACKAGES = "${PN}"
SYSTEMD_SERVICE:${PN}:append = " \
bletchley-sys-init.service \
bletchley-host-state-monitor.service \
"
do_install() {
install -d ${D}${libexecdir}
install -m 0755 ${WORKDIR}/bletchley-early-sys-init ${D}${libexecdir}
install -m 0755 ${WORKDIR}/bletchley-host-state-monitor ${D}${libexecdir}
}
SYSTEMD_OVERRIDE:${PN}:bletchley += "bletchley-sys-init.conf:bletchley-sys-init.service.d/bletchley-sys-init.conf"
@@ -0,0 +1,13 @@
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
RDEPENDS:${PN} += " bash libgpiod-tools"
SRC_URI += " \
file://bletchley-common-functions \
"
do_install() {
install -d ${D}${libexecdir}
install -m 0755 ${WORKDIR}/bletchley-common-functions ${D}${libexecdir}
}
@@ -0,0 +1,30 @@
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
inherit obmc-phosphor-systemd
RDEPENDS:${PN} += " bash motor-ctrl"
RDEPENDS:${PN} += " mdio-tools"
SRC_URI += " \
file://bletchley-system-state-init \
file://bletchley-system-state-init@.service \
file://bletchley-usbmux-util \
file://bletchley-net-util \
"
do_install() {
install -d ${D}${libexecdir}
install -m 0755 ${WORKDIR}/bletchley-system-state-init ${D}${libexecdir}
install -d ${D}${bindir}
install -m 0755 ${WORKDIR}/bletchley-usbmux-util ${D}${bindir}
install -m 0755 ${WORKDIR}/bletchley-net-util ${D}${bindir}
}
TGT = "${SYSTEMD_DEFAULT_TARGET}"
BLETCHLEY_SYS_ST_INIT_INSTFMT="../bletchley-system-state-init@.service:${TGT}.wants/bletchley-system-state-init@{0}.service"
SYSTEMD_SERVICE:${PN} += "bletchley-system-state-init@.service"
SYSTEMD_LINK:${PN} += "${@compose_list(d, 'BLETCHLEY_SYS_ST_INIT_INSTFMT', 'OBMC_HOST_INSTANCES')}"
@@ -0,0 +1,186 @@
#!/bin/bash
get_gpio()
{
local NET_NAME=$1
local RET_VAL
mapfile -t -d " " GPIO_INFO < <(gpiofind "$NET_NAME")
if [ "${#GPIO_INFO[@]}" -ne 2 ]; then
echo "get_gpio: can not find gpio, $NET_NAME" >&2
return 1
fi
if ! RET_VAL=$(gpioget "${GPIO_INFO[0]}" "${GPIO_INFO[1]%$'\n'}") ; then
echo "get_gpio: get ${NET_NAME} failed" >&2
return 1
fi
echo "${RET_VAL}"
return 0
}
set_gpio()
{
local NET_NAME=$1
local OUT_VAL=$2
mapfile -t -d " " GPIO_INFO < <(gpiofind "$NET_NAME")
if [ "${#GPIO_INFO[@]}" -ne 2 ]; then
echo "set_gpio: can not find gpio, $NET_NAME"
return 1
fi
echo -n "set_gpio: set $NET_NAME = $OUT_VAL"
if ! gpioset "${GPIO_INFO[0]}" "${GPIO_INFO[1]%$'\n'}"="$OUT_VAL"; then
echo " failed"
return 1
fi
echo " success"
return 0
}
wait_gpio_falling()
{
local NET_NAME=$1
local TIMEOUT_SEC=$2
mapfile -t -d " " GPIO_INFO < <(gpiofind "$NET_NAME")
if [ "${#GPIO_INFO[@]}" -ne 2 ]; then
echo "wait_gpio_falling: can not find gpio, $NET_NAME"
return 1
fi
timeout "$TIMEOUT_SEC" gpiomon --silent --falling-edge --num-events=1 "${GPIO_INFO[0]}" "${GPIO_INFO[1]%$'\n'}"
}
set_fan()
{
FAN_ID=$1
FAN_DUTY=$2
SYSFA_PWM_PATH=""
for file in /sys/devices/platform/pwm-fan"$FAN_ID"/hwmon/hwmon*/pwm1
do
if [ -e "$file" ]; then
SYSFA_PWM_PATH="$file"
break
fi
done
if [ -z "$SYSFA_PWM_PATH" ]; then
echo "set_fan: pwm file not found, chekc fan id ($FAN_ID)"
return 1
fi
if [ "$FAN_DUTY" -lt 0 ] || [ "$FAN_DUTY" -gt 100 ]; then
echo "set_fan: incorrect fan duty, $FAN_DUTY"
return 1
fi
# convert duty (0-100) to pwm value (0-255)
PWM_VAL=$(printf "%.0f" $((FAN_DUTY*255/100)))
echo -n "set_fan: set fan$FAN_ID = $FAN_DUTY"
if ! echo "$PWM_VAL" > "$SYSFA_PWM_PATH"; then
echo " failed"
return 1
fi
echo " success"
return 0
}
is_sled_present()
{
local SLED_ID=$1
local SRV_NAME="xyz.openbmc_project.Inventory.Manager"
local OBJ_PATH="/xyz/openbmc_project/inventory/system/chassis/presence/presence_sled${SLED_ID}"
local INTF_NAME="xyz.openbmc_project.Inventory.Item"
local PRST_VAL
PRST_VAL=$(busctl get-property "${SRV_NAME}" "${OBJ_PATH}" "${INTF_NAME}" Present | awk '{print $2}')
if [ "$PRST_VAL" != "true" ]; then
# not present
return 1
fi
# present
return 0
}
spi2_mux_select()
{
local SLED_INDEX="$1"
if [ "$SLED_INDEX" = "0" ]; then
set_gpio SEL_SPI2_MUX 1
set_gpio SPI2_MUX1 1
set_gpio SPI2_MUX2 1
set_gpio SPI2_MUX3 1
elif [ "$SLED_INDEX" = "1" ]; then
set_gpio SEL_SPI2_MUX 0
set_gpio SPI2_MUX1 0
set_gpio SPI2_MUX2 1
set_gpio SPI2_MUX3 1
elif [ "$SLED_INDEX" = "2" ]; then
set_gpio SEL_SPI2_MUX 1
set_gpio SPI2_MUX1 0
set_gpio SPI2_MUX2 1
set_gpio SPI2_MUX3 1
elif [ "$SLED_INDEX" = "3" ]; then
set_gpio SEL_SPI2_MUX 0
set_gpio SPI2_MUX1 1
set_gpio SPI2_MUX2 0
set_gpio SPI2_MUX3 1
elif [ "$SLED_INDEX" = "4" ]; then
set_gpio SEL_SPI2_MUX 1
set_gpio SPI2_MUX1 1
set_gpio SPI2_MUX2 0
set_gpio SPI2_MUX3 1
elif [ "$SLED_INDEX" = "5" ]; then
set_gpio SEL_SPI2_MUX 0
set_gpio SPI2_MUX1 1
set_gpio SPI2_MUX2 1
set_gpio SPI2_MUX3 0
elif [ "$SLED_INDEX" = "6" ]; then
set_gpio SEL_SPI2_MUX 1
set_gpio SPI2_MUX1 1
set_gpio SPI2_MUX2 1
set_gpio SPI2_MUX3 0
else
echo "set_spi2_mux: unknow sled index ($SLED_INDEX)"
return 1
fi
return 0
}
bind_spi2_pnor()
{
local SLED_INDEX="$1"
if ! spi2_mux_select "$SLED_INDEX"; then
return 1
fi
if ! echo -n spi1.0 > /sys/bus/spi/drivers/spi-nor/bind; then
echo "Error: flash bind failed"
return 1
fi
return 0
}
unbind_spi2_pnor()
{
echo -n spi1.0 > /sys/bus/spi/drivers/spi-nor/unbind
spi2_mux_select 0
return 0
}
find_mtd()
{
m=$(grep -xl "$1" /sys/class/mtd/*/name)
m=${m%/name}
m=${m##*/}
echo "$m"
}
@@ -0,0 +1,102 @@
#!/bin/bash
declare -a PORT_NUM_MAP=(10 3 2 1 7 6 5)
declare -a PORT_NAME_MAP=(BMC SLED1 SLED2 SLED3 SLED4 SLED5 SLED6)
SWITCH_MDIO_BUS="1e650000.mdio-1"
INNER_PORT_DEV_ID="4"
OUTER_PORT_DEV_ID="3"
RETIMER_MDIO_BUS="1e650018.mdio-1"
get_switch_port_link_st()
{
local port_phy_id=$1
if PORT_ST_VAL="$(mdio "$SWITCH_MDIO_BUS" phy "$port_phy_id" 0x00)"; then
PORT_ST_VAL="${PORT_ST_VAL:2}"
if [ "$((16#$PORT_ST_VAL & 16#0800))" -eq "0" ]; then
PORT_ST="down"
else
PORT_ST="up"
fi
else
PORT_ST="mdio failed"
fi
echo "${PORT_ST}"
}
get_retimer_port_link_st()
{
local port_dev_id=$1
if PORT_ST_VAL="$(mdio "$RETIMER_MDIO_BUS" mmd 0:"$port_dev_id" 0x9002)"; then
PORT_ST_VAL="${PORT_ST_VAL:2}"
if [ "$((16#$PORT_ST_VAL & 16#0004))" -eq "0" ]; then
PORT_ST="down"
else
PORT_ST="up"
fi
else
PORT_ST="mdio failed"
fi
echo "${PORT_ST}"
}
get_port_link_st()
{
printf "========================================\n"
printf "Link Status\n"
printf "========================================\n"
printf "Switch:\n"
for port_phy in {0..6}
do
printf " Port %d (%s): %s\n" "${PORT_NUM_MAP[port_phy]}" "${PORT_NAME_MAP[port_phy]}" "$(get_switch_port_link_st "${PORT_NUM_MAP[port_phy]}")"
done
printf "\n"
printf "Retimer:\n"
printf " Inner Port (XFI): %s\n" "$(get_retimer_port_link_st "${INNER_PORT_DEV_ID}")"
printf " Outer Port (SFI): %s\n" "$(get_retimer_port_link_st "${OUTER_PORT_DEV_ID}")"
printf "========================================\n\n"
}
get_switch_port_reg_dump()
{
for port_phy in {0..6}
do
printf "========================================\n"
printf "Port %d (%s)\n" "${PORT_NUM_MAP[port_phy]}" "${PORT_NAME_MAP[port_phy]}"
printf "****************************************\n"
for reg_offset in {0..31}
do
printf "[%02X]: %04X\n" "$reg_offset" "$(mdio "$SWITCH_MDIO_BUS" phy "${PORT_NUM_MAP[port_phy]}" "$reg_offset")"
done
printf "========================================\n\n"
done
}
print_help()
{
echo "Usage:"
echo " $0 <COMMAND>"
echo ""
echo "COMMAND:"
echo " --link-st"
echo " show link status"
echo ""
echo " --port-reg-dump"
echo " port registers dump"
echo ""
}
ACTION_CMD="$1"
if [[ ${ACTION_CMD} =~ -h|--help ]]; then
print_help
elif [ "${ACTION_CMD}" = "--link-st" ]; then
get_port_link_st
elif [ "${ACTION_CMD}" = "--port-reg-dump" ]; then
get_switch_port_reg_dump
else
echo "Unknow command: $ACTION_CMD"
print_help
fi
@@ -0,0 +1,41 @@
#!/bin/bash
DBUS_PROPERTIES_INTF_NAME="org.freedesktop.DBus.Properties"
set_host_state()
{
BUS_NAME="xyz.openbmc_project.State.Host$1"
OBJ_PATH="/xyz/openbmc_project/state/host$1"
INTF_NAME="xyz.openbmc_project.State.Host"
PROPERTY_NAME="CurrentHostState"
PROPERTY_VAL="xyz.openbmc_project.State.Host.HostState.$2"
busctl call "$BUS_NAME" "$OBJ_PATH" "$DBUS_PROPERTIES_INTF_NAME" Set ssv "$INTF_NAME" "$PROPERTY_NAME" s "$PROPERTY_VAL"
}
set_chassis_state()
{
BUS_NAME="xyz.openbmc_project.State.Chassis$1"
OBJ_PATH="/xyz/openbmc_project/state/chassis$1"
INTF_NAME="xyz.openbmc_project.State.Chassis"
PROPERTY_NAME="CurrentPowerState"
PROPERTY_VAL="xyz.openbmc_project.State.Chassis.PowerState.$2"
busctl call "$BUS_NAME" "$OBJ_PATH" "$DBUS_PROPERTIES_INTF_NAME" Set ssv "$INTF_NAME" "$PROPERTY_NAME" s "$PROPERTY_VAL"
}
INSTENCE_ID="$1"
HOST_PWR_STATUS=$(/usr/sbin/power-ctrl sled"$1" status)
CHASSIS_STATE_VAL="Off"
HOST_STATE_VAL="Off"
if [ "$HOST_PWR_STATUS" != "AC Off" ]; then
CHASSIS_STATE_VAL="On"
if [ "$HOST_PWR_STATUS" != "Off" ]; then
HOST_STATE_VAL="Running"
fi
fi
set_chassis_state "$INSTENCE_ID" "$CHASSIS_STATE_VAL"
set_host_state "$INSTENCE_ID" "$HOST_STATE_VAL"
@@ -0,0 +1,17 @@
[Unit]
Description=Bletchley host state and chassis power state initialize for sled%i
Wants=xyz.openbmc_project.State.Chassis@%i.service
After=xyz.openbmc_project.State.Chassis@%i.service
Wants=xyz.openbmc_project.State.Host@%i.service
After=xyz.openbmc_project.State.Host@%i.service
[Service]
ExecStart=/usr/libexec/bletchley-system-state-init %i
SyslogIdentifier=bletchley-system-state-init sled%i
Type=oneshot
RemainAfterExit=yes
Restart=on-failure
RestartSec=1
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,122 @@
#!/bin/bash
CMD=$1
SLED_INDEX=$2
CHIP_NUM=0
USB2_SEL0_A_PIN_OFFSET=0
USB2_SEL1_A_PIN_OFFSET=0
USB2_SEL0_B_PIN_OFFSET=0
USB2_SEL1_B_PIN_OFFSET=0
init_gpio_pin_info()
{
local pin_info
read -r -a pin_info < <(gpiofind USB2_SEL0_A)
CHIP_NUM="${pin_info[0]}"
USB2_SEL0_A_PIN_OFFSET="${pin_info[1]}"
read -r -a pin_info < <(gpiofind USB2_SEL1_A)
USB2_SEL1_A_PIN_OFFSET="${pin_info[1]}"
read -r -a pin_info < <(gpiofind USB2_SEL0_B)
USB2_SEL0_B_PIN_OFFSET="${pin_info[1]}"
read -r -a pin_info < <(gpiofind USB2_SEL1_B)
USB2_SEL1_B_PIN_OFFSET="${pin_info[1]}"
}
set_usbmux_gpio()
{
gpioset "$CHIP_NUM" \
"$USB2_SEL0_A_PIN_OFFSET"="$1" \
"$USB2_SEL1_A_PIN_OFFSET"="$2" \
"$USB2_SEL0_B_PIN_OFFSET"="$3" \
"$USB2_SEL1_B_PIN_OFFSET"="$4"
}
print_help()
{
echo "Usage:"
echo " bletchley-usbmux-util off"
echo " bletchley-usbmux-util on <SLED_INDEX>"
echo ""
echo "SLED_INDEX: 1 - 6"
echo ""
}
usb_mux_off()
{
set_usbmux_gpio 1 1 1 1
}
usb_mux_sled1()
{
usb_mux_off
sleep 2
set_usbmux_gpio 0 0 1 1
}
usb_mux_sled2()
{
usb_mux_off
sleep 2
set_usbmux_gpio 1 0 1 1
}
usb_mux_sled3()
{
usb_mux_off
sleep 2
set_usbmux_gpio 0 1 1 1
}
usb_mux_sled4()
{
usb_mux_off
sleep 2
set_usbmux_gpio 1 1 0 0
}
usb_mux_sled5()
{
usb_mux_off
sleep 2
set_usbmux_gpio 1 1 1 0
}
usb_mux_sled6()
{
usb_mux_off
sleep 2
set_usbmux_gpio 1 1 0 1
}
init_gpio_pin_info
if [ "$CMD" == "off" ]; then
usb_mux_off
elif [ "$CMD" == "on" ]; then
if [ "$SLED_INDEX" -eq 1 ]; then
usb_mux_sled1
elif [ "$SLED_INDEX" -eq 2 ]; then
usb_mux_sled2
elif [ "$SLED_INDEX" -eq 3 ]; then
usb_mux_sled3
elif [ "$SLED_INDEX" -eq 4 ]; then
usb_mux_sled4
elif [ "$SLED_INDEX" -eq 5 ]; then
usb_mux_sled5
elif [ "$SLED_INDEX" -eq 6 ]; then
usb_mux_sled6
else
echo "Invalid SLED index: $SLED_INDEX"
print_help
exit 1
fi
sleep 1
else
echo "Invalid command: $CMD"
print_help
exit 1
fi
exit 0