1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaUeTable.C $ */
/* */
/* IBM CONFIDENTIAL */
/* */
/* COPYRIGHT International Business Machines Corp. 2013,2014 */
/* */
/* p1 */
/* */
/* Object Code Only (OCO) source materials */
/* Licensed Internal Code Source Materials */
/* IBM HostBoot Licensed Internal Code */
/* */
/* The source code for this program is not published or otherwise */
/* divested of its trade secrets, irrespective of what has been */
/* deposited with the U.S. Copyright Office. */
/* */
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
#include <prdfCenMbaUeTable.H>
#include <algorithm>
// Framwork includes
#include <iipServiceDataCollector.h>
#include <UtilHash.H>
using namespace TARGETING;
namespace PRDF
{
using namespace UE_TABLE;
//------------------------------------------------------------------------------
void CenMbaUeTable::addEntry( UE_TABLE::Type i_type, const CenAddr & i_addr )
{
// Create the new entry.
UeTableData data ( i_type, i_addr );
// First, check if the entry already exists. If so, increment its count and
// move it to the end of the queue.
UeTable::iterator it = std::find( iv_table.begin(), iv_table.end(), data );
if ( iv_table.end() != it )
{
// Update the count
data.count = it->count;
if ( MAX_ENTRY_COUNT > data.count )
data.count++;
// Remove the old entry
iv_table.erase( it );
}
// Add the new entry to the end of the list.
iv_table.push_back( data );
// Pop off the oldest entry if the table is full.
if ( MAX_ENTRIES < iv_table.size() )
iv_table.pop_front();
}
//------------------------------------------------------------------------------
void CenMbaUeTable::addCapData( CaptureData & io_cd )
{
static const size_t sz_word = sizeof(CPU_WORD);
// Get the maximum capture data size and adjust the size for endianess.
static const size_t sz_maxData = ((MAX_SIZE+sz_word-1) / sz_word) * sz_word;
// Initialize to 0.
uint8_t data[sz_maxData];
memset( data, 0x00, sz_maxData );
size_t sz_actData = 0;
for ( UeTable::iterator it = iv_table.begin(); it != iv_table.end(); it++ )
{
uint32_t mrnk = it->addr.getRank().getMaster(); // 3-bit
uint32_t srnk = it->addr.getRank().getSlave(); // 3-bit
uint32_t svld = it->addr.getRank().isSlaveValid() ? 1 : 0; // 1-bit
uint32_t bnk = it->addr.getBank(); // 4-bit
uint32_t row = it->addr.getRow(); // 17-bit
uint32_t col = it->addr.getCol(); // 12-bit
uint8_t row0 = (row & 0x10000) >> 16;
uint8_t row1_8 = (row & 0x0ff00) >> 8;
uint8_t row9_16 = row & 0x000ff;
uint8_t col0_3 = (col & 0xf00) >> 8;
uint8_t col4_11 = col & 0x0ff;
data[sz_actData ] = it->count;
data[sz_actData+1] = it->type << 4; // 4 bits to spare.
data[sz_actData+2] = (mrnk << 5) | (srnk << 2) | (svld << 1) | row0;
data[sz_actData+3] = row1_8;
data[sz_actData+4] = row9_16;
data[sz_actData+5] = (bnk << 4) | col0_3;
data[sz_actData+6] = col4_11;
sz_actData += ENTRY_SIZE;
}
if ( 0 != sz_actData )
{
// Fix endianess issues with non PPC machines.
sz_actData = ((sz_actData + sz_word-1) / sz_word) * sz_word;
for ( uint32_t i = 0; i < (sz_actData/sz_word); i++ )
((CPU_WORD*)data)[i] = htonl(((CPU_WORD*)data)[i]);
// Add data to capture data.
BIT_STRING_ADDRESS_CLASS bs ( 0, sz_actData*8, (CPU_WORD *) &data );
io_cd.Add( iv_mbaTrgt, Util::hashString("MEM_UE_TABLE"), bs );
}
}
} // end namespace PRDF
|