summaryrefslogtreecommitdiffstats
path: root/nvme-print-json.c
diff options
context:
space:
mode:
Diffstat (limited to 'nvme-print-json.c')
-rw-r--r--nvme-print-json.c185
1 files changed, 148 insertions, 37 deletions
diff --git a/nvme-print-json.c b/nvme-print-json.c
index 923b28e..485c013 100644
--- a/nvme-print-json.c
+++ b/nvme-print-json.c
@@ -210,6 +210,7 @@ static void json_nvme_id_ns(struct nvme_id_ns *ns, unsigned int nsid,
json_object_add_value_uint(root, "mnan", le32_to_cpu(ctrl->mnan));
json_object_add_value_uint128(root, "maxdna", maxdna);
json_object_add_value_uint(root, "maxcna", le32_to_cpu(ctrl->maxcna));
+ json_object_add_value_uint(root, "oaqd", le32_to_cpu(ctrl->oaqd));
if (strlen(subnqn))
json_object_add_value_string(root, "subnqn", subnqn);
@@ -229,7 +230,10 @@ static void json_nvme_id_ns(struct nvme_id_ns *ns, unsigned int nsid,
json_object_add_value_int(psd, "max_power",
le16_to_cpu(ctrl->psd[i].mp));
- json_object_add_value_int(psd, "flags", ctrl->psd[i].flags);
+ json_object_add_value_int(psd, "max_power_scale",
+ ctrl->psd[i].flags & 0x1);
+ json_object_add_value_int(psd, "non-operational_state",
+ (ctrl->psd[i].flags & 0x2) >> 1);
json_object_add_value_uint(psd, "entry_lat",
le32_to_cpu(ctrl->psd[i].enlat));
json_object_add_value_uint(psd, "exit_lat",
@@ -451,51 +455,43 @@ void json_changed_ns_list_log(struct nvme_ns_list *log,
json_free_object(root);
}
-static void json_endurance_log(struct nvme_endurance_group_log *endurance_group,
- __u16 group_id, const char *devname)
+static void json_endurance_log(struct nvme_endurance_group_log *endurance_group, __u16 group_id,
+ const char *devname)
{
struct json_object *root;
-
- nvme_uint128_t endurance_estimate =
- le128_to_cpu(endurance_group->endurance_estimate);
- nvme_uint128_t data_units_read =
- le128_to_cpu(endurance_group->data_units_read);
- nvme_uint128_t data_units_written =
- le128_to_cpu(endurance_group->data_units_written);
- nvme_uint128_t media_units_written =
- le128_to_cpu(endurance_group->media_units_written);
- nvme_uint128_t host_read_cmds =
- le128_to_cpu(endurance_group->host_read_cmds);
- nvme_uint128_t host_write_cmds =
- le128_to_cpu(endurance_group->host_write_cmds);
+ nvme_uint128_t endurance_estimate = le128_to_cpu(endurance_group->endurance_estimate);
+ nvme_uint128_t data_units_read = le128_to_cpu(endurance_group->data_units_read);
+ nvme_uint128_t data_units_written = le128_to_cpu(endurance_group->data_units_written);
+ nvme_uint128_t media_units_written = le128_to_cpu(endurance_group->media_units_written);
+ nvme_uint128_t host_read_cmds = le128_to_cpu(endurance_group->host_read_cmds);
+ nvme_uint128_t host_write_cmds = le128_to_cpu(endurance_group->host_write_cmds);
nvme_uint128_t media_data_integrity_err =
- le128_to_cpu(endurance_group->media_data_integrity_err);
+ le128_to_cpu(endurance_group->media_data_integrity_err);
nvme_uint128_t num_err_info_log_entries =
- le128_to_cpu(endurance_group->num_err_info_log_entries);
+ le128_to_cpu(endurance_group->num_err_info_log_entries);
+ nvme_uint128_t total_end_grp_cap = le128_to_cpu(endurance_group->total_end_grp_cap);
+ nvme_uint128_t unalloc_end_grp_cap = le128_to_cpu(endurance_group->unalloc_end_grp_cap);
root = json_create_object();
- json_object_add_value_int(root, "critical_warning",
- endurance_group->critical_warning);
- json_object_add_value_int(root, "avl_spare",
- endurance_group->avl_spare);
+ json_object_add_value_int(root, "critical_warning", endurance_group->critical_warning);
+ json_object_add_value_int(root, "endurance_group_features",
+ endurance_group->endurance_group_features);
+ json_object_add_value_int(root, "avl_spare", endurance_group->avl_spare);
json_object_add_value_int(root, "avl_spare_threshold",
- endurance_group->avl_spare_threshold);
- json_object_add_value_int(root, "percent_used",
- endurance_group->percent_used);
- json_object_add_value_uint128(root, "endurance_estimate",
- endurance_estimate);
+ endurance_group->avl_spare_threshold);
+ json_object_add_value_int(root, "percent_used", endurance_group->percent_used);
+ json_object_add_value_int(root, "domain_identifier", endurance_group->domain_identifier);
+ json_object_add_value_uint128(root, "endurance_estimate", endurance_estimate);
json_object_add_value_uint128(root, "data_units_read", data_units_read);
- json_object_add_value_uint128(root, "data_units_written",
- data_units_written);
- json_object_add_value_uint128(root, "media_units_written",
- media_units_written);
+ json_object_add_value_uint128(root, "data_units_written", data_units_written);
+ json_object_add_value_uint128(root, "media_units_written", media_units_written);
json_object_add_value_uint128(root, "host_read_cmds", host_read_cmds);
json_object_add_value_uint128(root, "host_write_cmds", host_write_cmds);
- json_object_add_value_uint128(root, "media_data_integrity_err",
- media_data_integrity_err);
- json_object_add_value_uint128(root, "num_err_info_log_entries",
- num_err_info_log_entries);
+ json_object_add_value_uint128(root, "media_data_integrity_err", media_data_integrity_err);
+ json_object_add_value_uint128(root, "num_err_info_log_entries", num_err_info_log_entries);
+ json_object_add_value_uint128(root, "total_end_grp_cap", total_end_grp_cap);
+ json_object_add_value_uint128(root, "unalloc_end_grp_cap", unalloc_end_grp_cap);
json_print_object(root, NULL);
printf("\n");
@@ -1413,6 +1409,116 @@ static void json_boot_part_log(void *bp_log, const char *devname,
json_free_object(root);
}
+/* Printable Eye string is allocated and returned, caller must free */
+static char *json_eom_printable_eye(struct nvme_eom_lane_desc *lane,
+ struct json_object *root)
+{
+ char *eye = (char *)lane->eye_desc;
+
+ char *printable = malloc(lane->nrows * lane->ncols + lane->ncols);
+ char *printable_start = printable;
+ if (!printable)
+ goto exit;
+
+ int i, j;
+ for (i = 0; i < lane->nrows; i++) {
+ for (j = 0; j < lane->ncols; j++, printable++)
+ sprintf(printable, "%c", eye[i * lane->ncols + j]);
+ sprintf(printable++, "\n");
+ }
+
+ json_object_add_value_string(root, "printable_eye", printable_start);
+
+exit:
+ return printable_start;
+}
+
+
+static void json_phy_rx_eom_descs(struct nvme_phy_rx_eom_log *log,
+ struct json_object *root, char **allocated_eyes)
+{
+ void *p = log->descs;
+ uint16_t num_descs = le16_to_cpu(log->nd);
+ int i;
+ struct json_object *descs;
+
+ descs = json_create_array();
+ json_object_add_value_array(root, "descs", descs);
+
+ for (i = 0; i < num_descs; i++) {
+ struct nvme_eom_lane_desc *desc = p;
+ struct json_object *jdesc = json_create_object();
+
+ json_object_add_value_uint(jdesc, "lid", desc->mstatus);
+ json_object_add_value_uint(jdesc, "lane", desc->lane);
+ json_object_add_value_uint(jdesc, "eye", desc->eye);
+ json_object_add_value_uint(jdesc, "top", le16_to_cpu(desc->top));
+ json_object_add_value_uint(jdesc, "bottom", le16_to_cpu(desc->bottom));
+ json_object_add_value_uint(jdesc, "left", le16_to_cpu(desc->left));
+ json_object_add_value_uint(jdesc, "right", le16_to_cpu(desc->right));
+ json_object_add_value_uint(jdesc, "nrows", le16_to_cpu(desc->nrows));
+ json_object_add_value_uint(jdesc, "ncols", le16_to_cpu(desc->ncols));
+ json_object_add_value_uint(jdesc, "edlen", le16_to_cpu(desc->edlen));
+
+ if (log->odp & NVME_EOM_PRINTABLE_EYE_PRESENT)
+ allocated_eyes[i] = json_eom_printable_eye(desc, root);
+
+ /* Eye Data field is vendor specific, doesn't map to JSON */
+
+ json_array_add_value_object(descs, jdesc);
+
+ p += log->dsize;
+ }
+}
+
+static void json_phy_rx_eom_log(struct nvme_phy_rx_eom_log *log, __u16 controller)
+{
+ char **allocated_eyes = NULL;
+ int i;
+
+ struct json_object *root;
+ root = json_create_object();
+
+ json_object_add_value_uint(root, "lid", log->lid);
+ json_object_add_value_uint(root, "eomip", log->eomip);
+ json_object_add_value_uint(root, "hsize", le16_to_cpu(log->hsize));
+ json_object_add_value_uint(root, "rsize", le32_to_cpu(log->rsize));
+ json_object_add_value_uint(root, "eomdgn", log->eomdgn);
+ json_object_add_value_uint(root, "lr", log->lr);
+ json_object_add_value_uint(root, "lanes", log->lanes);
+ json_object_add_value_uint(root, "epl", log->epl);
+ json_object_add_value_uint(root, "lspfc", log->lspfc);
+ json_object_add_value_uint(root, "li", log->li);
+ json_object_add_value_uint(root, "lsic", le16_to_cpu(log->lsic));
+ json_object_add_value_uint(root, "dsize", le32_to_cpu(log->dsize));
+ json_object_add_value_uint(root, "nd", le16_to_cpu(log->nd));
+ json_object_add_value_uint(root, "maxtb", le16_to_cpu(log->maxtb));
+ json_object_add_value_uint(root, "maxlr", le16_to_cpu(log->maxlr));
+ json_object_add_value_uint(root, "etgood", le16_to_cpu(log->etgood));
+ json_object_add_value_uint(root, "etbetter", le16_to_cpu(log->etbetter));
+ json_object_add_value_uint(root, "etbest", le16_to_cpu(log->etbest));
+
+ if (log->eomip == NVME_PHY_RX_EOM_COMPLETED) {
+ /* Save Printable Eye strings allocated to free later */
+ allocated_eyes = malloc(log->nd * sizeof(char *));
+ if (allocated_eyes)
+ json_phy_rx_eom_descs(log, root, allocated_eyes);
+ }
+
+ json_print_object(root, NULL);
+ printf("\n");
+
+ if (allocated_eyes) {
+ for (i = 0; i < log->nd; i++) {
+ /* Free any Printable Eye strings allocated */
+ if (allocated_eyes[i])
+ free(allocated_eyes[i]);
+ }
+ free(allocated_eyes);
+ }
+ json_free_object(root);
+}
+
static void json_media_unit_stat_log(struct nvme_media_unit_stat_log *mus)
{
@@ -1797,6 +1903,8 @@ static void json_print_nvme_subsystem_list(nvme_root_t r, bool show_ana)
nvme_subsystem_get_name(s));
json_object_add_value_string(subsystem_attrs, "NQN",
nvme_subsystem_get_nqn(s));
+ json_object_add_value_string(subsystem_attrs, "IOPolicy",
+ nvme_subsystem_get_iopolicy(s));
json_array_add_value_object(subsystems, subsystem_attrs);
paths = json_create_array();
@@ -2378,8 +2486,8 @@ static void json_nvme_id_uuid_list(const struct nvme_id_uuid_list *uuid_list)
root = json_create_object();
entries = json_create_array();
- /* The 0th entry is reserved */
- for (i = 1; i < NVME_ID_UUID_LIST_MAX; i++) {
+
+ for (i = 0; i < NVME_ID_UUID_LIST_MAX; i++) {
__u8 uuid[NVME_UUID_LEN];
struct json_object *entry = json_create_object();
@@ -2757,6 +2865,8 @@ static void json_simple_topology(nvme_root_t r)
nvme_subsystem_get_name(s));
json_object_add_value_string(subsystem_attrs, "NQN",
nvme_subsystem_get_nqn(s));
+ json_object_add_value_string(subsystem_attrs, "IOPolicy",
+ nvme_subsystem_get_iopolicy(s));
json_array_add_value_object(subsystems, subsystem_attrs);
namespaces = json_create_array();
@@ -2921,6 +3031,7 @@ static void json_output_perror(const char *msg)
static struct print_ops json_print_ops = {
.ana_log = json_ana_log,
.boot_part_log = json_boot_part_log,
+ .phy_rx_eom_log = json_phy_rx_eom_log,
.ctrl_list = json_nvme_list_ctrl,
.ctrl_registers = json_ctrl_registers,
.discovery_log = json_discovery_log,