xref: /openbmc/google-ipmi-sys/psu.cpp (revision ac4a16f73011c7b5f69b78dd1e8fe76764fc7288)
1 /*
2  * Copyright 2018 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 
17 #include "psu.hpp"
18 
19 #include "commands.hpp"
20 #include "errors.hpp"
21 #include "handler.hpp"
22 
23 #include <cstdint>
24 #include <cstring>
25 
26 namespace google
27 {
28 namespace ipmi
29 {
30 
31 ipmi_ret_t psuHardReset(const uint8_t* reqBuf, uint8_t* replyBuf,
32                         size_t* dataLen, const HandlerInterface* handler)
33 {
34     struct PsuResetRequest request;
35 
36     if ((*dataLen) < sizeof(request))
37     {
38         std::fprintf(stderr, "Invalid command length: %u\n",
39                      static_cast<uint32_t>(*dataLen));
40         return IPMI_CC_REQ_DATA_LEN_INVALID;
41     }
42 
43     std::memcpy(&request, &reqBuf[0], sizeof(struct PsuResetRequest));
44     try
45     {
46         handler->psuResetDelay(request.delay);
47     }
48     catch (const IpmiException& e)
49     {
50         return e.getIpmiError();
51     }
52 
53     replyBuf[0] = SysPsuHardReset;
54     (*dataLen) = sizeof(uint8_t);
55 
56     return IPMI_CC_OK;
57 }
58 
59 ipmi_ret_t psuHardResetOnShutdown(const uint8_t* reqBuf, uint8_t* replyBuf,
60                                   size_t* dataLen,
61                                   const HandlerInterface* handler)
62 {
63     struct PsuResetOnShutdownRequest request;
64 
65     if ((*dataLen) < sizeof(request))
66     {
67         std::fprintf(stderr, "Invalid command length: %u\n",
68                      static_cast<uint32_t>(*dataLen));
69         return IPMI_CC_REQ_DATA_LEN_INVALID;
70     }
71 
72     std::memcpy(&request, &reqBuf[0], sizeof(request));
73     try
74     {
75         handler->psuResetOnShutdown();
76     }
77     catch (const IpmiException& e)
78     {
79         return e.getIpmiError();
80     }
81 
82     replyBuf[0] = SysPsuHardResetOnShutdown;
83     (*dataLen) = sizeof(uint8_t);
84 
85     return IPMI_CC_OK;
86 }
87 
88 } // namespace ipmi
89 } // namespace google
90