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