1 // Copyright 2022 Google LLC 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #pragma once 16 17 #include "bifurcation.hpp" 18 #include "handler.hpp" 19 20 #include <cstdint> 21 #include <map> 22 #include <nlohmann/json.hpp> 23 #include <sdbusplus/bus.hpp> 24 #include <string> 25 #include <string_view> 26 #include <tuple> 27 #include <vector> 28 29 namespace google 30 { 31 namespace ipmi 32 { 33 34 constexpr char defaultConfigFile[] = 35 "/usr/share/ipmi-entity-association/entity_association_map.json"; 36 37 class Handler : public HandlerInterface 38 { 39 public: 40 explicit Handler(const std::string& entityConfigPath = defaultConfigFile) : 41 _configFile(entityConfigPath), 42 bifurcationHelper(BifurcationStatic::createBifurcation()){}; 43 Handler(std::reference_wrapper<BifurcationInterface> bifurcationHelper, 44 const std::string& entityConfigPath = defaultConfigFile) : 45 _configFile(entityConfigPath), 46 bifurcationHelper(bifurcationHelper){}; 47 ~Handler() = default; 48 49 uint8_t getBmcMode() override; 50 std::tuple<std::uint8_t, std::string> 51 getEthDetails(std::string intf) const override; 52 std::int64_t getRxPackets(const std::string& name) const override; 53 VersionTuple getCpldVersion(unsigned int id) const override; 54 void psuResetDelay(std::uint32_t delay) const override; 55 void psuResetOnShutdown() const override; 56 std::string getEntityName(std::uint8_t id, std::uint8_t instance) override; 57 uint32_t getFlashSize() override; 58 std::string getMachineName() override; 59 void buildI2cPcieMapping() override; 60 size_t getI2cPcieMappingSize() const override; 61 void hostPowerOffDelay(std::uint32_t delay) const override; 62 std::tuple<std::uint32_t, std::string> 63 getI2cEntry(unsigned int entry) const override; 64 std::vector<uint8_t> pcieBifurcation(uint8_t) override; 65 66 uint32_t accelOobDeviceCount() const override; 67 std::string accelOobDeviceName(size_t index) const override; 68 uint64_t accelOobRead(std::string_view name, uint64_t address, 69 uint8_t num_bytes) const override; 70 void accelOobWrite(std::string_view name, uint64_t address, 71 uint8_t num_bytes, uint64_t data) const override; 72 73 protected: 74 // Exposed for dependency injection 75 virtual sdbusplus::bus_t getDbus() const; 76 77 private: 78 std::string _configFile; 79 80 bool _entityConfigParsed = false; 81 82 const std::map<uint8_t, std::string> _entityIdToName{ 83 {0x03, "cpu"}, 84 {0x04, "storage_device"}, 85 {0x06, "system_management_module"}, 86 {0x07, "system_board"}, 87 {0x08, "memory_module"}, 88 {0x0B, "add_in_card"}, 89 {0x0E, "power_system_board"}, 90 {0x10, "system_internal_expansion_board"}, 91 {0x11, "other_system_board"}, 92 {0x17, "system_chassis"}, 93 {0x1D, "fan"}, 94 {0x1E, "cooling_unit"}, 95 {0x20, "memory_device"}}; 96 97 nlohmann::json _entityConfig{}; 98 99 std::vector<std::tuple<uint32_t, std::string>> _pcie_i2c_map; 100 101 std::reference_wrapper<BifurcationInterface> bifurcationHelper; 102 }; 103 104 /** 105 * Given a type, entity instance, and a configuration, return the name. 106 * 107 * @param[in] type - the entity type 108 * @param[in] instance - the entity instance 109 * @param[in] config - the json object holding the entity mapping 110 * @return the name of the entity from the map 111 */ 112 std::string readNameFromConfig(const std::string& type, uint8_t instance, 113 const nlohmann::json& config); 114 115 } // namespace ipmi 116 } // namespace google 117