]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
ocp: split smart extended log print codes
authorTokunori Ikegami <ikegami.t@gmail.com>
Sun, 29 Sep 2024 14:19:10 +0000 (23:19 +0900)
committerDaniel Wagner <wagi@monom.org>
Wed, 23 Oct 2024 12:24:49 +0000 (14:24 +0200)
Move into ocp-print-stdout.c and ocp-print-json.c.

Signed-off-by: Tokunori Ikegami <ikegami.t@gmail.com>
plugins/ocp/meson.build
plugins/ocp/ocp-print-json.c
plugins/ocp/ocp-print-stdout.c
plugins/ocp/ocp-print.c
plugins/ocp/ocp-print.h
plugins/ocp/ocp-smart-extended-log.c
plugins/ocp/ocp-smart-extended-log.h

index 1f627f3c108b557dc622628e07ac6dea10fd04af..4f8be4738064a7f5965193cf1d928acdd0b0920c 100644 (file)
@@ -1,6 +1,7 @@
 sources += [
   'plugins/ocp/ocp-utils.c',
   'plugins/ocp/ocp-clear-features.c',
+  'plugins/ocp/ocp-smart-extended-log.c',
   'plugins/ocp/ocp-fw-activation-history.c',
   'plugins/ocp/ocp-hardware-component-log.c',
   'plugins/ocp/ocp-print.c',
@@ -11,7 +12,6 @@ sources += [
 if json_c_dep.found()
   sources += [
     'plugins/ocp/ocp-nvme.c',
-    'plugins/ocp/ocp-smart-extended-log.c',
     'plugins/ocp/ocp-telemetry-decode.c',
     'plugins/ocp/ocp-print-json.c',
   ]
index 7d0a5636c53529be2bb9a1f3078f2562b1bb1922..d2a691bff1705ef5347995d0ef1566ee10b5cb1e 100644 (file)
@@ -5,6 +5,7 @@
 #include "ocp-print.h"
 #include "ocp-hardware-component-log.h"
 #include "ocp-fw-activation-history.h"
+#include "ocp-smart-extended-log.h"
 
 static void print_hwcomp_desc_json(struct hwcomp_desc_entry *e, struct json_object *r)
 {
@@ -131,9 +132,122 @@ static void json_fw_activation_history(const struct fw_activation_history *fw_hi
        printf("\n");
 }
 
+static void json_smart_extended_log(void *data)
+{
+       struct json_object *root;
+       struct json_object *pmuw;
+       struct json_object *pmur;
+       uint16_t smart_log_ver = 0;
+       __u8 *log_data = data;
+       char guid[40];
+
+       root = json_create_object();
+       pmuw = json_create_object();
+       pmur = json_create_object();
+
+       json_object_add_value_uint64(pmuw, "hi",
+               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW + 8] & 0xFFFFFFFFFFFFFFFF));
+       json_object_add_value_uint64(pmuw, "lo",
+               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW] & 0xFFFFFFFFFFFFFFFF));
+       json_object_add_value_object(root, "Physical media units written", pmuw);
+       json_object_add_value_uint64(pmur, "hi",
+               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR + 8] & 0xFFFFFFFFFFFFFFFF));
+       json_object_add_value_uint64(pmur, "lo",
+               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR] & 0xFFFFFFFFFFFFFFFF));
+       json_object_add_value_object(root, "Physical media units read", pmur);
+       json_object_add_value_uint64(root, "Bad user nand blocks - Raw",
+               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BUNBR] & 0x0000FFFFFFFFFFFF));
+       json_object_add_value_uint(root, "Bad user nand blocks - Normalized",
+               (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN]));
+       json_object_add_value_uint64(root, "Bad system nand blocks - Raw",
+               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF));
+       json_object_add_value_uint(root, "Bad system nand blocks - Normalized",
+               (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN]));
+       json_object_add_value_uint64(root, "XOR recovery count",
+               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC]));
+       json_object_add_value_uint64(root, "Uncorrectable read error count",
+               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC]));
+       json_object_add_value_uint64(root, "Soft ecc error count",
+               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC]));
+       json_object_add_value_uint(root, "End to end detected errors",
+               (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC]));
+       json_object_add_value_uint(root, "End to end corrected errors",
+               (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE]));
+       json_object_add_value_uint(root, "System data percent used",
+               (__u8)log_data[SCAO_SDPU]);
+       json_object_add_value_uint64(root, "Refresh counts",
+               (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF));
+       json_object_add_value_uint(root, "Max User data erase counts",
+               (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC]));
+       json_object_add_value_uint(root, "Min User data erase counts",
+               (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC]));
+       json_object_add_value_uint(root, "Number of Thermal throttling events",
+               (__u8)log_data[SCAO_NTTE]);
+       json_object_add_value_uint(root, "Current throttling status",
+               (__u8)log_data[SCAO_CTS]);
+       json_object_add_value_uint64(root, "PCIe correctable error count",
+               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC]));
+       json_object_add_value_uint(root, "Incomplete shutdowns",
+               (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS]));
+       json_object_add_value_uint(root, "Percent free blocks",
+               (__u8)log_data[SCAO_PFB]);
+       json_object_add_value_uint(root, "Capacitor health",
+               (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH]));
+       json_object_add_value_uint64(root, "Unaligned I/O",
+               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO]));
+       json_object_add_value_uint64(root, "Security Version Number",
+               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN]));
+       json_object_add_value_uint64(root, "NUSE - Namespace utilization",
+               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE]));
+       json_object_add_value_uint128(root, "PLP start count",
+               le128_to_cpu(&log_data[SCAO_PSC]));
+       json_object_add_value_uint128(root, "Endurance estimate",
+               le128_to_cpu(&log_data[SCAO_EEST]));
+       smart_log_ver = (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_LPV]);
+
+       json_object_add_value_uint(root, "Log page version", smart_log_ver);
+
+       memset((void *)guid, 0, 40);
+       sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"",
+               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG + 8]),
+               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG]));
+       json_object_add_value_string(root, "Log page GUID", guid);
+
+       switch (smart_log_ver) {
+       case 0 ... 1:
+               break;
+       default:
+       case 4:
+               json_object_add_value_uint(root, "NVMe Command Set Errata Version",
+                                          (__u8)log_data[SCAO_NCSEV]);
+               json_object_add_value_uint(root, "Lowest Permitted Firmware Revision",
+                                          le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
+               fallthrough;
+       case 2 ... 3:
+               json_object_add_value_uint(root, "Errata Version Field",
+                                          (__u8)log_data[SCAO_EVF]);
+               json_object_add_value_uint(root, "Point Version Field",
+                                          le16_to_cpu(*(uint16_t *)&log_data[SCAO_PVF]));
+               json_object_add_value_uint(root, "Minor Version Field",
+                                          le16_to_cpu(*(uint16_t *)&log_data[SCAO_MIVF]));
+               json_object_add_value_uint(root, "Major Version Field",
+                                          (__u8)log_data[SCAO_MAVF]);
+               json_object_add_value_uint(root, "NVMe Base Errata Version",
+                                          (__u8)log_data[SCAO_NBEV]);
+               json_object_add_value_uint(root, "PCIe Link Retraining Count",
+                                          le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC]));
+               json_object_add_value_uint(root, "Power State Change Count",
+                                          le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
+       }
+       json_print_object(root, NULL);
+       printf("\n");
+       json_free_object(root);
+}
+
 static struct ocp_print_ops json_print_ops = {
        .hwcomp_log = json_hwcomp_log,
        .fw_act_history = json_fw_activation_history,
+       .smart_extended_log = json_smart_extended_log,
 };
 
 struct ocp_print_ops *ocp_get_json_print_ops(nvme_print_flags_t flags)
index 2a3539ec259dfa653d9c2694e0b7911c68a980bf..6aac2579237f4e67013278f87ea7b36bb5639cca 100644 (file)
@@ -5,6 +5,7 @@
 #include "ocp-print.h"
 #include "ocp-hardware-component-log.h"
 #include "ocp-fw-activation-history.h"
+#include "ocp-smart-extended-log.h"
 
 static void print_hwcomp_desc(struct hwcomp_desc_entry *e, bool list, int num)
 {
@@ -92,9 +93,109 @@ static void stdout_fw_activation_history(const struct fw_activation_history *fw_
        printf("\n");
 }
 
+static void stdout_smart_extended_log(void *data)
+{
+       uint16_t smart_log_ver = 0;
+       __u8 *log_data = data;
+
+       printf("SMART Cloud Attributes :-\n");
+
+       printf("  Physical media units written -                %"PRIu64" %"PRIu64"\n",
+              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW + 8] & 0xFFFFFFFFFFFFFFFF),
+              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW] & 0xFFFFFFFFFFFFFFFF));
+       printf("  Physical media units read    -                %"PRIu64" %"PRIu64"\n",
+              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR + 8] & 0xFFFFFFFFFFFFFFFF),
+              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR] & 0xFFFFFFFFFFFFFFFF));
+       printf("  Bad user nand blocks - Raw                    %"PRIu64"\n",
+              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BUNBR] & 0x0000FFFFFFFFFFFF));
+       printf("  Bad user nand blocks - Normalized             %d\n",
+              (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN]));
+       printf("  Bad system nand blocks - Raw                  %"PRIu64"\n",
+              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF));
+       printf("  Bad system nand blocks - Normalized           %d\n",
+              (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN]));
+       printf("  XOR recovery count                            %"PRIu64"\n",
+              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC]));
+       printf("  Uncorrectable read error count                %"PRIu64"\n",
+              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC]));
+       printf("  Soft ecc error count                          %"PRIu64"\n",
+              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC]));
+       printf("  End to end detected errors                    %"PRIu32"\n",
+              (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC]));
+       printf("  End to end corrected errors                   %"PRIu32"\n",
+              (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE]));
+       printf("  System data percent used                      %d\n",
+              (__u8)log_data[SCAO_SDPU]);
+       printf("  Refresh counts                                %"PRIu64"\n",
+              (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF));
+       printf("  Max User data erase counts                    %"PRIu32"\n",
+              (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC]));
+       printf("  Min User data erase counts                    %"PRIu32"\n",
+              (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC]));
+       printf("  Number of Thermal throttling events           %d\n",
+              (__u8)log_data[SCAO_NTTE]);
+       printf("  Current throttling status                     0x%x\n",
+              (__u8)log_data[SCAO_CTS]);
+       printf("  PCIe correctable error count                  %"PRIu64"\n",
+              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC]));
+       printf("  Incomplete shutdowns                          %"PRIu32"\n",
+              (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS]));
+       printf("  Percent free blocks                           %d\n",
+              (__u8)log_data[SCAO_PFB]);
+       printf("  Capacitor health                              %"PRIu16"\n",
+              (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH]));
+       printf("  NVMe base errata version                      %c\n",
+              (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH]));
+       printf("  NVMe command set errata version               %c\n",
+              (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH]));
+       printf("  Unaligned I/O                                 %"PRIu64"\n",
+              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO]));
+       printf("  Security Version Number                       %"PRIu64"\n",
+              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN]));
+       printf("  NUSE - Namespace utilization                  %"PRIu64"\n",
+              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE]));
+       printf("  PLP start count                               %s\n",
+              uint128_t_to_string(le128_to_cpu(&log_data[SCAO_PSC])));
+       printf("  Endurance estimate                            %s\n",
+              uint128_t_to_string(le128_to_cpu(&log_data[SCAO_EEST])));
+       smart_log_ver = (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_LPV]);
+       printf("  Log page version                              %"PRIu16"\n", smart_log_ver);
+       printf("  Log page GUID                                 0x");
+       printf("%"PRIx64"%"PRIx64"\n", (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG + 8]),
+              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG]));
+       switch (smart_log_ver) {
+       case 0 ... 1:
+               break;
+       default:
+       case 4:
+               printf("  NVMe Command Set Errata Version               %d\n",
+                      (__u8)log_data[SCAO_NCSEV]);
+               printf("  Lowest Permitted Firmware Revision            %"PRIu64"\n",
+                      le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
+               fallthrough;
+       case 2 ... 3:
+               printf("  Errata Version Field                          %d\n",
+                      (__u8)log_data[SCAO_EVF]);
+               printf("  Point Version Field                           %"PRIu16"\n",
+                      le16_to_cpu(*(uint16_t *)&log_data[SCAO_PVF]));
+               printf("  Minor Version Field                           %"PRIu16"\n",
+                      le16_to_cpu(*(uint16_t *)&log_data[SCAO_MIVF]));
+               printf("  Major Version Field                           %d\n",
+                      (__u8)log_data[SCAO_MAVF]);
+               printf("  NVMe Base Errata Version                      %d\n",
+                      (__u8)log_data[SCAO_NBEV]);
+               printf("  PCIe Link Retraining Count                    %"PRIu64"\n",
+                      (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC]));
+               printf("  Power State Change Count                      %"PRIu64"\n",
+                      le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
+       }
+       printf("\n");
+}
+
 static struct ocp_print_ops stdout_print_ops = {
        .hwcomp_log = stdout_hwcomp_log,
        .fw_act_history = stdout_fw_activation_history,
+       .smart_extended_log = stdout_smart_extended_log,
 };
 
 struct ocp_print_ops *ocp_get_stdout_print_ops(nvme_print_flags_t flags)
index c73258ae2d5d9c8e0a9f276edeb7e84f61ddb7a0..4cdd50899fbde5ed3fdda9b2870a6b38db3d2f4c 100644 (file)
@@ -33,3 +33,8 @@ void ocp_fw_act_history(const struct fw_activation_history *fw_history, nvme_pri
 {
        ocp_print(fw_act_history, flags, fw_history);
 }
+
+void ocp_smart_extended_log(void *data, nvme_print_flags_t flags)
+{
+       ocp_print(smart_extended_log, flags, data);
+}
index 48f854d6945025ebb8c25e3b16ef9d1b7c712fd8..38ae93e85a8a2e0ca30a7454f959420d3fd7519a 100644 (file)
@@ -8,6 +8,7 @@
 struct ocp_print_ops {
        void (*hwcomp_log)(struct hwcomp_log *log, __u32 id, bool list);
        void (*fw_act_history)(const struct fw_activation_history *fw_history);
+       void (*smart_extended_log)(void *data);
        nvme_print_flags_t flags;
 };
 
@@ -25,4 +26,5 @@ static inline struct ocp_print_ops *ocp_get_json_print_ops(nvme_print_flags_t fl
 
 void ocp_show_hwcomp_log(struct hwcomp_log *log, __u32 id, bool list, nvme_print_flags_t flags);
 void ocp_fw_act_history(const struct fw_activation_history *fw_history, nvme_print_flags_t flags);
+void ocp_smart_extended_log(void *data, nvme_print_flags_t flags);
 #endif /* OCP_PRINT_H */
index 2ff7738fc3391d3fac0f00338b7dd639390d4aac..084426304327df99db15b7e1951ad48d60218093 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "common.h"
 #include "nvme-print.h"
+#include "ocp-print.h"
 
 /* C0 SCAO Log Page */
 #define C0_SMART_CLOUD_ATTR_LEN                        0x200
@@ -26,256 +27,6 @@ static __u8 scao_guid[C0_GUID_LENGTH] = {
        0xC9, 0x14, 0xD5, 0xAF
 };
 
-enum {
-       SCAO_PMUW       = 0,    /* Physical media units written */
-       SCAO_PMUR       = 16,   /* Physical media units read */
-       SCAO_BUNBR      = 32,   /* Bad user nand blocks raw */
-       SCAO_BUNBN      = 38,   /* Bad user nand blocks normalized */
-       SCAO_BSNBR      = 40,   /* Bad system nand blocks raw */
-       SCAO_BSNBN      = 46,   /* Bad system nand blocks normalized */
-       SCAO_XRC        = 48,   /* XOR recovery count */
-       SCAO_UREC       = 56,   /* Uncorrectable read error count */
-       SCAO_SEEC       = 64,   /* Soft ecc error count */
-       SCAO_EEDC       = 72,   /* End to end detected errors */
-       SCAO_EECE       = 76,   /* End to end corrected errors */
-       SCAO_SDPU       = 80,   /* System data percent used */
-       SCAO_RFSC       = 81,   /* Refresh counts */
-       SCAO_MXUDEC     = 88,   /* Max User data erase counts */
-       SCAO_MNUDEC     = 92,   /* Min User data erase counts */
-       SCAO_NTTE       = 96,   /* Number of Thermal throttling events */
-       SCAO_CTS        = 97,   /* Current throttling status */
-       SCAO_EVF        = 98,   /* Errata Version Field */
-       SCAO_PVF        = 99,   /* Point Version Field */
-       SCAO_MIVF       = 101,  /* Minor Version Field */
-       SCAO_MAVF       = 103,  /* Major Version Field */
-       SCAO_PCEC       = 104,  /* PCIe correctable error count */
-       SCAO_ICS        = 112,  /* Incomplete shutdowns */
-       SCAO_PFB        = 120,  /* Percent free blocks */
-       SCAO_CPH        = 128,  /* Capacitor health */
-       SCAO_NBEV       = 130,  /* NVMe Base Errata Version */
-       SCAO_NCSEV      = 131,  /* NVMe Command Set Errata Version */
-       SCAO_UIO        = 136,  /* Unaligned I/O */
-       SCAO_SVN        = 144,  /* Security Version Number */
-       SCAO_NUSE       = 152,  /* NUSE - Namespace utilization */
-       SCAO_PSC        = 160,  /* PLP start count */
-       SCAO_EEST       = 176,  /* Endurance estimate */
-       SCAO_PLRC       = 192,  /* PCIe Link Retraining Count */
-       SCAO_PSCC       = 200,  /* Power State Change Count */
-       SCAO_LPFR       = 208,  /* Lowest Permitted Firmware Revision */
-       SCAO_LPV        = 494,  /* Log page version */
-       SCAO_LPG        = 496,  /* Log page GUID */
-};
-
-static void ocp_print_C0_log_normal(void *data)
-{
-       uint16_t smart_log_ver = 0;
-       __u8 *log_data = data;
-
-       printf("SMART Cloud Attributes :-\n");
-
-       printf("  Physical media units written -                %"PRIu64" %"PRIu64"\n",
-              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW + 8] & 0xFFFFFFFFFFFFFFFF),
-              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW] & 0xFFFFFFFFFFFFFFFF));
-       printf("  Physical media units read    -                %"PRIu64" %"PRIu64"\n",
-              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR + 8] & 0xFFFFFFFFFFFFFFFF),
-              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR] & 0xFFFFFFFFFFFFFFFF));
-       printf("  Bad user nand blocks - Raw                    %"PRIu64"\n",
-              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BUNBR] & 0x0000FFFFFFFFFFFF));
-       printf("  Bad user nand blocks - Normalized             %d\n",
-              (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN]));
-       printf("  Bad system nand blocks - Raw                  %"PRIu64"\n",
-              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF));
-       printf("  Bad system nand blocks - Normalized           %d\n",
-              (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN]));
-       printf("  XOR recovery count                            %"PRIu64"\n",
-              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC]));
-       printf("  Uncorrectable read error count                %"PRIu64"\n",
-              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC]));
-       printf("  Soft ecc error count                          %"PRIu64"\n",
-              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC]));
-       printf("  End to end detected errors                    %"PRIu32"\n",
-              (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC]));
-       printf("  End to end corrected errors                   %"PRIu32"\n",
-              (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE]));
-       printf("  System data percent used                      %d\n",
-              (__u8)log_data[SCAO_SDPU]);
-       printf("  Refresh counts                                %"PRIu64"\n",
-              (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF));
-       printf("  Max User data erase counts                    %"PRIu32"\n",
-              (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC]));
-       printf("  Min User data erase counts                    %"PRIu32"\n",
-              (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC]));
-       printf("  Number of Thermal throttling events           %d\n",
-              (__u8)log_data[SCAO_NTTE]);
-       printf("  Current throttling status                     0x%x\n",
-              (__u8)log_data[SCAO_CTS]);
-       printf("  PCIe correctable error count                  %"PRIu64"\n",
-              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC]));
-       printf("  Incomplete shutdowns                          %"PRIu32"\n",
-              (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS]));
-       printf("  Percent free blocks                           %d\n",
-              (__u8)log_data[SCAO_PFB]);
-       printf("  Capacitor health                              %"PRIu16"\n",
-              (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH]));
-       printf("  NVMe base errata version                      %c\n",
-              (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH]));
-       printf("  NVMe command set errata version               %c\n",
-              (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH]));
-       printf("  Unaligned I/O                                 %"PRIu64"\n",
-              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO]));
-       printf("  Security Version Number                       %"PRIu64"\n",
-              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN]));
-       printf("  NUSE - Namespace utilization                  %"PRIu64"\n",
-              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE]));
-       printf("  PLP start count                               %s\n",
-              uint128_t_to_string(le128_to_cpu(&log_data[SCAO_PSC])));
-       printf("  Endurance estimate                            %s\n",
-              uint128_t_to_string(le128_to_cpu(&log_data[SCAO_EEST])));
-       smart_log_ver = (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_LPV]);
-       printf("  Log page version                              %"PRIu16"\n", smart_log_ver);
-       printf("  Log page GUID                                 0x");
-       printf("%"PRIx64"%"PRIx64"\n", (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG + 8]),
-              (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG]));
-       switch (smart_log_ver) {
-       case 0 ... 1:
-               break;
-       default:
-       case 4:
-               printf("  NVMe Command Set Errata Version               %d\n",
-                      (__u8)log_data[SCAO_NCSEV]);
-               printf("  Lowest Permitted Firmware Revision            %"PRIu64"\n",
-                      le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
-               fallthrough;
-       case 2 ... 3:
-               printf("  Errata Version Field                          %d\n",
-                      (__u8)log_data[SCAO_EVF]);
-               printf("  Point Version Field                           %"PRIu16"\n",
-                      le16_to_cpu(*(uint16_t *)&log_data[SCAO_PVF]));
-               printf("  Minor Version Field                           %"PRIu16"\n",
-                      le16_to_cpu(*(uint16_t *)&log_data[SCAO_MIVF]));
-               printf("  Major Version Field                           %d\n",
-                      (__u8)log_data[SCAO_MAVF]);
-               printf("  NVMe Base Errata Version                      %d\n",
-                      (__u8)log_data[SCAO_NBEV]);
-               printf("  PCIe Link Retraining Count                    %"PRIu64"\n",
-                      (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC]));
-               printf("  Power State Change Count                      %"PRIu64"\n",
-                      le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
-       }
-       printf("\n");
-}
-
-static void ocp_print_C0_log_json(void *data)
-{
-       struct json_object *root;
-       struct json_object *pmuw;
-       struct json_object *pmur;
-       uint16_t smart_log_ver = 0;
-       __u8 *log_data = data;
-       char guid[40];
-
-       root = json_create_object();
-       pmuw = json_create_object();
-       pmur = json_create_object();
-
-       json_object_add_value_uint64(pmuw, "hi",
-               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW + 8] & 0xFFFFFFFFFFFFFFFF));
-       json_object_add_value_uint64(pmuw, "lo",
-               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW] & 0xFFFFFFFFFFFFFFFF));
-       json_object_add_value_object(root, "Physical media units written", pmuw);
-       json_object_add_value_uint64(pmur, "hi",
-               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR + 8] & 0xFFFFFFFFFFFFFFFF));
-       json_object_add_value_uint64(pmur, "lo",
-               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR] & 0xFFFFFFFFFFFFFFFF));
-       json_object_add_value_object(root, "Physical media units read", pmur);
-       json_object_add_value_uint64(root, "Bad user nand blocks - Raw",
-               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BUNBR] & 0x0000FFFFFFFFFFFF));
-       json_object_add_value_uint(root, "Bad user nand blocks - Normalized",
-               (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN]));
-       json_object_add_value_uint64(root, "Bad system nand blocks - Raw",
-               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF));
-       json_object_add_value_uint(root, "Bad system nand blocks - Normalized",
-               (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN]));
-       json_object_add_value_uint64(root, "XOR recovery count",
-               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC]));
-       json_object_add_value_uint64(root, "Uncorrectable read error count",
-               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC]));
-       json_object_add_value_uint64(root, "Soft ecc error count",
-               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC]));
-       json_object_add_value_uint(root, "End to end detected errors",
-               (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC]));
-       json_object_add_value_uint(root, "End to end corrected errors",
-               (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE]));
-       json_object_add_value_uint(root, "System data percent used",
-               (__u8)log_data[SCAO_SDPU]);
-       json_object_add_value_uint64(root, "Refresh counts",
-               (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF));
-       json_object_add_value_uint(root, "Max User data erase counts",
-               (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC]));
-       json_object_add_value_uint(root, "Min User data erase counts",
-               (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC]));
-       json_object_add_value_uint(root, "Number of Thermal throttling events",
-               (__u8)log_data[SCAO_NTTE]);
-       json_object_add_value_uint(root, "Current throttling status",
-               (__u8)log_data[SCAO_CTS]);
-       json_object_add_value_uint64(root, "PCIe correctable error count",
-               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC]));
-       json_object_add_value_uint(root, "Incomplete shutdowns",
-               (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS]));
-       json_object_add_value_uint(root, "Percent free blocks",
-               (__u8)log_data[SCAO_PFB]);
-       json_object_add_value_uint(root, "Capacitor health",
-               (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH]));
-       json_object_add_value_uint64(root, "Unaligned I/O",
-               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO]));
-       json_object_add_value_uint64(root, "Security Version Number",
-               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN]));
-       json_object_add_value_uint64(root, "NUSE - Namespace utilization",
-               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE]));
-       json_object_add_value_uint128(root, "PLP start count",
-               le128_to_cpu(&log_data[SCAO_PSC]));
-       json_object_add_value_uint128(root, "Endurance estimate",
-               le128_to_cpu(&log_data[SCAO_EEST]));
-       smart_log_ver = (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_LPV]);
-
-       json_object_add_value_uint(root, "Log page version", smart_log_ver);
-
-       memset((void *)guid, 0, 40);
-       sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"", (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG + 8]),
-               (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG]));
-       json_object_add_value_string(root, "Log page GUID", guid);
-
-       switch (smart_log_ver) {
-       case 0 ... 1:
-               break;
-       default:
-       case 4:
-               json_object_add_value_uint(root, "NVMe Command Set Errata Version",
-                                          (__u8)log_data[SCAO_NCSEV]);
-               json_object_add_value_uint(root, "Lowest Permitted Firmware Revision",
-                                          le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
-               fallthrough;
-       case 2 ... 3:
-               json_object_add_value_uint(root, "Errata Version Field",
-                                          (__u8)log_data[SCAO_EVF]);
-               json_object_add_value_uint(root, "Point Version Field",
-                                          le16_to_cpu(*(uint16_t *)&log_data[SCAO_PVF]));
-               json_object_add_value_uint(root, "Minor Version Field",
-                                          le16_to_cpu(*(uint16_t *)&log_data[SCAO_MIVF]));
-               json_object_add_value_uint(root, "Major Version Field",
-                                          (__u8)log_data[SCAO_MAVF]);
-               json_object_add_value_uint(root, "NVMe Base Errata Version",
-                                          (__u8)log_data[SCAO_NBEV]);
-               json_object_add_value_uint(root, "PCIe Link Retraining Count",
-                                          (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC]));
-               json_object_add_value_uint(root, "Power State Change Count",
-                                          le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
-       }
-       json_print_object(root, NULL);
-       printf("\n");
-       json_free_object(root);
-}
-
 static int get_c0_log_page(int fd, char *format)
 {
        nvme_print_flags_t fmt;
@@ -326,16 +77,7 @@ static int get_c0_log_page(int fd, char *format)
                }
 
                /* print the data */
-               switch (fmt) {
-               case NORMAL:
-                       ocp_print_C0_log_normal(data);
-                       break;
-               case JSON:
-                       ocp_print_C0_log_json(data);
-                       break;
-               default:
-                       break;
-               }
+               ocp_smart_extended_log(data, fmt);
        } else {
                fprintf(stderr, "ERROR : OCP : Unable to read C0 data from buffer\n");
        }
index 42c1f9856a2a9deafa9106e8f2d9fb8d1c276964..3e64b1b05ce5d3955347bc3f3b6b2f73b584b8fa 100644 (file)
 struct command;
 struct plugin;
 
+enum {
+       SCAO_PMUW       = 0,    /* Physical media units written */
+       SCAO_PMUR       = 16,   /* Physical media units read */
+       SCAO_BUNBR      = 32,   /* Bad user nand blocks raw */
+       SCAO_BUNBN      = 38,   /* Bad user nand blocks normalized */
+       SCAO_BSNBR      = 40,   /* Bad system nand blocks raw */
+       SCAO_BSNBN      = 46,   /* Bad system nand blocks normalized */
+       SCAO_XRC        = 48,   /* XOR recovery count */
+       SCAO_UREC       = 56,   /* Uncorrectable read error count */
+       SCAO_SEEC       = 64,   /* Soft ecc error count */
+       SCAO_EEDC       = 72,   /* End to end detected errors */
+       SCAO_EECE       = 76,   /* End to end corrected errors */
+       SCAO_SDPU       = 80,   /* System data percent used */
+       SCAO_RFSC       = 81,   /* Refresh counts */
+       SCAO_MXUDEC     = 88,   /* Max User data erase counts */
+       SCAO_MNUDEC     = 92,   /* Min User data erase counts */
+       SCAO_NTTE       = 96,   /* Number of Thermal throttling events */
+       SCAO_CTS        = 97,   /* Current throttling status */
+       SCAO_EVF        = 98,   /* Errata Version Field */
+       SCAO_PVF        = 99,   /* Point Version Field */
+       SCAO_MIVF       = 101,  /* Minor Version Field */
+       SCAO_MAVF       = 103,  /* Major Version Field */
+       SCAO_PCEC       = 104,  /* PCIe correctable error count */
+       SCAO_ICS        = 112,  /* Incomplete shutdowns */
+       SCAO_PFB        = 120,  /* Percent free blocks */
+       SCAO_CPH        = 128,  /* Capacitor health */
+       SCAO_NBEV       = 130,  /* NVMe Base Errata Version */
+       SCAO_NCSEV      = 131,  /* NVMe Command Set Errata Version */
+       SCAO_UIO        = 136,  /* Unaligned I/O */
+       SCAO_SVN        = 144,  /* Security Version Number */
+       SCAO_NUSE       = 152,  /* NUSE - Namespace utilization */
+       SCAO_PSC        = 160,  /* PLP start count */
+       SCAO_EEST       = 176,  /* Endurance estimate */
+       SCAO_PLRC       = 192,  /* PCIe Link Retraining Count */
+       SCAO_PSCC       = 200,  /* Power State Change Count */
+       SCAO_LPFR       = 208,  /* Lowest Permitted Firmware Revision */
+       SCAO_LPV        = 494,  /* Log page version */
+       SCAO_LPG        = 496,  /* Log page GUID */
+};
+
 int ocp_smart_add_log(int argc, char **argv, struct command *cmd,
        struct plugin *plugin);