diff options
Diffstat (limited to 'nvme-print-json.c')
-rw-r--r-- | nvme-print-json.c | 185 |
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, |