| From 2cea5d289b278db4468b16bf6b64102655811fd0 Mon Sep 17 00:00:00 2001 |
| From: Eddielu <Eddie.Lu@quantatw.com> |
| Date: Mon, 27 Jul 2020 20:30:22 +0800 |
| Subject: [PATCH] Update lev-add-poweron-monitor-feature patch. |
| |
| --- |
| Makefile.am | 2 ++ |
| mainloop.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| sensor.cpp | 11 ++++++- |
| sensor.hpp | 13 ++++++++ |
| thresholds.hpp | 2 -- |
| 5 files changed, 127 insertions(+), 3 deletions(-) |
| |
| diff --git a/Makefile.am b/Makefile.am |
| index 706a6cc..c620fa4 100644 |
| --- a/Makefile.am |
| +++ b/Makefile.am |
| @@ -46,6 +46,7 @@ libhwmon_la_LIBADD = \ |
| $(SDEVENTPLUS_LIBS) \ |
| $(PHOSPHOR_DBUS_INTERFACES_LIBS) \ |
| $(PHOSPHOR_LOGGING_LIBS) \ |
| + $(PTHREAD_LIBS) \ |
| $(GPIOPLUS_LIBS) \ |
| $(STDPLUS_LIBS) \ |
| $(CODE_COVERAGE_LIBS) \ |
| @@ -55,6 +56,7 @@ libhwmon_la_CXXFLAGS = \ |
| $(SDEVENTPLUS_CFLAGS) \ |
| $(PHOSPHOR_DBUS_INTERFACES_CFLAGS) \ |
| $(PHOSPHOR_LOGGING_CFLAGS) \ |
| + $(PTHREAD_CFLAGS) \ |
| $(STDPLUS_CFLAGS) \ |
| $(CODE_COVERAGE_CXXFLAGS) |
| |
| diff --git a/mainloop.cpp b/mainloop.cpp |
| index 3e7e0bf..4789a80 100644 |
| --- a/mainloop.cpp |
| +++ b/mainloop.cpp |
| @@ -41,6 +41,12 @@ |
| #include <string> |
| #include <unordered_set> |
| #include <xyz/openbmc_project/Sensor/Device/error.hpp> |
| +#include <boost/container/flat_map.hpp> |
| +#include <boost/algorithm/string/predicate.hpp> |
| +#include <sdbusplus/asio/connection.hpp> |
| +#include <sdbusplus/asio/object_server.hpp> |
| +#include <sdbusplus/message/types.hpp> |
| +#include <sdbusplus/timer.hpp> |
| |
| using namespace phosphor::logging; |
| |
| @@ -76,6 +82,12 @@ decltype( |
| Thresholds<CriticalObject>::alarmHi) Thresholds<CriticalObject>::alarmHi = |
| &CriticalObject::criticalAlarmHigh; |
| |
| +static std::unique_ptr<phosphor::Timer> cacheTimer = nullptr; |
| +static std::unique_ptr<sdbusplus::bus::match::match> powerMatch = nullptr; |
| +static bool powerStatusOn = false; |
| +static boost::asio::io_service io; |
| +static auto conn = std::make_shared<sdbusplus::asio::connection>(io); |
| + |
| void updateSensorInterfaces(InterfaceMap& ifaces, SensorValueType value) |
| { |
| for (auto& iface : ifaces) |
| @@ -103,6 +115,84 @@ void updateSensorInterfaces(InterfaceMap& ifaces, SensorValueType value) |
| } |
| } |
| |
| +void powerStatusSet() |
| +{ |
| + powerStatusOn = true; |
| + return; |
| +} |
| + |
| +void createTimer() |
| +{ |
| + if (cacheTimer == nullptr) |
| + { |
| + cacheTimer = std::make_unique<phosphor::Timer>(powerStatusSet); |
| + } |
| +} |
| + |
| +bool isPowerOn(void) |
| +{ |
| + if (!powerMatch) |
| + { |
| + throw std::runtime_error("Power Match Not Created"); |
| + } |
| + return powerStatusOn; |
| +} |
| + |
| +void setupPowerMatch(sdbusplus::bus::bus& bus) |
| +{ |
| + if (powerMatch) |
| + { |
| + return; |
| + } |
| + |
| + powerMatch = std::make_unique<sdbusplus::bus::match::match>( |
| + bus, |
| + "type='signal',interface='org.freedesktop.DBus.Properties',path='/xyz/" |
| + "openbmc_project/state/" |
| + "host0',arg0='xyz.openbmc_project.State.Host'", |
| + [](sdbusplus::message::message& message) { |
| + std::string objectName; |
| + boost::container::flat_map<std::string, std::variant<std::string>> |
| + values; |
| + message.read(objectName, values); |
| + auto findState = values.find("CurrentHostState"); |
| + if (findState != values.end()) |
| + { |
| + bool on = boost::ends_with( |
| + std::get<std::string>(findState->second), "Running"); |
| + if (!on) |
| + { |
| + cacheTimer->stop(); |
| + powerStatusOn = false; |
| + return; |
| + } |
| + cacheTimer->start(std::chrono::duration_cast<std::chrono::microseconds>( |
| + std::chrono::seconds(10))); |
| + } |
| + else { |
| + powerStatusOn = false; |
| + } |
| + }); |
| + |
| + conn->async_method_call( |
| + [](boost::system::error_code ec, |
| + const std::variant<std::string>& state) { |
| + if (ec) |
| + { |
| + return; |
| + } |
| + powerStatusOn = |
| + boost::ends_with(std::get<std::string>(state), "Running"); |
| + }, |
| + "xyz.openbmc_project.State.Host", |
| + "/xyz/openbmc_project/state/host0", |
| + "org.freedesktop.DBus.Properties", "Get", |
| + "xyz.openbmc_project.State.Host", "CurrentHostState"); |
| + |
| + createTimer(); |
| +} |
| + |
| + |
| std::string MainLoop::getID(SensorSet::container_t::const_reference sensor) |
| { |
| std::string id; |
| @@ -384,6 +474,7 @@ void MainLoop::init() |
| _interval = std::strtoull(interval.c_str(), NULL, 10); |
| } |
| } |
| + setupPowerMatch(_bus); |
| } |
| |
| void MainLoop::read() |
| @@ -428,6 +519,12 @@ void MainLoop::read() |
| |
| try |
| { |
| + if(sensor->pwrOnMonitor() && !isPowerOn()) |
| + { |
| + statusIface->functional(false); |
| + continue; |
| + } |
| + |
| if (sensor->hasFaultFile()) |
| { |
| auto fault = _ioAccess->read(sensorSysfsType, sensorSysfsNum, |
| @@ -490,6 +587,11 @@ void MainLoop::read() |
| } |
| } |
| |
| + if(sensor->pwrOnMonitor() && !isPowerOn()) |
| + { |
| + statusIface->functional(false); |
| + continue; |
| + } |
| updateSensorInterfaces(obj, value); |
| } |
| catch (const std::system_error& e) |
| diff --git a/sensor.cpp b/sensor.cpp |
| index 09aeca6..b1cb470 100644 |
| --- a/sensor.cpp |
| +++ b/sensor.cpp |
| @@ -31,7 +31,7 @@ Sensor::Sensor(const SensorSet::key_type& sensor, |
| const hwmonio::HwmonIOInterface* ioAccess, |
| const std::string& devPath) : |
| _sensor(sensor), |
| - _ioAccess(ioAccess), _devPath(devPath), _scale(0), _hasFaultFile(false) |
| + _ioAccess(ioAccess), _devPath(devPath), _scale(0), _hasFaultFile(false), _pwrOnMonitor(false) |
| { |
| auto chip = env::getEnv("GPIOCHIP", sensor); |
| auto access = env::getEnv("GPIO", sensor); |
| @@ -60,6 +60,15 @@ Sensor::Sensor(const SensorSet::key_type& sensor, |
| auto senRmRCs = env::getEnv("REMOVERCS", sensor); |
| // Add sensor removal return codes defined per sensor |
| addRemoveRCs(senRmRCs); |
| + |
| + auto pwrOnMon = env::getEnv("PWRONMON", sensor); |
| + if (!pwrOnMon.empty()) |
| + { |
| + if (pwrOnMon == "ON") |
| + { |
| + _pwrOnMonitor = true; |
| + } |
| + } |
| } |
| |
| void Sensor::addRemoveRCs(const std::string& rcList) |
| diff --git a/sensor.hpp b/sensor.hpp |
| index 4b2d281..369a252 100644 |
| --- a/sensor.hpp |
| +++ b/sensor.hpp |
| @@ -135,6 +135,16 @@ class Sensor |
| return _hasFaultFile; |
| } |
| |
| + /** |
| + * @brief Get whether the sensor only need to be monitored in power on state or not. |
| + * |
| + * @return - Boolean on whether the sensor only need to be monitored in power on state |
| + */ |
| + inline bool pwrOnMonitor(void) const |
| + { |
| + return _pwrOnMonitor; |
| + } |
| + |
| private: |
| /** @brief Sensor object's identifiers */ |
| SensorSet::key_type _sensor; |
| @@ -156,6 +166,9 @@ class Sensor |
| |
| /** @brief Tracks whether the sensor has a fault file or not. */ |
| bool _hasFaultFile; |
| + |
| + /** @brief Whether the sensor only need to be monitored in power on state or not. */ |
| + bool _pwrOnMonitor; |
| }; |
| |
| /** |
| diff --git a/thresholds.hpp b/thresholds.hpp |
| index 4d2fcff..972a469 100644 |
| --- a/thresholds.hpp |
| +++ b/thresholds.hpp |
| @@ -101,8 +101,6 @@ auto addThreshold(const std::string& sensorType, const std::string& sensorID, |
| auto hi = stod(tHi) * std::pow(10, scale); |
| (*iface.*Thresholds<T>::setLo)(lo); |
| (*iface.*Thresholds<T>::setHi)(hi); |
| - (*iface.*Thresholds<T>::alarmLo)(value <= lo); |
| - (*iface.*Thresholds<T>::alarmHi)(value >= hi); |
| auto type = Thresholds<T>::type; |
| obj[type] = iface; |
| } |
| -- |
| 2.7.4 |
| |