summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.H
blob: 908272294017b6f2ed1396f10707ff8f6fc7be3b (plain)
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* $Source: src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.H $        */
/*                                                                        */
/* OpenPOWER HostBoot Project                                             */
/*                                                                        */
/* Contributors Listed Below - COPYRIGHT 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  prdfMemRowRepair.H */

#ifndef __prdfMemRowRepair_H
#define __prdfMemRowRepair_H

#include <prdfPlatServices.H>

#include <prdfMemAddress.H>
#include <prdfMemSymbol.H>
#include <prdfMemConst.H>
#include <prdfParserEnums.H>

namespace PRDF
{

class CaptureData;
class MemSymbol;

/**
 * @brief Container for DIMM's Row Repair Data.
 */
class MemRowRepair
{
  public: // constructors

    /** @brief Default constructor */
    MemRowRepair()
    {
        memset( iv_data, 0x00, sizeof(iv_data) );
    }

    /** @brief Constructor from components */
    MemRowRepair( TARGETING::TargetHandle_t i_dimm, const MemRank & i_rank,
                 const uint8_t (&i_d)[ROW_REPAIR::ROW_REPAIR_SIZE] ) :
        iv_dimm(i_dimm), iv_rank(i_rank)
    {
        memcpy( iv_data, i_d, sizeof(iv_data) );
    }

  public: // functions

    /** @return A reference to the data array. */
    const uint8_t (&getData()const)[ROW_REPAIR::ROW_REPAIR_SIZE]
    {
        return iv_data;
    }

    /** @return The dram the row repair is on. */
    uint8_t getRowRepairDram()
    {
        // The dram position is located in the first 5 bits of row repair data
        return ( (iv_data[0] >> 3 ) & 0x1f );
    }

    /** @return True or false whether this row repair is valid */
    bool isValid()
    {
        // The last bit of row repair data is the validity bit.
        // 1 if valid. 0 if invalid.
        return ( iv_data[ROW_REPAIR::ROW_REPAIR_SIZE-1] & 0x01 );
    }

    /**
     * @brief  Queries if there are is any row repair data present.
     * @return TRUE if any row repair data present.
     */
    bool nonZero() const;

  private: // instance variables

    TARGETING::TargetHandle_t iv_dimm; ///< Target DIMM
    MemRank iv_rank;                   ///< Target rank

    /** A bitmap of all bad DQs for each port. */
    uint8_t iv_data[ROW_REPAIR::ROW_REPAIR_SIZE];
};

//##############################################################################
//                              Utility Functions
//##############################################################################

/**
 * @brief  Reads the row repair data attribute for the target rank and dimm.
 * @param  i_dimm      A dimm target.
 * @param  i_rank      Target rank.
 * @param  o_rowRepair Row repair data container.
 * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
 */
template<TARGETING::TYPE T>
uint32_t getRowRepairData( TARGETING::TargetHandle_t i_dimm,
    const MemRank & i_rank, MemRowRepair & o_rowRepair );

/**
 * @brief  Writes the row repair data attribute for the target rank and dimm.
 * @param  i_dimm      A dimm target.
 * @param  i_rank      Target rank.
 * @param  i_rowRepair Row repair data container.
 * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
 */
template<TARGETING::TYPE T>
uint32_t setRowRepairData( TARGETING::TargetHandle_t i_dimm,
    const MemRank & i_rank, const MemRowRepair & i_rowRepair );

/**
 * @brief  Writes the row repair data attribute for the target rank and dimm.
 * @param  i_dimm A dimm target.
 * @param  i_rank Target rank.
 * @param  i_addr Address for the row repair.
 * @param  i_dram Dram position for the row repair. NOTE: this is the dram
 *                position relative to the Centaur DQs (x8: 0-9, x4: 0-19)
 * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
 */
template<TARGETING::TYPE T>
uint32_t setRowRepairData( TARGETING::TargetHandle_t i_dimm,
    const MemRank & i_rank, const MemAddr & i_addr, uint8_t i_dram );

/**
 * @brief  Clears the row repair data attribute for the target rank and dimm.
 * @param  i_dimm      A dimm target.
 * @param  i_rank      Target rank.
 * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
 */
template<TARGETING::TYPE T>
uint32_t clearRowRepairData( TARGETING::TargetHandle_t i_dimm,
                             const MemRank & i_rank );

} // end namespace PRDF

#endif // __prdfMemRowRepair_H
OpenPOWER on IntegriCloud