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