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 2008 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#pragma ident	"%Z%%M%	%I%	%E% SMI"
27
28#pragma dictionary "PCI"
29
30#include <fm/topo_hc.h>
31
32#define PCI_DEV_FIT 1000
33#define PCI_BUS_FIT 500
34
35/*
36 * SERD parameters.
37 *
38 * Nonfatal dpe errors have to be recovered by the hardened driver which may
39 * cause intermittant performance/responsiveness problems, so we have tighter
40 * serd parameters for these. These are most likely errors in buffers/caches
41 * within devices and bridges, so use similar rates to cpu data cache parity
42 * errors.
43 *
44 * We will be more conservative about nonfatal internal errors reported
45 * by the driver.
46 */
47#define NONFATAL_COUNT 6
48#define NONFATAL_TIME 2h
49#define NONFATAL_DPE_COUNT 3
50#define NONFATAL_DPE_TIME 168h
51
52#define	PCIFN		pcibus/pcidev/pcifn
53#define	PCIFNHZ		pcibus<>/pcidev<>/pcifn<>
54
55engine serd.io.device.nonfatal@PCIFN,
56	N=NONFATAL_COUNT, T=NONFATAL_TIME;
57
58engine serd.io.pci.nf-dpe@PCIFN,
59	N=NONFATAL_DPE_COUNT, T=NONFATAL_DPE_TIME;
60
61engine serd.io.pci.nf-dpe-bus@pcibus,
62	N=NONFATAL_DPE_COUNT, T=NONFATAL_DPE_TIME;
63
64#define	IS_LEAF \
65	(confprop_defined(PCIFN, TOPO_PCI_CLASS) && \
66	confprop(PCIFN, TOPO_PCI_CLASS) != "60400" && \
67	confprop(PCIFN, TOPO_PCI_CLASS) != "60401")
68
69#define	IS_BDG \
70	(confprop(PCIFN, TOPO_PCI_CLASS) == "60400" || \
71	confprop(PCIFN, TOPO_PCI_CLASS) == "60401")
72
73#define	FD_IS_LEAF \
74	(confprop_defined(pcibus/pcidev[fromdev]/pcifn, TOPO_PCI_CLASS) && \
75	confprop(pcibus/pcidev[fromdev]/pcifn, TOPO_PCI_CLASS) != "60400" && \
76	confprop(pcibus/pcidev[fromdev]/pcifn, TOPO_PCI_CLASS) != "60401")
77
78#define	IS_LF(f)	(confprop_defined(f, TOPO_PCI_CLASS) && \
79			confprop(f, TOPO_PCI_CLASS) != "60400" && \
80			confprop(f, TOPO_PCI_CLASS) != "60401")
81/*
82 * note general rule for errors is that for upstream propagations
83 * @PCIFN is the sending device while  for downstream
84 * propagations it is the receiving device.
85 */
86
87event fault.io.pci.device-interr-corr@PCIFN,
88	engine=serd.io.device.nonfatal@PCIFN, FITrate=PCI_DEV_FIT;
89
90event fault.io.pci.device-interr-unaf@PCIFN,
91	engine=serd.io.pci.nf-dpe@PCIFN, FITrate=PCI_DEV_FIT;
92
93event fault.io.pci.device-interr-deg@PCIFN, FITrate=PCI_DEV_FIT, retire=0;
94
95event fault.io.pci.device-interr@PCIFN, FITrate=PCI_DEV_FIT;
96
97event fault.io.pci.device-invreq@PCIFN, FITrate=PCI_DEV_FIT;
98
99event fault.io.pci.device-noresp@PCIFN, FITrate=PCI_DEV_FIT;
100
101/*
102 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
103 * A faulty hostbridge may cause:
104 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
105 *  - nr-pw-d:	the device not to respond to an upstream request
106 *  - nr-drw-d:	the device not to respond to an upstream request
107 *  - ta-pw-d:	the device to send a target abort to an upstream request
108 *  - ta-drw-d:	the device to send a target abort to an upstream request
109 *  - serr-u:	the device to report itself in error
110 *  - badreq-pw-d:a bad downstream request - not parity error (may cause target
111 * 		to target abort or master abort)
112 *  - badreq-drw-d:a bad downstream request - not parity error (may cause
113 * 		target to target abort or master abort)
114 *  - ape-d:	address/parity to get corrupted during downstream transmission
115 *  - scpe-d:	split completion to get corrupted during downstream transmission
116 *  - dpe-d:	the device to transfer bad data and/or bad parity downstream
117 *  - retry-to-d:	the device to exceed the set timeout for a delayed
118 *			transaction retry.
119 */
120#define	PCI_TO_HB pcibus/pcidev<todev>/pcifn<> {fromdev != 32 && todev == 32}
121#define	PCI_FROM_HB pcibus/pcidev<todev>/pcifn<> {fromdev == 32 && todev != 32}
122
123event error.io.pci.retry-to-d@PCIFN;
124event error.io.pci.nr-pw-d@PCIFN;
125event error.io.pci.nr-drw-d@PCIFN;
126event error.io.pci.ta-pw-d@PCIFN;
127event error.io.pci.ta-drw-d@PCIFN;
128event error.io.pci.badreq-pw-d@PCIFN;
129event error.io.pci.badreq-drw-d@PCIFN;
130event error.io.pci.f-dpe-d@PCIFN;
131event error.io.pci.deg-dpe-d@PCIFN;
132event error.io.pci.nf-dpe-d@PCIFN;
133event error.io.pci.ape-d@PCIFN;
134event error.io.pci.ape-u@PCIFN;
135event error.io.pci.dpdata-dw-d@PCIFN;
136event error.io.pci.dpdata-pw-d@PCIFN;
137event error.io.pci.dpdata-dr-d@PCIFN;
138event error.io.pci.dpdata-pw-u@PCIFN;
139event error.io.pci.dpdata-dw-u@PCIFN;
140event error.io.pci.dpdata-dr-u@PCIFN;
141event error.io.pci.ta-u@PCIFN;
142event error.io.pci.ma-u@PCIFN;
143event error.io.pci.perr-dw-u@PCIFN;
144event error.io.pci.perr-pw-u@PCIFN;
145event error.io.pci.perr-dr-u@PCIFN;
146event error.io.pci.badreq-drw-u@PCIFN;
147event error.io.pci.badreq-pw-u@PCIFN;
148event error.io.pci.device-serr@PCIFN;
149event error.io.pci.device-ta@PCIFN;
150event error.io.pci.device-par@PCIFN;
151event error.io.pci.serr-u@PCIFN;
152event error.io.pcix.scpe-d@PCIFN;
153event error.io.pcix.scpe-u@PCIFN;
154event error.io.pcix.spl-comp-ma-u@PCIFN;
155event error.io.pcix.spl-comp-ta-u@PCIFN;
156event error.io.pcix.spl-comp-ma-d@PCIFN;
157event error.io.pcix.spl-comp-ta-d@PCIFN;
158
159event ereport.io.pci.ma@PCIFN{within(5s)};
160event ereport.io.pci.rta@PCIFN{within(5s)};
161event ereport.io.pci.mdpe@PCIFN{within(5s)};
162event ereport.io.pci.sta@PCIFN{within(5s)};
163event ereport.io.pci.sserr@PCIFN{within(5s)};
164event ereport.io.pci.dpe@PCIFN{within(5s)};
165event ereport.io.pci.target-mdpe@PCIFN{within(5s)};
166event ereport.io.pci.target-rta@PCIFN{within(5s)};
167event ereport.io.pci.target-ma@PCIFN{within(5s)};
168event ereport.io.pcix.discard@PCIFN{within(5s)};
169
170prop fault.io.pci.device-noresp@pcibus/pcidev[fromdev]/pcifn (0)->
171    error.io.pci.nr-pw-d@PCI_FROM_HB,
172    error.io.pci.nr-drw-d@PCI_FROM_HB,
173    error.io.pci.retry-to-d@PCI_FROM_HB;
174
175prop fault.io.pci.device-invreq@pcibus/pcidev[fromdev]/pcifn (0)->
176    error.io.pci.badreq-pw-d@PCI_FROM_HB,
177    error.io.pci.badreq-drw-d@PCI_FROM_HB;
178
179prop fault.io.pci.device-interr-unaf@pcibus/pcidev[fromdev]/pcifn (0)->
180    error.io.pci.nf-dpe-d@PCI_FROM_HB;
181
182prop fault.io.pci.device-interr-deg@pcibus/pcidev[fromdev]/pcifn (0)->
183    error.io.pci.deg-dpe-d@PCI_FROM_HB;
184
185prop fault.io.pci.device-interr@PCIFN (0)->
186    error.io.pci.device-par@PCIFN,
187    error.io.pci.device-ta@PCIFN,
188    error.io.pci.device-serr@PCIFN;
189
190prop error.io.pci.device-par@pcibus/pcidev[fromdev]/pcifn (1)->
191    error.io.pci.f-dpe-d@PCI_FROM_HB,
192    error.io.pcix.scpe-d@PCI_FROM_HB,
193    error.io.pci.ape-d@PCI_FROM_HB;
194
195prop error.io.pci.device-ta@pcibus/pcidev[fromdev]/pcifn (1)->
196    error.io.pci.ta-pw-d@PCI_FROM_HB,
197    error.io.pci.ta-drw-d@PCI_FROM_HB;
198
199prop error.io.pci.device-ta@pcibus/pcidev[fromdev]/pcifn (1)->
200    ereport.io.pci.sta@pcibus/pcidev<todev>/pcifn {
201	todev == fromdev && fromdev == 32 };
202
203prop error.io.pci.device-serr@PCIFN (2)->
204    error.io.pci.serr-u@PCIFN,
205    ereport.io.pci.sserr@PCIFN;
206
207/*
208 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
209 * ereport generation rules for hostbridge
210 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
211 */
212prop error.io.pci.dpdata-pw-u@pcibus/pcidev[fromdev]/pcifn (1)->
213    ereport.io.pci.dpe@PCI_TO_HB;
214
215prop error.io.pci.dpdata-dw-u@pcibus/pcidev[fromdev]/pcifn (1)->
216    ereport.io.pci.dpe@PCI_TO_HB;
217
218prop error.io.pci.dpdata-dr-u@pcibus/pcidev[fromdev]/pcifn (2)->
219    ereport.io.pci.mdpe@PCI_TO_HB,
220    ereport.io.pci.dpe@PCI_TO_HB;
221
222prop error.io.pci.ape-u@pcibus/pcidev[fromdev]/pcifn (3)->
223    ereport.io.pci.dpe@PCI_TO_HB,
224    error.io.pci.serr-u@PCI_TO_HB,
225    ereport.io.pci.sserr@PCI_TO_HB;
226
227prop error.io.pci.ape-u@pcibus/pcidev[fromdev]/pcifn (0)->
228    ereport.io.pci.sta@PCI_TO_HB;
229
230prop error.io.pci.ma-u@pcibus/pcidev[fromdev]/pcifn (1)->
231    ereport.io.pci.ma@PCI_TO_HB;
232
233prop error.io.pci.ta-u@pcibus/pcidev[fromdev]/pcifn (1)->
234    ereport.io.pci.rta@PCI_TO_HB;
235
236prop error.io.pci.perr-dw-u@pcibus/pcidev[fromdev]/pcifn (1)->
237    ereport.io.pci.mdpe@PCI_TO_HB;
238
239prop error.io.pci.perr-pw-u@pcibus/pcidev[fromdev]/pcifn (1)->
240    ereport.io.pci.mdpe@PCI_TO_HB;
241
242prop error.io.pci.badreq-drw-u@pcibus/pcidev[fromdev]/pcifn (0)->
243    ereport.io.pci.sta@PCI_TO_HB;
244
245prop error.io.pci.badreq-pw-u@pcibus/pcidev[fromdev]/pcifn (0)->
246    ereport.io.pci.sta@PCI_TO_HB;
247
248prop error.io.pcix.scpe-u@PCIFN (1)->
249    error.io.pcix.spl-comp-ma-d@PCIFN,
250    error.io.pcix.spl-comp-ta-d@PCIFN;
251
252prop error.io.pcix.scpe-u@pcibus/pcidev[fromdev]/pcifn (0)->
253    ereport.io.pci.dpe@PCI_TO_HB,
254    error.io.pci.serr-u@PCI_TO_HB,
255    ereport.io.pci.sserr@PCI_TO_HB,
256    ereport.io.pci.sta@PCI_TO_HB;
257
258prop error.io.pcix.spl-comp-ma-u@pcibus/pcidev[fromdev]/pcifn (3)->
259    ereport.io.pcix.discard@PCI_TO_HB,
260    error.io.pci.serr-u@PCI_TO_HB,
261    ereport.io.pci.sserr@PCI_TO_HB;
262
263prop error.io.pcix.spl-comp-ta-u@pcibus/pcidev[fromdev]/pcifn (3)->
264    ereport.io.pcix.discard@PCI_TO_HB,
265    error.io.pci.serr-u@PCI_TO_HB,
266    ereport.io.pci.sserr@PCI_TO_HB;
267
268/*
269 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
270 * A faulty PCI leaf device or pci-pci bridge may cause:
271 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
272 *  - nr-pw-u:		the device not to respond to a valid downstream request
273 *  - nr-drw-u:		the device not to respond to a valid downstream request
274 *  - ta-pw-u:		the device responds with a ta to a valid downstream
275 *			request
276 *  - ta-drw-u:		the device responds with a ta to a valid downstream
277 *			request
278 *  - serr-u:		the device to report itself in error
279 *  - badreq-pw-u:	a bad upstream request (may cause target to target
280 *			abort or master abort)
281 *  - badreq-drw-u:	a bad upstream request (may cause target to target
282 *			abort or master abort)
283 *  - ape-u:		the transfer of bad address/parity upstream.
284 *  - scpe-u:		the transfer of bad split completion upstream.
285 *  - dpe-u:		the device to deliver bad data/parity upstream.
286 *  - retry-to-u:	the device to exceed the set timeout for a delayed
287 *			transaction retry.
288 *
289 * A faulty PCI-X leaf device or bridge may also cause:
290 *
291 *  - tx-oor:		the device sends a byte count larger than the completers
292 *			address range.
293 *  - rx-unex-sc:	the device recieved a split completion with a tag
294 * 			which does not match any outstanding transaction.
295 */
296
297#define	PCI_NOT_HB pcibus/pcidev[fromdev]/pcifn {fromdev != 32}
298
299event error.io.pci.retry-to-u@PCIFN;
300event error.io.pci.nr-pw-u@PCIFN;
301event error.io.pci.nr-drw-u@PCIFN;
302event error.io.pci.ta-pw-u@PCIFN;
303event error.io.pci.ta-drw-u@PCIFN;
304event error.io.pci.f-dpe-u@PCIFN;
305event error.io.pci.deg-dpe-u@PCIFN;
306event error.io.pci.nf-dpe-u@PCIFN;
307event error.io.pci.flt-dpdata-pw-u@PCIFN;
308event error.io.pci.flt-dpdata-dw-u@PCIFN;
309event error.io.pci.flt-dpdata-dr-u@PCIFN;
310event error.io.pci.source-dpdata-u@PCIFN;
311event error.io.pci.f-source-dpdata-u@PCIFN;
312event error.io.pci.f-source-dpdata-u@PCIFN/PCIFN;
313event error.io.pci.deg-source-dpdata-u@PCIFN;
314event error.io.pci.deg-source-dpdata-u@PCIFN/PCIFN;
315event error.io.pci.nf-source-dpdata-u@PCIFN;
316event error.io.pci.nf-source-dpdata-u@PCIFN/PCIFN;
317event error.io.pci.perr-d@PCIFN;
318event error.io.pci.target-mdpe-d@PCIFN;
319event error.io.pci.target-mdpe-d@PCIFN/PCIFN;
320event error.io.pci.target-rta-d@PCIFN/PCIFN;
321event error.io.pci.target-ma-d@PCIFN/PCIFN;
322event error.io.pcix.tx-oor@PCIFN;
323event error.io.pcix.rx-unex-sc@PCIFN;
324event error.io.device.nf-device@PCIFN;
325event error.io.device.f-device@PCIFN;
326event error.io.device.deg-device@PCIFN;
327event error.io.service.restored@PCIFN;
328
329event ereport.io.pcix.oor@PCIFN{within(5s)};
330event ereport.io.pcix.unex-sc@PCIFN{within(5s)};
331event ereport.io.service.lost@PCIFN{within(5s)};
332event ereport.io.service.degraded@PCIFN{within(5s)};
333event ereport.io.service.unaffected@PCIFN{within(5s)};
334event ereport.io.service.restored@PCIFN{within(30s)};
335
336prop fault.io.pci.device-noresp@pcibus/pcidev[fromdev]/pcifn (0)->
337    error.io.pci.nr-pw-u@PCI_NOT_HB,
338    error.io.pci.nr-drw-u@PCI_NOT_HB,
339    error.io.pci.retry-to-u@PCI_NOT_HB;
340
341prop fault.io.pci.device-interr-corr@pcibus/pcidev[fromdev]/pcifn (0)->
342    error.io.device.nf-device@PCI_NOT_HB;
343
344prop fault.io.pci.device-interr-unaf@pcibus/pcidev[fromdev]/pcifn (0)->
345    error.io.pci.nf-dpe-u@PCI_NOT_HB;
346
347prop fault.io.pci.device-interr-deg@pcibus/pcidev[fromdev]/pcifn (0)->
348    error.io.device.deg-device@PCI_NOT_HB,
349    error.io.pci.deg-dpe-u@PCI_NOT_HB;
350
351prop fault.io.pci.device-interr@pcibus/pcidev[fromdev]/pcifn (0)->
352    error.io.pci.ta-pw-u@PCI_NOT_HB,
353    error.io.pci.ta-drw-u@PCI_NOT_HB,
354    error.io.pci.serr-u@PCI_NOT_HB,
355    error.io.pci.ape-u@PCI_NOT_HB,
356    error.io.pci.f-dpe-u@PCI_NOT_HB,
357    error.io.device.f-device@PCI_NOT_HB,
358    error.io.pcix.scpe-u@PCI_NOT_HB,
359    error.io.pcix.tx-oor@PCI_NOT_HB,
360    error.io.pcix.rx-unex-sc@PCI_NOT_HB;
361
362prop fault.io.pci.device-invreq@pcibus/pcidev[fromdev]/pcifn {FD_IS_LEAF} (0)->
363    error.io.pci.badreq-drw-u@PCI_NOT_HB,
364    error.io.pci.badreq-pw-u@PCI_NOT_HB;
365
366prop error.io.pcix.tx-oor@PCIFN (1)->
367    ereport.io.pcix.oor@PCIFN;
368
369prop error.io.pcix.rx-unex-sc@pcibus/pcidev[fromdev]/pcifn (1)->
370    ereport.io.pcix.unex-sc@pcibus/pcidev<todev>/pcifn<> {fromdev != todev};
371
372prop error.io.pci.f-dpe-u@PCIFN (1)->
373    error.io.pci.flt-dpdata-pw-u@PCIFN,
374    error.io.pci.flt-dpdata-dw-u@PCIFN,
375    error.io.pci.flt-dpdata-dr-u@PCIFN;
376
377prop error.io.pci.f-dpe-u@PCIFN (1)->
378    error.io.pci.f-source-dpdata-u@PCIFN;
379
380prop error.io.pci.f-source-dpdata-u@PCIFN (1)->
381    error.io.pci.f-source-dpdata-u@PCIFN/PCIFNHZ;
382
383prop error.io.pci.f-source-dpdata-u@PCIFN { IS_LF(PCIFN) } (1)->
384    error.io.pci.source-dpdata-u@PCIFN;
385
386prop error.io.pci.f-source-dpdata-u@PCIFN { IS_LF(PCIFN) } (0)->
387    ereport.io.service.lost@PCIFN;
388
389prop error.io.pci.deg-dpe-u@PCIFN (1)->
390    error.io.pci.flt-dpdata-pw-u@PCIFN,
391    error.io.pci.flt-dpdata-dw-u@PCIFN,
392    error.io.pci.flt-dpdata-dr-u@PCIFN;
393
394prop error.io.pci.deg-dpe-u@PCIFN (1)->
395    error.io.pci.deg-source-dpdata-u@PCIFN;
396
397prop error.io.pci.deg-source-dpdata-u@PCIFN (1)->
398    error.io.pci.deg-source-dpdata-u@PCIFN/PCIFNHZ;
399
400prop error.io.pci.deg-source-dpdata-u@PCIFN { IS_LF(PCIFN) } (1)->
401    error.io.pci.source-dpdata-u@PCIFN;
402
403prop error.io.pci.deg-source-dpdata-u@PCIFN { IS_LF(PCIFN) } (1)->
404    ereport.io.service.degraded@PCIFN;
405
406prop error.io.pci.nf-dpe-u@PCIFN (1)->
407    error.io.pci.flt-dpdata-pw-u@PCIFN,
408    error.io.pci.flt-dpdata-dw-u@PCIFN,
409    error.io.pci.flt-dpdata-dr-u@PCIFN;
410
411prop error.io.pci.nf-dpe-u@PCIFN (1)->
412    error.io.pci.nf-source-dpdata-u@PCIFN;
413
414prop error.io.pci.nf-source-dpdata-u@PCIFN (1)->
415    error.io.pci.nf-source-dpdata-u@PCIFN/PCIFNHZ;
416
417prop error.io.pci.nf-source-dpdata-u@PCIFN { IS_LF(PCIFN) } (1)->
418    error.io.pci.source-dpdata-u@PCIFN;
419
420prop error.io.pci.nf-source-dpdata-u@PCIFN { IS_LF(PCIFN) } (1)->
421    ereport.io.service.unaffected@PCIFN,
422    error.io.service.restored@PCIFN;
423
424prop error.io.pci.flt-dpdata-pw-u@PCIFN (1)->
425    error.io.pci.dpdata-pw-u@PCIFN;
426
427prop error.io.pci.flt-dpdata-pw-u@PCIFN { IS_BDG } (1)->
428    error.io.pci.serr-u@PCIFN;
429
430prop error.io.pci.flt-dpdata-dw-u@PCIFN (2)->
431    error.io.pci.perr-d@PCIFN,
432    error.io.pci.dpdata-dw-u@PCIFN;
433
434prop error.io.pci.flt-dpdata-dr-u@PCIFN (2)->
435    error.io.pci.dpdata-dr-u@PCIFN,
436    error.io.pci.target-mdpe-d@PCIFN;
437
438/*
439 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
440 * A faulty pci-pci bridge may also cause
441 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
442 *  - nr-pw-d:		the device not to respond to a valid upstream request
443 *  - nr-drw-d:		the device not to respond to a valid upstream request
444 *  - ta-pw-d:		the device responds with a ta to a valid upstream
445 *			request
446 *  - ta-drw-d:		the device responds with a ta to a valid upstream
447 *			request
448 *  - ape-d:	address/parity to get corrupted during downstream transmission.
449 *  - scpe-d:	split completion gets corrupted during downstream transmission.
450 *  - dpe-d:	data/parity to get corrupted during downstream transmission.
451 *  - retry-to-d:	the device to exceed the set timeout for a delayed
452 *			transaction retry.
453 */
454
455event error.io.pci.ape-d@PCIFN/PCIFN;
456event error.io.pci.f-dpe-d@PCIFN/PCIFN;
457event error.io.pci.deg-dpe-d@PCIFN/PCIFN;
458event error.io.pci.nf-dpe-d@PCIFN/PCIFN;
459event error.io.pci.retry-to-d@PCIFN/PCIFN;
460event error.io.pci.nr-pw-d@PCIFN/PCIFN;
461event error.io.pci.nr-drw-d@PCIFN/PCIFN;
462event error.io.pci.ta-pw-d@PCIFN/PCIFN;
463event error.io.pci.ta-drw-d@PCIFN/PCIFN;
464event error.io.pcix.scpe-d@PCIFN/PCIFN;
465
466prop fault.io.pci.device-noresp@PCIFN (0)->
467    error.io.pci.nr-pw-d@PCIFN/PCIFN,
468    error.io.pci.nr-drw-d@PCIFN/PCIFN,
469    error.io.pci.retry-to-d@PCIFN/PCIFN;
470
471prop fault.io.pci.device-interr-unaf@PCIFN (0)->
472    error.io.pci.nf-dpe-d@PCIFN/PCIFN;
473
474prop fault.io.pci.device-interr-deg@PCIFN (0)->
475    error.io.pci.deg-dpe-d@PCIFN/PCIFN;
476
477prop fault.io.pci.device-interr@PCIFN (0)->
478    error.io.pci.ta-pw-d@PCIFN/PCIFN,
479    error.io.pci.ta-drw-d@PCIFN/PCIFN,
480    error.io.pci.ape-d@PCIFN/PCIFN,
481    error.io.pcix.scpe-d@PCIFN/PCIFN,
482    error.io.pci.f-dpe-d@PCIFN/PCIFN;
483
484/*
485 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
486 * A faulty PCI bus may cause:
487 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
488 *  - ape-d:	address/parity to get corrupted during downstream transmission.
489 *  - scpe-d:	split completion gets corrupted during downstream transmission.
490 *  - dpe-d:	data/parity to get corrupted during downstream transmission.
491 *  - ape-u:	address/parity to get corrupted during upstream transmission.
492 *  - dpe-u:	data/parity to get corrupted during read upstream transmission.
493 *  - scpe-u:	split completion to get corrupted during upstream transmission.
494 */
495
496event fault.io.pci.bus-linkerr-unaf@pcibus,
497	engine=serd.io.pci.nf-dpe-bus@pcibus, FITrate=PCI_BUS_FIT;
498
499event fault.io.pci.bus-linkerr-deg@pcibus, FITrate=PCI_BUS_FIT, retire=0;
500
501event fault.io.pci.bus-linkerr@pcibus, FITrate=PCI_BUS_FIT;
502
503prop fault.io.pci.bus-linkerr-unaf@pcibus (0)->
504    error.io.pci.nf-dpe-d@pcibus/pcidev<todev>/pcifn { todev != 32},
505    error.io.pci.nf-dpe-u@pcibus/pcidev<todev>/pcifn { todev != 32};
506
507prop fault.io.pci.bus-linkerr-deg@pcibus (0)->
508    error.io.pci.deg-dpe-d@pcibus/pcidev<todev>/pcifn { todev != 32},
509    error.io.pci.deg-dpe-u@pcibus/pcidev<todev>/pcifn { todev != 32};
510
511prop fault.io.pci.bus-linkerr@pcibus (0)->
512    error.io.pci.ape-d@pcibus/pcidev<todev>/pcifn { todev != 32},
513    error.io.pci.f-dpe-d@pcibus/pcidev<todev>/pcifn { todev != 32},
514    error.io.pci.ape-u@pcibus/pcidev<todev>/pcifn { todev != 32},
515    error.io.pci.f-dpe-u@pcibus/pcidev<todev>/pcifn { todev != 32},
516    error.io.pcix.scpe-d@pcibus/pcidev<todev>/pcifn { todev != 32},
517    error.io.pcix.scpe-u@pcibus/pcidev<todev>/pcifn { todev != 32},
518    error.io.pcix.tx-oor@pcibus/pcidev<todev>/pcifn { todev != 32},
519    error.io.pcix.rx-unex-sc@pcibus/pcidev<todev>/pcifn { todev != 32};
520
521/*
522 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
523 * recursive rules for pci-pci bridges
524 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
525 */
526
527event error.io.pci.serr-u@PCIFN/PCIFN;
528event error.io.pci.perr-dw-u@PCIFN/PCIFN;
529event error.io.pci.perr-pw-u@PCIFN/PCIFN;
530event error.io.pci.perr-d@PCIFN/PCIFN;
531event error.io.pci.dpdata-pw-u@PCIFN/PCIFN;
532event error.io.pci.dpdata-dw-u@PCIFN/PCIFN;
533event error.io.pci.dpdata-dr-u@PCIFN/PCIFN;
534event error.io.pci.dpdata-pw-fwd-d@PCIFN;
535event error.io.pci.dpdata-pw-fwd-d@PCIFN/PCIFN;
536event error.io.pci.dpdata-dw-fwd-d@PCIFN;
537event error.io.pci.dpdata-dw-fwd-d@PCIFN/PCIFN;
538event error.io.pci.dpdata-dr-fwd-d@PCIFN;
539event error.io.pci.dpdata-dr-fwd-d@PCIFN/PCIFN;
540event error.io.pci.source-perr-u@PCIFN;
541event error.io.pci.leaf-ape-d@PCIFN;
542event error.io.pci.ape-u@PCIFN/PCIFN;
543event error.io.pci.source-ape-u@PCIFN;
544event error.io.pci.badreq-pw-d@PCIFN/PCIFN;
545event error.io.pci.badreq-drw-d@PCIFN/PCIFN;
546event error.io.pci.badreq-pw-u@PCIFN/PCIFN;
547event error.io.pci.badreq-drw-u@PCIFN/PCIFN;
548event error.io.pci.ta-d@PCIFN;
549event error.io.pci.ta-d@PCIFN/PCIFN;
550event error.io.pci.ta-u@PCIFN/PCIFN;
551event error.io.pci.target-rta-d@PCIFN;
552event error.io.pci.target-ma-d@PCIFN;
553event error.io.pci.nr-pw-u@PCIFN/PCIFN;
554event error.io.pci.ta-pw-u@PCIFN/PCIFN;
555event error.io.pci.retry-to-u@PCIFN/PCIFN;
556event error.io.pcix.scpe-u@PCIFN/PCIFN;
557event error.io.pcix.source-scpe-u@PCIFN;
558event error.io.pcix.spl-comp-ma-u@PCIFN/PCIFN;
559event error.io.pcix.spl-comp-ta-u@PCIFN/PCIFN;
560event error.io.pci.ma-u@PCIFN/PCIFN;
561
562event ereport.io.pci.sec-ma@PCIFN{within(5s)};
563event ereport.io.pci.sec-sta@PCIFN{within(5s)};
564event ereport.io.pci.sec-rta@PCIFN{within(5s)};
565event ereport.io.pci.sec-mdpe@PCIFN{within(5s)};
566event ereport.io.pci.sec-dpe@PCIFN{within(5s)};
567event ereport.io.pci.sec-rserr@PCIFN{within(5s)};
568event ereport.io.pci.dto@PCIFN{within(5s)};
569event ereport.io.pcix.sec-spl-dis@PCIFN{within(5s)};
570event ereport.io.pcix.spl-dis@PCIFN{within(5s)};
571
572/*
573 * SERR# can propagate upstream and may be seen by other devices on the bus
574 */
575prop error.io.pci.serr-u@pcibus/pcidev[fromdev]/pcifn (0)->
576    ereport.io.pci.sserr@pcibus/pcidev<todev>/pcifn<> {todev!=fromdev};
577
578prop error.io.pci.serr-u@PCIFN { IS_BDG } (1)->
579    ereport.io.pci.sserr@PCIFN;
580
581prop error.io.pci.serr-u@PCIFN/PCIFN (2)->
582    ereport.io.pci.sec-rserr@PCIFN,
583    error.io.pci.serr-u@PCIFN;
584
585/*
586 * PERR# can propagate upstream for delayed writes. For posted writes
587 * it turns into an SERR#.
588 */
589prop error.io.pci.perr-dw-u@PCIFN/PCIFN (2)->
590    ereport.io.pci.sec-mdpe@PCIFN,
591    error.io.pci.perr-dw-u@PCIFN;
592
593prop error.io.pci.perr-pw-u@PCIFN/PCIFN (2)->
594    ereport.io.pci.sec-mdpe@PCIFN,
595    error.io.pci.serr-u@PCIFN;
596
597/*
598 * PERR# can propagate downstream (only for downstream dw parity error)
599 */
600prop error.io.pci.perr-d@PCIFN { IS_LEAF } (0)->
601    ereport.io.pci.mdpe@PCIFN;
602
603prop error.io.pci.perr-d@PCIFN { IS_BDG } (1)->
604    ereport.io.pci.mdpe@PCIFN;
605
606prop error.io.pci.perr-d@PCIFN (1)->
607    error.io.pci.perr-d@PCIFN/PCIFNHZ;
608
609/*
610 * downstream target ereports are for any descendant device
611 *
612 * A hostbridge driver may generate "target-" ereports when knowledge of the
613 * physical address associated with a fault allows the target device to be
614 * determined. This is not a requirement of the Diagnosis Engine, but can be
615 * valuable when available.
616 */
617prop error.io.pci.target-mdpe-d@PCIFN (0)->
618    ereport.io.pci.target-mdpe@PCIFN;
619
620prop error.io.pci.target-mdpe-d@PCIFN (1)->
621    error.io.pci.target-mdpe-d@PCIFN/PCIFNHZ;
622
623prop error.io.pci.target-rta-d@PCIFN (0)->
624    ereport.io.pci.target-rta@PCIFN;
625
626prop error.io.pci.target-rta-d@PCIFN (1)->
627    error.io.pci.target-rta-d@PCIFN/PCIFNHZ;
628
629prop error.io.pci.target-ma-d@PCIFN (0)->
630    ereport.io.pci.target-ma@PCIFN;
631
632prop error.io.pci.target-ma-d@PCIFN (1)->
633    error.io.pci.target-ma-d@PCIFN/PCIFNHZ;
634
635/*
636 * target aborts propagate upstream
637 */
638prop error.io.pci.ta-u@PCIFN { IS_BDG } (1)->
639    ereport.io.pci.sta@PCIFN;
640
641prop error.io.pci.ta-u@PCIFN { IS_LEAF } (0)->
642    ereport.io.pci.sta@PCIFN;
643
644prop error.io.pci.ta-u@PCIFN/PCIFN (2)->
645    ereport.io.pci.sec-rta@PCIFN,
646    error.io.pci.ta-u@PCIFN;
647
648/*
649 * bad data (ie invalid but not an ape or dpe) can propagate downstream,
650 * and at some point may result in a target or master abort
651 */
652prop error.io.pci.badreq-pw-d@PCIFN (1)->
653    error.io.pci.badreq-pw-d@PCIFN/PCIFNHZ,
654    error.io.pci.nr-pw-u@PCIFN,
655    error.io.pci.ta-pw-u@PCIFN;
656
657prop error.io.pci.badreq-pw-d@PCIFN { IS_LEAF } (0)->
658    error.io.pci.nr-pw-u@PCIFN,
659    error.io.pci.ta-pw-u@PCIFN;
660
661prop error.io.pci.badreq-drw-d@PCIFN (1)->
662    error.io.pci.badreq-drw-d@PCIFN/PCIFNHZ,
663    error.io.pci.nr-drw-u@PCIFN,
664    error.io.pci.ta-drw-u@PCIFN;
665
666prop error.io.pci.badreq-drw-d@PCIFN { IS_LEAF } (0)->
667    error.io.pci.nr-drw-u@PCIFN,
668    error.io.pci.ta-drw-u@PCIFN;
669
670prop error.io.pci.nr-pw-u@PCIFN/PCIFN (2)->
671    ereport.io.pci.sec-ma@PCIFN,
672    error.io.pci.serr-u@PCIFN;
673
674prop error.io.pci.ta-pw-u@PCIFN { IS_LEAF } (0)->
675    ereport.io.pci.sta@PCIFN;
676
677prop error.io.pci.ta-pw-u@PCIFN { IS_BDG } (1)->
678    ereport.io.pci.sta@PCIFN;
679
680prop error.io.pci.ta-pw-u@PCIFN/PCIFN (2)->
681    ereport.io.pci.sec-rta@PCIFN,
682    error.io.pci.serr-u@PCIFN;
683
684prop error.io.pci.nr-drw-u@PCIFN (1)->
685    error.io.pci.ma-u@PCIFN;
686
687prop error.io.pci.nr-drw-u@PCIFN (1)->
688    error.io.pci.target-rta-d@PCIFN,
689    error.io.pci.target-ma-d@PCIFN;
690
691prop error.io.pci.ma-u@PCIFN/PCIFN (1)->
692    ereport.io.pci.sec-ma@PCIFN;
693
694prop error.io.pci.ma-u@PCIFN/PCIFN (1)->
695    error.io.pci.ma-u@PCIFN,
696    error.io.pci.ta-u@PCIFN;
697
698prop error.io.pci.ta-drw-u@PCIFN (1)->
699    error.io.pci.ta-u@PCIFN;
700
701prop error.io.pci.ta-drw-u@PCIFN (1)->
702    error.io.pci.target-rta-d@PCIFN;
703
704/*
705 * bad data (ie invalid but not an ape or dpe) can propagate upstream,
706 * and at some point may result in a target or master abort
707 */
708prop error.io.pci.badreq-pw-u@PCIFN/PCIFN (1)->
709    error.io.pci.badreq-pw-u@PCIFN,
710    error.io.pci.nr-pw-d@PCIFN/PCIFN,
711    error.io.pci.ta-pw-d@PCIFN/PCIFN;
712
713prop error.io.pci.badreq-pw-u@PCIFN (0)->
714    error.io.pci.nr-pw-d@PCIFN,
715    error.io.pci.ta-pw-d@PCIFN;
716
717prop error.io.pci.nr-pw-d@PCIFN { IS_LEAF } (0)->
718    ereport.io.pci.ma@PCIFN;
719
720prop error.io.pci.nr-pw-d@PCIFN { IS_BDG } (2)->
721    ereport.io.pci.ma@PCIFN,
722    error.io.pci.serr-u@PCIFN;
723
724prop error.io.pci.ta-pw-d@PCIFN/PCIFN (1)->
725    ereport.io.pci.sec-sta@PCIFN;
726
727prop error.io.pci.ta-pw-d@PCIFN { IS_LEAF } (0)->
728    ereport.io.pci.rta@PCIFN;
729
730prop error.io.pci.ta-pw-d@PCIFN { IS_BDG } (2)->
731    ereport.io.pci.rta@PCIFN,
732    error.io.pci.serr-u@PCIFN;
733
734/*
735 * for delayed writes we treat upstream badreq specially as rta always
736 * propagates back downstream to the leaf
737 */
738prop error.io.pci.badreq-drw-u@PCIFN { IS_LEAF } (0)->
739    ereport.io.pci.rta@PCIFN,
740    ereport.io.pci.ma@PCIFN;
741
742prop error.io.pci.badreq-drw-u@PCIFN/PCIFN (1)->
743    ereport.io.pci.ma@PCIFN,
744    ereport.io.pci.rta@PCIFN;
745
746prop error.io.pci.badreq-drw-u@PCIFN/PCIFN (0)->
747    ereport.io.pci.sec-sta@PCIFN;
748
749prop error.io.pci.badreq-drw-u@PCIFN/PCIFN (0)->
750    error.io.pci.badreq-drw-u@PCIFN;
751
752prop error.io.pci.nr-drw-d@PCIFN { IS_LEAF } (0)->
753    ereport.io.pci.ma@PCIFN;
754
755prop error.io.pci.nr-drw-d@PCIFN { IS_BDG } (1)->
756    ereport.io.pci.ma@PCIFN;
757
758prop error.io.pci.nr-drw-d@PCIFN { IS_BDG } (0)->
759    ereport.io.pci.sec-sta@PCIFN;
760
761prop error.io.pci.nr-drw-d@PCIFN (1)->
762    error.io.pci.ta-d@PCIFN/PCIFNHZ,
763    error.io.pci.nr-drw-d@PCIFN/PCIFNHZ;
764
765prop error.io.pci.ta-drw-d@PCIFN/PCIFN (1)->
766    ereport.io.pci.sec-sta@PCIFN;
767
768prop error.io.pci.ta-drw-d@PCIFN (1)->
769    error.io.pci.ta-d@PCIFN;
770
771prop error.io.pci.ta-d@PCIFN { IS_LEAF } (0)->
772    ereport.io.pci.rta@PCIFN;
773
774prop error.io.pci.ta-d@PCIFN { IS_BDG } (2)->
775    ereport.io.pci.sec-sta@PCIFN,
776    ereport.io.pci.rta@PCIFN;
777
778prop error.io.pci.ta-d@PCIFN (1)->
779    error.io.pci.ta-d@PCIFN/PCIFNHZ;
780
781/*
782 * Request with address parity error must be detected by parent device
783 * and can optionally result in a target or master abort.
784 * It may also be detected by sibling devices on a bus
785 */
786prop error.io.pci.ape-u@PCIFN/PCIFN (3)->
787    ereport.io.pci.sec-dpe@PCIFN,
788    ereport.io.pci.sec-rserr@PCIFN,
789    error.io.pci.serr-u@PCIFN;
790
791prop error.io.pci.ape-u@PCIFN (0)->
792    error.io.pci.nr-drw-d@PCIFN,
793    error.io.pci.ta-drw-d@PCIFN,
794    error.io.pci.nr-pw-d@PCIFN,
795    error.io.pci.ta-pw-d@PCIFN;
796
797prop error.io.pci.ape-u@PCIFN (0)->
798    ereport.io.pci.mdpe@PCIFN;
799
800prop error.io.pci.ape-u@pcibus/pcidev[fromdev]/pcifn (0)->
801    ereport.io.pci.dpe@pcibus/pcidev<todev>/pcifn<> {fromdev != todev},
802    ereport.io.pci.sserr@pcibus/pcidev<todev>/pcifn<> {fromdev != todev};
803
804prop error.io.pci.ape-u@PCIFN (1)->
805    error.io.pci.source-ape-u@PCIFN;
806
807/*
808 * If the bridge sees an upstream split completion error (pci-x only) it could
809 * result in a number of things
810 * - for various faults in the split completion (eg address parity error)
811 *   we will respond with a target abort (which the child device will treat
812 *   as a split completion ta)
813 * - for other faults we can't tell who send the split completion and so
814 *   just drop the request (which the child device sees as a split
815 *   completion ma)
816 */
817prop error.io.pcix.scpe-u@PCIFN/PCIFN (0)->
818    ereport.io.pci.sec-sta@PCIFN,
819    ereport.io.pci.sec-dpe@PCIFN,
820    ereport.io.pci.sec-rserr@PCIFN,
821    error.io.pci.serr-u@PCIFN;
822
823prop error.io.pcix.scpe-u@PCIFN (1)->
824    error.io.pcix.spl-comp-ma-d@PCIFN,
825    error.io.pcix.spl-comp-ta-d@PCIFN;
826
827prop error.io.pcix.spl-comp-ma-d@PCIFN (1)->
828    error.io.pci.serr-u@PCIFN;
829
830prop error.io.pcix.spl-comp-ma-d@PCIFN { IS_LEAF } (0)->
831    ereport.io.pci.sserr@PCIFN,
832    ereport.io.pcix.spl-dis@PCIFN;
833
834prop error.io.pcix.spl-comp-ma-d@PCIFN { IS_BDG } (2)->
835    ereport.io.pcix.spl-dis@PCIFN,
836    ereport.io.pci.ma@PCIFN;
837
838prop error.io.pcix.spl-comp-ta-d@PCIFN (1)->
839    error.io.pci.serr-u@PCIFN;
840
841prop error.io.pcix.spl-comp-ta-d@PCIFN { IS_LEAF } (0)->
842    ereport.io.pci.sserr@PCIFN,
843    ereport.io.pcix.spl-dis@PCIFN;
844
845prop error.io.pcix.spl-comp-ta-d@PCIFN { IS_BDG } (2)->
846    ereport.io.pcix.spl-dis@PCIFN,
847    ereport.io.pci.rta@PCIFN;
848
849prop error.io.pcix.scpe-u@PCIFN (1)->
850    error.io.pcix.source-scpe-u@PCIFN;
851
852/*
853 * request with address parity error must be detected by child device
854 * and can optionally result in a target or master abort.
855 */
856prop error.io.pci.ape-d@PCIFN (1)->
857    error.io.pci.serr-u@PCIFN;
858
859prop error.io.pci.ape-d@PCIFN { IS_LEAF } (0)->
860    error.io.pci.leaf-ape-d@PCIFN;
861
862prop error.io.pci.leaf-ape-d@PCIFN { IS_LEAF } (2)->
863    ereport.io.pci.sserr@PCIFN,
864    ereport.io.pci.dpe@PCIFN;
865
866prop error.io.pci.ape-d@PCIFN { IS_BDG } (1)->
867    ereport.io.pci.dpe@PCIFN;
868
869prop error.io.pci.ape-d@PCIFN (0)->
870    error.io.pci.ta-pw-u@PCIFN,
871    error.io.pci.ta-drw-u@PCIFN,
872    error.io.pci.nr-pw-u@PCIFN,
873    error.io.pci.nr-drw-u@PCIFN;
874
875/*
876 * If the device sees a downstream split completion error (pci-x only) it could
877 * result in a number of things
878 * - for various faults in the split completion (eg address parity error)
879 *   we will respond with a target abort (which the parent bridge will treat
880 *   as a split completion ta)
881 * - for other faults we can't tell who send the split completion and so
882 *   just drop the request (which the parent bridge sees as a split
883 *   completion ma)
884 */
885prop error.io.pcix.scpe-d@PCIFN (0)->
886    ereport.io.pci.sta@PCIFN,
887    ereport.io.pci.dpe@PCIFN,
888    ereport.io.pci.sserr@PCIFN,
889    error.io.pci.serr-u@PCIFN;
890
891prop error.io.pcix.scpe-d@PCIFN (1)->
892    error.io.pcix.spl-comp-ma-u@PCIFN,
893    error.io.pcix.spl-comp-ta-u@PCIFN;
894
895prop error.io.pcix.spl-comp-ma-u@PCIFN/PCIFN (2)->
896    ereport.io.pcix.sec-spl-dis@PCIFN,
897    error.io.pci.serr-u@PCIFN;
898
899prop error.io.pcix.spl-comp-ma-u@PCIFN/PCIFN (0)->
900    ereport.io.pci.sec-ma@PCIFN;
901
902prop error.io.pcix.spl-comp-ta-u@PCIFN/PCIFN (3)->
903    ereport.io.pcix.sec-spl-dis@PCIFN,
904    error.io.pci.serr-u@PCIFN,
905    ereport.io.pci.sec-rta@PCIFN;
906
907/*
908 * request with data parity error can propagate upstream
909 *
910 * for PCI/X (but not PCI) the split write can optionally be forwarded across
911 * the bridge, maintaining bad parity/ecc
912 *
913 * if there is a dpe on a retry on a delayed write, we don't send another
914 * retry, and eventually the dto timer will expire
915 */
916prop error.io.pci.dpdata-pw-u@PCIFN { IS_LEAF } (0)->
917    ereport.io.pci.mdpe@PCIFN;
918
919prop error.io.pci.dpdata-pw-u@PCIFN/PCIFN (3)->
920    ereport.io.pci.mdpe@PCIFN,
921    ereport.io.pci.sec-dpe@PCIFN,
922    error.io.pci.dpdata-pw-u@PCIFN;
923
924prop error.io.pci.dpdata-dw-u@PCIFN/PCIFN (1)->
925    ereport.io.pci.sec-dpe@PCIFN;
926
927prop error.io.pci.dpdata-dw-u@PCIFN/PCIFN (0)->
928    ereport.io.pci.mdpe@PCIFN,
929    error.io.pci.dpdata-dw-u@PCIFN;
930
931prop error.io.pci.dpdata-dw-u@PCIFN/PCIFN (0)->
932    error.io.pci.retry-to-u@PCIFN/PCIFN;
933
934prop error.io.pci.dpdata-dr-u@PCIFN/PCIFN (3)->
935    ereport.io.pci.sec-dpe@PCIFN,
936    ereport.io.pci.sec-mdpe@PCIFN,
937    error.io.pci.dpdata-dr-u@PCIFN;
938
939/*
940 * Request with data parity error can propagate downstream. A hardened
941 * leaf driver should handle the error, but may or may not be able to
942 * avoid service impact. We handle to two cases separately. If there is
943 * service impact we will fail immediately, if not we will feed into a SERD
944 * engine.
945 *
946 * for PCI/X (but not PCI) the split write can optionally be forwarded across
947 * the bridge, maintaining bad parity/ecc
948 *
949 * if there is a dpe on a retry on a delayed write, we don't send another
950 * retry, and eventually the dto timer will expire
951 */
952prop error.io.pci.f-dpe-d@PCIFN (1)->
953    error.io.pci.dpdata-pw-d@PCIFN,
954    error.io.pci.dpdata-dw-d@PCIFN,
955    error.io.pci.dpdata-dr-d@PCIFN;
956
957prop error.io.pci.f-dpe-d@PCIFN (1)->
958    error.io.pci.f-source-dpdata-u@PCIFN;
959
960prop error.io.pci.deg-dpe-d@PCIFN (1)->
961    error.io.pci.dpdata-pw-d@PCIFN,
962    error.io.pci.dpdata-dw-d@PCIFN,
963    error.io.pci.dpdata-dr-d@PCIFN;
964
965prop error.io.pci.deg-dpe-d@PCIFN (1)->
966    error.io.pci.deg-source-dpdata-u@PCIFN;
967
968prop error.io.pci.nf-dpe-d@PCIFN (1)->
969    error.io.pci.dpdata-pw-d@PCIFN,
970    error.io.pci.dpdata-dw-d@PCIFN,
971    error.io.pci.dpdata-dr-d@PCIFN;
972
973prop error.io.pci.nf-dpe-d@PCIFN (1)->
974    error.io.pci.nf-source-dpdata-u@PCIFN;
975
976prop error.io.pci.dpdata-pw-d@PCIFN (2)->
977    error.io.pci.perr-pw-u@PCIFN,
978    error.io.pci.dpdata-pw-fwd-d@PCIFN;
979
980prop error.io.pci.dpdata-pw-fwd-d@PCIFN { IS_LEAF } (1)->
981    error.io.pci.source-perr-u@PCIFN;
982
983prop error.io.pci.dpdata-pw-fwd-d@PCIFN { IS_LEAF } (0)->
984    ereport.io.pci.dpe@PCIFN;
985
986prop error.io.pci.dpdata-pw-fwd-d@PCIFN { IS_BDG } (2)->
987    ereport.io.pci.dpe@PCIFN,
988    ereport.io.pci.sec-mdpe@PCIFN;
989
990prop error.io.pci.dpdata-pw-fwd-d@PCIFN (1)->
991    error.io.pci.dpdata-pw-fwd-d@PCIFN/PCIFNHZ;
992
993prop error.io.pci.dpdata-dw-d@PCIFN (3)->
994    error.io.pci.perr-dw-u@PCIFN,
995    error.io.pci.target-mdpe-d@PCIFN,
996    error.io.pci.dpdata-dw-fwd-d@PCIFN;
997
998prop error.io.pci.dpdata-dw-d@PCIFN { IS_BDG } (1)->
999    ereport.io.pci.dpe@PCIFN;
1000
1001prop error.io.pci.dpdata-dw-d@PCIFN { IS_BDG } (0)->
1002    error.io.pci.retry-to-d@PCIFN;
1003
1004prop error.io.pci.dpdata-dw-fwd-d@PCIFN { IS_LEAF } (1)->
1005    error.io.pci.source-perr-u@PCIFN;
1006
1007prop error.io.pci.dpdata-dw-fwd-d@PCIFN { IS_LEAF } (0)->
1008    ereport.io.pci.dpe@PCIFN;
1009
1010prop error.io.pci.dpdata-dw-fwd-d@PCIFN { IS_BDG } (0)->
1011    ereport.io.pci.dpe@PCIFN,
1012    ereport.io.pci.sec-mdpe@PCIFN;
1013
1014prop error.io.pci.dpdata-dw-fwd-d@PCIFN (0)->
1015    error.io.pci.dpdata-dw-fwd-d@PCIFN/PCIFNHZ;
1016
1017prop error.io.pci.dpdata-dr-d@PCIFN (2)->
1018    error.io.pci.dpdata-dr-fwd-d@PCIFN,
1019    error.io.pci.perr-dr-u@PCIFN;
1020
1021prop error.io.pci.dpdata-dr-fwd-d@PCIFN { IS_LEAF } (1)->
1022    error.io.pci.source-perr-u@PCIFN;
1023
1024prop error.io.pci.dpdata-dr-fwd-d@PCIFN { IS_LEAF } (0)->
1025    ereport.io.pci.dpe@PCIFN,
1026    ereport.io.pci.mdpe@PCIFN;
1027
1028prop error.io.pci.dpdata-dr-fwd-d@PCIFN { IS_BDG } (2)->
1029    ereport.io.pci.dpe@PCIFN,
1030    ereport.io.pci.mdpe@PCIFN;
1031
1032prop error.io.pci.dpdata-dr-fwd-d@PCIFN (1)->
1033    error.io.pci.dpdata-dr-fwd-d@PCIFN/PCIFNHZ;
1034
1035/*
1036 * delayed read/write retry timeout can cause dto at a bridge
1037 */
1038prop error.io.pci.retry-to-u@PCIFN/PCIFN (0)->
1039    error.io.pci.retry-to-u@PCIFN;
1040
1041prop error.io.pci.retry-to-u@PCIFN/PCIFN (1)->
1042    ereport.io.pci.dto@PCIFN;
1043
1044prop error.io.pci.retry-to-u@PCIFN/PCIFN (0)->
1045    error.io.pci.serr-u@PCIFN;
1046
1047prop error.io.pci.retry-to-d@PCIFN (0)->
1048    error.io.pci.retry-to-d@PCIFN/PCIFN;
1049
1050prop error.io.pci.retry-to-d@PCIFN { IS_BDG } (1)->
1051    ereport.io.pci.dto@PCIFN;
1052
1053prop error.io.pci.retry-to-d@PCIFN { IS_BDG } (0)->
1054    error.io.pci.serr-u@PCIFN;
1055
1056/*
1057 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1058 * source- propagations.
1059 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1060 */
1061event error.io.pci.source-ape-u@PCIFN/PCIFN;
1062event error.io.pcix.source-scpe-u@PCIFN/PCIFN;
1063
1064prop error.io.pci.source-ape-u@PCIFN (1)->
1065    error.io.pci.source-ape-u@PCIFN/PCIFNHZ;
1066
1067prop error.io.pcix.source-scpe-u@PCIFN (1)->
1068    error.io.pcix.source-scpe-u@PCIFN/PCIFNHZ;
1069
1070/*
1071 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1072 * Handling of leaf driver detected internal errors. Use serd engine if
1073 * no service impact - otherwise fail immediately
1074 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1075 */
1076event ereport.io.device.inval_state@PCIFN{within(5s)};
1077event ereport.io.device.no_response@PCIFN{within(5s)};
1078event ereport.io.device.stall@PCIFN{within(5s)};
1079event ereport.io.device.badint_limit@PCIFN{within(5s)};
1080event ereport.io.device.intern_corr@PCIFN{within(5s)};
1081event ereport.io.device.intern_uncorr@PCIFN{within(5s)};
1082
1083prop error.io.service.restored@PCIFN { IS_LEAF } (1)->
1084    ereport.io.service.lost@PCIFN,
1085    ereport.io.service.degraded@PCIFN;
1086
1087prop error.io.service.restored@PCIFN { IS_LEAF } (1)->
1088    ereport.io.service.restored@PCIFN;
1089
1090prop error.io.device.f-device@PCIFN { IS_LEAF } (1)->
1091    ereport.io.device.inval_state@PCIFN,
1092    ereport.io.device.no_response@PCIFN,
1093    ereport.io.device.stall@PCIFN,
1094    ereport.io.device.badint_limit@PCIFN,
1095    ereport.io.device.intern_corr@PCIFN,
1096    ereport.io.device.intern_uncorr@PCIFN;
1097
1098prop error.io.device.f-device@PCIFN { IS_LEAF } (1)->
1099    ereport.io.service.lost@PCIFN;
1100
1101prop error.io.device.deg-device@PCIFN { IS_LEAF } (1)->
1102    ereport.io.device.inval_state@PCIFN,
1103    ereport.io.device.no_response@PCIFN,
1104    ereport.io.device.stall@PCIFN,
1105    ereport.io.device.badint_limit@PCIFN,
1106    ereport.io.device.intern_corr@PCIFN,
1107    ereport.io.device.intern_uncorr@PCIFN;
1108
1109prop error.io.device.deg-device@PCIFN { IS_LEAF } (1)->
1110    ereport.io.service.degraded@PCIFN;
1111
1112prop error.io.device.nf-device@PCIFN { IS_LEAF } (1)->
1113    ereport.io.device.inval_state@PCIFN,
1114    ereport.io.device.no_response@PCIFN,
1115    ereport.io.device.stall@PCIFN,
1116    ereport.io.device.badint_limit@PCIFN,
1117    ereport.io.device.intern_corr@PCIFN,
1118    ereport.io.device.intern_uncorr@PCIFN;
1119
1120prop error.io.device.nf-device@PCIFN { IS_LEAF } (1)->
1121    ereport.io.service.unaffected@PCIFN,
1122    error.io.service.restored@PCIFN;
1123
1124/*
1125 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1126 * stub unused ereports
1127 * - ignore rx-spl as we can't tell what message it was (and we should have
1128 *   diagnosed the problem anyway from standard pci ereports)
1129 * - ignore sec-spl-or/sec-spl-dly as these aren't really faults (tuning info)
1130 * - ignore unex-spl/sec-unex-spl
1131 * - ignore ecc.ue ereports (we get everything we need from dpe/mdpe)
1132 * - ignore ecc.ce ereports for now (could do serd on these)
1133 * - ignore nr ereport
1134 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1135 */
1136
1137event ereport.io.pci.nr@PCIFN{within(5s)};
1138event ereport.io.pcix.unex-spl@PCIFN{within(5s)};
1139event ereport.io.pcix.rx-spl@PCIFN{within(5s)};
1140event ereport.io.pcix.sec-unex-spl@PCIFN{within(5s)};
1141event ereport.io.pcix.sec-spl-or@PCIFN{within(5s)};
1142event ereport.io.pcix.sec-spl-dly@PCIFN{within(5s)};
1143event ereport.io.pcix.ecc.ce-addr@PCIFN{within(5s)};
1144event ereport.io.pcix.ecc.ce-attr@PCIFN{within(5s)};
1145event ereport.io.pcix.ecc.ce-data@PCIFN{within(5s)};
1146event ereport.io.pcix.ecc.ue-addr@PCIFN{within(5s)};
1147event ereport.io.pcix.ecc.ue-attr@PCIFN{within(5s)};
1148event ereport.io.pcix.ecc.ue-data@PCIFN{within(5s)};
1149event ereport.io.pcix.s-ce@PCIFN{within(5s)};
1150event ereport.io.pcix.s-ue@PCIFN{within(5s)};
1151event ereport.io.pcix.sec-ecc.ce-addr@PCIFN{within(5s)};
1152event ereport.io.pcix.sec-ecc.ce-attr@PCIFN{within(5s)};
1153event ereport.io.pcix.sec-ecc.ce-data@PCIFN{within(5s)};
1154event ereport.io.pcix.sec-ecc.ue-addr@PCIFN{within(5s)};
1155event ereport.io.pcix.sec-ecc.ue-attr@PCIFN{within(5s)};
1156event ereport.io.pcix.sec-ecc.ue-data@PCIFN{within(5s)};
1157event ereport.io.pcix.sec-s-ce@PCIFN{within(5s)};
1158event ereport.io.pcix.sec-s-ue@PCIFN{within(5s)};
1159
1160event upset.io.pcix.discard@PCIFN;
1161
1162prop upset.io.pcix.discard@PCIFN (1)->
1163    ereport.io.pci.nr@PCIFN,
1164    ereport.io.pcix.rx-spl@PCIFN,
1165    ereport.io.pcix.unex-spl@PCIFN,
1166    ereport.io.pcix.sec-unex-spl@PCIFN,
1167    ereport.io.pcix.sec-spl-or@PCIFN,
1168    ereport.io.pcix.sec-spl-dly@PCIFN,
1169    ereport.io.pcix.ecc.ce-addr@PCIFN,
1170    ereport.io.pcix.ecc.ce-attr@PCIFN,
1171    ereport.io.pcix.ecc.ce-data@PCIFN,
1172    ereport.io.pcix.ecc.ue-addr@PCIFN,
1173    ereport.io.pcix.ecc.ue-attr@PCIFN,
1174    ereport.io.pcix.ecc.ue-data@PCIFN,
1175    ereport.io.pcix.s-ce@PCIFN,
1176    ereport.io.pcix.s-ue@PCIFN,
1177    ereport.io.pcix.sec-ecc.ce-addr@PCIFN,
1178    ereport.io.pcix.sec-ecc.ce-attr@PCIFN,
1179    ereport.io.pcix.sec-ecc.ce-data@PCIFN,
1180    ereport.io.pcix.sec-ecc.ue-addr@PCIFN,
1181    ereport.io.pcix.sec-ecc.ue-attr@PCIFN,
1182    ereport.io.pcix.sec-ecc.ue-data@PCIFN,
1183    ereport.io.pcix.sec-s-ce@PCIFN,
1184    ereport.io.pcix.sec-s-ue@PCIFN;
1185