1a2d52f12SVijay Khemka /* 2a2d52f12SVijay Khemka * Copyright (c) 2018 Intel Corporation. 3a2d52f12SVijay Khemka * Copyright (c) 2018-present Facebook. 4a2d52f12SVijay Khemka * 5a2d52f12SVijay Khemka * Licensed under the Apache License, Version 2.0 (the "License"); 6a2d52f12SVijay Khemka * you may not use this file except in compliance with the License. 7a2d52f12SVijay Khemka * You may obtain a copy of the License at 8a2d52f12SVijay Khemka * 9a2d52f12SVijay Khemka * http://www.apache.org/licenses/LICENSE-2.0 10a2d52f12SVijay Khemka * 11a2d52f12SVijay Khemka * Unless required by applicable law or agreed to in writing, software 12a2d52f12SVijay Khemka * distributed under the License is distributed on an "AS IS" BASIS, 13a2d52f12SVijay Khemka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14a2d52f12SVijay Khemka * See the License for the specific language governing permissions and 15a2d52f12SVijay Khemka * limitations under the License. 16a2d52f12SVijay Khemka */ 17a2d52f12SVijay Khemka 18a2d52f12SVijay Khemka #include <fcntl.h> 1963c99be4SVijay Khemka #include <ipmid/api.h> 2063c99be4SVijay Khemka #include <sys/stat.h> 21a2d52f12SVijay Khemka #include <unistd.h> 2263c99be4SVijay Khemka 2363c99be4SVijay Khemka #include <appcommands.hpp> 24a2d52f12SVijay Khemka #include <commandutils.hpp> 2563c99be4SVijay Khemka #include <nlohmann/json.hpp> 26a2d52f12SVijay Khemka #include <phosphor-logging/log.hpp> 27a2d52f12SVijay Khemka #include <sdbusplus/message/types.hpp> 28*5f8e3435SManikandan Elumalai #include <ipmid/api.hpp> 29*5f8e3435SManikandan Elumalai #include <ipmid/api-types.hpp> 3063c99be4SVijay Khemka 3163c99be4SVijay Khemka #include <fstream> 3263c99be4SVijay Khemka #include <iomanip> 3363c99be4SVijay Khemka #include <iostream> 3463c99be4SVijay Khemka #include <sstream> 35a2d52f12SVijay Khemka 36a2d52f12SVijay Khemka namespace ipmi 37a2d52f12SVijay Khemka { 38a2d52f12SVijay Khemka 39a2d52f12SVijay Khemka static void registerAPPFunctions() __attribute__((constructor)); 40a2d52f12SVijay Khemka static constexpr size_t GUID_SIZE = 16; 41a2d52f12SVijay Khemka // TODO Make offset and location runtime configurable to ensure we 42a2d52f12SVijay Khemka // can make each define their own locations. 43a2d52f12SVijay Khemka static constexpr off_t OFFSET_SYS_GUID = 0x17F0; 44a2d52f12SVijay Khemka static constexpr const char* FRU_EEPROM = "/sys/bus/i2c/devices/6-0054/eeprom"; 45666a4d95SVijay Khemka 46666a4d95SVijay Khemka // TODO: Need to store this info after identifying proper storage 47a2d52f12SVijay Khemka static uint8_t globEna = 0x09; 48666a4d95SVijay Khemka static SysInfoParam sysInfoParams; 49802ccb11SVijay Khemka nlohmann::json appData __attribute__((init_priority(101))); 50a2d52f12SVijay Khemka 51*5f8e3435SManikandan Elumalai int sendBicCmd(uint8_t, uint8_t, uint8_t, std::vector<uint8_t>&, 52*5f8e3435SManikandan Elumalai std::vector<uint8_t>&); 53*5f8e3435SManikandan Elumalai 54a2d52f12SVijay Khemka void printGUID(uint8_t* guid, off_t offset) 55a2d52f12SVijay Khemka { 56a2d52f12SVijay Khemka std::cout << "Read GUID from offset : " << offset << " :\n"; 57a2d52f12SVijay Khemka for (int i = 0; i < GUID_SIZE; i++) 58a2d52f12SVijay Khemka { 59a2d52f12SVijay Khemka int data = guid[i]; 60a2d52f12SVijay Khemka std::cout << std::hex << data << " "; 61a2d52f12SVijay Khemka } 62a2d52f12SVijay Khemka std::cout << std::endl; 63a2d52f12SVijay Khemka } 64a2d52f12SVijay Khemka 65a2d52f12SVijay Khemka int getGUID(off_t offset, uint8_t* guid) 66a2d52f12SVijay Khemka { 67a2d52f12SVijay Khemka int fd = -1; 68a2d52f12SVijay Khemka ssize_t bytes_rd; 69a2d52f12SVijay Khemka int ret = 0; 70a2d52f12SVijay Khemka 71a2d52f12SVijay Khemka errno = 0; 72a2d52f12SVijay Khemka 73a2d52f12SVijay Khemka // Check if file is present 74a2d52f12SVijay Khemka if (access(FRU_EEPROM, F_OK) == -1) 75a2d52f12SVijay Khemka { 76a2d52f12SVijay Khemka std::cerr << "Unable to access: " << FRU_EEPROM << std::endl; 77a2d52f12SVijay Khemka return errno; 78a2d52f12SVijay Khemka } 79a2d52f12SVijay Khemka 80a2d52f12SVijay Khemka // Open the file 81a2d52f12SVijay Khemka fd = open(FRU_EEPROM, O_RDONLY); 82a2d52f12SVijay Khemka if (fd == -1) 83a2d52f12SVijay Khemka { 84a2d52f12SVijay Khemka std::cerr << "Unable to open: " << FRU_EEPROM << std::endl; 85a2d52f12SVijay Khemka return errno; 86a2d52f12SVijay Khemka } 87a2d52f12SVijay Khemka 88a2d52f12SVijay Khemka // seek to the offset 89a2d52f12SVijay Khemka lseek(fd, offset, SEEK_SET); 90a2d52f12SVijay Khemka 91a2d52f12SVijay Khemka // Read bytes from location 92a2d52f12SVijay Khemka bytes_rd = read(fd, guid, GUID_SIZE); 93a2d52f12SVijay Khemka if (bytes_rd != GUID_SIZE) 94a2d52f12SVijay Khemka { 95a2d52f12SVijay Khemka phosphor::logging::log<phosphor::logging::level::ERR>( 96a2d52f12SVijay Khemka "GUID read data from EEPROM failed"); 97a2d52f12SVijay Khemka ret = errno; 98a2d52f12SVijay Khemka } 99a2d52f12SVijay Khemka else 100a2d52f12SVijay Khemka { 101a2d52f12SVijay Khemka printGUID(guid, offset); 102a2d52f12SVijay Khemka } 103a2d52f12SVijay Khemka close(fd); 104a2d52f12SVijay Khemka return ret; 105a2d52f12SVijay Khemka } 106a2d52f12SVijay Khemka 107a2d52f12SVijay Khemka int getSystemGUID(uint8_t* guid) 108a2d52f12SVijay Khemka { 109a2d52f12SVijay Khemka return getGUID(OFFSET_SYS_GUID, guid); 110a2d52f12SVijay Khemka } 111a2d52f12SVijay Khemka 112a2d52f12SVijay Khemka //---------------------------------------------------------------------- 113666a4d95SVijay Khemka // Get Self Test Results (IPMI/Section 20.4) (CMD_APP_GET_SELFTEST_RESULTS) 114666a4d95SVijay Khemka //---------------------------------------------------------------------- 115666a4d95SVijay Khemka ipmi_ret_t ipmiAppGetSTResults(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 116666a4d95SVijay Khemka ipmi_request_t request, ipmi_response_t response, 117666a4d95SVijay Khemka ipmi_data_len_t data_len, ipmi_context_t context) 118666a4d95SVijay Khemka { 119666a4d95SVijay Khemka uint8_t* res = reinterpret_cast<uint8_t*>(response); 120666a4d95SVijay Khemka 121666a4d95SVijay Khemka // TODO: Following data needs to be updated based on self-test results 122666a4d95SVijay Khemka *res++ = 0x55; // Self-Test result 123666a4d95SVijay Khemka *res++ = 0x00; // Extra error info in case of failure 124666a4d95SVijay Khemka 125666a4d95SVijay Khemka *data_len = 2; 126666a4d95SVijay Khemka 127666a4d95SVijay Khemka return IPMI_CC_OK; 128666a4d95SVijay Khemka } 129666a4d95SVijay Khemka 130666a4d95SVijay Khemka //---------------------------------------------------------------------- 131666a4d95SVijay Khemka // Manufacturing Test On (IPMI/Section 20.5) (CMD_APP_MFR_TEST_ON) 132666a4d95SVijay Khemka //---------------------------------------------------------------------- 133666a4d95SVijay Khemka ipmi_ret_t ipmiAppMfrTestOn(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 134666a4d95SVijay Khemka ipmi_request_t request, ipmi_response_t response, 135666a4d95SVijay Khemka ipmi_data_len_t data_len, ipmi_context_t context) 136666a4d95SVijay Khemka { 137666a4d95SVijay Khemka uint8_t* req = reinterpret_cast<uint8_t*>(request); 138666a4d95SVijay Khemka std::string mfrTest = "sled-cycle"; 139666a4d95SVijay Khemka 140666a4d95SVijay Khemka if (!memcmp(req, mfrTest.data(), mfrTest.length()) && 141666a4d95SVijay Khemka (*data_len == mfrTest.length())) 142666a4d95SVijay Khemka { 143666a4d95SVijay Khemka /* sled-cycle the BMC */ 1442515e093SVijay Khemka system("/usr/sbin/power-util sled-cycle"); 145666a4d95SVijay Khemka } 146666a4d95SVijay Khemka else 147666a4d95SVijay Khemka { 148666a4d95SVijay Khemka return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED; 149666a4d95SVijay Khemka } 150666a4d95SVijay Khemka 151666a4d95SVijay Khemka *data_len = 0; 152666a4d95SVijay Khemka 153666a4d95SVijay Khemka return IPMI_CC_OK; 154666a4d95SVijay Khemka } 155666a4d95SVijay Khemka 156666a4d95SVijay Khemka //---------------------------------------------------------------------- 157a2d52f12SVijay Khemka // Set Global Enables (CMD_APP_SET_GLOBAL_ENABLES) 158a2d52f12SVijay Khemka //---------------------------------------------------------------------- 159a2d52f12SVijay Khemka ipmi_ret_t ipmiAppSetGlobalEnables(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 160a2d52f12SVijay Khemka ipmi_request_t request, 161a2d52f12SVijay Khemka ipmi_response_t response, 162a2d52f12SVijay Khemka ipmi_data_len_t data_len, 163a2d52f12SVijay Khemka ipmi_context_t context) 164a2d52f12SVijay Khemka { 165a2d52f12SVijay Khemka uint8_t* req = reinterpret_cast<uint8_t*>(request); 166a2d52f12SVijay Khemka 167a2d52f12SVijay Khemka globEna = *req; 168a2d52f12SVijay Khemka *data_len = 0; 169a2d52f12SVijay Khemka 170a2d52f12SVijay Khemka return IPMI_CC_OK; 171a2d52f12SVijay Khemka } 172a2d52f12SVijay Khemka 173a2d52f12SVijay Khemka //---------------------------------------------------------------------- 174a2d52f12SVijay Khemka // Get Global Enables (CMD_APP_GET_GLOBAL_ENABLES) 175a2d52f12SVijay Khemka //---------------------------------------------------------------------- 176a2d52f12SVijay Khemka ipmi_ret_t ipmiAppGetGlobalEnables(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 177a2d52f12SVijay Khemka ipmi_request_t request, 178a2d52f12SVijay Khemka ipmi_response_t response, 179a2d52f12SVijay Khemka ipmi_data_len_t data_len, 180a2d52f12SVijay Khemka ipmi_context_t context) 181a2d52f12SVijay Khemka { 182a2d52f12SVijay Khemka uint8_t* res = reinterpret_cast<uint8_t*>(response); 183a2d52f12SVijay Khemka 184a2d52f12SVijay Khemka *data_len = 1; 185a2d52f12SVijay Khemka *res++ = globEna; 186a2d52f12SVijay Khemka 187a2d52f12SVijay Khemka return IPMI_CC_OK; 188a2d52f12SVijay Khemka } 189a2d52f12SVijay Khemka 190a2d52f12SVijay Khemka //---------------------------------------------------------------------- 191666a4d95SVijay Khemka // Clear Message flags (IPMI/Section 22.3) (CMD_APP_CLEAR_MESSAGE_FLAGS) 192666a4d95SVijay Khemka //---------------------------------------------------------------------- 193666a4d95SVijay Khemka ipmi_ret_t ipmiAppClearMsgFlags(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 194666a4d95SVijay Khemka ipmi_request_t request, 195666a4d95SVijay Khemka ipmi_response_t response, 196666a4d95SVijay Khemka ipmi_data_len_t data_len, 197666a4d95SVijay Khemka ipmi_context_t context) 198666a4d95SVijay Khemka { 199666a4d95SVijay Khemka // Do Nothing and just return success 200666a4d95SVijay Khemka *data_len = 0; 201666a4d95SVijay Khemka 202666a4d95SVijay Khemka return IPMI_CC_OK; 203666a4d95SVijay Khemka } 204666a4d95SVijay Khemka 205666a4d95SVijay Khemka //---------------------------------------------------------------------- 206a2d52f12SVijay Khemka // Get System GUID (CMD_APP_GET_SYS_GUID) 207a2d52f12SVijay Khemka //---------------------------------------------------------------------- 208*5f8e3435SManikandan Elumalai #if BIC_ENABLED 209*5f8e3435SManikandan Elumalai ipmi::RspType<std::vector<uint8_t>> 210*5f8e3435SManikandan Elumalai ipmiAppGetSysGUID(ipmi::Context::ptr ctx, std::vector<uint8_t> reqData) 211*5f8e3435SManikandan Elumalai 212*5f8e3435SManikandan Elumalai { 213*5f8e3435SManikandan Elumalai std::vector<uint8_t> respData; 214*5f8e3435SManikandan Elumalai 215*5f8e3435SManikandan Elumalai uint8_t bicAddr = (uint8_t)ctx->hostIdx << 2; 216*5f8e3435SManikandan Elumalai 217*5f8e3435SManikandan Elumalai if (sendBicCmd(ctx->netFn, ctx->cmd, bicAddr, reqData, respData)) 218*5f8e3435SManikandan Elumalai return ipmi::responseUnspecifiedError(); 219*5f8e3435SManikandan Elumalai 220*5f8e3435SManikandan Elumalai return ipmi::responseSuccess(respData); 221*5f8e3435SManikandan Elumalai } 222*5f8e3435SManikandan Elumalai 223*5f8e3435SManikandan Elumalai #else 224a2d52f12SVijay Khemka ipmi_ret_t ipmiAppGetSysGUID(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 225a2d52f12SVijay Khemka ipmi_request_t request, ipmi_response_t response, 226a2d52f12SVijay Khemka ipmi_data_len_t data_len, ipmi_context_t context) 227a2d52f12SVijay Khemka { 228a2d52f12SVijay Khemka uint8_t* res = reinterpret_cast<uint8_t*>(response); 229a2d52f12SVijay Khemka if (getSystemGUID(res)) 230a2d52f12SVijay Khemka { 231a2d52f12SVijay Khemka return IPMI_CC_UNSPECIFIED_ERROR; 232a2d52f12SVijay Khemka } 233a2d52f12SVijay Khemka *data_len = GUID_SIZE; 234a2d52f12SVijay Khemka return IPMI_CC_OK; 235a2d52f12SVijay Khemka } 236a2d52f12SVijay Khemka 237*5f8e3435SManikandan Elumalai #endif 238*5f8e3435SManikandan Elumalai 239666a4d95SVijay Khemka //---------------------------------------------------------------------- 240666a4d95SVijay Khemka // Platform specific functions for storing app data 241666a4d95SVijay Khemka //---------------------------------------------------------------------- 242666a4d95SVijay Khemka 243666a4d95SVijay Khemka void flush_app_data() 244666a4d95SVijay Khemka { 245802ccb11SVijay Khemka std::ofstream file(JSON_APP_DATA_FILE); 246666a4d95SVijay Khemka file << appData; 247802ccb11SVijay Khemka file.close(); 248666a4d95SVijay Khemka return; 249666a4d95SVijay Khemka } 250666a4d95SVijay Khemka 251666a4d95SVijay Khemka static int platSetSysFWVer(uint8_t* ver) 252666a4d95SVijay Khemka { 253666a4d95SVijay Khemka std::stringstream ss; 254666a4d95SVijay Khemka int i; 255666a4d95SVijay Khemka 256666a4d95SVijay Khemka /* TODO: implement byte 1: Set selector 257666a4d95SVijay Khemka * byte 2: encodeing, currently only supported 258666a4d95SVijay Khemka * ASCII which is value 0, UTF and unicode are 259666a4d95SVijay Khemka * not supported yet. 260666a4d95SVijay Khemka */ 261666a4d95SVijay Khemka if (ver[1] & 0x0f) 262666a4d95SVijay Khemka return -1; 263666a4d95SVijay Khemka 264666a4d95SVijay Khemka for (i = 3; i < 3 + ver[2]; i++) 265666a4d95SVijay Khemka { 266666a4d95SVijay Khemka ss << (char)ver[i]; 267666a4d95SVijay Khemka } 268666a4d95SVijay Khemka 269666a4d95SVijay Khemka appData[KEY_SYSFW_VER] = ss.str(); 270666a4d95SVijay Khemka flush_app_data(); 271666a4d95SVijay Khemka 272666a4d95SVijay Khemka return 0; 273666a4d95SVijay Khemka } 274666a4d95SVijay Khemka 275666a4d95SVijay Khemka static int platGetSysFWVer(uint8_t* ver) 276666a4d95SVijay Khemka { 277666a4d95SVijay Khemka std::string str = appData[KEY_SYSFW_VER].get<std::string>(); 278666a4d95SVijay Khemka int len; 279666a4d95SVijay Khemka 280666a4d95SVijay Khemka *ver++ = 0; // byte 1: Set selector not supported 281666a4d95SVijay Khemka *ver++ = 0; // byte 2: Only ASCII supported 282666a4d95SVijay Khemka 283666a4d95SVijay Khemka len = str.length(); 284666a4d95SVijay Khemka *ver++ = len; 285666a4d95SVijay Khemka memcpy(ver, str.data(), len); 286666a4d95SVijay Khemka 287666a4d95SVijay Khemka return (len + 3); 288666a4d95SVijay Khemka } 289666a4d95SVijay Khemka 290666a4d95SVijay Khemka //---------------------------------------------------------------------- 291666a4d95SVijay Khemka // Set Sys Info Params (IPMI/Sec 22.14a) (CMD_APP_SET_SYS_INFO_PARAMS) 292666a4d95SVijay Khemka //---------------------------------------------------------------------- 293666a4d95SVijay Khemka ipmi_ret_t ipmiAppSetSysInfoParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 294666a4d95SVijay Khemka ipmi_request_t request, 295666a4d95SVijay Khemka ipmi_response_t response, 296666a4d95SVijay Khemka ipmi_data_len_t data_len, 297666a4d95SVijay Khemka ipmi_context_t context) 298666a4d95SVijay Khemka { 299666a4d95SVijay Khemka uint8_t* req = reinterpret_cast<uint8_t*>(request); 300666a4d95SVijay Khemka 301666a4d95SVijay Khemka uint8_t param = req[0]; 302666a4d95SVijay Khemka uint8_t req_len = *data_len; 303666a4d95SVijay Khemka 304666a4d95SVijay Khemka *data_len = 0; 305666a4d95SVijay Khemka 306666a4d95SVijay Khemka switch (param) 307666a4d95SVijay Khemka { 308666a4d95SVijay Khemka case SYS_INFO_PARAM_SET_IN_PROG: 309666a4d95SVijay Khemka sysInfoParams.set_in_prog = req[1]; 310666a4d95SVijay Khemka break; 311666a4d95SVijay Khemka case SYS_INFO_PARAM_SYSFW_VER: 312666a4d95SVijay Khemka memcpy(sysInfoParams.sysfw_ver, &req[1], SIZE_SYSFW_VER); 313666a4d95SVijay Khemka if (platSetSysFWVer(sysInfoParams.sysfw_ver)) 314666a4d95SVijay Khemka return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED; 315666a4d95SVijay Khemka break; 316666a4d95SVijay Khemka case SYS_INFO_PARAM_SYS_NAME: 317666a4d95SVijay Khemka memcpy(sysInfoParams.sys_name, &req[1], SIZE_SYS_NAME); 318666a4d95SVijay Khemka break; 319666a4d95SVijay Khemka case SYS_INFO_PARAM_PRI_OS_NAME: 320666a4d95SVijay Khemka memcpy(sysInfoParams.pri_os_name, &req[1], SIZE_OS_NAME); 321666a4d95SVijay Khemka break; 322666a4d95SVijay Khemka case SYS_INFO_PARAM_PRESENT_OS_NAME: 323666a4d95SVijay Khemka memcpy(sysInfoParams.present_os_name, &req[1], SIZE_OS_NAME); 324666a4d95SVijay Khemka break; 325666a4d95SVijay Khemka case SYS_INFO_PARAM_PRESENT_OS_VER: 326666a4d95SVijay Khemka memcpy(sysInfoParams.present_os_ver, &req[1], SIZE_OS_VER); 327666a4d95SVijay Khemka break; 328666a4d95SVijay Khemka case SYS_INFO_PARAM_BMC_URL: 329666a4d95SVijay Khemka memcpy(sysInfoParams.bmc_url, &req[1], SIZE_BMC_URL); 330666a4d95SVijay Khemka break; 331666a4d95SVijay Khemka case SYS_INFO_PARAM_OS_HV_URL: 332666a4d95SVijay Khemka memcpy(sysInfoParams.os_hv_url, &req[1], SIZE_OS_HV_URL); 333666a4d95SVijay Khemka break; 334666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST: 335666a4d95SVijay Khemka memcpy(sysInfoParams.bios_current_boot_list, &req[1], req_len); 336666a4d95SVijay Khemka appData[KEY_BIOS_BOOT_LEN] = req_len; 337666a4d95SVijay Khemka flush_app_data(); 338666a4d95SVijay Khemka break; 339666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE: 340666a4d95SVijay Khemka if (SIZE_BIOS_FIXED_BOOT_DEVICE != req_len) 341666a4d95SVijay Khemka break; 342666a4d95SVijay Khemka memcpy(sysInfoParams.bios_fixed_boot_device, &req[1], 343666a4d95SVijay Khemka SIZE_BIOS_FIXED_BOOT_DEVICE); 344666a4d95SVijay Khemka break; 345666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING: 346666a4d95SVijay Khemka if (SIZE_BIOS_RSTR_DFLT_SETTING != req_len) 347666a4d95SVijay Khemka break; 348666a4d95SVijay Khemka memcpy(sysInfoParams.bios_rstr_dflt_setting, &req[1], 349666a4d95SVijay Khemka SIZE_BIOS_RSTR_DFLT_SETTING); 350666a4d95SVijay Khemka break; 351666a4d95SVijay Khemka case SYS_INFO_PARAM_LAST_BOOT_TIME: 352666a4d95SVijay Khemka if (SIZE_LAST_BOOT_TIME != req_len) 353666a4d95SVijay Khemka break; 354666a4d95SVijay Khemka memcpy(sysInfoParams.last_boot_time, &req[1], SIZE_LAST_BOOT_TIME); 355666a4d95SVijay Khemka break; 356666a4d95SVijay Khemka default: 357666a4d95SVijay Khemka return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED; 358666a4d95SVijay Khemka break; 359666a4d95SVijay Khemka } 360666a4d95SVijay Khemka 361666a4d95SVijay Khemka return IPMI_CC_OK; 362666a4d95SVijay Khemka } 363666a4d95SVijay Khemka 364666a4d95SVijay Khemka //---------------------------------------------------------------------- 365666a4d95SVijay Khemka // Get Sys Info Params (IPMI/Sec 22.14b) (CMD_APP_GET_SYS_INFO_PARAMS) 366666a4d95SVijay Khemka //---------------------------------------------------------------------- 367666a4d95SVijay Khemka ipmi_ret_t ipmiAppGetSysInfoParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 368666a4d95SVijay Khemka ipmi_request_t request, 369666a4d95SVijay Khemka ipmi_response_t response, 370666a4d95SVijay Khemka ipmi_data_len_t data_len, 371666a4d95SVijay Khemka ipmi_context_t context) 372666a4d95SVijay Khemka { 373666a4d95SVijay Khemka uint8_t* req = reinterpret_cast<uint8_t*>(request); 374666a4d95SVijay Khemka uint8_t* res = reinterpret_cast<uint8_t*>(response); 375666a4d95SVijay Khemka 376666a4d95SVijay Khemka uint8_t param = req[1]; 377666a4d95SVijay Khemka uint8_t len; 378666a4d95SVijay Khemka 379666a4d95SVijay Khemka *res++ = 1; // Parameter revision 380666a4d95SVijay Khemka *data_len = 1; 381666a4d95SVijay Khemka 382666a4d95SVijay Khemka switch (param) 383666a4d95SVijay Khemka { 384666a4d95SVijay Khemka case SYS_INFO_PARAM_SET_IN_PROG: 385666a4d95SVijay Khemka *res++ = sysInfoParams.set_in_prog; 386666a4d95SVijay Khemka *data_len += 1; 387666a4d95SVijay Khemka break; 388666a4d95SVijay Khemka case SYS_INFO_PARAM_SYSFW_VER: 389666a4d95SVijay Khemka if ((len = platGetSysFWVer(res)) < 0) 390666a4d95SVijay Khemka return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED; 391666a4d95SVijay Khemka *data_len += SIZE_SYSFW_VER; 392666a4d95SVijay Khemka break; 393666a4d95SVijay Khemka case SYS_INFO_PARAM_SYS_NAME: 394666a4d95SVijay Khemka memcpy(res, sysInfoParams.sys_name, SIZE_SYS_NAME); 395666a4d95SVijay Khemka *data_len += SIZE_SYS_NAME; 396666a4d95SVijay Khemka break; 397666a4d95SVijay Khemka case SYS_INFO_PARAM_PRI_OS_NAME: 398666a4d95SVijay Khemka memcpy(res, sysInfoParams.pri_os_name, SIZE_OS_NAME); 399666a4d95SVijay Khemka *data_len += SIZE_OS_NAME; 400666a4d95SVijay Khemka break; 401666a4d95SVijay Khemka case SYS_INFO_PARAM_PRESENT_OS_NAME: 402666a4d95SVijay Khemka memcpy(res, sysInfoParams.present_os_name, SIZE_OS_NAME); 403666a4d95SVijay Khemka *data_len += SIZE_OS_NAME; 404666a4d95SVijay Khemka break; 405666a4d95SVijay Khemka case SYS_INFO_PARAM_PRESENT_OS_VER: 406666a4d95SVijay Khemka memcpy(res, sysInfoParams.present_os_ver, SIZE_OS_VER); 407666a4d95SVijay Khemka *data_len += SIZE_OS_VER; 408666a4d95SVijay Khemka break; 409666a4d95SVijay Khemka case SYS_INFO_PARAM_BMC_URL: 410666a4d95SVijay Khemka memcpy(res, sysInfoParams.bmc_url, SIZE_BMC_URL); 411666a4d95SVijay Khemka *data_len += SIZE_BMC_URL; 412666a4d95SVijay Khemka break; 413666a4d95SVijay Khemka case SYS_INFO_PARAM_OS_HV_URL: 414666a4d95SVijay Khemka memcpy(res, sysInfoParams.os_hv_url, SIZE_OS_HV_URL); 415666a4d95SVijay Khemka *data_len += SIZE_OS_HV_URL; 416666a4d95SVijay Khemka break; 417666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST: 418666a4d95SVijay Khemka len = appData[KEY_BIOS_BOOT_LEN].get<uint8_t>(); 419666a4d95SVijay Khemka memcpy(res, sysInfoParams.bios_current_boot_list, len); 420666a4d95SVijay Khemka *data_len += len; 421666a4d95SVijay Khemka break; 422666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE: 423666a4d95SVijay Khemka memcpy(res, sysInfoParams.bios_fixed_boot_device, 424666a4d95SVijay Khemka SIZE_BIOS_FIXED_BOOT_DEVICE); 425666a4d95SVijay Khemka *data_len += SIZE_BIOS_FIXED_BOOT_DEVICE; 426666a4d95SVijay Khemka break; 427666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING: 428666a4d95SVijay Khemka memcpy(res, sysInfoParams.bios_rstr_dflt_setting, 429666a4d95SVijay Khemka SIZE_BIOS_RSTR_DFLT_SETTING); 430666a4d95SVijay Khemka *data_len += SIZE_BIOS_RSTR_DFLT_SETTING; 431666a4d95SVijay Khemka break; 432666a4d95SVijay Khemka case SYS_INFO_PARAM_LAST_BOOT_TIME: 433666a4d95SVijay Khemka memcpy(res, sysInfoParams.last_boot_time, SIZE_LAST_BOOT_TIME); 434666a4d95SVijay Khemka *data_len += SIZE_LAST_BOOT_TIME; 435666a4d95SVijay Khemka break; 436666a4d95SVijay Khemka default: 437666a4d95SVijay Khemka return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED; 438666a4d95SVijay Khemka break; 439666a4d95SVijay Khemka } 440666a4d95SVijay Khemka return IPMI_CC_OK; 441666a4d95SVijay Khemka } 442666a4d95SVijay Khemka 443a2d52f12SVijay Khemka void registerAPPFunctions() 444a2d52f12SVijay Khemka { 445666a4d95SVijay Khemka /* Get App data stored in json file */ 446802ccb11SVijay Khemka std::ifstream file(JSON_APP_DATA_FILE); 447666a4d95SVijay Khemka if (file) 448802ccb11SVijay Khemka { 449666a4d95SVijay Khemka file >> appData; 450802ccb11SVijay Khemka file.close(); 451802ccb11SVijay Khemka } 452666a4d95SVijay Khemka 453666a4d95SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SELFTEST_RESULTS, NULL, 454666a4d95SVijay Khemka ipmiAppGetSTResults, 455666a4d95SVijay Khemka PRIVILEGE_USER); // Get Self Test Results 456666a4d95SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_MFR_TEST_ON, NULL, 457666a4d95SVijay Khemka ipmiAppMfrTestOn, 458666a4d95SVijay Khemka PRIVILEGE_USER); // Manufacturing Test On 459a2d52f12SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_GLOBAL_ENABLES, NULL, 460a2d52f12SVijay Khemka ipmiAppSetGlobalEnables, 461666a4d95SVijay Khemka PRIVILEGE_USER); // Set Global Enables 462a2d52f12SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_GLOBAL_ENABLES, NULL, 463a2d52f12SVijay Khemka ipmiAppGetGlobalEnables, 464a2d52f12SVijay Khemka PRIVILEGE_USER); // Get Global Enables 465666a4d95SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_CLEAR_MESSAGE_FLAGS, NULL, 466666a4d95SVijay Khemka ipmiAppClearMsgFlags, 467666a4d95SVijay Khemka PRIVILEGE_USER); // Clear Message flags 468*5f8e3435SManikandan Elumalai #if BIC_ENABLED 469*5f8e3435SManikandan Elumalai ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnApp, 470*5f8e3435SManikandan Elumalai ipmi::app::cmdGetSystemGuid, ipmi::Privilege::User, 471*5f8e3435SManikandan Elumalai ipmiAppGetSysGUID); 472*5f8e3435SManikandan Elumalai #else 473a2d52f12SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_GUID, NULL, 474a2d52f12SVijay Khemka ipmiAppGetSysGUID, 475a2d52f12SVijay Khemka PRIVILEGE_USER); // Get System GUID 476*5f8e3435SManikandan Elumalai #endif 477666a4d95SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_SYS_INFO_PARAMS, NULL, 478666a4d95SVijay Khemka ipmiAppSetSysInfoParams, 479666a4d95SVijay Khemka PRIVILEGE_USER); // Set Sys Info Params 480666a4d95SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_INFO_PARAMS, NULL, 481666a4d95SVijay Khemka ipmiAppGetSysInfoParams, 482666a4d95SVijay Khemka PRIVILEGE_USER); // Get Sys Info Params 483a2d52f12SVijay Khemka return; 484a2d52f12SVijay Khemka } 485a2d52f12SVijay Khemka 486a2d52f12SVijay Khemka } // namespace ipmi 487