blob: 5aa7806d32be713e42ca8433ff6c1868d90b0edc [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
Patrick Williams61950102020-05-13 17:49:58 -050029void Host::execute(Base::Host::Command command, std::variant<uint8_t> data)
Vishwanatha Subbanna07655062017-07-14 20:31:57 +053030{
31 using namespace phosphor::logging;
32
Patrick Venture02261c02018-10-31 15:16:23 -070033 log<level::INFO>(
34 "Pushing cmd on to queue",
35 entry("CONTROL_HOST_CMD=%s", convertForMessage(command).c_str()));
Vishwanatha Subbanna07655062017-07-14 20:31:57 +053036
37 // If the command is OCCReset, then all we need is just sensor ID
38 // This is the only command that is being used now.
39 if (command == Base::Host::Command::OCCReset)
40 {
Patrick Williams12f96692020-05-13 11:40:26 -050041 auto sensorID = std::get<uint8_t>(data);
Vishwanatha Subbanna07655062017-07-14 20:31:57 +053042
43 auto cmd = std::make_tuple(std::make_pair(IPMI_CMD_OCC_RESET, sensorID),
Patrick Venture02261c02018-10-31 15:16:23 -070044 std::bind(&Host::commandStatusHandler, this,
45 std::placeholders::_1,
46 std::placeholders::_2));
Vishwanatha Subbanna07655062017-07-14 20:31:57 +053047
48 return ipmid_send_cmd_to_host(std::move(cmd));
49 }
50 return;
51}
52
53// Called into by Command Manager
54void Host::commandStatusHandler(IpmiCmdData cmd, bool status)
55{
56 // Need to convert <cmd> to the equivalent one mentioned in spec
57 auto value = status ? Result::Success : Result::Failure;
58
59 // Fire a signal
60 this->commandComplete(intfCommand.at(std::get<0>(cmd)), value);
61}
62
63} // namespace command
64} // namespace host
Patrick Venture02261c02018-10-31 15:16:23 -070065} // namespace open_power