1*214a1542SLawrence Tang /** 2*214a1542SLawrence Tang * Describes functions for converting PCI/PCI-X bus CPER sections from binary and JSON format 3*214a1542SLawrence Tang * into an intermediate format. 4*214a1542SLawrence Tang * 5*214a1542SLawrence Tang * Author: Lawrence.Tang@arm.com 6*214a1542SLawrence Tang **/ 7*214a1542SLawrence Tang #include <stdio.h> 8*214a1542SLawrence Tang #include "json.h" 9*214a1542SLawrence Tang #include "../edk/Cper.h" 10*214a1542SLawrence Tang #include "../cper-utils.h" 11*214a1542SLawrence Tang #include "cper-section-pci-bus.h" 12*214a1542SLawrence Tang 13*214a1542SLawrence Tang //Converts a single PCI/PCI-X bus CPER section into JSON IR. 14*214a1542SLawrence Tang json_object* cper_section_pci_bus_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor) 15*214a1542SLawrence Tang { 16*214a1542SLawrence Tang EFI_PCI_PCIX_BUS_ERROR_DATA* bus_error = (EFI_PCI_PCIX_BUS_ERROR_DATA*)section; 17*214a1542SLawrence Tang json_object* section_ir = json_object_new_object(); 18*214a1542SLawrence Tang 19*214a1542SLawrence Tang //Validation bits. 20*214a1542SLawrence Tang json_object* validation = bitfield_to_ir(bus_error->ValidFields, 9, PCI_BUS_ERROR_VALID_BITFIELD_NAMES); 21*214a1542SLawrence Tang json_object_object_add(section_ir, "validationBits", validation); 22*214a1542SLawrence Tang 23*214a1542SLawrence Tang //Error status. 24*214a1542SLawrence Tang json_object* error_status = cper_generic_error_status_to_ir(&bus_error->ErrorStatus); 25*214a1542SLawrence Tang json_object_object_add(section_ir, "errorStatus", error_status); 26*214a1542SLawrence Tang 27*214a1542SLawrence Tang //PCI bus error type. 28*214a1542SLawrence Tang json_object* error_type = integer_to_readable_pair(bus_error->Type, 8, 29*214a1542SLawrence Tang PCI_BUS_ERROR_TYPES_KEYS, 30*214a1542SLawrence Tang PCI_BUS_ERROR_TYPES_VALUES, 31*214a1542SLawrence Tang "Unknown (Reserved)"); 32*214a1542SLawrence Tang json_object_object_add(section_ir, "errorType", error_type); 33*214a1542SLawrence Tang 34*214a1542SLawrence Tang //Bus ID. 35*214a1542SLawrence Tang json_object* bus_id = json_object_new_object(); 36*214a1542SLawrence Tang json_object_object_add(bus_id, "busNumber", json_object_new_int(bus_error->BusId & 0xFF)); 37*214a1542SLawrence Tang json_object_object_add(bus_id, "segmentNumber", json_object_new_int(bus_error->BusId >> 8)); 38*214a1542SLawrence Tang json_object_object_add(section_ir, "busID", bus_id); 39*214a1542SLawrence Tang 40*214a1542SLawrence Tang //Miscellaneous numeric fields. 41*214a1542SLawrence Tang json_object_object_add(section_ir, "busAddress", json_object_new_uint64(bus_error->BusAddress)); 42*214a1542SLawrence Tang json_object_object_add(section_ir, "busData", json_object_new_uint64(bus_error->BusData)); 43*214a1542SLawrence Tang json_object_object_add(section_ir, "busCommandType", json_object_new_string(bus_error->BusCommand == 0 ? "PCI" : "PCI-X")); 44*214a1542SLawrence Tang json_object_object_add(section_ir, "busRequestorID", json_object_new_uint64(bus_error->RequestorId)); 45*214a1542SLawrence Tang json_object_object_add(section_ir, "busCompleterID", json_object_new_uint64(bus_error->ResponderId)); 46*214a1542SLawrence Tang json_object_object_add(section_ir, "targetID", json_object_new_uint64(bus_error->TargetId)); 47*214a1542SLawrence Tang 48*214a1542SLawrence Tang return section_ir; 49*214a1542SLawrence Tang }