xref: /titanic_50/usr/src/cmd/fm/eversholt/files/common/pciexrc.esc (revision 4f764f916501bcb9d3233dc547db1928fc2f22ac)
14df55fdeSJanie Lu/*
24df55fdeSJanie Lu * CDDL HEADER START
34df55fdeSJanie Lu *
44df55fdeSJanie Lu * The contents of this file are subject to the terms of the
54df55fdeSJanie Lu * Common Development and Distribution License (the "License").
64df55fdeSJanie Lu * You may not use this file except in compliance with the License.
74df55fdeSJanie Lu *
84df55fdeSJanie Lu * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
94df55fdeSJanie Lu * or http://www.opensolaris.org/os/licensing.
104df55fdeSJanie Lu * See the License for the specific language governing permissions
114df55fdeSJanie Lu * and limitations under the License.
124df55fdeSJanie Lu *
134df55fdeSJanie Lu * When distributing Covered Code, include this CDDL HEADER in each
144df55fdeSJanie Lu * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
154df55fdeSJanie Lu * If applicable, add the following below this CDDL HEADER, with the
164df55fdeSJanie Lu * fields enclosed by brackets "[]" replaced with your own identifying
174df55fdeSJanie Lu * information: Portions Copyright [yyyy] [name of copyright owner]
184df55fdeSJanie Lu *
194df55fdeSJanie Lu * CDDL HEADER END
204df55fdeSJanie Lu */
214df55fdeSJanie Lu/*
22*4f764f91SCheng Sean Ye * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
234df55fdeSJanie Lu */
244df55fdeSJanie Lu
254df55fdeSJanie Lu#pragma dictionary "PCIEX"
264df55fdeSJanie Lu
274df55fdeSJanie Lu#include <px_err.h>
284df55fdeSJanie Lu
294df55fdeSJanie Lu/*
304df55fdeSJanie Lu * generic root complex/root port diagnosis rules
314df55fdeSJanie Lu */
324df55fdeSJanie Lu
334df55fdeSJanie Lu#define	PCIEXFN		pciexbus/pciexdev/pciexfn
344df55fdeSJanie Lu#define	PCIEXFNHZ	pciexbus<>/pciexdev<>/pciexfn<>
354df55fdeSJanie Lu
364df55fdeSJanie Lu#define RC_N    5
374df55fdeSJanie Lu#define RC_T    72h
384df55fdeSJanie Lu
394df55fdeSJanie Lu#define SW_FIT    5000
404df55fdeSJanie Lu#define FW_FIT    5000
414df55fdeSJanie Lu#define HB_FIT    400
424df55fdeSJanie Lu
434df55fdeSJanie Lu#define EPKT_DESC       (payloadprop("desc") >> 12)
444df55fdeSJanie Lu#define EPKT_B_BIT      (payloadprop("desc") & (1 << 7))
454df55fdeSJanie Lu#define EPKT_C_BIT      (payloadprop("desc") & (1 << 5))
464df55fdeSJanie Lu#define EPKT_H_BIT      (payloadprop("desc") & (1 << 4))
474df55fdeSJanie Lu
484df55fdeSJanie Lu#define MATCHES_DESC(b, o, p, c, d) \
494df55fdeSJanie Lu    (EPKT_DESC == (b << 16 | o << 12 | p << 8 | c << 4 | d))
504df55fdeSJanie Lu
514df55fdeSJanie Lu#define IS_CE (EPKT_C_BIT != 0 && setserdsuffix(EPKT_DESC))
524df55fdeSJanie Lu#define IS_UE (EPKT_C_BIT == 0)
53*4f764f91SCheng Sean Ye
54*4f764f91SCheng Sean Ye/*
55*4f764f91SCheng Sean Ye * BLOCK bit set means the error may cause a pipe stall and thus a CTO
56*4f764f91SCheng Sean Ye * in the fabric
57*4f764f91SCheng Sean Ye */
584df55fdeSJanie Lu#define IS_BLOCKED (EPKT_B_BIT != 0)
594df55fdeSJanie Lu
604df55fdeSJanie Lu#define EPKT(b, o, p, c, d) \
614df55fdeSJanie Lu    ereport.io.pciex.rc.epkt@hostbridge { MATCHES_DESC(b, o, p, c, d) }
624df55fdeSJanie Lu
63*4f764f91SCheng Sean Ye/* Errors that will be diagnosed by the fabric DE (pciex.esc) */
64*4f764f91SCheng Sean Ye#define	DIAG_BY_FAB \
65*4f764f91SCheng Sean Ye	(MATCHES_DESC(BLOCK_INTR,OP_MSI32,PH_DATA,CND_ILL,DIR_IRR) ||	\
66*4f764f91SCheng Sean Ye	MATCHES_DESC(BLOCK_PORT,OP_LINK,PH_FC,CND_TO,DIR_IRR) ||	\
67*4f764f91SCheng Sean Ye	MATCHES_DESC(BLOCK_PORT,OP_PIO,PH_IRR,CND_INV,DIR_RDWR) ||	\
68*4f764f91SCheng Sean Ye	MATCHES_DESC(BLOCK_PORT,OP_PIO,PH_IRR,CND_RCA,DIR_WRITE) ||	\
69*4f764f91SCheng Sean Ye	MATCHES_DESC(BLOCK_PORT,OP_PIO,PH_IRR,CND_RUR,DIR_WRITE) ||	\
70*4f764f91SCheng Sean Ye	MATCHES_DESC(BLOCK_PORT,OP_PIO,PH_IRR,CND_TO,DIR_READ) ||	\
71*4f764f91SCheng Sean Ye	MATCHES_DESC(BLOCK_PORT,OP_PIO,PH_IRR,CND_TO,DIR_WRITE) ||	\
72*4f764f91SCheng Sean Ye	MATCHES_DESC(BLOCK_PORT,OP_PIO,PH_IRR,CND_UC,DIR_IRR))
73*4f764f91SCheng Sean Ye
744df55fdeSJanie Lu/* Ereport Events */
754df55fdeSJanie Luevent ereport.io.pciex.rc.epkt@hostbridge {within(5s)};
764df55fdeSJanie Lu
774df55fdeSJanie Lu/* Internal Events */
784df55fdeSJanie Luevent error.io.pciex.rc.stall@hostbridge;
794df55fdeSJanie Luevent error.io.pciex.rc.poiscomp@hostbridge;
804df55fdeSJanie Luevent error.io.pciex.nr-d@hostbridge/pciexrc/PCIEXFN;
814df55fdeSJanie Luevent error.io.pciex.badreq-u@hostbridge/pciexrc/PCIEXFN;
824df55fdeSJanie Luevent error.io.pciex.poiscomp-d@hostbridge/pciexrc/PCIEXFN;
834df55fdeSJanie Luevent error.io.pciex.noimpact-d@hostbridge/pciexrc/PCIEXFN;
844df55fdeSJanie Luevent error.io.pciex.lost-d@hostbridge/pciexrc/PCIEXFN;
854df55fdeSJanie Luevent error.io.pciex.degraded-d@hostbridge/pciexrc/PCIEXFN;
864df55fdeSJanie Lu
874df55fdeSJanie Lu/* Upset event */
88*4f764f91SCheng Sean Yeevent upset.io.pciex.rc.stall@hostbridge;
894df55fdeSJanie Luevent upset.io.pciex.rc.discard@hostbridge;
904df55fdeSJanie Lu
914df55fdeSJanie Lu/*
924df55fdeSJanie Lu * Fault Events
934df55fdeSJanie Lu * Do no retire and FRUs for SW/FW faults
944df55fdeSJanie Lu */
954df55fdeSJanie Luevent fault.io.pciex.rc.generic-ue@hostbridge,
964df55fdeSJanie Lu    FITrate=HB_FIT, retire=0, response=0;
974df55fdeSJanie Luevent fault.io.pciex.rc.generic-sw@hostbridge,
984df55fdeSJanie Lu    FITrate=SW_FIT, retire=0, response=0;
994df55fdeSJanie Luevent fault.io.pciex.rc.generic-fw@hostbridge,
1004df55fdeSJanie Lu    FITrate=FW_FIT, retire=0, response=0;
1014df55fdeSJanie Lu
1024df55fdeSJanie Lu/* Serd engine for CE errors */
1034df55fdeSJanie Luengine serd.io.pciex.rc.generic-ce@hostbridge, N=RC_N, T=RC_T;
1044df55fdeSJanie Luevent fault.io.pciex.rc.generic-ce@hostbridge, FITrate=HB_FIT,
1054df55fdeSJanie Lu    engine=serd.io.pciex.rc.generic-ce@hostbridge;
1064df55fdeSJanie Lu
1074df55fdeSJanie Lu/* Fire faults */
1084df55fdeSJanie Luevent fault.io.fire.pciex.device@PCIEXFN, FITrate=1000;
1094df55fdeSJanie Luevent fault.io.fire.pci.device@pcibus/pcidev/pcifn, FITrate=1000;
1104df55fdeSJanie Lu
1114df55fdeSJanie Lu/* Generic Root Complex Software faults */
1124df55fdeSJanie Luprop fault.io.pciex.rc.generic-sw@hostbridge ->
1134df55fdeSJanie Lu    ereport.io.pciex.rc.epkt@hostbridge {
1144df55fdeSJanie Lu	MATCHES_DESC(BLOCK_INTR,OP_FIXED,PH_UNKNOWN,CND_ILL,DIR_INGRESS)  ||
1154df55fdeSJanie Lu	MATCHES_DESC(BLOCK_INTR,OP_MSI32,PH_UNKNOWN,CND_ILL,DIR_IRR)  ||
1164df55fdeSJanie Lu	MATCHES_DESC(BLOCK_INTR,OP_PCIEMSG,PH_UNKNOWN,CND_ILL,DIR_INGRESS)
1174df55fdeSJanie Lu    };
1184df55fdeSJanie Lu
1194df55fdeSJanie Lu/* Generic Root Complex Firmware faults */
1204df55fdeSJanie Luprop fault.io.pciex.rc.generic-fw@hostbridge ->
1214df55fdeSJanie Lu    ereport.io.pciex.rc.epkt@hostbridge {
1224df55fdeSJanie Lu	MATCHES_DESC(BLOCK_HOSTBUS,OP_PIO,PH_ADDR,CND_UNMAP,DIR_WRITE)
1234df55fdeSJanie Lu    };
1244df55fdeSJanie Lu
1254df55fdeSJanie Lu/* Generic Root Complex CE faults */
1264df55fdeSJanie Luprop fault.io.pciex.rc.generic-ce@hostbridge { IS_CE } ->
1274df55fdeSJanie Lu    ereport.io.pciex.rc.epkt@hostbridge;
1284df55fdeSJanie Lu
1294df55fdeSJanie Lu/* Generic Root Complex UE faults from propagations */
1304df55fdeSJanie Luevent error.io.pciex.rc.generic-ue1@hostbridge;
1314df55fdeSJanie Luevent error.io.pciex.rc.generic-ue2@hostbridge;
1324df55fdeSJanie Lu
1334df55fdeSJanie Luprop fault.io.pciex.rc.generic-ue@hostbridge ->
1344df55fdeSJanie Lu    error.io.pciex.rc.generic-ue1@hostbridge,
1354df55fdeSJanie Lu    error.io.pciex.rc.generic-ue2@hostbridge,
1364df55fdeSJanie Lu    error.io.pciex.rc.stall@hostbridge,
1374df55fdeSJanie Lu    error.io.pciex.rc.poiscomp@hostbridge;
1384df55fdeSJanie Lu
1394df55fdeSJanie Lu/* Generic Root Complex UE propagations */
1404df55fdeSJanie Luprop error.io.pciex.rc.generic-ue1@hostbridge { IS_UE && !IS_BLOCKED } ->
1414df55fdeSJanie Lu    ereport.io.pciex.rc.epkt@hostbridge {
1424df55fdeSJanie Lu	MATCHES_DESC(BLOCK_HOSTBUS,OP_DMA,PH_DATA,CND_INT,DIR_READ) ||
1434df55fdeSJanie Lu	MATCHES_DESC(BLOCK_HOSTBUS,OP_DMA,PH_DATA,CND_INT,DIR_UNKNOWN) ||
1444df55fdeSJanie Lu	MATCHES_DESC(BLOCK_HOSTBUS,OP_DMA,PH_DATA,CND_INT,DIR_WRITE) ||
1454df55fdeSJanie Lu	MATCHES_DESC(BLOCK_HOSTBUS,OP_DMA,PH_DATA,CND_TO,DIR_READ) ||
1464df55fdeSJanie Lu	MATCHES_DESC(BLOCK_HOSTBUS,OP_DMA,PH_DATA,CND_TO,DIR_WRITE) ||
1474df55fdeSJanie Lu	MATCHES_DESC(BLOCK_HOSTBUS,OP_PIO,PH_DATA,CND_INT,DIR_UNKNOWN) ||
1484df55fdeSJanie Lu	MATCHES_DESC(BLOCK_HOSTBUS,OP_UNKNOWN,PH_DATA,CND_INT,DIR_UNKNOWN) ||
1494df55fdeSJanie Lu	MATCHES_DESC(BLOCK_HOSTBUS,OP_UNKNOWN,PH_DATA,CND_INT,DIR_UNKNOWN) ||
1504df55fdeSJanie Lu	MATCHES_DESC(BLOCK_INTR,OP_MSI32,PH_DATA,CND_INT,DIR_UNKNOWN) ||
1514df55fdeSJanie Lu	MATCHES_DESC(BLOCK_INTR,OP_MSIQ,PH_DATA,CND_INT,DIR_UNKNOWN)
1524df55fdeSJanie Lu    };
1534df55fdeSJanie Lu
1544df55fdeSJanie Luprop error.io.pciex.rc.generic-ue2@hostbridge { IS_UE && !IS_BLOCKED } ->
1554df55fdeSJanie Lu    ereport.io.pciex.rc.epkt@hostbridge {
1564df55fdeSJanie Lu	MATCHES_DESC(BLOCK_MMU,OP_TBW,PH_ADDR,CND_UNKNOWN,DIR_UNKNOWN) ||
1574df55fdeSJanie Lu	MATCHES_DESC(BLOCK_MMU,OP_TBW,PH_ADDR,CND_UNMAP,DIR_UNKNOWN) ||
1584df55fdeSJanie Lu	MATCHES_DESC(BLOCK_MMU,OP_TBW,PH_DATA,CND_INT,DIR_IRR) ||
1594df55fdeSJanie Lu	MATCHES_DESC(BLOCK_MMU,OP_TBW,PH_UNKNOWN,CND_UNKNOWN,DIR_UNKNOWN) ||
1604df55fdeSJanie Lu	MATCHES_DESC(BLOCK_MMU,OP_XLAT,PH_DATA,CND_INT,DIR_UNKNOWN) ||
1614df55fdeSJanie Lu	MATCHES_DESC(BLOCK_PORT,OP_DMA,PH_DATA,CND_INT,DIR_READ) ||
1624df55fdeSJanie Lu	MATCHES_DESC(BLOCK_PORT,OP_PIO,PH_DATA,CND_INT,DIR_READ) ||
1634df55fdeSJanie Lu	MATCHES_DESC(BLOCK_PORT,OP_PIO,PH_DATA,CND_INT,DIR_UNKNOWN) ||
1644df55fdeSJanie Lu	MATCHES_DESC(BLOCK_PORT,OP_UNKNOWN,PH_DATA,CND_INT,DIR_UNKNOWN) ||
1654df55fdeSJanie Lu	MATCHES_DESC(BLOCK_PORT,OP_UNKNOWN,PH_DATA,CND_INT,DIR_UNKNOWN)
1664df55fdeSJanie Lu    };
1674df55fdeSJanie Lu
1684df55fdeSJanie Lu/* Errors that will cause a pipe stall and thus a CTO in the fabric */
1694df55fdeSJanie Luprop error.io.pciex.rc.stall@hostbridge (0) ->
1704df55fdeSJanie Lu    error.io.pciex.nr-d@hostbridge/pciexrc<>/PCIEXFNHZ;
1714df55fdeSJanie Luprop error.io.pciex.rc.stall@hostbridge { IS_UE && IS_BLOCKED } ->
172*4f764f91SCheng Sean Ye    ereport.io.pciex.rc.epkt@hostbridge { !DIAG_BY_FAB };
1734df55fdeSJanie Lu
1744df55fdeSJanie Lu/*
1754df55fdeSJanie Lu * Errors that will send a poisoned data to the fabric
1764df55fdeSJanie Lu * Also the poiscomp-d could represent a fault that a hardened driver
1774df55fdeSJanie Lu * handled and reported a service impact.
1784df55fdeSJanie Lu */
1794df55fdeSJanie Luprop error.io.pciex.rc.poiscomp@hostbridge (0) ->
1804df55fdeSJanie Lu    error.io.pciex.poiscomp-d@hostbridge/pciexrc<>/PCIEXFNHZ,
1814df55fdeSJanie Lu    error.io.pciex.noimpact-d@hostbridge/pciexrc<>/PCIEXFNHZ,
1824df55fdeSJanie Lu    error.io.pciex.lost-d@hostbridge/pciexrc<>/PCIEXFNHZ,
1834df55fdeSJanie Lu    error.io.pciex.degraded-d@hostbridge/pciexrc<>/PCIEXFNHZ;
1844df55fdeSJanie Lu
1854df55fdeSJanie Luprop error.io.pciex.rc.poiscomp@hostbridge { IS_UE && !IS_BLOCKED } ->
1864df55fdeSJanie Lu    ereport.io.pciex.rc.epkt@hostbridge {
1874df55fdeSJanie Lu	MATCHES_DESC(BLOCK_HOSTBUS,OP_DMA,PH_DATA,CND_INT,DIR_READ)
1884df55fdeSJanie Lu    };
1894df55fdeSJanie Lu
1904df55fdeSJanie Luprop error.io.pciex.badreq-u@hostbridge/pciexrc/PCIEXFN { IS_UE && !IS_BLOCKED } (0) ->
1914df55fdeSJanie Lu    ereport.io.pciex.rc.epkt@hostbridge {
1924df55fdeSJanie Lu	MATCHES_DESC(BLOCK_MMU,OP_XLAT,PH_ADDR,CND_UNMAP,DIR_RDWR) ||
1934df55fdeSJanie Lu	MATCHES_DESC(BLOCK_MMU,OP_XLAT,PH_DATA,CND_INV,DIR_RDWR) ||
1944df55fdeSJanie Lu	MATCHES_DESC(BLOCK_MMU,OP_XLAT,PH_DATA,CND_PROT,DIR_RDWR)
1954df55fdeSJanie Lu    };
1964df55fdeSJanie Lu
197*4f764f91SCheng Sean Ye/*
198*4f764f91SCheng Sean Ye * The errors will be diagnosed by pciex.esc but may also cause a CTO
199*4f764f91SCheng Sean Ye * in the fabric.
200*4f764f91SCheng Sean Ye */
201*4f764f91SCheng Sean Yeprop upset.io.pciex.rc.stall@hostbridge ->
202*4f764f91SCheng Sean Ye    ereport.io.pciex.rc.epkt@hostbridge { IS_BLOCKED && DIAG_BY_FAB };
203*4f764f91SCheng Sean Yeprop upset.io.pciex.rc.stall@hostbridge (0) ->
204*4f764f91SCheng Sean Ye    error.io.pciex.nr-d@hostbridge/pciexrc<>/PCIEXFNHZ;
205*4f764f91SCheng Sean Ye
206*4f764f91SCheng Sean Ye/* The errors will be discarded here and diagnosed by pciex.esc. */
2074df55fdeSJanie Luprop upset.io.pciex.rc.discard@hostbridge ->
208*4f764f91SCheng Sean Ye    ereport.io.pciex.rc.epkt@hostbridge { !IS_BLOCKED && DIAG_BY_FAB };
2094df55fdeSJanie Lu
2104df55fdeSJanie Lu/* Event queue overflow */
2114df55fdeSJanie Lu#define PROP_PLAT_FRU "FRU"
2124df55fdeSJanie Lu#define GET_HB_FRU (confprop(asru(hostbridge), PROP_PLAT_FRU))
2134df55fdeSJanie Lu#define GET_PCIE_FRU (confprop(asru(pciexbus[b]/pciexdev[d]/pciexfn[0]), PROP_PLAT_FRU))
2144df55fdeSJanie Lu#define GET_PCI_FRU (confprop(asru(pcibus[b]/pcidev[d]/pcifn[0]), PROP_PLAT_FRU))
2154df55fdeSJanie Lu
2164df55fdeSJanie Luprop fault.io.fire.pciex.device@pciexbus[b]/pciexdev[d]/pciexfn[0]
2174df55fdeSJanie Lu    {
2184df55fdeSJanie Lu        /*
2194df55fdeSJanie Lu         * Indict PCI-E FRU(s) under this root complex excluding the
2204df55fdeSJanie Lu         * one that the Fire ASIC resides on.
2214df55fdeSJanie Lu         */
2224df55fdeSJanie Lu        is_under(hostbridge, pciexbus[b]/pciexdev[d]/pciexfn[0]) &&
2234df55fdeSJanie Lu	(GET_HB_FRU != GET_PCIE_FRU)
2244df55fdeSJanie Lu    } (0) -> EPKT(BLOCK_INTR,OP_MSIQ,PH_UNKNOWN,CND_OV,DIR_IRR);
2254df55fdeSJanie Lu
2264df55fdeSJanie Luprop fault.io.fire.pci.device@pcibus[b]/pcidev[d]/pcifn[0]
2274df55fdeSJanie Lu    {
2284df55fdeSJanie Lu        /*
2294df55fdeSJanie Lu         * Indict PCI FRU(s) under this root complex excluding the
2304df55fdeSJanie Lu         * one that the Fire ASIC resides on.
2314df55fdeSJanie Lu         */
2324df55fdeSJanie Lu        is_under(hostbridge, pcibus[b]/pcidev[d]/pcifn[0]) &&
2334df55fdeSJanie Lu	    (GET_HB_FRU != GET_PCI_FRU)
2344df55fdeSJanie Lu    } (0) -> EPKT(BLOCK_INTR,OP_MSIQ,PH_UNKNOWN,CND_OV,DIR_IRR);
235