| #pragma once |
| |
| #include <nlohmann/json.hpp> |
| |
| #include <filesystem> |
| #include <string> |
| #include <tuple> |
| #include <vector> |
| |
| /** |
| * @file device_callouts.hpp |
| * |
| * @brief Looks up FRU callouts, which are D-Bus inventory paths, |
| * in JSON for device sysfs paths. |
| * |
| * The code will extract the search keys from the sysfs path to |
| * use to look up the callout list in the JSON. The callouts will |
| * be sorted by priority as defined in th PEL spec. |
| * |
| * The JSON is normally generated from the MRW, and contains |
| * sections for the following types of callouts: |
| * * I2C (also based on bus/addr as well as the path) |
| * * FSI |
| * * FSI-I2C |
| * * FSI-SPI |
| * |
| * The JSON looks like: |
| * |
| * "I2C": |
| * "<bus>": |
| * "<address>": |
| * "Callouts": [ |
| * { |
| * "LocationCode": "<location code>", |
| * "Name": "<inventory path>", |
| * "Priority": "<priority=H/M/L>", |
| * "MRU": "<optional MRU name>" |
| * }, |
| * ... |
| * ], |
| * "Dest": "<destination MRW target>" |
| * |
| * "FSI": |
| * "<fsi link>": |
| * "Callouts": [ |
| * ... |
| * ], |
| * "Dest": "<destination MRW target>" |
| * |
| * "FSI-I2C": |
| * "<fsi link>": |
| * "<bus>": |
| * "<address>": |
| * "Callouts": [ |
| * ... |
| * ], |
| * "Dest": "<destination MRW target>" |
| * |
| * "FSI-SPI": |
| * "<fsi link>": |
| * "<bus>": |
| * "Callouts": [ |
| * ... |
| * ], |
| * "Dest": "<destination MRW target>" |
| * |
| */ |
| |
| namespace openpower::pels::device_callouts |
| { |
| |
| /** |
| * @brief Represents a callout in the device JSON. |
| * |
| * The debug field will only be filled in for the first |
| * callout in the list of them and contains additional |
| * information about what happened when looking up the |
| * callouts that is meant to aid in debug. |
| */ |
| struct Callout |
| { |
| std::string priority; |
| std::string locationCode; |
| std::string name; |
| std::string mru; |
| std::string debug; |
| }; |
| |
| /** |
| * @brief Looks up the callouts in a JSON File to add to a PEL |
| * for when the path between the BMC and the device specified |
| * by the passed in device path needs to be called out. |
| * |
| * The path is the path used to access the device in sysfs. It |
| * can be either a directory path or a file path. |
| * |
| * @param[in] devPath - The device path |
| * @param[in] compatibleList - The list of compatible names for this |
| * system. |
| * @return std::vector<Callout> - The list of callouts |
| */ |
| std::vector<Callout> getCallouts( |
| const std::string& devPath, const std::vector<std::string>& compatibleList); |
| |
| /** |
| * @brief Looks up the callouts to add to a PEL for when the path |
| * between the BMC and the device specified by the passed in |
| * I2C bus and address needs to be called out. |
| * |
| * @param[in] i2cBus - The I2C bus |
| * @param[in] i2cAddress - The I2C address |
| * @param[in] compatibleList - The list of compatible names for this |
| * system. |
| * @return std::vector<Callout> - The list of callouts |
| */ |
| std::vector<Callout> |
| getI2CCallouts(size_t i2cBus, uint8_t i2cAddress, |
| const std::vector<std::string>& compatibleList); |
| |
| namespace util |
| { |
| |
| /** |
| * @brief The different callout path types |
| */ |
| enum class CalloutType |
| { |
| i2c, |
| fsi, |
| fsii2c, |
| fsispi, |
| unknown |
| }; |
| |
| /** |
| * @brief Returns the path to the JSON file to look up callouts in. |
| * |
| * @param[in] compatibleList - The list of compatible names for this |
| * system. |
| * |
| * @return path - The path to the file. |
| */ |
| std::filesystem::path |
| getJSONFilename(const std::vector<std::string>& compatibleList); |
| |
| /** |
| * @brief Looks up the callouts in the JSON using the I2C keys. |
| * |
| * @param[in] i2cBus - The I2C bus |
| * @param[in] i2cAddress - The I2C address |
| * @param[in] calloutJSON - The JSON containing the callouts |
| * |
| * @return std::vector<Callout> - The callouts |
| */ |
| std::vector<device_callouts::Callout> calloutI2C( |
| size_t i2CBus, uint8_t i2cAddress, const nlohmann::json& calloutJSON); |
| |
| /** |
| * @brief Determines the type of the path (FSI, I2C, etc) based |
| * on tokens in the device path. |
| * |
| * @param[in] devPath - The device path |
| * |
| * @return CalloutType - The callout type |
| */ |
| CalloutType getCalloutType(const std::string& devPath); |
| |
| /** |
| * @brief Pulls the fields out of the I2C device path to use as search keys |
| * in the JSON. |
| * |
| * The keys are the I2C bus and address. |
| * |
| * @param[in] devPath - The device path |
| * |
| * @return std::tuple<size_t, uint8_t> - The I2C bus and address keys |
| */ |
| std::tuple<size_t, uint8_t> getI2CSearchKeys(const std::string& devPath); |
| |
| /** |
| * @brief Pulls the fields out of the FSI device path to use as search keys |
| * in the JSON. |
| * |
| * The key is the FSI link. For multi-hop paths, the links are |
| * separated by '-'s, like "0-1-2". |
| * |
| * @param[in] devPath - The device path |
| * |
| * @return std::string - The FSI links key |
| */ |
| std::string getFSISearchKeys(const std::string& devPath); |
| |
| /** |
| * @brief Pulls the fields out of the FSI-I2C device path to use as |
| * search keys in the JSON. |
| * |
| * The keys are the FSI link string and the I2C bus and address. |
| * |
| * @param[in] devPath - The device path |
| * |
| * @return std::tuple<std::string, std::tuple<size_t, uint8_t>> |
| * - The FSI links key along with the I2C bus/address. |
| */ |
| std::tuple<std::string, std::tuple<size_t, uint8_t>> |
| getFSII2CSearchKeys(const std::string& devPath); |
| |
| /** |
| * @brief Pulls the fields out of the SPI device path to use as search keys |
| * in the JSON. |
| * |
| * The key is the SPI bus number. |
| * |
| * @param[in] devPath - The device path |
| * |
| * @return size_t - The SPI bus key |
| */ |
| size_t getSPISearchKeys(const std::string& devPath); |
| |
| /** |
| * @brief Pulls the fields out of the FSI-SPI device path to use as |
| * search keys in the JSON. |
| * |
| * The keys are the FSI link string and the SPI bus number. |
| * |
| * @param[in] devPath - The device path |
| * |
| * @return std::tuple<std::string, size_t> |
| * - The FSI links key along with the SPI bus number. |
| */ |
| std::tuple<std::string, size_t> getFSISPISearchKeys(const std::string& devPath); |
| |
| } // namespace util |
| } // namespace openpower::pels::device_callouts |