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