xref: /openbmc/fb-ipmi-oem/src/appcommands.cpp (revision e39f9393)
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>
285f8e3435SManikandan Elumalai #include <ipmid/api.hpp>
295f8e3435SManikandan 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 
515f8e3435SManikandan Elumalai int sendBicCmd(uint8_t, uint8_t, uint8_t, std::vector<uint8_t>&,
525f8e3435SManikandan Elumalai                std::vector<uint8_t>&);
535f8e3435SManikandan Elumalai 
54a2d52f12SVijay Khemka void printGUID(uint8_t* guid, off_t offset)
55a2d52f12SVijay Khemka {
56a2d52f12SVijay Khemka     std::cout << "Read GUID from offset : " << offset << " :\n";
57*e39f9393SWilly Tu     for (size_t 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 //----------------------------------------------------------------------
115*e39f9393SWilly Tu ipmi_ret_t ipmiAppGetSTResults(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t,
116*e39f9393SWilly Tu                                ipmi_response_t response,
117*e39f9393SWilly Tu                                ipmi_data_len_t data_len, ipmi_context_t)
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 //----------------------------------------------------------------------
133*e39f9393SWilly Tu ipmi_ret_t ipmiAppMfrTestOn(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request,
134*e39f9393SWilly Tu                             ipmi_response_t, ipmi_data_len_t data_len,
135*e39f9393SWilly Tu                             ipmi_context_t)
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 //----------------------------------------------------------------------
159*e39f9393SWilly Tu ipmi_ret_t ipmiAppSetGlobalEnables(ipmi_netfn_t, ipmi_cmd_t,
160*e39f9393SWilly Tu                                    ipmi_request_t request, ipmi_response_t,
161*e39f9393SWilly Tu                                    ipmi_data_len_t data_len, ipmi_context_t)
162a2d52f12SVijay Khemka {
163a2d52f12SVijay Khemka     uint8_t* req = reinterpret_cast<uint8_t*>(request);
164a2d52f12SVijay Khemka 
165a2d52f12SVijay Khemka     globEna = *req;
166a2d52f12SVijay Khemka     *data_len = 0;
167a2d52f12SVijay Khemka 
168a2d52f12SVijay Khemka     return IPMI_CC_OK;
169a2d52f12SVijay Khemka }
170a2d52f12SVijay Khemka 
171a2d52f12SVijay Khemka //----------------------------------------------------------------------
172a2d52f12SVijay Khemka // Get Global Enables (CMD_APP_GET_GLOBAL_ENABLES)
173a2d52f12SVijay Khemka //----------------------------------------------------------------------
174*e39f9393SWilly Tu ipmi_ret_t ipmiAppGetGlobalEnables(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t,
175a2d52f12SVijay Khemka                                    ipmi_response_t response,
176*e39f9393SWilly Tu                                    ipmi_data_len_t data_len, ipmi_context_t)
177a2d52f12SVijay Khemka {
178a2d52f12SVijay Khemka     uint8_t* res = reinterpret_cast<uint8_t*>(response);
179a2d52f12SVijay Khemka 
180a2d52f12SVijay Khemka     *data_len = 1;
181a2d52f12SVijay Khemka     *res++ = globEna;
182a2d52f12SVijay Khemka 
183a2d52f12SVijay Khemka     return IPMI_CC_OK;
184a2d52f12SVijay Khemka }
185a2d52f12SVijay Khemka 
186a2d52f12SVijay Khemka //----------------------------------------------------------------------
187666a4d95SVijay Khemka // Clear Message flags (IPMI/Section 22.3) (CMD_APP_CLEAR_MESSAGE_FLAGS)
188666a4d95SVijay Khemka //----------------------------------------------------------------------
189*e39f9393SWilly Tu ipmi_ret_t ipmiAppClearMsgFlags(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t,
190*e39f9393SWilly Tu                                 ipmi_response_t, ipmi_data_len_t data_len,
191*e39f9393SWilly Tu                                 ipmi_context_t)
192666a4d95SVijay Khemka {
193666a4d95SVijay Khemka     // Do Nothing and just return success
194666a4d95SVijay Khemka     *data_len = 0;
195666a4d95SVijay Khemka 
196666a4d95SVijay Khemka     return IPMI_CC_OK;
197666a4d95SVijay Khemka }
198666a4d95SVijay Khemka 
199666a4d95SVijay Khemka //----------------------------------------------------------------------
200a2d52f12SVijay Khemka // Get System GUID (CMD_APP_GET_SYS_GUID)
201a2d52f12SVijay Khemka //----------------------------------------------------------------------
2025f8e3435SManikandan Elumalai #if BIC_ENABLED
2035f8e3435SManikandan Elumalai ipmi::RspType<std::vector<uint8_t>>
2045f8e3435SManikandan Elumalai     ipmiAppGetSysGUID(ipmi::Context::ptr ctx, std::vector<uint8_t> reqData)
2055f8e3435SManikandan Elumalai 
2065f8e3435SManikandan Elumalai {
2075f8e3435SManikandan Elumalai     std::vector<uint8_t> respData;
2085f8e3435SManikandan Elumalai 
2095f8e3435SManikandan Elumalai     uint8_t bicAddr = (uint8_t)ctx->hostIdx << 2;
2105f8e3435SManikandan Elumalai 
2115f8e3435SManikandan Elumalai     if (sendBicCmd(ctx->netFn, ctx->cmd, bicAddr, reqData, respData))
2125f8e3435SManikandan Elumalai         return ipmi::responseUnspecifiedError();
2135f8e3435SManikandan Elumalai 
2145f8e3435SManikandan Elumalai     return ipmi::responseSuccess(respData);
2155f8e3435SManikandan Elumalai }
2165f8e3435SManikandan Elumalai 
2175f8e3435SManikandan Elumalai #else
218*e39f9393SWilly Tu ipmi_ret_t ipmiAppGetSysGUID(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t,
219*e39f9393SWilly Tu                              ipmi_response_t response, ipmi_data_len_t data_len,
220*e39f9393SWilly Tu                              ipmi_context_t)
221a2d52f12SVijay Khemka {
222a2d52f12SVijay Khemka     uint8_t* res = reinterpret_cast<uint8_t*>(response);
223a2d52f12SVijay Khemka     if (getSystemGUID(res))
224a2d52f12SVijay Khemka     {
225a2d52f12SVijay Khemka         return IPMI_CC_UNSPECIFIED_ERROR;
226a2d52f12SVijay Khemka     }
227a2d52f12SVijay Khemka     *data_len = GUID_SIZE;
228a2d52f12SVijay Khemka     return IPMI_CC_OK;
229a2d52f12SVijay Khemka }
230a2d52f12SVijay Khemka 
2315f8e3435SManikandan Elumalai #endif
2325f8e3435SManikandan Elumalai 
233666a4d95SVijay Khemka //----------------------------------------------------------------------
234666a4d95SVijay Khemka // Platform specific functions for storing app data
235666a4d95SVijay Khemka //----------------------------------------------------------------------
236666a4d95SVijay Khemka 
237666a4d95SVijay Khemka void flush_app_data()
238666a4d95SVijay Khemka {
239802ccb11SVijay Khemka     std::ofstream file(JSON_APP_DATA_FILE);
240666a4d95SVijay Khemka     file << appData;
241802ccb11SVijay Khemka     file.close();
242666a4d95SVijay Khemka     return;
243666a4d95SVijay Khemka }
244666a4d95SVijay Khemka 
245666a4d95SVijay Khemka static int platSetSysFWVer(uint8_t* ver)
246666a4d95SVijay Khemka {
247666a4d95SVijay Khemka     std::stringstream ss;
248666a4d95SVijay Khemka     int i;
249666a4d95SVijay Khemka 
250666a4d95SVijay Khemka     /* TODO: implement byte 1: Set selector
251666a4d95SVijay Khemka      * byte 2: encodeing, currently only supported
252666a4d95SVijay Khemka      * ASCII which is value 0, UTF and unicode are
253666a4d95SVijay Khemka      * not supported yet.
254666a4d95SVijay Khemka      */
255666a4d95SVijay Khemka     if (ver[1] & 0x0f)
256666a4d95SVijay Khemka         return -1;
257666a4d95SVijay Khemka 
258666a4d95SVijay Khemka     for (i = 3; i < 3 + ver[2]; i++)
259666a4d95SVijay Khemka     {
260666a4d95SVijay Khemka         ss << (char)ver[i];
261666a4d95SVijay Khemka     }
262666a4d95SVijay Khemka 
263666a4d95SVijay Khemka     appData[KEY_SYSFW_VER] = ss.str();
264666a4d95SVijay Khemka     flush_app_data();
265666a4d95SVijay Khemka 
266666a4d95SVijay Khemka     return 0;
267666a4d95SVijay Khemka }
268666a4d95SVijay Khemka 
269666a4d95SVijay Khemka static int platGetSysFWVer(uint8_t* ver)
270666a4d95SVijay Khemka {
271666a4d95SVijay Khemka     std::string str = appData[KEY_SYSFW_VER].get<std::string>();
272666a4d95SVijay Khemka     int len;
273666a4d95SVijay Khemka 
274666a4d95SVijay Khemka     *ver++ = 0; // byte 1: Set selector not supported
275666a4d95SVijay Khemka     *ver++ = 0; // byte 2: Only ASCII supported
276666a4d95SVijay Khemka 
277666a4d95SVijay Khemka     len = str.length();
278666a4d95SVijay Khemka     *ver++ = len;
279666a4d95SVijay Khemka     memcpy(ver, str.data(), len);
280666a4d95SVijay Khemka 
281666a4d95SVijay Khemka     return (len + 3);
282666a4d95SVijay Khemka }
283666a4d95SVijay Khemka 
284666a4d95SVijay Khemka //----------------------------------------------------------------------
285666a4d95SVijay Khemka // Set Sys Info Params (IPMI/Sec 22.14a) (CMD_APP_SET_SYS_INFO_PARAMS)
286666a4d95SVijay Khemka //----------------------------------------------------------------------
287*e39f9393SWilly Tu ipmi_ret_t ipmiAppSetSysInfoParams(ipmi_netfn_t, ipmi_cmd_t,
288*e39f9393SWilly Tu                                    ipmi_request_t request, ipmi_response_t,
289*e39f9393SWilly Tu                                    ipmi_data_len_t data_len, ipmi_context_t)
290666a4d95SVijay Khemka {
291666a4d95SVijay Khemka     uint8_t* req = reinterpret_cast<uint8_t*>(request);
292666a4d95SVijay Khemka 
293666a4d95SVijay Khemka     uint8_t param = req[0];
294666a4d95SVijay Khemka     uint8_t req_len = *data_len;
295666a4d95SVijay Khemka 
296666a4d95SVijay Khemka     *data_len = 0;
297666a4d95SVijay Khemka 
298666a4d95SVijay Khemka     switch (param)
299666a4d95SVijay Khemka     {
300666a4d95SVijay Khemka         case SYS_INFO_PARAM_SET_IN_PROG:
301666a4d95SVijay Khemka             sysInfoParams.set_in_prog = req[1];
302666a4d95SVijay Khemka             break;
303666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYSFW_VER:
304666a4d95SVijay Khemka             memcpy(sysInfoParams.sysfw_ver, &req[1], SIZE_SYSFW_VER);
305666a4d95SVijay Khemka             if (platSetSysFWVer(sysInfoParams.sysfw_ver))
306666a4d95SVijay Khemka                 return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
307666a4d95SVijay Khemka             break;
308666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYS_NAME:
309666a4d95SVijay Khemka             memcpy(sysInfoParams.sys_name, &req[1], SIZE_SYS_NAME);
310666a4d95SVijay Khemka             break;
311666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRI_OS_NAME:
312666a4d95SVijay Khemka             memcpy(sysInfoParams.pri_os_name, &req[1], SIZE_OS_NAME);
313666a4d95SVijay Khemka             break;
314666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_NAME:
315666a4d95SVijay Khemka             memcpy(sysInfoParams.present_os_name, &req[1], SIZE_OS_NAME);
316666a4d95SVijay Khemka             break;
317666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_VER:
318666a4d95SVijay Khemka             memcpy(sysInfoParams.present_os_ver, &req[1], SIZE_OS_VER);
319666a4d95SVijay Khemka             break;
320666a4d95SVijay Khemka         case SYS_INFO_PARAM_BMC_URL:
321666a4d95SVijay Khemka             memcpy(sysInfoParams.bmc_url, &req[1], SIZE_BMC_URL);
322666a4d95SVijay Khemka             break;
323666a4d95SVijay Khemka         case SYS_INFO_PARAM_OS_HV_URL:
324666a4d95SVijay Khemka             memcpy(sysInfoParams.os_hv_url, &req[1], SIZE_OS_HV_URL);
325666a4d95SVijay Khemka             break;
326666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST:
327666a4d95SVijay Khemka             memcpy(sysInfoParams.bios_current_boot_list, &req[1], req_len);
328666a4d95SVijay Khemka             appData[KEY_BIOS_BOOT_LEN] = req_len;
329666a4d95SVijay Khemka             flush_app_data();
330666a4d95SVijay Khemka             break;
331666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE:
332666a4d95SVijay Khemka             if (SIZE_BIOS_FIXED_BOOT_DEVICE != req_len)
333666a4d95SVijay Khemka                 break;
334666a4d95SVijay Khemka             memcpy(sysInfoParams.bios_fixed_boot_device, &req[1],
335666a4d95SVijay Khemka                    SIZE_BIOS_FIXED_BOOT_DEVICE);
336666a4d95SVijay Khemka             break;
337666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING:
338666a4d95SVijay Khemka             if (SIZE_BIOS_RSTR_DFLT_SETTING != req_len)
339666a4d95SVijay Khemka                 break;
340666a4d95SVijay Khemka             memcpy(sysInfoParams.bios_rstr_dflt_setting, &req[1],
341666a4d95SVijay Khemka                    SIZE_BIOS_RSTR_DFLT_SETTING);
342666a4d95SVijay Khemka             break;
343666a4d95SVijay Khemka         case SYS_INFO_PARAM_LAST_BOOT_TIME:
344666a4d95SVijay Khemka             if (SIZE_LAST_BOOT_TIME != req_len)
345666a4d95SVijay Khemka                 break;
346666a4d95SVijay Khemka             memcpy(sysInfoParams.last_boot_time, &req[1], SIZE_LAST_BOOT_TIME);
347666a4d95SVijay Khemka             break;
348666a4d95SVijay Khemka         default:
349666a4d95SVijay Khemka             return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
350666a4d95SVijay Khemka             break;
351666a4d95SVijay Khemka     }
352666a4d95SVijay Khemka 
353666a4d95SVijay Khemka     return IPMI_CC_OK;
354666a4d95SVijay Khemka }
355666a4d95SVijay Khemka 
356666a4d95SVijay Khemka //----------------------------------------------------------------------
357666a4d95SVijay Khemka // Get Sys Info Params (IPMI/Sec 22.14b) (CMD_APP_GET_SYS_INFO_PARAMS)
358666a4d95SVijay Khemka //----------------------------------------------------------------------
359*e39f9393SWilly Tu ipmi_ret_t ipmiAppGetSysInfoParams(ipmi_netfn_t, ipmi_cmd_t,
360666a4d95SVijay Khemka                                    ipmi_request_t request,
361666a4d95SVijay Khemka                                    ipmi_response_t response,
362*e39f9393SWilly Tu                                    ipmi_data_len_t data_len, ipmi_context_t)
363666a4d95SVijay Khemka {
364666a4d95SVijay Khemka     uint8_t* req = reinterpret_cast<uint8_t*>(request);
365666a4d95SVijay Khemka     uint8_t* res = reinterpret_cast<uint8_t*>(response);
366666a4d95SVijay Khemka 
367666a4d95SVijay Khemka     uint8_t param = req[1];
368*e39f9393SWilly Tu     int len;
369666a4d95SVijay Khemka 
370666a4d95SVijay Khemka     *res++ = 1; // Parameter revision
371666a4d95SVijay Khemka     *data_len = 1;
372666a4d95SVijay Khemka 
373666a4d95SVijay Khemka     switch (param)
374666a4d95SVijay Khemka     {
375666a4d95SVijay Khemka         case SYS_INFO_PARAM_SET_IN_PROG:
376666a4d95SVijay Khemka             *res++ = sysInfoParams.set_in_prog;
377666a4d95SVijay Khemka             *data_len += 1;
378666a4d95SVijay Khemka             break;
379666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYSFW_VER:
380666a4d95SVijay Khemka             if ((len = platGetSysFWVer(res)) < 0)
381666a4d95SVijay Khemka                 return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
382666a4d95SVijay Khemka             *data_len += SIZE_SYSFW_VER;
383666a4d95SVijay Khemka             break;
384666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYS_NAME:
385666a4d95SVijay Khemka             memcpy(res, sysInfoParams.sys_name, SIZE_SYS_NAME);
386666a4d95SVijay Khemka             *data_len += SIZE_SYS_NAME;
387666a4d95SVijay Khemka             break;
388666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRI_OS_NAME:
389666a4d95SVijay Khemka             memcpy(res, sysInfoParams.pri_os_name, SIZE_OS_NAME);
390666a4d95SVijay Khemka             *data_len += SIZE_OS_NAME;
391666a4d95SVijay Khemka             break;
392666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_NAME:
393666a4d95SVijay Khemka             memcpy(res, sysInfoParams.present_os_name, SIZE_OS_NAME);
394666a4d95SVijay Khemka             *data_len += SIZE_OS_NAME;
395666a4d95SVijay Khemka             break;
396666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_VER:
397666a4d95SVijay Khemka             memcpy(res, sysInfoParams.present_os_ver, SIZE_OS_VER);
398666a4d95SVijay Khemka             *data_len += SIZE_OS_VER;
399666a4d95SVijay Khemka             break;
400666a4d95SVijay Khemka         case SYS_INFO_PARAM_BMC_URL:
401666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bmc_url, SIZE_BMC_URL);
402666a4d95SVijay Khemka             *data_len += SIZE_BMC_URL;
403666a4d95SVijay Khemka             break;
404666a4d95SVijay Khemka         case SYS_INFO_PARAM_OS_HV_URL:
405666a4d95SVijay Khemka             memcpy(res, sysInfoParams.os_hv_url, SIZE_OS_HV_URL);
406666a4d95SVijay Khemka             *data_len += SIZE_OS_HV_URL;
407666a4d95SVijay Khemka             break;
408666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST:
409666a4d95SVijay Khemka             len = appData[KEY_BIOS_BOOT_LEN].get<uint8_t>();
410666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bios_current_boot_list, len);
411666a4d95SVijay Khemka             *data_len += len;
412666a4d95SVijay Khemka             break;
413666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE:
414666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bios_fixed_boot_device,
415666a4d95SVijay Khemka                    SIZE_BIOS_FIXED_BOOT_DEVICE);
416666a4d95SVijay Khemka             *data_len += SIZE_BIOS_FIXED_BOOT_DEVICE;
417666a4d95SVijay Khemka             break;
418666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING:
419666a4d95SVijay Khemka             memcpy(res, sysInfoParams.bios_rstr_dflt_setting,
420666a4d95SVijay Khemka                    SIZE_BIOS_RSTR_DFLT_SETTING);
421666a4d95SVijay Khemka             *data_len += SIZE_BIOS_RSTR_DFLT_SETTING;
422666a4d95SVijay Khemka             break;
423666a4d95SVijay Khemka         case SYS_INFO_PARAM_LAST_BOOT_TIME:
424666a4d95SVijay Khemka             memcpy(res, sysInfoParams.last_boot_time, SIZE_LAST_BOOT_TIME);
425666a4d95SVijay Khemka             *data_len += SIZE_LAST_BOOT_TIME;
426666a4d95SVijay Khemka             break;
427666a4d95SVijay Khemka         default:
428666a4d95SVijay Khemka             return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
429666a4d95SVijay Khemka             break;
430666a4d95SVijay Khemka     }
431666a4d95SVijay Khemka     return IPMI_CC_OK;
432666a4d95SVijay Khemka }
433666a4d95SVijay Khemka 
434a2d52f12SVijay Khemka void registerAPPFunctions()
435a2d52f12SVijay Khemka {
436666a4d95SVijay Khemka     /* Get App data stored in json file */
437802ccb11SVijay Khemka     std::ifstream file(JSON_APP_DATA_FILE);
438666a4d95SVijay Khemka     if (file)
439802ccb11SVijay Khemka     {
440666a4d95SVijay Khemka         file >> appData;
441802ccb11SVijay Khemka         file.close();
442802ccb11SVijay Khemka     }
443666a4d95SVijay Khemka 
444666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SELFTEST_RESULTS, NULL,
445666a4d95SVijay Khemka                          ipmiAppGetSTResults,
446666a4d95SVijay Khemka                          PRIVILEGE_USER); // Get Self Test Results
447666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_MFR_TEST_ON, NULL,
448666a4d95SVijay Khemka                          ipmiAppMfrTestOn,
449666a4d95SVijay Khemka                          PRIVILEGE_USER); // Manufacturing Test On
450a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_GLOBAL_ENABLES, NULL,
451a2d52f12SVijay Khemka                          ipmiAppSetGlobalEnables,
452666a4d95SVijay Khemka                          PRIVILEGE_USER); // Set Global Enables
453a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_GLOBAL_ENABLES, NULL,
454a2d52f12SVijay Khemka                          ipmiAppGetGlobalEnables,
455a2d52f12SVijay Khemka                          PRIVILEGE_USER); // Get Global Enables
456666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_CLEAR_MESSAGE_FLAGS, NULL,
457666a4d95SVijay Khemka                          ipmiAppClearMsgFlags,
458666a4d95SVijay Khemka                          PRIVILEGE_USER); // Clear Message flags
4595f8e3435SManikandan Elumalai #if BIC_ENABLED
4605f8e3435SManikandan Elumalai     ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnApp,
4615f8e3435SManikandan Elumalai                           ipmi::app::cmdGetSystemGuid, ipmi::Privilege::User,
4625f8e3435SManikandan Elumalai                           ipmiAppGetSysGUID);
4635f8e3435SManikandan Elumalai #else
464a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_GUID, NULL,
465a2d52f12SVijay Khemka                          ipmiAppGetSysGUID,
466a2d52f12SVijay Khemka                          PRIVILEGE_USER); // Get System GUID
4675f8e3435SManikandan Elumalai #endif
468666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_SYS_INFO_PARAMS, NULL,
469666a4d95SVijay Khemka                          ipmiAppSetSysInfoParams,
470666a4d95SVijay Khemka                          PRIVILEGE_USER); // Set Sys Info Params
471666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_INFO_PARAMS, NULL,
472666a4d95SVijay Khemka                          ipmiAppGetSysInfoParams,
473666a4d95SVijay Khemka                          PRIVILEGE_USER); // Get Sys Info Params
474a2d52f12SVijay Khemka     return;
475a2d52f12SVijay Khemka }
476a2d52f12SVijay Khemka 
477a2d52f12SVijay Khemka } // namespace ipmi
478