blob: c09fc328197d1370c0019046af32d08de92049a8 [file] [log] [blame]
#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