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,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