summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/memory/lib/utils
diff options
context:
space:
mode:
authorBrian Silver <bsilver@us.ibm.com>2016-10-25 06:24:35 -0500
committerChristian R. Geddes <crgeddes@us.ibm.com>2016-10-31 10:36:59 -0400
commit0cb19a22319130ec4ebeb64ee87a47328297486e (patch)
tree23678cca2772e2d23043dd3b49f3aaf008b10baf /src/import/chips/p9/procedures/hwp/memory/lib/utils
parentc7cf0b2d56200537be4227b246fa5c4754cc7306 (diff)
downloadtalos-hostboot-0cb19a22319130ec4ebeb64ee87a47328297486e.tar.gz
talos-hostboot-0cb19a22319130ec4ebeb64ee87a47328297486e.zip
Add magic port capabilties for DDR PHY
Change-Id: I1cc2c51a2ddab1c20f110899dc5ff84b3233d58e Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/31772 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Louis Stermole <stermole@us.ibm.com> Reviewed-by: ANDRE A. MARIN <aamarin@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: Brian R. Silver <bsilver@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/31801 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/memory/lib/utils')
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/utils/find.H102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/utils/find.H b/src/import/chips/p9/procedures/hwp/memory/lib/utils/find.H
index 52561f8ae..c00bbac72 100644
--- a/src/import/chips/p9/procedures/hwp/memory/lib/utils/find.H
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/utils/find.H
@@ -41,6 +41,7 @@
#include <vector>
#include <lib/utils/pos.H>
+#include <lib/utils/c_str.H>
namespace mss
{
@@ -66,6 +67,34 @@ template< fapi2::TargetType M, fapi2::TargetType T >
inline fapi2::Target<M> find_target( const fapi2::Target<T>& i_target );
///
+/// @brief find the union of functionl targets and any magic targets
+/// @note The PHY has a logic block which is only contained in the 0th PHY in the controller.
+/// This makes the 0th PHY 'magic' in that it needs to always be present if not functional.
+/// This function returns all functional targets and includes the magic target whether or not
+/// it is truly functional.
+/// @tparam M the target type to be returned
+/// @tparam T the fapi2 target type of the argument
+/// @param[in] i_target the fapi2 target T
+/// @return a vector of M targets.
+///
+template< fapi2::TargetType M, fapi2::TargetType T >
+inline std::vector< fapi2::Target<M> > find_targets_with_magic( const fapi2::Target<T>& i_target);
+
+///
+/// @brief find a set of magic elements based on a fapi2 target
+/// @note The PHY has a logic block which is only contained in the 0th PHY in the controller.
+/// This makes the 0th PHY 'magic' in that it needs to always be present if not functional.
+/// This function returns all magic targets whether or not it is truly functional.
+/// It does not include other functional or present targets.
+/// @tparam M the target type to be returned
+/// @tparam T the fapi2 target type of the argument
+/// @param[in] i_target the fapi2 target T
+/// @return a vector of M targets.
+///
+template< fapi2::TargetType M, fapi2::TargetType T >
+inline std::vector< fapi2::Target<M> > find_magic_targets( const fapi2::Target<T>& i_target);
+
+///
/// @brief find the McBIST given a McBIST
/// @param[in] i_self the fapi2 target mcBIST
/// @return a McBIST target.
@@ -181,6 +210,79 @@ inline std::vector< fapi2::Target<fapi2::TARGET_TYPE_MCA> > find_targets
{
return i_target.getChildren<fapi2::TARGET_TYPE_MCA>();
}
+
+///
+/// @brief find the magic MCA connected to an MCBIST
+/// @param[in] i_target the fapi2::Target MCBIST
+/// @return a vector of fapi2::TARGET_TYPE_MCA
+///
+template<>
+inline std::vector< fapi2::Target<fapi2::TARGET_TYPE_MCA> > find_magic_targets
+( const fapi2::Target<fapi2::TARGET_TYPE_MCBIST>& i_target)
+{
+ // The magic port is in position 0, relative to the MCBIST
+ constexpr uint64_t RELATIVE_MAGIC_POS = 0;
+
+ // This is only one magic MCA on every MCBIST, so we only return a vector of one
+ std::vector<fapi2::Target<fapi2::TARGET_TYPE_MCA>> l_magic_ports;
+
+ // Get all the present MCA children and find the target with the relative position of 0
+ for (const auto& p : i_target.getChildren<fapi2::TARGET_TYPE_MCA>(fapi2::TARGET_STATE_PRESENT))
+ {
+ if (mss::relative_pos<fapi2::TARGET_TYPE_MCBIST>(p) == RELATIVE_MAGIC_POS)
+ {
+ l_magic_ports.push_back(p);
+ }
+ }
+
+ // We don't care if the vector is empty. We don't know what the caller will do with this
+ // and they might not care if there is no magic port either ...
+ return l_magic_ports;
+}
+
+///
+/// @brief find the union of functionl targets and any magic targets
+/// @param[in] i_target the fapi2::Target MCBIST
+/// @return a vector of i2::Target<fapi2::TARGET_TYPE_MCA>
+///
+template<>
+inline std::vector< fapi2::Target<fapi2::TARGET_TYPE_MCA> > find_targets_with_magic
+( const fapi2::Target<fapi2::TARGET_TYPE_MCBIST>& i_target)
+{
+ // We need the union of the functional target list and the magic target list. We can
+ // get a little tricky with the MCA's - we know there's only one magic port.
+ // So if the one magic port isn't in the list of functional ports, add it
+ auto l_magic_ports = find_magic_targets<fapi2::TARGET_TYPE_MCA>(i_target);
+
+ if (l_magic_ports.size() != 1)
+ {
+ FAPI_ERR("Found wrong number of magic ports on %s (%d)", mss::c_str(i_target), l_magic_ports.size());
+ fapi2::Assert(false);
+ }
+
+ auto l_ports = mss::find_targets<fapi2::TARGET_TYPE_MCA>(i_target);
+ const auto l_magic_pos = mss::relative_pos<fapi2::TARGET_TYPE_MCBIST>(l_magic_ports[0]);
+ const auto l_magic_port = std::find_if(l_ports.begin(), l_ports.end(),
+ [&l_magic_pos](const fapi2::Target<fapi2::TARGET_TYPE_MCA>& t)
+ {
+ // Check ports by relative position.
+ const auto l_pos = mss::relative_pos<fapi2::TARGET_TYPE_MCBIST>(t);
+ FAPI_DBG("checking for magic port at %d candidate is %d", l_magic_pos, l_pos);
+ return l_magic_pos == l_pos;
+ });
+
+ if (l_magic_port == l_ports.end())
+ {
+ // Add the magic port to the front of the port vector.
+ FAPI_DBG("inserting magic port %d", l_magic_pos);
+ l_ports.insert(l_ports.begin(), l_magic_ports[0]);
+ }
+
+ // In either case, l_ports is the proper thing to return. Either the magic port was in
+ // l_ports or it is now because we inserted it.
+ return l_ports;
+}
+
///
/// @brief find all the MCA connected to an MCS
/// @param[in] i_target a fapi2::Target MCS
OpenPOWER on IntegriCloud