From 36f035b533c5530bfd7295ed11b931a5877b7855 Mon Sep 17 00:00:00 2001 From: Karthikeyan Pasupathi Date: Sun, 28 Aug 2022 17:35:29 +0530 Subject: meta-facebook: greatlakes: initial phopsphor-state-manager support Added machine layer support for greatlakes to support control the BMC, Chassis, and Host. It supports requests to power on and off the system by the user. Signed-off-by: Karthikeyan Pasupathi Change-Id: Ie62cc289783d47d8b50cd0c555157749f160c253 --- .../conf/machine/include/facebook-withhost.inc | 1 - .../meta-greatlakes/conf/machine/greatlakes.conf | 3 ++ .../packagegroups/packagegroup-fb-apps.bb | 3 +- .../greatlakes/chassis-poweroff | 43 ++++++++++++++++++++++ .../greatlakes/chassis-poweroff@.service | 9 +++++ .../greatlakes/chassis-poweron | 43 ++++++++++++++++++++++ .../greatlakes/chassis-poweron@.service | 9 +++++ .../greatlakes/host-powercycle | 43 ++++++++++++++++++++++ .../greatlakes/host-powercycle@.service | 9 +++++ .../greatlakes/host-poweroff | 40 ++++++++++++++++++++ .../greatlakes/host-poweroff@.service | 9 +++++ .../phosphor-state-manager/greatlakes/host-poweron | 39 ++++++++++++++++++++ .../greatlakes/host-poweron@.service | 9 +++++ .../phosphor-state-manager/greatlakes/power-cmd | 19 ++++++++++ .../state/phosphor-state-manager_%.bbappend | 40 ++++++++++++++++++++ 15 files changed, 317 insertions(+), 2 deletions(-) create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweroff create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweroff@.service create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweron create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweron@.service create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-powercycle create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-powercycle@.service create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweroff create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweroff@.service create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweron create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweron@.service create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/power-cmd create mode 100644 meta-facebook/recipes-phosphor/state/phosphor-state-manager_%.bbappend diff --git a/meta-facebook/conf/machine/include/facebook-withhost.inc b/meta-facebook/conf/machine/include/facebook-withhost.inc index 861d35f860..36ef7b7f86 100644 --- a/meta-facebook/conf/machine/include/facebook-withhost.inc +++ b/meta-facebook/conf/machine/include/facebook-withhost.inc @@ -13,4 +13,3 @@ VIRTUAL-RUNTIME_obmc-host-state-manager ?= "x86-power-control" VIRTUAL-RUNTIME_obmc-chassis-state-manager ?= "x86-power-control" PREFERRED_PROVIDER_virtual/obmc-host-ipmi-hw ?= "phosphor-ipmi-kcs" - diff --git a/meta-facebook/meta-greatlakes/conf/machine/greatlakes.conf b/meta-facebook/meta-greatlakes/conf/machine/greatlakes.conf index 011fdf6b5a..5958a89fe4 100644 --- a/meta-facebook/meta-greatlakes/conf/machine/greatlakes.conf +++ b/meta-facebook/meta-greatlakes/conf/machine/greatlakes.conf @@ -17,3 +17,6 @@ FLASH_SIZE = "131072" OBMC_HOST_INSTANCES = "1 2 3 4" # Primary chassis as Sled plus secondary chassis in N slots. OBMC_CHASSIS_INSTANCES = "0 ${OBMC_HOST_INSTANCES}" + +VIRTUAL-RUNTIME_obmc-host-state-manager = "phosphor-state-manager-host" +VIRTUAL-RUNTIME_obmc-chassis-state-manager = "phosphor-state-manager-chassis" diff --git a/meta-facebook/recipes-fb/packagegroups/packagegroup-fb-apps.bb b/meta-facebook/recipes-fb/packagegroups/packagegroup-fb-apps.bb index a9cc7fcedc..566c581aaa 100644 --- a/meta-facebook/recipes-fb/packagegroups/packagegroup-fb-apps.bb +++ b/meta-facebook/recipes-fb/packagegroups/packagegroup-fb-apps.bb @@ -26,7 +26,7 @@ RPROVIDES:${PN}-flash += "virtual-obmc-flash-mgmt" RPROVIDES:${PN}-system += "virtual-obmc-system-mgmt" SUMMARY:${PN}-chassis = "Facebook Chassis" -RDEPENDS:${PN}-chassis = " \ +RDEPENDS:remove:greatlakes:${PN}-chassis = " \ x86-power-control \ " @@ -54,6 +54,7 @@ RDEPENDS_PN_SYSTEM_EXTRAS:fb-withhost = " \ phosphor-post-code-manager \ phosphor-host-postd \ tzdata-core \ + phosphor-state-manager \ " SUMMARY:${PN}-system = "Facebook System" diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweroff b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweroff new file mode 100644 index 0000000000..2bdf49192a --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweroff @@ -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 + +POWER_OK_SLOT=$(( $1+9 )) +slot=$(( $1-1 )) +OFFSET=$(( 0x9 + slot )) + +# Server 12v power off +chassis-power-off() +{ + result=$(i2cset -y $BUS_NUM $CPLD_PWR_CTRL_ADDR $OFFSET $POW_OFF_SLOT) + echo "$result" + sleep 1 + chassis_status=$(gpioget 0 $POWER_OK_SLOT) + if [ "$chassis_status" == 0 ] + then + echo "Chassis is power off" + else + echo "Chassis is already off" + exit 1; + fi +} +chassis-power-gpio-status() +{ + if [ "$slot" -le 4 ] + then + status=$(gpioget 0 $POWER_OK_SLOT) + if [ "$status" == 1 ] + then + chassis-power-off + exit 0; + else + echo "Chassis is already off" + exit 1; + fi + fi + echo "Invalid slot id" + exit 1; +} +chassis-power-gpio-status diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweroff@.service b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweroff@.service new file mode 100644 index 0000000000..b996b34943 --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweroff@.service @@ -0,0 +1,9 @@ +[Unit] +Description=power off chassis:%i + +[Service] +Type=oneshot +ExecStart=/usr/libexec/chassis-poweroff %i + +[Install] +WantedBy=obmc-chassis-hard-poweroff@%i.target diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweron b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweron new file mode 100644 index 0000000000..0e8b702fb2 --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweron @@ -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 + +POWER_OK_SLOT=$(( $1+9 )) +slot=$(( $1-1 )) +OFFSET=$(( 0x9 + slot )) + +# Server 12v power on +chassis-power-on() +{ + result=$(i2cset -y $BUS_NUM $CPLD_PWR_CTRL_ADDR $OFFSET $POW_ON_SLOT) + echo "$result" + sleep 1 + chassis_status=$(gpioget 0 $POWER_OK_SLOT) + if [ "$chassis_status" == 1 ] + then + echo "Chassis is power on" + else + echo "Chassis is already on" + exit 1; + fi +} +chassis-power-gpio-status() +{ + if [ "$slot" -le 4 ] + then + status=$(gpioget 0 $POWER_OK_SLOT) + if [ "$status" == 0 ] + then + chassis-power-on + exit 0; + else + echo "Chassis is already on" + exit 1; + fi + fi + echo "Invalid slot id" + exit 1; +} +chassis-power-gpio-status diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweron@.service b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweron@.service new file mode 100644 index 0000000000..d19d59f10f --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/chassis-poweron@.service @@ -0,0 +1,9 @@ +[Unit] +Description=power on chassis:%i + +[Service] +Type=oneshot +ExecStart=/usr/libexec/chassis-poweron %i + +[Install] +WantedBy=obmc-chassis-poweron@%i.target diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-powercycle b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-powercycle new file mode 100644 index 0000000000..ab39bcb87b --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-powercycle @@ -0,0 +1,43 @@ +#!/bin/bash + +# Provide source directive to shellcheck. +# shellcheck source=meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweron +source /usr/libexec/power-cmd + +SLOT_ID=$(( $1-1 << 2 )) + +# Host Reboot +host-reboot() +{ + power_delay=$1 + for pwr_cmd in "${power_seq[@]}" + do + result="$(busctl call $SERVICE $OBJECT_PATH $INTERFACE sendRequest yyyyay $SLOT_ID $NETFN $LUN $CMD $DATA_LEN 0x01 0x42 0x01 0x00 "$pwr_cmd")" + echo "$result" + if [ "$pwr_cmd" == $POWER_BTN_LOW ] + then + sleep "$power_delay" + fi + done +} + +# 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 6 + sleep 15 + host-reboot 2 + 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-powercycle@.service b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-powercycle@.service new file mode 100644 index 0000000000..57bd2a062b --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-powercycle@.service @@ -0,0 +1,9 @@ +[Unit] +Description=Host Power Cycle: %i + +[Service] +Type=oneshot +ExecStart=/usr/libexec/host-powercycle %i + +[Install] +WantedBy=obmc-host-reboot@%i.target diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweroff b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweroff new file mode 100644 index 0000000000..096e08fdde --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweroff @@ -0,0 +1,40 @@ +#!/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 Power Off +host-power-off() +{ + for pwr_cmd in "${power_seq[@]}" + do + result="$(busctl call $SERVICE $OBJECT_PATH $INTERFACE sendRequest yyyyay $SLOT_ID $NETFN $LUN $CMD $DATA_LEN 0x01 0x42 0x01 0x00 "$pwr_cmd")" + echo "$result" + if [ "$pwr_cmd" == $POWER_BTN_LOW ] + then + sleep 6 + fi + done + echo "Host power off" + exit 0; +} + +# Check Host Response and Status +host-power-status() +{ + 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-power-off + fi + echo "Power is already off" + exit 1; +} +host-power-status diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweroff@.service b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweroff@.service new file mode 100644 index 0000000000..69723d3364 --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweroff@.service @@ -0,0 +1,9 @@ +[Unit] +Description=power off host:%i + +[Service] +Type=oneshot +ExecStart=/usr/libexec/host-poweroff %i + +[Install] +WantedBy=obmc-host-shutdown@%i.target diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweron b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweron new file mode 100644 index 0000000000..234423e46e --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweron @@ -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 + +SLOT_ID=$(( $1-1 << 2 )) +# Host Power On +host-power-on() +{ + for pwr_cmd in "${power_seq[@]}" + do + result="$(busctl call $SERVICE $OBJECT_PATH $INTERFACE sendRequest yyyyay $SLOT_ID $NETFN $LUN $CMD $DATA_LEN 0x01 0x42 0x01 0x00 "$pwr_cmd")" + echo "$result" + if [ "$pwr_cmd" == $POWER_BTN_LOW ] + then + sleep 2 + fi + done + echo "Host power on" + exit 0; +} + +# Check Host Response and Status +host-power-status() +{ + response="$(busctl call $SERVICE $OBJECT_PATH $INTERFACE sendRequest yyyyay $SLOT_ID 0x38 $LUN 0x03 0x03 0x15 0xa0 0x00)" + + result=$(echo "$response" | cut -d" " -f $PWRGD_SYS_PWROK_INDEX) + res="$(( "$result" & 0x80 ))" + pgood="$(( "$res" >> 7 ))" + if [ "$pgood" == $STATE_OFF ] + then + host-power-on + fi + echo "Power is already on" + exit 1; +} +host-power-status diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweron@.service b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweron@.service new file mode 100644 index 0000000000..a90793a8eb --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/host-poweron@.service @@ -0,0 +1,9 @@ +[Unit] +Description=power on host:%i + +[Service] +Type=oneshot +ExecStart=/usr/libexec/host-poweron %i + +[Install] +WantedBy=obmc-host-start@%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 new file mode 100644 index 0000000000..e9c7ed7ce1 --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager/greatlakes/power-cmd @@ -0,0 +1,19 @@ +#!/bin/bash + +export POWER_BTN_HIGH=0xFF +export POWER_BTN_LOW=0xFE +export power_seq=( "$POWER_BTN_HIGH" "$POWER_BTN_LOW" "$POWER_BTN_HIGH" ) +export SERVICE="xyz.openbmc_project.Ipmi.Channel.Ipmb" +export OBJECT_PATH="/xyz/openbmc_project/Ipmi/Channel/Ipmb" +export INTERFACE="org.openbmc.Ipmb" +export DATA_LEN=0x05 +export NETFN=0x06 +export LUN=0x00 +export CMD=0x52 +export STATE_OFF=0 +export STATE_ON=1 +export BUS_NUM=12 +export POW_ON_SLOT=0x01 +export POW_OFF_SLOT=0x00 +export CPLD_PWR_CTRL_ADDR=0xf +export PWRGD_SYS_PWROK_INDEX=12 diff --git a/meta-facebook/recipes-phosphor/state/phosphor-state-manager_%.bbappend b/meta-facebook/recipes-phosphor/state/phosphor-state-manager_%.bbappend new file mode 100644 index 0000000000..77f4be7dbe --- /dev/null +++ b/meta-facebook/recipes-phosphor/state/phosphor-state-manager_%.bbappend @@ -0,0 +1,40 @@ +FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" + +DEFAULT_TARGETS = " \ + multi-user.target.requires/obmc-host-reset@{}.target \ + obmc-chassis-poweron@{}.target.wants/chassis-poweron@{}.service \ + obmc-chassis-hard-poweroff@{}.target.wants/chassis-poweroff@{}.service \ + obmc-host-shutdown@{}.target.wants/host-poweroff@{}.service \ + obmc-host-start@{}.target.wants/host-poweron@{}.service \ + obmc-host-reboot@{}.target.wants/host-powercycle@{}.service \ +" + +SRC_URI:append:greatlakes = " \ + file://chassis-poweroff@.service \ + file://chassis-poweron@.service \ + file://host-poweroff@.service \ + file://host-poweron@.service \ + file://host-powercycle@.service \ + file://chassis-poweroff \ + file://chassis-poweron \ + file://host-poweroff \ + file://host-poweron \ + file://host-powercycle \ + file://power-cmd \ + " + +RDEPENDS:${PN}:append:greatlakes = " bash" + +do_install:append:greatlakes() { + install -d ${D}${systemd_system_unitdir} + install -m 0644 ${WORKDIR}/*.service ${D}${systemd_system_unitdir}/ + + install -d ${D}${libexecdir} + install -m 0777 ${WORKDIR}/chassis-poweroff ${D}${libexecdir}/ + install -m 0777 ${WORKDIR}/chassis-poweron ${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}/power-cmd ${D}${libexecdir}/ +} +FILES:${PN} += " /lib/systemd/system/*.service" -- cgit v1.2.3