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