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