diff options
author | stephh <none@none> | 2008-07-28 05:43:22 -0700 |
---|---|---|
committer | stephh <none@none> | 2008-07-28 05:43:22 -0700 |
commit | b7d3956b92a285d8dac2c7f5f7e28d2ef5347ef8 (patch) | |
tree | 7741d4247f333ca51817e9777529466d15eb336c | |
parent | c87e4823c145fdfa6fdb9253e65cc73b13830ec9 (diff) | |
download | illumos-gate-b7d3956b92a285d8dac2c7f5f7e28d2ef5347ef8.tar.gz |
6180027 umatched list entry elides entire prop statement, rather than producing shorter list
6559372 can simplify pci.esc and pciex.esc rules now that is_under works corrently
6610980 get ereport.fm.fmd.asru_fmri replaying a fault who's asru is in fmd scheme
6639248 RFE: Eversholt should allow dynamic SERD engine names
6639255 RFE: Eversholt should allow bumping SERD by an arbitrary value
6663677 can sometimes fail to retire asrus if resource-to-asru mapping changes over reboot
6663874 all scheme nvl2str functionality should be moved into topo_fmri_nvl2str()
6672125 fmd should fill in asru/fru in a fault event from topo if not supplied by the DE
6690744 remove need for spurious asru() or fru() function in confprop calls
6698777 eversholt needs easier-to-use serd engine handling
6698783 could have default valuse for FITrate and method in eversholt
6712783 should have separate faults where there is no service impact or impact is degraded rather than lost
6714865 add retire=0 and response=0 flags to faults
63 files changed, 3989 insertions, 4434 deletions
diff --git a/usr/src/cmd/fm/dicts/PCI.dict b/usr/src/cmd/fm/dicts/PCI.dict index 366692114b..5dc6f01380 100644 --- a/usr/src/cmd/fm/dicts/PCI.dict +++ b/usr/src/cmd/fm/dicts/PCI.dict @@ -1,5 +1,5 @@ # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # CDDL HEADER START @@ -40,3 +40,7 @@ fault.io.pci.bus-linkerr fault.io.pci.device-interr=8 fault.io.pci.device-invreq fault.io.pci.device-noresp=9 fault.io.pci.device-interr fault.io.pci.device-invreq=10 fault.io.pci.device-noresp=11 +fault.io.pci.bus-linkerr-unaf fault.io.pci.device-interr-unaf=12 +fault.io.pci.device-interr-corr=13 +fault.io.pci.bus-linkerr-deg fault.io.pci.device-interr-deg=14 +fault.io.pci.device-interr-deg=15 diff --git a/usr/src/cmd/fm/dicts/PCI.po b/usr/src/cmd/fm/dicts/PCI.po index 0adaffcbf3..42ecf7d38d 100644 --- a/usr/src/cmd/fm/dicts/PCI.po +++ b/usr/src/cmd/fm/dicts/PCI.po @@ -1,5 +1,5 @@ # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # CDDL HEADER START @@ -146,13 +146,13 @@ msgstr "Fault" msgid "PCI-8000-7J.severity" msgstr "Critical" msgid "PCI-8000-7J.description" -msgstr "A problem was detected for a PCI device.\n Refer to %s for more information." +msgstr "An unrecoverable problem was detected for a PCI device.\n Refer to %s for more information." msgid "PCI-8000-7J.response" msgstr "One or more device instances may be disabled\n" msgid "PCI-8000-7J.impact" msgstr "Possible loss of services provided by the device instances associated with this fault\n" msgid "PCI-8000-7J.action" -msgstr "Schedule a repair procedure to replace the affected device. Use fmdump -v -u <EVENT_ID> to identify the device or contact Sun for support.\n" +msgstr "Schedule a repair procedure to replace the affected device. Use fmadm faulty to identify the device or contact Sun for support.\n" # # code: PCI-8000-8S # keys: fault.io.pci.bus-linkerr fault.io.pci.device-interr @@ -162,13 +162,13 @@ msgstr "Fault" msgid "PCI-8000-8S.severity" msgstr "Critical" msgid "PCI-8000-8S.description" -msgstr "A problem has been detected on the specified bus or on the specified transmitting device.\n Refer to %s for more information." +msgstr "An unrecoverable problem has been detected on the specified bus or on the specified transmitting device.\n Refer to %s for more information." msgid "PCI-8000-8S.response" msgstr "One or more device instances may be disabled\n" msgid "PCI-8000-8S.impact" msgstr "Possible loss of services provided by the device instances associated with this fault\n" msgid "PCI-8000-8S.action" -msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device. Use fmdump -v -u <EVENT_ID> to identify the device and bus or contact Sun for support.\n" +msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device. Use fmadm faulty to identify the device and bus or contact Sun for support.\n" # # code: PCI-8000-95 # keys: fault.io.pci.device-invreq fault.io.pci.device-noresp @@ -176,7 +176,7 @@ msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. msgid "PCI-8000-95.type" msgstr "Fault" msgid "PCI-8000-95.severity" -msgstr "Critical" +msgstr "Major" msgid "PCI-8000-95.description" msgstr "Either the transmitting device sent an invalid request or the receiving device failed to respond.\n Refer to %s for more information." msgid "PCI-8000-95.response" @@ -184,7 +184,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCI-8000-95.impact" msgstr "Possible loss of services provided by the device instances associated with this fault\n" msgid "PCI-8000-95.action" -msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCI-8000-AP # keys: fault.io.pci.device-interr fault.io.pci.device-invreq @@ -192,7 +192,7 @@ msgstr "Ensure that the latest drivers and patches are installed. If a plug-in c msgid "PCI-8000-AP.type" msgstr "Fault" msgid "PCI-8000-AP.severity" -msgstr "Critical" +msgstr "Major" msgid "PCI-8000-AP.description" msgstr "Either the transmitting device sent an invalid request or the receiving device is reporting an internal fault.\n Refer to %s for more information." msgid "PCI-8000-AP.response" @@ -200,7 +200,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCI-8000-AP.impact" msgstr "Possible loss of services provided by the device instances associated with this fault\n" msgid "PCI-8000-AP.action" -msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCI-8000-CA # keys: fault.io.pci.device-noresp @@ -208,7 +208,7 @@ msgstr "Ensure that the latest drivers and patches are installed. Otherwise sch msgid "PCI-8000-CA.type" msgstr "Fault" msgid "PCI-8000-CA.severity" -msgstr "Critical" +msgstr "Major" msgid "PCI-8000-CA.description" msgstr "A device is failing to respond\n Refer to %s for more information." msgid "PCI-8000-CA.response" @@ -216,4 +216,68 @@ msgstr "One or more device instances may be disabled\n" msgid "PCI-8000-CA.impact" msgstr "Possible loss of services provided by the device instances associated with this fault\n" msgid "PCI-8000-CA.action" -msgstr "Schedule a repair procedure to replace the affected device.\n\nUse fmdump -v -u <EVENT_ID> to identify the device or contact Sun for support.\n" +msgstr "Schedule a repair procedure to replace the affected device. Use fmadm faulty to identify the device or contact Sun for support.\n" +# +# code: PCI-8000-DH +# keys: fault.io.pci.bus-linkerr-unaf fault.io.pci.device-interr-unaf +# +msgid "PCI-8000-DH.type" +msgstr "Fault" +msgid "PCI-8000-DH.severity" +msgstr "Major" +msgid "PCI-8000-DH.description" +msgstr "Too many recovered bus faults have been detected, which indicates a problem with the specified bus or with the specified transmitting device. This may degrade into an unrecoverable fault.\n Refer to %s for more information." +msgid "PCI-8000-DH.response" +msgstr "One or more device instances may be disabled\n" +msgid "PCI-8000-DH.impact" +msgstr "Possible loss of services provided by the device instances associated with this fault\n" +msgid "PCI-8000-DH.action" +msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device. Use fmadm faulty to identify the device and bus or contact Sun for support.\n" +# +# code: PCI-8000-ED +# keys: fault.io.pci.device-interr-corr +# +msgid "PCI-8000-ED.type" +msgstr "Fault" +msgid "PCI-8000-ED.severity" +msgstr "Major" +msgid "PCI-8000-ED.description" +msgstr "Too many recovered internal faults have been detected within the specified PCI device. This may degrade into a non-recoverable fault.\n Refer to %s for more information." +msgid "PCI-8000-ED.response" +msgstr "One or more device instances may be disabled\n" +msgid "PCI-8000-ED.impact" +msgstr "Possible loss of services provided by the device instances associated with this fault\n" +msgid "PCI-8000-ED.action" +msgstr "Schedule a repair procedure to replace the affected device. Use fmadm faulty to identify the device or contact Sun for support.\n" +# +# code: PCI-8000-FY +# keys: fault.io.pci.bus-linkerr-deg fault.io.pci.device-interr-deg +# +msgid "PCI-8000-FY.type" +msgstr "Fault" +msgid "PCI-8000-FY.severity" +msgstr "Major" +msgid "PCI-8000-FY.description" +msgstr "An unrecoverable problem has been detected on the specified bus or on the specified transmitting device, which has resulted in that device running in a degraded state.\n Refer to %s for more information." +msgid "PCI-8000-FY.response" +msgstr "None\n" +msgid "PCI-8000-FY.impact" +msgstr "Degraded services provided by the device instances associated with this fault\n" +msgid "PCI-8000-FY.action" +msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device. Use fmadm faulty to identify the device and bus or contact Sun for support.\n" +# +# code: PCI-8000-G3 +# keys: fault.io.pci.device-interr-deg +# +msgid "PCI-8000-G3.type" +msgstr "Fault" +msgid "PCI-8000-G3.severity" +msgstr "Major" +msgid "PCI-8000-G3.description" +msgstr "An unrecoverable problem was detected for a PCI device, which has resulted in that device running in a degraded state.\n Refer to %s for more information." +msgid "PCI-8000-G3.response" +msgstr "None\n" +msgid "PCI-8000-G3.impact" +msgstr "Degraded services provided by the device instances associated with this fault\n" +msgid "PCI-8000-G3.action" +msgstr "Schedule a repair procedure to replace the affected device. Use fmadm faulty to identify the device or contact Sun for support.\n" diff --git a/usr/src/cmd/fm/dicts/PCIEX.dict b/usr/src/cmd/fm/dicts/PCIEX.dict index 2d8a68633f..21cc870ad8 100644 --- a/usr/src/cmd/fm/dicts/PCIEX.dict +++ b/usr/src/cmd/fm/dicts/PCIEX.dict @@ -1,5 +1,5 @@ # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # CDDL HEADER START @@ -45,3 +45,8 @@ fault.io.pciex.bus-linkerr fault.io.pciex.bus-noresp fault.io.pciex.device-inter fault.io.pciex.bus-linkerr fault.io.pciex.bus-noresp fault.io.pciex.device-interr fault.io.pciex.device-invreq fault.io.pciex.device-noresp=14 fault.io.pciex.bus-noresp fault.io.pciex.device-interr fault.io.pciex.device-invreq fault.io.pciex.device-noresp=15 fault.io.pciex.bus-noresp fault.io.pciex.device-interr=16 +fault.io.pciex.device-interr-corr=17 +fault.io.pciex.bus-linkerr-corr fault.io.pciex.device-interr-corr=18 +fault.io.pci.bus-linkerr-unaf fault.io.pciex.device-interr-unaf=19 +fault.io.pciex.device-interr-unaf=20 +fault.io.pciex.device-interr-deg=21 diff --git a/usr/src/cmd/fm/dicts/PCIEX.po b/usr/src/cmd/fm/dicts/PCIEX.po index 5d42cc40af..44e894e718 100644 --- a/usr/src/cmd/fm/dicts/PCIEX.po +++ b/usr/src/cmd/fm/dicts/PCIEX.po @@ -1,5 +1,5 @@ # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # CDDL HEADER START @@ -40,7 +40,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-0A.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-0A.action" -msgstr "Schedule a repair procedure to replace the affected device. Use fmdump -v -u <EVENT_ID> to identify the device or contact Sun for support.\n" +msgstr "Schedule a repair procedure to replace the affected device. Use fmadm faulty to identify the device or contact Sun for support.\n" # # code: PCIEX-8000-1P # keys: fault.io.pciex.device-interr fault.io.pciex.device-invreq @@ -48,7 +48,7 @@ msgstr "Schedule a repair procedure to replace the affected device. Use fmdump msgid "PCIEX-8000-1P.type" msgstr "Fault" msgid "PCIEX-8000-1P.severity" -msgstr "Critical" +msgstr "Major" msgid "PCIEX-8000-1P.description" msgstr "Either the transmitting device sent an invalid request or the receiving device is reporting an internal fault.\n Refer to %s for more information." msgid "PCIEX-8000-1P.response" @@ -56,7 +56,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-1P.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-1P.action" -msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCIEX-8000-25 # keys: fault.io.pciex.bus-noresp fault.io.pciex.device-noresp @@ -72,7 +72,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-25.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-25.action" -msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCIEX-8000-3S # keys: fault.io.pciex.bus-linkerr fault.io.pciex.device-interr @@ -88,7 +88,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-3S.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-3S.action" -msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCIEX-8000-43 # keys: fault.io.pci.bus-linkerr fault.io.pciex.device-interr @@ -104,7 +104,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-43.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-43.action" -msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device. Use fmdump -v -u <EVENT_ID> to identify the device and bus or contact Sun for support.\n" +msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device. Use fmadm faulty to identify the device and bus or contact Sun for support.\n" # # code: PCIEX-8000-5Y # keys: fault.io.pci.device-invreq @@ -112,7 +112,7 @@ msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. msgid "PCIEX-8000-5Y.type" msgstr "Fault" msgid "PCIEX-8000-5Y.severity" -msgstr "Critical" +msgstr "Major" msgid "PCIEX-8000-5Y.description" msgstr "The transmitting device sent an invalid request.\n Refer to %s for more information." msgid "PCIEX-8000-5Y.response" @@ -120,7 +120,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-5Y.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-5Y.action" -msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCIEX-8000-6D # keys: fault.io.pci.device-invreq fault.io.pciex.device-interr @@ -128,7 +128,7 @@ msgstr "Ensure that the latest drivers and patches are installed. Otherwise sche msgid "PCIEX-8000-6D.type" msgstr "Fault" msgid "PCIEX-8000-6D.severity" -msgstr "Critical" +msgstr "Major" msgid "PCIEX-8000-6D.description" msgstr "Either the transmitting device sent an invalid request or the receiving device is reporting an internal fault.\n Refer to %s for more information." msgid "PCIEX-8000-6D.response" @@ -136,7 +136,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-6D.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-6D.action" -msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCIEX-8000-7H # keys: fault.io.pci.device-interr fault.io.pciex.device-invreq @@ -144,7 +144,7 @@ msgstr "Ensure that the latest drivers and patches are installed. Otherwise sch msgid "PCIEX-8000-7H.type" msgstr "Fault" msgid "PCIEX-8000-7H.severity" -msgstr "Critical" +msgstr "Major" msgid "PCIEX-8000-7H.description" msgstr "Either the transmitting device sent an invalid request or the receiving device is reporting an internal fault.\n Refer to %s for more information." msgid "PCIEX-8000-7H.response" @@ -152,7 +152,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-7H.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-7H.action" -msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCIEX-8000-8R # keys: fault.io.pciex.device-invreq @@ -160,7 +160,7 @@ msgstr "Ensure that the latest drivers and patches are installed. Otherwise sch msgid "PCIEX-8000-8R.type" msgstr "Fault" msgid "PCIEX-8000-8R.severity" -msgstr "Critical" +msgstr "Major" msgid "PCIEX-8000-8R.description" msgstr "The transmitting device sent an invalid request.\n Refer to %s for more information." msgid "PCIEX-8000-8R.response" @@ -168,7 +168,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-8R.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-8R.action" -msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCIEX-8000-94 # keys: fault.io.pci.device-noresp fault.io.pciex.device-invreq @@ -176,7 +176,7 @@ msgstr "Ensure that the latest drivers and patches are installed. Otherwise sche msgid "PCIEX-8000-94.type" msgstr "Fault" msgid "PCIEX-8000-94.severity" -msgstr "Critical" +msgstr "Major" msgid "PCIEX-8000-94.description" msgstr "Either the transmitting device sent an invalid request or the receiving device failed to respond.\n Refer to %s for more information." msgid "PCIEX-8000-94.response" @@ -184,7 +184,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-94.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-94.action" -msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCIEX-8000-AQ # keys: fault.io.pci.device-invreq fault.io.pciex.device-noresp @@ -192,7 +192,7 @@ msgstr "Ensure that the latest drivers and patches are installed. If a plug-in c msgid "PCIEX-8000-AQ.type" msgstr "Fault" msgid "PCIEX-8000-AQ.severity" -msgstr "Critical" +msgstr "Major" msgid "PCIEX-8000-AQ.description" msgstr "Either the transmitting device sent an invalid request or the receiving device failed to respond.\n Refer to %s for more information." msgid "PCIEX-8000-AQ.response" @@ -200,7 +200,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-AQ.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-AQ.action" -msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCIEX-8000-CC # keys: fault.io.pci.bus-linkerr fault.io.pci.device-interr fault.io.pciex.device-interr @@ -216,7 +216,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-CC.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-CC.action" -msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCIEX-8000-DJ # keys: fault.io.pciex.bus-noresp fault.io.pciex.device-interr fault.io.pciex.device-noresp @@ -224,7 +224,7 @@ msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. msgid "PCIEX-8000-DJ.type" msgstr "Fault" msgid "PCIEX-8000-DJ.severity" -msgstr "Critical" +msgstr "Major" msgid "PCIEX-8000-DJ.description" msgstr "A problem has been detected on one of the specified devices or on one of the specified connecting buses.\n Refer to %s for more information." msgid "PCIEX-8000-DJ.response" @@ -232,7 +232,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-DJ.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-DJ.action" -msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCIEX-8000-EE # keys: fault.io.pciex.bus-linkerr fault.io.pciex.bus-noresp fault.io.pciex.device-interr fault.io.pciex.device-noresp @@ -248,7 +248,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-EE.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-EE.action" -msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCIEX-8000-FX # keys: fault.io.pciex.bus-linkerr fault.io.pciex.bus-noresp fault.io.pciex.device-interr fault.io.pciex.device-invreq fault.io.pciex.device-noresp @@ -264,7 +264,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-FX.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-FX.action" -msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCIEX-8000-G2 # keys: fault.io.pciex.bus-noresp fault.io.pciex.device-interr fault.io.pciex.device-invreq fault.io.pciex.device-noresp @@ -272,7 +272,7 @@ msgstr "Ensure that the latest drivers and patches are installed. If a plug-in c msgid "PCIEX-8000-G2.type" msgstr "Fault" msgid "PCIEX-8000-G2.severity" -msgstr "Critical" +msgstr "Major" msgid "PCIEX-8000-G2.description" msgstr "A problem has been detected on one of the specified devices or on one of the specified connecting buses.\n Refer to %s for more information." msgid "PCIEX-8000-G2.response" @@ -280,7 +280,7 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-G2.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-G2.action" -msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" # # code: PCIEX-8000-HS # keys: fault.io.pciex.bus-noresp fault.io.pciex.device-interr @@ -288,7 +288,7 @@ msgstr "Ensure that the latest drivers and patches are installed. Otherwise sche msgid "PCIEX-8000-HS.type" msgstr "Fault" msgid "PCIEX-8000-HS.severity" -msgstr "Critical" +msgstr "Major" msgid "PCIEX-8000-HS.description" msgstr "A problem has been detected on one of the specified devices or on one of the specified connecting buses.\n Refer to %s for more information." msgid "PCIEX-8000-HS.response" @@ -296,4 +296,84 @@ msgstr "One or more device instances may be disabled\n" msgid "PCIEX-8000-HS.impact" msgstr "Loss of services provided by the device instances associated with this fault\n" msgid "PCIEX-8000-HS.action" -msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n" +msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s). Use fmadm faulty to identify the devices or contact Sun for support.\n" +# +# code: PCIEX-8000-J5 +# keys: fault.io.pciex.device-interr-corr +# +msgid "PCIEX-8000-J5.type" +msgstr "Fault" +msgid "PCIEX-8000-J5.severity" +msgstr "Major" +msgid "PCIEX-8000-J5.description" +msgstr "Too many recovered internal errors have been detected within the specified PCIEX device. This may degrade into a non-recoverable fault.\n Refer to %s for more information." +msgid "PCIEX-8000-J5.response" +msgstr "One or more device instances may be disabled\n" +msgid "PCIEX-8000-J5.impact" +msgstr "Loss of services provided by the device instances associated with this fault\n" +msgid "PCIEX-8000-J5.action" +msgstr "Schedule a repair procedure to replace the affected device. Use fmadm faulty to identify the device or contact Sun for support.\n" +# +# code: PCIEX-8000-KP +# keys: fault.io.pciex.bus-linkerr-corr fault.io.pciex.device-interr-corr +# +msgid "PCIEX-8000-KP.type" +msgstr "Fault" +msgid "PCIEX-8000-KP.severity" +msgstr "Major" +msgid "PCIEX-8000-KP.description" +msgstr "Too many recovered bus errors have been detected, which indicates a problem with the specified bus or with the specified transmitting device. This may degrade into an unrecoverable fault.\n Refer to %s for more information." +msgid "PCIEX-8000-KP.response" +msgstr "One or more device instances may be disabled\n" +msgid "PCIEX-8000-KP.impact" +msgstr "Loss of services provided by the device instances associated with this fault\n" +msgid "PCIEX-8000-KP.action" +msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device. Use fmadm faulty to identify the device or contact Sun for support.\n" +# +# code: PCIEX-8000-LA +# keys: fault.io.pci.bus-linkerr-unaf fault.io.pciex.device-interr-unaf +# +msgid "PCIEX-8000-LA.type" +msgstr "Fault" +msgid "PCIEX-8000-LA.severity" +msgstr "Major" +msgid "PCIEX-8000-LA.description" +msgstr "Too many recovered bus errors have been detected, which indicates a problem with the specified bus or with the specified transmitting device. This may degrade into an unrecoverable fault.\n Refer to %s for more information." +msgid "PCIEX-8000-LA.response" +msgstr "One or more device instances may be disabled\n" +msgid "PCIEX-8000-LA.impact" +msgstr "Loss of services provided by the device instances associated with this fault\n" +msgid "PCIEX-8000-LA.action" +msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device. Use fmadm faulty to identify the device and bus or contact Sun for support.\n" +# +# code: PCIEX-8000-MH +# keys: fault.io.pciex.device-interr-unaf +# +msgid "PCIEX-8000-MH.type" +msgstr "Fault" +msgid "PCIEX-8000-MH.severity" +msgstr "Major" +msgid "PCIEX-8000-MH.description" +msgstr "Too many recovered errors have been detected, which indicates a problem with the specified PCIEX device. This may degrade into an unrecoverable fault.\n Refer to %s for more information." +msgid "PCIEX-8000-MH.response" +msgstr "One or more device instances may be disabled\n" +msgid "PCIEX-8000-MH.impact" +msgstr "Loss of services provided by the device instances associated with this fault\n" +msgid "PCIEX-8000-MH.action" +msgstr "Schedule a repair procedure to replace the affected device. Use fmadm faulty to identify the device or contact Sun for support.\n" +# +# code: PCIEX-8000-ND +# keys: fault.io.pciex.device-interr-deg +# +msgid "PCIEX-8000-ND.type" +msgstr "Fault" +msgid "PCIEX-8000-ND.severity" +msgstr "Major" +msgid "PCIEX-8000-ND.description" +msgstr "An unrecoverable problem was detected for a PCIEX device, which has resulted in that device running in a degraded state.\n Refer to %s for more information." +msgid "PCIEX-8000-ND.response" +msgstr "None\n" +msgid "PCIEX-8000-ND.impact" +msgstr "Degraded services provided by the device instances associated with this fault\n" +msgid "PCIEX-8000-ND.action" +msgstr "Schedule a repair procedure to replace the affected device. Use fmadm faulty to identify the device or contact Sun for support.\n" diff --git a/usr/src/cmd/fm/eversholt/common/check.c b/usr/src/cmd/fm/eversholt/common/check.c index c91c48edd0..e297a3feaa 100644 --- a/usr/src/cmd/fm/eversholt/common/check.c +++ b/usr/src/cmd/fm/eversholt/common/check.c @@ -69,22 +69,26 @@ static struct { int (*checker)(enum nodetype t, const char *s, struct node *np); int outflags; } Allowednames[] = { - { T_FAULT, "FITrate", 1, check_num_func, O_ERR }, + { T_FAULT, "FITrate", 0, check_num_func, O_ERR }, { T_FAULT, "FRU", 0, check_fru_asru, O_ERR }, { T_FAULT, "ASRU", 0, check_fru_asru, O_ERR }, { T_FAULT, "message", 0, check_num_func, O_ERR }, + { T_FAULT, "retire", 0, check_num_func, O_ERR }, + { T_FAULT, "response", 0, check_num_func, O_ERR }, { T_FAULT, "action", 0, check_action, O_ERR }, { T_FAULT, "count", 0, check_count, O_ERR }, + { T_FAULT, "engine", 0, check_engine, O_ERR }, { T_UPSET, "engine", 0, check_engine, O_ERR }, { T_DEFECT, "FRU", 0, check_fru_asru, O_ERR }, { T_DEFECT, "ASRU", 0, check_fru_asru, O_ERR }, + { T_DEFECT, "engine", 0, check_engine, O_ERR }, { T_EREPORT, "poller", 0, check_id, O_ERR }, { T_EREPORT, "delivery", 0, check_timeval, O_ERR }, { T_EREPORT, "discard_if_config_unknown", 0, check_num, O_ERR }, { T_SERD, "N", 1, check_num, O_ERR }, { T_SERD, "T", 1, check_timeval, O_ERR }, - { T_SERD, "method", 1, check_serd_method, O_ERR }, - { T_SERD, "trip", 1, check_reportlist, O_ERR }, + { T_SERD, "method", 0, check_serd_method, O_ERR }, + { T_SERD, "trip", 0, check_reportlist, O_ERR }, { T_SERD, "FRU", 0, check_fru_asru, O_ERR }, { T_SERD, "id", 0, check_serd_id, O_ERR }, { T_ERROR, "ASRU", 0, check_fru_asru, O_ERR }, @@ -1092,33 +1096,39 @@ check_func(struct node *np) np->u.func.s); } } else if (np->u.func.s == L_is_on) { - if (arglist->t == T_FUNC && + if (arglist->t == T_NAME || + (arglist->t == T_FUNC && (arglist->u.func.s == L_fru || - arglist->u.func.s == L_asru)) { - check_func(arglist); + arglist->u.func.s == L_asru))) { + if (arglist->t == T_FUNC) + check_func(arglist); } else { outfl(O_ERR, arglist->file, arglist->line, - "argument to is_on() must be a call to " + "argument to is_on() must be a path or a call to " "fru() or asru()"); } } else if (np->u.func.s == L_is_present) { - if (arglist->t == T_FUNC && + if (arglist->t == T_NAME || + (arglist->t == T_FUNC && (arglist->u.func.s == L_fru || - arglist->u.func.s == L_asru)) { - check_func(arglist); + arglist->u.func.s == L_asru))) { + if (arglist->t == T_FUNC) + check_func(arglist); } else { outfl(O_ERR, arglist->file, arglist->line, - "argument to is_present() must be a call to " - "fru() or asru()"); + "argument to is_present() must be a path or a call " + "to fru() or asru()"); } } else if (np->u.func.s == L_is_type) { - if (arglist->t == T_FUNC && + if (arglist->t == T_NAME || + (arglist->t == T_FUNC && (arglist->u.func.s == L_fru || - arglist->u.func.s == L_asru)) { - check_func(arglist); + arglist->u.func.s == L_asru))) { + if (arglist->t == T_FUNC) + check_func(arglist); } else { outfl(O_ERR, arglist->file, arglist->line, - "argument to is_type() must be a call to " + "argument to is_type() must be a path or a call to " "fru() or asru()"); } } else if (np->u.func.s == L_confcall) { @@ -1131,14 +1141,16 @@ check_func(struct node *np) } else if (np->u.func.s == L_confprop || np->u.func.s == L_confprop_defined) { if (arglist->t == T_LIST && + (arglist->u.expr.left->t == T_NAME || (arglist->u.expr.left->t == T_FUNC && (arglist->u.expr.left->u.func.s == L_fru || - arglist->u.expr.left->u.func.s == L_asru)) && + arglist->u.expr.left->u.func.s == L_asru))) && arglist->u.expr.right->t == T_QUOTE) { - check_func(arglist->u.expr.left); + if (arglist->u.expr.left->t == T_FUNC) + check_func(arglist->u.expr.left); } else { outfl(O_ERR, arglist->file, arglist->line, - "%s(): first argument must be a call to " + "%s(): first argument must be a path or a call to " "fru() or asru(); " "second argument must be a string", np->u.func.s); } @@ -1179,6 +1191,11 @@ check_func(struct node *np) "first arg must be a string, " "second arg a value"); } + } else if (np->u.func.s == L_setserdn || np->u.func.s == L_setserdt || + np->u.func.s == L_setserdsuffix || np->u.func.s == + L_setserdincrement) { + if (arglist->t == T_FUNC) + check_func(arglist); } else if (np->u.func.s == L_envprop) { if (arglist->t != T_QUOTE) outfl(O_ERR, arglist->file, arglist->line, diff --git a/usr/src/cmd/fm/eversholt/common/esclex.c b/usr/src/cmd/fm/eversholt/common/esclex.c index 3381795c5e..5f1869080f 100644 --- a/usr/src/cmd/fm/eversholt/common/esclex.c +++ b/usr/src/cmd/fm/eversholt/common/esclex.c @@ -114,6 +114,11 @@ static const struct { */ { "is_connected", PATHFUNC }, { "is_under", PATHFUNC }, + { "is_on", PATHFUNC }, + { "is_present", PATHFUNC }, + { "is_type", PATHFUNC }, + { "confprop", PATHFUNC }, + { "confprop_defined", PATHFUNC }, }; /* diff --git a/usr/src/cmd/fm/eversholt/common/literals.h b/usr/src/cmd/fm/eversholt/common/literals.h index 509c827f28..9dd790d68b 100644 --- a/usr/src/cmd/fm/eversholt/common/literals.h +++ b/usr/src/cmd/fm/eversholt/common/literals.h @@ -124,6 +124,8 @@ L_DECL(FITrate); L_DECL(FRU); L_DECL(id); L_DECL(message); +L_DECL(retire); +L_DECL(response); L_DECL(FRUID); L_DECL(N); L_DECL(T); @@ -158,6 +160,10 @@ L_DECL(payloadprop); L_DECL(payloadprop_contains); L_DECL(payloadprop_defined); L_DECL(setpayloadprop); +L_DECL(setserdsuffix); +L_DECL(setserdincrement); +L_DECL(setserdn); +L_DECL(setserdt); L_DECL(envprop); L_DECL(is_connected); L_DECL(is_under); diff --git a/usr/src/cmd/fm/eversholt/common/tree.c b/usr/src/cmd/fm/eversholt/common/tree.c index 1e89dcdb16..72c5f23f0b 100644 --- a/usr/src/cmd/fm/eversholt/common/tree.c +++ b/usr/src/cmd/fm/eversholt/common/tree.c @@ -1096,6 +1096,10 @@ tree_decl(enum nodetype t, struct node *np, struct node *nvpairs, case N_FAULT: ret = dodecl(T_FAULT, file, line, np, nvpairs, &Faults, Faultcount, 0); + + /* increment serd statement reference */ + decl = tree_event2np_lut_lookup(Faults, np); + update_serd_refstmt(NULL, decl, NULL); break; case N_UPSET: @@ -1110,6 +1114,10 @@ tree_decl(enum nodetype t, struct node *np, struct node *nvpairs, case N_DEFECT: ret = dodecl(T_DEFECT, file, line, np, nvpairs, &Defects, Defectcount, 0); + + /* increment serd statement reference */ + decl = tree_event2np_lut_lookup(Defects, np); + update_serd_refstmt(NULL, decl, NULL); break; case N_ERROR: @@ -1318,6 +1326,8 @@ tree_report() * an upset "engine" property. */ lut_walk(Faults, (lut_cb)check_refcount, (void *)T_FAULT); + lut_walk(Faults, (lut_cb)check_upset_engine, (void *)T_FAULT); + lut_walk(Defects, (lut_cb)check_upset_engine, (void *)T_DEFECT); lut_walk(Upsets, (lut_cb)check_upset_engine, (void *)T_UPSET); lut_walk(Upsets, (lut_cb)check_refcount, (void *)T_UPSET); lut_walk(Errors, (lut_cb)check_refcount, (void *)T_ERROR); diff --git a/usr/src/cmd/fm/eversholt/common/tree.h b/usr/src/cmd/fm/eversholt/common/tree.h index e95ebff605..f28b3286d2 100644 --- a/usr/src/cmd/fm/eversholt/common/tree.h +++ b/usr/src/cmd/fm/eversholt/common/tree.h @@ -244,6 +244,7 @@ struct node { struct node *knp; /* K value */ struct node *prop; /* arrow is part of this prop */ int needed; + struct node *parent; } arrow; struct { diff --git a/usr/src/cmd/fm/eversholt/files/common/pci.esc b/usr/src/cmd/fm/eversholt/files/common/pci.esc index 79206a104b..e799a41cd4 100644 --- a/usr/src/cmd/fm/eversholt/files/common/pci.esc +++ b/usr/src/cmd/fm/eversholt/files/common/pci.esc @@ -46,44 +46,57 @@ */ #define NONFATAL_COUNT 6 #define NONFATAL_TIME 2h -#define NONFATAL_DPE_U_COUNT 3 -#define NONFATAL_DPE_U_TIME 168h -#define NONFATAL_DPE_D_COUNT 3 -#define NONFATAL_DPE_D_TIME 168h +#define NONFATAL_DPE_COUNT 3 +#define NONFATAL_DPE_TIME 168h + +#define PCIFN pcibus/pcidev/pcifn +#define PCIFNHZ pcibus<>/pcidev<>/pcifn<> + +engine serd.io.device.nonfatal@PCIFN, + N=NONFATAL_COUNT, T=NONFATAL_TIME; + +engine serd.io.pci.nf-dpe@PCIFN, + N=NONFATAL_DPE_COUNT, T=NONFATAL_DPE_TIME; + +engine serd.io.pci.nf-dpe-bus@pcibus, + N=NONFATAL_DPE_COUNT, T=NONFATAL_DPE_TIME; #define IS_LEAF \ - (confprop_defined(asru(pcibus/pcidev/pcifn), TOPO_PCI_CLASS) && \ - confprop(asru(pcibus/pcidev/pcifn), TOPO_PCI_CLASS) != "60400" && \ - confprop(asru(pcibus/pcidev/pcifn), TOPO_PCI_CLASS) != "60401") + (confprop_defined(PCIFN, TOPO_PCI_CLASS) && \ + confprop(PCIFN, TOPO_PCI_CLASS) != "60400" && \ + confprop(PCIFN, TOPO_PCI_CLASS) != "60401") #define IS_BDG \ - (confprop(asru(pcibus/pcidev/pcifn), TOPO_PCI_CLASS) == "60400" || \ - confprop(asru(pcibus/pcidev/pcifn), TOPO_PCI_CLASS) == "60401") + (confprop(PCIFN, TOPO_PCI_CLASS) == "60400" || \ + confprop(PCIFN, TOPO_PCI_CLASS) == "60401") #define FD_IS_LEAF \ - (confprop_defined(asru(pcibus/pcidev[fromdev]/pcifn), \ - TOPO_PCI_CLASS) && \ - confprop(asru(pcibus/pcidev[fromdev]/pcifn), TOPO_PCI_CLASS) != \ - "60400" && \ - confprop(asru(pcibus/pcidev[fromdev]/pcifn), TOPO_PCI_CLASS) != "60401") + (confprop_defined(pcibus/pcidev[fromdev]/pcifn, TOPO_PCI_CLASS) && \ + confprop(pcibus/pcidev[fromdev]/pcifn, TOPO_PCI_CLASS) != "60400" && \ + confprop(pcibus/pcidev[fromdev]/pcifn, TOPO_PCI_CLASS) != "60401") +#define IS_LF(f) (confprop_defined(f, TOPO_PCI_CLASS) && \ + confprop(f, TOPO_PCI_CLASS) != "60400" && \ + confprop(f, TOPO_PCI_CLASS) != "60401") /* * note general rule for errors is that for upstream propagations - * @pcibus/pcidev/pcifn is the sending device while for downstream + * @PCIFN is the sending device while for downstream * propagations it is the receiving device. */ -asru pcibus/pcidev/pcifn; -fru pcibus/pcidev; +event fault.io.pci.device-interr-corr@PCIFN, + engine=serd.io.device.nonfatal@PCIFN, FITrate=PCI_DEV_FIT; -event fault.io.pci.device-interr@pcibus/pcidev/pcifn, - FITrate=PCI_DEV_FIT, FRU=pcibus/pcidev, ASRU=pcibus/pcidev/pcifn; +event fault.io.pci.device-interr-unaf@PCIFN, + engine=serd.io.pci.nf-dpe@PCIFN, FITrate=PCI_DEV_FIT; -event fault.io.pci.device-invreq@pcibus/pcidev/pcifn, - FITrate=PCI_DEV_FIT, FRU=pcibus/pcidev, ASRU=pcibus/pcidev/pcifn; +event fault.io.pci.device-interr-deg@PCIFN, FITrate=PCI_DEV_FIT, retire=0; -event fault.io.pci.device-noresp@pcibus/pcidev/pcifn, - FITrate=PCI_DEV_FIT, FRU=pcibus/pcidev, ASRU=pcibus/pcidev/pcifn; +event fault.io.pci.device-interr@PCIFN, FITrate=PCI_DEV_FIT; + +event fault.io.pci.device-invreq@PCIFN, FITrate=PCI_DEV_FIT; + +event fault.io.pci.device-noresp@PCIFN, FITrate=PCI_DEV_FIT; /* * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -107,55 +120,52 @@ event fault.io.pci.device-noresp@pcibus/pcidev/pcifn, #define PCI_TO_HB pcibus/pcidev<todev>/pcifn<> {fromdev != 32 && todev == 32} #define PCI_FROM_HB pcibus/pcidev<todev>/pcifn<> {fromdev == 32 && todev != 32} -event error.io.pci.retry-to-d@pcibus/pcidev/pcifn; -event error.io.pci.nr-pw-d@pcibus/pcidev/pcifn; -event error.io.pci.nr-drw-d@pcibus/pcidev/pcifn; -event error.io.pci.ta-pw-d@pcibus/pcidev/pcifn; -event error.io.pci.ta-drw-d@pcibus/pcidev/pcifn; -event error.io.pci.badreq-pw-d@pcibus/pcidev/pcifn; -event error.io.pci.badreq-drw-d@pcibus/pcidev/pcifn; -event error.io.pci.f-dpe-d@pcibus/pcidev/pcifn; -event error.io.pci.nf-dpe-d@pcibus/pcidev/pcifn; -event error.io.pci.nonfatal-dpe-d@pcibus/pcidev/pcifn; -event error.io.pci.ape-d@pcibus/pcidev/pcifn; -event error.io.pci.ape-u@pcibus/pcidev/pcifn; -event error.io.pci.f-dpdata-dw-d@pcibus/pcidev/pcifn; -event error.io.pci.nf-dpdata-dw-d@pcibus/pcidev/pcifn; -event error.io.pci.f-dpdata-pw-d@pcibus/pcidev/pcifn; -event error.io.pci.nf-dpdata-pw-d@pcibus/pcidev/pcifn; -event error.io.pci.f-dpdata-dr-d@pcibus/pcidev/pcifn; -event error.io.pci.nf-dpdata-dr-d@pcibus/pcidev/pcifn; -event error.io.pci.dpdata-pw-u@pcibus/pcidev/pcifn; -event error.io.pci.dpdata-dw-u@pcibus/pcidev/pcifn; -event error.io.pci.dpdata-dr-u@pcibus/pcidev/pcifn; -event error.io.pci.ta-u@pcibus/pcidev/pcifn; -event error.io.pci.ma-u@pcibus/pcidev/pcifn; -event error.io.pci.perr-dw-u@pcibus/pcidev/pcifn; -event error.io.pci.perr-pw-u@pcibus/pcidev/pcifn; -event error.io.pci.perr-dr-u@pcibus/pcidev/pcifn; -event error.io.pci.badreq-drw-u@pcibus/pcidev/pcifn; -event error.io.pci.badreq-pw-u@pcibus/pcidev/pcifn; -event error.io.pci.device-serr@pcibus/pcidev/pcifn; -event error.io.pci.device-ta@pcibus/pcidev/pcifn; -event error.io.pci.device-par@pcibus/pcidev/pcifn; -event error.io.pci.serr-u@pcibus/pcidev/pcifn; -event error.io.pcix.scpe-d@pcibus/pcidev/pcifn; -event error.io.pcix.scpe-u@pcibus/pcidev/pcifn; -event error.io.pcix.spl-comp-ma-u@pcibus/pcidev/pcifn; -event error.io.pcix.spl-comp-ta-u@pcibus/pcidev/pcifn; -event error.io.pcix.spl-comp-ma-d@pcibus/pcidev/pcifn; -event error.io.pcix.spl-comp-ta-d@pcibus/pcidev/pcifn; - -event ereport.io.pci.ma@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pci.rta@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pci.mdpe@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pci.sta@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pci.sserr@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pci.dpe@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pci.target-mdpe@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pci.target-rta@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pci.target-ma@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.discard@pcibus/pcidev/pcifn{within(5s)}; +event error.io.pci.retry-to-d@PCIFN; +event error.io.pci.nr-pw-d@PCIFN; +event error.io.pci.nr-drw-d@PCIFN; +event error.io.pci.ta-pw-d@PCIFN; +event error.io.pci.ta-drw-d@PCIFN; +event error.io.pci.badreq-pw-d@PCIFN; +event error.io.pci.badreq-drw-d@PCIFN; +event error.io.pci.f-dpe-d@PCIFN; +event error.io.pci.deg-dpe-d@PCIFN; +event error.io.pci.nf-dpe-d@PCIFN; +event error.io.pci.ape-d@PCIFN; +event error.io.pci.ape-u@PCIFN; +event error.io.pci.dpdata-dw-d@PCIFN; +event error.io.pci.dpdata-pw-d@PCIFN; +event error.io.pci.dpdata-dr-d@PCIFN; +event error.io.pci.dpdata-pw-u@PCIFN; +event error.io.pci.dpdata-dw-u@PCIFN; +event error.io.pci.dpdata-dr-u@PCIFN; +event error.io.pci.ta-u@PCIFN; +event error.io.pci.ma-u@PCIFN; +event error.io.pci.perr-dw-u@PCIFN; +event error.io.pci.perr-pw-u@PCIFN; +event error.io.pci.perr-dr-u@PCIFN; +event error.io.pci.badreq-drw-u@PCIFN; +event error.io.pci.badreq-pw-u@PCIFN; +event error.io.pci.device-serr@PCIFN; +event error.io.pci.device-ta@PCIFN; +event error.io.pci.device-par@PCIFN; +event error.io.pci.serr-u@PCIFN; +event error.io.pcix.scpe-d@PCIFN; +event error.io.pcix.scpe-u@PCIFN; +event error.io.pcix.spl-comp-ma-u@PCIFN; +event error.io.pcix.spl-comp-ta-u@PCIFN; +event error.io.pcix.spl-comp-ma-d@PCIFN; +event error.io.pcix.spl-comp-ta-d@PCIFN; + +event ereport.io.pci.ma@PCIFN{within(5s)}; +event ereport.io.pci.rta@PCIFN{within(5s)}; +event ereport.io.pci.mdpe@PCIFN{within(5s)}; +event ereport.io.pci.sta@PCIFN{within(5s)}; +event ereport.io.pci.sserr@PCIFN{within(5s)}; +event ereport.io.pci.dpe@PCIFN{within(5s)}; +event ereport.io.pci.target-mdpe@PCIFN{within(5s)}; +event ereport.io.pci.target-rta@PCIFN{within(5s)}; +event ereport.io.pci.target-ma@PCIFN{within(5s)}; +event ereport.io.pcix.discard@PCIFN{within(5s)}; prop fault.io.pci.device-noresp@pcibus/pcidev[fromdev]/pcifn (0)-> error.io.pci.nr-pw-d@PCI_FROM_HB, @@ -166,14 +176,19 @@ prop fault.io.pci.device-invreq@pcibus/pcidev[fromdev]/pcifn (0)-> error.io.pci.badreq-pw-d@PCI_FROM_HB, error.io.pci.badreq-drw-d@PCI_FROM_HB; -prop fault.io.pci.device-interr@pcibus/pcidev/pcifn (0)-> - error.io.pci.device-par@pcibus/pcidev/pcifn, - error.io.pci.device-ta@pcibus/pcidev/pcifn, - error.io.pci.device-serr@pcibus/pcidev/pcifn; +prop fault.io.pci.device-interr-unaf@pcibus/pcidev[fromdev]/pcifn (0)-> + error.io.pci.nf-dpe-d@PCI_FROM_HB; + +prop fault.io.pci.device-interr-deg@pcibus/pcidev[fromdev]/pcifn (0)-> + error.io.pci.deg-dpe-d@PCI_FROM_HB; + +prop fault.io.pci.device-interr@PCIFN (0)-> + error.io.pci.device-par@PCIFN, + error.io.pci.device-ta@PCIFN, + error.io.pci.device-serr@PCIFN; prop error.io.pci.device-par@pcibus/pcidev[fromdev]/pcifn (1)-> error.io.pci.f-dpe-d@PCI_FROM_HB, - error.io.pci.nf-dpe-d@PCI_FROM_HB, error.io.pcix.scpe-d@PCI_FROM_HB, error.io.pci.ape-d@PCI_FROM_HB; @@ -185,19 +200,9 @@ prop error.io.pci.device-ta@pcibus/pcidev[fromdev]/pcifn (1)-> ereport.io.pci.sta@pcibus/pcidev<todev>/pcifn { todev == fromdev && fromdev == 32 }; -prop error.io.pci.device-serr@pcibus/pcidev/pcifn (2)-> - error.io.pci.serr-u@pcibus/pcidev/pcifn, - ereport.io.pci.sserr@pcibus/pcidev/pcifn; - -prop error.io.pci.f-dpe-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.f-dpdata-pw-d@pcibus/pcidev/pcifn, - error.io.pci.f-dpdata-dw-d@pcibus/pcidev/pcifn, - error.io.pci.f-dpdata-dr-d@pcibus/pcidev/pcifn; - -prop error.io.pci.nonfatal-dpe-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.nf-dpdata-pw-d@pcibus/pcidev/pcifn, - error.io.pci.nf-dpdata-dw-d@pcibus/pcidev/pcifn, - error.io.pci.nf-dpdata-dr-d@pcibus/pcidev/pcifn; +prop error.io.pci.device-serr@PCIFN (2)-> + error.io.pci.serr-u@PCIFN, + ereport.io.pci.sserr@PCIFN; /* * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -240,9 +245,9 @@ prop error.io.pci.badreq-drw-u@pcibus/pcidev[fromdev]/pcifn (0)-> prop error.io.pci.badreq-pw-u@pcibus/pcidev[fromdev]/pcifn (0)-> ereport.io.pci.sta@PCI_TO_HB; -prop error.io.pcix.scpe-u@pcibus/pcidev/pcifn (1)-> - error.io.pcix.spl-comp-ma-d@pcibus/pcidev/pcifn, - error.io.pcix.spl-comp-ta-d@pcibus/pcidev/pcifn; +prop error.io.pcix.scpe-u@PCIFN (1)-> + error.io.pcix.spl-comp-ma-d@PCIFN, + error.io.pcix.spl-comp-ta-d@PCIFN; prop error.io.pcix.scpe-u@pcibus/pcidev[fromdev]/pcifn (0)-> ereport.io.pci.dpe@PCI_TO_HB, @@ -291,51 +296,65 @@ prop error.io.pcix.spl-comp-ta-u@pcibus/pcidev[fromdev]/pcifn (3)-> #define PCI_NOT_HB pcibus/pcidev[fromdev]/pcifn {fromdev != 32} -event error.io.pci.retry-to-u@pcibus/pcidev/pcifn; -event error.io.pci.nr-pw-u@pcibus/pcidev/pcifn; -event error.io.pci.nr-drw-u@pcibus/pcidev/pcifn; -event error.io.pci.ta-pw-u@pcibus/pcidev/pcifn; -event error.io.pci.ta-drw-u@pcibus/pcidev/pcifn; -event error.io.pci.f-dpe-u@pcibus/pcidev/pcifn; -event error.io.pci.nf-dpe-u@pcibus/pcidev/pcifn; -event error.io.pci.nonfatal-dpe-u@pcibus/pcidev/pcifn; -event error.io.pci.flt-f-dpdata-pw-u@pcibus/pcidev/pcifn; -event error.io.pci.flt-nf-dpdata-pw-u@pcibus/pcidev/pcifn; -event error.io.pci.flt-f-dpdata-dw-u@pcibus/pcidev/pcifn; -event error.io.pci.flt-nf-dpdata-dw-u@pcibus/pcidev/pcifn; -event error.io.pci.flt-f-dpdata-dr-u@pcibus/pcidev/pcifn; -event error.io.pci.flt-nf-dpdata-dr-u@pcibus/pcidev/pcifn; -event error.io.pci.perr-d@pcibus/pcidev/pcifn; -event error.io.pci.target-mdpe-d@pcibus/pcidev/pcifn; -event error.io.pci.target-mdpe-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.target-rta-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.target-ma-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pcix.tx-oor@pcibus/pcidev/pcifn; -event error.io.pcix.rx-unex-sc@pcibus/pcidev/pcifn; -event error.io.pci.source-nf-dpdata-w-u@pcibus/pcidev/pcifn; -event error.io.pci.source-f-dpdata-w-u@pcibus/pcidev/pcifn; -event error.io.pci.source-nf-dpdata-r-u@pcibus/pcidev/pcifn; -event error.io.pci.source-f-dpdata-r-u@pcibus/pcidev/pcifn; -event error.io.device.nf-device@pcibus/pcidev/pcifn; -event error.io.device.f-device@pcibus/pcidev/pcifn; - -event ereport.io.pcix.oor@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.unex-sc@pcibus/pcidev/pcifn{within(5s)}; +event error.io.pci.retry-to-u@PCIFN; +event error.io.pci.nr-pw-u@PCIFN; +event error.io.pci.nr-drw-u@PCIFN; +event error.io.pci.ta-pw-u@PCIFN; +event error.io.pci.ta-drw-u@PCIFN; +event error.io.pci.f-dpe-u@PCIFN; +event error.io.pci.deg-dpe-u@PCIFN; +event error.io.pci.nf-dpe-u@PCIFN; +event error.io.pci.flt-dpdata-pw-u@PCIFN; +event error.io.pci.flt-dpdata-dw-u@PCIFN; +event error.io.pci.flt-dpdata-dr-u@PCIFN; +event error.io.pci.source-dpdata-u@PCIFN; +event error.io.pci.f-source-dpdata-u@PCIFN; +event error.io.pci.f-source-dpdata-u@PCIFN/PCIFN; +event error.io.pci.deg-source-dpdata-u@PCIFN; +event error.io.pci.deg-source-dpdata-u@PCIFN/PCIFN; +event error.io.pci.nf-source-dpdata-u@PCIFN; +event error.io.pci.nf-source-dpdata-u@PCIFN/PCIFN; +event error.io.pci.perr-d@PCIFN; +event error.io.pci.target-mdpe-d@PCIFN; +event error.io.pci.target-mdpe-d@PCIFN/PCIFN; +event error.io.pci.target-rta-d@PCIFN/PCIFN; +event error.io.pci.target-ma-d@PCIFN/PCIFN; +event error.io.pcix.tx-oor@PCIFN; +event error.io.pcix.rx-unex-sc@PCIFN; +event error.io.device.nf-device@PCIFN; +event error.io.device.f-device@PCIFN; +event error.io.device.deg-device@PCIFN; +event error.io.service.restored@PCIFN; + +event ereport.io.pcix.oor@PCIFN{within(5s)}; +event ereport.io.pcix.unex-sc@PCIFN{within(5s)}; +event ereport.io.service.lost@PCIFN{within(5s)}; +event ereport.io.service.degraded@PCIFN{within(5s)}; +event ereport.io.service.unaffected@PCIFN{within(5s)}; +event ereport.io.service.restored@PCIFN{within(30s)}; prop fault.io.pci.device-noresp@pcibus/pcidev[fromdev]/pcifn (0)-> error.io.pci.nr-pw-u@PCI_NOT_HB, error.io.pci.nr-drw-u@PCI_NOT_HB, error.io.pci.retry-to-u@PCI_NOT_HB; +prop fault.io.pci.device-interr-corr@pcibus/pcidev[fromdev]/pcifn (0)-> + error.io.device.nf-device@PCI_NOT_HB; + +prop fault.io.pci.device-interr-unaf@pcibus/pcidev[fromdev]/pcifn (0)-> + error.io.pci.nf-dpe-u@PCI_NOT_HB; + +prop fault.io.pci.device-interr-deg@pcibus/pcidev[fromdev]/pcifn (0)-> + error.io.device.deg-device@PCI_NOT_HB, + error.io.pci.deg-dpe-u@PCI_NOT_HB; + prop fault.io.pci.device-interr@pcibus/pcidev[fromdev]/pcifn (0)-> error.io.pci.ta-pw-u@PCI_NOT_HB, error.io.pci.ta-drw-u@PCI_NOT_HB, error.io.pci.serr-u@PCI_NOT_HB, error.io.pci.ape-u@PCI_NOT_HB, error.io.pci.f-dpe-u@PCI_NOT_HB, - error.io.pci.nf-dpe-u@PCI_NOT_HB, error.io.device.f-device@PCI_NOT_HB, - error.io.device.nf-device@PCI_NOT_HB, error.io.pcix.scpe-u@PCI_NOT_HB, error.io.pcix.tx-oor@PCI_NOT_HB, error.io.pcix.rx-unex-sc@PCI_NOT_HB; @@ -344,59 +363,77 @@ prop fault.io.pci.device-invreq@pcibus/pcidev[fromdev]/pcifn {FD_IS_LEAF} (0)-> error.io.pci.badreq-drw-u@PCI_NOT_HB, error.io.pci.badreq-pw-u@PCI_NOT_HB; -prop error.io.pcix.tx-oor@pcibus/pcidev/pcifn (1)-> - ereport.io.pcix.oor@pcibus/pcidev/pcifn; +prop error.io.pcix.tx-oor@PCIFN (1)-> + ereport.io.pcix.oor@PCIFN; prop error.io.pcix.rx-unex-sc@pcibus/pcidev[fromdev]/pcifn (1)-> ereport.io.pcix.unex-sc@pcibus/pcidev<todev>/pcifn<> {fromdev != todev}; -prop error.io.pci.f-dpe-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.flt-f-dpdata-pw-u@pcibus/pcidev/pcifn, - error.io.pci.flt-f-dpdata-dw-u@pcibus/pcidev/pcifn, - error.io.pci.flt-f-dpdata-dr-u@pcibus/pcidev/pcifn; +prop error.io.pci.f-dpe-u@PCIFN (1)-> + error.io.pci.flt-dpdata-pw-u@PCIFN, + error.io.pci.flt-dpdata-dw-u@PCIFN, + error.io.pci.flt-dpdata-dr-u@PCIFN; + +prop error.io.pci.f-dpe-u@PCIFN (1)-> + error.io.pci.f-source-dpdata-u@PCIFN; + +prop error.io.pci.f-source-dpdata-u@PCIFN (1)-> + error.io.pci.f-source-dpdata-u@PCIFN/PCIFNHZ; -prop error.io.pci.flt-f-dpdata-pw-u@pcibus/pcidev/pcifn (2)-> - error.io.pci.source-f-dpdata-w-u@pcibus/pcidev/pcifn, - error.io.pci.dpdata-pw-u@pcibus/pcidev/pcifn; +prop error.io.pci.f-source-dpdata-u@PCIFN { IS_LF(PCIFN) } (1)-> + error.io.pci.source-dpdata-u@PCIFN; -prop error.io.pci.flt-f-dpdata-pw-u@pcibus/pcidev/pcifn { IS_BDG } (1)-> - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pci.f-source-dpdata-u@PCIFN { IS_LF(PCIFN) } (0)-> + ereport.io.service.lost@PCIFN; -prop error.io.pci.flt-f-dpdata-dw-u@pcibus/pcidev/pcifn (3)-> - error.io.pci.source-f-dpdata-w-u@pcibus/pcidev/pcifn, - error.io.pci.perr-d@pcibus/pcidev/pcifn, - error.io.pci.dpdata-dw-u@pcibus/pcidev/pcifn; +prop error.io.pci.deg-dpe-u@PCIFN (1)-> + error.io.pci.flt-dpdata-pw-u@PCIFN, + error.io.pci.flt-dpdata-dw-u@PCIFN, + error.io.pci.flt-dpdata-dr-u@PCIFN; -prop error.io.pci.flt-f-dpdata-dr-u@pcibus/pcidev/pcifn (2)-> - error.io.pci.source-f-dpdata-r-u@pcibus/pcidev/pcifn, - error.io.pci.dpdata-dr-u@pcibus/pcidev/pcifn; +prop error.io.pci.deg-dpe-u@PCIFN (1)-> + error.io.pci.deg-source-dpdata-u@PCIFN; -prop error.io.pci.flt-f-dpdata-dr-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.target-mdpe-d@pcibus/pcidev/pcifn; +prop error.io.pci.deg-source-dpdata-u@PCIFN (1)-> + error.io.pci.deg-source-dpdata-u@PCIFN/PCIFNHZ; -prop error.io.pci.nonfatal-dpe-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.flt-nf-dpdata-pw-u@pcibus/pcidev/pcifn, - error.io.pci.flt-nf-dpdata-dw-u@pcibus/pcidev/pcifn, - error.io.pci.flt-nf-dpdata-dr-u@pcibus/pcidev/pcifn; +prop error.io.pci.deg-source-dpdata-u@PCIFN { IS_LF(PCIFN) } (1)-> + error.io.pci.source-dpdata-u@PCIFN; -prop error.io.pci.flt-nf-dpdata-pw-u@pcibus/pcidev/pcifn (2)-> - error.io.pci.source-nf-dpdata-w-u@pcibus/pcidev/pcifn, - error.io.pci.dpdata-pw-u@pcibus/pcidev/pcifn; +prop error.io.pci.deg-source-dpdata-u@PCIFN { IS_LF(PCIFN) } (1)-> + ereport.io.service.degraded@PCIFN; -prop error.io.pci.flt-nf-dpdata-pw-u@pcibus/pcidev/pcifn { IS_BDG } (1)-> - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pci.nf-dpe-u@PCIFN (1)-> + error.io.pci.flt-dpdata-pw-u@PCIFN, + error.io.pci.flt-dpdata-dw-u@PCIFN, + error.io.pci.flt-dpdata-dr-u@PCIFN; -prop error.io.pci.flt-nf-dpdata-dw-u@pcibus/pcidev/pcifn (3)-> - error.io.pci.source-nf-dpdata-w-u@pcibus/pcidev/pcifn, - error.io.pci.perr-d@pcibus/pcidev/pcifn, - error.io.pci.dpdata-dw-u@pcibus/pcidev/pcifn; +prop error.io.pci.nf-dpe-u@PCIFN (1)-> + error.io.pci.nf-source-dpdata-u@PCIFN; -prop error.io.pci.flt-nf-dpdata-dr-u@pcibus/pcidev/pcifn (2)-> - error.io.pci.source-nf-dpdata-r-u@pcibus/pcidev/pcifn, - error.io.pci.dpdata-dr-u@pcibus/pcidev/pcifn; +prop error.io.pci.nf-source-dpdata-u@PCIFN (1)-> + error.io.pci.nf-source-dpdata-u@PCIFN/PCIFNHZ; -prop error.io.pci.flt-nf-dpdata-dr-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.target-mdpe-d@pcibus/pcidev/pcifn; +prop error.io.pci.nf-source-dpdata-u@PCIFN { IS_LF(PCIFN) } (1)-> + error.io.pci.source-dpdata-u@PCIFN; + +prop error.io.pci.nf-source-dpdata-u@PCIFN { IS_LF(PCIFN) } (1)-> + ereport.io.service.unaffected@PCIFN, + error.io.service.restored@PCIFN; + +prop error.io.pci.flt-dpdata-pw-u@PCIFN (1)-> + error.io.pci.dpdata-pw-u@PCIFN; + +prop error.io.pci.flt-dpdata-pw-u@PCIFN { IS_BDG } (1)-> + error.io.pci.serr-u@PCIFN; + +prop error.io.pci.flt-dpdata-dw-u@PCIFN (2)-> + error.io.pci.perr-d@PCIFN, + error.io.pci.dpdata-dw-u@PCIFN; + +prop error.io.pci.flt-dpdata-dr-u@PCIFN (2)-> + error.io.pci.dpdata-dr-u@PCIFN, + error.io.pci.target-mdpe-d@PCIFN; /* * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -415,28 +452,34 @@ prop error.io.pci.flt-nf-dpdata-dr-u@pcibus/pcidev/pcifn (1)-> * transaction retry. */ -event error.io.pci.ape-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.f-dpe-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.nf-dpe-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.retry-to-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.nr-pw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.nr-drw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.ta-pw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.ta-drw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pcix.scpe-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; - -prop fault.io.pci.device-noresp@pcibus/pcidev/pcifn (0)-> - error.io.pci.nr-pw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn, - error.io.pci.nr-drw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn, - error.io.pci.retry-to-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; - -prop fault.io.pci.device-interr@pcibus/pcidev/pcifn (0)-> - error.io.pci.ta-pw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn, - error.io.pci.ta-drw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn, - error.io.pci.ape-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn, - error.io.pcix.scpe-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn, - error.io.pci.f-dpe-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn, - error.io.pci.nf-dpe-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; +event error.io.pci.ape-d@PCIFN/PCIFN; +event error.io.pci.f-dpe-d@PCIFN/PCIFN; +event error.io.pci.deg-dpe-d@PCIFN/PCIFN; +event error.io.pci.nf-dpe-d@PCIFN/PCIFN; +event error.io.pci.retry-to-d@PCIFN/PCIFN; +event error.io.pci.nr-pw-d@PCIFN/PCIFN; +event error.io.pci.nr-drw-d@PCIFN/PCIFN; +event error.io.pci.ta-pw-d@PCIFN/PCIFN; +event error.io.pci.ta-drw-d@PCIFN/PCIFN; +event error.io.pcix.scpe-d@PCIFN/PCIFN; + +prop fault.io.pci.device-noresp@PCIFN (0)-> + error.io.pci.nr-pw-d@PCIFN/PCIFN, + error.io.pci.nr-drw-d@PCIFN/PCIFN, + error.io.pci.retry-to-d@PCIFN/PCIFN; + +prop fault.io.pci.device-interr-unaf@PCIFN (0)-> + error.io.pci.nf-dpe-d@PCIFN/PCIFN; + +prop fault.io.pci.device-interr-deg@PCIFN (0)-> + error.io.pci.deg-dpe-d@PCIFN/PCIFN; + +prop fault.io.pci.device-interr@PCIFN (0)-> + error.io.pci.ta-pw-d@PCIFN/PCIFN, + error.io.pci.ta-drw-d@PCIFN/PCIFN, + error.io.pci.ape-d@PCIFN/PCIFN, + error.io.pcix.scpe-d@PCIFN/PCIFN, + error.io.pci.f-dpe-d@PCIFN/PCIFN; /* * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -450,19 +493,26 @@ prop fault.io.pci.device-interr@pcibus/pcidev/pcifn (0)-> * - scpe-u: split completion to get corrupted during upstream transmission. */ -fru pcibus; -asru pcibus; +event fault.io.pci.bus-linkerr-unaf@pcibus, + engine=serd.io.pci.nf-dpe-bus@pcibus, FITrate=PCI_BUS_FIT; + +event fault.io.pci.bus-linkerr-deg@pcibus, FITrate=PCI_BUS_FIT, retire=0; + +event fault.io.pci.bus-linkerr@pcibus, FITrate=PCI_BUS_FIT; -event fault.io.pci.bus-linkerr@pcibus, - FITrate=PCI_BUS_FIT, FRU=pcibus, ASRU=pcibus; +prop fault.io.pci.bus-linkerr-unaf@pcibus (0)-> + error.io.pci.nf-dpe-d@pcibus/pcidev<todev>/pcifn { todev != 32}, + error.io.pci.nf-dpe-u@pcibus/pcidev<todev>/pcifn { todev != 32}; + +prop fault.io.pci.bus-linkerr-deg@pcibus (0)-> + error.io.pci.deg-dpe-d@pcibus/pcidev<todev>/pcifn { todev != 32}, + error.io.pci.deg-dpe-u@pcibus/pcidev<todev>/pcifn { todev != 32}; prop fault.io.pci.bus-linkerr@pcibus (0)-> error.io.pci.ape-d@pcibus/pcidev<todev>/pcifn { todev != 32}, error.io.pci.f-dpe-d@pcibus/pcidev<todev>/pcifn { todev != 32}, - error.io.pci.nf-dpe-d@pcibus/pcidev<todev>/pcifn { todev != 32}, error.io.pci.ape-u@pcibus/pcidev<todev>/pcifn { todev != 32}, error.io.pci.f-dpe-u@pcibus/pcidev<todev>/pcifn { todev != 32}, - error.io.pci.nf-dpe-u@pcibus/pcidev<todev>/pcifn { todev != 32}, error.io.pcix.scpe-d@pcibus/pcidev<todev>/pcifn { todev != 32}, error.io.pcix.scpe-u@pcibus/pcidev<todev>/pcifn { todev != 32}, error.io.pcix.tx-oor@pcibus/pcidev<todev>/pcifn { todev != 32}, @@ -474,53 +524,50 @@ prop fault.io.pci.bus-linkerr@pcibus (0)-> * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ -event error.io.pci.serr-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.perr-dw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.perr-pw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.perr-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.dpdata-pw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.dpdata-dw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.dpdata-dr-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.dpdata-pw-fwd-d@pcibus/pcidev/pcifn; -event error.io.pci.dpdata-pw-fwd-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.dpdata-dw-fwd-d@pcibus/pcidev/pcifn; -event error.io.pci.dpdata-dw-fwd-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.f-dpdata-dr-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.nf-dpdata-dr-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.leaf-ape-d@pcibus/pcidev/pcifn; -event error.io.pci.ape-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.source-ape-u@pcibus/pcidev/pcifn; -event error.io.pci.source-f-perr-u@pcibus/pcidev/pcifn; -event error.io.pci.source-nf-perr-u@pcibus/pcidev/pcifn; -event error.io.pci.badreq-pw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.badreq-drw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.badreq-pw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.badreq-drw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.ta-d@pcibus/pcidev/pcifn; -event error.io.pci.ta-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.ta-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.target-rta-d@pcibus/pcidev/pcifn; -event error.io.pci.target-ma-d@pcibus/pcidev/pcifn; -event error.io.pci.ta-pw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.ta-drw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.nr-pw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.ta-pw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.retry-to-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pcix.scpe-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pcix.source-scpe-u@pcibus/pcidev/pcifn; -event error.io.pcix.spl-comp-ma-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pcix.spl-comp-ta-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.ma-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; - -event ereport.io.pci.sec-ma@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pci.sec-sta@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pci.sec-rta@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pci.sec-mdpe@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pci.sec-dpe@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pci.sec-rserr@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pci.dto@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.sec-spl-dis@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.spl-dis@pcibus/pcidev/pcifn{within(5s)}; +event error.io.pci.serr-u@PCIFN/PCIFN; +event error.io.pci.perr-dw-u@PCIFN/PCIFN; +event error.io.pci.perr-pw-u@PCIFN/PCIFN; +event error.io.pci.perr-d@PCIFN/PCIFN; +event error.io.pci.dpdata-pw-u@PCIFN/PCIFN; +event error.io.pci.dpdata-dw-u@PCIFN/PCIFN; +event error.io.pci.dpdata-dr-u@PCIFN/PCIFN; +event error.io.pci.dpdata-pw-fwd-d@PCIFN; +event error.io.pci.dpdata-pw-fwd-d@PCIFN/PCIFN; +event error.io.pci.dpdata-dw-fwd-d@PCIFN; +event error.io.pci.dpdata-dw-fwd-d@PCIFN/PCIFN; +event error.io.pci.dpdata-dr-fwd-d@PCIFN; +event error.io.pci.dpdata-dr-fwd-d@PCIFN/PCIFN; +event error.io.pci.source-perr-u@PCIFN; +event error.io.pci.leaf-ape-d@PCIFN; +event error.io.pci.ape-u@PCIFN/PCIFN; +event error.io.pci.source-ape-u@PCIFN; +event error.io.pci.badreq-pw-d@PCIFN/PCIFN; +event error.io.pci.badreq-drw-d@PCIFN/PCIFN; +event error.io.pci.badreq-pw-u@PCIFN/PCIFN; +event error.io.pci.badreq-drw-u@PCIFN/PCIFN; +event error.io.pci.ta-d@PCIFN; +event error.io.pci.ta-d@PCIFN/PCIFN; +event error.io.pci.ta-u@PCIFN/PCIFN; +event error.io.pci.target-rta-d@PCIFN; +event error.io.pci.target-ma-d@PCIFN; +event error.io.pci.nr-pw-u@PCIFN/PCIFN; +event error.io.pci.ta-pw-u@PCIFN/PCIFN; +event error.io.pci.retry-to-u@PCIFN/PCIFN; +event error.io.pcix.scpe-u@PCIFN/PCIFN; +event error.io.pcix.source-scpe-u@PCIFN; +event error.io.pcix.spl-comp-ma-u@PCIFN/PCIFN; +event error.io.pcix.spl-comp-ta-u@PCIFN/PCIFN; +event error.io.pci.ma-u@PCIFN/PCIFN; + +event ereport.io.pci.sec-ma@PCIFN{within(5s)}; +event ereport.io.pci.sec-sta@PCIFN{within(5s)}; +event ereport.io.pci.sec-rta@PCIFN{within(5s)}; +event ereport.io.pci.sec-mdpe@PCIFN{within(5s)}; +event ereport.io.pci.sec-dpe@PCIFN{within(5s)}; +event ereport.io.pci.sec-rserr@PCIFN{within(5s)}; +event ereport.io.pci.dto@PCIFN{within(5s)}; +event ereport.io.pcix.sec-spl-dis@PCIFN{within(5s)}; +event ereport.io.pcix.spl-dis@PCIFN{within(5s)}; /* * SERR# can propagate upstream and may be seen by other devices on the bus @@ -528,36 +575,36 @@ event ereport.io.pcix.spl-dis@pcibus/pcidev/pcifn{within(5s)}; prop error.io.pci.serr-u@pcibus/pcidev[fromdev]/pcifn (0)-> ereport.io.pci.sserr@pcibus/pcidev<todev>/pcifn<> {todev!=fromdev}; -prop error.io.pci.serr-u@pcibus/pcidev/pcifn { IS_BDG } (1)-> - ereport.io.pci.sserr@pcibus/pcidev/pcifn; +prop error.io.pci.serr-u@PCIFN { IS_BDG } (1)-> + ereport.io.pci.sserr@PCIFN; -prop error.io.pci.serr-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (2)-> - ereport.io.pci.sec-rserr@pcibus/pcidev/pcifn, - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pci.serr-u@PCIFN/PCIFN (2)-> + ereport.io.pci.sec-rserr@PCIFN, + error.io.pci.serr-u@PCIFN; /* * PERR# can propagate upstream for delayed writes. For posted writes * it turns into an SERR#. */ -prop error.io.pci.perr-dw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (2)-> - ereport.io.pci.sec-mdpe@pcibus/pcidev/pcifn, - error.io.pci.perr-dw-u@pcibus/pcidev/pcifn; +prop error.io.pci.perr-dw-u@PCIFN/PCIFN (2)-> + ereport.io.pci.sec-mdpe@PCIFN, + error.io.pci.perr-dw-u@PCIFN; -prop error.io.pci.perr-pw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (2)-> - ereport.io.pci.sec-mdpe@pcibus/pcidev/pcifn, - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pci.perr-pw-u@PCIFN/PCIFN (2)-> + ereport.io.pci.sec-mdpe@PCIFN, + error.io.pci.serr-u@PCIFN; /* * PERR# can propagate downstream (only for downstream dw parity error) */ -prop error.io.pci.perr-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.mdpe@pcibus/pcidev/pcifn; +prop error.io.pci.perr-d@PCIFN { IS_LEAF } (0)-> + ereport.io.pci.mdpe@PCIFN; -prop error.io.pci.perr-d@pcibus/pcidev/pcifn { IS_BDG } (1)-> - ereport.io.pci.mdpe@pcibus/pcidev/pcifn; +prop error.io.pci.perr-d@PCIFN { IS_BDG } (1)-> + ereport.io.pci.mdpe@PCIFN; -prop error.io.pci.perr-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.perr-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pci.perr-d@PCIFN (1)-> + error.io.pci.perr-d@PCIFN/PCIFNHZ; /* * downstream target ereports are for any descendant device @@ -567,195 +614,195 @@ prop error.io.pci.perr-d@pcibus/pcidev/pcifn (1)-> * determined. This is not a requirement of the Diagnosis Engine, but can be * valuable when available. */ -prop error.io.pci.target-mdpe-d@pcibus/pcidev/pcifn (0)-> - ereport.io.pci.target-mdpe@pcibus/pcidev/pcifn; +prop error.io.pci.target-mdpe-d@PCIFN (0)-> + ereport.io.pci.target-mdpe@PCIFN; -prop error.io.pci.target-mdpe-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.target-mdpe-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pci.target-mdpe-d@PCIFN (1)-> + error.io.pci.target-mdpe-d@PCIFN/PCIFNHZ; -prop error.io.pci.target-rta-d@pcibus/pcidev/pcifn (0)-> - ereport.io.pci.target-rta@pcibus/pcidev/pcifn; +prop error.io.pci.target-rta-d@PCIFN (0)-> + ereport.io.pci.target-rta@PCIFN; -prop error.io.pci.target-rta-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.target-rta-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pci.target-rta-d@PCIFN (1)-> + error.io.pci.target-rta-d@PCIFN/PCIFNHZ; -prop error.io.pci.target-ma-d@pcibus/pcidev/pcifn (0)-> - ereport.io.pci.target-ma@pcibus/pcidev/pcifn; +prop error.io.pci.target-ma-d@PCIFN (0)-> + ereport.io.pci.target-ma@PCIFN; -prop error.io.pci.target-ma-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.target-ma-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pci.target-ma-d@PCIFN (1)-> + error.io.pci.target-ma-d@PCIFN/PCIFNHZ; /* * target aborts propagate upstream */ -prop error.io.pci.ta-u@pcibus/pcidev/pcifn { IS_BDG } (1)-> - ereport.io.pci.sta@pcibus/pcidev/pcifn; +prop error.io.pci.ta-u@PCIFN { IS_BDG } (1)-> + ereport.io.pci.sta@PCIFN; -prop error.io.pci.ta-u@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.sta@pcibus/pcidev/pcifn; +prop error.io.pci.ta-u@PCIFN { IS_LEAF } (0)-> + ereport.io.pci.sta@PCIFN; -prop error.io.pci.ta-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (2)-> - ereport.io.pci.sec-rta@pcibus/pcidev/pcifn, - error.io.pci.ta-u@pcibus/pcidev/pcifn; +prop error.io.pci.ta-u@PCIFN/PCIFN (2)-> + ereport.io.pci.sec-rta@PCIFN, + error.io.pci.ta-u@PCIFN; /* * bad data (ie invalid but not an ape or dpe) can propagate downstream, * and at some point may result in a target or master abort */ -prop error.io.pci.badreq-pw-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.badreq-pw-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>, - error.io.pci.nr-pw-u@pcibus/pcidev/pcifn, - error.io.pci.ta-pw-u@pcibus/pcidev/pcifn; +prop error.io.pci.badreq-pw-d@PCIFN (1)-> + error.io.pci.badreq-pw-d@PCIFN/PCIFNHZ, + error.io.pci.nr-pw-u@PCIFN, + error.io.pci.ta-pw-u@PCIFN; -prop error.io.pci.badreq-pw-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - error.io.pci.nr-pw-u@pcibus/pcidev/pcifn, - error.io.pci.ta-pw-u@pcibus/pcidev/pcifn; +prop error.io.pci.badreq-pw-d@PCIFN { IS_LEAF } (0)-> + error.io.pci.nr-pw-u@PCIFN, + error.io.pci.ta-pw-u@PCIFN; -prop error.io.pci.badreq-drw-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.badreq-drw-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>, - error.io.pci.nr-drw-u@pcibus/pcidev/pcifn, - error.io.pci.ta-drw-u@pcibus/pcidev/pcifn; +prop error.io.pci.badreq-drw-d@PCIFN (1)-> + error.io.pci.badreq-drw-d@PCIFN/PCIFNHZ, + error.io.pci.nr-drw-u@PCIFN, + error.io.pci.ta-drw-u@PCIFN; -prop error.io.pci.badreq-drw-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - error.io.pci.nr-drw-u@pcibus/pcidev/pcifn, - error.io.pci.ta-drw-u@pcibus/pcidev/pcifn; +prop error.io.pci.badreq-drw-d@PCIFN { IS_LEAF } (0)-> + error.io.pci.nr-drw-u@PCIFN, + error.io.pci.ta-drw-u@PCIFN; -prop error.io.pci.nr-pw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (2)-> - ereport.io.pci.sec-ma@pcibus/pcidev/pcifn, - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pci.nr-pw-u@PCIFN/PCIFN (2)-> + ereport.io.pci.sec-ma@PCIFN, + error.io.pci.serr-u@PCIFN; -prop error.io.pci.ta-pw-u@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.sta@pcibus/pcidev/pcifn; +prop error.io.pci.ta-pw-u@PCIFN { IS_LEAF } (0)-> + ereport.io.pci.sta@PCIFN; -prop error.io.pci.ta-pw-u@pcibus/pcidev/pcifn { IS_BDG } (1)-> - ereport.io.pci.sta@pcibus/pcidev/pcifn; +prop error.io.pci.ta-pw-u@PCIFN { IS_BDG } (1)-> + ereport.io.pci.sta@PCIFN; -prop error.io.pci.ta-pw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (2)-> - ereport.io.pci.sec-rta@pcibus/pcidev/pcifn, - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pci.ta-pw-u@PCIFN/PCIFN (2)-> + ereport.io.pci.sec-rta@PCIFN, + error.io.pci.serr-u@PCIFN; -prop error.io.pci.nr-drw-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.ma-u@pcibus/pcidev/pcifn; +prop error.io.pci.nr-drw-u@PCIFN (1)-> + error.io.pci.ma-u@PCIFN; -prop error.io.pci.nr-drw-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.target-rta-d@pcibus/pcidev/pcifn, - error.io.pci.target-ma-d@pcibus/pcidev/pcifn; +prop error.io.pci.nr-drw-u@PCIFN (1)-> + error.io.pci.target-rta-d@PCIFN, + error.io.pci.target-ma-d@PCIFN; -prop error.io.pci.ma-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (1)-> - ereport.io.pci.sec-ma@pcibus/pcidev/pcifn; +prop error.io.pci.ma-u@PCIFN/PCIFN (1)-> + ereport.io.pci.sec-ma@PCIFN; -prop error.io.pci.ma-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (1)-> - error.io.pci.ma-u@pcibus/pcidev/pcifn, - error.io.pci.ta-u@pcibus/pcidev/pcifn; +prop error.io.pci.ma-u@PCIFN/PCIFN (1)-> + error.io.pci.ma-u@PCIFN, + error.io.pci.ta-u@PCIFN; -prop error.io.pci.ta-drw-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.ta-u@pcibus/pcidev/pcifn; +prop error.io.pci.ta-drw-u@PCIFN (1)-> + error.io.pci.ta-u@PCIFN; -prop error.io.pci.ta-drw-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.target-rta-d@pcibus/pcidev/pcifn; +prop error.io.pci.ta-drw-u@PCIFN (1)-> + error.io.pci.target-rta-d@PCIFN; /* * bad data (ie invalid but not an ape or dpe) can propagate upstream, * and at some point may result in a target or master abort */ -prop error.io.pci.badreq-pw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (1)-> - error.io.pci.badreq-pw-u@pcibus/pcidev/pcifn, - error.io.pci.nr-pw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn, - error.io.pci.ta-pw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; +prop error.io.pci.badreq-pw-u@PCIFN/PCIFN (1)-> + error.io.pci.badreq-pw-u@PCIFN, + error.io.pci.nr-pw-d@PCIFN/PCIFN, + error.io.pci.ta-pw-d@PCIFN/PCIFN; -prop error.io.pci.badreq-pw-u@pcibus/pcidev/pcifn (0)-> - error.io.pci.nr-pw-d@pcibus/pcidev/pcifn, - error.io.pci.ta-pw-d@pcibus/pcidev/pcifn; +prop error.io.pci.badreq-pw-u@PCIFN (0)-> + error.io.pci.nr-pw-d@PCIFN, + error.io.pci.ta-pw-d@PCIFN; -prop error.io.pci.nr-pw-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.ma@pcibus/pcidev/pcifn; +prop error.io.pci.nr-pw-d@PCIFN { IS_LEAF } (0)-> + ereport.io.pci.ma@PCIFN; -prop error.io.pci.nr-pw-d@pcibus/pcidev/pcifn { IS_BDG } (2)-> - ereport.io.pci.ma@pcibus/pcidev/pcifn, - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pci.nr-pw-d@PCIFN { IS_BDG } (2)-> + ereport.io.pci.ma@PCIFN, + error.io.pci.serr-u@PCIFN; -prop error.io.pci.ta-pw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (1)-> - ereport.io.pci.sec-sta@pcibus/pcidev/pcifn; +prop error.io.pci.ta-pw-d@PCIFN/PCIFN (1)-> + ereport.io.pci.sec-sta@PCIFN; -prop error.io.pci.ta-pw-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.rta@pcibus/pcidev/pcifn; +prop error.io.pci.ta-pw-d@PCIFN { IS_LEAF } (0)-> + ereport.io.pci.rta@PCIFN; -prop error.io.pci.ta-pw-d@pcibus/pcidev/pcifn { IS_BDG } (2)-> - ereport.io.pci.rta@pcibus/pcidev/pcifn, - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pci.ta-pw-d@PCIFN { IS_BDG } (2)-> + ereport.io.pci.rta@PCIFN, + error.io.pci.serr-u@PCIFN; /* * for delayed writes we treat upstream badreq specially as rta always * propagates back downstream to the leaf */ -prop error.io.pci.badreq-drw-u@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.rta@pcibus/pcidev/pcifn, - ereport.io.pci.ma@pcibus/pcidev/pcifn; +prop error.io.pci.badreq-drw-u@PCIFN { IS_LEAF } (0)-> + ereport.io.pci.rta@PCIFN, + ereport.io.pci.ma@PCIFN; -prop error.io.pci.badreq-drw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (1)-> - ereport.io.pci.ma@pcibus/pcidev/pcifn, - ereport.io.pci.rta@pcibus/pcidev/pcifn; +prop error.io.pci.badreq-drw-u@PCIFN/PCIFN (1)-> + ereport.io.pci.ma@PCIFN, + ereport.io.pci.rta@PCIFN; -prop error.io.pci.badreq-drw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (0)-> - ereport.io.pci.sec-sta@pcibus/pcidev/pcifn; +prop error.io.pci.badreq-drw-u@PCIFN/PCIFN (0)-> + ereport.io.pci.sec-sta@PCIFN; -prop error.io.pci.badreq-drw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (0)-> - error.io.pci.badreq-drw-u@pcibus/pcidev/pcifn; +prop error.io.pci.badreq-drw-u@PCIFN/PCIFN (0)-> + error.io.pci.badreq-drw-u@PCIFN; -prop error.io.pci.nr-drw-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.ma@pcibus/pcidev/pcifn; +prop error.io.pci.nr-drw-d@PCIFN { IS_LEAF } (0)-> + ereport.io.pci.ma@PCIFN; -prop error.io.pci.nr-drw-d@pcibus/pcidev/pcifn { IS_BDG } (1)-> - ereport.io.pci.ma@pcibus/pcidev/pcifn; +prop error.io.pci.nr-drw-d@PCIFN { IS_BDG } (1)-> + ereport.io.pci.ma@PCIFN; -prop error.io.pci.nr-drw-d@pcibus/pcidev/pcifn { IS_BDG } (0)-> - ereport.io.pci.sec-sta@pcibus/pcidev/pcifn; +prop error.io.pci.nr-drw-d@PCIFN { IS_BDG } (0)-> + ereport.io.pci.sec-sta@PCIFN; -prop error.io.pci.nr-drw-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.ta-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>, - error.io.pci.nr-drw-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pci.nr-drw-d@PCIFN (1)-> + error.io.pci.ta-d@PCIFN/PCIFNHZ, + error.io.pci.nr-drw-d@PCIFN/PCIFNHZ; -prop error.io.pci.ta-drw-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (1)-> - ereport.io.pci.sec-sta@pcibus/pcidev/pcifn; +prop error.io.pci.ta-drw-d@PCIFN/PCIFN (1)-> + ereport.io.pci.sec-sta@PCIFN; -prop error.io.pci.ta-drw-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.ta-d@pcibus/pcidev/pcifn; +prop error.io.pci.ta-drw-d@PCIFN (1)-> + error.io.pci.ta-d@PCIFN; -prop error.io.pci.ta-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.rta@pcibus/pcidev/pcifn; +prop error.io.pci.ta-d@PCIFN { IS_LEAF } (0)-> + ereport.io.pci.rta@PCIFN; -prop error.io.pci.ta-d@pcibus/pcidev/pcifn { IS_BDG } (2)-> - ereport.io.pci.sec-sta@pcibus/pcidev/pcifn, - ereport.io.pci.rta@pcibus/pcidev/pcifn; +prop error.io.pci.ta-d@PCIFN { IS_BDG } (2)-> + ereport.io.pci.sec-sta@PCIFN, + ereport.io.pci.rta@PCIFN; -prop error.io.pci.ta-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.ta-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pci.ta-d@PCIFN (1)-> + error.io.pci.ta-d@PCIFN/PCIFNHZ; /* * Request with address parity error must be detected by parent device * and can optionally result in a target or master abort. * It may also be detected by sibling devices on a bus */ -prop error.io.pci.ape-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (3)-> - ereport.io.pci.sec-dpe@pcibus/pcidev/pcifn, - ereport.io.pci.sec-rserr@pcibus/pcidev/pcifn, - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pci.ape-u@PCIFN/PCIFN (3)-> + ereport.io.pci.sec-dpe@PCIFN, + ereport.io.pci.sec-rserr@PCIFN, + error.io.pci.serr-u@PCIFN; -prop error.io.pci.ape-u@pcibus/pcidev/pcifn (0)-> - error.io.pci.nr-drw-d@pcibus/pcidev/pcifn, - error.io.pci.ta-drw-d@pcibus/pcidev/pcifn, - error.io.pci.nr-pw-d@pcibus/pcidev/pcifn, - error.io.pci.ta-pw-d@pcibus/pcidev/pcifn; +prop error.io.pci.ape-u@PCIFN (0)-> + error.io.pci.nr-drw-d@PCIFN, + error.io.pci.ta-drw-d@PCIFN, + error.io.pci.nr-pw-d@PCIFN, + error.io.pci.ta-pw-d@PCIFN; -prop error.io.pci.ape-u@pcibus/pcidev/pcifn (0)-> - ereport.io.pci.mdpe@pcibus/pcidev/pcifn; +prop error.io.pci.ape-u@PCIFN (0)-> + ereport.io.pci.mdpe@PCIFN; prop error.io.pci.ape-u@pcibus/pcidev[fromdev]/pcifn (0)-> ereport.io.pci.dpe@pcibus/pcidev<todev>/pcifn<> {fromdev != todev}, ereport.io.pci.sserr@pcibus/pcidev<todev>/pcifn<> {fromdev != todev}; -prop error.io.pci.ape-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.source-ape-u@pcibus/pcidev/pcifn; +prop error.io.pci.ape-u@PCIFN (1)-> + error.io.pci.source-ape-u@PCIFN; /* * If the bridge sees an upstream split completion error (pci-x only) it could @@ -767,63 +814,63 @@ prop error.io.pci.ape-u@pcibus/pcidev/pcifn (1)-> * just drop the request (which the child device sees as a split * completion ma) */ -prop error.io.pcix.scpe-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (0)-> - ereport.io.pci.sec-sta@pcibus/pcidev/pcifn, - ereport.io.pci.sec-dpe@pcibus/pcidev/pcifn, - ereport.io.pci.sec-rserr@pcibus/pcidev/pcifn, - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pcix.scpe-u@PCIFN/PCIFN (0)-> + ereport.io.pci.sec-sta@PCIFN, + ereport.io.pci.sec-dpe@PCIFN, + ereport.io.pci.sec-rserr@PCIFN, + error.io.pci.serr-u@PCIFN; -prop error.io.pcix.scpe-u@pcibus/pcidev/pcifn (1)-> - error.io.pcix.spl-comp-ma-d@pcibus/pcidev/pcifn, - error.io.pcix.spl-comp-ta-d@pcibus/pcidev/pcifn; +prop error.io.pcix.scpe-u@PCIFN (1)-> + error.io.pcix.spl-comp-ma-d@PCIFN, + error.io.pcix.spl-comp-ta-d@PCIFN; -prop error.io.pcix.spl-comp-ma-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pcix.spl-comp-ma-d@PCIFN (1)-> + error.io.pci.serr-u@PCIFN; -prop error.io.pcix.spl-comp-ma-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.sserr@pcibus/pcidev/pcifn, - ereport.io.pcix.spl-dis@pcibus/pcidev/pcifn; +prop error.io.pcix.spl-comp-ma-d@PCIFN { IS_LEAF } (0)-> + ereport.io.pci.sserr@PCIFN, + ereport.io.pcix.spl-dis@PCIFN; -prop error.io.pcix.spl-comp-ma-d@pcibus/pcidev/pcifn { IS_BDG } (2)-> - ereport.io.pcix.spl-dis@pcibus/pcidev/pcifn, - ereport.io.pci.ma@pcibus/pcidev/pcifn; +prop error.io.pcix.spl-comp-ma-d@PCIFN { IS_BDG } (2)-> + ereport.io.pcix.spl-dis@PCIFN, + ereport.io.pci.ma@PCIFN; -prop error.io.pcix.spl-comp-ta-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pcix.spl-comp-ta-d@PCIFN (1)-> + error.io.pci.serr-u@PCIFN; -prop error.io.pcix.spl-comp-ta-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.sserr@pcibus/pcidev/pcifn, - ereport.io.pcix.spl-dis@pcibus/pcidev/pcifn; +prop error.io.pcix.spl-comp-ta-d@PCIFN { IS_LEAF } (0)-> + ereport.io.pci.sserr@PCIFN, + ereport.io.pcix.spl-dis@PCIFN; -prop error.io.pcix.spl-comp-ta-d@pcibus/pcidev/pcifn { IS_BDG } (2)-> - ereport.io.pcix.spl-dis@pcibus/pcidev/pcifn, - ereport.io.pci.rta@pcibus/pcidev/pcifn; +prop error.io.pcix.spl-comp-ta-d@PCIFN { IS_BDG } (2)-> + ereport.io.pcix.spl-dis@PCIFN, + ereport.io.pci.rta@PCIFN; -prop error.io.pcix.scpe-u@pcibus/pcidev/pcifn (1)-> - error.io.pcix.source-scpe-u@pcibus/pcidev/pcifn; +prop error.io.pcix.scpe-u@PCIFN (1)-> + error.io.pcix.source-scpe-u@PCIFN; /* * request with address parity error must be detected by child device * and can optionally result in a target or master abort. */ -prop error.io.pci.ape-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pci.ape-d@PCIFN (1)-> + error.io.pci.serr-u@PCIFN; -prop error.io.pci.ape-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - error.io.pci.leaf-ape-d@pcibus/pcidev/pcifn; +prop error.io.pci.ape-d@PCIFN { IS_LEAF } (0)-> + error.io.pci.leaf-ape-d@PCIFN; -prop error.io.pci.leaf-ape-d@pcibus/pcidev/pcifn { IS_LEAF } (2)-> - ereport.io.pci.sserr@pcibus/pcidev/pcifn, - ereport.io.pci.dpe@pcibus/pcidev/pcifn; +prop error.io.pci.leaf-ape-d@PCIFN { IS_LEAF } (2)-> + ereport.io.pci.sserr@PCIFN, + ereport.io.pci.dpe@PCIFN; -prop error.io.pci.ape-d@pcibus/pcidev/pcifn { IS_BDG } (1)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn; +prop error.io.pci.ape-d@PCIFN { IS_BDG } (1)-> + ereport.io.pci.dpe@PCIFN; -prop error.io.pci.ape-d@pcibus/pcidev/pcifn (0)-> - error.io.pci.ta-pw-u@pcibus/pcidev/pcifn, - error.io.pci.ta-drw-u@pcibus/pcidev/pcifn, - error.io.pci.nr-pw-u@pcibus/pcidev/pcifn, - error.io.pci.nr-drw-u@pcibus/pcidev/pcifn; +prop error.io.pci.ape-d@PCIFN (0)-> + error.io.pci.ta-pw-u@PCIFN, + error.io.pci.ta-drw-u@PCIFN, + error.io.pci.nr-pw-u@PCIFN, + error.io.pci.nr-drw-u@PCIFN; /* * If the device sees a downstream split completion error (pci-x only) it could @@ -835,27 +882,27 @@ prop error.io.pci.ape-d@pcibus/pcidev/pcifn (0)-> * just drop the request (which the parent bridge sees as a split * completion ma) */ -prop error.io.pcix.scpe-d@pcibus/pcidev/pcifn (0)-> - ereport.io.pci.sta@pcibus/pcidev/pcifn, - ereport.io.pci.dpe@pcibus/pcidev/pcifn, - ereport.io.pci.sserr@pcibus/pcidev/pcifn, - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pcix.scpe-d@PCIFN (0)-> + ereport.io.pci.sta@PCIFN, + ereport.io.pci.dpe@PCIFN, + ereport.io.pci.sserr@PCIFN, + error.io.pci.serr-u@PCIFN; -prop error.io.pcix.scpe-d@pcibus/pcidev/pcifn (1)-> - error.io.pcix.spl-comp-ma-u@pcibus/pcidev/pcifn, - error.io.pcix.spl-comp-ta-u@pcibus/pcidev/pcifn; +prop error.io.pcix.scpe-d@PCIFN (1)-> + error.io.pcix.spl-comp-ma-u@PCIFN, + error.io.pcix.spl-comp-ta-u@PCIFN; -prop error.io.pcix.spl-comp-ma-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (2)-> - ereport.io.pcix.sec-spl-dis@pcibus/pcidev/pcifn, - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pcix.spl-comp-ma-u@PCIFN/PCIFN (2)-> + ereport.io.pcix.sec-spl-dis@PCIFN, + error.io.pci.serr-u@PCIFN; -prop error.io.pcix.spl-comp-ma-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (0)-> - ereport.io.pci.sec-ma@pcibus/pcidev/pcifn; +prop error.io.pcix.spl-comp-ma-u@PCIFN/PCIFN (0)-> + ereport.io.pci.sec-ma@PCIFN; -prop error.io.pcix.spl-comp-ta-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (3)-> - ereport.io.pcix.sec-spl-dis@pcibus/pcidev/pcifn, - error.io.pci.serr-u@pcibus/pcidev/pcifn, - ereport.io.pci.sec-rta@pcibus/pcidev/pcifn; +prop error.io.pcix.spl-comp-ta-u@PCIFN/PCIFN (3)-> + ereport.io.pcix.sec-spl-dis@PCIFN, + error.io.pci.serr-u@PCIFN, + ereport.io.pci.sec-rta@PCIFN; /* * request with data parity error can propagate upstream @@ -866,28 +913,28 @@ prop error.io.pcix.spl-comp-ta-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (3)-> * if there is a dpe on a retry on a delayed write, we don't send another * retry, and eventually the dto timer will expire */ -prop error.io.pci.dpdata-pw-u@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.mdpe@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-pw-u@PCIFN { IS_LEAF } (0)-> + ereport.io.pci.mdpe@PCIFN; -prop error.io.pci.dpdata-pw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (3)-> - ereport.io.pci.mdpe@pcibus/pcidev/pcifn, - ereport.io.pci.sec-dpe@pcibus/pcidev/pcifn, - error.io.pci.dpdata-pw-u@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-pw-u@PCIFN/PCIFN (3)-> + ereport.io.pci.mdpe@PCIFN, + ereport.io.pci.sec-dpe@PCIFN, + error.io.pci.dpdata-pw-u@PCIFN; -prop error.io.pci.dpdata-dw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (1)-> - ereport.io.pci.sec-dpe@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-dw-u@PCIFN/PCIFN (1)-> + ereport.io.pci.sec-dpe@PCIFN; -prop error.io.pci.dpdata-dw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (0)-> - ereport.io.pci.mdpe@pcibus/pcidev/pcifn, - error.io.pci.dpdata-dw-u@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-dw-u@PCIFN/PCIFN (0)-> + ereport.io.pci.mdpe@PCIFN, + error.io.pci.dpdata-dw-u@PCIFN; -prop error.io.pci.dpdata-dw-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (0)-> - error.io.pci.retry-to-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-dw-u@PCIFN/PCIFN (0)-> + error.io.pci.retry-to-u@PCIFN/PCIFN; -prop error.io.pci.dpdata-dr-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (3)-> - ereport.io.pci.sec-dpe@pcibus/pcidev/pcifn, - ereport.io.pci.sec-mdpe@pcibus/pcidev/pcifn, - error.io.pci.dpdata-dr-u@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-dr-u@PCIFN/PCIFN (3)-> + ereport.io.pci.sec-dpe@PCIFN, + ereport.io.pci.sec-mdpe@PCIFN, + error.io.pci.dpdata-dr-u@PCIFN; /* * Request with data parity error can propagate downstream. A hardened @@ -902,203 +949,123 @@ prop error.io.pci.dpdata-dr-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (3)-> * if there is a dpe on a retry on a delayed write, we don't send another * retry, and eventually the dto timer will expire */ -prop error.io.pci.f-dpdata-pw-d@pcibus/pcidev/pcifn (2)-> - error.io.pci.perr-pw-u@pcibus/pcidev/pcifn, - error.io.pci.source-f-perr-u@pcibus/pcidev/pcifn; - -prop error.io.pci.f-dpdata-pw-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn; - -prop error.io.pci.f-dpdata-pw-d@pcibus/pcidev/pcifn { IS_BDG } (2)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn, - ereport.io.pci.sec-mdpe@pcibus/pcidev/pcifn; - -prop error.io.pci.f-dpdata-pw-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.dpdata-pw-fwd-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pci.nf-dpdata-pw-d@pcibus/pcidev/pcifn (2)-> - error.io.pci.perr-pw-u@pcibus/pcidev/pcifn, - error.io.pci.source-nf-perr-u@pcibus/pcidev/pcifn; +prop error.io.pci.f-dpe-d@PCIFN (1)-> + error.io.pci.dpdata-pw-d@PCIFN, + error.io.pci.dpdata-dw-d@PCIFN, + error.io.pci.dpdata-dr-d@PCIFN; -prop error.io.pci.nf-dpdata-pw-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn; +prop error.io.pci.f-dpe-d@PCIFN (1)-> + error.io.pci.f-source-dpdata-u@PCIFN; -prop error.io.pci.nf-dpdata-pw-d@pcibus/pcidev/pcifn { IS_BDG } (2)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn, - ereport.io.pci.sec-mdpe@pcibus/pcidev/pcifn; +prop error.io.pci.deg-dpe-d@PCIFN (1)-> + error.io.pci.dpdata-pw-d@PCIFN, + error.io.pci.dpdata-dw-d@PCIFN, + error.io.pci.dpdata-dr-d@PCIFN; -prop error.io.pci.nf-dpdata-pw-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.dpdata-pw-fwd-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pci.deg-dpe-d@PCIFN (1)-> + error.io.pci.deg-source-dpdata-u@PCIFN; -prop error.io.pci.dpdata-pw-fwd-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn; +prop error.io.pci.nf-dpe-d@PCIFN (1)-> + error.io.pci.dpdata-pw-d@PCIFN, + error.io.pci.dpdata-dw-d@PCIFN, + error.io.pci.dpdata-dr-d@PCIFN; -prop error.io.pci.dpdata-pw-fwd-d@pcibus/pcidev/pcifn { IS_BDG } (2)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn, - ereport.io.pci.sec-mdpe@pcibus/pcidev/pcifn; +prop error.io.pci.nf-dpe-d@PCIFN (1)-> + error.io.pci.nf-source-dpdata-u@PCIFN; -prop error.io.pci.dpdata-pw-fwd-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.dpdata-pw-fwd-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pci.dpdata-pw-d@PCIFN (2)-> + error.io.pci.perr-pw-u@PCIFN, + error.io.pci.dpdata-pw-fwd-d@PCIFN; -prop error.io.pci.f-dpdata-dw-d@pcibus/pcidev/pcifn (3)-> - error.io.pci.perr-dw-u@pcibus/pcidev/pcifn, - error.io.pci.source-f-perr-u@pcibus/pcidev/pcifn, - error.io.pci.target-mdpe-d@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-pw-fwd-d@PCIFN { IS_LEAF } (1)-> + error.io.pci.source-perr-u@PCIFN; -prop error.io.pci.f-dpdata-dw-d@pcibus/pcidev/pcifn (0)-> - ereport.io.pci.sec-mdpe@pcibus/pcidev/pcifn, - error.io.pci.dpdata-dw-fwd-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pci.dpdata-pw-fwd-d@PCIFN { IS_LEAF } (0)-> + ereport.io.pci.dpe@PCIFN; -prop error.io.pci.f-dpdata-dw-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-pw-fwd-d@PCIFN { IS_BDG } (2)-> + ereport.io.pci.dpe@PCIFN, + ereport.io.pci.sec-mdpe@PCIFN; -prop error.io.pci.f-dpdata-dw-d@pcibus/pcidev/pcifn { IS_BDG } (1)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-pw-fwd-d@PCIFN (1)-> + error.io.pci.dpdata-pw-fwd-d@PCIFN/PCIFNHZ; -prop error.io.pci.f-dpdata-dw-d@pcibus/pcidev/pcifn { IS_BDG } (0)-> - error.io.pci.retry-to-d@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-dw-d@PCIFN (3)-> + error.io.pci.perr-dw-u@PCIFN, + error.io.pci.target-mdpe-d@PCIFN, + error.io.pci.dpdata-dw-fwd-d@PCIFN; -prop error.io.pci.nf-dpdata-dw-d@pcibus/pcidev/pcifn (3)-> - error.io.pci.perr-dw-u@pcibus/pcidev/pcifn, - error.io.pci.source-nf-perr-u@pcibus/pcidev/pcifn, - error.io.pci.target-mdpe-d@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-dw-d@PCIFN { IS_BDG } (1)-> + ereport.io.pci.dpe@PCIFN; -prop error.io.pci.nf-dpdata-dw-d@pcibus/pcidev/pcifn (0)-> - ereport.io.pci.sec-mdpe@pcibus/pcidev/pcifn, - error.io.pci.dpdata-dw-fwd-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pci.dpdata-dw-d@PCIFN { IS_BDG } (0)-> + error.io.pci.retry-to-d@PCIFN; -prop error.io.pci.nf-dpdata-dw-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-dw-fwd-d@PCIFN { IS_LEAF } (1)-> + error.io.pci.source-perr-u@PCIFN; -prop error.io.pci.nf-dpdata-dw-d@pcibus/pcidev/pcifn { IS_BDG } (1)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-dw-fwd-d@PCIFN { IS_LEAF } (0)-> + ereport.io.pci.dpe@PCIFN; -prop error.io.pci.nf-dpdata-dw-d@pcibus/pcidev/pcifn { IS_BDG } (0)-> - error.io.pci.retry-to-d@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-dw-fwd-d@PCIFN { IS_BDG } (0)-> + ereport.io.pci.dpe@PCIFN, + ereport.io.pci.sec-mdpe@PCIFN; -prop error.io.pci.dpdata-dw-fwd-d@pcibus/pcidev/pcifn (0)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn, - ereport.io.pci.sec-mdpe@pcibus/pcidev/pcifn, - error.io.pci.dpdata-dw-fwd-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pci.dpdata-dw-fwd-d@PCIFN (0)-> + error.io.pci.dpdata-dw-fwd-d@PCIFN/PCIFNHZ; -prop error.io.pci.f-dpdata-dr-d@pcibus/pcidev/pcifn (2)-> - error.io.pci.perr-dr-u@pcibus/pcidev/pcifn, - error.io.pci.source-f-perr-u@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-dr-d@PCIFN (2)-> + error.io.pci.dpdata-dr-fwd-d@PCIFN, + error.io.pci.perr-dr-u@PCIFN; -prop error.io.pci.f-dpdata-dr-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn, - ereport.io.pci.mdpe@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-dr-fwd-d@PCIFN { IS_LEAF } (1)-> + error.io.pci.source-perr-u@PCIFN; -prop error.io.pci.f-dpdata-dr-d@pcibus/pcidev/pcifn { IS_BDG } (2)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn, - ereport.io.pci.mdpe@pcibus/pcidev/pcifn; +prop error.io.pci.dpdata-dr-fwd-d@PCIFN { IS_LEAF } (0)-> + ereport.io.pci.dpe@PCIFN, + ereport.io.pci.mdpe@PCIFN; -prop error.io.pci.f-dpdata-dr-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.f-dpdata-dr-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pci.dpdata-dr-fwd-d@PCIFN { IS_BDG } (2)-> + ereport.io.pci.dpe@PCIFN, + ereport.io.pci.mdpe@PCIFN; -prop error.io.pci.nf-dpdata-dr-d@pcibus/pcidev/pcifn (2)-> - error.io.pci.perr-dr-u@pcibus/pcidev/pcifn, - error.io.pci.source-nf-perr-u@pcibus/pcidev/pcifn; - -prop error.io.pci.nf-dpdata-dr-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn, - ereport.io.pci.mdpe@pcibus/pcidev/pcifn; - -prop error.io.pci.nf-dpdata-dr-d@pcibus/pcidev/pcifn { IS_BDG } (2)-> - ereport.io.pci.dpe@pcibus/pcidev/pcifn, - ereport.io.pci.mdpe@pcibus/pcidev/pcifn; - -prop error.io.pci.nf-dpdata-dr-d@pcibus/pcidev/pcifn (1)-> - error.io.pci.nf-dpdata-dr-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pci.dpdata-dr-fwd-d@PCIFN (1)-> + error.io.pci.dpdata-dr-fwd-d@PCIFN/PCIFNHZ; /* * delayed read/write retry timeout can cause dto at a bridge */ -prop error.io.pci.retry-to-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (0)-> - error.io.pci.retry-to-u@pcibus/pcidev/pcifn; +prop error.io.pci.retry-to-u@PCIFN/PCIFN (0)-> + error.io.pci.retry-to-u@PCIFN; -prop error.io.pci.retry-to-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (1)-> - ereport.io.pci.dto@pcibus/pcidev/pcifn; +prop error.io.pci.retry-to-u@PCIFN/PCIFN (1)-> + ereport.io.pci.dto@PCIFN; -prop error.io.pci.retry-to-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn (0)-> - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pci.retry-to-u@PCIFN/PCIFN (0)-> + error.io.pci.serr-u@PCIFN; -prop error.io.pci.retry-to-d@pcibus/pcidev/pcifn (0)-> - error.io.pci.retry-to-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; +prop error.io.pci.retry-to-d@PCIFN (0)-> + error.io.pci.retry-to-d@PCIFN/PCIFN; -prop error.io.pci.retry-to-d@pcibus/pcidev/pcifn { IS_BDG } (1)-> - ereport.io.pci.dto@pcibus/pcidev/pcifn; +prop error.io.pci.retry-to-d@PCIFN { IS_BDG } (1)-> + ereport.io.pci.dto@PCIFN; -prop error.io.pci.retry-to-d@pcibus/pcidev/pcifn { IS_BDG } (0)-> - error.io.pci.serr-u@pcibus/pcidev/pcifn; +prop error.io.pci.retry-to-d@PCIFN { IS_BDG } (0)-> + error.io.pci.serr-u@PCIFN; /* * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * source- propagations. * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ -event error.io.pci.source-f-dpdata-w-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.source-nf-dpdata-w-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.source-f-dpdata-r-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.source-nf-dpdata-r-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.source-f-perr-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.source-nf-perr-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pci.source-ape-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pcix.source-scpe-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.service.restored@pcibus/pcidev/pcifn; - -event ereport.io.service.lost@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.service.degraded@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.service.unaffected@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.service.restored@pcibus/pcidev/pcifn{within(30s)}; - -prop error.io.pci.source-f-dpdata-w-u@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.service.lost@pcibus/pcidev/pcifn, - ereport.io.service.degraded@pcibus/pcidev/pcifn; - -prop error.io.pci.source-nf-dpdata-w-u@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - ereport.io.service.unaffected@pcibus/pcidev/pcifn, - error.io.service.restored@pcibus/pcidev/pcifn; - -prop error.io.pci.source-f-dpdata-r-u@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.service.lost@pcibus/pcidev/pcifn, - ereport.io.service.degraded@pcibus/pcidev/pcifn; - -prop error.io.pci.source-nf-dpdata-r-u@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - ereport.io.service.unaffected@pcibus/pcidev/pcifn, - error.io.service.restored@pcibus/pcidev/pcifn; - -prop error.io.pci.source-f-perr-u@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.service.lost@pcibus/pcidev/pcifn, - ereport.io.service.degraded@pcibus/pcidev/pcifn; - -prop error.io.pci.source-nf-perr-u@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - ereport.io.service.unaffected@pcibus/pcidev/pcifn, - error.io.service.restored@pcibus/pcidev/pcifn; - -prop error.io.pci.source-f-perr-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.source-f-perr-u@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pci.source-nf-perr-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.source-nf-perr-u@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pci.source-f-dpdata-w-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.source-f-dpdata-w-u@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pci.source-nf-dpdata-w-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.source-nf-dpdata-w-u@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pci.source-f-dpdata-r-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.source-f-dpdata-r-u@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pci.source-nf-dpdata-r-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.source-nf-dpdata-r-u@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pci.source-ape-u@pcibus/pcidev/pcifn (1)-> - error.io.pci.source-ape-u@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +event error.io.pci.source-ape-u@PCIFN/PCIFN; +event error.io.pcix.source-scpe-u@PCIFN/PCIFN; + +prop error.io.pci.source-ape-u@PCIFN (1)-> + error.io.pci.source-ape-u@PCIFN/PCIFNHZ; -prop error.io.pcix.source-scpe-u@pcibus/pcidev/pcifn (1)-> - error.io.pcix.source-scpe-u@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pcix.source-scpe-u@PCIFN (1)-> + error.io.pcix.source-scpe-u@PCIFN/PCIFNHZ; /* * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -1106,117 +1073,53 @@ prop error.io.pcix.source-scpe-u@pcibus/pcidev/pcifn (1)-> * no service impact - otherwise fail immediately * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ -event ereport.io.device.inval_state@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.device.no_response@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.device.stall@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.device.badint_limit@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.device.intern_corr@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.device.intern_uncorr@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.device.nf-device@pcibus/pcidev/pcifn{within(5s)}; - -prop error.io.service.restored@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - ereport.io.service.lost@pcibus/pcidev/pcifn, - ereport.io.service.degraded@pcibus/pcidev/pcifn; - -prop error.io.service.restored@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - ereport.io.service.restored@pcibus/pcidev/pcifn; - -prop error.io.device.f-device@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - ereport.io.device.inval_state@pcibus/pcidev/pcifn, - ereport.io.device.no_response@pcibus/pcidev/pcifn, - ereport.io.device.stall@pcibus/pcidev/pcifn, - ereport.io.device.badint_limit@pcibus/pcidev/pcifn, - ereport.io.device.intern_corr@pcibus/pcidev/pcifn, - ereport.io.device.intern_uncorr@pcibus/pcidev/pcifn; - -prop error.io.device.f-device@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - ereport.io.service.lost@pcibus/pcidev/pcifn, - ereport.io.service.degraded@pcibus/pcidev/pcifn; - -engine serd.io.device.nonfatal@pcibus/pcidev/pcifn, - N=NONFATAL_COUNT, T=NONFATAL_TIME, method=persistent, - trip=ereport.io.device.nf-device@pcibus/pcidev/pcifn; - -event upset.io.device.nonfatal@pcibus/pcidev/pcifn, - engine=serd.io.device.nonfatal@pcibus/pcidev/pcifn; - -prop error.io.device.nf-device@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - ereport.io.device.nf-device@pcibus/pcidev/pcifn; - -prop error.io.device.nf-device@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - ereport.io.device.inval_state@pcibus/pcidev/pcifn, - ereport.io.device.no_response@pcibus/pcidev/pcifn, - ereport.io.device.stall@pcibus/pcidev/pcifn, - ereport.io.device.badint_limit@pcibus/pcidev/pcifn, - ereport.io.device.intern_corr@pcibus/pcidev/pcifn, - ereport.io.device.intern_uncorr@pcibus/pcidev/pcifn, - ereport.io.service.unaffected@pcibus/pcidev/pcifn, - error.io.service.restored@pcibus/pcidev/pcifn; - -prop upset.io.device.nonfatal@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - ereport.io.device.inval_state@pcibus/pcidev/pcifn, - ereport.io.device.no_response@pcibus/pcidev/pcifn, - ereport.io.device.stall@pcibus/pcidev/pcifn, - ereport.io.device.badint_limit@pcibus/pcidev/pcifn, - ereport.io.device.intern_corr@pcibus/pcidev/pcifn, - ereport.io.device.intern_uncorr@pcibus/pcidev/pcifn; - -prop upset.io.device.nonfatal@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - ereport.io.service.unaffected@pcibus/pcidev/pcifn, - error.io.service.restored@pcibus/pcidev/pcifn; - -/* - * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * Handling of pci express nonfatal errors (dpe). Use serd engine if - * no service impact - otherwise fail immediately - * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - */ -event ereport.io.pci.nf-dpe-d@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pci.nf-dpe-u@pcibus/pcidev/pcifn{within(5s)}; - -engine serd.io.pci.nf-dpe-u@pcibus/pcidev/pcifn, - N=NONFATAL_DPE_U_COUNT, T=NONFATAL_DPE_U_TIME, method=persistent, - trip=ereport.io.pci.nf-dpe-u@pcibus/pcidev/pcifn; - -event upset.io.pci.nf-dpe-u@pcibus/pcidev/pcifn, - engine=serd.io.pci.nf-dpe-u@pcibus/pcidev/pcifn; - -prop error.io.pci.nf-dpe-u@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - ereport.io.pci.nf-dpe-u@pcibus/pcidev/pcifn; - -prop error.io.pci.nf-dpe-u@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - error.io.pci.nonfatal-dpe-u@pcibus/pcidev/pcifn, - ereport.io.service.unaffected@pcibus/pcidev/pcifn, - error.io.service.restored@pcibus/pcidev/pcifn; - -prop upset.io.pci.nf-dpe-u@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - error.io.pci.nonfatal-dpe-u@pcibus/pcidev/pcifn; - -prop upset.io.pci.nf-dpe-u@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - ereport.io.service.unaffected@pcibus/pcidev/pcifn, - error.io.service.restored@pcibus/pcidev/pcifn; - -engine serd.io.pci.nf-dpe-d@pcibus/pcidev/pcifn, - N=NONFATAL_DPE_D_COUNT, T=NONFATAL_DPE_D_TIME, method=persistent, - trip=ereport.io.pci.nf-dpe-d@pcibus/pcidev/pcifn; - -event upset.io.pci.nf-dpe-d@pcibus/pcidev/pcifn, - engine=serd.io.pci.nf-dpe-d@pcibus/pcidev/pcifn; - -prop error.io.pci.nf-dpe-d@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - ereport.io.pci.nf-dpe-d@pcibus/pcidev/pcifn; - -prop error.io.pci.nf-dpe-d@pcibus/pcidev/pcifn { IS_LEAF } (0)-> - error.io.pci.nonfatal-dpe-d@pcibus/pcidev/pcifn, - ereport.io.service.unaffected@pcibus/pcidev/pcifn, - error.io.service.restored@pcibus/pcidev/pcifn; - -prop upset.io.pci.nf-dpe-d@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - error.io.pci.nonfatal-dpe-d@pcibus/pcidev/pcifn; - -prop upset.io.pci.nf-dpe-d@pcibus/pcidev/pcifn { IS_LEAF } (1)-> - ereport.io.service.unaffected@pcibus/pcidev/pcifn, - error.io.service.restored@pcibus/pcidev/pcifn; +event ereport.io.device.inval_state@PCIFN{within(5s)}; +event ereport.io.device.no_response@PCIFN{within(5s)}; +event ereport.io.device.stall@PCIFN{within(5s)}; +event ereport.io.device.badint_limit@PCIFN{within(5s)}; +event ereport.io.device.intern_corr@PCIFN{within(5s)}; +event ereport.io.device.intern_uncorr@PCIFN{within(5s)}; + +prop error.io.service.restored@PCIFN { IS_LEAF } (1)-> + ereport.io.service.lost@PCIFN, + ereport.io.service.degraded@PCIFN; + +prop error.io.service.restored@PCIFN { IS_LEAF } (1)-> + ereport.io.service.restored@PCIFN; + +prop error.io.device.f-device@PCIFN { IS_LEAF } (1)-> + ereport.io.device.inval_state@PCIFN, + ereport.io.device.no_response@PCIFN, + ereport.io.device.stall@PCIFN, + ereport.io.device.badint_limit@PCIFN, + ereport.io.device.intern_corr@PCIFN, + ereport.io.device.intern_uncorr@PCIFN; + +prop error.io.device.f-device@PCIFN { IS_LEAF } (1)-> + ereport.io.service.lost@PCIFN; + +prop error.io.device.deg-device@PCIFN { IS_LEAF } (1)-> + ereport.io.device.inval_state@PCIFN, + ereport.io.device.no_response@PCIFN, + ereport.io.device.stall@PCIFN, + ereport.io.device.badint_limit@PCIFN, + ereport.io.device.intern_corr@PCIFN, + ereport.io.device.intern_uncorr@PCIFN; + +prop error.io.device.deg-device@PCIFN { IS_LEAF } (1)-> + ereport.io.service.degraded@PCIFN; + +prop error.io.device.nf-device@PCIFN { IS_LEAF } (1)-> + ereport.io.device.inval_state@PCIFN, + ereport.io.device.no_response@PCIFN, + ereport.io.device.stall@PCIFN, + ereport.io.device.badint_limit@PCIFN, + ereport.io.device.intern_corr@PCIFN, + ereport.io.device.intern_uncorr@PCIFN; + +prop error.io.device.nf-device@PCIFN { IS_LEAF } (1)-> + ereport.io.service.unaffected@PCIFN, + error.io.service.restored@PCIFN; /* * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -1231,51 +1134,51 @@ prop upset.io.pci.nf-dpe-d@pcibus/pcidev/pcifn { IS_LEAF } (1)-> * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ -event ereport.io.pci.nr@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.unex-spl@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.rx-spl@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.sec-unex-spl@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.sec-spl-or@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.sec-spl-dly@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.ecc.ce-addr@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.ecc.ce-attr@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.ecc.ce-data@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.ecc.ue-addr@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.ecc.ue-attr@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.ecc.ue-data@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.s-ce@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.s-ue@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.sec-ecc.ce-addr@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.sec-ecc.ce-attr@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.sec-ecc.ce-data@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.sec-ecc.ue-addr@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.sec-ecc.ue-attr@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.sec-ecc.ue-data@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.sec-s-ce@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pcix.sec-s-ue@pcibus/pcidev/pcifn{within(5s)}; - -event upset.io.pcix.discard@pcibus/pcidev/pcifn; - -prop upset.io.pcix.discard@pcibus/pcidev/pcifn (1)-> - ereport.io.pci.nr@pcibus/pcidev/pcifn, - ereport.io.pcix.rx-spl@pcibus/pcidev/pcifn, - ereport.io.pcix.unex-spl@pcibus/pcidev/pcifn, - ereport.io.pcix.sec-unex-spl@pcibus/pcidev/pcifn, - ereport.io.pcix.sec-spl-or@pcibus/pcidev/pcifn, - ereport.io.pcix.sec-spl-dly@pcibus/pcidev/pcifn, - ereport.io.pcix.ecc.ce-addr@pcibus/pcidev/pcifn, - ereport.io.pcix.ecc.ce-attr@pcibus/pcidev/pcifn, - ereport.io.pcix.ecc.ce-data@pcibus/pcidev/pcifn, - ereport.io.pcix.ecc.ue-addr@pcibus/pcidev/pcifn, - ereport.io.pcix.ecc.ue-attr@pcibus/pcidev/pcifn, - ereport.io.pcix.ecc.ue-data@pcibus/pcidev/pcifn, - ereport.io.pcix.s-ce@pcibus/pcidev/pcifn, - ereport.io.pcix.s-ue@pcibus/pcidev/pcifn, - ereport.io.pcix.sec-ecc.ce-addr@pcibus/pcidev/pcifn, - ereport.io.pcix.sec-ecc.ce-attr@pcibus/pcidev/pcifn, - ereport.io.pcix.sec-ecc.ce-data@pcibus/pcidev/pcifn, - ereport.io.pcix.sec-ecc.ue-addr@pcibus/pcidev/pcifn, - ereport.io.pcix.sec-ecc.ue-attr@pcibus/pcidev/pcifn, - ereport.io.pcix.sec-ecc.ue-data@pcibus/pcidev/pcifn, - ereport.io.pcix.sec-s-ce@pcibus/pcidev/pcifn, - ereport.io.pcix.sec-s-ue@pcibus/pcidev/pcifn; +event ereport.io.pci.nr@PCIFN{within(5s)}; +event ereport.io.pcix.unex-spl@PCIFN{within(5s)}; +event ereport.io.pcix.rx-spl@PCIFN{within(5s)}; +event ereport.io.pcix.sec-unex-spl@PCIFN{within(5s)}; +event ereport.io.pcix.sec-spl-or@PCIFN{within(5s)}; +event ereport.io.pcix.sec-spl-dly@PCIFN{within(5s)}; +event ereport.io.pcix.ecc.ce-addr@PCIFN{within(5s)}; +event ereport.io.pcix.ecc.ce-attr@PCIFN{within(5s)}; +event ereport.io.pcix.ecc.ce-data@PCIFN{within(5s)}; +event ereport.io.pcix.ecc.ue-addr@PCIFN{within(5s)}; +event ereport.io.pcix.ecc.ue-attr@PCIFN{within(5s)}; +event ereport.io.pcix.ecc.ue-data@PCIFN{within(5s)}; +event ereport.io.pcix.s-ce@PCIFN{within(5s)}; +event ereport.io.pcix.s-ue@PCIFN{within(5s)}; +event ereport.io.pcix.sec-ecc.ce-addr@PCIFN{within(5s)}; +event ereport.io.pcix.sec-ecc.ce-attr@PCIFN{within(5s)}; +event ereport.io.pcix.sec-ecc.ce-data@PCIFN{within(5s)}; +event ereport.io.pcix.sec-ecc.ue-addr@PCIFN{within(5s)}; +event ereport.io.pcix.sec-ecc.ue-attr@PCIFN{within(5s)}; +event ereport.io.pcix.sec-ecc.ue-data@PCIFN{within(5s)}; +event ereport.io.pcix.sec-s-ce@PCIFN{within(5s)}; +event ereport.io.pcix.sec-s-ue@PCIFN{within(5s)}; + +event upset.io.pcix.discard@PCIFN; + +prop upset.io.pcix.discard@PCIFN (1)-> + ereport.io.pci.nr@PCIFN, + ereport.io.pcix.rx-spl@PCIFN, + ereport.io.pcix.unex-spl@PCIFN, + ereport.io.pcix.sec-unex-spl@PCIFN, + ereport.io.pcix.sec-spl-or@PCIFN, + ereport.io.pcix.sec-spl-dly@PCIFN, + ereport.io.pcix.ecc.ce-addr@PCIFN, + ereport.io.pcix.ecc.ce-attr@PCIFN, + ereport.io.pcix.ecc.ce-data@PCIFN, + ereport.io.pcix.ecc.ue-addr@PCIFN, + ereport.io.pcix.ecc.ue-attr@PCIFN, + ereport.io.pcix.ecc.ue-data@PCIFN, + ereport.io.pcix.s-ce@PCIFN, + ereport.io.pcix.s-ue@PCIFN, + ereport.io.pcix.sec-ecc.ce-addr@PCIFN, + ereport.io.pcix.sec-ecc.ce-attr@PCIFN, + ereport.io.pcix.sec-ecc.ce-data@PCIFN, + ereport.io.pcix.sec-ecc.ue-addr@PCIFN, + ereport.io.pcix.sec-ecc.ue-attr@PCIFN, + ereport.io.pcix.sec-ecc.ue-data@PCIFN, + ereport.io.pcix.sec-s-ce@PCIFN, + ereport.io.pcix.sec-s-ue@PCIFN; diff --git a/usr/src/cmd/fm/eversholt/files/common/pciex.esc b/usr/src/cmd/fm/eversholt/files/common/pciex.esc index f68ba8e3de..116b1e8e39 100644 --- a/usr/src/cmd/fm/eversholt/files/common/pciex.esc +++ b/usr/src/cmd/fm/eversholt/files/common/pciex.esc @@ -62,12 +62,8 @@ */ #define CORRLINK_COUNT 6 #define CORRLINK_TIME 2h -#define NONFATAL_COUNT 6 -#define NONFATAL_TIME 2h -#define NONFATAL_DPE_U_COUNT 3 -#define NONFATAL_DPE_U_TIME 168h -#define NONFATAL_DPE_D_COUNT 3 -#define NONFATAL_DPE_D_TIME 168h +#define NONFATAL_DPE_COUNT 3 +#define NONFATAL_DPE_TIME 168h /* * if the source-id payload is valid, then check it matches @@ -80,7 +76,7 @@ #define SOURCE_ID_MATCHES_OWN_BDF \ (payloadprop_defined("source-valid") && \ payloadprop("source-valid") == 1 && \ - payloadprop("source-id") == (confprop(asru(pciexrc), TOPO_PCI_BDF) + 0)) + payloadprop("source-id") == (confprop(pciexrc, TOPO_PCI_BDF) + 0)) /* * Other useful macros. These use the EXCAP property (PCI Express Capabilities @@ -89,110 +85,62 @@ * a PCI Express-PCI bridge - note that 60400 and 60401 are defined as PCI-PCI * bridges, everything else is consider a PCI leaf device. */ -#define BDF_IS_UNDER_RC \ - is_under(pciexrc<>, pciexbus[b]/pciexdev[d]/pciexfn[f]) - -#define PCIBDF_IS_UNDER_RC \ - is_under(pciexrc<>, pcibus[b]/pcidev[d]/pcifn[f]) - -#define PCIBDF_IS_UNDER_DEV \ - is_under(pciexbus/pciexdev/pciexfn, pcibus[b]/pcidev[d]/pcifn[f]) - -#define IS_SWD \ - (confprop(asru(pciexbus/pciexdev/pciexfn), TOPO_PCI_EXCAP) == \ - "pciexswd") - -#define IS_SWU \ - (confprop(asru(pciexbus/pciexdev/pciexfn), TOPO_PCI_EXCAP) == \ - "pciexswu") - -#define IS_LEAF \ - (confprop(asru(pciexbus/pciexdev/pciexfn), TOPO_PCI_EXCAP) == \ - "pciexdev") - -#define IS_PCI_LEAF \ - (confprop_defined(asru(pcibus/pcidev/pcifn), TOPO_PCI_CLASS) && \ - confprop(asru(pcibus/pcidev/pcifn), TOPO_PCI_CLASS) != "60400" && \ - confprop(asru(pcibus/pcidev/pcifn), TOPO_PCI_CLASS) != "60401") - -#define BDF_IS_PCI_LEAF \ - (confprop_defined(asru(pcibus[b]/pcidev[d]/pcifn[f]), \ - TOPO_PCI_CLASS) && \ - confprop(asru(pcibus[b]/pcidev[d]/pcifn[f]), TOPO_PCI_CLASS) != \ - "60400" && \ - confprop(asru(pcibus[b]/pcidev[d]/pcifn[f]), TOPO_PCI_CLASS) != "60401") - -#define IS_BDG \ - (confprop(asru(pciexbus/pciexdev/pciexfn), TOPO_PCI_EXCAP) == \ - "pcibus") - -#define BDF_IS_LEAF \ - (confprop(asru(pciexbus[b]/pciexdev[d]/pciexfn[f]), \ - TOPO_PCI_EXCAP) == "pciexdev") +#define PCIEXFN pciexbus/pciexdev/pciexfn +#define PCIEXFNHZ pciexbus<>/pciexdev<>/pciexfn<> +#define PCIEXFN1 pciexbus[b]/pciexdev[d]/pciexfn[f] +#define PCIFN pcibus/pcidev/pcifn +#define PCIFNHZ pcibus<>/pcidev<>/pcifn<> +#define PCIFN1 pcibus[b]/pcidev[d]/pcifn[f] +#define IS_LF(f) (confprop(f, TOPO_PCI_EXCAP) == "pciexdev") +#define IS_BG(f) (confprop(f, TOPO_PCI_EXCAP) == "pcibus") +#define IS_SD(f) (confprop(f, TOPO_PCI_EXCAP) == "pciexswd") +#define IS_SU(f) (confprop(f, TOPO_PCI_EXCAP) == "pciexswu") +#define IS_PCI_LF(f) (confprop_defined(f, TOPO_PCI_CLASS) && \ + confprop(f, TOPO_PCI_CLASS) != "60400" && \ + confprop(f, TOPO_PCI_CLASS) != "60401") /* * define faults */ -asru pciexrc; -fru pciexrc; -asru pciexbus/pciexdev/pciexfn; -fru pciexbus/pciexdev; -fru pciexbus; -asru pciexbus; +event fault.io.pciex.device-interr@PCIEXFN, FITrate=PCIEX_DEV_FIT; -event fault.io.pciex.device-interr@pciexbus/pciexdev/pciexfn, - FITrate=PCIEX_DEV_FIT, FRU=pciexbus/pciexdev, - ASRU=pciexbus/pciexdev/pciexfn; +event fault.io.pciex.device-interr-deg@PCIEXFN, FITrate=PCIEX_DEV_FIT, retire=0; -event fault.io.pciex.device-interr@pciexrc, - FITrate=PCIEX_RC_FIT, FRU=pciexrc, ASRU=pciexrc; +engine serd.io.pciex.flt-nf@PCIEXFN, N=NONFATAL_DPE_COUNT, T=NONFATAL_DPE_TIME; +event fault.io.pciex.device-interr-unaf@PCIEXFN, FITrate=PCIEX_DEV_FIT, + engine=serd.io.pciex.flt-nf@PCIEXFN; -event fault.io.pciex.device-invreq@pciexbus/pciexdev/pciexfn, - FITrate=PCIEX_DEV_INV_FIT, FRU=pciexbus/pciexdev, - ASRU=pciexbus/pciexdev/pciexfn; +engine serd.io.pciex.corrlink@PCIEXFN, N=CORRLINK_COUNT, T=CORRLINK_TIME; +event fault.io.pciex.device-interr-corr@PCIEXFN, FITrate=PCIEX_DEV_FIT, + engine=serd.io.pciex.corrlink@PCIEXFN; -event fault.io.pciex.device-invreq@pciexrc, - FITrate=PCIEX_RC_FIT, FRU=pciexrc, ASRU=pciexrc; +event fault.io.pciex.device-interr@pciexrc, FITrate=PCIEX_RC_FIT; -event fault.io.pciex.device-noresp@pciexbus/pciexdev/pciexfn, - FITrate=PCIEX_DEV_NR_FIT, FRU=pciexbus/pciexdev, - ASRU=pciexbus/pciexdev/pciexfn; +event fault.io.pciex.device-interr-deg@pciexrc, FITrate=PCIEX_RC_FIT, retire=0; -event fault.io.pciex.device-noresp@pciexrc, - FITrate=PCIEX_RC_NR_FIT, FRU=pciexrc, ASRU=pciexrc; +engine serd.io.pciex.flt-nf@pciexrc, N=NONFATAL_DPE_COUNT, T=NONFATAL_DPE_TIME; +event fault.io.pciex.device-interr-unaf@pciexrc, FITrate=PCIEX_RC_FIT, + engine=serd.io.pciex.flt-nf@pciexrc; -event fault.io.pciex.bus-noresp@pciexbus/pciexdev/pciexfn, - FITrate=PCIEX_BUS_NR_FIT, FRU=pciexbus, ASRU=pciexbus/pciexdev/pciexfn; +engine serd.io.pciex.corrlink@pciexrc, N=CORRLINK_COUNT, T=CORRLINK_TIME; +event fault.io.pciex.device-interr-corr@pciexrc, FITrate=PCIEX_RC_FIT, + engine=serd.io.pciex.corrlink@pciexrc; -event fault.io.pciex.bus-linkerr@pciexbus/pciexdev/pciexfn, - FITrate=PCIEX_BUS_FIT, FRU=pciexbus, ASRU=pciexbus/pciexdev/pciexfn; +event fault.io.pciex.device-invreq@PCIEXFN, FITrate=PCIEX_DEV_INV_FIT; -/* - * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * serd engine for correctable link errors - * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - */ -event error.io.pciex.corrlink@pciexbus; -event error.io.pciex.corrlink@pciexrc/pciexbus; -event error.io.pciex.corrlink@pciexbus/pciexdev/pciexfn/pciexbus; -event error.io.pciex.corrlink_trip@pciexbus; -event ereport.io.pciex.corrlink_trip@pciexbus{within(5s)}; +event fault.io.pciex.device-invreq@pciexrc, FITrate=PCIEX_RC_FIT; -engine serd.io.pciex.corrlink@pciexbus, - N=CORRLINK_COUNT, T=CORRLINK_TIME, method=persistent, - trip=ereport.io.pciex.corrlink_trip@pciexbus; +event fault.io.pciex.device-noresp@PCIEXFN, FITrate=PCIEX_DEV_NR_FIT; -event upset.io.pciex.corrlink@pciexbus, - engine=serd.io.pciex.corrlink@pciexbus; +event fault.io.pciex.device-noresp@pciexrc, FITrate=PCIEX_RC_NR_FIT; -prop upset.io.pciex.corrlink@pciexbus (1)-> - error.io.pciex.corrlink@pciexbus; +event fault.io.pciex.bus-noresp@PCIEXFN, FITrate=PCIEX_BUS_NR_FIT; -prop error.io.pciex.corrlink_trip@pciexbus (1)-> - ereport.io.pciex.corrlink_trip@pciexbus; +event fault.io.pciex.bus-linkerr@PCIEXFN, FITrate=PCIEX_BUS_FIT; -prop error.io.pciex.corrlink_trip@pciexbus (0)-> - error.io.pciex.corrlink@pciexbus; +engine serd.io.pciex.corrlink-bus@PCIEXFN, N=CORRLINK_COUNT, T=CORRLINK_TIME; +event fault.io.pciex.bus-linkerr-corr@PCIEXFN, FITrate=PCIEX_BUS_FIT, + engine=serd.io.pciex.corrlink-bus@PCIEXFN; /* * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -200,151 +148,112 @@ prop error.io.pciex.corrlink_trip@pciexbus (0)-> * no service impact - otherwise fail immediately * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ -event ereport.io.device.inval_state@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.device.no_response@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.device.stall@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.device.badint_limit@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.device.intern_corr@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.device.intern_uncorr@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.service.lost@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.service.degraded@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.service.unaffected@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.service.restored@pciexbus/pciexdev/pciexfn{within(30s)}; -event ereport.io.device.nf-device@pciexbus/pciexdev/pciexfn{within(5s)}; - -event error.io.service.restored@pciexbus/pciexdev/pciexfn; -event error.io.device.nf-device@pciexbus/pciexdev/pciexfn; -event error.io.device.f-device@pciexbus/pciexdev/pciexfn; - -prop error.io.device.f-device@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.device.inval_state@pciexbus/pciexdev/pciexfn, - ereport.io.device.no_response@pciexbus/pciexdev/pciexfn, - ereport.io.device.stall@pciexbus/pciexdev/pciexfn, - ereport.io.device.badint_limit@pciexbus/pciexdev/pciexfn, - ereport.io.device.intern_corr@pciexbus/pciexdev/pciexfn, - ereport.io.device.intern_uncorr@pciexbus/pciexdev/pciexfn; - -prop error.io.device.f-device@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.service.lost@pciexbus/pciexdev/pciexfn, - ereport.io.service.degraded@pciexbus/pciexdev/pciexfn; - -engine serd.io.device.nonfatal@pciexbus/pciexdev/pciexfn, - N=NONFATAL_COUNT, T=NONFATAL_TIME, method=persistent, - trip=ereport.io.device.nf-device@pciexbus/pciexdev/pciexfn; - -event upset.io.device.nonfatal@pciexbus/pciexdev/pciexfn, - engine=serd.io.device.nonfatal@pciexbus/pciexdev/pciexfn; - -prop error.io.device.nf-device@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.device.nf-device@pciexbus/pciexdev/pciexfn; - -prop error.io.device.nf-device@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.device.inval_state@pciexbus/pciexdev/pciexfn, - ereport.io.device.no_response@pciexbus/pciexdev/pciexfn, - ereport.io.device.stall@pciexbus/pciexdev/pciexfn, - ereport.io.device.badint_limit@pciexbus/pciexdev/pciexfn, - ereport.io.device.intern_corr@pciexbus/pciexdev/pciexfn, - ereport.io.device.intern_uncorr@pciexbus/pciexdev/pciexfn, - ereport.io.service.unaffected@pciexbus/pciexdev/pciexfn, - error.io.service.restored@pciexbus/pciexdev/pciexfn; - -prop upset.io.device.nonfatal@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.device.inval_state@pciexbus/pciexdev/pciexfn, - ereport.io.device.no_response@pciexbus/pciexdev/pciexfn, - ereport.io.device.stall@pciexbus/pciexdev/pciexfn, - ereport.io.device.badint_limit@pciexbus/pciexdev/pciexfn, - ereport.io.device.intern_corr@pciexbus/pciexdev/pciexfn, - ereport.io.device.intern_uncorr@pciexbus/pciexdev/pciexfn; - -prop upset.io.device.nonfatal@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.service.unaffected@pciexbus/pciexdev/pciexfn, - error.io.service.restored@pciexbus/pciexdev/pciexfn; +event ereport.io.device.inval_state@PCIEXFN{within(5s)}; +event ereport.io.device.no_response@PCIEXFN{within(5s)}; +event ereport.io.device.stall@PCIEXFN{within(5s)}; +event ereport.io.device.badint_limit@PCIEXFN{within(5s)}; +event ereport.io.device.intern_corr@PCIEXFN{within(5s)}; +event ereport.io.device.intern_uncorr@PCIEXFN{within(5s)}; +event ereport.io.service.lost@PCIEXFN{within(5s)}; +event ereport.io.service.degraded@PCIEXFN{within(5s)}; +event ereport.io.service.unaffected@PCIEXFN{within(5s)}; +event ereport.io.service.restored@PCIEXFN{within(30s)}; +event ereport.io.service.lost@PCIFN{within(5s)}; +event ereport.io.service.degraded@PCIFN{within(5s)}; +event ereport.io.service.unaffected@PCIFN{within(5s)}; + +event error.io.pciex.noimpact-d@PCIEXFN; +event error.io.pciex.noimpact-d@PCIEXFN/PCIEXFN; +event error.io.pciex.noimpact-d@PCIEXFN/PCIFN; +event error.io.pciex.noimpact-d@PCIFN/PCIFN; +event error.io.pciex.noimpact-d@PCIFN; +event error.io.pciex.degraded-d@PCIEXFN; +event error.io.pciex.degraded-d@PCIEXFN/PCIEXFN; +event error.io.pciex.degraded-d@PCIEXFN/PCIFN; +event error.io.pciex.degraded-d@PCIFN/PCIFN; +event error.io.pciex.degraded-d@PCIFN; +event error.io.pciex.lost-d@PCIEXFN; +event error.io.pciex.lost-d@PCIEXFN/PCIEXFN; +event error.io.pciex.lost-d@PCIEXFN/PCIFN; +event error.io.pciex.lost-d@PCIFN/PCIFN; +event error.io.pciex.lost-d@PCIFN; +event error.io.service.restored@PCIEXFN; +event error.io.service.restored@PCIFN; +event error.io.device.nf-device@PCIEXFN; +event error.io.device.deg-device@PCIEXFN; +event error.io.device.f-device@PCIEXFN; + +prop error.io.device.f-device@PCIEXFN (1)-> + ereport.io.device.inval_state@PCIEXFN, + ereport.io.device.no_response@PCIEXFN, + ereport.io.device.stall@PCIEXFN, + ereport.io.device.badint_limit@PCIEXFN, + ereport.io.device.intern_corr@PCIEXFN, + ereport.io.device.intern_uncorr@PCIEXFN; + +prop error.io.device.f-device@PCIEXFN (1)-> + error.io.pciex.lost-d@PCIEXFN; + +prop error.io.device.deg-device@PCIEXFN (1)-> + ereport.io.device.inval_state@PCIEXFN, + ereport.io.device.no_response@PCIEXFN, + ereport.io.device.stall@PCIEXFN, + ereport.io.device.badint_limit@PCIEXFN, + ereport.io.device.intern_corr@PCIEXFN, + ereport.io.device.intern_uncorr@PCIEXFN; + +prop error.io.device.deg-device@PCIEXFN (1)-> + error.io.pciex.degraded-d@PCIEXFN; + +prop error.io.device.nf-device@PCIEXFN (1)-> + ereport.io.device.inval_state@PCIEXFN, + ereport.io.device.no_response@PCIEXFN, + ereport.io.device.stall@PCIEXFN, + ereport.io.device.badint_limit@PCIEXFN, + ereport.io.device.intern_corr@PCIEXFN, + ereport.io.device.intern_uncorr@PCIEXFN; + +prop error.io.device.nf-device@PCIEXFN (1)-> + error.io.pciex.noimpact-d@PCIEXFN; /* - * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * Handling of pci express nonfatal errors (ptlp/ecrc). Use serd engine if - * no service impact - otherwise fail immediately - * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * handling of service impact ereports. */ -event ereport.io.pciex.flt-nf-d@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.flt-nf-u@pciexbus/pciexdev/pciexfn{within(5s)}; - -event error.io.pciex.flt-f-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-f-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-nf-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-nf-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-f-ecrcreq-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-f-ecrccomp-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-f-poisreq-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-f-poiscomp-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-f-ecrcreq-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-f-ecrccomp-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-f-poisreq-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-f-poiscomp-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-nf-ecrcreq-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-nf-ecrccomp-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-nf-poisreq-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-nf-poiscomp-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-nf-ecrcreq-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-nf-ecrccomp-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-nf-poisreq-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-nf-poiscomp-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.flt-f-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.flt-f-ecrcreq-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-f-ecrccomp-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-f-poisreq-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-f-poiscomp-u@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.flt-f-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.flt-f-ecrcreq-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-f-ecrccomp-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-f-poisreq-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-f-poiscomp-d@pciexbus/pciexdev/pciexfn; - -engine serd.io.pciex.flt-nf-u@pciexbus/pciexdev/pciexfn, - N=NONFATAL_DPE_U_COUNT, T=NONFATAL_DPE_U_TIME, method=persistent, - trip=ereport.io.pciex.flt-nf-u@pciexbus/pciexdev/pciexfn; - -event upset.io.pciex.flt-nf-u@pciexbus/pciexdev/pciexfn, - engine=serd.io.pciex.flt-nf-u@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.flt-nf-u@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pciex.flt-nf-u@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.flt-nf-u@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.flt-nf-ecrcreq-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-nf-ecrccomp-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-nf-poisreq-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-nf-poiscomp-u@pciexbus/pciexdev/pciexfn; - -prop upset.io.pciex.flt-nf-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.flt-nf-ecrcreq-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-nf-ecrccomp-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-nf-poisreq-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-nf-poiscomp-u@pciexbus/pciexdev/pciexfn; - -engine serd.io.pciex.flt-nf-d@pciexbus/pciexdev/pciexfn, - N=NONFATAL_DPE_D_COUNT, T=NONFATAL_DPE_D_TIME, method=persistent, - trip=ereport.io.pciex.flt-nf-d@pciexbus/pciexdev/pciexfn; - -event upset.io.pciex.flt-nf-d@pciexbus/pciexdev/pciexfn, - engine=serd.io.pciex.flt-nf-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.flt-nf-d@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pciex.flt-nf-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.flt-nf-d@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.flt-nf-ecrcreq-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-nf-ecrccomp-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-nf-poisreq-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-nf-poiscomp-d@pciexbus/pciexdev/pciexfn; - -prop upset.io.pciex.flt-nf-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.flt-nf-ecrcreq-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-nf-ecrccomp-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-nf-poisreq-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-nf-poiscomp-d@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.lost-d@PCIEXFN (0)-> + ereport.io.service.lost@PCIEXFN, + error.io.pciex.lost-d@PCIEXFN/PCIEXFNHZ, + error.io.pciex.lost-d@PCIEXFN/PCIFNHZ; + +prop error.io.pciex.lost-d@PCIFN (0)-> + ereport.io.service.lost@PCIFN, + error.io.pciex.lost-d@PCIFN/PCIFNHZ; + +prop error.io.pciex.degraded-d@PCIEXFN (1)-> + ereport.io.service.degraded@PCIEXFN, + error.io.pciex.degraded-d@PCIEXFN/PCIEXFNHZ, + error.io.pciex.degraded-d@PCIEXFN/PCIFNHZ; + +prop error.io.pciex.degraded-d@PCIFN (1)-> + ereport.io.service.degraded@PCIFN, + error.io.pciex.degraded-d@PCIFN/PCIFNHZ; + +prop error.io.pciex.noimpact-d@PCIEXFN (1)-> + ereport.io.service.unaffected@PCIEXFN, + error.io.service.restored@PCIEXFN, + error.io.pciex.noimpact-d@PCIEXFN/PCIEXFNHZ, + error.io.pciex.noimpact-d@PCIEXFN/PCIFNHZ; + +prop error.io.pciex.noimpact-d@PCIFN (1)-> + ereport.io.service.unaffected@PCIFN, + error.io.service.restored@PCIFN, + error.io.pciex.noimpact-d@PCIFN/PCIFNHZ; + +prop error.io.service.restored@PCIEXFN (1)-> + ereport.io.service.lost@PCIEXFN, + ereport.io.service.degraded@PCIEXFN; + +prop error.io.service.restored@PCIEXFN (1)-> + ereport.io.service.restored@PCIEXFN; /* * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -362,78 +271,105 @@ prop upset.io.pciex.flt-nf-d@pciexbus/pciexdev/pciexfn (1)-> * - corrlink: correctable link or physical level error * - fatlink: fatal link or physical level error */ -event error.io.pciex.nr-d@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-ca-d@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.mtlp-d@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.badreq-d@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-nf-d@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-f-d@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.corrlink_trip@pciexrc/pciexbus; -event error.io.pciex.fatlink@pciexrc/pciexbus/pciexdev/pciexfn; +event error.io.pciex.nr-d@pciexrc/PCIEXFN; +event error.io.pciex.ca-d@pciexrc/PCIEXFN; +event error.io.pciex.mtlp-d@pciexrc/PCIEXFN; +event error.io.pciex.corrlink@pciexrc/pciexbus; +event error.io.pciex.fatlink@pciexrc/PCIEXFN; +event error.io.pciex.badreq-d@pciexrc/PCIEXFN; +event error.io.pciex.nf-poisecrc-d@pciexrc/PCIEXFN; +event error.io.pciex.f-poisecrc-d@pciexrc/PCIEXFN; +event error.io.pciex.deg-poisecrc-d@pciexrc/PCIEXFN; prop fault.io.pciex.device-noresp@pciexrc (1)-> - error.io.pciex.nr-d@pciexrc/pciexbus<>/pciexdev<>/pciexfn<>; + error.io.pciex.nr-d@pciexrc/PCIEXFNHZ; prop fault.io.pciex.device-invreq@pciexrc (1)-> - error.io.pciex.badreq-d@pciexrc/pciexbus<>/pciexdev<>/pciexfn<>; + error.io.pciex.badreq-d@pciexrc/PCIEXFNHZ; + +prop fault.io.pciex.device-interr-corr@pciexrc (1)-> + error.io.pciex.corrlink@pciexrc/pciexbus<>; + +prop fault.io.pciex.device-interr-unaf@pciexrc (1)-> + error.io.pciex.nf-poisecrc-d@pciexrc/PCIEXFNHZ; + +prop fault.io.pciex.device-interr-deg@pciexrc (1)-> + error.io.pciex.deg-poisecrc-d@pciexrc/PCIEXFNHZ; prop fault.io.pciex.device-interr@pciexrc (1)-> - error.io.pciex.flt-nf-d@pciexrc/pciexbus<>/pciexdev<>/pciexfn<>, - error.io.pciex.flt-f-d@pciexrc/pciexbus<>/pciexdev<>/pciexfn<>, - error.io.pciex.flt-ca-d@pciexrc/pciexbus<>/pciexdev<>/pciexfn<>, - error.io.pciex.mtlp-d@pciexrc/pciexbus<>/pciexdev<>/pciexfn<>, - error.io.pciex.corrlink_trip@pciexrc/pciexbus<>, - error.io.pciex.fatlink@pciexrc/pciexbus<>/pciexdev<>/pciexfn<>; + error.io.pciex.f-poisecrc-d@pciexrc/PCIEXFNHZ, + error.io.pciex.ca-d@pciexrc/PCIEXFNHZ, + error.io.pciex.mtlp-d@pciexrc/PCIEXFNHZ, + error.io.pciex.fatlink@pciexrc/PCIEXFNHZ; /* * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * A faulty PCI Express leaf device or upstream switch port may cause: * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * - nr-u: the device not to respond to a valid downstream request - * - ca-u: the device to completer abort a valid downstream request - * - badreq-u: a bad upstream request - not CRC error (may cause + * - flt-nr-u: the device not to respond to a valid downstream request + * - flt-ca-u: the device to completer abort a valid downstream request + * - flt-badreq-u: a bad upstream request - not CRC error (may cause * completer to respond with ur or ca) - leaf only - * - mtlp-u: a malformed tlp transmitted upstream - leaf only - * - ecrcreq-u: request with end-to-end CRC error transmitted upstream - * - ecrccomp-u: compl with end-to-end CRC error transmitted upstream - * - poisreq-u: poisoned request transmitted upstream - * - poiscomp-u: poisoned completion transmitted upstream + * - flt-mtlp-u: a malformed tlp transmitted upstream - leaf only + * - flt-ecrcreq-u: request with end-to-end CRC error transmitted upstream + * - flt-ecrccomp-u: compl with end-to-end CRC error transmitted upstream + * - flt-poisreq-u: poisoned request transmitted upstream + * - flt-poiscomp-u: poisoned completion transmitted upstream * - device: internal error reported by leaf device * - corrlink: correctable link or physical level error * - fatlink: fatal link or physical level error */ -event error.io.pciex.flt-nr-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-ca-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.mtlp-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-badreq-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.fatlink@pciexbus/pciexdev/pciexfn; - -prop fault.io.pciex.device-noresp@pciexbus/pciexdev/pciexfn { IS_LEAF } (1)-> - error.io.pciex.flt-nr-u@pciexbus/pciexdev/pciexfn; - -prop fault.io.pciex.device-noresp@pciexbus/pciexdev/pciexfn { IS_SWU } (1)-> - error.io.pciex.flt-nr-u@pciexbus/pciexdev/pciexfn; - -prop fault.io.pciex.device-invreq@pciexbus/pciexdev/pciexfn { IS_LEAF } (1)-> - error.io.pciex.flt-badreq-u@pciexbus/pciexdev/pciexfn; - -prop fault.io.pciex.device-interr@pciexbus/pciexdev/pciexfn { IS_SWU } (1)-> - error.io.pciex.flt-nf-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-f-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-ca-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.corrlink_trip@pciexbus, - error.io.pciex.fatlink@pciexbus/pciexdev/pciexfn; - -prop fault.io.pciex.device-interr@pciexbus/pciexdev/pciexfn { IS_LEAF } (1)-> - error.io.pciex.flt-nf-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-f-u@pciexbus/pciexdev/pciexfn, - error.io.device.nf-device@pciexbus/pciexdev/pciexfn, - error.io.device.f-device@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-ca-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.mtlp-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.corrlink_trip@pciexbus, - error.io.pciex.fatlink@pciexbus/pciexdev/pciexfn; +event error.io.pciex.flt-nr-u@PCIEXFN; +event error.io.pciex.flt-ca-u@PCIEXFN; +event error.io.pciex.flt-mtlp-u@PCIEXFN; +event error.io.pciex.fatlink@PCIEXFN; +event error.io.pciex.flt-badreq-u@PCIEXFN; +event error.io.pciex.flt-nf-poisecrc-u@PCIEXFN; +event error.io.pciex.flt-f-poisecrc-u@PCIEXFN; +event error.io.pciex.flt-deg-poisecrc-u@PCIEXFN; +event error.io.pciex.corrlink@pciexbus; + +prop fault.io.pciex.device-noresp@PCIEXFN { IS_LF(PCIEXFN) } (1)-> + error.io.pciex.flt-nr-u@PCIEXFN; + +prop fault.io.pciex.device-noresp@PCIEXFN { IS_SU(PCIEXFN) } (1)-> + error.io.pciex.flt-nr-u@PCIEXFN; + +prop fault.io.pciex.device-invreq@PCIEXFN { IS_LF(PCIEXFN) } (1)-> + error.io.pciex.flt-badreq-u@PCIEXFN; + +prop fault.io.pciex.device-interr-corr@PCIEXFN { IS_SU(PCIEXFN) } (1)-> + error.io.pciex.corrlink@pciexbus; + +prop fault.io.pciex.device-interr-unaf@PCIEXFN { IS_SU(PCIEXFN) } (1)-> + error.io.pciex.flt-nf-poisecrc-u@PCIEXFN; + +prop fault.io.pciex.device-interr-corr@PCIEXFN { IS_LF(PCIEXFN) } (1)-> + error.io.pciex.corrlink@pciexbus, + error.io.device.nf-device@PCIEXFN; + +prop fault.io.pciex.device-interr-unaf@PCIEXFN { IS_LF(PCIEXFN) } (1)-> + error.io.pciex.flt-nf-poisecrc-u@PCIEXFN; + +prop fault.io.pciex.device-interr-deg@PCIEXFN { IS_SU(PCIEXFN) } (1)-> + error.io.pciex.flt-deg-poisecrc-u@PCIEXFN; + +prop fault.io.pciex.device-interr@PCIEXFN { IS_SU(PCIEXFN) } (1)-> + error.io.pciex.flt-f-poisecrc-u@PCIEXFN, + error.io.pciex.flt-ca-u@PCIEXFN, + error.io.pciex.fatlink@PCIEXFN; + +prop fault.io.pciex.device-interr-deg@PCIEXFN { IS_LF(PCIEXFN) } (1)-> + error.io.pciex.flt-deg-poisecrc-u@PCIEXFN, + error.io.device.deg-device@PCIEXFN; + +prop fault.io.pciex.device-interr@PCIEXFN { IS_LF(PCIEXFN) } (1)-> + error.io.pciex.flt-f-poisecrc-u@PCIEXFN, + error.io.device.f-device@PCIEXFN, + error.io.pciex.flt-ca-u@PCIEXFN, + error.io.pciex.flt-mtlp-u@PCIEXFN, + error.io.pciex.fatlink@PCIEXFN; /* * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -449,57 +385,64 @@ prop fault.io.pciex.device-interr@pciexbus/pciexdev/pciexfn { IS_LEAF } (1)-> * - fatlink: fatal link or physical level error */ -event error.io.pciex.nr-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-ca-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-nf-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-f-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.corrlink_trip@pciexbus/pciexdev/pciexfn/pciexbus; -event error.io.pciex.fatlink@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; +event error.io.pciex.nr-d@PCIEXFN/PCIEXFN; +event error.io.pciex.ca-d@PCIEXFN/PCIEXFN; +event error.io.pciex.corrlink@PCIEXFN/pciexbus; +event error.io.pciex.fatlink@PCIEXFN/PCIEXFN; +event error.io.pciex.nf-poisecrc-d@PCIEXFN/PCIEXFN; +event error.io.pciex.f-poisecrc-d@PCIEXFN/PCIEXFN; +event error.io.pciex.deg-poisecrc-d@PCIEXFN/PCIEXFN; -prop fault.io.pciex.device-noresp@pciexbus/pciexdev/pciexfn { IS_SWD } (1)-> - error.io.pciex.nr-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; +prop fault.io.pciex.device-noresp@PCIEXFN { IS_SD(PCIEXFN) } (1)-> + error.io.pciex.nr-d@PCIEXFN/PCIEXFNHZ; -prop fault.io.pciex.device-interr@pciexbus/pciexdev/pciexfn { IS_SWD } (1)-> - error.io.pciex.flt-ca-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>, - error.io.pciex.flt-nf-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>, - error.io.pciex.flt-f-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>, - error.io.pciex.corrlink_trip@pciexbus/pciexdev/pciexfn/pciexbus<>, - error.io.pciex.fatlink@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; +prop fault.io.pciex.device-interr-corr@PCIEXFN { IS_SD(PCIEXFN) } (1)-> + error.io.pciex.corrlink@PCIEXFN/pciexbus<>; + +prop fault.io.pciex.device-interr-unaf@PCIEXFN { IS_SD(PCIEXFN) } (1)-> + error.io.pciex.nf-poisecrc-d@PCIEXFN/PCIEXFNHZ; + +prop fault.io.pciex.device-interr-deg@PCIEXFN { IS_SD(PCIEXFN) } (1)-> + error.io.pciex.deg-poisecrc-d@PCIEXFN/PCIEXFNHZ; + +prop fault.io.pciex.device-interr@PCIEXFN { IS_SD(PCIEXFN) } (1)-> + error.io.pciex.ca-d@PCIEXFN/PCIEXFNHZ, + error.io.pciex.f-poisecrc-d@PCIEXFN/PCIEXFNHZ, + error.io.pciex.fatlink@PCIEXFN/PCIEXFNHZ; /* * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * A faulty PCIEX bus may cause: * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * - nr-u: a device to not respond because the link is down + * - flt-nr-u: a device to not respond because the link is down * - nr-d: a device to not respond because the link is down * - corrlink: correctable link or physical level error * - fatlink: fatal link or physical level error */ -event error.io.pciex.nr-d@pciexbus/pciexdev/pciexfn; +event error.io.pciex.nr-d@PCIEXFN; -prop fault.io.pciex.bus-noresp@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.flt-nr-u@pciexbus/pciexdev/pciexfn - { IS_SWU || IS_LEAF || IS_BDG }, - error.io.pciex.nr-d@pciexbus/pciexdev/pciexfn - { IS_SWU || IS_LEAF || IS_BDG }; +prop fault.io.pciex.bus-noresp@PCIEXFN { !IS_SD(PCIEXFN) } (0)-> + error.io.pciex.flt-nr-u@PCIEXFN, + error.io.pciex.nr-d@PCIEXFN; -prop fault.io.pciex.bus-linkerr@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.corrlink_trip@pciexbus, - error.io.pciex.fatlink@pciexbus/pciexdev/pciexfn - { IS_SWU || IS_LEAF || IS_BDG }; +prop fault.io.pciex.bus-linkerr-corr@PCIEXFN (0)-> + error.io.pciex.corrlink@pciexbus; + +prop fault.io.pciex.bus-linkerr@PCIEXFN { !IS_SD(PCIEXFN) } (0)-> + error.io.pciex.fatlink@PCIEXFN; /* * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * A faulty pciex-pci bridge may cause * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * The following errors to propagate onto the PCI Express fabric - * - nr-u: the device not to respond to a valid downstream request - * - ca-u: the device to completer abort a valid downstream request - * - ecrcreq-u: request with end-to-end CRC error transmitted upstream - * - ecrccomp-u: compl with end-to-end CRC error transmitted upstream - * - poisreq-u: poisoned request transmitted upstream - * - poiscomp-u: poisoned completion transmitted upstream + * - flt-nr-u: the device not to respond to a valid downstream request + * - flt-ca-u: the device to completer abort a valid downstream request + * - flt-ecrcreq-u: request with end-to-end CRC error transmitted upstream + * - flt-ecrccomp-u: compl with end-to-end CRC error transmitted upstream + * - flt-poisreq-u: poisoned request transmitted upstream + * - flt-poiscomp-u: poisoned completion transmitted upstream * - corrlink: correctable link or physical level error upstream * - fatlink: fatal link or physical level error upstream * - sec-interr: internal error on pci express to pci bridge @@ -518,191 +461,207 @@ prop fault.io.pciex.bus-linkerr@pciexbus/pciexdev/pciexfn (0)-> * - scpe-d: split completion to get corrupted during downstream transmission */ -event error.io.pci.ape-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.f-dpe-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.nf-dpe-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.retry-to-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.nr-pw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.nr-drw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.ta-pw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.ta-drw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pcix.scpe-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pciex.sec-interr@pciexbus/pciexdev/pciexfn; -event ereport.io.pci.sec-sta@pciexbus/pciexdev/pciexfn{within(5s)}; - -prop fault.io.pciex.device-noresp@pciexbus/pciexdev/pciexfn { IS_BDG } (1)-> - error.io.pciex.flt-nr-u@pciexbus/pciexdev/pciexfn, - error.io.pci.retry-to-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>, - error.io.pci.nr-pw-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>, - error.io.pci.nr-drw-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop fault.io.pciex.device-interr@pciexbus/pciexdev/pciexfn { IS_BDG } (1)-> - error.io.pciex.flt-nf-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-f-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-ca-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.mtlp-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.sec-interr@pciexbus/pciexdev/pciexfn, - error.io.pciex.corrlink_trip@pciexbus, - error.io.pciex.fatlink@pciexbus/pciexdev/pciexfn, - error.io.pci.ta-pw-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>, - error.io.pci.ta-drw-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>, - error.io.pci.ape-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>, - error.io.pcix.scpe-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>, - error.io.pci.f-dpe-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>, - error.io.pci.nf-dpe-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop fault.io.pciex.device-interr@pciexbus/pciexdev/pciexfn { IS_BDG } (0)-> - ereport.io.pci.sec-sta@pciexbus/pciexdev/pciexfn; +event error.io.pci.ape-d@PCIEXFN/PCIFN; +event error.io.pci.f-dpe-d@PCIEXFN/PCIFN; +event error.io.pci.deg-dpe-d@PCIEXFN/PCIFN; +event error.io.pci.nf-dpe-d@PCIEXFN/PCIFN; +event error.io.pci.retry-to-d@PCIEXFN/PCIFN; +event error.io.pci.nr-pw-d@PCIEXFN/PCIFN; +event error.io.pci.nr-drw-d@PCIEXFN/PCIFN; +event error.io.pci.ta-pw-d@PCIEXFN/PCIFN; +event error.io.pci.ta-drw-d@PCIEXFN/PCIFN; +event error.io.pcix.scpe-d@PCIEXFN/PCIFN; +event error.io.pciex.sec-interr@PCIEXFN; +event ereport.io.pci.sec-sta@PCIEXFN{within(5s)}; + +prop fault.io.pciex.device-noresp@PCIEXFN { IS_BG(PCIEXFN) } (1)-> + error.io.pciex.flt-nr-u@PCIEXFN, + error.io.pci.retry-to-d@PCIEXFN/PCIFNHZ, + error.io.pci.nr-pw-d@PCIEXFN/PCIFNHZ, + error.io.pci.nr-drw-d@PCIEXFN/PCIFNHZ; + +prop fault.io.pciex.device-interr-corr@PCIEXFN { IS_BG(PCIEXFN) } (1)-> + error.io.pciex.corrlink@pciexbus; + +prop fault.io.pciex.device-interr-unaf@PCIEXFN { IS_BG(PCIEXFN) } (1)-> + error.io.pciex.flt-nf-poisecrc-u@PCIEXFN, + error.io.pci.nf-dpe-d@PCIEXFN/PCIFNHZ; + +prop fault.io.pciex.device-interr-deg@PCIEXFN { IS_BG(PCIEXFN) } (1)-> + error.io.pciex.flt-deg-poisecrc-u@PCIEXFN, + error.io.pci.deg-dpe-d@PCIEXFN/PCIFNHZ; + +prop fault.io.pciex.device-interr@PCIEXFN { IS_BG(PCIEXFN) } (1)-> + error.io.pciex.flt-f-poisecrc-u@PCIEXFN, + error.io.pciex.flt-ca-u@PCIEXFN, + error.io.pciex.flt-mtlp-u@PCIEXFN, + error.io.pciex.sec-interr@PCIEXFN, + error.io.pciex.fatlink@PCIEXFN, + error.io.pci.ta-pw-d@PCIEXFN/PCIFNHZ, + error.io.pci.ta-drw-d@PCIEXFN/PCIFNHZ, + error.io.pci.ape-d@PCIEXFN/PCIFNHZ, + error.io.pcix.scpe-d@PCIEXFN/PCIFNHZ, + error.io.pci.f-dpe-d@PCIEXFN/PCIFNHZ; + +prop fault.io.pciex.device-interr-unaf@PCIEXFN { IS_BG(PCIEXFN) } (0)-> + ereport.io.pci.sec-sta@PCIEXFN; + +prop fault.io.pciex.device-interr@PCIEXFN { IS_BG(PCIEXFN) } (0)-> + ereport.io.pci.sec-sta@PCIEXFN; + +/* + * the following rules for ptlp and ecrc faults are split into fatal and + * nonfatal, depending on the service impact reported by the leaf driver + */ +event error.io.pciex.nf-poisecrc-d@PCIEXFN; +event error.io.pciex.deg-poisecrc-d@PCIEXFN; +event error.io.pciex.f-poisecrc-d@PCIEXFN; +event error.io.pciex.ecrcreq-d@PCIEXFN; +event error.io.pciex.ecrccomp-d@PCIEXFN; +event error.io.pciex.poisreq-d@PCIEXFN; +event error.io.pciex.poiscomp-d@PCIEXFN; +event error.io.pciex.flt-poisreq-u@PCIEXFN; +event error.io.pciex.flt-poiscomp-u@PCIEXFN; +event error.io.pciex.flt-ecrcreq-u@PCIEXFN; +event error.io.pciex.flt-ecrccomp-u@PCIEXFN; + +prop error.io.pciex.nf-poisecrc-d@PCIEXFN (1)-> + error.io.pciex.ecrcreq-d@PCIEXFN, + error.io.pciex.ecrccomp-d@PCIEXFN, + error.io.pciex.poisreq-d@PCIEXFN, + error.io.pciex.poiscomp-d@PCIEXFN; + +prop error.io.pciex.nf-poisecrc-d@PCIEXFN (1)-> + error.io.pciex.noimpact-d@PCIEXFN; + +prop error.io.pciex.f-poisecrc-d@PCIEXFN (1)-> + error.io.pciex.ecrcreq-d@PCIEXFN, + error.io.pciex.ecrccomp-d@PCIEXFN, + error.io.pciex.poisreq-d@PCIEXFN, + error.io.pciex.poiscomp-d@PCIEXFN; + +prop error.io.pciex.f-poisecrc-d@PCIEXFN (1)-> + error.io.pciex.lost-d@PCIEXFN; + +prop error.io.pciex.deg-poisecrc-d@PCIEXFN (1)-> + error.io.pciex.ecrcreq-d@PCIEXFN, + error.io.pciex.ecrccomp-d@PCIEXFN, + error.io.pciex.poisreq-d@PCIEXFN, + error.io.pciex.poiscomp-d@PCIEXFN; + +prop error.io.pciex.deg-poisecrc-d@PCIEXFN (1)-> + error.io.pciex.degraded-d@PCIEXFN; + +prop error.io.pciex.flt-nf-poisecrc-u@PCIEXFN (1)-> + error.io.pciex.flt-ecrcreq-u@PCIEXFN, + error.io.pciex.flt-ecrccomp-u@PCIEXFN, + error.io.pciex.flt-poisreq-u@PCIEXFN, + error.io.pciex.flt-poiscomp-u@PCIEXFN; + +prop error.io.pciex.flt-nf-poisecrc-u@PCIEXFN (1)-> + error.io.pciex.noimpact-d@PCIEXFN; + +prop error.io.pciex.flt-deg-poisecrc-u@PCIEXFN (1)-> + error.io.pciex.flt-ecrcreq-u@PCIEXFN, + error.io.pciex.flt-ecrccomp-u@PCIEXFN, + error.io.pciex.flt-poisreq-u@PCIEXFN, + error.io.pciex.flt-poiscomp-u@PCIEXFN; + +prop error.io.pciex.flt-deg-poisecrc-u@PCIEXFN (1)-> + error.io.pciex.degraded-d@PCIEXFN; + +prop error.io.pciex.flt-f-poisecrc-u@PCIEXFN (1)-> + error.io.pciex.flt-ecrcreq-u@PCIEXFN, + error.io.pciex.flt-ecrccomp-u@PCIEXFN, + error.io.pciex.flt-poisreq-u@PCIEXFN, + error.io.pciex.flt-poiscomp-u@PCIEXFN; + +prop error.io.pciex.flt-f-poisecrc-u@PCIEXFN (1)-> + error.io.pciex.lost-d@PCIEXFN; /* * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * declarations * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ -event error.io.pciex.fatal@pciexbus/pciexdev/pciexfn; -event error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-ur-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.ur-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.ur-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.ur-u@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.nr-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.nr-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.nr-u@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.ca-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.ca-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.ca-u@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.mtlp-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.sw-mtlp-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.mtlp-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.flt-ca-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.ca-d@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.ca-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.ca-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.poisreq-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.poisreq-d@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.poisreq-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.sw-poisreq-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.poiscomp-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.ecrcreq-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.sw-ecrcreq-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.ecrccomp-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.badreq-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.badreq-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.badreq-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.badreq-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.badreq-u@pciexbus/pciexdev; -event error.io.pciex.badreq-u@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.ecrcreq-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.ecrcreq-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-f-ecrcreq-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-nf-ecrcreq-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-f-ecrcreq-u@pcibus/pcidev/pcifn; -event error.io.pciex.source-nf-ecrcreq-u@pcibus/pcidev/pcifn; -event error.io.pciex.ecrccomp-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.ecrccomp-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-f-ecrccomp-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-nf-ecrccomp-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-f-ecrccomp-u@pcibus/pcidev/pcifn; -event error.io.pciex.source-nf-ecrccomp-u@pcibus/pcidev/pcifn; -event error.io.pciex.poiscomp-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.poiscomp-u@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.poiscomp-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-f-poiscomp-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-nf-poiscomp-u@pciexbus/pciexdev/pciexfn; -event error.io.pci.source-f-dpdata-r-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.source-nf-dpdata-r-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.source-f-dpdata-r-u@pcibus/pcidev/pcifn; -event error.io.pci.source-nf-dpdata-r-u@pcibus/pcidev/pcifn; -event error.io.pciex.poisreq-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.poisreq-u@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.poisreq-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-f-poisreq-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-nf-poisreq-u@pciexbus/pciexdev/pciexfn; -event error.io.pci.source-f-dpdata-w-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.source-nf-dpdata-w-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.source-f-dpdata-w-u@pcibus/pcidev/pcifn; -event error.io.pci.source-nf-dpdata-w-u@pcibus/pcidev/pcifn; -event error.io.pciex.source-f-poisreq-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-nf-poisreq-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-mtlp-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-mtlp-u@pcibus/pcidev/pcifn; -event error.io.pci.badreq-pw-u@pcibus/pcidev/pcifn; -event error.io.pci.badreq-drw-u@pcibus/pcidev/pcifn; -event error.io.pci.badreq-pw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.badreq-drw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.target-ma-d@pciexbus/pciexdev/pciexfn; -event error.io.pci.target-rta-d@pciexbus/pciexdev/pciexfn; -event error.io.pci.target-mdpe-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.f-poisreq-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.f-poisreq-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.f-lf-poisreq-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.nf-poisreq-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.nf-poisreq-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.anf-poisreq-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.anf-poisreq-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.f-poiscomp-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.f-poiscomp-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.f-lf-poiscomp-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.nf-poiscomp-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.nf-poiscomp-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.anf-poiscomp-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.anf-poiscomp-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.f-ecrcreq-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.f-ecrcreq-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.f-ecrcreq-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pciex.f-ecrcreq-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pciex.f-ecrcreq-d@pcibus/pcidev/pcifn; -event error.io.pciex.nf-ecrcreq-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.nf-ecrcreq-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.nf-ecrcreq-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pciex.nf-ecrcreq-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pciex.nf-ecrcreq-d@pcibus/pcidev/pcifn; -event error.io.pciex.f-ecrccomp-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.f-ecrccomp-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.f-ecrccomp-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pciex.f-ecrccomp-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pciex.f-ecrccomp-d@pcibus/pcidev/pcifn; -event error.io.pciex.f-lf-ecrccomp-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.nf-ecrccomp-d@pciexbus/pciexdev/pciexfn; -event error.io.pciex.nf-ecrccomp-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.nf-ecrccomp-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pciex.nf-ecrccomp-d@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pciex.nf-ecrccomp-d@pcibus/pcidev/pcifn; -event error.io.pciex.f-lf-poisreq-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.fatal-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.nonfatal-u@pciexbus/pciexdev/pciexfn; -event error.io.pciex.fatal-u@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.nonfatal-u@pciexrc/pciexbus/pciexdev/pciexfn; -event error.io.pciex.fatal-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.nonfatal-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.service.restored@pcibus/pcidev/pcifn; - -event ereport.io.pci.ma@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pci.mdpe@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pci.dpe@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pci.rta@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pci.sta@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.service.lost@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.service.degraded@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.service.unaffected@pcibus/pcidev/pcifn{within(5s)}; -event ereport.io.pciex.dl.dllp@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.dl.btlp@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.dl.bdllp@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.dl.rto@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.dl.rnr@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.pl.re@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.pl.te@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.tl.fcp@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.tl.rof@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.tl.mtlp@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.tl.ur@pciexfn{within(5s)}; -event ereport.io.pciex.tl.ca@pciexfn{within(5s)}; -event ereport.io.pciex.tl.ur@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.tl.ca@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.tl.ecrc@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.tl.uc@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.tl.cto@pciexbus/pciexdev/pciexfn{within(5s)}; +event error.io.pciex.fatal@PCIEXFN; +event error.io.pciex.nonfatal@PCIEXFN; +event error.io.pciex.flt-ur-u@PCIEXFN; +event error.io.pciex.mtlp-d@PCIEXFN; +event error.io.pciex.sw-mtlp-d@PCIEXFN; +event error.io.pciex.mtlp-d@PCIEXFN/PCIEXFN; +event error.io.pciex.ca-d@PCIEXFN; +event error.io.pciex.ca-fwd-d@PCIEXFN; +event error.io.pciex.ca-fwd-d@PCIEXFN/PCIEXFN; +event error.io.pciex.poisreq-fwd-d@PCIEXFN; +event error.io.pciex.poisreq-fwd-d@pciexrc/PCIEXFN; +event error.io.pciex.poisreq-fwd-d@PCIEXFN/PCIEXFN; +event error.io.pciex.poiscomp-fwd-d@PCIEXFN; +event error.io.pciex.poiscomp-fwd-d@PCIEXFN/PCIEXFN; +event error.io.pciex.ecrcreq-fwd-d@PCIEXFN/PCIEXFN; +event error.io.pciex.ecrccomp-fwd-d@PCIEXFN/PCIEXFN; +event error.io.pciex.ecrcreq-fwd-d@PCIEXFN; +event error.io.pciex.ecrccomp-fwd-d@PCIEXFN; +event error.io.pciex.source-ecrcreq-u@PCIEXFN; +event error.io.pciex.source-ecrccomp-u@PCIEXFN; +event error.io.pciex.source-poiscomp-u@PCIEXFN; +event error.io.pciex.source-poisreq-u@PCIEXFN; +event error.io.pciex.badreq-d@PCIEXFN; +event error.io.pciex.badreq-d@PCIEXFN/PCIEXFN; +event error.io.pci.badreq-pw-d@PCIEXFN/PCIFN; +event error.io.pci.badreq-drw-d@PCIEXFN/PCIFN; +event error.io.pci.target-ma-d@PCIEXFN; +event error.io.pci.target-rta-d@PCIEXFN; +event error.io.pci.dpdata-pw-d@PCIEXFN/PCIFN; +event error.io.pci.dpdata-dw-d@PCIEXFN/PCIFN; +event error.io.pci.dpdata-dr-d@PCIEXFN/PCIFN; +event error.io.pciex.ca-u@PCIEXFN; +event error.io.pciex.ca-u@PCIEXFN/PCIEXFN; +event error.io.pciex.ca-u@pciexrc/PCIEXFN; +event error.io.pciex.ur-u@PCIEXFN; +event error.io.pciex.ur-u@PCIEXFN/PCIEXFN; +event error.io.pciex.ur-u@pciexrc/PCIEXFN; +event error.io.pciex.nr-u@PCIEXFN; +event error.io.pciex.nr-u@PCIEXFN/PCIEXFN; +event error.io.pciex.nr-u@pciexrc/PCIEXFN; +event error.io.pciex.mtlp-u@PCIEXFN; +event error.io.pciex.mtlp-u@PCIEXFN/PCIEXFN; +event error.io.pciex.mtlp-u@pciexrc/PCIEXFN; +event error.io.pciex.badreq-u@PCIEXFN; +event error.io.pciex.badreq-u@PCIEXFN/PCIEXFN; +event error.io.pciex.badreq-u@pciexrc/PCIEXFN; +event error.io.pciex.poisreq-u@PCIEXFN; +event error.io.pciex.poisreq-u@PCIEXFN/PCIEXFN; +event error.io.pciex.poisreq-u@pciexrc/PCIEXFN; +event error.io.pciex.poiscomp-u@PCIEXFN; +event error.io.pciex.poiscomp-u@PCIEXFN/PCIEXFN; +event error.io.pciex.poiscomp-u@pciexrc/PCIEXFN; +event error.io.pciex.ecrcreq-u@PCIEXFN; +event error.io.pciex.ecrcreq-u@PCIEXFN/PCIEXFN; +event error.io.pciex.ecrccomp-u@PCIEXFN; +event error.io.pciex.ecrccomp-u@PCIEXFN/PCIEXFN; + +event ereport.io.pci.ma@PCIEXFN{within(5s)}; +event ereport.io.pci.mdpe@PCIEXFN{within(5s)}; +event ereport.io.pci.dpe@PCIEXFN{within(5s)}; +event ereport.io.pci.rta@PCIEXFN{within(5s)}; +event ereport.io.pci.sta@PCIEXFN{within(5s)}; +event ereport.io.pciex.dl.dllp@PCIEXFN{within(5s)}; +event ereport.io.pciex.dl.btlp@PCIEXFN{within(5s)}; +event ereport.io.pciex.dl.bdllp@PCIEXFN{within(5s)}; +event ereport.io.pciex.dl.rto@PCIEXFN{within(5s)}; +event ereport.io.pciex.dl.rnr@PCIEXFN{within(5s)}; +event ereport.io.pciex.pl.re@PCIEXFN{within(5s)}; +event ereport.io.pciex.pl.te@PCIEXFN{within(5s)}; +event ereport.io.pciex.tl.fcp@PCIEXFN{within(5s)}; +event ereport.io.pciex.tl.rof@PCIEXFN{within(5s)}; +event ereport.io.pciex.tl.mtlp@PCIEXFN{within(5s)}; +event ereport.io.pciex.tl.ur@PCIEXFN{within(5s)}; +event ereport.io.pciex.tl.ca@PCIEXFN{within(5s)}; +event ereport.io.pciex.tl.ptlp@PCIEXFN{within(5s)}; +event ereport.io.pciex.tl.ecrc@PCIEXFN{within(5s)}; +event ereport.io.pciex.tl.uc@PCIEXFN{within(5s)}; +event ereport.io.pciex.tl.cto@PCIEXFN{within(5s)}; event ereport.io.pciex.dl.dllp@pciexrc{within(5s)}; event ereport.io.pciex.dl.btlp@pciexrc{within(5s)}; event ereport.io.pciex.dl.bdllp@pciexrc{within(5s)}; @@ -723,15 +682,18 @@ event ereport.io.pci.sec-mdpe@pciexrc{within(5s)}; event ereport.io.pci.sec-dpe@pciexrc{within(5s)}; event ereport.io.pci.sec-rta@pciexrc{within(5s)}; event ereport.io.pci.sec-sta@pciexrc{within(5s)}; -event ereport.io.pci.sec-mdpe@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pci.sec-dpe@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pci.sec-rserr@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pci.sserr@pciexbus/pciexdev/pciexfn{within(5s)}; +event ereport.io.pci.sec-mdpe@PCIEXFN{within(5s)}; +event ereport.io.pci.sec-dpe@PCIEXFN{within(5s)}; +event ereport.io.pci.sec-rserr@PCIEXFN{within(5s)}; +event ereport.io.pci.sserr@PCIEXFN{within(5s)}; event ereport.io.pci.sec-rserr@pciexrc{within(5s)}; event ereport.io.pciex.rc.fe-msg@pciexrc{within(5s)}; event ereport.io.pciex.rc.nfe-msg@pciexrc{within(5s)}; -event ereport.io.pciex.bdg.sec-interr@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.bdg.sec-ude@pciexbus/pciexdev/pciexfn{within(5s)}; +event ereport.io.pciex.rc.mue-msg@pciexrc{within(5s)}; +event ereport.io.pciex.bdg.sec-interr@PCIEXFN{within(5s)}; +event ereport.io.pciex.bdg.sec-ude@PCIEXFN{within(5s)}; +event ereport.io.pci.target-mdpe@PCIEXFN{within(5s)}; +event ereport.io.pci.target-mdpe@PCIFN{within(5s)}; /* * handling of fatal and nonfatal error messages propagated up to root complex @@ -739,38 +701,34 @@ event ereport.io.pciex.bdg.sec-ude@pciexbus/pciexdev/pciexfn{within(5s)}; * Use these for errors reported by root-complex on behalf of another device. * Can use source-id payload to identify where the message came from. */ -prop error.io.pciex.fatal@pciexbus[b]/pciexdev[d]/pciexfn[f] (1)-> - ereport.io.pciex.rc.fe-msg@pciexrc<> { - SOURCE_ID_MATCHES_BDF && BDF_IS_UNDER_RC }; - -prop error.io.pciex.fatal@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.fatal-u@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.fatal@PCIEXFN1 (1)-> + ereport.io.pciex.rc.mue-msg@pciexrc { is_under(pciexrc, PCIEXFN1) }, + ereport.io.pciex.rc.fe-msg@pciexrc { is_under(pciexrc, PCIEXFN1) && + SOURCE_ID_MATCHES_BDF }; -prop error.io.pciex.fatal-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.sserr@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.fatal@PCIEXFN (0)-> + ereport.io.pci.sserr@PCIEXFN1; -prop error.io.pciex.fatal-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.fatal-u@pciexbus/pciexdev/pciexfn, - ereport.io.pci.sec-rserr@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.fatal@PCIEXFN { is_under(PCIEXFN1, PCIEXFN) } (0)-> + ereport.io.pci.sserr@PCIEXFN1, + ereport.io.pci.sec-rserr@PCIEXFN1; -prop error.io.pciex.fatal-u@pciexrc/pciexbus/pciexdev/pciexfn (0)-> +prop error.io.pciex.fatal@PCIEXFN { is_under(pciexrc, PCIEXFN) } (0)-> ereport.io.pci.sec-rserr@pciexrc; -prop error.io.pciex.nonfatal@pciexbus[b]/pciexdev[d]/pciexfn[f] (1)-> - ereport.io.pciex.rc.nfe-msg@pciexrc<> { - SOURCE_ID_MATCHES_BDF && BDF_IS_UNDER_RC }; +prop error.io.pciex.nonfatal@PCIEXFN1 (1)-> + ereport.io.pciex.rc.mue-msg@pciexrc { is_under(pciexrc, PCIEXFN1) }, + ereport.io.pciex.rc.nfe-msg@pciexrc { is_under(pciexrc, PCIEXFN1) && + SOURCE_ID_MATCHES_BDF }; -prop error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nonfatal-u@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.nonfatal@PCIEXFN (0)-> + ereport.io.pci.sserr@PCIEXFN; -prop error.io.pciex.nonfatal-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.sserr@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.nonfatal@PCIEXFN { is_under(PCIEXFN1, PCIEXFN) } (0)-> + ereport.io.pci.sserr@PCIEXFN1, + ereport.io.pci.sec-rserr@PCIEXFN1; -prop error.io.pciex.nonfatal-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.nonfatal-u@pciexbus/pciexdev/pciexfn, - ereport.io.pci.sec-rserr@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.nonfatal-u@pciexrc/pciexbus/pciexdev/pciexfn (0)-> +prop error.io.pciex.nonfatal@PCIEXFN { is_under(pciexrc, PCIEXFN) } (0)-> ereport.io.pci.sec-rserr@pciexrc; /* @@ -779,24 +737,19 @@ prop error.io.pciex.nonfatal-u@pciexrc/pciexbus/pciexdev/pciexfn (0)-> * can use may propagations here as these ereports are only seen for these * faults. */ -prop error.io.pciex.corrlink@pciexbus (0)-> - ereport.io.pciex.dl.btlp@pciexbus/pciexdev/pciexfn - { IS_SWU || IS_LEAF || IS_BDG }, - ereport.io.pciex.dl.bdllp@pciexbus/pciexdev/pciexfn - { IS_SWU || IS_LEAF || IS_BDG }, - ereport.io.pciex.dl.rto@pciexbus/pciexdev/pciexfn - { IS_SWU || IS_LEAF || IS_BDG }, - ereport.io.pciex.dl.rnr@pciexbus/pciexdev/pciexfn - { IS_SWU || IS_LEAF || IS_BDG }, - ereport.io.pciex.pl.re@pciexbus/pciexdev/pciexfn - { IS_SWU || IS_LEAF || IS_BDG }; - -prop error.io.pciex.corrlink@pciexbus/pciexdev/pciexfn/pciexbus (0)-> - ereport.io.pciex.dl.btlp@pciexbus/pciexdev/pciexfn { IS_SWD }, - ereport.io.pciex.dl.bdllp@pciexbus/pciexdev/pciexfn { IS_SWD }, - ereport.io.pciex.dl.rto@pciexbus/pciexdev/pciexfn { IS_SWD }, - ereport.io.pciex.dl.rnr@pciexbus/pciexdev/pciexfn { IS_SWD }, - ereport.io.pciex.pl.re@pciexbus/pciexdev/pciexfn { IS_SWD }; +prop error.io.pciex.corrlink@pciexbus { !IS_SD(PCIEXFN) } (0)-> + ereport.io.pciex.dl.btlp@PCIEXFN, + ereport.io.pciex.dl.bdllp@PCIEXFN, + ereport.io.pciex.dl.rto@PCIEXFN, + ereport.io.pciex.dl.rnr@PCIEXFN, + ereport.io.pciex.pl.re@PCIEXFN; + +prop error.io.pciex.corrlink@PCIEXFN/pciexbus { IS_SD(PCIEXFN) } (0)-> + ereport.io.pciex.dl.btlp@PCIEXFN, + ereport.io.pciex.dl.bdllp@PCIEXFN, + ereport.io.pciex.dl.rto@PCIEXFN, + ereport.io.pciex.dl.rnr@PCIEXFN, + ereport.io.pciex.pl.re@PCIEXFN; prop error.io.pciex.corrlink@pciexrc/pciexbus (0)-> ereport.io.pciex.dl.btlp@pciexrc, @@ -805,29 +758,24 @@ prop error.io.pciex.corrlink@pciexrc/pciexbus (0)-> ereport.io.pciex.dl.rnr@pciexrc, ereport.io.pciex.pl.re@pciexrc; -prop error.io.pciex.fatlink@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.fatal@pciexbus/pciexdev/pciexfn - { IS_SWU || IS_LEAF || IS_BDG }; - -prop error.io.pciex.fatlink@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pciex.dl.dllp@pciexbus/pciexdev/pciexfn - { IS_SWU || IS_LEAF || IS_BDG }, - ereport.io.pciex.tl.fcp@pciexbus/pciexdev/pciexfn - { IS_SWU || IS_LEAF || IS_BDG }, - ereport.io.pciex.tl.rof@pciexbus/pciexdev/pciexfn - { IS_SWU || IS_LEAF || IS_BDG }; - -prop error.io.pciex.fatlink@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn -(0)-> - error.io.pciex.fatal@pciexbus/pciexdev/pciexfn { IS_SWD }; - -prop error.io.pciex.fatlink@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pciex.dl.dllp@pciexbus/pciexdev/pciexfn { IS_SWD }, - ereport.io.pciex.pl.te@pciexbus/pciexdev/pciexfn { IS_SWD }, - ereport.io.pciex.tl.fcp@pciexbus/pciexdev/pciexfn { IS_SWD }, - ereport.io.pciex.tl.rof@pciexbus/pciexdev/pciexfn { IS_SWD }; - -prop error.io.pciex.fatlink@pciexrc/pciexbus/pciexdev/pciexfn (0)-> +prop error.io.pciex.fatlink@PCIEXFN { !IS_SD(PCIEXFN) } (0)-> + error.io.pciex.fatal@PCIEXFN; + +prop error.io.pciex.fatlink@PCIEXFN { !IS_SD(PCIEXFN) } (0)-> + ereport.io.pciex.dl.dllp@PCIEXFN, + ereport.io.pciex.tl.fcp@PCIEXFN, + ereport.io.pciex.tl.rof@PCIEXFN; + +prop error.io.pciex.fatlink@PCIEXFN/PCIEXFN { IS_SD(PCIEXFN) } (0)-> + error.io.pciex.fatal@PCIEXFN; + +prop error.io.pciex.fatlink@PCIEXFN/PCIEXFN { IS_SD(PCIEXFN) } (0)-> + ereport.io.pciex.dl.dllp@PCIEXFN, + ereport.io.pciex.pl.te@PCIEXFN, + ereport.io.pciex.tl.fcp@PCIEXFN, + ereport.io.pciex.tl.rof@PCIEXFN; + +prop error.io.pciex.fatlink@pciexrc/PCIEXFN (0)-> ereport.io.pciex.dl.dllp@pciexrc, ereport.io.pciex.pl.te@pciexrc, ereport.io.pciex.tl.fcp@pciexrc, @@ -836,9 +784,9 @@ prop error.io.pciex.fatlink@pciexrc/pciexbus/pciexdev/pciexfn (0)-> /* * bridge internal error */ -prop error.io.pciex.sec-interr@pciexbus/pciexdev/pciexfn (2) -> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn { IS_BDG }, - ereport.io.pciex.bdg.sec-interr@pciexbus/pciexdev/pciexfn { IS_BDG }; +prop error.io.pciex.sec-interr@PCIEXFN { IS_BG(PCIEXFN) } (2) -> + error.io.pciex.nonfatal@PCIEXFN, + ereport.io.pciex.bdg.sec-interr@PCIEXFN; /* * downstream poisoned request @@ -847,109 +795,63 @@ prop error.io.pciex.sec-interr@pciexbus/pciexdev/pciexfn (2) -> * on route must raise a ptlp ereport while any switch ports forwarding * the poisoned request must raise sec-mdpe ereports. The originator of the * poisoning (be it root complex or downstream port of a switch) also raises - * sec-mdpe. A hardened leaf driver will also raise ptlp. A target-mdpe - * cascades down to the leaf (which may be a pci device beyond the bridge). + * sec-mdpe. A hardened leaf driver will also raise ptlp. A target-mdpe may + * be seen at the leaf (which may be a pci device beyond the bridge). * * Additionally, the leaf/bridge may treat the request as a ur, which the * root complex will see and report an ma. Use flt-ur-u to represent this. - * Note that sw-poisreq-d is to handle the case where the switch is actually - * the target of the packet (config request etc). * * The fault can always be recognized and the source identified using the ptlp * and sec-mdpe ereports. */ -prop error.io.pciex.flt-f-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.f-poisreq-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.f-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.sw-poisreq-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.f-poisreq-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.f-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.poisreq-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.f-poisreq-d@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.f-lf-poisreq-d@pciexbus/pciexdev/pciexfn { IS_LEAF }; - -prop error.io.pciex.f-lf-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pci.dpe@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.f-lf-poisreq-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn, - ereport.io.service.lost@pciexbus/pciexdev/pciexfn, - ereport.io.service.degraded@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.f-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; - -prop error.io.pciex.flt-nf-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nf-poisreq-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.anf-poisreq-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.nf-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nf-poisreq-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.nf-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.poisreq-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.nf-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pci.dpe@pciexbus/pciexdev/pciexfn { IS_LEAF }; - -prop error.io.pciex.nf-poisreq-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn { IS_LEAF }; - -prop error.io.pciex.nf-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.service.unaffected@pciexbus/pciexdev/pciexfn { IS_LEAF }, - error.io.service.restored@pciexbus/pciexdev/pciexfn { IS_LEAF }; - -prop error.io.service.restored@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.service.lost@pciexbus/pciexdev/pciexfn, - ereport.io.service.degraded@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.poisreq-d@PCIEXFN (1)-> + error.io.pciex.poisreq-fwd-d@PCIEXFN; -prop error.io.service.restored@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.service.restored@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_SD(PCIEXFN) || + IS_SU(PCIEXFN) } (1)-> + error.io.pciex.flt-ur-u@PCIEXFN, + error.io.pciex.poisreq-fwd-d@PCIEXFN/PCIEXFNHZ; -prop error.io.pciex.nf-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; - -prop error.io.pciex.anf-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.anf-poisreq-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.anf-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.poisreq-d@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.poisreq-fwd-d@pciexrc/PCIEXFN (1)-> + ereport.io.pci.sec-mdpe@pciexrc; -prop error.io.pciex.anf-poisreq-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.dpe@pciexbus/pciexdev/pciexfn { IS_LEAF }, - ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.poisreq-fwd-d@PCIEXFN/PCIEXFN { IS_SU(PCIEXFN) } (0)-> + ereport.io.pci.sec-mdpe@PCIEXFN; -prop error.io.pciex.poisreq-d@pciexrc/pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pci.sec-mdpe@pciexrc; +prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_SU(PCIEXFN) } (2)-> + ereport.io.pci.dpe@PCIEXFN, + ereport.io.pciex.tl.ptlp@PCIEXFN; -prop error.io.pciex.poisreq-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pci.sec-mdpe@pciexbus/pciexdev/pciexfn { IS_SWD }; +prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_SU(PCIEXFN) } (0)-> + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.poisreq-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.sec-mdpe@pciexbus/pciexdev/pciexfn { IS_SWU }; +prop error.io.pciex.poisreq-fwd-d@PCIEXFN/PCIEXFN { IS_SD(PCIEXFN) } (1)-> + ereport.io.pci.sec-mdpe@PCIEXFN; -prop error.io.pciex.poisreq-d@pciexbus/pciexdev/pciexfn (2)-> - ereport.io.pci.dpe@pciexbus/pciexdev/pciexfn { IS_SWU || IS_BDG }, - ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn { IS_SWU || IS_BDG }; +prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_SD(PCIEXFN) } (0)-> + ereport.io.pci.dpe@PCIEXFN, + ereport.io.pciex.tl.ptlp@PCIEXFN, + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.poisreq-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.dpe@pciexbus/pciexdev/pciexfn { IS_SWD }, - ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn { IS_SWD }; +prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (3)-> + ereport.io.pci.dpe@PCIEXFN, + ereport.io.pciex.tl.ptlp@PCIEXFN, + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.poisreq-d@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.flt-ur-u@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (1)-> + error.io.pci.dpdata-pw-d@PCIEXFN/PCIFNHZ, + error.io.pci.dpdata-dw-d@PCIEXFN/PCIFNHZ; -prop error.io.pciex.poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.target-mdpe-d@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; +prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (1)-> + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.sw-poisreq-d@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.flt-ur-u@pciexbus/pciexdev/pciexfn { IS_SWU }; +prop error.io.pciex.poisreq-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (0)-> + ereport.io.pci.dpe@PCIEXFN, + ereport.io.pciex.tl.ptlp@PCIEXFN, + error.io.pciex.flt-ur-u@PCIEXFN; -prop error.io.pciex.sw-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.target-mdpe-d@pciexbus/pciexdev/pciexfn { IS_SWU }; +prop error.io.pciex.poisreq-fwd-d@PCIEXFN (0)-> + ereport.io.pci.target-mdpe@PCIEXFN; /* * downstream poisoned completion @@ -961,83 +863,46 @@ prop error.io.pciex.sw-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> * the root complex identifying the leaf device, we won't actually be informed * that the error was an ptlp. */ -prop error.io.pciex.flt-f-poiscomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.f-poiscomp-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.f-poiscomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.f-poiscomp-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.f-poiscomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.poiscomp-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.f-poiscomp-d@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.f-lf-poiscomp-d@pciexbus/pciexdev/pciexfn { IS_LEAF }; - -prop error.io.pciex.f-lf-poiscomp-d@pciexbus/pciexdev/pciexfn (2)-> - ereport.io.pci.mdpe@pciexbus/pciexdev/pciexfn, - ereport.io.pci.dpe@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.f-lf-poiscomp-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn, - ereport.io.service.lost@pciexbus/pciexdev/pciexfn, - ereport.io.service.degraded@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.f-poiscomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; - -prop error.io.pciex.flt-nf-poiscomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nf-poiscomp-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.anf-poiscomp-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.nf-poiscomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nf-poiscomp-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.nf-poiscomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.poiscomp-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.nf-poiscomp-d@pciexbus/pciexdev/pciexfn (2)-> - ereport.io.pci.mdpe@pciexbus/pciexdev/pciexfn { IS_LEAF }, - ereport.io.pci.dpe@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.poiscomp-d@PCIEXFN (1)-> + error.io.pciex.poiscomp-fwd-d@PCIEXFN; -prop error.io.pciex.nf-poiscomp-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.poiscomp-fwd-d@PCIEXFN (1)-> + error.io.pciex.poiscomp-fwd-d@PCIEXFN/PCIEXFNHZ; -prop error.io.pciex.nf-poiscomp-d@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.service.unaffected@pciexbus/pciexdev/pciexfn { IS_LEAF }, - error.io.service.restored@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_SU(PCIEXFN) } (2)-> + ereport.io.pci.dpe@PCIEXFN, + ereport.io.pciex.tl.ptlp@PCIEXFN; -prop error.io.pciex.nf-poiscomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; +prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_SU(PCIEXFN) } (1)-> + ereport.io.pci.mdpe@PCIEXFN, + ereport.io.pci.sec-mdpe@PCIEXFN; -prop error.io.pciex.anf-poiscomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.anf-poiscomp-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; +prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_SU(PCIEXFN) } (0)-> + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.anf-poiscomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.poiscomp-d@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_SD(PCIEXFN) } (0)-> + ereport.io.pci.mdpe@PCIEXFN, + ereport.io.pci.sec-mdpe@PCIEXFN, + ereport.io.pci.dpe@PCIEXFN, + ereport.io.pciex.tl.ptlp@PCIEXFN, + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.anf-poiscomp-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.mdpe@pciexbus/pciexdev/pciexfn { IS_LEAF }, - ereport.io.pci.dpe@pciexbus/pciexdev/pciexfn { IS_LEAF }, - ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (4)-> + ereport.io.pci.mdpe@PCIEXFN, + ereport.io.pci.dpe@PCIEXFN, + ereport.io.pciex.tl.ptlp@PCIEXFN, + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.poiscomp-d@pciexbus/pciexdev/pciexfn (3)-> - ereport.io.pci.mdpe@pciexbus/pciexdev/pciexfn { IS_BDG }, - ereport.io.pci.dpe@pciexbus/pciexdev/pciexfn { IS_BDG }, - ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn { IS_BDG }; +prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (1)-> + error.io.pci.dpdata-dr-d@PCIEXFN/PCIFNHZ; -prop error.io.pciex.poiscomp-d@pciexbus/pciexdev/pciexfn (2)-> - ereport.io.pci.dpe@pciexbus/pciexdev/pciexfn { IS_SWU }, - ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn { IS_SWU }; +prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (1)-> + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.poiscomp-d@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pci.mdpe@pciexbus/pciexdev/pciexfn { IS_SWU }, - ereport.io.pci.sec-mdpe@pciexbus/pciexdev/pciexfn { IS_SWU }; - -prop error.io.pciex.poiscomp-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.mdpe@pciexbus/pciexdev/pciexfn { IS_SWD }, - ereport.io.pci.sec-mdpe@pciexbus/pciexdev/pciexfn { IS_SWD }, - ereport.io.pci.dpe@pciexbus/pciexdev/pciexfn { IS_SWD }, - ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn { IS_SWD }; +prop error.io.pciex.poiscomp-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (0)-> + ereport.io.pci.mdpe@PCIEXFN, + ereport.io.pci.dpe@PCIEXFN, + ereport.io.pciex.tl.ptlp@PCIEXFN; /* * downstream request with ecrc error. @@ -1050,7 +915,7 @@ prop error.io.pciex.poiscomp-d@pciexbus/pciexdev/pciexfn (0)-> * was an ecrc. * * Additionally, as the leaf/bridge will just throw away the packet, we should - * eventually get a cto at the root complex - so use an flt-nr-u at the pciex + * eventually get a cto at the root complex - so use an nr-u at the pciex * leaf or bridge to get the appropriate behaviour. For the case where the leaf * driver wasn't hardened we may be able to identify the leaf device (and * therefore any intermediate switches which might have caused the problem) @@ -1058,75 +923,31 @@ prop error.io.pciex.poiscomp-d@pciexbus/pciexdev/pciexfn (0)-> * reported from the root complex identifying the leaf device. The combination * of a nonfatal error reported from the root complex and a cto from the root * complex is sufficient to positively identify this case. - * - * Note that sw-ecrcreq-d is to handle the case where the switch is actually - * the target of the packet (config request etc). */ -prop error.io.pciex.flt-f-ecrcreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.f-ecrcreq-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.f-ecrcreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.sw-ecrcreq-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.f-ecrcreq-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.f-ecrcreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.f-ecrcreq-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.f-ecrcreq-d@pcibus/pcidev/pcifn (1)-> - error.io.pciex.f-ecrcreq-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.f-ecrcreq-d@pcibus/pcidev/pcifn (0)-> - ereport.io.service.lost@pcibus/pcidev/pcifn { IS_PCI_LEAF }, - ereport.io.service.degraded@pcibus/pcidev/pcifn { IS_PCI_LEAF }; - -prop error.io.pciex.f-ecrcreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.ecrcreq-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.f-ecrcreq-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pciex.tl.ecrc@pciexbus/pciexdev/pciexfn { IS_LEAF }, - ereport.io.service.lost@pciexbus/pciexdev/pciexfn { IS_LEAF }, - ereport.io.service.degraded@pciexbus/pciexdev/pciexfn { IS_LEAF }; - -prop error.io.pciex.flt-nf-ecrcreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nf-ecrcreq-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.nf-ecrcreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nf-ecrcreq-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.nf-ecrcreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nf-ecrcreq-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.nf-ecrcreq-d@pcibus/pcidev/pcifn (1)-> - error.io.pciex.nf-ecrcreq-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.nf-ecrcreq-d@pcibus/pcidev/pcifn (1)-> - ereport.io.service.unaffected@pcibus/pcidev/pcifn { IS_PCI_LEAF }, - error.io.service.restored@pcibus/pcidev/pcifn { IS_PCI_LEAF }; +prop error.io.pciex.ecrcreq-d@PCIEXFN (1)-> + error.io.pciex.ecrcreq-fwd-d@PCIEXFN; -prop error.io.pciex.nf-ecrcreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.ecrcreq-d@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.ecrcreq-fwd-d@PCIEXFN { IS_SU(PCIEXFN) || + IS_SD(PCIEXFN) } (1)-> + error.io.pciex.flt-nr-u@PCIEXFN, + error.io.pciex.ecrcreq-fwd-d@PCIEXFN/PCIEXFNHZ; -prop error.io.pciex.nf-ecrcreq-d@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pciex.tl.ecrc@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.ecrcreq-fwd-d@PCIEXFN { IS_SU(PCIEXFN) || + IS_SD(PCIEXFN) } (0)-> + ereport.io.pciex.tl.ecrc@PCIEXFN, + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.nf-ecrcreq-d@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.service.unaffected@pciexbus/pciexdev/pciexfn { IS_LEAF }, - error.io.service.restored@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.ecrcreq-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (3)-> + error.io.pciex.nonfatal@PCIEXFN, + ereport.io.pciex.tl.ecrc@PCIEXFN, + error.io.pciex.flt-nr-u@PCIEXFN; -prop error.io.pciex.ecrcreq-d@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.flt-nr-u@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; +prop error.io.pciex.ecrcreq-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (2)-> + error.io.pciex.nonfatal@PCIEXFN, + error.io.pciex.flt-nr-u@PCIEXFN; -prop error.io.pciex.ecrcreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; - -prop error.io.pciex.ecrcreq-d@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pciex.tl.ecrc@pciexbus/pciexdev/pciexfn { IS_BDG }; - -prop error.io.pciex.ecrcreq-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pciex.tl.ecrc@pciexbus/pciexdev/pciexfn { IS_SWU || IS_SWD }; - -prop error.io.pciex.sw-ecrcreq-d@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.flt-nr-u@pciexbus/pciexdev/pciexfn { IS_SWU }; +prop error.io.pciex.ecrcreq-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (0)-> + ereport.io.pciex.tl.ecrc@PCIEXFN; /* * downstream completion with ecrc error. @@ -1143,86 +964,37 @@ prop error.io.pciex.sw-ecrcreq-d@pciexbus/pciexdev/pciexfn (0)-> * not hardened) but if we get both ecrc and cto we need to distinguish from * cto only which would be an nr-d. */ -prop error.io.pciex.flt-f-ecrccomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.f-ecrccomp-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.f-ecrccomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.f-ecrccomp-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.f-ecrccomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.f-ecrccomp-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.f-ecrccomp-d@pcibus/pcidev/pcifn (1)-> - error.io.pciex.f-ecrccomp-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.f-ecrccomp-d@pcibus/pcidev/pcifn (0)-> - ereport.io.service.lost@pcibus/pcidev/pcifn { IS_PCI_LEAF }, - ereport.io.service.degraded@pcibus/pcidev/pcifn { IS_PCI_LEAF }; - -prop error.io.pciex.f-ecrccomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.ecrccomp-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.f-ecrccomp-d@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.f-lf-ecrccomp-d@pciexbus/pciexdev/pciexfn { IS_LEAF }, - ereport.io.service.lost@pciexbus/pciexdev/pciexfn { IS_LEAF }, - ereport.io.service.degraded@pciexbus/pciexdev/pciexfn { IS_LEAF }; - -prop error.io.pciex.f-lf-ecrccomp-d@pciexbus/pciexdev/pciexfn (2)-> - ereport.io.pciex.tl.ecrc@pciexbus/pciexdev/pciexfn, - ereport.io.pciex.tl.cto@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.f-lf-ecrccomp-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.ma@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.flt-nf-ecrccomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nf-ecrccomp-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.nf-ecrccomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nf-ecrccomp-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.nf-ecrccomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nf-ecrccomp-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pciex.ecrccomp-d@PCIEXFN (1)-> + error.io.pciex.ecrccomp-fwd-d@PCIEXFN; -prop error.io.pciex.nf-ecrccomp-d@pcibus/pcidev/pcifn (1)-> - error.io.pciex.nf-ecrccomp-d@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pciex.ecrccomp-fwd-d@PCIEXFN (1)-> + error.io.pciex.ecrccomp-fwd-d@PCIEXFN/PCIEXFNHZ; -prop error.io.pciex.nf-ecrccomp-d@pcibus/pcidev/pcifn (1)-> - ereport.io.service.unaffected@pcibus/pcidev/pcifn { IS_PCI_LEAF }, - error.io.service.restored@pcibus/pcidev/pcifn { IS_PCI_LEAF }; +prop error.io.pciex.ecrccomp-fwd-d@PCIEXFN { IS_SU(PCIEXFN) || + IS_SD(PCIEXFN) } (0)-> + error.io.pciex.nonfatal@PCIEXFN, + ereport.io.pciex.tl.ecrc@PCIEXFN; -prop error.io.pciex.nf-ecrccomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.ecrccomp-d@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.ecrccomp-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (3)-> + error.io.pciex.nonfatal@PCIEXFN, + ereport.io.pciex.tl.ecrc@PCIEXFN, + error.io.pciex.nr-d@PCIEXFN; -prop error.io.pciex.nf-ecrccomp-d@pciexbus/pciexdev/pciexfn (2)-> - ereport.io.pciex.tl.ecrc@pciexbus/pciexdev/pciexfn { IS_LEAF }, - ereport.io.pciex.tl.cto@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.ecrccomp-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (1)-> + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.nf-ecrccomp-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.ma@pciexbus/pciexdev/pciexfn { IS_LEAF }; - -prop error.io.pciex.nf-ecrccomp-d@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.service.unaffected@pciexbus/pciexdev/pciexfn { IS_LEAF }, - error.io.service.restored@pciexbus/pciexdev/pciexfn { IS_LEAF }; - -prop error.io.pciex.ecrccomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; - -prop error.io.pciex.ecrccomp-d@pciexbus/pciexdev/pciexfn (2)-> - ereport.io.pciex.tl.ecrc@pciexbus/pciexdev/pciexfn { IS_BDG }, - error.io.pciex.nr-d@pciexbus/pciexdev/pciexfn { IS_BDG }; - -prop error.io.pciex.ecrccomp-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pciex.tl.ecrc@pciexbus/pciexdev/pciexfn { IS_SWU || IS_SWD }; +prop error.io.pciex.ecrccomp-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (0)-> + ereport.io.pciex.tl.ecrc@PCIEXFN, + error.io.pciex.nr-d@PCIEXFN; /* * upstream poisoned request * - * - flt-poisreq-u is just on the pciex node which generated the fault (if the - * fault was generated by a pciex node and not a child pci node). - * - source-poisreq-u cascades down to at least one leaf device (pciex or pci), - * whose bdf (if pciex) must match the source-id in the payload of the + * - flt-poisreq-u is on the pciex node which generated the fault + * - source-poisreq-u refers to at least one leaf or bridge device + * whose bdf (if leaf) must match the source-id in the payload of the * ereport generated from the root complex. - * - poisreq-u cascades up to the root complex and any switch ports on + * - poisreq-u propagates up to the root complex and any switch ports on * route will raise a ptlp ereport, while any upstream devices generating * or forwarding the poisoned packed will raise an mdpe ereport. The root * complex should also report a ptlp. @@ -1239,113 +1011,72 @@ prop error.io.pciex.ecrccomp-d@pciexbus/pciexdev/pciexfn (0)-> * at the intervening switches will narrow the fault down to a single suspect. */ -prop error.io.pciex.flt-f-poisreq-u@pciexbus/pciexdev/pciexfn (2)-> - error.io.pciex.source-f-poisreq-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.poisreq-u@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.source-f-poisreq-u@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.f-lf-poisreq-u@pciexbus/pciexdev/pciexfn { IS_LEAF }; - -prop error.io.pciex.f-lf-poisreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.service.lost@pciexbus/pciexdev/pciexfn, - ereport.io.service.degraded@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.f-lf-poisreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.ma@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.source-f-poisreq-u@pciexbus[b]/pciexdev[d]/pciexfn[f] (0)-> - ereport.io.pciex.tl.ptlp@pciexrc<> { - BDF_IS_LEAF && SOURCE_ID_MATCHES_BDF && BDF_IS_UNDER_RC }, - ereport.io.pciex.tl.ur@pciexrc<> { - BDF_IS_LEAF && SOURCE_ID_MATCHES_BDF && BDF_IS_UNDER_RC }; - -prop error.io.pciex.source-f-poisreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.ma@pciexbus/pciexdev/pciexfn { IS_BDG }; - -prop error.io.pciex.source-f-poisreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.sec-sta@pciexbus/pciexdev/pciexfn, - error.io.pci.ta-drw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; - -prop error.io.pci.source-f-dpdata-w-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.tl.ptlp@pciexrc<> { PCIBDF_IS_UNDER_RC }, - ereport.io.pciex.tl.ur@pciexrc<> { PCIBDF_IS_UNDER_RC }; - -prop error.io.pci.source-f-dpdata-w-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.bdg.sec-ude@pciexbus/pciexdev/pciexfn { IS_BDG && - BDF_IS_PCI_LEAF && SOURCE_ID_MATCHES_BDF && PCIBDF_IS_UNDER_DEV }; - -prop error.io.pciex.flt-nf-poisreq-u@pciexbus/pciexdev/pciexfn (2)-> - error.io.pciex.source-nf-poisreq-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.poisreq-u@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.source-nf-poisreq-u@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.service.unaffected@pciexbus/pciexdev/pciexfn { IS_LEAF }, - error.io.service.restored@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.flt-poisreq-u@PCIEXFN1 { (IS_LF(PCIEXFN) || + IS_BG(PCIEXFN)) && is_under(PCIEXFN1, PCIEXFN) } (0)-> + error.io.pciex.source-poisreq-u@PCIEXFN; -prop error.io.pciex.source-nf-poisreq-u@pciexbus[b]/pciexdev[d]/pciexfn[f] (0)-> - ereport.io.pciex.tl.ptlp@pciexrc<> { - BDF_IS_LEAF && SOURCE_ID_MATCHES_BDF && BDF_IS_UNDER_RC }, - ereport.io.pciex.tl.ur@pciexrc<> { - BDF_IS_LEAF && SOURCE_ID_MATCHES_BDF && BDF_IS_UNDER_RC }; +prop error.io.pciex.source-poisreq-u@PCIEXFN1 { IS_LF(PCIEXFN1) && + SOURCE_ID_MATCHES_BDF && is_under(pciexrc, PCIEXFN1) } (0)-> + ereport.io.pciex.tl.ptlp@pciexrc, + ereport.io.pciex.tl.ur@pciexrc; -prop error.io.pciex.source-nf-poisreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.ma@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.source-poisreq-u@PCIEXFN { IS_LF(PCIEXFN) } (0)-> + ereport.io.pci.ma@PCIEXFN; -prop error.io.pciex.source-nf-poisreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.ma@pciexbus/pciexdev/pciexfn { IS_BDG }; +prop error.io.pciex.source-poisreq-u@PCIEXFN { IS_BG(PCIEXFN) && + is_under(pciexrc, PCIEXFN) } (0)-> + ereport.io.pciex.tl.ptlp@pciexrc, + ereport.io.pciex.tl.ur@pciexrc; -prop error.io.pciex.source-nf-poisreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.sec-sta@pciexbus/pciexdev/pciexfn, - error.io.pci.ta-drw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; +prop error.io.pciex.source-poisreq-u@PCIEXFN { IS_BG(PCIEXFN) } (0)-> + ereport.io.pci.ma@PCIEXFN, + ereport.io.pci.sec-sta@PCIEXFN, + error.io.pci.ta-drw-d@PCIEXFN/PCIFN; -prop error.io.pci.source-nf-dpdata-w-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.tl.ptlp@pciexrc<> { PCIBDF_IS_UNDER_RC }, - ereport.io.pciex.tl.ur@pciexrc<> { PCIBDF_IS_UNDER_RC }; +prop error.io.pciex.flt-poisreq-u@PCIEXFN (1)-> + error.io.pciex.poisreq-u@PCIEXFN; -prop error.io.pci.source-nf-dpdata-w-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.bdg.sec-ude@pciexbus/pciexdev/pciexfn { IS_BDG && - BDF_IS_PCI_LEAF && SOURCE_ID_MATCHES_BDF && PCIBDF_IS_UNDER_DEV }; - -prop error.io.pciex.poisreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.ma@pciexbus/pciexdev/pciexfn { IS_BDG }; - -prop error.io.pciex.poisreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.sec-sta@pciexbus/pciexdev/pciexfn, - error.io.pci.ta-drw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; +/* + * the remaining propagations are also used for poisoned requests propagating + * up due to a fault behind a pcie-pci bridge + */ +prop error.io.pciex.poisreq-u@PCIEXFN/PCIEXFN (1)-> + error.io.pciex.poisreq-u@PCIEXFN; -prop error.io.pciex.poisreq-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.poisreq-u@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.poisreq-u@PCIEXFN { IS_BG(PCIEXFN) } (1)-> + ereport.io.pci.mdpe@PCIEXFN; -prop error.io.pciex.poisreq-u@pciexbus/pciexdev/pciexfn (2)-> - ereport.io.pci.sec-dpe@pciexbus/pciexdev/pciexfn { IS_SWD }, - ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn { IS_SWD }; +prop error.io.pciex.poisreq-u@PCIEXFN { IS_LF(PCIEXFN) } (0)-> + ereport.io.pci.mdpe@PCIEXFN; -prop error.io.pciex.poisreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.sec-dpe@pciexbus/pciexdev/pciexfn { IS_SWU }, - ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn { IS_SWU }; +prop error.io.pciex.poisreq-u@PCIEXFN { IS_SD(PCIEXFN) } (2)-> + ereport.io.pci.sec-dpe@PCIEXFN, + ereport.io.pciex.tl.ptlp@PCIEXFN; -prop error.io.pciex.poisreq-u@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pci.mdpe@pciexbus/pciexdev/pciexfn { IS_BDG || IS_SWU }; +prop error.io.pciex.poisreq-u@PCIEXFN { IS_SD(PCIEXFN) } (0)-> + ereport.io.pci.mdpe@PCIEXFN, + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.poisreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.mdpe@pciexbus/pciexdev/pciexfn { IS_SWD }; +prop error.io.pciex.poisreq-u@PCIEXFN { IS_SU(PCIEXFN) } (1)-> + ereport.io.pci.mdpe@PCIEXFN; -prop error.io.pciex.poisreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.mdpe@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.poisreq-u@PCIEXFN { IS_SU(PCIEXFN) } (0)-> + ereport.io.pci.sec-dpe@PCIEXFN, + ereport.io.pciex.tl.ptlp@PCIEXFN, + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.poisreq-u@pciexrc/pciexbus/pciexdev/pciexfn (1)-> +prop error.io.pciex.poisreq-u@pciexrc/PCIEXFN (1)-> ereport.io.pci.sec-dpe@pciexrc; /* * upstream poisoned completion * - * - flt-poiscomp-u is just on the pciex node which generated the fault (if the - * fault was generated by a pciex node and not a child pci node). There will + * - flt-poiscomp-u is on the pciex node which generated the fault. There will * be a target-mdpe downstream from here. - * - source-poiscomp-u cascades down to at least one leaf device (pciex or pci), - * whose bdf (if pciex) must match the source-id in the payload of the + * - source-poiscomp-u refers to at least one leaf or bridge device + * whose bdf (if leaf) must match the source-id in the payload of the * ereport generated from the root complex. - * - poiscomp-u cascades up to the root complex and any switches on + * - poiscomp-u propagates up to the root complex and any switches on * route will raise ptlp and sec-mdpe ereports. The root complex will also * raise a sec-mdpe and ptlp. * @@ -1355,78 +1086,69 @@ prop error.io.pciex.poisreq-u@pciexrc/pciexbus/pciexdev/pciexfn (1)-> * originator of the completion. The ptlp/sec-mdpe ereports at the intervening * switches will narrow the fault down to a single suspect. */ -prop error.io.pciex.flt-f-poiscomp-u@pciexbus/pciexdev/pciexfn (3)-> - error.io.pciex.source-f-poiscomp-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.poiscomp-u@pciexbus/pciexdev/pciexfn, - error.io.pci.target-mdpe-d@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.source-f-poiscomp-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.service.lost@pciexbus/pciexdev/pciexfn { IS_LEAF }, - ereport.io.service.degraded@pciexbus/pciexdev/pciexfn { IS_LEAF }; - -prop error.io.pciex.source-f-poiscomp-u@pciexbus[b]/pciexdev[d]/pciexfn[f] (0)-> - ereport.io.pciex.tl.ptlp@pciexrc<> { - SOURCE_ID_MATCHES_BDF && BDF_IS_UNDER_RC }; +prop error.io.pciex.flt-poiscomp-u@PCIEXFN { IS_LF(PCIEXFN1) && + is_under(PCIEXFN, PCIEXFN1) } (0)-> + ereport.io.pci.target-mdpe@PCIEXFN1; -prop error.io.pci.source-f-dpdata-r-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.tl.ptlp@pciexrc<> { PCIBDF_IS_UNDER_RC }; +prop error.io.pciex.flt-poiscomp-u@PCIEXFN { IS_PCI_LF(PCIFN) && + is_under(PCIEXFN, PCIFN) } (0)-> + ereport.io.pci.target-mdpe@PCIFN; -prop error.io.pci.source-f-dpdata-r-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.bdg.sec-ude@pciexbus/pciexdev/pciexfn { IS_BDG && - BDF_IS_PCI_LEAF && SOURCE_ID_MATCHES_BDF && PCIBDF_IS_UNDER_DEV }; +prop error.io.pciex.flt-poiscomp-u@PCIEXFN1 { (IS_LF(PCIEXFN) || + IS_BG(PCIEXFN)) && is_under(PCIEXFN1, PCIEXFN) } (0)-> + error.io.pciex.source-poiscomp-u@PCIEXFN; -prop error.io.pciex.flt-nf-poiscomp-u@pciexbus/pciexdev/pciexfn (3)-> - error.io.pciex.source-nf-poiscomp-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.poiscomp-u@pciexbus/pciexdev/pciexfn, - error.io.pci.target-mdpe-d@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.source-poiscomp-u@PCIEXFN1 { IS_LF(PCIEXFN1) && + SOURCE_ID_MATCHES_BDF && is_under(pciexrc, PCIEXFN1) } (0)-> + ereport.io.pciex.tl.ptlp@pciexrc; -prop error.io.pciex.source-nf-poiscomp-u@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.service.unaffected@pciexbus/pciexdev/pciexfn { IS_LEAF }, - error.io.service.restored@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.source-poiscomp-u@PCIEXFN1 { IS_BG(PCIEXFN1) && + is_under(pciexrc, PCIEXFN1) } (0)-> + ereport.io.pciex.tl.ptlp@pciexrc; -prop error.io.pciex.source-nf-poiscomp-u@pciexbus[b]/pciexdev[d]/pciexfn[f] (0)-> - ereport.io.pciex.tl.ptlp@pciexrc<> { - SOURCE_ID_MATCHES_BDF && BDF_IS_UNDER_RC }; +prop error.io.pciex.flt-poiscomp-u@PCIEXFN (1)-> + error.io.pciex.poiscomp-u@PCIEXFN; -prop error.io.pci.source-nf-dpdata-r-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.tl.ptlp@pciexrc<> { PCIBDF_IS_UNDER_RC }; - -prop error.io.pci.source-nf-dpdata-r-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.bdg.sec-ude@pciexbus/pciexdev/pciexfn { IS_BDG && - BDF_IS_PCI_LEAF && SOURCE_ID_MATCHES_BDF && PCIBDF_IS_UNDER_DEV }; +/* + * the remaining propagations are also used for poisoned completions propagating + * up due to a fault behind a pcie-pci bridge + */ +prop error.io.pciex.poiscomp-u@PCIEXFN/PCIEXFN (1)-> + error.io.pciex.poiscomp-u@PCIEXFN; -prop error.io.pciex.poiscomp-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.poiscomp-u@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.poiscomp-u@PCIEXFN { IS_SD(PCIEXFN) } (2)-> + ereport.io.pci.sec-dpe@PCIEXFN, + ereport.io.pciex.tl.ptlp@PCIEXFN; -prop error.io.pciex.poiscomp-u@pciexbus/pciexdev/pciexfn (2)-> - ereport.io.pci.sec-dpe@pciexbus/pciexdev/pciexfn { IS_SWD }, - ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn { IS_SWD }; +prop error.io.pciex.poiscomp-u@PCIEXFN { IS_SD(PCIEXFN) } (1)-> + ereport.io.pci.sec-mdpe@PCIEXFN, + ereport.io.pci.mdpe@PCIEXFN; -prop error.io.pciex.poiscomp-u@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pci.sec-mdpe@pciexbus/pciexdev/pciexfn { IS_SWD }, - ereport.io.pci.mdpe@pciexbus/pciexdev/pciexfn { IS_SWD }; +prop error.io.pciex.poiscomp-u@PCIEXFN { IS_SD(PCIEXFN) } (0)-> + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.poiscomp-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.mdpe@pciexbus/pciexdev/pciexfn { IS_SWU }, - ereport.io.pci.sec-mdpe@pciexbus/pciexdev/pciexfn { IS_SWU }, - ereport.io.pci.sec-dpe@pciexbus/pciexdev/pciexfn { IS_SWU }, - ereport.io.pciex.tl.ptlp@pciexbus/pciexdev/pciexfn { IS_SWU }; +prop error.io.pciex.poiscomp-u@PCIEXFN { IS_SU(PCIEXFN) } (0)-> + ereport.io.pci.mdpe@PCIEXFN, + ereport.io.pci.sec-mdpe@PCIEXFN, + ereport.io.pci.sec-dpe@PCIEXFN, + ereport.io.pciex.tl.ptlp@PCIEXFN, + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.poiscomp-u@pciexrc/pciexbus/pciexdev/pciexfn (1)-> +prop error.io.pciex.poiscomp-u@pciexrc/PCIEXFN (1)-> ereport.io.pci.sec-dpe@pciexrc; -prop error.io.pciex.poiscomp-u@pciexrc/pciexbus/pciexdev/pciexfn (0)-> +prop error.io.pciex.poiscomp-u@pciexrc/PCIEXFN (0)-> ereport.io.pci.sec-mdpe@pciexrc; /* * upstream request with ecrc error. * - * - flt-ecrcreq-u is just on the pciex node which generated the fault. + * - flt-ecrcreq-u is on the pciex node which generated the fault. * - source-ecrcreq-u cascades down to at least one leaf device (pciex or pci), * whose bdf (if pciex) must match the source-id in the payload of the * ereport generated from the root complex. - * - ecrcreq-u cascades up to the root complex which must report it with an ecrc - * ereport and any switches on route can optionally raise an ecrc ereport. + * - ecrcreq-u propagates up to the root complex which must report it with an + * ecrc ereport and any switches on route can optionally raise an ecrc ereport * * Additionally, as the root complex will just throw away the packet, we may * eventually get a cto - so use an nr-d at the pciex leaf or bridge to get @@ -1437,65 +1159,40 @@ prop error.io.pciex.poiscomp-u@pciexrc/pciexbus/pciexdev/pciexfn (0)-> * can be done from the cto ereport (for a hardened leaf driver) or for a * non-hardened leaf using the source-id payload of the ecrc. */ -prop error.io.pciex.flt-f-ecrcreq-u@pciexbus/pciexdev/pciexfn (2)-> - error.io.pciex.source-f-ecrcreq-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.ecrcreq-u@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.source-f-ecrcreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.service.lost@pciexbus/pciexdev/pciexfn { IS_LEAF }, - ereport.io.service.degraded@pciexbus/pciexdev/pciexfn { IS_LEAF }; - -prop error.io.pciex.source-f-ecrcreq-u@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.nr-d@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; - -prop error.io.pciex.source-f-ecrcreq-u@pciexbus[b]/pciexdev[d]/pciexfn[f] (1)-> - ereport.io.pciex.tl.ecrc@pciexrc<> { - BDF_IS_LEAF && SOURCE_ID_MATCHES_BDF && BDF_IS_UNDER_RC }; - -prop error.io.pciex.source-f-ecrcreq-u@pcibus/pcidev/pcifn (0)-> - ereport.io.service.lost@pcibus/pcidev/pcifn { IS_PCI_LEAF }, - ereport.io.service.degraded@pcibus/pcidev/pcifn { IS_PCI_LEAF }; +prop error.io.pciex.flt-ecrcreq-u@PCIEXFN1 { (IS_LF(PCIEXFN) || + IS_BG(PCIEXFN)) && is_under(PCIEXFN1, PCIEXFN) } (0)-> + error.io.pciex.source-ecrcreq-u@PCIEXFN; -prop error.io.pciex.source-f-ecrcreq-u@pcibus[b]/pcidev[d]/pcifn[f] (1)-> - ereport.io.pciex.tl.ecrc@pciexrc<> { PCIBDF_IS_UNDER_RC }; +prop error.io.pciex.source-ecrcreq-u@PCIEXFN (0)-> + error.io.pciex.nr-d@PCIEXFN; -prop error.io.pciex.flt-nf-ecrcreq-u@pciexbus/pciexdev/pciexfn (2)-> - error.io.pciex.source-nf-ecrcreq-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.ecrcreq-u@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.source-ecrcreq-u@PCIEXFN1 { IS_LF(PCIEXFN1) && + SOURCE_ID_MATCHES_BDF && is_under(pciexrc, PCIEXFN1) } (0)-> + ereport.io.pciex.tl.ecrc@pciexrc; -prop error.io.pciex.source-nf-ecrcreq-u@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.nr-d@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; +prop error.io.pciex.source-ecrcreq-u@PCIEXFN { IS_BG(PCIEXFN) && + is_under(pciexrc, PCIEXFN) } (0)-> + ereport.io.pciex.tl.ecrc@pciexrc; -prop error.io.pciex.source-nf-ecrcreq-u@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.service.unaffected@pciexbus/pciexdev/pciexfn { IS_LEAF }, - error.io.service.restored@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.flt-ecrcreq-u@PCIEXFN (1)-> + error.io.pciex.ecrcreq-u@PCIEXFN; -prop error.io.pciex.source-nf-ecrcreq-u@pciexbus[b]/pciexdev[d]/pciexfn[f] (1)-> - ereport.io.pciex.tl.ecrc@pciexrc<> { - BDF_IS_LEAF && SOURCE_ID_MATCHES_BDF && BDF_IS_UNDER_RC }; +prop error.io.pciex.ecrcreq-u@PCIEXFN/PCIEXFN (1)-> + error.io.pciex.ecrcreq-u@PCIEXFN; -prop error.io.pciex.source-nf-ecrcreq-u@pcibus/pcidev/pcifn (1)-> - ereport.io.service.unaffected@pcibus/pcidev/pcifn { IS_PCI_LEAF }, - error.io.service.restored@pcibus/pcidev/pcifn { IS_PCI_LEAF }; - -prop error.io.pciex.source-nf-ecrcreq-u@pcibus[b]/pcidev[d]/pcifn[f] (1)-> - ereport.io.pciex.tl.ecrc@pciexrc<> { PCIBDF_IS_UNDER_RC }; - -prop error.io.pciex.ecrcreq-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.ecrcreq-u@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.ecrcreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pciex.tl.ecrc@pciexbus/pciexdev/pciexfn { IS_SWD || IS_SWU }; +prop error.io.pciex.ecrcreq-u@PCIEXFN { IS_SD(PCIEXFN)||IS_SU(PCIEXFN) } (0)-> + ereport.io.pciex.tl.ecrc@PCIEXFN, + error.io.pciex.nonfatal@PCIEXFN; /* * upstream completion with ecrc error. * - * - flt-ecrccomp-u is just on the pciex node which generated the fault. + * - flt-ecrccomp-u is on the pciex node which generated the fault. * - source-ecrccomp-u cascades down to at least one leaf device (pciex or pci), * whose bdf (if pciex) must match the source-id in the payload of the * ereport generated from the root complex. - * - ecrccomp-u cascades up to the root complex, which should report it with an - * ecrc ereport and any switches on route can optionally raise an ecrc + * - ecrccomp-u propagates up to the root complex, which should report it with + * an ecrc ereport and any switches on route can optionally raise an ecrc * ereport. * * Additionally, as the root complex will just throw away the packet, we'll @@ -1507,55 +1204,30 @@ prop error.io.pciex.ecrcreq-u@pciexbus/pciexdev/pciexfn (0)-> * using either the source-id payload of the ecrc or the target-ma ereport if * available. */ -prop error.io.pciex.flt-f-ecrccomp-u@pciexbus/pciexdev/pciexfn (2)-> - error.io.pciex.source-f-ecrccomp-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.ecrccomp-u@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.source-f-ecrccomp-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.service.lost@pciexbus/pciexdev/pciexfn { IS_LEAF }, - ereport.io.service.degraded@pciexbus/pciexdev/pciexfn { IS_LEAF }; - -prop error.io.pciex.source-f-ecrccomp-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.flt-nr-u@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; - -prop error.io.pciex.source-f-ecrccomp-u@pciexbus[b]/pciexdev[d]/pciexfn[f] (1)-> - ereport.io.pciex.tl.ecrc@pciexrc<> { - SOURCE_ID_MATCHES_BDF && BDF_IS_UNDER_RC }; - -prop error.io.pciex.source-f-ecrccomp-u@pcibus/pcidev/pcifn (0)-> - ereport.io.service.lost@pcibus/pcidev/pcifn { IS_PCI_LEAF }, - ereport.io.service.degraded@pcibus/pcidev/pcifn { IS_PCI_LEAF }; +prop error.io.pciex.flt-ecrccomp-u@PCIEXFN1 { (IS_LF(PCIEXFN) || + IS_BG(PCIEXFN)) && is_under(PCIEXFN1, PCIEXFN) } (0)-> + error.io.pciex.source-ecrccomp-u@PCIEXFN; -prop error.io.pciex.source-f-ecrccomp-u@pcibus[b]/pcidev[d]/pcifn[f] (1)-> - ereport.io.pciex.tl.ecrc@pciexrc<> { PCIBDF_IS_UNDER_RC }; +prop error.io.pciex.source-ecrccomp-u@PCIEXFN (0)-> + error.io.pciex.flt-nr-u@PCIEXFN; -prop error.io.pciex.flt-nf-ecrccomp-u@pciexbus/pciexdev/pciexfn (2)-> - error.io.pciex.source-nf-ecrccomp-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.ecrccomp-u@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.source-ecrccomp-u@PCIEXFN1 { IS_LF(PCIEXFN1) && + SOURCE_ID_MATCHES_BDF && is_under(pciexrc, PCIEXFN1) } (0)-> + ereport.io.pciex.tl.ecrc@pciexrc; -prop error.io.pciex.source-nf-ecrccomp-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.flt-nr-u@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; +prop error.io.pciex.source-ecrccomp-u@PCIEXFN { IS_BG(PCIEXFN) && + is_under(pciexrc, PCIEXFN) } (0)-> + ereport.io.pciex.tl.ecrc@pciexrc; -prop error.io.pciex.source-nf-ecrccomp-u@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.service.unaffected@pciexbus/pciexdev/pciexfn { IS_LEAF }, - error.io.service.restored@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.flt-ecrccomp-u@PCIEXFN (1)-> + error.io.pciex.ecrccomp-u@PCIEXFN; -prop error.io.pciex.source-nf-ecrccomp-u@pciexbus[b]/pciexdev[d]/pciexfn[f] (1)-> - ereport.io.pciex.tl.ecrc@pciexrc<> { - SOURCE_ID_MATCHES_BDF && BDF_IS_UNDER_RC }; +prop error.io.pciex.ecrccomp-u@PCIEXFN/PCIEXFN (1)-> + error.io.pciex.ecrccomp-u@PCIEXFN; -prop error.io.pciex.source-nf-ecrccomp-u@pcibus/pcidev/pcifn (1)-> - ereport.io.service.unaffected@pcibus/pcidev/pcifn { IS_PCI_LEAF }, - error.io.service.restored@pcibus/pcidev/pcifn { IS_PCI_LEAF }; - -prop error.io.pciex.source-nf-ecrccomp-u@pcibus[b]/pcidev[d]/pcifn[f] (1)-> - ereport.io.pciex.tl.ecrc@pciexrc<> { PCIBDF_IS_UNDER_RC }; - -prop error.io.pciex.ecrccomp-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.ecrccomp-u@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.ecrccomp-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pciex.tl.ecrc@pciexbus/pciexdev/pciexfn { IS_SWD || IS_SWU }; +prop error.io.pciex.ecrccomp-u@PCIEXFN { IS_SD(PCIEXFN)||IS_SU(PCIEXFN) } (0)-> + ereport.io.pciex.tl.ecrc@PCIEXFN, + error.io.pciex.nonfatal@PCIEXFN; /* * no response to downstream requester @@ -1568,41 +1240,47 @@ prop error.io.pciex.ecrccomp-u@pciexbus/pciexdev/pciexfn (0)-> * identifying the leaf device, we won't actually be informed that the error * was a cto. */ -prop error.io.pciex.nr-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nr-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; +prop error.io.pciex.nr-d@PCIEXFN (1)-> + error.io.pciex.nr-d@PCIEXFN/PCIEXFNHZ; -prop error.io.pciex.nr-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; +prop error.io.pciex.nr-d@PCIEXFN { IS_BG(PCIEXFN) } (2)-> + error.io.pciex.nonfatal@PCIEXFN, + ereport.io.pciex.tl.cto@PCIEXFN; -prop error.io.pciex.nr-d@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pciex.tl.cto@pciexbus/pciexdev/pciexfn { IS_BDG }; +prop error.io.pciex.nr-d@PCIEXFN { IS_BG(PCIEXFN) } (0)-> + ereport.io.pci.ma@PCIEXFN, + ereport.io.pci.sec-sta@PCIEXFN, + error.io.pci.nr-drw-d@PCIEXFN/PCIFN, + error.io.pci.ta-drw-d@PCIEXFN/PCIFN; -prop error.io.pciex.nr-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pciex.tl.cto@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.nr-d@PCIEXFN { IS_LF(PCIEXFN) } (1)-> + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.nr-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.ma@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; +prop error.io.pciex.nr-d@PCIEXFN { IS_LF(PCIEXFN) } (0)-> + ereport.io.pci.ma@PCIEXFN, + ereport.io.pciex.tl.cto@PCIEXFN; /* * no response to upstream requester * - * - flt-nr-u is just on the pciex node which generated the fault. - * - nr-u will effectively cascade upstream to the root complex which will + * - flt-nr-u will effectively cascade upstream to the root complex which will * report it as a cto. * * We have to use target-ma to informs us which device failed to respond. */ -prop error.io.pciex.flt-nr-u@pciexbus/pciexdev/pciexfn (2)-> - error.io.pciex.nr-u@pciexbus/pciexdev/pciexfn, - error.io.pci.target-ma-d@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.flt-nr-u@PCIEXFN (1)-> + error.io.pci.target-ma-d@PCIEXFN; + +prop error.io.pciex.flt-nr-u@PCIEXFN (1)-> + error.io.pciex.nr-u@PCIEXFN; -prop error.io.pciex.nr-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.nr-u@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.nr-u@PCIEXFN/PCIEXFN (1)-> + error.io.pciex.nr-u@PCIEXFN; -prop error.io.pciex.nr-u@pciexrc/pciexbus/pciexdev/pciexfn (1)-> +prop error.io.pciex.nr-u@pciexrc/PCIEXFN (1)-> ereport.io.pciex.tl.cto@pciexrc; -prop error.io.pciex.nr-u@pciexrc/pciexbus/pciexdev/pciexfn (0)-> +prop error.io.pciex.nr-u@pciexrc/PCIEXFN (0)-> ereport.io.pci.sec-ma@pciexrc; /* @@ -1615,43 +1293,44 @@ prop error.io.pciex.nr-u@pciexrc/pciexbus/pciexdev/pciexfn (0)-> * Note that sw-mtlp-d is to handle the case where the switch is actually * the target of the packet (config request etc). */ -prop error.io.pciex.mtlp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.sw-mtlp-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.mtlp-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; +prop error.io.pciex.mtlp-d@PCIEXFN { IS_SD(PCIEXFN) || IS_SU(PCIEXFN) } (1)-> + error.io.pciex.sw-mtlp-d@PCIEXFN, + error.io.pciex.mtlp-d@PCIEXFN/PCIEXFNHZ; -prop error.io.pciex.mtlp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.fatal@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; +prop error.io.pciex.sw-mtlp-d@PCIEXFN { IS_SU(PCIEXFN) } (2)-> + error.io.pciex.fatal@PCIEXFN, + ereport.io.pciex.tl.mtlp@PCIEXFN; -prop error.io.pciex.mtlp-d@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pciex.tl.mtlp@pciexbus/pciexdev/pciexfn { IS_BDG }; +prop error.io.pciex.mtlp-d@PCIEXFN { IS_BG(PCIEXFN) } (2)-> + error.io.pciex.fatal@PCIEXFN, + ereport.io.pciex.tl.mtlp@PCIEXFN; -prop error.io.pciex.mtlp-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pciex.tl.mtlp@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.mtlp-d@PCIEXFN { IS_LF(PCIEXFN) } (1)-> + error.io.pciex.fatal@PCIEXFN; -prop error.io.pciex.sw-mtlp-d@pciexbus/pciexdev/pciexfn (2)-> - error.io.pciex.fatal@pciexbus/pciexdev/pciexfn { IS_SWU }, - ereport.io.pciex.tl.mtlp@pciexbus/pciexdev/pciexfn { IS_SWU }; +prop error.io.pciex.mtlp-d@PCIEXFN { IS_LF(PCIEXFN) } (0)-> + ereport.io.pciex.tl.mtlp@PCIEXFN; /* * upstream malformed tlp * * This will cascade upstream to the receiver which will report it as an mtlp. */ -prop error.io.pciex.mtlp-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.source-mtlp-u@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.flt-mtlp-u@PCIEXFN (1)-> + error.io.pciex.mtlp-u@PCIEXFN; -prop error.io.pciex.source-mtlp-u@pciexbus[b]/pciexdev[d]/pciexfn[f] (1)-> - ereport.io.pciex.tl.mtlp@pciexrc<> { BDF_IS_LEAF && BDF_IS_UNDER_RC }; +prop error.io.pciex.mtlp-u@PCIEXFN/PCIEXFN (1)-> + error.io.pciex.mtlp-u@PCIEXFN; -prop error.io.pciex.source-mtlp-u@pcibus[b]/pcidev[d]/pcifn[f] (1)-> - ereport.io.pciex.tl.mtlp@pciexrc<> { PCIBDF_IS_UNDER_RC }; +prop error.io.pciex.mtlp-u@pciexrc/PCIEXFN (1)-> + ereport.io.pciex.tl.mtlp@pciexrc; /* * downstream completer aborts * * This could be the fault of the root complex or a switch reporting an internal * error, or of the leaf device sending an invalid request (the latter is - * handled by the badreq-u case below). + * handled by the flt-badreq-u case below). * * This is reported by the completer or by an intervening downstream switch * port. The completer abort response propagates down to the initiator which @@ -1661,75 +1340,35 @@ prop error.io.pciex.source-mtlp-u@pcibus[b]/pcidev[d]/pcifn[f] (1)-> * or downstream switch port. The originator of the request can be recognized * by the rta for a hardened driver or by using the source-id payload of the * ca ereport for a non-hardened driver. - * - * Note that there is no ur-d (we assume that a ur reported by the root complex - * is always due to a badreq-u - see below). */ -prop error.io.pciex.flt-ca-d@pciexrc/pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.ca-d@pciexrc/pciexbus/pciexdev/pciexfn, +prop error.io.pciex.ca-d@pciexrc/PCIEXFN (0)-> ereport.io.pciex.tl.ca@pciexrc; -prop error.io.pciex.ca-d@pciexrc/pciexbus/pciexdev/pciexfn (1)-> +prop error.io.pciex.ca-d@pciexrc/PCIEXFN (1)-> ereport.io.pci.sec-sta@pciexrc; -prop error.io.pciex.flt-ca-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.sec-sta@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.flt-ca-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn (2)-> - ereport.io.pciex.tl.ca@pciexbus/pciexdev/pciexfn, - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.flt-ca-d@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.ca-d@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.ca-d@PCIEXFN/PCIEXFN (0)-> + ereport.io.pci.sec-sta@PCIEXFN; -prop error.io.pciex.ca-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.ca-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; +prop error.io.pciex.ca-d@PCIEXFN/PCIEXFN (2)-> + ereport.io.pciex.tl.ca@PCIEXFN, + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pciex.ca-d@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pci.rta@pciexbus/pciexdev/pciexfn { IS_BDG }; +prop error.io.pciex.ca-d@PCIEXFN (0)-> + error.io.pciex.ca-fwd-d@PCIEXFN; -prop error.io.pciex.ca-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.rta@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.ca-fwd-d@PCIEXFN (1)-> + error.io.pciex.ca-fwd-d@PCIEXFN/PCIEXFNHZ; -/* - * upstream unexpected requests - * - * This could be the fault of a device behind a PCI Express/PCI(X) bridge not - * responding, or of the root complex sending an invalid request (the latter - * case is handled by badreq-d below). - * - * This is reported as a ur by the completer, which for non-posted reqs sets the - * appropriate error bit in the completion message to the initiator which will - * set the legacy pci bit sec-ma. - * - * The fault can always be recognized from the sec-ma bit at the root complex. - * - * If the fault was with the root complex, then we don't care which leaf is - * involved. - * - * If the fault originated from a pci device behind a PCI Express/PCI(X) bridge - * we can identify the leaf device from the target-ma ereport if available or - * from the source-id payload of the sec-rma ereport from the bridge. - */ -prop error.io.pciex.flt-ur-u@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn - { IS_SWU || IS_LEAF || IS_BDG }; +prop error.io.pciex.ca-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (1)-> + ereport.io.pci.rta@PCIEXFN; -prop error.io.pciex.flt-ur-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pciex.tl.ur@pciexbus/pciexdev/pciexfn { IS_LEAF || IS_BDG }; +prop error.io.pciex.ca-fwd-d@PCIEXFN { IS_BG(PCIEXFN) } (0)-> + ereport.io.pci.sec-sta@PCIEXFN, + error.io.pci.ta-drw-d@PCIEXFN/PCIFN; -prop error.io.pciex.flt-ur-u@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pciex.tl.ur@pciexbus/pciexdev/pciexfn { IS_SWU }; - -prop error.io.pciex.flt-ur-u@pciexbus/pciexdev/pciexfn (2)-> - error.io.pci.target-ma-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.ur-u@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.ur-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.ur-u@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.ur-u@pciexrc/pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.sec-ma@pciexrc; +prop error.io.pciex.ca-fwd-d@PCIEXFN { IS_LF(PCIEXFN) } (0)-> + ereport.io.pci.rta@PCIEXFN; /* * upstream completer aborts @@ -1739,7 +1378,7 @@ prop error.io.pciex.ur-u@pciexrc/pciexbus/pciexdev/pciexfn (0)-> * request (the latter case is handled by badreq-d below). * * This is reported as a ca by the completer. The completer (for non-posted - * requested) sends the appropriate error bits in the completion message to + * requests) sends the appropriate error bits in the completion message to * the initiator which will set the legacy pci bit sec-rta. * * The fault can always be recognized from the sec-rta bit at the root complex. @@ -1750,39 +1389,25 @@ prop error.io.pciex.ur-u@pciexrc/pciexbus/pciexdev/pciexfn (0)-> * If the fault was with a PCI Express leaf with a non-hardened driver, then we * can still identify the leaf device from the source-id payload of the nonfatal * message ereport from the root complex or from the target-rta ereport. - * - * If the fault originated from a PCI(X) device behind a PCI Express/PCI(X) - * bridge, and it's driver is hardened, we can identify the device from the PCI - * sta ereport or from the source-id payload of the sec-rta ereport from the - * bridge. - * - * If the fault originated from a PCI(X) device behind a PCI Express/PCI(X) - * bridge, and its driver is not hardened we can only identify the leaf device - * from the target-rta ereport if available or from the source-id payload of - * the sec-rta ereport from the bridge. */ -prop error.io.pciex.flt-ca-u@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn - { IS_SWU || IS_LEAF || IS_BDG }; - -prop error.io.pciex.flt-ca-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.sta@pciexbus/pciexdev/pciexfn { IS_LEAF }, - ereport.io.pciex.tl.ca@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.flt-ca-u@PCIEXFN { !IS_LF(PCIEXFN) } (1)-> + ereport.io.pciex.tl.ca@PCIEXFN; -prop error.io.pciex.flt-ca-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.sta@pciexbus/pciexdev/pciexfn { IS_SWU || IS_BDG }; +prop error.io.pciex.flt-ca-u@PCIEXFN { IS_LF(PCIEXFN) } (0)-> + ereport.io.pciex.tl.ca@PCIEXFN; -prop error.io.pciex.flt-ca-u@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pciex.tl.ca@pciexbus/pciexdev/pciexfn { IS_SWU || IS_BDG }; +prop error.io.pciex.flt-ca-u@PCIEXFN (0)-> + error.io.pciex.nonfatal@PCIEXFN, + ereport.io.pci.sta@PCIEXFN; -prop error.io.pciex.flt-ca-u@pciexbus/pciexdev/pciexfn (2)-> - error.io.pci.target-rta-d@pciexbus/pciexdev/pciexfn, - error.io.pciex.ca-u@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.flt-ca-u@PCIEXFN (2)-> + error.io.pci.target-rta-d@PCIEXFN, + error.io.pciex.ca-u@PCIEXFN; -prop error.io.pciex.ca-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.ca-u@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.ca-u@PCIEXFN/PCIEXFN (1)-> + error.io.pciex.ca-u@PCIEXFN; -prop error.io.pciex.ca-u@pciexrc/pciexbus/pciexdev/pciexfn (0)-> +prop error.io.pciex.ca-u@pciexrc/PCIEXFN (0)-> ereport.io.pci.sec-rta@pciexrc; /* @@ -1796,79 +1421,41 @@ prop error.io.pciex.ca-u@pciexrc/pciexbus/pciexdev/pciexfn (0)-> * then sends the appropriate error bits in the completion message to the * initiator which will set the legacy pci bits ma or rta. * - * For badreq-u, the ca/ur ereports contain a source-id payload that identifies - * the initiator. - * - flt-badreq-u represents the initiator that caused the fault. This may - * be a child pci device in which case flt-badreq-u is generated in pci.esc - * - badreq-u propagates up to the root complex. + * For flt-badreq-u, the ca/ur ereports contain a source-id payload that + * identifies the initiator. * * The fault can always be recognized by the ca/ur ereport from the root * complex or downstream switch port. The originator of the request can be * recognized by the rta/ma for a hardened driver or by using the source-id * payload of the ca/ur ereport for a non-hardened driver. - * - * Note that handling of badreq-u where source and detector are both pciexfn - * has to be handled specially to avoid path name matching. */ -prop error.io.pciex.flt-badreq-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.badreq-u@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.flt-badreq-u@PCIEXFN (0)-> + ereport.io.pci.ma@PCIEXFN, + ereport.io.pci.rta@PCIEXFN; + +prop error.io.pciex.flt-badreq-u@PCIEXFN1 { + SOURCE_ID_MATCHES_BDF && is_under(pciexrc, PCIEXFN1) } (0)-> + ereport.io.pciex.tl.ur@pciexrc, + ereport.io.pciex.tl.ca@pciexrc; + +prop error.io.pciex.flt-badreq-u@PCIEXFN (1)-> + error.io.pciex.badreq-u@PCIEXFN; -prop error.io.pciex.badreq-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.badreq-u@pciexbus/pciexdev/pciexfn; +prop error.io.pciex.badreq-u@PCIEXFN/PCIEXFN (1)-> + error.io.pciex.badreq-u@PCIEXFN; -prop error.io.pciex.badreq-u@pciexrc/pciexbus/pciexdev/pciexfn (0)-> +prop error.io.pciex.badreq-u@pciexrc/PCIEXFN (0)-> ereport.io.pci.sec-sta@pciexrc; -prop error.io.pciex.flt-badreq-u@pciexbus[b]/pciexdev[d]/pciexfn[f] (0)-> - ereport.io.pciex.tl.ur@pciexrc<> { - BDF_IS_LEAF && SOURCE_ID_MATCHES_BDF && BDF_IS_UNDER_RC}, - ereport.io.pciex.tl.ca@pciexrc<> { - BDF_IS_LEAF && SOURCE_ID_MATCHES_BDF && BDF_IS_UNDER_RC}; - -prop error.io.pci.badreq-pw-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.tl.ur@pciexrc<> { PCIBDF_IS_UNDER_RC }, - ereport.io.pciex.tl.ca@pciexrc<> { PCIBDF_IS_UNDER_RC }; - -prop error.io.pci.badreq-drw-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.tl.ur@pciexrc<> { PCIBDF_IS_UNDER_RC }, - ereport.io.pciex.tl.ca@pciexrc<> { PCIBDF_IS_UNDER_RC }; - -prop error.io.pciex.badreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.sec-sta@pciexbus/pciexdev/pciexfn { IS_SWD }; - -prop error.io.pciex.badreq-u@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.badreq-u@pciexbus/pciexdev { IS_LEAF }; - -prop error.io.pciex.badreq-u@pciexbus/pciexdev/pciexfn (0)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.badreq-u@pciexbus[b]/pciexdev[d] (0)-> - ereport.io.pciex.tl.ur@pciexfn { - (confprop(asru(pciexfn), TOPO_PCI_EXCAP) == "pciexswd") && - (!payloadprop_defined("source-valid") || - payloadprop("source-valid") == 0 || - (payloadprop("source-id") & 0xfff8) == ((b << 8) | (d << 3))) }, - ereport.io.pciex.tl.ca@pciexfn { - (confprop(asru(pciexfn), TOPO_PCI_EXCAP) == "pciexswd") && - (!payloadprop_defined("source-valid") || - payloadprop("source-valid") == 0 || - (payloadprop("source-id") & 0xfff8) == ((b << 8) | (d << 3))) }; - -prop error.io.pci.badreq-pw-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.tl.ur@pciexbus/pciexdev/pciexfn { IS_SWD && - PCIBDF_IS_UNDER_DEV }, - ereport.io.pciex.tl.ca@pciexbus/pciexdev/pciexfn { IS_SWD && - PCIBDF_IS_UNDER_DEV }; - -prop error.io.pci.badreq-drw-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.tl.ur@pciexbus/pciexdev/pciexfn { IS_SWD && - PCIBDF_IS_UNDER_DEV }, - ereport.io.pciex.tl.ca@pciexbus/pciexdev/pciexfn { IS_SWD && - PCIBDF_IS_UNDER_DEV }; - -prop error.io.pciex.flt-badreq-u@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.ma@pciexbus/pciexdev/pciexfn { IS_LEAF }, - ereport.io.pci.rta@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.flt-badreq-u@PCIEXFN1 { IS_SD(PCIEXFN) && + SOURCE_ID_MATCHES_BDF && is_under(PCIEXFN, PCIEXFN1) } (0)-> + ereport.io.pciex.tl.ur@PCIEXFN, + ereport.io.pciex.tl.ca@PCIEXFN; + +prop error.io.pciex.flt-badreq-u@PCIEXFN1 { IS_SD(PCIEXFN) && + is_under(PCIEXFN, PCIEXFN1) } (0)-> + ereport.io.pci.sec-sta@PCIEXFN, + error.io.pciex.nonfatal@PCIEXFN; /* * downstream bad request @@ -1884,20 +1471,39 @@ prop error.io.pciex.flt-badreq-u@pciexbus/pciexdev/pciexfn (0)-> * legacy pci bits ma or rta (oddly there is no equivalent in pcie error * reporting). */ -prop error.io.pciex.badreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.flt-ur-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-ca-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.badreq-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; +prop error.io.pciex.badreq-d@PCIEXFN { IS_SU(PCIEXFN) || IS_SD(PCIEXFN) } (1)-> + error.io.pciex.flt-ur-u@PCIEXFN, + error.io.pciex.flt-ca-u@PCIEXFN, + error.io.pciex.badreq-d@PCIEXFN/PCIEXFNHZ; + +prop error.io.pciex.badreq-d@PCIEXFN { IS_BG(PCIEXFN) } (1)-> + error.io.pciex.flt-ur-u@PCIEXFN, + error.io.pciex.flt-ca-u@PCIEXFN, + error.io.pci.badreq-pw-d@PCIEXFN/PCIFNHZ, + error.io.pci.badreq-drw-d@PCIEXFN/PCIFNHZ; + +prop error.io.pciex.badreq-d@PCIEXFN { IS_LF(PCIEXFN) } (1)-> + error.io.pciex.flt-ur-u@PCIEXFN, + error.io.pciex.flt-ca-u@PCIEXFN; -prop error.io.pciex.badreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.flt-ur-u@pciexbus/pciexdev/pciexfn { IS_LEAF }, - error.io.pciex.flt-ca-u@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop error.io.pciex.flt-ur-u@PCIEXFN { !IS_LF(PCIEXFN) } (1)-> + ereport.io.pciex.tl.ur@PCIEXFN; -prop error.io.pciex.badreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.flt-ur-u@pciexbus/pciexdev/pciexfn, - error.io.pciex.flt-ca-u@pciexbus/pciexdev/pciexfn, - error.io.pci.badreq-pw-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>, - error.io.pci.badreq-drw-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; +prop error.io.pciex.flt-ur-u@PCIEXFN { IS_LF(PCIEXFN) } (0)-> + ereport.io.pciex.tl.ur@PCIEXFN; + +prop error.io.pciex.flt-ur-u@PCIEXFN (2)-> + error.io.pci.target-ma-d@PCIEXFN, + error.io.pciex.ur-u@PCIEXFN; + +prop error.io.pciex.flt-ur-u@PCIEXFN (0)-> + error.io.pciex.nonfatal@PCIEXFN; + +prop error.io.pciex.ur-u@PCIEXFN/PCIEXFN (1)-> + error.io.pciex.ur-u@PCIEXFN; + +prop error.io.pciex.ur-u@pciexrc/PCIEXFN (0)-> + ereport.io.pci.sec-ma@pciexrc; /* * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -1912,13 +1518,12 @@ prop error.io.pciex.badreq-d@pciexbus/pciexdev/pciexfn (1)-> event error.io.pciex.discard_rc@pciexrc; -event ereport.io.pciex.tl.uc@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.noadverr@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.correctable@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.a-nonfatal@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.fatal@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pci.nr@pciexbus/pciexdev/pciexfn{within(5s)}; +event ereport.io.pciex.noadverr@PCIEXFN{within(5s)}; +event ereport.io.pciex.correctable@PCIEXFN{within(5s)}; +event ereport.io.pciex.nonfatal@PCIEXFN{within(5s)}; +event ereport.io.pciex.a-nonfatal@PCIEXFN{within(5s)}; +event ereport.io.pciex.fatal@PCIEXFN{within(5s)}; +event ereport.io.pci.nr@PCIEXFN{within(5s)}; event ereport.io.pci.nr@pciexrc{within(5s)}; event ereport.io.pci.ma@pciexrc{within(5s)}; event ereport.io.pci.rta@pciexrc{within(5s)}; @@ -1931,30 +1536,29 @@ event ereport.io.pciex.noadverr@pciexrc{within(5s)}; event ereport.io.pciex.a-nonfatal@pciexrc{within(5s)}; event ereport.io.pciex.rc.ce-msg@pciexrc{within(5s)}; event ereport.io.pciex.rc.mce-msg@pciexrc{within(5s)}; -event ereport.io.pciex.rc.mue-msg@pciexrc{within(5s)}; -event upset.io.pciex.discard_uc@pciexbus/pciexdev/pciexfn; -event upset.io.pciex.discard@pciexbus/pciexdev/pciexfn; +event upset.io.pciex.discard_uc@PCIEXFN; +event upset.io.pciex.discard@PCIEXFN; event upset.io.pciex.discard@pciexrc; -prop upset.io.pciex.discard_uc@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pciex.tl.uc@pciexbus/pciexdev/pciexfn { IS_BDG }; +prop upset.io.pciex.discard_uc@PCIEXFN { IS_BG(PCIEXFN) } (1)-> + ereport.io.pciex.tl.uc@PCIEXFN; -prop upset.io.pciex.discard_uc@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pciex.tl.uc@pciexbus/pciexdev/pciexfn { IS_LEAF }; +prop upset.io.pciex.discard_uc@PCIEXFN { IS_LF(PCIEXFN) } (1)-> + ereport.io.pciex.tl.uc@PCIEXFN; -prop upset.io.pciex.discard@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pci.nr@pciexbus/pciexdev/pciexfn, - ereport.io.pciex.noadverr@pciexbus/pciexdev/pciexfn, - ereport.io.pciex.correctable@pciexbus/pciexdev/pciexfn, - ereport.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn, - ereport.io.pciex.a-nonfatal@pciexbus/pciexdev/pciexfn, - ereport.io.pciex.fatal@pciexbus/pciexdev/pciexfn; +prop upset.io.pciex.discard@PCIEXFN (1)-> + ereport.io.pci.nr@PCIEXFN, + ereport.io.pciex.noadverr@PCIEXFN, + ereport.io.pciex.correctable@PCIEXFN, + ereport.io.pciex.nonfatal@PCIEXFN, + ereport.io.pciex.a-nonfatal@PCIEXFN, + ereport.io.pciex.fatal@PCIEXFN; -prop error.io.pciex.discard_rc@pciexrc (1)-> +prop error.io.pciex.discard_rc@pciexrc (0)-> + ereport.io.pciex.rc.mue-msg@pciexrc, ereport.io.pciex.rc.fe-msg@pciexrc { SOURCE_ID_MATCHES_OWN_BDF }, - ereport.io.pciex.rc.nfe-msg@pciexrc { SOURCE_ID_MATCHES_OWN_BDF }, - ereport.io.pciex.rc.ce-msg@pciexrc { SOURCE_ID_MATCHES_OWN_BDF }; + ereport.io.pciex.rc.nfe-msg@pciexrc { SOURCE_ID_MATCHES_OWN_BDF }; prop upset.io.pciex.discard@pciexrc (1)-> error.io.pciex.discard_rc@pciexrc, @@ -1963,7 +1567,6 @@ prop upset.io.pciex.discard@pciexrc (1)-> ereport.io.pciex.a-nonfatal@pciexrc, ereport.io.pciex.rc.ce-msg@pciexrc, ereport.io.pciex.rc.mce-msg@pciexrc, - ereport.io.pciex.rc.mue-msg@pciexrc, ereport.io.pciex.tl.uc@pciexrc, ereport.io.pci.ma@pciexrc, ereport.io.pci.rta@pciexrc, @@ -1974,203 +1577,168 @@ prop upset.io.pciex.discard@pciexrc (1)-> /* * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * rules for PCI Express to PCI bridge propagations + * rules for propagations from child PCI bus * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ -event error.io.pci.retry-to-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.badreq-pw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.badreq-drw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.ma-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.ta-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.ape-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.source-ape-u@pcibus/pcidev/pcifn; -event error.io.pci.source-f-perr-u@pcibus/pcidev/pcifn; -event error.io.pci.source-nf-perr-u@pcibus/pcidev/pcifn; -event error.io.pci.target-ma-d@pcibus/pcidev/pcifn; -event error.io.pci.target-rta-d@pcibus/pcidev/pcifn; -event error.io.pci.f-dpdata-pw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.nf-dpdata-pw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.f-dpdata-dw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.nf-dpdata-dw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.f-dpdata-dr-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.nf-dpdata-dr-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.dpdata-pw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.dpdata-dw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.dpdata-dr-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.perr-pw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.perr-dw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.perr-dr-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.serr-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pcix.scpe-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pcix.source-scpe-u@pcibus/pcidev/pcifn; -event error.io.pcix.spl-comp-ma-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pcix.spl-comp-ta-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pcix.spl-comp-ma-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pcix.spl-comp-ta-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pcix.uscmd@pciexbus/pciexdev/pciexfn; - -event ereport.io.pcix.sec-spl-dis@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.bdg.uscmd@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.bdg.sec-perr@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.bdg.sec-uadr@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.bdg.sec-uat@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.bdg.sec-serr@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.bdg.sec-tex@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.bdg.sec-rma@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.bdg.sec-rta@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.bdg.sec-ma-sc@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pciex.bdg.sec-ta-sc@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pci.dto@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pci.sec-rta@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pci.sec-ma@pciexbus/pciexdev/pciexfn{within(5s)}; - -/* - * propagations from pci express onto pci/pci-x - */ - -/* - * poisoned tlps propagate as parity/ecc errors. - */ -prop error.io.pciex.f-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.f-dpdata-pw-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>, - error.io.pci.f-dpdata-dw-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.nf-poisreq-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.nf-dpdata-pw-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>, - error.io.pci.nf-dpdata-dw-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.f-poiscomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.f-dpdata-dr-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.nf-poiscomp-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.nf-dpdata-dr-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -/* - * ca-d only propagates on to pci bus if non-posted access - */ -prop error.io.pciex.ca-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.sec-sta@pciexbus/pciexdev/pciexfn, - error.io.pci.ta-drw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; - -/* - * nr-d only propagates on to pci bus if non-posted access - */ -prop error.io.pciex.nr-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.sec-sta@pciexbus/pciexdev/pciexfn, - error.io.pci.nr-drw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn, - error.io.pci.ta-drw-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; - -/* - * propagations from pci/pci-x onto pci express - */ +event error.io.pci.retry-to-u@PCIEXFN/PCIFN; +event error.io.pci.ma-u@PCIEXFN/PCIFN; +event error.io.pci.ta-u@PCIEXFN/PCIFN; +event error.io.pci.ape-u@PCIEXFN/PCIFN; +event error.io.pci.source-ape-u@PCIFN; +event error.io.pci.target-ma-d@PCIFN; +event error.io.pci.target-rta-d@PCIFN; +event error.io.pci.badreq-pw-u@PCIEXFN/PCIFN; +event error.io.pci.badreq-drw-u@PCIEXFN/PCIFN; +event error.io.pci.source-perr-u@PCIFN; +event error.io.pci.source-dpdata-u@PCIFN; +event error.io.pci.dpdata-pw-u@PCIEXFN/PCIFN; +event error.io.pci.dpdata-dw-u@PCIEXFN/PCIFN; +event error.io.pci.dpdata-dr-u@PCIEXFN/PCIFN; +event error.io.pci.perr-pw-u@PCIEXFN/PCIFN; +event error.io.pci.perr-dw-u@PCIEXFN/PCIFN; +event error.io.pci.perr-dr-u@PCIEXFN/PCIFN; +event error.io.pci.serr-u@PCIEXFN/PCIFN; +event error.io.pcix.scpe-u@PCIEXFN/PCIFN; +event error.io.pcix.source-scpe-u@PCIFN; +event error.io.pcix.spl-comp-ma-u@PCIEXFN/PCIFN; +event error.io.pcix.spl-comp-ta-u@PCIEXFN/PCIFN; +event error.io.pcix.spl-comp-ma-d@PCIEXFN/PCIFN; +event error.io.pcix.spl-comp-ta-d@PCIEXFN/PCIFN; +event error.io.pcix.uscmd@PCIEXFN; + +event ereport.io.pcix.sec-spl-dis@PCIEXFN{within(5s)}; +event ereport.io.pciex.bdg.uscmd@PCIEXFN{within(5s)}; +event ereport.io.pciex.bdg.sec-perr@PCIEXFN{within(5s)}; +event ereport.io.pciex.bdg.sec-uadr@PCIEXFN{within(5s)}; +event ereport.io.pciex.bdg.sec-uat@PCIEXFN{within(5s)}; +event ereport.io.pciex.bdg.sec-serr@PCIEXFN{within(5s)}; +event ereport.io.pciex.bdg.sec-tex@PCIEXFN{within(5s)}; +event ereport.io.pciex.bdg.sec-rma@PCIEXFN{within(5s)}; +event ereport.io.pciex.bdg.sec-rta@PCIEXFN{within(5s)}; +event ereport.io.pciex.bdg.sec-ma-sc@PCIEXFN{within(5s)}; +event ereport.io.pciex.bdg.sec-ta-sc@PCIEXFN{within(5s)}; +event ereport.io.pci.dto@PCIEXFN{within(5s)}; +event ereport.io.pci.sec-rta@PCIEXFN{within(5s)}; +event ereport.io.pci.sec-ma@PCIEXFN{within(5s)}; /* * ma-u will only propagate on to pciex bus for non-posted accesses. It * is then represented as an unsupported request. */ -prop error.io.pci.ma-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (0)-> - ereport.io.pciex.tl.ur@pciexbus/pciexdev/pciexfn, - error.io.pciex.ur-u@pciexbus/pciexdev/pciexfn; +prop error.io.pci.ma-u@PCIEXFN/PCIFN (0)-> + ereport.io.pciex.tl.ur@PCIEXFN; + +prop error.io.pci.ma-u@PCIEXFN/PCIFN { is_under(pciexrc, PCIEXFN/PCIFN) } (0)-> + ereport.io.pci.sec-ma@pciexrc; -prop error.io.pci.ma-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (2)-> - ereport.io.pci.sec-ma@pciexbus/pciexdev/pciexfn, - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn; +prop error.io.pci.ma-u@PCIEXFN/PCIFN (2)-> + ereport.io.pci.sec-ma@PCIEXFN, + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pci.target-ma-d@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.bdg.sec-rma@pciexbus/pciexdev/pciexfn { IS_BDG && - BDF_IS_PCI_LEAF && SOURCE_ID_MATCHES_BDF && PCIBDF_IS_UNDER_DEV }; +prop error.io.pci.target-ma-d@PCIFN1 { IS_BG(PCIEXFN) && IS_PCI_LF(PCIFN1) && + SOURCE_ID_MATCHES_BDF && is_under(PCIEXFN, PCIFN1) } (0)-> + ereport.io.pciex.bdg.sec-rma@PCIEXFN; /* * ta-u will only propagate on to pciex bus for non-posted accesses. It is * then represented as a completer abort. */ -prop error.io.pci.ta-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (0)-> - ereport.io.pci.sta@pciexbus/pciexdev/pciexfn, - ereport.io.pciex.tl.ca@pciexbus/pciexdev/pciexfn, - error.io.pciex.ca-u@pciexbus/pciexdev/pciexfn; +prop error.io.pci.ta-u@PCIEXFN/PCIFN (0)-> + ereport.io.pci.sta@PCIEXFN, + ereport.io.pciex.tl.ca@PCIEXFN; -prop error.io.pci.ta-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (2)-> - ereport.io.pci.sec-rta@pciexbus/pciexdev/pciexfn, - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn; +prop error.io.pci.ta-u@PCIEXFN/PCIFN { is_under(pciexrc, PCIEXFN/PCIFN) } (0)-> + ereport.io.pci.sec-rta@pciexrc; + +prop error.io.pci.ta-u@PCIEXFN/PCIFN (2)-> + ereport.io.pci.sec-rta@PCIEXFN, + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pci.target-rta-d@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.bdg.sec-rta@pciexbus/pciexdev/pciexfn { IS_BDG && - BDF_IS_PCI_LEAF && SOURCE_ID_MATCHES_BDF && PCIBDF_IS_UNDER_DEV }; +prop error.io.pci.target-rta-d@PCIFN1 { IS_BG(PCIEXFN) && IS_PCI_LF(PCIFN1) && + SOURCE_ID_MATCHES_BDF && is_under(PCIEXFN, PCIFN1) } (0)-> + ereport.io.pciex.bdg.sec-rta@PCIEXFN; /* * PERR# on a delayed write is represented as an unsupported request */ -prop error.io.pci.perr-dw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (1)-> - ereport.io.pci.sec-mdpe@pciexbus/pciexdev/pciexfn; +prop error.io.pci.perr-dw-u@PCIEXFN/PCIFN (1)-> + ereport.io.pci.sec-mdpe@PCIEXFN; -prop error.io.pci.perr-dw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (0)-> - error.io.pciex.flt-ur-u@pciexbus/pciexdev/pciexfn; +prop error.io.pci.perr-dw-u@PCIEXFN/PCIFN (0)-> + error.io.pciex.flt-ur-u@PCIEXFN; -prop error.io.pci.perr-pw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (1)-> - ereport.io.pci.sec-mdpe@pciexbus/pciexdev/pciexfn; +prop error.io.pci.perr-pw-u@PCIEXFN/PCIFN (1)-> + ereport.io.pci.sec-mdpe@PCIEXFN; -prop error.io.pci.perr-pw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (0)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn; +prop error.io.pci.perr-pw-u@PCIEXFN/PCIFN (0)-> + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pci.source-f-perr-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.bdg.sec-perr@pciexbus/pciexdev/pciexfn { IS_BDG && - BDF_IS_PCI_LEAF && SOURCE_ID_MATCHES_BDF && PCIBDF_IS_UNDER_DEV }; +prop error.io.pci.perr-dr-u@PCIEXFN/PCIFN (1)-> + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pci.source-nf-perr-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.bdg.sec-perr@pciexbus/pciexdev/pciexfn { IS_BDG && - BDF_IS_PCI_LEAF && SOURCE_ID_MATCHES_BDF && PCIBDF_IS_UNDER_DEV }; - -prop error.io.pci.perr-dr-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (1)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn; +prop error.io.pci.source-perr-u@PCIFN1 { IS_BG(PCIEXFN) && IS_PCI_LF(PCIFN1) && + SOURCE_ID_MATCHES_BDF && is_under(PCIEXFN, PCIFN1) } (0)-> + ereport.io.pciex.bdg.sec-perr@PCIEXFN; /* * If the bridge receives data with bad ecc/parity from pci/pci-x, it will * propagate onto pci express as a poisoned tlp */ -prop error.io.pci.dpdata-dr-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (2)-> - ereport.io.pci.sec-dpe@pciexbus/pciexdev/pciexfn, - error.io.pciex.poiscomp-u@pciexbus/pciexdev/pciexfn; +prop error.io.pci.dpdata-dr-u@PCIEXFN/PCIFN (2)-> + ereport.io.pci.sec-dpe@PCIEXFN, + error.io.pciex.poiscomp-u@PCIEXFN; + +prop error.io.pci.dpdata-dr-u@PCIEXFN/PCIFN (0)-> + error.io.pciex.nonfatal@PCIEXFN; -prop error.io.pci.dpdata-dr-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (0)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn; +prop error.io.pci.dpdata-dr-u@PCIEXFN/PCIFN (1)-> + ereport.io.pci.sec-mdpe@PCIEXFN, + ereport.io.pci.mdpe@PCIEXFN; -prop error.io.pci.dpdata-dr-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (1)-> - ereport.io.pci.sec-mdpe@pciexbus/pciexdev/pciexfn, - ereport.io.pci.mdpe@pciexbus/pciexdev/pciexfn; +prop error.io.pci.dpdata-dw-u@PCIEXFN/PCIFN (1)-> + ereport.io.pci.sec-dpe@PCIEXFN; -prop error.io.pci.dpdata-dw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (1)-> - ereport.io.pci.sec-dpe@pciexbus/pciexdev/pciexfn; +prop error.io.pci.dpdata-dw-u@PCIEXFN/PCIFN (0)-> + error.io.pciex.nonfatal@PCIEXFN, + error.io.pciex.poisreq-u@PCIEXFN, + ereport.io.pci.ma@PCIEXFN, + ereport.io.pci.sec-sta@PCIEXFN, + error.io.pci.ta-drw-d@PCIEXFN/PCIFN; -prop error.io.pci.dpdata-dw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (0)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn, - error.io.pciex.poisreq-u@pciexbus/pciexdev/pciexfn; +prop error.io.pci.dpdata-pw-u@PCIEXFN/PCIFN (2)-> + ereport.io.pci.sec-dpe@PCIEXFN, + error.io.pciex.poisreq-u@PCIEXFN; -prop error.io.pci.dpdata-pw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (2)-> - ereport.io.pci.sec-dpe@pciexbus/pciexdev/pciexfn, - error.io.pciex.poisreq-u@pciexbus/pciexdev/pciexfn; +prop error.io.pci.dpdata-pw-u@PCIEXFN/PCIFN (0)-> + error.io.pciex.nonfatal@PCIEXFN, + ereport.io.pci.ma@PCIEXFN; -prop error.io.pci.dpdata-pw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (0)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn; +prop error.io.pci.source-dpdata-u@PCIFN { is_under(pciexrc, PCIFN) } (0)-> + ereport.io.pciex.tl.ptlp@pciexrc, + ereport.io.pciex.tl.ur@pciexrc; + +prop error.io.pci.source-dpdata-u@PCIFN1 { IS_BG(PCIEXFN) && IS_PCI_LF(PCIFN1) + && SOURCE_ID_MATCHES_BDF && is_under(PCIEXFN, PCIFN1) } (0)-> + ereport.io.pciex.bdg.sec-ude@PCIEXFN; /* * If the bridge sees an address or attribute parity error it is considered * a fatal error. */ -prop error.io.pci.ape-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (2)-> - ereport.io.pci.sec-dpe@pciexbus/pciexdev/pciexfn, - error.io.pciex.fatal@pciexbus/pciexdev/pciexfn; +prop error.io.pci.ape-u@PCIEXFN/PCIFN (2)-> + ereport.io.pci.sec-dpe@PCIEXFN, + error.io.pciex.fatal@PCIEXFN; -prop error.io.pci.source-ape-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.bdg.sec-uat@pciexbus/pciexdev/pciexfn { IS_BDG && - BDF_IS_PCI_LEAF && SOURCE_ID_MATCHES_BDF && PCIBDF_IS_UNDER_DEV }, - ereport.io.pciex.bdg.sec-uadr@pciexbus/pciexdev/pciexfn { IS_BDG && - BDF_IS_PCI_LEAF && SOURCE_ID_MATCHES_BDF && PCIBDF_IS_UNDER_DEV }; +prop error.io.pci.source-ape-u@PCIFN1 { IS_BG(PCIEXFN) && IS_PCI_LF(PCIFN1) && + SOURCE_ID_MATCHES_BDF && is_under(PCIEXFN, PCIFN1) } (0)-> + ereport.io.pciex.bdg.sec-uat@PCIEXFN, + ereport.io.pciex.bdg.sec-uadr@PCIEXFN; -prop error.io.pci.ape-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (0)-> - ereport.io.pci.sec-rserr@pciexbus/pciexdev/pciexfn, - ereport.io.pciex.bdg.sec-serr@pciexbus/pciexdev/pciexfn, - ereport.io.pci.sec-sta@pciexbus/pciexdev/pciexfn; +prop error.io.pci.ape-u@PCIEXFN/PCIFN (0)-> + ereport.io.pci.sec-rserr@PCIEXFN, + ereport.io.pciex.bdg.sec-serr@PCIEXFN, + ereport.io.pci.sec-sta@PCIEXFN; /* * If the bridge sees a split completion error (pci-x only) it could @@ -2184,231 +1752,151 @@ prop error.io.pci.ape-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (0)-> * just drop the request (which the child device sees as a split * completion ma) */ -prop error.io.pcix.scpe-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (0)-> - ereport.io.pci.sec-dpe@pciexbus/pciexdev/pciexfn, - ereport.io.pci.sec-rserr@pciexbus/pciexdev/pciexfn, - ereport.io.pciex.bdg.sec-serr@pciexbus/pciexdev/pciexfn, - ereport.io.pci.sec-sta@pciexbus/pciexdev/pciexfn, - error.io.pciex.fatal@pciexbus/pciexdev/pciexfn; - -prop error.io.pcix.source-scpe-u@pcibus[b]/pcidev[d]/pcifn[f] (0)-> - ereport.io.pciex.bdg.sec-uat@pciexbus/pciexdev/pciexfn { IS_BDG && - BDF_IS_PCI_LEAF && SOURCE_ID_MATCHES_BDF && PCIBDF_IS_UNDER_DEV }, - ereport.io.pciex.bdg.sec-uadr@pciexbus/pciexdev/pciexfn { IS_BDG && - BDF_IS_PCI_LEAF && SOURCE_ID_MATCHES_BDF && PCIBDF_IS_UNDER_DEV }; - -prop error.io.pcix.scpe-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (1)-> - error.io.pcix.uscmd@pciexbus/pciexdev/pciexfn, - error.io.pcix.spl-comp-ma-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn, - error.io.pcix.spl-comp-ta-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; - -prop error.io.pcix.uscmd@pciexbus/pciexdev/pciexfn (5)-> - error.io.pciex.fatal@pciexbus/pciexdev/pciexfn, - ereport.io.pci.sta@pciexbus/pciexdev/pciexfn, - ereport.io.pciex.tl.ca@pciexbus/pciexdev/pciexfn, - error.io.pciex.ca-u@pciexbus/pciexdev/pciexfn, - ereport.io.pciex.bdg.uscmd@pciexbus/pciexdev/pciexfn; +prop error.io.pcix.scpe-u@PCIEXFN/PCIFN (0)-> + ereport.io.pci.sec-dpe@PCIEXFN, + ereport.io.pci.sec-rserr@PCIEXFN, + ereport.io.pciex.bdg.sec-serr@PCIEXFN, + ereport.io.pci.sec-sta@PCIEXFN, + error.io.pciex.fatal@PCIEXFN; + +prop error.io.pcix.source-scpe-u@PCIFN1 { IS_BG(PCIEXFN) && IS_PCI_LF(PCIFN1) && + SOURCE_ID_MATCHES_BDF && is_under(PCIEXFN, PCIFN1) } (0)-> + ereport.io.pciex.bdg.sec-uat@PCIEXFN, + ereport.io.pciex.bdg.sec-uadr@PCIEXFN; + +prop error.io.pcix.scpe-u@PCIEXFN/PCIFN (1)-> + error.io.pcix.uscmd@PCIEXFN, + error.io.pcix.spl-comp-ma-d@PCIEXFN/PCIFN, + error.io.pcix.spl-comp-ta-d@PCIEXFN/PCIFN; + +prop error.io.pcix.uscmd@PCIEXFN (4)-> + error.io.pciex.fatal@PCIEXFN, + ereport.io.pci.sta@PCIEXFN, + ereport.io.pciex.tl.ca@PCIEXFN, + ereport.io.pciex.bdg.uscmd@PCIEXFN; + +prop error.io.pcix.uscmd@PCIEXFN { is_under(pciexrc, PCIEXFN) } (0)-> + ereport.io.pci.sec-rta@pciexrc; /* * Similarly a child device may have responded with a master abort or * target abort to one of our split competions. The hardware just logs these. */ -prop error.io.pcix.spl-comp-ma-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (3)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn, - ereport.io.pcix.sec-spl-dis@pciexbus/pciexdev/pciexfn, - ereport.io.pciex.bdg.sec-ma-sc@pciexbus/pciexdev/pciexfn; +prop error.io.pcix.spl-comp-ma-u@PCIEXFN/PCIFN (3)-> + error.io.pciex.nonfatal@PCIEXFN, + ereport.io.pcix.sec-spl-dis@PCIEXFN, + ereport.io.pciex.bdg.sec-ma-sc@PCIEXFN; -prop error.io.pcix.spl-comp-ma-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (0)-> - ereport.io.pci.sec-ma@pciexbus/pciexdev/pciexfn; +prop error.io.pcix.spl-comp-ma-u@PCIEXFN/PCIFN (0)-> + ereport.io.pci.sec-ma@PCIEXFN; -prop error.io.pcix.spl-comp-ta-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (4)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn, - ereport.io.pcix.sec-spl-dis@pciexbus/pciexdev/pciexfn, - ereport.io.pciex.bdg.sec-ta-sc@pciexbus/pciexdev/pciexfn, - ereport.io.pci.sec-rta@pciexbus/pciexdev/pciexfn; +prop error.io.pcix.spl-comp-ta-u@PCIEXFN/PCIFN (4)-> + error.io.pciex.nonfatal@PCIEXFN, + ereport.io.pcix.sec-spl-dis@PCIEXFN, + ereport.io.pciex.bdg.sec-ta-sc@PCIEXFN, + ereport.io.pci.sec-rta@PCIEXFN; /* * SERR# is considered fatal */ -prop error.io.pci.serr-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (3)-> - error.io.pciex.fatal@pciexbus/pciexdev/pciexfn, - ereport.io.pci.sec-rserr@pciexbus/pciexdev/pciexfn, - ereport.io.pciex.bdg.sec-serr@pciexbus/pciexdev/pciexfn; +prop error.io.pci.serr-u@PCIEXFN/PCIFN (3)-> + error.io.pciex.fatal@PCIEXFN, + ereport.io.pci.sec-rserr@PCIEXFN, + ereport.io.pciex.bdg.sec-serr@PCIEXFN; /* * Retry time-out is nonfatal. The initial requester has stopped retrying so * there's nothing else the hardware can do but flag the error. */ -prop error.io.pci.retry-to-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (2)-> - error.io.pciex.nonfatal@pciexbus/pciexdev/pciexfn, - ereport.io.pciex.bdg.sec-tex@pciexbus/pciexdev/pciexfn; +prop error.io.pci.retry-to-u@PCIEXFN/PCIFN (2)-> + error.io.pciex.nonfatal@PCIEXFN, + ereport.io.pciex.bdg.sec-tex@PCIEXFN; + +prop error.io.pci.retry-to-u@PCIEXFN/PCIFN (0)-> + ereport.io.pci.sta@PCIEXFN, + ereport.io.pci.dto@PCIEXFN; -prop error.io.pci.retry-to-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (0)-> - ereport.io.pci.sta@pciexbus/pciexdev/pciexfn, - error.io.pciex.ca-u@pciexbus/pciexdev/pciexfn, - ereport.io.pci.dto@pciexbus/pciexdev/pciexfn; +prop error.io.pci.retry-to-u@PCIEXFN/PCIFN { + is_under(pciexrc, PCIEXFN/PCIFN) } (0)-> + ereport.io.pci.sec-rta@pciexrc; /* * A bad dma request (eg with invalid address) propagates onto pci express * as a bad dma request. The end result may be a master abort or target abort * (depending on whether the child is pci-x or pci). */ -prop error.io.pci.badreq-pw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (0)-> - error.io.pciex.badreq-u@pciexbus/pciexdev/pciexfn, - ereport.io.pci.ma@pciexbus/pciexdev/pciexfn, - ereport.io.pci.rta@pciexbus/pciexdev/pciexfn, - ereport.io.pci.sec-sta@pciexbus/pciexdev/pciexfn; - -prop error.io.pci.badreq-drw-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn (0)-> - error.io.pciex.badreq-u@pciexbus/pciexdev/pciexfn, - ereport.io.pci.ma@pciexbus/pciexdev/pciexfn, - ereport.io.pci.rta@pciexbus/pciexdev/pciexfn, - ereport.io.pci.sec-sta@pciexbus/pciexdev/pciexfn; +prop error.io.pci.badreq-pw-u@PCIEXFN/PCIFN (0)-> + ereport.io.pci.ma@PCIEXFN, + ereport.io.pci.rta@PCIEXFN, + ereport.io.pci.sec-sta@PCIEXFN; + +prop error.io.pci.badreq-pw-u@PCIEXFN/PCIFN { + is_under(pciexrc, PCIEXFN/PCIFN) } (0)-> + ereport.io.pciex.tl.ur@pciexrc, + ereport.io.pciex.tl.ca@pciexrc, + ereport.io.pci.sec-sta@pciexrc; + +prop error.io.pci.badreq-pw-u@PCIEXFN/PCIFN { IS_SD(PCIEXFN1) && + is_under(PCIEXFN1, PCIEXFN/PCIFN) } (0)-> + ereport.io.pciex.tl.ur@PCIEXFN1, + ereport.io.pciex.tl.ca@PCIEXFN1, + ereport.io.pci.sec-sta@PCIEXFN1, + error.io.pciex.nonfatal@PCIEXFN1; + +prop error.io.pci.badreq-drw-u@PCIEXFN/PCIFN (0)-> + ereport.io.pci.ma@PCIEXFN, + ereport.io.pci.rta@PCIEXFN, + ereport.io.pci.sec-sta@PCIEXFN; + +prop error.io.pci.badreq-drw-u@PCIEXFN/PCIFN { + is_under(pciexrc, PCIEXFN/PCIFN) } (0)-> + ereport.io.pciex.tl.ur@pciexrc, + ereport.io.pciex.tl.ca@pciexrc, + ereport.io.pci.sec-sta@pciexrc; + +prop error.io.pci.badreq-drw-u@PCIEXFN/PCIFN { IS_SD(PCIEXFN1) && + is_under(PCIEXFN1, PCIEXFN/PCIFN) } (0)-> + ereport.io.pciex.tl.ur@PCIEXFN1, + ereport.io.pciex.tl.ca@PCIEXFN1, + ereport.io.pci.sec-sta@PCIEXFN1, + error.io.pciex.nonfatal@PCIEXFN1; /* * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * source- and target- propagations + * target- propagations * - * The source- propagations cascade down to a leaf device, which can then have - * its bdf matched against the source-id of various ereports. This is necessary - * because for a number of cases the source-id represents the original requester - * of the packet which may be different from the detector of the error (which - * could be a bridge or switch). - * * A Root Complex driver may generate "target-" ereports when knowledge of the * physical address associated with a fault allows the target device to be * determined. This is not a requirement of the Diagnosis Engine, but can be * valuable when available. * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ -event error.io.pci.target-ma-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pci.target-rta-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pci.target-mdpe-d@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pci.target-ma-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.target-rta-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.target-mdpe-d@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pciex.source-f-poiscomp-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-nf-poiscomp-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pci.source-f-dpdata-r-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.source-nf-dpdata-r-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.source-f-dpdata-w-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pci.source-nf-dpdata-w-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pciex.source-f-ecrcreq-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-nf-ecrcreq-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-f-ecrcreq-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pciex.source-nf-ecrcreq-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pciex.source-f-ecrcreq-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pciex.source-nf-ecrcreq-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pciex.source-f-ecrccomp-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-nf-ecrccomp-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-f-ecrccomp-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pciex.source-nf-ecrccomp-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pciex.source-f-ecrccomp-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pciex.source-nf-ecrccomp-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; -event error.io.pciex.source-mtlp-u@pciexbus/pciexdev/pciexfn/pciexbus/pciexdev/pciexfn; -event error.io.pciex.source-mtlp-u@pciexbus/pciexdev/pciexfn/pcibus/pcidev/pcifn; -event error.io.pciex.source-mtlp-u@pcibus/pcidev/pcifn/pcibus/pcidev/pcifn; - -event ereport.io.pci.target-mdpe@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pci.target-rta@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pci.target-ma@pciexbus/pciexdev/pciexfn{within(5s)}; - -prop error.io.pci.target-ma-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.target-ma-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pci.target-ma-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.target-ma-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pci.target-ma-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.target-ma@pciexbus/pciexdev/pciexfn; - -prop error.io.pci.target-rta-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.target-rta-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pci.target-rta-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.target-rta-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pci.target-rta-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.target-rta@pciexbus/pciexdev/pciexfn; - -prop error.io.pci.target-mdpe-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.target-mdpe-d@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pci.target-mdpe-d@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.target-mdpe-d@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pci.target-mdpe-d@pciexbus/pciexdev/pciexfn (0)-> - ereport.io.pci.target-mdpe@pciexbus/pciexdev/pciexfn; - -prop error.io.pciex.source-f-poisreq-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.source-f-poisreq-u@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.source-nf-poisreq-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.source-nf-poisreq-u@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.source-f-poisreq-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.source-f-dpdata-w-u@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.source-nf-poisreq-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.source-nf-dpdata-w-u@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.source-f-poiscomp-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.source-f-poiscomp-u@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.source-nf-poiscomp-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.source-nf-poiscomp-u@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.source-f-poiscomp-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.source-f-dpdata-r-u@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.source-nf-poiscomp-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pci.source-nf-dpdata-r-u@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.source-f-ecrcreq-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.source-f-ecrcreq-u@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.source-f-ecrcreq-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.source-f-ecrcreq-u@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.source-nf-ecrcreq-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.source-nf-ecrcreq-u@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.source-nf-ecrcreq-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.source-nf-ecrcreq-u@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.source-f-ecrcreq-u@pcibus/pcidev/pcifn (1)-> - error.io.pciex.source-f-ecrcreq-u@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.source-nf-ecrcreq-u@pcibus/pcidev/pcifn (1)-> - error.io.pciex.source-nf-ecrcreq-u@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.source-f-ecrccomp-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.source-f-ecrccomp-u@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.source-f-ecrccomp-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.source-f-ecrccomp-u@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.source-nf-ecrccomp-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.source-nf-ecrccomp-u@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.source-nf-ecrccomp-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.source-nf-ecrccomp-u@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.source-f-ecrccomp-u@pcibus/pcidev/pcifn (1)-> - error.io.pciex.source-f-ecrccomp-u@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.source-nf-ecrccomp-u@pcibus/pcidev/pcifn (1)-> - error.io.pciex.source-nf-ecrccomp-u@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.source-mtlp-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.source-mtlp-u@pciexbus/pciexdev/pciexfn/pciexbus<>/pciexdev<>/pciexfn<>; - -prop error.io.pciex.source-mtlp-u@pciexbus/pciexdev/pciexfn (1)-> - error.io.pciex.source-mtlp-u@pciexbus/pciexdev/pciexfn/pcibus<>/pcidev<>/pcifn<>; - -prop error.io.pciex.source-mtlp-u@pcibus/pcidev/pcifn (1)-> - error.io.pciex.source-mtlp-u@pcibus/pcidev/pcifn/pcibus<>/pcidev<>/pcifn<>; - +event error.io.pci.target-ma-d@PCIEXFN/PCIEXFN; +event error.io.pci.target-rta-d@PCIEXFN/PCIEXFN; +event error.io.pci.target-ma-d@PCIEXFN/PCIFN; +event error.io.pci.target-rta-d@PCIEXFN/PCIFN; + +event ereport.io.pci.target-rta@PCIEXFN{within(5s)}; +event ereport.io.pci.target-ma@PCIEXFN{within(5s)}; + +prop error.io.pci.target-ma-d@PCIEXFN (1)-> + error.io.pci.target-ma-d@PCIEXFN/PCIEXFNHZ; + +prop error.io.pci.target-ma-d@PCIEXFN (1)-> + error.io.pci.target-ma-d@PCIEXFN/PCIFNHZ; + +prop error.io.pci.target-ma-d@PCIEXFN (0)-> + ereport.io.pci.target-ma@PCIEXFN; + +prop error.io.pci.target-rta-d@PCIEXFN (1)-> + error.io.pci.target-rta-d@PCIEXFN/PCIEXFNHZ; + +prop error.io.pci.target-rta-d@PCIEXFN (1)-> + error.io.pci.target-rta-d@PCIEXFN/PCIFNHZ; + +prop error.io.pci.target-rta-d@PCIEXFN (0)-> + ereport.io.pci.target-rta@PCIEXFN; + /* * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * stub unused pciex-pci bridge ereports @@ -2419,31 +1907,31 @@ prop error.io.pciex.source-mtlp-u@pcibus/pcidev/pcifn (1)-> * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ -event ereport.io.pciex.bdg.usc@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pcix.sec-unex-spl@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pcix.sec-spl-or@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pcix.sec-spl-dly@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pcix.sec-ecc.ce-addr@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pcix.sec-ecc.ce-attr@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pcix.sec-ecc.ce-data@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pcix.sec-ecc.ue-addr@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pcix.sec-ecc.ue-attr@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pcix.sec-ecc.ue-data@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pcix.sec-s-ce@pciexbus/pciexdev/pciexfn{within(5s)}; -event ereport.io.pcix.sec-s-ue@pciexbus/pciexdev/pciexfn{within(5s)}; - -event upset.io.pciex.discard-bdg@pciexbus/pciexdev/pciexfn; - -prop upset.io.pciex.discard-bdg@pciexbus/pciexdev/pciexfn (1)-> - ereport.io.pciex.bdg.usc@pciexbus/pciexdev/pciexfn, - ereport.io.pcix.sec-unex-spl@pciexbus/pciexdev/pciexfn, - ereport.io.pcix.sec-spl-or@pciexbus/pciexdev/pciexfn, - ereport.io.pcix.sec-spl-dly@pciexbus/pciexdev/pciexfn, - ereport.io.pcix.sec-ecc.ce-addr@pciexbus/pciexdev/pciexfn, - ereport.io.pcix.sec-ecc.ce-attr@pciexbus/pciexdev/pciexfn, - ereport.io.pcix.sec-ecc.ce-data@pciexbus/pciexdev/pciexfn, - ereport.io.pcix.sec-ecc.ue-addr@pciexbus/pciexdev/pciexfn, - ereport.io.pcix.sec-ecc.ue-attr@pciexbus/pciexdev/pciexfn, - ereport.io.pcix.sec-ecc.ue-data@pciexbus/pciexdev/pciexfn, - ereport.io.pcix.sec-s-ce@pciexbus/pciexdev/pciexfn, - ereport.io.pcix.sec-s-ue@pciexbus/pciexdev/pciexfn; +event ereport.io.pciex.bdg.usc@PCIEXFN{within(5s)}; +event ereport.io.pcix.sec-unex-spl@PCIEXFN{within(5s)}; +event ereport.io.pcix.sec-spl-or@PCIEXFN{within(5s)}; +event ereport.io.pcix.sec-spl-dly@PCIEXFN{within(5s)}; +event ereport.io.pcix.sec-ecc.ce-addr@PCIEXFN{within(5s)}; +event ereport.io.pcix.sec-ecc.ce-attr@PCIEXFN{within(5s)}; +event ereport.io.pcix.sec-ecc.ce-data@PCIEXFN{within(5s)}; +event ereport.io.pcix.sec-ecc.ue-addr@PCIEXFN{within(5s)}; +event ereport.io.pcix.sec-ecc.ue-attr@PCIEXFN{within(5s)}; +event ereport.io.pcix.sec-ecc.ue-data@PCIEXFN{within(5s)}; +event ereport.io.pcix.sec-s-ce@PCIEXFN{within(5s)}; +event ereport.io.pcix.sec-s-ue@PCIEXFN{within(5s)}; + +event upset.io.pciex.discard-bdg@PCIEXFN; + +prop upset.io.pciex.discard-bdg@PCIEXFN (1)-> + ereport.io.pciex.bdg.usc@PCIEXFN, + ereport.io.pcix.sec-unex-spl@PCIEXFN, + ereport.io.pcix.sec-spl-or@PCIEXFN, + ereport.io.pcix.sec-spl-dly@PCIEXFN, + ereport.io.pcix.sec-ecc.ce-addr@PCIEXFN, + ereport.io.pcix.sec-ecc.ce-attr@PCIEXFN, + ereport.io.pcix.sec-ecc.ce-data@PCIEXFN, + ereport.io.pcix.sec-ecc.ue-addr@PCIEXFN, + ereport.io.pcix.sec-ecc.ue-attr@PCIEXFN, + ereport.io.pcix.sec-ecc.ue-data@PCIEXFN, + ereport.io.pcix.sec-s-ce@PCIEXFN, + ereport.io.pcix.sec-s-ue@PCIEXFN; diff --git a/usr/src/cmd/fm/eversholt/files/i386/i86pc/amd64.esc b/usr/src/cmd/fm/eversholt/files/i386/i86pc/amd64.esc index 3ead64e294..7b7e587c11 100644 --- a/usr/src/cmd/fm/eversholt/files/i386/i86pc/amd64.esc +++ b/usr/src/cmd/fm/eversholt/files/i386/i86pc/amd64.esc @@ -32,25 +32,13 @@ * Eversholt rules for the AMD Opteron CPU/Memory */ -fru motherboard; -fru chip; -fru dimm; - -asru chip/cpu; -asru dimm; -asru dimm/rank; -asru dram-channel; -asru chip/memory-controller/chip-select; - #define MAX(x, y) ((x) >= (y) ? (x) : (y)) #define MIN(x, y) ((x) <= (y) ? (x) : (y)) /* * SET_ADDR and SET_OFFSET are used to set a payload value in the fault that * we diagnose for page faults, to record the physical address of the faulting - * page. The "asru-" prefix is hooked in the "rewrite-ASRU" confcalls made on - * diagnosis of associated faults when the libtopo mem scheme rewrites the - * asru in "mem" scheme. + * page. */ #define SET_ADDR (setpayloadprop("asru-physaddr", payloadprop("IA32_MCi_ADDR"))) @@ -104,7 +92,8 @@ asru chip/memory-controller/chip-select; (payloadprop("syndrome-type") == "C" && \ !CKSINGLE(payloadprop("syndrome"))) -/* +/* #PAGE# + * #DIMM_SCU# * A single bit fault in a memory rank can cause: * * - mem_ce : reported by nb @@ -118,7 +107,7 @@ asru chip/memory-controller/chip-select; * trips we diagnose a fault.memory.page so that the response agent can * retire the page that caused the trip. If the total number of pages * faulted in this way on a single rank exceeds a threshold we will - * diagnose a fault.memory.dimm_sb against the containing. + * diagnose a fault.memory.dimm_sb against the containing dimm. * * Multibit ChipKill-correctable errors are treated identically to * single-bit errors, but via separate serd engines to allow distinct @@ -138,21 +127,10 @@ event ereport.cpu.amd.bu.s_ecc1@chip/cpu{within(5s)}; event ereport.cpu.amd.nb.mem_ce@chip/cpu{within(5s)}; /* - * If the address is not valid then no resource member will be included - * in a nb.mem_ce or nb.mem_ue ereport. These cases should be rare. - * We will also discard all inf_sys_ecc1 events detected at the ic since they - * have no syndrome and therefore no resource information. - * We will discard such ereports. An alternative may be to SERD them - * on a per MC basis and trip if we see too many such events. - */ - -event upset.memory.discard1@chip/cpu; - -/* #PAGE# - * Single-bit correctable errors are diagnosed as upsets and feed into per-rank + * Single-bit correctable errors feed into per-rank * SERD engines which diagnose fault.memory.page_sb if they trip. * - * Multi-bit correctable (via ChipKill) errors are diagnosed as upsets and feed + * Multi-bit correctable (via ChipKill) errors feed * into additional per-rank SERD engines which diagnose fault.memory.page_ck * if they trip. * @@ -161,12 +139,32 @@ event upset.memory.discard1@chip/cpu; * whether to declare a dimm faulty after repeated page faults. */ -#define PAGE_FIT 1 #define PAGE_SB_COUNT 2 #define PAGE_SB_TIME 72h #define PAGE_CK_COUNT 2 #define PAGE_CK_TIME 72h +engine stat.sbpgflt@chip/memory-controller/dimm/rank; +engine stat.ckpgflt@chip/memory-controller/dimm/rank; +engine serd.memory.page_sb@chip/memory-controller/dimm/rank, + N=PAGE_SB_COUNT, T=PAGE_SB_TIME; +engine serd.memory.page_ck@chip/memory-controller/dimm/rank, + N=PAGE_CK_COUNT, T=PAGE_CK_TIME; +engine serd.memory.dimm_sb@chip/memory-controller/dimm/rank, + N=PAGE_SB_COUNT, T=PAGE_SB_TIME; +engine serd.memory.dimm_ck@chip/memory-controller/dimm/rank, + N=PAGE_CK_COUNT, T=PAGE_CK_TIME; +event fault.memory.page_sb@chip/memory-controller/dimm/rank, message=0, + count=stat.sbpgflt@chip/memory-controller/dimm/rank, response=0, + engine=serd.memory.page_sb@chip/memory-controller/dimm/rank; +event fault.memory.page_ck@chip/memory-controller/dimm/rank, message=0, + count=stat.ckpgflt@chip/memory-controller/dimm/rank, response=0, + engine=serd.memory.page_ck@chip/memory-controller/dimm/rank; +event fault.memory.dimm_sb@chip/memory-controller/dimm/rank, + engine=serd.memory.dimm_sb@chip/memory-controller/dimm/rank; +event fault.memory.dimm_ck@chip/memory-controller/dimm/rank, + engine=serd.memory.dimm_ck@chip/memory-controller/dimm/rank; + /* * The fraction of pages on a single rank that must be diagnosed as faulty * with single correctable unit faults before we will fault the rank. @@ -211,7 +209,7 @@ event upset.memory.discard1@chip/cpu; * never more than 512. */ #define RANK_THRESH MIN(512, MAX(128, \ - _BPS_PGCNT(confprop(asru(chip/memory-controller/dimm/rank), "size")))) + _BPS_PGCNT(confprop(chip/memory-controller/dimm/rank, "size")))) /* * The maximum number of single-correctable-unit page faults we will diagnose @@ -220,98 +218,10 @@ event upset.memory.discard1@chip/cpu; */ #define RANK_PGFLT_MAX (2 * RANK_THRESH) -engine stat.sbpgflt@chip/memory-controller/dimm/rank; -engine stat.ckpgflt@chip/memory-controller/dimm/rank; - -event fault.memory.page_sb@chip/memory-controller/dimm/rank, - FITrate=PAGE_FIT, FRU=dimm, ASRU=dimm/rank, message=0, - count=stat.sbpgflt@chip/memory-controller/dimm/rank, - action=confcall("rewrite-ASRU"); /* rewrite ASRU to identify page in rank */ - #define SB_PGFLTS (count(stat.sbpgflt@chip/memory-controller/dimm/rank)) - -event fault.memory.page_ck@chip/memory-controller/dimm/rank, - FITrate=PAGE_FIT, FRU=dimm, ASRU=dimm/rank, message=0, - count=stat.ckpgflt@chip/memory-controller/dimm/rank, - action=confcall("rewrite-ASRU"); /* rewrite ASRU to identify page in rank */ - #define CK_PGFLTS (count(stat.ckpgflt@chip/memory-controller/dimm/rank)) -#define RANK_PGFLT_LIMIT_REACHED \ - (SB_PGFLTS + CK_PGFLTS > RANK_PGFLT_MAX) - -event ereport.memory.page_sb_trip@chip/memory-controller/dimm/rank{within(5s)}; -engine serd.memory.page_sb@chip/memory-controller/dimm/rank, - N=PAGE_SB_COUNT, T=PAGE_SB_TIME, method=persistent, - trip=ereport.memory.page_sb_trip@chip/memory-controller/dimm/rank; -event upset.memory.page_sb@chip/memory-controller/dimm/rank, - engine=serd.memory.page_sb@chip/memory-controller/dimm/rank; - -event ereport.memory.page_ck_trip@chip/memory-controller/dimm/rank{within(5s)}; -engine serd.memory.page_ck@chip/memory-controller/dimm/rank, - N=PAGE_CK_COUNT, T=PAGE_CK_TIME, method=persistent, - trip=ereport.memory.page_ck_trip@chip/memory-controller/dimm/rank; -event upset.memory.page_ck@chip/memory-controller/dimm/rank, - engine=serd.memory.page_ck@chip/memory-controller/dimm/rank; - -event upset.memory.overpgfltlimit@chip/memory-controller/dimm/rank; - -/* - * If we have not reached the per-rank limit on faulted pages then - * continue to explain ereport observations as upsets which can lead - * lead to page fault diagnoses if the serd engine trips. - */ -prop upset.memory.page_sb@chip/memory-controller/dimm/rank - { CONTAINS_RANK && SINGLE_BIT_CE && !RANK_PGFLT_LIMIT_REACHED } (0)-> - ereport.cpu.amd.dc.inf_sys_ecc1@chip/cpu, - ereport.cpu.amd.bu.s_ecc1@chip/cpu, - ereport.cpu.amd.nb.mem_ce@chip/cpu; - -prop upset.memory.page_ck@chip/memory-controller/dimm/rank - { CONTAINS_RANK && MULTI_BIT_CE && !RANK_PGFLT_LIMIT_REACHED } (0)-> - /* no dc.inf_sys_ecc1 or bu.s_ecc1 in ChipKill mode */ - ereport.cpu.amd.nb.mem_ce@chip/cpu; - -/* - * If we have reached the per-rank limit on faulted pages then diagnose - * further observations on the rank to a engine-less upset (i.e., discard - * them). - */ -prop upset.memory.overpgfltlimit@chip/memory-controller/dimm/rank - { CONTAINS_RANK && RANK_PGFLT_LIMIT_REACHED } (1)-> - ereport.cpu.amd.dc.inf_sys_ecc1@chip/cpu, - ereport.cpu.amd.bu.s_ecc1@chip/cpu, - ereport.cpu.amd.nb.mem_ce@chip/cpu; - -prop fault.memory.page_sb@chip/memory-controller/dimm/rank (1)-> - ereport.memory.page_sb_trip@chip/memory-controller/dimm/rank; - -prop fault.memory.page_ck@chip/memory-controller/dimm/rank (1)-> - ereport.memory.page_ck_trip@chip/memory-controller/dimm/rank; - -prop fault.memory.page_sb@chip/memory-controller/dimm/rank - { CONTAINS_RANK && SET_ADDR && SET_OFFSET } (0)-> - ereport.cpu.amd.dc.inf_sys_ecc1@chip/cpu, - ereport.cpu.amd.bu.s_ecc1@chip/cpu, - ereport.cpu.amd.nb.mem_ce@chip/cpu; - -prop fault.memory.page_ck@chip/memory-controller/dimm/rank - { CONTAINS_RANK && SET_ADDR && SET_OFFSET } (0)-> - ereport.cpu.amd.dc.inf_sys_ecc1@chip/cpu, - ereport.cpu.amd.bu.s_ecc1@chip/cpu, - ereport.cpu.amd.nb.mem_ce@chip/cpu; - -/* - * Discard memory ereports that do not indicate a resource. - */ -prop upset.memory.discard1@chip/cpu - { !RESOURCE_EXISTS } (1)-> - ereport.cpu.amd.ic.inf_sys_ecc1@chip/cpu, - ereport.cpu.amd.dc.inf_sys_ecc1@chip/cpu, - ereport.cpu.amd.bu.s_ecc1@chip/cpu, - ereport.cpu.amd.nb.mem_ce@chip/cpu; - -/* #DIMM_SCU# +/* * "Single-correctable-unit" DIMM faults are diagnosed when the total number of * page faults (diagnosed from repeated single-bit or multibit-chipkills) * from any one rank on that DIMM reaches a threshold. A "correctable unit" @@ -330,81 +240,49 @@ prop upset.memory.discard1@chip/cpu * * Implementation: we maintain parallel SERD engines to the page_sb and * page_ck engines, which trip in unison. On trip it generates a distinct - * ereport which we diagnose to a fault if the threshold has been - * reached, or to a throwaway upset if not. - * + * ereport which we diagnose to a fault if the threshold has been reached. */ - -#define DIMM_SB_FIT 2000 -#define DIMM_CK_FIT 4000 - -event fault.memory.dimm_sb@chip/memory-controller/dimm/rank, - FITrate=DIMM_SB_FIT, FRU=dimm, ASRU=dimm, - action=confcall("rewrite-ASRU"); /* rewrite non-leaf ASRU in mem scheme */ - -event fault.memory.dimm_ck@chip/memory-controller/dimm/rank, - FITrate=DIMM_CK_FIT, FRU=dimm, ASRU=dimm, - action=confcall("rewrite-ASRU"); /* rewrite non-leaf ASRU in mem scheme */ - -event ereport.memory.dimm_sb_trip@chip/memory-controller/dimm/rank - { within(5s) }; -engine serd.memory.dimm_sb@chip/memory-controller/dimm/rank, - N=PAGE_SB_COUNT, T=PAGE_SB_TIME, method=persistent, - trip=ereport.memory.dimm_sb_trip@chip/memory-controller/dimm/rank; -event upset.memory.dimm_sb@chip/memory-controller/dimm/rank, - engine=serd.memory.dimm_sb@chip/memory-controller/dimm/rank; - -event ereport.memory.dimm_ck_trip@chip/memory-controller/dimm/rank - { within(5s) }; -engine serd.memory.dimm_ck@chip/memory-controller/dimm/rank, - N=PAGE_CK_COUNT, T=PAGE_CK_TIME, method=persistent, - trip=ereport.memory.dimm_ck_trip@chip/memory-controller/dimm/rank; -event upset.memory.dimm_ck@chip/memory-controller/dimm/rank, - engine=serd.memory.dimm_ck@chip/memory-controller/dimm/rank; - -event upset.memory.discard2@chip/memory-controller/dimm/rank; - -prop upset.memory.dimm_sb@chip/memory-controller/dimm/rank - { CONTAINS_RANK && SINGLE_BIT_CE } (0)-> +prop fault.memory.page_sb@chip/memory-controller/dimm/rank + { CONTAINS_RANK && SINGLE_BIT_CE && + SB_PGFLTS + CK_PGFLTS < RANK_PGFLT_MAX && SET_ADDR && SET_OFFSET } (1)-> ereport.cpu.amd.dc.inf_sys_ecc1@chip/cpu, ereport.cpu.amd.bu.s_ecc1@chip/cpu, ereport.cpu.amd.nb.mem_ce@chip/cpu; -prop upset.memory.dimm_ck@chip/memory-controller/dimm/rank - { CONTAINS_RANK && MULTI_BIT_CE } (0)-> +prop fault.memory.page_ck@chip/memory-controller/dimm/rank + { CONTAINS_RANK && !SINGLE_BIT_CE && + SB_PGFLTS + CK_PGFLTS < RANK_PGFLT_MAX && SET_ADDR && SET_OFFSET } (1)-> + ereport.cpu.amd.dc.inf_sys_ecc1@chip/cpu, + ereport.cpu.amd.bu.s_ecc1@chip/cpu, ereport.cpu.amd.nb.mem_ce@chip/cpu; -/* - * The following two propogations diagnose a fault.memory.dimm_sb when - * either the dimm_sb or dimm_ck engine trips (for a new page fault) - * and the total number of page faults (sb and ck) exceeds the threshold - * value with the majority being from sb page faults. - */ -prop fault.memory.dimm_sb@chip/memory-controller/dimm/rank (0)-> - ereport.memory.dimm_sb_trip@chip/memory-controller/dimm/rank - { SB_PGFLTS + CK_PGFLTS > RANK_THRESH && SB_PGFLTS > RANK_THRESH / 2 }; +prop fault.memory.dimm_sb@chip/memory-controller/dimm/rank + { CONTAINS_RANK && SB_PGFLTS + CK_PGFLTS > RANK_THRESH && + SB_PGFLTS > RANK_THRESH / 2 } (1)-> + ereport.cpu.amd.dc.inf_sys_ecc1@chip/cpu, + ereport.cpu.amd.bu.s_ecc1@chip/cpu, + ereport.cpu.amd.nb.mem_ce@chip/cpu; -prop fault.memory.dimm_sb@chip/memory-controller/dimm/rank (0)-> - ereport.memory.dimm_ck_trip@chip/memory-controller/dimm/rank - { SB_PGFLTS + CK_PGFLTS > RANK_THRESH && SB_PGFLTS > RANK_THRESH / 2 }; +prop fault.memory.dimm_ck@chip/memory-controller/dimm/rank + { CONTAINS_RANK && SB_PGFLTS + CK_PGFLTS > RANK_THRESH && + CK_PGFLTS > RANK_THRESH / 2 } (1)-> + ereport.cpu.amd.nb.mem_ce@chip/cpu; /* - * The following two propogation diagnose a fault.memory.dimm_ck when - * either the dimm_sb or dimm_ck engine trip (for a new page fault) - * and the total number of page faults (sb and ck) exceeds the threshold - * value with the majority being from ck page faults. + * If the address is not valid then no resource member will be included + * in a nb.mem_ce or nb.mem_ue ereport. These cases should be rare. + * We will also discard all inf_sys_ecc1 events detected at the ic since they + * have no syndrome and therefore no resource information. + * We will discard such ereports. An alternative may be to SERD them + * on a per MC basis and trip if we see too many such events. */ -prop fault.memory.dimm_ck@chip/memory-controller/dimm/rank (0)-> - ereport.memory.dimm_sb_trip@chip/memory-controller/dimm/rank - { SB_PGFLTS + CK_PGFLTS > RANK_THRESH && CK_PGFLTS > RANK_THRESH / 2 }; - -prop fault.memory.dimm_ck@chip/memory-controller/dimm/rank (0)-> - ereport.memory.dimm_ck_trip@chip/memory-controller/dimm/rank - { SB_PGFLTS + CK_PGFLTS > RANK_THRESH && CK_PGFLTS > RANK_THRESH / 2 }; - -prop upset.memory.discard2@chip/memory-controller/dimm/rank (1)-> - ereport.memory.dimm_sb_trip@chip/memory-controller/dimm/rank, - ereport.memory.dimm_ck_trip@chip/memory-controller/dimm/rank; +event upset.memory.discard1@chip/cpu; +prop upset.memory.discard1@chip/cpu + { !RESOURCE_EXISTS } (1)-> + ereport.cpu.amd.ic.inf_sys_ecc1@chip/cpu, + ereport.cpu.amd.dc.inf_sys_ecc1@chip/cpu, + ereport.cpu.amd.bu.s_ecc1@chip/cpu, + ereport.cpu.amd.nb.mem_ce@chip/cpu; /* #DIMM_UE# * #PAGE_UE# @@ -414,72 +292,35 @@ prop upset.memory.discard2@chip/memory-controller/dimm/rank (1)-> * - inf_sys_eccm : reported by ic or dc; the ic does not report a syndrome * - s_eccm : reported by bu * - * Note we use a SERD engine here simply as a way of ensuring that we get - * both dimm and page faults reported. - * * Since on production systems we force HT Sync Flood on uncorrectable * memory errors (if not already set as such by the BIOS, as it should be) * we won't actually receive these ereports since the system will be reset. */ -#define DIMM_UE_FIT 6000 - event ereport.cpu.amd.ic.inf_sys_eccm@chip/cpu{within(5s)}; event ereport.cpu.amd.dc.inf_sys_eccm@chip/cpu{within(5s)}; event ereport.cpu.amd.bu.s_eccm@chip/cpu{within(5s)}; event ereport.cpu.amd.nb.mem_ue@chip/cpu{within(5s)}; -event fault.memory.dimm_ue@chip/memory-controller/dimm/rank, - FITrate=DIMM_UE_FIT, FRU=dimm, ASRU=dimm, - action=confcall("rewrite-ASRU"); /* rewrite non-leaf ASRU in mem scheme */ - -event fault.memory.page_ue@chip/memory-controller/dimm/rank, - FITrate=PAGE_FIT, FRU=dimm, ASRU=dimm/rank, message=0, - action=confcall("rewrite-ASRU"); /* rewrite ASRU to identify page in rank */ - -event ereport.memory.dimm_ue_trip@chip/memory-controller/dimm/rank{within(5s)}; -engine serd.memory.dimm_ue@chip/memory-controller/dimm/rank, - N=0, T=1h, method=persistent, - trip=ereport.memory.dimm_ue_trip@chip/memory-controller/dimm/rank; -event upset.memory.dimm_ue@chip/memory-controller/dimm/rank, - engine=serd.memory.dimm_ue@chip/memory-controller/dimm/rank; +event fault.memory.dimm_ue@chip/memory-controller/dimm/rank; +event fault.memory.page_ue@chip/memory-controller/dimm/rank, message=0, + response=0; -event ereport.memory.page_ue_trip@chip/memory-controller/dimm/rank{within(5s)}; -engine serd.memory.page_ue@chip/memory-controller/dimm/rank, - N=0, T=1h, method=persistent, - trip=ereport.memory.page_ue_trip@chip/memory-controller/dimm/rank; -event upset.memory.page_ue@chip/memory-controller/dimm/rank, - engine=serd.memory.page_ue@chip/memory-controller/dimm/rank; - -event upset.memory.discard3@chip/cpu; - -prop upset.memory.page_ue@chip/memory-controller/dimm/rank - { CONTAINS_RANK } (0)-> - ereport.cpu.amd.ic.inf_sys_eccm@chip/cpu, - ereport.cpu.amd.dc.inf_sys_eccm@chip/cpu, - ereport.cpu.amd.bu.s_eccm@chip/cpu, - ereport.cpu.amd.nb.mem_ue@chip/cpu; - -prop upset.memory.dimm_ue@chip/memory-controller/dimm/rank - { CONTAINS_RANK } (0)-> +prop fault.memory.dimm_ue@chip/memory-controller/dimm/rank + { CONTAINS_RANK } (1)-> ereport.cpu.amd.ic.inf_sys_eccm@chip/cpu, ereport.cpu.amd.dc.inf_sys_eccm@chip/cpu, ereport.cpu.amd.bu.s_eccm@chip/cpu, ereport.cpu.amd.nb.mem_ue@chip/cpu; -prop fault.memory.page_ue@chip/memory-controller/dimm/rank (1)-> - ereport.memory.page_ue_trip@chip/memory-controller/dimm/rank; - prop fault.memory.page_ue@chip/memory-controller/dimm/rank - { CONTAINS_RANK && SET_ADDR && SET_OFFSET } (0)-> + { CONTAINS_RANK && SET_ADDR && SET_OFFSET } (1)-> ereport.cpu.amd.ic.inf_sys_eccm@chip/cpu, ereport.cpu.amd.dc.inf_sys_eccm@chip/cpu, ereport.cpu.amd.bu.s_eccm@chip/cpu, ereport.cpu.amd.nb.mem_ue@chip/cpu; -prop fault.memory.dimm_ue@chip/memory-controller/dimm/rank (1)-> - ereport.memory.dimm_ue_trip@chip/memory-controller/dimm/rank; - +event upset.memory.discard3@chip/cpu; prop upset.memory.discard3@chip/cpu { !RESOURCE_EXISTS } (1)-> ereport.cpu.amd.ic.inf_sys_eccm@chip/cpu, @@ -499,11 +340,7 @@ prop upset.memory.discard3@chip/cpu */ event ereport.cpu.amd.mc.cs_testfail@chip/memory-controller{within(5s)}; - -event fault.memory.dimm_testfail@chip/memory-controller/dimm/rank, - FITrate=1000, ASRU=dimm, FRU=dimm, - action=confcall("rewrite-ASRU"); /* rewrite non-leaf ASRU in mem scheme */ - +event fault.memory.dimm_testfail@chip/memory-controller/dimm/rank; event error.memory.cs_testfail@chip/memory-controller/chip-select; #define CONTAINS_CS (payloadprop_contains("resource", \ @@ -514,9 +351,9 @@ prop error.memory.cs_testfail@chip/memory-controller/chip-select (1)-> { CONTAINS_CS }; #define CSMATCH(s) \ - (confprop_defined(asru(chip/memory-controller/chip-select), s) && \ - confprop(asru(chip/memory-controller/chip-select), s) == \ - confprop(asru(chip/memory-controller/dimm/rank), "csname")) + (confprop_defined(chip/memory-controller/chip-select, s) && \ + confprop(chip/memory-controller/chip-select, s) == \ + confprop(chip/memory-controller/dimm/rank, "csname")) prop fault.memory.dimm_testfail@chip/memory-controller/dimm/rank (1)-> error.memory.cs_testfail@chip/memory-controller/chip-select @@ -531,32 +368,11 @@ prop fault.memory.dimm_testfail@chip/memory-controller/dimm/rank (1)-> */ event ereport.cpu.amd.nb.dramaddr_par@chip/cpu{within(5s)}; - -event fault.cpu.amd.dramchannel@chip/memory-controller/dram-channel, - FITrate=1000, ASRU=dram-channel; - -#define GET_CHANNEL ($chan = (payloadprop("IA32_MCi_STATUS") >> 32 & 0x200) ? \ - 1 : 0) +event fault.cpu.amd.dramchannel@chip/memory-controller/dram-channel, response=0; prop fault.cpu.amd.dramchannel@chip/memory-controller/dram-channel[y] (0)-> - ereport.cpu.amd.nb.dramaddr_par@chip/cpu { GET_CHANNEL && $chan == y }; - -/* - * l2 cache data errors. - */ - -#define L2CACHEDATA_FIT 1000 -#define L2CACHEDATA_SB_COUNT 3 -#define L2CACHEDATA_SB_TIME 12h - -event fault.cpu.amd.l2cachedata@chip/cpu, FITrate=L2CACHEDATA_FIT, - FRU=chip, ASRU=chip/cpu; -event error.cpu.amd.l2cachedata_sb@chip/cpu; -event error.cpu.amd.l2cachedata_mb@chip/cpu; - -prop fault.cpu.amd.l2cachedata@chip/cpu (1)-> - error.cpu.amd.l2cachedata_sb@chip/cpu, - error.cpu.amd.l2cachedata_mb@chip/cpu; + ereport.cpu.amd.nb.dramaddr_par@chip/cpu { + ((payloadprop("IA32_MCi_STATUS") >> 32 & 0x200) ? 1 : 0) == y }; /* #L2D_SINGLE# * A single bit data array fault in an l2 cache can cause: @@ -564,30 +380,17 @@ prop fault.cpu.amd.l2cachedata@chip/cpu (1)-> * - inf_l2_ecc1 : reported by ic on this cpu * - inf_l2_ecc1 : reported by dc on this cpu * - l2d_ecc1 : reported by bu on copyback or on snoop from another cpu - * - * Single-bit errors are diagnosed to cache upsets. SERD engines are used - * to count upsets resulting from CEs. */ +#define L2CACHEDATA_SB_COUNT 3 +#define L2CACHEDATA_SB_TIME 12h + event ereport.cpu.amd.ic.inf_l2_ecc1@chip/cpu{within(5s)}; event ereport.cpu.amd.dc.inf_l2_ecc1@chip/cpu{within(5s)}; event ereport.cpu.amd.bu.l2d_ecc1@chip/cpu{within(5s)}; -event ereport.cpu.amd.l2d_sb_trip@chip/cpu{within(5s)}; - engine serd.cpu.amd.l2d_sb@chip/cpu, - N=L2CACHEDATA_SB_COUNT, T=L2CACHEDATA_SB_TIME, method=persistent, - trip=ereport.cpu.amd.l2d_sb_trip@chip/cpu; - -event upset.cpu.amd.l2d_sb@chip/cpu, - engine=serd.cpu.amd.l2d_sb@chip/cpu; - -prop upset.cpu.amd.l2d_sb@chip/cpu (1)-> - ereport.cpu.amd.ic.inf_l2_ecc1@chip/cpu, - ereport.cpu.amd.dc.inf_l2_ecc1@chip/cpu, - ereport.cpu.amd.bu.l2d_ecc1@chip/cpu; - -prop error.cpu.amd.l2cachedata_sb@chip/cpu (1)-> - ereport.cpu.amd.l2d_sb_trip@chip/cpu; + N=L2CACHEDATA_SB_COUNT, T=L2CACHEDATA_SB_TIME; +event fault.cpu.amd.l2cachedata@chip/cpu, engine=serd.cpu.amd.l2d_sb@chip/cpu; prop fault.cpu.amd.l2cachedata@chip/cpu (0)-> ereport.cpu.amd.ic.inf_l2_ecc1@chip/cpu, @@ -606,61 +409,27 @@ event ereport.cpu.amd.ic.inf_l2_eccm@chip/cpu{within(5s)}; event ereport.cpu.amd.dc.inf_l2_eccm@chip/cpu{within(5s)}; event ereport.cpu.amd.bu.l2d_eccm@chip/cpu{within(5s)}; -prop error.cpu.amd.l2cachedata_mb@chip/cpu (1)-> +prop fault.cpu.amd.l2cachedata@chip/cpu + { setserdincrement(L2CACHEDATA_SB_COUNT + 1) } (0)-> ereport.cpu.amd.ic.inf_l2_eccm@chip/cpu, ereport.cpu.amd.dc.inf_l2_eccm@chip/cpu, ereport.cpu.amd.bu.l2d_eccm@chip/cpu; -prop fault.cpu.amd.l2cachedata@chip/cpu (0)-> - ereport.cpu.amd.ic.inf_l2_eccm@chip/cpu, - ereport.cpu.amd.dc.inf_l2_eccm@chip/cpu, - ereport.cpu.amd.bu.l2d_eccm@chip/cpu; - -/* - * l2 cache main tag errors - */ - -#define L2CACHETAG_FIT 1000 -#define L2CACHETAG_SB_COUNT 3 -#define L2CACHETAG_SB_TIME 12h - -event fault.cpu.amd.l2cachetag@chip/cpu, FITrate=L2CACHETAG_FIT, - FRU=chip, ASRU=chip/cpu; -event error.cpu.amd.l2cachetag_sb@chip/cpu; -event error.cpu.amd.l2cachetag_mb@chip/cpu; - -prop fault.cpu.amd.l2cachetag@chip/cpu (1)-> - error.cpu.amd.l2cachetag_sb@chip/cpu, - error.cpu.amd.l2cachetag_mb@chip/cpu; - /* #L2T_SINGLE# * A single bit tag array fault in an l2 cache can cause: * * - l2t_ecc1 : reported by bu on this cpu when detected during snoop * - l2t_par : reported by bu on this cpu when detected other than during snoop - * - * Note that the bu.l2t_par ereport could be due to a single bit or multi bit - * event. If the l2t_sb_trip has already triggered it will be treated as another - * ce, otherwise it will be treated as a ue event. */ +#define L2CACHETAG_SB_COUNT 3 +#define L2CACHETAG_SB_TIME 12h + event ereport.cpu.amd.bu.l2t_ecc1@chip/cpu{within(5s)}; event ereport.cpu.amd.bu.l2t_par@chip/cpu{within(5s)}; -event ereport.cpu.amd.l2t_sb_trip@chip/cpu{within(5s)}; - engine serd.cpu.amd.l2t_sb@chip/cpu, - N=L2CACHETAG_SB_COUNT, T=L2CACHETAG_SB_TIME, method=persistent, - trip=ereport.cpu.amd.l2t_sb_trip@chip/cpu; - -event upset.cpu.amd.l2t_sb@chip/cpu, - engine=serd.cpu.amd.l2t_sb@chip/cpu; - -prop upset.cpu.amd.l2t_sb@chip/cpu (1)-> - ereport.cpu.amd.bu.l2t_ecc1@chip/cpu, - ereport.cpu.amd.bu.l2t_par@chip/cpu; - -prop error.cpu.amd.l2cachetag_sb@chip/cpu (1)-> - ereport.cpu.amd.l2t_sb_trip@chip/cpu; + N=L2CACHETAG_SB_COUNT, T=L2CACHETAG_SB_TIME; +event fault.cpu.amd.l2cachetag@chip/cpu, engine=serd.cpu.amd.l2t_sb@chip/cpu; prop fault.cpu.amd.l2cachetag@chip/cpu (0)-> ereport.cpu.amd.bu.l2t_ecc1@chip/cpu, @@ -675,11 +444,8 @@ prop fault.cpu.amd.l2cachetag@chip/cpu (0)-> event ereport.cpu.amd.bu.l2t_eccm@chip/cpu{within(5s)}; -prop error.cpu.amd.l2cachetag_mb@chip/cpu (1)-> - ereport.cpu.amd.bu.l2t_eccm@chip/cpu, - ereport.cpu.amd.bu.l2t_par@chip/cpu; - -prop fault.cpu.amd.l2cachetag@chip/cpu (0)-> +prop fault.cpu.amd.l2cachetag@chip/cpu + { setserdincrement(L2CACHETAG_SB_COUNT + 1) } (0)-> ereport.cpu.amd.bu.l2t_eccm@chip/cpu, ereport.cpu.amd.bu.l2t_par@chip/cpu; @@ -689,28 +455,14 @@ prop fault.cpu.amd.l2cachetag@chip/cpu (0)-> * - data_par : reported by ic on this cpu */ -#define ICACHEDATA_FIT 1000 #define ICACHEDATA_SB_COUNT 2 #define ICACHEDATA_SB_TIME 168h event ereport.cpu.amd.ic.data_par@chip/cpu{within(5s)}; -event ereport.cpu.amd.ic_dp_trip@chip/cpu{within(5s)}; - -event fault.cpu.amd.icachedata@chip/cpu, FITrate=ICACHEDATA_FIT, - FRU=chip, ASRU=chip/cpu; - engine serd.cpu.amd.icachedata@chip/cpu, - N=ICACHEDATA_SB_COUNT, T=ICACHEDATA_SB_TIME, method=persistent, - trip=ereport.cpu.amd.ic_dp_trip@chip/cpu; - -event upset.cpu.amd.icachedata@chip/cpu, - engine=serd.cpu.amd.icachedata@chip/cpu; - -prop upset.cpu.amd.icachedata@chip/cpu (1)-> - ereport.cpu.amd.ic.data_par@chip/cpu; - -prop fault.cpu.amd.icachedata@chip/cpu (1)-> - ereport.cpu.amd.ic_dp_trip@chip/cpu; + N=ICACHEDATA_SB_COUNT, T=ICACHEDATA_SB_TIME; +event fault.cpu.amd.icachedata@chip/cpu, + engine=serd.cpu.amd.icachedata@chip/cpu; prop fault.cpu.amd.icachedata@chip/cpu (0)-> ereport.cpu.amd.ic.data_par@chip/cpu; @@ -721,28 +473,13 @@ prop fault.cpu.amd.icachedata@chip/cpu (0)-> * - tag_par : reported by ic on this cpu */ -#define ICACHETAG_FIT 1000 #define ICACHETAG_SB_COUNT 2 #define ICACHETAG_SB_TIME 168h event ereport.cpu.amd.ic.tag_par@chip/cpu{within(5s)}; -event ereport.cpu.amd.ic_tp_trip@chip/cpu{within(5s)}; - -event fault.cpu.amd.icachetag@chip/cpu, FITrate=ICACHETAG_FIT, - FRU=chip, ASRU=chip/cpu; - engine serd.cpu.amd.icachetag@chip/cpu, - N=ICACHETAG_SB_COUNT, T=ICACHETAG_SB_TIME, method=persistent, - trip=ereport.cpu.amd.ic_tp_trip@chip/cpu; - -event upset.cpu.amd.icachetag@chip/cpu, - engine=serd.cpu.amd.icachetag@chip/cpu; - -prop upset.cpu.amd.icachetag@chip/cpu (1)-> - ereport.cpu.amd.ic.tag_par@chip/cpu; - -prop fault.cpu.amd.icachetag@chip/cpu (1)-> - ereport.cpu.amd.ic_tp_trip@chip/cpu; + N=ICACHETAG_SB_COUNT, T=ICACHETAG_SB_TIME; +event fault.cpu.amd.icachetag@chip/cpu, engine=serd.cpu.amd.icachetag@chip/cpu; prop fault.cpu.amd.icachetag@chip/cpu (0)-> ereport.cpu.amd.ic.tag_par@chip/cpu; @@ -753,12 +490,8 @@ prop fault.cpu.amd.icachetag@chip/cpu (0)-> * - stag_par : reported by ic on this cpu */ -#define ICACHESTAG_FIT 1000 - event ereport.cpu.amd.ic.stag_par@chip/cpu{within(5s)}; - -event fault.cpu.amd.icachestag@chip/cpu, FITrate=ICACHESTAG_FIT, - FRU=chip, ASRU=chip/cpu; +event fault.cpu.amd.icachestag@chip/cpu; prop fault.cpu.amd.icachestag@chip/cpu (1)-> ereport.cpu.amd.ic.stag_par@chip/cpu; @@ -769,28 +502,13 @@ prop fault.cpu.amd.icachestag@chip/cpu (1)-> * - l1tlb_par : reported by ic on this cpu */ -#define ICACHEL1TLB_FIT 1000 #define ICACHEL1TLB_SB_COUNT 2 #define ICACHEL1TLB_SB_TIME 168h event ereport.cpu.amd.ic.l1tlb_par@chip/cpu{within(5s)}; -event ereport.cpu.amd.ic_l1tlb_trip@chip/cpu{within(5s)}; - -event fault.cpu.amd.l1itlb@chip/cpu, FITrate=ICACHEL1TLB_FIT, - FRU=chip, ASRU=chip/cpu; - engine serd.cpu.amd.l1itlb@chip/cpu, - N=ICACHEL1TLB_SB_COUNT, T=ICACHEL1TLB_SB_TIME, method=persistent, - trip=ereport.cpu.amd.ic_l1tlb_trip@chip/cpu; - -event upset.cpu.amd.l1itlb@chip/cpu, - engine=serd.cpu.amd.l1itlb@chip/cpu; - -prop upset.cpu.amd.l1itlb@chip/cpu (1)-> - ereport.cpu.amd.ic.l1tlb_par@chip/cpu; - -prop fault.cpu.amd.l1itlb@chip/cpu (1)-> - ereport.cpu.amd.ic_l1tlb_trip@chip/cpu; + N=ICACHEL1TLB_SB_COUNT, T=ICACHEL1TLB_SB_TIME; +event fault.cpu.amd.l1itlb@chip/cpu, engine=serd.cpu.amd.l1itlb@chip/cpu; prop fault.cpu.amd.l1itlb@chip/cpu (0)-> ereport.cpu.amd.ic.l1tlb_par@chip/cpu; @@ -801,88 +519,38 @@ prop fault.cpu.amd.l1itlb@chip/cpu (0)-> * - l2tlb_par : reported by ic on this cpu */ -#define ICACHEL2TLB_FIT 1000 #define ICACHEL2TLB_SB_COUNT 2 #define ICACHEL2TLB_SB_TIME 168h event ereport.cpu.amd.ic.l2tlb_par@chip/cpu{within(5s)}; -event ereport.cpu.amd.ic_l2tlb_trip@chip/cpu{within(5s)}; - -event fault.cpu.amd.l2itlb@chip/cpu, FITrate=ICACHEL2TLB_FIT, - FRU=chip, ASRU=chip/cpu; - engine serd.cpu.amd.l2itlb@chip/cpu, - N=ICACHEL2TLB_SB_COUNT, T=ICACHEL2TLB_SB_TIME, method=persistent, - trip=ereport.cpu.amd.ic_l2tlb_trip@chip/cpu; - -event upset.cpu.amd.l2itlb@chip/cpu, - engine=serd.cpu.amd.l2itlb@chip/cpu; - -prop upset.cpu.amd.l2itlb@chip/cpu (1)-> - ereport.cpu.amd.ic.l2tlb_par@chip/cpu; - -prop fault.cpu.amd.l2itlb@chip/cpu (1)-> - ereport.cpu.amd.ic_l2tlb_trip@chip/cpu; + N=ICACHEL2TLB_SB_COUNT, T=ICACHEL2TLB_SB_TIME; +event fault.cpu.amd.l2itlb@chip/cpu, engine=serd.cpu.amd.l2itlb@chip/cpu; prop fault.cpu.amd.l2itlb@chip/cpu (0)-> ereport.cpu.amd.ic.l2tlb_par@chip/cpu; -/* - * dcache data errors - */ - -#define DCACHEDATA_FIT 1000 -#define DCACHEDATA_SB_COUNT 2 -#define DCACHEDATA_SB_TIME 168h - -event fault.cpu.amd.dcachedata@chip/cpu, FITrate=DCACHEDATA_FIT, - FRU=chip, ASRU=chip/cpu; -event error.cpu.amd.dcachedata_sb@chip/cpu; -event error.cpu.amd.dcachedata_mb@chip/cpu; - -prop fault.cpu.amd.dcachedata@chip/cpu (1)-> - error.cpu.amd.dcachedata_sb@chip/cpu, - error.cpu.amd.dcachedata_mb@chip/cpu; - /* #DCD_SINGLE# * A single bit data array fault in an D cache can cause: * * - data_ecc1 : reported by dc on this cpu by scrubber * - data_ecc1_uc : reported by dc on this cpu other than by scrubber * - * Make data_ecc1_uc fault immediately as it may have caused a panic + * Make data_ecc1_uc fault immediately as it may have caused a panic, so + * it is handled by the multi-bit case in the following section. */ +#define DCACHEDATA_SB_COUNT 2 +#define DCACHEDATA_SB_TIME 168h + event ereport.cpu.amd.dc.data_ecc1@chip/cpu{within(5s)}; event ereport.cpu.amd.dc.data_ecc1_uc@chip/cpu{within(5s)}; -event ereport.cpu.amd.dc_sb_trip@chip/cpu{within(5s)}; - engine serd.cpu.amd.dc_sb@chip/cpu, - N=DCACHEDATA_SB_COUNT, T=DCACHEDATA_SB_TIME, method=persistent, - trip=ereport.cpu.amd.dc_sb_trip@chip/cpu; - -engine serd.cpu.amd.dc_sb_uc@chip/cpu, - N=0, T=1hr, method=persistent, - trip=ereport.cpu.amd.dc_sb_trip@chip/cpu; - -event upset.cpu.amd.dc_sb@chip/cpu, - engine=serd.cpu.amd.dc_sb@chip/cpu; - -event upset.cpu.amd.dc_sb_uc@chip/cpu, - engine=serd.cpu.amd.dc_sb_uc@chip/cpu; - -prop upset.cpu.amd.dc_sb@chip/cpu (1)-> - ereport.cpu.amd.dc.data_ecc1@chip/cpu; - -prop upset.cpu.amd.dc_sb_uc@chip/cpu (1)-> - ereport.cpu.amd.dc.data_ecc1_uc@chip/cpu; - -prop error.cpu.amd.dcachedata_sb@chip/cpu (1)-> - ereport.cpu.amd.dc_sb_trip@chip/cpu; + N=DCACHEDATA_SB_COUNT, T=DCACHEDATA_SB_TIME; +event fault.cpu.amd.dcachedata@chip/cpu, engine=serd.cpu.amd.dc_sb@chip/cpu; prop fault.cpu.amd.dcachedata@chip/cpu (0)-> - ereport.cpu.amd.dc.data_ecc1@chip/cpu, - ereport.cpu.amd.dc.data_ecc1_uc@chip/cpu; + ereport.cpu.amd.dc.data_ecc1@chip/cpu; /* #DCD_MULTI# * A multi-bit data array fault in an D cache can cause: @@ -892,11 +560,10 @@ prop fault.cpu.amd.dcachedata@chip/cpu (0)-> event ereport.cpu.amd.dc.data_eccm@chip/cpu{within(5s)}; -prop error.cpu.amd.dcachedata_mb@chip/cpu (1)-> - ereport.cpu.amd.dc.data_eccm@chip/cpu; - -prop fault.cpu.amd.dcachedata@chip/cpu (0)-> - ereport.cpu.amd.dc.data_eccm@chip/cpu; +prop fault.cpu.amd.dcachedata@chip/cpu + { setserdincrement(L2CACHETAG_SB_COUNT + 1) } (0)-> + ereport.cpu.amd.dc.data_eccm@chip/cpu, + ereport.cpu.amd.dc.data_ecc1_uc@chip/cpu; /* #DCT_PAR# * A tag array parity fault in an D cache can cause: @@ -904,12 +571,8 @@ prop fault.cpu.amd.dcachedata@chip/cpu (0)-> * - tag_par : reported by dc on this cpu */ -#define DCACHETAG_FIT 1000 - event ereport.cpu.amd.dc.tag_par@chip/cpu{within(5s)}; - -event fault.cpu.amd.dcachetag@chip/cpu, FITrate=DCACHETAG_FIT, - FRU=chip, ASRU=chip/cpu; +event fault.cpu.amd.dcachetag@chip/cpu; prop fault.cpu.amd.dcachetag@chip/cpu (1)-> ereport.cpu.amd.dc.tag_par@chip/cpu; @@ -920,12 +583,8 @@ prop fault.cpu.amd.dcachetag@chip/cpu (1)-> * - stag_par : reported by dc on this cpu */ -#define DCACHESTAG_FIT 1000 - event ereport.cpu.amd.dc.stag_par@chip/cpu{within(5s)}; - -event fault.cpu.amd.dcachestag@chip/cpu, FITrate=DCACHESTAG_FIT, - FRU=chip, ASRU=chip/cpu; +event fault.cpu.amd.dcachestag@chip/cpu; prop fault.cpu.amd.dcachestag@chip/cpu (1)-> ereport.cpu.amd.dc.stag_par@chip/cpu; @@ -936,12 +595,8 @@ prop fault.cpu.amd.dcachestag@chip/cpu (1)-> * - l1tlb_par : reported by dc on this cpu */ -#define L1DTLB_FIT 1000 - event ereport.cpu.amd.dc.l1tlb_par@chip/cpu{within(5s)}; - -event fault.cpu.amd.l1dtlb@chip/cpu, FITrate=L1DTLB_FIT, - FRU=chip, ASRU=chip/cpu; +event fault.cpu.amd.l1dtlb@chip/cpu; prop fault.cpu.amd.l1dtlb@chip/cpu (1)-> ereport.cpu.amd.dc.l1tlb_par@chip/cpu; @@ -952,12 +607,8 @@ prop fault.cpu.amd.l1dtlb@chip/cpu (1)-> * - l2tlb_par : reported by dc on this cpu */ -#define L2DTLB_FIT 1000 - event ereport.cpu.amd.dc.l2tlb_par@chip/cpu{within(5s)}; - -event fault.cpu.amd.l2dtlb@chip/cpu, FITrate=L2DTLB_FIT, - FRU=chip, ASRU=chip/cpu; +event fault.cpu.amd.l2dtlb@chip/cpu; prop fault.cpu.amd.l2dtlb@chip/cpu (1)-> ereport.cpu.amd.dc.l2tlb_par@chip/cpu; diff --git a/usr/src/cmd/fm/eversholt/files/i386/i86pc/gcpu.esc b/usr/src/cmd/fm/eversholt/files/i386/i86pc/gcpu.esc index cc098771be..8ea5add988 100644 --- a/usr/src/cmd/fm/eversholt/files/i386/i86pc/gcpu.esc +++ b/usr/src/cmd/fm/eversholt/files/i386/i86pc/gcpu.esc @@ -20,7 +20,7 @@ */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -38,10 +38,6 @@ #pragma dictionary "GMCA" -fru motherboard/chip; - -asru motherboard/chip/cpu; - /* * Ereports for Simple error codes. */ @@ -59,47 +55,19 @@ SMPL_EVENT(internal_unclassified); /* * Propogations for all but "external" and "unknown" simple errors. - * If the error is uncorrected we produce a fault immediately, otherwise - * we diagnose it to an upset and decalre a fault when the SERD engine - * trips. + * If the error is uncorrected we produce a fault immediately by incrementing + * by N+1, otherwise we declare a fault when the SERD engine trips. */ -/* Simple fault event */ -event fault.cpu.generic-x86.internal@chip/cpu, - ASRU=motherboard/chip/cpu, FRU=motherboard/chip, - FITrate=1000; +#define SMPL_N 3 -/* Produced when the correctable engine trips */ -event ereport.cpu.generic-x86.simple_trip@chip/cpu { within(1s) }; - -/* Upset to diagnose corrected events to */ -event upset.cpu.generic-x86.simple@chip/cpu +engine serd.cpu.generic-x86.simple@chip/cpu, N=SMPL_N, T=72h; +event fault.cpu.generic-x86.internal@chip/cpu, engine=serd.cpu.generic-x86.simple@chip/cpu; -/* SERD engine for corrected simple errors */ -engine serd.cpu.generic-x86.simple@chip/cpu, - N=3, T=72h, method=persistent, - trip=ereport.cpu.generic-x86.simple_trip@chip/cpu; - -#define STATUS_UC \ - (payloadprop("error_uncorrected") + 0 == 1) - -/* Diagnose corrected events to upsets */ -prop upset.cpu.generic-x86.simple@chip/cpu - { !STATUS_UC } (1)-> - ereport.cpu.generic-x86.microcode_rom_parity@chip/cpu, - ereport.cpu.generic-x86.internal_timer@chip/cpu, - ereport.cpu.generic-x86.unclassified@chip/cpu, - ereport.cpu.generic-x86.internal_unclassified@chip/cpu, - ereport.cpu.generic-x86.frc@chip/cpu; - -/* When the correctable engine trips, diagnose a fault */ -prop fault.cpu.generic-x86.internal@chip/cpu (0)-> - ereport.cpu.generic-x86.simple_trip@chip/cpu; - -/* Diagnose uncorrected events to faults */ prop fault.cpu.generic-x86.internal@chip/cpu - { STATUS_UC } (0)-> + { payloadprop("error_uncorrected") == 1 ? + setserdincrement(SMPL_N + 1) : 1 } (1)-> ereport.cpu.generic-x86.microcode_rom_parity@chip/cpu, ereport.cpu.generic-x86.internal_timer@chip/cpu, ereport.cpu.generic-x86.unclassified@chip/cpu, @@ -163,7 +131,7 @@ CMPND_EVENT(bus_interconnect_memory); CMPND_EVENT(bus_interconnect_io); /* - * Compound error propogations for all but bus_interconnect*. + * Compound error propogations * * We resist the temptation propogate, for example, a single dcache fault * to all ereports mentioning dcache (l0dcache, l1dcache, l2dcache, dcache). @@ -172,41 +140,30 @@ CMPND_EVENT(bus_interconnect_io); * * Corrected errors are SERDed and produce a fault when the engine fires; * the same fault is diagnosed immediately for a corresponding uncorrected - * error. + * error by incrementing the serd engine by n + 1. */ #define CMPND_FLT_PROP_1(erptleaf, fltleaf, n, t) \ - /* Declare the fault that we can diagnose here */ \ + engine serd.cpu.generic-x86.fltleaf@chip/cpu, N=n, T=t; \ event fault.cpu.generic-x86.fltleaf@chip/cpu, \ - FITrate=1000, \ - FRU=motherboard/chip, \ - ASRU=motherboard/chip/cpu; \ - \ - /* Produced when the correctable engine trips */ \ - event ereport.cpu.generic-x86.fltleaf/**/_error@chip/cpu \ - { within(1s) }; \ - \ - /* Upset to diagnose corrected events to */ \ - event upset.cpu.generic-x86.fltleaf@chip/cpu, \ engine=serd.cpu.generic-x86.fltleaf@chip/cpu; \ \ - /* SERD engine for corrected events */ \ - engine serd.cpu.generic-x86.fltleaf@chip/cpu, \ - N=n, T=t, method=persistent, \ - trip=ereport.cpu.generic-x86.fltleaf/**/_error@chip/cpu; \ - \ - /* Diagnose corrected events to the corresponding upset */ \ - prop upset.cpu.generic-x86.fltleaf@chip/cpu (1)-> \ - ereport.cpu.generic-x86.erptleaf@chip/cpu; \ - \ - /* When the engine trips, diagnose a fault */ \ - prop fault.cpu.generic-x86.fltleaf@chip/cpu (0)-> \ - ereport.cpu.generic-x86.fltleaf/**/_error@chip/cpu; \ - \ - /* Produce immediate faults for uncorrected errors */ \ - prop fault.cpu.generic-x86.fltleaf@chip/cpu (0)-> \ + prop fault.cpu.generic-x86.fltleaf@chip/cpu (0)-> \ + ereport.cpu.generic-x86.erptleaf@chip/cpu; \ + prop fault.cpu.generic-x86.fltleaf@chip/cpu \ + { setserdincrement(n + 1) } (0)-> \ ereport.cpu.generic-x86.erptleaf/**/_uc@chip/cpu +#define CMPND_FLT_PROP_2(erptleaf, fltleaf, n, t) \ + engine serd.cpu.generic-x86.fltleaf@chip/cpu, N=n, T=t; \ + event fault.cpu.generic-x86.fltleaf@chip/cpu, retire=0, \ + response=0, engine=serd.cpu.generic-x86.fltleaf@chip/cpu; \ + \ + prop fault.cpu.generic-x86.fltleaf@chip/cpu (0)-> \ + ereport.cpu.generic-x86.erptleaf@chip/cpu; \ + prop fault.cpu.generic-x86.fltleaf@chip/cpu \ + { setserdincrement(n + 1) } (0)-> \ + ereport.cpu.generic-x86.erptleaf/**/_uc@chip/cpu CMPND_FLT_PROP_1(l0cache, l0cache, 3, 72h); CMPND_FLT_PROP_1(l1cache, l1cache, 3, 72h); @@ -238,43 +195,6 @@ CMPND_FLT_PROP_1(l1icache, l1icache, 3, 72h); CMPND_FLT_PROP_1(l2icache, l2icache, 3, 72h); CMPND_FLT_PROP_1(icache, icache, 12, 72h); -/* - * Compound error propogations for bus_interconnect* - as above but - * with no FRU. - */ - -#define CMPND_FLT_PROP_2(erptleaf, fltleaf, n, t) \ - /* Declare the fault that we can diagnose here */ \ - event fault.cpu.generic-x86.fltleaf@chip/cpu, \ - FITrate=1000, \ - ASRU=motherboard/chip/cpu; \ - \ - /* Produced when the correctable engine trips */ \ - event ereport.cpu.generic-x86.fltleaf/**/_error@chip/cpu \ - { within(1s) }; \ - \ - /* Upset to diagnose corrected events to */ \ - event upset.cpu.generic-x86.fltleaf@chip/cpu, \ - engine=serd.cpu.generic-x86.fltleaf@chip/cpu; \ - \ - /* SERD engine for corrected events */ \ - engine serd.cpu.generic-x86.fltleaf@chip/cpu, \ - N=n, T=t, method=persistent, \ - trip=ereport.cpu.generic-x86.fltleaf/**/_error@chip/cpu; \ - \ - /* Diagnose corrected events to the corresponding upset */ \ - prop upset.cpu.generic-x86.fltleaf@chip/cpu (1)-> \ - ereport.cpu.generic-x86.erptleaf@chip/cpu; \ - \ - /* When the engine trips, diagnose a fault */ \ - prop fault.cpu.generic-x86.fltleaf@chip/cpu (0)-> \ - ereport.cpu.generic-x86.fltleaf/**/_error@chip/cpu; \ - \ - /* Produce immediate faults for uncorrected errors */ \ - prop fault.cpu.generic-x86.fltleaf@chip/cpu (0)-> \ - ereport.cpu.generic-x86.erptleaf/**/_uc@chip/cpu - - CMPND_FLT_PROP_2(bus_interconnect, bus_interconnect, 10, 72h); CMPND_FLT_PROP_2(bus_interconnect_memory, bus_interconnect_memory, 10, 72h); CMPND_FLT_PROP_2(bus_interconnect_io, bus_interconnect_io, 10, 72h); diff --git a/usr/src/cmd/fm/eversholt/files/i386/i86pc/gcpu_amd.esc b/usr/src/cmd/fm/eversholt/files/i386/i86pc/gcpu_amd.esc index f6c81d74f3..a01ccbb928 100644 --- a/usr/src/cmd/fm/eversholt/files/i386/i86pc/gcpu_amd.esc +++ b/usr/src/cmd/fm/eversholt/files/i386/i86pc/gcpu_amd.esc @@ -20,7 +20,7 @@ */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -76,13 +76,8 @@ #define PAGE_SB_COUNT 3 #define PAGE_SB_TIME 24h -fru chip; - #define CSPATH chip/memory-controller/dram-channel/chip-select -asru chip/cpu; -asru CSPATH; - /* * ADDR_VALID is true if the ereport payload includes IA32_MCi_ADDR. */ @@ -103,7 +98,7 @@ event ereport.cpu.generic-x86.mem_ce@chip/cpu { within(1s) }; event ereport.cpu.generic-x86.mem_ue@chip/cpu { within(1s) }; /* - * ========= Propogations for correctable page faults ============ + * ========= Propogations for correctable memory faults ========== * | | * | Discard mem_ce with no resource in the ereport payload. | * | Discard mem_ce with no address info - we can't fault the | @@ -112,7 +107,7 @@ event ereport.cpu.generic-x86.mem_ue@chip/cpu { within(1s) }; * | For a mem_ce ereport detected by a given chip/cpu (as per | * | the payload detector info) whose resource payload member | * | includes a chip/memory-controller/dram-channel/chip-select | - * | (CSPATH) for the same chip number, diagnose to an upset event | + * | (CSPATH) for the same chip number, diagnose to an fault event | * | associated with a per-CSPATH SERD engine as long as we are | * | below the page fault limit for this CSPATH (defined below); | * | if we are over that limit then discard the event since we | @@ -125,210 +120,64 @@ event ereport.cpu.generic-x86.mem_ue@chip/cpu { within(1s) }; * | the trip, and increment a per-CSPATH counter to count page | * | faults on that chip-select from repeated correctable errors. | * | | - * | A mem_ue ereport produces an immediate page_ue fault. | + * | A dimm_ce fault is diagnosed when we have faulted an | + * | excessive number of page_ce faults on a chip-select - more | + * | than CE_DIMMSB_THRESH. | * |===============================================================| */ -/* Counter for page faults diagnosed on a chip-select */ -engine stat.cepgflt@CSPATH; - #define CS_PGFLT_LIMIT_REACHED (count(stat.cepgflt@CSPATH) > CS_PAGEFLT_MAX) +#define CS_DIMMSB_THRESH_REACHED \ + (count(stat.cepgflt@CSPATH) >= CS_DIMMSB_THRESH) -/* Page fault event for repeated correctable errors */ +engine stat.cepgflt@CSPATH; +engine serd.memory.generic-x86.page_ce@CSPATH, N=PAGE_SB_COUNT, T=PAGE_SB_TIME; event fault.memory.generic-x86.page_ce@CSPATH, - FITrate=1000, /* meaningless */ - message=0, /* do not message individual pageflts */ - ASRU=CSPATH, + message=0, response=0, /* do not message individual pageflts */ count=stat.cepgflt@CSPATH, /* increment on pageflt diagnosis */ - action=confcall("rewrite-ASRU"); /* identify page in chip-select */ - -/* Upset to diagnose correctable ereports to */ -event upset.memory.generic-x86.page_ce@CSPATH, engine=serd.memory.generic-x86.page_ce@CSPATH; +engine serd.memory.generic-x86.dimm_ce@CSPATH, N=PAGE_SB_COUNT, T=PAGE_SB_TIME; +event fault.memory.generic-x86.dimm_ce@CSPATH, + engine=serd.memory.generic-x86.dimm_ce@CSPATH; -/* Synthetic ereport generated when page_ce SERD engine trips */ -event ereport.memory.generic-x86.page_ce_trip@CSPATH { within(1s) }; - -/* SERD engine for each chip-select */ -engine serd.memory.generic-x86.page_ce@CSPATH, - N=PAGE_SB_COUNT, T=PAGE_SB_TIME, - method=persistent, - trip=ereport.memory.generic-x86.page_ce_trip@CSPATH; +prop fault.memory.generic-x86.page_ce@CSPATH + { ADDR_VALID && CONTAINS_CS && !CS_PGFLT_LIMIT_REACHED && SET_ADDR } (1)-> + ereport.cpu.generic-x86.mem_ce@chip/cpu; -/* Upset to discard events to when we're over limit */ -event upset.memory.generic-x86.overpgfltlimit@CSPATH; +prop fault.memory.generic-x86.dimm_ce@CSPATH + { ADDR_VALID && CONTAINS_CS && CS_DIMMSB_THRESH_REACHED } (1)-> + ereport.cpu.generic-x86.mem_ce@chip/cpu; -/* - * Discard ereports with no resource or no address info - */ event upset.memory.generic-x86.discard@chip/cpu; prop upset.memory.generic-x86.discard@chip/cpu { !payloadprop_defined("resource") || !ADDR_VALID } (1)-> ereport.cpu.generic-x86.mem_ce@chip/cpu; /* - * For as long as we are below the page fault limit diagnose correctable ereport - * observations as upsets to feed the SERD engine. - */ -prop upset.memory.generic-x86.page_ce@CSPATH - { ADDR_VALID && CONTAINS_CS && !CS_PGFLT_LIMIT_REACHED } (0)-> - ereport.cpu.generic-x86.mem_ce@chip/cpu; - -/* - * Discard ereports if we are above the page fault limit on this chip-select, - */ -prop upset.memory.generic-x86.overpgfltlimit@CSPATH - { ADDR_VALID && CONTAINS_CS && CS_PGFLT_LIMIT_REACHED } (1)-> - ereport.cpu.generic-x86.mem_ce@chip/cpu; - -/* Diagnose a page fault when the pagefault SERD engine trips */ -prop fault.memory.generic-x86.page_ce@CSPATH (1)-> - ereport.memory.generic-x86.page_ce_trip@CSPATH; - -/* Include address info in the page fault diagnosed, for rewrite-ASRU */ -prop fault.memory.generic-x86.page_ce@CSPATH - { ADDR_VALID && CONTAINS_CS && SET_ADDR } (0)-> - ereport.cpu.generic-x86.mem_ce@chip/cpu; - -/* - * ========= Propogations for correctable DIMM faults ============ - * | | - * | A dimm_ce fault is diagnosed when we have faulted an | - * | excessive number of page_ce faults on a chip-select - more | - * | than CE_DIMMSB_THRESH. | - * | | - * | A dimm_ue fault is diagnosed on the first uncorrectable | - * | ereport from a chip-select. | - * |===============================================================| - */ - -/* DIMM fault event for CE failures */ -event fault.memory.generic-x86.dimm_ce@CSPATH, - ASRU=CSPATH, - FITrate=1000, /* meaningless */ - action=confcall("rewrite-ASRU"); /* rewrite in "mem" FMRI scheme */ - -#define CS_DIMMSB_THRESH_REACHED \ - (count(stat.cepgflt@CSPATH) == CS_DIMMSB_THRESH) - -/* - * This upset is diagnosed in parallel with upset.memory.generic-x86.page_ce - * on the CSPATH, and the associated SERD engine has the same parameters - * as serd.memory.generic-x86.page_ce@CSPATH so they fire at the same time. - * When this one fires we check whether we have reached the diagnosis - * threshold for a dimm_ce. - */ -event upset.memory.generic-x86.dimm_ce@CSPATH, - engine=serd.memory.generic-x86.dimm_ce_limitchk@CSPATH; - -event ereport.memory.generic-x86.dimm_ce_limitchk@CSPATH { within(1s) }; - -engine serd.memory.generic-x86.dimm_ce_limitchk@CSPATH, - N=PAGE_SB_COUNT, T=PAGE_SB_TIME, - method=persistent, - trip=ereport.memory.generic-x86.dimm_ce_limitchk@CSPATH; - -prop upset.memory.generic-x86.dimm_ce@CSPATH - { ADDR_VALID && CONTAINS_CS } (0)-> - ereport.cpu.generic-x86.mem_ce@chip/cpu; - -prop fault.memory.generic-x86.dimm_ce@CSPATH - { CS_DIMMSB_THRESH_REACHED } (0)-> - ereport.memory.generic-x86.dimm_ce_limitchk@CSPATH; - -event upset.memory.generic-x86.discard2@CSPATH; -prop upset.memory.generic-x86.discard2@CSPATH - { !CS_DIMMSB_THRESH_REACHED } (0)-> - ereport.memory.generic-x86.dimm_ce_limitchk@CSPATH; - -/* * ========= Propogations for uncorrectable page faults ========== * | | - * | A UE produces an immediate page fault. But we also want a | - * | corresponding dimm fault and since we do not like multi-entry | - * | suspect lists we arrange two distinct fault management | - * | exercises by diagnosing a mem_ue to two upset events that | - * | feed instant-trip SERD engines. Yuck. | + * | A UE produces an immediate page fault. * |===============================================================| */ -/* Page fault event for uncorrectable errors */ event fault.memory.generic-x86.page_ue@CSPATH, - FITrate=1000, /* meaningless */ - message=0, /* do not message individual pageflts */ - count=stat.cepgflt@CSPATH, /* increment on pageflt diagnosis */ - action=confcall("rewrite-ASRU"); /* identify page in chip-select */ + message=0, response=0, /* do not message individual pageflts */ + count=stat.cepgflt@CSPATH; /* increment on pageflt diagnosis */ +event fault.memory.generic-x86.dimm_ue@CSPATH; -/* Upset for page fault */ -event upset.memory.generic-x86.page_ue@CSPATH, - engine=serd.memory.generic-x86.page_ue@CSPATH; - -/* Synthetic erport generated when the page_ue SERD engine trips */ -event ereport.memory.generic-x86.page_ue_trip@CSPATH { within(1s) }; +prop fault.memory.generic-x86.page_ue@CSPATH + { ADDR_VALID && CONTAINS_CS && SET_ADDR } (1)-> + ereport.cpu.generic-x86.mem_ue@chip/cpu; -/* Instant-trip engine for page fault */ -engine serd.memory.generic-x86.page_ue@CSPATH, - N=0, T=1h, /* trip on first upset */ - method=persistent, - trip=ereport.memory.generic-x86.page_ue_trip@CSPATH; +prop fault.memory.generic-x86.dimm_ue@CSPATH + { ADDR_VALID && CONTAINS_CS } (1)-> + ereport.cpu.generic-x86.mem_ue@chip/cpu; -/* Discard events with no address info */ event upset.memory.generic-x86.discard3@CSPATH; prop upset.memory.generic-x86.discard3@CSPATH { !payloadprop_defined("resource") || !ADDR_VALID } (1)-> ereport.cpu.generic-x86.mem_ue@chip/cpu; -/* Diagnose a page_ue upset on a mem_ue event */ -prop upset.memory.generic-x86.page_ue@CSPATH - { ADDR_VALID && CONTAINS_CS } (0)-> - ereport.cpu.generic-x86.mem_ue@chip/cpu; - -/* On the immediate SERD trip diagnose a page fault */ -prop fault.memory.generic-x86.page_ue@CSPATH (1)-> - ereport.memory.generic-x86.page_ue_trip@CSPATH; - -/* Include address info in the page fault diagnosed, for rewrite-ASRU */ -prop fault.memory.generic-x86.page_ue@CSPATH - { ADDR_VALID && CONTAINS_CS && SET_ADDR } (0)-> - ereport.cpu.generic-x86.mem_ue@chip/cpu; - -/* - * ========= Propogations for uncorrectable dimm faults ========== - * | | - * | A UE produces an immediate dimm fault. As explained in the | - * | page_ue block comment above we split the exercise in two in | - * | order to produce independent page_ue and dimm_ue diagnoses. | - * |===============================================================| - */ - -/* Dimm fault for an uncorrectable error */ -event fault.memory.generic-x86.dimm_ue@CSPATH, - ASRU=CSPATH, - FITrate=1000, /* meaningless */ - action=confcall("rewrite-ASRU"); /* rewrite in "mem" FMRI scheme */ - -/* Upset for dimm fault */ -event upset.memory.generic-x86.dimm_ue@CSPATH, - engine=serd.memory.generic-x86.dimm_ue@CSPATH; - -/* Sythetic ereport generated when the dimm_ue SERD engine trips */ -event ereport.memory.generic-x86.dimm_ue_trip@CSPATH { within(1s) }; - -/* Instant-trip engine for dimm fault */ -engine serd.memory.generic-x86.dimm_ue@CSPATH, - N=0, T=1h, /* trip on first upset */ - method=persistent, - trip=ereport.memory.generic-x86.dimm_ue_trip@CSPATH; - -/* Diagnose a dimm_ue upset on a mem_ue event (in addition to page_ue upset) */ -prop upset.memory.generic-x86.dimm_ue@CSPATH - { CONTAINS_CS } (0)-> - ereport.cpu.generic-x86.mem_ue@chip/cpu; - -/* On the immediate SERD trip diagnose a dimm fault */ -prop fault.memory.generic-x86.dimm_ue@CSPATH (1)-> - ereport.memory.generic-x86.dimm_ue_trip@CSPATH; - /* * ========= Propogations for GART Table Walk Errors ============= * | | diff --git a/usr/src/cmd/fm/eversholt/files/i386/i86pc/intel.esc b/usr/src/cmd/fm/eversholt/files/i386/i86pc/intel.esc index 6f180e4905..20bd5556ce 100644 --- a/usr/src/cmd/fm/eversholt/files/i386/i86pc/intel.esc +++ b/usr/src/cmd/fm/eversholt/files/i386/i86pc/intel.esc @@ -32,12 +32,6 @@ * Eversholt rules for the intel CPU/Memory */ -/* CPU errors detected through MCA */ - -fru motherboard/chip; - -asru motherboard/chip/cpu; - /* * Ereports for Simple error codes. */ @@ -60,42 +54,11 @@ SMPL_EVENT(internal_unclassified, 1s); * trips. */ -/* Simple fault event */ -event fault.cpu.intel.internal@chip/cpu, - ASRU=motherboard/chip/cpu, FRU=motherboard/chip, - FITrate=1000; - -/* Produced when the correctable engine trips */ -event ereport.cpu.intel.simple_trip@chip/cpu { within(1s) }; +engine serd.cpu.intel.simple@chip/cpu, N=3, T=72h; +event fault.cpu.intel.internal@chip/cpu, engine=serd.cpu.intel.simple@chip/cpu; -/* Upset to diagnose corrected events to */ -event upset.cpu.intel.simple@chip/cpu - engine=serd.cpu.intel.simple@chip/cpu; - -/* SERD engine for corrected simple errors */ -engine serd.cpu.intel.simple@chip/cpu, - N=3, T=72h, method=persistent, - trip=ereport.cpu.intel.simple_trip@chip/cpu; - -#define STATUS_UC \ - (payloadprop("error_uncorrected") + 0 == 1) - -/* Diagnose corrected events to upsets */ -prop upset.cpu.intel.simple@chip/cpu - { !STATUS_UC } (1)-> - ereport.cpu.intel.microcode_rom_parity@chip/cpu, - ereport.cpu.intel.internal_timer@chip/cpu, - ereport.cpu.intel.unclassified@chip/cpu, - ereport.cpu.intel.internal_unclassified@chip/cpu, - ereport.cpu.intel.frc@chip/cpu; - -/* When the correctable engine trips, diagnose a fault */ -prop fault.cpu.intel.internal@chip/cpu (0)-> - ereport.cpu.intel.simple_trip@chip/cpu; - -/* Diagnose uncorrected events to faults */ prop fault.cpu.intel.internal@chip/cpu - { STATUS_UC } (0)-> + { payloadprop("error_uncorrected") == 1 ? setserdincrement(4) : 1} (0)-> ereport.cpu.intel.microcode_rom_parity@chip/cpu, ereport.cpu.intel.internal_timer@chip/cpu, ereport.cpu.intel.unclassified@chip/cpu, @@ -171,68 +134,30 @@ CMPND_EVENT(bus_interconnect_io, 1s); * error. */ -#define CMPND_FLT_PROP_1(erptleaf, fltleaf, n, t) \ - /* Declare the fault that we can diagnose here */ \ - event fault.cpu.intel.fltleaf@chip/cpu, \ - FITrate=1000, \ - FRU=motherboard/chip, \ - ASRU=motherboard/chip/cpu; \ - \ - /* Produced when the correctable engine trips */ \ - event ereport.cpu.intel.fltleaf/**/_error@chip/cpu { within(1s) }; \ +#define CMPND_FLT_PROP_1(erptleaf, fltleaf, n, t) \ + engine serd.cpu.intel.fltleaf@chip/cpu, N=n, T=t; \ + event fault.cpu.intel.fltleaf@chip/cpu, \ + engine=serd.cpu.intel.fltleaf@chip/cpu; \ \ - /* Upset to diagnose corrected events to */ \ - event upset.cpu.intel.fltleaf@chip/cpu, \ - engine=serd.cpu.intel.fltleaf@chip/cpu; \ - \ - /* SERD engine for corrected events */ \ - engine serd.cpu.intel.fltleaf@chip/cpu, \ - N=n, T=t, method=persistent, \ - trip=ereport.cpu.intel.fltleaf/**/_error@chip/cpu; \ - \ - /* Diagnose corrected events to the corresponding upset */ \ - prop upset.cpu.intel.fltleaf@chip/cpu (1)-> \ + prop fault.cpu.intel.fltleaf@chip/cpu (0)-> \ ereport.cpu.intel.erptleaf@chip/cpu; \ \ - /* When the engine trip, diagnose a fault */ \ - prop fault.cpu.intel.fltleaf@chip/cpu (0)-> \ - ereport.cpu.intel.fltleaf/**/_error@chip/cpu; \ - \ - /* Produce immediate faults for uncorrected errors */ \ - prop fault.cpu.intel.fltleaf@chip/cpu (0)-> \ + prop fault.cpu.intel.fltleaf@chip/cpu \ + { setserdincrement(n + 1) } (0)-> \ ereport.cpu.intel.erptleaf/**/_uc@chip/cpu -#define CMPND_FLT_PROP_2(erptleaf, fltleaf, n, t) \ - /* Declare the fault that we can diagnose here */ \ - event fault.cpu.intel.fltleaf@chip/cpu, \ - FITrate=1, \ - ASRU=motherboard/chip/cpu; \ - \ - /* Produced when the correctable engine trips */ \ - event ereport.cpu.intel.fltleaf/**/_error@chip/cpu { within(1s) }; \ +#define CMPND_FLT_PROP_2(erptleaf, fltleaf, n, t) \ + engine serd.cpu.intel.fltleaf@chip/cpu, N=n, T=t; \ + event fault.cpu.intel.fltleaf@chip/cpu, retire=0, response=0, \ + engine=serd.cpu.intel.fltleaf@chip/cpu; \ \ - /* Upset to diagnose corrected events to */ \ - event upset.cpu.intel.fltleaf@chip/cpu, \ - engine=serd.cpu.intel.fltleaf@chip/cpu; \ - \ - /* SERD engine for corrected events */ \ - engine serd.cpu.intel.fltleaf@chip/cpu, \ - N=n, T=t, method=persistent, \ - trip=ereport.cpu.intel.fltleaf/**/_error@chip/cpu; \ - \ - /* Diagnose corrected events to the corresponding upset */ \ - prop upset.cpu.intel.fltleaf@chip/cpu (1)-> \ + prop fault.cpu.intel.fltleaf@chip/cpu (0)-> \ ereport.cpu.intel.erptleaf@chip/cpu; \ \ - /* When the engine trip, diagnose a fault */ \ - prop fault.cpu.intel.fltleaf@chip/cpu (0)-> \ - ereport.cpu.intel.fltleaf/**/_error@chip/cpu; \ - \ - /* Produce immediate faults for uncorrected errors */ \ - prop fault.cpu.intel.fltleaf@chip/cpu (0)-> \ + prop fault.cpu.intel.fltleaf@chip/cpu \ + { setserdincrement(n + 1) } (0)-> \ ereport.cpu.intel.erptleaf/**/_uc@chip/cpu - CMPND_FLT_PROP_1(l0cache, l0cache, 3, 72h); CMPND_FLT_PROP_1(l1cache, l1cache, 3, 72h); CMPND_FLT_PROP_1(l2cache, l2cache, 3, 72h); @@ -279,9 +204,7 @@ prop upset.discard@chip/cpu (0)-> /* * SET_ADDR and SET_OFFSET are used to set a payload value in the fault that * we diagnose for page faults, to record the physical address of the faulting - * page. The "asru-" prefix is hooked in the "rewrite-ASRU" confcalls made on - * diagnosis of associated faults when the libtopo mem scheme rewrites the - * asru in "mem" scheme. + * page. */ #define SET_ADDR (!payloadprop_defined("physaddr") || \ setpayloadprop("asru-physaddr", payloadprop("physaddr"))) @@ -289,393 +212,204 @@ prop upset.discard@chip/cpu (0)-> #define SET_OFFSET (!payloadprop_defined("offset") || \ setpayloadprop("asru-offset", payloadprop("offset"))) -#define CE_PGFLTS \ - (count(stat.ce_pgflt@motherboard/memory-controller/dram-channel/dimm)) -#define UE_DIMM \ - (count(stat.ue_dimm@motherboard/memory-controller/dram-channel/dimm)) +engine stat.ce_pgflt@memory-controller/dram-channel/dimm; -#define PAGE_FIT 1 -#define PAGE_CE_COUNT 2 -#define PAGE_CE_TIME 72h - -fru motherboard; -asru motherboard; -fru motherboard/memory-controller/dram-channel; -asru motherboard/memory-controller/dram-channel; -fru motherboard/memory-controller/dram-channel/dimm; -asru motherboard/memory-controller/dram-channel/dimm; -asru motherboard/memory-controller/dram-channel/dimm/rank; -asru motherboard/chip; - -engine stat.ce_pgflt@motherboard/memory-controller/dram-channel/dimm; -engine stat.ue_dimm@motherboard/memory-controller/dram-channel/dimm; - -event ereport.cpu.intel.nb.mem_ue@motherboard/memory-controller{within(12s)}; -event ereport.cpu.intel.nb.fbd.ma@motherboard/memory-controller{within(12s)}; -event fault.memory.intel.page_ue@ - motherboard/memory-controller/dram-channel/dimm/rank, - FITrate=PAGE_FIT, - FRU=motherboard/memory-controller/dram-channel/dimm, - ASRU=motherboard/memory-controller/dram-channel/dimm/rank, message=0, - action=confcall("rewrite-ASRU"); /* rewrite ASRU to identify page in rank */ -event ereport.memory.page_ue_trip@motherboard/memory-controller{within(12s)}; -engine serd.memory.intel.page_ue@motherboard/memory-controller, - N=0, T=1h, method=persistent, - trip=ereport.memory.page_ue_trip@motherboard/memory-controller; -event upset.memory.intel.page_ue@motherboard/memory-controller, - engine=serd.memory.intel.page_ue@motherboard/memory-controller; - -prop upset.memory.intel.page_ue@motherboard/memory-controller (0)-> - ereport.cpu.intel.bus_interconnect_memory_uc@chip/cpu, - ereport.cpu.intel.bus_interconnect_uc@chip/cpu, - ereport.cpu.intel.bus_interconnect_memory@chip/cpu, - ereport.cpu.intel.bus_interconnect@chip/cpu, - ereport.cpu.intel.external@chip/cpu; - -prop upset.memory.intel.page_ue@motherboard/memory-controller (1)-> - ereport.cpu.intel.nb.mem_ue@motherboard/memory-controller, - ereport.cpu.intel.nb.fbd.ma@motherboard/memory-controller; +event ereport.cpu.intel.nb.mem_ue@memory-controller{within(12s)}; +event ereport.cpu.intel.nb.fbd.ma@memory-controller{within(12s)}; +event fault.memory.intel.page_ue@memory-controller/dram-channel/dimm/rank, + message=0, response=0; +event fault.memory.intel.dimm_ue@memory-controller/dram-channel/dimm/rank; prop fault.memory.intel.page_ue@ - motherboard/memory-controller/dram-channel/dimm/rank[rank_num] - { UE_DIMM > 0 && payloadprop_defined("rank") && - rank_num == payloadprop("rank") && + memory-controller/dram-channel/dimm/rank[rank_num] + { payloadprop_defined("rank") && rank_num == payloadprop("rank") && (payloadprop_defined("physaddr") || payloadprop_defined("offset")) && SET_ADDR && SET_OFFSET } (1)-> - ereport.cpu.intel.nb.mem_ue@motherboard/memory-controller, - ereport.cpu.intel.nb.fbd.ma@motherboard/memory-controller; - -prop fault.memory.intel.page_ue@ - motherboard/memory-controller/dram-channel/dimm/rank (1)-> - ereport.memory.page_ue_trip@motherboard/memory-controller; + ereport.cpu.intel.nb.mem_ue@memory-controller, + ereport.cpu.intel.nb.fbd.ma@memory-controller; -event upset.memory.intel.discard@motherboard/memory-controller{within(1s)}; +prop fault.memory.intel.page_ue@memory-controller/dram-channel/dimm/rank (1)-> + ereport.cpu.intel.nb.mem_ue@memory-controller, + ereport.cpu.intel.nb.fbd.ma@memory-controller; -prop upset.memory.intel.discard@motherboard/memory-controller - { !payloadprop_defined("rank") || (!payloadprop_defined("physaddr") && - !payloadprop_defined("offset")) } (1)-> - ereport.cpu.intel.nb.mem_ue@motherboard/memory-controller, - ereport.cpu.intel.nb.fbd.ma@motherboard/memory-controller; - -prop upset.memory.intel.discard@motherboard/memory-controller (0)-> - ereport.memory.page_ue_trip@motherboard/memory-controller, +prop fault.memory.intel.page_ue@memory-controller/dram-channel/dimm/rank (0)-> ereport.cpu.intel.bus_interconnect_memory_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_memory@chip/cpu, ereport.cpu.intel.bus_interconnect@chip/cpu, ereport.cpu.intel.external@chip/cpu; -#define DIMM_UE_FIT 1000 - -event fault.memory.intel.dimm_ue@ - motherboard/memory-controller/dram-channel/dimm/rank, - FITrate=DIMM_UE_FIT, FRU=motherboard/memory-controller/dram-channel/dimm, - ASRU=motherboard/memory-controller/dram-channel/dimm/rank, - count=stat.dimm_flt@motherboard/memory-controller/dram-channel/dimm, - action=confcall("rewrite-ASRU"); /* rewrite non-leaf ASRU in mem scheme */ -event ereport.memory.dimm_ue_trip@motherboard/memory-controller{within(12s)}; -engine serd.memory.intel.dimm_ue@motherboard/memory-controller, - N=0, T=1h, method=persistent, - trip=ereport.memory.dimm_ue_trip@motherboard/memory-controller; -event upset.memory.intel.dimm_ue@motherboard/memory-controller, - engine=serd.memory.intel.dimm_ue@motherboard/memory-controller; - -prop upset.memory.intel.dimm_ue@ motherboard/memory-controller (1)-> - ereport.cpu.intel.nb.mem_ue@motherboard/memory-controller, - ereport.cpu.intel.nb.fbd.ma@motherboard/memory-controller; - prop fault.memory.intel.dimm_ue@ - motherboard/memory-controller/dram-channel<channel_num>/dimm/rank[rank_num] + memory-controller/dram-channel<channel_num>/dimm/rank[rank_num] { payloadprop_defined("rank") && rank_num == payloadprop("rank") } (1)-> - ereport.cpu.intel.nb.mem_ue@motherboard/memory-controller, - ereport.cpu.intel.nb.fbd.ma@motherboard/memory-controller; + ereport.cpu.intel.nb.mem_ue@memory-controller, + ereport.cpu.intel.nb.fbd.ma@memory-controller; -prop upset.memory.intel.dimm_ue@ - motherboard/memory-controller (0)-> - ereport.cpu.intel.bus_interconnect_memory_uc@chip/cpu, - ereport.cpu.intel.bus_interconnect_uc@chip/cpu, - ereport.cpu.intel.bus_interconnect_memory@chip/cpu, - ereport.cpu.intel.bus_interconnect@chip/cpu, - ereport.cpu.intel.external@chip/cpu; +prop fault.memory.intel.dimm_ue@memory-controller/dram-channel/dimm/rank (1)-> + ereport.cpu.intel.nb.mem_ue@memory-controller, + ereport.cpu.intel.nb.fbd.ma@memory-controller; -prop fault.memory.intel.dimm_ue@ - motherboard/memory-controller/dram-channel/dimm/rank (0)-> +prop fault.memory.intel.dimm_ue@memory-controller/dram-channel/dimm/rank (0)-> ereport.cpu.intel.bus_interconnect_memory_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_memory@chip/cpu, ereport.cpu.intel.bus_interconnect@chip/cpu, ereport.cpu.intel.external@chip/cpu; -prop fault.memory.intel.dimm_ue@ - motherboard/memory-controller/dram-channel/dimm/rank (1)-> - ereport.memory.dimm_ue_trip@motherboard/memory-controller; - -event upset.memory.intel.discard1@motherboard/memory-controller{within(1s)}; +event upset.memory.intel.discard@memory-controller{within(1s)}; -prop upset.memory.intel.discard1@motherboard/memory-controller +prop upset.memory.intel.discard@memory-controller { !payloadprop_defined("rank") } (1)-> - ereport.cpu.intel.nb.mem_ue@motherboard/memory-controller, - ereport.cpu.intel.nb.fbd.ma@motherboard/memory-controller; + ereport.cpu.intel.nb.mem_ue@memory-controller, + ereport.cpu.intel.nb.fbd.ma@memory-controller; -prop upset.memory.intel.discard1@motherboard/memory-controller (0)-> - ereport.memory.dimm_ue_trip@motherboard/memory-controller, +prop upset.memory.intel.discard@memory-controller (0)-> ereport.cpu.intel.bus_interconnect_memory_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_memory@chip/cpu, ereport.cpu.intel.bus_interconnect@chip/cpu, ereport.cpu.intel.external@chip/cpu; -event ereport.memory.intel.page_trip@ - motherboard/memory-controller/dram-channel/dimm/rank{within(12s)}; -event ereport.cpu.intel.nb.mem_ce@ - motherboard/memory-controller/dram-channel/dimm/rank{within(12s)}; - -engine serd.memory.intel.page_ce@ - motherboard/memory-controller/dram-channel/dimm/rank, - N=PAGE_CE_COUNT, T=PAGE_CE_TIME, method=persistent, - trip=ereport.memory.intel.page_trip@ - motherboard/memory-controller/dram-channel/dimm/rank; -event upset.memory.intel.page_ce@ - motherboard/memory-controller/dram-channel/dimm/rank, - engine=serd.memory.intel.page_ce@ - motherboard/memory-controller/dram-channel/dimm/rank; - -event fault.memory.intel.page_ce@ - motherboard/memory-controller/dram-channel/dimm/rank, - FITrate=PAGE_FIT, - FRU=motherboard/memory-controller/dram-channel/dimm, - ASRU=motherboard/memory-controller/dram-channel/dimm/rank, message=0, - count=stat.ce_pgflt@motherboard/memory-controller/dram-channel/dimm, - action=confcall("rewrite-ASRU"); /* rewrite ASRU to identify page in rank */ - -prop fault.memory.intel.page_ce@ - motherboard/memory-controller/dram-channel/dimm/rank (1)-> - ereport.memory.intel.page_trip@ - motherboard/memory-controller/dram-channel/dimm/rank; - -prop fault.memory.intel.page_ce@ - motherboard/memory-controller/dram-channel/dimm/rank - { (payloadprop_defined("physaddr") || payloadprop_defined("offset")) && - SET_ADDR && SET_OFFSET } (0)-> - ereport.cpu.intel.nb.mem_ce@ - motherboard/memory-controller/dram-channel/dimm/rank; - -prop upset.memory.intel.page_ce@ - motherboard/memory-controller/dram-channel/dimm/rank - { (payloadprop_defined("physaddr") || payloadprop_defined("offset")) && - SET_ADDR && SET_OFFSET } (1)-> - ereport.cpu.intel.nb.mem_ce@ - motherboard/memory-controller/dram-channel/dimm/rank; - -#define DIMM_CE_FIT 2000 +#define PAGE_CE_COUNT 2 +#define PAGE_CE_TIME 72h #define DIMM_CE_COUNT 10 #define DIMM_CE_TIME 1week -event fault.memory.intel.dimm_ce@ - motherboard/memory-controller/dram-channel/dimm/rank, - FITrate=DIMM_CE_FIT, FRU=motherboard/memory-controller/dram-channel/dimm, - ASRU=motherboard/memory-controller/dram-channel/dimm/rank, - action=confcall("rewrite-ASRU"); /* rewrite non-leaf ASRU in mem scheme */ -event upset.memory.discard@motherboard/memory-controller/dram-channel/dimm/rank; - -event ereport.memory.intel.dimm_trip@ - motherboard/memory-controller/dram-channel/dimm/rank{within(1s)}; -#define DIMM_CE(label, dimm_size, n, t, fault_rate) \ - engine serd.memory.intel.dimm_ce.label/**/@ \ - motherboard/memory-controller/dram-channel/dimm/rank, \ - N=n, T=t, method=persistent, \ - trip=ereport.memory.intel.dimm_trip@ \ - motherboard/memory-controller/dram-channel/dimm/rank; \ - event upset.memory.intel.dimm_ce.label/**/@ \ - motherboard/memory-controller/dram-channel/dimm/rank, \ - engine=serd.memory.intel.dimm_ce.label/**/@ \ - motherboard/memory-controller/dram-channel/dimm/rank; \ - prop upset.memory.intel.dimm_ce.label/**/@ \ - motherboard/memory-controller/dram-channel/dimm/rank \ - {confprop_defined( \ - fru(motherboard/memory-controller/dram-channel/dimm), \ - "dimm-size") && \ - confprop(fru(motherboard/memory-controller/dram-channel/dimm), \ - "dimm-size") == dimm_size && CE_PGFLTS > fault_rate} (1)-> \ - ereport.cpu.intel.nb.mem_ce@ \ - motherboard/memory-controller/dram-channel/dimm/rank; - -DIMM_CE(eight_g, "8G", 8, 1week, 2000) -DIMM_CE(four_g, "4G", 4, 1week, 1500) -DIMM_CE(two_g, "2G", 4, 2week, 1000) -DIMM_CE(one_g, "1G", 4, 4week, 500) -DIMM_CE(half_g, "512M", 4, 8week, 250) -DIMM_CE(quarter_g, "256M", 4, 16week, 125) - -engine serd.memory.intel.dimm_ce@ - motherboard/memory-controller/dram-channel/dimm/rank, - N=DIMM_CE_COUNT, T=DIMM_CE_TIME, method=persistent, - trip=ereport.memory.intel.dimm_trip@ - motherboard/memory-controller/dram-channel/dimm/rank; -event upset.memory.intel.dimm_ce@ - motherboard/memory-controller/dram-channel/dimm/rank, - engine=serd.memory.intel.dimm_ce@ - motherboard/memory-controller/dram-channel/dimm/rank; -prop upset.memory.intel.dimm_ce@ - motherboard/memory-controller/dram-channel/dimm/rank - {!confprop_defined(fru(motherboard/memory-controller/dram-channel/dimm), - "dimm-size") && CE_PGFLTS > 512} (1)-> - ereport.cpu.intel.nb.mem_ce@ - motherboard/memory-controller/dram-channel/dimm/rank; - -prop fault.memory.intel.dimm_ce@ - motherboard/memory-controller/dram-channel/dimm/rank (1)-> - ereport.memory.intel.dimm_trip@ - motherboard/memory-controller/dram-channel/dimm/rank; - -prop upset.memory.discard@ - motherboard/memory-controller/dram-channel/dimm/rank (1)-> - ereport.memory.intel.dimm_trip@ - motherboard/memory-controller/dram-channel/dimm/rank; - -event ereport.cpu.intel.nb.fbd.alert@ - motherboard/memory-controller/dram-channel/dimm/rank{within(12s)}; -event fault.memory.intel.fbd.alert@ - motherboard/memory-controller/dram-channel/dimm/rank, - FITrate=100, ASRU=motherboard/memory-controller/dram-channel/dimm/rank, - FRU=motherboard/memory-controller/dram-channel/dimm; - -prop fault.memory.intel.fbd.alert@ - motherboard/memory-controller/dram-channel/dimm/rank (1)-> - ereport.cpu.intel.nb.fbd.alert@ - motherboard/memory-controller/dram-channel/dimm/rank; - -prop fault.memory.intel.fbd.alert@ - motherboard/memory-controller/dram-channel/dimm/rank (0)-> +event ereport.cpu.intel.nb.mem_ce@dimm/rank{within(12s)}; + +engine serd.memory.intel.page_ce@dimm/rank, N=PAGE_CE_COUNT, T=PAGE_CE_TIME; +event fault.memory.intel.page_ce@dimm/rank, message=0, response=0, + count=stat.ce_pgflt@dimm, engine=serd.memory.intel.page_ce@dimm/rank; +prop fault.memory.intel.page_ce@dimm/rank + { (payloadprop_defined("physaddr") || payloadprop_defined("offset")) && + SET_ADDR && SET_OFFSET } (0)-> + ereport.cpu.intel.nb.mem_ce@dimm/rank; + +engine serd.memory.intel.dimm_ce@dimm/rank, N=DIMM_CE_COUNT, T=DIMM_CE_TIME; +event fault.memory.intel.dimm_ce@dimm/rank, + engine=serd.memory.intel.dimm_ce@dimm/rank; +event error.memory.intel.dimm_ce@dimm; +prop fault.memory.intel.dimm_ce@dimm/rank (1)-> + ereport.cpu.intel.nb.mem_ce@dimm/rank; +prop fault.memory.intel.dimm_ce@dimm/rank + { !confprop_defined(dimm, "dimm-size") } (1)-> + error.memory.intel.dimm_ce@dimm; +prop error.memory.intel.dimm_ce@dimm + { !confprop_defined(dimm, "dimm-size") && + count(stat.ce_pgflt@dimm) > 512 } (1)-> + ereport.cpu.intel.nb.mem_ce@dimm/rank; + +#define DIMM_CE(dimm_size, n, t, fault_rate) \ + prop fault.memory.intel.dimm_ce@dimm/rank { \ + confprop(dimm, "dimm-size") == dimm_size && \ + setserdn(n) & setserdt(t) } (1)-> \ + error.memory.intel.dimm_ce@dimm; \ + prop error.memory.intel.dimm_ce@dimm { \ + confprop(dimm, "dimm-size") == dimm_size && \ + count(stat.ce_pgflt@dimm) > fault_rate } (1)-> \ + ereport.cpu.intel.nb.mem_ce@dimm/rank; + +DIMM_CE("8G", 8, 1week, 2000) +DIMM_CE("4G", 4, 1week, 1500) +DIMM_CE("2G", 4, 2week, 1000) +DIMM_CE("1G", 4, 4week, 500) +DIMM_CE("512M", 4, 8week, 250) +DIMM_CE("256M", 4, 16week, 125) + +event ereport.cpu.intel.nb.fbd.alert@rank{within(12s)}; +event fault.memory.intel.fbd.alert@rank, retire=0; + +prop fault.memory.intel.fbd.alert@rank (1)-> + ereport.cpu.intel.nb.fbd.alert@rank; + +prop fault.memory.intel.fbd.alert@rank (0)-> ereport.cpu.intel.bus_interconnect_memory_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_memory@chip/cpu, ereport.cpu.intel.bus_interconnect@chip/cpu, ereport.cpu.intel.external@chip/cpu; -event ereport.cpu.intel.nb.fbd.crc@ - motherboard/memory-controller/dram-channel/dimm/rank{within(12s)}; -event fault.memory.intel.fbd.crc@ - motherboard/memory-controller/dram-channel/dimm/rank, - FITrate=100, ASRU=motherboard/memory-controller/dram-channel/dimm/rank, - FRU=motherboard/memory-controller/dram-channel/dimm; +event ereport.cpu.intel.nb.fbd.crc@rank{within(12s)}; +event fault.memory.intel.fbd.crc@rank, retire=0; -prop fault.memory.intel.fbd.crc@ - motherboard/memory-controller/dram-channel/dimm/rank (1)-> - ereport.cpu.intel.nb.fbd.crc@ - motherboard/memory-controller/dram-channel/dimm/rank; +prop fault.memory.intel.fbd.crc@rank (1)-> + ereport.cpu.intel.nb.fbd.crc@rank; -prop fault.memory.intel.fbd.crc@ - motherboard/memory-controller/dram-channel/dimm/rank (0)-> +prop fault.memory.intel.fbd.crc@rank (0)-> ereport.cpu.intel.bus_interconnect_memory_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_memory@chip/cpu, ereport.cpu.intel.bus_interconnect@chip/cpu, ereport.cpu.intel.external@chip/cpu; -event ereport.cpu.intel.nb.fbd.reset_timeout@motherboard/memory-controller - {within(12s)}; -event fault.memory.intel.fbd.reset_timeout@motherboard/memory-controller, - FITrate=1000, ASRU=motherboard/memory-controller/dram-channel/dimm, - FRU=motherboard/memory-controller/dram-channel/dimm; +event ereport.cpu.intel.nb.fbd.reset_timeout@memory-controller {within(12s)}; +event fault.memory.intel.fbd.reset_timeout@memory-controller, retire=0; -prop fault.memory.intel.fbd.reset_timeout@motherboard/memory-controller (1)-> - ereport.cpu.intel.nb.fbd.reset_timeout@motherboard/memory-controller; +prop fault.memory.intel.fbd.reset_timeout@memory-controller (1)-> + ereport.cpu.intel.nb.fbd.reset_timeout@memory-controller; -prop fault.memory.intel.fbd.reset_timeout@motherboard/memory-controller (0)-> +prop fault.memory.intel.fbd.reset_timeout@memory-controller (0)-> ereport.cpu.intel.bus_interconnect_memory_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_memory@chip/cpu, ereport.cpu.intel.bus_interconnect@chip/cpu, ereport.cpu.intel.external@chip/cpu; -event ereport.cpu.intel.nb.fbd.ch@motherboard/memory-controller/dram-channel - {within(12s)}; -event fault.memory.intel.fbd.ch@motherboard/memory-controller/dram-channel, - FITrate=100, ASRU=motherboard/memory-controller/dram-channel/dimm, - FRU=motherboard/memory-controller/dram-channel/dimm; -event upset.cpu.intel.nb.fbd.ch@motherboard/memory-controller/dram-channel, - engine=serd.cpu.intel.nb.fbd.ch@motherboard/memory-controller/dram-channel; -event ereport.cpu.intel.nb.fbd_ch@motherboard/memory-controller/dram-channel - {within(12s)}; - -engine serd.cpu.intel.nb.fbd.ch@motherboard/memory-controller/dram-channel, - N=2, T=1month, method=persistent, - trip=ereport.cpu.intel.nb.fbd_ch@motherboard/memory-controller/dram-channel; +event ereport.cpu.intel.nb.fbd.ch@dram-channel {within(12s)}; +engine serd.cpu.intel.nb.fbd.ch@dram-channel, N=2, T=1month; +event fault.memory.intel.fbd.ch@dram-channel, retire=0, + engine=serd.cpu.intel.nb.fbd.ch@dram-channel; -prop upset.cpu.intel.nb.fbd.ch@motherboard/memory-controller/dram-channel (1)-> - ereport.cpu.intel.nb.fbd.ch@motherboard/memory-controller/dram-channel; +prop fault.memory.intel.fbd.ch@dram-channel (1)-> + ereport.cpu.intel.nb.fbd.ch@dram-channel; -prop upset.cpu.intel.nb.fbd.ch@motherboard/memory-controller/dram-channel (0)-> +prop fault.memory.intel.fbd.ch@dram-channel (0)-> ereport.cpu.intel.bus_interconnect_memory_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_memory@chip/cpu, ereport.cpu.intel.bus_interconnect@chip/cpu, ereport.cpu.intel.external@chip/cpu; -prop fault.memory.intel.fbd.ch@ - motherboard/memory-controller/dram-channel (1)-> - ereport.cpu.intel.nb.fbd_ch@motherboard/memory-controller/dram-channel; +event ereport.cpu.intel.nb.fbd.otf@dram-channel {within(12s)}; +engine serd.cpu.intel.nb.fbd_otf@dram-channel, N=2, T=1week; +event fault.memory.intel.fbd.otf@dram-channel, retire=0, response=0, + engine=serd.cpu.intel.nb.fbd_otf@dram-channel; + +prop fault.memory.intel.fbd.otf@dram-channel (1)-> + ereport.cpu.intel.nb.fbd.otf@dram-channel; -event ereport.cpu.intel.nb.fbd.otf@motherboard/memory-controller/dram-channel - {within(12s)}; event ereport.cpu.intel.nb.otf@motherboard {within(12s)}; -event fault.memory.intel.fbd.otf@motherboard/memory-controller/dram-channel, - FITrate=100, ASRU=motherboard/memory-controller/dram-channel; -event fault.cpu.intel.nb.otf@motherboard, FITrate=100, ASRU=motherboard; -event upset.cpu.intel.nb.fbd_otf@motherboard/memory-controller/dram-channel, - engine=serd.cpu.intel.nb.fbd_otf@motherboard/memory-controller/dram-channel; -event ereport.cpu.intel.nb.fbd_otf@motherboard/memory-controller/dram-channel - {within(12s)}; - -engine serd.cpu.intel.nb.fbd_otf@motherboard/memory-controller/dram-channel, - N=2, T=1week, method=persistent, - trip=ereport.cpu.intel.nb.fbd_otf@ - motherboard/memory-controller/dram-channel; - -prop upset.cpu.intel.nb.fbd_otf@motherboard/memory-controller/dram-channel (1)-> - ereport.cpu.intel.nb.fbd.otf@motherboard/memory-controller/dram-channel; - -prop fault.memory.intel.fbd.otf@ - motherboard/memory-controller/dram-channel (1)-> - ereport.cpu.intel.nb.fbd_otf@motherboard/memory-controller/dram-channel; - -prop fault.cpu.intel.nb.otf@ motherboard (1)-> - ereport.cpu.intel.nb.otf@motherboard; +event fault.cpu.intel.nb.otf@motherboard, retire=0, response=0; -event ereport.cpu.intel.nb.unknown@motherboard/memory-controller {within(12s)}; -event ereport.cpu.intel.nb.unknown@motherboard/memory-controller/dram-channel - {within(12s)}; -event ereport.cpu.intel.nb.spd@motherboard/memory-controller/dram-channel - {within(12s)}; -event upset.discard@motherboard/memory-controller; +prop fault.cpu.intel.nb.otf@motherboard (1)-> + ereport.cpu.intel.nb.otf@motherboard; -prop upset.discard@motherboard/memory-controller (0)-> - ereport.cpu.intel.nb.unknown@motherboard/memory-controller, - ereport.cpu.intel.nb.unknown@motherboard/memory-controller/dram-channel, - ereport.cpu.intel.nb.spd@motherboard/memory-controller/dram-channel; +event ereport.cpu.intel.nb.unknown@memory-controller {within(12s)}; +event ereport.cpu.intel.nb.unknown@memory-controller/dram-channel {within(12s)}; +event ereport.cpu.intel.nb.spd@memory-controller/dram-channel {within(12s)}; +event upset.discard@memory-controller; -event ereport.cpu.intel.nb.mem_ds@motherboard/memory-controller{within(30s)}; +prop upset.discard@memory-controller (0)-> + ereport.cpu.intel.nb.unknown@memory-controller, + ereport.cpu.intel.nb.unknown@memory-controller/dram-channel, + ereport.cpu.intel.nb.spd@memory-controller/dram-channel; -event fault.memory.intel.fbd.mem_ds@ - motherboard/memory-controller/dram-channel/dimm/rank, - FITrate=DIMM_UE_FIT, - ASRU=motherboard/memory-controller/dram-channel/dimm/rank, - FRU=motherboard/memory-controller/dram-channel/dimm; +event ereport.cpu.intel.nb.mem_ds@memory-controller{within(30s)}; +event fault.memory.intel.fbd.mem_ds@memory-controller/dram-channel/dimm/rank, + retire=0; prop fault.memory.intel.fbd.mem_ds@ - motherboard/memory-controller/dram-channel/dimm/rank[rank_num] + memory-controller/dram-channel/dimm/rank[rank_num] { payloadprop_defined("rank") && rank_num == payloadprop("rank") } (1)-> - ereport.cpu.intel.nb.mem_ds@motherboard/memory-controller; + ereport.cpu.intel.nb.mem_ds@memory-controller; -event ereport.cpu.intel.nb.fsb@motherboard/chip{within(12s)}; -event fault.cpu.intel.nb.fsb@motherboard/chip, - FITrate=10000, ASRU=motherboard/chip, FRU=motherboard/chip; +event ereport.cpu.intel.nb.fsb@chip{within(12s)}; +event fault.cpu.intel.nb.fsb@chip, retire=0; -prop fault.cpu.intel.nb.fsb@motherboard/chip (1)-> - ereport.cpu.intel.nb.fsb@motherboard/chip; +prop fault.cpu.intel.nb.fsb@chip (1)-> + ereport.cpu.intel.nb.fsb@chip; -prop fault.cpu.intel.nb.fsb@motherboard/chip (0)-> +prop fault.cpu.intel.nb.fsb@chip (0)-> ereport.cpu.intel.bus_interconnect_memory_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_memory@chip/cpu, @@ -683,8 +417,7 @@ prop fault.cpu.intel.nb.fsb@motherboard/chip (0)-> ereport.cpu.intel.external@chip/cpu; event ereport.cpu.intel.nb.ie@motherboard{within(12s)}; -event fault.cpu.intel.nb.ie@motherboard, - FITrate=10000, ASRU=motherboard, FRU=motherboard; +event fault.cpu.intel.nb.ie@motherboard, retire=0; prop fault.cpu.intel.nb.ie@motherboard (1)-> ereport.cpu.intel.nb.ie@motherboard; @@ -697,8 +430,7 @@ prop fault.cpu.intel.nb.ie@motherboard (0)-> ereport.cpu.intel.external@chip/cpu; event ereport.cpu.intel.nb.dma@motherboard{within(12s)}; -event fault.cpu.intel.nb.dma@motherboard, - FITrate=10000, ASRU=motherboard; +event fault.cpu.intel.nb.dma@motherboard, retire=0, response=0; prop fault.cpu.intel.nb.dma@motherboard (1)-> ereport.cpu.intel.nb.dma@motherboard; @@ -711,29 +443,27 @@ prop fault.cpu.intel.nb.dma@motherboard (0)-> ereport.cpu.intel.external@chip/cpu; event ereport.cpu.intel.nb.esi@motherboard{within(12s)}; -event ereport.cpu.intel.nb.pex@motherboard/hostbridge{within(12s)}; -event upset.cpu.intel.nb.pex@motherboard/hostbridge; +event ereport.cpu.intel.nb.pex@hostbridge{within(12s)}; +event upset.cpu.intel.nb.pex@hostbridge; -prop upset.cpu.intel.nb.pex@motherboard/hostbridge (1)-> +prop upset.cpu.intel.nb.pex@hostbridge (1)-> ereport.cpu.intel.nb.esi@motherboard, - ereport.cpu.intel.nb.pex@motherboard/hostbridge; + ereport.cpu.intel.nb.pex@hostbridge; -prop upset.cpu.intel.nb.pex@motherboard/hostbridge (0)-> +prop upset.cpu.intel.nb.pex@hostbridge (0)-> ereport.cpu.intel.bus_interconnect_memory_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_memory@chip/cpu, ereport.cpu.intel.bus_interconnect@chip/cpu, ereport.cpu.intel.external@chip/cpu; -event ereport.cpu.intel.nb.unknown@ - motherboard/memory-controller/dram-channel/dimm/rank{within(12s)}; -event upset.discard@motherboard/memory-controller/dram-channel/dimm/rank; +event ereport.cpu.intel.nb.unknown@rank{within(12s)}; +event upset.discard@rank; -prop upset.discard@motherboard/memory-controller/dram-channel/dimm/rank (1)-> - ereport.cpu.intel.nb.unknown@ - motherboard/memory-controller/dram-channel/dimm/rank; +prop upset.discard@rank (1)-> + ereport.cpu.intel.nb.unknown@rank; -prop upset.discard@motherboard/memory-controller/dram-channel/dimm/rank (0)-> +prop upset.discard@rank (0)-> ereport.cpu.intel.bus_interconnect_memory_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_uc@chip/cpu, ereport.cpu.intel.bus_interconnect_memory@chip/cpu, diff --git a/usr/src/cmd/fm/eversholt/files/sparc/SUNW,Sun-Fire-15000/SUNW,Sun-Fire-15000.esc b/usr/src/cmd/fm/eversholt/files/sparc/SUNW,Sun-Fire-15000/SUNW,Sun-Fire-15000.esc index 99c9bc1931..1e7f06be8e 100644 --- a/usr/src/cmd/fm/eversholt/files/sparc/SUNW,Sun-Fire-15000/SUNW,Sun-Fire-15000.esc +++ b/usr/src/cmd/fm/eversholt/files/sparc/SUNW,Sun-Fire-15000/SUNW,Sun-Fire-15000.esc @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -20,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -35,7 +34,7 @@ fru cpu; -event fault.io.datapath@cpu, +event fault.io.datapath@cpu, retire=0, FITrate=CPU_FIT, FRU=cpu; event ereport.io.psy.ecc.pue@hostbridge{within(5s)}; diff --git a/usr/src/cmd/fm/eversholt/files/sparc/sun4/fire.esc b/usr/src/cmd/fm/eversholt/files/sparc/sun4/fire.esc index 63fb5e5db0..7985960f3b 100644 --- a/usr/src/cmd/fm/eversholt/files/sparc/sun4/fire.esc +++ b/usr/src/cmd/fm/eversholt/files/sparc/sun4/fire.esc @@ -205,19 +205,19 @@ prop fault.io.fire.asic@hostbridge/pciexrc (0)-> * ------------- * Errors caused by bad SW or HV ***************/ -event fault.io.fire.sw-epkt@hostbridge/pciexrc, +event fault.io.fire.sw-epkt@hostbridge/pciexrc, retire=0, response=0, FITrate=SW_FIT; -event fault.io.fire.fw-epkt@hostbridge/pciexrc, +event fault.io.fire.fw-epkt@hostbridge/pciexrc, retire=0, response=0, FITrate=HV_FIT; -event fault.io.fire.sw-fw-mismatch@hostbridge/pciexrc, +event fault.io.fire.sw-fw-mismatch@hostbridge/pciexrc, retire=0, response=0, FITrate=SW_HV_MISMATCH_FIT; -event fault.io.fire.hb.sw-config@hostbridge/pciexrc, +event fault.io.fire.hb.sw-config@hostbridge/pciexrc, retire=0, response=0, FITrate=SW_FIT; -event fault.io.fire.dmc.sw-algorithm@hostbridge/pciexrc, +event fault.io.fire.dmc.sw-algorithm@hostbridge/pciexrc, retire=0, response=0, FITrate=SW_FIT; -event fault.io.fire.dmc.sw-state@hostbridge/pciexrc, +event fault.io.fire.dmc.sw-state@hostbridge/pciexrc, retire=0, response=0, FITrate=SW_FIT; -event fault.io.fire.pec.sw-algorithm@hostbridge/pciexrc, +event fault.io.fire.pec.sw-algorithm@hostbridge/pciexrc, retire=0, response=0, FITrate=SW_FIT; event error.io.fire.jbc.driver@hostbridge/pciexrc; diff --git a/usr/src/cmd/fm/eversholt/files/sparc/sun4u/oberon.esc b/usr/src/cmd/fm/eversholt/files/sparc/sun4u/oberon.esc index 916499fe14..0a18f85a71 100644 --- a/usr/src/cmd/fm/eversholt/files/sparc/sun4u/oberon.esc +++ b/usr/src/cmd/fm/eversholt/files/sparc/sun4u/oberon.esc @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -113,7 +113,7 @@ prop fault.io.oberon@hostbridge/pciexrc (0)-> */ #define SW_FIT 5000 /* No real fit rate, SW */ -event fault.io.fire.hb.sw-config@hostbridge/pciexrc, +event fault.io.fire.hb.sw-config@hostbridge/pciexrc, retire=0, response=0, FITrate=SW_FIT; prop fault.io.fire.hb.sw-config@hostbridge/pciexrc (0)-> diff --git a/usr/src/cmd/fm/eversholt/files/sparc/sun4u/psycho.esc b/usr/src/cmd/fm/eversholt/files/sparc/sun4u/psycho.esc index 391555070b..da5ece375b 100644 --- a/usr/src/cmd/fm/eversholt/files/sparc/sun4u/psycho.esc +++ b/usr/src/cmd/fm/eversholt/files/sparc/sun4u/psycho.esc @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -100,7 +100,7 @@ prop fault.io.hbus@hostbridge (0)-> fru cpu; -event fault.io.datapath@cpu, +event fault.io.datapath@cpu, retire=0, FITrate=CPU_FIT, FRU=cpu; event error.io.cpu.ecc.thresh@cpu; diff --git a/usr/src/cmd/fm/eversholt/files/sparc/sun4u/schizo.esc b/usr/src/cmd/fm/eversholt/files/sparc/sun4u/schizo.esc index 9c3cfe51bf..09957e8654 100644 --- a/usr/src/cmd/fm/eversholt/files/sparc/sun4u/schizo.esc +++ b/usr/src/cmd/fm/eversholt/files/sparc/sun4u/schizo.esc @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -137,7 +137,7 @@ prop upset.io.schizo@hostbridge (0)-> fru cpu; -event fault.io.datapath@cpu, FITrate=CPU_FIT, FRU=cpu; +event fault.io.datapath@cpu, FITrate=CPU_FIT, FRU=cpu, retire=0; event error.io.cpu.ecc.thresh@cpu; event ereport.io.sch.saf.ssm-dis@hostbridge{within(5s)}; diff --git a/usr/src/cmd/fm/eversholt/files/sparc/sun4u/tomatillo.esc b/usr/src/cmd/fm/eversholt/files/sparc/sun4u/tomatillo.esc index 5774227fa5..3e3a15fe44 100644 --- a/usr/src/cmd/fm/eversholt/files/sparc/sun4u/tomatillo.esc +++ b/usr/src/cmd/fm/eversholt/files/sparc/sun4u/tomatillo.esc @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -148,7 +148,7 @@ prop error.io.tom.mmu.bva@hostbridge/pcibus (0)-> fru cpu; -event fault.io.datapath@cpu, FITrate=CPU_FIT, FRU=cpu; +event fault.io.datapath@cpu, FITrate=CPU_FIT, FRU=cpu, retire=0; event error.io.tom.jbus.ibe@hostbridge; diff --git a/usr/src/cmd/fm/eversholt/files/sparc/sun4u/xmits.esc b/usr/src/cmd/fm/eversholt/files/sparc/sun4u/xmits.esc index 8dc27008f6..51217ef94d 100644 --- a/usr/src/cmd/fm/eversholt/files/sparc/sun4u/xmits.esc +++ b/usr/src/cmd/fm/eversholt/files/sparc/sun4u/xmits.esc @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -161,7 +161,7 @@ prop upset.io.xmits@hostbridge (0)-> fru cpu; -event fault.io.datapath@cpu, FITrate=CPU_FIT, FRU=cpu; +event fault.io.datapath@cpu, FITrate=CPU_FIT, FRU=cpu, retire=0; event error.io.cpu.ecc.thresh@cpu; event ereport.io.xmits.saf.ssm-dis@hostbridge{within(5s)}; diff --git a/usr/src/cmd/fm/fmd/common/fmd_api.c b/usr/src/cmd/fm/fmd/common/fmd_api.c index 809cccecb0..5237fa3c44 100644 --- a/usr/src/cmd/fm/fmd/common/fmd_api.c +++ b/usr/src/cmd/fm/fmd/common/fmd_api.c @@ -28,6 +28,7 @@ #include <sys/types.h> #include <sys/fm/protocol.h> +#include <fm/topo_hc.h> #include <unistd.h> #include <signal.h> @@ -1201,6 +1202,10 @@ fmd_case_add_suspect(fmd_hdl_t *hdl, fmd_case_t *cp, nvlist_t *nvl) fmd_module_t *mp = fmd_api_module_lock(hdl); fmd_case_impl_t *cip = fmd_api_case_impl(mp, cp); char *class; + topo_hdl_t *thp; + int err; + nvlist_t *rsrc = NULL, *asru = NULL, *fru = NULL; + char *loc = NULL, *serial = NULL; if (cip->ci_state >= FMD_CASE_SOLVED) { fmd_api_error(mp, EFMD_CASE_STATE, "cannot add suspect to " @@ -1213,6 +1218,77 @@ fmd_case_add_suspect(fmd_hdl_t *hdl, fmd_case_t *cp, nvlist_t *nvl) "%s: suspect event is missing a class\n", cip->ci_uuid); } + thp = fmd_module_topo_hold(mp); + (void) nvlist_lookup_nvlist(nvl, FM_FAULT_RESOURCE, &rsrc); + (void) nvlist_lookup_nvlist(nvl, FM_FAULT_ASRU, &asru); + (void) nvlist_lookup_nvlist(nvl, FM_FAULT_FRU, &fru); + if (rsrc != NULL) { + if (strncmp(class, "defect", 6) == 0) { + if (asru == NULL && topo_fmri_getprop(thp, rsrc, + TOPO_PGROUP_IO, TOPO_IO_MODULE, rsrc, + &asru, &err) == 0) { + (void) nvlist_add_nvlist(nvl, FM_FAULT_ASRU, + asru); + nvlist_free(asru); + (void) nvlist_lookup_nvlist(nvl, FM_FAULT_ASRU, + &asru); + } + } else { + if (topo_fmri_asru(thp, rsrc, &asru, &err) == 0) { + (void) nvlist_remove(nvl, FM_FAULT_ASRU, + DATA_TYPE_NVLIST); + (void) nvlist_add_nvlist(nvl, FM_FAULT_ASRU, + asru); + nvlist_free(asru); + (void) nvlist_lookup_nvlist(nvl, FM_FAULT_ASRU, + &asru); + } + if (topo_fmri_fru(thp, rsrc, &fru, &err) == 0) { + (void) nvlist_remove(nvl, FM_FAULT_FRU, + DATA_TYPE_NVLIST); + (void) nvlist_add_nvlist(nvl, FM_FAULT_FRU, + fru); + nvlist_free(fru); + (void) nvlist_lookup_nvlist(nvl, FM_FAULT_FRU, + &fru); + } + } + } + + /* + * Try to find the location label for this resource + */ + if (fru != NULL) + (void) topo_fmri_label(thp, fru, &loc, &err); + else if (rsrc != NULL) + (void) topo_fmri_label(thp, rsrc, &loc, &err); + if (loc != NULL) { + (void) nvlist_remove(nvl, FM_FAULT_LOCATION, DATA_TYPE_STRING); + (void) nvlist_add_string(nvl, FM_FAULT_LOCATION, loc); + topo_hdl_strfree(thp, loc); + } + + /* + * In some cases, serial information for the resource will not be + * available at enumeration but may instead be available by invoking + * a dynamic property method on the FRU. In order to ensure the serial + * number is persisted properly in the ASRU cache, we'll fetch the + * property, if it exists, and add it to the resource and fru fmris. + */ + if (fru != NULL) { + (void) topo_fmri_serial(thp, fru, &serial, &err); + if (serial != NULL) { + if (rsrc != NULL) + (void) nvlist_add_string(rsrc, "serial", + serial); + (void) nvlist_add_string(fru, "serial", serial); + topo_hdl_strfree(thp, serial); + } + } + + err = fmd_module_topo_rele(mp, thp); + ASSERT(err == 0); + fmd_case_insert_suspect(cp, nvl); fmd_module_unlock(mp); } @@ -1704,44 +1780,13 @@ fmd_nvl_create_fault(fmd_hdl_t *hdl, const char *class, uint8_t certainty, nvlist_t *asru, nvlist_t *fru, nvlist_t *rsrc) { fmd_module_t *mp; - topo_hdl_t *thp; nvlist_t *nvl; - char *loc = NULL, *serial = NULL; - int err; mp = fmd_api_module_lock(hdl); if (class == NULL || class[0] == '\0') fmd_api_error(mp, EFMD_NVL_INVAL, "invalid fault class\n"); - thp = fmd_module_topo_hold(mp); - - /* - * Try to find the location label for this resource - */ - (void) topo_fmri_label(thp, fru, &loc, &err); - - /* - * In some cases, serial information for the resource will not be - * available at enumeration but may instead be available by invoking - * a dynamic property method on the FRU. In order to ensure the serial - * number is persisted properly in the ASRU cache, we'll fetch the - * property, if it exists, and add it to the resource and fru fmris. - */ - if (fru != NULL) { - (void) topo_fmri_serial(thp, fru, &serial, &err); - if (serial != NULL) { - (void) nvlist_add_string(rsrc, "serial", serial); - (void) nvlist_add_string(fru, "serial", serial); - topo_hdl_strfree(thp, serial); - } - } - nvl = fmd_protocol_fault(class, certainty, asru, fru, rsrc, loc); - - if (loc != NULL) - topo_hdl_strfree(thp, loc); - - err = fmd_module_topo_rele(mp, thp); - ASSERT(err == 0); + nvl = fmd_protocol_fault(class, certainty, asru, fru, rsrc, NULL); fmd_module_unlock(mp); diff --git a/usr/src/cmd/fm/fmd/common/fmd_asru.c b/usr/src/cmd/fm/fmd/common/fmd_asru.c index da2b46cc97..ff3c6ba367 100644 --- a/usr/src/cmd/fm/fmd/common/fmd_asru.c +++ b/usr/src/cmd/fm/fmd/common/fmd_asru.c @@ -412,6 +412,10 @@ fmd_asru_hash_recreate(fmd_log_t *lp, fmd_event_t *ep, fmd_asru_hash_t *ahp) fmd_case_t *cp; int64_t *diag_time; uint_t nelem; + topo_hdl_t *thp; + char *class; + nvlist_t *rsrc; + int err; /* * Extract the most recent values of 'faulty' from the event log. @@ -448,6 +452,23 @@ fmd_asru_hash_recreate(fmd_log_t *lp, fmd_event_t *ep, fmd_asru_hash_t *ahp) else fmd_case_settime(cp, lp->log_stat.st_ctime, 0); (void) nvlist_xdup(flt, &flt_copy, &fmd.d_nva); + + /* + * For faults with a resource, re-evaluate the asru from the resource. + */ + thp = fmd_fmri_topo_hold(TOPO_VERSION); + if (nvlist_lookup_string(flt_copy, FM_CLASS, &class) == 0 && + strncmp(class, "fault", 5) == 0 && + nvlist_lookup_nvlist(flt_copy, FM_FAULT_RESOURCE, &rsrc) == 0 && + rsrc != NULL && topo_fmri_asru(thp, rsrc, &asru, &err) == 0) { + (void) nvlist_remove(flt_copy, FM_FAULT_ASRU, DATA_TYPE_NVLIST); + (void) nvlist_add_nvlist(flt_copy, FM_FAULT_ASRU, asru); + nvlist_free(asru); + } + fmd_fmri_topo_rele(thp); + + (void) nvlist_xdup(flt_copy, &flt, &fmd.d_nva); + fmd_case_recreate_suspect(cp, flt_copy); /* @@ -475,6 +496,8 @@ fmd_asru_hash_recreate(fmd_log_t *lp, fmd_event_t *ep, fmd_asru_hash_t *ahp) } else u = FMD_B_TRUE; /* not present; set unusable */ + nvlist_free(flt); + ap->asru_flags |= FMD_ASRU_RECREATED; if (ps) ap->asru_flags |= FMD_ASRU_PRESENT; diff --git a/usr/src/cmd/fm/modules/common/cpumem-retire/cma_main.c b/usr/src/cmd/fm/modules/common/cpumem-retire/cma_main.c index acac390d36..de8ebad2a7 100644 --- a/usr/src/cmd/fm/modules/common/cpumem-retire/cma_main.c +++ b/usr/src/cmd/fm/modules/common/cpumem-retire/cma_main.c @@ -257,6 +257,13 @@ nvl2subr(fmd_hdl_t *hdl, nvlist_t *nvl, nvlist_t **asrup) char *scheme; uint8_t version; char *fltclass = "(unknown)"; + boolean_t retire; + + if (nvlist_lookup_boolean_value(nvl, FM_SUSPECT_RETIRE, &retire) == 0 && + retire == 0) { + fmd_hdl_debug(hdl, "cma_recv: retire suppressed"); + return (NULL); + } if (nvlist_lookup_nvlist(nvl, FM_FAULT_ASRU, &asru) != 0 || nvlist_lookup_string(asru, FM_FMRI_SCHEME, &scheme) != 0 || diff --git a/usr/src/cmd/fm/modules/common/eversholt/config.c b/usr/src/cmd/fm/modules/common/eversholt/config.c index 6e659c54ec..b1b924d76b 100644 --- a/usr/src/cmd/fm/modules/common/eversholt/config.c +++ b/usr/src/cmd/fm/modules/common/eversholt/config.c @@ -285,10 +285,6 @@ config_cook(struct cfgdata *cdata) Usedprops = lut_add(Usedprops, (void *)ptr, (void *)ptr, NULL); ptr = stable("resource"); Usedprops = lut_add(Usedprops, (void *)ptr, (void *)ptr, NULL); - ptr = stable("ASRU"); - Usedprops = lut_add(Usedprops, (void *)ptr, (void *)ptr, NULL); - ptr = stable("FRU"); - Usedprops = lut_add(Usedprops, (void *)ptr, (void *)ptr, NULL); out(O_ALTFP|O_VERB3, "Raw config data follows:"); out(O_ALTFP|O_VERB3|O_NONL, diff --git a/usr/src/cmd/fm/modules/common/eversholt/eft.c b/usr/src/cmd/fm/modules/common/eversholt/eft.c index 3fe0bad895..a7a7273a26 100644 --- a/usr/src/cmd/fm/modules/common/eversholt/eft.c +++ b/usr/src/cmd/fm/modules/common/eversholt/eft.c @@ -57,7 +57,6 @@ fmd_hdl_t *Hdl; /* handle in global for platform.c */ int Debug = 1; /* turn on here and let fmd_hdl_debug() decide if really on */ -char *Autoclose; /* close cases automatically after solving */ hrtime_t Hesitate; /* hesitation time in ns */ char *Serd_Override; /* override for Serd engines */ int Verbose; @@ -135,7 +134,6 @@ eft_close(fmd_hdl_t *hdl, fmd_case_t *fmcase) * serd.io.device.nonfatal engine to 5 in 3 hours. */ static const fmd_prop_t eft_props[] = { - { "autoclose", FMD_TYPE_STRING, NULL }, { "estats", FMD_TYPE_BOOL, "false" }, { "hesitate", FMD_TYPE_INT64, "10000000000" }, { "serd_override", FMD_TYPE_STRING, NULL }, @@ -335,14 +333,12 @@ _fmd_init(fmd_hdl_t *hdl) Verbose = fmd_prop_get_int32(hdl, "verbose"); Warn = fmd_prop_get_int32(hdl, "warn"); - Autoclose = fmd_prop_get_string(hdl, "autoclose"); Hesitate = fmd_prop_get_int64(hdl, "hesitate"); Serd_Override = fmd_prop_get_string(hdl, "serd_override"); Max_fme = fmd_prop_get_int32(hdl, "maxfme"); - out(O_DEBUG, "initialized, verbose %d warn %d autoclose %s " - "maxfme %d", Verbose, Warn, Autoclose == NULL ? "(NULL)" : - Autoclose, Max_fme); + out(O_DEBUG, "initialized, verbose %d warn %d maxfme %d", + Verbose, Warn, Max_fme); fme_istat_load(hdl); fme_serd_load(hdl); @@ -357,7 +353,5 @@ _fmd_init(fmd_hdl_t *hdl) void _fmd_fini(fmd_hdl_t *hdl) { - fmd_prop_free_string(hdl, Autoclose); - Autoclose = NULL; call_finis(); } diff --git a/usr/src/cmd/fm/modules/common/eversholt/eft.conf b/usr/src/cmd/fm/modules/common/eversholt/eft.conf index e04d27812b..0b0ed73837 100644 --- a/usr/src/cmd/fm/modules/common/eversholt/eft.conf +++ b/usr/src/cmd/fm/modules/common/eversholt/eft.conf @@ -28,14 +28,6 @@ # # The following configuration options are valid: # -# setprop autoclose [all|upsets] -# -# Turns on automatic closing of cases after they've -# been solved. Useful if no agent is available to -# act upon a published diagnosis. Setting autoclose -# to "all" closes all cases automatcally, setting it -# to "upsets" closes only those containing only upsets. -# # setprop estats true # # Enables "extended stats" visible via "fmstat -m eft". @@ -64,4 +56,3 @@ # The value "0" (zero) specifies no limit. # dictionary SUNOS -setprop autoclose upsets diff --git a/usr/src/cmd/fm/modules/common/eversholt/eval.c b/usr/src/cmd/fm/modules/common/eversholt/eval.c index d83b80485d..1e6e99d8eb 100644 --- a/usr/src/cmd/fm/modules/common/eversholt/eval.c +++ b/usr/src/cmd/fm/modules/common/eversholt/eval.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. * * eval.c -- constraint evaluation module @@ -499,6 +499,9 @@ eval_func(struct node *funcnp, struct lut *ex, struct node *events[], ASSERTinfo(np->u.expr.left->t == T_QUOTE, ptree_nodetype2str(np->u.expr.left->t)); + if (arrowp->head->myevent->count == 0) + return (0); + outfl(O_ALTFP|O_VERB2|O_NONL, np->file, np->line, "setpayloadprop: %s: %s=", arrowp->tail->myevent->enode->u.event.ename->u.name.s, @@ -550,6 +553,86 @@ eval_func(struct node *funcnp, struct lut *ex, struct node *events[], valuep->t = UINT64; valuep->v = 1; return (1); + } else if (funcname == L_setserdn || funcname == L_setserdt || + funcname == L_setserdsuffix || funcname == L_setserdincrement) { + struct evalue *serdvalp; + int alloced = 0; + char *str; + struct event *flt = arrowp->tail->myevent; + + if (arrowp->head->myevent->count == 0) + return (0); + + if (funcname == L_setserdn) + str = "n"; + else if (funcname == L_setserdt) + str = "t"; + else if (funcname == L_setserdsuffix) + str = "suffix"; + else if (funcname == L_setserdincrement) + str = "increment"; + + /* + * allocate a struct evalue to hold the serd property's + * value, unless we've been here already, in which case we + * might calculate a different value, but we'll store it + * in the already-allocated struct evalue. + */ + if ((serdvalp = (struct evalue *)lut_lookup(flt->serdprops, + (void *)str, NULL)) == NULL) { + serdvalp = MALLOC(sizeof (*serdvalp)); + alloced = 1; + } + + if (!eval_expr(np, ex, events, globals, croot, arrowp, try, + serdvalp)) { + outfl(O_ALTFP|O_VERB2|O_NONL, np->file, np->line, + "setserd%s: %s: ", str, + flt->enode->u.event.ename->u.name.s); + ptree_name_iter(O_ALTFP|O_VERB2|O_NONL, np); + out(O_ALTFP|O_VERB2, " (cannot eval)"); + if (alloced) + FREE(serdvalp); + return (0); + } else if (serdvalp->t == UNDEFINED) { + outfl(O_ALTFP|O_VERB2|O_NONL, np->file, np->line, + "setserd%s: %s: ", str, + flt->enode->u.event.ename->u.name.s); + ptree_name_iter(O_ALTFP|O_VERB2|O_NONL, np); + out(O_ALTFP|O_VERB2, " (undefined)"); + } else { + outfl(O_ALTFP|O_VERB2|O_NONL, np->file, np->line, + "setserd%s: %s: ", str, + flt->enode->u.event.ename->u.name.s); + ptree_name_iter(O_ALTFP|O_VERB2|O_NONL, np); + if ((funcname == L_setserdincrement || + funcname == L_setserdn) && serdvalp->t == STRING) { + serdvalp->t = UINT64; + serdvalp->v = strtoull((char *) + (uintptr_t)serdvalp->v, NULL, 0); + } + if (funcname == L_setserdt && serdvalp->t == UINT64) { + int len = snprintf(NULL, 0, "%lldns", + serdvalp->v); + char *buf = MALLOC(len + 1); + + (void) snprintf(buf, len + 1, "%lldns", + serdvalp->v); + serdvalp->t = STRING; + serdvalp->v = (uintptr_t)stable(buf); + FREE(buf); + } + if (serdvalp->t == UINT64) + out(O_ALTFP|O_VERB2, " (%llu)", serdvalp->v); + else + out(O_ALTFP|O_VERB2, " (\"%s\")", + (char *)(uintptr_t)serdvalp->v); + flt->serdprops = lut_add(flt->serdprops, (void *)str, + (void *)serdvalp, NULL); + } + valuep->t = UINT64; + valuep->v = 1; + return (1); } else if (funcname == L_payloadprop_defined) { outfl(O_ALTFP|O_VERB2|O_NONL, np->file, np->line, "payloadprop_defined(\"%s\") ", np->u.quote.s); @@ -945,6 +1028,11 @@ eval_dup(struct node *np, struct lut *ex, struct node *events[]) newnp->u.ull = np->u.ull; return (newnp); + case T_TIMEVAL: + newnp = newnode(T_TIMEVAL, np->file, np->line); + newnp->u.ull = np->u.ull; + return (newnp); + default: outfl(O_DIE, np->file, np->line, "eval_dup: unexpected node type: %s", @@ -1686,6 +1774,7 @@ eval_expr(struct node *np, struct lut *ex, struct node *events[], globals, croot, arrowp, try, valuep)); case T_NUM: + case T_TIMEVAL: valuep->t = UINT64; valuep->v = np->u.ull; return (1); diff --git a/usr/src/cmd/fm/modules/common/eversholt/fme.c b/usr/src/cmd/fm/modules/common/eversholt/fme.c index c20b002b8a..e0c5252f78 100644 --- a/usr/src/cmd/fm/modules/common/eversholt/fme.c +++ b/usr/src/cmd/fm/modules/common/eversholt/fme.c @@ -57,7 +57,6 @@ #include "esclex.h" /* imported from eft.c... */ -extern char *Autoclose; extern hrtime_t Hesitate; extern char *Serd_Override; extern nv_alloc_t Eft_nv_hdl; @@ -975,10 +974,34 @@ serd_eval(struct fme *fmep, fmd_hdl_t *hdl, fmd_event_t *ffep, char *serdname; struct node *nid; struct serd_entry *newentp; + int i, serdn = -1, serdincrement = 1; + char *serdsuffix = NULL, *serdt = NULL; + struct evalue *ep; ASSERT(sp->t == N_UPSET); ASSERT(ffep != NULL); + if ((ep = (struct evalue *)lut_lookup(sp->serdprops, + (void *)"n", (lut_cmp)strcmp)) != NULL) { + ASSERT(ep->t == UINT64); + serdn = (int)ep->v; + } + if ((ep = (struct evalue *)lut_lookup(sp->serdprops, + (void *)"t", (lut_cmp)strcmp)) != NULL) { + ASSERT(ep->t == STRING); + serdt = (char *)(uintptr_t)ep->v; + } + if ((ep = (struct evalue *)lut_lookup(sp->serdprops, + (void *)"suffix", (lut_cmp)strcmp)) != NULL) { + ASSERT(ep->t == STRING); + serdsuffix = (char *)(uintptr_t)ep->v; + } + if ((ep = (struct evalue *)lut_lookup(sp->serdprops, + (void *)"increment", (lut_cmp)strcmp)) != NULL) { + ASSERT(ep->t == UINT64); + serdincrement = (int)ep->v; + } + /* * obtain instanced SERD engine from the upset sp. from this * derive serdname, the string used to identify the SERD engine. @@ -986,11 +1009,19 @@ serd_eval(struct fme *fmep, fmd_hdl_t *hdl, fmd_event_t *ffep, serdinst = eventprop_lookup(sp, L_engine); if (serdinst == NULL) - return (0); + return (-1); serdname = ipath2str(serdinst->u.stmt.np->u.event.ename->u.name.s, ipath(serdinst->u.stmt.np->u.event.epname)); + if (serdsuffix != NULL) { + int len = strlen(serdname) + strlen(serdsuffix) + 1; + char *ptr = MALLOC(len); + (void) snprintf(ptr, len, "%s%s", serdname, serdsuffix); + FREE(serdname); + serdname = ptr; + } + /* handle serd engine "id" property, if there is one */ if ((nid = lut_lookup(serdinst->u.stmt.lutp, (void *)L_id, NULL)) != NULL) { @@ -1024,6 +1055,14 @@ serd_eval(struct fme *fmep, fmd_hdl_t *hdl, fmd_event_t *ffep, serdname = nserdname; } + /* + * if the engine is empty, and we have an override for n/t then + * destroy and recreate it. + */ + if ((serdn != -1 || serdt != NULL) && fmd_serd_exists(hdl, serdname) && + fmd_serd_empty(hdl, serdname)) + fmd_serd_destroy(hdl, serdname); + if (!fmd_serd_exists(hdl, serdname)) { struct node *nN, *nT; const char *s; @@ -1110,6 +1149,17 @@ serd_eval(struct fme *fmep, fmd_hdl_t *hdl, fmd_event_t *ffep, FREE(serd_name); } + if (serdn != -1 && got_n_override == 0) { + nval = serdn; + out(O_ALTFP, "serd override %s_n %d", name, serdn); + got_n_override = 1; + } + if (serdt != NULL && got_t_override == 0) { + ptr = STRDUP(serdt); + out(O_ALTFP, "serd override %s_t %s", name, serdt); + got_t_override = 1; + } + if (!got_n_override) { nN = lut_lookup(serdinst->u.stmt.lutp, (void *)L_N, NULL); @@ -1131,8 +1181,7 @@ serd_eval(struct fme *fmep, fmd_hdl_t *hdl, fmd_event_t *ffep, ullp = (unsigned long long *)lut_lookup(Timesuffixlut, (void *)suffix, NULL); ptr[len] = '\0'; - tval = (unsigned long long)strtoul(ptr, NULL, 0) * - (ullp ? *ullp : 1ll); + tval = strtoull(ptr, NULL, 0) * (ullp ? *ullp : 1ll); FREE(ptr); } fmd_serd_create(hdl, serdname, nval, tval); @@ -1154,25 +1203,31 @@ serd_eval(struct fme *fmep, fmd_hdl_t *hdl, fmd_event_t *ffep, /* * increment SERD engine. if engine fires, reset serd - * engine and return trip_strcode + * engine and return trip_strcode if required. */ - if (fmd_serd_record(hdl, serdname, ffep)) { - struct node *tripinst = lut_lookup(serdinst->u.stmt.lutp, - (void *)L_trip, NULL); - - ASSERT(tripinst != NULL); - - *enamep = tripinst->u.event.ename->u.name.s; - *ippp = ipath(tripinst->u.event.epname); - - fmd_case_add_serd(hdl, fmcase, serdname); - fmd_serd_reset(hdl, serdname); - out(O_ALTFP|O_NONL, "[engine fired: %s, sending: ", serdname); - ipath_print(O_ALTFP|O_NONL, *enamep, *ippp); - out(O_ALTFP, "]"); - - FREE(serdname); - return (1); + for (i = 0; i < serdincrement; i++) { + if (fmd_serd_record(hdl, serdname, ffep)) { + fmd_case_add_serd(hdl, fmcase, serdname); + fmd_serd_reset(hdl, serdname); + + if (ippp) { + struct node *tripinst = + lut_lookup(serdinst->u.stmt.lutp, + (void *)L_trip, NULL); + ASSERT(tripinst != NULL); + *enamep = tripinst->u.event.ename->u.name.s; + *ippp = ipath(tripinst->u.event.epname); + out(O_ALTFP|O_NONL, + "[engine fired: %s, sending: ", serdname); + ipath_print(O_ALTFP|O_NONL, *enamep, *ippp); + out(O_ALTFP, "]"); + } else { + out(O_ALTFP, "[engine fired: %s, no trip]", + serdname); + } + FREE(serdname); + return (1); + } } FREE(serdname); @@ -1223,7 +1278,7 @@ upsets_eval(struct fme *fmep, fmd_event_t *ffep) for (sp = fmep->suspects; sp; sp = sp->suspects) if (sp->t == N_UPSET && serd_eval(fmep, fmep->hdl, ffep, fmep->fmcase, sp, - &tripped[ntrip].ename, &tripped[ntrip].ipp)) + &tripped[ntrip].ename, &tripped[ntrip].ipp) == 1) ntrip++; for (i = 0; i < ntrip; i++) { @@ -1273,6 +1328,7 @@ upsets_eval(struct fme *fmep, fmd_event_t *ffep) fmd_case_uuid(nfmep->hdl, nfmep->fmcase)); if (ffep) { fmd_case_setprincipal(nfmep->hdl, nfmep->fmcase, ffep); + fmd_case_add_ereport(nfmep->hdl, nfmep->fmcase, ffep); nfmep->e0r = ffep; } @@ -1292,9 +1348,9 @@ upsets_eval(struct fme *fmep, fmd_event_t *ffep) serialize_observation(nfmep, eventstring, ipp); nep->nvp = evnv_dupnvl(ep->nvp); } - if (ffep) + if (ep->ffep && ep->ffep != ffep) fmd_case_add_ereport(nfmep->hdl, nfmep->fmcase, - ffep); + ep->ffep); stats_counter_bump(nfmep->Rcount); } @@ -1361,9 +1417,6 @@ retry_lone_ereport: * and evaluate */ serialize_observation(nfmep, tripped[i].ename, tripped[i].ipp); - if (ffep) - fmd_case_add_ereport(nfmep->hdl, nfmep->fmcase, ffep); - stats_counter_bump(nfmep->Rcount); fme_eval(nfmep, ffep); } @@ -1576,8 +1629,10 @@ fme_receive_report(fmd_hdl_t *hdl, fmd_event_t *ffep, if (ep->count == 1) serialize_observation(fmep, eventstring, ipp); - if (ffep) + if (ffep) { fmd_case_add_ereport(hdl, fmep->fmcase, ffep); + ep->ffep = ffep; + } stats_counter_bump(fmep->Rcount); @@ -1698,6 +1753,7 @@ fme_receive_report(fmd_hdl_t *hdl, fmd_event_t *ffep, fmd_case_add_ereport(hdl, fmep->fmcase, ffep); fmd_case_setprincipal(hdl, fmep->fmcase, ffep); fmep->e0r = ffep; + ep->ffep = ffep; } /* give the diagnosis algorithm a shot at the new FME state */ @@ -2004,6 +2060,8 @@ struct rsl { nvlist_t *rsrc; }; +static void publish_suspects(struct fme *fmep, struct rsl *srl); + /* * rslfree -- free internal members of struct rsl not expected to be * freed elsewhere. @@ -2039,13 +2097,13 @@ rslcmp(const void *a, const void *b) if (rv != 0) return (rv); - if (r1->asru == NULL && r2->asru == NULL) + if (r1->rsrc == NULL && r2->rsrc == NULL) return (0); - if (r1->asru == NULL) + if (r1->rsrc == NULL) return (-1); - if (r2->asru == NULL) + if (r2->rsrc == NULL) return (1); - return (evnv_cmpnvl(r1->asru, r2->asru, 0)); + return (evnv_cmpnvl(r1->rsrc, r2->rsrc, 0)); } /* @@ -2122,7 +2180,7 @@ get_resources(struct event *sp, struct rsl *rsrcs, struct config *croot) pathstr = ipath2str(NULL, sp->ipp); /* - * Allow for platform translations of the FMRIs + * Allow for platform translations of the FMRIs */ platform_units_translate(is_defect(sp->t), croot, &asru, &fru, &rsrc, pathstr); @@ -2141,51 +2199,41 @@ get_resources(struct event *sp, struct rsl *rsrcs, struct config *croot) * defects resolve to the same ASRU (driver) we only want to publish * that as a single suspect. */ -static void -trim_suspects(struct fme *fmep, boolean_t no_upsets, struct rsl **begin, - struct rsl **end) +static int +trim_suspects(struct fme *fmep, struct rsl *begin, struct rsl *begin2, + fmd_event_t *ffep, int *mess_zero_nonfaultp) { struct event *ep; - struct rsl *rp; - int rpcnt; - - /* - * First save the suspects in the psuspects, then copy back - * only the ones we wish to retain. This resets nsuspects to - * zero. - */ - rpcnt = fmep->nsuspects; - save_suspects(fmep); - - /* - * allocate an array of resource pointers for the suspects. - * We may end up using less than the full allocation, but this - * is a very short-lived array. publish_suspects() will free - * this array when it's done using it. - */ - rp = *begin = MALLOC(rpcnt * sizeof (struct rsl)); - bzero(rp, rpcnt * sizeof (struct rsl)); + struct rsl *rp = begin; + struct rsl *rp2 = begin2; + int mess_zero_count = 0; + int serd_rval; + uint_t messval; - /* first pass, remove any unwanted upsets and populate our array */ + /* remove any unwanted upsets and populate our array */ for (ep = fmep->psuspects; ep; ep = ep->psuspects) { - if (no_upsets && is_upset(ep->t)) + if (is_upset(ep->t)) continue; - get_resources(ep, rp, fmep->config); - rp++; - fmep->nsuspects++; - if (!is_fault(ep->t)) - fmep->nonfault++; + serd_rval = serd_eval(fmep, fmep->hdl, ffep, fmep->fmcase, ep, + NULL, NULL); + if (serd_rval == 0) + continue; + if (node2uint(eventprop_lookup(ep, L_message), + &messval) == 0 && messval == 0) { + get_resources(ep, rp2, fmep->config); + rp2++; + mess_zero_count++; + if (!is_fault(ep->t)) + (*mess_zero_nonfaultp)++; + } else { + get_resources(ep, rp, fmep->config); + rp++; + fmep->nsuspects++; + if (!is_fault(ep->t)) + fmep->nonfault++; + } } - - /* if all we had was unwanted upsets, we're done */ - if (fmep->nsuspects == 0) - return; - - *end = rp - 1; - - /* sort the array */ - qsort(*begin, fmep->nsuspects, sizeof (struct rsl), rslcmp); - rsluniq(*begin, *end, &fmep->nsuspects, &fmep->nonfault); + return (mess_zero_count); } /* @@ -2194,22 +2242,41 @@ trim_suspects(struct fme *fmep, boolean_t no_upsets, struct rsl **begin, static void addpayloadprop(const char *lhs, struct evalue *rhs, nvlist_t *fault) { + nvlist_t *rsrc, *hcs; + ASSERT(fault != NULL); ASSERT(lhs != NULL); ASSERT(rhs != NULL); + if (nvlist_lookup_nvlist(fault, FM_FAULT_RESOURCE, &rsrc) != 0) + out(O_DIE, "cannot add payloadprop \"%s\" to fault", lhs); + + if (nvlist_lookup_nvlist(rsrc, FM_FMRI_HC_SPECIFIC, &hcs) != 0) { + out(O_ALTFP|O_VERB2, "addpayloadprop: create hc_specific"); + if (nvlist_xalloc(&hcs, NV_UNIQUE_NAME, &Eft_nv_hdl) != 0) + out(O_DIE, + "cannot add payloadprop \"%s\" to fault", lhs); + if (nvlist_add_nvlist(rsrc, FM_FMRI_HC_SPECIFIC, hcs) != 0) + out(O_DIE, + "cannot add payloadprop \"%s\" to fault", lhs); + nvlist_free(hcs); + if (nvlist_lookup_nvlist(rsrc, FM_FMRI_HC_SPECIFIC, &hcs) != 0) + out(O_DIE, + "cannot add payloadprop \"%s\" to fault", lhs); + } else + out(O_ALTFP|O_VERB2, "addpayloadprop: reuse hc_specific"); + if (rhs->t == UINT64) { out(O_ALTFP|O_VERB2, "addpayloadprop: %s=%llu", lhs, rhs->v); - if (nvlist_add_uint64(fault, lhs, rhs->v) != 0) + if (nvlist_add_uint64(hcs, lhs, rhs->v) != 0) out(O_DIE, "cannot add payloadprop \"%s\" to fault", lhs); } else { out(O_ALTFP|O_VERB2, "addpayloadprop: %s=\"%s\"", lhs, (char *)(uintptr_t)rhs->v); - if (nvlist_add_string(fault, lhs, (char *)(uintptr_t)rhs->v) != - 0) + if (nvlist_add_string(hcs, lhs, (char *)(uintptr_t)rhs->v) != 0) out(O_DIE, "cannot add payloadprop \"%s\" to fault", lhs); } @@ -2664,47 +2731,26 @@ serd_fini(void) } static void -publish_suspects(struct fme *fmep) +publish_suspects(struct fme *fmep, struct rsl *srl) { - struct rsl *srl = NULL; - struct rsl *erl; struct rsl *rp; nvlist_t *fault; uint8_t cert; uint_t *frs; uint_t fravg, frsum, fr; uint_t messval; + uint_t retireval; + uint_t responseval; struct node *snp; int frcnt, fridx; - boolean_t no_upsets = B_FALSE; boolean_t allfaulty = B_TRUE; - - stats_counter_bump(fmep->diags); + struct rsl *erl = srl + fmep->nsuspects - 1; /* - * If we're auto-closing upsets, we don't want to include them - * in any produced suspect lists or certainty accounting. + * sort the array */ - if (Autoclose != NULL) - if (strcmp(Autoclose, "true") == 0 || - strcmp(Autoclose, "all") == 0 || - strcmp(Autoclose, "upsets") == 0) - no_upsets = B_TRUE; - - trim_suspects(fmep, no_upsets, &srl, &erl); - - /* - * If the resulting suspect list has no members, we're - * done. Returning here will simply close the case. - */ - if (fmep->nsuspects == 0) { - out(O_ALTFP, - "[FME%d, case %s (all suspects are upsets)]", - fmep->id, fmd_case_uuid(fmep->hdl, fmep->fmcase)); - FREE(srl); - restore_suspects(fmep); - return; - } + qsort(srl, fmep->nsuspects, sizeof (struct rsl), rslcmp); + rsluniq(srl, erl, &fmep->nsuspects, &fmep->nonfault); /* * If the suspect list is all faults, then for a given fault, @@ -2798,15 +2844,47 @@ publish_suspects(struct fme *fmep) out(O_DIE, "cannot add no-message to fault"); } } + + /* if "retire" property exists, add it to the fault */ + if (node2uint(eventprop_lookup(rp->suspect, L_retire), + &retireval) == 0) { + + out(O_ALTFP, + "[FME%d, %s adds retire=%d to suspect list]", + fmep->id, + rp->suspect->enode->u.event.ename->u.name.s, + retireval); + if (nvlist_add_boolean_value(fault, + FM_SUSPECT_RETIRE, + (retireval) ? B_TRUE : B_FALSE) != 0) { + out(O_DIE, "cannot add no-retire to fault"); + } + } + + /* if "response" property exists, add it to the fault */ + if (node2uint(eventprop_lookup(rp->suspect, L_response), + &responseval) == 0) { + + out(O_ALTFP, + "[FME%d, %s adds response=%d to suspect list]", + fmep->id, + rp->suspect->enode->u.event.ename->u.name.s, + responseval); + if (nvlist_add_boolean_value(fault, + FM_SUSPECT_RESPONSE, + (responseval) ? B_TRUE : B_FALSE) != 0) { + out(O_DIE, "cannot add no-response to fault"); + } + } + /* add any payload properties */ lut_walk(rp->suspect->payloadprops, (lut_cb)addpayloadprop, (void *)fault); - fmd_case_add_suspect(fmep->hdl, fmep->fmcase, fault); rslfree(rp); /* * If "action" property exists, evaluate it; this must be done - * before the dupclose check below since some actions may + * before the allfaulty check below since some actions may * modify the asru to be used in fmd_nvl_fmri_faulty. This * needs to be restructured if any new actions are introduced * that have effects that we do not want to be visible if @@ -2825,13 +2903,15 @@ publish_suspects(struct fme *fmep) NULL, 0, &evalue); } + fmd_case_add_suspect(fmep->hdl, fmep->fmcase, fault); + /* * check if the asru is already marked as "faulty". */ if (allfaulty) { nvlist_t *asru; - out(O_ALTFP|O_VERB, "FMD%d dup check ", fmep->id); + out(O_ALTFP|O_VERB, "FME%d dup check ", fmep->id); itree_pevent_brief(O_ALTFP|O_VERB|O_NONL, rp->suspect); out(O_ALTFP|O_VERB|O_NONL, " "); if (nvlist_lookup_nvlist(fault, @@ -2848,9 +2928,6 @@ publish_suspects(struct fme *fmep) } - /* - * We are going to publish so take any pre-publication actions. - */ if (!allfaulty) { /* * don't update the count stat if all asrus are already @@ -2876,16 +2953,6 @@ publish_suspects(struct fme *fmep) } istat_save(); /* write out any istat changes */ } - - out(O_ALTFP, "[solving FME%d, case %s]", fmep->id, - fmd_case_uuid(fmep->hdl, fmep->fmcase)); - fmd_case_solve(fmep->hdl, fmep->fmcase); - - /* - * revert to the original suspect list - */ - FREE(srl); - restore_suspects(fmep); } static void @@ -3140,6 +3207,11 @@ fme_eval(struct fme *fmep, fmd_event_t *ffep) { struct event *ep; unsigned long long my_delay = TIMEVAL_EVENTUALLY; + struct rsl *srl = NULL; + struct rsl *srl2 = NULL; + int mess_zero_count; + int mess_zero_nonfault = 0; + int rpcnt; save_suspects(fmep); @@ -3169,7 +3241,89 @@ fme_eval(struct fme *fmep, fmd_event_t *ffep) if (fmep->posted_suspects) return; - publish_suspects(fmep); + stats_counter_bump(fmep->diags); + rpcnt = fmep->nsuspects; + save_suspects(fmep); + + /* + * create two lists, one for "message=1" faults and one for + * "message=0" faults. If we have a mixture we will generate + * two separate suspect lists. + */ + srl = MALLOC(rpcnt * sizeof (struct rsl)); + bzero(srl, rpcnt * sizeof (struct rsl)); + srl2 = MALLOC(rpcnt * sizeof (struct rsl)); + bzero(srl2, rpcnt * sizeof (struct rsl)); + mess_zero_count = trim_suspects(fmep, srl, srl2, ffep, + &mess_zero_nonfault); + + /* + * If the resulting suspect list has no members, we're + * done so simply close the case. Otherwise sort and publish. + */ + if (fmep->nsuspects == 0 && mess_zero_count == 0) { + out(O_ALTFP, + "[FME%d, case %s (all suspects are upsets)]", + fmep->id, fmd_case_uuid(fmep->hdl, fmep->fmcase)); + fmd_case_close(fmep->hdl, fmep->fmcase); + } else if (fmep->nsuspects != 0 && mess_zero_count == 0) { + publish_suspects(fmep, srl); + out(O_ALTFP, "[solving FME%d, case %s]", fmep->id, + fmd_case_uuid(fmep->hdl, fmep->fmcase)); + fmd_case_solve(fmep->hdl, fmep->fmcase); + } else if (fmep->nsuspects == 0 && mess_zero_count != 0) { + fmep->nsuspects = mess_zero_count; + fmep->nonfault = mess_zero_nonfault; + publish_suspects(fmep, srl2); + out(O_ALTFP, "[solving FME%d, case %s]", fmep->id, + fmd_case_uuid(fmep->hdl, fmep->fmcase)); + fmd_case_solve(fmep->hdl, fmep->fmcase); + } else { + struct event *obsp; + struct fme *nfmep; + + publish_suspects(fmep, srl); + out(O_ALTFP, "[solving FME%d, case %s]", fmep->id, + fmd_case_uuid(fmep->hdl, fmep->fmcase)); + fmd_case_solve(fmep->hdl, fmep->fmcase); + + /* + * Got both message=0 and message=1 so create a + * duplicate case. Also need a temporary duplicate fme + * structure for use by publish_suspects(). + */ + nfmep = alloc_fme(); + nfmep->id = Nextid++; + nfmep->hdl = fmep->hdl; + nfmep->nsuspects = mess_zero_count; + nfmep->nonfault = mess_zero_nonfault; + nfmep->fmcase = fmd_case_open(fmep->hdl, NULL); + out(O_ALTFP|O_STAMP, + "[creating parallel FME%d, case %s]", nfmep->id, + fmd_case_uuid(nfmep->hdl, nfmep->fmcase)); + Open_fme_count++; + if (ffep) { + fmd_case_setprincipal(nfmep->hdl, + nfmep->fmcase, ffep); + fmd_case_add_ereport(nfmep->hdl, + nfmep->fmcase, ffep); + } + for (obsp = fmep->observations; obsp; + obsp = obsp->observations) + if (obsp->ffep && obsp->ffep != ffep) + fmd_case_add_ereport(nfmep->hdl, + nfmep->fmcase, obsp->ffep); + + publish_suspects(nfmep, srl2); + out(O_ALTFP, "[solving FME%d, case %s]", nfmep->id, + fmd_case_uuid(nfmep->hdl, nfmep->fmcase)); + fmd_case_solve(nfmep->hdl, nfmep->fmcase); + FREE(nfmep); + } + FREE(srl); + FREE(srl2); + restore_suspects(fmep); + fmep->posted_suspects = 1; fmd_buf_write(fmep->hdl, fmep->fmcase, WOBUF_POSTD, @@ -3201,29 +3355,6 @@ fme_eval(struct fme *fmep, fmd_event_t *ffep) break; } - if (fmep->posted_suspects == 1 && Autoclose != NULL) { - int doclose = 0; - - if (strcmp(Autoclose, "true") == 0 || - strcmp(Autoclose, "all") == 0) - doclose = 1; - - if (strcmp(Autoclose, "upsets") == 0) { - doclose = 1; - for (ep = fmep->suspects; ep; ep = ep->suspects) { - if (ep->t != N_UPSET) { - doclose = 0; - break; - } - } - } - - if (doclose) { - out(O_ALTFP, "[closing FME%d, case %s (autoclose)]", - fmep->id, fmd_case_uuid(fmep->hdl, fmep->fmcase)); - fmd_case_close(fmep->hdl, fmep->fmcase); - } - } itree_free(fmep->eventtree); fmep->eventtree = NULL; structconfig_free(fmep->config); @@ -3673,23 +3804,21 @@ requirements_test(struct fme *fmep, struct event *ep, ap = itree_next_arrow(bp, ap)) { ep2 = ap->arrowp->head->myevent; platform_set_payloadnvp(ep2->nvp); - if (checkconstraints(fmep, ap->arrowp) == 0) { + (void) checkconstraints(fmep, ap->arrowp); + if (ap->arrowp->forever_true) { /* - * if any arrow is invalidated by the + * if all arrows are invalidated by the * constraints, then we should elide the * whole bubble to be consistant with * the tree creation time behaviour */ - bp->mark |= BUBBLE_ELIDED; + bp->mark |= BUBBLE_OK; platform_set_payloadnvp(NULL); break; } platform_set_payloadnvp(NULL); } } - if (bp->mark & BUBBLE_ELIDED) - continue; - bp->mark |= BUBBLE_OK; for (ap = itree_next_arrow(bp, NULL); ap; ap = itree_next_arrow(bp, ap)) { ep2 = ap->arrowp->head->myevent; @@ -3722,6 +3851,10 @@ requirements_test(struct fme *fmep, struct event *ep, else deferred_events++; } + if (!(bp->mark & BUBBLE_OK) && waiting_events == 0) { + bp->mark |= BUBBLE_ELIDED; + continue; + } indent(); out(O_ALTFP|O_VERB, " Credible: %d Waiting %d", credible_events + deferred_events, waiting_events); diff --git a/usr/src/cmd/fm/modules/common/eversholt/iexpr.c b/usr/src/cmd/fm/modules/common/eversholt/iexpr.c index 8d255d192f..3c16f54e1f 100644 --- a/usr/src/cmd/fm/modules/common/eversholt/iexpr.c +++ b/usr/src/cmd/fm/modules/common/eversholt/iexpr.c @@ -120,6 +120,7 @@ iexpr_hash(struct node *np) return ((uintptr_t)np->u.quote.s); case T_NUM: + case T_TIMEVAL: return ((int)np->u.ull); default: @@ -208,6 +209,7 @@ iexpr_cmp(struct node *np1, struct node *np2) return (np2->u.quote.s - np1->u.quote.s); case T_NUM: + case T_TIMEVAL: if (np2->u.ull > np1->u.ull) return (1); else if (np1->u.ull > np2->u.ull) diff --git a/usr/src/cmd/fm/modules/common/eversholt/itree.c b/usr/src/cmd/fm/modules/common/eversholt/itree.c index 500c144a86..582fc6d856 100644 --- a/usr/src/cmd/fm/modules/common/eversholt/itree.c +++ b/usr/src/cmd/fm/modules/common/eversholt/itree.c @@ -119,6 +119,7 @@ static void itree_free_constraints(struct arrow *ap); */ static struct { int generation; /* generation number of arrow set */ + int matched; /* number of matches */ struct node *arrownp; /* top-level parse tree for arrow */ int n; /* n value associated with arrow */ int k; /* k value associated with arrow */ @@ -461,6 +462,13 @@ payloadprops_destructor(void *left, void *right, void *arg) FREE(right); } +/*ARGSUSED*/ +static void +serdprops_destructor(void *left, void *right, void *arg) +{ + FREE(right); +} + /* * event_cmp -- used via lut_lookup/lut_add on instance tree lut */ @@ -574,6 +582,9 @@ hmatch_event(struct info *infop, struct node *eventnp, struct node *epname, ASSERTeq(epname->t, T_NAME, ptree_nodetype2str); + if (epname->u.name.cp == NULL) + return; + /* * we only get here when eventnp already has a completely * instanced epname in it already. so we first recurse @@ -1040,6 +1051,7 @@ vmatch(struct info *infop, struct node *np, struct node *lnp, struct node *anp) struct wildcardinfo *wcp; if (np == NULL) { + G.matched = 1; if (lnp) vmatch(infop, lnp, NULL, anp); else if (anp) @@ -1119,6 +1131,7 @@ vmatch(struct info *infop, struct node *np, struct node *lnp, struct node *anp) np->u.event.epname = oldepname; return; } + G.matched = 0; if (epmatches) { /* * just first part of names match - do wildcarding @@ -1139,6 +1152,13 @@ vmatch(struct info *infop, struct node *np, struct node *lnp, struct node *anp) anp, wcp); wcp->oldepname = oldepname; wcp->nptop = oldnptop; + if (G.matched == 0) { + /* + * This list entry is NULL. Move on to next item + * in the list. + */ + vmatch(infop, NULL, lnp, anp); + } return; } /* @@ -1156,6 +1176,13 @@ vmatch(struct info *infop, struct node *np, struct node *lnp, struct node *anp) wcproot = wcp->next; FREE(wcp); + if (G.matched == 0) { + /* + * This list entry is NULL. Move on to next item in the + * list. + */ + vmatch(infop, NULL, lnp, anp); + } break; } case T_LIST: @@ -1165,7 +1192,7 @@ vmatch(struct info *infop, struct node *np, struct node *lnp, struct node *anp) case T_ARROW: ASSERT(lnp == NULL && anp == NULL); - vmatch(infop, np->u.arrow.rhs, NULL, np->u.arrow.lhs); + vmatch(infop, np->u.arrow.rhs, NULL, np->u.arrow.parent); break; default: @@ -1176,6 +1203,16 @@ vmatch(struct info *infop, struct node *np, struct node *lnp, struct node *anp) } static void +find_first_arrow(struct info *infop, struct node *anp) +{ + if (anp->u.arrow.lhs->t == T_ARROW) { + anp->u.arrow.lhs->u.arrow.parent = anp; + find_first_arrow(infop, anp->u.arrow.lhs); + } else + vmatch(infop, anp->u.arrow.lhs, NULL, anp); +} + +static void cp_reset(struct node *np) { if (np == NULL) @@ -1231,7 +1268,8 @@ itree_create(struct config *croot) Ninfo.ex = NULL; generate_arrownp(anp); - vmatch(&Ninfo, anp, NULL, NULL); + anp->u.arrow.parent = NULL; + find_first_arrow(&Ninfo, anp); if (Ninfo.ex) { lut_free(Ninfo.ex, iterinfo_destructor, NULL); @@ -1522,6 +1560,10 @@ itree_destructor(void *left, void *right, void *arg) if (ep->payloadprops) lut_free(ep->payloadprops, payloadprops_destructor, NULL); + /* Free the serd properties */ + if (ep->serdprops) + lut_free(ep->serdprops, serdprops_destructor, NULL); + /* Free my bubbles */ for (bub = ep->bubbles; bub != NULL; ) { nextbub = bub->next; @@ -1560,6 +1602,9 @@ itree_pruner(void *left, void *right, void *arg) /* Free the payload properties */ lut_free(ep->payloadprops, payloadprops_destructor, NULL); + /* Free the serd properties */ + lut_free(ep->serdprops, serdprops_destructor, NULL); + /* Free my bubbles */ for (bub = ep->bubbles; bub != NULL; ) { nextbub = bub->next; @@ -1572,6 +1617,7 @@ itree_pruner(void *left, void *right, void *arg) nvlist_free(ep->nvp); ep->props = NULL; ep->payloadprops = NULL; + ep->serdprops = NULL; ep->bubbles = NULL; ep->nvp = NULL; } diff --git a/usr/src/cmd/fm/modules/common/eversholt/itree.h b/usr/src/cmd/fm/modules/common/eversholt/itree.h index 946a076199..d214f1d9d6 100644 --- a/usr/src/cmd/fm/modules/common/eversholt/itree.h +++ b/usr/src/cmd/fm/modules/common/eversholt/itree.h @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. * * itree.h -- public definitions for itree module @@ -37,6 +37,7 @@ extern "C" { /* the "fault" field in the event struct requires the definition of nvlist_t */ #include <sys/fm/protocol.h> +#include <fm/fmd_api.h> /* Numerical representation of propagation N value (A), short for All */ #define N_IS_ALL -1 @@ -77,11 +78,13 @@ struct event { struct event *suspects; struct event *psuspects; struct event *observations; /* for lists like suspect list */ + fmd_event_t *ffep; nvlist_t *nvp; /* payload nvp for ereports */ struct node *enode; /* event node in parse tree */ const struct ipath *ipp; /* instanced version of event */ struct lut *props; /* instanced version of nvpairs */ struct lut *payloadprops; /* nvpairs for problem payload */ + struct lut *serdprops; /* nvpairs for dynamic serd args */ int count; /* for reports, number seen */ enum nametype t:3; /* defined in tree.h */ int is_suspect:1; /* true if on suspect list */ diff --git a/usr/src/cmd/fm/modules/common/eversholt/platform.c b/usr/src/cmd/fm/modules/common/eversholt/platform.c index 8b814e40c9..8dec2a25e9 100644 --- a/usr/src/cmd/fm/modules/common/eversholt/platform.c +++ b/usr/src/cmd/fm/modules/common/eversholt/platform.c @@ -733,117 +733,30 @@ cfgstrprop_lookup(struct config *croot, char *path, char *pname) return (fmristr); } -static nvlist_t * -rewrite_resource(char *pname, struct config *croot, char *path) -{ - const char *fmristr; - nvlist_t *fmri; - int err; - - if ((fmristr = cfgstrprop_lookup(croot, path, pname)) == NULL) - return (NULL); - - if (topo_fmri_str2nvl(Eft_topo_hdl, fmristr, &fmri, &err) < 0) { - out(O_ALTFP, "Can not convert config info: %s", - topo_strerror(err)); - return (NULL); - } - - return (fmri); -} - -static void -defect_units(nvlist_t **ap, struct config *croot, char *path) -{ - const char *modstr; - nvlist_t *na; - int err; - - /* - * Defects aren't required to have ASRUs defined with - * them in the eversholt fault tree, so usually we'll be - * creating original FMRIs here. If the ASRU - * is defined when we get here, we won't replace it. - */ - if (*ap != NULL) - return; - - /* - * Find the driver for this resource and use that to get - * a mod fmri for ASRU. There are no FRUs for defects. - */ - if ((modstr = cfgstrprop_lookup(croot, path, TOPO_IO_MODULE)) == NULL) - return; - - if (topo_fmri_str2nvl(Eft_topo_hdl, modstr, &na, &err) < 0) { - out(O_ALTFP, "topo_fmri_str2nvl() of %s failed", modstr); - return; - } - - *ap = na; -} - /* - * platform_units_translate - * This routines offers a chance for platform-specific rewrites of - * the hc scheme FRU and ASRUs associated with a suspect fault. + * Get resource FMRI from libtopo */ /*ARGSUSED*/ void platform_units_translate(int isdefect, struct config *croot, nvlist_t **dfltasru, nvlist_t **dfltfru, nvlist_t **dfltrsrc, char *path) { - nvlist_t *asru, *rsrc, *fru; - - out(O_ALTFP, "platform_units_translate(%d, ....)", isdefect); + const char *fmristr; + nvlist_t *rsrc; + int err; - /* - * Get our FMRIs from libtopo - */ - if ((rsrc = rewrite_resource(TOPO_PROP_RESOURCE, croot, path)) - == NULL) { + fmristr = cfgstrprop_lookup(croot, path, TOPO_PROP_RESOURCE); + if (fmristr == NULL) { out(O_ALTFP, "Cannot rewrite resource for %s.", path); - } else { - nvlist_free(*dfltrsrc); - *dfltrsrc = rsrc; - } - - /* - * If it is a defect we want to re-write the FRU as the pkg - * scheme fmri of the package containing the buggy driver, and - * the ASRU as the mod scheme fmri of the driver's kernel - * module. - */ - if (isdefect) { - defect_units(dfltasru, croot, path); return; } - - /* - * Find the TOPO_PROP_ASRU and TOPO_PROP_FRU properties - * for this resource if *dfltasru and *dfltfru are set - */ - if (*dfltasru != NULL) { - if ((asru = rewrite_resource(TOPO_PROP_ASRU, croot, path)) - == NULL) { - out(O_ALTFP, "Cannot rewrite %s for %s.", - TOPO_PROP_ASRU, path); - } else { - nvlist_free(*dfltasru); - *dfltasru = asru; - } - } - - if (*dfltfru != NULL) { - if ((fru = rewrite_resource(TOPO_PROP_FRU, croot, path)) - == NULL) { - out(O_ALTFP, "Cannot rewrite %s for %s.", - TOPO_PROP_FRU, path); - } else { - nvlist_free(*dfltfru); - *dfltfru = fru; - } + if (topo_fmri_str2nvl(Eft_topo_hdl, fmristr, &rsrc, &err) < 0) { + out(O_ALTFP, "Can not convert config info: %s", + topo_strerror(err)); + out(O_ALTFP, "Cannot rewrite resource for %s.", path); + return; } + *dfltrsrc = rsrc; } /* @@ -1421,106 +1334,7 @@ int platform_confcall(struct node *np, struct lut **globals, struct config *croot, struct arrow *arrowp, struct evalue *valuep) { - nvlist_t *rsrc, *hcs; - nvpair_t *nvp; - - ASSERT(np != NULL); - - /* assume we're returning true */ - valuep->t = UINT64; - valuep->v = 1; - - /* - * We've detected a well-formed confcall() to rewrite - * an ASRU in a fault. We get here via lines like this - * in the eversholt rules: - * - * event fault.memory.page@dimm, FITrate=PAGE_FIT, - * ASRU=dimm, message=0, - * count=stat.page_fault@dimm, - * action=confcall("rewrite-ASRU"); - * - * So first rewrite the resource in the fault. Any payload data - * following the FM_FMRI_HC_SPECIFIC member is used to expand the - * resource nvlist. Next, use libtopo to compute the ASRU from - * from the new resource. - */ - if (np->t == T_QUOTE && np->u.quote.s == stable("rewrite-ASRU")) { - int err; - nvlist_t *asru; - - out(O_ALTFP|O_VERB, "platform_confcall: rewrite-ASRU"); - - if (nvlist_lookup_nvlist(Action_nvl, FM_FAULT_RESOURCE, &rsrc) - != 0) { - outfl(O_ALTFP|O_VERB, np->file, np->line, "no resource " - "in fault event"); - return (0); - } - - if (topo_hdl_nvalloc(Eft_topo_hdl, &hcs, NV_UNIQUE_NAME) != 0) { - outfl(O_ALTFP|O_VERB, np->file, np->line, - "unable to allocate nvlist for resource rewrite"); - return (0); - } - - /* - * Loop until we run across asru-specific payload. All - * payload members prefixed "asru-" will be added to the - * hc-specific nvlist and removed from the original. - */ - nvp = nvlist_next_nvpair(Action_nvl, NULL); - while (nvp != NULL) { - if (strncmp(nvpair_name(nvp), "asru-", 5) == 0) { - if (nvlist_add_nvpair(hcs, nvp) != 0) { - nvlist_free(hcs); - outfl(O_ALTFP|O_VERB, np->file, - np->line, "unable to rewrite " - "resource - nvlist_add_nvpair for " - "'%s' failed", nvpair_name(nvp)); - return (0); - } - - (void) nvlist_remove(Action_nvl, - nvpair_name(nvp), nvpair_type(nvp)); - nvp = nvlist_next_nvpair(Action_nvl, NULL); - } else { - nvp = nvlist_next_nvpair(Action_nvl, nvp); - } - } - - if (nvlist_add_nvlist(rsrc, FM_FMRI_HC_SPECIFIC, hcs) != 0) { - nvlist_free(hcs); - outfl(O_ALTFP|O_VERB, np->file, np->line, "unable to " - "rewrite resource with HC specific data"); - return (0); - } - nvlist_free(hcs); - - if (topo_fmri_asru(Eft_topo_hdl, rsrc, &asru, &err) != 0) { - outfl(O_ALTFP|O_VERB, np->file, np->line, "unable to " - "rewrite asru: %s", topo_strerror(err)); - return (0); - } - - if (nvlist_remove(Action_nvl, FM_FAULT_ASRU, DATA_TYPE_NVLIST) - != 0) { - nvlist_free(asru); - outfl(O_ALTFP|O_VERB, np->file, np->line, - "failed to remove old asru during rewrite"); - return (0); - } - if (nvlist_add_nvlist(Action_nvl, FM_FAULT_ASRU, asru) != 0) { - nvlist_free(asru); - outfl(O_ALTFP|O_VERB, np->file, np->line, - "unable to add re-written asru"); - return (0); - } - nvlist_free(asru); - } else { - outfl(O_ALTFP|O_VERB, np->file, np->line, "unknown confcall"); - } - + outfl(O_ALTFP|O_VERB, np->file, np->line, "unknown confcall"); return (0); } diff --git a/usr/src/cmd/fm/modules/common/io-retire/rio_main.c b/usr/src/cmd/fm/modules/common/io-retire/rio_main.c index 7277eca7fd..072ed3e809 100644 --- a/usr/src/cmd/fm/modules/common/io-retire/rio_main.c +++ b/usr/src/cmd/fm/modules/common/io-retire/rio_main.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -135,6 +135,7 @@ rio_recv(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class) int rval; int error; char *snglfault = FM_FAULT_CLASS"."FM_ERROR_IO"."; + boolean_t rtr; /* @@ -172,6 +173,12 @@ rio_recv(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class) devpath[0] = '\0'; rval = 0; for (f = 0; f < nfaults; f++) { + if (nvlist_lookup_boolean_value(faults[f], FM_SUSPECT_RETIRE, + &rtr) == 0 && !rtr) { + fmd_hdl_debug(hdl, "rio_recv: retire suppressed"); + continue; + } + if (nvlist_lookup_nvlist(faults[f], FM_FAULT_ASRU, &asru) != 0) { fmd_hdl_debug(hdl, "rio_recv: no asru in fault"); diff --git a/usr/src/cmd/fm/schemes/cpu/cpu.c b/usr/src/cmd/fm/schemes/cpu/cpu.c index 4c74803932..7f88913d0d 100644 --- a/usr/src/cmd/fm/schemes/cpu/cpu.c +++ b/usr/src/cmd/fm/schemes/cpu/cpu.c @@ -44,81 +44,23 @@ ssize_t fmd_fmri_nvl2str(nvlist_t *nvl, char *buf, size_t buflen) { int err; - uint8_t version, type; - uint32_t cpuid, index, way; - uint64_t serint; - char *serstr = NULL; + ssize_t len; + topo_hdl_t *thp; + char *str; - if (nvlist_lookup_uint8(nvl, FM_VERSION, &version) != 0) + if ((thp = fmd_fmri_topo_hold(TOPO_VERSION)) == NULL) return (fmd_fmri_set_errno(EINVAL)); - - if (version == CPU_SCHEME_VERSION0) { - if (nvlist_lookup_uint32(nvl, FM_FMRI_CPU_ID, &cpuid) != 0 || - nvlist_lookup_uint64(nvl, FM_FMRI_CPU_SERIAL_ID, &serint) - != 0) - return (fmd_fmri_set_errno(EINVAL)); - - return (snprintf(buf, buflen, "cpu:///%s=%u/%s=%llX", - FM_FMRI_CPU_ID, cpuid, FM_FMRI_CPU_SERIAL_ID, - (u_longlong_t)serint)); - - } else if (version == CPU_SCHEME_VERSION1) { - if (nvlist_lookup_uint32(nvl, FM_FMRI_CPU_ID, &cpuid) != 0) - return (fmd_fmri_set_errno(EINVAL)); - - /* - * Serial number is an optional element - */ - if ((err = nvlist_lookup_string(nvl, FM_FMRI_CPU_SERIAL_ID, - &serstr)) != 0) - - if (err != ENOENT) - return (fmd_fmri_set_errno(EINVAL)); - - /* - * Cache index, way and type are optional elements - * But if we have one of them, we must have them all. - */ - err = nvlist_lookup_uint32(nvl, FM_FMRI_CPU_CACHE_INDEX, - &index); - err |= nvlist_lookup_uint32(nvl, FM_FMRI_CPU_CACHE_WAY, &way); - err |= nvlist_lookup_uint8(nvl, FM_FMRI_CPU_CACHE_TYPE, &type); - - /* Insure there were no errors accessing the nvl */ - if (err != 0 && err != ENOENT) - return (fmd_fmri_set_errno(EINVAL)); - - if (serstr == NULL) { - /* If we have a serial string and no cache info */ - if (err == ENOENT) - return (snprintf(buf, buflen, "cpu:///%s=%u", - FM_FMRI_CPU_ID, cpuid)); - else { - return (snprintf(buf, buflen, - "cpu:///%s=%u/%s=%u/%s=%u/%s=%d", - FM_FMRI_CPU_ID, cpuid, - FM_FMRI_CPU_CACHE_INDEX, index, - FM_FMRI_CPU_CACHE_WAY, way, - FM_FMRI_CPU_CACHE_TYPE, type)); - } - } else { - if (err == ENOENT) { - return (snprintf(buf, buflen, - "cpu:///%s=%u/%s=%s", - FM_FMRI_CPU_ID, cpuid, - FM_FMRI_CPU_SERIAL_ID, serstr)); - } else { - return (snprintf(buf, buflen, - "cpu:///%s=%u/%s=%s/%s=%u/%s=%u/%s=%d", - FM_FMRI_CPU_ID, cpuid, - FM_FMRI_CPU_SERIAL_ID, serstr, - FM_FMRI_CPU_CACHE_INDEX, index, - FM_FMRI_CPU_CACHE_WAY, way, - FM_FMRI_CPU_CACHE_TYPE, type)); - } - } - } else + if (topo_fmri_nvl2str(thp, nvl, &str, &err) != 0) { + fmd_fmri_topo_rele(thp); return (fmd_fmri_set_errno(EINVAL)); + } + if (buf != NULL) + len = snprintf(buf, buflen, "%s", str); + else + len = strlen(str); + topo_hdl_strfree(thp, str); + fmd_fmri_topo_rele(thp); + return (len); } /* diff --git a/usr/src/cmd/fm/schemes/fmd/scheme.c b/usr/src/cmd/fm/schemes/fmd/scheme.c index 5cc5854a16..e17d068266 100644 --- a/usr/src/cmd/fm/schemes/fmd/scheme.c +++ b/usr/src/cmd/fm/schemes/fmd/scheme.c @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -20,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -43,3 +42,17 @@ fmd_fmri_nvl2str(nvlist_t *nvl, char *buf, size_t buflen) return (snprintf(buf, buflen, "%s:///module/%s", FM_FMRI_SCHEME_FMD, name)); } + +/*ARGSUSED*/ +int +fmd_fmri_present(nvlist_t *nvl) +{ + return (1); +} + +/*ARGSUSED*/ +int +fmd_fmri_unusable(nvlist_t *nvl) +{ + return (0); +} diff --git a/usr/src/cmd/fm/schemes/legacy-hc/scheme.c b/usr/src/cmd/fm/schemes/legacy-hc/scheme.c index 7988534da2..92524ca51e 100644 --- a/usr/src/cmd/fm/schemes/legacy-hc/scheme.c +++ b/usr/src/cmd/fm/schemes/legacy-hc/scheme.c @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -20,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -46,3 +45,17 @@ fmd_fmri_nvl2str(nvlist_t *nvl, char *buf, size_t buflen) return (size); } + +/*ARGSUSED*/ +int +fmd_fmri_present(nvlist_t *nvl) +{ + return (1); +} + +/*ARGSUSED*/ +int +fmd_fmri_unusable(nvlist_t *nvl) +{ + return (0); +} diff --git a/usr/src/cmd/fm/schemes/mod/amd64/Makefile b/usr/src/cmd/fm/schemes/mod/amd64/Makefile index b12450b1d8..46d6bb8f0d 100644 --- a/usr/src/cmd/fm/schemes/mod/amd64/Makefile +++ b/usr/src/cmd/fm/schemes/mod/amd64/Makefile @@ -20,7 +20,7 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" @@ -28,6 +28,12 @@ include ../../Makefile.com include $(SRC)/Makefile.master.64 + +LDLIBS += \ + -L$(ROOTLIB)/fm/$(MACH64) -ltopo +LDFLAGS += -R/usr/lib/fm/$(MACH64) + + include ../../Makefile.targ install: all $(ROOTPROG64) diff --git a/usr/src/cmd/fm/schemes/mod/i386/Makefile b/usr/src/cmd/fm/schemes/mod/i386/Makefile index b2953a27d9..9e893bfdfe 100644 --- a/usr/src/cmd/fm/schemes/mod/i386/Makefile +++ b/usr/src/cmd/fm/schemes/mod/i386/Makefile @@ -20,13 +20,18 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" # include ../../Makefile.com + +LDLIBS += \ + -L$(ROOTLIB)/fm -ltopo +LDFLAGS += -R/usr/lib/fm + include ../../Makefile.targ install: all $(ROOTPROG) diff --git a/usr/src/cmd/fm/schemes/mod/scheme.c b/usr/src/cmd/fm/schemes/mod/scheme.c index 7284bb54a8..87f728b5f8 100644 --- a/usr/src/cmd/fm/schemes/mod/scheme.c +++ b/usr/src/cmd/fm/schemes/mod/scheme.c @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -20,144 +19,41 @@ * CDDL HEADER END */ /* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" #include <fm/fmd_fmri.h> - -/* - * buf_append -- Append str to buf (if it's non-NULL). Place prepend - * in buf in front of str and append behind it (if they're non-NULL). - * Continue to update size even if we run out of space to actually - * stuff characters in the buffer. - */ -static void -buf_append(ssize_t *sz, char *buf, size_t buflen, char *str, - char *prepend, char *append) -{ - ssize_t left; - - if (str == NULL) - return; - - if (buflen == 0 || (left = buflen - *sz) < 0) - left = 0; - - if (buf != NULL && left != 0) - buf += *sz; - - if (prepend == NULL && append == NULL) - *sz += snprintf(buf, left, "%s", str); - else if (append == NULL) - *sz += snprintf(buf, left, "%s%s", prepend, str); - else if (prepend == NULL) - *sz += snprintf(buf, left, "%s%s", str, append); - else - *sz += snprintf(buf, left, "%s%s%s", prepend, str, append); -} - -/* - * Maximum 32 bit integer is 2147483647, which is 10 digits. A buffer - * of 11 bytes can therefore contain the null-terminated ascii - * representation of any integer module id. - */ -#define MAXINTSTR 11 +#include <fm/libtopo.h> +#include <strings.h> ssize_t fmd_fmri_nvl2str(nvlist_t *nvl, char *buf, size_t buflen) { - nvlist_t *anvl = NULL; - uint8_t version; - ssize_t size = 0; - int32_t modid; - char *achas = NULL; - char *adom = NULL; - char *aprod = NULL; - char *asrvr = NULL; - char *ahost = NULL; - char *modname = NULL; - char numbuf[MAXINTSTR]; - int more_auth = 0; int err; + ssize_t len; + topo_hdl_t *thp; + char *str; - if (nvlist_lookup_uint8(nvl, FM_VERSION, &version) != 0 || - version > FM_MOD_SCHEME_VERSION) - return (fmd_fmri_set_errno(EINVAL)); - - /* Get authority, if present */ - err = nvlist_lookup_nvlist(nvl, FM_FMRI_AUTHORITY, &anvl); - if (err != 0 && err != ENOENT) - return (fmd_fmri_set_errno(err)); - - /* - * For brevity, we only include the module name and id - * present in the FMRI in our output string. The FMRI - * also has data on the package containing the module. - */ - - /* There must be a module name */ - err = nvlist_lookup_string(nvl, FM_FMRI_MOD_NAME, &modname); - if (err != 0 || modname == NULL) + if ((thp = fmd_fmri_topo_hold(TOPO_VERSION)) == NULL) return (fmd_fmri_set_errno(EINVAL)); - /* There must be a module id */ - err = nvlist_lookup_int32(nvl, FM_FMRI_MOD_ID, &modid); - if (err != 0) + if (topo_fmri_nvl2str(thp, nvl, &str, &err) != 0) { + fmd_fmri_topo_rele(thp); return (fmd_fmri_set_errno(EINVAL)); - - if (anvl != NULL) { - (void) nvlist_lookup_string(anvl, - FM_FMRI_AUTH_PRODUCT, &aprod); - (void) nvlist_lookup_string(anvl, - FM_FMRI_AUTH_CHASSIS, &achas); - (void) nvlist_lookup_string(anvl, - FM_FMRI_AUTH_DOMAIN, &adom); - (void) nvlist_lookup_string(anvl, - FM_FMRI_AUTH_SERVER, &asrvr); - (void) nvlist_lookup_string(anvl, - FM_FMRI_AUTH_HOST, &ahost); - if (aprod != NULL) - more_auth++; - if (achas != NULL) - more_auth++; - if (adom != NULL) - more_auth++; - if (asrvr != NULL) - more_auth++; - if (ahost != NULL) - more_auth++; } - /* mod:// */ - buf_append(&size, buf, buflen, FM_FMRI_SCHEME_MOD, NULL, "://"); - - /* authority, if any */ - if (aprod != NULL) - buf_append(&size, buf, buflen, aprod, FM_FMRI_AUTH_PRODUCT "=", - --more_auth > 0 ? "," : NULL); - if (achas != NULL) - buf_append(&size, buf, buflen, achas, FM_FMRI_AUTH_CHASSIS "=", - --more_auth > 0 ? "," : NULL); - if (adom != NULL) - buf_append(&size, buf, buflen, adom, FM_FMRI_AUTH_DOMAIN "=", - --more_auth > 0 ? "," : NULL); - if (asrvr != NULL) - buf_append(&size, buf, buflen, asrvr, FM_FMRI_AUTH_SERVER "=", - --more_auth > 0 ? "," : NULL); - if (ahost != NULL) - buf_append(&size, buf, buflen, ahost, FM_FMRI_AUTH_HOST "=", - NULL); - - /* module parts */ - buf_append(&size, buf, buflen, modname, "/" FM_FMRI_MOD_NAME "=", "/"); + if (buf != NULL) + len = snprintf(buf, buflen, "%s", str); + else + len = strlen(str); - (void) snprintf(numbuf, MAXINTSTR, "%d", modid); - buf_append(&size, buf, buflen, numbuf, FM_FMRI_MOD_ID "=", NULL); + topo_hdl_strfree(thp, str); + fmd_fmri_topo_rele(thp); - return (size); + return (len); } /* diff --git a/usr/src/cmd/fm/schemes/mod/sparc/Makefile b/usr/src/cmd/fm/schemes/mod/sparc/Makefile index b2953a27d9..71a7f04c9c 100644 --- a/usr/src/cmd/fm/schemes/mod/sparc/Makefile +++ b/usr/src/cmd/fm/schemes/mod/sparc/Makefile @@ -20,13 +20,19 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" # include ../../Makefile.com + + +LDLIBS += \ + -L$(ROOTLIB)/fm -ltopo +LDFLAGS += -R/usr/lib/fm + include ../../Makefile.targ install: all $(ROOTPROG) diff --git a/usr/src/cmd/fm/schemes/mod/sparcv9/Makefile b/usr/src/cmd/fm/schemes/mod/sparcv9/Makefile index b12450b1d8..2b3df05680 100644 --- a/usr/src/cmd/fm/schemes/mod/sparcv9/Makefile +++ b/usr/src/cmd/fm/schemes/mod/sparcv9/Makefile @@ -20,7 +20,7 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" @@ -28,6 +28,11 @@ include ../../Makefile.com include $(SRC)/Makefile.master.64 + +LDLIBS += \ + -L$(ROOTLIB)/fm/$(MACH64) -ltopo +LDFLAGS += -R/usr/lib/fm/$(MACH64) + include ../../Makefile.targ install: all $(ROOTPROG64) diff --git a/usr/src/cmd/fm/schemes/pkg/amd64/Makefile b/usr/src/cmd/fm/schemes/pkg/amd64/Makefile index b12450b1d8..46d6bb8f0d 100644 --- a/usr/src/cmd/fm/schemes/pkg/amd64/Makefile +++ b/usr/src/cmd/fm/schemes/pkg/amd64/Makefile @@ -20,7 +20,7 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" @@ -28,6 +28,12 @@ include ../../Makefile.com include $(SRC)/Makefile.master.64 + +LDLIBS += \ + -L$(ROOTLIB)/fm/$(MACH64) -ltopo +LDFLAGS += -R/usr/lib/fm/$(MACH64) + + include ../../Makefile.targ install: all $(ROOTPROG64) diff --git a/usr/src/cmd/fm/schemes/pkg/i386/Makefile b/usr/src/cmd/fm/schemes/pkg/i386/Makefile index b2953a27d9..9e893bfdfe 100644 --- a/usr/src/cmd/fm/schemes/pkg/i386/Makefile +++ b/usr/src/cmd/fm/schemes/pkg/i386/Makefile @@ -20,13 +20,18 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" # include ../../Makefile.com + +LDLIBS += \ + -L$(ROOTLIB)/fm -ltopo +LDFLAGS += -R/usr/lib/fm + include ../../Makefile.targ install: all $(ROOTPROG) diff --git a/usr/src/cmd/fm/schemes/pkg/scheme.c b/usr/src/cmd/fm/schemes/pkg/scheme.c index 7196368f2c..87f728b5f8 100644 --- a/usr/src/cmd/fm/schemes/pkg/scheme.c +++ b/usr/src/cmd/fm/schemes/pkg/scheme.c @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -20,125 +19,41 @@ * CDDL HEADER END */ /* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" #include <fm/fmd_fmri.h> - -/* - * buf_append -- Append str to buf (if it's non-NULL). Place prepend - * in buf in front of str and append behind it (if they're non-NULL). - * Continue to update size even if we run out of space to actually - * stuff characters in the buffer. - */ -static void -buf_append(ssize_t *sz, char *buf, size_t buflen, char *str, - char *prepend, char *append) -{ - ssize_t left; - - if (str == NULL) - return; - - if (buflen == 0 || (left = buflen - *sz) < 0) - left = 0; - - if (buf != NULL && left != 0) - buf += *sz; - - if (prepend == NULL && append == NULL) - *sz += snprintf(buf, left, "%s", str); - else if (append == NULL) - *sz += snprintf(buf, left, "%s%s", prepend, str); - else if (prepend == NULL) - *sz += snprintf(buf, left, "%s%s", str, append); - else - *sz += snprintf(buf, left, "%s%s%s", prepend, str, append); -} +#include <fm/libtopo.h> +#include <strings.h> ssize_t fmd_fmri_nvl2str(nvlist_t *nvl, char *buf, size_t buflen) { - nvlist_t *anvl = NULL; - uint8_t version; - ssize_t size = 0; - char *pkgname = NULL; - char *achas = NULL; - char *adom = NULL; - char *aprod = NULL; - char *asrvr = NULL; - char *ahost = NULL; - int more_auth = 0; int err; + ssize_t len; + topo_hdl_t *thp; + char *str; - if (nvlist_lookup_uint8(nvl, FM_VERSION, &version) != 0 || - version > FM_PKG_SCHEME_VERSION) + if ((thp = fmd_fmri_topo_hold(TOPO_VERSION)) == NULL) return (fmd_fmri_set_errno(EINVAL)); - /* Get authority, if present */ - err = nvlist_lookup_nvlist(nvl, FM_FMRI_AUTHORITY, &anvl); - if (err != 0 && err != ENOENT) - return (fmd_fmri_set_errno(err)); - - /* - * For brevity, we only include the pkgname and any authority - * info present in the FMRI in our output string. The FMRI - * also has data on the package directory and version. - */ - err = nvlist_lookup_string(nvl, FM_FMRI_PKG_INST, &pkgname); - if (err != 0 || pkgname == NULL) + if (topo_fmri_nvl2str(thp, nvl, &str, &err) != 0) { + fmd_fmri_topo_rele(thp); return (fmd_fmri_set_errno(EINVAL)); - - if (anvl != NULL) { - (void) nvlist_lookup_string(anvl, - FM_FMRI_AUTH_PRODUCT, &aprod); - (void) nvlist_lookup_string(anvl, - FM_FMRI_AUTH_CHASSIS, &achas); - (void) nvlist_lookup_string(anvl, - FM_FMRI_AUTH_DOMAIN, &adom); - (void) nvlist_lookup_string(anvl, - FM_FMRI_AUTH_SERVER, &asrvr); - (void) nvlist_lookup_string(anvl, - FM_FMRI_AUTH_HOST, &ahost); - if (aprod != NULL) - more_auth++; - if (achas != NULL) - more_auth++; - if (adom != NULL) - more_auth++; - if (asrvr != NULL) - more_auth++; - if (ahost != NULL) - more_auth++; } - /* pkg:// */ - buf_append(&size, buf, buflen, FM_FMRI_SCHEME_PKG, NULL, "://"); - - /* authority, if any */ - if (aprod != NULL) - buf_append(&size, buf, buflen, aprod, FM_FMRI_AUTH_PRODUCT "=", - --more_auth > 0 ? "," : NULL); - if (achas != NULL) - buf_append(&size, buf, buflen, achas, FM_FMRI_AUTH_CHASSIS "=", - --more_auth > 0 ? "," : NULL); - if (adom != NULL) - buf_append(&size, buf, buflen, adom, FM_FMRI_AUTH_DOMAIN "=", - --more_auth > 0 ? "," : NULL); - if (asrvr != NULL) - buf_append(&size, buf, buflen, asrvr, FM_FMRI_AUTH_SERVER "=", - --more_auth > 0 ? "," : NULL); - if (ahost != NULL) - buf_append(&size, buf, buflen, ahost, FM_FMRI_AUTH_HOST "=", - NULL); + if (buf != NULL) + len = snprintf(buf, buflen, "%s", str); + else + len = strlen(str); - /* pkg-name part */ - buf_append(&size, buf, buflen, pkgname, "/", NULL); + topo_hdl_strfree(thp, str); + fmd_fmri_topo_rele(thp); - return (size); + return (len); } /* diff --git a/usr/src/cmd/fm/schemes/pkg/sparc/Makefile b/usr/src/cmd/fm/schemes/pkg/sparc/Makefile index b2953a27d9..71a7f04c9c 100644 --- a/usr/src/cmd/fm/schemes/pkg/sparc/Makefile +++ b/usr/src/cmd/fm/schemes/pkg/sparc/Makefile @@ -20,13 +20,19 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" # include ../../Makefile.com + + +LDLIBS += \ + -L$(ROOTLIB)/fm -ltopo +LDFLAGS += -R/usr/lib/fm + include ../../Makefile.targ install: all $(ROOTPROG) diff --git a/usr/src/cmd/fm/schemes/pkg/sparcv9/Makefile b/usr/src/cmd/fm/schemes/pkg/sparcv9/Makefile index b12450b1d8..2b3df05680 100644 --- a/usr/src/cmd/fm/schemes/pkg/sparcv9/Makefile +++ b/usr/src/cmd/fm/schemes/pkg/sparcv9/Makefile @@ -20,7 +20,7 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" @@ -28,6 +28,11 @@ include ../../Makefile.com include $(SRC)/Makefile.master.64 + +LDLIBS += \ + -L$(ROOTLIB)/fm/$(MACH64) -ltopo +LDFLAGS += -R/usr/lib/fm/$(MACH64) + include ../../Makefile.targ install: all $(ROOTPROG64) diff --git a/usr/src/lib/fm/topo/libtopo/Makefile.com b/usr/src/lib/fm/topo/libtopo/Makefile.com index 295f33d885..e2e2a4e69a 100644 --- a/usr/src/lib/fm/topo/libtopo/Makefile.com +++ b/usr/src/lib/fm/topo/libtopo/Makefile.com @@ -32,6 +32,9 @@ BUILTINSRCS = \ cpu.c \ dev.c \ hc.c \ + zfs.c \ + fmd.c \ + legacy_hc.c \ mem.c \ mod.c \ pkg.c diff --git a/usr/src/lib/fm/topo/libtopo/amd64/Makefile b/usr/src/lib/fm/topo/libtopo/amd64/Makefile index f81fcaa5f0..2506edb291 100644 --- a/usr/src/lib/fm/topo/libtopo/amd64/Makefile +++ b/usr/src/lib/fm/topo/libtopo/amd64/Makefile @@ -19,7 +19,7 @@ # CDDL HEADER END # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" @@ -28,4 +28,6 @@ include ../Makefile.com include ../../../../Makefile.lib.64 +LDLIBS += -lzfs + install: all $(ROOTLIBS64) $(ROOTLINKS64) $(ROOTLINT64) diff --git a/usr/src/lib/fm/topo/libtopo/common/fmd.c b/usr/src/lib/fm/topo/libtopo/common/fmd.c new file mode 100644 index 0000000000..1b8898770e --- /dev/null +++ b/usr/src/lib/fm/topo/libtopo/common/fmd.c @@ -0,0 +1,155 @@ +/* + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <ctype.h> +#include <alloca.h> +#include <limits.h> +#include <fm/topo_mod.h> +#include <sys/param.h> +#include <sys/systeminfo.h> +#include <sys/fm/protocol.h> +#include <sys/stat.h> + +#include <topo_method.h> +#include <topo_subr.h> +#include <fmd.h> + +static int fmd_enum(topo_mod_t *, tnode_t *, const char *, topo_instance_t, + topo_instance_t, void *, void *); +static void fmd_release(topo_mod_t *, tnode_t *); +static int fmd_fmri_nvl2str(topo_mod_t *, tnode_t *, topo_version_t, + nvlist_t *, nvlist_t **); + +const topo_method_t fmd_methods[] = { + { TOPO_METH_NVL2STR, TOPO_METH_NVL2STR_DESC, TOPO_METH_NVL2STR_VERSION, + TOPO_STABILITY_INTERNAL, fmd_fmri_nvl2str }, + { NULL } +}; + +static const topo_modops_t fmd_ops = + { fmd_enum, fmd_release }; +static const topo_modinfo_t fmd_info = + { FMD, FM_FMRI_SCHEME_FMD, FMD_VERSION, &fmd_ops }; + +int +fmd_init(topo_mod_t *mod, topo_version_t version) +{ + /* + * Turn on module debugging output + */ + if (getenv("TOPOFMDDEBUG")) + topo_mod_setdebug(mod); + + topo_mod_dprintf(mod, "initializing fmd builtin\n"); + + if (version != FMD_VERSION) + return (topo_mod_seterrno(mod, EMOD_VER_NEW)); + + if (topo_mod_register(mod, &fmd_info, TOPO_VERSION) != 0) { + topo_mod_dprintf(mod, "failed to register fmd: " + "%s\n", topo_mod_errmsg(mod)); + return (-1); /* mod errno already set */ + } + + return (0); +} + +void +fmd_fini(topo_mod_t *mod) +{ + topo_mod_unregister(mod); +} + + +/*ARGSUSED*/ +int +fmd_enum(topo_mod_t *mod, tnode_t *pnode, const char *name, topo_instance_t min, + topo_instance_t max, void *notused1, void *notused2) +{ + (void) topo_method_register(mod, pnode, fmd_methods); + return (0); +} + +/*ARGSUSED*/ +static void +fmd_release(topo_mod_t *mp, tnode_t *node) +{ + topo_method_unregister_all(mp, node); +} + +static ssize_t +fmri_nvl2str(nvlist_t *nvl, char *buf, size_t buflen) +{ + char *name; + + if (nvlist_lookup_string(nvl, FM_FMRI_FMD_NAME, &name) != 0) + return (0); + + return (snprintf(buf, buflen, + "%s:///module/%s", FM_FMRI_SCHEME_FMD, name)); +} + +/*ARGSUSED*/ +static int +fmd_fmri_nvl2str(topo_mod_t *mod, tnode_t *node, topo_version_t version, + nvlist_t *nvl, nvlist_t **out) +{ + ssize_t len; + char *name = NULL; + nvlist_t *fmristr; + + if (version > TOPO_METH_NVL2STR_VERSION) + return (topo_mod_seterrno(mod, EMOD_VER_NEW)); + + if ((len = fmri_nvl2str(nvl, NULL, 0)) == 0 || + (name = topo_mod_alloc(mod, len + 1)) == NULL || + fmri_nvl2str(nvl, name, len + 1) == 0) { + if (name != NULL) + topo_mod_free(mod, name, len + 1); + return (topo_mod_seterrno(mod, EMOD_FMRI_NVL)); + } + + if (topo_mod_nvalloc(mod, &fmristr, NV_UNIQUE_NAME) != 0) { + topo_mod_free(mod, name, len + 1); + return (topo_mod_seterrno(mod, EMOD_FMRI_NVL)); + } + if (nvlist_add_string(fmristr, "fmri-string", name) != 0) { + topo_mod_free(mod, name, len + 1); + nvlist_free(fmristr); + return (topo_mod_seterrno(mod, EMOD_FMRI_NVL)); + } + topo_mod_free(mod, name, len + 1); + *out = fmristr; + + return (0); +} diff --git a/usr/src/lib/fm/topo/libtopo/common/fmd.h b/usr/src/lib/fm/topo/libtopo/common/fmd.h new file mode 100644 index 0000000000..64d48b8d41 --- /dev/null +++ b/usr/src/lib/fm/topo/libtopo/common/fmd.h @@ -0,0 +1,46 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _FMD_H +#define _FMD_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +#ifdef __cplusplus +extern "C" { +#endif + +#define FMD_VERSION 1 +#define FMD "fmd" + +extern int fmd_init(topo_mod_t *, topo_version_t); /* see fmd.c */ +extern void fmd_fini(topo_mod_t *); /* see fmd.c */ + +#ifdef __cplusplus +} +#endif + +#endif /* _FMD_H */ diff --git a/usr/src/lib/fm/topo/libtopo/common/legacy_hc.c b/usr/src/lib/fm/topo/libtopo/common/legacy_hc.c new file mode 100644 index 0000000000..f62cb767cb --- /dev/null +++ b/usr/src/lib/fm/topo/libtopo/common/legacy_hc.c @@ -0,0 +1,216 @@ +/* + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <ctype.h> +#include <alloca.h> +#include <limits.h> +#include <fm/topo_mod.h> +#include <sys/param.h> +#include <sys/systeminfo.h> +#include <sys/fm/protocol.h> +#include <sys/stat.h> + +#include <topo_method.h> +#include <topo_subr.h> +#include <legacy_hc.h> + +static int legacy_hc_enum(topo_mod_t *, tnode_t *, const char *, + topo_instance_t, topo_instance_t, void *, void *); +static void legacy_hc_release(topo_mod_t *, tnode_t *); +static int legacy_hc_fmri_nvl2str(topo_mod_t *, tnode_t *, topo_version_t, + nvlist_t *, nvlist_t **); + +const topo_method_t legacy_hc_methods[] = { + { TOPO_METH_NVL2STR, TOPO_METH_NVL2STR_DESC, TOPO_METH_NVL2STR_VERSION, + TOPO_STABILITY_INTERNAL, legacy_hc_fmri_nvl2str }, + { NULL } +}; + +static const topo_modops_t legacy_hc_ops = + { legacy_hc_enum, legacy_hc_release }; +static const topo_modinfo_t legacy_hc_info = + { LEGACY_HC, FM_FMRI_SCHEME_LEGACY, LEGACY_HC_VERSION, &legacy_hc_ops }; + +int +legacy_hc_init(topo_mod_t *mod, topo_version_t version) +{ + /* + * Turn on module debugging output + */ + if (getenv("TOPOLEGACY_HCDEBUG")) + topo_mod_setdebug(mod); + + topo_mod_dprintf(mod, "initializing legacy_hc builtin\n"); + + if (version != LEGACY_HC_VERSION) + return (topo_mod_seterrno(mod, EMOD_VER_NEW)); + + if (topo_mod_register(mod, &legacy_hc_info, TOPO_VERSION) != 0) { + topo_mod_dprintf(mod, "failed to register legacy_hc: " + "%s\n", topo_mod_errmsg(mod)); + return (-1); /* mod errno already set */ + } + + return (0); +} + +void +legacy_hc_fini(topo_mod_t *mod) +{ + topo_mod_unregister(mod); +} + + +/*ARGSUSED*/ +int +legacy_hc_enum(topo_mod_t *mod, tnode_t *pnode, const char *name, + topo_instance_t min, topo_instance_t max, void *notused1, void *notused2) +{ + (void) topo_method_register(mod, pnode, legacy_hc_methods); + return (0); +} + +/*ARGSUSED*/ +static void +legacy_hc_release(topo_mod_t *mp, tnode_t *node) +{ + topo_method_unregister_all(mp, node); +} + +/* + * Convert an input string to a URI escaped string and return the new string. + * RFC2396 Section 2.4 says that data must be escaped if it does not have a + * representation using an unreserved character, where an unreserved character + * is one that is either alphanumeric or one of the marks defined in S2.3. + */ +static size_t +mem_fmri_uriescape(const char *s, const char *xmark, char *buf, size_t len) +{ + static const char rfc2396_mark[] = "-_.!~*'()"; + static const char hex_digits[] = "0123456789ABCDEF"; + static const char empty_str[] = ""; + + const char *p; + char c, *q; + size_t n = 0; + + if (s == NULL) + s = empty_str; + + if (xmark == NULL) + xmark = empty_str; + + for (p = s; (c = *p) != '\0'; p++) { + if (isalnum(c) || strchr(rfc2396_mark, c) || strchr(xmark, c)) + n++; /* represent c as itself */ + else + n += 3; /* represent c as escape */ + } + + if (buf == NULL) + return (n); + + for (p = s, q = buf; (c = *p) != '\0' && q < buf + len; p++) { + if (isalnum(c) || strchr(rfc2396_mark, c) || strchr(xmark, c)) { + *q++ = c; + } else { + *q++ = '%'; + *q++ = hex_digits[((uchar_t)c & 0xf0) >> 4]; + *q++ = hex_digits[(uchar_t)c & 0xf]; + } + } + + if (q == buf + len) + q--; /* len is too small: truncate output string */ + + *q = '\0'; + return (n); +} + +static ssize_t +fmri_nvl2str(topo_mod_t *mod, nvlist_t *nvl, char *buf, size_t buflen) +{ + uint8_t version; + ssize_t size; + char *c; + char *escc; + int i; + + if (nvlist_lookup_uint8(nvl, FM_VERSION, &version) != 0 || + version > FM_LEGACY_SCHEME_VERSION || + nvlist_lookup_string(nvl, FM_FMRI_LEGACY_HC, &c) != 0) + return (0); + + i = mem_fmri_uriescape(c, ":,/", NULL, 0); + escc = topo_mod_alloc(mod, i + 1); + (void) mem_fmri_uriescape(c, ":,/", escc, i + 1); + size = snprintf(buf, buflen, "legacy-hc:///component=%s", escc); + topo_mod_free(mod, escc, i + 1); + + return (size); +} + +/*ARGSUSED*/ +static int +legacy_hc_fmri_nvl2str(topo_mod_t *mod, tnode_t *node, topo_version_t version, + nvlist_t *nvl, nvlist_t **out) +{ + ssize_t len; + char *name = NULL; + nvlist_t *fmristr; + + if (version > TOPO_METH_NVL2STR_VERSION) + return (topo_mod_seterrno(mod, EMOD_VER_NEW)); + + if ((len = fmri_nvl2str(mod, nvl, NULL, 0)) == 0 || + (name = topo_mod_alloc(mod, len + 1)) == NULL || + fmri_nvl2str(mod, nvl, name, len + 1) == 0) { + if (name != NULL) + topo_mod_free(mod, name, len + 1); + return (topo_mod_seterrno(mod, EMOD_FMRI_NVL)); + } + + if (topo_mod_nvalloc(mod, &fmristr, NV_UNIQUE_NAME) != 0) { + topo_mod_free(mod, name, len + 1); + return (topo_mod_seterrno(mod, EMOD_FMRI_NVL)); + } + if (nvlist_add_string(fmristr, "fmri-string", name) != 0) { + topo_mod_free(mod, name, len + 1); + nvlist_free(fmristr); + return (topo_mod_seterrno(mod, EMOD_FMRI_NVL)); + } + topo_mod_free(mod, name, len + 1); + *out = fmristr; + + return (0); +} diff --git a/usr/src/lib/fm/topo/libtopo/common/legacy_hc.h b/usr/src/lib/fm/topo/libtopo/common/legacy_hc.h new file mode 100644 index 0000000000..4425fad98d --- /dev/null +++ b/usr/src/lib/fm/topo/libtopo/common/legacy_hc.h @@ -0,0 +1,46 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _LEGACY_HC_H +#define _LEGACY_HC_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +#ifdef __cplusplus +extern "C" { +#endif + +#define LEGACY_HC_VERSION 1 +#define LEGACY_HC "legacy-hc" + +extern int legacy_hc_init(topo_mod_t *, topo_version_t); +extern void legacy_hc_fini(topo_mod_t *); + +#ifdef __cplusplus +} +#endif + +#endif /* _LEGACY_HC_H */ diff --git a/usr/src/lib/fm/topo/libtopo/common/mod.c b/usr/src/lib/fm/topo/libtopo/common/mod.c index efa986cb1b..4961739949 100644 --- a/usr/src/lib/fm/topo/libtopo/common/mod.c +++ b/usr/src/lib/fm/topo/libtopo/common/mod.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -266,11 +266,12 @@ fmri_nvl2str(nvlist_t *nvl, char *buf, size_t buflen) ssize_t size = 0; int32_t modid; char *achas = NULL; + char *adom = NULL; char *aprod = NULL; char *asrvr = NULL; + char *ahost = NULL; char *modname = NULL; char numbuf[MAXINTSTR]; - int more_auth = 0; int err; if (nvlist_lookup_uint8(nvl, FM_VERSION, &version) != 0 || @@ -304,13 +305,11 @@ fmri_nvl2str(nvlist_t *nvl, char *buf, size_t buflen) (void) nvlist_lookup_string(anvl, FM_FMRI_AUTH_CHASSIS, &achas); (void) nvlist_lookup_string(anvl, + FM_FMRI_AUTH_DOMAIN, &adom); + (void) nvlist_lookup_string(anvl, FM_FMRI_AUTH_SERVER, &asrvr); - if (aprod != NULL) - more_auth++; - if (achas != NULL) - more_auth++; - if (asrvr != NULL) - more_auth++; + (void) nvlist_lookup_string(anvl, + FM_FMRI_AUTH_HOST, &ahost); } /* mod:// */ @@ -323,9 +322,15 @@ fmri_nvl2str(nvlist_t *nvl, char *buf, size_t buflen) if (achas != NULL) topo_fmristr_build(&size, buf, buflen, achas, ":" FM_FMRI_AUTH_CHASSIS "=", NULL); + if (adom != NULL) + topo_fmristr_build(&size, buf, buflen, adom, + ":" FM_FMRI_AUTH_DOMAIN "=", NULL); if (asrvr != NULL) topo_fmristr_build(&size, buf, buflen, asrvr, ":" FM_FMRI_AUTH_SERVER "=", NULL); + if (ahost != NULL) + topo_fmristr_build(&size, buf, buflen, ahost, + ":" FM_FMRI_AUTH_HOST "=", NULL); /* module parts */ topo_fmristr_build(&size, buf, buflen, modname, diff --git a/usr/src/lib/fm/topo/libtopo/common/pkg.c b/usr/src/lib/fm/topo/libtopo/common/pkg.c index 81aa321cae..e952907f59 100644 --- a/usr/src/lib/fm/topo/libtopo/common/pkg.c +++ b/usr/src/lib/fm/topo/libtopo/common/pkg.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -45,6 +45,7 @@ #include <gelf.h> #include <topo_method.h> +#include <topo_subr.h> #include <pkg.h> #define BUFLEN (2 * PATH_MAX) @@ -54,10 +55,14 @@ static int pkg_enum(topo_mod_t *, tnode_t *, const char *, topo_instance_t, static void pkg_release(topo_mod_t *, tnode_t *); static int pkg_fmri_create_meth(topo_mod_t *, tnode_t *, topo_version_t, nvlist_t *, nvlist_t **); +static int pkg_fmri_nvl2str(topo_mod_t *, tnode_t *, topo_version_t, + nvlist_t *, nvlist_t **); static const topo_method_t pkg_methods[] = { { TOPO_METH_FMRI, TOPO_METH_FMRI_DESC, TOPO_METH_FMRI_VERSION, TOPO_STABILITY_INTERNAL, pkg_fmri_create_meth }, + { TOPO_METH_NVL2STR, TOPO_METH_NVL2STR_DESC, TOPO_METH_NVL2STR_VERSION, + TOPO_STABILITY_INTERNAL, pkg_fmri_nvl2str }, { NULL } }; @@ -238,3 +243,107 @@ pkg_fmri_create_meth(topo_mod_t *mp, tnode_t *node, topo_version_t version, return (-1); return (0); } + +static ssize_t +fmri_nvl2str(nvlist_t *nvl, char *buf, size_t buflen) +{ + nvlist_t *anvl = NULL; + uint8_t version; + ssize_t size = 0; + char *pkgname = NULL; + char *achas = NULL; + char *adom = NULL; + char *aprod = NULL; + char *asrvr = NULL; + char *ahost = NULL; + int err; + + if (nvlist_lookup_uint8(nvl, FM_VERSION, &version) != 0 || + version > FM_PKG_SCHEME_VERSION) + return (-1); + + /* Get authority, if present */ + err = nvlist_lookup_nvlist(nvl, FM_FMRI_AUTHORITY, &anvl); + if (err != 0 && err != ENOENT) + return (-1); + + /* + * For brevity, we only include the pkgname and any authority + * info present in the FMRI in our output string. The FMRI + * also has data on the package directory and version. + */ + err = nvlist_lookup_string(nvl, FM_FMRI_PKG_INST, &pkgname); + if (err != 0 || pkgname == NULL) + return (-1); + + if (anvl != NULL) { + (void) nvlist_lookup_string(anvl, + FM_FMRI_AUTH_PRODUCT, &aprod); + (void) nvlist_lookup_string(anvl, + FM_FMRI_AUTH_CHASSIS, &achas); + (void) nvlist_lookup_string(anvl, + FM_FMRI_AUTH_DOMAIN, &adom); + (void) nvlist_lookup_string(anvl, + FM_FMRI_AUTH_SERVER, &asrvr); + (void) nvlist_lookup_string(anvl, + FM_FMRI_AUTH_HOST, &ahost); + } + + /* pkg:// */ + topo_fmristr_build(&size, buf, buflen, FM_FMRI_SCHEME_PKG, NULL, "://"); + + /* authority, if any */ + if (aprod != NULL) + topo_fmristr_build(&size, buf, buflen, aprod, + FM_FMRI_AUTH_PRODUCT "=", NULL); + if (achas != NULL) + topo_fmristr_build(&size, buf, buflen, achas, + FM_FMRI_AUTH_CHASSIS "=", NULL); + if (adom != NULL) + topo_fmristr_build(&size, buf, buflen, adom, + FM_FMRI_AUTH_DOMAIN "=", NULL); + if (asrvr != NULL) + topo_fmristr_build(&size, buf, buflen, asrvr, + FM_FMRI_AUTH_SERVER "=", NULL); + if (ahost != NULL) + topo_fmristr_build(&size, buf, buflen, ahost, + FM_FMRI_AUTH_HOST "=", NULL); + + /* pkg-name part */ + topo_fmristr_build(&size, buf, buflen, pkgname, "/", NULL); + + return (size); +} + +/*ARGSUSED*/ +static int +pkg_fmri_nvl2str(topo_mod_t *mod, tnode_t *node, topo_version_t version, + nvlist_t *nvl, nvlist_t **out) +{ + ssize_t len; + char *name = NULL; + nvlist_t *fmristr; + + if (version > TOPO_METH_NVL2STR_VERSION) + return (topo_mod_seterrno(mod, EMOD_VER_NEW)); + + if ((len = fmri_nvl2str(nvl, NULL, 0)) == 0 || + (name = topo_mod_alloc(mod, len + 1)) == NULL || + fmri_nvl2str(nvl, name, len + 1) == 0) { + if (name != NULL) + topo_mod_free(mod, name, len + 1); + return (topo_mod_seterrno(mod, EMOD_FMRI_NVL)); + } + + if (topo_mod_nvalloc(mod, &fmristr, NV_UNIQUE_NAME) != 0) + return (topo_mod_seterrno(mod, EMOD_FMRI_NVL)); + if (nvlist_add_string(fmristr, "fmri-string", name) != 0) { + topo_mod_free(mod, name, len + 1); + nvlist_free(fmristr); + return (topo_mod_seterrno(mod, EMOD_FMRI_NVL)); + } + topo_mod_free(mod, name, len + 1); + *out = fmristr; + + return (0); +} diff --git a/usr/src/lib/fm/topo/libtopo/common/zfs.c b/usr/src/lib/fm/topo/libtopo/common/zfs.c new file mode 100644 index 0000000000..b7bcda4974 --- /dev/null +++ b/usr/src/lib/fm/topo/libtopo/common/zfs.c @@ -0,0 +1,203 @@ +/* + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <ctype.h> +#include <alloca.h> +#include <limits.h> +#include <fm/topo_mod.h> +#include <sys/param.h> +#include <sys/systeminfo.h> +#include <sys/fm/protocol.h> +#include <sys/stat.h> + +#include <topo_method.h> +#include <topo_subr.h> +#include <libzfs.h> +#include <zfs.h> + +static int zfs_enum(topo_mod_t *, tnode_t *, const char *, topo_instance_t, + topo_instance_t, void *, void *); +static void zfs_release(topo_mod_t *, tnode_t *); +static int zfs_fmri_nvl2str(topo_mod_t *, tnode_t *, topo_version_t, + nvlist_t *, nvlist_t **); + +const topo_method_t zfs_methods[] = { + { TOPO_METH_NVL2STR, TOPO_METH_NVL2STR_DESC, TOPO_METH_NVL2STR_VERSION, + TOPO_STABILITY_INTERNAL, zfs_fmri_nvl2str }, + { NULL } +}; + +static const topo_modops_t zfs_ops = + { zfs_enum, zfs_release }; +static const topo_modinfo_t zfs_info = + { ZFS, FM_FMRI_SCHEME_ZFS, ZFS_VERSION, &zfs_ops }; + +int +zfs_init(topo_mod_t *mod, topo_version_t version) +{ + /* + * Turn on module debugging output + */ + if (getenv("TOPOZFSDEBUG")) + topo_mod_setdebug(mod); + + topo_mod_dprintf(mod, "initializing zfs builtin\n"); + + if (version != ZFS_VERSION) + return (topo_mod_seterrno(mod, EMOD_VER_NEW)); + + if (topo_mod_register(mod, &zfs_info, TOPO_VERSION) != 0) { + topo_mod_dprintf(mod, "failed to register zfs: " + "%s\n", topo_mod_errmsg(mod)); + return (-1); /* mod errno already set */ + } + + return (0); +} + +void +zfs_fini(topo_mod_t *mod) +{ + topo_mod_unregister(mod); +} + + +/*ARGSUSED*/ +int +zfs_enum(topo_mod_t *mod, tnode_t *pnode, const char *name, topo_instance_t min, + topo_instance_t max, void *notused1, void *notused2) +{ + (void) topo_method_register(mod, pnode, zfs_methods); + return (0); +} + +/*ARGSUSED*/ +static void +zfs_release(topo_mod_t *mp, tnode_t *node) +{ + topo_method_unregister_all(mp, node); +} + +typedef struct cbdata { + uint64_t cb_guid; + zpool_handle_t *cb_pool; +} cbdata_t; + +libzfs_handle_t *g_zfs; + +static int +find_pool(zpool_handle_t *zhp, void *data) +{ + cbdata_t *cbp = data; + + if (zpool_get_prop_int(zhp, ZPOOL_PROP_GUID, NULL) == cbp->cb_guid) { + cbp->cb_pool = zhp; + return (1); + } + + zpool_close(zhp); + + return (0); +} + +static ssize_t +fmri_nvl2str(nvlist_t *nvl, char *buf, size_t buflen) +{ + uint64_t pool_guid, vdev_guid; + cbdata_t cb; + ssize_t len; + const char *name; + char guidbuf[64]; + + (void) nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_POOL, &pool_guid); + + /* + * Attempt to convert the pool guid to a name. + */ + cb.cb_guid = pool_guid; + cb.cb_pool = NULL; + + if (zpool_iter(g_zfs, find_pool, &cb) == 1) { + name = zpool_get_name(cb.cb_pool); + } else { + (void) snprintf(guidbuf, sizeof (guidbuf), "%llx", pool_guid); + name = guidbuf; + } + + if (nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_VDEV, &vdev_guid) == 0) + len = snprintf(buf, buflen, "%s://pool=%s/vdev=%llx", + FM_FMRI_SCHEME_ZFS, name, vdev_guid); + else + len = snprintf(buf, buflen, "%s://pool=%s", + FM_FMRI_SCHEME_ZFS, name); + + if (cb.cb_pool) + zpool_close(cb.cb_pool); + + return (len); +} + +/*ARGSUSED*/ +static int +zfs_fmri_nvl2str(topo_mod_t *mod, tnode_t *node, topo_version_t version, + nvlist_t *nvl, nvlist_t **out) +{ + ssize_t len; + char *name = NULL; + nvlist_t *fmristr; + + if (version > TOPO_METH_NVL2STR_VERSION) + return (topo_mod_seterrno(mod, EMOD_VER_NEW)); + + if ((len = fmri_nvl2str(nvl, NULL, 0)) == 0 || + (name = topo_mod_alloc(mod, len + 1)) == NULL || + fmri_nvl2str(nvl, name, len + 1) == 0) { + if (name != NULL) + topo_mod_free(mod, name, len + 1); + return (topo_mod_seterrno(mod, EMOD_FMRI_NVL)); + } + + if (topo_mod_nvalloc(mod, &fmristr, NV_UNIQUE_NAME) != 0) { + topo_mod_free(mod, name, len + 1); + return (topo_mod_seterrno(mod, EMOD_FMRI_NVL)); + } + if (nvlist_add_string(fmristr, "fmri-string", name) != 0) { + topo_mod_free(mod, name, len + 1); + nvlist_free(fmristr); + return (topo_mod_seterrno(mod, EMOD_FMRI_NVL)); + } + topo_mod_free(mod, name, len + 1); + *out = fmristr; + + return (0); +} diff --git a/usr/src/lib/fm/topo/libtopo/common/zfs.h b/usr/src/lib/fm/topo/libtopo/common/zfs.h new file mode 100644 index 0000000000..c3adcc3537 --- /dev/null +++ b/usr/src/lib/fm/topo/libtopo/common/zfs.h @@ -0,0 +1,46 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _ZFS_H +#define _ZFS_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZFS_VERSION 1 +#define ZFS "zfs" + +extern int zfs_init(topo_mod_t *, topo_version_t); /* see zfs.c */ +extern void zfs_fini(topo_mod_t *); /* see zfs.c */ + +#ifdef __cplusplus +} +#endif + +#endif /* _ZFS_H */ diff --git a/usr/src/lib/fm/topo/libtopo/i386/Makefile b/usr/src/lib/fm/topo/libtopo/i386/Makefile index a333224278..cd8a4643d9 100644 --- a/usr/src/lib/fm/topo/libtopo/i386/Makefile +++ b/usr/src/lib/fm/topo/libtopo/i386/Makefile @@ -19,7 +19,7 @@ # CDDL HEADER END # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" @@ -27,4 +27,6 @@ include ../Makefile.com +LDLIBS += -lzfs + install: all $(ROOTLIBS) $(ROOTLINKS) $(ROOTLINT) diff --git a/usr/src/lib/fm/topo/libtopo/sparc/Makefile b/usr/src/lib/fm/topo/libtopo/sparc/Makefile index ddd13b2c7d..976e50cd5f 100644 --- a/usr/src/lib/fm/topo/libtopo/sparc/Makefile +++ b/usr/src/lib/fm/topo/libtopo/sparc/Makefile @@ -30,4 +30,6 @@ include ../Makefile.com CPPFLAGS += -I $(ROOT)/usr/platform/sun4v/include LDLIBS += -L$(ROOTLIBDIR) +LDLIBS += -lzfs + install: all $(ROOTLIBS) $(ROOTLINKS) $(ROOTLINT) diff --git a/usr/src/lib/fm/topo/libtopo/sparcv9/Makefile b/usr/src/lib/fm/topo/libtopo/sparcv9/Makefile index 0db0f4bdc2..9a45e99e29 100644 --- a/usr/src/lib/fm/topo/libtopo/sparcv9/Makefile +++ b/usr/src/lib/fm/topo/libtopo/sparcv9/Makefile @@ -31,4 +31,6 @@ include ../../../../Makefile.lib.64 CPPFLAGS += -I $(ROOT)/usr/platform/sun4v/include LDLIBS += -L$(ROOTLIBDIR64) +LDLIBS += -lzfs + install: all $(ROOTLIBS64) $(ROOTLINKS64) $(ROOTLINT64) diff --git a/usr/src/lib/fm/topo/modules/i86pc/chip/chip_amd.c b/usr/src/lib/fm/topo/modules/i86pc/chip/chip_amd.c index 789398cfac..69a8804082 100644 --- a/usr/src/lib/fm/topo/modules/i86pc/chip/chip_amd.c +++ b/usr/src/lib/fm/topo/modules/i86pc/chip/chip_amd.c @@ -484,6 +484,8 @@ amd_cs_create(topo_mod_t *mod, tnode_t *pnode, const char *name, nvlist_t *mc, (void) topo_node_asru_set(csnode, fmri, 0, &err); + (void) topo_node_fru_set(csnode, fmri, 0, &err); + (void) topo_pgroup_create(csnode, &cs_pgroup, &err); for (nvp = nvlist_next_nvpair(csarr[i], NULL); nvp != NULL; @@ -503,6 +505,7 @@ amd_dramchan_create(topo_mod_t *mod, tnode_t *pnode, const char *name, nvlist_t *fmri; char *socket; int i, nchan; + nvlist_t *pfmri = NULL; int err, nerr = 0; /* @@ -521,6 +524,8 @@ amd_dramchan_create(topo_mod_t *mod, tnode_t *pnode, const char *name, if (topo_node_range_create(mod, pnode, name, 0, nchan - 1) < 0) return (-1); + (void) topo_node_fru(pnode, &pfmri, NULL, &err); + for (i = 0; i < nchan; i++) { if (mkrsrc(mod, pnode, name, i, auth, &fmri) != 0) { whinge(mod, &nerr, "amd_dramchan_create: mkrsrc " @@ -536,6 +541,10 @@ amd_dramchan_create(topo_mod_t *mod, tnode_t *pnode, const char *name, continue; } + (void) topo_node_asru_set(chnode, fmri, 0, &err); + if (pfmri) + (void) topo_node_fru_set(chnode, pfmri, 0, &err); + nvlist_free(fmri); (void) topo_pgroup_create(chnode, &chan_pgroup, &err); @@ -543,6 +552,8 @@ amd_dramchan_create(topo_mod_t *mod, tnode_t *pnode, const char *name, (void) topo_prop_set_string(chnode, PGNAME(CHAN), "channel", TOPO_PROP_IMMUTABLE, i == 0 ? "A" : "B", &err); } + if (pfmri) + nvlist_free(pfmri); return (nerr == 0 ? 0 : -1); } diff --git a/usr/src/uts/common/sys/fm/protocol.h b/usr/src/uts/common/sys/fm/protocol.h index c10e65c8be..963474a5a2 100644 --- a/usr/src/uts/common/sys/fm/protocol.h +++ b/usr/src/uts/common/sys/fm/protocol.h @@ -81,6 +81,8 @@ extern "C" { #define FM_SUSPECT_FAULT_SZ "fault-list-sz" #define FM_SUSPECT_FAULT_STATUS "fault-status" #define FM_SUSPECT_MESSAGE "message" +#define FM_SUSPECT_RETIRE "retire" +#define FM_SUSPECT_RESPONSE "response" #define FM_SUSPECT_VERS0 0 #define FM_SUSPECT_VERSION FM_SUSPECT_VERS0 |