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 <ipmid/api.h> 19a2d52f12SVijay Khemka 20a2d52f12SVijay Khemka #include <sys/stat.h> 21a2d52f12SVijay Khemka #include <fcntl.h> 22a2d52f12SVijay Khemka #include <unistd.h> 23*666a4d95SVijay Khemka #include <nlohmann/json.hpp> 24a2d52f12SVijay Khemka #include <commandutils.hpp> 25a2d52f12SVijay Khemka #include <iostream> 26*666a4d95SVijay Khemka #include <iomanip> 27*666a4d95SVijay Khemka #include <sstream> 28*666a4d95SVijay Khemka #include <fstream> 29a2d52f12SVijay Khemka #include <phosphor-logging/log.hpp> 30a2d52f12SVijay Khemka #include <sdbusplus/message/types.hpp> 31a2d52f12SVijay Khemka #include <appcommands.hpp> 32a2d52f12SVijay Khemka 33a2d52f12SVijay Khemka namespace ipmi 34a2d52f12SVijay Khemka { 35a2d52f12SVijay Khemka 36a2d52f12SVijay Khemka static void registerAPPFunctions() __attribute__((constructor)); 37a2d52f12SVijay Khemka static constexpr size_t GUID_SIZE = 16; 38a2d52f12SVijay Khemka // TODO Make offset and location runtime configurable to ensure we 39a2d52f12SVijay Khemka // can make each define their own locations. 40a2d52f12SVijay Khemka static constexpr off_t OFFSET_SYS_GUID = 0x17F0; 41a2d52f12SVijay Khemka static constexpr off_t OFFSET_DEV_GUID = 0x1800; 42a2d52f12SVijay Khemka static constexpr const char *FRU_EEPROM = "/sys/bus/i2c/devices/6-0054/eeprom"; 43*666a4d95SVijay Khemka 44*666a4d95SVijay Khemka // TODO: Need to store this info after identifying proper storage 45a2d52f12SVijay Khemka static uint8_t globEna = 0x09; 46*666a4d95SVijay Khemka static SysInfoParam sysInfoParams; 47*666a4d95SVijay Khemka nlohmann::json appData; 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 int getDeviceGUID(uint8_t *guid) 108a2d52f12SVijay Khemka { 109a2d52f12SVijay Khemka return getGUID(OFFSET_DEV_GUID, guid); 110a2d52f12SVijay Khemka } 111a2d52f12SVijay Khemka 112a2d52f12SVijay Khemka //---------------------------------------------------------------------- 113*666a4d95SVijay Khemka // Get Self Test Results (IPMI/Section 20.4) (CMD_APP_GET_SELFTEST_RESULTS) 114*666a4d95SVijay Khemka //---------------------------------------------------------------------- 115*666a4d95SVijay Khemka ipmi_ret_t ipmiAppGetSTResults(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 116*666a4d95SVijay Khemka ipmi_request_t request, ipmi_response_t response, 117*666a4d95SVijay Khemka ipmi_data_len_t data_len, ipmi_context_t context) 118*666a4d95SVijay Khemka { 119*666a4d95SVijay Khemka uint8_t *res = reinterpret_cast<uint8_t *>(response); 120*666a4d95SVijay Khemka 121*666a4d95SVijay Khemka // TODO: Following data needs to be updated based on self-test results 122*666a4d95SVijay Khemka *res++ = 0x55; // Self-Test result 123*666a4d95SVijay Khemka *res++ = 0x00; // Extra error info in case of failure 124*666a4d95SVijay Khemka 125*666a4d95SVijay Khemka *data_len = 2; 126*666a4d95SVijay Khemka 127*666a4d95SVijay Khemka return IPMI_CC_OK; 128*666a4d95SVijay Khemka } 129*666a4d95SVijay Khemka 130*666a4d95SVijay Khemka //---------------------------------------------------------------------- 131*666a4d95SVijay Khemka // Manufacturing Test On (IPMI/Section 20.5) (CMD_APP_MFR_TEST_ON) 132*666a4d95SVijay Khemka //---------------------------------------------------------------------- 133*666a4d95SVijay Khemka ipmi_ret_t ipmiAppMfrTestOn(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 134*666a4d95SVijay Khemka ipmi_request_t request, ipmi_response_t response, 135*666a4d95SVijay Khemka ipmi_data_len_t data_len, ipmi_context_t context) 136*666a4d95SVijay Khemka { 137*666a4d95SVijay Khemka uint8_t *req = reinterpret_cast<uint8_t *>(request); 138*666a4d95SVijay Khemka std::string mfrTest = "sled-cycle"; 139*666a4d95SVijay Khemka 140*666a4d95SVijay Khemka if (!memcmp(req, mfrTest.data(), mfrTest.length()) && 141*666a4d95SVijay Khemka (*data_len == mfrTest.length())) 142*666a4d95SVijay Khemka { 143*666a4d95SVijay Khemka /* sled-cycle the BMC */ 144*666a4d95SVijay Khemka system("/usr/sbin/power-util mb sled-cycle"); 145*666a4d95SVijay Khemka } 146*666a4d95SVijay Khemka else 147*666a4d95SVijay Khemka { 148*666a4d95SVijay Khemka return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED; 149*666a4d95SVijay Khemka } 150*666a4d95SVijay Khemka 151*666a4d95SVijay Khemka *data_len = 0; 152*666a4d95SVijay Khemka 153*666a4d95SVijay Khemka return IPMI_CC_OK; 154*666a4d95SVijay Khemka } 155*666a4d95SVijay Khemka 156*666a4d95SVijay Khemka //---------------------------------------------------------------------- 157a2d52f12SVijay Khemka // Get Device GUID (CMD_APP_GET_DEV_GUID) 158a2d52f12SVijay Khemka //---------------------------------------------------------------------- 159a2d52f12SVijay Khemka ipmi_ret_t ipmiAppGetDevGUID(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 160a2d52f12SVijay Khemka ipmi_request_t request, ipmi_response_t response, 161a2d52f12SVijay Khemka ipmi_data_len_t data_len, ipmi_context_t context) 162a2d52f12SVijay Khemka { 163a2d52f12SVijay Khemka uint8_t *res = reinterpret_cast<uint8_t *>(response); 164a2d52f12SVijay Khemka 165a2d52f12SVijay Khemka if (getDeviceGUID(res)) 166a2d52f12SVijay Khemka { 167a2d52f12SVijay Khemka return IPMI_CC_UNSPECIFIED_ERROR; 168a2d52f12SVijay Khemka } 169a2d52f12SVijay Khemka *data_len = GUID_SIZE; 170a2d52f12SVijay Khemka 171a2d52f12SVijay Khemka return IPMI_CC_OK; 172a2d52f12SVijay Khemka } 173a2d52f12SVijay Khemka 174a2d52f12SVijay Khemka //---------------------------------------------------------------------- 175a2d52f12SVijay Khemka // Set Global Enables (CMD_APP_SET_GLOBAL_ENABLES) 176a2d52f12SVijay Khemka //---------------------------------------------------------------------- 177a2d52f12SVijay Khemka ipmi_ret_t ipmiAppSetGlobalEnables(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 178a2d52f12SVijay Khemka ipmi_request_t request, 179a2d52f12SVijay Khemka ipmi_response_t response, 180a2d52f12SVijay Khemka ipmi_data_len_t data_len, 181a2d52f12SVijay Khemka ipmi_context_t context) 182a2d52f12SVijay Khemka { 183a2d52f12SVijay Khemka uint8_t *req = reinterpret_cast<uint8_t *>(request); 184a2d52f12SVijay Khemka 185a2d52f12SVijay Khemka globEna = *req; 186a2d52f12SVijay Khemka *data_len = 0; 187a2d52f12SVijay Khemka 188a2d52f12SVijay Khemka return IPMI_CC_OK; 189a2d52f12SVijay Khemka } 190a2d52f12SVijay Khemka 191a2d52f12SVijay Khemka //---------------------------------------------------------------------- 192a2d52f12SVijay Khemka // Get Global Enables (CMD_APP_GET_GLOBAL_ENABLES) 193a2d52f12SVijay Khemka //---------------------------------------------------------------------- 194a2d52f12SVijay Khemka ipmi_ret_t ipmiAppGetGlobalEnables(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 195a2d52f12SVijay Khemka ipmi_request_t request, 196a2d52f12SVijay Khemka ipmi_response_t response, 197a2d52f12SVijay Khemka ipmi_data_len_t data_len, 198a2d52f12SVijay Khemka ipmi_context_t context) 199a2d52f12SVijay Khemka { 200a2d52f12SVijay Khemka uint8_t *res = reinterpret_cast<uint8_t *>(response); 201a2d52f12SVijay Khemka 202a2d52f12SVijay Khemka *data_len = 1; 203a2d52f12SVijay Khemka *res++ = globEna; 204a2d52f12SVijay Khemka 205a2d52f12SVijay Khemka return IPMI_CC_OK; 206a2d52f12SVijay Khemka } 207a2d52f12SVijay Khemka 208a2d52f12SVijay Khemka //---------------------------------------------------------------------- 209*666a4d95SVijay Khemka // Clear Message flags (IPMI/Section 22.3) (CMD_APP_CLEAR_MESSAGE_FLAGS) 210*666a4d95SVijay Khemka //---------------------------------------------------------------------- 211*666a4d95SVijay Khemka ipmi_ret_t ipmiAppClearMsgFlags(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 212*666a4d95SVijay Khemka ipmi_request_t request, 213*666a4d95SVijay Khemka ipmi_response_t response, 214*666a4d95SVijay Khemka ipmi_data_len_t data_len, 215*666a4d95SVijay Khemka ipmi_context_t context) 216*666a4d95SVijay Khemka { 217*666a4d95SVijay Khemka // Do Nothing and just return success 218*666a4d95SVijay Khemka *data_len = 0; 219*666a4d95SVijay Khemka 220*666a4d95SVijay Khemka return IPMI_CC_OK; 221*666a4d95SVijay Khemka } 222*666a4d95SVijay Khemka 223*666a4d95SVijay Khemka //---------------------------------------------------------------------- 224a2d52f12SVijay Khemka // Get System GUID (CMD_APP_GET_SYS_GUID) 225a2d52f12SVijay Khemka //---------------------------------------------------------------------- 226a2d52f12SVijay Khemka ipmi_ret_t ipmiAppGetSysGUID(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 227a2d52f12SVijay Khemka ipmi_request_t request, ipmi_response_t response, 228a2d52f12SVijay Khemka ipmi_data_len_t data_len, ipmi_context_t context) 229a2d52f12SVijay Khemka { 230a2d52f12SVijay Khemka uint8_t *res = reinterpret_cast<uint8_t *>(response); 231a2d52f12SVijay Khemka if (getSystemGUID(res)) 232a2d52f12SVijay Khemka { 233a2d52f12SVijay Khemka return IPMI_CC_UNSPECIFIED_ERROR; 234a2d52f12SVijay Khemka } 235a2d52f12SVijay Khemka *data_len = GUID_SIZE; 236a2d52f12SVijay Khemka return IPMI_CC_OK; 237a2d52f12SVijay Khemka } 238a2d52f12SVijay Khemka 239*666a4d95SVijay Khemka //---------------------------------------------------------------------- 240*666a4d95SVijay Khemka // Platform specific functions for storing app data 241*666a4d95SVijay Khemka //---------------------------------------------------------------------- 242*666a4d95SVijay Khemka 243*666a4d95SVijay Khemka void flush_app_data() 244*666a4d95SVijay Khemka { 245*666a4d95SVijay Khemka std::ofstream file(JSON_DATA_FILE); 246*666a4d95SVijay Khemka file << appData; 247*666a4d95SVijay Khemka return; 248*666a4d95SVijay Khemka } 249*666a4d95SVijay Khemka 250*666a4d95SVijay Khemka static int platSetSysFWVer(uint8_t *ver) 251*666a4d95SVijay Khemka { 252*666a4d95SVijay Khemka std::stringstream ss; 253*666a4d95SVijay Khemka int i; 254*666a4d95SVijay Khemka 255*666a4d95SVijay Khemka /* TODO: implement byte 1: Set selector 256*666a4d95SVijay Khemka * byte 2: encodeing, currently only supported 257*666a4d95SVijay Khemka * ASCII which is value 0, UTF and unicode are 258*666a4d95SVijay Khemka * not supported yet. 259*666a4d95SVijay Khemka */ 260*666a4d95SVijay Khemka if (ver[1] & 0x0f) 261*666a4d95SVijay Khemka return -1; 262*666a4d95SVijay Khemka 263*666a4d95SVijay Khemka for (i = 3; i < 3 + ver[2]; i++) 264*666a4d95SVijay Khemka { 265*666a4d95SVijay Khemka ss << (char)ver[i]; 266*666a4d95SVijay Khemka } 267*666a4d95SVijay Khemka 268*666a4d95SVijay Khemka appData[KEY_SYSFW_VER] = ss.str(); 269*666a4d95SVijay Khemka flush_app_data(); 270*666a4d95SVijay Khemka 271*666a4d95SVijay Khemka return 0; 272*666a4d95SVijay Khemka } 273*666a4d95SVijay Khemka 274*666a4d95SVijay Khemka static int platGetSysFWVer(uint8_t *ver) 275*666a4d95SVijay Khemka { 276*666a4d95SVijay Khemka std::string str = appData[KEY_SYSFW_VER].get<std::string>(); 277*666a4d95SVijay Khemka int len; 278*666a4d95SVijay Khemka 279*666a4d95SVijay Khemka *ver++ = 0; // byte 1: Set selector not supported 280*666a4d95SVijay Khemka *ver++ = 0; // byte 2: Only ASCII supported 281*666a4d95SVijay Khemka 282*666a4d95SVijay Khemka len = str.length(); 283*666a4d95SVijay Khemka *ver++ = len; 284*666a4d95SVijay Khemka memcpy(ver, str.data(), len); 285*666a4d95SVijay Khemka 286*666a4d95SVijay Khemka return (len + 3); 287*666a4d95SVijay Khemka } 288*666a4d95SVijay Khemka 289*666a4d95SVijay Khemka //---------------------------------------------------------------------- 290*666a4d95SVijay Khemka // Set Sys Info Params (IPMI/Sec 22.14a) (CMD_APP_SET_SYS_INFO_PARAMS) 291*666a4d95SVijay Khemka //---------------------------------------------------------------------- 292*666a4d95SVijay Khemka ipmi_ret_t ipmiAppSetSysInfoParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 293*666a4d95SVijay Khemka ipmi_request_t request, 294*666a4d95SVijay Khemka ipmi_response_t response, 295*666a4d95SVijay Khemka ipmi_data_len_t data_len, 296*666a4d95SVijay Khemka ipmi_context_t context) 297*666a4d95SVijay Khemka { 298*666a4d95SVijay Khemka uint8_t *req = reinterpret_cast<uint8_t *>(request); 299*666a4d95SVijay Khemka 300*666a4d95SVijay Khemka uint8_t param = req[0]; 301*666a4d95SVijay Khemka uint8_t req_len = *data_len; 302*666a4d95SVijay Khemka 303*666a4d95SVijay Khemka *data_len = 0; 304*666a4d95SVijay Khemka 305*666a4d95SVijay Khemka switch (param) 306*666a4d95SVijay Khemka { 307*666a4d95SVijay Khemka case SYS_INFO_PARAM_SET_IN_PROG: 308*666a4d95SVijay Khemka sysInfoParams.set_in_prog = req[1]; 309*666a4d95SVijay Khemka break; 310*666a4d95SVijay Khemka case SYS_INFO_PARAM_SYSFW_VER: 311*666a4d95SVijay Khemka memcpy(sysInfoParams.sysfw_ver, &req[1], SIZE_SYSFW_VER); 312*666a4d95SVijay Khemka if (platSetSysFWVer(sysInfoParams.sysfw_ver)) 313*666a4d95SVijay Khemka return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED; 314*666a4d95SVijay Khemka break; 315*666a4d95SVijay Khemka case SYS_INFO_PARAM_SYS_NAME: 316*666a4d95SVijay Khemka memcpy(sysInfoParams.sys_name, &req[1], SIZE_SYS_NAME); 317*666a4d95SVijay Khemka break; 318*666a4d95SVijay Khemka case SYS_INFO_PARAM_PRI_OS_NAME: 319*666a4d95SVijay Khemka memcpy(sysInfoParams.pri_os_name, &req[1], SIZE_OS_NAME); 320*666a4d95SVijay Khemka break; 321*666a4d95SVijay Khemka case SYS_INFO_PARAM_PRESENT_OS_NAME: 322*666a4d95SVijay Khemka memcpy(sysInfoParams.present_os_name, &req[1], SIZE_OS_NAME); 323*666a4d95SVijay Khemka break; 324*666a4d95SVijay Khemka case SYS_INFO_PARAM_PRESENT_OS_VER: 325*666a4d95SVijay Khemka memcpy(sysInfoParams.present_os_ver, &req[1], SIZE_OS_VER); 326*666a4d95SVijay Khemka break; 327*666a4d95SVijay Khemka case SYS_INFO_PARAM_BMC_URL: 328*666a4d95SVijay Khemka memcpy(sysInfoParams.bmc_url, &req[1], SIZE_BMC_URL); 329*666a4d95SVijay Khemka break; 330*666a4d95SVijay Khemka case SYS_INFO_PARAM_OS_HV_URL: 331*666a4d95SVijay Khemka memcpy(sysInfoParams.os_hv_url, &req[1], SIZE_OS_HV_URL); 332*666a4d95SVijay Khemka break; 333*666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST: 334*666a4d95SVijay Khemka memcpy(sysInfoParams.bios_current_boot_list, &req[1], req_len); 335*666a4d95SVijay Khemka appData[KEY_BIOS_BOOT_LEN] = req_len; 336*666a4d95SVijay Khemka flush_app_data(); 337*666a4d95SVijay Khemka break; 338*666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE: 339*666a4d95SVijay Khemka if (SIZE_BIOS_FIXED_BOOT_DEVICE != req_len) 340*666a4d95SVijay Khemka break; 341*666a4d95SVijay Khemka memcpy(sysInfoParams.bios_fixed_boot_device, &req[1], 342*666a4d95SVijay Khemka SIZE_BIOS_FIXED_BOOT_DEVICE); 343*666a4d95SVijay Khemka break; 344*666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING: 345*666a4d95SVijay Khemka if (SIZE_BIOS_RSTR_DFLT_SETTING != req_len) 346*666a4d95SVijay Khemka break; 347*666a4d95SVijay Khemka memcpy(sysInfoParams.bios_rstr_dflt_setting, &req[1], 348*666a4d95SVijay Khemka SIZE_BIOS_RSTR_DFLT_SETTING); 349*666a4d95SVijay Khemka break; 350*666a4d95SVijay Khemka case SYS_INFO_PARAM_LAST_BOOT_TIME: 351*666a4d95SVijay Khemka if (SIZE_LAST_BOOT_TIME != req_len) 352*666a4d95SVijay Khemka break; 353*666a4d95SVijay Khemka memcpy(sysInfoParams.last_boot_time, &req[1], SIZE_LAST_BOOT_TIME); 354*666a4d95SVijay Khemka break; 355*666a4d95SVijay Khemka default: 356*666a4d95SVijay Khemka return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED; 357*666a4d95SVijay Khemka break; 358*666a4d95SVijay Khemka } 359*666a4d95SVijay Khemka 360*666a4d95SVijay Khemka return IPMI_CC_OK; 361*666a4d95SVijay Khemka } 362*666a4d95SVijay Khemka 363*666a4d95SVijay Khemka //---------------------------------------------------------------------- 364*666a4d95SVijay Khemka // Get Sys Info Params (IPMI/Sec 22.14b) (CMD_APP_GET_SYS_INFO_PARAMS) 365*666a4d95SVijay Khemka //---------------------------------------------------------------------- 366*666a4d95SVijay Khemka ipmi_ret_t ipmiAppGetSysInfoParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 367*666a4d95SVijay Khemka ipmi_request_t request, 368*666a4d95SVijay Khemka ipmi_response_t response, 369*666a4d95SVijay Khemka ipmi_data_len_t data_len, 370*666a4d95SVijay Khemka ipmi_context_t context) 371*666a4d95SVijay Khemka { 372*666a4d95SVijay Khemka uint8_t *req = reinterpret_cast<uint8_t *>(request); 373*666a4d95SVijay Khemka uint8_t *res = reinterpret_cast<uint8_t *>(response); 374*666a4d95SVijay Khemka 375*666a4d95SVijay Khemka uint8_t param = req[1]; 376*666a4d95SVijay Khemka uint8_t len; 377*666a4d95SVijay Khemka 378*666a4d95SVijay Khemka *res++ = 1; // Parameter revision 379*666a4d95SVijay Khemka *data_len = 1; 380*666a4d95SVijay Khemka 381*666a4d95SVijay Khemka switch (param) 382*666a4d95SVijay Khemka { 383*666a4d95SVijay Khemka case SYS_INFO_PARAM_SET_IN_PROG: 384*666a4d95SVijay Khemka *res++ = sysInfoParams.set_in_prog; 385*666a4d95SVijay Khemka *data_len += 1; 386*666a4d95SVijay Khemka break; 387*666a4d95SVijay Khemka case SYS_INFO_PARAM_SYSFW_VER: 388*666a4d95SVijay Khemka if ((len = platGetSysFWVer(res)) < 0) 389*666a4d95SVijay Khemka return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED; 390*666a4d95SVijay Khemka *data_len += SIZE_SYSFW_VER; 391*666a4d95SVijay Khemka break; 392*666a4d95SVijay Khemka case SYS_INFO_PARAM_SYS_NAME: 393*666a4d95SVijay Khemka memcpy(res, sysInfoParams.sys_name, SIZE_SYS_NAME); 394*666a4d95SVijay Khemka *data_len += SIZE_SYS_NAME; 395*666a4d95SVijay Khemka break; 396*666a4d95SVijay Khemka case SYS_INFO_PARAM_PRI_OS_NAME: 397*666a4d95SVijay Khemka memcpy(res, sysInfoParams.pri_os_name, SIZE_OS_NAME); 398*666a4d95SVijay Khemka *data_len += SIZE_OS_NAME; 399*666a4d95SVijay Khemka break; 400*666a4d95SVijay Khemka case SYS_INFO_PARAM_PRESENT_OS_NAME: 401*666a4d95SVijay Khemka memcpy(res, sysInfoParams.present_os_name, SIZE_OS_NAME); 402*666a4d95SVijay Khemka *data_len += SIZE_OS_NAME; 403*666a4d95SVijay Khemka break; 404*666a4d95SVijay Khemka case SYS_INFO_PARAM_PRESENT_OS_VER: 405*666a4d95SVijay Khemka memcpy(res, sysInfoParams.present_os_ver, SIZE_OS_VER); 406*666a4d95SVijay Khemka *data_len += SIZE_OS_VER; 407*666a4d95SVijay Khemka break; 408*666a4d95SVijay Khemka case SYS_INFO_PARAM_BMC_URL: 409*666a4d95SVijay Khemka memcpy(res, sysInfoParams.bmc_url, SIZE_BMC_URL); 410*666a4d95SVijay Khemka *data_len += SIZE_BMC_URL; 411*666a4d95SVijay Khemka break; 412*666a4d95SVijay Khemka case SYS_INFO_PARAM_OS_HV_URL: 413*666a4d95SVijay Khemka memcpy(res, sysInfoParams.os_hv_url, SIZE_OS_HV_URL); 414*666a4d95SVijay Khemka *data_len += SIZE_OS_HV_URL; 415*666a4d95SVijay Khemka break; 416*666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST: 417*666a4d95SVijay Khemka len = appData[KEY_BIOS_BOOT_LEN].get<uint8_t>(); 418*666a4d95SVijay Khemka memcpy(res, sysInfoParams.bios_current_boot_list, len); 419*666a4d95SVijay Khemka *data_len += len; 420*666a4d95SVijay Khemka break; 421*666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE: 422*666a4d95SVijay Khemka memcpy(res, sysInfoParams.bios_fixed_boot_device, 423*666a4d95SVijay Khemka SIZE_BIOS_FIXED_BOOT_DEVICE); 424*666a4d95SVijay Khemka *data_len += SIZE_BIOS_FIXED_BOOT_DEVICE; 425*666a4d95SVijay Khemka break; 426*666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING: 427*666a4d95SVijay Khemka memcpy(res, sysInfoParams.bios_rstr_dflt_setting, 428*666a4d95SVijay Khemka SIZE_BIOS_RSTR_DFLT_SETTING); 429*666a4d95SVijay Khemka *data_len += SIZE_BIOS_RSTR_DFLT_SETTING; 430*666a4d95SVijay Khemka break; 431*666a4d95SVijay Khemka case SYS_INFO_PARAM_LAST_BOOT_TIME: 432*666a4d95SVijay Khemka memcpy(res, sysInfoParams.last_boot_time, SIZE_LAST_BOOT_TIME); 433*666a4d95SVijay Khemka *data_len += SIZE_LAST_BOOT_TIME; 434*666a4d95SVijay Khemka break; 435*666a4d95SVijay Khemka default: 436*666a4d95SVijay Khemka return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED; 437*666a4d95SVijay Khemka break; 438*666a4d95SVijay Khemka } 439*666a4d95SVijay Khemka return IPMI_CC_OK; 440*666a4d95SVijay Khemka } 441*666a4d95SVijay Khemka 442a2d52f12SVijay Khemka void registerAPPFunctions() 443a2d52f12SVijay Khemka { 444*666a4d95SVijay Khemka /* Get App data stored in json file */ 445*666a4d95SVijay Khemka std::ifstream file(JSON_DATA_FILE); 446*666a4d95SVijay Khemka if (file) 447*666a4d95SVijay Khemka file >> appData; 448*666a4d95SVijay Khemka 449*666a4d95SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SELFTEST_RESULTS, NULL, 450*666a4d95SVijay Khemka ipmiAppGetSTResults, 451*666a4d95SVijay Khemka PRIVILEGE_USER); // Get Self Test Results 452*666a4d95SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_MFR_TEST_ON, NULL, 453*666a4d95SVijay Khemka ipmiAppMfrTestOn, 454*666a4d95SVijay Khemka PRIVILEGE_USER); // Manufacturing Test On 455a2d52f12SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_DEV_GUID, NULL, 456a2d52f12SVijay Khemka ipmiAppGetDevGUID, 457a2d52f12SVijay Khemka PRIVILEGE_USER); // Get Device GUID 458a2d52f12SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_GLOBAL_ENABLES, NULL, 459a2d52f12SVijay Khemka ipmiAppSetGlobalEnables, 460*666a4d95SVijay Khemka PRIVILEGE_USER); // Set Global Enables 461a2d52f12SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_GLOBAL_ENABLES, NULL, 462a2d52f12SVijay Khemka ipmiAppGetGlobalEnables, 463a2d52f12SVijay Khemka PRIVILEGE_USER); // Get Global Enables 464*666a4d95SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_CLEAR_MESSAGE_FLAGS, NULL, 465*666a4d95SVijay Khemka ipmiAppClearMsgFlags, 466*666a4d95SVijay Khemka PRIVILEGE_USER); // Clear Message flags 467a2d52f12SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_GUID, NULL, 468a2d52f12SVijay Khemka ipmiAppGetSysGUID, 469a2d52f12SVijay Khemka PRIVILEGE_USER); // Get System GUID 470*666a4d95SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_SYS_INFO_PARAMS, NULL, 471*666a4d95SVijay Khemka ipmiAppSetSysInfoParams, 472*666a4d95SVijay Khemka PRIVILEGE_USER); // Set Sys Info Params 473*666a4d95SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_INFO_PARAMS, NULL, 474*666a4d95SVijay Khemka ipmiAppGetSysInfoParams, 475*666a4d95SVijay Khemka PRIVILEGE_USER); // Get Sys Info Params 476a2d52f12SVijay Khemka return; 477a2d52f12SVijay Khemka } 478a2d52f12SVijay Khemka 479a2d52f12SVijay Khemka } // namespace ipmi 480