xref: /illumos-gate/usr/src/cmd/fm/eversholt/files/common/pciex.esc (revision 581cede61ac9c14d8d4ea452562a567189eead78)
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#pragma dictionary "PCIEX"
27
28#include <fm/topo_hc.h>
29
30/*
31 * FIT rates - assume leaf devices are somewhat less reliable than
32 * root complexes, switches and bridges
33 */
34#define PCIEX_RC_FIT 500
35#define PCIEX_SW_FIT 500
36#define PCIEX_BDG_FIT 500
37#define PCIEX_DEV_FIT 1000
38#define PCIEX_RC_INV_FIT 500
39#define PCIEX_DEV_INV_FIT 1000
40#define PCIEX_RC_NR_FIT 500
41#define PCIEX_SW_NR_FIT 500
42#define PCIEX_BDG_NR_FIT 500
43#define PCIEX_DEV_NR_FIT 1000
44#define PCIEX_BUS_FIT 500
45#define PCIEX_BUS_NR_FIT 500
46
47/*
48 * SERD parameters.
49 *
50 * PCI Express correctable link errors are automatically handled by the
51 * hardware, so have relatively little impact and we can allow quite a
52 * high frequency. We will also be quite conservative about nonfatal internal
53 * errors reported by the driver.
54 *
55 * Nonfatal dpe errors (ptlp/ecrc errors) have to be recovered by the hardened
56 * driver which may cause intermittant performance/responsiveness problems, so
57 * we have tighter serd parameters for these. These are most likely errors in
58 * buffers/caches within devices and bridges, so use similar rates to cpu
59 * data cache parity errors.
60 */
61#define CORRLINK_COUNT 6
62#define CORRLINK_TIME 2h
63#define BTLP_COUNT 6
64#define BTLP_TIME 2h
65#define BDLLP_COUNT 6
66#define BDLLP_TIME 2h
67#define RTO_COUNT 6
68#define RTO_TIME 2h
69#define RNR_COUNT 6
70#define RNR_TIME 2h
71#define RE_COUNT 6
72#define RE_TIME 2h
73#define NONFATAL_DPE_COUNT 3
74#define NONFATAL_DPE_TIME 168h
75
76/*
77 * if the source-id payload is valid, then check it matches
78 */
79#define SOURCE_ID_MATCHES_BDF \
80	(!payloadprop_defined("source-valid") || \
81	payloadprop("source-valid") == 0 || \
82	payloadprop("source-id") == ((b << 8) | (d << 3) | f))
83
84#define SOURCE_ID_MATCHES_OWN_BDF \
85	(payloadprop_defined("source-valid") && \
86	payloadprop("source-valid") == 1 && \
87	payloadprop("source-id") == (confprop(pciexrc, TOPO_PCI_BDF) + 0))
88
89/*
90 * Other useful macros. These use the EXCAP property (PCI Express Capabilities
91 * register) to find the type for PCI Express devices, and the CLASS-CODE
92 * property (PCI Class Code register) for to find the type of PCI devices behind
93 * a PCI Express-PCI bridge - note that 60400 and 60401 are defined as PCI-PCI
94 * bridges, everything else is consider a PCI leaf device.
95 */
96#define	PCIEXFN		pciexbus/pciexdev/pciexfn
97#define	PCIEXFNHZ	pciexbus<>/pciexdev<>/pciexfn<>
98#define	PCIEXFN1	pciexbus[b]/pciexdev[d]/pciexfn[f]
99#define	PCIFN		pcibus/pcidev/pcifn
100#define	PCIFNHZ		pcibus<>/pcidev<>/pcifn<>
101#define	PCIFN1		pcibus[b]/pcidev[d]/pcifn[f]
102#define IS_LF(f) 	(confprop(f, TOPO_PCI_EXCAP) == "pciexdev")
103#define IS_BG(f) 	(confprop(f, TOPO_PCI_EXCAP) == "pcibus")
104#define IS_SD(f)	(confprop(f, TOPO_PCI_EXCAP) == "pciexswd")
105#define IS_SU(f)	(confprop(f, TOPO_PCI_EXCAP) == "pciexswu")
106#define	IS_PCI_LF(f)	(confprop_defined(f, TOPO_PCI_CLASS) && \
107			confprop(f, TOPO_PCI_CLASS) != "60400" && \
108			confprop(f, TOPO_PCI_CLASS) != "60401")
109
110/*
111 * define faults
112 */
113event fault.io.pciex.fw_corrupt@PCIEXFN, FITrate=PCIEX_DEV_FIT, retire=0;
114event fault.io.pciex.fw_mismatch@PCIEXFN, FITrate=PCIEX_DEV_FIT, retire=0;
115
116event fault.io.pciex.device-interr@PCIEXFN, FITrate=PCIEX_DEV_FIT;
117
118event fault.io.pciex.device-interr-deg@PCIEXFN, FITrate=PCIEX_DEV_FIT, retire=0;
119
120engine serd.io.pciex.flt-nf@PCIEXFN, N=NONFATAL_DPE_COUNT, T=NONFATAL_DPE_TIME;
121event fault.io.pciex.device-interr-unaf@PCIEXFN, FITrate=PCIEX_DEV_FIT,
122	engine=serd.io.pciex.flt-nf@PCIEXFN;
123
124engine serd.io.device.nonfatal@PCIEXFN, N=CORRLINK_COUNT, T=CORRLINK_TIME;
125event fault.io.pciex.device-interr-corr@PCIEXFN, FITrate=PCIEX_DEV_FIT,
126	engine=serd.io.device.nonfatal@PCIEXFN;
127engine serd.io.device.nonfatal@PCIEXFN/PCIEXFN,
128	N=CORRLINK_COUNT, T=CORRLINK_TIME;
129event fault.io.pciex.device-interr-corr@PCIEXFN/PCIEXFN, FITrate=PCIEX_DEV_FIT,
130	engine=serd.io.device.nonfatal@PCIEXFN/PCIEXFN;
131engine serd.io.device.nonfatal@pciexrc/PCIEXFN,
132	N=CORRLINK_COUNT, T=CORRLINK_TIME;
133event fault.io.pciex.device-interr-corr@pciexrc/PCIEXFN, FITrate=PCIEX_DEV_FIT,
134	engine=serd.io.device.nonfatal@pciexrc/PCIEXFN;
135
136event fault.io.pciex.device-interr@pciexrc, FITrate=PCIEX_RC_FIT;
137
138event fault.io.pciex.device-interr-deg@pciexrc, FITrate=PCIEX_RC_FIT, retire=0;
139
140engine serd.io.pciex.flt-nf@pciexrc, N=NONFATAL_DPE_COUNT, T=NONFATAL_DPE_TIME;
141event fault.io.pciex.device-interr-unaf@pciexrc, FITrate=PCIEX_RC_FIT,
142	engine=serd.io.pciex.flt-nf@pciexrc;
143
144engine serd.io.device.nonfatal@pciexrc, N=CORRLINK_COUNT, T=CORRLINK_TIME;
145event fault.io.pciex.device-interr-corr@pciexrc, FITrate=PCIEX_RC_FIT,
146	engine=serd.io.device.nonfatal@pciexrc;
147
148event fault.io.pciex.device-invreq@PCIEXFN, FITrate=PCIEX_DEV_INV_FIT;
149
150event fault.io.pciex.device-invreq@pciexrc, FITrate=PCIEX_RC_FIT;
151
152event fault.io.pciex.device-noresp@PCIEXFN, FITrate=PCIEX_DEV_NR_FIT;
153
154event fault.io.pciex.device-noresp@pciexrc, FITrate=PCIEX_RC_NR_FIT;
155
156event fault.io.pciex.bus-noresp@PCIEXFN, FITrate=PCIEX_BUS_NR_FIT;
157
158event fault.io.pciex.bus-linkerr@PCIEXFN, FITrate=PCIEX_BUS_FIT;
159
160engine serd.io.pciex.corrlink-bus@pciexrc/PCIEXFN,
161	N=CORRLINK_COUNT, T=CORRLINK_TIME;
162event fault.io.pciex.bus-linkerr-corr@pciexrc/PCIEXFN, FITrate=PCIEX_BUS_FIT,
163	engine=serd.io.pciex.corrlink-bus@pciexrc/PCIEXFN;
164engine serd.io.pciex.corrlink-bus@PCIEXFN/PCIEXFN,
165	N=CORRLINK_COUNT, T=CORRLINK_TIME;
166event fault.io.pciex.bus-linkerr-corr@PCIEXFN/PCIEXFN, FITrate=PCIEX_BUS_FIT,
167	engine=serd.io.pciex.corrlink-bus@PCIEXFN/PCIEXFN;
168
169/*
170 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
171 * Handling of leaf driver detected internal errors. Use serd engine if
172 * no service impact - otherwise fail immediately
173 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
174 */
175event ereport.io.device.inval_state@PCIEXFN{within(5s)};
176event ereport.io.device.no_response@PCIEXFN{within(5s)};
177event ereport.io.device.stall@PCIEXFN{within(5s)};
178event ereport.io.device.badint_limit@PCIEXFN{within(5s)};
179event ereport.io.device.intern_corr@PCIEXFN{within(5s)};
180event ereport.io.device.intern_uncorr@PCIEXFN{within(5s)};
181event ereport.io.service.lost@PCIEXFN{within(5s)};
182event ereport.io.service.degraded@PCIEXFN{within(5s)};
183event ereport.io.service.unaffected@PCIEXFN{within(5s)};
184event ereport.io.service.restored@PCIEXFN{within(30s)};
185event ereport.io.service.lost@PCIFN{within(5s)};
186event ereport.io.service.degraded@PCIFN{within(5s)};
187event ereport.io.service.unaffected@PCIFN{within(5s)};
188
189event error.io.pciex.noimpact-d@PCIEXFN;
190event error.io.pciex.degraded-d@PCIEXFN;
191event error.io.pciex.lost-d@PCIEXFN;
192event error.io.service.restored@PCIEXFN;
193event error.io.service.restored@PCIFN;
194event error.io.device.nf-device@PCIEXFN;
195event error.io.device.deg-device@PCIEXFN;
196event error.io.device.f-device@PCIEXFN;
197
198prop error.io.device.f-device@PCIEXFN (1)->
199    ereport.io.device.inval_state@PCIEXFN,
200    ereport.io.device.no_response@PCIEXFN,
201    ereport.io.device.stall@PCIEXFN,
202    ereport.io.device.badint_limit@PCIEXFN,
203    ereport.io.device.intern_corr@PCIEXFN,
204    ereport.io.device.intern_uncorr@PCIEXFN;
205
206prop error.io.device.f-device@PCIEXFN (0)->
207    error.io.pciex.lost-d@PCIEXFN;
208
209prop error.io.device.deg-device@PCIEXFN (1)->
210    ereport.io.device.inval_state@PCIEXFN,
211    ereport.io.device.no_response@PCIEXFN,
212    ereport.io.device.stall@PCIEXFN,
213    ereport.io.device.badint_limit@PCIEXFN,
214    ereport.io.device.intern_corr@PCIEXFN,
215    ereport.io.device.intern_uncorr@PCIEXFN;
216
217prop error.io.device.deg-device@PCIEXFN (1)->
218    error.io.pciex.degraded-d@PCIEXFN;
219
220prop error.io.device.nf-device@PCIEXFN (1)->
221    ereport.io.device.inval_state@PCIEXFN,
222    ereport.io.device.no_response@PCIEXFN,
223    ereport.io.device.stall@PCIEXFN,
224    ereport.io.device.badint_limit@PCIEXFN,
225    ereport.io.device.intern_corr@PCIEXFN,
226    ereport.io.device.intern_uncorr@PCIEXFN;
227
228prop error.io.device.nf-device@PCIEXFN (1)->
229    error.io.pciex.noimpact-d@PCIEXFN;
230
231/*
232 * handling of service impact ereports.
233 */
234prop error.io.pciex.lost-d@PCIEXFN (1)->
235    ereport.io.service.lost@PCIEXFNHZ { is_under(PCIEXFN, PCIEXFNHZ) },
236    ereport.io.service.lost@PCIFNHZ { is_under(PCIEXFN, PCIFNHZ) };
237
238prop error.io.pciex.lost-d@PCIEXFN (0)->
239    ereport.io.service.unaffected@PCIEXFNHZ { is_under(PCIEXFN, PCIEXFNHZ) },
240    ereport.io.service.unaffected@PCIFNHZ { is_under(PCIEXFN, PCIFNHZ) },
241    ereport.io.service.degraded@PCIEXFNHZ { is_under(PCIEXFN, PCIEXFNHZ) },
242    ereport.io.service.degraded@PCIFNHZ { is_under(PCIEXFN, PCIFNHZ) };
243
244prop error.io.pciex.degraded-d@PCIEXFN (1)->
245    ereport.io.service.degraded@PCIEXFNHZ { is_under(PCIEXFN, PCIEXFNHZ) },
246    ereport.io.service.degraded@PCIFNHZ { is_under(PCIEXFN, PCIFNHZ) };
247
248prop error.io.pciex.degraded-d@PCIEXFN (0)->
249    ereport.io.service.unaffected@PCIEXFNHZ { is_under(PCIEXFN, PCIEXFNHZ) },
250    ereport.io.service.unaffected@PCIFNHZ { is_under(PCIEXFN, PCIFNHZ) };
251
252prop error.io.pciex.noimpact-d@PCIEXFN (1)->
253    ereport.io.service.unaffected@PCIEXFNHZ { is_under(PCIEXFN, PCIEXFNHZ) },
254    ereport.io.service.unaffected@PCIFNHZ { is_under(PCIEXFN, PCIFNHZ) },
255    error.io.service.restored@PCIEXFNHZ { is_under(PCIEXFN, PCIEXFNHZ) },
256    error.io.service.restored@PCIFNHZ { is_under(PCIEXFN, PCIFNHZ) };
257
258prop error.io.service.restored@PCIEXFN (1)->
259    ereport.io.service.lost@PCIEXFN,
260    ereport.io.service.degraded@PCIEXFN;
261
262prop error.io.service.restored@PCIEXFN (1)->
263    ereport.io.service.restored@PCIEXFN;
264
265/*
266 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
267 * A faulty PCI Express hostbridge (root complex) may cause:
268 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
269 * - nr-d:		the device not to respond to a valid upstream request
270 * - ca-d:		the device to completer abort a valid upstream request
271 * - mtlp-d:		a malformed tlp to be transmitted downstream
272 * - badreq-d:		a bad downstream request - not CRC error (may cause
273 *			completer to respond with ur or ca)
274 * - ecrcreq-d:		TLP with end-to-end CRC error transmitted downstream
275 * - ecrccomp-d:	TLP with end-to-end CRC error transmitted downstream
276 * - poisreq-d:		poisoned request transmitted downstream
277 * - poiscomp-d:	poisoned completion transmitted downstream
278 * - corrlink:		correctable link or physical level error
279 * - fatlink:		fatal link or physical level error
280 */
281event error.io.pciex.nr-d@pciexrc/PCIEXFN;
282event error.io.pciex.ca-d@pciexrc/PCIEXFN;
283event error.io.pciex.mtlp-d@pciexrc/PCIEXFN;
284event error.io.pciex.fatlink@pciexrc/PCIEXFN;
285event error.io.pciex.badreq-d@pciexrc/PCIEXFN;
286event error.io.pciex.nf-poisecrc-d@pciexrc/PCIEXFN;
287event error.io.pciex.f-poisecrc-d@pciexrc/PCIEXFN;
288event error.io.pciex.deg-poisecrc-d@pciexrc/PCIEXFN;
289event ereport.io.pciex.dl.btlp@pciexrc{within(5s)};
290event ereport.io.pciex.dl.bdllp@pciexrc{within(5s)};
291event ereport.io.pciex.dl.rto@pciexrc{within(5s)};
292event ereport.io.pciex.dl.rnr@pciexrc{within(5s)};
293event ereport.io.pciex.pl.re@pciexrc{within(5s)};
294event ereport.io.pciex.dl.btlp@pciexrc/PCIEXFN{within(5s)};
295event ereport.io.pciex.dl.bdllp@pciexrc/PCIEXFN{within(5s)};
296event ereport.io.pciex.dl.rto@pciexrc/PCIEXFN{within(5s)};
297event ereport.io.pciex.dl.rnr@pciexrc/PCIEXFN{within(5s)};
298event ereport.io.pciex.pl.re@pciexrc/PCIEXFN{within(5s)};
299
300prop fault.io.pciex.device-noresp@pciexrc (1)->
301    error.io.pciex.nr-d@pciexrc/PCIEXFNHZ;
302
303prop fault.io.pciex.device-invreq@pciexrc (1)->
304    error.io.pciex.badreq-d@pciexrc/PCIEXFNHZ;
305
306prop fault.io.pciex.device-interr-corr@pciexrc {
307    payloadprop_defined("detector") && setserdsuffix("_btlp") &&
308    setserdn(BTLP_COUNT) && setserdt(BTLP_TIME) } (0)->
309    ereport.io.pciex.dl.btlp@pciexrc,
310    ereport.io.pciex.dl.btlp@pciexrc/PCIEXFNHZ;
311
312prop fault.io.pciex.device-interr-corr@pciexrc {
313    payloadprop_defined("detector") && setserdsuffix("_bdllp") &&
314    setserdn(BDLLP_COUNT) && setserdt(BDLLP_TIME) } (0)->
315    ereport.io.pciex.dl.bdllp@pciexrc,
316    ereport.io.pciex.dl.bdllp@pciexrc/PCIEXFNHZ;
317
318prop fault.io.pciex.device-interr-corr@pciexrc {
319    payloadprop_defined("detector") && setserdsuffix("_rto") &&
320    setserdn(RTO_COUNT) && setserdt(RTO_TIME) } (0)->
321    ereport.io.pciex.dl.rto@pciexrc,
322    ereport.io.pciex.dl.rto@pciexrc/PCIEXFNHZ;
323
324prop fault.io.pciex.device-interr-corr@pciexrc {
325    payloadprop_defined("detector") && setserdsuffix("_rnr") &&
326    setserdn(RNR_COUNT) && setserdt(RNR_TIME) } (0)->
327    ereport.io.pciex.dl.rnr@pciexrc,
328    ereport.io.pciex.dl.rnr@pciexrc/PCIEXFNHZ;
329
330prop fault.io.pciex.device-interr-corr@pciexrc {
331    payloadprop_defined("detector") && setserdsuffix("_re") &&
332    setserdn(RE_COUNT) && setserdt(RE_TIME) } (0)->
333    ereport.io.pciex.pl.re@pciexrc,
334    ereport.io.pciex.pl.re@pciexrc/PCIEXFNHZ;
335
336prop fault.io.pciex.device-interr-unaf@pciexrc (1)->
337    error.io.pciex.nf-poisecrc-d@pciexrc/PCIEXFNHZ;
338
339prop fault.io.pciex.device-interr-deg@pciexrc (1)->
340    error.io.pciex.deg-poisecrc-d@pciexrc/PCIEXFNHZ;
341
342prop fault.io.pciex.device-interr@pciexrc (1)->
343    error.io.pciex.f-poisecrc-d@pciexrc/PCIEXFNHZ,
344    error.io.pciex.ca-d@pciexrc/PCIEXFNHZ,
345    error.io.pciex.mtlp-d@pciexrc/PCIEXFNHZ,
346    error.io.pciex.fatlink@pciexrc/PCIEXFNHZ;
347
348/*
349 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
350 * A faulty PCI Express leaf device or upstream switch port may cause:
351 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
352 * - flt-nr-u:		the device not to respond to a valid downstream request
353 * - flt-ca-u:		the device to completer abort a valid downstream request
354 * - flt-badreq-u:	a bad upstream request - not CRC error (may cause
355 *			completer to respond with ur or ca) - leaf only
356 * - flt-mtlp-u:	a malformed tlp transmitted upstream - leaf only
357 * - flt-ecrcreq-u:	request with end-to-end CRC error transmitted upstream
358 * - flt-ecrccomp-u:	compl with end-to-end CRC error transmitted upstream
359 * - flt-poisreq-u:	poisoned request transmitted upstream
360 * - flt-poiscomp-u:	poisoned completion transmitted upstream
361 * - device:		internal error reported by leaf device
362 * - corrlink:		correctable link or physical level error
363 * - fatlink:		fatal link or physical level error
364 */
365
366event error.io.pciex.flt-nr-u@PCIEXFN;
367event error.io.pciex.flt-ca-u@PCIEXFN;
368event error.io.pciex.flt-mtlp-u@PCIEXFN;
369event error.io.pciex.fatlink@PCIEXFN;
370event error.io.pciex.flt-badreq-u@PCIEXFN;
371event error.io.pciex.flt-nf-poisecrc-u@PCIEXFN;
372event error.io.pciex.flt-f-poisecrc-u@PCIEXFN;
373event error.io.pciex.flt-deg-poisecrc-u@PCIEXFN;
374event ereport.io.pciex.dl.btlp@PCIEXFN{within(5s)};
375event ereport.io.pciex.dl.bdllp@PCIEXFN{within(5s)};
376event ereport.io.pciex.dl.rto@PCIEXFN{within(5s)};
377event ereport.io.pciex.dl.rnr@PCIEXFN{within(5s)};
378event ereport.io.pciex.pl.re@PCIEXFN{within(5s)};
379event ereport.io.pciex.dl.btlp@PCIEXFN/PCIEXFN{within(5s)};
380event ereport.io.pciex.dl.bdllp@PCIEXFN/PCIEXFN{within(5s)};
381event ereport.io.pciex.dl.rto@PCIEXFN/PCIEXFN{within(5s)};
382event ereport.io.pciex.dl.rnr@PCIEXFN/PCIEXFN{within(5s)};
383event ereport.io.pciex.pl.re@PCIEXFN/PCIEXFN{within(5s)};
384event ereport.io.device.fw_corrupt@PCIEXFN{within(5s)};
385event ereport.io.device.fw_mismatch@PCIEXFN{within(5s)};
386
387prop fault.io.pciex.device-noresp@PCIEXFN { IS_LF(PCIEXFN) } (1)->
388    error.io.pciex.flt-nr-u@PCIEXFN;
389
390prop fault.io.pciex.device-noresp@PCIEXFN { IS_SU(PCIEXFN) } (1)->
391    error.io.pciex.flt-nr-u@PCIEXFN;
392
393prop fault.io.pciex.device-invreq@PCIEXFN { IS_LF(PCIEXFN) } (1)->
394    error.io.pciex.flt-badreq-u@PCIEXFN;
395
396prop fault.io.pciex.device-interr-corr@pciexrc/PCIEXFN {
397    payloadprop_defined("detector") && setserdsuffix("_btlp") &&
398    setserdn(BTLP_COUNT) && setserdt(BTLP_TIME) } (0)->
399    ereport.io.pciex.dl.btlp@pciexrc,
400    ereport.io.pciex.dl.btlp@pciexrc/PCIEXFNHZ;
401
402prop fault.io.pciex.device-interr-corr@pciexrc/PCIEXFN {
403    payloadprop_defined("detector") && setserdsuffix("_bdllp") &&
404    setserdn(BDLLP_COUNT) && setserdt(BDLLP_TIME) } (0)->
405    ereport.io.pciex.dl.bdllp@pciexrc,
406    ereport.io.pciex.dl.bdllp@pciexrc/PCIEXFNHZ;
407
408prop fault.io.pciex.device-interr-corr@pciexrc/PCIEXFN {
409    payloadprop_defined("detector") && setserdsuffix("_rto") &&
410    setserdn(RTO_COUNT) && setserdt(RTO_TIME) } (0)->
411    ereport.io.pciex.dl.rto@pciexrc,
412    ereport.io.pciex.dl.rto@pciexrc/PCIEXFNHZ;
413
414prop fault.io.pciex.device-interr-corr@pciexrc/PCIEXFN {
415    payloadprop_defined("detector") && setserdsuffix("_rnr") &&
416    setserdn(RNR_COUNT) && setserdt(RNR_TIME) } (0)->
417    ereport.io.pciex.dl.rnr@pciexrc,
418    ereport.io.pciex.dl.rnr@pciexrc/PCIEXFNHZ;
419
420prop fault.io.pciex.device-interr-corr@pciexrc/PCIEXFN {
421    payloadprop_defined("detector") && setserdsuffix("_re") &&
422    setserdn(RE_COUNT) && setserdt(RE_TIME) } (0)->
423    ereport.io.pciex.pl.re@pciexrc,
424    ereport.io.pciex.pl.re@pciexrc/PCIEXFNHZ;
425
426prop fault.io.pciex.device-interr-corr@PCIEXFN/PCIEXFN {
427    !IS_SD(PCIEXFN/PCIEXFN) &&
428    payloadprop_defined("detector") && setserdsuffix("_btlp") &&
429    setserdn(BTLP_COUNT) && setserdt(BTLP_TIME) } (0)->
430    ereport.io.pciex.dl.btlp@PCIEXFN,
431    ereport.io.pciex.dl.btlp@PCIEXFN/PCIEXFNHZ;
432
433prop fault.io.pciex.device-interr-corr@PCIEXFN/PCIEXFN {
434    !IS_SD(PCIEXFN/PCIEXFN) &&
435    payloadprop_defined("detector") && setserdsuffix("_bdllp") &&
436    setserdn(BDLLP_COUNT) && setserdt(BDLLP_TIME) } (0)->
437    ereport.io.pciex.dl.bdllp@PCIEXFN,
438    ereport.io.pciex.dl.bdllp@PCIEXFN/PCIEXFNHZ;
439
440prop fault.io.pciex.device-interr-corr@PCIEXFN/PCIEXFN {
441    !IS_SD(PCIEXFN/PCIEXFN) &&
442    payloadprop_defined("detector") && setserdsuffix("_rto") &&
443    setserdn(RTO_COUNT) && setserdt(RTO_TIME) } (0)->
444    ereport.io.pciex.dl.rto@PCIEXFN,
445    ereport.io.pciex.dl.rto@PCIEXFN/PCIEXFNHZ;
446
447prop fault.io.pciex.device-interr-corr@PCIEXFN/PCIEXFN {
448    !IS_SD(PCIEXFN/PCIEXFN) &&
449    payloadprop_defined("detector") && setserdsuffix("_rnr") &&
450    setserdn(RNR_COUNT) && setserdt(RNR_TIME) } (0)->
451    ereport.io.pciex.dl.rnr@PCIEXFN,
452    ereport.io.pciex.dl.rnr@PCIEXFN/PCIEXFNHZ;
453
454prop fault.io.pciex.device-interr-corr@PCIEXFN/PCIEXFN {
455    !IS_SD(PCIEXFN/PCIEXFN) &&
456    payloadprop_defined("detector") && setserdsuffix("_re") &&
457    setserdn(RE_COUNT) && setserdt(RE_TIME) } (0)->
458    ereport.io.pciex.pl.re@PCIEXFN,
459    ereport.io.pciex.pl.re@PCIEXFN/PCIEXFNHZ;
460
461prop fault.io.pciex.device-interr-unaf@PCIEXFN { IS_SU(PCIEXFN) } (1)->
462    error.io.pciex.flt-nf-poisecrc-u@PCIEXFN;
463
464prop fault.io.pciex.device-interr-corr@PCIEXFN { IS_LF(PCIEXFN) } (0)->
465    error.io.device.nf-device@PCIEXFN;
466
467prop fault.io.pciex.device-interr-unaf@PCIEXFN { IS_LF(PCIEXFN) } (1)->
468    error.io.pciex.flt-nf-poisecrc-u@PCIEXFN;
469
470prop fault.io.pciex.device-interr-deg@PCIEXFN { IS_SU(PCIEXFN) } (1)->
471    error.io.pciex.flt-deg-poisecrc-u@PCIEXFN;
472
473prop fault.io.pciex.device-interr@PCIEXFN { IS_SU(PCIEXFN) } (1)->
474    error.io.pciex.flt-f-poisecrc-u@PCIEXFN,
475    error.io.pciex.flt-ca-u@PCIEXFN,
476    error.io.pciex.fatlink@PCIEXFN;
477
478prop fault.io.pciex.device-interr-deg@PCIEXFN { IS_LF(PCIEXFN) } (1)->
479    error.io.pciex.flt-deg-poisecrc-u@PCIEXFN,
480    error.io.device.deg-device@PCIEXFN;
481
482prop fault.io.pciex.device-interr@PCIEXFN { IS_LF(PCIEXFN) } (1)->
483    error.io.pciex.flt-f-poisecrc-u@PCIEXFN,
484    error.io.device.f-device@PCIEXFN,
485    error.io.pciex.flt-ca-u@PCIEXFN,
486    error.io.pciex.flt-mtlp-u@PCIEXFN,
487    error.io.pciex.fatlink@PCIEXFN;
488
489prop fault.io.pciex.fw_corrupt@PCIEXFN { IS_LF(PCIEXFN) } (1)->
490    ereport.io.device.fw_corrupt@PCIEXFN;
491
492prop fault.io.pciex.fw_corrupt@PCIEXFN { IS_LF(PCIEXFN) } (0)->
493    ereport.io.service.lost@PCIEXFN,
494    ereport.io.service.degraded@PCIEXFN;
495
496prop fault.io.pciex.fw_mismatch@PCIEXFN { IS_LF(PCIEXFN) } (1)->
497    ereport.io.device.fw_mismatch@PCIEXFN;
498
499prop fault.io.pciex.fw_mismatch@PCIEXFN { IS_LF(PCIEXFN) } (0)->
500    ereport.io.service.lost@PCIEXFN,
501    ereport.io.service.degraded@PCIEXFN;
502
503/*
504 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
505 * A faulty PCI Express downstream switch port may cause
506 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
507 * - nr-d:		the device not to respond to an upstream request
508 * - ca-d:		the device to completer abort an upstream request
509 * - ecrcreq-d:		TLP with end-to-end CRC error transmitted upstream
510 * - ecrccomp-d:	TLP with end-to-end CRC error transmitted upstream
511 * - poisreq-d:		poisoned request transmitted upstream
512 * - poiscomp-d:	poisoned completion transmitted upstream
513 * - corrlink:		correctable link or physical level error
514 * - fatlink:		fatal link or physical level error
515 */
516
517event error.io.pciex.nr-d@PCIEXFN/PCIEXFN;
518event error.io.pciex.ca-d@PCIEXFN/PCIEXFN;
519event error.io.pciex.fatlink@PCIEXFN/PCIEXFN;
520event error.io.pciex.nf-poisecrc-d@PCIEXFN/PCIEXFN;
521event error.io.pciex.f-poisecrc-d@PCIEXFN/PCIEXFN;
522event error.io.pciex.deg-poisecrc-d@PCIEXFN/PCIEXFN;
523
524prop fault.io.pciex.device-noresp@PCIEXFN { IS_SD(PCIEXFN) } (1)->
525    error.io.pciex.nr-d@PCIEXFN/PCIEXFNHZ;
526
527prop fault.io.pciex.device-interr-corr@PCIEXFN { IS_SD(PCIEXFN) &&
528    payloadprop_defined("detector") && setserdsuffix("_btlp") &&
529    setserdn(BTLP_COUNT) && setserdt(BTLP_TIME) } (0)->
530    ereport.io.pciex.dl.btlp@PCIEXFN,
531    ereport.io.pciex.dl.btlp@PCIEXFN/PCIEXFNHZ;
532
533prop fault.io.pciex.device-interr-corr@PCIEXFN { IS_SD(PCIEXFN) &&
534    payloadprop_defined("detector") && setserdsuffix("_bdllp") &&
535    setserdn(BDLLP_COUNT) && setserdt(BDLLP_TIME) } (0)->
536    ereport.io.pciex.dl.bdllp@PCIEXFN,
537    ereport.io.pciex.dl.bdllp@PCIEXFN/PCIEXFNHZ;
538
539prop fault.io.pciex.device-interr-corr@PCIEXFN { IS_SD(PCIEXFN) &&
540    payloadprop_defined("detector") && setserdsuffix("_rto") &&
541    setserdn(RTO_COUNT) && setserdt(RTO_TIME) } (0)->
542    ereport.io.pciex.dl.rto@PCIEXFN,
543    ereport.io.pciex.dl.rto@PCIEXFN/PCIEXFNHZ;
544
545prop fault.io.pciex.device-interr-corr@PCIEXFN { IS_SD(PCIEXFN) &&
546    payloadprop_defined("detector") && setserdsuffix("_rnr") &&
547    setserdn(RNR_COUNT) && setserdt(RNR_TIME) } (0)->
548    ereport.io.pciex.dl.rnr@PCIEXFN,
549    ereport.io.pciex.dl.rnr@PCIEXFN/PCIEXFNHZ;
550
551prop fault.io.pciex.device-interr-corr@PCIEXFN { IS_SD(PCIEXFN) &&
552    payloadprop_defined("detector") && setserdsuffix("_re") &&
553    setserdn(RE_COUNT) && setserdt(RE_TIME) } (0)->
554    ereport.io.pciex.pl.re@PCIEXFN,
555    ereport.io.pciex.pl.re@PCIEXFN/PCIEXFNHZ;
556
557prop fault.io.pciex.device-interr-unaf@PCIEXFN { IS_SD(PCIEXFN) } (1)->
558    error.io.pciex.nf-poisecrc-d@PCIEXFN/PCIEXFNHZ;
559
560prop fault.io.pciex.device-interr-deg@PCIEXFN { IS_SD(PCIEXFN) } (1)->
561    error.io.pciex.deg-poisecrc-d@PCIEXFN/PCIEXFNHZ;
562
563prop fault.io.pciex.device-interr@PCIEXFN { IS_SD(PCIEXFN) } (1)->
564    error.io.pciex.ca-d@PCIEXFN/PCIEXFNHZ,
565    error.io.pciex.f-poisecrc-d@PCIEXFN/PCIEXFNHZ,
566    error.io.pciex.fatlink@PCIEXFN/PCIEXFNHZ;
567
568/*
569 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
570 * A faulty PCIEX bus may cause:
571 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
572 * - flt-nr-u:		a device to not respond because the link is down
573 * - nr-d:		a device to not respond because the link is down
574 * - corrlink:		correctable link or physical level error
575 * - fatlink:		fatal link or physical level error
576 */
577
578event error.io.pciex.nr-d@PCIEXFN;
579
580prop fault.io.pciex.bus-noresp@PCIEXFN { !IS_SD(PCIEXFN) } (0)->
581    error.io.pciex.flt-nr-u@PCIEXFN,
582    error.io.pciex.nr-d@PCIEXFN;
583
584prop fault.io.pciex.bus-linkerr-corr@PCIEXFN/PCIEXFN {
585    !IS_SD(PCIEXFN/PCIEXFN) &&
586    payloadprop_defined("detector") && setserdsuffix("_btlp") &&
587    setserdn(BTLP_COUNT) && setserdt(BTLP_TIME) } (0)->
588    ereport.io.pciex.dl.btlp@PCIEXFN,
589    ereport.io.pciex.dl.btlp@PCIEXFN/PCIEXFNHZ;
590
591prop fault.io.pciex.bus-linkerr-corr@PCIEXFN/PCIEXFN {
592    !IS_SD(PCIEXFN/PCIEXFN) &&
593    payloadprop_defined("detector") && setserdsuffix("_bdllp") &&
594    setserdn(BDLLP_COUNT) && setserdt(BDLLP_TIME) } (0)->
595    ereport.io.pciex.dl.bdllp@PCIEXFN,
596    ereport.io.pciex.dl.bdllp@PCIEXFN/PCIEXFNHZ;
597
598prop fault.io.pciex.bus-linkerr-corr@PCIEXFN/PCIEXFN {
599    !IS_SD(PCIEXFN/PCIEXFN) &&
600    payloadprop_defined("detector") && setserdsuffix("_rto") &&
601    setserdn(RTO_COUNT) && setserdt(RTO_TIME) } (0)->
602    ereport.io.pciex.dl.rto@PCIEXFN,
603    ereport.io.pciex.dl.rto@PCIEXFN/PCIEXFNHZ;
604
605prop fault.io.pciex.bus-linkerr-corr@PCIEXFN/PCIEXFN {
606    !IS_SD(PCIEXFN/PCIEXFN) &&
607    payloadprop_defined("detector") && setserdsuffix("_rnr") &&
608    setserdn(RNR_COUNT) && setserdt(RNR_TIME) } (0)->
609    ereport.io.pciex.dl.rnr@PCIEXFN,
610    ereport.io.pciex.dl.rnr@PCIEXFN/PCIEXFNHZ;
611
612prop fault.io.pciex.bus-linkerr-corr@PCIEXFN/PCIEXFN {
613    !IS_SD(PCIEXFN/PCIEXFN) &&
614    payloadprop_defined("detector") && setserdsuffix("_re") &&
615    setserdn(RE_COUNT) && setserdt(RE_TIME) } (0)->
616    ereport.io.pciex.pl.re@PCIEXFN,
617    ereport.io.pciex.pl.re@PCIEXFN/PCIEXFNHZ;
618
619prop fault.io.pciex.bus-linkerr-corr@pciexrc/PCIEXFN {
620    payloadprop_defined("detector") && setserdsuffix("_btlp") &&
621    setserdn(BTLP_COUNT) && setserdt(BTLP_TIME) } (0)->
622    ereport.io.pciex.dl.btlp@pciexrc,
623    ereport.io.pciex.dl.btlp@pciexrc/PCIEXFNHZ;
624
625prop fault.io.pciex.bus-linkerr-corr@pciexrc/PCIEXFN {
626    payloadprop_defined("detector") && setserdsuffix("_bdllp") &&
627    setserdn(BDLLP_COUNT) && setserdt(BDLLP_TIME) } (0)->
628    ereport.io.pciex.dl.bdllp@pciexrc,
629    ereport.io.pciex.dl.bdllp@pciexrc/PCIEXFNHZ;
630
631prop fault.io.pciex.bus-linkerr-corr@pciexrc/PCIEXFN {
632    payloadprop_defined("detector") && setserdsuffix("_rto") &&
633    setserdn(RTO_COUNT) && setserdt(RTO_TIME) } (0)->
634    ereport.io.pciex.dl.rto@pciexrc,
635    ereport.io.pciex.dl.rto@pciexrc/PCIEXFNHZ;
636
637prop fault.io.pciex.bus-linkerr-corr@pciexrc/PCIEXFN {
638    payloadprop_defined("detector") && setserdsuffix("_rnr") &&
639    setserdn(RNR_COUNT) && setserdt(RNR_TIME) } (0)->
640    ereport.io.pciex.dl.rnr@pciexrc,
641    ereport.io.pciex.dl.rnr@pciexrc/PCIEXFNHZ;
642
643prop fault.io.pciex.bus-linkerr-corr@pciexrc/PCIEXFN {
644    payloadprop_defined("detector") && setserdsuffix("_re") &&
645    setserdn(RE_COUNT) && setserdt(RE_TIME) } (0)->
646    ereport.io.pciex.pl.re@pciexrc,
647    ereport.io.pciex.pl.re@pciexrc/PCIEXFNHZ;
648
649prop fault.io.pciex.bus-linkerr@PCIEXFN { !IS_SD(PCIEXFN) } (0)->
650    error.io.pciex.fatlink@PCIEXFN;
651
652/*
653 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
654 * A faulty pciex-pci bridge may cause
655 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
656 * The following errors to propagate onto the PCI Express fabric
657 * - flt-nr-u:		the device not to respond to a valid downstream request
658 * - flt-ca-u:		the device to completer abort a valid downstream request
659 * - flt-ecrcreq-u:	request with end-to-end CRC error transmitted upstream
660 * - flt-ecrccomp-u:	compl with end-to-end CRC error transmitted upstream
661 * - flt-poisreq-u:	poisoned request transmitted upstream
662 * - flt-poiscomp-u:	poisoned completion transmitted upstream
663 * - corrlink:		correctable link or physical level error upstream
664 * - fatlink:		fatal link or physical level error upstream
665 * - sec-interr:	internal error on pci express to pci bridge
666 *
667 * And the following errors to propagate onto the secondary pci or pci/x bus
668 * (these will be handled by code in the pci.esc file).
669 * - nr-pw-d:		the device not to respond to a valid upstream request
670 * - nr-drw-d:		the device not to respond to a valid upstream request
671 * - retry-to-d:	failure to retry an downstream delayed request
672 * - ta-pw-d:		the device responds with a ta to a valid upstream
673 *			request
674 * - ta-drw-d:		the device responds with a ta to a valid upstream
675 *			request
676 * - ape-d:	address/parity to get corrupted during downstream transmission.
677 * - dpe-d:	data/parity to get corrupted during downstream transmission.
678 * - scpe-d:	split completion to get corrupted during downstream transmission
679 */
680
681event error.io.pci.ape-d@PCIEXFN/PCIFN;
682event error.io.pci.f-dpe-d@PCIEXFN/PCIFN;
683event error.io.pci.deg-dpe-d@PCIEXFN/PCIFN;
684event error.io.pci.nf-dpe-d@PCIEXFN/PCIFN;
685event error.io.pci.retry-to-d@PCIEXFN/PCIFN;
686event error.io.pci.nr-pw-d@PCIEXFN/PCIFN;
687event error.io.pci.nr-drw-d@PCIEXFN/PCIFN;
688event error.io.pci.ta-pw-d@PCIEXFN/PCIFN;
689event error.io.pci.ta-drw-d@PCIEXFN/PCIFN;
690event error.io.pcix.scpe-d@PCIEXFN/PCIFN;
691event error.io.pciex.sec-interr@PCIEXFN;
692event ereport.io.pci.sec-sta@PCIEXFN{within(5s)};
693
694prop fault.io.pciex.device-noresp@PCIEXFN { IS_BG(PCIEXFN) } (1)->
695    error.io.pciex.flt-nr-u@PCIEXFN,
696    error.io.pci.retry-to-d@PCIEXFN/PCIFNHZ,
697    error.io.pci.nr-pw-d@PCIEXFN/PCIFNHZ,
698    error.io.pci.nr-drw-d@PCIEXFN/PCIFNHZ;
699
700prop fault.io.pciex.device-interr-unaf@PCIEXFN { IS_BG(PCIEXFN) } (1)->
701    error.io.pciex.flt-nf-poisecrc-u@PCIEXFN,
702    error.io.pci.nf-dpe-d@PCIEXFN/PCIFNHZ;
703
704prop fault.io.pciex.device-interr-deg@PCIEXFN { IS_BG(PCIEXFN) } (1)->
705    error.io.pciex.flt-deg-poisecrc-u@PCIEXFN,
706    error.io.pci.deg-dpe-d@PCIEXFN/PCIFNHZ;
707
708prop fault.io.pciex.device-interr@PCIEXFN { IS_BG(PCIEXFN) } (1)->
709    error.io.pciex.flt-f-poisecrc-u@PCIEXFN,
710    error.io.pciex.flt-ca-u@PCIEXFN,
711    error.io.pciex.flt-mtlp-u@PCIEXFN,
712    error.io.pciex.sec-interr@PCIEXFN,
713    error.io.pciex.fatlink@PCIEXFN,
714    error.io.pci.ta-pw-d@PCIEXFN/PCIFNHZ,
715    error.io.pci.ta-drw-d@PCIEXFN/PCIFNHZ,
716    error.io.pci.ape-d@PCIEXFN/PCIFNHZ,
717    error.io.pcix.scpe-d@PCIEXFN/PCIFNHZ,
718    error.io.pci.f-dpe-d@PCIEXFN/PCIFNHZ;
719
720prop fault.io.pciex.device-interr-unaf@PCIEXFN { IS_BG(PCIEXFN) } (0)->
721    ereport.io.pci.sec-sta@PCIEXFN;
722
723prop fault.io.pciex.device-interr@PCIEXFN { IS_BG(PCIEXFN) } (0)->
724    ereport.io.pci.sec-sta@PCIEXFN;
725
726/*
727 * the following rules for ptlp and ecrc faults are split into fatal and
728 * nonfatal, depending on the service impact reported by the leaf driver
729 */
730event error.io.pciex.nf-poisecrc-d@PCIEXFN;
731event error.io.pciex.deg-poisecrc-d@PCIEXFN;
732event error.io.pciex.f-poisecrc-d@PCIEXFN;
733event error.io.pciex.ecrcreq-d@PCIEXFN;
734event error.io.pciex.ecrccomp-d@PCIEXFN;
735event error.io.pciex.poisreq-d@PCIEXFN;
736event error.io.pciex.poiscomp-d@PCIEXFN;
737event error.io.pciex.flt-poisreq-u@PCIEXFN;
738event error.io.pciex.flt-poiscomp-u@PCIEXFN;
739event error.io.pciex.flt-ecrcreq-u@PCIEXFN;
740event error.io.pciex.flt-ecrccomp-u@PCIEXFN;
741
742prop error.io.pciex.nf-poisecrc-d@PCIEXFN (1)->
743    error.io.pciex.ecrcreq-d@PCIEXFN,
744    error.io.pciex.ecrccomp-d@PCIEXFN,
745    error.io.pciex.poisreq-d@PCIEXFN,
746    error.io.pciex.poiscomp-d@PCIEXFN;
747
748prop error.io.pciex.nf-poisecrc-d@PCIEXFN (1)->
749    error.io.pciex.noimpact-d@PCIEXFN;
750
751prop error.io.pciex.f-poisecrc-d@PCIEXFN (1)->
752    error.io.pciex.ecrcreq-d@PCIEXFN,
753    error.io.pciex.ecrccomp-d@PCIEXFN,
754    error.io.pciex.poisreq-d@PCIEXFN,
755    error.io.pciex.poiscomp-d@PCIEXFN;
756
757prop error.io.pciex.f-poisecrc-d@PCIEXFN (0)->
758    error.io.pciex.lost-d@PCIEXFN;
759
760prop error.io.pciex.deg-poisecrc-d@PCIEXFN (1)->
761    error.io.pciex.ecrcreq-d@PCIEXFN,
762    error.io.pciex.ecrccomp-d@PCIEXFN,
763    error.io.pciex.poisreq-d@PCIEXFN,
764    error.io.pciex.poiscomp-d@PCIEXFN;
765
766prop error.io.pciex.deg-poisecrc-d@PCIEXFN (1)->
767    error.io.pciex.degraded-d@PCIEXFN;
768
769prop error.io.pciex.flt-nf-poisecrc-u@PCIEXFN (1)->
770    error.io.pciex.flt-ecrcreq-u@PCIEXFN,
771    error.io.pciex.flt-ecrccomp-u@PCIEXFN,
772    error.io.pciex.flt-poisreq-u@PCIEXFN,
773    error.io.pciex.flt-poiscomp-u@PCIEXFN;
774
775prop error.io.pciex.flt-nf-poisecrc-u@PCIEXFN (1)->
776    error.io.pciex.noimpact-d@PCIEXFN;
777
778prop error.io.pciex.flt-deg-poisecrc-u@PCIEXFN (1)->
779    error.io.pciex.flt-ecrcreq-u@PCIEXFN,
780    error.io.pciex.flt-ecrccomp-u@PCIEXFN,
781    error.io.pciex.flt-poisreq-u@PCIEXFN,
782    error.io.pciex.flt-poiscomp-u@PCIEXFN;
783
784prop error.io.pciex.flt-deg-poisecrc-u@PCIEXFN (1)->
785    error.io.pciex.degraded-d@PCIEXFN;
786
787prop error.io.pciex.flt-f-poisecrc-u@PCIEXFN (1)->
788    error.io.pciex.flt-ecrcreq-u@PCIEXFN,
789    error.io.pciex.flt-ecrccomp-u@PCIEXFN,
790    error.io.pciex.flt-poisreq-u@PCIEXFN,
791    error.io.pciex.flt-poiscomp-u@PCIEXFN;
792
793prop error.io.pciex.flt-f-poisecrc-u@PCIEXFN (0)->
794    error.io.pciex.lost-d@PCIEXFN;
795
796/*
797 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
798 * declarations
799 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
800 */
801event error.io.pciex.fatal@PCIEXFN;
802event error.io.pciex.nonfatal@PCIEXFN;
803event error.io.pciex.nr-fwd-d@PCIEXFN;
804event error.io.pciex.mtlp-fwd-d@PCIEXFN;
805event error.io.pciex.flt-ur-u@PCIEXFN;
806event error.io.pciex.mtlp-d@PCIEXFN;
807event error.io.pciex.ca-d@PCIEXFN;
808event error.io.pciex.ca-fwd-d@PCIEXFN;
809event error.io.pciex.poisreq-fwd-d@PCIEXFN;
810event error.io.pciex.poisreq-fwd-d@pciexrc/PCIEXFN;
811event error.io.pciex.poisreq-fwd-d@PCIEXFN/PCIEXFN;
812event error.io.pciex.poiscomp-fwd-d@PCIEXFN;
813event error.io.pciex.poiscomp-fwd-d@PCIEXFN/PCIEXFN;
814event error.io.pciex.ecrcreq-fwd-d@PCIEXFN;
815event error.io.pciex.ecrccomp-fwd-d@PCIEXFN;
816event error.io.pciex.source-ecrcreq-u@PCIEXFN;
817event error.io.pciex.source-ecrccomp-u@PCIEXFN;
818event error.io.pciex.source-poiscomp-u@PCIEXFN;
819event error.io.pciex.source-poisreq-u@PCIEXFN;
820event error.io.pciex.badreq-d@PCIEXFN;
821event error.io.pci.badreq-pw-d@PCIEXFN/PCIFN;
822event error.io.pci.badreq-drw-d@PCIEXFN/PCIFN;
823event error.io.pci.target-ma-d@PCIEXFN;
824event error.io.pci.target-rta-d@PCIEXFN;
825event error.io.pci.dpdata-pw-d@PCIEXFN/PCIFN;
826event error.io.pci.dpdata-dw-d@PCIEXFN/PCIFN;
827event error.io.pci.dpdata-dr-d@PCIEXFN/PCIFN;
828event error.io.pciex.ca-u@PCIEXFN;
829event error.io.pciex.ca-u@PCIEXFN/PCIEXFN;
830event error.io.pciex.ca-u@pciexrc/PCIEXFN;
831event error.io.pciex.ur-u@PCIEXFN;
832event error.io.pciex.ur-u@PCIEXFN/PCIEXFN;
833event error.io.pciex.ur-u@pciexrc/PCIEXFN;
834event error.io.pciex.nr-u@PCIEXFN;
835event error.io.pciex.nr-u@PCIEXFN/PCIEXFN;
836event error.io.pciex.nr-u@pciexrc/PCIEXFN;
837event error.io.pciex.mtlp-u@PCIEXFN;
838event error.io.pciex.mtlp-u@PCIEXFN/PCIEXFN;
839event error.io.pciex.mtlp-u@pciexrc/PCIEXFN;
840event error.io.pciex.badreq-u@PCIEXFN;
841event error.io.pciex.badreq-u@PCIEXFN/PCIEXFN;
842event error.io.pciex.badreq-u@pciexrc/PCIEXFN;
843event error.io.pciex.poisreq-u@PCIEXFN;
844event error.io.pciex.poisreq-u@PCIEXFN/PCIEXFN;
845event error.io.pciex.poisreq-u@pciexrc/PCIEXFN;
846event error.io.pciex.poiscomp-u@PCIEXFN;
847event error.io.pciex.poiscomp-u@PCIEXFN/PCIEXFN;
848event error.io.pciex.poiscomp-u@pciexrc/PCIEXFN;
849event error.io.pciex.ecrcreq-u@PCIEXFN;
850event error.io.pciex.ecrcreq-u@PCIEXFN/PCIEXFN;
851event error.io.pciex.ecrccomp-u@PCIEXFN;
852event error.io.pciex.ecrccomp-u@PCIEXFN/PCIEXFN;
853
854event ereport.io.pci.ma@PCIEXFN{within(5s)};
855event ereport.io.pci.mdpe@PCIEXFN{within(5s)};
856event ereport.io.pci.dpe@PCIEXFN{within(5s)};
857event ereport.io.pci.rta@PCIEXFN{within(5s)};
858event ereport.io.pci.sta@PCIEXFN{within(5s)};
859event ereport.io.pciex.dl.dllp@PCIEXFN{within(5s)};
860event ereport.io.pciex.pl.te@PCIEXFN{within(5s)};
861event ereport.io.pciex.tl.fcp@PCIEXFN{within(5s)};
862event ereport.io.pciex.tl.rof@PCIEXFN{within(5s)};
863event ereport.io.pciex.tl.mtlp@PCIEXFN{within(5s)};
864event ereport.io.pciex.tl.ur@PCIEXFN{within(5s)};
865event ereport.io.pciex.tl.ca@PCIEXFN{within(5s)};
866event ereport.io.pciex.tl.ptlp@PCIEXFN{within(5s)};
867event ereport.io.pciex.tl.ecrc@PCIEXFN{within(5s)};
868event ereport.io.pciex.tl.uc@PCIEXFN{within(5s)};
869event ereport.io.pciex.tl.cto@PCIEXFN{within(5s)};
870event ereport.io.pciex.dl.dllp@pciexrc{within(5s)};
871event ereport.io.pciex.pl.te@pciexrc{within(5s)};
872event ereport.io.pciex.tl.fcp@pciexrc{within(5s)};
873event ereport.io.pciex.tl.rof@pciexrc{within(5s)};
874event ereport.io.pciex.tl.mtlp@pciexrc{within(5s)};
875event ereport.io.pciex.tl.ur@pciexrc{within(5s)};
876event ereport.io.pciex.tl.ca@pciexrc{within(5s)};
877event ereport.io.pciex.tl.ptlp@pciexrc{within(5s)};
878event ereport.io.pciex.tl.ecrc@pciexrc{within(5s)};
879event ereport.io.pciex.tl.cto@pciexrc{within(5s)};
880event ereport.io.pci.sec-ma@pciexrc{within(5s)};
881event ereport.io.pci.sec-mdpe@pciexrc{within(5s)};
882event ereport.io.pci.sec-dpe@pciexrc{within(5s)};
883event ereport.io.pci.sec-rta@pciexrc{within(5s)};
884event ereport.io.pci.sec-sta@pciexrc{within(5s)};
885event ereport.io.pci.sec-mdpe@PCIEXFN{within(5s)};
886event ereport.io.pci.sec-dpe@PCIEXFN{within(5s)};
887event ereport.io.pci.sec-rserr@PCIEXFN{within(5s)};
888event ereport.io.pci.sserr@PCIEXFN{within(5s)};
889event ereport.io.pci.sec-rserr@pciexrc{within(5s)};
890event ereport.io.pciex.rc.fe-msg@pciexrc{within(5s)};
891event ereport.io.pciex.rc.nfe-msg@pciexrc{within(5s)};
892event ereport.io.pciex.rc.mue-msg@pciexrc{within(5s)};
893event ereport.io.pciex.bdg.sec-interr@PCIEXFN{within(5s)};
894event ereport.io.pciex.bdg.sec-ude@PCIEXFN{within(5s)};
895event ereport.io.pci.target-mdpe@PCIEXFN{within(5s)};
896event ereport.io.pci.target-mdpe@PCIFN{within(5s)};
897
898/*
899 * handling of fatal and nonfatal error messages propagated up to root complex
900 *
901 * Use these for errors reported by root-complex on behalf of another device.
902 * Can use source-id payload to identify where the message came from.
903 */
904prop error.io.pciex.fatal@PCIEXFN1 (1)->
905    ereport.io.pciex.rc.mue-msg@pciexrc { is_under(pciexrc, PCIEXFN1) },
906    ereport.io.pciex.rc.fe-msg@pciexrc { is_under(pciexrc, PCIEXFN1) &&
907	SOURCE_ID_MATCHES_BDF };
908
909prop error.io.pciex.fatal@PCIEXFN (0)->
910    ereport.io.pci.sserr@PCIEXFN;
911
912prop error.io.pciex.fatal@PCIEXFN { is_under(PCIEXFN1, PCIEXFN) } (0)->
913    ereport.io.pci.sserr@PCIEXFN1,
914    ereport.io.pci.sec-rserr@PCIEXFN1;
915
916prop error.io.pciex.fatal@PCIEXFN { is_under(pciexrc, PCIEXFN) } (0)->
917    ereport.io.pci.sec-rserr@pciexrc;
918
919prop error.io.pciex.nonfatal@PCIEXFN1 (1)->
920    ereport.io.pciex.rc.mue-msg@pciexrc { is_under(pciexrc, PCIEXFN1) },
921    ereport.io.pciex.rc.nfe-msg@pciexrc { is_under(pciexrc, PCIEXFN1) &&
922	SOURCE_ID_MATCHES_BDF };
923
924prop error.io.pciex.nonfatal@PCIEXFN (0)->
925    ereport.io.pci.sserr@PCIEXFN;
926
927prop error.io.pciex.nonfatal@PCIEXFN { is_under(PCIEXFN1, PCIEXFN) } (0)->
928    ereport.io.pci.sserr@PCIEXFN1,
929    ereport.io.pci.sec-rserr@PCIEXFN1;
930
931prop error.io.pciex.nonfatal@PCIEXFN { is_under(pciexrc, PCIEXFN) } (0)->
932    ereport.io.pci.sec-rserr@pciexrc;
933
934/*
935 * link-level errors - could generate ereports at either end of link
936 *
937 * can use may propagations here as these ereports are only seen for these
938 * faults.
939 */
940prop error.io.pciex.fatlink@PCIEXFN { !IS_SD(PCIEXFN) } (0)->
941    error.io.pciex.fatal@PCIEXFN;
942
943prop error.io.pciex.fatlink@PCIEXFN { !IS_SD(PCIEXFN) } (0)->
944    ereport.io.pciex.dl.dllp@PCIEXFN,
945    ereport.io.pciex.tl.fcp@PCIEXFN,
946    ereport.io.pciex.tl.rof@PCIEXFN;
947
948prop error.io.pciex.fatlink@PCIEXFN/PCIEXFN { IS_SD(PCIEXFN) } (0)->
949    error.io.pciex.fatal@PCIEXFN;
950
951prop error.io.pciex.fatlink@PCIEXFN/PCIEXFN { IS_SD(PCIEXFN) } (0)->
952    ereport.io.pciex.dl.dllp@PCIEXFN,
953    ereport.io.pciex.pl.te@PCIEXFN,
954    ereport.io.pciex.tl.fcp@PCIEXFN,
955    ereport.io.pciex.tl.rof@PCIEXFN;
956
957prop error.io.pciex.fatlink@pciexrc/PCIEXFN (0)->
958    ereport.io.pciex.dl.dllp@pciexrc,
959    ereport.io.pciex.pl.te@pciexrc,
960    ereport.io.pciex.tl.fcp@pciexrc,
961    ereport.io.pciex.tl.rof@pciexrc;
962
963/*
964 * bridge internal error
965 */
966prop error.io.pciex.sec-interr@PCIEXFN { IS_BG(PCIEXFN) } (2) ->
967    error.io.pciex.nonfatal@PCIEXFN,
968    ereport.io.pciex.bdg.sec-interr@PCIEXFN;
969
970/*
971 * downstream poisoned request
972 *
973 * - poisreq-d cascades down to the leaf device/bridge and any switch ports
974 *   on route must raise a ptlp ereport while any switch ports forwarding
975 *   the poisoned request must raise sec-mdpe ereports. The originator of the
976 *   poisoning (be it root complex or downstream port of a switch) also raises
977 *   sec-mdpe. A hardened leaf driver will also raise ptlp. A target-mdpe may
978 *   be seen at the leaf (which may be a pci device beyond the bridge).
979 *
980 * Additionally, the leaf/bridge may treat the request as a ur, which the
981 * root complex will see and report an ma. Use flt-ur-u to represent this.
982 *
983 * The fault can always be recognized and the source identified using the ptlp
984 * and sec-mdpe ereports.
985 */
986prop error.io.pciex.poisreq-d@PCIEXFN (1)->
987    error.io.pciex.poisreq-fwd-d@PCIEXFN;
988
989prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_SD(PCIEXFN) ||
990    IS_SU(PCIEXFN) } (1)->
991    error.io.pciex.flt-ur-u@PCIEXFN,
992    error.io.pciex.poisreq-fwd-d@PCIEXFN/PCIEXFNHZ;
993
994prop error.io.pciex.poisreq-fwd-d@pciexrc/PCIEXFN (1)->
995    ereport.io.pci.sec-mdpe@pciexrc;
996
997prop error.io.pciex.poisreq-fwd-d@PCIEXFN/PCIEXFN { IS_SU(PCIEXFN) } (0)->
998    ereport.io.pci.sec-mdpe@PCIEXFN;
999
1000prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_SU(PCIEXFN) } (2)->
1001    ereport.io.pci.dpe@PCIEXFN,
1002    ereport.io.pciex.tl.ptlp@PCIEXFN;
1003
1004prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_SU(PCIEXFN) } (0)->
1005    error.io.pciex.nonfatal@PCIEXFN;
1006
1007prop error.io.pciex.poisreq-fwd-d@PCIEXFN/PCIEXFN { IS_SD(PCIEXFN) } (1)->
1008    ereport.io.pci.sec-mdpe@PCIEXFN;
1009
1010prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_SD(PCIEXFN) } (0)->
1011    ereport.io.pci.dpe@PCIEXFN,
1012    ereport.io.pciex.tl.ptlp@PCIEXFN,
1013    error.io.pciex.nonfatal@PCIEXFN;
1014
1015prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (3)->
1016    ereport.io.pci.dpe@PCIEXFN,
1017    ereport.io.pciex.tl.ptlp@PCIEXFN,
1018    error.io.pciex.nonfatal@PCIEXFN;
1019
1020prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (1)->
1021    error.io.pci.dpdata-pw-d@PCIEXFN/PCIFNHZ,
1022    error.io.pci.dpdata-dw-d@PCIEXFN/PCIFNHZ;
1023
1024prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (1)->
1025    error.io.pciex.nonfatal@PCIEXFN;
1026
1027prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (0)->
1028    ereport.io.pci.dpe@PCIEXFN,
1029    ereport.io.pciex.tl.ptlp@PCIEXFN,
1030    error.io.pciex.flt-ur-u@PCIEXFN;
1031
1032prop error.io.pciex.poisreq-fwd-d@PCIEXFN (0)->
1033    ereport.io.pci.target-mdpe@PCIEXFN;
1034
1035/*
1036 * downstream poisoned completion
1037 *
1038 * - poiscomp-d cascades down to the leaf device/bridge and any switch ports on
1039 *   route must raise ptlp and mdpe ereports.  A hardened leaf driver will also
1040 *   raise pltp and mdpe. For non-hardened leaf devices, no ptlp/mdpe may be
1041 *   reported, and though we should still see a nonfatal error reported from
1042 *   the root complex identifying the leaf device, we won't actually be informed
1043 *   that the error was an ptlp.
1044 */
1045prop error.io.pciex.poiscomp-d@PCIEXFN (1)->
1046    error.io.pciex.poiscomp-fwd-d@PCIEXFN;
1047
1048prop error.io.pciex.poiscomp-fwd-d@PCIEXFN (1)->
1049    error.io.pciex.poiscomp-fwd-d@PCIEXFN/PCIEXFNHZ;
1050
1051prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_SU(PCIEXFN) } (2)->
1052    ereport.io.pci.dpe@PCIEXFN,
1053    ereport.io.pciex.tl.ptlp@PCIEXFN;
1054
1055prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_SU(PCIEXFN) } (1)->
1056    ereport.io.pci.mdpe@PCIEXFN,
1057    ereport.io.pci.sec-mdpe@PCIEXFN;
1058
1059prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_SU(PCIEXFN) } (0)->
1060    error.io.pciex.nonfatal@PCIEXFN;
1061
1062prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_SD(PCIEXFN) } (0)->
1063    ereport.io.pci.mdpe@PCIEXFN,
1064    ereport.io.pci.sec-mdpe@PCIEXFN,
1065    ereport.io.pci.dpe@PCIEXFN,
1066    ereport.io.pciex.tl.ptlp@PCIEXFN,
1067    error.io.pciex.nonfatal@PCIEXFN;
1068
1069prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (4)->
1070    ereport.io.pci.mdpe@PCIEXFN,
1071    ereport.io.pci.dpe@PCIEXFN,
1072    ereport.io.pciex.tl.ptlp@PCIEXFN,
1073    error.io.pciex.nonfatal@PCIEXFN;
1074
1075prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (1)->
1076    error.io.pci.dpdata-dr-d@PCIEXFN/PCIFNHZ;
1077
1078prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (1)->
1079    error.io.pciex.nonfatal@PCIEXFN;
1080
1081prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (0)->
1082    ereport.io.pci.mdpe@PCIEXFN,
1083    ereport.io.pci.dpe@PCIEXFN,
1084    ereport.io.pciex.tl.ptlp@PCIEXFN;
1085
1086/*
1087 * downstream request with ecrc error.
1088 *
1089 * - ecrcreq-d cascades down to the leaf device/bridge and any switches on
1090 *   route can optionally raise an ecrc ereport. A hardened leaf driver may also
1091 *   raise ecrc. For non-hardened leaf devices, no ecrc may be reported, and
1092 *   though we should still see a nonfatal error reported from the root complex
1093 *   identifying the leaf device, we won't actually be informed that the error
1094 *   was an ecrc.
1095 *
1096 * Additionally, as the leaf/bridge will just throw away the packet, we should
1097 * eventually get a cto at the root complex - so use an nr-u at the pciex
1098 * leaf or bridge to get the appropriate behaviour. For the case where the leaf
1099 * driver wasn't hardened we may be able to identify the leaf device (and
1100 * therefore any intermediate switches which might have caused the problem)
1101 * either via a target-ma ereport if available or via the nonfatal error
1102 * reported from the root complex identifying the leaf device. The combination
1103 * of a nonfatal error reported from the root complex and a cto from the root
1104 * complex is sufficient to positively identify this case.
1105 */
1106prop error.io.pciex.ecrcreq-d@PCIEXFN (1)->
1107    error.io.pciex.ecrcreq-fwd-d@PCIEXFN,
1108    error.io.pciex.ecrcreq-fwd-d@PCIEXFNHZ { is_under(PCIEXFN, PCIEXFNHZ) };
1109
1110prop error.io.pciex.ecrcreq-fwd-d@PCIEXFN { IS_SU(PCIEXFN) ||
1111    IS_SD(PCIEXFN) } (1)->
1112    error.io.pciex.flt-nr-u@PCIEXFN;
1113
1114prop error.io.pciex.ecrcreq-fwd-d@PCIEXFN { IS_SU(PCIEXFN) ||
1115    IS_SD(PCIEXFN) } (0)->
1116    ereport.io.pciex.tl.ecrc@PCIEXFN,
1117    error.io.pciex.nonfatal@PCIEXFN;
1118
1119prop error.io.pciex.ecrcreq-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (3)->
1120    error.io.pciex.nonfatal@PCIEXFN,
1121    ereport.io.pciex.tl.ecrc@PCIEXFN,
1122    error.io.pciex.flt-nr-u@PCIEXFN;
1123
1124prop error.io.pciex.ecrcreq-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (2)->
1125    error.io.pciex.nonfatal@PCIEXFN,
1126    error.io.pciex.flt-nr-u@PCIEXFN;
1127
1128prop error.io.pciex.ecrcreq-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (0)->
1129    ereport.io.pciex.tl.ecrc@PCIEXFN;
1130
1131/*
1132 * downstream completion with ecrc error.
1133 *
1134 * - ecrccomp-d cascades down to the leaf device/bridge and any switches on
1135 *   route can optionally raise an ecrc ereport. A hardened leaf driver may
1136 *   also raise ecrc. For non-hardened leaf devices, no ecrc may be reported,
1137 *   and though we should still see a nonfatal error reported from the root
1138 *   complex identifying the leaf device, we won't actually be informed that
1139 *   the error was an ecrc.
1140 *
1141 * Additionally, as the leaf/bridge will just throw away the packet, we should
1142 * eventually get a cto. Note the leaf ereports are optional (ie in case driver
1143 * not hardened) but if we get both ecrc and cto we need to distinguish from
1144 * cto only which would be an nr-d.
1145 */
1146prop error.io.pciex.ecrccomp-d@PCIEXFN (1)->
1147    error.io.pciex.ecrccomp-fwd-d@PCIEXFN,
1148    error.io.pciex.ecrccomp-fwd-d@PCIEXFNHZ { is_under(PCIEXFN, PCIEXFNHZ) };
1149
1150prop error.io.pciex.ecrccomp-fwd-d@PCIEXFN { IS_SU(PCIEXFN) ||
1151    IS_SD(PCIEXFN) } (0)->
1152    error.io.pciex.nonfatal@PCIEXFN,
1153    ereport.io.pciex.tl.ecrc@PCIEXFN;
1154
1155prop error.io.pciex.ecrccomp-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (3)->
1156    error.io.pciex.nonfatal@PCIEXFN,
1157    ereport.io.pciex.tl.ecrc@PCIEXFN,
1158    error.io.pciex.nr-d@PCIEXFN;
1159
1160prop error.io.pciex.ecrccomp-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (1)->
1161    error.io.pciex.nonfatal@PCIEXFN;
1162
1163prop error.io.pciex.ecrccomp-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (0)->
1164    ereport.io.pciex.tl.ecrc@PCIEXFN,
1165    error.io.pciex.nr-d@PCIEXFN;
1166
1167/*
1168 * upstream poisoned request
1169 *
1170 * - flt-poisreq-u is on the pciex node which generated the fault
1171 * - source-poisreq-u refers to at least one leaf or bridge device
1172 *   whose bdf (if leaf) must match the source-id in the payload of the
1173 *   ereport generated from the root complex.
1174 * - poisreq-u propagates up to the root complex and any switch ports on
1175 *   route will raise a ptlp ereport, while any upstream devices generating
1176 *   or forwarding the poisoned packed will raise an mdpe ereport. The root
1177 *   complex should also report a ptlp.
1178 *
1179 * Additionally, as the root complex may treat the request as a ur, which the
1180 * leaf/bridge will see (and if hardened report) as an ma (including sending a
1181 * ta onto the child pci bus if this was a delayed write).
1182 *
1183 * We can always recognize what sort of fault this is from the ptlp (with no
1184 * sec-mdpe) at the root complex. Recognizing which originating devices may be
1185 * implicated can be done using the mdpe ereport (for a hardened leaf driver),
1186 * or for a non-hardened leaf driver by using the source-id payload in the ptlp
1187 * ereport to identify the originator of the request.  The ptlp/mdpe ereports
1188 * at the intervening switches will narrow the fault down to a single suspect.
1189 */
1190
1191prop error.io.pciex.flt-poisreq-u@PCIEXFN1 { (IS_LF(PCIEXFN) ||
1192    IS_BG(PCIEXFN)) && is_under(PCIEXFN1, PCIEXFN) } (0)->
1193    error.io.pciex.source-poisreq-u@PCIEXFN;
1194
1195prop error.io.pciex.source-poisreq-u@PCIEXFN1 { IS_LF(PCIEXFN1) &&
1196    SOURCE_ID_MATCHES_BDF && is_under(pciexrc, PCIEXFN1) } (0)->
1197    ereport.io.pciex.tl.ptlp@pciexrc,
1198    ereport.io.pciex.tl.ur@pciexrc;
1199
1200prop error.io.pciex.source-poisreq-u@PCIEXFN { IS_LF(PCIEXFN) } (0)->
1201    ereport.io.pci.ma@PCIEXFN;
1202
1203prop error.io.pciex.source-poisreq-u@PCIEXFN { IS_BG(PCIEXFN) &&
1204    is_under(pciexrc, PCIEXFN) } (0)->
1205    ereport.io.pciex.tl.ptlp@pciexrc,
1206    ereport.io.pciex.tl.ur@pciexrc;
1207
1208prop error.io.pciex.source-poisreq-u@PCIEXFN { IS_BG(PCIEXFN) } (0)->
1209    ereport.io.pci.ma@PCIEXFN,
1210    ereport.io.pci.sec-sta@PCIEXFN,
1211    error.io.pci.ta-drw-d@PCIEXFN/PCIFN;
1212
1213prop error.io.pciex.flt-poisreq-u@PCIEXFN (1)->
1214    error.io.pciex.poisreq-u@PCIEXFN;
1215
1216/*
1217 * the remaining propagations are also used for poisoned requests propagating
1218 * up due to a fault behind a pcie-pci bridge
1219 */
1220prop error.io.pciex.poisreq-u@PCIEXFN/PCIEXFN (1)->
1221    error.io.pciex.poisreq-u@PCIEXFN;
1222
1223prop error.io.pciex.poisreq-u@PCIEXFN { IS_BG(PCIEXFN) } (1)->
1224    ereport.io.pci.mdpe@PCIEXFN;
1225
1226prop error.io.pciex.poisreq-u@PCIEXFN { IS_LF(PCIEXFN) } (0)->
1227    ereport.io.pci.mdpe@PCIEXFN;
1228
1229prop error.io.pciex.poisreq-u@PCIEXFN { IS_SD(PCIEXFN) } (2)->
1230    ereport.io.pci.sec-dpe@PCIEXFN,
1231    ereport.io.pciex.tl.ptlp@PCIEXFN;
1232
1233prop error.io.pciex.poisreq-u@PCIEXFN { IS_SD(PCIEXFN) } (0)->
1234    ereport.io.pci.mdpe@PCIEXFN,
1235    error.io.pciex.nonfatal@PCIEXFN;
1236
1237prop error.io.pciex.poisreq-u@PCIEXFN { IS_SU(PCIEXFN) } (1)->
1238    ereport.io.pci.mdpe@PCIEXFN;
1239
1240prop error.io.pciex.poisreq-u@PCIEXFN { IS_SU(PCIEXFN) } (0)->
1241    ereport.io.pci.sec-dpe@PCIEXFN,
1242    ereport.io.pciex.tl.ptlp@PCIEXFN,
1243    error.io.pciex.nonfatal@PCIEXFN;
1244
1245prop error.io.pciex.poisreq-u@pciexrc/PCIEXFN (1)->
1246    ereport.io.pci.sec-dpe@pciexrc;
1247
1248/*
1249 * upstream poisoned completion
1250 *
1251 * - flt-poiscomp-u is on the pciex node which generated the fault. There will
1252 *   be a target-mdpe downstream from here.
1253 * - source-poiscomp-u refers to at least one leaf or bridge device
1254 *   whose bdf (if leaf) must match the source-id in the payload of the
1255 *   ereport generated from the root complex.
1256 * - poiscomp-u propagates up to the root complex and any switches on
1257 *   route will raise ptlp and sec-mdpe ereports. The root complex will also
1258 *   raise a sec-mdpe and ptlp.
1259 *
1260 * We can always recognize what sort of fault this is from the ptlp/sec-mdpe at
1261 * the root complex. Recognizing which originating devices may be implicated
1262 * can be done using the source-id payload in the ptlp ereport to identify the
1263 * originator of the completion. The ptlp/sec-mdpe ereports at the intervening
1264 * switches will narrow the fault down to a single suspect.
1265 */
1266prop error.io.pciex.flt-poiscomp-u@PCIEXFN { IS_LF(PCIEXFN1) &&
1267    is_under(PCIEXFN, PCIEXFN1) } (0)->
1268    ereport.io.pci.target-mdpe@PCIEXFN1;
1269
1270prop error.io.pciex.flt-poiscomp-u@PCIEXFN { IS_PCI_LF(PCIFN) &&
1271    is_under(PCIEXFN, PCIFN) } (0)->
1272    ereport.io.pci.target-mdpe@PCIFN;
1273
1274prop error.io.pciex.flt-poiscomp-u@PCIEXFN1 { (IS_LF(PCIEXFN) ||
1275    IS_BG(PCIEXFN)) && is_under(PCIEXFN1, PCIEXFN) } (0)->
1276    error.io.pciex.source-poiscomp-u@PCIEXFN;
1277
1278prop error.io.pciex.source-poiscomp-u@PCIEXFN1 { IS_LF(PCIEXFN1) &&
1279    SOURCE_ID_MATCHES_BDF && is_under(pciexrc, PCIEXFN1) } (0)->
1280    ereport.io.pciex.tl.ptlp@pciexrc;
1281
1282prop error.io.pciex.source-poiscomp-u@PCIEXFN1 { IS_BG(PCIEXFN1) &&
1283    is_under(pciexrc, PCIEXFN1) } (0)->
1284    ereport.io.pciex.tl.ptlp@pciexrc;
1285
1286prop error.io.pciex.flt-poiscomp-u@PCIEXFN (1)->
1287    error.io.pciex.poiscomp-u@PCIEXFN;
1288
1289/*
1290 * the remaining propagations are also used for poisoned completions propagating
1291 * up due to a fault behind a pcie-pci bridge
1292 */
1293prop error.io.pciex.poiscomp-u@PCIEXFN/PCIEXFN (1)->
1294    error.io.pciex.poiscomp-u@PCIEXFN;
1295
1296prop error.io.pciex.poiscomp-u@PCIEXFN { IS_SD(PCIEXFN) } (2)->
1297    ereport.io.pci.sec-dpe@PCIEXFN,
1298    ereport.io.pciex.tl.ptlp@PCIEXFN;
1299
1300prop error.io.pciex.poiscomp-u@PCIEXFN { IS_SD(PCIEXFN) } (1)->
1301    ereport.io.pci.sec-mdpe@PCIEXFN,
1302    ereport.io.pci.mdpe@PCIEXFN;
1303
1304prop error.io.pciex.poiscomp-u@PCIEXFN { IS_SD(PCIEXFN) } (0)->
1305    error.io.pciex.nonfatal@PCIEXFN;
1306
1307prop error.io.pciex.poiscomp-u@PCIEXFN { IS_SU(PCIEXFN) } (0)->
1308    ereport.io.pci.mdpe@PCIEXFN,
1309    ereport.io.pci.sec-mdpe@PCIEXFN,
1310    ereport.io.pci.sec-dpe@PCIEXFN,
1311    ereport.io.pciex.tl.ptlp@PCIEXFN,
1312    error.io.pciex.nonfatal@PCIEXFN;
1313
1314prop error.io.pciex.poiscomp-u@pciexrc/PCIEXFN (1)->
1315    ereport.io.pci.sec-dpe@pciexrc;
1316
1317prop error.io.pciex.poiscomp-u@pciexrc/PCIEXFN (0)->
1318    ereport.io.pci.sec-mdpe@pciexrc;
1319
1320/*
1321 * upstream request with ecrc error.
1322 *
1323 * - flt-ecrcreq-u is on the pciex node which generated the fault.
1324 * - source-ecrcreq-u cascades down to at least one leaf device (pciex or pci),
1325 *   whose bdf (if pciex) must match the source-id in the payload of the
1326 *   ereport generated from the root complex.
1327 * - ecrcreq-u propagates up to the root complex which must report it with an
1328 *   ecrc ereport and any switches on route can optionally raise an ecrc ereport
1329 *
1330 * Additionally, as the root complex will just throw away the packet, we may
1331 * eventually get a cto - so use an nr-d at the pciex leaf or bridge to get
1332 * the appropriate behaviour.
1333 *
1334 * We can always recognize what sort of fault this is from the ecrc (with no
1335 * cto) at the root complex. Recognizing which leaf device may be implicated
1336 * can be done from the cto ereport (for a hardened leaf driver) or for a
1337 * non-hardened leaf using the source-id payload of the ecrc.
1338 */
1339prop error.io.pciex.flt-ecrcreq-u@PCIEXFN1 { (IS_LF(PCIEXFN) ||
1340    IS_BG(PCIEXFN)) && is_under(PCIEXFN1, PCIEXFN) } (0)->
1341    error.io.pciex.source-ecrcreq-u@PCIEXFN;
1342
1343prop error.io.pciex.source-ecrcreq-u@PCIEXFN (0)->
1344    error.io.pciex.nr-d@PCIEXFN;
1345
1346prop error.io.pciex.source-ecrcreq-u@PCIEXFN1 { IS_LF(PCIEXFN1) &&
1347    SOURCE_ID_MATCHES_BDF && is_under(pciexrc, PCIEXFN1) } (0)->
1348    ereport.io.pciex.tl.ecrc@pciexrc;
1349
1350prop error.io.pciex.source-ecrcreq-u@PCIEXFN { IS_BG(PCIEXFN) &&
1351    is_under(pciexrc, PCIEXFN) } (0)->
1352    ereport.io.pciex.tl.ecrc@pciexrc;
1353
1354prop error.io.pciex.flt-ecrcreq-u@PCIEXFN (1)->
1355     error.io.pciex.ecrcreq-u@PCIEXFN;
1356
1357prop error.io.pciex.ecrcreq-u@PCIEXFN/PCIEXFN (1)->
1358     error.io.pciex.ecrcreq-u@PCIEXFN;
1359
1360prop error.io.pciex.ecrcreq-u@PCIEXFN { IS_SD(PCIEXFN)||IS_SU(PCIEXFN) } (0)->
1361    ereport.io.pciex.tl.ecrc@PCIEXFN,
1362    error.io.pciex.nonfatal@PCIEXFN;
1363
1364/*
1365 * upstream completion with ecrc error.
1366 *
1367 * - flt-ecrccomp-u is on the pciex node which generated the fault.
1368 * - source-ecrccomp-u cascades down to at least one leaf device (pciex or pci),
1369 *   whose bdf (if pciex) must match the source-id in the payload of the
1370 *   ereport generated from the root complex.
1371 * - ecrccomp-u propagates up to the root complex, which should report it with
1372 *   an ecrc ereport and any switches on route can optionally raise an ecrc
1373 *   ereport.
1374 *
1375 * Additionally, as the root complex will just throw away the packet, we'll
1376 * eventually get a cto - so use an flt-nr-u at the pciex leaf or bridge to get
1377 * the appropriate behaviour.
1378 *
1379 * We can always recognize what sort of fault this from the ecrc/cto from the
1380 * root complex. Recognizing which leaf device may be implicated can be done
1381 * using either the source-id payload of the ecrc or the target-ma ereport if
1382 * available.
1383 */
1384prop error.io.pciex.flt-ecrccomp-u@PCIEXFN1 { (IS_LF(PCIEXFN) ||
1385    IS_BG(PCIEXFN)) && is_under(PCIEXFN1, PCIEXFN) } (0)->
1386    error.io.pciex.source-ecrccomp-u@PCIEXFN;
1387
1388prop error.io.pciex.source-ecrccomp-u@PCIEXFN (0)->
1389    error.io.pciex.flt-nr-u@PCIEXFN;
1390
1391prop error.io.pciex.source-ecrccomp-u@PCIEXFN1 { IS_LF(PCIEXFN1) &&
1392    SOURCE_ID_MATCHES_BDF && is_under(pciexrc, PCIEXFN1) } (0)->
1393    ereport.io.pciex.tl.ecrc@pciexrc;
1394
1395prop error.io.pciex.source-ecrccomp-u@PCIEXFN { IS_BG(PCIEXFN) &&
1396    is_under(pciexrc, PCIEXFN) } (0)->
1397    ereport.io.pciex.tl.ecrc@pciexrc;
1398
1399prop error.io.pciex.flt-ecrccomp-u@PCIEXFN (1)->
1400    error.io.pciex.ecrccomp-u@PCIEXFN;
1401
1402prop error.io.pciex.ecrccomp-u@PCIEXFN/PCIEXFN (1)->
1403    error.io.pciex.ecrccomp-u@PCIEXFN;
1404
1405prop error.io.pciex.ecrccomp-u@PCIEXFN { IS_SD(PCIEXFN)||IS_SU(PCIEXFN) } (0)->
1406    ereport.io.pciex.tl.ecrc@PCIEXFN,
1407    error.io.pciex.nonfatal@PCIEXFN;
1408
1409/*
1410 * no response to downstream requester
1411 *
1412 * - nr-d will effectively cascade downstream to the requester. The fault here
1413 *   is always at the root complex. For a hardened leaf device driver, we will
1414 *   always be able to recognize this as the requester will report this as a
1415 *   cto. For non-hardened leaf devices, no cto will be reported, and though we
1416 *   should still see a nonfatal error reported from the root complex
1417 *   identifying the leaf device, we won't actually be informed that the error
1418 *   was a cto.
1419 */
1420prop error.io.pciex.nr-d@PCIEXFN (1)->
1421    error.io.pciex.nr-fwd-d@PCIEXFN { IS_BG(PCIEXFN) || IS_LF(PCIEXFN) },
1422    error.io.pciex.nr-fwd-d@PCIEXFNHZ { (IS_BG(PCIEXFNHZ) ||
1423    IS_LF(PCIEXFNHZ)) && is_under(PCIEXFN, PCIEXFNHZ) };
1424
1425prop error.io.pciex.nr-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (2)->
1426    error.io.pciex.nonfatal@PCIEXFN,
1427    ereport.io.pciex.tl.cto@PCIEXFN;
1428
1429prop error.io.pciex.nr-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (0)->
1430    ereport.io.pci.ma@PCIEXFN,
1431    ereport.io.pci.sec-sta@PCIEXFN,
1432    error.io.pci.nr-drw-d@PCIEXFN/PCIFN,
1433    error.io.pci.ta-drw-d@PCIEXFN/PCIFN;
1434
1435prop error.io.pciex.nr-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (1)->
1436    error.io.pciex.nonfatal@PCIEXFN;
1437
1438prop error.io.pciex.nr-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (0)->
1439    ereport.io.pci.ma@PCIEXFN,
1440    ereport.io.pciex.tl.cto@PCIEXFN;
1441
1442/*
1443 * no response to upstream requester
1444 *
1445 * - flt-nr-u will effectively cascade upstream to the root complex which will
1446 *   report it as a cto.
1447 *
1448 * We have to use target-ma to informs us which device failed to respond.
1449 */
1450prop error.io.pciex.flt-nr-u@PCIEXFN (1)->
1451    error.io.pci.target-ma-d@PCIEXFN;
1452
1453prop error.io.pciex.flt-nr-u@PCIEXFN (1)->
1454    error.io.pciex.nr-u@PCIEXFN;
1455
1456prop error.io.pciex.nr-u@PCIEXFN/PCIEXFN (1)->
1457    error.io.pciex.nr-u@PCIEXFN;
1458
1459prop error.io.pciex.nr-u@pciexrc/PCIEXFN (1)->
1460    ereport.io.pciex.tl.cto@pciexrc;
1461
1462prop error.io.pciex.nr-u@pciexrc/PCIEXFN (0)->
1463    ereport.io.pci.sec-ma@pciexrc;
1464
1465/*
1466 * downstream malformed tlp
1467 *
1468 * This will cascade downstream to the receiver which will report it as an mtlp.
1469 * For non-hardened leaf drivers, no mtlp will be reported, and though we should
1470 * still see a fatal error reported from the root complex identifying the leaf
1471 * device, we won't actually be informed that the error was a mtlp.
1472 * Note that sw-mtlp-d is to handle the case where the switch is actually
1473 * the target of the packet (config request etc).
1474 */
1475prop error.io.pciex.mtlp-d@PCIEXFN (1)->
1476    error.io.pciex.mtlp-fwd-d@PCIEXFN { !IS_SD(PCIEXFN) },
1477    error.io.pciex.mtlp-fwd-d@PCIEXFNHZ { !IS_SD(PCIEXFNHZ) &&
1478    is_under(PCIEXFN, PCIEXFNHZ) };
1479
1480prop error.io.pciex.mtlp-fwd-d@PCIEXFN { IS_SU(PCIEXFN) } (2)->
1481    error.io.pciex.fatal@PCIEXFN,
1482    ereport.io.pciex.tl.mtlp@PCIEXFN;
1483
1484prop error.io.pciex.mtlp-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (2)->
1485    error.io.pciex.fatal@PCIEXFN,
1486    ereport.io.pciex.tl.mtlp@PCIEXFN;
1487
1488prop error.io.pciex.mtlp-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (1)->
1489    error.io.pciex.fatal@PCIEXFN;
1490
1491prop error.io.pciex.mtlp-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (0)->
1492    ereport.io.pciex.tl.mtlp@PCIEXFN;
1493
1494/*
1495 * upstream malformed tlp
1496 *
1497 * This will cascade upstream to the receiver which will report it as an mtlp.
1498 */
1499prop error.io.pciex.flt-mtlp-u@PCIEXFN (1)->
1500    error.io.pciex.mtlp-u@PCIEXFN;
1501
1502prop error.io.pciex.mtlp-u@PCIEXFN/PCIEXFN (1)->
1503    error.io.pciex.mtlp-u@PCIEXFN;
1504
1505prop error.io.pciex.mtlp-u@pciexrc/PCIEXFN (1)->
1506    ereport.io.pciex.tl.mtlp@pciexrc;
1507
1508/*
1509 * downstream completer aborts
1510 *
1511 * This could be the fault of the root complex or a switch reporting an internal
1512 * error, or of the leaf device sending an invalid request (the latter is
1513 * handled by the flt-badreq-u case below).
1514 *
1515 * This is reported by the completer or by an intervening downstream switch
1516 * port. The completer abort response propagates down to the initiator which
1517 * will set the legacy pci bit rta.
1518 *
1519 * The fault can always be recognized by the ca ereport from the root complex
1520 * or downstream switch port. The originator of the request can be recognized
1521 * by the rta for a hardened driver or by using the source-id payload of the
1522 * ca ereport for a non-hardened driver.
1523 */
1524prop error.io.pciex.ca-d@pciexrc/PCIEXFN (0)->
1525    ereport.io.pciex.tl.ca@pciexrc;
1526
1527prop error.io.pciex.ca-d@pciexrc/PCIEXFN (1)->
1528    ereport.io.pci.sec-sta@pciexrc;
1529
1530prop error.io.pciex.ca-d@PCIEXFN/PCIEXFN (0)->
1531    ereport.io.pci.sec-sta@PCIEXFN;
1532
1533prop error.io.pciex.ca-d@PCIEXFN/PCIEXFN (2)->
1534    ereport.io.pciex.tl.ca@PCIEXFN,
1535    error.io.pciex.nonfatal@PCIEXFN;
1536
1537prop error.io.pciex.ca-d@PCIEXFN (1)->
1538    error.io.pciex.ca-fwd-d@PCIEXFN { IS_BG(PCIEXFN) || IS_LF(PCIEXFN) },
1539    error.io.pciex.ca-fwd-d@PCIEXFNHZ { (IS_BG(PCIEXFNHZ) ||
1540    IS_LF(PCIEXFNHZ)) && is_under(PCIEXFN, PCIEXFNHZ) };
1541
1542prop error.io.pciex.ca-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (1)->
1543    ereport.io.pci.rta@PCIEXFN;
1544
1545prop error.io.pciex.ca-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (0)->
1546    ereport.io.pci.sec-sta@PCIEXFN,
1547    error.io.pci.ta-drw-d@PCIEXFN/PCIFN;
1548
1549prop error.io.pciex.ca-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (0)->
1550    ereport.io.pci.rta@PCIEXFN;
1551
1552/*
1553 * upstream completer aborts
1554 *
1555 * This could be the fault of the leaf device/bridge/upstream switch port
1556 * reporting an internal error, or of the root complex sending an invalid
1557 * request (the latter case is handled by badreq-d below).
1558 *
1559 * This is reported as a ca by the completer. The completer (for non-posted
1560 * requests) sends the appropriate error bits in the completion message to
1561 * the initiator which will set the legacy pci bit sec-rta.
1562 *
1563 * The fault can always be recognized from the sec-rta bit at the root complex.
1564 *
1565 * If the fault was with a PCI Express leaf with a hardened driver, then we
1566 * will identify the device from the ca ereport.
1567 *
1568 * If the fault was with a PCI Express leaf with a non-hardened driver, then we
1569 * can still identify the leaf device from the source-id payload of the nonfatal
1570 * message ereport from the root complex or from the target-rta ereport.
1571 */
1572prop error.io.pciex.flt-ca-u@PCIEXFN { !IS_LF(PCIEXFN) } (1)->
1573    ereport.io.pciex.tl.ca@PCIEXFN;
1574
1575prop error.io.pciex.flt-ca-u@PCIEXFN { IS_LF(PCIEXFN) } (0)->
1576    ereport.io.pciex.tl.ca@PCIEXFN;
1577
1578prop error.io.pciex.flt-ca-u@PCIEXFN (0)->
1579    error.io.pciex.nonfatal@PCIEXFN,
1580    ereport.io.pci.sta@PCIEXFN;
1581
1582prop error.io.pciex.flt-ca-u@PCIEXFN (2)->
1583    error.io.pci.target-rta-d@PCIEXFN,
1584    error.io.pciex.ca-u@PCIEXFN;
1585
1586prop error.io.pciex.ca-u@PCIEXFN/PCIEXFN (1)->
1587    error.io.pciex.ca-u@PCIEXFN;
1588
1589prop error.io.pciex.ca-u@pciexrc/PCIEXFN (0)->
1590    ereport.io.pci.sec-rta@pciexrc;
1591
1592/*
1593 * upstream bad request
1594 *
1595 * When detecting bad data on a request the completer (or any switch on the
1596 * way to the completer) may report ur or ca. If the switch detects the problem
1597 * first then the request doesn't get forwarded on to the completer.
1598 *
1599 * These are reported as ur/ca ereports. For non-posted requests, the reporter
1600 * then sends the appropriate error bits in the completion message to the
1601 * initiator which will set the legacy pci bits ma or rta.
1602 *
1603 * For flt-badreq-u, the ca/ur ereports contain a source-id payload that
1604 * identifies the initiator.
1605 *
1606 * The fault can always be recognized by the ca/ur ereport from the root
1607 * complex or downstream switch port. The originator of the request can be
1608 * recognized by the rta/ma for a hardened driver or by using the source-id
1609 * payload of the ca/ur ereport for a non-hardened driver.
1610 */
1611prop error.io.pciex.flt-badreq-u@PCIEXFN (0)->
1612    ereport.io.pci.ma@PCIEXFN,
1613    ereport.io.pci.rta@PCIEXFN;
1614
1615prop error.io.pciex.flt-badreq-u@PCIEXFN1 {
1616    SOURCE_ID_MATCHES_BDF && is_under(pciexrc, PCIEXFN1) } (0)->
1617    ereport.io.pciex.tl.ur@pciexrc,
1618    ereport.io.pciex.tl.ca@pciexrc;
1619
1620prop error.io.pciex.flt-badreq-u@PCIEXFN (1)->
1621    error.io.pciex.badreq-u@PCIEXFN;
1622
1623prop error.io.pciex.badreq-u@PCIEXFN/PCIEXFN (1)->
1624    error.io.pciex.badreq-u@PCIEXFN;
1625
1626prop error.io.pciex.badreq-u@pciexrc/PCIEXFN (0)->
1627    ereport.io.pci.sec-sta@pciexrc;
1628
1629prop error.io.pciex.flt-badreq-u@PCIEXFN1 { IS_SD(PCIEXFN) &&
1630    SOURCE_ID_MATCHES_BDF && is_under(PCIEXFN, PCIEXFN1) } (0)->
1631    ereport.io.pciex.tl.ur@PCIEXFN,
1632    ereport.io.pciex.tl.ca@PCIEXFN;
1633
1634prop error.io.pciex.flt-badreq-u@PCIEXFN1 { IS_SD(PCIEXFN) &&
1635    is_under(PCIEXFN, PCIEXFN1) } (0)->
1636    ereport.io.pci.sec-sta@PCIEXFN,
1637    error.io.pciex.nonfatal@PCIEXFN;
1638
1639/*
1640 * downstream bad request
1641 *
1642 * When detecting bad data on a request the completer (or any switch on the
1643 * way to the completer) may report ur or ca. If the switch detects the problem
1644 * first then the request doesn't get forwarded on to the completer.
1645 *
1646 * These are reported as ur/ca ereports (except where the completer is a non-
1647 * hardened leaf driver when all we get is a nonfatal error from the root
1648 * complex identifying the leaf device). The reporter then sends the appropriate
1649 * error bits in the completion message to the initiator which will set the
1650 * legacy pci bits ma or rta (oddly there is no equivalent in pcie error
1651 * reporting).
1652 */
1653prop error.io.pciex.badreq-d@PCIEXFN (1)->
1654    error.io.pciex.flt-ur-u@PCIEXFN,
1655    error.io.pciex.flt-ca-u@PCIEXFN,
1656    error.io.pciex.flt-ur-u@PCIEXFNHZ { is_under(PCIEXFN, PCIEXFNHZ) },
1657    error.io.pciex.flt-ca-u@PCIEXFNHZ { is_under(PCIEXFN, PCIEXFNHZ) },
1658    error.io.pci.badreq-pw-d@PCIEXFNHZ/PCIFNHZ { is_under(PCIEXFN, PCIEXFNHZ) },
1659    error.io.pci.badreq-drw-d@PCIEXFNHZ/PCIFNHZ { is_under(PCIEXFN,PCIEXFNHZ) };
1660
1661prop error.io.pciex.flt-ur-u@PCIEXFN { !IS_LF(PCIEXFN) } (1)->
1662    ereport.io.pciex.tl.ur@PCIEXFN;
1663
1664prop error.io.pciex.flt-ur-u@PCIEXFN { IS_LF(PCIEXFN) } (0)->
1665    ereport.io.pciex.tl.ur@PCIEXFN;
1666
1667prop error.io.pciex.flt-ur-u@PCIEXFN (2)->
1668    error.io.pci.target-ma-d@PCIEXFN,
1669    error.io.pciex.ur-u@PCIEXFN;
1670
1671prop error.io.pciex.flt-ur-u@PCIEXFN (0)->
1672    error.io.pciex.nonfatal@PCIEXFN;
1673
1674prop error.io.pciex.ur-u@PCIEXFN/PCIEXFN (1)->
1675    error.io.pciex.ur-u@PCIEXFN;
1676
1677prop error.io.pciex.ur-u@pciexrc/PCIEXFN (0)->
1678    ereport.io.pci.sec-ma@pciexrc;
1679
1680/*
1681 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1682 * Stub unused legacy pci ereports at root complex.
1683 * Stub tl.uc as we can't do anything useful with it (we should eventually
1684 * get a cto which we can do something with - a uc without a cto is a genuinely
1685 * spurious completion which is at least harmless).
1686 * Stub messages that the root complex sends to itself.
1687 * Stub mce/mue/ce/nr/noadverr.
1688 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1689 */
1690
1691event error.io.pciex.discard_rc@pciexrc;
1692
1693event ereport.io.pciex.noadverr@PCIEXFN{within(5s)};
1694event ereport.io.pciex.correctable@PCIEXFN{within(5s)};
1695event ereport.io.pciex.nonfatal@PCIEXFN{within(5s)};
1696event ereport.io.pciex.a-nonfatal@PCIEXFN{within(5s)};
1697event ereport.io.pciex.fatal@PCIEXFN{within(5s)};
1698event ereport.io.pci.nr@PCIEXFN{within(5s)};
1699event ereport.io.pci.nr@pciexrc{within(5s)};
1700event ereport.io.pci.ma@pciexrc{within(5s)};
1701event ereport.io.pci.rta@pciexrc{within(5s)};
1702event ereport.io.pci.sta@pciexrc{within(5s)};
1703event ereport.io.pci.dpe@pciexrc{within(5s)};
1704event ereport.io.pci.mdpe@pciexrc{within(5s)};
1705event ereport.io.pci.sserr@pciexrc{within(5s)};
1706event ereport.io.pciex.tl.uc@pciexrc{within(5s)};
1707event ereport.io.pciex.noadverr@pciexrc{within(5s)};
1708event ereport.io.pciex.a-nonfatal@pciexrc{within(5s)};
1709event ereport.io.pciex.rc.ce-msg@pciexrc{within(5s)};
1710event ereport.io.pciex.rc.mce-msg@pciexrc{within(5s)};
1711
1712event upset.io.pciex.discard_uc@PCIEXFN;
1713event upset.io.pciex.discard@PCIEXFN;
1714event upset.io.pciex.discard@pciexrc;
1715
1716prop upset.io.pciex.discard_uc@PCIEXFN { IS_BG(PCIEXFN) } (1)->
1717    ereport.io.pciex.tl.uc@PCIEXFN;
1718
1719prop upset.io.pciex.discard_uc@PCIEXFN { IS_LF(PCIEXFN) } (1)->
1720    ereport.io.pciex.tl.uc@PCIEXFN;
1721
1722prop upset.io.pciex.discard@PCIEXFN (1)->
1723    ereport.io.pci.nr@PCIEXFN,
1724    ereport.io.pciex.noadverr@PCIEXFN,
1725    ereport.io.pciex.correctable@PCIEXFN,
1726    ereport.io.pciex.nonfatal@PCIEXFN,
1727    ereport.io.pciex.a-nonfatal@PCIEXFN,
1728    ereport.io.pciex.fatal@PCIEXFN;
1729
1730prop error.io.pciex.discard_rc@pciexrc (0)->
1731    ereport.io.pciex.rc.mue-msg@pciexrc,
1732    ereport.io.pciex.rc.fe-msg@pciexrc { SOURCE_ID_MATCHES_OWN_BDF },
1733    ereport.io.pciex.rc.nfe-msg@pciexrc { SOURCE_ID_MATCHES_OWN_BDF };
1734
1735prop upset.io.pciex.discard@pciexrc (1)->
1736    error.io.pciex.discard_rc@pciexrc,
1737    ereport.io.pci.nr@pciexrc,
1738    ereport.io.pciex.noadverr@pciexrc,
1739    ereport.io.pciex.a-nonfatal@pciexrc,
1740    ereport.io.pciex.rc.ce-msg@pciexrc,
1741    ereport.io.pciex.rc.mce-msg@pciexrc,
1742    ereport.io.pciex.tl.uc@pciexrc,
1743    ereport.io.pci.ma@pciexrc,
1744    ereport.io.pci.rta@pciexrc,
1745    ereport.io.pci.sta@pciexrc,
1746    ereport.io.pci.dpe@pciexrc,
1747    ereport.io.pci.mdpe@pciexrc,
1748    ereport.io.pci.sserr@pciexrc;
1749
1750/*
1751 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1752 * rules for propagations from child PCI bus
1753 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1754 */
1755
1756event error.io.pci.retry-to-u@PCIEXFN/PCIFN;
1757event error.io.pci.ma-u@PCIEXFN/PCIFN;
1758event error.io.pci.ta-u@PCIEXFN/PCIFN;
1759event error.io.pci.ape-u@PCIEXFN/PCIFN;
1760event error.io.pci.source-ape-u@PCIFN;
1761event error.io.pci.target-ma-d@PCIFN;
1762event error.io.pci.target-rta-d@PCIFN;
1763event error.io.pci.badreq-pw-u@PCIEXFN/PCIFN;
1764event error.io.pci.badreq-drw-u@PCIEXFN/PCIFN;
1765event error.io.pci.source-perr-u@PCIFN;
1766event error.io.pci.source-dpdata-u@PCIFN;
1767event error.io.pci.dpdata-pw-u@PCIEXFN/PCIFN;
1768event error.io.pci.dpdata-dw-u@PCIEXFN/PCIFN;
1769event error.io.pci.dpdata-dr-u@PCIEXFN/PCIFN;
1770event error.io.pci.perr-pw-u@PCIEXFN/PCIFN;
1771event error.io.pci.perr-dw-u@PCIEXFN/PCIFN;
1772event error.io.pci.perr-dr-u@PCIEXFN/PCIFN;
1773event error.io.pci.serr-u@PCIEXFN/PCIFN;
1774event error.io.pcix.scpe-u@PCIEXFN/PCIFN;
1775event error.io.pcix.source-scpe-u@PCIFN;
1776event error.io.pcix.spl-comp-ma-u@PCIEXFN/PCIFN;
1777event error.io.pcix.spl-comp-ta-u@PCIEXFN/PCIFN;
1778event error.io.pcix.spl-comp-ma-d@PCIEXFN/PCIFN;
1779event error.io.pcix.spl-comp-ta-d@PCIEXFN/PCIFN;
1780event error.io.pcix.uscmd@PCIEXFN;
1781
1782event ereport.io.pcix.sec-spl-dis@PCIEXFN{within(5s)};
1783event ereport.io.pciex.bdg.uscmd@PCIEXFN{within(5s)};
1784event ereport.io.pciex.bdg.sec-perr@PCIEXFN{within(5s)};
1785event ereport.io.pciex.bdg.sec-uadr@PCIEXFN{within(5s)};
1786event ereport.io.pciex.bdg.sec-uat@PCIEXFN{within(5s)};
1787event ereport.io.pciex.bdg.sec-serr@PCIEXFN{within(5s)};
1788event ereport.io.pciex.bdg.sec-tex@PCIEXFN{within(5s)};
1789event ereport.io.pciex.bdg.sec-rma@PCIEXFN{within(5s)};
1790event ereport.io.pciex.bdg.sec-rta@PCIEXFN{within(5s)};
1791event ereport.io.pciex.bdg.sec-ma-sc@PCIEXFN{within(5s)};
1792event ereport.io.pciex.bdg.sec-ta-sc@PCIEXFN{within(5s)};
1793event ereport.io.pci.dto@PCIEXFN{within(5s)};
1794event ereport.io.pci.sec-rta@PCIEXFN{within(5s)};
1795event ereport.io.pci.sec-ma@PCIEXFN{within(5s)};
1796
1797/*
1798 * ma-u will only propagate on to pciex bus for non-posted accesses. It
1799 * is then represented as an unsupported request.
1800 */
1801prop error.io.pci.ma-u@PCIEXFN/PCIFN (0)->
1802    ereport.io.pciex.tl.ur@PCIEXFN;
1803
1804prop error.io.pci.ma-u@PCIEXFN/PCIFN { is_under(pciexrc, PCIEXFN/PCIFN) } (0)->
1805    ereport.io.pci.sec-ma@pciexrc;
1806
1807prop error.io.pci.ma-u@PCIEXFN/PCIFN (2)->
1808    ereport.io.pci.sec-ma@PCIEXFN,
1809    error.io.pciex.nonfatal@PCIEXFN;
1810
1811prop error.io.pci.target-ma-d@PCIFN1 { IS_BG(PCIEXFN) && IS_PCI_LF(PCIFN1) &&
1812    SOURCE_ID_MATCHES_BDF && is_under(PCIEXFN, PCIFN1) } (0)->
1813    ereport.io.pciex.bdg.sec-rma@PCIEXFN;
1814
1815/*
1816 * ta-u will only propagate on to pciex bus for non-posted accesses. It is
1817 * then represented as a completer abort.
1818 */
1819prop error.io.pci.ta-u@PCIEXFN/PCIFN (0)->
1820    ereport.io.pci.sta@PCIEXFN,
1821    ereport.io.pciex.tl.ca@PCIEXFN;
1822
1823prop error.io.pci.ta-u@PCIEXFN/PCIFN { is_under(pciexrc, PCIEXFN/PCIFN) } (0)->
1824    ereport.io.pci.sec-rta@pciexrc;
1825
1826prop error.io.pci.ta-u@PCIEXFN/PCIFN (2)->
1827    ereport.io.pci.sec-rta@PCIEXFN,
1828    error.io.pciex.nonfatal@PCIEXFN;
1829
1830prop error.io.pci.target-rta-d@PCIFN1 { IS_BG(PCIEXFN) && IS_PCI_LF(PCIFN1) &&
1831    SOURCE_ID_MATCHES_BDF && is_under(PCIEXFN, PCIFN1) } (0)->
1832    ereport.io.pciex.bdg.sec-rta@PCIEXFN;
1833
1834/*
1835 * PERR# on a delayed write is represented as an unsupported request
1836 */
1837prop error.io.pci.perr-dw-u@PCIEXFN/PCIFN (1)->
1838    ereport.io.pci.sec-mdpe@PCIEXFN;
1839
1840prop error.io.pci.perr-dw-u@PCIEXFN/PCIFN (0)->
1841    error.io.pciex.flt-ur-u@PCIEXFN;
1842
1843prop error.io.pci.perr-pw-u@PCIEXFN/PCIFN (1)->
1844    ereport.io.pci.sec-mdpe@PCIEXFN;
1845
1846prop error.io.pci.perr-pw-u@PCIEXFN/PCIFN (0)->
1847    error.io.pciex.nonfatal@PCIEXFN;
1848
1849prop error.io.pci.perr-dr-u@PCIEXFN/PCIFN (1)->
1850    error.io.pciex.nonfatal@PCIEXFN;
1851
1852prop error.io.pci.source-perr-u@PCIFN1 { IS_BG(PCIEXFN) && IS_PCI_LF(PCIFN1) &&
1853    SOURCE_ID_MATCHES_BDF && is_under(PCIEXFN, PCIFN1) } (0)->
1854    ereport.io.pciex.bdg.sec-perr@PCIEXFN;
1855
1856/*
1857 * If the bridge receives data with bad ecc/parity from pci/pci-x, it will
1858 * propagate onto pci express as a poisoned tlp
1859 */
1860prop error.io.pci.dpdata-dr-u@PCIEXFN/PCIFN (2)->
1861    ereport.io.pci.sec-dpe@PCIEXFN,
1862    error.io.pciex.poiscomp-u@PCIEXFN;
1863
1864prop error.io.pci.dpdata-dr-u@PCIEXFN/PCIFN (0)->
1865    error.io.pciex.nonfatal@PCIEXFN;
1866
1867prop error.io.pci.dpdata-dr-u@PCIEXFN/PCIFN (1)->
1868    ereport.io.pci.sec-mdpe@PCIEXFN,
1869    ereport.io.pci.mdpe@PCIEXFN;
1870
1871prop error.io.pci.dpdata-dw-u@PCIEXFN/PCIFN (1)->
1872    ereport.io.pci.sec-dpe@PCIEXFN;
1873
1874prop error.io.pci.dpdata-dw-u@PCIEXFN/PCIFN (0)->
1875    error.io.pciex.nonfatal@PCIEXFN,
1876    error.io.pciex.poisreq-u@PCIEXFN,
1877    ereport.io.pci.ma@PCIEXFN,
1878    ereport.io.pci.sec-sta@PCIEXFN,
1879    error.io.pci.ta-drw-d@PCIEXFN/PCIFN;
1880
1881prop error.io.pci.dpdata-pw-u@PCIEXFN/PCIFN (2)->
1882    ereport.io.pci.sec-dpe@PCIEXFN,
1883    error.io.pciex.poisreq-u@PCIEXFN;
1884
1885prop error.io.pci.dpdata-pw-u@PCIEXFN/PCIFN (0)->
1886    error.io.pciex.nonfatal@PCIEXFN,
1887    ereport.io.pci.ma@PCIEXFN;
1888
1889prop error.io.pci.source-dpdata-u@PCIFN { is_under(pciexrc, PCIFN) } (0)->
1890    ereport.io.pciex.tl.ptlp@pciexrc,
1891    ereport.io.pciex.tl.ur@pciexrc;
1892
1893prop error.io.pci.source-dpdata-u@PCIFN1 { IS_BG(PCIEXFN) && IS_PCI_LF(PCIFN1)
1894    && SOURCE_ID_MATCHES_BDF && is_under(PCIEXFN, PCIFN1) } (0)->
1895    ereport.io.pciex.bdg.sec-ude@PCIEXFN;
1896
1897/*
1898 * If the bridge sees an address or attribute parity error it is considered
1899 * a fatal error.
1900 */
1901prop error.io.pci.ape-u@PCIEXFN/PCIFN (2)->
1902    ereport.io.pci.sec-dpe@PCIEXFN,
1903    error.io.pciex.fatal@PCIEXFN;
1904
1905prop error.io.pci.source-ape-u@PCIFN1 { IS_BG(PCIEXFN) && IS_PCI_LF(PCIFN1) &&
1906    SOURCE_ID_MATCHES_BDF && is_under(PCIEXFN, PCIFN1) } (0)->
1907    ereport.io.pciex.bdg.sec-uat@PCIEXFN,
1908    ereport.io.pciex.bdg.sec-uadr@PCIEXFN;
1909
1910prop error.io.pci.ape-u@PCIEXFN/PCIFN (0)->
1911    ereport.io.pci.sec-rserr@PCIEXFN,
1912    ereport.io.pciex.bdg.sec-serr@PCIEXFN,
1913    ereport.io.pci.sec-sta@PCIEXFN;
1914
1915/*
1916 * If the bridge sees a split completion error (pci-x only) it could
1917 * result in a number of things
1918 * - unrecovered split completion message data error (uscmd). This would
1919 *   happen on a pio write. A completer abort is returned to the initiator.
1920 * - for various faults in the split completion (eg address parity error)
1921 *   we will respond with a target abort (which the child device will treat
1922 *   as a split completion ta)
1923 * - for other faults we can't tell who send the split completion and so
1924 *   just drop the request (which the child device sees as a split
1925 *   completion ma)
1926 */
1927prop error.io.pcix.scpe-u@PCIEXFN/PCIFN (0)->
1928    ereport.io.pci.sec-dpe@PCIEXFN,
1929    ereport.io.pci.sec-rserr@PCIEXFN,
1930    ereport.io.pciex.bdg.sec-serr@PCIEXFN,
1931    ereport.io.pci.sec-sta@PCIEXFN,
1932    error.io.pciex.fatal@PCIEXFN;
1933
1934prop error.io.pcix.source-scpe-u@PCIFN1 { IS_BG(PCIEXFN) && IS_PCI_LF(PCIFN1) &&
1935    SOURCE_ID_MATCHES_BDF && is_under(PCIEXFN, PCIFN1) } (0)->
1936    ereport.io.pciex.bdg.sec-uat@PCIEXFN,
1937    ereport.io.pciex.bdg.sec-uadr@PCIEXFN;
1938
1939prop error.io.pcix.scpe-u@PCIEXFN/PCIFN (1)->
1940    error.io.pcix.uscmd@PCIEXFN,
1941    error.io.pcix.spl-comp-ma-d@PCIEXFN/PCIFN,
1942    error.io.pcix.spl-comp-ta-d@PCIEXFN/PCIFN;
1943
1944prop error.io.pcix.uscmd@PCIEXFN (4)->
1945    error.io.pciex.fatal@PCIEXFN,
1946    ereport.io.pci.sta@PCIEXFN,
1947    ereport.io.pciex.tl.ca@PCIEXFN,
1948    ereport.io.pciex.bdg.uscmd@PCIEXFN;
1949
1950prop error.io.pcix.uscmd@PCIEXFN { is_under(pciexrc, PCIEXFN) } (0)->
1951    ereport.io.pci.sec-rta@pciexrc;
1952
1953/*
1954 * Similarly a child device may have responded with a master abort or
1955 * target abort to one of our split competions. The hardware just logs these.
1956 */
1957prop error.io.pcix.spl-comp-ma-u@PCIEXFN/PCIFN (3)->
1958    error.io.pciex.nonfatal@PCIEXFN,
1959    ereport.io.pcix.sec-spl-dis@PCIEXFN,
1960    ereport.io.pciex.bdg.sec-ma-sc@PCIEXFN;
1961
1962prop error.io.pcix.spl-comp-ma-u@PCIEXFN/PCIFN (0)->
1963    ereport.io.pci.sec-ma@PCIEXFN;
1964
1965prop error.io.pcix.spl-comp-ta-u@PCIEXFN/PCIFN (4)->
1966    error.io.pciex.nonfatal@PCIEXFN,
1967    ereport.io.pcix.sec-spl-dis@PCIEXFN,
1968    ereport.io.pciex.bdg.sec-ta-sc@PCIEXFN,
1969    ereport.io.pci.sec-rta@PCIEXFN;
1970
1971/*
1972 * SERR# is considered fatal
1973 */
1974prop error.io.pci.serr-u@PCIEXFN/PCIFN (3)->
1975    error.io.pciex.fatal@PCIEXFN,
1976    ereport.io.pci.sec-rserr@PCIEXFN,
1977    ereport.io.pciex.bdg.sec-serr@PCIEXFN;
1978
1979/*
1980 * Retry time-out is nonfatal. The initial requester has stopped retrying so
1981 * there's nothing else the hardware can do but flag the error.
1982 */
1983prop error.io.pci.retry-to-u@PCIEXFN/PCIFN (2)->
1984    error.io.pciex.nonfatal@PCIEXFN,
1985    ereport.io.pciex.bdg.sec-tex@PCIEXFN;
1986
1987prop error.io.pci.retry-to-u@PCIEXFN/PCIFN (0)->
1988    ereport.io.pci.sta@PCIEXFN,
1989    ereport.io.pci.dto@PCIEXFN;
1990
1991prop error.io.pci.retry-to-u@PCIEXFN/PCIFN {
1992    is_under(pciexrc, PCIEXFN/PCIFN) } (0)->
1993    ereport.io.pci.sec-rta@pciexrc;
1994
1995/*
1996 * A bad dma request (eg with invalid address) propagates onto pci express
1997 * as a bad dma request. The end result may be a master abort or target abort
1998 * (depending on whether the child is pci-x or pci).
1999 */
2000prop error.io.pci.badreq-pw-u@PCIEXFN/PCIFN (0)->
2001    ereport.io.pci.ma@PCIEXFN,
2002    ereport.io.pci.rta@PCIEXFN,
2003    ereport.io.pci.sec-sta@PCIEXFN;
2004
2005prop error.io.pci.badreq-pw-u@PCIEXFN/PCIFN {
2006    is_under(pciexrc, PCIEXFN/PCIFN) } (0)->
2007    ereport.io.pciex.tl.ur@pciexrc,
2008    ereport.io.pciex.tl.ca@pciexrc,
2009    ereport.io.pci.sec-sta@pciexrc;
2010
2011prop error.io.pci.badreq-pw-u@PCIEXFN/PCIFN { IS_SD(PCIEXFN1) &&
2012    is_under(PCIEXFN1, PCIEXFN/PCIFN) } (0)->
2013    ereport.io.pciex.tl.ur@PCIEXFN1,
2014    ereport.io.pciex.tl.ca@PCIEXFN1,
2015    ereport.io.pci.sec-sta@PCIEXFN1,
2016    error.io.pciex.nonfatal@PCIEXFN1;
2017
2018prop error.io.pci.badreq-drw-u@PCIEXFN/PCIFN (0)->
2019    ereport.io.pci.ma@PCIEXFN,
2020    ereport.io.pci.rta@PCIEXFN,
2021    ereport.io.pci.sec-sta@PCIEXFN;
2022
2023prop error.io.pci.badreq-drw-u@PCIEXFN/PCIFN {
2024    is_under(pciexrc, PCIEXFN/PCIFN) } (0)->
2025    ereport.io.pciex.tl.ur@pciexrc,
2026    ereport.io.pciex.tl.ca@pciexrc,
2027    ereport.io.pci.sec-sta@pciexrc;
2028
2029prop error.io.pci.badreq-drw-u@PCIEXFN/PCIFN { IS_SD(PCIEXFN1) &&
2030    is_under(PCIEXFN1, PCIEXFN/PCIFN) } (0)->
2031    ereport.io.pciex.tl.ur@PCIEXFN1,
2032    ereport.io.pciex.tl.ca@PCIEXFN1,
2033    ereport.io.pci.sec-sta@PCIEXFN1,
2034    error.io.pciex.nonfatal@PCIEXFN1;
2035
2036/*
2037 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2038 * target- propagations
2039 *
2040 * A Root Complex driver may generate "target-" ereports when knowledge of the
2041 * physical address associated with a fault allows the target device to be
2042 * determined. This is not a requirement of the Diagnosis Engine, but can be
2043 * valuable when available.
2044 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2045 */
2046event error.io.pci.target-ma-d@PCIEXFN/PCIFN;
2047event error.io.pci.target-rta-d@PCIEXFN/PCIFN;
2048event ereport.io.pci.target-rta@PCIEXFN{within(5s)};
2049event ereport.io.pci.target-ma@PCIEXFN{within(5s)};
2050
2051prop error.io.pci.target-ma-d@PCIEXFN (0)->
2052    ereport.io.pci.target-ma@PCIEXFN,
2053    ereport.io.pci.target-ma@PCIEXFNHZ { is_under(PCIEXFN, PCIEXFNHZ) },
2054    error.io.pci.target-ma-d@PCIEXFNHZ/PCIFNHZ { is_under(PCIEXFN, PCIEXFNHZ) };
2055
2056prop error.io.pci.target-rta-d@PCIEXFN (0)->
2057    ereport.io.pci.target-rta@PCIEXFN,
2058    ereport.io.pci.target-rta@PCIEXFNHZ { is_under(PCIEXFN, PCIEXFNHZ) },
2059    error.io.pci.target-rta-d@PCIEXFNHZ/PCIFNHZ { is_under(PCIEXFN,PCIEXFNHZ) };
2060
2061/*
2062 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2063 * stub unused pciex-pci bridge ereports
2064 * - ignore usc/sec-unex-spl
2065 * - ignore sec-spl-or/sec-spl-dly as these aren't really faults (tuning info)
2066 * - ignore ecc.ue ereports (we get everything we need from dpe/mdpe)
2067 * - ignore ecc.ce ereports for now (could do serd on these)
2068 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2069 */
2070
2071event ereport.io.pciex.bdg.usc@PCIEXFN{within(5s)};
2072event ereport.io.pcix.sec-unex-spl@PCIEXFN{within(5s)};
2073event ereport.io.pcix.sec-spl-or@PCIEXFN{within(5s)};
2074event ereport.io.pcix.sec-spl-dly@PCIEXFN{within(5s)};
2075event ereport.io.pcix.sec-ecc.ce-addr@PCIEXFN{within(5s)};
2076event ereport.io.pcix.sec-ecc.ce-attr@PCIEXFN{within(5s)};
2077event ereport.io.pcix.sec-ecc.ce-data@PCIEXFN{within(5s)};
2078event ereport.io.pcix.sec-ecc.ue-addr@PCIEXFN{within(5s)};
2079event ereport.io.pcix.sec-ecc.ue-attr@PCIEXFN{within(5s)};
2080event ereport.io.pcix.sec-ecc.ue-data@PCIEXFN{within(5s)};
2081event ereport.io.pcix.sec-s-ce@PCIEXFN{within(5s)};
2082event ereport.io.pcix.sec-s-ue@PCIEXFN{within(5s)};
2083
2084event upset.io.pciex.discard-bdg@PCIEXFN;
2085
2086prop upset.io.pciex.discard-bdg@PCIEXFN (1)->
2087    ereport.io.pciex.bdg.usc@PCIEXFN,
2088    ereport.io.pcix.sec-unex-spl@PCIEXFN,
2089    ereport.io.pcix.sec-spl-or@PCIEXFN,
2090    ereport.io.pcix.sec-spl-dly@PCIEXFN,
2091    ereport.io.pcix.sec-ecc.ce-addr@PCIEXFN,
2092    ereport.io.pcix.sec-ecc.ce-attr@PCIEXFN,
2093    ereport.io.pcix.sec-ecc.ce-data@PCIEXFN,
2094    ereport.io.pcix.sec-ecc.ue-addr@PCIEXFN,
2095    ereport.io.pcix.sec-ecc.ue-attr@PCIEXFN,
2096    ereport.io.pcix.sec-ecc.ue-data@PCIEXFN,
2097    ereport.io.pcix.sec-s-ce@PCIEXFN,
2098    ereport.io.pcix.sec-s-ue@PCIEXFN;
2099