From 0528ecd60ca357896da8b993291ed7a725ef0102 Mon Sep 17 00:00:00 2001 From: Delphine CC Chiu Date: Thu, 3 Nov 2022 15:40:43 +0800 Subject: meta-facebook: phosphor-state-manager: support host power reset and chassis power cycle Summary: Add service and script to support host reset and chassis power cycle. Tested: Change property to trigger host and chassis target and check the power status. Change-Id: Ie21903f5bc5bbebeaf31153c52d1605cd35619a0 Signed-off-by: Delphine CC Chiu --- .../greatlakes/chassis-powercycle | 39 ++++++++++++++++++++ .../greatlakes/chassis-powercycle@.service | 9 +++++ .../greatlakes/host-powerreset | 43 ++++++++++++++++++++++ .../greatlakes/host-powerreset@.service | 9 +++++ .../phosphor-state-manager/greatlakes/power-cmd | 3 ++ .../greatlakes/sled-cycle.service | 9 +++++ .../state/phosphor-state-manager_%.bbappend | 20 ++++++++-- 7 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-powercycle create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-powercycle@.service create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-powerreset create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-powerreset@.service create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/sled-cycle.service (limited to 'meta-facebook') diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-powercycle b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-powercycle new file mode 100644 index 0000000000..6ae8c12823 --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-powercycle @@ -0,0 +1,39 @@ +#!/bin/bash + +# Provide source directive to shellcheck. +# shellcheck source=meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/power-cmd +source /usr/libexec/power-cmd + +POWER_OK_SLOT=$(( $1+9 )) +slot=$(( $1-1 )) +OFFSET=$(( 0x9 + slot )) + +chassis-power-gpio-status() +{ + POWER_OK_SLOT=$(( $1+9 )) + if [ "$1" -le 4 ] + then + status=$(gpioget 0 $POWER_OK_SLOT) + if [ "$status" == 1 ] + then + i2cset -y $BUS_NUM $CPLD_PWR_CTRL_ADDR $OFFSET $POW_OFF_SLOT + sleep 10 + fi + i2cset -y $BUS_NUM $CPLD_PWR_CTRL_ADDR $OFFSET $POW_ON_SLOT + exit 0; + fi + echo "invalid slot id" + exit 1; +} + +chassisid=$1 +if [ "$chassisid" == 0 ] +then + echo "Enter SLED-cycle" + result=$(i2cset -y $BUS_NUM $CPLD_PWR_CTRL_ADDR 0x2b 0x1) + echo "$result" +else + echo "Enter slot$1 cycle" + chassis-power-gpio-status "$chassisid" +fi + diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-powercycle@.service b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-powercycle@.service new file mode 100644 index 0000000000..9c26915f97 --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-powercycle@.service @@ -0,0 +1,9 @@ +[Unit] +Description=Chassis Power Cycle: %i + +[Service] +Type=oneshot +ExecStart=/usr/libexec/chassis-powercycle %i + +[Install] +WantedBy=obmc-chassis-powercycle@%i.target diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-powerreset b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-powerreset new file mode 100644 index 0000000000..f08c1317d6 --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-powerreset @@ -0,0 +1,43 @@ +#!/bin/bash + +# Provide source directive to shellcheck. +# shellcheck source=meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/power-cmd +source /usr/libexec/power-cmd + +SLOT_ID=$(( $1-1 << 2 )) + +# Host Reboot +host-reboot() +{ + for reset_cmd in "${reset_seq[@]}" + do + result="$(busctl call $SERVICE $OBJECT_PATH $INTERFACE sendRequest yyyyay $SLOT_ID $NETFN $LUN $CMD $DATA_LEN 0x01 0x42 0x01 0 "$reset_cmd")" + echo "$result" + if [ "$reset_cmd" == $POWER_BTN_LOW ] + then + sleep "$1" + fi + done + echo "Host Power Reset" + exit 0 +} + +# Check Host Response and Status +check-response() +{ + response="$(busctl call $SERVICE $OBJECT_PATH $INTERFACE sendRequest yyyyay $SLOT_ID 0x38 $LUN 0x3 0x03 0x15 0xa0 0x00)" + + result=$(echo "$response" | cut -d" " -f $PWRGD_SYS_PWROK_INDEX) + res="$(( "$result" & 0x80 ))" + pgood="$(( "$res" >> 7 ))" + if [ "$pgood" == $STATE_ON ] + then + host-reboot 1 + exit 0; + else + echo "Host is Off" + exit 1; + fi +} + +check-response diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-powerreset@.service b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-powerreset@.service new file mode 100644 index 0000000000..f999d127c7 --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-powerreset@.service @@ -0,0 +1,9 @@ +[Unit] +Description=Host Power Reset: %i + +[Service] +Type=oneshot +ExecStart=/usr/libexec/host-powerreset %i + +[Install] +WantedBy=obmc-host-force-warm-reboot@%i.target diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/power-cmd b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/power-cmd index e9c7ed7ce1..334798ca53 100644 --- a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/power-cmd +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/power-cmd @@ -2,7 +2,10 @@ export POWER_BTN_HIGH=0xFF export POWER_BTN_LOW=0xFE +export RESET_BTN_HIGH=0xFF +export RESET_BTN_LOW=0xFD export power_seq=( "$POWER_BTN_HIGH" "$POWER_BTN_LOW" "$POWER_BTN_HIGH" ) +export reset_seq=( "$RESET_BTN_HIGH" "$RESET_BTN_LOW" "$RESET_BTN_HIGH") export SERVICE="xyz.openbmc_project.Ipmi.Channel.Ipmb" export OBJECT_PATH="/xyz/openbmc_project/Ipmi/Channel/Ipmb" export INTERFACE="org.openbmc.Ipmb" diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/sled-cycle.service b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/sled-cycle.service new file mode 100644 index 0000000000..57b6bb6851 --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/sled-cycle.service @@ -0,0 +1,9 @@ +[Unit] +Description=Sled Cycle + +[Service] +Type=oneshot +ExecStart=/usr/libexec/chassis-powercycle 0 + +[Install] +WantedBy=obmc-chassis-powercycle@0.target diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager_%.bbappend b/meta-facebook/recipes-phosphor/state/phosphor-state-manager_%.bbappend index 53f7f8ce6e..42c7117941 100644 --- a/meta-facebook/recipes-phosphor/state/phosphor-state-manager_%.bbappend +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager_%.bbappend @@ -1,27 +1,37 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" -DEFAULT_TARGETS:append = " \ - obmc-chassis-poweron@{}.target.wants/chassis-poweron@{}.service \ - obmc-chassis-hard-poweroff@{}.target.wants/chassis-poweroff@{}.service \ +HOST_DEFAULT_TARGETS:append = " \ obmc-host-shutdown@{}.target.wants/host-poweroff@{}.service \ obmc-host-start@{}.target.wants/host-poweron@{}.service \ obmc-host-reboot@{}.target.wants/host-powercycle@{}.service \ + obmc-host-force-warm-reboot@{}.target.wants/host-powerreset@{}.service \ " -DEFAULT_TARGETS:remove = " \ + +CHASSIS_DEFAULT_TARGETS:append = " \ + obmc-chassis-poweron@{}.target.wants/chassis-poweron@{}.service \ + obmc-chassis-hard-poweroff@{}.target.wants/chassis-poweroff@{}.service \ + obmc-chassis-powercycle@{}.target.wants/chassis-powercycle@{}.service \ +" + +CHASSIS_DEFAULT_TARGETS:remove = " \ obmc-chassis-poweroff@{}.target.requires/obmc-powered-off@{}.service \ " SRC_URI:append:greatlakes = " \ file://chassis-poweroff@.service \ file://chassis-poweron@.service \ + file://chassis-powercycle@.service \ file://host-poweroff@.service \ file://host-poweron@.service \ file://host-powercycle@.service \ + file://host-powerreset@.service \ file://chassis-poweroff \ file://chassis-poweron \ + file://chassis-powercycle \ file://host-poweroff \ file://host-poweron \ file://host-powercycle \ + file://host-powerreset \ file://power-cmd \ " @@ -34,9 +44,11 @@ do_install:append:greatlakes() { install -d ${D}${libexecdir} install -m 0777 ${WORKDIR}/chassis-poweroff ${D}${libexecdir}/ install -m 0777 ${WORKDIR}/chassis-poweron ${D}${libexecdir}/ + install -m 0777 ${WORKDIR}/chassis-powercycle ${D}${libexecdir}/ install -m 0777 ${WORKDIR}/host-poweroff ${D}${libexecdir}/ install -m 0777 ${WORKDIR}/host-poweron ${D}${libexecdir}/ install -m 0777 ${WORKDIR}/host-powercycle ${D}${libexecdir}/ + install -m 0777 ${WORKDIR}/host-powerreset ${D}${libexecdir}/ install -m 0777 ${WORKDIR}/power-cmd ${D}${libexecdir}/ } FILES:${PN} += " /lib/systemd/system/*.service" -- cgit v1.2.3