Make OpenPower specific dump an optional feature

Make all OpenPower dumps as optional feature and should be
enabled in the configuration. System dump is the currently
implemented example of OpenPower dump. BMC dump will be
enabled by default.

To enable
openpower-dumps-extension=enabled

Test:
Tested all existing dump operations using automated
testing.

Signed-off-by: Dhruvaraj Subhashchandran <dhruvaraj@in.ibm.com>
Change-Id: If20b4711dfcf02a2a8ea23848f7409576813c832
diff --git a/dump-extensions.hpp b/dump-extensions.hpp
new file mode 100644
index 0000000..ad5b688
--- /dev/null
+++ b/dump-extensions.hpp
@@ -0,0 +1,21 @@
+#include "dump_manager.hpp"
+
+#include <memory>
+#include <vector>
+
+namespace phosphor
+{
+namespace dump
+{
+
+using DumpManagerList = std::vector<std::unique_ptr<phosphor::dump::Manager>>;
+/**
+ * @brief load the dump extensions
+ *
+ * @param[in] bus - Bus to attach to
+ * @param[out] dumpMgrList - list dump manager objects.
+ *
+ */
+void loadExtensions(sdbusplus::bus::bus& bus, DumpManagerList& dumpMgrList);
+} // namespace dump
+} // namespace phosphor
diff --git a/dump-extensions/default/default.cpp b/dump-extensions/default/default.cpp
new file mode 100644
index 0000000..4c56897
--- /dev/null
+++ b/dump-extensions/default/default.cpp
@@ -0,0 +1,11 @@
+#include "dump-extensions.hpp"
+
+namespace phosphor
+{
+namespace dump
+{
+void loadExtensions(sdbusplus::bus::bus&, DumpManagerList&)
+{
+}
+} // namespace dump
+} // namespace phosphor
diff --git a/dump-extensions/default/meson.build b/dump-extensions/default/meson.build
new file mode 100644
index 0000000..dc86093
--- /dev/null
+++ b/dump-extensions/default/meson.build
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: Apache-2.0
+
+phosphor_dump_manager_sources += [
+        'dump-extensions/default/default.cpp',
+    ]
diff --git a/dump-extensions/meson.build b/dump-extensions/meson.build
new file mode 100644
index 0000000..8f58f2c
--- /dev/null
+++ b/dump-extensions/meson.build
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: Apache-2.0
+
+if get_option('openpower-dumps-extension').enabled()
+    subdir('openpower-dumps')
+else
+    subdir('default')
+endif
diff --git a/dump-extensions/openpower-dumps/dump-extensions.cpp b/dump-extensions/openpower-dumps/dump-extensions.cpp
new file mode 100644
index 0000000..6a707fa
--- /dev/null
+++ b/dump-extensions/openpower-dumps/dump-extensions.cpp
@@ -0,0 +1,19 @@
+#include "config.h"
+
+#include "dump-extensions.hpp"
+
+#include "dump_manager_system.hpp"
+
+namespace phosphor
+{
+namespace dump
+{
+
+void loadExtensions(sdbusplus::bus::bus& bus, DumpManagerList& dumpList)
+{
+
+    dumpList.push_back(std::make_unique<phosphor::dump::system::Manager>(
+        bus, SYSTEM_DUMP_OBJPATH, SYSTEM_DUMP_OBJ_ENTRY));
+}
+} // namespace dump
+} // namespace phosphor
diff --git a/dump_manager_system.cpp b/dump-extensions/openpower-dumps/dump_manager_system.cpp
similarity index 100%
rename from dump_manager_system.cpp
rename to dump-extensions/openpower-dumps/dump_manager_system.cpp
diff --git a/dump_manager_system.hpp b/dump-extensions/openpower-dumps/dump_manager_system.hpp
similarity index 100%
rename from dump_manager_system.hpp
rename to dump-extensions/openpower-dumps/dump_manager_system.hpp
diff --git a/dump-extensions/openpower-dumps/meson.build b/dump-extensions/openpower-dumps/meson.build
new file mode 100644
index 0000000..308e167
--- /dev/null
+++ b/dump-extensions/openpower-dumps/meson.build
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: Apache-2.0
+
+phosphor_dump_manager_sources += [
+        'dump-extensions/openpower-dumps/dump-extensions.cpp',
+        'dump-extensions/openpower-dumps/dump_manager_system.cpp',
+        'dump-extensions/openpower-dumps/system_dump_entry.cpp'
+    ]
diff --git a/system_dump_entry.cpp b/dump-extensions/openpower-dumps/system_dump_entry.cpp
similarity index 100%
rename from system_dump_entry.cpp
rename to dump-extensions/openpower-dumps/system_dump_entry.cpp
diff --git a/system_dump_entry.hpp b/dump-extensions/openpower-dumps/system_dump_entry.hpp
similarity index 100%
rename from system_dump_entry.hpp
rename to dump-extensions/openpower-dumps/system_dump_entry.hpp
diff --git a/dump_manager_main.cpp b/dump_manager_main.cpp
index 4ac89af..e38a521 100644
--- a/dump_manager_main.cpp
+++ b/dump_manager_main.cpp
@@ -1,15 +1,17 @@
 #include "config.h"
 
+#include "dump-extensions.hpp"
 #include "dump_internal.hpp"
 #include "dump_manager.hpp"
 #include "dump_manager_bmc.hpp"
-#include "dump_manager_system.hpp"
 #include "elog_watch.hpp"
 #include "watch.hpp"
 #include "xyz/openbmc_project/Common/error.hpp"
 
+#include <memory>
 #include <phosphor-logging/elog-errors.hpp>
 #include <sdbusplus/bus.hpp>
+#include <vector>
 
 int main()
 {
@@ -59,14 +61,24 @@
 
     try
     {
-        phosphor::dump::bmc::Manager bmcDumpMgr(
-            bus, eventP, BMC_DUMP_OBJPATH, BMC_DUMP_OBJ_ENTRY, BMC_DUMP_PATH);
-        // Restore dump d-bus objects.
-        bmcDumpMgr.restore();
-        phosphor::dump::bmc::internal::Manager mgr(bus, bmcDumpMgr,
+        phosphor::dump::DumpManagerList dumpMgrList{};
+        std::unique_ptr<phosphor::dump::bmc::Manager> bmcDumpMgr =
+            std::make_unique<phosphor::dump::bmc::Manager>(
+                bus, eventP, BMC_DUMP_OBJPATH, BMC_DUMP_OBJ_ENTRY,
+                BMC_DUMP_PATH);
+
+        phosphor::dump::bmc::internal::Manager mgr(bus, *bmcDumpMgr,
                                                    OBJ_INTERNAL);
-        phosphor::dump::system::Manager systemDumpMgr(bus, SYSTEM_DUMP_OBJPATH,
-                                                      SYSTEM_DUMP_OBJ_ENTRY);
+        dumpMgrList.push_back(std::move(bmcDumpMgr));
+
+        phosphor::dump::loadExtensions(bus, dumpMgrList);
+
+        // Restore dbus objects of all dumps
+        for (auto& dmpMgr : dumpMgrList)
+        {
+            dmpMgr->restore();
+        }
+
         phosphor::dump::elog::Watch eWatch(bus, mgr);
         bus.attach_event(eventP.get(), SD_EVENT_PRIORITY_NORMAL);
 
diff --git a/meson.build b/meson.build
index 8492d5d..e896d61 100644
--- a/meson.build
+++ b/meson.build
@@ -103,7 +103,6 @@
         'dump_entry.cpp',
         'dump_manager.cpp',
         'dump_manager_bmc.cpp',
-        'dump_manager_system.cpp',
         'dump_manager_main.cpp',
         'dump_serialize.cpp',
         'elog_watch.cpp',
@@ -113,7 +112,6 @@
         'watch.cpp',
         'bmc_dump_entry.cpp',
         'dump_utils.cpp',
-        'system_dump_entry.cpp',
         'dump_offload.cpp'
     ]
 
@@ -130,6 +128,9 @@
 # for phosphor_dump_manager
 subdir('offload-extensions')
 
+#pick any architecture specific dumps
+subdir('dump-extensions')
+
 phosphor_dump_monitor_sources = [
         'core_manager.cpp',
         'core_manager_main.cpp',
diff --git a/meson_options.txt b/meson_options.txt
index 21517ca..48e7038 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -86,3 +86,8 @@
 option('host-dump-offload-transport', type : 'string',
         value : 'default',
         description : 'To specify the host dump transport protocol')
+
+option('openpower-dumps-extension', type: 'feature',
+        value : 'disabled',
+        description : 'Enable Open Power specific dumps'
+      )