| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 1 | /** | 
 | 2 |  * Copyright 2017 Google Inc. | 
 | 3 |  * | 
 | 4 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 5 |  * you may not use this file except in compliance with the License. | 
 | 6 |  * You may obtain a copy of the License at | 
 | 7 |  * | 
 | 8 |  *     http://www.apache.org/licenses/LICENSE-2.0 | 
 | 9 |  * | 
 | 10 |  * Unless required by applicable law or agreed to in writing, software | 
 | 11 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 | 12 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 13 |  * See the License for the specific language governing permissions and | 
 | 14 |  * limitations under the License. | 
 | 15 |  */ | 
 | 16 |  | 
| Patrick Venture | 36ab6f6 | 2020-08-03 10:50:26 -0700 | [diff] [blame] | 17 | #include "manualcmds.hpp" | 
 | 18 |  | 
| Patrick Venture | 09334bb | 2020-08-16 12:22:54 -0700 | [diff] [blame] | 19 | #include "control.hpp" | 
| Patrick Venture | d82d0b7 | 2020-08-16 09:17:37 -0700 | [diff] [blame] | 20 | #include "dbus_mode.hpp" | 
| Patrick Venture | 9bf5cef | 2020-08-16 08:59:54 -0700 | [diff] [blame] | 21 | #include "manual_messages.hpp" | 
 | 22 |  | 
| William A. Kennington III | 331143c | 2019-02-07 15:52:44 -0800 | [diff] [blame] | 23 | #include <ipmid/api.h> | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 24 |  | 
| Patrick Venture | da4a5dd | 2018-08-31 09:42:48 -0700 | [diff] [blame] | 25 | #include <sdbusplus/bus.hpp> | 
 | 26 | #include <sdbusplus/message.hpp> | 
| Patrick Venture | a83a3ec | 2020-08-04 09:52:05 -0700 | [diff] [blame] | 27 |  | 
 | 28 | #include <map> | 
| Patrick Venture | 09334bb | 2020-08-16 12:22:54 -0700 | [diff] [blame] | 29 | #include <memory> | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 30 | #include <string> | 
 | 31 | #include <tuple> | 
| James Feist | 1f802f5 | 2019-02-08 13:51:43 -0800 | [diff] [blame] | 32 | #include <variant> | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 33 |  | 
| Patrick Venture | 36ab6f6 | 2020-08-03 10:50:26 -0700 | [diff] [blame] | 34 | namespace pid_control | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 35 | { | 
| Patrick Venture | 36ab6f6 | 2020-08-03 10:50:26 -0700 | [diff] [blame] | 36 | namespace ipmi | 
| Patrick Venture | da4a5dd | 2018-08-31 09:42:48 -0700 | [diff] [blame] | 37 | { | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 38 |  | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 39 | static constexpr auto manualProperty = "Manual"; | 
 | 40 | static constexpr auto failsafeProperty = "FailSafe"; | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 41 |  | 
| Patrick Venture | 09334bb | 2020-08-16 12:22:54 -0700 | [diff] [blame] | 42 | ipmi_ret_t ZoneControlIpmiHandler::getFailsafeModeState(const uint8_t* reqBuf, | 
 | 43 |                                                         uint8_t* replyBuf, | 
 | 44 |                                                         size_t* dataLen) | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 45 | { | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 46 |     bool current; | 
 | 47 |  | 
 | 48 |     if (*dataLen < sizeof(struct FanCtrlRequest)) | 
 | 49 |     { | 
 | 50 |         return IPMI_CC_INVALID; | 
 | 51 |     } | 
 | 52 |  | 
 | 53 |     const auto request = | 
| Patrick Venture | da4a5dd | 2018-08-31 09:42:48 -0700 | [diff] [blame] | 54 |         reinterpret_cast<const struct FanCtrlRequest*>(&reqBuf[0]); | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 55 |  | 
| Patrick Williams | 8c05112 | 2023-05-10 07:50:59 -0500 | [diff] [blame^] | 56 |     ipmi_ret_t rc = _control->getFanCtrlProperty(request->zone, ¤t, | 
 | 57 |                                                  failsafeProperty); | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 58 |     if (rc) | 
 | 59 |     { | 
 | 60 |         return rc; | 
 | 61 |     } | 
 | 62 |  | 
 | 63 |     *replyBuf = (uint8_t)current; | 
 | 64 |     *dataLen = sizeof(uint8_t); | 
| Patrick Venture | 37b247a | 2020-08-03 11:15:21 -0700 | [diff] [blame] | 65 |     return IPMI_CC_OK; | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 66 | } | 
 | 67 |  | 
 | 68 | /* | 
 | 69 |  * <method name="GetAll"> | 
 | 70 |  *   <arg name="interface" direction="in" type="s"/> | 
 | 71 |  *   <arg name="properties" direction="out" type="a{sv}"/> | 
 | 72 |  * </method> | 
 | 73 |  */ | 
| Patrick Venture | 09334bb | 2020-08-16 12:22:54 -0700 | [diff] [blame] | 74 | ipmi_ret_t ZoneControlIpmiHandler::getManualModeState(const uint8_t* reqBuf, | 
 | 75 |                                                       uint8_t* replyBuf, | 
 | 76 |                                                       size_t* dataLen) | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 77 | { | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 78 |     bool current; | 
 | 79 |  | 
 | 80 |     if (*dataLen < sizeof(struct FanCtrlRequest)) | 
 | 81 |     { | 
 | 82 |         return IPMI_CC_INVALID; | 
 | 83 |     } | 
 | 84 |  | 
 | 85 |     const auto request = | 
| Patrick Venture | da4a5dd | 2018-08-31 09:42:48 -0700 | [diff] [blame] | 86 |         reinterpret_cast<const struct FanCtrlRequest*>(&reqBuf[0]); | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 87 |  | 
| Patrick Williams | 8c05112 | 2023-05-10 07:50:59 -0500 | [diff] [blame^] | 88 |     ipmi_ret_t rc = _control->getFanCtrlProperty(request->zone, ¤t, | 
 | 89 |                                                  manualProperty); | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 90 |     if (rc) | 
 | 91 |     { | 
 | 92 |         return rc; | 
 | 93 |     } | 
 | 94 |  | 
 | 95 |     *replyBuf = (uint8_t)current; | 
 | 96 |     *dataLen = sizeof(uint8_t); | 
| Patrick Venture | 37b247a | 2020-08-03 11:15:21 -0700 | [diff] [blame] | 97 |     return IPMI_CC_OK; | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 98 | } | 
 | 99 |  | 
 | 100 | /* | 
 | 101 |  * <method name="Set"> | 
 | 102 |  *   <arg name="interface" direction="in" type="s"/> | 
 | 103 |  *   <arg name="property" direction="in" type="s"/> | 
 | 104 |  *   <arg name="value" direction="in" type="v"/> | 
 | 105 |  * </method> | 
 | 106 |  */ | 
| Harvey.Wu | a1ae4fa | 2022-10-28 17:38:35 +0800 | [diff] [blame] | 107 | ipmi_ret_t ZoneControlIpmiHandler::setManualModeState( | 
| Harvey Wu | 22579ca | 2022-11-07 14:53:37 +0800 | [diff] [blame] | 108 |     const uint8_t* reqBuf, [[maybe_unused]] uint8_t* replyBuf, | 
 | 109 |     const size_t* dataLen) | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 110 | { | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 111 |     if (*dataLen < sizeof(struct FanCtrlRequestSet)) | 
 | 112 |     { | 
 | 113 |         return IPMI_CC_INVALID; | 
 | 114 |     } | 
 | 115 |  | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 116 |     const auto request = | 
| Patrick Venture | da4a5dd | 2018-08-31 09:42:48 -0700 | [diff] [blame] | 117 |         reinterpret_cast<const struct FanCtrlRequestSet*>(&reqBuf[0]); | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 118 |  | 
 | 119 |     /* 0 is false, 1 is true */ | 
| Patrick Venture | 09334bb | 2020-08-16 12:22:54 -0700 | [diff] [blame] | 120 |     ipmi_ret_t rc = _control->setFanCtrlProperty( | 
 | 121 |         request->zone, static_cast<bool>(request->value), manualProperty); | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 122 |     return rc; | 
 | 123 | } | 
 | 124 |  | 
 | 125 | /* Three command packages: get, set true, set false */ | 
| Harvey.Wu | a1ae4fa | 2022-10-28 17:38:35 +0800 | [diff] [blame] | 126 | ipmi_ret_t manualModeControl(ZoneControlIpmiHandler* handler, | 
 | 127 |                              [[maybe_unused]] ipmi_cmd_t cmd, | 
| Patrick Venture | 09334bb | 2020-08-16 12:22:54 -0700 | [diff] [blame] | 128 |                              const uint8_t* reqBuf, uint8_t* replyCmdBuf, | 
 | 129 |                              size_t* dataLen) | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 130 | { | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 131 |     // FanCtrlRequest is the smaller of the requests, so it's at a minimum. | 
 | 132 |     if (*dataLen < sizeof(struct FanCtrlRequest)) | 
 | 133 |     { | 
 | 134 |         return IPMI_CC_INVALID; | 
 | 135 |     } | 
 | 136 |  | 
 | 137 |     const auto request = | 
| Patrick Venture | da4a5dd | 2018-08-31 09:42:48 -0700 | [diff] [blame] | 138 |         reinterpret_cast<const struct FanCtrlRequest*>(&reqBuf[0]); | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 139 |  | 
| Patrick Venture | 37b247a | 2020-08-03 11:15:21 -0700 | [diff] [blame] | 140 |     ipmi_ret_t rc = IPMI_CC_OK; | 
 | 141 |  | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 142 |     switch (request->command) | 
 | 143 |     { | 
| Patrick Venture | 1277543 | 2020-08-04 09:57:36 -0700 | [diff] [blame] | 144 |         case getControlState: | 
| Patrick Venture | 09334bb | 2020-08-16 12:22:54 -0700 | [diff] [blame] | 145 |             return handler->getManualModeState(reqBuf, replyCmdBuf, dataLen); | 
| Patrick Venture | 1277543 | 2020-08-04 09:57:36 -0700 | [diff] [blame] | 146 |         case setControlState: | 
| Patrick Venture | 09334bb | 2020-08-16 12:22:54 -0700 | [diff] [blame] | 147 |             return handler->setManualModeState(reqBuf, replyCmdBuf, dataLen); | 
| Patrick Venture | 1277543 | 2020-08-04 09:57:36 -0700 | [diff] [blame] | 148 |         case getFailsafeState: | 
| Patrick Venture | 09334bb | 2020-08-16 12:22:54 -0700 | [diff] [blame] | 149 |             return handler->getFailsafeModeState(reqBuf, replyCmdBuf, dataLen); | 
| Patrick Venture | 391b8b0 | 2018-03-08 08:31:13 -0800 | [diff] [blame] | 150 |         default: | 
 | 151 |             rc = IPMI_CC_INVALID; | 
 | 152 |     } | 
 | 153 |  | 
 | 154 |     return rc; | 
 | 155 | } | 
 | 156 |  | 
| Patrick Venture | 36ab6f6 | 2020-08-03 10:50:26 -0700 | [diff] [blame] | 157 | } // namespace ipmi | 
 | 158 | } // namespace pid_control |