xref: /openbmc/phosphor-state-manager/host_condition_gpio/host_condition.cpp (revision 44bbf11d343ea3427fd8da74e84a6fa6976c34b9)
1ba2241c6SThang Tran #include "host_condition.hpp"
2ba2241c6SThang Tran 
3ba2241c6SThang Tran #include <gpiod.hpp>
4ba2241c6SThang Tran #include <phosphor-logging/elog-errors.hpp>
5ba2241c6SThang Tran #include <phosphor-logging/lg2.hpp>
6ba2241c6SThang Tran 
7ba2241c6SThang Tran namespace phosphor
8ba2241c6SThang Tran {
9ba2241c6SThang Tran namespace condition
10ba2241c6SThang Tran {
11ba2241c6SThang Tran 
12ba2241c6SThang Tran PHOSPHOR_LOG2_USING;
13ba2241c6SThang Tran 
14ba2241c6SThang Tran using namespace phosphor::logging;
15ba2241c6SThang Tran 
scanGpioPin()16ba2241c6SThang Tran void Host::scanGpioPin()
17ba2241c6SThang Tran {
18ba2241c6SThang Tran     /*
19ba2241c6SThang Tran      * Check the hostX-ready/-n pin is defined or not
20ba2241c6SThang Tran      */
21ba2241c6SThang Tran     if (gpiod::find_line(lineName + "-ready"))
22ba2241c6SThang Tran     {
23ba2241c6SThang Tran         lineName += "-ready";
24ba2241c6SThang Tran         isActHigh = true;
25ba2241c6SThang Tran     }
26ba2241c6SThang Tran     else if (gpiod::find_line(lineName + "-ready-n"))
27ba2241c6SThang Tran     {
28ba2241c6SThang Tran         lineName += "-ready-n";
29ba2241c6SThang Tran         isActHigh = false;
30ba2241c6SThang Tran     }
31ba2241c6SThang Tran     else
32ba2241c6SThang Tran     {
33ba2241c6SThang Tran         lineName = "";
34ba2241c6SThang Tran     }
35ba2241c6SThang Tran }
36ba2241c6SThang Tran 
currentFirmwareCondition() const37ba2241c6SThang Tran Host::FirmwareCondition Host::currentFirmwareCondition() const
38ba2241c6SThang Tran {
39ba2241c6SThang Tran     auto retVal = Host::FirmwareCondition::Unknown;
40ba2241c6SThang Tran 
41ba2241c6SThang Tran     /*
42ba2241c6SThang Tran      * Check host is ready or not
43ba2241c6SThang Tran      */
44ba2241c6SThang Tran     if (!lineName.empty())
45ba2241c6SThang Tran     {
46ba2241c6SThang Tran         auto line = gpiod::find_line(lineName);
47ba2241c6SThang Tran 
48ba2241c6SThang Tran         try
49ba2241c6SThang Tran         {
50ba2241c6SThang Tran             int32_t gpioVal = 0;
51ba2241c6SThang Tran 
52*44bbf11dSPavithra Barithaya             line.request(
53*44bbf11dSPavithra Barithaya                 {lineName, gpiod::line_request::DIRECTION_INPUT,
54*44bbf11dSPavithra Barithaya                  (isActHigh) ? 0 : gpiod::line_request::FLAG_ACTIVE_LOW});
55ba2241c6SThang Tran 
56ba2241c6SThang Tran             gpioVal = line.get_value();
57ba2241c6SThang Tran             line.release();
58ba2241c6SThang Tran 
59ba2241c6SThang Tran             retVal = (0 == gpioVal) ? Host::FirmwareCondition::Off
60ba2241c6SThang Tran                                     : Host::FirmwareCondition::Running;
61ba2241c6SThang Tran         }
62ba2241c6SThang Tran         catch (std::system_error&)
63ba2241c6SThang Tran         {
64ba2241c6SThang Tran             error("Error when read gpio value");
65ba2241c6SThang Tran         }
66ba2241c6SThang Tran     }
67ba2241c6SThang Tran 
68ba2241c6SThang Tran     return retVal;
69ba2241c6SThang Tran }
70ba2241c6SThang Tran } // namespace condition
71ba2241c6SThang Tran } // namespace phosphor
72