1 #ifndef CPER_SECTION_CXL_PROTOCOL_H 2 #define CPER_SECTION_CXL_PROTOCOL_H 3 4 #include <json.h> 5 #include "../edk/Cper.h" 6 7 #define CXL_PROTOCOL_ERROR_VALID_BITFIELD_NAMES \ 8 (const char *[]) \ 9 { \ 10 "cxlAgentTypeValid", "cxlAgentAddressValid", "deviceIDValid", \ 11 "deviceSerialValid", "capabilityStructureValid", \ 12 "cxlDVSECValid", "cxlErrorLogValid" \ 13 } 14 #define CXL_PROTOCOL_ERROR_AGENT_TYPES_KEYS \ 15 (int[]) \ 16 { \ 17 0, 1 \ 18 } 19 #define CXL_PROTOCOL_ERROR_AGENT_TYPES_VALUES \ 20 (const char *[]) \ 21 { \ 22 "CXL 1.1 Device", "CXL 1.1 Host Downstream Port" \ 23 } 24 #define CXL_PROTOCOL_ERROR_DEVICE_AGENT 0 25 #define CXL_PROTOCOL_ERROR_HOST_DOWNSTREAM_PORT_AGENT 1 26 27 /// 28 /// CXL Protocol Error Section 29 /// 30 typedef struct { 31 UINT64 VendorId : 16; 32 UINT64 DeviceId : 16; 33 UINT64 SubsystemVendorId : 16; 34 UINT64 SubsystemDeviceId : 16; 35 UINT64 ClassCode : 16; 36 UINT64 Reserved1 : 3; 37 UINT64 SlotNumber : 13; 38 UINT64 Reserved2 : 32; 39 } EFI_CXL_DEVICE_ID; 40 41 typedef struct { 42 UINT64 FunctionNumber : 8; 43 UINT64 DeviceNumber : 8; 44 UINT64 BusNumber : 8; 45 UINT64 SegmentNumber : 16; 46 UINT64 Reserved : 24; 47 } EFI_CXL_DEVICE_AGENT_ADDRESS; 48 49 typedef union { 50 EFI_CXL_DEVICE_AGENT_ADDRESS 51 DeviceAddress; //Active when the agent is a CXL1.1 device in CxlAgentType. 52 UINT64 PortRcrbBaseAddress; //Active when the agent is a CXL1.1 host downstream port in CxlAgentType. 53 } EFI_CXL_AGENT_ADDRESS; 54 55 typedef struct { 56 UINT64 ValidBits; 57 UINT64 CxlAgentType; 58 EFI_CXL_AGENT_ADDRESS CxlAgentAddress; 59 EFI_CXL_DEVICE_ID DeviceId; 60 UINT64 DeviceSerial; 61 EFI_PCIE_ERROR_DATA_CAPABILITY CapabilityStructure; 62 UINT16 CxlDvsecLength; 63 UINT16 CxlErrorLogLength; 64 UINT32 Reserved; 65 } __attribute__((packed, aligned(1))) EFI_CXL_PROTOCOL_ERROR_DATA; 66 67 json_object *cper_section_cxl_protocol_to_ir(void *section); 68 void ir_section_cxl_protocol_to_cper(json_object *section, FILE *out); 69 70 #endif 71