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 <Delphine_CC_Chiu@wiwynn.com>
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 0000000..6ae8c12
--- /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 0000000..9c26915
--- /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 0000000..f08c131
--- /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 0000000..f999d12
--- /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 e9c7ed7..334798c 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 0000000..57b6bb6
--- /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 53f7f8c..42c7117 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 @@
     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"