xref: /openbmc/google-ipmi-sys/psu.cpp (revision ff3cd8e9)
1 // Copyright 2021 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "psu.hpp"
16 
17 #include "commands.hpp"
18 #include "errors.hpp"
19 #include "handler.hpp"
20 
21 #include <cstdint>
22 #include <cstring>
23 #include <ipmid/api-types.hpp>
24 #include <vector>
25 
26 namespace google
27 {
28 namespace ipmi
29 {
30 
31 Resp psuHardReset(const std::vector<std::uint8_t>& data,
32                   const HandlerInterface* handler)
33 {
34     struct PsuResetRequest request;
35 
36     if (data.size() < sizeof(request))
37     {
38         std::fprintf(stderr, "Invalid command length: %u\n",
39                      static_cast<uint32_t>(data.size()));
40         return ::ipmi::responseReqDataLenInvalid();
41     }
42 
43     std::memcpy(&request, data.data(), sizeof(struct PsuResetRequest));
44     try
45     {
46         handler->psuResetDelay(request.delay);
47     }
48     catch (const IpmiException& e)
49     {
50         return ::ipmi::response(e.getIpmiError());
51     }
52 
53     return ::ipmi::responseSuccess(SysOEMCommands::SysPsuHardReset,
54                                    std::vector<uint8_t>{});
55 }
56 
57 Resp psuHardResetOnShutdown(const std::vector<std::uint8_t>&,
58                             const HandlerInterface* handler)
59 {
60     try
61     {
62         handler->psuResetOnShutdown();
63     }
64     catch (const IpmiException& e)
65     {
66         return ::ipmi::response(e.getIpmiError());
67     }
68 
69     return ::ipmi::responseSuccess(SysOEMCommands::SysPsuHardResetOnShutdown,
70                                    std::vector<uint8_t>{});
71 }
72 
73 } // namespace ipmi
74 } // namespace google
75