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