Initial commit
This commit is contained in:
+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