Add support for vendor specific FruDbusLookup
In the current state, a vendor could not define the FRU's
that he wants to send to the host.
This commit adds a fru_master.json that can be used while
building the master , and the json would be replaced with
fru_master.json from the oem/<vendor>/configurations
directory when compiling for oem's.
Tested By:
IBM machine test :
1. meson build -Doem-ibm=enabled -Dprefix=<>
2. ninja -C build && ninja install
3. in the prefix directory we should see the json file
from the oem/ibm/configurations folder
Non IBM machine test :
1. meson build -Doem-ibm=disabled -Dprefix=<>
2. ninja -C build && ninja install
3. in the prefix directory we should see the json file
from the pldm/configurations folder.
Runtime test:
1. on an IBM machine make sure the pldm builds the fru record
table.
Signed-off-by: Manojkiran Eda <manojkiran.eda@gmail.com>
Change-Id: Id3c2746c51a1f99f2038b2af48137133e9d0b405
diff --git a/libpldmresponder/fru_parser.cpp b/libpldmresponder/fru_parser.cpp
index a59d61a..28f48a7 100644
--- a/libpldmresponder/fru_parser.cpp
+++ b/libpldmresponder/fru_parser.cpp
@@ -24,9 +24,13 @@
const std::vector<Json> emptyJsonList{};
const std::vector<std::string> emptyStringVec{};
-FruParser::FruParser(const std::string& dirPath)
+FruParser::FruParser(const std::string& dirPath,
+ const fs::path& fruMasterJsonPath)
{
- setupDefaultDBusLookup();
+ if (fs::exists(fruMasterJsonPath))
+ {
+ setupDefaultDBusLookup(fruMasterJsonPath);
+ }
setupDefaultFruRecordMap();
fs::path dir(dirPath);
@@ -36,31 +40,35 @@
}
}
-void FruParser::setupDefaultDBusLookup()
+void FruParser::setupDefaultDBusLookup(const fs::path& masterJsonPath)
{
constexpr auto service = "xyz.openbmc_project.Inventory.Manager";
constexpr auto rootPath = "/xyz/openbmc_project/inventory";
+ std::ifstream jsonFile(masterJsonPath);
+ auto data = Json::parse(jsonFile, nullptr, false);
+ if (data.is_discarded())
+ {
- // DSP0249 1.0.0 Table 15 Entity ID Codes
- const std::map<Interface, EntityType> defIntfToEntityType = {
- {"xyz.openbmc_project.Inventory.Item.Chassis", 45},
- {"xyz.openbmc_project.Inventory.Item.Board", 60},
- {"xyz.openbmc_project.Inventory.Item.PCIeDevice", 61},
- {"xyz.openbmc_project.Inventory.Item.Board.Motherboard", 64},
- {"xyz.openbmc_project.Inventory.Item.Dimm", 66},
- {"xyz.openbmc_project.Inventory.Item.Panel", 69},
- {"xyz.openbmc_project.Inventory.Item.DiskBackplane", 73},
- {"xyz.openbmc_project.Inventory.Item.Fan", 93},
- {"xyz.openbmc_project.Inventory.Item.PowerSupply", 120},
- {"xyz.openbmc_project.Inventory.Item.Battery", 121},
- {"xyz.openbmc_project.Inventory.Item.Vrm", 123},
- {"xyz.openbmc_project.Inventory.Item.Cpu", 135},
- {"xyz.openbmc_project.Inventory.Item.Bmc", 137},
- {"xyz.openbmc_project.Inventory.Item.Connector", 185},
- {"xyz.openbmc_project.Inventory.Item.PCIeSlot", 186},
- {"xyz.openbmc_project.Inventory.Item.System", 11521},
- {"xyz.openbmc_project.Inventory.Item.Tpm", 24576},
- };
+ std::cerr << "Parsing FRU Dbus Lookup Map config file failed, FILE="
+ << masterJsonPath;
+ std::abort();
+ }
+ std::map<Interface, EntityType> defIntfToEntityType;
+ auto dbusMap = data.value("FruDBusLookupMap", emptyJson);
+ for (const auto& element : dbusMap.items())
+
+ {
+ try
+ {
+ defIntfToEntityType[static_cast<Interface>(element.key())] =
+ static_cast<EntityType>(element.value());
+ }
+ catch (const std::exception& e)
+ {
+ std::cerr << "FRU DBus lookup map format error\n";
+ throw InternalFailure();
+ }
+ }
Interfaces interfaces{};
for (auto [intf, entityType] : defIntfToEntityType)