meta-facebook: santabarbara: enable gpio monitor service

Enable gpio monitor service
- monitor CPU power good and sync power state
- initialize power-related signal

Change-Id: I493a78d06535ec4275d271af5cf787d93c5c7344
Signed-off-by: Fred Chen <Fred.Chen@quantatw.com>
diff --git a/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/assert-power-good-drop b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/assert-power-good-drop
new file mode 100644
index 0000000..b208dee
--- /dev/null
+++ b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/assert-power-good-drop
@@ -0,0 +1,46 @@
+#!/bin/bash
+
+# shellcheck source=meta-facebook/meta-santabarbara/recipes-phosphor/state/phosphor-state-manager/power-cmd
+source /usr/libexec/phosphor-state-manager/power-cmd
+
+currentstate=$(busctl get-property \
+    xyz.openbmc_project.State.Host0 \
+    /xyz/openbmc_project/state/host0 \
+    xyz.openbmc_project.State.Host \
+    CurrentHostState | awk '{print $2}' | tr -d '"')
+
+if [ "$currentstate" == "xyz.openbmc_project.State.Host.HostState.TransitioningToOff" ]; then
+    exit 0
+fi
+
+active=$(systemctl is-active host-graceful-poweroff@0.service)
+if [ -z "$active" ] || [ "$active" != "inactive" ]; then
+    exit 0
+fi
+
+active=$(systemctl is-active host-force-poweroff@0.service)
+if [ -z "$active" ] || [ "$active" != "inactive" ]; then
+    exit 0
+fi
+
+active=$(systemctl is-active host-powerreset@0.service)
+if [ -z "$active" ] || [ "$active" != "inactive" ]; then
+    exit 0
+fi
+
+sleep 3
+# Sync power state to "off" for abnormal power lose.
+transition=$(busctl get-property \
+    xyz.openbmc_project.State.Host0 \
+    /xyz/openbmc_project/state/host0 \
+    xyz.openbmc_project.State.Host \
+    RequestedHostTransition | awk '{print $2}' | tr -d '"')
+
+if [ "$transition" != "xyz.openbmc_project.State.Host.Transition.Off" ] && [ "$(power_status)" == "off" ]; then
+    busctl set-property xyz.openbmc_project.State.Host0 \
+        /xyz/openbmc_project/state/host0 \
+        xyz.openbmc_project.State.Host \
+        RequestedHostTransition s \
+        xyz.openbmc_project.State.Host.Transition.Off
+fi
+exit 0
diff --git a/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/assert-power-good-drop.service b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/assert-power-good-drop.service
new file mode 100644
index 0000000..5e4b055
--- /dev/null
+++ b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/assert-power-good-drop.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=Assert Power Good Drop
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/phosphor-gpio-monitor/assert-power-good-drop
+
+SyslogIdentifier=assert-power-good-drop
diff --git a/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/deassert-power-good-drop b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/deassert-power-good-drop
new file mode 100644
index 0000000..ed51e8e
--- /dev/null
+++ b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/deassert-power-good-drop
@@ -0,0 +1,47 @@
+#!/bin/bash
+
+# shellcheck source=meta-facebook/recipes-fb/obmc_functions/files/fb-common-functions
+source /usr/libexec/fb-common-functions
+# shellcheck source=meta-facebook/meta-santabarbara/recipes-phosphor/state/phosphor-state-manager/power-cmd
+source /usr/libexec/phosphor-state-manager/power-cmd
+
+
+currentstate=$(busctl get-property \
+    xyz.openbmc_project.State.Host0 \
+    /xyz/openbmc_project/state/host0 \
+    xyz.openbmc_project.State.Host \
+    CurrentHostState | awk '{print $2}' | tr -d '"')
+
+if [ "$currentstate" == "xyz.openbmc_project.State.Host.HostState.TransitioningToRunning" ]; then
+    exit 0
+fi
+
+
+active=$(systemctl is-active host-poweron@0.service)
+if [ -z "$active" ] || [ "$active" != "inactive" ]; then
+    exit 0
+fi
+
+active=$(systemctl is-active host-powerreset@0.service)
+if [ -z "$active" ] || [ "$active" != "inactive" ]; then
+    exit 0
+fi
+
+# Sync power status to "On" for abnormal power-on scenarios.
+
+transition=$(busctl get-property \
+    xyz.openbmc_project.State.Host0 \
+    /xyz/openbmc_project/state/host0 \
+    xyz.openbmc_project.State.Host \
+    RequestedHostTransition | awk '{print $2}' | tr -d '"')
+
+if [ "$transition" != "xyz.openbmc_project.State.Host.Transition.On" ] && [ "$(power_status)" == "on" ]; then
+    busctl set-property xyz.openbmc_project.State.Host0 \
+        /xyz/openbmc_project/state/host0 \
+        xyz.openbmc_project.State.Host \
+        RequestedHostTransition s \
+        xyz.openbmc_project.State.Host.Transition.On
+fi
+
+
+exit 0
diff --git a/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/deassert-power-good-drop.service b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/deassert-power-good-drop.service
new file mode 100644
index 0000000..813c45e
--- /dev/null
+++ b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/deassert-power-good-drop.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=Deassert Power Good Drop
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/phosphor-gpio-monitor/deassert-power-good-drop
+
+SyslogIdentifier=deassert-power-good-drop
diff --git a/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/multi-gpios-sys-init b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/multi-gpios-sys-init
new file mode 100644
index 0000000..057034b
--- /dev/null
+++ b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/multi-gpios-sys-init
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+# shellcheck source=meta-facebook/recipes-fb/obmc_functions/files/fb-common-functions
+source /usr/libexec/fb-common-functions
+# shellcheck source=meta-facebook/meta-santabarbara/recipes-phosphor/state/phosphor-state-manager/power-cmd
+source /usr/libexec/phosphor-state-manager/power-cmd
+
+# SGPIO Out Bit-83
+set_gpio CPU0_SYS_RESET_N 1
+
+# SGPIO Out Bit-85
+set_gpio RST_CPU0_KBRST_N 1
+
+# SGPIO Out Bit-101
+set_gpio SCM_USB_SEL 0
+
+# SGPIO Out Bit-81
+set_gpio BMC_SGPIO_READY 1
+
+exit 0
diff --git a/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/multi-gpios-sys-init.service b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/multi-gpios-sys-init.service
new file mode 100644
index 0000000..37da7d7
--- /dev/null
+++ b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/multi-gpios-sys-init.service
@@ -0,0 +1,12 @@
+[Unit]
+Wants=mapper-wait@-xyz-openbmc_project-state-host0.service
+After=mapper-wait@-xyz-openbmc_project-state-host0.service
+
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/phosphor-gpio-monitor/multi-gpios-sys-init
+SyslogIdentifier=Power Good Status Init
+
+[Install]
+WantedBy=multi-user.target
diff --git a/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/phosphor-multi-gpio-monitor.conf b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/phosphor-multi-gpio-monitor.conf
new file mode 100644
index 0000000..f70d5f5
--- /dev/null
+++ b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/phosphor-multi-gpio-monitor.conf
@@ -0,0 +1,3 @@
+[Unit]
+Wants=multi-gpios-sys-init.service
+After=multi-gpios-sys-init.service
diff --git a/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/plat-phosphor-multi-gpio-monitor.json b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/plat-phosphor-multi-gpio-monitor.json
new file mode 100644
index 0000000..a1763b1
--- /dev/null
+++ b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor/plat-phosphor-multi-gpio-monitor.json
@@ -0,0 +1,16 @@
+[
+    {
+        "Name": "FM_PWRGD_CPU0_PWROK",
+        "LineName": "FM_PWRGD_CPU0_PWROK",
+        "EventMon": "BOTH",
+        "Targets": {
+            "RISING": [
+                "deassert-power-good-drop.service"
+            ],
+            "FALLING": [
+                "assert-power-good-drop.service"
+            ]
+        },
+        "Continue": true
+    }
+]
diff --git a/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor_%.bbappend b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor_%.bbappend
new file mode 100644
index 0000000..a8e353a
--- /dev/null
+++ b/meta-facebook/meta-santabarbara/recipes-phosphor/gpio/phosphor-gpio-monitor_%.bbappend
@@ -0,0 +1,42 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
+
+inherit obmc-phosphor-systemd systemd
+
+SERVICE_LIST = "assert-power-good-drop.service \
+                deassert-power-good-drop.service \
+                multi-gpios-sys-init.service \
+                "
+
+SERVICE_FILE_FMT = "file://{0}"
+
+SRC_URI += " \
+    file://assert-power-good-drop \
+    file://deassert-power-good-drop \
+    file://multi-gpios-sys-init \
+    file://plat-phosphor-multi-gpio-monitor.json \
+    ${@compose_list(d, 'SERVICE_FILE_FMT', 'SERVICE_LIST')} \
+    "
+
+RDEPENDS:${PN}:append = " bash"
+
+FILES:${PN} += "${systemd_system_unitdir}/*"
+
+SYSTEMD_SERVICE:${PN} += "${SERVICE_LIST}"
+
+do_install:append() {
+    install -d ${D}${datadir}/phosphor-gpio-monitor
+    install -m 0644 ${UNPACKDIR}/plat-phosphor-multi-gpio-monitor.json \
+                    ${D}${datadir}/phosphor-gpio-monitor/phosphor-multi-gpio-monitor.json
+
+    for s in ${SERVICE_LIST}
+    do
+        install -m 0644 ${UNPACKDIR}/${s} ${D}${systemd_system_unitdir}/${s}
+    done
+
+    install -d ${D}${libexecdir}/${PN}
+    install -m 0755 ${UNPACKDIR}/assert-power-good-drop ${D}${libexecdir}/${PN}/
+    install -m 0755 ${UNPACKDIR}/deassert-power-good-drop ${D}${libexecdir}/${PN}/
+    install -m 0755 ${UNPACKDIR}/multi-gpios-sys-init ${D}${libexecdir}/${PN}/
+}
+
+SYSTEMD_OVERRIDE:${PN}-monitor += "phosphor-multi-gpio-monitor.conf:phosphor-multi-gpio-monitor.service.d/phosphor-multi-gpio-monitor.conf"