xref: /openbmc/fb-ipmi-oem/src/appcommands.cpp (revision a2d52f12)
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