xref: /openbmc/phosphor-led-manager/fault-monitor/fru-fault-monitor.cpp (revision b2f253b79477745a9b7ddbe9e8ad036109335854)
13c6f29a0SDhruvaraj Subhashchandran #include <phosphor-logging/elog.hpp>
2151122aaSWilliam A. Kennington III #include <sdbusplus/exception.hpp>
33c6f29a0SDhruvaraj Subhashchandran #include "xyz/openbmc_project/Led/Fru/Monitor/error.hpp"
43c6f29a0SDhruvaraj Subhashchandran #include "xyz/openbmc_project/Led/Mapper/error.hpp"
53c6f29a0SDhruvaraj Subhashchandran #include "elog-errors.hpp"
659b86cd7SDhruvaraj Subhashchandran #include "fru-fault-monitor.hpp"
7891c4769SDhruvaraj Subhashchandran #include <phosphor-logging/elog-errors.hpp>
8891c4769SDhruvaraj Subhashchandran #include "xyz/openbmc_project/Common/error.hpp"
93c6f29a0SDhruvaraj Subhashchandran 
1059b86cd7SDhruvaraj Subhashchandran namespace phosphor
1159b86cd7SDhruvaraj Subhashchandran {
1259b86cd7SDhruvaraj Subhashchandran namespace led
1359b86cd7SDhruvaraj Subhashchandran {
1459b86cd7SDhruvaraj Subhashchandran namespace fru
1559b86cd7SDhruvaraj Subhashchandran {
1659b86cd7SDhruvaraj Subhashchandran namespace fault
1759b86cd7SDhruvaraj Subhashchandran {
1859b86cd7SDhruvaraj Subhashchandran namespace monitor
1959b86cd7SDhruvaraj Subhashchandran {
2059b86cd7SDhruvaraj Subhashchandran 
213c6f29a0SDhruvaraj Subhashchandran using namespace phosphor::logging;
223c6f29a0SDhruvaraj Subhashchandran 
233c6f29a0SDhruvaraj Subhashchandran constexpr auto MAPPER_BUSNAME   = "xyz.openbmc_project.ObjectMapper";
243c6f29a0SDhruvaraj Subhashchandran constexpr auto MAPPER_OBJ_PATH  = "/xyz/openbmc_project/object_mapper";
253c6f29a0SDhruvaraj Subhashchandran constexpr auto MAPPER_IFACE     = "xyz.openbmc_project.ObjectMapper";
263c6f29a0SDhruvaraj Subhashchandran constexpr auto OBJMGR_IFACE     = "org.freedesktop.DBus.ObjectManager";
273c6f29a0SDhruvaraj Subhashchandran constexpr auto LED_GROUPS       = "/xyz/openbmc_project/led/groups/";
283c6f29a0SDhruvaraj Subhashchandran constexpr auto LOG_PATH         = "/xyz/openbmc_project/logging";
29891c4769SDhruvaraj Subhashchandran constexpr auto LOG_IFACE        = "xyz.openbmc_project.Logging.Entry";
303c6f29a0SDhruvaraj Subhashchandran 
313c6f29a0SDhruvaraj Subhashchandran using AssociationList = std::vector<std::tuple<
323c6f29a0SDhruvaraj Subhashchandran                         std::string, std::string, std::string>>;
33aebfde81SDhruvaraj Subhashchandran using Attributes = sdbusplus::message::variant<bool,AssociationList>;
34aebfde81SDhruvaraj Subhashchandran using PropertyName = std::string;
35*b2f253b7SMatt Spinler using PropertyMap = std::map<PropertyName, Attributes>;
36*b2f253b7SMatt Spinler using InterfaceName = std::string;
37*b2f253b7SMatt Spinler using InterfaceMap = std::map<InterfaceName, PropertyMap>;
38aebfde81SDhruvaraj Subhashchandran 
39891c4769SDhruvaraj Subhashchandran using Service = std::string;
40891c4769SDhruvaraj Subhashchandran using Path = std::string;
41891c4769SDhruvaraj Subhashchandran using Interface = std::string;
42891c4769SDhruvaraj Subhashchandran using Interfaces = std::vector<Interface>;
43891c4769SDhruvaraj Subhashchandran using MapperResponseType = std::map<Path, std::map<Service, Interfaces>>;
44891c4769SDhruvaraj Subhashchandran 
45891c4769SDhruvaraj Subhashchandran using InternalFailure =
46891c4769SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
47891c4769SDhruvaraj Subhashchandran 
483c6f29a0SDhruvaraj Subhashchandran using MethodErr  =
493c6f29a0SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::Led::Mapper::Error::MethodError;
503c6f29a0SDhruvaraj Subhashchandran using ObjectNotFoundErr =
513c6f29a0SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::Led::Mapper::Error::ObjectNotFoundError;
523c6f29a0SDhruvaraj Subhashchandran using InventoryPathErr =
533c6f29a0SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::
543c6f29a0SDhruvaraj Subhashchandran     Led::Fru::Monitor::Error::InventoryPathError;
553c6f29a0SDhruvaraj Subhashchandran 
563c6f29a0SDhruvaraj Subhashchandran std::string getService(sdbusplus::bus::bus& bus,
573c6f29a0SDhruvaraj Subhashchandran                        const std::string& path)
583c6f29a0SDhruvaraj Subhashchandran {
593c6f29a0SDhruvaraj Subhashchandran     auto mapper = bus.new_method_call(MAPPER_BUSNAME,
603c6f29a0SDhruvaraj Subhashchandran                                       MAPPER_OBJ_PATH,
613c6f29a0SDhruvaraj Subhashchandran                                       MAPPER_IFACE, "GetObject");
623c6f29a0SDhruvaraj Subhashchandran     mapper.append(path.c_str(), std::vector<std::string>({OBJMGR_IFACE}));
633c6f29a0SDhruvaraj Subhashchandran     auto mapperResponseMsg = bus.call(mapper);
643c6f29a0SDhruvaraj Subhashchandran     if (mapperResponseMsg.is_method_error())
653c6f29a0SDhruvaraj Subhashchandran     {
663c6f29a0SDhruvaraj Subhashchandran         using namespace xyz::openbmc_project::Led::Mapper;
673c6f29a0SDhruvaraj Subhashchandran         elog<MethodErr>(
683c6f29a0SDhruvaraj Subhashchandran             MethodError::METHOD_NAME("GetObject"),
693c6f29a0SDhruvaraj Subhashchandran             MethodError::PATH(path.c_str()),
703c6f29a0SDhruvaraj Subhashchandran             MethodError::INTERFACE(
713c6f29a0SDhruvaraj Subhashchandran                 OBJMGR_IFACE));
723c6f29a0SDhruvaraj Subhashchandran     }
733c6f29a0SDhruvaraj Subhashchandran 
743c6f29a0SDhruvaraj Subhashchandran     std::map<std::string, std::vector<std::string>> mapperResponse;
75151122aaSWilliam A. Kennington III     try
76151122aaSWilliam A. Kennington III     {
773c6f29a0SDhruvaraj Subhashchandran         mapperResponseMsg.read(mapperResponse);
78151122aaSWilliam A. Kennington III     }
79151122aaSWilliam A. Kennington III     catch (const sdbusplus::exception::SdBusError& e)
80151122aaSWilliam A. Kennington III     {
81151122aaSWilliam A. Kennington III         log<level::ERR>("Failed to parse getService mapper response",
82151122aaSWilliam A. Kennington III                         entry("ERROR=%s", e.what()),
83151122aaSWilliam A. Kennington III                         entry("REPLY_SIG=%s", mapperResponseMsg.get_signature()));
84151122aaSWilliam A. Kennington III         using namespace xyz::openbmc_project::Led::Mapper;
85151122aaSWilliam A. Kennington III         elog<ObjectNotFoundErr>(
86151122aaSWilliam A. Kennington III             ObjectNotFoundError::METHOD_NAME("GetObject"),
87151122aaSWilliam A. Kennington III             ObjectNotFoundError::PATH(path.c_str()),
88151122aaSWilliam A. Kennington III             ObjectNotFoundError::INTERFACE(
89151122aaSWilliam A. Kennington III                 OBJMGR_IFACE));
90151122aaSWilliam A. Kennington III     }
913c6f29a0SDhruvaraj Subhashchandran     if (mapperResponse.empty())
923c6f29a0SDhruvaraj Subhashchandran     {
933c6f29a0SDhruvaraj Subhashchandran         using namespace xyz::openbmc_project::Led::Mapper;
943c6f29a0SDhruvaraj Subhashchandran         elog<ObjectNotFoundErr>(
953c6f29a0SDhruvaraj Subhashchandran             ObjectNotFoundError::METHOD_NAME("GetObject"),
963c6f29a0SDhruvaraj Subhashchandran             ObjectNotFoundError::PATH(path.c_str()),
973c6f29a0SDhruvaraj Subhashchandran             ObjectNotFoundError::INTERFACE(
983c6f29a0SDhruvaraj Subhashchandran                 OBJMGR_IFACE));
993c6f29a0SDhruvaraj Subhashchandran     }
1003c6f29a0SDhruvaraj Subhashchandran 
1013c6f29a0SDhruvaraj Subhashchandran     return mapperResponse.cbegin()->first;
1023c6f29a0SDhruvaraj Subhashchandran }
1033c6f29a0SDhruvaraj Subhashchandran 
10459b86cd7SDhruvaraj Subhashchandran void action(sdbusplus::bus::bus& bus,
1053c6f29a0SDhruvaraj Subhashchandran             const std::string& path,
10659b86cd7SDhruvaraj Subhashchandran             bool assert)
10759b86cd7SDhruvaraj Subhashchandran {
1083c6f29a0SDhruvaraj Subhashchandran     std::string service;
1093c6f29a0SDhruvaraj Subhashchandran     try
1103c6f29a0SDhruvaraj Subhashchandran     {
1113c6f29a0SDhruvaraj Subhashchandran         service = getService(bus, LED_GROUPS);
1123c6f29a0SDhruvaraj Subhashchandran     }
1133c6f29a0SDhruvaraj Subhashchandran     catch (MethodErr& e)
1143c6f29a0SDhruvaraj Subhashchandran     {
1153c6f29a0SDhruvaraj Subhashchandran         commit<MethodErr>();
1163c6f29a0SDhruvaraj Subhashchandran         return;
1173c6f29a0SDhruvaraj Subhashchandran     }
1183c6f29a0SDhruvaraj Subhashchandran     catch (ObjectNotFoundErr& e)
1193c6f29a0SDhruvaraj Subhashchandran     {
1203c6f29a0SDhruvaraj Subhashchandran         commit<ObjectNotFoundErr>();
1213c6f29a0SDhruvaraj Subhashchandran         return;
1223c6f29a0SDhruvaraj Subhashchandran     }
1233c6f29a0SDhruvaraj Subhashchandran 
1243c6f29a0SDhruvaraj Subhashchandran     auto pos = path.rfind("/");
1253c6f29a0SDhruvaraj Subhashchandran     if (pos == std::string::npos)
1263c6f29a0SDhruvaraj Subhashchandran     {
1273c6f29a0SDhruvaraj Subhashchandran         using namespace xyz::openbmc_project::Led::Fru::Monitor;
1283c6f29a0SDhruvaraj Subhashchandran         report<InventoryPathErr>(
1293c6f29a0SDhruvaraj Subhashchandran             InventoryPathError::PATH(
1303c6f29a0SDhruvaraj Subhashchandran                 path.c_str()));
1313c6f29a0SDhruvaraj Subhashchandran         return;
1323c6f29a0SDhruvaraj Subhashchandran     }
1333c6f29a0SDhruvaraj Subhashchandran     auto unit = path.substr(pos + 1);
1343c6f29a0SDhruvaraj Subhashchandran 
1353c6f29a0SDhruvaraj Subhashchandran     std::string ledPath = LED_GROUPS +
1363c6f29a0SDhruvaraj Subhashchandran                           unit + '_' + LED_FAULT;
1373c6f29a0SDhruvaraj Subhashchandran 
1383c6f29a0SDhruvaraj Subhashchandran     auto method =  bus.new_method_call(service.c_str(),
1393c6f29a0SDhruvaraj Subhashchandran                                        ledPath.c_str(),
1403c6f29a0SDhruvaraj Subhashchandran                                        "org.freedesktop.DBus.Properties",
1413c6f29a0SDhruvaraj Subhashchandran                                        "Set");
1423c6f29a0SDhruvaraj Subhashchandran     method.append("xyz.openbmc_project.Led.Group");
1433c6f29a0SDhruvaraj Subhashchandran     method.append("Asserted");
1443c6f29a0SDhruvaraj Subhashchandran 
1453c6f29a0SDhruvaraj Subhashchandran     method.append(sdbusplus::message::variant<bool>(assert));
1463c6f29a0SDhruvaraj Subhashchandran     bus.call_noreply(method);
1473c6f29a0SDhruvaraj Subhashchandran 
14859b86cd7SDhruvaraj Subhashchandran     return;
14959b86cd7SDhruvaraj Subhashchandran }
15059b86cd7SDhruvaraj Subhashchandran 
1513eedbe44SPatrick Williams void Add::created(sdbusplus::message::message& msg)
15259b86cd7SDhruvaraj Subhashchandran {
1533eedbe44SPatrick Williams     auto bus = msg.get_bus();
1543c6f29a0SDhruvaraj Subhashchandran 
155*b2f253b7SMatt Spinler     sdbusplus::message::object_path objectPath;
156*b2f253b7SMatt Spinler     InterfaceMap interfaces;
157151122aaSWilliam A. Kennington III     try
158151122aaSWilliam A. Kennington III     {
159*b2f253b7SMatt Spinler         msg.read(objectPath, interfaces);
160151122aaSWilliam A. Kennington III     }
161151122aaSWilliam A. Kennington III     catch (const sdbusplus::exception::SdBusError& e)
162151122aaSWilliam A. Kennington III     {
163151122aaSWilliam A. Kennington III         log<level::ERR>("Failed to parse created message",
164151122aaSWilliam A. Kennington III                         entry("ERROR=%s", e.what()),
165151122aaSWilliam A. Kennington III                         entry("REPLY_SIG=%s", msg.get_signature()));
166151122aaSWilliam A. Kennington III         return;
167151122aaSWilliam A. Kennington III     }
1683c6f29a0SDhruvaraj Subhashchandran 
169*b2f253b7SMatt Spinler     std::size_t found = objectPath.str.find(ELOG_ENTRY);
1703c6f29a0SDhruvaraj Subhashchandran     if (found == std::string::npos)
1713c6f29a0SDhruvaraj Subhashchandran     {
1723c6f29a0SDhruvaraj Subhashchandran         //Not a new error entry skip
1733eedbe44SPatrick Williams         return;
1743c6f29a0SDhruvaraj Subhashchandran     }
175*b2f253b7SMatt Spinler     auto iter = interfaces.find("org.openbmc.Associations");
176*b2f253b7SMatt Spinler     if (iter == interfaces.end())
1773c6f29a0SDhruvaraj Subhashchandran     {
1783eedbe44SPatrick Williams         return;
1793c6f29a0SDhruvaraj Subhashchandran     }
1803c6f29a0SDhruvaraj Subhashchandran 
1813d2b0d62SMatt Spinler     //Nothing else shows when a specific error log
1823d2b0d62SMatt Spinler     //has been created. Do it here.
183*b2f253b7SMatt Spinler     std::string message{objectPath.str + " created"};
1843d2b0d62SMatt Spinler     log<level::INFO>(message.c_str());
1853d2b0d62SMatt Spinler 
186aebfde81SDhruvaraj Subhashchandran     auto attr = iter->second.find("associations");
187aebfde81SDhruvaraj Subhashchandran     if (attr == iter->second.end())
1883c6f29a0SDhruvaraj Subhashchandran     {
1893eedbe44SPatrick Williams         return;
1903c6f29a0SDhruvaraj Subhashchandran     }
1913c6f29a0SDhruvaraj Subhashchandran 
192aebfde81SDhruvaraj Subhashchandran     auto& assocs =
193aebfde81SDhruvaraj Subhashchandran         sdbusplus::message::variant_ns::get<AssociationList>(attr->second);
1943c6f29a0SDhruvaraj Subhashchandran     if (assocs.empty())
1953c6f29a0SDhruvaraj Subhashchandran     {
1963c6f29a0SDhruvaraj Subhashchandran         //No associations skip
1973eedbe44SPatrick Williams         return;
1983c6f29a0SDhruvaraj Subhashchandran     }
1993c6f29a0SDhruvaraj Subhashchandran 
2003c6f29a0SDhruvaraj Subhashchandran     for (const auto& item : assocs)
2013c6f29a0SDhruvaraj Subhashchandran     {
2023c6f29a0SDhruvaraj Subhashchandran         if (std::get<1>(item).compare(CALLOUT_REV_ASSOCIATION) == 0)
2033c6f29a0SDhruvaraj Subhashchandran         {
2043eedbe44SPatrick Williams             removeWatches.emplace_back(
2053c6f29a0SDhruvaraj Subhashchandran                 std::make_unique<Remove>(bus, std::get<2>(item)));
206891c4769SDhruvaraj Subhashchandran             action(bus, std::get<2>(item), true);
2073c6f29a0SDhruvaraj Subhashchandran         }
2083c6f29a0SDhruvaraj Subhashchandran     }
209aebfde81SDhruvaraj Subhashchandran 
2103eedbe44SPatrick Williams     return;
21159b86cd7SDhruvaraj Subhashchandran }
21259b86cd7SDhruvaraj Subhashchandran 
213891c4769SDhruvaraj Subhashchandran void Add::processExistingCallouts(sdbusplus::bus::bus& bus)
214891c4769SDhruvaraj Subhashchandran {
215891c4769SDhruvaraj Subhashchandran     auto depth = 0;
216891c4769SDhruvaraj Subhashchandran     auto mapperCall = bus.new_method_call(MAPPER_BUSNAME,
217891c4769SDhruvaraj Subhashchandran                                           MAPPER_OBJ_PATH,
218891c4769SDhruvaraj Subhashchandran                                           MAPPER_IFACE,
219891c4769SDhruvaraj Subhashchandran                                           "GetSubTree");
220891c4769SDhruvaraj Subhashchandran     mapperCall.append("/");
221891c4769SDhruvaraj Subhashchandran     mapperCall.append(depth);
222891c4769SDhruvaraj Subhashchandran     mapperCall.append(std::vector<Interface>({LOG_IFACE}));
223891c4769SDhruvaraj Subhashchandran 
224891c4769SDhruvaraj Subhashchandran     auto mapperResponseMsg = bus.call(mapperCall);
225891c4769SDhruvaraj Subhashchandran     if (mapperResponseMsg.is_method_error())
226891c4769SDhruvaraj Subhashchandran     {
227891c4769SDhruvaraj Subhashchandran         using namespace xyz::openbmc_project::Led::Mapper;
228891c4769SDhruvaraj Subhashchandran         report<MethodErr>(
229891c4769SDhruvaraj Subhashchandran             MethodError::METHOD_NAME("GetSubTree"),
230891c4769SDhruvaraj Subhashchandran             MethodError::PATH(MAPPER_OBJ_PATH),
231891c4769SDhruvaraj Subhashchandran             MethodError::INTERFACE(
232891c4769SDhruvaraj Subhashchandran                 OBJMGR_IFACE));
233891c4769SDhruvaraj Subhashchandran         return;
234891c4769SDhruvaraj Subhashchandran     }
235891c4769SDhruvaraj Subhashchandran 
236891c4769SDhruvaraj Subhashchandran     MapperResponseType mapperResponse;
237151122aaSWilliam A. Kennington III     try
238151122aaSWilliam A. Kennington III     {
239891c4769SDhruvaraj Subhashchandran         mapperResponseMsg.read(mapperResponse);
240151122aaSWilliam A. Kennington III     }
241151122aaSWilliam A. Kennington III     catch (const sdbusplus::exception::SdBusError& e)
242151122aaSWilliam A. Kennington III     {
243151122aaSWilliam A. Kennington III         log<level::ERR>("Failed to parse existing callouts subtree message",
244151122aaSWilliam A. Kennington III                         entry("ERROR=%s", e.what()),
245151122aaSWilliam A. Kennington III                         entry("REPLY_SIG=%s", mapperResponseMsg.get_signature()));
246151122aaSWilliam A. Kennington III         return;
247151122aaSWilliam A. Kennington III     }
248891c4769SDhruvaraj Subhashchandran     if (mapperResponse.empty())
249891c4769SDhruvaraj Subhashchandran     {
250fc30e0c1SDhruvaraj Subhashchandran         //No errors to process.
251891c4769SDhruvaraj Subhashchandran         return;
252891c4769SDhruvaraj Subhashchandran     }
253891c4769SDhruvaraj Subhashchandran 
254891c4769SDhruvaraj Subhashchandran     for (const auto& elem : mapperResponse)
255891c4769SDhruvaraj Subhashchandran     {
256891c4769SDhruvaraj Subhashchandran         auto method =  bus.new_method_call(elem.second.begin()->first.c_str(),
257891c4769SDhruvaraj Subhashchandran                                            elem.first.c_str(),
258891c4769SDhruvaraj Subhashchandran                                            "org.freedesktop.DBus.Properties",
259891c4769SDhruvaraj Subhashchandran                                            "Get");
260891c4769SDhruvaraj Subhashchandran         method.append("org.openbmc.Associations");
261891c4769SDhruvaraj Subhashchandran         method.append("associations");
262891c4769SDhruvaraj Subhashchandran         auto reply = bus.call(method);
263891c4769SDhruvaraj Subhashchandran         if (reply.is_method_error())
264891c4769SDhruvaraj Subhashchandran         {
265891c4769SDhruvaraj Subhashchandran             //do not stop, continue with next elog
266891c4769SDhruvaraj Subhashchandran             log<level::ERR>("Error in getting associations");
267891c4769SDhruvaraj Subhashchandran             continue;
268891c4769SDhruvaraj Subhashchandran         }
269891c4769SDhruvaraj Subhashchandran 
270891c4769SDhruvaraj Subhashchandran         sdbusplus::message::variant<AssociationList> assoc;
271151122aaSWilliam A. Kennington III         try
272151122aaSWilliam A. Kennington III         {
273891c4769SDhruvaraj Subhashchandran             reply.read(assoc);
274151122aaSWilliam A. Kennington III         }
275151122aaSWilliam A. Kennington III         catch (const sdbusplus::exception::SdBusError& e)
276151122aaSWilliam A. Kennington III         {
277151122aaSWilliam A. Kennington III             log<level::ERR>("Failed to parse existing callouts associations message",
278151122aaSWilliam A. Kennington III                             entry("ERROR=%s", e.what()),
279151122aaSWilliam A. Kennington III                             entry("REPLY_SIG=%s", reply.get_signature()));
280151122aaSWilliam A. Kennington III             continue;
281151122aaSWilliam A. Kennington III         }
282891c4769SDhruvaraj Subhashchandran         auto& assocs = assoc.get<AssociationList>();
283891c4769SDhruvaraj Subhashchandran         if (assocs.empty())
284891c4769SDhruvaraj Subhashchandran         {
285891c4769SDhruvaraj Subhashchandran             //no associations, skip
286891c4769SDhruvaraj Subhashchandran             continue;
287891c4769SDhruvaraj Subhashchandran         }
288891c4769SDhruvaraj Subhashchandran 
289891c4769SDhruvaraj Subhashchandran         for (const auto& item : assocs)
290891c4769SDhruvaraj Subhashchandran         {
291891c4769SDhruvaraj Subhashchandran             if (std::get<1>(item).compare(CALLOUT_REV_ASSOCIATION) == 0)
292891c4769SDhruvaraj Subhashchandran             {
293891c4769SDhruvaraj Subhashchandran                 removeWatches.emplace_back(
294891c4769SDhruvaraj Subhashchandran                     std::make_unique<Remove>(bus, std::get<2>(item)));
295891c4769SDhruvaraj Subhashchandran                 action(bus, std::get<2>(item), true);
296891c4769SDhruvaraj Subhashchandran             }
297891c4769SDhruvaraj Subhashchandran         }
298891c4769SDhruvaraj Subhashchandran     }
299891c4769SDhruvaraj Subhashchandran }
300891c4769SDhruvaraj Subhashchandran 
3013eedbe44SPatrick Williams void Remove::removed(sdbusplus::message::message& msg)
30259b86cd7SDhruvaraj Subhashchandran {
3033eedbe44SPatrick Williams     auto bus = msg.get_bus();
3043c6f29a0SDhruvaraj Subhashchandran 
3053eedbe44SPatrick Williams     action(bus, inventoryPath, false);
3063eedbe44SPatrick Williams     return;
30759b86cd7SDhruvaraj Subhashchandran }
30859b86cd7SDhruvaraj Subhashchandran 
30959b86cd7SDhruvaraj Subhashchandran }//namespace monitor
31059b86cd7SDhruvaraj Subhashchandran }//namespace fault
31159b86cd7SDhruvaraj Subhashchandran }//namespace fru
31259b86cd7SDhruvaraj Subhashchandran }//namespace led
31359b86cd7SDhruvaraj Subhashchandran }//namespace phosphor
314