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