Copied PRD register access code from Hostboot project
This is just a straight copy from the Hostboot project. No modifications
have been made. Those will come in later commits.
Change-Id: Id9985f5542944ba88498b348b24b711fe2c30704
Signed-off-by: Zane Shelley <zshelle@us.ibm.com>
diff --git a/src/register/prdfScanFacility.C b/src/register/prdfScanFacility.C
new file mode 100755
index 0000000..1607d95
--- /dev/null
+++ b/src/register/prdfScanFacility.C
@@ -0,0 +1,237 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/diag/prdf/common/framework/register/prdfScanFacility.C $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2012,2018 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+
+/**
+ @file prdfScanFacility.C
+ @brief PRD ScanFaclity class definition
+*/
+//----------------------------------------------------------------------
+// Includes
+//----------------------------------------------------------------------
+#define prdfScanFacility_C
+
+#include <iipscr.h>
+#include <prdfScanFacility.H>
+#include <prdfFlyWeight.C>
+#include <prdfFlyWeightS.C>
+#include <prdfScomRegisterAccess.H>
+
+#undef prdfScanFacility_C
+
+namespace PRDF
+{
+
+//----------------------------------------------------------------------
+// Constants
+//----------------------------------------------------------------------
+
+//----------------------------------------------------------------------
+// Macros
+//----------------------------------------------------------------------
+
+//----------------------------------------------------------------------
+// Internal Function Prototypes
+//----------------------------------------------------------------------
+
+//----------------------------------------------------------------------
+// Global Variables
+//----------------------------------------------------------------------
+
+NullRegister AttnTypeRegister::cv_null(1024);
+
+//---------------------------------------------------------------------
+// Member Function Specifications
+//---------------------------------------------------------------------
+
+
+ScanFacility & ScanFacility::Access(void)
+{
+ static ScanFacility sf;
+ return sf;
+}
+//-----------------------------------------------------------------------------
+SCAN_COMM_REGISTER_CLASS & ScanFacility::GetScanCommRegister( uint64_t address,
+ uint32_t i_scomLength, TARGETING::TYPE i_type,
+ SCAN_COMM_REGISTER_CLASS::AccessLevel i_regOp )
+{
+ /* i_regOp is not used to determine uniqueness of the object for following
+ reason -
+ There can not be two registers in hardware with same address and target
+ type supporting different operations say one supports only write and
+ other both read and write.
+ */
+
+ ScomRegister scrKey( address, i_scomLength, i_type, i_regOp );
+ // in case we get a object with different default operation, we shall reset
+ // it to what it should be as per rule file.
+ ScomRegister ®Created = iv_scomRegFw.get(scrKey);
+ regCreated.setAccessLevel( i_regOp );
+ return regCreated;
+}
+
+//------------------------------------------------------------------------------
+
+SCAN_COMM_REGISTER_CLASS & ScanFacility::GetNotRegister(
+ SCAN_COMM_REGISTER_CLASS & i_arg )
+{
+ NotRegister r(i_arg);
+ return iv_notRegFw.get(r);
+}
+
+//-----------------------------------------------------------------------------
+
+SCAN_COMM_REGISTER_CLASS & ScanFacility::GetLeftShiftRegister(
+ SCAN_COMM_REGISTER_CLASS & i_arg,
+ uint16_t i_amount )
+{
+ LeftShiftRegister r(i_arg, i_amount);
+ return iv_leftRegFw.get(r);
+}
+
+//-----------------------------------------------------------------------------
+
+SCAN_COMM_REGISTER_CLASS & ScanFacility::GetSummaryRegister(
+ SCAN_COMM_REGISTER_CLASS & i_arg,
+ uint16_t i_bit )
+{
+ SummaryRegister r(i_arg, i_bit);
+ return iv_sumRegFw.get(r);
+}
+
+//------------------------------------------------------------------------------
+
+SCAN_COMM_REGISTER_CLASS & ScanFacility::GetRightShiftRegister(
+ SCAN_COMM_REGISTER_CLASS & i_arg,
+ uint16_t i_amount )
+{
+ RightShiftRegister r(i_arg, i_amount);
+ return iv_rightRegFw.get(r);
+}
+
+
+//------------------------------------------------------------------------------
+
+SCAN_COMM_REGISTER_CLASS & ScanFacility::GetAndRegister(
+ SCAN_COMM_REGISTER_CLASS & i_left,
+ SCAN_COMM_REGISTER_CLASS & i_right )
+{
+ AndRegister r(i_left,i_right);
+ return iv_andRegFw.get(r);
+}
+
+//------------------------------------------------------------------------------
+
+SCAN_COMM_REGISTER_CLASS & ScanFacility::GetOrRegister(
+ SCAN_COMM_REGISTER_CLASS & i_left,
+ SCAN_COMM_REGISTER_CLASS & i_right )
+{
+ OrRegister r(i_left,i_right);
+ return iv_orRegFw.get(r);
+}
+
+//-----------------------------------------------------------------------------
+
+SCAN_COMM_REGISTER_CLASS & ScanFacility::GetAttnTypeRegister(
+ SCAN_COMM_REGISTER_CLASS * i_check,
+ SCAN_COMM_REGISTER_CLASS * i_recov,
+ SCAN_COMM_REGISTER_CLASS * i_special,
+ SCAN_COMM_REGISTER_CLASS * i_proccs,
+ SCAN_COMM_REGISTER_CLASS * i_hostattn )
+{
+ AttnTypeRegister r(i_check, i_recov, i_special, i_proccs, i_hostattn);
+ return iv_attnRegFw.get(r);
+}
+
+//------------------------------------------------------------------------------
+
+SCAN_COMM_REGISTER_CLASS & ScanFacility::GetConstantRegister(
+ const BitStringBuffer & i_val )
+{
+ ConstantRegister r(i_val);
+ return iv_constRegFw.get(r);
+}
+//------------------------------------------------------------------------------
+SCAN_COMM_REGISTER_CLASS & ScanFacility::GetPluginRegister(
+ SCAN_COMM_REGISTER_CLASS & i_flyweight,
+ ExtensibleChip & i_RuleChip )
+{
+ ScomRegisterAccess l_regKey ( i_flyweight,&i_RuleChip );
+ return iv_pluginRegFw.get(l_regKey);
+
+}
+//-----------------------------------------------------------------------------
+void ScanFacility::ResetPluginRegister()
+{
+ iv_pluginRegFw.clear();
+
+
+}
+
+//-----------------------------------------------------------------------------
+
+void ScanFacility::reset()
+{
+ iv_scomRegFw.clear();
+ iv_attnRegFw.clear();
+ iv_andRegFw.clear();
+ iv_orRegFw.clear();
+ iv_notRegFw.clear();
+ iv_leftRegFw.clear();
+ iv_sumRegFw.clear();
+ iv_rightRegFw.clear();
+ iv_constRegFw.clear();
+ iv_pluginRegFw.clear();
+}
+
+//------------------------------------------------------------------------------
+#ifdef FLYWEIGHT_PROFILING
+void ScanFacility::printStats()
+{
+ PRDF_TRAC("ScomRegister");
+ iv_scomRegFw.printStats();
+ PRDF_TRAC("Not Register");
+ iv_notRegFw.printStats();
+ PRDF_TRAC("Left Register");
+ iv_leftRegFw.printStats();
+ PRDF_TRAC("Right Register");
+ iv_rightRegFw.printStats();
+ PRDF_TRAC("And Register");
+ iv_andRegFw.printStats();
+ PRDF_TRAC("Or Register");
+ iv_orRegFw.printStats();
+ PRDF_TRAC("AttnTypeRegisters FW" );
+ iv_attnRegFw.printStats();
+ PRDF_TRAC("SummaryRegisters FW" );
+ iv_sumRegFw.printStats();
+ PRDF_TRAC("ConstantRegisters FW" );
+ iv_constRegFw.printStats();
+ PRDF_TRAC("PluginRegisters FW" );
+ iv_pluginRegFw.printStats();
+}
+
+#endif
+
+} // end namespace PRDF
+