xref: /openbmc/fb-ipmi-oem/include/commandutils.hpp (revision 010dee0487db34138e6311a5bbb51e0f7683de30)
1e7d23d0eSVijay Khemka /*
2e7d23d0eSVijay Khemka  * Copyright (c)  2018 Intel Corporation.
3e7d23d0eSVijay Khemka  *
4e7d23d0eSVijay Khemka  * Licensed under the Apache License, Version 2.0 (the "License");
5e7d23d0eSVijay Khemka  * you may not use this file except in compliance with the License.
6e7d23d0eSVijay Khemka  * You may obtain a copy of the License at
7e7d23d0eSVijay Khemka  *
8e7d23d0eSVijay Khemka  *      http://www.apache.org/licenses/LICENSE-2.0
9e7d23d0eSVijay Khemka  *
10e7d23d0eSVijay Khemka  * Unless required by applicable law or agreed to in writing, software
11e7d23d0eSVijay Khemka  * distributed under the License is distributed on an "AS IS" BASIS,
12e7d23d0eSVijay Khemka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e7d23d0eSVijay Khemka  * See the License for the specific language governing permissions and
14e7d23d0eSVijay Khemka  * limitations under the License.
15e7d23d0eSVijay Khemka  */
16e7d23d0eSVijay Khemka 
17e7d23d0eSVijay Khemka #pragma once
182405ae98SPatrick Williams #include "config.h"
192405ae98SPatrick Williams 
202405ae98SPatrick Williams #include <ipmid/api.hpp>
21e7d23d0eSVijay Khemka #include <sdbusplus/bus.hpp>
22e7d23d0eSVijay Khemka 
2363c99be4SVijay Khemka #include <iostream>
2463c99be4SVijay Khemka 
25e7d23d0eSVijay Khemka static constexpr bool debug = false;
26e7d23d0eSVijay Khemka 
2725b79bf4SBonnie Lo using IanaType = std::array<uint8_t, 3>;
2805d0ce93SKumar Thangavel using flashSize = std::array<uint8_t, 4>;
2925b79bf4SBonnie Lo 
3025b79bf4SBonnie Lo static constexpr IanaType iana = {0x15, 0xA0, 0x0}; // Meta's IANA
3125b79bf4SBonnie Lo 
instances(std::string s,std::vector<std::string> & host)324ec80567SJayashree Dhanapal static void instances(std::string s, std::vector<std::string>& host)
334ec80567SJayashree Dhanapal {
344ec80567SJayashree Dhanapal     size_t pos = 0;
354ec80567SJayashree Dhanapal 
364ec80567SJayashree Dhanapal     while ((pos = s.find(" ")) != std::string::npos)
374ec80567SJayashree Dhanapal     {
384ec80567SJayashree Dhanapal         host.push_back(s.substr(0, pos));
394ec80567SJayashree Dhanapal         s.erase(0, pos + 1);
404ec80567SJayashree Dhanapal     }
414ec80567SJayashree Dhanapal     host.push_back(s);
424ec80567SJayashree Dhanapal }
434ec80567SJayashree Dhanapal 
findHost(size_t id)444ec80567SJayashree Dhanapal inline std::optional<size_t> findHost(size_t id)
454ec80567SJayashree Dhanapal {
464ec80567SJayashree Dhanapal     std::vector<std::string> hosts = {};
474ec80567SJayashree Dhanapal 
484ec80567SJayashree Dhanapal     if (hostInstances == "0")
494ec80567SJayashree Dhanapal     {
504ec80567SJayashree Dhanapal         return id;
514ec80567SJayashree Dhanapal     }
524ec80567SJayashree Dhanapal 
534ec80567SJayashree Dhanapal     instances(hostInstances, hosts);
544ec80567SJayashree Dhanapal 
554ec80567SJayashree Dhanapal     std::sort(hosts.begin(), hosts.end());
564ec80567SJayashree Dhanapal 
574ec80567SJayashree Dhanapal     /*  ctx host ID for host 1 is 0, host 2 is 1 ... host N is N-1
584ec80567SJayashree Dhanapal      *  Therefore, host Index is incremented to 1 to map with the dbus
594ec80567SJayashree Dhanapal      *  object path created.
604ec80567SJayashree Dhanapal      */
614ec80567SJayashree Dhanapal     std::string num = std::to_string(id + 1);
624ec80567SJayashree Dhanapal 
634ec80567SJayashree Dhanapal     auto instance = std::lower_bound(hosts.begin(), hosts.end(), num);
644ec80567SJayashree Dhanapal 
654ec80567SJayashree Dhanapal     if (instance != std::end(hosts))
664ec80567SJayashree Dhanapal     {
674ec80567SJayashree Dhanapal         return id + 1;
684ec80567SJayashree Dhanapal     }
694ec80567SJayashree Dhanapal 
704ec80567SJayashree Dhanapal     return std::nullopt;
714ec80567SJayashree Dhanapal }
724ec80567SJayashree Dhanapal 
printRegistration(unsigned int netfn,unsigned int cmd)73e7d23d0eSVijay Khemka inline static void printRegistration(unsigned int netfn, unsigned int cmd)
74e7d23d0eSVijay Khemka {
75e7d23d0eSVijay Khemka     if constexpr (debug)
76e7d23d0eSVijay Khemka     {
77e7d23d0eSVijay Khemka         std::cout << "Registering NetFn:[0x" << std::hex << std::uppercase
78e7d23d0eSVijay Khemka                   << netfn << "], Cmd:[0x" << cmd << "]\n";
79e7d23d0eSVijay Khemka     }
80e7d23d0eSVijay Khemka }
81e7d23d0eSVijay Khemka 
ipmiPrintAndRegister(ipmi_netfn_t netfn,ipmi_cmd_t cmd,ipmi_context_t context,ipmid_callback_t handler,ipmi_cmd_privilege_t priv)82*010dee04SPatrick Williams inline static void ipmiPrintAndRegister(
83*010dee04SPatrick Williams     ipmi_netfn_t netfn, ipmi_cmd_t cmd, ipmi_context_t context,
84*010dee04SPatrick Williams     ipmid_callback_t handler, ipmi_cmd_privilege_t priv)
85e7d23d0eSVijay Khemka {
86e7d23d0eSVijay Khemka     printRegistration(netfn, cmd);
87e7d23d0eSVijay Khemka     ipmi_register_callback(netfn, cmd, context, handler, priv);
88e7d23d0eSVijay Khemka }
89e7d23d0eSVijay Khemka 
printCommand(unsigned int netfn,unsigned int cmd)90e7d23d0eSVijay Khemka inline static void printCommand(unsigned int netfn, unsigned int cmd)
91e7d23d0eSVijay Khemka {
92e7d23d0eSVijay Khemka     if constexpr (debug)
93e7d23d0eSVijay Khemka     {
94e7d23d0eSVijay Khemka         std::cout << "Executing NetFn:[0x" << std::hex << std::uppercase
95e7d23d0eSVijay Khemka                   << netfn << "], Cmd:[0x" << cmd << "]\n";
96e7d23d0eSVijay Khemka     }
97e7d23d0eSVijay Khemka }
98e7d23d0eSVijay Khemka 
99b2ae88b4Scchoux std::optional<std::pair<uint8_t, uint8_t>> getMbFruDevice(void);
100b2ae88b4Scchoux 
101e7d23d0eSVijay Khemka namespace ipmi
102e7d23d0eSVijay Khemka {
103bec18eafSPatrick Williams using DbusVariant = std::variant<std::string, bool, uint8_t, uint16_t, int16_t,
104e7d23d0eSVijay Khemka                                  uint32_t, int32_t, uint64_t, int64_t, double>;
105e7d23d0eSVijay Khemka } // namespace ipmi
106