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.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
                 }
             }
         }