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