blob: f740dc771204076b0e12a2a1f1b5c0ffc0e17ae7 [file] [log] [blame]
Vishwanatha Subbanna30e329a2017-07-24 23:13:14 +05301#include <phosphor-logging/log.hpp>
Vishwanatha Subbanna307d80b2017-06-28 15:56:09 +05302#include "occ_status.hpp"
Vishwanatha Subbanna6add0b82017-07-21 19:02:37 +05303#include "occ_sensor.hpp"
Vishwanatha Subbanna30e329a2017-07-24 23:13:14 +05304#include "utils.hpp"
Vishwanatha Subbanna307d80b2017-06-28 15:56:09 +05305namespace open_power
6{
7namespace occ
8{
9
10// Handles updates to occActive property
11bool Status::occActive(bool value)
12{
Vishwanatha Subbanna32e84e92017-06-28 19:17:28 +053013 if (value != this->occActive())
14 {
15 if (value)
16 {
17 // Bind the device
18 device.bind();
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +053019
20 // And watch for errors
21 device.addErrorWatch();
Vishwanatha Subbanna32e84e92017-06-28 19:17:28 +053022 }
23 else
24 {
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +053025 // Stop watching for errors
26 device.removeErrorWatch();
27
28 // Do the unbind.
Vishwanatha Subbanna32e84e92017-06-28 19:17:28 +053029 device.unBind();
30 }
31 }
Vishwanatha Subbanna307d80b2017-06-28 15:56:09 +053032 return Base::Status::occActive(value);
33}
34
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +053035// Callback handler when a device error is reported.
36void Status::deviceErrorHandler()
37{
38 // This would deem OCC inactive
39 this->occActive(false);
Vishwanatha Subbanna30e329a2017-07-24 23:13:14 +053040
41 // Reset the OCC
42 this->resetOCC();
43}
44
45// Sends message to host control command handler to reset OCC
46void Status::resetOCC()
47{
48 using namespace phosphor::logging;
49 constexpr auto CONTROL_HOST_PATH = "/org/open_power/control/host0";
50 constexpr auto CONTROL_HOST_INTF = "org.open_power.Control.Host";
51
52 // This will throw exception on failure
53 auto service = getService(bus, CONTROL_HOST_PATH, CONTROL_HOST_INTF);
54
55 auto method = bus.new_method_call(service.c_str(),
56 CONTROL_HOST_PATH,
57 CONTROL_HOST_INTF,
58 "Execute");
59 // OCC Reset control command
60 method.append(convertForMessage(
61 Control::Host::Command::OCCReset).c_str());
62
63 // OCC Sensor ID for callout reasons
64 method.append(sdbusplus::message::variant<uint8_t>(
65 sensorMap.at(instance)));
66 bus.call_noreply(method);
67 return;
68}
69
70// Handler called by Host control command handler to convey the
71// status of the executed command
72void Status::hostControlEvent(sdbusplus::message::message& msg)
73{
74 using namespace phosphor::logging;
75
76 std::string cmdCompleted{};
77 std::string cmdStatus{};
78
79 msg.read(cmdCompleted, cmdStatus);
80
81 log<level::DEBUG>("Host control signal values",
82 entry("COMMAND=%s",cmdCompleted.c_str()),
83 entry("STATUS=%s",cmdStatus.c_str()));
84
85 if(Control::Host::convertResultFromString(cmdStatus) !=
86 Control::Host::Result::Success)
87 {
88 if(Control::Host::convertCommandFromString(cmdCompleted) ==
89 Control::Host::Command::OCCReset)
90 {
91 // Must be a Timeout. Log an Erorr trace
92 log<level::ERR>("Error resetting the OCC.",
93 entry("PATH=%s", path.c_str()),
94 entry("SensorID=0x%X",sensorMap.at(instance)));
95 }
96 }
97 return;
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +053098}
99
Vishwanatha Subbanna307d80b2017-06-28 15:56:09 +0530100} // namespace occ
101} // namespace open_power