@@ -575,18 +575,20 @@ int ras_cxl_overflow_event_handler(struct trace_seq *s,
/*
* Common Event Record Format
- * CXL 3.0 section 8.2.9.2.1; Table 8-42
+ * CXL 3.1 section 8.2.9.2.1; Table 8-43
*/
#define CXL_EVENT_RECORD_FLAG_PERMANENT BIT(2)
#define CXL_EVENT_RECORD_FLAG_MAINT_NEEDED BIT(3)
#define CXL_EVENT_RECORD_FLAG_PERF_DEGRADED BIT(4)
#define CXL_EVENT_RECORD_FLAG_HW_REPLACE BIT(5)
+#define CXL_EVENT_RECORD_FLAG_MAINT_OP_SUB_CLASS_VALID BIT(6)
static const struct cxl_event_flags cxl_hdr_flags[] = {
{ .bit = CXL_EVENT_RECORD_FLAG_PERMANENT, .flag = "PERMANENT_CONDITION" },
{ .bit = CXL_EVENT_RECORD_FLAG_MAINT_NEEDED, .flag = "MAINTENANCE_NEEDED" },
{ .bit = CXL_EVENT_RECORD_FLAG_PERF_DEGRADED, .flag = "PERFORMANCE_DEGRADED" },
{ .bit = CXL_EVENT_RECORD_FLAG_HW_REPLACE, .flag = "HARDWARE_REPLACEMENT_NEEDED" },
+ { .bit = CXL_EVENT_RECORD_FLAG_MAINT_OP_SUB_CLASS_VALID, .flag = "MAINT_OP_SUB_CLASS_VALID" },
};
static int handle_ras_cxl_common_hdr(struct trace_seq *s,
@@ -670,6 +672,12 @@ static int handle_ras_cxl_common_hdr(struct trace_seq *s,
if (trace_seq_printf(s, "hdr_maint_op_class:%u ", hdr->hdr_maint_op_class) <= 0)
return -1;
+ if (tep_get_field_val(s, event, "hdr_maint_op_sub_class", record, &val, 1) < 0)
+ return -1;
+ hdr->hdr_maint_op_sub_class = val;
+ if (trace_seq_printf(s, "hdr_maint_op_sub_class:%u ", hdr->hdr_maint_op_sub_class) <= 0)
+ return -1;
+
return 0;
}
@@ -797,6 +797,7 @@ static int ras_store_cxl_common_hdr(sqlite3_stmt *stmt, struct ras_cxl_event_com
sqlite3_bind_text(stmt, idx++, hdr->hdr_timestamp, -1, NULL);
sqlite3_bind_int(stmt, idx++, hdr->hdr_length);
sqlite3_bind_int(stmt, idx++, hdr->hdr_maint_op_class);
+ sqlite3_bind_int(stmt, idx++, hdr->hdr_maint_op_sub_class);
return idx;
}
@@ -818,6 +819,7 @@ static const struct db_fields cxl_generic_event_fields[] = {
{ .name = "hdr_ts", .type = "TEXT" },
{ .name = "hdr_length", .type = "INTEGER" },
{ .name = "hdr_maint_op_class", .type = "INTEGER" },
+ { .name = "hdr_maint_op_sub_class", .type = "INTEGER" },
{ .name = "data", .type = "BLOB" },
};
@@ -873,6 +875,7 @@ static const struct db_fields cxl_general_media_event_fields[] = {
{ .name = "hdr_ts", .type = "TEXT" },
{ .name = "hdr_length", .type = "INTEGER" },
{ .name = "hdr_maint_op_class", .type = "INTEGER" },
+ { .name = "hdr_maint_op_sub_class", .type = "INTEGER" },
{ .name = "dpa", .type = "INTEGER" },
{ .name = "dpa_flags", .type = "INTEGER" },
{ .name = "descriptor", .type = "INTEGER" },
@@ -952,6 +955,7 @@ static const struct db_fields cxl_dram_event_fields[] = {
{ .name = "hdr_ts", .type = "TEXT" },
{ .name = "hdr_length", .type = "INTEGER" },
{ .name = "hdr_maint_op_class", .type = "INTEGER" },
+ { .name = "hdr_maint_op_sub_class", .type = "INTEGER" },
{ .name = "dpa", .type = "INTEGER" },
{ .name = "dpa_flags", .type = "INTEGER" },
{ .name = "descriptor", .type = "INTEGER" },
@@ -1038,6 +1042,7 @@ static const struct db_fields cxl_memory_module_event_fields[] = {
{ .name = "hdr_ts", .type = "TEXT" },
{ .name = "hdr_length", .type = "INTEGER" },
{ .name = "hdr_maint_op_class", .type = "INTEGER" },
+ { .name = "hdr_maint_op_sub_class", .type = "INTEGER" },
{ .name = "event_type", .type = "INTEGER" },
{ .name = "health_status", .type = "INTEGER" },
{ .name = "media_status", .type = "INTEGER" },
@@ -179,6 +179,7 @@ struct ras_cxl_event_common_hdr {
char hdr_timestamp[64];
uint8_t hdr_length;
uint8_t hdr_maint_op_class;
+ uint8_t hdr_maint_op_sub_class;
};
struct ras_cxl_generic_event {
@@ -507,7 +507,8 @@ static int set_cxl_generic_event_backtrace(char *buf, struct ras_cxl_generic_eve
"hdr_related_handle=0x%x\n"
"hdr_timestamp=%s\n"
"hdr_length=%u\n"
- "hdr_maint_op_class=%u\n",
+ "hdr_maint_op_class=%u\n"
+ "hdr_maint_op_sub_class=%u\n",
ev->hdr.timestamp,
ev->hdr.memdev,
ev->hdr.host,
@@ -519,7 +520,8 @@ static int set_cxl_generic_event_backtrace(char *buf, struct ras_cxl_generic_eve
ev->hdr.hdr_related_handle,
ev->hdr.hdr_timestamp,
ev->hdr.hdr_length,
- ev->hdr.hdr_maint_op_class);
+ ev->hdr.hdr_maint_op_class,
+ ev->hdr.hdr_maint_op_sub_class);
return 0;
}