summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Tritz <mtritz@us.ibm.com>2017-03-30 16:52:24 -0500
committerPatrick Williams <patrick@stwcx.xyz>2017-04-14 16:09:32 +0000
commitbe407166d0cb22f6967055b426c805e82ac48af8 (patch)
treed024df2ad83a12310039f968b98728a53cad7f5a
parent4bf58971b7ee8d25855b4339b64d2708f1626c41 (diff)
downloadopenpower-proc-control-be407166d0cb22f6967055b426c805e82ac48af8.tar.gz
openpower-proc-control-be407166d0cb22f6967055b426c805e82ac48af8.zip
P9 CFAM register override procedure
This new procedure will allow users to provide P9 CFAM register overrides before the P9 SBE is started. Change-Id: If3658f9a6ede9a3682c4ed7888e9acb328c67709 Signed-off-by: Michael Tritz <mtritz@us.ibm.com>
-rw-r--r--procedures/p9/cfam_overrides.cpp69
-rw-r--r--procedures/p9/start_host.cpp3
-rw-r--r--targeting.cpp18
-rw-r--r--targeting.hpp5
4 files changed, 93 insertions, 2 deletions
diff --git a/procedures/p9/cfam_overrides.cpp b/procedures/p9/cfam_overrides.cpp
new file mode 100644
index 0000000..90891b9
--- /dev/null
+++ b/procedures/p9/cfam_overrides.cpp
@@ -0,0 +1,69 @@
+#include <fstream>
+#include <sstream>
+#include <iostream>
+#include "cfam_access.hpp"
+#include "p9_cfam.hpp"
+#include "registration.hpp"
+#include "targeting.hpp"
+
+/* File /var/lib/obmc/cfam_overrides requires whitespace-separated parameters
+Pos Address Data Mask with one register write per line. For example:
+0 0x283F 0x12345678 0xF0F0F0F0
+0 0x283F 0x87654321 0x0F0F0F0F
+Blank lines and comment lines beginning with # will be ignored. */
+
+namespace openpower
+{
+namespace p9
+{
+
+using namespace openpower::cfam::access;
+using namespace openpower::targeting;
+using namespace openpower::util;
+
+void CFAMOverride() {
+ int pos = 0;
+ cfam_address_t address = 0;
+ cfam_data_t data = 0;
+ cfam_mask_t mask = 0;
+
+ Targeting targets;
+
+ std::string line;
+
+ std::ifstream overrides("/var/lib/obmc/cfam_overrides");
+
+ if (overrides.is_open())
+ {
+ while (std::getline(overrides,line))
+ {
+ if (!line.empty())
+ {
+ line.erase(0, line.find_first_not_of(" \t\r\n"));
+ if (!line.empty() && line.at(0) != '#')
+ {
+ mask = 0xFFFFFFFF;
+ if (sscanf(line.c_str(), "%x %hx %x %x", &pos, &address,
+ &data, &mask) >= 3)
+ {
+ const auto& target = targets.getTarget(pos);
+ writeRegWithMask(target, address, data, mask);
+ }
+ else
+ {
+ throw std::runtime_error("Cannot write to register - "
+ "not enough parameters given.");
+ }
+ }
+ }
+ }
+ overrides.close();
+ }
+
+ return;
+}
+
+REGISTER_PROCEDURE("CFAMOverride", CFAMOverride);
+
+}
+}
diff --git a/procedures/p9/start_host.cpp b/procedures/p9/start_host.cpp
index a31503b..6494086 100644
--- a/procedures/p9/start_host.cpp
+++ b/procedures/p9/start_host.cpp
@@ -66,7 +66,7 @@ void startHost()
//Kick off the SBE to start the boot
//First ensure ISTEP stepping isn't enabled
- writeReg(master, P9_SCRATCH_REGISTER_8, 0x20000000);
+ writeRegWithMask(master, P9_SCRATCH_REGISTER_8, 0x20000000, 0x20000000);
//Start the SBE
writeRegWithMask(master, P9_CBS_CS, 0x80000000, 0x80000000);
@@ -76,4 +76,3 @@ REGISTER_PROCEDURE("startHost", startHost);
}
}
-
diff --git a/targeting.cpp b/targeting.cpp
index 635c8bb..c5118c1 100644
--- a/targeting.cpp
+++ b/targeting.cpp
@@ -37,6 +37,24 @@ int Target::getCFAMFD()
return cfamFD->get();
}
+std::unique_ptr<Target>& Targeting::getTarget(size_t pos)
+{
+ auto search = [pos](const auto& t)
+ {
+ return t->getPos() == pos;
+ };
+
+ auto target = find_if(targets.begin(), targets.end(), search);
+ if (target == targets.end())
+ {
+ throw std::runtime_error("Target not found: " + std::to_string(pos));
+ }
+ else
+ {
+ return *target;
+ }
+}
+
Targeting::Targeting(const std::string& fsiMasterDev,
const std::string& fsiSlaveDir) :
diff --git a/targeting.hpp b/targeting.hpp
index 9719a65..8ab8eda 100644
--- a/targeting.hpp
+++ b/targeting.hpp
@@ -127,6 +127,11 @@ class Targeting
return targets.size();
}
+ /**
+ * Returns a target by position.
+ */
+ std::unique_ptr<Target>& getTarget(size_t pos);
+
private:
/**
OpenPOWER on IntegriCloud