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 54e9baaff1SBonnie Lo static inline auto responseSystemInfoParamterNotSupportCommand() 55e9baaff1SBonnie Lo { 56e9baaff1SBonnie Lo return response(IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED); 57e9baaff1SBonnie Lo } 58e9baaff1SBonnie Lo 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 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 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 //---------------------------------------------------------------------- 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 //---------------------------------------------------------------------- 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 //---------------------------------------------------------------------- 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 //---------------------------------------------------------------------- 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 //---------------------------------------------------------------------- 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>> 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 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 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 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 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 //---------------------------------------------------------------------- 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>> 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 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