meta-quanta: gbs: use service files instead of setting D-bus properties

Use service files instead of setting D-bus properties for power
control and remove unused patches

Signed-off-by: George Hung <george.hung@quantatw.com>
Change-Id: I6f80979906e87b77b36a6e333456d4e5c42249ce
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/0001-Customize-phosphor-watchdog-for-Intel-platforms.patch b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/0001-Customize-phosphor-watchdog-for-Intel-platforms.patch
deleted file mode 100644
index 22670d3..0000000
--- a/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/0001-Customize-phosphor-watchdog-for-Intel-platforms.patch
+++ /dev/null
@@ -1,313 +0,0 @@
-From ac0c216ac2c273c620579fd1308c8c225e0cca36 Mon Sep 17 00:00:00 2001
-From: James Feist <james.feist@linux.intel.com>
-Date: Mon, 17 Jun 2019 12:00:58 -0700
-Subject: [PATCH] Customize phosphor-watchdog for Intel platforms
-
-This patch adds various changes to phosphor-watchdog that are
-required for compatibility with Intel platforms.
-
-   1. Add Redfish messages for watchdog timeout and pre-interrupt
-   2. Use dbus properties for power control insted of service files
-   3. Use host status to enable/disable watchdog
-   4. Set preTimeoutInterruptOccurFlag
-
-Signed-off-by: James Feist <james.feist@linux.intel.com>
-Signed-off-by: Ren Yu <yux.ren@intel.com>
-Signed-off-by: Yong Li <yong.b.li@linux.intel.com>
-Signed-off-by: Jason M. Bills <jason.m.bills@linux.intel.com>
----
- watchdog.cpp | 193 ++++++++++++++++++++++++++++++++++++++++++++++++---
- watchdog.hpp |  23 +++++-
- 2 files changed, 206 insertions(+), 10 deletions(-)
-
-diff --git a/watchdog.cpp b/watchdog.cpp
-index 57e9050..3b5356f 100644
---- a/watchdog.cpp
-+++ b/watchdog.cpp
-@@ -1,11 +1,14 @@
- #include "watchdog.hpp"
- 
-+#include <systemd/sd-journal.h>
-+
- #include <algorithm>
- #include <chrono>
- #include <phosphor-logging/elog.hpp>
- #include <phosphor-logging/log.hpp>
- #include <sdbusplus/exception.hpp>
- #include <xyz/openbmc_project/Common/error.hpp>
-+#include <xyz/openbmc_project/State/Host/server.hpp>
- 
- namespace phosphor
- {
-@@ -18,10 +21,69 @@ using namespace phosphor::logging;
- using sdbusplus::exception::SdBusError;
- using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
- 
--// systemd service to kick start a target.
--constexpr auto SYSTEMD_SERVICE = "org.freedesktop.systemd1";
--constexpr auto SYSTEMD_ROOT = "/org/freedesktop/systemd1";
--constexpr auto SYSTEMD_INTERFACE = "org.freedesktop.systemd1.Manager";
-+const static constexpr char* currentHostState = "CurrentHostState";
-+const static constexpr char* hostStatusOff =
-+    "xyz.openbmc_project.State.Host.HostState.Off";
-+
-+const static constexpr char* actionDescription = " due to Watchdog timeout";
-+const static constexpr char* hardResetDescription = "Hard Reset - System reset";
-+const static constexpr char* powerOffDescription =
-+    "Power Down - System power down";
-+const static constexpr char* powerCycleDescription =
-+    "Power Cycle - System power cycle";
-+const static constexpr char* timerExpiredDescription = "Timer expired";
-+
-+const static constexpr char* preInterruptActionNone =
-+    "xyz.openbmc_project.State.Watchdog.PreTimeoutInterruptAction.None";
-+
-+const static constexpr char* preInterruptDescriptionSMI = "SMI";
-+const static constexpr char* preInterruptDescriptionNMI = "NMI";
-+const static constexpr char* preInterruptDescriptionMI = "Messaging Interrupt";
-+
-+const static constexpr char* reservedDescription = "Reserved";
-+
-+const static constexpr char* timerUseDescriptionBIOSFRB2 = "BIOS FRB2";
-+const static constexpr char* timerUseDescriptionBIOSPOST = "BIOS/POST";
-+const static constexpr char* timerUseDescriptionOSLoad = "OSLoad";
-+const static constexpr char* timerUseDescriptionSMSOS = "SMS/OS";
-+const static constexpr char* timerUseDescriptionOEM = "OEM";
-+
-+namespace restart
-+{
-+static constexpr const char* busName =
-+    "xyz.openbmc_project.Control.Host.RestartCause";
-+static constexpr const char* path =
-+    "/xyz/openbmc_project/control/host0/restart_cause";
-+static constexpr const char* interface =
-+    "xyz.openbmc_project.Control.Host.RestartCause";
-+static constexpr const char* property = "RequestedRestartCause";
-+} // namespace restart
-+
-+// chassis state manager service
-+namespace chassis
-+{
-+static constexpr const char* busName = "xyz.openbmc_project.State.Chassis";
-+static constexpr const char* path = "/xyz/openbmc_project/state/chassis0";
-+static constexpr const char* interface = "xyz.openbmc_project.State.Chassis";
-+static constexpr const char* request = "RequestedPowerTransition";
-+} // namespace chassis
-+
-+void Watchdog::powerStateChangedHandler(
-+    const std::map<std::string, std::variant<std::string>>& props)
-+{
-+    const auto iter = props.find(currentHostState);
-+    if (iter != props.end())
-+    {
-+        const std::string* powerState = std::get_if<std::string>(&iter->second);
-+        if (powerState && (*powerState == hostStatusOff))
-+        {
-+            if (timerEnabled())
-+            {
-+                enabled(false);
-+            }
-+        }
-+    }
-+}
- 
- void Watchdog::resetTimeRemaining(bool enableWatchdog)
- {
-@@ -107,13 +169,102 @@ uint64_t Watchdog::interval(uint64_t value)
- // Optional callback function on timer expiration
- void Watchdog::timeOutHandler()
- {
-+    PreTimeoutInterruptAction preTimeoutInterruptAction = preTimeoutInterrupt();
-+    std::string preInterruptActionMessageArgs{};
-+
-     Action action = expireAction();
-+    std::string actionMessageArgs{};
-+
-+    expiredTimerUse(currentTimerUse());
-+
-+    TimerUse timeUser = expiredTimerUse();
-+    std::string timeUserMessage{};
-+
-     if (!this->enabled())
-     {
-         action = fallback->action;
-     }
- 
--    expiredTimerUse(currentTimerUse());
-+    switch (timeUser)
-+    {
-+        case Watchdog::TimerUse::BIOSFRB2:
-+            timeUserMessage = timerUseDescriptionBIOSFRB2;
-+            break;
-+        case Watchdog::TimerUse::BIOSPOST:
-+            timeUserMessage = timerUseDescriptionBIOSPOST;
-+            break;
-+        case Watchdog::TimerUse::OSLoad:
-+            timeUserMessage = timerUseDescriptionOSLoad;
-+            break;
-+        case Watchdog::TimerUse::SMSOS:
-+            timeUserMessage = timerUseDescriptionSMSOS;
-+            break;
-+        case Watchdog::TimerUse::OEM:
-+            timeUserMessage = timerUseDescriptionOEM;
-+            break;
-+        default:
-+            timeUserMessage = reservedDescription;
-+            break;
-+    }
-+
-+    switch (action)
-+    {
-+        case Watchdog::Action::HardReset:
-+            actionMessageArgs = std::string(hardResetDescription) +
-+                                std::string(actionDescription);
-+            break;
-+        case Watchdog::Action::PowerOff:
-+            actionMessageArgs = std::string(powerOffDescription) +
-+                                std::string(actionDescription);
-+            break;
-+        case Watchdog::Action::PowerCycle:
-+            actionMessageArgs = std::string(powerCycleDescription) +
-+                                std::string(actionDescription);
-+            break;
-+        case Watchdog::Action::None:
-+            actionMessageArgs = timerExpiredDescription;
-+            break;
-+        default:
-+            actionMessageArgs = reservedDescription;
-+            break;
-+    }
-+
-+    // Log into redfish event log
-+    sd_journal_send("MESSAGE=IPMIWatchdog: Timed out ACTION=%s",
-+                    convertForMessage(action).c_str(), "PRIORITY=%i", LOG_INFO,
-+                    "REDFISH_MESSAGE_ID=%s", "OpenBMC.0.1.IPMIWatchdog",
-+                    "REDFISH_MESSAGE_ARGS=%s. timer use: %s",
-+                    actionMessageArgs.c_str(), timeUserMessage.c_str(), NULL);
-+
-+    switch (preTimeoutInterruptAction)
-+    {
-+        case Watchdog::PreTimeoutInterruptAction::SMI:
-+            preInterruptActionMessageArgs = preInterruptDescriptionSMI;
-+            break;
-+        case Watchdog::PreTimeoutInterruptAction::NMI:
-+            preInterruptActionMessageArgs = preInterruptDescriptionNMI;
-+            break;
-+        case Watchdog::PreTimeoutInterruptAction::MI:
-+            preInterruptActionMessageArgs = preInterruptDescriptionMI;
-+            break;
-+        default:
-+            preInterruptActionMessageArgs = reservedDescription;
-+            break;
-+    }
-+
-+    if (preInterruptActionNone != convertForMessage(preTimeoutInterruptAction))
-+    {
-+        preTimeoutInterruptOccurFlag(true);
-+
-+        sd_journal_send("MESSAGE=IPMIWatchdog: Pre Timed out Interrupt=%s",
-+                        convertForMessage(preTimeoutInterruptAction).c_str(),
-+                        "PRIORITY=%i", LOG_INFO, "REDFISH_MESSAGE_ID=%s",
-+                        "OpenBMC.0.1.IPMIWatchdog",
-+                        "REDFISH_MESSAGE_ARGS=Timer interrupt - %s due to "
-+                        "Watchdog timeout. timer use: %s",
-+                        preInterruptActionMessageArgs.c_str(),
-+                        timeUserMessage.c_str(), NULL);
-+    }
- 
-     auto target = actionTargetMap.find(action);
-     if (target == actionTargetMap.end())
-@@ -133,10 +284,11 @@ void Watchdog::timeOutHandler()
- 
-         try
-         {
--            auto method = bus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_ROOT,
--                                              SYSTEMD_INTERFACE, "StartUnit");
--            method.append(target->second);
--            method.append("replace");
-+            auto method =
-+                bus.new_method_call(chassis::busName, chassis::path,
-+                                    "org.freedesktop.DBus.Properties", "Set");
-+            method.append(chassis::interface, chassis::request,
-+                          std::variant<std::string>(target->second));
- 
-             bus.call_noreply(method);
-         }
-@@ -147,6 +299,29 @@ void Watchdog::timeOutHandler()
-                             entry("ERROR=%s", e.what()));
-             commit<InternalFailure>();
-         }
-+
-+        // set restart cause for watchdog HardReset & PowerCycle actions
-+        if ((action == Watchdog::Action::HardReset) ||
-+            (action == Watchdog::Action::PowerCycle))
-+        {
-+            try
-+            {
-+                auto method = bus.new_method_call(
-+                    restart::busName, restart::path,
-+                    "org.freedesktop.DBus.Properties", "Set");
-+                method.append(
-+                    restart::interface, restart::property,
-+                    std::variant<std::string>("xyz.openbmc_project.State.Host."
-+                                              "RestartCause.WatchdogTimer"));
-+                bus.call(method);
-+            }
-+            catch (sdbusplus::exception_t& e)
-+            {
-+                log<level::ERR>("Failed to set HostRestartCause property",
-+                                entry("ERROR=%s", e.what()));
-+                commit<InternalFailure>();
-+            }
-+        }
-     }
- 
-     tryFallbackOrDisable();
-diff --git a/watchdog.hpp b/watchdog.hpp
-index 7de9bb3..b004b7a 100644
---- a/watchdog.hpp
-+++ b/watchdog.hpp
-@@ -68,7 +68,18 @@ class Watchdog : public WatchdogInherits
-         WatchdogInherits(bus, objPath),
-         bus(bus), actionTargetMap(std::move(actionTargetMap)),
-         fallback(std::move(fallback)), minInterval(minInterval),
--        timer(event, std::bind(&Watchdog::timeOutHandler, this))
-+        timer(event, std::bind(&Watchdog::timeOutHandler, this)),
-+        powerStateChangedSignal(
-+            bus,
-+            sdbusplus::bus::match::rules::propertiesChanged(
-+                "/xyz/openbmc_project/state/host0",
-+                "xyz.openbmc_project.State.Host"),
-+            [this](sdbusplus::message::message& msg) {
-+                std::string objectName;
-+                std::map<std::string, std::variant<std::string>> props;
-+                msg.read(objectName, props);
-+                powerStateChangedHandler(props);
-+            })
-     {
-         // We set the watchdog interval with the default value.
-         interval(interval());
-@@ -77,6 +88,12 @@ class Watchdog : public WatchdogInherits
-         tryFallbackOrDisable();
-     }
- 
-+    /** @brief Disable watchdog when power status change meet
-+     *         the specific requirement
-+     */
-+    void powerStateChangedHandler(
-+        const std::map<std::string, std::variant<std::string>>& props);
-+
-     /** @brief Resets the TimeRemaining to the configured Interval
-      *         Optionally enables the watchdog.
-      *
-@@ -165,6 +182,10 @@ class Watchdog : public WatchdogInherits
-     /** @brief Contained timer object */
-     sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> timer;
- 
-+    /** @brief Optional Callback handler when power status change meet
-+     * the specific requirement */
-+    sdbusplus::bus::match_t powerStateChangedSignal;
-+
-     /** @brief Optional Callback handler on timer expirartion */
-     void timeOutHandler();
- 
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/obmc/watchdog/host0 b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/obmc/watchdog/host0
new file mode 100644
index 0000000..c0f04ef
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/obmc/watchdog/host0
@@ -0,0 +1,5 @@
+DEVPATH=/xyz/openbmc_project/watchdog/host0
+SERVICE=xyz.openbmc_project.Watchdog
+UNIT_HARD_RESET=phosphor-host-watchdog-reset.service
+UNIT_POWER_OFF=phosphor-host-watchdog-poweroff.service
+UNIT_POWER_CYCLE=phosphor-host-watchdog-powercycle.service
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-host-watchdog-powercycle.service b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-host-watchdog-powercycle.service
new file mode 100644
index 0000000..9b8b0d6
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-host-watchdog-powercycle.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Power Cycle Host Server
+After=xyz.openbmc_project.Chassis.Control.Power.service
+
+[Service]
+Type=oneshot
+ExecStart=busctl set-property xyz.openbmc_project.State.Chassis /xyz/openbmc_project/state/chassis0 xyz.openbmc_project.State.Chassis RequestedPowerTransition s xyz.openbmc_project.State.Chassis.Transition.PowerCycle
+ExecStart=busctl set-property xyz.openbmc_project.Control.Host.RestartCause /xyz/openbmc_project/control/host0/restart_cause xyz.openbmc_project.Control.Host.RestartCause RequestedRestartCause s xyz.openbmc_project.State.Host.RestartCause.WatchdogTimer
+SyslogIdentifier=phosphor-watchdog
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-host-watchdog-poweroff.service b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-host-watchdog-poweroff.service
new file mode 100644
index 0000000..af7e6ef
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-host-watchdog-poweroff.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=Shutdown Host Server
+After=xyz.openbmc_project.Chassis.Control.Power.service
+
+[Service]
+Type=oneshot
+ExecStart=busctl set-property xyz.openbmc_project.State.Chassis /xyz/openbmc_project/state/chassis0 xyz.openbmc_project.State.Chassis RequestedPowerTransition s xyz.openbmc_project.State.Chassis.Transition.Off
+SyslogIdentifier=phosphor-watchdog
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-host-watchdog-reset.service b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-host-watchdog-reset.service
new file mode 100644
index 0000000..655618b
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-host-watchdog-reset.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Reset Host Server
+After=xyz.openbmc_project.Chassis.Control.Power.service
+
+[Service]
+Type=oneshot
+ExecStart=busctl set-property xyz.openbmc_project.State.Host /xyz/openbmc_project/state/host0 xyz.openbmc_project.State.Host RequestedHostTransition s xyz.openbmc_project.State.Host.Transition.ForceWarmReboot
+ExecStart=busctl set-property xyz.openbmc_project.Control.Host.RestartCause /xyz/openbmc_project/control/host0/restart_cause xyz.openbmc_project.Control.Host.RestartCause RequestedRestartCause s xyz.openbmc_project.State.Host.RestartCause.WatchdogTimer
+SyslogIdentifier=phosphor-watchdog
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-watchdog.service b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-watchdog.service
deleted file mode 100644
index 5ef1a41..0000000
--- a/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-watchdog.service
+++ /dev/null
@@ -1,16 +0,0 @@
-[Unit]
-Description=Phosphor Watchdog
-
-[Service]
-ExecStart=/usr/bin/env phosphor-watchdog --continue --service=xyz.openbmc_project.Watchdog \
-         --path=/xyz/openbmc_project/watchdog/host0 \
-         --action_target=xyz.openbmc_project.State.Watchdog.Action.HardReset=xyz.openbmc_project.State.Chassis.Transition.Reset \
-         --action_target=xyz.openbmc_project.State.Watchdog.Action.PowerOff=xyz.openbmc_project.State.Chassis.Transition.Off \
-         --action_target=xyz.openbmc_project.State.Watchdog.Action.PowerCycle=xyz.openbmc_project.State.Chassis.Transition.PowerCycle
-
-SyslogIdentifier=phosphor-watchdog
-BusName =xyz.openbmc_project.Watchdog
-Type=dbus
-
-[Install]
-WantedBy=basic.target
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-watchdog@.service b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-watchdog@.service
new file mode 100644
index 0000000..df11b22
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-watchdog@.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=Phosphor Watchdog
+
+[Service]
+EnvironmentFile={envfiledir}/obmc/watchdog/%I
+ExecStart=/usr/bin/env phosphor-watchdog --service=${{SERVICE}} --path=${{DEVPATH}} \
+  --continue \
+  --action_target=xyz.openbmc_project.State.Watchdog.Action.HardReset=${{UNIT_HARD_RESET}} \
+  --action_target=xyz.openbmc_project.State.Watchdog.Action.PowerOff=${{UNIT_POWER_OFF}} \
+  --action_target=xyz.openbmc_project.State.Watchdog.Action.PowerCycle=${{UNIT_POWER_CYCLE}}
+SyslogIdentifier=phosphor-watchdog
+BusName=xyz.openbmc_project.Watchdog
+Type=dbus
+
+[Install]
+WantedBy=basic.target
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog_%.bbappend
index 9c491ec..d8b1aa9 100644
--- a/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog_%.bbappend
+++ b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog_%.bbappend
@@ -1,7 +1,13 @@
 FILESEXTRAPATHS_prepend_gbs := "${THISDIR}/${PN}:"
 
-SRC_URI_append_gbs = " file://0001-Customize-phosphor-watchdog-for-Intel-platforms.patch"
-
-# Remove the override to keep service running after DC cycle
+SYSTEMD_ENVIRONMENT_FILE_${PN}_append_gbs = " obmc/watchdog/host0"
+OBMC_HOST_WATCHDOG_INSTANCES_A = "host0"
+WATCHDOG_FMT_A = "phosphor-watchdog@{0}.service"
 SYSTEMD_OVERRIDE_${PN}_remove_gbs = "poweron.conf:phosphor-watchdog@poweron.service.d/poweron.conf"
-SYSTEMD_SERVICE_${PN}_gbs = "phosphor-watchdog.service"
+SYSTEMD_LINK_${PN}_remove_gbs = "${@compose_list(d, 'ENABLE_WATCHDOG_FMT', 'OBMC_HOST_INSTANCES')}"
+SYSTEMD_LINK_${PN}_remove_gbs = "${@compose_list(d, 'WATCHDOG_FMT', 'OBMC_HOST_WATCHDOG_INSTANCES', 'OBMC_HOST_INSTANCES')}"
+SYSTEMD_SERVICE_${PN}_gbs = " ${@compose_list(d, 'WATCHDOG_FMT_A', 'OBMC_HOST_WATCHDOG_INSTANCES_A')} \
+                              phosphor-host-watchdog-reset.service \
+                              phosphor-host-watchdog-poweroff.service \
+                              phosphor-host-watchdog-powercycle.service \
+                            "