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