blob: dbdd8361c1dd4183f03e07b02b2cbc596197a848 [file] [log] [blame]
Naveen Moses3bd1cfc2022-02-14 18:04:20 +05301
2#include "hostSelector_switch.hpp"
3
4// add the button iface class to registry
5static ButtonIFRegister<HostSelector> buttonRegister;
6using namespace phosphor::logging;
7size_t HostSelector::getMappedHSConfig(size_t hsPosition)
8{
9 size_t adjustedPosition = INVALID_INDEX; // set bmc as default value
10 std::string hsPosStr;
11 hsPosStr = std::to_string(hsPosition);
12
13 if (hsPosMap.find(hsPosStr) != hsPosMap.end())
14 {
15 adjustedPosition = hsPosMap[hsPosStr];
16 }
17 else
18 {
19 log<level::DEBUG>(
20 "getMappedHSConfig : no valid value in map.",
21 entry("FORM_FACTOR_TYPE=%s", (getFormFactorType()).c_str()));
22 }
23 return adjustedPosition;
24}
25
26size_t HostSelector::getGpioIndex(int fd)
27{
28 for (size_t index = 0; index < gpioLineCount; index++)
29 {
30 if (config.gpios[index].fd == fd)
31 {
32 return index;
33 }
34 }
35 return INVALID_INDEX;
36}
37void HostSelector::setInitialHostSelectorValue()
38{
39 char buf;
George Liu94afa4b2022-06-20 13:36:43 +080040 for (size_t index = 0; index < gpioLineCount; index++)
Naveen Moses3bd1cfc2022-02-14 18:04:20 +053041 {
42 auto result = ::lseek(config.gpios[index].fd, 0, SEEK_SET);
43
44 if (result < 0)
45 {
46 log<level::ERR>(
47 "gpio fd lseek error!",
48 entry("FORM_FACTOR_TYPE=%s", (getFormFactorType()).c_str()));
49 throw sdbusplus::xyz::openbmc_project::Chassis::Common::Error::
50 IOError();
51 }
52
53 result = ::read(config.gpios[index].fd, &buf, sizeof(buf));
54 if (result < 0)
55 {
56 log<level::ERR>(
57 "gpio fd read error!",
58 entry("FORM_FACTOR_TYPE=%s", (getFormFactorType()).c_str()));
59 throw sdbusplus::xyz::openbmc_project::Chassis::Common::Error::
60 IOError();
61 }
62 GpioState gpioState =
63 (buf == '0') ? (GpioState::low) : (GpioState::high);
64 setHostSelectorValue(config.gpios[index].fd, gpioState);
65 size_t hsPosMapped = getMappedHSConfig(hostSelectorPosition);
66 if (hsPosMapped != INVALID_INDEX)
67 {
68 position(hsPosMapped, true);
69 }
70 }
71}
72
73void HostSelector::setHostSelectorValue(int fd, GpioState state)
74{
75 size_t pos = getGpioIndex(fd);
76
77 if (pos == INVALID_INDEX)
78 {
79 return;
80 }
81 auto set_bit = [](size_t& val, size_t n) { val |= 0xff & (1 << n); };
82
83 auto clr_bit = [](size_t& val, size_t n) { val &= ~(0xff & (1 << n)); };
84
85 auto bit_op = (state == GpioState::low) ? set_bit : clr_bit;
86
87 bit_op(hostSelectorPosition, pos);
88 return;
89}
90/**
91 * @brief This method is called from sd-event provided callback function
92 * callbackHandler if platform specific event handling is needed then a
93 * derived class instance with its specific event handling logic along with
94 * init() function can be created to override the default event handling
95 */
96
George Liu94afa4b2022-06-20 13:36:43 +080097void HostSelector::handleEvent(sd_event_source* /* es */, int fd,
98 uint32_t /* revents */)
Naveen Moses3bd1cfc2022-02-14 18:04:20 +053099{
100 int n = -1;
101 char buf = '0';
102
103 n = ::lseek(fd, 0, SEEK_SET);
104
105 if (n < 0)
106 {
107 log<level::ERR>(
108 "gpio fd lseek error!",
109 entry("FORM_FACTOR_TYPE=%s", (getFormFactorType()).c_str()));
110 return;
111 }
112
113 n = ::read(fd, &buf, sizeof(buf));
114 if (n < 0)
115 {
116 log<level::ERR>(
117 "gpio fd read error!",
118 entry("FORM_FACTOR_TYPE=%s", (getFormFactorType()).c_str()));
119 throw sdbusplus::xyz::openbmc_project::Chassis::Common::Error::
120 IOError();
121 }
122
123 // read the gpio state for the io event received
124 GpioState gpioState = (buf == '0') ? (GpioState::low) : (GpioState::high);
125
126 setHostSelectorValue(fd, gpioState);
127
128 size_t hsPosMapped = getMappedHSConfig(hostSelectorPosition);
129
130 if (hsPosMapped != INVALID_INDEX)
131 {
132 position(hsPosMapped);
133 }
134}