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