1
0
Fork 0

Merging upstream version 2.6.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-16 12:24:54 +01:00
parent 52cbdbff70
commit 407776cd14
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
262 changed files with 7434 additions and 3024 deletions

View file

@ -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,