xref: /openbmc/fb-ipmi-oem/src/appcommands.cpp (revision 666a4d95)
1a2d52f12SVijay Khemka /*
2a2d52f12SVijay Khemka  * Copyright (c)  2018 Intel Corporation.
3a2d52f12SVijay Khemka  * Copyright (c)  2018-present Facebook.
4a2d52f12SVijay Khemka  *
5a2d52f12SVijay Khemka  * Licensed under the Apache License, Version 2.0 (the "License");
6a2d52f12SVijay Khemka  * you may not use this file except in compliance with the License.
7a2d52f12SVijay Khemka  * You may obtain a copy of the License at
8a2d52f12SVijay Khemka  *
9a2d52f12SVijay Khemka  *      http://www.apache.org/licenses/LICENSE-2.0
10a2d52f12SVijay Khemka  *
11a2d52f12SVijay Khemka  * Unless required by applicable law or agreed to in writing, software
12a2d52f12SVijay Khemka  * distributed under the License is distributed on an "AS IS" BASIS,
13a2d52f12SVijay Khemka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14a2d52f12SVijay Khemka  * See the License for the specific language governing permissions and
15a2d52f12SVijay Khemka  * limitations under the License.
16a2d52f12SVijay Khemka  */
17a2d52f12SVijay Khemka 
18a2d52f12SVijay Khemka #include <ipmid/api.h>
19a2d52f12SVijay Khemka 
20a2d52f12SVijay Khemka #include <sys/stat.h>
21a2d52f12SVijay Khemka #include <fcntl.h>
22a2d52f12SVijay Khemka #include <unistd.h>
23*666a4d95SVijay Khemka #include <nlohmann/json.hpp>
24a2d52f12SVijay Khemka #include <commandutils.hpp>
25a2d52f12SVijay Khemka #include <iostream>
26*666a4d95SVijay Khemka #include <iomanip>
27*666a4d95SVijay Khemka #include <sstream>
28*666a4d95SVijay Khemka #include <fstream>
29a2d52f12SVijay Khemka #include <phosphor-logging/log.hpp>
30a2d52f12SVijay Khemka #include <sdbusplus/message/types.hpp>
31a2d52f12SVijay Khemka #include <appcommands.hpp>
32a2d52f12SVijay Khemka 
33a2d52f12SVijay Khemka namespace ipmi
34a2d52f12SVijay Khemka {
35a2d52f12SVijay Khemka 
36a2d52f12SVijay Khemka static void registerAPPFunctions() __attribute__((constructor));
37a2d52f12SVijay Khemka static constexpr size_t GUID_SIZE = 16;
38a2d52f12SVijay Khemka // TODO Make offset and location runtime configurable to ensure we
39a2d52f12SVijay Khemka // can make each define their own locations.
40a2d52f12SVijay Khemka static constexpr off_t OFFSET_SYS_GUID = 0x17F0;
41a2d52f12SVijay Khemka static constexpr off_t OFFSET_DEV_GUID = 0x1800;
42a2d52f12SVijay Khemka static constexpr const char *FRU_EEPROM = "/sys/bus/i2c/devices/6-0054/eeprom";
43*666a4d95SVijay Khemka 
44*666a4d95SVijay Khemka // TODO: Need to store this info after identifying proper storage
45a2d52f12SVijay Khemka static uint8_t globEna = 0x09;
46*666a4d95SVijay Khemka static SysInfoParam sysInfoParams;
47*666a4d95SVijay Khemka nlohmann::json appData;
48a2d52f12SVijay Khemka 
49a2d52f12SVijay Khemka void printGUID(uint8_t *guid, off_t offset)
50a2d52f12SVijay Khemka {
51a2d52f12SVijay Khemka     std::cout << "Read GUID from offset : " << offset << " :\n";
52a2d52f12SVijay Khemka     for (int i = 0; i < GUID_SIZE; i++)
53a2d52f12SVijay Khemka     {
54a2d52f12SVijay Khemka         int data = guid[i];
55a2d52f12SVijay Khemka         std::cout << std::hex << data << " ";
56a2d52f12SVijay Khemka     }
57a2d52f12SVijay Khemka     std::cout << std::endl;
58a2d52f12SVijay Khemka }
59a2d52f12SVijay Khemka 
60a2d52f12SVijay Khemka int getGUID(off_t offset, uint8_t *guid)
61a2d52f12SVijay Khemka {
62a2d52f12SVijay Khemka     int fd = -1;
63a2d52f12SVijay Khemka     ssize_t bytes_rd;
64a2d52f12SVijay Khemka     int ret = 0;
65a2d52f12SVijay Khemka 
66a2d52f12SVijay Khemka     errno = 0;
67a2d52f12SVijay Khemka 
68a2d52f12SVijay Khemka     // Check if file is present
69a2d52f12SVijay Khemka     if (access(FRU_EEPROM, F_OK) == -1)
70a2d52f12SVijay Khemka     {
71a2d52f12SVijay Khemka         std::cerr << "Unable to access: " << FRU_EEPROM << std::endl;
72a2d52f12SVijay Khemka         return errno;
73a2d52f12SVijay Khemka     }
74a2d52f12SVijay Khemka 
75a2d52f12SVijay Khemka     // Open the file
76a2d52f12SVijay Khemka     fd = open(FRU_EEPROM, O_RDONLY);
77a2d52f12SVijay Khemka     if (fd == -1)
78a2d52f12SVijay Khemka     {
79a2d52f12SVijay Khemka         std::cerr << "Unable to open: " << FRU_EEPROM << std::endl;
80a2d52f12SVijay Khemka         return errno;
81a2d52f12SVijay Khemka     }
82a2d52f12SVijay Khemka 
83a2d52f12SVijay Khemka     // seek to the offset
84a2d52f12SVijay Khemka     lseek(fd, offset, SEEK_SET);
85a2d52f12SVijay Khemka 
86a2d52f12SVijay Khemka     // Read bytes from location
87a2d52f12SVijay Khemka     bytes_rd = read(fd, guid, GUID_SIZE);
88a2d52f12SVijay Khemka     if (bytes_rd != GUID_SIZE)
89a2d52f12SVijay Khemka     {
90a2d52f12SVijay Khemka         phosphor::logging::log<phosphor::logging::level::ERR>(
91a2d52f12SVijay Khemka             "GUID read data from EEPROM failed");
92a2d52f12SVijay Khemka         ret = errno;
93a2d52f12SVijay Khemka     }
94a2d52f12SVijay Khemka     else
95a2d52f12SVijay Khemka     {
96a2d52f12SVijay Khemka         printGUID(guid, offset);
97a2d52f12SVijay Khemka     }
98a2d52f12SVijay Khemka     close(fd);
99a2d52f12SVijay Khemka     return ret;
100a2d52f12SVijay Khemka }
101a2d52f12SVijay Khemka 
102a2d52f12SVijay Khemka int getSystemGUID(uint8_t *guid)
103a2d52f12SVijay Khemka {
104a2d52f12SVijay Khemka     return getGUID(OFFSET_SYS_GUID, guid);
105a2d52f12SVijay Khemka }
106a2d52f12SVijay Khemka 
107a2d52f12SVijay Khemka int getDeviceGUID(uint8_t *guid)
108a2d52f12SVijay Khemka {
109a2d52f12SVijay Khemka     return getGUID(OFFSET_DEV_GUID, guid);
110a2d52f12SVijay Khemka }
111a2d52f12SVijay Khemka 
112a2d52f12SVijay Khemka //----------------------------------------------------------------------
113*666a4d95SVijay Khemka // Get Self Test Results (IPMI/Section 20.4) (CMD_APP_GET_SELFTEST_RESULTS)
114*666a4d95SVijay Khemka //----------------------------------------------------------------------
115*666a4d95SVijay Khemka ipmi_ret_t ipmiAppGetSTResults(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
116*666a4d95SVijay Khemka                                ipmi_request_t request, ipmi_response_t response,
117*666a4d95SVijay Khemka                                ipmi_data_len_t data_len, ipmi_context_t context)
118*666a4d95SVijay Khemka {
119*666a4d95SVijay Khemka     uint8_t *res = reinterpret_cast<uint8_t *>(response);
120*666a4d95SVijay Khemka 
121*666a4d95SVijay Khemka     // TODO: Following data needs to be updated based on self-test results
122*666a4d95SVijay Khemka     *res++ = 0x55; // Self-Test result
123*666a4d95SVijay Khemka     *res++ = 0x00; // Extra error info in case of failure
124*666a4d95SVijay Khemka 
125*666a4d95SVijay Khemka     *data_len = 2;
126*666a4d95SVijay Khemka 
127*666a4d95SVijay Khemka     return IPMI_CC_OK;
128*666a4d95SVijay Khemka }
129*666a4d95SVijay Khemka 
130*666a4d95SVijay Khemka //----------------------------------------------------------------------
131*666a4d95SVijay Khemka // Manufacturing Test On (IPMI/Section 20.5) (CMD_APP_MFR_TEST_ON)
132*666a4d95SVijay Khemka //----------------------------------------------------------------------
133*666a4d95SVijay Khemka ipmi_ret_t ipmiAppMfrTestOn(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
134*666a4d95SVijay Khemka                             ipmi_request_t request, ipmi_response_t response,
135*666a4d95SVijay Khemka                             ipmi_data_len_t data_len, ipmi_context_t context)
136*666a4d95SVijay Khemka {
137*666a4d95SVijay Khemka     uint8_t *req = reinterpret_cast<uint8_t *>(request);
138*666a4d95SVijay Khemka     std::string mfrTest = "sled-cycle";
139*666a4d95SVijay Khemka 
140*666a4d95SVijay Khemka     if (!memcmp(req, mfrTest.data(), mfrTest.length()) &&
141*666a4d95SVijay Khemka         (*data_len == mfrTest.length()))
142*666a4d95SVijay Khemka     {
143*666a4d95SVijay Khemka         /* sled-cycle the BMC */
144*666a4d95SVijay Khemka         system("/usr/sbin/power-util mb sled-cycle");
145*666a4d95SVijay Khemka     }
146*666a4d95SVijay Khemka     else
147*666a4d95SVijay Khemka     {
148*666a4d95SVijay Khemka         return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
149*666a4d95SVijay Khemka     }
150*666a4d95SVijay Khemka 
151*666a4d95SVijay Khemka     *data_len = 0;
152*666a4d95SVijay Khemka 
153*666a4d95SVijay Khemka     return IPMI_CC_OK;
154*666a4d95SVijay Khemka }
155*666a4d95SVijay Khemka 
156*666a4d95SVijay Khemka //----------------------------------------------------------------------
157a2d52f12SVijay Khemka // Get Device GUID (CMD_APP_GET_DEV_GUID)
158a2d52f12SVijay Khemka //----------------------------------------------------------------------
159a2d52f12SVijay Khemka ipmi_ret_t ipmiAppGetDevGUID(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
160a2d52f12SVijay Khemka                              ipmi_request_t request, ipmi_response_t response,
161a2d52f12SVijay Khemka                              ipmi_data_len_t data_len, ipmi_context_t context)
162a2d52f12SVijay Khemka {
163a2d52f12SVijay Khemka     uint8_t *res = reinterpret_cast<uint8_t *>(response);
164a2d52f12SVijay Khemka 
165a2d52f12SVijay Khemka     if (getDeviceGUID(res))
166a2d52f12SVijay Khemka     {
167a2d52f12SVijay Khemka         return IPMI_CC_UNSPECIFIED_ERROR;
168a2d52f12SVijay Khemka     }
169a2d52f12SVijay Khemka     *data_len = GUID_SIZE;
170a2d52f12SVijay Khemka 
171a2d52f12SVijay Khemka     return IPMI_CC_OK;
172a2d52f12SVijay Khemka }
173a2d52f12SVijay Khemka 
174a2d52f12SVijay Khemka //----------------------------------------------------------------------
175a2d52f12SVijay Khemka // Set Global Enables (CMD_APP_SET_GLOBAL_ENABLES)
176a2d52f12SVijay Khemka //----------------------------------------------------------------------
177a2d52f12SVijay Khemka ipmi_ret_t ipmiAppSetGlobalEnables(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
178a2d52f12SVijay Khemka                                    ipmi_request_t request,
179a2d52f12SVijay Khemka                                    ipmi_response_t response,
180a2d52f12SVijay Khemka                                    ipmi_data_len_t data_len,
181a2d52f12SVijay Khemka                                    ipmi_context_t context)
182a2d52f12SVijay Khemka {
183a2d52f12SVijay Khemka     uint8_t *req = reinterpret_cast<uint8_t *>(request);
184a2d52f12SVijay Khemka 
185a2d52f12SVijay Khemka     globEna = *req;
186a2d52f12SVijay Khemka     *data_len = 0;
187a2d52f12SVijay Khemka 
188a2d52f12SVijay Khemka     return IPMI_CC_OK;
189a2d52f12SVijay Khemka }
190a2d52f12SVijay Khemka 
191a2d52f12SVijay Khemka //----------------------------------------------------------------------
192a2d52f12SVijay Khemka // Get Global Enables (CMD_APP_GET_GLOBAL_ENABLES)
193a2d52f12SVijay Khemka //----------------------------------------------------------------------
194a2d52f12SVijay Khemka ipmi_ret_t ipmiAppGetGlobalEnables(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
195a2d52f12SVijay Khemka                                    ipmi_request_t request,
196a2d52f12SVijay Khemka                                    ipmi_response_t response,
197a2d52f12SVijay Khemka                                    ipmi_data_len_t data_len,
198a2d52f12SVijay Khemka                                    ipmi_context_t context)
199a2d52f12SVijay Khemka {
200a2d52f12SVijay Khemka     uint8_t *res = reinterpret_cast<uint8_t *>(response);
201a2d52f12SVijay Khemka 
202a2d52f12SVijay Khemka     *data_len = 1;
203a2d52f12SVijay Khemka     *res++ = globEna;
204a2d52f12SVijay Khemka 
205a2d52f12SVijay Khemka     return IPMI_CC_OK;
206a2d52f12SVijay Khemka }
207a2d52f12SVijay Khemka 
208a2d52f12SVijay Khemka //----------------------------------------------------------------------
209*666a4d95SVijay Khemka // Clear Message flags (IPMI/Section 22.3) (CMD_APP_CLEAR_MESSAGE_FLAGS)
210*666a4d95SVijay Khemka //----------------------------------------------------------------------
211*666a4d95SVijay Khemka ipmi_ret_t ipmiAppClearMsgFlags(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
212*666a4d95SVijay Khemka                                 ipmi_request_t request,
213*666a4d95SVijay Khemka                                 ipmi_response_t response,
214*666a4d95SVijay Khemka                                 ipmi_data_len_t data_len,
215*666a4d95SVijay Khemka                                 ipmi_context_t context)
216*666a4d95SVijay Khemka {
217*666a4d95SVijay Khemka     // Do Nothing and just return success
218*666a4d95SVijay Khemka     *data_len = 0;
219*666a4d95SVijay Khemka 
220*666a4d95SVijay Khemka     return IPMI_CC_OK;
221*666a4d95SVijay Khemka }
222*666a4d95SVijay Khemka 
223*666a4d95SVijay Khemka //----------------------------------------------------------------------
224a2d52f12SVijay Khemka // Get System GUID (CMD_APP_GET_SYS_GUID)
225a2d52f12SVijay Khemka //----------------------------------------------------------------------
226a2d52f12SVijay Khemka ipmi_ret_t ipmiAppGetSysGUID(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
227a2d52f12SVijay Khemka                              ipmi_request_t request, ipmi_response_t response,
228a2d52f12SVijay Khemka                              ipmi_data_len_t data_len, ipmi_context_t context)
229a2d52f12SVijay Khemka {
230a2d52f12SVijay Khemka     uint8_t *res = reinterpret_cast<uint8_t *>(response);
231a2d52f12SVijay Khemka     if (getSystemGUID(res))
232a2d52f12SVijay Khemka     {
233a2d52f12SVijay Khemka         return IPMI_CC_UNSPECIFIED_ERROR;
234a2d52f12SVijay Khemka     }
235a2d52f12SVijay Khemka     *data_len = GUID_SIZE;
236a2d52f12SVijay Khemka     return IPMI_CC_OK;
237a2d52f12SVijay Khemka }
238a2d52f12SVijay Khemka 
239*666a4d95SVijay Khemka //----------------------------------------------------------------------
240*666a4d95SVijay Khemka // Platform specific functions for storing app data
241*666a4d95SVijay Khemka //----------------------------------------------------------------------
242*666a4d95SVijay Khemka 
243*666a4d95SVijay Khemka void flush_app_data()
244*666a4d95SVijay Khemka {
245*666a4d95SVijay Khemka     std::ofstream file(JSON_DATA_FILE);
246*666a4d95SVijay Khemka     file << appData;
247*666a4d95SVijay Khemka     return;
248*666a4d95SVijay Khemka }
249*666a4d95SVijay Khemka 
250*666a4d95SVijay Khemka static int platSetSysFWVer(uint8_t *ver)
251*666a4d95SVijay Khemka {
252*666a4d95SVijay Khemka     std::stringstream ss;
253*666a4d95SVijay Khemka     int i;
254*666a4d95SVijay Khemka 
255*666a4d95SVijay Khemka     /* TODO: implement byte 1: Set selector
256*666a4d95SVijay Khemka      * byte 2: encodeing, currently only supported
257*666a4d95SVijay Khemka      * ASCII which is value 0, UTF and unicode are
258*666a4d95SVijay Khemka      * not supported yet.
259*666a4d95SVijay Khemka      */
260*666a4d95SVijay Khemka     if (ver[1] & 0x0f)
261*666a4d95SVijay Khemka         return -1;
262*666a4d95SVijay Khemka 
263*666a4d95SVijay Khemka     for (i = 3; i < 3 + ver[2]; i++)
264*666a4d95SVijay Khemka     {
265*666a4d95SVijay Khemka         ss << (char)ver[i];
266*666a4d95SVijay Khemka     }
267*666a4d95SVijay Khemka 
268*666a4d95SVijay Khemka     appData[KEY_SYSFW_VER] = ss.str();
269*666a4d95SVijay Khemka     flush_app_data();
270*666a4d95SVijay Khemka 
271*666a4d95SVijay Khemka     return 0;
272*666a4d95SVijay Khemka }
273*666a4d95SVijay Khemka 
274*666a4d95SVijay Khemka static int platGetSysFWVer(uint8_t *ver)
275*666a4d95SVijay Khemka {
276*666a4d95SVijay Khemka     std::string str = appData[KEY_SYSFW_VER].get<std::string>();
277*666a4d95SVijay Khemka     int len;
278*666a4d95SVijay Khemka 
279*666a4d95SVijay Khemka     *ver++ = 0; // byte 1: Set selector not supported
280*666a4d95SVijay Khemka     *ver++ = 0; // byte 2: Only ASCII supported
281*666a4d95SVijay Khemka 
282*666a4d95SVijay Khemka     len = str.length();
283*666a4d95SVijay Khemka     *ver++ = len;
284*666a4d95SVijay Khemka     memcpy(ver, str.data(), len);
285*666a4d95SVijay Khemka 
286*666a4d95SVijay Khemka     return (len + 3);
287*666a4d95SVijay Khemka }
288*666a4d95SVijay Khemka 
289*666a4d95SVijay Khemka //----------------------------------------------------------------------
290*666a4d95SVijay Khemka // Set Sys Info Params (IPMI/Sec 22.14a) (CMD_APP_SET_SYS_INFO_PARAMS)
291*666a4d95SVijay Khemka //----------------------------------------------------------------------
292*666a4d95SVijay Khemka ipmi_ret_t ipmiAppSetSysInfoParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
293*666a4d95SVijay Khemka                                    ipmi_request_t request,
294*666a4d95SVijay Khemka                                    ipmi_response_t response,
295*666a4d95SVijay Khemka                                    ipmi_data_len_t data_len,
296*666a4d95SVijay Khemka                                    ipmi_context_t context)
297*666a4d95SVijay Khemka {
298*666a4d95SVijay Khemka     uint8_t *req = reinterpret_cast<uint8_t *>(request);
299*666a4d95SVijay Khemka 
300*666a4d95SVijay Khemka     uint8_t param = req[0];
301*666a4d95SVijay Khemka     uint8_t req_len = *data_len;
302*666a4d95SVijay Khemka 
303*666a4d95SVijay Khemka     *data_len = 0;
304*666a4d95SVijay Khemka 
305*666a4d95SVijay Khemka     switch (param)
306*666a4d95SVijay Khemka     {
307*666a4d95SVijay Khemka         case SYS_INFO_PARAM_SET_IN_PROG:
308*666a4d95SVijay Khemka             sysInfoParams.set_in_prog = req[1];
309*666a4d95SVijay Khemka             break;
310*666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYSFW_VER:
311*666a4d95SVijay Khemka             memcpy(sysInfoParams.sysfw_ver, &req[1], SIZE_SYSFW_VER);
312*666a4d95SVijay Khemka             if (platSetSysFWVer(sysInfoParams.sysfw_ver))
313*666a4d95SVijay Khemka                 return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
314*666a4d95SVijay Khemka             break;
315*666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYS_NAME:
316*666a4d95SVijay Khemka             memcpy(sysInfoParams.sys_name, &req[1], SIZE_SYS_NAME);
317*666a4d95SVijay Khemka             break;
318*666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRI_OS_NAME:
319*666a4d95SVijay Khemka             memcpy(sysInfoParams.pri_os_name, &req[1], SIZE_OS_NAME);
320*666a4d95SVijay Khemka             break;
321*666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_NAME:
322*666a4d95SVijay Khemka             memcpy(sysInfoParams.present_os_name, &req[1], SIZE_OS_NAME);
323*666a4d95SVijay Khemka             break;
324*666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_VER:
325*666a4d95SVijay Khemka             memcpy(sysInfoParams.present_os_ver, &req[1], SIZE_OS_VER);
326*666a4d95SVijay Khemka             break;
327*666a4d95SVijay Khemka         case SYS_INFO_PARAM_BMC_URL:
328*666a4d95SVijay Khemka             memcpy(sysInfoParams.bmc_url, &req[1], SIZE_BMC_URL);
329*666a4d95SVijay Khemka             break;
330*666a4d95SVijay Khemka         case SYS_INFO_PARAM_OS_HV_URL:
331*666a4d95SVijay Khemka             memcpy(sysInfoParams.os_hv_url, &req[1], SIZE_OS_HV_URL);
332*666a4d95SVijay Khemka             break;
333*666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST:
334*666a4d95SVijay Khemka             memcpy(sysInfoParams.bios_current_boot_list, &req[1], req_len);
335*666a4d95SVijay Khemka             appData[KEY_BIOS_BOOT_LEN] = req_len;
336*666a4d95SVijay Khemka             flush_app_data();
337*666a4d95SVijay Khemka             break;
338*666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE:
339*666a4d95SVijay Khemka             if (SIZE_BIOS_FIXED_BOOT_DEVICE != req_len)
340*666a4d95SVijay Khemka                 break;
341*666a4d95SVijay Khemka             memcpy(sysInfoParams.bios_fixed_boot_device, &req[1],
342*666a4d95SVijay Khemka                    SIZE_BIOS_FIXED_BOOT_DEVICE);
343*666a4d95SVijay Khemka             break;
344*666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING:
345*666a4d95SVijay Khemka             if (SIZE_BIOS_RSTR_DFLT_SETTING != req_len)
346*666a4d95SVijay Khemka                 break;
347*666a4d95SVijay Khemka             memcpy(sysInfoParams.bios_rstr_dflt_setting, &req[1],
348*666a4d95SVijay Khemka                    SIZE_BIOS_RSTR_DFLT_SETTING);
349*666a4d95SVijay Khemka             break;
350*666a4d95SVijay Khemka         case SYS_INFO_PARAM_LAST_BOOT_TIME:
351*666a4d95SVijay Khemka             if (SIZE_LAST_BOOT_TIME != req_len)
352*666a4d95SVijay Khemka                 break;
353*666a4d95SVijay Khemka             memcpy(sysInfoParams.last_boot_time, &req[1], SIZE_LAST_BOOT_TIME);
354*666a4d95SVijay Khemka             break;
355*666a4d95SVijay Khemka         default:
356*666a4d95SVijay Khemka             return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
357*666a4d95SVijay Khemka             break;
358*666a4d95SVijay Khemka     }
359*666a4d95SVijay Khemka 
360*666a4d95SVijay Khemka     return IPMI_CC_OK;
361*666a4d95SVijay Khemka }
362*666a4d95SVijay Khemka 
363*666a4d95SVijay Khemka //----------------------------------------------------------------------
364*666a4d95SVijay Khemka // Get Sys Info Params (IPMI/Sec 22.14b) (CMD_APP_GET_SYS_INFO_PARAMS)
365*666a4d95SVijay Khemka //----------------------------------------------------------------------
366*666a4d95SVijay Khemka ipmi_ret_t ipmiAppGetSysInfoParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
367*666a4d95SVijay Khemka                                    ipmi_request_t request,
368*666a4d95SVijay Khemka                                    ipmi_response_t response,
369*666a4d95SVijay Khemka                                    ipmi_data_len_t data_len,
370*666a4d95SVijay Khemka                                    ipmi_context_t context)
371*666a4d95SVijay Khemka {
372*666a4d95SVijay Khemka     uint8_t *req = reinterpret_cast<uint8_t *>(request);
373*666a4d95SVijay Khemka     uint8_t *res = reinterpret_cast<uint8_t *>(response);
374*666a4d95SVijay Khemka 
375*666a4d95SVijay Khemka     uint8_t param = req[1];
376*666a4d95SVijay Khemka     uint8_t len;
377*666a4d95SVijay Khemka 
378*666a4d95SVijay Khemka     *res++ = 1; // Parameter revision
379*666a4d95SVijay Khemka     *data_len = 1;
380*666a4d95SVijay Khemka 
381*666a4d95SVijay Khemka     switch (param)
382*666a4d95SVijay Khemka     {
383*666a4d95SVijay Khemka         case SYS_INFO_PARAM_SET_IN_PROG:
384*666a4d95SVijay Khemka             *res++ = sysInfoParams.set_in_prog;
385*666a4d95SVijay Khemka             *data_len += 1;
386*666a4d95SVijay Khemka             break;
387*666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYSFW_VER:
388*666a4d95SVijay Khemka             if ((len = platGetSysFWVer(res)) < 0)
389*666a4d95SVijay Khemka                 return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
390*666a4d95SVijay Khemka             *data_len += SIZE_SYSFW_VER;
391*666a4d95SVijay Khemka             break;
392*666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYS_NAME:
393*666a4d95SVijay Khemka             memcpy(res, sysInfoParams.sys_name, SIZE_SYS_NAME);
394*666a4d95SVijay Khemka             *data_len += SIZE_SYS_NAME;
395*666a4d95SVijay Khemka             break;
396*666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRI_OS_NAME:
397*666a4d95SVijay Khemka             memcpy(res, sysInfoParams.pri_os_name, SIZE_OS_NAME);
398*666a4d95SVijay Khemka             *data_len += SIZE_OS_NAME;
399*666a4d95SVijay Khemka             break;
400*666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_NAME:
401*666a4d95SVijay Khemka             memcpy(res, sysInfoParams.present_os_name, SIZE_OS_NAME);
402*666a4d95SVijay Khemka             *data_len += SIZE_OS_NAME;
403*666a4d95SVijay Khemka             break;
404*666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_VER:
405*666a4d95SVijay Khemka             memcpy(res, sysInfoParams.present_os_ver, SIZE_OS_VER);
406*666a4d95SVijay Khemka             *data_len += SIZE_OS_VER;
407*666a4d95SVijay Khemka             break;
408*666a4d95SVijay Khemka         case SYS_INFO_PARAM_BMC_URL:
409*666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bmc_url, SIZE_BMC_URL);
410*666a4d95SVijay Khemka             *data_len += SIZE_BMC_URL;
411*666a4d95SVijay Khemka             break;
412*666a4d95SVijay Khemka         case SYS_INFO_PARAM_OS_HV_URL:
413*666a4d95SVijay Khemka             memcpy(res, sysInfoParams.os_hv_url, SIZE_OS_HV_URL);
414*666a4d95SVijay Khemka             *data_len += SIZE_OS_HV_URL;
415*666a4d95SVijay Khemka             break;
416*666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST:
417*666a4d95SVijay Khemka             len = appData[KEY_BIOS_BOOT_LEN].get<uint8_t>();
418*666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bios_current_boot_list, len);
419*666a4d95SVijay Khemka             *data_len += len;
420*666a4d95SVijay Khemka             break;
421*666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE:
422*666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bios_fixed_boot_device,
423*666a4d95SVijay Khemka                    SIZE_BIOS_FIXED_BOOT_DEVICE);
424*666a4d95SVijay Khemka             *data_len += SIZE_BIOS_FIXED_BOOT_DEVICE;
425*666a4d95SVijay Khemka             break;
426*666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING:
427*666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bios_rstr_dflt_setting,
428*666a4d95SVijay Khemka                    SIZE_BIOS_RSTR_DFLT_SETTING);
429*666a4d95SVijay Khemka             *data_len += SIZE_BIOS_RSTR_DFLT_SETTING;
430*666a4d95SVijay Khemka             break;
431*666a4d95SVijay Khemka         case SYS_INFO_PARAM_LAST_BOOT_TIME:
432*666a4d95SVijay Khemka             memcpy(res, sysInfoParams.last_boot_time, SIZE_LAST_BOOT_TIME);
433*666a4d95SVijay Khemka             *data_len += SIZE_LAST_BOOT_TIME;
434*666a4d95SVijay Khemka             break;
435*666a4d95SVijay Khemka         default:
436*666a4d95SVijay Khemka             return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
437*666a4d95SVijay Khemka             break;
438*666a4d95SVijay Khemka     }
439*666a4d95SVijay Khemka     return IPMI_CC_OK;
440*666a4d95SVijay Khemka }
441*666a4d95SVijay Khemka 
442a2d52f12SVijay Khemka void registerAPPFunctions()
443a2d52f12SVijay Khemka {
444*666a4d95SVijay Khemka     /* Get App data stored in json file */
445*666a4d95SVijay Khemka     std::ifstream file(JSON_DATA_FILE);
446*666a4d95SVijay Khemka     if (file)
447*666a4d95SVijay Khemka         file >> appData;
448*666a4d95SVijay Khemka 
449*666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SELFTEST_RESULTS, NULL,
450*666a4d95SVijay Khemka                          ipmiAppGetSTResults,
451*666a4d95SVijay Khemka                          PRIVILEGE_USER); // Get Self Test Results
452*666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_MFR_TEST_ON, NULL,
453*666a4d95SVijay Khemka                          ipmiAppMfrTestOn,
454*666a4d95SVijay Khemka                          PRIVILEGE_USER); // Manufacturing Test On
455a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_DEV_GUID, NULL,
456a2d52f12SVijay Khemka                          ipmiAppGetDevGUID,
457a2d52f12SVijay Khemka                          PRIVILEGE_USER); // Get Device GUID
458a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_GLOBAL_ENABLES, NULL,
459a2d52f12SVijay Khemka                          ipmiAppSetGlobalEnables,
460*666a4d95SVijay Khemka                          PRIVILEGE_USER); // Set Global Enables
461a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_GLOBAL_ENABLES, NULL,
462a2d52f12SVijay Khemka                          ipmiAppGetGlobalEnables,
463a2d52f12SVijay Khemka                          PRIVILEGE_USER); // Get Global Enables
464*666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_CLEAR_MESSAGE_FLAGS, NULL,
465*666a4d95SVijay Khemka                          ipmiAppClearMsgFlags,
466*666a4d95SVijay Khemka                          PRIVILEGE_USER); // Clear Message flags
467a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_GUID, NULL,
468a2d52f12SVijay Khemka                          ipmiAppGetSysGUID,
469a2d52f12SVijay Khemka                          PRIVILEGE_USER); // Get System GUID
470*666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_SYS_INFO_PARAMS, NULL,
471*666a4d95SVijay Khemka                          ipmiAppSetSysInfoParams,
472*666a4d95SVijay Khemka                          PRIVILEGE_USER); // Set Sys Info Params
473*666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_INFO_PARAMS, NULL,
474*666a4d95SVijay Khemka                          ipmiAppGetSysInfoParams,
475*666a4d95SVijay Khemka                          PRIVILEGE_USER); // Get Sys Info Params
476a2d52f12SVijay Khemka     return;
477a2d52f12SVijay Khemka }
478a2d52f12SVijay Khemka 
479a2d52f12SVijay Khemka } // namespace ipmi
480