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> 285f8e3435SManikandan Elumalai #include <ipmid/api.hpp> 295f8e3435SManikandan 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 515f8e3435SManikandan Elumalai int sendBicCmd(uint8_t, uint8_t, uint8_t, std::vector<uint8_t>&, 525f8e3435SManikandan Elumalai std::vector<uint8_t>&); 535f8e3435SManikandan Elumalai 54a2d52f12SVijay Khemka void printGUID(uint8_t* guid, off_t offset) 55a2d52f12SVijay Khemka { 56a2d52f12SVijay Khemka std::cout << "Read GUID from offset : " << offset << " :\n"; 57*e39f9393SWilly Tu for (size_t 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 //---------------------------------------------------------------------- 115*e39f9393SWilly Tu ipmi_ret_t ipmiAppGetSTResults(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t, 116*e39f9393SWilly Tu ipmi_response_t response, 117*e39f9393SWilly Tu ipmi_data_len_t data_len, ipmi_context_t) 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 //---------------------------------------------------------------------- 133*e39f9393SWilly Tu ipmi_ret_t ipmiAppMfrTestOn(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request, 134*e39f9393SWilly Tu ipmi_response_t, ipmi_data_len_t data_len, 135*e39f9393SWilly Tu ipmi_context_t) 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 //---------------------------------------------------------------------- 159*e39f9393SWilly Tu ipmi_ret_t ipmiAppSetGlobalEnables(ipmi_netfn_t, ipmi_cmd_t, 160*e39f9393SWilly Tu ipmi_request_t request, ipmi_response_t, 161*e39f9393SWilly Tu ipmi_data_len_t data_len, ipmi_context_t) 162a2d52f12SVijay Khemka { 163a2d52f12SVijay Khemka uint8_t* req = reinterpret_cast<uint8_t*>(request); 164a2d52f12SVijay Khemka 165a2d52f12SVijay Khemka globEna = *req; 166a2d52f12SVijay Khemka *data_len = 0; 167a2d52f12SVijay Khemka 168a2d52f12SVijay Khemka return IPMI_CC_OK; 169a2d52f12SVijay Khemka } 170a2d52f12SVijay Khemka 171a2d52f12SVijay Khemka //---------------------------------------------------------------------- 172a2d52f12SVijay Khemka // Get Global Enables (CMD_APP_GET_GLOBAL_ENABLES) 173a2d52f12SVijay Khemka //---------------------------------------------------------------------- 174*e39f9393SWilly Tu ipmi_ret_t ipmiAppGetGlobalEnables(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t, 175a2d52f12SVijay Khemka ipmi_response_t response, 176*e39f9393SWilly Tu ipmi_data_len_t data_len, ipmi_context_t) 177a2d52f12SVijay Khemka { 178a2d52f12SVijay Khemka uint8_t* res = reinterpret_cast<uint8_t*>(response); 179a2d52f12SVijay Khemka 180a2d52f12SVijay Khemka *data_len = 1; 181a2d52f12SVijay Khemka *res++ = globEna; 182a2d52f12SVijay Khemka 183a2d52f12SVijay Khemka return IPMI_CC_OK; 184a2d52f12SVijay Khemka } 185a2d52f12SVijay Khemka 186a2d52f12SVijay Khemka //---------------------------------------------------------------------- 187666a4d95SVijay Khemka // Clear Message flags (IPMI/Section 22.3) (CMD_APP_CLEAR_MESSAGE_FLAGS) 188666a4d95SVijay Khemka //---------------------------------------------------------------------- 189*e39f9393SWilly Tu ipmi_ret_t ipmiAppClearMsgFlags(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t, 190*e39f9393SWilly Tu ipmi_response_t, ipmi_data_len_t data_len, 191*e39f9393SWilly Tu ipmi_context_t) 192666a4d95SVijay Khemka { 193666a4d95SVijay Khemka // Do Nothing and just return success 194666a4d95SVijay Khemka *data_len = 0; 195666a4d95SVijay Khemka 196666a4d95SVijay Khemka return IPMI_CC_OK; 197666a4d95SVijay Khemka } 198666a4d95SVijay Khemka 199666a4d95SVijay Khemka //---------------------------------------------------------------------- 200a2d52f12SVijay Khemka // Get System GUID (CMD_APP_GET_SYS_GUID) 201a2d52f12SVijay Khemka //---------------------------------------------------------------------- 2025f8e3435SManikandan Elumalai #if BIC_ENABLED 2035f8e3435SManikandan Elumalai ipmi::RspType<std::vector<uint8_t>> 2045f8e3435SManikandan Elumalai ipmiAppGetSysGUID(ipmi::Context::ptr ctx, std::vector<uint8_t> reqData) 2055f8e3435SManikandan Elumalai 2065f8e3435SManikandan Elumalai { 2075f8e3435SManikandan Elumalai std::vector<uint8_t> respData; 2085f8e3435SManikandan Elumalai 2095f8e3435SManikandan Elumalai uint8_t bicAddr = (uint8_t)ctx->hostIdx << 2; 2105f8e3435SManikandan Elumalai 2115f8e3435SManikandan Elumalai if (sendBicCmd(ctx->netFn, ctx->cmd, bicAddr, reqData, respData)) 2125f8e3435SManikandan Elumalai return ipmi::responseUnspecifiedError(); 2135f8e3435SManikandan Elumalai 2145f8e3435SManikandan Elumalai return ipmi::responseSuccess(respData); 2155f8e3435SManikandan Elumalai } 2165f8e3435SManikandan Elumalai 2175f8e3435SManikandan Elumalai #else 218*e39f9393SWilly Tu ipmi_ret_t ipmiAppGetSysGUID(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t, 219*e39f9393SWilly Tu ipmi_response_t response, ipmi_data_len_t data_len, 220*e39f9393SWilly Tu ipmi_context_t) 221a2d52f12SVijay Khemka { 222a2d52f12SVijay Khemka uint8_t* res = reinterpret_cast<uint8_t*>(response); 223a2d52f12SVijay Khemka if (getSystemGUID(res)) 224a2d52f12SVijay Khemka { 225a2d52f12SVijay Khemka return IPMI_CC_UNSPECIFIED_ERROR; 226a2d52f12SVijay Khemka } 227a2d52f12SVijay Khemka *data_len = GUID_SIZE; 228a2d52f12SVijay Khemka return IPMI_CC_OK; 229a2d52f12SVijay Khemka } 230a2d52f12SVijay Khemka 2315f8e3435SManikandan Elumalai #endif 2325f8e3435SManikandan Elumalai 233666a4d95SVijay Khemka //---------------------------------------------------------------------- 234666a4d95SVijay Khemka // Platform specific functions for storing app data 235666a4d95SVijay Khemka //---------------------------------------------------------------------- 236666a4d95SVijay Khemka 237666a4d95SVijay Khemka void flush_app_data() 238666a4d95SVijay Khemka { 239802ccb11SVijay Khemka std::ofstream file(JSON_APP_DATA_FILE); 240666a4d95SVijay Khemka file << appData; 241802ccb11SVijay Khemka file.close(); 242666a4d95SVijay Khemka return; 243666a4d95SVijay Khemka } 244666a4d95SVijay Khemka 245666a4d95SVijay Khemka static int platSetSysFWVer(uint8_t* ver) 246666a4d95SVijay Khemka { 247666a4d95SVijay Khemka std::stringstream ss; 248666a4d95SVijay Khemka int i; 249666a4d95SVijay Khemka 250666a4d95SVijay Khemka /* TODO: implement byte 1: Set selector 251666a4d95SVijay Khemka * byte 2: encodeing, currently only supported 252666a4d95SVijay Khemka * ASCII which is value 0, UTF and unicode are 253666a4d95SVijay Khemka * not supported yet. 254666a4d95SVijay Khemka */ 255666a4d95SVijay Khemka if (ver[1] & 0x0f) 256666a4d95SVijay Khemka return -1; 257666a4d95SVijay Khemka 258666a4d95SVijay Khemka for (i = 3; i < 3 + ver[2]; i++) 259666a4d95SVijay Khemka { 260666a4d95SVijay Khemka ss << (char)ver[i]; 261666a4d95SVijay Khemka } 262666a4d95SVijay Khemka 263666a4d95SVijay Khemka appData[KEY_SYSFW_VER] = ss.str(); 264666a4d95SVijay Khemka flush_app_data(); 265666a4d95SVijay Khemka 266666a4d95SVijay Khemka return 0; 267666a4d95SVijay Khemka } 268666a4d95SVijay Khemka 269666a4d95SVijay Khemka static int platGetSysFWVer(uint8_t* ver) 270666a4d95SVijay Khemka { 271666a4d95SVijay Khemka std::string str = appData[KEY_SYSFW_VER].get<std::string>(); 272666a4d95SVijay Khemka int len; 273666a4d95SVijay Khemka 274666a4d95SVijay Khemka *ver++ = 0; // byte 1: Set selector not supported 275666a4d95SVijay Khemka *ver++ = 0; // byte 2: Only ASCII supported 276666a4d95SVijay Khemka 277666a4d95SVijay Khemka len = str.length(); 278666a4d95SVijay Khemka *ver++ = len; 279666a4d95SVijay Khemka memcpy(ver, str.data(), len); 280666a4d95SVijay Khemka 281666a4d95SVijay Khemka return (len + 3); 282666a4d95SVijay Khemka } 283666a4d95SVijay Khemka 284666a4d95SVijay Khemka //---------------------------------------------------------------------- 285666a4d95SVijay Khemka // Set Sys Info Params (IPMI/Sec 22.14a) (CMD_APP_SET_SYS_INFO_PARAMS) 286666a4d95SVijay Khemka //---------------------------------------------------------------------- 287*e39f9393SWilly Tu ipmi_ret_t ipmiAppSetSysInfoParams(ipmi_netfn_t, ipmi_cmd_t, 288*e39f9393SWilly Tu ipmi_request_t request, ipmi_response_t, 289*e39f9393SWilly Tu ipmi_data_len_t data_len, ipmi_context_t) 290666a4d95SVijay Khemka { 291666a4d95SVijay Khemka uint8_t* req = reinterpret_cast<uint8_t*>(request); 292666a4d95SVijay Khemka 293666a4d95SVijay Khemka uint8_t param = req[0]; 294666a4d95SVijay Khemka uint8_t req_len = *data_len; 295666a4d95SVijay Khemka 296666a4d95SVijay Khemka *data_len = 0; 297666a4d95SVijay Khemka 298666a4d95SVijay Khemka switch (param) 299666a4d95SVijay Khemka { 300666a4d95SVijay Khemka case SYS_INFO_PARAM_SET_IN_PROG: 301666a4d95SVijay Khemka sysInfoParams.set_in_prog = req[1]; 302666a4d95SVijay Khemka break; 303666a4d95SVijay Khemka case SYS_INFO_PARAM_SYSFW_VER: 304666a4d95SVijay Khemka memcpy(sysInfoParams.sysfw_ver, &req[1], SIZE_SYSFW_VER); 305666a4d95SVijay Khemka if (platSetSysFWVer(sysInfoParams.sysfw_ver)) 306666a4d95SVijay Khemka return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED; 307666a4d95SVijay Khemka break; 308666a4d95SVijay Khemka case SYS_INFO_PARAM_SYS_NAME: 309666a4d95SVijay Khemka memcpy(sysInfoParams.sys_name, &req[1], SIZE_SYS_NAME); 310666a4d95SVijay Khemka break; 311666a4d95SVijay Khemka case SYS_INFO_PARAM_PRI_OS_NAME: 312666a4d95SVijay Khemka memcpy(sysInfoParams.pri_os_name, &req[1], SIZE_OS_NAME); 313666a4d95SVijay Khemka break; 314666a4d95SVijay Khemka case SYS_INFO_PARAM_PRESENT_OS_NAME: 315666a4d95SVijay Khemka memcpy(sysInfoParams.present_os_name, &req[1], SIZE_OS_NAME); 316666a4d95SVijay Khemka break; 317666a4d95SVijay Khemka case SYS_INFO_PARAM_PRESENT_OS_VER: 318666a4d95SVijay Khemka memcpy(sysInfoParams.present_os_ver, &req[1], SIZE_OS_VER); 319666a4d95SVijay Khemka break; 320666a4d95SVijay Khemka case SYS_INFO_PARAM_BMC_URL: 321666a4d95SVijay Khemka memcpy(sysInfoParams.bmc_url, &req[1], SIZE_BMC_URL); 322666a4d95SVijay Khemka break; 323666a4d95SVijay Khemka case SYS_INFO_PARAM_OS_HV_URL: 324666a4d95SVijay Khemka memcpy(sysInfoParams.os_hv_url, &req[1], SIZE_OS_HV_URL); 325666a4d95SVijay Khemka break; 326666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST: 327666a4d95SVijay Khemka memcpy(sysInfoParams.bios_current_boot_list, &req[1], req_len); 328666a4d95SVijay Khemka appData[KEY_BIOS_BOOT_LEN] = req_len; 329666a4d95SVijay Khemka flush_app_data(); 330666a4d95SVijay Khemka break; 331666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE: 332666a4d95SVijay Khemka if (SIZE_BIOS_FIXED_BOOT_DEVICE != req_len) 333666a4d95SVijay Khemka break; 334666a4d95SVijay Khemka memcpy(sysInfoParams.bios_fixed_boot_device, &req[1], 335666a4d95SVijay Khemka SIZE_BIOS_FIXED_BOOT_DEVICE); 336666a4d95SVijay Khemka break; 337666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING: 338666a4d95SVijay Khemka if (SIZE_BIOS_RSTR_DFLT_SETTING != req_len) 339666a4d95SVijay Khemka break; 340666a4d95SVijay Khemka memcpy(sysInfoParams.bios_rstr_dflt_setting, &req[1], 341666a4d95SVijay Khemka SIZE_BIOS_RSTR_DFLT_SETTING); 342666a4d95SVijay Khemka break; 343666a4d95SVijay Khemka case SYS_INFO_PARAM_LAST_BOOT_TIME: 344666a4d95SVijay Khemka if (SIZE_LAST_BOOT_TIME != req_len) 345666a4d95SVijay Khemka break; 346666a4d95SVijay Khemka memcpy(sysInfoParams.last_boot_time, &req[1], SIZE_LAST_BOOT_TIME); 347666a4d95SVijay Khemka break; 348666a4d95SVijay Khemka default: 349666a4d95SVijay Khemka return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED; 350666a4d95SVijay Khemka break; 351666a4d95SVijay Khemka } 352666a4d95SVijay Khemka 353666a4d95SVijay Khemka return IPMI_CC_OK; 354666a4d95SVijay Khemka } 355666a4d95SVijay Khemka 356666a4d95SVijay Khemka //---------------------------------------------------------------------- 357666a4d95SVijay Khemka // Get Sys Info Params (IPMI/Sec 22.14b) (CMD_APP_GET_SYS_INFO_PARAMS) 358666a4d95SVijay Khemka //---------------------------------------------------------------------- 359*e39f9393SWilly Tu ipmi_ret_t ipmiAppGetSysInfoParams(ipmi_netfn_t, ipmi_cmd_t, 360666a4d95SVijay Khemka ipmi_request_t request, 361666a4d95SVijay Khemka ipmi_response_t response, 362*e39f9393SWilly Tu ipmi_data_len_t data_len, ipmi_context_t) 363666a4d95SVijay Khemka { 364666a4d95SVijay Khemka uint8_t* req = reinterpret_cast<uint8_t*>(request); 365666a4d95SVijay Khemka uint8_t* res = reinterpret_cast<uint8_t*>(response); 366666a4d95SVijay Khemka 367666a4d95SVijay Khemka uint8_t param = req[1]; 368*e39f9393SWilly Tu int len; 369666a4d95SVijay Khemka 370666a4d95SVijay Khemka *res++ = 1; // Parameter revision 371666a4d95SVijay Khemka *data_len = 1; 372666a4d95SVijay Khemka 373666a4d95SVijay Khemka switch (param) 374666a4d95SVijay Khemka { 375666a4d95SVijay Khemka case SYS_INFO_PARAM_SET_IN_PROG: 376666a4d95SVijay Khemka *res++ = sysInfoParams.set_in_prog; 377666a4d95SVijay Khemka *data_len += 1; 378666a4d95SVijay Khemka break; 379666a4d95SVijay Khemka case SYS_INFO_PARAM_SYSFW_VER: 380666a4d95SVijay Khemka if ((len = platGetSysFWVer(res)) < 0) 381666a4d95SVijay Khemka return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED; 382666a4d95SVijay Khemka *data_len += SIZE_SYSFW_VER; 383666a4d95SVijay Khemka break; 384666a4d95SVijay Khemka case SYS_INFO_PARAM_SYS_NAME: 385666a4d95SVijay Khemka memcpy(res, sysInfoParams.sys_name, SIZE_SYS_NAME); 386666a4d95SVijay Khemka *data_len += SIZE_SYS_NAME; 387666a4d95SVijay Khemka break; 388666a4d95SVijay Khemka case SYS_INFO_PARAM_PRI_OS_NAME: 389666a4d95SVijay Khemka memcpy(res, sysInfoParams.pri_os_name, SIZE_OS_NAME); 390666a4d95SVijay Khemka *data_len += SIZE_OS_NAME; 391666a4d95SVijay Khemka break; 392666a4d95SVijay Khemka case SYS_INFO_PARAM_PRESENT_OS_NAME: 393666a4d95SVijay Khemka memcpy(res, sysInfoParams.present_os_name, SIZE_OS_NAME); 394666a4d95SVijay Khemka *data_len += SIZE_OS_NAME; 395666a4d95SVijay Khemka break; 396666a4d95SVijay Khemka case SYS_INFO_PARAM_PRESENT_OS_VER: 397666a4d95SVijay Khemka memcpy(res, sysInfoParams.present_os_ver, SIZE_OS_VER); 398666a4d95SVijay Khemka *data_len += SIZE_OS_VER; 399666a4d95SVijay Khemka break; 400666a4d95SVijay Khemka case SYS_INFO_PARAM_BMC_URL: 401666a4d95SVijay Khemka memcpy(res, sysInfoParams.bmc_url, SIZE_BMC_URL); 402666a4d95SVijay Khemka *data_len += SIZE_BMC_URL; 403666a4d95SVijay Khemka break; 404666a4d95SVijay Khemka case SYS_INFO_PARAM_OS_HV_URL: 405666a4d95SVijay Khemka memcpy(res, sysInfoParams.os_hv_url, SIZE_OS_HV_URL); 406666a4d95SVijay Khemka *data_len += SIZE_OS_HV_URL; 407666a4d95SVijay Khemka break; 408666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST: 409666a4d95SVijay Khemka len = appData[KEY_BIOS_BOOT_LEN].get<uint8_t>(); 410666a4d95SVijay Khemka memcpy(res, sysInfoParams.bios_current_boot_list, len); 411666a4d95SVijay Khemka *data_len += len; 412666a4d95SVijay Khemka break; 413666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE: 414666a4d95SVijay Khemka memcpy(res, sysInfoParams.bios_fixed_boot_device, 415666a4d95SVijay Khemka SIZE_BIOS_FIXED_BOOT_DEVICE); 416666a4d95SVijay Khemka *data_len += SIZE_BIOS_FIXED_BOOT_DEVICE; 417666a4d95SVijay Khemka break; 418666a4d95SVijay Khemka case SYS_INFO_PARAM_BIOS_RSTR_DFLT_SETTING: 419666a4d95SVijay Khemka memcpy(res, sysInfoParams.bios_rstr_dflt_setting, 420666a4d95SVijay Khemka SIZE_BIOS_RSTR_DFLT_SETTING); 421666a4d95SVijay Khemka *data_len += SIZE_BIOS_RSTR_DFLT_SETTING; 422666a4d95SVijay Khemka break; 423666a4d95SVijay Khemka case SYS_INFO_PARAM_LAST_BOOT_TIME: 424666a4d95SVijay Khemka memcpy(res, sysInfoParams.last_boot_time, SIZE_LAST_BOOT_TIME); 425666a4d95SVijay Khemka *data_len += SIZE_LAST_BOOT_TIME; 426666a4d95SVijay Khemka break; 427666a4d95SVijay Khemka default: 428666a4d95SVijay Khemka return IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED; 429666a4d95SVijay Khemka break; 430666a4d95SVijay Khemka } 431666a4d95SVijay Khemka return IPMI_CC_OK; 432666a4d95SVijay Khemka } 433666a4d95SVijay Khemka 434a2d52f12SVijay Khemka void registerAPPFunctions() 435a2d52f12SVijay Khemka { 436666a4d95SVijay Khemka /* Get App data stored in json file */ 437802ccb11SVijay Khemka std::ifstream file(JSON_APP_DATA_FILE); 438666a4d95SVijay Khemka if (file) 439802ccb11SVijay Khemka { 440666a4d95SVijay Khemka file >> appData; 441802ccb11SVijay Khemka file.close(); 442802ccb11SVijay Khemka } 443666a4d95SVijay Khemka 444666a4d95SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SELFTEST_RESULTS, NULL, 445666a4d95SVijay Khemka ipmiAppGetSTResults, 446666a4d95SVijay Khemka PRIVILEGE_USER); // Get Self Test Results 447666a4d95SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_MFR_TEST_ON, NULL, 448666a4d95SVijay Khemka ipmiAppMfrTestOn, 449666a4d95SVijay Khemka PRIVILEGE_USER); // Manufacturing Test On 450a2d52f12SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_GLOBAL_ENABLES, NULL, 451a2d52f12SVijay Khemka ipmiAppSetGlobalEnables, 452666a4d95SVijay Khemka PRIVILEGE_USER); // Set Global Enables 453a2d52f12SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_GLOBAL_ENABLES, NULL, 454a2d52f12SVijay Khemka ipmiAppGetGlobalEnables, 455a2d52f12SVijay Khemka PRIVILEGE_USER); // Get Global Enables 456666a4d95SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_CLEAR_MESSAGE_FLAGS, NULL, 457666a4d95SVijay Khemka ipmiAppClearMsgFlags, 458666a4d95SVijay Khemka PRIVILEGE_USER); // Clear Message flags 4595f8e3435SManikandan Elumalai #if BIC_ENABLED 4605f8e3435SManikandan Elumalai ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnApp, 4615f8e3435SManikandan Elumalai ipmi::app::cmdGetSystemGuid, ipmi::Privilege::User, 4625f8e3435SManikandan Elumalai ipmiAppGetSysGUID); 4635f8e3435SManikandan Elumalai #else 464a2d52f12SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_GUID, NULL, 465a2d52f12SVijay Khemka ipmiAppGetSysGUID, 466a2d52f12SVijay Khemka PRIVILEGE_USER); // Get System GUID 4675f8e3435SManikandan Elumalai #endif 468666a4d95SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_SYS_INFO_PARAMS, NULL, 469666a4d95SVijay Khemka ipmiAppSetSysInfoParams, 470666a4d95SVijay Khemka PRIVILEGE_USER); // Set Sys Info Params 471666a4d95SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_INFO_PARAMS, NULL, 472666a4d95SVijay Khemka ipmiAppGetSysInfoParams, 473666a4d95SVijay Khemka PRIVILEGE_USER); // Get Sys Info Params 474a2d52f12SVijay Khemka return; 475a2d52f12SVijay Khemka } 476a2d52f12SVijay Khemka 477a2d52f12SVijay Khemka } // namespace ipmi 478