| // Copyright 2023 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #pragma once |
| |
| #include "bifurcation.hpp" |
| #include "file_system_wrapper_impl.hpp" |
| #include "handler.hpp" |
| |
| #include <nlohmann/json.hpp> |
| #include <sdbusplus/bus.hpp> |
| |
| #include <cstdint> |
| #include <map> |
| #include <memory> |
| #include <string> |
| #include <string_view> |
| #include <tuple> |
| #include <vector> |
| |
| namespace google |
| { |
| namespace ipmi |
| { |
| |
| constexpr char defaultConfigFile[] = |
| "/usr/share/ipmi-entity-association/entity_association_map.json"; |
| |
| class Handler : public HandlerInterface |
| { |
| public: |
| explicit Handler(const std::string& entityConfigPath = defaultConfigFile) : |
| fsPtr(std::make_unique<FileSystemWrapper>()), |
| _configFile(entityConfigPath), |
| bifurcationHelper(BifurcationStatic::createBifurcation()) {}; |
| Handler(std::reference_wrapper<BifurcationInterface> bifurcationHelper, |
| const std::string& entityConfigPath = defaultConfigFile) : |
| fsPtr(std::make_unique<FileSystemWrapper>()), |
| _configFile(entityConfigPath), bifurcationHelper(bifurcationHelper) {}; |
| ~Handler() = default; |
| |
| uint8_t getBmcMode() override; |
| std::tuple<std::uint8_t, std::string> |
| getEthDetails(std::string intf) const override; |
| std::int64_t getRxPackets(const std::string& name) const override; |
| VersionTuple getCpldVersion(unsigned int id) const override; |
| void psuResetDelay(std::uint32_t delay) const override; |
| void psuResetOnShutdown() const override; |
| std::string getEntityName(std::uint8_t id, std::uint8_t instance) override; |
| uint32_t getFlashSize() override; |
| std::string getMachineName() override; |
| void buildI2cPcieMapping() override; |
| size_t getI2cPcieMappingSize() const override; |
| void hostPowerOffDelay(std::uint32_t delay) const override; |
| std::tuple<std::uint32_t, std::string> |
| getI2cEntry(unsigned int entry) const override; |
| std::vector<uint8_t> pcieBifurcation(uint8_t) override; |
| |
| uint32_t accelOobDeviceCount() const override; |
| std::string accelOobDeviceName(size_t index) const override; |
| uint64_t accelOobRead(std::string_view name, uint64_t address, |
| uint8_t num_bytes) const override; |
| void accelOobWrite(std::string_view name, uint64_t address, |
| uint8_t num_bytes, uint64_t data) const override; |
| void linuxBootDone() const override; |
| void accelSetVrSettings(::ipmi::Context::ptr ctx, uint8_t chip_id, |
| uint8_t settings_id, uint16_t value) const override; |
| uint16_t accelGetVrSettings(::ipmi::Context::ptr ctx, uint8_t chip_id, |
| uint8_t settings_id) const override; |
| std::string getBMInstanceProperty(uint8_t propertyType) const override; |
| |
| protected: |
| // Exposed for dependency injection |
| virtual sdbusplus::bus_t getDbus() const; |
| virtual const std::unique_ptr<FileSystemInterface>& getFs() const; |
| |
| private: |
| std::unique_ptr<FileSystemInterface> fsPtr; |
| |
| std::string _configFile; |
| |
| bool _entityConfigParsed = false; |
| |
| const std::map<uint8_t, std::string> _entityIdToName{ |
| {0x03, "cpu"}, |
| {0x04, "storage_device"}, |
| {0x06, "system_management_module"}, |
| {0x07, "system_board"}, |
| {0x08, "memory_module"}, |
| {0x0B, "add_in_card"}, |
| {0x0E, "power_system_board"}, |
| {0x10, "system_internal_expansion_board"}, |
| {0x11, "other_system_board"}, |
| {0x17, "system_chassis"}, |
| {0x1D, "fan"}, |
| {0x1E, "cooling_unit"}, |
| {0x20, "memory_device"}}; |
| |
| const std::unordered_map<uint8_t, std::string> _vrSettingsMap{ |
| {0, "idle_mode_"}, {1, "power_brake_"}, {2, "loadline_"}}; |
| |
| const std::unordered_map<uint8_t, std::string> bmInstanceTypeStringMap = { |
| {0x00, "asset-tag"}, {0x01, "board-serial-number"}, |
| {0x02, "family"}, {0x03, "product-name"}, |
| {0x04, "sku"}, {0x05, "system-serial-number"}, |
| {0x06, "uuid"}}; |
| |
| nlohmann::json _entityConfig{}; |
| |
| std::vector<std::tuple<uint32_t, std::string>> _pcie_i2c_map; |
| |
| std::reference_wrapper<BifurcationInterface> bifurcationHelper; |
| }; |
| |
| /** |
| * Given a type, entity instance, and a configuration, return the name. |
| * |
| * @param[in] type - the entity type |
| * @param[in] instance - the entity instance |
| * @param[in] config - the json object holding the entity mapping |
| * @return the name of the entity from the map |
| */ |
| std::string readNameFromConfig(const std::string& type, uint8_t instance, |
| const nlohmann::json& config); |
| |
| } // namespace ipmi |
| } // namespace google |