xref: /openbmc/fb-ipmi-oem/src/appcommands.cpp (revision 63c99be4)
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>
19*63c99be4SVijay Khemka #include <ipmid/api.h>
20*63c99be4SVijay Khemka #include <sys/stat.h>
21a2d52f12SVijay Khemka #include <unistd.h>
22*63c99be4SVijay Khemka 
23*63c99be4SVijay Khemka #include <appcommands.hpp>
24a2d52f12SVijay Khemka #include <commandutils.hpp>
25*63c99be4SVijay Khemka #include <nlohmann/json.hpp>
26a2d52f12SVijay Khemka #include <phosphor-logging/log.hpp>
27a2d52f12SVijay Khemka #include <sdbusplus/message/types.hpp>
28*63c99be4SVijay Khemka 
29*63c99be4SVijay Khemka #include <fstream>
30*63c99be4SVijay Khemka #include <iomanip>
31*63c99be4SVijay Khemka #include <iostream>
32*63c99be4SVijay Khemka #include <sstream>
33a2d52f12SVijay Khemka 
34a2d52f12SVijay Khemka namespace ipmi
35a2d52f12SVijay Khemka {
36a2d52f12SVijay Khemka 
37a2d52f12SVijay Khemka static void registerAPPFunctions() __attribute__((constructor));
38a2d52f12SVijay Khemka static constexpr size_t GUID_SIZE = 16;
39a2d52f12SVijay Khemka // TODO Make offset and location runtime configurable to ensure we
40a2d52f12SVijay Khemka // can make each define their own locations.
41a2d52f12SVijay Khemka static constexpr off_t OFFSET_SYS_GUID = 0x17F0;
42a2d52f12SVijay Khemka static constexpr const char* FRU_EEPROM = "/sys/bus/i2c/devices/6-0054/eeprom";
43666a4d95SVijay Khemka 
44666a4d95SVijay Khemka // TODO: Need to store this info after identifying proper storage
45a2d52f12SVijay Khemka static uint8_t globEna = 0x09;
46666a4d95SVijay Khemka static SysInfoParam sysInfoParams;
47802ccb11SVijay Khemka nlohmann::json appData __attribute__((init_priority(101)));
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 //----------------------------------------------------------------------
108666a4d95SVijay Khemka // Get Self Test Results (IPMI/Section 20.4) (CMD_APP_GET_SELFTEST_RESULTS)
109666a4d95SVijay Khemka //----------------------------------------------------------------------
110666a4d95SVijay Khemka ipmi_ret_t ipmiAppGetSTResults(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
111666a4d95SVijay Khemka                                ipmi_request_t request, ipmi_response_t response,
112666a4d95SVijay Khemka                                ipmi_data_len_t data_len, ipmi_context_t context)
113666a4d95SVijay Khemka {
114666a4d95SVijay Khemka     uint8_t* res = reinterpret_cast<uint8_t*>(response);
115666a4d95SVijay Khemka 
116666a4d95SVijay Khemka     // TODO: Following data needs to be updated based on self-test results
117666a4d95SVijay Khemka     *res++ = 0x55; // Self-Test result
118666a4d95SVijay Khemka     *res++ = 0x00; // Extra error info in case of failure
119666a4d95SVijay Khemka 
120666a4d95SVijay Khemka     *data_len = 2;
121666a4d95SVijay Khemka 
122666a4d95SVijay Khemka     return IPMI_CC_OK;
123666a4d95SVijay Khemka }
124666a4d95SVijay Khemka 
125666a4d95SVijay Khemka //----------------------------------------------------------------------
126666a4d95SVijay Khemka // Manufacturing Test On (IPMI/Section 20.5) (CMD_APP_MFR_TEST_ON)
127666a4d95SVijay Khemka //----------------------------------------------------------------------
128666a4d95SVijay Khemka ipmi_ret_t ipmiAppMfrTestOn(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
129666a4d95SVijay Khemka                             ipmi_request_t request, ipmi_response_t response,
130666a4d95SVijay Khemka                             ipmi_data_len_t data_len, ipmi_context_t context)
131666a4d95SVijay Khemka {
132666a4d95SVijay Khemka     uint8_t* req = reinterpret_cast<uint8_t*>(request);
133666a4d95SVijay Khemka     std::string mfrTest = "sled-cycle";
134666a4d95SVijay Khemka 
135666a4d95SVijay Khemka     if (!memcmp(req, mfrTest.data(), mfrTest.length()) &&
136666a4d95SVijay Khemka         (*data_len == mfrTest.length()))
137666a4d95SVijay Khemka     {
138666a4d95SVijay Khemka         /* sled-cycle the BMC */
1392515e093SVijay Khemka         system("/usr/sbin/power-util sled-cycle");
140666a4d95SVijay Khemka     }
141666a4d95SVijay Khemka     else
142666a4d95SVijay Khemka     {
143666a4d95SVijay Khemka         return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
144666a4d95SVijay Khemka     }
145666a4d95SVijay Khemka 
146666a4d95SVijay Khemka     *data_len = 0;
147666a4d95SVijay Khemka 
148666a4d95SVijay Khemka     return IPMI_CC_OK;
149666a4d95SVijay Khemka }
150666a4d95SVijay Khemka 
151666a4d95SVijay Khemka //----------------------------------------------------------------------
152a2d52f12SVijay Khemka // Set Global Enables (CMD_APP_SET_GLOBAL_ENABLES)
153a2d52f12SVijay Khemka //----------------------------------------------------------------------
154a2d52f12SVijay Khemka ipmi_ret_t ipmiAppSetGlobalEnables(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
155a2d52f12SVijay Khemka                                    ipmi_request_t request,
156a2d52f12SVijay Khemka                                    ipmi_response_t response,
157a2d52f12SVijay Khemka                                    ipmi_data_len_t data_len,
158a2d52f12SVijay Khemka                                    ipmi_context_t context)
159a2d52f12SVijay Khemka {
160a2d52f12SVijay Khemka     uint8_t* req = reinterpret_cast<uint8_t*>(request);
161a2d52f12SVijay Khemka 
162a2d52f12SVijay Khemka     globEna = *req;
163a2d52f12SVijay Khemka     *data_len = 0;
164a2d52f12SVijay Khemka 
165a2d52f12SVijay Khemka     return IPMI_CC_OK;
166a2d52f12SVijay Khemka }
167a2d52f12SVijay Khemka 
168a2d52f12SVijay Khemka //----------------------------------------------------------------------
169a2d52f12SVijay Khemka // Get Global Enables (CMD_APP_GET_GLOBAL_ENABLES)
170a2d52f12SVijay Khemka //----------------------------------------------------------------------
171a2d52f12SVijay Khemka ipmi_ret_t ipmiAppGetGlobalEnables(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
172a2d52f12SVijay Khemka                                    ipmi_request_t request,
173a2d52f12SVijay Khemka                                    ipmi_response_t response,
174a2d52f12SVijay Khemka                                    ipmi_data_len_t data_len,
175a2d52f12SVijay Khemka                                    ipmi_context_t context)
176a2d52f12SVijay Khemka {
177a2d52f12SVijay Khemka     uint8_t* res = reinterpret_cast<uint8_t*>(response);
178a2d52f12SVijay Khemka 
179a2d52f12SVijay Khemka     *data_len = 1;
180a2d52f12SVijay Khemka     *res++ = globEna;
181a2d52f12SVijay Khemka 
182a2d52f12SVijay Khemka     return IPMI_CC_OK;
183a2d52f12SVijay Khemka }
184a2d52f12SVijay Khemka 
185a2d52f12SVijay Khemka //----------------------------------------------------------------------
186666a4d95SVijay Khemka // Clear Message flags (IPMI/Section 22.3) (CMD_APP_CLEAR_MESSAGE_FLAGS)
187666a4d95SVijay Khemka //----------------------------------------------------------------------
188666a4d95SVijay Khemka ipmi_ret_t ipmiAppClearMsgFlags(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
189666a4d95SVijay Khemka                                 ipmi_request_t request,
190666a4d95SVijay Khemka                                 ipmi_response_t response,
191666a4d95SVijay Khemka                                 ipmi_data_len_t data_len,
192666a4d95SVijay Khemka                                 ipmi_context_t context)
193666a4d95SVijay Khemka {
194666a4d95SVijay Khemka     // Do Nothing and just return success
195666a4d95SVijay Khemka     *data_len = 0;
196666a4d95SVijay Khemka 
197666a4d95SVijay Khemka     return IPMI_CC_OK;
198666a4d95SVijay Khemka }
199666a4d95SVijay Khemka 
200666a4d95SVijay Khemka //----------------------------------------------------------------------
201a2d52f12SVijay Khemka // Get System GUID (CMD_APP_GET_SYS_GUID)
202a2d52f12SVijay Khemka //----------------------------------------------------------------------
203a2d52f12SVijay Khemka ipmi_ret_t ipmiAppGetSysGUID(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
204a2d52f12SVijay Khemka                              ipmi_request_t request, ipmi_response_t response,
205a2d52f12SVijay Khemka                              ipmi_data_len_t data_len, ipmi_context_t context)
206a2d52f12SVijay Khemka {
207a2d52f12SVijay Khemka     uint8_t* res = reinterpret_cast<uint8_t*>(response);
208a2d52f12SVijay Khemka     if (getSystemGUID(res))
209a2d52f12SVijay Khemka     {
210a2d52f12SVijay Khemka         return IPMI_CC_UNSPECIFIED_ERROR;
211a2d52f12SVijay Khemka     }
212a2d52f12SVijay Khemka     *data_len = GUID_SIZE;
213a2d52f12SVijay Khemka     return IPMI_CC_OK;
214a2d52f12SVijay Khemka }
215a2d52f12SVijay Khemka 
216666a4d95SVijay Khemka //----------------------------------------------------------------------
217666a4d95SVijay Khemka // Platform specific functions for storing app data
218666a4d95SVijay Khemka //----------------------------------------------------------------------
219666a4d95SVijay Khemka 
220666a4d95SVijay Khemka void flush_app_data()
221666a4d95SVijay Khemka {
222802ccb11SVijay Khemka     std::ofstream file(JSON_APP_DATA_FILE);
223666a4d95SVijay Khemka     file << appData;
224802ccb11SVijay Khemka     file.close();
225666a4d95SVijay Khemka     return;
226666a4d95SVijay Khemka }
227666a4d95SVijay Khemka 
228666a4d95SVijay Khemka static int platSetSysFWVer(uint8_t* ver)
229666a4d95SVijay Khemka {
230666a4d95SVijay Khemka     std::stringstream ss;
231666a4d95SVijay Khemka     int i;
232666a4d95SVijay Khemka 
233666a4d95SVijay Khemka     /* TODO: implement byte 1: Set selector
234666a4d95SVijay Khemka      * byte 2: encodeing, currently only supported
235666a4d95SVijay Khemka      * ASCII which is value 0, UTF and unicode are
236666a4d95SVijay Khemka      * not supported yet.
237666a4d95SVijay Khemka      */
238666a4d95SVijay Khemka     if (ver[1] & 0x0f)
239666a4d95SVijay Khemka         return -1;
240666a4d95SVijay Khemka 
241666a4d95SVijay Khemka     for (i = 3; i < 3 + ver[2]; i++)
242666a4d95SVijay Khemka     {
243666a4d95SVijay Khemka         ss << (char)ver[i];
244666a4d95SVijay Khemka     }
245666a4d95SVijay Khemka 
246666a4d95SVijay Khemka     appData[KEY_SYSFW_VER] = ss.str();
247666a4d95SVijay Khemka     flush_app_data();
248666a4d95SVijay Khemka 
249666a4d95SVijay Khemka     return 0;
250666a4d95SVijay Khemka }
251666a4d95SVijay Khemka 
252666a4d95SVijay Khemka static int platGetSysFWVer(uint8_t* ver)
253666a4d95SVijay Khemka {
254666a4d95SVijay Khemka     std::string str = appData[KEY_SYSFW_VER].get<std::string>();
255666a4d95SVijay Khemka     int len;
256666a4d95SVijay Khemka 
257666a4d95SVijay Khemka     *ver++ = 0; // byte 1: Set selector not supported
258666a4d95SVijay Khemka     *ver++ = 0; // byte 2: Only ASCII supported
259666a4d95SVijay Khemka 
260666a4d95SVijay Khemka     len = str.length();
261666a4d95SVijay Khemka     *ver++ = len;
262666a4d95SVijay Khemka     memcpy(ver, str.data(), len);
263666a4d95SVijay Khemka 
264666a4d95SVijay Khemka     return (len + 3);
265666a4d95SVijay Khemka }
266666a4d95SVijay Khemka 
267666a4d95SVijay Khemka //----------------------------------------------------------------------
268666a4d95SVijay Khemka // Set Sys Info Params (IPMI/Sec 22.14a) (CMD_APP_SET_SYS_INFO_PARAMS)
269666a4d95SVijay Khemka //----------------------------------------------------------------------
270666a4d95SVijay Khemka ipmi_ret_t ipmiAppSetSysInfoParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
271666a4d95SVijay Khemka                                    ipmi_request_t request,
272666a4d95SVijay Khemka                                    ipmi_response_t response,
273666a4d95SVijay Khemka                                    ipmi_data_len_t data_len,
274666a4d95SVijay Khemka                                    ipmi_context_t context)
275666a4d95SVijay Khemka {
276666a4d95SVijay Khemka     uint8_t* req = reinterpret_cast<uint8_t*>(request);
277666a4d95SVijay Khemka 
278666a4d95SVijay Khemka     uint8_t param = req[0];
279666a4d95SVijay Khemka     uint8_t req_len = *data_len;
280666a4d95SVijay Khemka 
281666a4d95SVijay Khemka     *data_len = 0;
282666a4d95SVijay Khemka 
283666a4d95SVijay Khemka     switch (param)
284666a4d95SVijay Khemka     {
285666a4d95SVijay Khemka         case SYS_INFO_PARAM_SET_IN_PROG:
286666a4d95SVijay Khemka             sysInfoParams.set_in_prog = req[1];
287666a4d95SVijay Khemka             break;
288666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYSFW_VER:
289666a4d95SVijay Khemka             memcpy(sysInfoParams.sysfw_ver, &req[1], SIZE_SYSFW_VER);
290666a4d95SVijay Khemka             if (platSetSysFWVer(sysInfoParams.sysfw_ver))
291666a4d95SVijay Khemka                 return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
292666a4d95SVijay Khemka             break;
293666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYS_NAME:
294666a4d95SVijay Khemka             memcpy(sysInfoParams.sys_name, &req[1], SIZE_SYS_NAME);
295666a4d95SVijay Khemka             break;
296666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRI_OS_NAME:
297666a4d95SVijay Khemka             memcpy(sysInfoParams.pri_os_name, &req[1], SIZE_OS_NAME);
298666a4d95SVijay Khemka             break;
299666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_NAME:
300666a4d95SVijay Khemka             memcpy(sysInfoParams.present_os_name, &req[1], SIZE_OS_NAME);
301666a4d95SVijay Khemka             break;
302666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_VER:
303666a4d95SVijay Khemka             memcpy(sysInfoParams.present_os_ver, &req[1], SIZE_OS_VER);
304666a4d95SVijay Khemka             break;
305666a4d95SVijay Khemka         case SYS_INFO_PARAM_BMC_URL:
306666a4d95SVijay Khemka             memcpy(sysInfoParams.bmc_url, &req[1], SIZE_BMC_URL);
307666a4d95SVijay Khemka             break;
308666a4d95SVijay Khemka         case SYS_INFO_PARAM_OS_HV_URL:
309666a4d95SVijay Khemka             memcpy(sysInfoParams.os_hv_url, &req[1], SIZE_OS_HV_URL);
310666a4d95SVijay Khemka             break;
311666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST:
312666a4d95SVijay Khemka             memcpy(sysInfoParams.bios_current_boot_list, &req[1], req_len);
313666a4d95SVijay Khemka             appData[KEY_BIOS_BOOT_LEN] = req_len;
314666a4d95SVijay Khemka             flush_app_data();
315666a4d95SVijay Khemka             break;
316666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE:
317666a4d95SVijay Khemka             if (SIZE_BIOS_FIXED_BOOT_DEVICE != req_len)
318666a4d95SVijay Khemka                 break;
319666a4d95SVijay Khemka             memcpy(sysInfoParams.bios_fixed_boot_device, &req[1],
320666a4d95SVijay Khemka                    SIZE_BIOS_FIXED_BOOT_DEVICE);
321666a4d95SVijay Khemka             break;
322666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING:
323666a4d95SVijay Khemka             if (SIZE_BIOS_RSTR_DFLT_SETTING != req_len)
324666a4d95SVijay Khemka                 break;
325666a4d95SVijay Khemka             memcpy(sysInfoParams.bios_rstr_dflt_setting, &req[1],
326666a4d95SVijay Khemka                    SIZE_BIOS_RSTR_DFLT_SETTING);
327666a4d95SVijay Khemka             break;
328666a4d95SVijay Khemka         case SYS_INFO_PARAM_LAST_BOOT_TIME:
329666a4d95SVijay Khemka             if (SIZE_LAST_BOOT_TIME != req_len)
330666a4d95SVijay Khemka                 break;
331666a4d95SVijay Khemka             memcpy(sysInfoParams.last_boot_time, &req[1], SIZE_LAST_BOOT_TIME);
332666a4d95SVijay Khemka             break;
333666a4d95SVijay Khemka         default:
334666a4d95SVijay Khemka             return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
335666a4d95SVijay Khemka             break;
336666a4d95SVijay Khemka     }
337666a4d95SVijay Khemka 
338666a4d95SVijay Khemka     return IPMI_CC_OK;
339666a4d95SVijay Khemka }
340666a4d95SVijay Khemka 
341666a4d95SVijay Khemka //----------------------------------------------------------------------
342666a4d95SVijay Khemka // Get Sys Info Params (IPMI/Sec 22.14b) (CMD_APP_GET_SYS_INFO_PARAMS)
343666a4d95SVijay Khemka //----------------------------------------------------------------------
344666a4d95SVijay Khemka ipmi_ret_t ipmiAppGetSysInfoParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
345666a4d95SVijay Khemka                                    ipmi_request_t request,
346666a4d95SVijay Khemka                                    ipmi_response_t response,
347666a4d95SVijay Khemka                                    ipmi_data_len_t data_len,
348666a4d95SVijay Khemka                                    ipmi_context_t context)
349666a4d95SVijay Khemka {
350666a4d95SVijay Khemka     uint8_t* req = reinterpret_cast<uint8_t*>(request);
351666a4d95SVijay Khemka     uint8_t* res = reinterpret_cast<uint8_t*>(response);
352666a4d95SVijay Khemka 
353666a4d95SVijay Khemka     uint8_t param = req[1];
354666a4d95SVijay Khemka     uint8_t len;
355666a4d95SVijay Khemka 
356666a4d95SVijay Khemka     *res++ = 1; // Parameter revision
357666a4d95SVijay Khemka     *data_len = 1;
358666a4d95SVijay Khemka 
359666a4d95SVijay Khemka     switch (param)
360666a4d95SVijay Khemka     {
361666a4d95SVijay Khemka         case SYS_INFO_PARAM_SET_IN_PROG:
362666a4d95SVijay Khemka             *res++ = sysInfoParams.set_in_prog;
363666a4d95SVijay Khemka             *data_len += 1;
364666a4d95SVijay Khemka             break;
365666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYSFW_VER:
366666a4d95SVijay Khemka             if ((len = platGetSysFWVer(res)) < 0)
367666a4d95SVijay Khemka                 return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
368666a4d95SVijay Khemka             *data_len += SIZE_SYSFW_VER;
369666a4d95SVijay Khemka             break;
370666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYS_NAME:
371666a4d95SVijay Khemka             memcpy(res, sysInfoParams.sys_name, SIZE_SYS_NAME);
372666a4d95SVijay Khemka             *data_len += SIZE_SYS_NAME;
373666a4d95SVijay Khemka             break;
374666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRI_OS_NAME:
375666a4d95SVijay Khemka             memcpy(res, sysInfoParams.pri_os_name, SIZE_OS_NAME);
376666a4d95SVijay Khemka             *data_len += SIZE_OS_NAME;
377666a4d95SVijay Khemka             break;
378666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_NAME:
379666a4d95SVijay Khemka             memcpy(res, sysInfoParams.present_os_name, SIZE_OS_NAME);
380666a4d95SVijay Khemka             *data_len += SIZE_OS_NAME;
381666a4d95SVijay Khemka             break;
382666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_VER:
383666a4d95SVijay Khemka             memcpy(res, sysInfoParams.present_os_ver, SIZE_OS_VER);
384666a4d95SVijay Khemka             *data_len += SIZE_OS_VER;
385666a4d95SVijay Khemka             break;
386666a4d95SVijay Khemka         case SYS_INFO_PARAM_BMC_URL:
387666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bmc_url, SIZE_BMC_URL);
388666a4d95SVijay Khemka             *data_len += SIZE_BMC_URL;
389666a4d95SVijay Khemka             break;
390666a4d95SVijay Khemka         case SYS_INFO_PARAM_OS_HV_URL:
391666a4d95SVijay Khemka             memcpy(res, sysInfoParams.os_hv_url, SIZE_OS_HV_URL);
392666a4d95SVijay Khemka             *data_len += SIZE_OS_HV_URL;
393666a4d95SVijay Khemka             break;
394666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST:
395666a4d95SVijay Khemka             len = appData[KEY_BIOS_BOOT_LEN].get<uint8_t>();
396666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bios_current_boot_list, len);
397666a4d95SVijay Khemka             *data_len += len;
398666a4d95SVijay Khemka             break;
399666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE:
400666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bios_fixed_boot_device,
401666a4d95SVijay Khemka                    SIZE_BIOS_FIXED_BOOT_DEVICE);
402666a4d95SVijay Khemka             *data_len += SIZE_BIOS_FIXED_BOOT_DEVICE;
403666a4d95SVijay Khemka             break;
404666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING:
405666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bios_rstr_dflt_setting,
406666a4d95SVijay Khemka                    SIZE_BIOS_RSTR_DFLT_SETTING);
407666a4d95SVijay Khemka             *data_len += SIZE_BIOS_RSTR_DFLT_SETTING;
408666a4d95SVijay Khemka             break;
409666a4d95SVijay Khemka         case SYS_INFO_PARAM_LAST_BOOT_TIME:
410666a4d95SVijay Khemka             memcpy(res, sysInfoParams.last_boot_time, SIZE_LAST_BOOT_TIME);
411666a4d95SVijay Khemka             *data_len += SIZE_LAST_BOOT_TIME;
412666a4d95SVijay Khemka             break;
413666a4d95SVijay Khemka         default:
414666a4d95SVijay Khemka             return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
415666a4d95SVijay Khemka             break;
416666a4d95SVijay Khemka     }
417666a4d95SVijay Khemka     return IPMI_CC_OK;
418666a4d95SVijay Khemka }
419666a4d95SVijay Khemka 
420a2d52f12SVijay Khemka void registerAPPFunctions()
421a2d52f12SVijay Khemka {
422666a4d95SVijay Khemka     /* Get App data stored in json file */
423802ccb11SVijay Khemka     std::ifstream file(JSON_APP_DATA_FILE);
424666a4d95SVijay Khemka     if (file)
425802ccb11SVijay Khemka     {
426666a4d95SVijay Khemka         file >> appData;
427802ccb11SVijay Khemka         file.close();
428802ccb11SVijay Khemka     }
429666a4d95SVijay Khemka 
430666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SELFTEST_RESULTS, NULL,
431666a4d95SVijay Khemka                          ipmiAppGetSTResults,
432666a4d95SVijay Khemka                          PRIVILEGE_USER); // Get Self Test Results
433666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_MFR_TEST_ON, NULL,
434666a4d95SVijay Khemka                          ipmiAppMfrTestOn,
435666a4d95SVijay Khemka                          PRIVILEGE_USER); // Manufacturing Test On
436a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_GLOBAL_ENABLES, NULL,
437a2d52f12SVijay Khemka                          ipmiAppSetGlobalEnables,
438666a4d95SVijay Khemka                          PRIVILEGE_USER); // Set Global Enables
439a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_GLOBAL_ENABLES, NULL,
440a2d52f12SVijay Khemka                          ipmiAppGetGlobalEnables,
441a2d52f12SVijay Khemka                          PRIVILEGE_USER); // Get Global Enables
442666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_CLEAR_MESSAGE_FLAGS, NULL,
443666a4d95SVijay Khemka                          ipmiAppClearMsgFlags,
444666a4d95SVijay Khemka                          PRIVILEGE_USER); // Clear Message flags
445a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_GUID, NULL,
446a2d52f12SVijay Khemka                          ipmiAppGetSysGUID,
447a2d52f12SVijay Khemka                          PRIVILEGE_USER); // Get System GUID
448666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_SYS_INFO_PARAMS, NULL,
449666a4d95SVijay Khemka                          ipmiAppSetSysInfoParams,
450666a4d95SVijay Khemka                          PRIVILEGE_USER); // Set Sys Info Params
451666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_INFO_PARAMS, NULL,
452666a4d95SVijay Khemka                          ipmiAppGetSysInfoParams,
453666a4d95SVijay Khemka                          PRIVILEGE_USER); // Get Sys Info Params
454a2d52f12SVijay Khemka     return;
455a2d52f12SVijay Khemka }
456a2d52f12SVijay Khemka 
457a2d52f12SVijay Khemka } // namespace ipmi
458