Move getConnectedTarget() to generic pdbg util

This was a helper function specific to the resolution code. Instead, it
should be a generic utility function for anyone to use.

Change-Id: Ic52fb5cc45b8b82f3b3baa0935e12e611f24ae8c
Signed-off-by: Zane Shelley <zshelle@us.ibm.com>
diff --git a/analyzer/resolution.cpp b/analyzer/resolution.cpp
index 3183216..ac5410e 100644
--- a/analyzer/resolution.cpp
+++ b/analyzer/resolution.cpp
@@ -45,85 +45,6 @@
 
 //------------------------------------------------------------------------------
 
-// Helper function to get the connected target on the other side of the
-// given bus.
-pdbg_target* __getConnectedTarget(pdbg_target* i_rxTarget,
-                                  const callout::BusType& i_busType)
-{
-    assert(nullptr != i_rxTarget);
-
-    pdbg_target* txTarget = nullptr;
-
-    auto rxType        = util::pdbg::getTrgtType(i_rxTarget);
-    std::string rxPath = util::pdbg::getPath(i_rxTarget);
-
-    if (callout::BusType::SMP_BUS == i_busType &&
-        util::pdbg::TYPE_IOLINK == rxType)
-    {
-        // TODO: Will need to reference some sort of data that can tell us how
-        //       the processors are connected in the system. For now, return the
-        //       RX target to avoid returning a nullptr.
-        trace::inf("No support to get peer target on SMP bus");
-        txTarget = i_rxTarget;
-    }
-    else if (callout::BusType::SMP_BUS == i_busType &&
-             util::pdbg::TYPE_IOHS == rxType)
-    {
-        // TODO: Will need to reference some sort of data that can tell us how
-        //       the processors are connected in the system. For now, return the
-        //       RX target to avoid returning a nullptr.
-        trace::inf("No support to get peer target on SMP bus");
-        txTarget = i_rxTarget;
-    }
-    else if (callout::BusType::OMI_BUS == i_busType &&
-             util::pdbg::TYPE_OMI == rxType)
-    {
-        // This is a bit clunky. The pdbg APIs only give us the ability to
-        // iterate over the children instead of just returning a list. So we'll
-        // push all the children to a list and go from there.
-        std::vector<pdbg_target*> childList;
-
-        pdbg_target* childTarget = nullptr;
-        pdbg_for_each_target("ocmb", i_rxTarget, childTarget)
-        {
-            if (nullptr != childTarget)
-            {
-                childList.push_back(childTarget);
-            }
-        }
-
-        // We know there should only be one OCMB per OMI.
-        if (1 != childList.size())
-        {
-            throw std::logic_error("Invalid child list size for " + rxPath);
-        }
-
-        // Get the connected target.
-        txTarget = childList.front();
-    }
-    else if (callout::BusType::OMI_BUS == i_busType &&
-             util::pdbg::TYPE_OCMB == rxType)
-    {
-        txTarget = pdbg_target_parent("omi", i_rxTarget);
-        if (nullptr == txTarget)
-        {
-            throw std::logic_error("No parent OMI found for " + rxPath);
-        }
-    }
-    else
-    {
-        // This would be a code bug.
-        throw std::logic_error("Unsupported config: i_rxTarget=" + rxPath +
-                               " i_busType=" + i_busType.getString());
-    }
-
-    assert(nullptr != txTarget); // just in case we missed something above
-
-    return txTarget;
-}
-
-//------------------------------------------------------------------------------
-
 void __calloutTarget(ServiceData& io_sd, pdbg_target* i_target,
                      const callout::Priority& i_priority, bool i_guard)
 {
@@ -195,7 +116,7 @@
     auto rxTarget = __getUnitTarget(chipTarget, iv_unitPath);
 
     // Get the endpoint target for the transfer side of the bus.
-    auto txTarget = __getConnectedTarget(rxTarget, iv_busType);
+    auto txTarget = util::pdbg::getConnectedTarget(rxTarget, iv_busType);
 
     // Callout the TX endpoint.
     __calloutTarget(io_sd, txTarget, iv_priority, iv_guard);
@@ -221,7 +142,7 @@
     auto rxTarget = __getUnitTarget(chipTarget, iv_unitPath);
 
     // Get the endpoint target for the transfer side of the bus.
-    auto txTarget = __getConnectedTarget(rxTarget, iv_busType);
+    auto txTarget = util::pdbg::getConnectedTarget(rxTarget, iv_busType);
 
     // Callout the RX endpoint.
     __calloutTarget(io_sd, rxTarget, iv_priority, iv_guard);
diff --git a/util/pdbg.cpp b/util/pdbg.cpp
index d4170a7..c8c8a4f 100644
--- a/util/pdbg.cpp
+++ b/util/pdbg.cpp
@@ -9,6 +9,8 @@
 #include <attributes_info.H>
 #endif
 
+using namespace analyzer;
+
 namespace util
 {
 
@@ -71,6 +73,83 @@
 
 //------------------------------------------------------------------------------
 
+pdbg_target* getConnectedTarget(pdbg_target* i_rxTarget,
+                                const callout::BusType& i_busType)
+{
+    assert(nullptr != i_rxTarget);
+
+    pdbg_target* txTarget = nullptr;
+
+    auto rxType        = util::pdbg::getTrgtType(i_rxTarget);
+    std::string rxPath = util::pdbg::getPath(i_rxTarget);
+
+    if (callout::BusType::SMP_BUS == i_busType &&
+        util::pdbg::TYPE_IOLINK == rxType)
+    {
+        // TODO: Will need to reference some sort of data that can tell us how
+        //       the processors are connected in the system. For now, return the
+        //       RX target to avoid returning a nullptr.
+        trace::inf("No support to get peer target on SMP bus");
+        txTarget = i_rxTarget;
+    }
+    else if (callout::BusType::SMP_BUS == i_busType &&
+             util::pdbg::TYPE_IOHS == rxType)
+    {
+        // TODO: Will need to reference some sort of data that can tell us how
+        //       the processors are connected in the system. For now, return the
+        //       RX target to avoid returning a nullptr.
+        trace::inf("No support to get peer target on SMP bus");
+        txTarget = i_rxTarget;
+    }
+    else if (callout::BusType::OMI_BUS == i_busType &&
+             util::pdbg::TYPE_OMI == rxType)
+    {
+        // This is a bit clunky. The pdbg APIs only give us the ability to
+        // iterate over the children instead of just returning a list. So we'll
+        // push all the children to a list and go from there.
+        std::vector<pdbg_target*> childList;
+
+        pdbg_target* childTarget = nullptr;
+        pdbg_for_each_target("ocmb", i_rxTarget, childTarget)
+        {
+            if (nullptr != childTarget)
+            {
+                childList.push_back(childTarget);
+            }
+        }
+
+        // We know there should only be one OCMB per OMI.
+        if (1 != childList.size())
+        {
+            throw std::logic_error("Invalid child list size for " + rxPath);
+        }
+
+        // Get the connected target.
+        txTarget = childList.front();
+    }
+    else if (callout::BusType::OMI_BUS == i_busType &&
+             util::pdbg::TYPE_OCMB == rxType)
+    {
+        txTarget = pdbg_target_parent("omi", i_rxTarget);
+        if (nullptr == txTarget)
+        {
+            throw std::logic_error("No parent OMI found for " + rxPath);
+        }
+    }
+    else
+    {
+        // This would be a code bug.
+        throw std::logic_error("Unsupported config: i_rxTarget=" + rxPath +
+                               " i_busType=" + i_busType.getString());
+    }
+
+    assert(nullptr != txTarget); // just in case we missed something above
+
+    return txTarget;
+}
+
+//------------------------------------------------------------------------------
+
 pdbg_target* getPibTrgt(pdbg_target* i_procTrgt)
 {
     // The input target must be a processor.
diff --git a/util/pdbg.hpp b/util/pdbg.hpp
index 6c604ac..1dea6ae 100644
--- a/util/pdbg.hpp
+++ b/util/pdbg.hpp
@@ -2,6 +2,8 @@
 
 #include <libpdbg.h>
 
+#include <analyzer/callout.hpp>
+
 #include <string>
 #include <vector>
 
@@ -53,6 +55,14 @@
 uint8_t getTrgtType(const libhei::Chip& i_chip);
 
 /**
+ * @return The connected target on the other side of the given bus.
+ * @param  i_rxTarget The target on the receiving side (RX) of the bus.
+ * @param  i_busType  The bus type.
+ */
+pdbg_target* getConnectedTarget(pdbg_target* i_rxTarget,
+                                const analyzer::callout::BusType& i_busType);
+
+/**
  * @return The pib target associated with the given proc target.
  * @note   Will assert the given target is a proc target.
  * @note   Will assert the returned pib target it not nullptr.