summaryrefslogtreecommitdiffstats
path: root/nvme-print.c
diff options
context:
space:
mode:
Diffstat (limited to 'nvme-print.c')
-rw-r--r--nvme-print.c529
1 files changed, 454 insertions, 75 deletions
diff --git a/nvme-print.c b/nvme-print.c
index c27f087..cabce68 100644
--- a/nvme-print.c
+++ b/nvme-print.c
@@ -169,13 +169,13 @@ static void json_nvme_id_ns(struct nvme_id_ns *ns, bool cap_only)
}
json_object_add_value_int(root, "mssrl", le16_to_cpu(ns->mssrl));
- json_object_add_value_int(root, "mcl", le32_to_cpu(ns->mcl));
+ json_object_add_value_uint(root, "mcl", le32_to_cpu(ns->mcl));
json_object_add_value_int(root, "msrc", ns->msrc);
}
json_object_add_value_int(root, "nulbaf", ns->nulbaf);
if (!cap_only) {
- json_object_add_value_int(root, "anagrpid", le32_to_cpu(ns->anagrpid));
+ json_object_add_value_uint(root, "anagrpid", le32_to_cpu(ns->anagrpid));
json_object_add_value_int(root, "endgid", le16_to_cpu(ns->endgid));
memset(eui64, 0, sizeof(eui64_buf));
@@ -247,7 +247,7 @@ static void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl,
json_object_add_value_uint(root, "rtd3r", le32_to_cpu(ctrl->rtd3r));
json_object_add_value_uint(root, "rtd3e", le32_to_cpu(ctrl->rtd3e));
json_object_add_value_uint(root, "oaes", le32_to_cpu(ctrl->oaes));
- json_object_add_value_int(root, "ctratt", le32_to_cpu(ctrl->ctratt));
+ json_object_add_value_uint(root, "ctratt", le32_to_cpu(ctrl->ctratt));
json_object_add_value_int(root, "rrls", le16_to_cpu(ctrl->rrls));
json_object_add_value_int(root, "cntrltype", ctrl->cntrltype);
json_object_add_value_string(root, "fguid", util_uuid_to_string(ctrl->fguid));
@@ -281,19 +281,19 @@ static void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl,
json_object_add_value_int(root, "hctma", le16_to_cpu(ctrl->hctma));
json_object_add_value_int(root, "mntmt", le16_to_cpu(ctrl->mntmt));
json_object_add_value_int(root, "mxtmt", le16_to_cpu(ctrl->mxtmt));
- json_object_add_value_int(root, "sanicap", le32_to_cpu(ctrl->sanicap));
- json_object_add_value_int(root, "hmminds", le32_to_cpu(ctrl->hmminds));
+ json_object_add_value_uint(root, "sanicap", le32_to_cpu(ctrl->sanicap));
+ json_object_add_value_uint(root, "hmminds", le32_to_cpu(ctrl->hmminds));
json_object_add_value_int(root, "hmmaxd", le16_to_cpu(ctrl->hmmaxd));
json_object_add_value_int(root, "nsetidmax",
le16_to_cpu(ctrl->nsetidmax));
json_object_add_value_int(root, "endgidmax", le16_to_cpu(ctrl->endgidmax));
json_object_add_value_int(root, "anatt",ctrl->anatt);
json_object_add_value_int(root, "anacap", ctrl->anacap);
- json_object_add_value_int(root, "anagrpmax",
+ json_object_add_value_uint(root, "anagrpmax",
le32_to_cpu(ctrl->anagrpmax));
- json_object_add_value_int(root, "nanagrpid",
+ json_object_add_value_uint(root, "nanagrpid",
le32_to_cpu(ctrl->nanagrpid));
- json_object_add_value_int(root, "pels", le32_to_cpu(ctrl->pels));
+ json_object_add_value_uint(root, "pels", le32_to_cpu(ctrl->pels));
json_object_add_value_int(root, "domainid", le16_to_cpu(ctrl->domainid));
json_object_add_value_uint128(root, "megcap", megcap);
json_object_add_value_int(root, "sqes", ctrl->sqes);
@@ -310,16 +310,16 @@ static void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl,
json_object_add_value_int(root, "nwpc", ctrl->nwpc);
json_object_add_value_int(root, "acwu", le16_to_cpu(ctrl->acwu));
json_object_add_value_int(root, "ocfs", le16_to_cpu(ctrl->ocfs));
- json_object_add_value_int(root, "sgls", le32_to_cpu(ctrl->sgls));
- json_object_add_value_int(root, "mnan", le32_to_cpu(ctrl->mnan));
+ json_object_add_value_uint(root, "sgls", le32_to_cpu(ctrl->sgls));
+ json_object_add_value_uint(root, "mnan", le32_to_cpu(ctrl->mnan));
json_object_add_value_uint128(root, "maxdna", maxdna);
- json_object_add_value_int(root, "maxcna", le32_to_cpu(ctrl->maxcna));
+ json_object_add_value_uint(root, "maxcna", le32_to_cpu(ctrl->maxcna));
if (strlen(subnqn))
json_object_add_value_string(root, "subnqn", subnqn);
- json_object_add_value_int(root, "ioccsz", le32_to_cpu(ctrl->ioccsz));
- json_object_add_value_int(root, "iorcsz", le32_to_cpu(ctrl->iorcsz));
+ json_object_add_value_uint(root, "ioccsz", le32_to_cpu(ctrl->ioccsz));
+ json_object_add_value_uint(root, "iorcsz", le32_to_cpu(ctrl->iorcsz));
json_object_add_value_int(root, "icdoff", le16_to_cpu(ctrl->icdoff));
json_object_add_value_int(root, "fcatt", ctrl->fcatt);
json_object_add_value_int(root, "msdbd", ctrl->msdbd);
@@ -422,7 +422,7 @@ static void json_nvme_resv_report(struct nvme_resv_status *status,
root = json_create_object();
- json_object_add_value_int(root, "gen", le32_to_cpu(status->gen));
+ json_object_add_value_uint(root, "gen", le32_to_cpu(status->gen));
json_object_add_value_int(root, "rtype", status->rtype);
json_object_add_value_int(root, "regctl", regctl);
json_object_add_value_int(root, "ptpls", status->ptpls);
@@ -782,7 +782,7 @@ static void json_self_test_log(struct nvme_self_test_log *self_test, __u8 dst_en
json_object_add_value_uint64(valid_attrs, "Power on hours",
le64_to_cpu(self_test->result[i].poh));
if (self_test->result[i].vdi & NVME_ST_VALID_DIAG_INFO_NSID)
- json_object_add_value_int(valid_attrs, "Namespace Identifier",
+ json_object_add_value_uint(valid_attrs, "Namespace Identifier",
le32_to_cpu(self_test->result[i].nsid));
if (self_test->result[i].vdi & NVME_ST_VALID_DIAG_INFO_FLBA) {
json_object_add_value_uint64(valid_attrs, "Failing LBA",
@@ -2292,6 +2292,358 @@ static void json_supported_cap_config_log(
json_free_object(root);
}
+static void json_nvme_fdp_configs(struct nvme_fdp_config_log *log, size_t len)
+{
+ struct json_object *root, *obj_configs;
+ uint16_t n;
+
+ void *p = log->configs;
+
+ root = json_create_object();
+ obj_configs = json_create_array();
+
+ n = le16_to_cpu(log->n);
+
+ json_object_add_value_uint(root, "n", n);
+
+ for (int i = 0; i < n + 1; i++) {
+ struct nvme_fdp_config_desc *config = p;
+
+ struct json_object *obj_config = json_create_object();
+ struct json_object *obj_ruhs = json_create_array();
+
+ json_object_add_value_uint(obj_config, "fdpa", config->fdpa);
+ json_object_add_value_uint(obj_config, "vss", config->vss);
+ json_object_add_value_uint(obj_config, "nrg", le32_to_cpu(config->nrg));
+ json_object_add_value_uint(obj_config, "nruh", le16_to_cpu(config->nruh));
+ json_object_add_value_uint(obj_config, "nnss", le32_to_cpu(config->nnss));
+ json_object_add_value_uint64(obj_config, "runs", le64_to_cpu(config->runs));
+ json_object_add_value_uint(obj_config, "erutl", le32_to_cpu(config->erutl));
+
+ for (int j = 0; j < le16_to_cpu(config->nruh); j++) {
+ struct nvme_fdp_ruh_desc *ruh = &config->ruhs[j];
+
+ struct json_object *obj_ruh = json_create_object();
+
+ json_object_add_value_uint(obj_ruh, "ruht", ruh->ruht);
+
+ json_array_add_value_object(obj_ruhs, obj_ruh);
+ }
+
+ json_array_add_value_object(obj_configs, obj_config);
+
+ p += config->size;
+ }
+
+ json_object_add_value_array(root, "configs", obj_configs);
+
+ json_print_object(root, NULL);
+ printf("\n");
+
+ json_free_object(root);
+}
+
+void nvme_show_fdp_config_fdpa(uint8_t fdpa)
+{
+ __u8 valid = (fdpa >> 7) & 0x1;
+ __u8 rsvd = (fdpa >> 5) >> 0x3;
+ __u8 fdpvwc = (fdpa >> 4) & 0x1;
+ __u8 rgif = fdpa & 0xf;
+
+ printf(" [7:7] : %#x\tFDP Configuration %sValid\n",
+ valid, valid ? "" : "Not ");
+ if (rsvd)
+ printf(" [6:5] : %#x\tReserved\n", rsvd);
+ printf(" [4:4] : %#x\tFDP Volatile Write Cache %sPresent\n",
+ fdpvwc, fdpvwc ? "" : "Not ");
+ printf(" [3:0] : %#x\tReclaim Group Identifier Format\n", rgif);
+}
+
+void nvme_show_fdp_configs(struct nvme_fdp_config_log *log, size_t len,
+ enum nvme_print_flags flags)
+{
+ void *p = log->configs;
+ int human = flags & VERBOSE;
+ uint16_t n;
+
+ if (flags & BINARY)
+ return d_raw((unsigned char *)log, len);
+ if (flags & JSON)
+ return json_nvme_fdp_configs(log, len);
+
+ n = le16_to_cpu(log->n) + 1;
+
+ for (int i = 0; i < n; i++) {
+ struct nvme_fdp_config_desc *config = p;
+
+ printf("FDP Attributes: %#x\n", config->fdpa);
+ if (human)
+ nvme_show_fdp_config_fdpa(config->fdpa);
+
+ printf("Vendor Specific Size: %u\n", config->vss);
+ printf("Number of Reclaim Groups: %"PRIu32"\n", le32_to_cpu(config->nrg));
+ printf("Number of Reclaim Unit Handles: %"PRIu16"\n", le16_to_cpu(config->nruh));
+ printf("Number of Namespaces Supported: %"PRIu32"\n", le32_to_cpu(config->nnss));
+ printf("Reclaim Unit Nominal Size: %"PRIu64"\n", le64_to_cpu(config->runs));
+ printf("Estimated Reclaim Unit Time Limit: %"PRIu32"\n", le32_to_cpu(config->erutl));
+
+ printf("Reclaim Unit Handle List:\n");
+ for (int j = 0; j < le16_to_cpu(config->nruh); j++) {
+ struct nvme_fdp_ruh_desc *ruh = &config->ruhs[j];
+
+ printf(" [%d]: %s\n", j, ruh->ruht == NVME_FDP_RUHT_INITIALLY_ISOLATED ? "Initially Isolated" : "Persistently Isolated");
+ }
+
+ p += config->size;
+ }
+}
+
+static void json_nvme_fdp_usage(struct nvme_fdp_ruhu_log *log, size_t len)
+{
+ struct json_object *root, *obj_ruhus;
+ uint16_t nruh;
+
+ root = json_create_object();
+ obj_ruhus = json_create_array();
+
+ nruh = le16_to_cpu(log->nruh);
+
+ json_object_add_value_uint(root, "nruh", nruh);
+
+ for (int i = 0; i < nruh; i++) {
+ struct nvme_fdp_ruhu_desc *ruhu = &log->ruhus[i];
+
+ struct json_object *obj_ruhu = json_create_object();
+
+ json_object_add_value_uint(obj_ruhu, "ruha", ruhu->ruha);
+
+ json_array_add_value_object(obj_ruhus, obj_ruhu);
+ }
+
+ json_object_add_value_array(root, "ruhus", obj_ruhus);
+
+ json_print_object(root, NULL);
+ printf("\n");
+
+ json_free_object(root);
+}
+
+void nvme_show_fdp_usage(struct nvme_fdp_ruhu_log *log, size_t len,
+ enum nvme_print_flags flags)
+{
+ if (flags & BINARY)
+ return d_raw((unsigned char *)log, len);
+ if (flags & JSON)
+ return json_nvme_fdp_usage(log, len);
+
+ uint16_t nruh = le16_to_cpu(log->nruh);
+
+ for (int i = 0; i < nruh; i++) {
+ struct nvme_fdp_ruhu_desc *ruhu = &log->ruhus[i];
+
+ printf("Reclaim Unit Handle %d Attributes: 0x%"PRIx8" (%s)\n", i, ruhu->ruha,
+ ruhu->ruha == 0x0 ? "Unused" : (
+ ruhu->ruha == 0x1 ? "Host Specified" : (
+ ruhu->ruha == 0x2 ? "Controller Specified" : "Unknown")));
+ }
+}
+
+static void json_nvme_fdp_stats(struct nvme_fdp_stats_log *log)
+{
+ struct json_object *root = json_create_object();
+
+ json_object_add_value_uint128(root, "hbmw", le128_to_cpu(log->hbmw));
+ json_object_add_value_uint128(root, "mbmw", le128_to_cpu(log->mbmw));
+ json_object_add_value_uint128(root, "mbe", le128_to_cpu(log->mbe));
+
+ json_print_object(root, NULL);
+ printf("\n");
+
+ json_free_object(root);
+}
+
+void nvme_show_fdp_stats(struct nvme_fdp_stats_log *log,
+ enum nvme_print_flags flags)
+{
+ if (flags & BINARY)
+ return d_raw((unsigned char*)log, sizeof(*log));
+ if (flags & JSON)
+ return json_nvme_fdp_stats(log);
+
+ printf("Host Bytes with Metadata Written (HBMW): %s\n",
+ uint128_t_to_string(le128_to_cpu(log->hbmw)));
+ printf("Media Bytes with Metadata Written (MBMW): %s\n",
+ uint128_t_to_string(le128_to_cpu(log->mbmw)));
+ printf("Media Bytes Erased (MBE): %s\n",
+ uint128_t_to_string(le128_to_cpu(log->mbe)));
+}
+
+static void json_nvme_fdp_events(struct nvme_fdp_events_log *log)
+{
+ struct json_object *root, *obj_events;
+ uint32_t n;
+
+ root = json_create_object();
+ obj_events = json_create_array();
+
+ n = le32_to_cpu(log->n);
+
+ json_object_add_value_uint(root, "n", n);
+
+ for (unsigned int i = 0; i < n; i++) {
+ struct nvme_fdp_event *event = &log->events[i];
+
+ struct json_object *obj_event = json_create_object();
+
+ json_object_add_value_uint(obj_event, "type", event->type);
+ json_object_add_value_uint(obj_event, "fdpef", event->flags);
+ json_object_add_value_uint(obj_event, "pid", le16_to_cpu(event->pid));
+ json_object_add_value_uint64(obj_event, "timestamp", le64_to_cpu(*(uint64_t *)&event->ts));
+ json_object_add_value_uint(obj_event, "nsid", le32_to_cpu(event->nsid));
+
+ if (event->type == NVME_FDP_EVENT_REALLOC) {
+ struct nvme_fdp_event_realloc *mr;
+ mr = (struct nvme_fdp_event_realloc *)&event->type_specific;
+
+ json_object_add_value_uint(obj_event, "nlbam", le16_to_cpu(mr->nlbam));
+
+ if (mr->flags & NVME_FDP_EVENT_REALLOC_F_LBAV)
+ json_object_add_value_uint64(obj_event, "lba", le64_to_cpu(mr->lba));
+ }
+
+ json_array_add_value_object(obj_events, obj_event);
+ }
+
+ json_object_add_value_array(root, "events", obj_events);
+
+ json_print_object(root, NULL);
+ printf("\n");
+
+ json_free_object(root);
+}
+
+static const char *nvme_fdp_event_to_string(enum nvme_fdp_event_type event)
+{
+ switch (event) {
+ case NVME_FDP_EVENT_RUNFW: return "Reclaim Unit Not Fully Written";
+ case NVME_FDP_EVENT_RUTLE: return "Reclaim Unit Active Time Limit Exceeded";
+ case NVME_FDP_EVENT_RESET: return "Controller Level Reset Modified Reclaim Unit Handles";
+ case NVME_FDP_EVENT_PID: return "Invalid Placement Identifier";
+ case NVME_FDP_EVENT_REALLOC: return "Media Reallocated";
+ case NVME_FDP_EVENT_MODIFY: return "Implicitly Modified Reclaim Unit Handle";
+ }
+
+ return "Unknown";
+}
+
+void nvme_show_fdp_events(struct nvme_fdp_events_log *log,
+ enum nvme_print_flags flags)
+{
+ struct tm *tm;
+ char buffer[320];
+ time_t ts;
+
+ if (flags & BINARY)
+ return d_raw((unsigned char*)log, sizeof(*log));
+ if (flags & JSON)
+ return json_nvme_fdp_events(log);
+
+ uint32_t n = le32_to_cpu(log->n);
+
+ for (unsigned int i = 0; i < n; i++) {
+ struct nvme_fdp_event *event = &log->events[i];
+
+ ts = int48_to_long(event->ts.timestamp) / 1000;
+ tm = localtime(&ts);
+
+ printf("Event[%u]\n", i);
+ printf(" Event Type: 0x%"PRIx8" (%s)\n", event->type, nvme_fdp_event_to_string(event->type));
+ printf(" Event Timestamp: %"PRIu64" (%s)\n", int48_to_long(event->ts.timestamp),
+ strftime(buffer, sizeof(buffer), "%c %Z", tm) ? buffer : "-");
+
+ if (event->flags & NVME_FDP_EVENT_F_PIV)
+ printf(" Placement Identifier (PID): 0x%"PRIx16"\n", le16_to_cpu(event->pid));
+
+ if (event->flags & NVME_FDP_EVENT_F_NSIDV)
+ printf(" Namespace Identifier (NSID): %"PRIu32"\n", le32_to_cpu(event->nsid));
+
+ if (event->type == NVME_FDP_EVENT_REALLOC) {
+ struct nvme_fdp_event_realloc *mr;
+ mr = (struct nvme_fdp_event_realloc *)&event->type_specific;
+
+ printf(" Number of LBAs Moved (NLBAM): %"PRIu16"\n", le16_to_cpu(mr->nlbam));
+
+ if (mr->flags & NVME_FDP_EVENT_REALLOC_F_LBAV) {
+ printf(" Logical Block Address (LBA): 0x%"PRIx64"\n", le64_to_cpu(mr->lba));
+ }
+ }
+
+ if (event->flags & NVME_FDP_EVENT_F_LV) {
+ printf(" Reclaim Group Identifier: %"PRIu16"\n", le16_to_cpu(event->rgid));
+ printf(" Reclaim Unit Handle Identifier %"PRIu8"\n", event->ruhid);
+ }
+
+ printf("\n");
+ }
+}
+
+static void json_nvme_fdp_ruh_status(struct nvme_fdp_ruh_status *status, size_t len)
+{
+ struct json_object *root, *obj_ruhss;
+ uint16_t nruhsd;
+
+ root = json_create_object();
+ obj_ruhss = json_create_array();
+
+ nruhsd = le16_to_cpu(status->nruhsd);
+
+ json_object_add_value_uint(root, "nruhsd", nruhsd);
+
+ for (unsigned int i = 0; i < nruhsd; i++) {
+ struct nvme_fdp_ruh_status_desc *ruhs = &status->ruhss[i];
+
+ struct json_object *obj_ruhs = json_create_object();
+
+ json_object_add_value_uint(obj_ruhs, "pid", le16_to_cpu(ruhs->pid));
+ json_object_add_value_uint(obj_ruhs, "ruhid", le16_to_cpu(ruhs->ruhid));
+ json_object_add_value_uint(obj_ruhs, "earutr", le32_to_cpu(ruhs->earutr));
+ json_object_add_value_uint64(obj_ruhs, "ruamw", le64_to_cpu(ruhs->ruamw));
+
+ json_array_add_value_object(obj_ruhss, obj_ruhs);
+ }
+
+ json_object_add_value_array(root, "ruhss", obj_ruhss);
+
+ json_print_object(root, NULL);
+ printf("\n");
+
+ json_free_object(root);
+}
+
+void nvme_show_fdp_ruh_status(struct nvme_fdp_ruh_status *status, size_t len,
+ enum nvme_print_flags flags)
+{
+ if (flags & BINARY)
+ return d_raw((unsigned char *)status, len);
+ if (flags & JSON)
+ return json_nvme_fdp_ruh_status(status, len);
+
+ uint16_t nruhsd = le16_to_cpu(status->nruhsd);
+
+ for (unsigned int i = 0; i < nruhsd; i++) {
+ struct nvme_fdp_ruh_status_desc *ruhs = &status->ruhss[i];
+
+ printf("Placement Identifier %"PRIu16"; Reclaim Unit Handle Identifier %"PRIu16"\n",
+ le16_to_cpu(ruhs->pid), le16_to_cpu(ruhs->ruhid));
+ printf(" Estimated Active Reclaim Unit Time Remaining (EARUTR): %"PRIu32"\n",
+ le32_to_cpu(ruhs->earutr));
+ printf(" Reclaim Unit Available Media Writes (RUAMW): %"PRIu64"\n",
+ le64_to_cpu(ruhs->ruamw));
+
+ printf("\n");
+ }
+}
+
void nvme_show_supported_cap_config_log(
struct nvme_supported_cap_config_list_log *cap,
enum nvme_print_flags flags)
@@ -3352,7 +3704,9 @@ static void nvme_show_id_ctrl_oaes(__le32 ctrl_oaes)
static void nvme_show_id_ctrl_ctratt(__le32 ctrl_ctratt)
{
__u32 ctratt = le32_to_cpu(ctrl_ctratt);
- __u32 rsvd = ctratt >> 16;
+ __u32 rsvd20 = (ctratt >> 20);
+ __u32 fdps = (ctratt >> 19) & 0x1;
+ __u32 rsvd16 = (ctratt >> 16) & 0x7;
__u32 elbas = (ctratt >> 15) & 0x1;
__u32 delnvmset = (ctratt >> 14) & 0x1;
__u32 delegrp = (ctratt >> 13) & 0x1;
@@ -3370,8 +3724,12 @@ static void nvme_show_id_ctrl_ctratt(__le32 ctrl_ctratt)
__u32 sqa = (ctratt & NVME_CTRL_CTRATT_SQ_ASSOCIATIONS) >> 8;
__u32 uuidlist = (ctratt & NVME_CTRL_CTRATT_UUID_LIST) >> 9;
- if (rsvd)
- printf(" [31:16] : %#x\tReserved\n", rsvd);
+ if (rsvd20)
+ printf(" [31:20] : %#x\tReserved\n", rsvd20);
+ printf(" [19:19] : %#x\tFlexible Data Placement %sSupported\n",
+ fdps, fdps ? "" : "Not ");
+ if (rsvd16)
+ printf(" [18:16] : %#x\tReserved\n", rsvd16);
printf(" [15:15] : %#x\tExtended LBA Formats %sSupported\n",
elbas, elbas ? "" : "Not ");
printf(" [14:14] : %#x\tDelete NVM Set %sSupported\n",
@@ -4209,7 +4567,7 @@ void nvme_show_id_ns(struct nvme_id_ns *ns, unsigned int nsid,
printf("nows : %u\n", le16_to_cpu(ns->nows));
}
printf("mssrl : %u\n", le16_to_cpu(ns->mssrl));
- printf("mcl : %d\n", le32_to_cpu(ns->mcl));
+ printf("mcl : %u\n", le32_to_cpu(ns->mcl));
printf("msrc : %u\n", ns->msrc);
}
printf("nulbaf : %u\n", ns->nulbaf);
@@ -4291,7 +4649,7 @@ static void json_nvme_cmd_set_independent_id_ns(
json_object_add_value_int(root, "nmic", ns->nmic);
json_object_add_value_int(root, "rescap", ns->rescap);
json_object_add_value_int(root, "fpi", ns->fpi);
- json_object_add_value_int(root, "anagrpid", le32_to_cpu(ns->anagrpid));
+ json_object_add_value_uint(root, "anagrpid", le32_to_cpu(ns->anagrpid));
json_object_add_value_int(root, "nsattr", ns->nsattr);
json_object_add_value_int(root, "nvmsetid", le16_to_cpu(ns->nvmsetid));
json_object_add_value_int(root, "endgid", le16_to_cpu(ns->endgid));
@@ -4687,7 +5045,7 @@ void nvme_show_id_ctrl(struct nvme_id_ctrl *ctrl, enum nvme_print_flags flags,
printf("sanicap : %#x\n", le32_to_cpu(ctrl->sanicap));
if (human)
nvme_show_id_ctrl_sanicap(ctrl->sanicap);
- printf("hmminds : %d\n", le32_to_cpu(ctrl->hmminds));
+ printf("hmminds : %u\n", le32_to_cpu(ctrl->hmminds));
printf("hmmaxd : %d\n", le16_to_cpu(ctrl->hmmaxd));
printf("nsetidmax : %d\n", le16_to_cpu(ctrl->nsetidmax));
printf("endgidmax : %d\n", le16_to_cpu(ctrl->endgidmax));
@@ -4695,9 +5053,9 @@ void nvme_show_id_ctrl(struct nvme_id_ctrl *ctrl, enum nvme_print_flags flags,
printf("anacap : %d\n", ctrl->anacap);
if (human)
nvme_show_id_ctrl_anacap(ctrl->anacap);
- printf("anagrpmax : %d\n", ctrl->anagrpmax);
- printf("nanagrpid : %d\n", le32_to_cpu(ctrl->nanagrpid));
- printf("pels : %d\n", le32_to_cpu(ctrl->pels));
+ printf("anagrpmax : %u\n", ctrl->anagrpmax);
+ printf("nanagrpid : %u\n", le32_to_cpu(ctrl->nanagrpid));
+ printf("pels : %u\n", le32_to_cpu(ctrl->pels));
printf("domainid : %d\n", le16_to_cpu(ctrl->domainid));
printf("megcap : %s\n",
uint128_t_to_string(le128_to_cpu(ctrl->megcap)));
@@ -4736,13 +5094,13 @@ void nvme_show_id_ctrl(struct nvme_id_ctrl *ctrl, enum nvme_print_flags flags,
printf("sgls : %#x\n", le32_to_cpu(ctrl->sgls));
if (human)
nvme_show_id_ctrl_sgls(ctrl->sgls);
- printf("mnan : %d\n", le32_to_cpu(ctrl->mnan));
+ printf("mnan : %u\n", le32_to_cpu(ctrl->mnan));
printf("maxdna : %s\n",
uint128_t_to_string(le128_to_cpu(ctrl->maxdna)));
- printf("maxcna : %d\n", le32_to_cpu(ctrl->maxcna));
+ printf("maxcna : %u\n", le32_to_cpu(ctrl->maxcna));
printf("subnqn : %-.*s\n", (int)sizeof(ctrl->subnqn), ctrl->subnqn);
- printf("ioccsz : %d\n", le32_to_cpu(ctrl->ioccsz));
- printf("iorcsz : %d\n", le32_to_cpu(ctrl->iorcsz));
+ printf("ioccsz : %u\n", le32_to_cpu(ctrl->ioccsz));
+ printf("iorcsz : %u\n", le32_to_cpu(ctrl->iorcsz));
printf("icdoff : %d\n", le16_to_cpu(ctrl->icdoff));
printf("fcatt : %#x\n", ctrl->fcatt);
if (human)
@@ -4816,8 +5174,8 @@ static void json_nvme_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns,
struct json_object *elbaf = json_create_object();
unsigned int elbaf_val = le32_to_cpu(nvm_ns->elbaf[i]);
- json_object_add_value_int(elbaf, "sts", elbaf_val & 0x7F);
- json_object_add_value_int(elbaf, "pif", (elbaf_val >> 7) & 0x3);
+ json_object_add_value_uint(elbaf, "sts", elbaf_val & 0x7F);
+ json_object_add_value_uint(elbaf, "pif", (elbaf_val >> 7) & 0x3);
json_array_add_value_object(elbafs, elbaf);
}
@@ -4919,17 +5277,17 @@ static void json_nvme_zns_id_ns(struct nvme_zns_id_ns *ns,
root = json_create_object();
json_object_add_value_int(root, "zoc", le16_to_cpu(ns->zoc));
json_object_add_value_int(root, "ozcs", le16_to_cpu(ns->ozcs));
- json_object_add_value_int(root, "mar", le32_to_cpu(ns->mar));
- json_object_add_value_int(root, "mor", le32_to_cpu(ns->mor));
- json_object_add_value_int(root, "rrl", le32_to_cpu(ns->rrl));
- json_object_add_value_int(root, "frl", le32_to_cpu(ns->frl));
- json_object_add_value_int(root, "rrl1", le32_to_cpu(ns->rrl1));
- json_object_add_value_int(root, "rrl2", le32_to_cpu(ns->rrl2));
- json_object_add_value_int(root, "rrl3", le32_to_cpu(ns->rrl3));
- json_object_add_value_int(root, "frl1", le32_to_cpu(ns->frl1));
- json_object_add_value_int(root, "frl2", le32_to_cpu(ns->frl2));
- json_object_add_value_int(root, "frl3", le32_to_cpu(ns->frl3));
- json_object_add_value_int(root, "numzrwa", le32_to_cpu(ns->numzrwa));
+ json_object_add_value_uint(root, "mar", le32_to_cpu(ns->mar));
+ json_object_add_value_uint(root, "mor", le32_to_cpu(ns->mor));
+ json_object_add_value_uint(root, "rrl", le32_to_cpu(ns->rrl));
+ json_object_add_value_uint(root, "frl", le32_to_cpu(ns->frl));
+ json_object_add_value_uint(root, "rrl1", le32_to_cpu(ns->rrl1));
+ json_object_add_value_uint(root, "rrl2", le32_to_cpu(ns->rrl2));
+ json_object_add_value_uint(root, "rrl3", le32_to_cpu(ns->rrl3));
+ json_object_add_value_uint(root, "frl1", le32_to_cpu(ns->frl1));
+ json_object_add_value_uint(root, "frl2", le32_to_cpu(ns->frl2));
+ json_object_add_value_uint(root, "frl3", le32_to_cpu(ns->frl3));
+ json_object_add_value_uint(root, "numzrwa", le32_to_cpu(ns->numzrwa));
json_object_add_value_int(root, "zrwafg", le16_to_cpu(ns->zrwafg));
json_object_add_value_int(root, "zrwasz", le16_to_cpu(ns->zrwasz));
json_object_add_value_int(root, "zrwacap", ns->zrwacap);
@@ -5358,9 +5716,9 @@ static void json_nvme_id_nvmset(struct nvme_id_nvmset_list *nvmset)
le16_to_cpu(nvmset->ent[i].nvmsetid));
json_object_add_value_int(entry, "endurance_group_id",
le16_to_cpu(nvmset->ent[i].endgid));
- json_object_add_value_int(entry, "random_4k_read_typical",
+ json_object_add_value_uint(entry, "random_4k_read_typical",
le32_to_cpu(nvmset->ent[i].rr4kt));
- json_object_add_value_int(entry, "optimal_write_size",
+ json_object_add_value_uint(entry, "optimal_write_size",
le32_to_cpu(nvmset->ent[i].ows));
json_object_add_value_uint128(entry, "total_nvmset_cap",
le128_to_cpu(nvmset->ent[i].tnvmsetcap));
@@ -5419,15 +5777,15 @@ static void json_nvme_primary_ctrl_cap(const struct nvme_primary_ctrl_cap *caps)
json_object_add_value_uint(root, "portid", le16_to_cpu(caps->portid));
json_object_add_value_uint(root, "crt", caps->crt);
- json_object_add_value_int(root, "vqfrt", le32_to_cpu(caps->vqfrt));
- json_object_add_value_int(root, "vqrfa", le32_to_cpu(caps->vqrfa));
+ json_object_add_value_uint(root, "vqfrt", le32_to_cpu(caps->vqfrt));
+ json_object_add_value_uint(root, "vqrfa", le32_to_cpu(caps->vqrfa));
json_object_add_value_int(root, "vqrfap", le16_to_cpu(caps->vqrfap));
json_object_add_value_int(root, "vqprt", le16_to_cpu(caps->vqprt));
json_object_add_value_int(root, "vqfrsm", le16_to_cpu(caps->vqfrsm));
json_object_add_value_int(root, "vqgran", le16_to_cpu(caps->vqgran));
- json_object_add_value_int(root, "vifrt", le32_to_cpu(caps->vifrt));
- json_object_add_value_int(root, "virfa", le32_to_cpu(caps->virfa));
+ json_object_add_value_uint(root, "vifrt", le32_to_cpu(caps->vifrt));
+ json_object_add_value_uint(root, "virfa", le32_to_cpu(caps->virfa));
json_object_add_value_int(root, "virfap", le16_to_cpu(caps->virfap));
json_object_add_value_int(root, "viprt", le16_to_cpu(caps->viprt));
json_object_add_value_int(root, "vifrsm", le16_to_cpu(caps->vifrsm));
@@ -5466,14 +5824,14 @@ void nvme_show_primary_ctrl_cap(const struct nvme_primary_ctrl_cap *caps,
printf("crt : %#x\n", caps->crt);
if (human)
nvme_show_primary_ctrl_caps_crt(caps->crt);
- printf("vqfrt : %d\n", le32_to_cpu(caps->vqfrt));
- printf("vqrfa : %d\n", le32_to_cpu(caps->vqrfa));
+ printf("vqfrt : %u\n", le32_to_cpu(caps->vqfrt));
+ printf("vqrfa : %u\n", le32_to_cpu(caps->vqrfa));
printf("vqrfap : %d\n", le16_to_cpu(caps->vqrfap));
printf("vqprt : %d\n", le16_to_cpu(caps->vqprt));
printf("vqfrsm : %d\n", le16_to_cpu(caps->vqfrsm));
printf("vqgran : %d\n", le16_to_cpu(caps->vqgran));
- printf("vifrt : %d\n", le32_to_cpu(caps->vifrt));
- printf("virfa : %d\n", le32_to_cpu(caps->virfa));
+ printf("vifrt : %u\n", le32_to_cpu(caps->vifrt));
+ printf("virfa : %u\n", le32_to_cpu(caps->virfa));
printf("virfap : %d\n", le16_to_cpu(caps->virfap));
printf("viprt : %d\n", le16_to_cpu(caps->viprt));
printf("vifrsm : %d\n", le16_to_cpu(caps->vifrsm));
@@ -5871,7 +6229,7 @@ void nvme_show_resv_report(struct nvme_resv_status *status, int bytes,
regctl = status->regctl[0] | (status->regctl[1] << 8);
printf("\nNVME Reservation status:\n\n");
- printf("gen : %d\n", le32_to_cpu(status->gen));
+ printf("gen : %u\n", le32_to_cpu(status->gen));
printf("rtype : %d\n", status->rtype);
printf("regctl : %d\n", regctl);
printf("ptpls : %d\n", status->ptpls);
@@ -5913,7 +6271,7 @@ void nvme_show_resv_report(struct nvme_resv_status *status, int bytes,
le64_to_cpu(status->regctl_eds[i].rkey));
printf(" hostid : ");
for (j = 0; j < 16; j++)
- printf("%x",
+ printf("%02x",
status->regctl_eds[i].hostid[j]);
printf("\n");
}
@@ -6255,10 +6613,14 @@ void nvme_show_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
smart->percent_used);
printf("endurance group critical warning summary: %#x\n",
smart->endu_grp_crit_warn_sumry);
- printf("data_units_read : %s\n",
- uint128_t_to_string(le128_to_cpu(smart->data_units_read)));
- printf("data_units_written : %s\n",
- uint128_t_to_string(le128_to_cpu(smart->data_units_written)));
+ printf("Data Units Read : %s (%s)\n",
+ uint128_t_to_string(le128_to_cpu(smart->data_units_read)),
+ uint128_t_to_si_string(le128_to_cpu(smart->data_units_read),
+ 1000 * 512));
+ printf("Data Units Written : %s (%s)\n",
+ uint128_t_to_string(le128_to_cpu(smart->data_units_written)),
+ uint128_t_to_si_string(le128_to_cpu(smart->data_units_written),
+ 1000 * 512));
printf("host_read_commands : %s\n",
uint128_t_to_string(le128_to_cpu(smart->host_reads)));
printf("host_write_commands : %s\n",
@@ -6554,6 +6916,8 @@ const char *nvme_feature_to_string(enum nvme_features_id feature)
case NVME_FEAT_FID_RESV_MASK: return "Reservation Notification Mask";
case NVME_FEAT_FID_RESV_PERSIST:return "Reservation Persistence";
case NVME_FEAT_FID_WRITE_PROTECT: return "Namespace Write Protect";
+ case NVME_FEAT_FID_FDP: return "Flexible Direct Placement";
+ case NVME_FEAT_FID_FDP_EVENTS: return "Flexible Direct Placement Events";
}
/*
* We don't use the "default:" statement to let the compiler warning if
@@ -7119,6 +7483,21 @@ void nvme_feature_show_fields(enum nvme_features_id fid, unsigned int result, un
case NVME_FEAT_FID_WRITE_PROTECT:
printf("\tNamespace Write Protect: %s\n", nvme_show_ns_wp_cfg(result));
break;
+ case NVME_FEAT_FID_FDP:
+ printf("\tFlexible Direct Placement Enable (FDPE) : %s\n",
+ (result & 0x1) ? "Yes" : "No");
+ printf("\tFlexible Direct Placement Configuration Index : %u\n",
+ (result >> 8) & 0xf);
+ break;
+ case NVME_FEAT_FID_FDP_EVENTS:
+ for (unsigned int i = 0; i < result; i++) {
+ struct nvme_fdp_supported_event_desc *d;
+
+ d = &((struct nvme_fdp_supported_event_desc *)buf)[i];
+
+ printf("\t%-53s: %sEnabled\n", nvme_fdp_event_to_string(d->evt),
+ d->evta & 0x1 ? "" : "Not ");
+ }
default:
break;
}
@@ -7411,15 +7790,15 @@ static void json_detail_list(nvme_root_t r)
nvme_ctrl_for_each_ns(c, n) {
struct json_object *jns = json_create_object();
- long long lba = nvme_ns_get_lba_size(n);
- double nsze = nvme_ns_get_lba_count(n) * lba;
- double nuse = nvme_ns_get_lba_util(n) * lba;
+ int lba = nvme_ns_get_lba_size(n);
+ uint64_t nsze = nvme_ns_get_lba_count(n) * lba;
+ uint64_t nuse = nvme_ns_get_lba_util(n) * lba;
json_object_add_value_string(jns, "NameSpace", nvme_ns_get_name(n));
json_object_add_value_int(jns, "NSID", nvme_ns_get_nsid(n));
- json_object_add_value_int(jns, "UsedBytes", nuse);
- json_object_add_value_int(jns, "MaximumLBA", nvme_ns_get_lba_count(n));
- json_object_add_value_int(jns, "PhysicalSize", nsze);
+ json_object_add_value_uint64(jns, "UsedBytes", nuse);
+ json_object_add_value_uint64(jns, "MaximumLBA", nvme_ns_get_lba_count(n));
+ json_object_add_value_uint64(jns, "PhysicalSize", nsze);
json_object_add_value_int(jns, "SectorSize", lba);
json_array_add_value_object(jnss, jns);
@@ -7443,15 +7822,15 @@ static void json_detail_list(nvme_root_t r)
nvme_subsystem_for_each_ns(s, n) {
struct json_object *jns = json_create_object();
- long long lba = nvme_ns_get_lba_size(n);
- double nsze = nvme_ns_get_lba_count(n) * lba;
- double nuse = nvme_ns_get_lba_util(n) * lba;
+ int lba = nvme_ns_get_lba_size(n);
+ uint64_t nsze = nvme_ns_get_lba_count(n) * lba;
+ uint64_t nuse = nvme_ns_get_lba_util(n) * lba;
json_object_add_value_string(jns, "NameSpace", nvme_ns_get_name(n));
json_object_add_value_int(jns, "NSID", nvme_ns_get_nsid(n));
- json_object_add_value_int(jns, "UsedBytes", nuse);
- json_object_add_value_int(jns, "MaximumLBA", nvme_ns_get_lba_count(n));
- json_object_add_value_int(jns, "PhysicalSize", nsze);
+ json_object_add_value_uint64(jns, "UsedBytes", nuse);
+ json_object_add_value_uint64(jns, "MaximumLBA", nvme_ns_get_lba_count(n));
+ json_object_add_value_uint64(jns, "PhysicalSize", nsze);
json_object_add_value_int(jns, "SectorSize", lba);
json_array_add_value_object(jnss, jns);
@@ -7475,9 +7854,9 @@ static struct json_object *json_list_item(nvme_ns_t n)
struct json_object *jdevice = json_create_object();
char devname[128] = { 0 };
- long long lba = nvme_ns_get_lba_size(n);
- double nsze = nvme_ns_get_lba_count(n) * lba;
- double nuse = nvme_ns_get_lba_util(n) * lba;
+ int lba = nvme_ns_get_lba_size(n);
+ uint64_t nsze = nvme_ns_get_lba_count(n) * lba;
+ uint64_t nuse = nvme_ns_get_lba_util(n) * lba;
nvme_dev_full_path(n, devname, sizeof(devname));
@@ -7486,9 +7865,9 @@ static struct json_object *json_list_item(nvme_ns_t n)
json_object_add_value_string(jdevice, "Firmware", nvme_ns_get_firmware(n));
json_object_add_value_string(jdevice, "ModelNumber", nvme_ns_get_model(n));
json_object_add_value_string(jdevice, "SerialNumber", nvme_ns_get_serial(n));
- json_object_add_value_int(jdevice, "UsedBytes", nuse);
- json_object_add_value_int(jdevice, "MaximumLBA", nvme_ns_get_lba_count(n));
- json_object_add_value_int(jdevice, "PhysicalSize", nsze);
+ json_object_add_value_uint64(jdevice, "UsedBytes", nuse);
+ json_object_add_value_uint64(jdevice, "MaximumLBA", nvme_ns_get_lba_count(n));
+ json_object_add_value_uint64(jdevice, "PhysicalSize", nsze);
json_object_add_value_int(jdevice, "SectorSize", lba);
return jdevice;