PCIe CPER Section Enhancement
This commit improves PCIe error reporting capabilities by:
- Adding support for PCIe capability version detection and parsing
- Expanding Advanced Error Reporting information extraction
The changes include:
- New capability_registers structure to decode PCIe capability registers
- Updated PCIe JSON Schema to match
- Support for PCIe 2.0+ extended registers when detected
- Improved error source identification and root error status reporting
- Fix typo for Advanced Error Reporting capabilit[i]es_control
- Updated generate/gen-section-pcie.c and pcie.json example
In the future we could:
- Implement TLP header log parsing with detailed descriptions
- Add support for Flit mode in PCIe 2.0+ devices
Tested:
- test/cper-tests passes
- cper-convert to-json|to-cper on pcie.cper|json in example path
- Tested "cper-convert to-json-section" using an extracted OS GHES PCIE
CPER from error injection and compare against expected values
Note, schema validation is intentionally less restrictive than it could
be for pcie advanced error reporting as it evolves.
Change-Id: Ifebb9d97d28a3a487a0aab53bf9e757afeedd64a
Signed-off-by: Erwin Tsaur <etsaur@nvidia.com>
Signed-off-by: Ed Tanous <etanous@nvidia.com>
diff --git a/examples/pcie.cperhex b/examples/pcie.cperhex
index 921660c..9920993 100644
--- a/examples/pcie.cperhex
+++ b/examples/pcie.cperhex
@@ -1,14 +1,14 @@
-435045520000ffffffff0100000000000300000098010000130021002604
-125500000000000000000000000000000000000000000000000000000000
+435045520000ffffffff0100010000000300000098010000300016000401
+171700000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
-0000000000009a7f435b0000000004000000000000000000000000000000
-0000000000000000c8000000d00000009cbf0300e300000054e995d9c1bb
-0f43ad91b44dcb3c6f356668938aa36c6e3f2b9dcf0ef92fd4d802000000
-48493c4348686e353b6f5c2d6c276d000000000055000000000000000700
-0000000000007b8fe1540000000000000000000000000000000000000000
-6d4e4f1ea0401a1b0000000070b1cda60f4f37180daa93a6ed6e715623dd
-d9902c28aecc68c8e737c3569b330868da17b7112fc4bbc26aa830dbff54
-b8d8e4e40093b0695b97a01f000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000
\ No newline at end of file
+000000000000e0e8bf1f0000000004000000000000000000000000000000
+0000000000000000c8000000d00000002baa0300a200000054e995d9c1bb
+0f43ad91b44dcb3c6f3549fd824ea90870d4b28a2954489a0abc01000000
+0f2b6a773f7842374c65740d0c4a6f502e245b00d5000000000000000500
+0000245000007cc254f800000000765a2e63339fc99a66320db73158a300
+255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1
+fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43
+fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305ef
+f700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b7963
+3b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b
+7df50be11a1c7f23f829f8a41b13b5ca4ee8
diff --git a/examples/pcie.json b/examples/pcie.json
index 4318600..bf0ca94 100644
--- a/examples/pcie.json
+++ b/examples/pcie.json
@@ -11,7 +11,7 @@
},
"persistenceInfo": 0,
"platformID": "00000000-0000-0000-0000-000000000000",
- "recordID": 1531150234,
+ "recordID": 532670688,
"recordLength": 408,
"revision": {
"major": 0,
@@ -19,10 +19,10 @@
},
"sectionCount": 1,
"severity": {
- "code": 0,
- "name": "Recoverable"
+ "code": 1,
+ "name": "Fatal"
},
- "timestamp": "5512-04-26T21:00:13+00:00",
+ "timestamp": "1717-01-04T16:00:30+00:00",
"timestampIsPrecise": false
},
"sectionDescriptors": [
@@ -32,16 +32,15 @@
"errorThresholdExceeded": false,
"latentError": true,
"overflow": true,
- "primary": true,
- "propagated": true,
+ "primary": false,
+ "propagated": false,
"reset": false,
"resourceNotAccessible": false
},
- "fruID": "8a936866-6ca3-3f6e-2b9d-cf0ef92fd4d8",
- "fruText": "HI<CHhn5;o\\-l'm",
+ "fruID": "4e82fd49-08a9-d470-b28a-2954489a0abc",
"revision": {
- "major": 191,
- "minor": 156
+ "major": 170,
+ "minor": 43
},
"sectionLength": 208,
"sectionOffset": 200,
@@ -50,25 +49,319 @@
"type": "PCIe"
},
"severity": {
- "code": 2,
- "name": "Corrected"
+ "code": 1,
+ "name": "Fatal"
}
}
],
"sections": [
{
"Pcie": {
+ "aerInfo": {
+ "advanced_error_capabilities_and_control": {
+ "first_error_pointer": 10,
+ "header_log_size": 24,
+ "logged_tlp_size": 25
+ },
+ "capability_header": {
+ "capability_id": 55413,
+ "capability_version": 14,
+ "next_capability_offset": 1563
+ },
+ "correctable_error_mask": {
+ "advisory_non_fatal_error_mask": 1,
+ "bad_dllp_mask": 1,
+ "bad_tlp_mask": 1,
+ "corrected_internal_error_mask": 0,
+ "header_log_overflow_mask": 1,
+ "receiver_error_mask": 1,
+ "replay_num_rollover_mask": 1,
+ "replay_timer_timeout_mask": 0
+ },
+ "correctable_error_status": {
+ "advisory_non_fatal_error_status": true,
+ "bad_dllp_status": false,
+ "bad_tlp_status": false,
+ "corrected_internal_error_status": true,
+ "header_log_overflow_status": true,
+ "receiver_error_status": true,
+ "replay_num_rollover_status": true,
+ "replay_timer_timeout_status": false
+ },
+ "data": "ddi+YYn5XLuomQ+VsevxswXv9wDpoTrlygvL0EhHZL0fIx6oHHtkxRRzWsVeS3ljO3BkJBGeCdyq1KzyGxCvOzPN41BIRxVcu28iGbqbffUL4RocfyP4KfikGxO1yk7o",
+ "error_source_id": {
+ "err_cor_source_identification": 40465,
+ "err_fatal_nonfatal_source_identification": 56329
+ },
+ "root_error_command": {},
+ "root_error_status": {
+ "advanced_error_interrupt_message_number": 18,
+ "err_cor_subclass": 0
+ },
+ "uncorrectable_error_mask": {
+ "acs_violation_mask": 0,
+ "atomicop_egress_blocked_mask": 1,
+ "completer_abort_mask": 1,
+ "completion_timeout_mask": 0,
+ "data_link_protocol_error_mask": 0,
+ "dmwr_request_egress_blocked_mask": 0,
+ "ecrc_error_mask": 1,
+ "flow_control_protocol_error_mask": 0,
+ "ide_check_failed_mask": 1,
+ "malformed_tlp_mask": 1,
+ "mc_blocked_tlp_mask": 0,
+ "misrouted_ide_tlp_mask": 0,
+ "pcrc_check_failed_mask": 0,
+ "poisoned_tlp_egress_blocked_mask": 1,
+ "poisoned_tlp_received_mask": 1,
+ "receiver_overflow_mask": 1,
+ "surprise_down_error_mask": 1,
+ "tlp_prefix_blocked_error_mask": 0,
+ "tlp_translation_egress_blocked_mask": 1,
+ "uncorrectable_internal_error_mask": 0,
+ "unexpected_completion_mask": 1,
+ "unsupported_request_error_mask": 0
+ },
+ "uncorrectable_error_severity": {
+ "acs_violation_severity": "Fatal",
+ "atomicop_egress_blocked_severity": "Fatal",
+ "completer_abort_severity": "Fatal",
+ "completion_timeout_severity": "Fatal",
+ "data_link_protocol_error_severity": "Fatal",
+ "dmwr_request_egress_blocked_severity": "NonFatal",
+ "ecrc_error_severity": "NonFatal",
+ "flow_control_protocol_error_severity": "Fatal",
+ "ide_check_failed_severity": "Fatal",
+ "malformed_tlp_severity": "NonFatal",
+ "mc_blocked_tlp_severity": "Fatal",
+ "misrouted_ide_tlp_severity": "Fatal",
+ "pcrc_check_failed_severity": "NonFatal",
+ "poisoned_tlp_egress_blocked_severity": "NonFatal",
+ "poisoned_tlp_received_severity": "NonFatal",
+ "receiver_overflow_severity": "NonFatal",
+ "surprise_down_error_severity": "Fatal",
+ "tlp_prefix_blocked_error_severity": "Fatal",
+ "tlp_translation_egress_blocked_severity": "Fatal",
+ "uncorrectable_internal_error_severity": "Fatal",
+ "unexpected_completion_severity": "Fatal",
+ "unsupported_request_error_severity": "Fatal"
+ },
+ "uncorrectable_error_status": {
+ "acs_violation_status": false,
+ "atomicop_egress_blocked_status": true,
+ "completer_abort_status": true,
+ "completion_timeout_status": true,
+ "data_link_protocol_error_status": false,
+ "dmwr_request_egress_blocked_status": true,
+ "ecrc_error_status": true,
+ "flow_control_protocol_error_status": true,
+ "ide_check_failed_status": true,
+ "malformed_tlp_status": true,
+ "mc_blocked_tlp_status": false,
+ "misrouted_ide_tlp_status": true,
+ "pcrc_check_failed_status": false,
+ "poisoned_tlp_egress_blocked_status": false,
+ "poisoned_tlp_received": true,
+ "receiver_overflow_status": false,
+ "surprise_down_error_status": false,
+ "tlp_prefix_blocked_error_status": true,
+ "tlp_translation_egress_blocked_status": true,
+ "uncorrectable_internal_error_status": true,
+ "unexpected_completion_status": false,
+ "unsupported_request_error_status": true
+ }
+ },
"capabilityStructure": {
- "data": "cLHNpg9PNxgNqpOm7W5xViPd2ZAsKK7MaMjnN8NWmzMIaNoXtxEvxLvCaqgw2/9UuNjk5ACTsGlbl6Af"
+ "data": "m7RUEQ6CdEEhPdyHcOk+oUHh/Gc+AX6X6txrlo84XCrssDv7Mq88VOwY21wCGv5D+/qqOvsp0eYFPHyU",
+ "device_capabilities": {
+ "captured_slot_power_limit_scale": 0,
+ "captured_slot_power_limit_value": 93,
+ "endpoint_l0s_acceptable_latency": {
+ "raw": 0
+ },
+ "endpoint_l1_acceptable_latency": {
+ "raw": 1
+ },
+ "err_cor_subclass_capable": false,
+ "extended_tag_field_supported": "NotSupported",
+ "function_level_reset_capability_supported": "NotSupported",
+ "max_payload_size_supported": 6,
+ "mixed_mps_supported": "NotSupported",
+ "phantom_functions_supported": "Supported",
+ "role_based_error_reporting": true,
+ "rx_mps_fixed": 0,
+ "tee_io_supported": "Supported"
+ },
+ "device_capabilities2": {
+ "_128_bit_cas_completer_supported": "Supported",
+ "_32_bit_atomicop_completer_supported": "NotSupported",
+ "_64_bit_atomicop_completer_supported": "Supported",
+ "ari_forwarding_supported": "Supported",
+ "atomic_op_routing_supported": "NotSupported",
+ "completion_timeout_disable_supported": "Supported",
+ "completion_timeout_ranges_supported": 2,
+ "dmwr_lengths_supported": 2,
+ "emergency_power_reduction_supported": "NotSupported",
+ "ltr_mechanism_supported": "Supported",
+ "max_end_end_tlp_prefixes": {
+ "raw": 0
+ },
+ "no_ro_enabled_pr_pr_passing": "Passing",
+ "obff_supported": "Supported",
+ "tph_completer_supported": "Supported"
+ },
+ "device_control": {
+ "aux_power_pm_enable": "Enabled",
+ "correctable_error_reporting_enable": "Enabled",
+ "enable_no_snoop": 1,
+ "extended_tag_field_enable": "Enabled",
+ "fatal_error_reporting_enable": "Disabled",
+ "function_level_reset": false,
+ "max_payload_size": 1,
+ "max_read_request_size": 3,
+ "non_fatal_error_reporting_enable": "Disabled",
+ "phantom_functions_enable": "Disabled",
+ "relaxed_ordering_enable": "Disabled",
+ "unsupported_request_reporting_enabled": "Disabled"
+ },
+ "device_control2": {
+ "10_bit_tag_requester_enable": true,
+ "ari_forwarding_enable": true,
+ "atomicop_egress_blocking": true,
+ "atomicop_requester_enable": true,
+ "completion_timeout_value": 12,
+ "emergency_power_reduction_request": true,
+ "ido_completion_enable": false,
+ "ido_request_enable": false,
+ "ltr_mechanism_enable": false,
+ "obff_enable": 0
+ },
+ "device_status": {
+ "aux_power_detected": true,
+ "correctable_error_detected": false,
+ "emergency_power_reduction": 3,
+ "fatal_error_detected": true,
+ "non_fatal_error_detected": false,
+ "transactions_pending": false,
+ "unsupported_request_detected": true
+ },
+ "device_status2": {},
+ "link_capabilities": {
+ "aspm_optionality_compliance": false,
+ "aspm_support": 2,
+ "clock_power_management": true,
+ "data_link_layer_link_active_reporting_capable": true,
+ "l0s_exit_latency": 6,
+ "l1_exit_latency": 5,
+ "link_bandwidth_notification_capability": true,
+ "max_link_speed": 0,
+ "maximum_link_width": 23,
+ "port_number": 161,
+ "surprise_down_error_reporting_capable": true
+ },
+ "link_capabilities2": {
+ "crosslink_supported": "NotSupported",
+ "drs_supported": "NotSupported",
+ "lower_skp_os_generation_supported": 125,
+ "lower_skp_os_reception_supported": 42,
+ "retimer_presence_detect_supported": "Supported",
+ "supported_link_speeds": 26,
+ "two_retimers_presence_detect_supported": "NotSupported"
+ },
+ "link_control": {
+ "aspm_control": 1,
+ "extended_synch": 0,
+ "flit_mode_disable": 1,
+ "link_disable": 0,
+ "ptm_prop_delay_adaptation_interpretation": false,
+ "retrain_link": 0,
+ "sris_clocking": 0
+ },
+ "link_control2": {
+ "compliance_preset_de_emphasis": 2,
+ "compliance_sos": true,
+ "enter_compliance": "Supported",
+ "enter_modified_compliance": false,
+ "hardware_autonomous_speed_disable": {
+ "raw": 1
+ },
+ "selectable_de_emphasis": true,
+ "target_link_speed": {
+ "raw": 11
+ },
+ "transmit_margin": 3
+ },
+ "link_status": {
+ "current_link_speed": 12,
+ "link_training": 0,
+ "negotiated_link_width": 63
+ },
+ "link_status2": {
+ "crosslink_resolution": 2,
+ "current_de_emphasis_level": 1,
+ "downstream_component_presence": 6,
+ "drs_message_received": true,
+ "equalization_8gts_complete": false,
+ "equalization_8gts_phase1_successful": false,
+ "equalization_8gts_phase2_successful": false,
+ "equalization_8gts_phase3_successful": true,
+ "flit_mode_status": 1,
+ "link_equalization_request_8gts": false,
+ "retimer_presence_detected": true,
+ "two_retimers_presence_detected": true
+ },
+ "pcie_capabilities": {
+ "capability_version": 4,
+ "device_port_type": {
+ "raw": 5,
+ "value": "PCIE_PCI_BRIDGE"
+ },
+ "flit_mode_supported": "NotSupported",
+ "interrupt_message_number": 8,
+ "slot_implemented": true
+ },
+ "pcie_capability_header": {
+ "capability_id": {
+ "raw": 155
+ },
+ "next_capability_pointer": 180
+ },
+ "root_capabilities": {},
+ "root_control": {},
+ "root_status": {
+ "pme_pending": 1,
+ "pme_requester_id": 45292,
+ "pme_status": 1
+ },
+ "slot_capabilities": {
+ "physical_slot_number": 4847,
+ "slot_power_limit_scale": 0,
+ "slot_power_limit_value": {
+ "raw": 2
+ }
+ },
+ "slot_capabilities2": {},
+ "slot_control": {
+ "attention_indicator_control": 3,
+ "power_indicator_control": 0,
+ "rsvdp": 1
+ },
+ "slot_control2": {},
+ "slot_status": {
+ "command_completed": 0,
+ "mrl_sensor_changed": 0,
+ "mrl_sensor_state": 1
+ },
+ "slot_status2": {}
},
"commandStatus": {
- "commandRegister": 36731,
- "statusRegister": 21729
+ "commandRegister": 49788,
+ "statusRegister": 63572
},
- "deviceSerialNumber": 1952944444865990253,
+ "deviceSerialNumber": 15302925148404145445,
"portType": {
- "name": "PCI Express to PCI/PCI-X Bridge",
- "value": 7
+ "name": "Upstream Switch Port",
+ "value": 5
}
}
}