xref: /openbmc/fb-ipmi-oem/src/appcommands.cpp (revision b2ae88b4)
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>
252405ae98SPatrick Williams #include <ipmid/api-types.hpp>
262405ae98SPatrick Williams #include <ipmid/api.hpp>
2763c99be4SVijay Khemka #include <nlohmann/json.hpp>
28a2d52f12SVijay Khemka #include <phosphor-logging/log.hpp>
29a2d52f12SVijay Khemka #include <sdbusplus/message/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 
responseSystemInfoParamterNotSupportCommand()54e9baaff1SBonnie Lo static inline auto responseSystemInfoParamterNotSupportCommand()
55e9baaff1SBonnie Lo {
56e9baaff1SBonnie Lo     return response(IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED);
57e9baaff1SBonnie Lo }
58e9baaff1SBonnie Lo 
printGUID(uint8_t * guid,off_t offset)59a2d52f12SVijay Khemka void printGUID(uint8_t* guid, off_t offset)
60a2d52f12SVijay Khemka {
61a2d52f12SVijay Khemka     std::cout << "Read GUID from offset : " << offset << " :\n";
62e39f9393SWilly Tu     for (size_t i = 0; i < GUID_SIZE; i++)
63a2d52f12SVijay Khemka     {
64a2d52f12SVijay Khemka         int data = guid[i];
65a2d52f12SVijay Khemka         std::cout << std::hex << data << " ";
66a2d52f12SVijay Khemka     }
67a2d52f12SVijay Khemka     std::cout << std::endl;
68a2d52f12SVijay Khemka }
69a2d52f12SVijay Khemka 
getGUID(off_t offset,uint8_t * guid)70a2d52f12SVijay Khemka int getGUID(off_t offset, uint8_t* guid)
71a2d52f12SVijay Khemka {
72a2d52f12SVijay Khemka     int fd = -1;
73a2d52f12SVijay Khemka     ssize_t bytes_rd;
74a2d52f12SVijay Khemka     int ret = 0;
75*b2ae88b4Scchoux     std::string eepromPath = FRU_EEPROM;
76*b2ae88b4Scchoux 
77*b2ae88b4Scchoux     // find the eeprom path of MB FRU
78*b2ae88b4Scchoux     auto device = getMbFruDevice();
79*b2ae88b4Scchoux     if (device)
80*b2ae88b4Scchoux     {
81*b2ae88b4Scchoux         auto [bus, address] = *device;
82*b2ae88b4Scchoux         std::stringstream ss;
83*b2ae88b4Scchoux         ss << "/sys/bus/i2c/devices/" << static_cast<int>(bus) << "-"
84*b2ae88b4Scchoux            << std::setw(4) << std::setfill('0') << std::hex
85*b2ae88b4Scchoux            << static_cast<int>(address) << "/eeprom";
86*b2ae88b4Scchoux         eepromPath = ss.str();
87*b2ae88b4Scchoux     }
88a2d52f12SVijay Khemka 
89a2d52f12SVijay Khemka     errno = 0;
90a2d52f12SVijay Khemka 
91a2d52f12SVijay Khemka     // Check if file is present
92*b2ae88b4Scchoux     if (access(eepromPath.c_str(), F_OK) == -1)
93a2d52f12SVijay Khemka     {
94*b2ae88b4Scchoux         std::cerr << "Unable to access: " << eepromPath << std::endl;
95a2d52f12SVijay Khemka         return errno;
96a2d52f12SVijay Khemka     }
97a2d52f12SVijay Khemka 
98a2d52f12SVijay Khemka     // Open the file
99*b2ae88b4Scchoux     fd = open(eepromPath.c_str(), O_RDONLY);
100a2d52f12SVijay Khemka     if (fd == -1)
101a2d52f12SVijay Khemka     {
102*b2ae88b4Scchoux         std::cerr << "Unable to open: " << eepromPath << std::endl;
103a2d52f12SVijay Khemka         return errno;
104a2d52f12SVijay Khemka     }
105a2d52f12SVijay Khemka 
106a2d52f12SVijay Khemka     // seek to the offset
107a2d52f12SVijay Khemka     lseek(fd, offset, SEEK_SET);
108a2d52f12SVijay Khemka 
109a2d52f12SVijay Khemka     // Read bytes from location
110a2d52f12SVijay Khemka     bytes_rd = read(fd, guid, GUID_SIZE);
111a2d52f12SVijay Khemka     if (bytes_rd != GUID_SIZE)
112a2d52f12SVijay Khemka     {
113a2d52f12SVijay Khemka         phosphor::logging::log<phosphor::logging::level::ERR>(
114a2d52f12SVijay Khemka             "GUID read data from EEPROM failed");
115a2d52f12SVijay Khemka         ret = errno;
116a2d52f12SVijay Khemka     }
117a2d52f12SVijay Khemka     else
118a2d52f12SVijay Khemka     {
119a2d52f12SVijay Khemka         printGUID(guid, offset);
120a2d52f12SVijay Khemka     }
121a2d52f12SVijay Khemka     close(fd);
122a2d52f12SVijay Khemka     return ret;
123a2d52f12SVijay Khemka }
124a2d52f12SVijay Khemka 
getSystemGUID(uint8_t * guid)125a2d52f12SVijay Khemka int getSystemGUID(uint8_t* guid)
126a2d52f12SVijay Khemka {
127a2d52f12SVijay Khemka     return getGUID(OFFSET_SYS_GUID, guid);
128a2d52f12SVijay Khemka }
129a2d52f12SVijay Khemka 
130a2d52f12SVijay Khemka //----------------------------------------------------------------------
131666a4d95SVijay Khemka // Get Self Test Results (IPMI/Section 20.4) (CMD_APP_GET_SELFTEST_RESULTS)
132666a4d95SVijay Khemka //----------------------------------------------------------------------
ipmiAppGetSTResults(ipmi_netfn_t,ipmi_cmd_t,ipmi_request_t,ipmi_response_t response,ipmi_data_len_t data_len,ipmi_context_t)133e39f9393SWilly Tu ipmi_ret_t ipmiAppGetSTResults(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t,
134e39f9393SWilly Tu                                ipmi_response_t response,
135e39f9393SWilly Tu                                ipmi_data_len_t data_len, ipmi_context_t)
136666a4d95SVijay Khemka {
137666a4d95SVijay Khemka     uint8_t* res = reinterpret_cast<uint8_t*>(response);
138666a4d95SVijay Khemka 
139666a4d95SVijay Khemka     // TODO: Following data needs to be updated based on self-test results
140666a4d95SVijay Khemka     *res++ = 0x55; // Self-Test result
141666a4d95SVijay Khemka     *res++ = 0x00; // Extra error info in case of failure
142666a4d95SVijay Khemka 
143666a4d95SVijay Khemka     *data_len = 2;
144666a4d95SVijay Khemka 
145666a4d95SVijay Khemka     return IPMI_CC_OK;
146666a4d95SVijay Khemka }
147666a4d95SVijay Khemka 
148666a4d95SVijay Khemka //----------------------------------------------------------------------
149666a4d95SVijay Khemka // Manufacturing Test On (IPMI/Section 20.5) (CMD_APP_MFR_TEST_ON)
150666a4d95SVijay Khemka //----------------------------------------------------------------------
ipmiAppMfrTestOn(ipmi_netfn_t,ipmi_cmd_t,ipmi_request_t request,ipmi_response_t,ipmi_data_len_t data_len,ipmi_context_t)151e39f9393SWilly Tu ipmi_ret_t ipmiAppMfrTestOn(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request,
152e39f9393SWilly Tu                             ipmi_response_t, ipmi_data_len_t data_len,
153e39f9393SWilly Tu                             ipmi_context_t)
154666a4d95SVijay Khemka {
155666a4d95SVijay Khemka     uint8_t* req = reinterpret_cast<uint8_t*>(request);
156666a4d95SVijay Khemka     std::string mfrTest = "sled-cycle";
15735208459SPatrick Williams     ipmi_ret_t rc = IPMI_CC_OK;
158666a4d95SVijay Khemka 
159666a4d95SVijay Khemka     if (!memcmp(req, mfrTest.data(), mfrTest.length()) &&
160666a4d95SVijay Khemka         (*data_len == mfrTest.length()))
161666a4d95SVijay Khemka     {
162666a4d95SVijay Khemka         /* sled-cycle the BMC */
16335208459SPatrick Williams         auto ret = system("/usr/sbin/power-util sled-cycle");
16435208459SPatrick Williams         if (ret)
16535208459SPatrick Williams         {
16635208459SPatrick Williams             rc = IPMI_CC_UNSPECIFIED_ERROR;
16735208459SPatrick Williams         }
168666a4d95SVijay Khemka     }
169666a4d95SVijay Khemka     else
170666a4d95SVijay Khemka     {
17135208459SPatrick Williams         rc = IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED;
172666a4d95SVijay Khemka     }
173666a4d95SVijay Khemka 
174666a4d95SVijay Khemka     *data_len = 0;
175666a4d95SVijay Khemka 
17635208459SPatrick Williams     return rc;
177666a4d95SVijay Khemka }
178666a4d95SVijay Khemka 
179666a4d95SVijay Khemka //----------------------------------------------------------------------
180a2d52f12SVijay Khemka // Set Global Enables (CMD_APP_SET_GLOBAL_ENABLES)
181a2d52f12SVijay Khemka //----------------------------------------------------------------------
ipmiAppSetGlobalEnables(ipmi_netfn_t,ipmi_cmd_t,ipmi_request_t request,ipmi_response_t,ipmi_data_len_t data_len,ipmi_context_t)182e39f9393SWilly Tu ipmi_ret_t ipmiAppSetGlobalEnables(ipmi_netfn_t, ipmi_cmd_t,
183e39f9393SWilly Tu                                    ipmi_request_t request, ipmi_response_t,
184e39f9393SWilly Tu                                    ipmi_data_len_t data_len, ipmi_context_t)
185a2d52f12SVijay Khemka {
186a2d52f12SVijay Khemka     uint8_t* req = reinterpret_cast<uint8_t*>(request);
187a2d52f12SVijay Khemka 
188a2d52f12SVijay Khemka     globEna = *req;
189a2d52f12SVijay Khemka     *data_len = 0;
190a2d52f12SVijay Khemka 
191a2d52f12SVijay Khemka     return IPMI_CC_OK;
192a2d52f12SVijay Khemka }
193a2d52f12SVijay Khemka 
194a2d52f12SVijay Khemka //----------------------------------------------------------------------
195a2d52f12SVijay Khemka // Get Global Enables (CMD_APP_GET_GLOBAL_ENABLES)
196a2d52f12SVijay Khemka //----------------------------------------------------------------------
ipmiAppGetGlobalEnables(ipmi_netfn_t,ipmi_cmd_t,ipmi_request_t,ipmi_response_t response,ipmi_data_len_t data_len,ipmi_context_t)197e39f9393SWilly Tu ipmi_ret_t ipmiAppGetGlobalEnables(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t,
198a2d52f12SVijay Khemka                                    ipmi_response_t response,
199e39f9393SWilly Tu                                    ipmi_data_len_t data_len, ipmi_context_t)
200a2d52f12SVijay Khemka {
201a2d52f12SVijay Khemka     uint8_t* res = reinterpret_cast<uint8_t*>(response);
202a2d52f12SVijay Khemka 
203a2d52f12SVijay Khemka     *data_len = 1;
204a2d52f12SVijay Khemka     *res++ = globEna;
205a2d52f12SVijay Khemka 
206a2d52f12SVijay Khemka     return IPMI_CC_OK;
207a2d52f12SVijay Khemka }
208a2d52f12SVijay Khemka 
209a2d52f12SVijay Khemka //----------------------------------------------------------------------
210666a4d95SVijay Khemka // Clear Message flags (IPMI/Section 22.3) (CMD_APP_CLEAR_MESSAGE_FLAGS)
211666a4d95SVijay Khemka //----------------------------------------------------------------------
ipmiAppClearMsgFlags(ipmi_netfn_t,ipmi_cmd_t,ipmi_request_t,ipmi_response_t,ipmi_data_len_t data_len,ipmi_context_t)212e39f9393SWilly Tu ipmi_ret_t ipmiAppClearMsgFlags(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t,
213e39f9393SWilly Tu                                 ipmi_response_t, ipmi_data_len_t data_len,
214e39f9393SWilly Tu                                 ipmi_context_t)
215666a4d95SVijay Khemka {
216666a4d95SVijay Khemka     // Do Nothing and just return success
217666a4d95SVijay Khemka     *data_len = 0;
218666a4d95SVijay Khemka 
219666a4d95SVijay Khemka     return IPMI_CC_OK;
220666a4d95SVijay Khemka }
221666a4d95SVijay Khemka 
222666a4d95SVijay Khemka //----------------------------------------------------------------------
223a2d52f12SVijay Khemka // Get System GUID (CMD_APP_GET_SYS_GUID)
224a2d52f12SVijay Khemka //----------------------------------------------------------------------
2255f8e3435SManikandan Elumalai #if BIC_ENABLED
2265f8e3435SManikandan Elumalai ipmi::RspType<std::vector<uint8_t>>
ipmiAppGetSysGUID(ipmi::Context::ptr ctx,std::vector<uint8_t> reqData)2275f8e3435SManikandan Elumalai     ipmiAppGetSysGUID(ipmi::Context::ptr ctx, std::vector<uint8_t> reqData)
2285f8e3435SManikandan Elumalai 
2295f8e3435SManikandan Elumalai {
2305f8e3435SManikandan Elumalai     std::vector<uint8_t> respData;
2315f8e3435SManikandan Elumalai 
2325f8e3435SManikandan Elumalai     uint8_t bicAddr = (uint8_t)ctx->hostIdx << 2;
2335f8e3435SManikandan Elumalai 
2345f8e3435SManikandan Elumalai     if (sendBicCmd(ctx->netFn, ctx->cmd, bicAddr, reqData, respData))
2355f8e3435SManikandan Elumalai         return ipmi::responseUnspecifiedError();
2365f8e3435SManikandan Elumalai 
2375f8e3435SManikandan Elumalai     return ipmi::responseSuccess(respData);
2385f8e3435SManikandan Elumalai }
2395f8e3435SManikandan Elumalai 
2405f8e3435SManikandan Elumalai #else
ipmiAppGetSysGUID(ipmi_netfn_t,ipmi_cmd_t,ipmi_request_t,ipmi_response_t response,ipmi_data_len_t data_len,ipmi_context_t)241e39f9393SWilly Tu ipmi_ret_t ipmiAppGetSysGUID(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t,
242e39f9393SWilly Tu                              ipmi_response_t response, ipmi_data_len_t data_len,
243e39f9393SWilly Tu                              ipmi_context_t)
244a2d52f12SVijay Khemka {
245a2d52f12SVijay Khemka     uint8_t* res = reinterpret_cast<uint8_t*>(response);
246a2d52f12SVijay Khemka     if (getSystemGUID(res))
247a2d52f12SVijay Khemka     {
248a2d52f12SVijay Khemka         return IPMI_CC_UNSPECIFIED_ERROR;
249a2d52f12SVijay Khemka     }
250a2d52f12SVijay Khemka     *data_len = GUID_SIZE;
251a2d52f12SVijay Khemka     return IPMI_CC_OK;
252a2d52f12SVijay Khemka }
253a2d52f12SVijay Khemka 
2545f8e3435SManikandan Elumalai #endif
2555f8e3435SManikandan Elumalai 
256666a4d95SVijay Khemka //----------------------------------------------------------------------
257666a4d95SVijay Khemka // Platform specific functions for storing app data
258666a4d95SVijay Khemka //----------------------------------------------------------------------
259666a4d95SVijay Khemka 
flush_app_data()260666a4d95SVijay Khemka void flush_app_data()
261666a4d95SVijay Khemka {
262802ccb11SVijay Khemka     std::ofstream file(JSON_APP_DATA_FILE);
263666a4d95SVijay Khemka     file << appData;
264802ccb11SVijay Khemka     file.close();
265666a4d95SVijay Khemka     return;
266666a4d95SVijay Khemka }
267666a4d95SVijay Khemka 
platSetSysFWVer(uint8_t * ver,const std::string key)268e9baaff1SBonnie Lo static int platSetSysFWVer(uint8_t* ver, const std::string key)
269666a4d95SVijay Khemka {
270666a4d95SVijay Khemka     std::stringstream ss;
271666a4d95SVijay Khemka     int i;
272666a4d95SVijay Khemka 
273666a4d95SVijay Khemka     /* TODO: implement byte 1: Set selector
274666a4d95SVijay Khemka      * byte 2: encodeing, currently only supported
275666a4d95SVijay Khemka      * ASCII which is value 0, UTF and unicode are
276666a4d95SVijay Khemka      * not supported yet.
277666a4d95SVijay Khemka      */
278666a4d95SVijay Khemka     if (ver[1] & 0x0f)
279666a4d95SVijay Khemka         return -1;
280666a4d95SVijay Khemka 
281666a4d95SVijay Khemka     for (i = 3; i < 3 + ver[2]; i++)
282666a4d95SVijay Khemka     {
283666a4d95SVijay Khemka         ss << (char)ver[i];
284666a4d95SVijay Khemka     }
285666a4d95SVijay Khemka 
286e9baaff1SBonnie Lo     appData[key] = ss.str();
287666a4d95SVijay Khemka     flush_app_data();
288666a4d95SVijay Khemka 
289666a4d95SVijay Khemka     return 0;
290666a4d95SVijay Khemka }
291666a4d95SVijay Khemka 
platGetSysFWVer(std::vector<uint8_t> & respData,const std::string key)292e9baaff1SBonnie Lo static int platGetSysFWVer(std::vector<uint8_t>& respData,
293e9baaff1SBonnie Lo                            const std::string key)
294666a4d95SVijay Khemka {
295e9baaff1SBonnie Lo     int len = -1;
296666a4d95SVijay Khemka 
297e9baaff1SBonnie Lo     if (!appData.contains(std::string(key)))
298e9baaff1SBonnie Lo     {
299e9baaff1SBonnie Lo         return -1;
300e9baaff1SBonnie Lo     }
301e9baaff1SBonnie Lo     std::string str = appData[key].get<std::string>();
302e9baaff1SBonnie Lo 
303e9baaff1SBonnie Lo     respData.push_back(0); // byte 1: Set selector not supported
304e9baaff1SBonnie Lo     respData.push_back(0); // byte 2: Only ASCII supported
305666a4d95SVijay Khemka 
306666a4d95SVijay Khemka     len = str.length();
307e9baaff1SBonnie Lo     respData.push_back(len); // byte 3: Size of version
308e9baaff1SBonnie Lo 
309e9baaff1SBonnie Lo     for (auto c : str)
310e9baaff1SBonnie Lo     {
311e9baaff1SBonnie Lo         respData.push_back(c);
312e9baaff1SBonnie Lo     }
313e9baaff1SBonnie Lo 
314e9baaff1SBonnie Lo     // Remaining byte fill to 0
315e9baaff1SBonnie Lo     for (int i = 0; i < SIZE_SYSFW_VER - (len + 3); i++)
316e9baaff1SBonnie Lo     {
317e9baaff1SBonnie Lo         respData.push_back(0);
318e9baaff1SBonnie Lo     }
319666a4d95SVijay Khemka 
320666a4d95SVijay Khemka     return (len + 3);
321666a4d95SVijay Khemka }
322666a4d95SVijay Khemka 
323666a4d95SVijay Khemka //----------------------------------------------------------------------
324666a4d95SVijay Khemka // Set Sys Info Params (IPMI/Sec 22.14a) (CMD_APP_SET_SYS_INFO_PARAMS)
325666a4d95SVijay Khemka //----------------------------------------------------------------------
ipmiAppSetSysInfoParams(ipmi::Context::ptr ctx,std::vector<uint8_t> req)326e9baaff1SBonnie Lo ipmi::RspType<uint8_t> ipmiAppSetSysInfoParams(ipmi::Context::ptr ctx,
327e9baaff1SBonnie Lo                                                std::vector<uint8_t> req)
328666a4d95SVijay Khemka {
329666a4d95SVijay Khemka     uint8_t param = req[0];
330e9baaff1SBonnie Lo     uint8_t req_len = req.size();
331e9baaff1SBonnie Lo     std::optional<size_t> hostId = findHost(ctx->hostIdx);
332666a4d95SVijay Khemka 
333e9baaff1SBonnie Lo     if (!hostId)
334e9baaff1SBonnie Lo     {
335e9baaff1SBonnie Lo         phosphor::logging::log<phosphor::logging::level::ERR>(
336e9baaff1SBonnie Lo             "Invalid Host Id received");
337e9baaff1SBonnie Lo         return ipmi::responseInvalidCommand();
338e9baaff1SBonnie Lo     }
339666a4d95SVijay Khemka 
340666a4d95SVijay Khemka     switch (param)
341666a4d95SVijay Khemka     {
342666a4d95SVijay Khemka         case SYS_INFO_PARAM_SET_IN_PROG:
343666a4d95SVijay Khemka             sysInfoParams.set_in_prog = req[1];
344666a4d95SVijay Khemka             break;
345666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYSFW_VER:
346e9baaff1SBonnie Lo         {
347666a4d95SVijay Khemka             memcpy(sysInfoParams.sysfw_ver, &req[1], SIZE_SYSFW_VER);
348e9baaff1SBonnie Lo             std::string version_key = KEY_SYSFW_VER + std::to_string(*hostId);
349e9baaff1SBonnie Lo             if (platSetSysFWVer(sysInfoParams.sysfw_ver, version_key))
350e9baaff1SBonnie Lo                 return ipmi::responseSystemInfoParamterNotSupportCommand();
351666a4d95SVijay Khemka             break;
352e9baaff1SBonnie Lo         }
353666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYS_NAME:
354666a4d95SVijay Khemka             memcpy(sysInfoParams.sys_name, &req[1], SIZE_SYS_NAME);
355666a4d95SVijay Khemka             break;
356666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRI_OS_NAME:
357666a4d95SVijay Khemka             memcpy(sysInfoParams.pri_os_name, &req[1], SIZE_OS_NAME);
358666a4d95SVijay Khemka             break;
359666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_NAME:
360666a4d95SVijay Khemka             memcpy(sysInfoParams.present_os_name, &req[1], SIZE_OS_NAME);
361666a4d95SVijay Khemka             break;
362666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_VER:
363666a4d95SVijay Khemka             memcpy(sysInfoParams.present_os_ver, &req[1], SIZE_OS_VER);
364666a4d95SVijay Khemka             break;
365666a4d95SVijay Khemka         case SYS_INFO_PARAM_BMC_URL:
366666a4d95SVijay Khemka             memcpy(sysInfoParams.bmc_url, &req[1], SIZE_BMC_URL);
367666a4d95SVijay Khemka             break;
368666a4d95SVijay Khemka         case SYS_INFO_PARAM_OS_HV_URL:
369666a4d95SVijay Khemka             memcpy(sysInfoParams.os_hv_url, &req[1], SIZE_OS_HV_URL);
370666a4d95SVijay Khemka             break;
371666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST:
372666a4d95SVijay Khemka             memcpy(sysInfoParams.bios_current_boot_list, &req[1], req_len);
373666a4d95SVijay Khemka             appData[KEY_BIOS_BOOT_LEN] = req_len;
374666a4d95SVijay Khemka             flush_app_data();
375666a4d95SVijay Khemka             break;
376666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE:
377666a4d95SVijay Khemka             if (SIZE_BIOS_FIXED_BOOT_DEVICE != req_len)
378666a4d95SVijay Khemka                 break;
379666a4d95SVijay Khemka             memcpy(sysInfoParams.bios_fixed_boot_device, &req[1],
380666a4d95SVijay Khemka                    SIZE_BIOS_FIXED_BOOT_DEVICE);
381666a4d95SVijay Khemka             break;
382666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING:
383666a4d95SVijay Khemka             if (SIZE_BIOS_RSTR_DFLT_SETTING != req_len)
384666a4d95SVijay Khemka                 break;
385666a4d95SVijay Khemka             memcpy(sysInfoParams.bios_rstr_dflt_setting, &req[1],
386666a4d95SVijay Khemka                    SIZE_BIOS_RSTR_DFLT_SETTING);
387666a4d95SVijay Khemka             break;
388666a4d95SVijay Khemka         case SYS_INFO_PARAM_LAST_BOOT_TIME:
389666a4d95SVijay Khemka             if (SIZE_LAST_BOOT_TIME != req_len)
390666a4d95SVijay Khemka                 break;
391666a4d95SVijay Khemka             memcpy(sysInfoParams.last_boot_time, &req[1], SIZE_LAST_BOOT_TIME);
392666a4d95SVijay Khemka             break;
393666a4d95SVijay Khemka         default:
394e9baaff1SBonnie Lo             return ipmi::responseSystemInfoParamterNotSupportCommand();
395666a4d95SVijay Khemka             break;
396666a4d95SVijay Khemka     }
397666a4d95SVijay Khemka 
398e9baaff1SBonnie Lo     return ipmi::responseSuccess();
399666a4d95SVijay Khemka }
400666a4d95SVijay Khemka 
401666a4d95SVijay Khemka //----------------------------------------------------------------------
402666a4d95SVijay Khemka // Get Sys Info Params (IPMI/Sec 22.14b) (CMD_APP_GET_SYS_INFO_PARAMS)
403666a4d95SVijay Khemka //----------------------------------------------------------------------
404e9baaff1SBonnie Lo ipmi::RspType<std::vector<uint8_t>>
ipmiAppGetSysInfoParams(ipmi::Context::ptr ctx,uint8_t,uint8_t param,uint8_t,uint8_t)405e9baaff1SBonnie Lo     ipmiAppGetSysInfoParams(ipmi::Context::ptr ctx, uint8_t, uint8_t param,
406e9baaff1SBonnie Lo                             uint8_t, uint8_t)
407666a4d95SVijay Khemka {
408e39f9393SWilly Tu     int len;
409e9baaff1SBonnie Lo     std::vector<uint8_t> respData;
410e9baaff1SBonnie Lo     respData.push_back(1); // Parameter revision
411666a4d95SVijay Khemka 
412e9baaff1SBonnie Lo     std::optional<size_t> hostId = findHost(ctx->hostIdx);
413e9baaff1SBonnie Lo 
414e9baaff1SBonnie Lo     if (!hostId)
415e9baaff1SBonnie Lo     {
416e9baaff1SBonnie Lo         phosphor::logging::log<phosphor::logging::level::ERR>(
417e9baaff1SBonnie Lo             "Invalid Host Id received");
418e9baaff1SBonnie Lo         return ipmi::responseInvalidCommand();
419e9baaff1SBonnie Lo     }
420666a4d95SVijay Khemka 
421666a4d95SVijay Khemka     switch (param)
422666a4d95SVijay Khemka     {
423666a4d95SVijay Khemka         case SYS_INFO_PARAM_SET_IN_PROG:
424e9baaff1SBonnie Lo             respData.push_back(sysInfoParams.set_in_prog);
425666a4d95SVijay Khemka             break;
426666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYSFW_VER:
427e9baaff1SBonnie Lo         {
428e9baaff1SBonnie Lo             std::string version_key = KEY_SYSFW_VER + std::to_string(*hostId);
429e9baaff1SBonnie Lo             if ((platGetSysFWVer(respData, version_key)) < 0)
430e9baaff1SBonnie Lo                 return ipmi::responseSystemInfoParamterNotSupportCommand();
431666a4d95SVijay Khemka             break;
432e9baaff1SBonnie Lo         }
433666a4d95SVijay Khemka         case SYS_INFO_PARAM_SYS_NAME:
434e9baaff1SBonnie Lo             respData.insert(respData.end(), std::begin(sysInfoParams.sys_name),
435e9baaff1SBonnie Lo                             std::end(sysInfoParams.sys_name));
436666a4d95SVijay Khemka             break;
437666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRI_OS_NAME:
438e9baaff1SBonnie Lo             respData.insert(respData.end(),
439e9baaff1SBonnie Lo                             std::begin(sysInfoParams.pri_os_name),
440e9baaff1SBonnie Lo                             std::end(sysInfoParams.pri_os_name));
441666a4d95SVijay Khemka             break;
442666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_NAME:
443e9baaff1SBonnie Lo             respData.insert(respData.end(),
444e9baaff1SBonnie Lo                             std::begin(sysInfoParams.present_os_name),
445e9baaff1SBonnie Lo                             std::end(sysInfoParams.present_os_name));
446666a4d95SVijay Khemka             break;
447666a4d95SVijay Khemka         case SYS_INFO_PARAM_PRESENT_OS_VER:
448e9baaff1SBonnie Lo             respData.insert(respData.end(),
449e9baaff1SBonnie Lo                             std::begin(sysInfoParams.present_os_ver),
450e9baaff1SBonnie Lo                             std::end(sysInfoParams.present_os_ver));
451666a4d95SVijay Khemka             break;
452666a4d95SVijay Khemka         case SYS_INFO_PARAM_BMC_URL:
453e9baaff1SBonnie Lo             respData.insert(respData.end(), std::begin(sysInfoParams.bmc_url),
454e9baaff1SBonnie Lo                             std::end(sysInfoParams.bmc_url));
455666a4d95SVijay Khemka             break;
456666a4d95SVijay Khemka         case SYS_INFO_PARAM_OS_HV_URL:
457e9baaff1SBonnie Lo             respData.insert(respData.end(), std::begin(sysInfoParams.os_hv_url),
458e9baaff1SBonnie Lo                             std::end(sysInfoParams.os_hv_url));
459666a4d95SVijay Khemka             break;
460666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST:
461666a4d95SVijay Khemka             len = appData[KEY_BIOS_BOOT_LEN].get<uint8_t>();
462e9baaff1SBonnie Lo             respData.insert(respData.end(),
463e9baaff1SBonnie Lo                             std::begin(sysInfoParams.bios_current_boot_list),
464e9baaff1SBonnie Lo                             std::begin(sysInfoParams.bios_current_boot_list) +
465e9baaff1SBonnie Lo                                 len);
466666a4d95SVijay Khemka             break;
467666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE:
468e9baaff1SBonnie Lo             respData.insert(respData.end(),
469e9baaff1SBonnie Lo                             std::begin(sysInfoParams.bios_fixed_boot_device),
470e9baaff1SBonnie Lo                             std::end(sysInfoParams.bios_fixed_boot_device));
471666a4d95SVijay Khemka             break;
472666a4d95SVijay Khemka         case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING:
473e9baaff1SBonnie Lo             respData.insert(respData.end(),
474e9baaff1SBonnie Lo                             std::begin(sysInfoParams.bios_rstr_dflt_setting),
475e9baaff1SBonnie Lo                             std::end(sysInfoParams.bios_rstr_dflt_setting));
476666a4d95SVijay Khemka             break;
477666a4d95SVijay Khemka         case SYS_INFO_PARAM_LAST_BOOT_TIME:
478e9baaff1SBonnie Lo             respData.insert(respData.end(),
479e9baaff1SBonnie Lo                             std::begin(sysInfoParams.last_boot_time),
480e9baaff1SBonnie Lo                             std::end(sysInfoParams.last_boot_time));
481666a4d95SVijay Khemka             break;
482666a4d95SVijay Khemka         default:
483e9baaff1SBonnie Lo             return ipmi::responseSystemInfoParamterNotSupportCommand();
484666a4d95SVijay Khemka             break;
485666a4d95SVijay Khemka     }
486e9baaff1SBonnie Lo 
487e9baaff1SBonnie Lo     return ipmi::responseSuccess(respData);
488666a4d95SVijay Khemka }
489666a4d95SVijay Khemka 
registerAPPFunctions()490a2d52f12SVijay Khemka void registerAPPFunctions()
491a2d52f12SVijay Khemka {
492666a4d95SVijay Khemka     /* Get App data stored in json file */
493802ccb11SVijay Khemka     std::ifstream file(JSON_APP_DATA_FILE);
494666a4d95SVijay Khemka     if (file)
495802ccb11SVijay Khemka     {
496666a4d95SVijay Khemka         file >> appData;
497802ccb11SVijay Khemka         file.close();
498802ccb11SVijay Khemka     }
499666a4d95SVijay Khemka 
500666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SELFTEST_RESULTS, NULL,
501666a4d95SVijay Khemka                          ipmiAppGetSTResults,
502666a4d95SVijay Khemka                          PRIVILEGE_USER); // Get Self Test Results
503666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_MFR_TEST_ON, NULL,
504666a4d95SVijay Khemka                          ipmiAppMfrTestOn,
505666a4d95SVijay Khemka                          PRIVILEGE_USER); // Manufacturing Test On
506a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_GLOBAL_ENABLES, NULL,
507a2d52f12SVijay Khemka                          ipmiAppSetGlobalEnables,
508666a4d95SVijay Khemka                          PRIVILEGE_USER); // Set Global Enables
509a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_GLOBAL_ENABLES, NULL,
510a2d52f12SVijay Khemka                          ipmiAppGetGlobalEnables,
511a2d52f12SVijay Khemka                          PRIVILEGE_USER); // Get Global Enables
512666a4d95SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_CLEAR_MESSAGE_FLAGS, NULL,
513666a4d95SVijay Khemka                          ipmiAppClearMsgFlags,
514666a4d95SVijay Khemka                          PRIVILEGE_USER); // Clear Message flags
5155f8e3435SManikandan Elumalai #if BIC_ENABLED
5165f8e3435SManikandan Elumalai     ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnApp,
5175f8e3435SManikandan Elumalai                           ipmi::app::cmdGetSystemGuid, ipmi::Privilege::User,
5185f8e3435SManikandan Elumalai                           ipmiAppGetSysGUID);
5195f8e3435SManikandan Elumalai #else
520a2d52f12SVijay Khemka     ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_GUID, NULL,
521a2d52f12SVijay Khemka                          ipmiAppGetSysGUID,
522a2d52f12SVijay Khemka                          PRIVILEGE_USER); // Get System GUID
5235f8e3435SManikandan Elumalai #endif
524e9baaff1SBonnie Lo     ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnApp,
525e9baaff1SBonnie Lo                           ipmi::app::cmdSetSystemInfoParameters,
526e9baaff1SBonnie Lo                           ipmi::Privilege::User, ipmiAppSetSysInfoParams);
527e9baaff1SBonnie Lo 
528e9baaff1SBonnie Lo     ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnApp,
529e9baaff1SBonnie Lo                           ipmi::app::cmdGetSystemInfoParameters,
530e9baaff1SBonnie Lo                           ipmi::Privilege::User, ipmiAppGetSysInfoParams);
531a2d52f12SVijay Khemka     return;
532a2d52f12SVijay Khemka }
533a2d52f12SVijay Khemka 
534a2d52f12SVijay Khemka } // namespace ipmi
535