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