146470a38SPatrick Venture #include "globalhandler.hpp" 20b02be92SPatrick Venture 3e08fbffcSVernon Mauery #include <ipmid/api.hpp> 46a98fe7fSVernon Mauery #include <ipmid/utils.hpp> 50b02be92SPatrick Venture #include <phosphor-logging/elog-errors.hpp> 60b02be92SPatrick Venture #include <phosphor-logging/log.hpp> 734e3d3f1SNagaraju Goruganti #include <string> 80b02be92SPatrick Venture #include <xyz/openbmc_project/Common/error.hpp> 90b02be92SPatrick Venture #include <xyz/openbmc_project/State/BMC/server.hpp> 100b02be92SPatrick Venture 1134e3d3f1SNagaraju Goruganti static constexpr auto bmcStateRoot = "/xyz/openbmc_project/state"; 1234e3d3f1SNagaraju Goruganti static constexpr auto bmcStateIntf = "xyz.openbmc_project.State.BMC"; 1334e3d3f1SNagaraju Goruganti static constexpr auto reqTransition = "RequestedBMCTransition"; 1434e3d3f1SNagaraju Goruganti static constexpr auto match = "bmc0"; 1534e3d3f1SNagaraju Goruganti 1634e3d3f1SNagaraju Goruganti using namespace phosphor::logging; 1734e3d3f1SNagaraju Goruganti using BMC = sdbusplus::xyz::openbmc_project::State::server::BMC; 1898a23840SMatthew Barth 1998a23840SMatthew Barth void register_netfn_global_functions() __attribute__((constructor)); 2098a23840SMatthew Barth 2134e3d3f1SNagaraju Goruganti void resetBMC() 2298a23840SMatthew Barth { 2334e3d3f1SNagaraju Goruganti sdbusplus::bus::bus bus{ipmid_get_sd_bus_connection()}; 2498a23840SMatthew Barth 250b02be92SPatrick Venture auto bmcStateObj = 260b02be92SPatrick Venture ipmi::getDbusObject(bus, bmcStateIntf, bmcStateRoot, match); 2734e3d3f1SNagaraju Goruganti 2834e3d3f1SNagaraju Goruganti auto service = ipmi::getService(bus, bmcStateIntf, bmcStateObj.first); 2934e3d3f1SNagaraju Goruganti 3034e3d3f1SNagaraju Goruganti ipmi::setDbusProperty(bus, service, bmcStateObj.first, bmcStateIntf, 310b02be92SPatrick Venture reqTransition, 320b02be92SPatrick Venture convertForMessage(BMC::Transition::Reboot)); 3398a23840SMatthew Barth } 3498a23840SMatthew Barth 35e9e99d93Sanil kumar appana /** @brief implements cold and warm reset commands 36e9e99d93Sanil kumar appana * @param - None 37e9e99d93Sanil kumar appana * @returns IPMI completion code. 38e9e99d93Sanil kumar appana */ 39e9e99d93Sanil kumar appana ipmi::RspType<> ipmiGlobalReset() 4098a23840SMatthew Barth { 4134e3d3f1SNagaraju Goruganti try 42bc759884SNan Li { 4334e3d3f1SNagaraju Goruganti resetBMC(); 4434e3d3f1SNagaraju Goruganti } 45*a2ad2da8SPatrick Williams catch (const std::exception& e) 4634e3d3f1SNagaraju Goruganti { 4734e3d3f1SNagaraju Goruganti log<level::ERR>(e.what()); 48e9e99d93Sanil kumar appana return ipmi::responseUnspecifiedError(); 4934e3d3f1SNagaraju Goruganti } 50bc759884SNan Li 51bc759884SNan Li // Status code. 52e9e99d93Sanil kumar appana return ipmi::responseSuccess(); 53bc759884SNan Li } 5498a23840SMatthew Barth 5598a23840SMatthew Barth void register_netfn_global_functions() 5698a23840SMatthew Barth { 57e9e99d93Sanil kumar appana 580573237fSTom // Cold Reset 59e9e99d93Sanil kumar appana ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnApp, 60e9e99d93Sanil kumar appana ipmi::app::cmdColdReset, ipmi::Privilege::Admin, 61e9e99d93Sanil kumar appana ipmiGlobalReset); 6298a23840SMatthew Barth return; 6398a23840SMatthew Barth } 64