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/prdfRegisterCache.C b/src/register/prdfRegisterCache.C
new file mode 100644
index 0000000..e7d29ff
--- /dev/null
+++ b/src/register/prdfRegisterCache.C
@@ -0,0 +1,123 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/diag/prdf/common/framework/register/prdfRegisterCache.C $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2012,2017 */
+/* [+] 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 */
+
+#include <prdfRegisterCache.H>
+#include <iipconst.h>
+
+namespace PRDF
+{
+
+//------------------------------------------------------------------------------
+
+RegDataCache & RegDataCache::getCachedRegisters()
+{
+ return PRDF_GET_SINGLETON( ReadCache );
+}
+
+//------------------------------------------------------------------------------
+
+RegDataCache::~RegDataCache()
+{
+ flush();
+}
+
+//------------------------------------------------------------------------------
+
+BitString & RegDataCache::read( ExtensibleChip * i_chip,
+ const SCAN_COMM_REGISTER_CLASS * i_reg )
+{
+ ScomRegisterAccess l_scomAccessKey ( *i_reg, i_chip );
+ BitString * l_pBitString = queryCache( l_scomAccessKey );
+
+ if ( NULL == l_pBitString )
+ {
+ // Creating new entry
+ l_pBitString = new BitStringBuffer( i_reg->GetBitLength() );
+ // Adding register in the cache
+ iv_cachedRead[l_scomAccessKey] = l_pBitString;
+ }
+
+ return *l_pBitString;
+}
+
+//------------------------------------------------------------------------------
+
+void RegDataCache::flush()
+{
+ for ( CacheDump::iterator it = iv_cachedRead.begin();
+ it != iv_cachedRead.end(); it++ )
+ {
+ // Freeing up the bit string memory reserved on heap
+ delete it->second;
+ }
+
+ // Deleting all the entry from the cache
+ iv_cachedRead.clear();
+}
+
+//------------------------------------------------------------------------------
+
+void RegDataCache::flush( ExtensibleChip* i_pChip,
+ const SCAN_COMM_REGISTER_CLASS * i_pRegister )
+{
+ ScomRegisterAccess l_scomAccessKey ( *i_pRegister,i_pChip );
+ // Find the entries associated with the given target in the map
+ CacheDump::iterator it = iv_cachedRead.find( l_scomAccessKey );
+
+ // If entry exists delete the entry for given scom address
+ if ( it !=iv_cachedRead.end() )
+ {
+ delete it->second;
+ iv_cachedRead.erase( it );
+ }
+}
+
+//------------------------------------------------------------------------------
+
+BitString * RegDataCache::queryCache(
+ ExtensibleChip* i_pChip,
+ const SCAN_COMM_REGISTER_CLASS * i_pRegister )const
+{
+ ScomRegisterAccess l_scomAccessKey ( *i_pRegister,i_pChip );
+ return queryCache( l_scomAccessKey );
+}
+
+//------------------------------------------------------------------------------
+
+BitString * RegDataCache::queryCache(
+ const ScomRegisterAccess & i_scomAccessKey ) const
+{
+ BitString * l_pBitString = NULL;
+ CacheDump::const_iterator itDump = iv_cachedRead.find( i_scomAccessKey );
+ if( iv_cachedRead.end() != itDump )
+ {
+ l_pBitString = itDump->second ;
+ }
+
+ return l_pBitString;
+}
+
+//------------------------------------------------------------------------------
+}// end namespace PRDF