blob: fd8d5d6caac2c58db449fa9fb9c3e05f4f5ac579 [file] [log] [blame]
Vernon Mauerye08fbff2019-04-03 09:19:34 -07001#include <ipmid/api.hpp>
Vernon Mauery6a98fe72019-03-11 15:57:48 -07002#include <ipmid/utils.hpp>
George Liuffd5f042024-07-19 09:32:15 +08003#include <phosphor-logging/lg2.hpp>
Patrick Venture0b02be92018-08-31 11:55:55 -07004#include <xyz/openbmc_project/State/BMC/server.hpp>
5
Patrick Williamsfbc6c9d2023-05-10 07:50:16 -05006#include <string>
7
Nagaraju Goruganti34e3d3f2018-03-01 22:44:38 -06008static constexpr auto bmcStateRoot = "/xyz/openbmc_project/state";
9static constexpr auto bmcStateIntf = "xyz.openbmc_project.State.BMC";
10static constexpr auto reqTransition = "RequestedBMCTransition";
11static constexpr auto match = "bmc0";
12
Willy Tu523e2d12023-09-05 11:36:48 -070013using BMC = sdbusplus::server::xyz::openbmc_project::state::BMC;
Williamcb8ac882015-12-31 19:15:17 +080014
Williamcb8ac882015-12-31 19:15:17 +080015void register_netfn_global_functions() __attribute__((constructor));
16
Nagaraju Goruganti34e3d3f2018-03-01 22:44:38 -060017void resetBMC()
Williamcb8ac882015-12-31 19:15:17 +080018{
Patrick Williams5d82f472022-07-22 19:26:53 -050019 sdbusplus::bus_t bus{ipmid_get_sd_bus_connection()};
Williamcb8ac882015-12-31 19:15:17 +080020
Patrick Williams1318a5e2024-08-16 15:19:54 -040021 auto bmcStateObj =
22 ipmi::getDbusObject(bus, bmcStateIntf, bmcStateRoot, match);
Williamcb8ac882015-12-31 19:15:17 +080023
Nagaraju Goruganti34e3d3f2018-03-01 22:44:38 -060024 auto service = ipmi::getService(bus, bmcStateIntf, bmcStateObj.first);
Williamcb8ac882015-12-31 19:15:17 +080025
Nagaraju Goruganti34e3d3f2018-03-01 22:44:38 -060026 ipmi::setDbusProperty(bus, service, bmcStateObj.first, bmcStateIntf,
Patrick Venture0b02be92018-08-31 11:55:55 -070027 reqTransition,
28 convertForMessage(BMC::Transition::Reboot));
Williamcb8ac882015-12-31 19:15:17 +080029}
30
anil kumar appanae9e99d92019-04-28 23:47:24 +000031/** @brief implements cold and warm reset commands
32 * @param - None
33 * @returns IPMI completion code.
34 */
35ipmi::RspType<> ipmiGlobalReset()
Williamcb8ac882015-12-31 19:15:17 +080036{
Nagaraju Goruganti34e3d3f2018-03-01 22:44:38 -060037 try
38 {
39 resetBMC();
40 }
Patrick Williamsa2ad2da2021-10-06 12:21:46 -050041 catch (const std::exception& e)
Nagaraju Goruganti34e3d3f2018-03-01 22:44:38 -060042 {
George Liuffd5f042024-07-19 09:32:15 +080043 lg2::error("Exception in Global Reset: {ERROR}", "ERROR", e);
anil kumar appanae9e99d92019-04-28 23:47:24 +000044 return ipmi::responseUnspecifiedError();
Nagaraju Goruganti34e3d3f2018-03-01 22:44:38 -060045 }
Nan Libc759882016-08-22 15:00:21 +080046
47 // Status code.
anil kumar appanae9e99d92019-04-28 23:47:24 +000048 return ipmi::responseSuccess();
Nan Libc759882016-08-22 15:00:21 +080049}
Williamcb8ac882015-12-31 19:15:17 +080050
51void register_netfn_global_functions()
52{
Tom05732372016-09-06 17:21:23 +053053 // Cold Reset
anil kumar appanae9e99d92019-04-28 23:47:24 +000054 ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnApp,
55 ipmi::app::cmdColdReset, ipmi::Privilege::Admin,
56 ipmiGlobalReset);
Ratan Guptaeedf4f52016-02-25 18:53:52 +053057 return;
Williamcb8ac882015-12-31 19:15:17 +080058}