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