#ifndef CPER_SECTION_CXL_PROTOCOL_H #define CPER_SECTION_CXL_PROTOCOL_H #include #include "../edk/Cper.h" #define CXL_PROTOCOL_ERROR_VALID_BITFIELD_NAMES \ (const char *[]) \ { \ "cxlAgentTypeValid", "cxlAgentAddressValid", "deviceIDValid", \ "deviceSerialValid", "capabilityStructureValid", \ "cxlDVSECValid", "cxlErrorLogValid" \ } #define CXL_PROTOCOL_ERROR_AGENT_TYPES_KEYS \ (int[]) \ { \ 0, 1 \ } #define CXL_PROTOCOL_ERROR_AGENT_TYPES_VALUES \ (const char *[]) \ { \ "CXL 1.1 Device", "CXL 1.1 Host Downstream Port" \ } #define CXL_PROTOCOL_ERROR_DEVICE_AGENT 0 #define CXL_PROTOCOL_ERROR_HOST_DOWNSTREAM_PORT_AGENT 1 /// /// CXL Protocol Error Section /// typedef struct { UINT64 VendorId : 16; UINT64 DeviceId : 16; UINT64 SubsystemVendorId : 16; UINT64 SubsystemDeviceId : 16; UINT64 ClassCode : 16; UINT64 Reserved1 : 3; UINT64 SlotNumber : 13; UINT64 Reserved2 : 32; } EFI_CXL_DEVICE_ID; typedef struct { UINT64 FunctionNumber : 8; UINT64 DeviceNumber : 8; UINT64 BusNumber : 8; UINT64 SegmentNumber : 16; UINT64 Reserved : 24; } EFI_CXL_DEVICE_AGENT_ADDRESS; typedef union { EFI_CXL_DEVICE_AGENT_ADDRESS DeviceAddress; //Active when the agent is a CXL1.1 device in CxlAgentType. UINT64 PortRcrbBaseAddress; //Active when the agent is a CXL1.1 host downstream port in CxlAgentType. } EFI_CXL_AGENT_ADDRESS; typedef struct { UINT64 ValidBits; UINT64 CxlAgentType; EFI_CXL_AGENT_ADDRESS CxlAgentAddress; EFI_CXL_DEVICE_ID DeviceId; UINT64 DeviceSerial; EFI_PCIE_ERROR_DATA_CAPABILITY CapabilityStructure; UINT16 CxlDvsecLength; UINT16 CxlErrorLogLength; UINT32 Reserved; } __attribute__((packed, aligned(1))) EFI_CXL_PROTOCOL_ERROR_DATA; json_object *cper_section_cxl_protocol_to_ir(void *section); void ir_section_cxl_protocol_to_cper(json_object *section, FILE *out); #endif