1*a2d52f12SVijay Khemka /* 2*a2d52f12SVijay Khemka * Copyright (c) 2018 Intel Corporation. 3*a2d52f12SVijay Khemka * Copyright (c) 2018-present Facebook. 4*a2d52f12SVijay Khemka * 5*a2d52f12SVijay Khemka * Licensed under the Apache License, Version 2.0 (the "License"); 6*a2d52f12SVijay Khemka * you may not use this file except in compliance with the License. 7*a2d52f12SVijay Khemka * You may obtain a copy of the License at 8*a2d52f12SVijay Khemka * 9*a2d52f12SVijay Khemka * http://www.apache.org/licenses/LICENSE-2.0 10*a2d52f12SVijay Khemka * 11*a2d52f12SVijay Khemka * Unless required by applicable law or agreed to in writing, software 12*a2d52f12SVijay Khemka * distributed under the License is distributed on an "AS IS" BASIS, 13*a2d52f12SVijay Khemka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*a2d52f12SVijay Khemka * See the License for the specific language governing permissions and 15*a2d52f12SVijay Khemka * limitations under the License. 16*a2d52f12SVijay Khemka */ 17*a2d52f12SVijay Khemka 18*a2d52f12SVijay Khemka #include <ipmid/api.h> 19*a2d52f12SVijay Khemka 20*a2d52f12SVijay Khemka #include <sys/stat.h> 21*a2d52f12SVijay Khemka #include <fcntl.h> 22*a2d52f12SVijay Khemka #include <unistd.h> 23*a2d52f12SVijay Khemka #include <commandutils.hpp> 24*a2d52f12SVijay Khemka #include <iostream> 25*a2d52f12SVijay Khemka #include <phosphor-logging/log.hpp> 26*a2d52f12SVijay Khemka #include <sdbusplus/message/types.hpp> 27*a2d52f12SVijay Khemka #include <appcommands.hpp> 28*a2d52f12SVijay Khemka 29*a2d52f12SVijay Khemka namespace ipmi 30*a2d52f12SVijay Khemka { 31*a2d52f12SVijay Khemka 32*a2d52f12SVijay Khemka static void registerAPPFunctions() __attribute__((constructor)); 33*a2d52f12SVijay Khemka static constexpr size_t GUID_SIZE = 16; 34*a2d52f12SVijay Khemka // TODO Make offset and location runtime configurable to ensure we 35*a2d52f12SVijay Khemka // can make each define their own locations. 36*a2d52f12SVijay Khemka static constexpr off_t OFFSET_SYS_GUID = 0x17F0; 37*a2d52f12SVijay Khemka static constexpr off_t OFFSET_DEV_GUID = 0x1800; 38*a2d52f12SVijay Khemka static constexpr const char *FRU_EEPROM = "/sys/bus/i2c/devices/6-0054/eeprom"; 39*a2d52f12SVijay Khemka static uint8_t globEna = 0x09; 40*a2d52f12SVijay Khemka 41*a2d52f12SVijay Khemka void printGUID(uint8_t *guid, off_t offset) 42*a2d52f12SVijay Khemka { 43*a2d52f12SVijay Khemka std::cout << "Read GUID from offset : " << offset << " :\n"; 44*a2d52f12SVijay Khemka for (int i = 0; i < GUID_SIZE; i++) 45*a2d52f12SVijay Khemka { 46*a2d52f12SVijay Khemka int data = guid[i]; 47*a2d52f12SVijay Khemka std::cout << std::hex << data << " "; 48*a2d52f12SVijay Khemka } 49*a2d52f12SVijay Khemka std::cout << std::endl; 50*a2d52f12SVijay Khemka } 51*a2d52f12SVijay Khemka 52*a2d52f12SVijay Khemka int getGUID(off_t offset, uint8_t *guid) 53*a2d52f12SVijay Khemka { 54*a2d52f12SVijay Khemka int fd = -1; 55*a2d52f12SVijay Khemka ssize_t bytes_rd; 56*a2d52f12SVijay Khemka int ret = 0; 57*a2d52f12SVijay Khemka 58*a2d52f12SVijay Khemka errno = 0; 59*a2d52f12SVijay Khemka 60*a2d52f12SVijay Khemka // Check if file is present 61*a2d52f12SVijay Khemka if (access(FRU_EEPROM, F_OK) == -1) 62*a2d52f12SVijay Khemka { 63*a2d52f12SVijay Khemka std::cerr << "Unable to access: " << FRU_EEPROM << std::endl; 64*a2d52f12SVijay Khemka return errno; 65*a2d52f12SVijay Khemka } 66*a2d52f12SVijay Khemka 67*a2d52f12SVijay Khemka // Open the file 68*a2d52f12SVijay Khemka fd = open(FRU_EEPROM, O_RDONLY); 69*a2d52f12SVijay Khemka if (fd == -1) 70*a2d52f12SVijay Khemka { 71*a2d52f12SVijay Khemka std::cerr << "Unable to open: " << FRU_EEPROM << std::endl; 72*a2d52f12SVijay Khemka return errno; 73*a2d52f12SVijay Khemka } 74*a2d52f12SVijay Khemka 75*a2d52f12SVijay Khemka // seek to the offset 76*a2d52f12SVijay Khemka lseek(fd, offset, SEEK_SET); 77*a2d52f12SVijay Khemka 78*a2d52f12SVijay Khemka // Read bytes from location 79*a2d52f12SVijay Khemka bytes_rd = read(fd, guid, GUID_SIZE); 80*a2d52f12SVijay Khemka if (bytes_rd != GUID_SIZE) 81*a2d52f12SVijay Khemka { 82*a2d52f12SVijay Khemka phosphor::logging::log<phosphor::logging::level::ERR>( 83*a2d52f12SVijay Khemka "GUID read data from EEPROM failed"); 84*a2d52f12SVijay Khemka ret = errno; 85*a2d52f12SVijay Khemka } 86*a2d52f12SVijay Khemka else 87*a2d52f12SVijay Khemka { 88*a2d52f12SVijay Khemka printGUID(guid, offset); 89*a2d52f12SVijay Khemka } 90*a2d52f12SVijay Khemka close(fd); 91*a2d52f12SVijay Khemka return ret; 92*a2d52f12SVijay Khemka } 93*a2d52f12SVijay Khemka 94*a2d52f12SVijay Khemka int getSystemGUID(uint8_t *guid) 95*a2d52f12SVijay Khemka { 96*a2d52f12SVijay Khemka return getGUID(OFFSET_SYS_GUID, guid); 97*a2d52f12SVijay Khemka } 98*a2d52f12SVijay Khemka 99*a2d52f12SVijay Khemka int getDeviceGUID(uint8_t *guid) 100*a2d52f12SVijay Khemka { 101*a2d52f12SVijay Khemka return getGUID(OFFSET_DEV_GUID, guid); 102*a2d52f12SVijay Khemka } 103*a2d52f12SVijay Khemka 104*a2d52f12SVijay Khemka //---------------------------------------------------------------------- 105*a2d52f12SVijay Khemka // Get Device GUID (CMD_APP_GET_DEV_GUID) 106*a2d52f12SVijay Khemka //---------------------------------------------------------------------- 107*a2d52f12SVijay Khemka ipmi_ret_t ipmiAppGetDevGUID(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 108*a2d52f12SVijay Khemka ipmi_request_t request, ipmi_response_t response, 109*a2d52f12SVijay Khemka ipmi_data_len_t data_len, ipmi_context_t context) 110*a2d52f12SVijay Khemka { 111*a2d52f12SVijay Khemka uint8_t *res = reinterpret_cast<uint8_t *>(response); 112*a2d52f12SVijay Khemka 113*a2d52f12SVijay Khemka if (getDeviceGUID(res)) 114*a2d52f12SVijay Khemka { 115*a2d52f12SVijay Khemka return IPMI_CC_UNSPECIFIED_ERROR; 116*a2d52f12SVijay Khemka } 117*a2d52f12SVijay Khemka *data_len = GUID_SIZE; 118*a2d52f12SVijay Khemka 119*a2d52f12SVijay Khemka return IPMI_CC_OK; 120*a2d52f12SVijay Khemka } 121*a2d52f12SVijay Khemka 122*a2d52f12SVijay Khemka //---------------------------------------------------------------------- 123*a2d52f12SVijay Khemka // Set Global Enables (CMD_APP_SET_GLOBAL_ENABLES) 124*a2d52f12SVijay Khemka //---------------------------------------------------------------------- 125*a2d52f12SVijay Khemka ipmi_ret_t ipmiAppSetGlobalEnables(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 126*a2d52f12SVijay Khemka ipmi_request_t request, 127*a2d52f12SVijay Khemka ipmi_response_t response, 128*a2d52f12SVijay Khemka ipmi_data_len_t data_len, 129*a2d52f12SVijay Khemka ipmi_context_t context) 130*a2d52f12SVijay Khemka { 131*a2d52f12SVijay Khemka uint8_t *req = reinterpret_cast<uint8_t *>(request); 132*a2d52f12SVijay Khemka 133*a2d52f12SVijay Khemka globEna = *req; 134*a2d52f12SVijay Khemka *data_len = 0; 135*a2d52f12SVijay Khemka 136*a2d52f12SVijay Khemka return IPMI_CC_OK; 137*a2d52f12SVijay Khemka } 138*a2d52f12SVijay Khemka 139*a2d52f12SVijay Khemka //---------------------------------------------------------------------- 140*a2d52f12SVijay Khemka // Get Global Enables (CMD_APP_GET_GLOBAL_ENABLES) 141*a2d52f12SVijay Khemka //---------------------------------------------------------------------- 142*a2d52f12SVijay Khemka ipmi_ret_t ipmiAppGetGlobalEnables(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 143*a2d52f12SVijay Khemka ipmi_request_t request, 144*a2d52f12SVijay Khemka ipmi_response_t response, 145*a2d52f12SVijay Khemka ipmi_data_len_t data_len, 146*a2d52f12SVijay Khemka ipmi_context_t context) 147*a2d52f12SVijay Khemka { 148*a2d52f12SVijay Khemka uint8_t *res = reinterpret_cast<uint8_t *>(response); 149*a2d52f12SVijay Khemka 150*a2d52f12SVijay Khemka *data_len = 1; 151*a2d52f12SVijay Khemka *res++ = globEna; 152*a2d52f12SVijay Khemka 153*a2d52f12SVijay Khemka return IPMI_CC_OK; 154*a2d52f12SVijay Khemka } 155*a2d52f12SVijay Khemka 156*a2d52f12SVijay Khemka //---------------------------------------------------------------------- 157*a2d52f12SVijay Khemka // Get System GUID (CMD_APP_GET_SYS_GUID) 158*a2d52f12SVijay Khemka //---------------------------------------------------------------------- 159*a2d52f12SVijay Khemka ipmi_ret_t ipmiAppGetSysGUID(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 160*a2d52f12SVijay Khemka ipmi_request_t request, ipmi_response_t response, 161*a2d52f12SVijay Khemka ipmi_data_len_t data_len, ipmi_context_t context) 162*a2d52f12SVijay Khemka { 163*a2d52f12SVijay Khemka uint8_t *res = reinterpret_cast<uint8_t *>(response); 164*a2d52f12SVijay Khemka if (getSystemGUID(res)) 165*a2d52f12SVijay Khemka { 166*a2d52f12SVijay Khemka return IPMI_CC_UNSPECIFIED_ERROR; 167*a2d52f12SVijay Khemka } 168*a2d52f12SVijay Khemka *data_len = GUID_SIZE; 169*a2d52f12SVijay Khemka return IPMI_CC_OK; 170*a2d52f12SVijay Khemka } 171*a2d52f12SVijay Khemka 172*a2d52f12SVijay Khemka void registerAPPFunctions() 173*a2d52f12SVijay Khemka { 174*a2d52f12SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_DEV_GUID, NULL, 175*a2d52f12SVijay Khemka ipmiAppGetDevGUID, 176*a2d52f12SVijay Khemka PRIVILEGE_USER); // Get Device GUID 177*a2d52f12SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_SET_GLOBAL_ENABLES, NULL, 178*a2d52f12SVijay Khemka ipmiAppSetGlobalEnables, 179*a2d52f12SVijay Khemka PRIVILEGE_USER); // Get Global Enables 180*a2d52f12SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_GLOBAL_ENABLES, NULL, 181*a2d52f12SVijay Khemka ipmiAppGetGlobalEnables, 182*a2d52f12SVijay Khemka PRIVILEGE_USER); // Get Global Enables 183*a2d52f12SVijay Khemka ipmiPrintAndRegister(NETFUN_APP, CMD_APP_GET_SYS_GUID, NULL, 184*a2d52f12SVijay Khemka ipmiAppGetSysGUID, 185*a2d52f12SVijay Khemka PRIVILEGE_USER); // Get System GUID 186*a2d52f12SVijay Khemka 187*a2d52f12SVijay Khemka return; 188*a2d52f12SVijay Khemka } 189*a2d52f12SVijay Khemka 190*a2d52f12SVijay Khemka } // namespace ipmi 191