PEL: Update bmc & platform dump status in SRC section
With every PEL creation, the status of bmc and platform dumps -
Hardware and Hypervisor would be checked and status bits in SRC
section updated accordingly.
Change-Id: I3ec7626611cf330f2ce235a97ee3046c0d32b6ab
Signed-off-by: Sumit Kumar <sumit_kumar@in.ibm.com>
diff --git a/extensions/openpower-pels/data_interface.cpp b/extensions/openpower-pels/data_interface.cpp
index f8b701f..393c2fe 100644
--- a/extensions/openpower-pels/data_interface.cpp
+++ b/extensions/openpower-pels/data_interface.cpp
@@ -22,6 +22,7 @@
#include <fmt/format.h>
#include <fstream>
+#include <iterator>
#include <phosphor-logging/log.hpp>
#include <xyz/openbmc_project/State/Boot/Progress/server.hpp>
@@ -80,6 +81,8 @@
"xyz.openbmc_project.State.Decorator.OperationalStatus";
constexpr auto logSetting = "xyz.openbmc_project.Logging.Settings";
constexpr auto association = "xyz.openbmc_project.Association.Definitions";
+constexpr auto dumpEntry = "xyz.openbmc_project.Dump.Entry";
+constexpr auto dumpProgress = "xyz.openbmc_project.Common.Progress";
} // namespace interface
using namespace sdbusplus::xyz::openbmc_project::State::Boot::server;
@@ -617,5 +620,72 @@
return ret;
}
+std::vector<bool>
+ DataInterface::checkDumpStatus(const std::vector<std::string>& type) const
+{
+ DBusSubTree subtree;
+ std::vector<bool> result(type.size(), false);
+
+ // Query GetSubTree for the availability of dump interface
+ auto method = _bus.new_method_call(service_name::objectMapper,
+ object_path::objectMapper,
+ interface::objectMapper, "GetSubTree");
+ method.append(std::string{"/"}, 0,
+ std::vector<std::string>{interface::dumpEntry});
+ auto reply = _bus.call(method);
+
+ reply.read(subtree);
+
+ if (subtree.empty())
+ {
+ return result;
+ }
+
+ std::vector<bool>::iterator itDumpStatus = result.begin();
+ uint8_t count = 0;
+ for (const auto& [path, serviceInfo] : subtree)
+ {
+ const auto& service = serviceInfo.begin()->first;
+ // Check for dump type on the object path
+ for (const auto& it : type)
+ {
+ if (path.find(it) != std::string::npos)
+ {
+ DBusValue value, progress;
+
+ // If dump type status is already available go for next path
+ if (*itDumpStatus)
+ {
+ break;
+ }
+
+ // Check for valid dump to be available if following
+ // conditions are met for the dump entry path -
+ // Offloaded == false and Status == Completed
+ getProperty(service, path, interface::dumpEntry, "Offloaded",
+ value);
+ getProperty(service, path, interface::dumpProgress, "Status",
+ progress);
+ auto offload = std::get<bool>(value);
+ auto status = std::get<std::string>(progress);
+ if (!offload && (status.find("Completed") != std::string::npos))
+ {
+ *itDumpStatus = true;
+ count++;
+ if (count >= type.size())
+ {
+ return result;
+ }
+ break;
+ }
+ }
+ itDumpStatus++;
+ }
+ itDumpStatus = result.begin();
+ }
+
+ return result;
+}
+
} // namespace pels
} // namespace openpower
diff --git a/extensions/openpower-pels/data_interface.hpp b/extensions/openpower-pels/data_interface.hpp
index 89b09ed..482b4f1 100644
--- a/extensions/openpower-pels/data_interface.hpp
+++ b/extensions/openpower-pels/data_interface.hpp
@@ -327,6 +327,14 @@
static std::pair<std::string, std::string>
extractConnectorFromLocCode(const std::string& locationCode);
+ /**
+ * @brief Returns the dump status
+ *
+ * @return bool dump status
+ */
+ virtual std::vector<bool>
+ checkDumpStatus(const std::vector<std::string>& type) const = 0;
+
protected:
/**
* @brief Sets the host on/off state and runs any
@@ -600,6 +608,16 @@
*/
bool getQuiesceOnError() const override;
+ /**
+ * @brief Returns the dump status
+ *
+ * @param[in] type - The dump type to check for
+ *
+ * @return bool dump status
+ */
+ std::vector<bool>
+ checkDumpStatus(const std::vector<std::string>& type) const override;
+
private:
/**
* @brief Reads the BMC firmware version string and puts it into
diff --git a/extensions/openpower-pels/src.cpp b/extensions/openpower-pels/src.cpp
index 6c6a2d4..a9f1b7f 100644
--- a/extensions/openpower-pels/src.cpp
+++ b/extensions/openpower-pels/src.cpp
@@ -348,11 +348,12 @@
// M: Partition dump status = 0
// I: System boot state = TODO
// G: Partition Boot type = 0
- // V: BMC dump status = TODO
+ // V: BMC dump status
// E: Platform boot mode = 0 (side = temporary, speed = fast)
- // P: Platform dump status = TODO
+ // P: Platform dump status
// FF: SRC format, set below
+ setDumpStatus(dataIface);
setBMCFormat();
setBMCPosition();
setMotherboardCCIN(dataIface);
@@ -1403,5 +1404,28 @@
return mrus;
}
+void SRC::setDumpStatus(const DataInterfaceBase& dataIface)
+{
+ std::vector<bool> dumpStatus{false, false, false};
+
+ try
+ {
+ std::vector<std::string> dumpType = {"bmc/entry", "resource/entry",
+ "system/entry"};
+ dumpStatus = dataIface.checkDumpStatus(dumpType);
+
+ // For bmc - set bit 0 of nibble [4-7] bits of byte-1 SP dump
+ // For resource - set bit 2 of nibble [4-7] bits of byte-2 Hypervisor
+ // For system - set bit 1 of nibble [4-7] bits of byte-2 HW dump
+ _hexData[0] |= ((dumpStatus[0] << 19) | (dumpStatus[1] << 9) |
+ (dumpStatus[2] << 10));
+ }
+ catch (const std::exception& e)
+ {
+ // Exception - may be no dump interface on dbus or getProperty
+ // failed
+ }
+}
+
} // namespace pels
} // namespace openpower
diff --git a/extensions/openpower-pels/src.hpp b/extensions/openpower-pels/src.hpp
index 5363864..f0b151e 100644
--- a/extensions/openpower-pels/src.hpp
+++ b/extensions/openpower-pels/src.hpp
@@ -522,6 +522,13 @@
getMRUsFromJSON(const nlohmann::json& mruJSON);
/**
+ * @brief Sets the dump status
+ *
+ * @param[in] dataIface - The DataInterface object
+ */
+ void setDumpStatus(const DataInterfaceBase& dataIface);
+
+ /**
* @brief The SRC version field
*/
uint8_t _version;