Initial commit
This commit is contained in:
+21
@@ -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}/
|
||||
}
|
||||
+68
@@ -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
|
||||
+19
@@ -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
|
||||
+40
@@ -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')}"
|
||||
+10
@@ -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
|
||||
+8
@@ -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
|
||||
+109
@@ -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
|
||||
+13
@@ -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
|
||||
+7
@@ -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
|
||||
+140
@@ -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
|
||||
|
||||
+107
@@ -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
|
||||
+20
@@ -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
|
||||
+739
@@ -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')}"
|
||||
+28
@@ -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;
|
||||
+161
@@ -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
|
||||
+38
@@ -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
|
||||
+11
@@ -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"
|
||||
+13
@@ -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}
|
||||
}
|
||||
+30
@@ -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')}"
|
||||
+186
@@ -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
|
||||
+41
@@ -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"
|
||||
+17
@@ -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
|
||||
+122
@@ -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
|
||||
Reference in New Issue
Block a user