xref: /openbmc/fb-ipmi-oem/src/appcommands.cpp (revision 5f8e3435)
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 <fcntl.h>
1963c99be4SVijay Khemka #include <ipmid/api.h>
2063c99be4SVijay Khemka #include <sys/stat.h>
21a2d52f12SVijay Khemka #include <unistd.h>
2263c99be4SVijay Khemka 
2363c99be4SVijay Khemka #include <appcommands.hpp>
24a2d52f12SVijay Khemka #include <commandutils.hpp>
2563c99be4SVijay Khemka #include <nlohmann/json.hpp>
26a2d52f12SVijay Khemka #include <phosphor-logging/log.hpp>
27a2d52f12SVijay Khemka #include <sdbusplus/message/types.hpp>
28*5f8e3435SManikandan Elumalai #include <ipmid/api.hpp>
29*5f8e3435SManikandan Elumalai #include <ipmid/api-types.hpp>
3063c99be4SVijay Khemka 
3163c99be4SVijay Khemka #include <fstream>
3263c99be4SVijay Khemka #include <iomanip>
3363c99be4SVijay Khemka #include <iostream>
3463c99be4SVijay Khemka #include <sstream>
35a2d52f12SVijay Khemka 
36a2d52f12SVijay Khemka namespace ipmi
37a2d52f12SVijay Khemka {
38a2d52f12SVijay Khemka 
39a2d52f12SVijay Khemka static void registerAPPFunctions() __attribute__((constructor));
40a2d52f12SVijay Khemka static constexpr size_t GUID_SIZE = 16;
41a2d52f12SVijay Khemka // TODO Make offset and location runtime configurable to ensure we
42a2d52f12SVijay Khemka // can make each define their own locations.
43a2d52f12SVijay Khemka static constexpr off_t OFFSET_SYS_GUID = 0x17F0;
44a2d52f12SVijay Khemka static constexpr const char* FRU_EEPROM = "/sys/bus/i2c/devices/6-0054/eeprom";
45666a4d95SVijay Khemka 
46666a4d95SVijay Khemka // TODO: Need to store this info after identifying proper storage
47a2d52f12SVijay Khemka static uint8_t globEna = 0x09;
48666a4d95SVijay Khemka static SysInfoParam sysInfoParams;
49802ccb11SVijay Khemka nlohmann::json appData __attribute__((init_priority(101)));
50a2d52f12SVijay Khemka 
51*5f8e3435SManikandan Elumalai int sendBicCmd(uint8_t, uint8_t, uint8_t, std::vector<uint8_t>&,
52*5f8e3435SManikandan Elumalai                std::vector<uint8_t>&);
53*5f8e3435SManikandan Elumalai 
54a2d52f12SVijay Khemka void printGUID(uint8_t* guid, off_t offset)
55a2d52f12SVijay Khemka {
56a2d52f12SVijay Khemka     std::cout << "Read GUID from offset : " << offset << " :\n";
57a2d52f12SVijay Khemka     for (int i = 0; i < GUID_SIZE; i++)
58a2d52f12SVijay Khemka     {
59a2d52f12SVijay Khemka         int data = guid[i];
60a2d52f12SVijay Khemka         std::cout << std::hex << data << " ";
61a2d52f12SVijay Khemka     }
62a2d52f12SVijay Khemka     std::cout << std::endl;
63a2d52f12SVijay Khemka }
64a2d52f12SVijay Khemka 
65a2d52f12SVijay Khemka int getGUID(off_t offset, uint8_t* guid)
66a2d52f12SVijay Khemka {
67a2d52f12SVijay Khemka     int fd = -1;
68a2d52f12SVijay Khemka     ssize_t bytes_rd;
69a2d52f12SVijay Khemka     int ret = 0;
70a2d52f12SVijay Khemka 
71a2d52f12SVijay Khemka     errno = 0;
72a2d52f12SVijay Khemka 
73a2d52f12SVijay Khemka     // Check if file is present
74a2d52f12SVijay Khemka     if (access(FRU_EEPROM, F_OK) == -1)
75a2d52f12SVijay Khemka     {
76a2d52f12SVijay Khemka         std::cerr << "Unable to access: " << FRU_EEPROM << std::endl;
77a2d52f12SVijay Khemka         return errno;
78a2d52f12SVijay Khemka     }
79a2d52f12SVijay Khemka 
80a2d52f12SVijay Khemka     // Open the file
81a2d52f12SVijay Khemka     fd = open(FRU_EEPROM, O_RDONLY);
82a2d52f12SVijay Khemka     if (fd == -1)
83a2d52f12SVijay Khemka     {
84a2d52f12SVijay Khemka         std::cerr << "Unable to open: " << FRU_EEPROM << std::endl;
85a2d52f12SVijay Khemka         return errno;
86a2d52f12SVijay Khemka     }
87a2d52f12SVijay Khemka 
88a2d52f12SVijay Khemka     // seek to the offset
89a2d52f12SVijay Khemka     lseek(fd, offset, SEEK_SET);
90a2d52f12SVijay Khemka 
91a2d52f12SVijay Khemka     // Read bytes from location
92a2d52f12SVijay Khemka     bytes_rd = read(fd, guid, GUID_SIZE);
93a2d52f12SVijay Khemka     if (bytes_rd != GUID_SIZE)
94a2d52f12SVijay Khemka     {
95a2d52f12SVijay Khemka         phosphor::logging::log<phosphor::logging::level::ERR>(
96a2d52f12SVijay Khemka             "GUID read data from EEPROM failed");
97a2d52f12SVijay Khemka         ret = errno;
98a2d52f12SVijay Khemka     }
99a2d52f12SVijay Khemka     else
100a2d52f12SVijay Khemka     {
101a2d52f12SVijay Khemka         printGUID(guid, offset);
102a2d52f12SVijay Khemka     }
103a2d52f12SVijay Khemka     close(fd);
104a2d52f12SVijay Khemka     return ret;
105a2d52f12SVijay Khemka }
106a2d52f12SVijay Khemka 
107a2d52f12SVijay Khemka int getSystemGUID(uint8_t* guid)
108a2d52f12SVijay Khemka {
109a2d52f12SVijay Khemka     return getGUID(OFFSET_SYS_GUID, guid);
110a2d52f12SVijay Khemka }
111a2d52f12SVijay Khemka 
112a2d52f12SVijay Khemka //----------------------------------------------------------------------
113666a4d95SVijay Khemka // Get Self Test Results (IPMI/Section 20.4) (CMD_APP_GET_SELFTEST_RESULTS)
114666a4d95SVijay Khemka //----------------------------------------------------------------------
115666a4d95SVijay Khemka ipmi_ret_t ipmiAppGetSTResults(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
116666a4d95SVijay Khemka                                ipmi_request_t request, ipmi_response_t response,
117666a4d95SVijay Khemka                                ipmi_data_len_t data_len, ipmi_context_t context)
118666a4d95SVijay Khemka {
119666a4d95SVijay Khemka     uint8_t* res = reinterpret_cast<uint8_t*>(response);
120666a4d95SVijay Khemka 
121666a4d95SVijay Khemka     // TODO: Following data needs to be updated based on self-test results
122666a4d95SVijay Khemka     *res++ = 0x55; // Self-Test result
123666a4d95SVijay Khemka     *res++ = 0x00; // Extra error info in case of failure
124666a4d95SVijay Khemka 
125666a4d95SVijay Khemka     *data_len = 2;
126666a4d95SVijay Khemka 
127666a4d95SVijay Khemka     return IPMI_CC_OK;
128666a4d95SVijay Khemka }
129666a4d95SVijay Khemka 
130666a4d95SVijay Khemka //----------------------------------------------------------------------
131666a4d95SVijay Khemka // Manufacturing Test On (IPMI/Section 20.5) (CMD_APP_MFR_TEST_ON)
132666a4d95SVijay Khemka //----------------------------------------------------------------------
133666a4d95SVijay Khemka ipmi_ret_t ipmiAppMfrTestOn(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
134666a4d95SVijay Khemka                             ipmi_request_t request, ipmi_response_t response,
135666a4d95SVijay Khemka                             ipmi_data_len_t data_len, ipmi_context_t context)
136666a4d95SVijay Khemka {
137666a4d95SVijay Khemka     uint8_t* req = reinterpret_cast<uint8_t*>(request);
138666a4d95SVijay Khemka     std::string mfrTest = "sled-cycle";
139666a4d95SVijay Khemka 
140666a4d95SVijay Khemka     if (!memcmp(req, mfrTest.data(), mfrTest.length()) &&
141666a4d95SVijay Khemka         (*data_len == mfrTest.length()))
142666a4d95SVijay Khemka     {
143666a4d95SVijay Khemka         /* sled-cycle the BMC */
1442515e093SVijay Khemka         system("/usr/sbin/power-util sled-cycle");
145666a4d95SVijay Khemka     }
146666a4d95SVijay Khemka     else
147666a4d95SVijay Khemka     {
148666a4d95SVijay Khemka         return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
149666a4d95SVijay Khemka     }
150666a4d95SVijay Khemka 
151666a4d95SVijay Khemka     *data_len = 0;
152666a4d95SVijay Khemka 
153666a4d95SVijay Khemka     return IPMI_CC_OK;
154666a4d95SVijay Khemka }
155666a4d95SVijay Khemka 
156666a4d95SVijay Khemka //----------------------------------------------------------------------
157a2d52f12SVijay Khemka // Set Global Enables (CMD_APP_SET_GLOBAL_ENABLES)
158a2d52f12SVijay Khemka //----------------------------------------------------------------------
159a2d52f12SVijay Khemka ipmi_ret_t ipmiAppSetGlobalEnables(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
160a2d52f12SVijay Khemka                                    ipmi_request_t request,
161a2d52f12SVijay Khemka                                    ipmi_response_t response,
162a2d52f12SVijay Khemka                                    ipmi_data_len_t data_len,
163a2d52f12SVijay Khemka                                    ipmi_context_t context)
164a2d52f12SVijay Khemka {
165a2d52f12SVijay Khemka     uint8_t* req = reinterpret_cast<uint8_t*>(request);
166a2d52f12SVijay Khemka 
167a2d52f12SVijay Khemka     globEna = *req;
168a2d52f12SVijay Khemka     *data_len = 0;
169a2d52f12SVijay Khemka 
170a2d52f12SVijay Khemka     return IPMI_CC_OK;
171a2d52f12SVijay Khemka }
172a2d52f12SVijay Khemka 
173a2d52f12SVijay Khemka //----------------------------------------------------------------------
174a2d52f12SVijay Khemka // Get Global Enables (CMD_APP_GET_GLOBAL_ENABLES)
175a2d52f12SVijay Khemka //----------------------------------------------------------------------
176a2d52f12SVijay Khemka ipmi_ret_t ipmiAppGetGlobalEnables(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
177a2d52f12SVijay Khemka                                    ipmi_request_t request,
178a2d52f12SVijay Khemka                                    ipmi_response_t response,
179a2d52f12SVijay Khemka                                    ipmi_data_len_t data_len,
180a2d52f12SVijay Khemka                                    ipmi_context_t context)
181a2d52f12SVijay Khemka {
182a2d52f12SVijay Khemka     uint8_t* res = reinterpret_cast<uint8_t*>(response);
183a2d52f12SVijay Khemka 
184a2d52f12SVijay Khemka     *data_len = 1;
185a2d52f12SVijay Khemka     *res++ = globEna;
186a2d52f12SVijay Khemka 
187a2d52f12SVijay Khemka     return IPMI_CC_OK;
188a2d52f12SVijay Khemka }
189a2d52f12SVijay Khemka 
190a2d52f12SVijay Khemka //----------------------------------------------------------------------
191666a4d95SVijay Khemka // Clear Message flags (IPMI/Section 22.3) (CMD_APP_CLEAR_MESSAGE_FLAGS)
192666a4d95SVijay Khemka //----------------------------------------------------------------------
193666a4d95SVijay Khemka ipmi_ret_t ipmiAppClearMsgFlags(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
194666a4d95SVijay Khemka                                 ipmi_request_t request,
195666a4d95SVijay Khemka                                 ipmi_response_t response,
196666a4d95SVijay Khemka                                 ipmi_data_len_t data_len,
197666a4d95SVijay Khemka                                 ipmi_context_t context)
198666a4d95SVijay Khemka {
199666a4d95SVijay Khemka     // Do Nothing and just return success
200666a4d95SVijay Khemka     *data_len = 0;
201666a4d95SVijay Khemka 
202666a4d95SVijay Khemka     return IPMI_CC_OK;
203666a4d95SVijay Khemka }
204666a4d95SVijay Khemka 
205666a4d95SVijay Khemka //----------------------------------------------------------------------
206a2d52f12SVijay Khemka // Get System GUID (CMD_APP_GET_SYS_GUID)
207a2d52f12SVijay Khemka //----------------------------------------------------------------------
208*5f8e3435SManikandan Elumalai #if BIC_ENABLED
209*5f8e3435SManikandan Elumalai ipmi::RspType<std::vector<uint8_t>>
210*5f8e3435SManikandan Elumalai     ipmiAppGetSysGUID(ipmi::Context::ptr ctx, std::vector<uint8_t> reqData)
211*5f8e3435SManikandan Elumalai 
212*5f8e3435SManikandan Elumalai {
213*5f8e3435SManikandan Elumalai     std::vector<uint8_t> respData;
214*5f8e3435SManikandan Elumalai 
215*5f8e3435SManikandan Elumalai     uint8_t bicAddr = (uint8_t)ctx->hostIdx << 2;
216*5f8e3435SManikandan Elumalai 
217*5f8e3435SManikandan Elumalai     if (sendBicCmd(ctx->netFn, ctx->cmd, bicAddr, reqData, respData))
218*5f8e3435SManikandan Elumalai         return ipmi::responseUnspecifiedError();
219*5f8e3435SManikandan Elumalai 
220*5f8e3435SManikandan Elumalai     return ipmi::responseSuccess(respData);
221*5f8e3435SManikandan Elumalai }
222*5f8e3435SManikandan Elumalai 
223*5f8e3435SManikandan Elumalai #else
224a2d52f12SVijay Khemka ipmi_ret_t ipmiAppGetSysGUID(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
225a2d52f12SVijay Khemka                              ipmi_request_t request, ipmi_response_t response,
226a2d52f12SVijay Khemka                              ipmi_data_len_t data_len, ipmi_context_t context)
227a2d52f12SVijay Khemka {
228a2d52f12SVijay Khemka     uint8_t* res = reinterpret_cast<uint8_t*>(response);
229a2d52f12SVijay Khemka     if (getSystemGUID(res))
230a2d52f12SVijay Khemka     {
231a2d52f12SVijay Khemka         return IPMI_CC_UNSPECIFIED_ERROR;
232a2d52f12SVijay Khemka     }
233a2d52f12SVijay Khemka     *data_len = GUID_SIZE;
234a2d52f12SVijay Khemka     return IPMI_CC_OK;
235a2d52f12SVijay Khemka }
236a2d52f12SVijay Khemka 
237*5f8e3435SManikandan Elumalai #endif
238*5f8e3435SManikandan Elumalai 
239666a4d95SVijay Khemka //----------------------------------------------------------------------
240666a4d95SVijay Khemka // Platform specific functions for storing app data
241666a4d95SVijay Khemka //----------------------------------------------------------------------
242666a4d95SVijay Khemka 
243666a4d95SVijay Khemka void flush_app_data()
244666a4d95SVijay Khemka {
245802ccb11SVijay Khemka     std::ofstream file(JSON_APP_DATA_FILE);
246666a4d95SVijay Khemka     file << appData;
247802ccb11SVijay Khemka     file.close();
248666a4d95SVijay Khemka     return;
249666a4d95SVijay Khemka }
250666a4d95SVijay Khemka 
251666a4d95SVijay Khemka static int platSetSysFWVer(uint8_t* ver)
252666a4d95SVijay Khemka {
253666a4d95SVijay Khemka     std::stringstream ss;
254666a4d95SVijay Khemka     int i;
255666a4d95SVijay Khemka 
256666a4d95SVijay Khemka     /* TODO: implement byte 1: Set selector
257666a4d95SVijay Khemka      * byte 2: encodeing, currently only supported
258666a4d95SVijay Khemka      * ASCII which is value 0, UTF and unicode are
259666a4d95SVijay Khemka      * not supported yet.
260666a4d95SVijay Khemka      */
261666a4d95SVijay Khemka     if (ver[1] & 0x0f)
262666a4d95SVijay Khemka         return -1;
263666a4d95SVijay Khemka 
264666a4d95SVijay Khemka     for (i = 3; i < 3 + ver[2]; i++)
265666a4d95SVijay Khemka     {
266666a4d95SVijay Khemka         ss << (char)ver[i];
267666a4d95SVijay Khemka     }
268666a4d95SVijay Khemka 
269666a4d95SVijay Khemka     appData[KEY_SYSFW_VER] = ss.str();
270666a4d95SVijay Khemka     flush_app_data();
271666a4d95SVijay Khemka 
272666a4d95SVijay Khemka     return 0;
273666a4d95SVijay Khemka }
274666a4d95SVijay Khemka 
275666a4d95SVijay Khemka static int platGetSysFWVer(uint8_t* ver)
276666a4d95SVijay Khemka {
277666a4d95SVijay Khemka     std::string str = appData[KEY_SYSFW_VER].get<std::string>();
278666a4d95SVijay Khemka     int len;
279666a4d95SVijay Khemka 
280666a4d95SVijay Khemka     *ver++ = 0; // byte 1: Set selector not supported
281666a4d95SVijay Khemka     *ver++ = 0; // byte 2: Only ASCII supported
282666a4d95SVijay Khemka 
283666a4d95SVijay Khemka     len = str.length();
284666a4d95SVijay Khemka     *ver++ = len;
285666a4d95SVijay Khemka     memcpy(ver, str.data(), len);
286666a4d95SVijay Khemka 
287666a4d95SVijay Khemka     return (len + 3);
288666a4d95SVijay Khemka }
289666a4d95SVijay Khemka 
290666a4d95SVijay Khemka //----------------------------------------------------------------------
291666a4d95SVijay Khemka // Set Sys Info Params (IPMI/Sec 22.14a) (CMD_APP_SET_SYS_INFO_PARAMS)
292666a4d95SVijay Khemka //----------------------------------------------------------------------
293666a4d95SVijay Khemka ipmi_ret_t ipmiAppSetSysInfoParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
294666a4d95SVijay Khemka                                    ipmi_request_t request,
295666a4d95SVijay Khemka                                    ipmi_response_t response,
296666a4d95SVijay Khemka                                    ipmi_data_len_t data_len,
297666a4d95SVijay Khemka                                    ipmi_context_t context)
298666a4d95SVijay Khemka {
299666a4d95SVijay Khemka     uint8_t* req = reinterpret_cast<uint8_t*>(request);
300666a4d95SVijay Khemka 
301666a4d95SVijay Khemka     uint8_t param = req[0];
302666a4d95SVijay Khemka     uint8_t req_len = *data_len;
303666a4d95SVijay Khemka 
304666a4d95SVijay Khemka     *data_len = 0;
305666a4d95SVijay Khemka 
306666a4d95SVijay Khemka     switch (param)
307666a4d95SVijay Khemka     {
308666a4d95SVijay Khemka         case SYS_INFO_PARAM_SET_IN_PROG:
309666a4d95SVijay Khemka             sysInfoParams.set_in_prog = req[1];
310666a4d95SVijay Khemka             break;
311666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYSFW_VER:
312666a4d95SVijay Khemka             memcpy(sysInfoParams.sysfw_ver, &req[1], SIZE_SYSFW_VER);
313666a4d95SVijay Khemka             if (platSetSysFWVer(sysInfoParams.sysfw_ver))
314666a4d95SVijay Khemka                 return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
315666a4d95SVijay Khemka             break;
316666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYS_NAME:
317666a4d95SVijay Khemka             memcpy(sysInfoParams.sys_name, &req[1], SIZE_SYS_NAME);
318666a4d95SVijay Khemka             break;
319666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRI_OS_NAME:
320666a4d95SVijay Khemka             memcpy(sysInfoParams.pri_os_name, &req[1], SIZE_OS_NAME);
321666a4d95SVijay Khemka             break;
322666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_NAME:
323666a4d95SVijay Khemka             memcpy(sysInfoParams.present_os_name, &req[1], SIZE_OS_NAME);
324666a4d95SVijay Khemka             break;
325666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_VER:
326666a4d95SVijay Khemka             memcpy(sysInfoParams.present_os_ver, &req[1], SIZE_OS_VER);
327666a4d95SVijay Khemka             break;
328666a4d95SVijay Khemka         case SYS_INFO_PARAM_BMC_URL:
329666a4d95SVijay Khemka             memcpy(sysInfoParams.bmc_url, &req[1], SIZE_BMC_URL);
330666a4d95SVijay Khemka             break;
331666a4d95SVijay Khemka         case SYS_INFO_PARAM_OS_HV_URL:
332666a4d95SVijay Khemka             memcpy(sysInfoParams.os_hv_url, &req[1], SIZE_OS_HV_URL);
333666a4d95SVijay Khemka             break;
334666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST:
335666a4d95SVijay Khemka             memcpy(sysInfoParams.bios_current_boot_list, &req[1], req_len);
336666a4d95SVijay Khemka             appData[KEY_BIOS_BOOT_LEN] = req_len;
337666a4d95SVijay Khemka             flush_app_data();
338666a4d95SVijay Khemka             break;
339666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE:
340666a4d95SVijay Khemka             if (SIZE_BIOS_FIXED_BOOT_DEVICE != req_len)
341666a4d95SVijay Khemka                 break;
342666a4d95SVijay Khemka             memcpy(sysInfoParams.bios_fixed_boot_device, &req[1],
343666a4d95SVijay Khemka                    SIZE_BIOS_FIXED_BOOT_DEVICE);
344666a4d95SVijay Khemka             break;
345666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING:
346666a4d95SVijay Khemka             if (SIZE_BIOS_RSTR_DFLT_SETTING != req_len)
347666a4d95SVijay Khemka                 break;
348666a4d95SVijay Khemka             memcpy(sysInfoParams.bios_rstr_dflt_setting, &req[1],
349666a4d95SVijay Khemka                    SIZE_BIOS_RSTR_DFLT_SETTING);
350666a4d95SVijay Khemka             break;
351666a4d95SVijay Khemka         case SYS_INFO_PARAM_LAST_BOOT_TIME:
352666a4d95SVijay Khemka             if (SIZE_LAST_BOOT_TIME != req_len)
353666a4d95SVijay Khemka                 break;
354666a4d95SVijay Khemka             memcpy(sysInfoParams.last_boot_time, &req[1], SIZE_LAST_BOOT_TIME);
355666a4d95SVijay Khemka             break;
356666a4d95SVijay Khemka         default:
357666a4d95SVijay Khemka             return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
358666a4d95SVijay Khemka             break;
359666a4d95SVijay Khemka     }
360666a4d95SVijay Khemka 
361666a4d95SVijay Khemka     return IPMI_CC_OK;
362666a4d95SVijay Khemka }
363666a4d95SVijay Khemka 
364666a4d95SVijay Khemka //----------------------------------------------------------------------
365666a4d95SVijay Khemka // Get Sys Info Params (IPMI/Sec 22.14b) (CMD_APP_GET_SYS_INFO_PARAMS)
366666a4d95SVijay Khemka //----------------------------------------------------------------------
367666a4d95SVijay Khemka ipmi_ret_t ipmiAppGetSysInfoParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
368666a4d95SVijay Khemka                                    ipmi_request_t request,
369666a4d95SVijay Khemka                                    ipmi_response_t response,
370666a4d95SVijay Khemka                                    ipmi_data_len_t data_len,
371666a4d95SVijay Khemka                                    ipmi_context_t context)
372666a4d95SVijay Khemka {
373666a4d95SVijay Khemka     uint8_t* req = reinterpret_cast<uint8_t*>(request);
374666a4d95SVijay Khemka     uint8_t* res = reinterpret_cast<uint8_t*>(response);
375666a4d95SVijay Khemka 
376666a4d95SVijay Khemka     uint8_t param = req[1];
377666a4d95SVijay Khemka     uint8_t len;
378666a4d95SVijay Khemka 
379666a4d95SVijay Khemka     *res++ = 1; // Parameter revision
380666a4d95SVijay Khemka     *data_len = 1;
381666a4d95SVijay Khemka 
382666a4d95SVijay Khemka     switch (param)
383666a4d95SVijay Khemka     {
384666a4d95SVijay Khemka         case SYS_INFO_PARAM_SET_IN_PROG:
385666a4d95SVijay Khemka             *res++ = sysInfoParams.set_in_prog;
386666a4d95SVijay Khemka             *data_len += 1;
387666a4d95SVijay Khemka             break;
388666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYSFW_VER:
389666a4d95SVijay Khemka             if ((len = platGetSysFWVer(res)) < 0)
390666a4d95SVijay Khemka                 return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
391666a4d95SVijay Khemka             *data_len += SIZE_SYSFW_VER;
392666a4d95SVijay Khemka             break;
393666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYS_NAME:
394666a4d95SVijay Khemka             memcpy(res, sysInfoParams.sys_name, SIZE_SYS_NAME);
395666a4d95SVijay Khemka             *data_len += SIZE_SYS_NAME;
396666a4d95SVijay Khemka             break;
397666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRI_OS_NAME:
398666a4d95SVijay Khemka             memcpy(res, sysInfoParams.pri_os_name, SIZE_OS_NAME);
399666a4d95SVijay Khemka             *data_len += SIZE_OS_NAME;
400666a4d95SVijay Khemka             break;
401666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_NAME:
402666a4d95SVijay Khemka             memcpy(res, sysInfoParams.present_os_name, SIZE_OS_NAME);
403666a4d95SVijay Khemka             *data_len += SIZE_OS_NAME;
404666a4d95SVijay Khemka             break;
405666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_VER:
406666a4d95SVijay Khemka             memcpy(res, sysInfoParams.present_os_ver, SIZE_OS_VER);
407666a4d95SVijay Khemka             *data_len += SIZE_OS_VER;
408666a4d95SVijay Khemka             break;
409666a4d95SVijay Khemka         case SYS_INFO_PARAM_BMC_URL:
410666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bmc_url, SIZE_BMC_URL);
411666a4d95SVijay Khemka             *data_len += SIZE_BMC_URL;
412666a4d95SVijay Khemka             break;
413666a4d95SVijay Khemka         case SYS_INFO_PARAM_OS_HV_URL:
414666a4d95SVijay Khemka             memcpy(res, sysInfoParams.os_hv_url, SIZE_OS_HV_URL);
415666a4d95SVijay Khemka             *data_len += SIZE_OS_HV_URL;
416666a4d95SVijay Khemka             break;
417666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST:
418666a4d95SVijay Khemka             len = appData[KEY_BIOS_BOOT_LEN].get<uint8_t>();
419666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bios_current_boot_list, len);
420666a4d95SVijay Khemka             *data_len += len;
421666a4d95SVijay Khemka             break;
422666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE:
423666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bios_fixed_boot_device,
424666a4d95SVijay Khemka                    SIZE_BIOS_FIXED_BOOT_DEVICE);
425666a4d95SVijay Khemka             *data_len += SIZE_BIOS_FIXED_BOOT_DEVICE;
426666a4d95SVijay Khemka             break;
427666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING:
428666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bios_rstr_dflt_setting,
429666a4d95SVijay Khemka                    SIZE_BIOS_RSTR_DFLT_SETTING);
430666a4d95SVijay Khemka             *data_len += SIZE_BIOS_RSTR_DFLT_SETTING;
431666a4d95SVijay Khemka             break;
432666a4d95SVijay Khemka         case SYS_INFO_PARAM_LAST_BOOT_TIME:
433666a4d95SVijay Khemka             memcpy(res, sysInfoParams.last_boot_time, SIZE_LAST_BOOT_TIME);
434666a4d95SVijay Khemka             *data_len += SIZE_LAST_BOOT_TIME;
435666a4d95SVijay Khemka             break;
436666a4d95SVijay Khemka         default:
437666a4d95SVijay Khemka             return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
438666a4d95SVijay Khemka             break;
439666a4d95SVijay Khemka     }
440666a4d95SVijay Khemka     return IPMI_CC_OK;
441666a4d95SVijay Khemka }
442666a4d95SVijay Khemka 
443a2d52f12SVijay Khemka void registerAPPFunctions()
444a2d52f12SVijay Khemka {
445666a4d95SVijay Khemka     /* Get App data stored in json file */
446802ccb11SVijay Khemka     std::ifstream file(JSON_APP_DATA_FILE);
447666a4d95SVijay Khemka     if (file)
448802ccb11SVijay Khemka     {
449666a4d95SVijay Khemka         file >> appData;
450802ccb11SVijay Khemka         file.close();
451802ccb11SVijay Khemka     }
452666a4d95SVijay Khemka 
453666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SELFTEST_RESULTS, NULL,
454666a4d95SVijay Khemka                          ipmiAppGetSTResults,
455666a4d95SVijay Khemka                          PRIVILEGE_USER); // Get Self Test Results
456666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_MFR_TEST_ON, NULL,
457666a4d95SVijay Khemka                          ipmiAppMfrTestOn,
458666a4d95SVijay Khemka                          PRIVILEGE_USER); // Manufacturing Test On
459a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_GLOBAL_ENABLES, NULL,
460a2d52f12SVijay Khemka                          ipmiAppSetGlobalEnables,
461666a4d95SVijay Khemka                          PRIVILEGE_USER); // Set Global Enables
462a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_GLOBAL_ENABLES, NULL,
463a2d52f12SVijay Khemka                          ipmiAppGetGlobalEnables,
464a2d52f12SVijay Khemka                          PRIVILEGE_USER); // Get Global Enables
465666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_CLEAR_MESSAGE_FLAGS, NULL,
466666a4d95SVijay Khemka                          ipmiAppClearMsgFlags,
467666a4d95SVijay Khemka                          PRIVILEGE_USER); // Clear Message flags
468*5f8e3435SManikandan Elumalai #if BIC_ENABLED
469*5f8e3435SManikandan Elumalai     ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnApp,
470*5f8e3435SManikandan Elumalai                           ipmi::app::cmdGetSystemGuid, ipmi::Privilege::User,
471*5f8e3435SManikandan Elumalai                           ipmiAppGetSysGUID);
472*5f8e3435SManikandan Elumalai #else
473a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_GUID, NULL,
474a2d52f12SVijay Khemka                          ipmiAppGetSysGUID,
475a2d52f12SVijay Khemka                          PRIVILEGE_USER); // Get System GUID
476*5f8e3435SManikandan Elumalai #endif
477666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_SYS_INFO_PARAMS, NULL,
478666a4d95SVijay Khemka                          ipmiAppSetSysInfoParams,
479666a4d95SVijay Khemka                          PRIVILEGE_USER); // Set Sys Info Params
480666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_INFO_PARAMS, NULL,
481666a4d95SVijay Khemka                          ipmiAppGetSysInfoParams,
482666a4d95SVijay Khemka                          PRIVILEGE_USER); // Get Sys Info Params
483a2d52f12SVijay Khemka     return;
484a2d52f12SVijay Khemka }
485a2d52f12SVijay Khemka 
486a2d52f12SVijay Khemka } // namespace ipmi
487