xref: /qemu/include/hw/cxl/cxl_events.h (revision 22d7e3be0714f39bae43bd0c05f6e6d149a47b13)
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 #endif /* CXL_EVENTS_H */
84