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