meta-facebook: harma: power control support

To support power on, power off, power-cycle reset and sled-cycle.

Change-Id: Ib26fbe7087d7ab2b68c61d46a7dcf3ab5f7847b0
Signed-off-by: Peter Yin <peter.yin@quantatw.com>
diff --git a/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/chassis-powercycle b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/chassis-powercycle
new file mode 100644
index 0000000..295982d
--- /dev/null
+++ b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/chassis-powercycle
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# shellcheck source=meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/power-cmd
+source /usr/libexec/phosphor-state-manager/power-cmd
+
+#Sled cycle
+echo "Starting Chassis Power Cycle"
+# LTC4287 MFR_REBOOT_CONTROL (FDh) Read/Write
+# [3]:
+#       REBOOT 0 Write a 1 to reboot.
+# [2:0]
+#       RBT_DL 100 Configures Auto-Reboot turn-on Delay (tDL(RBT)) after the REBOOT bit is set to 1
+#       RBT_DL[2:0] DELAY
+#       000 0.580 s
+#       001 1.16 s
+#       010 2.32 s
+#       011 4.64 s
+#       100 9.28 s
+#       101 18.6 s
+#       110 37.1 s
+#       111 74.2 s
+ltc4287-chassis-power-cycle() {
+    i2cset -f -y 4 0x44 0xfd 0x04
+    i2cset -f -y 4 0x44 0xfd 0x0e
+}
+
+echo "Starting Chassis Power Cycle"
+ltc4287-chassis-power-cycle
diff --git a/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/chassis-powercycle@.service b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/chassis-powercycle@.service
new file mode 100644
index 0000000..a8a110e
--- /dev/null
+++ b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/chassis-powercycle@.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Chassis Power Cycle: %i
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/phosphor-state-manager/chassis-powercycle %i
+
+[Install]
+WantedBy=obmc-chassis-powercycle@%i.target
diff --git a/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/discover-sys-init.conf b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/discover-sys-init.conf
new file mode 100644
index 0000000..5bd96e0
--- /dev/null
+++ b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/discover-sys-init.conf
@@ -0,0 +1,3 @@
+[Unit]
+Wants=muti-gpios-sys-init.service
+After=muti-gpios-sys-init.service
diff --git a/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-powercycle b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-powercycle
new file mode 100644
index 0000000..6d41aba
--- /dev/null
+++ b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-powercycle
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+# shellcheck source=meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/power-cmd
+source /usr/libexec/phosphor-state-manager/power-cmd
+
+power_off
+sleep 10
+power_on
diff --git a/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-powercycle@.service b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-powercycle@.service
new file mode 100644
index 0000000..f45e71f
--- /dev/null
+++ b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-powercycle@.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Host Power Cycle: %i
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/phosphor-state-manager/host-powercycle %i
+
+[Install]
+WantedBy=obmc-host-reboot@%i.target
diff --git a/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-poweroff b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-poweroff
new file mode 100644
index 0000000..506879e
--- /dev/null
+++ b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-poweroff
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+# shellcheck source=meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/power-cmd
+source /usr/libexec/phosphor-state-manager/power-cmd
+power_off
diff --git a/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-poweroff@.service b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-poweroff@.service
new file mode 100644
index 0000000..3ead57e
--- /dev/null
+++ b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-poweroff@.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=power off host:%i
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/phosphor-state-manager/host-poweroff %i
+
+[Install]
+WantedBy=obmc-host-shutdown@%i.target
diff --git a/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-poweron b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-poweron
new file mode 100644
index 0000000..25f6d31
--- /dev/null
+++ b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-poweron
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+# shellcheck source=meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/power-cmd
+source /usr/libexec/phosphor-state-manager/power-cmd
+
+power_on
+st=$?
+
+if [ "$st" -ne 0 ]; then
+   exit 1
+fi
+exit 0
diff --git a/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-poweron@.service b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-poweron@.service
new file mode 100644
index 0000000..38f0879
--- /dev/null
+++ b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-poweron@.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=power on host:%i
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/phosphor-state-manager/host-poweron %i
+
+[Install]
+RequiredBy=obmc-host-startmin@%i.target
diff --git a/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-powerreset b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-powerreset
new file mode 100644
index 0000000..bd3a3fd
--- /dev/null
+++ b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-powerreset
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+# shellcheck source=meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/power-cmd
+source /usr/libexec/phosphor-state-manager/power-cmd
+power_reset
diff --git a/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-powerreset@.service b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-powerreset@.service
new file mode 100644
index 0000000..0fd059c
--- /dev/null
+++ b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/host-powerreset@.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Host Power Reset: %i
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/phosphor-state-manager/host-powerreset %i
+
+[Install]
+WantedBy=obmc-host-force-warm-reboot@%i.target
diff --git a/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/phosphor-state-manager-init b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/phosphor-state-manager-init
new file mode 100644
index 0000000..3796273
--- /dev/null
+++ b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/phosphor-state-manager-init
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+# Create /dev/mem
+if [ ! -c /dev/mem ]; then
+    /bin/mknod /dev/mem c 1 1
+fi
+
+devmem 0x1e6ee000 32 0xff00ba55
+devmem 0x1e6e2454 32 0xaa000000
+devmem 0x1e6e2094 32 0x00000003
diff --git a/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/phosphor-state-manager-init.conf b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/phosphor-state-manager-init.conf
new file mode 100644
index 0000000..28a5866
--- /dev/null
+++ b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/phosphor-state-manager-init.conf
@@ -0,0 +1,3 @@
+[Service]
+ExecStartPre=/usr/libexec/phosphor-state-manager/phosphor-state-manager-init
+
diff --git a/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/power-cmd b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/power-cmd
new file mode 100644
index 0000000..c1b9a37
--- /dev/null
+++ b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager/power-cmd
@@ -0,0 +1,57 @@
+#!/bin/bash
+
+# shellcheck source=meta-facebook/recipes-fb/obmc_functions/files/fb-common-functions
+source /usr/libexec/fb-common-functions
+
+# Power Good Status
+power_status() {
+    if [ "$(get_gpio "power-cpu-good")" -eq 1 ]; then
+        echo "on"
+    else
+        echo "off"
+    fi
+}
+
+# DC off
+power_off() {
+    if [ "$(power_status)" == "on" ]; then
+        echo "Set Host Power Off"
+        set_gpio power-host-control 0
+        sleep 6
+        set_gpio power-host-control 1
+        sleep 1
+    fi
+}
+
+# DC on
+power_on() {
+    if [ "$(power_status)" == "off" ]; then
+        set_gpio power-host-control 0
+        sleep 1
+        set_gpio power-host-control 1
+        sleep 1
+    fi
+
+    for i in $(seq 1 10)
+    do
+        if [ "$(power_status)" == "on" ]; then
+
+           echo "Set Host Power On"
+           return 0
+        fi
+
+        if [ "$i" -eq 10 ]; then
+           echo "Set Host Power On Fail"
+           return 1
+        fi
+    done
+}
+
+# Host reset
+power_reset() {
+    echo "Set Host Reset"
+    set_gpio reset-control 0
+    sleep 1
+    set_gpio reset-control 1
+    sleep 1
+}
diff --git a/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager_%.bbappend b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager_%.bbappend
new file mode 100644
index 0000000..23a94d9
--- /dev/null
+++ b/meta-facebook/meta-harma/recipes-phosphor/state/phosphor-state-manager_%.bbappend
@@ -0,0 +1,57 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
+
+PACKAGECONFIG:remove = "no-warm-reboot"
+
+CHASSIS_DEFAULT_TARGETS:remove:harma = " \
+    obmc-chassis-powerreset@{}.target.requires/phosphor-reset-chassis-on@{}.service \
+    obmc-chassis-powerreset@{}.target.requires/phosphor-reset-chassis-running@{}.service \
+    obmc-chassis-poweroff@{}.target.requires/obmc-power-stop@{}.service \
+    obmc-chassis-poweron@{}.target.requires/obmc-power-start@{}.service \
+    "
+
+CHASSIS_DEFAULT_TARGETS:append:harma = " \
+    obmc-chassis-hard-poweroff@{}.target.wants/host-poweroff@0.service \
+    "
+
+HOST_DEFAULT_TARGETS:remove:harma = " \
+    obmc-host-start@{}.target.wants/host-poweron@{}.service \
+"
+
+HOST_DEFAULT_TARGETS:append:harma = " \
+    obmc-host-startmin@{}.target.requires/host-poweron@{}.service \
+"
+
+SRC_URI:append:harma = " \
+    file://chassis-powercycle@.service \
+    file://host-poweroff@.service \
+    file://host-poweron@.service \
+    file://host-powercycle@.service \
+    file://host-powerreset@.service \
+    file://chassis-powercycle \
+    file://host-poweroff \
+    file://host-poweron \
+    file://host-powercycle \
+    file://host-powerreset \
+    file://power-cmd \
+    file://discover-sys-init.conf \
+    file://phosphor-state-manager-init \
+    file://phosphor-state-manager-init.conf \
+    "
+
+RDEPENDS:${PN}:append:harma = " bash"
+
+do_install:append:harma() {
+    install -d ${D}${systemd_system_unitdir}
+    install -m 0644 ${WORKDIR}/*.service ${D}${systemd_system_unitdir}/
+
+    install -d ${D}${libexecdir}/${PN}
+    install -m 0777 ${WORKDIR}/chassis-powercycle ${D}${libexecdir}/${PN}/
+    install -m 0777 ${WORKDIR}/host-poweroff ${D}${libexecdir}/${PN}/
+    install -m 0777 ${WORKDIR}/host-poweron ${D}${libexecdir}/${PN}/
+    install -m 0777 ${WORKDIR}/host-powercycle ${D}${libexecdir}/${PN}/
+    install -m 0777 ${WORKDIR}/host-powerreset ${D}${libexecdir}/${PN}/
+    install -m 0777 ${WORKDIR}/power-cmd ${D}${libexecdir}/${PN}/
+    install -m 0777 ${WORKDIR}/phosphor-state-manager-init ${D}${libexecdir}/${PN}/
+}
+SYSTEMD_OVERRIDE:${PN}-discover:harma += "discover-sys-init.conf:phosphor-discover-system-state@0.service.d/discover-sys-init.conf"
+SYSTEMD_OVERRIDE:${PN}-systemd-target-monitor:harma += "phosphor-state-manager-init.conf:phosphor-systemd-target-monitor.service.d/phosphor-state-manager-init.conf"