xref: /openbmc/phosphor-host-ipmid/globalhandler.cpp (revision 082de3c9e40a2b9badf7991e9dc616b1cf25b2c5)
1 #include <ipmid/api.hpp>
2 #include <ipmid/utils.hpp>
3 #include <phosphor-logging/lg2.hpp>
4 #include <xyz/openbmc_project/State/BMC/server.hpp>
5 
6 #include <string>
7 
8 static constexpr auto bmcStateRoot = "/xyz/openbmc_project/state";
9 static constexpr auto bmcStateIntf = "xyz.openbmc_project.State.BMC";
10 static constexpr auto reqTransition = "RequestedBMCTransition";
11 static constexpr auto match = "bmc0";
12 
13 using BMC = sdbusplus::server::xyz::openbmc_project::state::BMC;
14 
15 void registerNetFnGlobalFunctions() __attribute__((constructor));
16 
17 /** @brief implements cold and warm reset commands
18  *  @param - None
19  *  @returns IPMI completion code.
20  */
ipmiGlobalReset(ipmi::Context::ptr ctx)21 ipmi::RspType<> ipmiGlobalReset(ipmi::Context::ptr ctx)
22 {
23     ipmi::DbusObjectInfo bmcStateObj;
24     boost::system::error_code ec = ipmi::getDbusObject(
25         ctx, bmcStateIntf, bmcStateRoot, match, bmcStateObj);
26     if (!ec)
27     {
28         std::string service;
29         ec = ipmi::getService(ctx, bmcStateIntf, bmcStateObj.first, service);
30         if (!ec)
31         {
32             ec = ipmi::setDbusProperty(
33                 ctx, service, bmcStateObj.first, bmcStateIntf, reqTransition,
34                 convertForMessage(BMC::Transition::Reboot));
35         }
36     }
37     if (ec)
38     {
39         lg2::error("Exception in Global Reset: {ERROR}", "ERROR", ec.message());
40         return ipmi::responseUnspecifiedError();
41     }
42 
43     // Status code.
44     return ipmi::responseSuccess();
45 }
46 
registerNetFnGlobalFunctions()47 void registerNetFnGlobalFunctions()
48 {
49     // Cold Reset
50     ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnApp,
51                           ipmi::app::cmdColdReset, ipmi::Privilege::Admin,
52                           ipmiGlobalReset);
53     return;
54 }
55