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