4 * Copyright (c) 2022 Intel
6 * This work is licensed under the terms of the GNU GPL, version 2. See the
7 * COPYING file in the top-level directory.
13 #include "qemu/uuid.h"
16 * CXL rev 3.0 section 8.2.9.2.2; Table 8-49
18 * Define these as the bit position for the event status register for ease of
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,
31 * Common Event Record Format
32 * CXL rev 3.0 section 8.2.9.2.1; Table 8-42
34 #define CXL_EVENT_REC_HDR_RES_LEN 0xf
35 typedef struct CXLEventRecordHdr
{
40 uint16_t related_handle
;
42 uint8_t maint_op_class
;
43 uint8_t reserved
[CXL_EVENT_REC_HDR_RES_LEN
];
44 } QEMU_PACKED CXLEventRecordHdr
;
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))
54 * Get Event Records output payload
55 * CXL rev 3.0 section 8.2.9.2.2; Table 8-50
57 #define CXL_GET_EVENT_FLAG_OVERFLOW BIT(0)
58 #define CXL_GET_EVENT_FLAG_MORE_RECORDS BIT(1)
59 typedef struct CXLGetEventPayload
{
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))
72 * Clear Event Records input payload
73 * CXL rev 3.0 section 8.2.9.2.3; Table 8-51
75 typedef struct CXLClearEventPayload
{
76 uint8_t event_log
; /* CXLEventLogType */
81 } CXLClearEventPayload
;
84 * Event Interrupt Policy
86 * CXL rev 3.0 section 8.2.9.2.4; Table 8-52
88 typedef enum CXLEventIntMode
{
90 CXL_INT_MSI_MSIX
= 0x01,
94 #define CXL_EVENT_INT_MODE_MASK 0x3
95 #define CXL_EVENT_INT_SETTING(vector) \
96 ((((uint8_t)vector & 0xf) << 4) | CXL_INT_MSI_MSIX)
97 typedef struct CXLEventInterruptPolicy
{
98 uint8_t info_settings
;
99 uint8_t warn_settings
;
100 uint8_t failure_settings
;
101 uint8_t fatal_settings
;
102 uint8_t dyn_cap_settings
;
103 } QEMU_PACKED CXLEventInterruptPolicy
;
104 /* DCD is optional but other fields are not */
105 #define CXL_EVENT_INT_SETTING_MIN_LEN 4
108 * General Media Event Record
109 * CXL rev 3.0 Section 8.2.9.2.1.1; Table 8-43
111 #define CXL_EVENT_GEN_MED_COMP_ID_SIZE 0x10
112 #define CXL_EVENT_GEN_MED_RES_SIZE 0x2e
113 typedef struct CXLEventGenMedia
{
114 CXLEventRecordHdr hdr
;
118 uint8_t transaction_type
;
119 uint16_t validity_flags
;
123 uint8_t component_id
[CXL_EVENT_GEN_MED_COMP_ID_SIZE
];
124 uint8_t reserved
[CXL_EVENT_GEN_MED_RES_SIZE
];
125 } QEMU_PACKED CXLEventGenMedia
;
129 * CXL Rev 3.0 Section 8.2.9.2.1.2: Table 8-44
130 * All fields little endian.
132 typedef struct CXLEventDram
{
133 CXLEventRecordHdr hdr
;
137 uint8_t transaction_type
;
138 uint16_t validity_flags
;
141 uint8_t nibble_mask
[3];
146 uint64_t correction_mask
[4];
147 uint8_t reserved
[0x17];
148 } QEMU_PACKED CXLEventDram
;
151 * Memory Module Event Record
152 * CXL Rev 3.0 Section 8.2.9.2.1.3: Table 8-45
153 * All fields little endian.
155 typedef struct CXLEventMemoryModule
{
156 CXLEventRecordHdr hdr
;
158 uint8_t health_status
;
159 uint8_t media_status
;
160 uint8_t additional_status
;
163 uint32_t dirty_shutdown_count
;
164 uint32_t corrected_volatile_error_count
;
165 uint32_t corrected_persistent_error_count
;
166 uint8_t reserved
[0x3d];
167 } QEMU_PACKED CXLEventMemoryModule
;
169 #endif /* CXL_EVENTS_H */