xref: /openbmc/qemu/include/hw/cxl/cxl_events.h (revision e409c905)
1 /*
2  * QEMU CXL Events
3  *
4  * Copyright (c) 2022 Intel
5  *
6  * This work is licensed under the terms of the GNU GPL, version 2. See the
7  * COPYING file in the top-level directory.
8  */
9 
10 #ifndef CXL_EVENTS_H
11 #define CXL_EVENTS_H
12 
13 #include "qemu/uuid.h"
14 
15 /*
16  * CXL rev 3.0 section 8.2.9.2.2; Table 8-49
17  *
18  * Define these as the bit position for the event status register for ease of
19  * setting the status.
20  */
21 typedef enum CXLEventLogType {
22     CXL_EVENT_TYPE_INFO          = 0,
23     CXL_EVENT_TYPE_WARN          = 1,
24     CXL_EVENT_TYPE_FAIL          = 2,
25     CXL_EVENT_TYPE_FATAL         = 3,
26     CXL_EVENT_TYPE_DYNAMIC_CAP   = 4,
27     CXL_EVENT_TYPE_MAX
28 } CXLEventLogType;
29 
30 /*
31  * Common Event Record Format
32  * CXL rev 3.0 section 8.2.9.2.1; Table 8-42
33  */
34 #define CXL_EVENT_REC_HDR_RES_LEN 0xf
35 typedef struct CXLEventRecordHdr {
36     QemuUUID id;
37     uint8_t length;
38     uint8_t flags[3];
39     uint16_t handle;
40     uint16_t related_handle;
41     uint64_t timestamp;
42     uint8_t maint_op_class;
43     uint8_t reserved[CXL_EVENT_REC_HDR_RES_LEN];
44 } QEMU_PACKED CXLEventRecordHdr;
45 
46 #define CXL_EVENT_RECORD_DATA_LENGTH 0x50
47 typedef struct CXLEventRecordRaw {
48     CXLEventRecordHdr hdr;
49     uint8_t data[CXL_EVENT_RECORD_DATA_LENGTH];
50 } QEMU_PACKED CXLEventRecordRaw;
51 #define CXL_EVENT_RECORD_SIZE (sizeof(CXLEventRecordRaw))
52 
53 /*
54  * Get Event Records output payload
55  * CXL rev 3.0 section 8.2.9.2.2; Table 8-50
56  */
57 #define CXL_GET_EVENT_FLAG_OVERFLOW     BIT(0)
58 #define CXL_GET_EVENT_FLAG_MORE_RECORDS BIT(1)
59 typedef struct CXLGetEventPayload {
60     uint8_t flags;
61     uint8_t reserved1;
62     uint16_t overflow_err_count;
63     uint64_t first_overflow_timestamp;
64     uint64_t last_overflow_timestamp;
65     uint16_t record_count;
66     uint8_t reserved2[0xa];
67     CXLEventRecordRaw records[];
68 } QEMU_PACKED CXLGetEventPayload;
69 #define CXL_EVENT_PAYLOAD_HDR_SIZE (sizeof(CXLGetEventPayload))
70 
71 /*
72  * Clear Event Records input payload
73  * CXL rev 3.0 section 8.2.9.2.3; Table 8-51
74  */
75 typedef struct CXLClearEventPayload {
76     uint8_t event_log;      /* CXLEventLogType */
77     uint8_t clear_flags;
78     uint8_t nr_recs;
79     uint8_t reserved[3];
80     uint16_t handle[];
81 } CXLClearEventPayload;
82 
83 /**
84  * Event Interrupt Policy
85  *
86  * CXL rev 3.0 section 8.2.9.2.4; Table 8-52
87  */
88 typedef enum CXLEventIntMode {
89     CXL_INT_NONE     = 0x00,
90     CXL_INT_MSI_MSIX = 0x01,
91     CXL_INT_FW       = 0x02,
92     CXL_INT_RES      = 0x03,
93 } CXLEventIntMode;
94 #define CXL_EVENT_INT_MODE_MASK 0x3
95 #define CXL_EVENT_INT_SETTING(vector) ((((uint8_t)vector & 0xf) << 4) | CXL_INT_MSI_MSIX)
96 typedef struct CXLEventInterruptPolicy {
97     uint8_t info_settings;
98     uint8_t warn_settings;
99     uint8_t failure_settings;
100     uint8_t fatal_settings;
101     uint8_t dyn_cap_settings;
102 } QEMU_PACKED CXLEventInterruptPolicy;
103 /* DCD is optional but other fields are not */
104 #define CXL_EVENT_INT_SETTING_MIN_LEN 4
105 
106 /*
107  * General Media Event Record
108  * CXL rev 3.0 Section 8.2.9.2.1.1; Table 8-43
109  */
110 #define CXL_EVENT_GEN_MED_COMP_ID_SIZE  0x10
111 #define CXL_EVENT_GEN_MED_RES_SIZE      0x2e
112 typedef struct CXLEventGenMedia {
113     CXLEventRecordHdr hdr;
114     uint64_t phys_addr;
115     uint8_t descriptor;
116     uint8_t type;
117     uint8_t transaction_type;
118     uint16_t validity_flags;
119     uint8_t channel;
120     uint8_t rank;
121     uint8_t device[3];
122     uint8_t component_id[CXL_EVENT_GEN_MED_COMP_ID_SIZE];
123     uint8_t reserved[CXL_EVENT_GEN_MED_RES_SIZE];
124 } QEMU_PACKED CXLEventGenMedia;
125 
126 /*
127  * DRAM Event Record
128  * CXL Rev 3.0 Section 8.2.9.2.1.2: Table 8-44
129  * All fields little endian.
130  */
131 typedef struct CXLEventDram {
132     CXLEventRecordHdr hdr;
133     uint64_t phys_addr;
134     uint8_t descriptor;
135     uint8_t type;
136     uint8_t transaction_type;
137     uint16_t validity_flags;
138     uint8_t channel;
139     uint8_t rank;
140     uint8_t nibble_mask[3];
141     uint8_t bank_group;
142     uint8_t bank;
143     uint8_t row[3];
144     uint16_t column;
145     uint64_t correction_mask[4];
146     uint8_t reserved[0x17];
147 } QEMU_PACKED CXLEventDram;
148 
149 /*
150  * Memory Module Event Record
151  * CXL Rev 3.0 Section 8.2.9.2.1.3: Table 8-45
152  * All fields little endian.
153  */
154 typedef struct CXLEventMemoryModule {
155     CXLEventRecordHdr hdr;
156     uint8_t type;
157     uint8_t health_status;
158     uint8_t media_status;
159     uint8_t additional_status;
160     uint8_t life_used;
161     int16_t temperature;
162     uint32_t dirty_shutdown_count;
163     uint32_t corrected_volatile_error_count;
164     uint32_t corrected_persistent_error_count;
165     uint8_t reserved[0x3d];
166 } QEMU_PACKED CXLEventMemoryModule;
167 
168 #endif /* CXL_EVENTS_H */
169