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