| #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 |