blob: ca33b1e3ba8bfa61492729c6d28507dba21daf01 [file] [log] [blame]
Patrick Venture02261c02018-10-31 15:16:23 -07001#include <config.h>
2
Vishwanatha Subbanna07655062017-07-14 20:31:57 +05303#include <chrono>
4#include <functional>
Vishwanatha Subbanna07655062017-07-14 20:31:57 +05305#include <host-interface.hpp>
William A. Kennington III822eaf62019-02-12 15:20:06 -08006#include <ipmid-host/cmd-utils.hpp>
7#include <ipmid-host/cmd.hpp>
Patrick Venture02261c02018-10-31 15:16:23 -07008#include <oemhandler.hpp>
9#include <phosphor-logging/log.hpp>
Vishwanatha Subbanna07655062017-07-14 20:31:57 +053010namespace open_power
11{
12namespace host
13{
14namespace command
15{
16
17// IPMI command
18// https://github.com/openbmc/openbmc/issues/2082 for handling
19// Non-OEM commands that need to send SMS_ATN
20using OEMCmd = uint8_t;
21
22// Map of IPMI OEM command to its equivalent interface command.
23// This is needed when invoking the callback handler to indicate
24// the status of the executed command.
25static const std::map<OEMCmd, Host::Command> intfCommand = {
Patrick Venture02261c02018-10-31 15:16:23 -070026 {IPMI_CMD_OCC_RESET, Base::Host::Command::OCCReset}};
Vishwanatha Subbanna07655062017-07-14 20:31:57 +053027
28// Called at user request
29void Host::execute(Base::Host::Command command,
Patrick Venture02261c02018-10-31 15:16:23 -070030 sdbusplus::message::variant<uint8_t> data)
Vishwanatha Subbanna07655062017-07-14 20:31:57 +053031{
32 using namespace phosphor::logging;
33
Patrick Venture02261c02018-10-31 15:16:23 -070034 log<level::INFO>(
35 "Pushing cmd on to queue",
36 entry("CONTROL_HOST_CMD=%s", convertForMessage(command).c_str()));
Vishwanatha Subbanna07655062017-07-14 20:31:57 +053037
38 // If the command is OCCReset, then all we need is just sensor ID
39 // This is the only command that is being used now.
40 if (command == Base::Host::Command::OCCReset)
41 {
Patrick Williams12f96692020-05-13 11:40:26 -050042 auto sensorID = std::get<uint8_t>(data);
Vishwanatha Subbanna07655062017-07-14 20:31:57 +053043
44 auto cmd = std::make_tuple(std::make_pair(IPMI_CMD_OCC_RESET, sensorID),
Patrick Venture02261c02018-10-31 15:16:23 -070045 std::bind(&Host::commandStatusHandler, this,
46 std::placeholders::_1,
47 std::placeholders::_2));
Vishwanatha Subbanna07655062017-07-14 20:31:57 +053048
49 return ipmid_send_cmd_to_host(std::move(cmd));
50 }
51 return;
52}
53
54// Called into by Command Manager
55void Host::commandStatusHandler(IpmiCmdData cmd, bool status)
56{
57 // Need to convert <cmd> to the equivalent one mentioned in spec
58 auto value = status ? Result::Success : Result::Failure;
59
60 // Fire a signal
61 this->commandComplete(intfCommand.at(std::get<0>(cmd)), value);
62}
63
64} // namespace command
65} // namespace host
Patrick Venture02261c02018-10-31 15:16:23 -070066} // namespace open_power