Blame SOURCES/0010-nvme-cli-Decode-Supported-Events-Bitmap-in-PEL-heade.patch

35de48
From a0db61992c14b34fcf6787b957d5d5d0e77c6f33 Mon Sep 17 00:00:00 2001
35de48
From: Maurizio Lombardi <mlombard@redhat.com>
35de48
Date: Wed, 29 Jun 2022 18:00:44 +0200
35de48
Subject: [PATCH 3/7] nvme-cli: Decode "Supported Events Bitmap" in PEL header
35de48
35de48
"Supported Events Bitmap" in PEL header shows what events
35de48
are supported in current nvme devices.
35de48
35de48
Persistent Event Log for device: nvme0n1
35de48
Action for Persistent Event Log: 0
35de48
..
35de48
..
35de48
..
35de48
Supported Events Bitmap:
35de48
        Support SMART/Health Log Snapshot Event(0x1)
35de48
        Support Firmware Commit Event(0x2)
35de48
        Support Timestamp Change Event(0x3)
35de48
        Support Power-on or Reset Event(0x4)
35de48
        Support NVM Subsystem Hardware Error Event(0x5)
35de48
        Support Change Namespace Event(0x6)
35de48
        Support Format NVM Start Event(0x7)
35de48
        Support Format NVM Completion Event(0x8)
35de48
        Support Sanitize Start Event(0x9)
35de48
        Support Sanitize Completion Event(0xa)
35de48
        Support Set Feature Event(0xb)
35de48
        Support Set Telemetry CRT  Event(0xc)
35de48
        Support Thermal Excursion Event(0xd)
35de48
35de48
Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
35de48
---
35de48
 nvme-print.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++------
35de48
 nvme.c       |  4 ++--
35de48
 2 files changed, 48 insertions(+), 8 deletions(-)
35de48
35de48
diff --git a/nvme-print.c b/nvme-print.c
35de48
index f631b347..21524a50 100755
35de48
--- a/nvme-print.c
35de48
+++ b/nvme-print.c
35de48
@@ -1015,6 +1015,26 @@ void nvme_show_predictable_latency_event_agg_log(
35de48
 	}
35de48
 }
35de48
 
35de48
+const char *nvme_pel_event_to_string(int type)
35de48
+{
35de48
+	switch (type) {
35de48
+	case NVME_SMART_HEALTH_EVENT:	return "SMART/Health Log Snapshot Event(0x1)";
35de48
+	case NVME_FW_COMMIT_EVENT:	return "Firmware Commit Event(0x2)";
35de48
+	case NVME_TIMESTAMP_EVENT:	return "Timestamp Change Event(0x3)";
35de48
+	case NVME_POWER_ON_RESET_EVENT:	return "Power-on or Reset Event(0x4)";
35de48
+	case NVME_NSS_HW_ERROR_EVENT:	return "NVM Subsystem Hardware Error Event(0x5)";
35de48
+	case NVME_CHANGE_NS_EVENT:	return "Change Namespace Event(0x6)";
35de48
+	case NVME_FORMAT_START_EVENT:	return "Format NVM Start Event(0x7)";
35de48
+	case NVME_FORMAT_COMPLETION_EVENT:	return "Format NVM Completion Event(0x8)";
35de48
+	case NVME_SANITIZE_START_EVENT:	return "Sanitize Start Event(0x9)";
35de48
+	case NVME_SANITIZE_COMPLETION_EVENT:	return "Sanitize Completion Event(0xa)";
35de48
+	case NVME_SET_FEATURE_EVENT:	return "Set Feature Event(0xb)";
35de48
+	case NVME_TELEMETRY_CRT:		return "Set Telemetry CRT  Event(0xc)";
35de48
+	case NVME_THERMAL_EXCURSION_EVENT:	return "Thermal Excursion Event(0xd)";
35de48
+	default:			return NULL;
35de48
+	}
35de48
+}
35de48
+
35de48
 static const char *nvme_show_nss_hw_error(__u16 error_code)
35de48
 {
35de48
 	switch (error_code) {
35de48
@@ -1043,6 +1063,29 @@ static const char *nvme_show_nss_hw_error(__u16 error_code)
35de48
 	}
35de48
 }
35de48
 
35de48
+static void add_bitmap(int i, __u8 seb, struct json_object *root, int json_flag)
35de48
+{
35de48
+	char evt_str[50];
35de48
+	char key[128];
35de48
+
35de48
+	for (int bit = 0; bit < 8; bit++) {
35de48
+		if (nvme_pel_event_to_string(bit + i * 8)) {
35de48
+			if (json_flag == 1) {
35de48
+				sprintf(key, "bitmap_%x", (bit + i * 8));
35de48
+				if ((seb >> bit) & 0x1)
35de48
+					snprintf(evt_str, sizeof(evt_str), "Support %s",
35de48
+						nvme_pel_event_to_string(bit + i * 8));
35de48
+				json_object_add_value_string(root, key, evt_str);
35de48
+			} else {
35de48
+				if (nvme_pel_event_to_string(bit + i * 8))
35de48
+					if ((seb >> bit) & 0x1)
35de48
+						printf("	Support %s\n",
35de48
+							nvme_pel_event_to_string(bit + i * 8));
35de48
+			}
35de48
+		}
35de48
+	}
35de48
+}
35de48
+
35de48
 void json_persistent_event_log(void *pevent_log_info, __u32 size)
35de48
 {
35de48
 	struct json_object *root;
35de48
@@ -1112,9 +1155,7 @@ void json_persistent_event_log(void *pevent_log_info, __u32 size)
35de48
 		for (int i = 0; i < 32; i++) {
35de48
 			if (pevent_log_head->supp_event_bm[i] == 0)
35de48
 				continue;
35de48
-			sprintf(key, "bitmap_%d", i);
35de48
-			json_object_add_value_uint(root, key,
35de48
-				pevent_log_head->supp_event_bm[i]);
35de48
+			add_bitmap(i, pevent_log_head->supp_event_bm[i], root, 1);
35de48
 		}
35de48
 	} else {
35de48
 		printf("No log data can be shown with this log len at least " \
35de48
@@ -1440,12 +1481,11 @@ void nvme_show_persistent_event_log(void *pevent_log_info,
35de48
 			le32_to_cpu(pevent_log_head->rci));
35de48
 		if(human)
35de48
 			nvme_show_persistent_event_log_rci(pevent_log_head->rci);
35de48
-		printf("Supported Events Bitmap: ");
35de48
+		printf("Supported Events Bitmap: \n");
35de48
 		for (int i = 0; i < 32; i++) {
35de48
 			if (pevent_log_head->supp_event_bm[i] == 0)
35de48
 				continue;
35de48
-			printf("BitMap[%d] is 0x%x\n", i,
35de48
-				pevent_log_head->supp_event_bm[i]);
35de48
+			add_bitmap(i, pevent_log_head->supp_event_bm[i], NULL, 0);
35de48
 		}
35de48
 	} else {
35de48
 		printf("No log data can be shown with this log len at least " \
35de48
diff --git a/nvme.c b/nvme.c
35de48
index 0535ed2b..44c53e6b 100644
35de48
--- a/nvme.c
35de48
+++ b/nvme.c
35de48
@@ -4808,7 +4808,7 @@ static int dsm(int argc, char **argv, struct command *cmd, struct plugin *plugin
35de48
 
35de48
 	nc = argconfig_parse_comma_sep_array(cfg.ctx_attrs, ctx_attrs, ARRAY_SIZE(ctx_attrs));
35de48
 	nb = argconfig_parse_comma_sep_array(cfg.blocks, nlbs, ARRAY_SIZE(nlbs));
35de48
-	ns = argconfig_parse_comma_sep_array_long(cfg.slbas, slbas, ARRAY_SIZE(slbas));
35de48
+	ns = argconfig_parse_comma_sep_array_long(cfg.slbas, (long long unsigned int *)slbas, ARRAY_SIZE(slbas));
35de48
 	nr = max(nc, max(nb, ns));
35de48
 	if (!nr || nr > 256) {
35de48
 		fprintf(stderr, "No range definition provided\n");
35de48
@@ -4963,7 +4963,7 @@ static int copy(int argc, char **argv, struct command *cmd, struct plugin *plugi
35de48
 		}
35de48
 	}
35de48
 
35de48
-	copy = nvme_setup_copy_range(nlbs, slbas, eilbrts, elbatms, elbats, nr);
35de48
+	copy = nvme_setup_copy_range(nlbs, (__u64 *)slbas, eilbrts, elbatms, elbats, nr);
35de48
 	if (!copy) {
35de48
 		fprintf(stderr, "failed to allocate payload\n");
35de48
 		errno = ENOMEM;
35de48
-- 
35de48
2.31.1
35de48