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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
|
# IBM_PROLOG_BEGIN_TAG
# This is an automatically generated prolog.
#
# $Source: src/usr/diag/prdf/common/plat/centaur/centaur_membuf_actions.rule $
#
# 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
/** Callout the connected MBA 0 */
actionclass calloutMba0 { callout(connected(TYPE_MBA, 0), MRU_MED); };
/** Callout the connected MBA 1 */
actionclass calloutMba1 { callout(connected(TYPE_MBA, 1), MRU_MED); };
/** Callout the connected MBA 0, threshold 1 */
actionclass mba0_th_1 { calloutMba0; threshold1; };
/** Callout the connected MBA 1, threshold 1 */
actionclass mba1_th_1 { calloutMba1; threshold1; };
/** Callout the connected MBA 0, threshold 1, SUE source */
actionclass mba0_th_1_UERE { mba0_th_1; SueSource; };
/** Callout the connected MBA 1, threshold 1, SUE source */
actionclass mba1_th_1_UERE { mba1_th_1; SueSource; };
/** Threshold and mask policy (MBA 0) */
actionclass threshold_and_mask_mba0 { calloutMba0; threshold_and_mask; };
/** Threshold and mask policy (MBA 1) */
actionclass threshold_and_mask_mba1 { calloutMba1; threshold_and_mask; };
/** Callout the connected L4 */
actionclass calloutL4 { callout(connected(TYPE_L4, 0), MRU_MED); };
/** Callout the connected L4, threshold 1 */
actionclass l4_th_1 { calloutL4; threshold1; };
/** Callout the connected L4, threshold 32/day */
actionclass l4_th_32perDay { calloutL4; threshold32pday; };
/** Callout the connected L4, threshold 1, SUE source */
actionclass l4_th_1_UERE { l4_th_1; SueSource; };
/** PLL error */
actionclass pll_unlock_UERE
{
# These FIR bits should never trigger directly themselves in the rule code.
# Instead, They should be handled by global PRD PLL isolation code. We will
# add a threshold here to prevent flooding, just in case.
threshold32pday;
};
/** Callout the DMI BUS interface */
actionclass calloutBusInterface_dmibus
{
funccall("calloutBusInterfacePlugin");
};
/** Callout the DMI BUS interface, threshold 1 */
actionclass calloutBusInterface_dmibus_th1
{
calloutBusInterface_dmibus;
threshold1;
};
/** Callout the DMI BUS interface, threshold 1 */
actionclass calloutBusInterface_dmibus_th1_UERE
{
calloutBusInterface_dmibus;
threshold1;
SueSource;
};
/** Lane Repair: spare deployed */
actionclass spareDeployed_dmibus
{
calloutBusInterface_dmibus;
funccall("spareDeployed");
};
/** Lane Repair: max spares exceeded */
actionclass maxSparesExceeded_dmibus
{
calloutBusInterface_dmibus_th1;
funccall("maxSparesExceeded");
};
/** Lane Repair: too many bus errors */
actionclass tooManyBusErrors_dmibus_UERE
{
calloutBusInterface_dmibus_th1;
funccall("tooManyBusErrors");
SueSource; # channel failure
};
/** Calls out the DMI bus (TH 1) and clears any secondary attentions. */
actionclass replay_timeout_UERE
{
calloutBusInterface_dmibus_th1_UERE;
funccall("ClearMbsSecondaryBits");
};
/** Handles cases where both MBSFIR[3:4] are on, else calls out self. */
actionclass mbs_internal_timeout_precheck
{
threshold32pday;
funccall("mbsInternalTimeoutPrecheck");
};
/** Handles RCD parity errors, if present. Otherwise, calls out self (TH 1). */
actionclass mbs_internal_timeout
{
try ( funccall("analyzeMbaRcdParityError0"),
try ( funccall("analyzeMbaRcdParityError1"),
mbs_internal_timeout_precheck ) );
};
/** Handles RCD parity errors, if present. Otherwise, calls out lvl 2 (TH 1). */
actionclass mbs_int_ext_timeout
{
try ( funccall("analyzeMbaRcdParityError0"),
try ( funccall("analyzeMbaRcdParityError1"), level2_th_1 ) );
};
/** L4 cache SRW CE */
actionclass l4_cache_srw_ce
{
calloutL4;
threshold( field(32 / day), mfg_file(ATTR_MNFG_TH_CEN_L4_CACHE_CES));
funccall("CaptureL4CacheErr");
funccall("ClearServiceCallFlag");
funccall("ClearMbsSecondaryBits");
};
/** L4 cache SRW UE */
actionclass l4_cache_srw_ue_UERE
{
calloutL4;
threshold1;
funccall("CaptureL4CacheErr");
funccall("MaskMbsSecondaryBits");
SueSource;
};
/** L4 cache CO UE */
actionclass l4_cache_co_ce
{
calloutL4;
threshold( field(32 / day), mfg_file(ATTR_MNFG_TH_CEN_L4_CACHE_CES));
funccall("CaptureL4CacheErr");
funccall("ClearServiceCallFlag");
funccall("ClearMbaCalSecondaryBits");
};
/** L4 cache CO UE */
actionclass l4_cache_co_ue_UERE
{
calloutL4;
threshold1;
funccall("CaptureL4CacheErr");
funccall("MaskMbaCalSecondaryBits");
SueSource;
};
/** Verify Chip Mark */
actionclass verify_chip_mark_rnk0_mba0 { funccall("AnalyzeFetchMpe0_0"); };
actionclass verify_chip_mark_rnk1_mba0 { funccall("AnalyzeFetchMpe0_1"); };
actionclass verify_chip_mark_rnk2_mba0 { funccall("AnalyzeFetchMpe0_2"); };
actionclass verify_chip_mark_rnk3_mba0 { funccall("AnalyzeFetchMpe0_3"); };
actionclass verify_chip_mark_rnk4_mba0 { funccall("AnalyzeFetchMpe0_4"); };
actionclass verify_chip_mark_rnk5_mba0 { funccall("AnalyzeFetchMpe0_5"); };
actionclass verify_chip_mark_rnk6_mba0 { funccall("AnalyzeFetchMpe0_6"); };
actionclass verify_chip_mark_rnk7_mba0 { funccall("AnalyzeFetchMpe0_7"); };
actionclass verify_chip_mark_rnk0_mba1 { funccall("AnalyzeFetchMpe1_0"); };
actionclass verify_chip_mark_rnk1_mba1 { funccall("AnalyzeFetchMpe1_1"); };
actionclass verify_chip_mark_rnk2_mba1 { funccall("AnalyzeFetchMpe1_2"); };
actionclass verify_chip_mark_rnk3_mba1 { funccall("AnalyzeFetchMpe1_3"); };
actionclass verify_chip_mark_rnk4_mba1 { funccall("AnalyzeFetchMpe1_4"); };
actionclass verify_chip_mark_rnk5_mba1 { funccall("AnalyzeFetchMpe1_5"); };
actionclass verify_chip_mark_rnk6_mba1 { funccall("AnalyzeFetchMpe1_6"); };
actionclass verify_chip_mark_rnk7_mba1 { funccall("AnalyzeFetchMpe1_7"); };
/** Fetch NCE */
actionclass mainline_nce_handling_mba0 { funccall("AnalyzeFetchNce0"); };
actionclass mainline_nce_handling_mba1 { funccall("AnalyzeFetchNce1"); };
/** Fetch UE */
actionclass mainline_ue_0
{
funccall("AnalyzeFetchUe0");
threshold( field(33 / 30 min) );
SueSource;
};
actionclass mainline_ue_1
{
funccall("AnalyzeFetchUe1");
threshold( field(33 / 30 min) );
SueSource;
};
actionclass mainline_ue_handling_mba0_UERE
{
try ( funccall("analyzeMbaRcdParityError0"), mainline_ue_0 );
};
actionclass mainline_ue_handling_mba1_UERE
{
try ( funccall("analyzeMbaRcdParityError1"), mainline_ue_1 );
};
/** Fetch RCE or Prefetch UE */
actionclass mainline_rce_pue_handling_mba0 { funccall("AnalyzeFetchRcePue0"); };
actionclass mainline_rce_pue_handling_mba1 { funccall("AnalyzeFetchRcePue1"); };
###############################################################################
# Analyze group
###############################################################################
/** There is a small window during the IPL where the MEM chiplet may be offline
* while the rest of the chip is working. Therefore, we cannot capture those
* registers unless we have an active attention from the MEM chiplet. */
actionclass analyzeMemChipletFir
{
capture(MemChipletRegs);
analyze(gMEM_CHIPLET_FIR);
};
actionclass analyzeMemChipletSpa
{
capture(MemChipletRegs);
analyze(gMEM_CHIPLET_SPA_FIR);
};
actionclass analyzeTP_LFIR { analyze(gTP_LFIR); };
actionclass analyzeNEST_LFIR { analyze(gNEST_LFIR); };
actionclass analyzeDMIFIR { analyze(gDMIFIR); };
actionclass analyzeMBIFIR { analyze(gMBIFIR); };
actionclass analyzeMBSFIR { analyze(gMBSFIR); };
actionclass analyzeMCBISTFIR_0 { analyze(gMCBISTFIR_0); };
actionclass analyzeMCBISTFIR_1 { analyze(gMCBISTFIR_1); };
actionclass analyzeMBSECCFIR_0 { analyze(gMBSECCFIR_0); };
actionclass analyzeMBSECCFIR_1 { analyze(gMBSECCFIR_1); };
actionclass analyzeSCACFIR { analyze(gSCACFIR); };
actionclass analyzeMBSSECUREFIR { analyze(gMBSSECUREFIR); };
actionclass analyzeMEM_LFIR { analyze(gMEM_LFIR); };
###############################################################################
# Analyze connected
###############################################################################
actionclass analyzeConnectedMBA0 { analyze(connected(TYPE_MBA, 0)); };
actionclass analyzeConnectedMBA1 { analyze(connected(TYPE_MBA, 1)); };
|