1
0
Fork 0

Adding upstream version 2.9.1.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-16 12:26:41 +01:00
parent 8229b972f0
commit 1e65f355a3
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
451 changed files with 5896 additions and 2734 deletions

View file

@ -16,7 +16,6 @@
#define BUF_LEN 320
#define VAL_LEN 4096
#define BYTE_TO_BIT(byte) ((byte) * 8)
#define POWER_OF_TWO(exponent) (1 << (exponent))
#define MS_TO_SEC(time) ((time) / 1000)
#define MS500_TO_MS(time) ((time) * 500)
#define MS500_TO_SEC(time) (MS_TO_SEC(MS500_TO_MS(time)))
@ -36,6 +35,9 @@ static const uint8_t zero_uuid[16] = { 0 };
static struct print_ops json_print_ops;
static struct json_object *json_r = NULL;
static void json_feature_show_fields(enum nvme_features_id fid, unsigned int result,
unsigned char *buf);
static void d_json(unsigned char *buf, int len, int width, int group, struct json_object *array)
{
int i;
@ -57,6 +59,15 @@ static void d_json(unsigned char *buf, int len, int width, int group, struct jso
}
}
static void obj_d(struct json_object *o, const char *k, unsigned char *buf, int len, int width,
int group)
{
struct json_object *data = json_create_array();
d_json(buf, len, width, group, data);
obj_add_array(o, k, data);
}
static void obj_add_uint_x(struct json_object *o, const char *k, __u32 v)
{
char str[STR_LEN];
@ -73,7 +84,7 @@ static void obj_add_uint_0x(struct json_object *o, const char *k, __u32 v)
obj_add_str(o, k, str);
}
static void obj_add_uint_02x(struct json_object *o, const char *k, __u32 v)
static void obj_add_uint_0nx(struct json_object *o, const char *k, __u32 v, int width)
{
char str[STR_LEN];
@ -81,6 +92,11 @@ static void obj_add_uint_02x(struct json_object *o, const char *k, __u32 v)
obj_add_str(o, k, str);
}
static void obj_add_uint_02x(struct json_object *o, const char *k, __u32 v)
{
obj_add_uint_0nx(o, k, v, 2);
}
static void obj_add_uint_nx(struct json_object *o, const char *k, __u32 v)
{
char str[STR_LEN];
@ -179,6 +195,12 @@ static void json_print(struct json_object *r)
json_free_object(r);
}
static void obj_print(struct json_object *o)
{
if (!json_r)
json_print(o);
}
static bool human(void)
{
return json_print_ops.flags & VERBOSE;
@ -759,7 +781,7 @@ static void json_select_result(enum nvme_features_id fid, __u32 result)
sprintf(json_str, "Feature: %#0*x: select", fid ? 4 : 2, fid);
obj_add_array(r, json_str, feature);
json_print(r);
obj_print(r);
}
static void json_self_test_log(struct nvme_self_test_log *self_test, __u8 dst_entries,
@ -880,7 +902,7 @@ static void json_registers_version(__u32 vs, struct json_object *r)
sprintf(json_str, "%x", vs);
obj_add_str(r, "Version", json_str);
sprintf(json_str, "%d.%d", (vs & 0xffff0000) >> 16, (vs & 0x0000ff00) >> 8);
sprintf(json_str, "%d.%d.%d", NVME_MAJOR(vs), NVME_MINOR(vs), NVME_TERTIARY(vs));
obj_add_str(r, "NVMe specification", json_str);
}
@ -903,13 +925,13 @@ static void json_registers_cc_ams(__u8 ams, struct json_object *r)
char json_str[STR_LEN];
switch (ams) {
case 0:
case NVME_CC_AMS_RR:
sprintf(json_str, "Round Robin");
break;
case 1:
case NVME_CC_AMS_WRRU:
sprintf(json_str, "Weighted Round Robin with Urgent Priority Class");
break;
case 7:
case NVME_CC_AMS_VS:
sprintf(json_str, "Vendor Specific");
break;
default:
@ -925,13 +947,13 @@ static void json_registers_cc_shn(__u8 shn, struct json_object *r)
char json_str[STR_LEN];
switch (shn) {
case 0:
case NVME_CC_SHN_NONE:
sprintf(json_str, "No notification; no effect");
break;
case 1:
case NVME_CC_SHN_NORMAL:
sprintf(json_str, "Normal shutdown notification");
break;
case 2:
case NVME_CC_SHN_ABRUPT:
sprintf(json_str, "Abrupt shutdown notification");
break;
default:
@ -952,22 +974,23 @@ static void json_registers_cc(__u32 cc, struct json_object *r)
obj_add_str(r, "Controller Ready Independent of Media Enable (CRIME)",
NVME_CC_CRIME(cc) ? "Enabled" : "Disabled");
sprintf(json_str, "%u bytes", POWER_OF_TWO(NVME_GET(cc, CC_IOCQES)));
sprintf(json_str, "%u bytes", POWER_OF_TWO(NVME_CC_IOCQES(cc)));
obj_add_str(r, "I/O Completion Queue Entry Size (IOCQES): ", json_str);
sprintf(json_str, "%u bytes", POWER_OF_TWO(NVME_GET(cc, CC_IOSQES)));
sprintf(json_str, "%u bytes", POWER_OF_TWO(NVME_CC_IOSQES(cc)));
obj_add_str(r, "I/O Submission Queue Entry Size (IOSQES)", json_str);
json_registers_cc_shn((cc & 0xc000) >> NVME_CC_SHN_SHIFT, r);
json_registers_cc_ams((cc & 0x3800) >> NVME_CC_AMS_SHIFT, r);
json_registers_cc_shn(NVME_CC_SHN(cc), r);
json_registers_cc_ams(NVME_CC_AMS(cc), r);
sprintf(json_str, "%u bytes", POWER_OF_TWO(12 + NVME_GET(cc, CC_MPS)));
sprintf(json_str, "%u bytes", POWER_OF_TWO(12 + NVME_CC_MPS(cc)));
obj_add_str(r, "Memory Page Size (MPS)", json_str);
obj_add_str(r, "I/O Command Set Selected (CSS)", (cc & 0x70) == 0x00 ? "NVM Command Set" :
(cc & 0x70) == 0x60 ? "All supported I/O Command Sets" :
(cc & 0x70) == 0x70 ? "Admin Command Set only" : "Reserved");
obj_add_str(r, "Enable (EN)", cc & 1 ? "Yes" : "No");
obj_add_str(r, "I/O Command Set Selected (CSS)",
NVME_CC_CSS(cc) == NVME_CC_CSS_NVM ? "NVM Command Set" :
NVME_CC_CSS(cc) == NVME_CC_CSS_CSI ? "All supported I/O Command Sets" :
NVME_CC_CSS(cc) == NVME_CC_CSS_ADMIN ? "Admin Command Set only" : "Reserved");
obj_add_str(r, "Enable (EN)", NVME_CC_EN(cc) ? "Yes" : "No");
}
static void json_registers_csts_shst(__u8 shst, struct json_object *r)
@ -975,13 +998,13 @@ static void json_registers_csts_shst(__u8 shst, struct json_object *r)
char json_str[STR_LEN];
switch (shst) {
case 0:
case NVME_CSTS_SHST_NORMAL:
sprintf(json_str, "Normal operation (no shutdown has been requested)");
break;
case 1:
case NVME_CSTS_SHST_OCCUR:
sprintf(json_str, "Shutdown processing occurring");
break;
case 2:
case NVME_CSTS_SHST_CMPLT:
sprintf(json_str, "Shutdown processing complete");
break;
default:
@ -996,13 +1019,15 @@ static void json_registers_csts(__u32 csts, struct json_object *r)
{
obj_add_uint_x(r, "csts", csts);
obj_add_str(r, "Processing Paused (PP)", csts & 0x20 ? "Yes" : "No");
obj_add_str(r, "NVM Subsystem Reset Occurred (NSSRO)", csts & 0x10 ? "Yes" : "No");
obj_add_str(r, "Shutdown Type (ST)", NVME_CSTS_ST(csts) ? "Subsystem" : "Controller");
obj_add_str(r, "Processing Paused (PP)", NVME_CSTS_PP(csts) ? "Yes" : "No");
obj_add_str(r, "NVM Subsystem Reset Occurred (NSSRO)",
NVME_CSTS_NSSRO(csts) ? "Yes" : "No");
json_registers_csts_shst((csts & 0xc) >> 2, r);
json_registers_csts_shst(NVME_CSTS_SHST(csts), r);
obj_add_str(r, "Controller Fatal Status (CFS)", csts & 2 ? "True" : "False");
obj_add_str(r, "Ready (RDY)", csts & 1 ? "Yes" : "No");
obj_add_str(r, "Controller Fatal Status (CFS)", NVME_CSTS_CFS(csts) ? "True" : "False");
obj_add_str(r, "Ready (RDY)", NVME_CSTS_RDY(csts) ? "Yes" : "No");
}
static void json_registers_nssr(__u32 nssr, struct json_object *r)
@ -1011,6 +1036,11 @@ static void json_registers_nssr(__u32 nssr, struct json_object *r)
obj_add_uint(r, "NVM Subsystem Reset Control (NSSRC)", nssr);
}
static void json_registers_nssd(__u32 nssd, struct json_object *r)
{
obj_add_uint_nx(r, "NVM Subsystem Shutdown Control (NSSC)", nssd);
}
static void json_registers_crto(__u32 crto, struct json_object *r)
{
obj_add_uint_x(r, "crto", crto);
@ -1022,8 +1052,8 @@ static void json_registers_crto(__u32 crto, struct json_object *r)
static void json_registers_aqa(uint32_t aqa, struct json_object *r)
{
obj_add_uint_x(r, "aqa", aqa);
obj_add_uint(r, "Admin Completion Queue Size (ACQS)", ((aqa & 0xfff0000) >> 16) + 1);
obj_add_uint(r, "Admin Submission Queue Size (ASQS)", (aqa & 0xfff) + 1);
obj_add_uint(r, "Admin Completion Queue Size (ACQS)", NVME_AQA_ACQS(aqa) + 1);
obj_add_uint(r, "Admin Submission Queue Size (ASQS)", NVME_AQA_ASQS(aqa) + 1);
}
static void json_registers_asq(uint64_t asq, struct json_object *r)
@ -1038,13 +1068,11 @@ static void json_registers_acq(uint64_t acq, struct json_object *r)
obj_add_prix64(r, "Admin Completion Queue Base (ACQB)", acq);
}
static void json_registers_cmbloc(uint32_t cmbloc, void *bar, struct json_object *r)
static void json_registers_cmbloc(uint32_t cmbloc, bool support, struct json_object *r)
{
uint32_t cmbsz = mmio_read32(bar + NVME_REG_CMBSZ);
obj_add_uint_x(r, "cmbloc", cmbloc);
if (!cmbsz) {
if (!support) {
obj_add_result(r, "Controller Memory Buffer feature is not supported");
return;
}
@ -1173,17 +1201,15 @@ static void json_registers_pmrctl(uint32_t pmrctl, struct json_object *r)
obj_add_str(r, "Enable (EN)", pmrctl & 1 ? "Ready" : "Disabled");
}
static void json_registers_pmrsts(uint32_t pmrsts, void *bar, struct json_object *r)
static void json_registers_pmrsts(uint32_t pmrsts, bool ready, struct json_object *r)
{
uint32_t pmrctl = mmio_read32(bar + NVME_REG_PMRCTL);
obj_add_uint_x(r, "pmrsts", pmrsts);
obj_add_uint_x(r, "Controller Base Address Invalid (CBAI)", (pmrsts & 0x1000) >> 12);
obj_add_str(r, "Health Status (HSTS)",
nvme_register_pmr_hsts_to_string((pmrsts & 0xe00) >> 9));
nvme_register_pmr_hsts_to_string((pmrsts & 0xe00) >> 9));
obj_add_str(r, "Not Ready (NRDY)",
!(pmrsts & 0x100) && (pmrctl & 1) ? "Ready" : "Not ready");
!(pmrsts & 0x100) && ready ? "Ready" : "Not ready");
obj_add_uint_x(r, "Error (ERR)", pmrsts & 0xff);
}
@ -1194,7 +1220,7 @@ static void json_registers_pmrebs(uint32_t pmrebs, struct json_object *r)
obj_add_uint_x(r, "PMR Elasticity Buffer Size Base (PMRWBZ)", (pmrebs & 0xffffff00) >> 8);
obj_add_str(r, "Read Bypass Behavior", pmrebs & 0x10 ? "Shall" : "May");
obj_add_str(r, "PMR Elasticity Buffer Size Units (PMRSZU)",
nvme_register_pmr_pmrszu_to_string(pmrebs & 0xf));
nvme_register_unit_to_string(pmrebs & 0xf));
}
static void json_registers_pmrswtp(uint32_t pmrswtp, struct json_object *r)
@ -1203,7 +1229,7 @@ static void json_registers_pmrswtp(uint32_t pmrswtp, struct json_object *r)
obj_add_uint_x(r, "PMR Sustained Write Throughput (PMRSWTV)", (pmrswtp & 0xffffff00) >> 8);
obj_add_key(r, "PMR Sustained Write Throughput Units (PMRSWTU)", "%s/second",
nvme_register_pmr_pmrszu_to_string(pmrswtp & 0xf));
nvme_register_unit_to_string(pmrswtp & 0xf));
}
static void json_registers_pmrmscl(uint32_t pmrmscl, struct json_object *r)
@ -1248,6 +1274,9 @@ static void json_single_property_human(int offset, uint64_t value64, struct json
case NVME_REG_NSSR:
json_registers_nssr(value32, r);
break;
case NVME_REG_NSSD:
json_registers_nssd(value32, r);
break;
case NVME_REG_CRTO:
json_registers_crto(value32, r);
break;
@ -1321,7 +1350,7 @@ struct json_object* json_effects_log(enum nvme_csi csi,
static void json_effects_log_list(struct list_head *list)
{
struct json_object *r = json_create_array();
nvme_effects_log_node_t *node;
nvme_effects_log_node_t *node = NULL;
list_for_each(list, node, node) {
struct json_object *json_page =
@ -1351,7 +1380,7 @@ static void json_sanitize_log(struct nvme_sanitize_log_page *sanitize_log,
status_str = nvme_sstat_status_to_string(status);
sprintf(str, "(%d) %s", status & NVME_SANITIZE_SSTAT_STATUS_MASK,
status_str);
obj_add_str(sstat, status_str, str);
obj_add_str(sstat, "status", str);
obj_add_obj(dev, "sstat", sstat);
obj_add_uint(dev, "cdw10_info", le32_to_cpu(sanitize_log->scdw10));
@ -1416,12 +1445,12 @@ static void json_add_bitmap(int i, __u8 seb, struct json_object *r)
char evt_str[50];
char key[128];
for (int bit = 0; bit < 8; bit++) {
if (nvme_pel_event_to_string(bit + i * 8)) {
sprintf(key, "bitmap_%x", (bit + i * 8));
for (int bit = 0; bit < CHAR_BIT; bit++) {
if (nvme_pel_event_to_string(bit + i * CHAR_BIT)) {
sprintf(key, "bitmap_%x", (bit + i * CHAR_BIT));
if ((seb >> bit) & 0x1)
snprintf(evt_str, sizeof(evt_str), "Support %s",
nvme_pel_event_to_string(bit + i * 8));
nvme_pel_event_to_string(bit + i * CHAR_BIT));
obj_add_str(r, key, evt_str);
}
}
@ -1644,6 +1673,31 @@ static void json_pel_sanitize_completion(void *pevent_log_info, __u32 offset,
obj_add_uint(valid_attrs, "cmpln_info", le16_to_cpu(sanitize_cmpln_event->cmpln_info));
}
static void json_pel_set_feature(void *pevent_log_info, __u32 offset,
struct json_object *valid_attrs)
{
struct nvme_set_feature_event *set_feat_event = pevent_log_info + offset;
int fid = NVME_GET(le32_to_cpu(set_feat_event->cdw_mem[0]), FEATURES_CDW10_FID);
int cdw11 = le32_to_cpu(set_feat_event->cdw_mem[1]);
int dword_cnt = NVME_SET_FEAT_EVENT_DW_COUNT(set_feat_event->layout);
unsigned char *mem_buf;
obj_add_uint_02x(valid_attrs, "feature", fid);
obj_add_str(valid_attrs, "name", nvme_feature_to_string(fid));
obj_add_uint_0nx(valid_attrs, "value", cdw11, 8);
if (NVME_SET_FEAT_EVENT_MB_COUNT(set_feat_event->layout)) {
mem_buf = (unsigned char *)(set_feat_event + 4 + dword_cnt * 4);
json_feature_show_fields(fid, cdw11, mem_buf);
}
}
static void json_pel_telemetry_crt(void *pevent_log_info, __u32 offset,
struct json_object *valid_attrs)
{
obj_d(valid_attrs, "create", pevent_log_info + offset, 512, 16, 1);
}
static void json_pel_thermal_excursion(void *pevent_log_info, __u32 offset,
struct json_object *valid_attrs)
{
@ -1720,6 +1774,12 @@ static void json_pevent_entry(void *pevent_log_info, __u8 action, __u32 size, co
case NVME_PEL_SANITIZE_COMPLETION_EVENT:
json_pel_sanitize_completion(pevent_log_info, offset, valid_attrs);
break;
case NVME_PEL_SET_FEATURE_EVENT:
json_pel_set_feature(pevent_log_info, offset, valid_attrs);
break;
case NVME_PEL_TELEMETRY_CRT:
json_pel_telemetry_crt(pevent_log_info, offset, valid_attrs);
break;
case NVME_PEL_THERMAL_EXCURSION_EVENT:
json_pel_thermal_excursion(pevent_log_info, offset, valid_attrs);
break;
@ -1942,8 +2002,8 @@ static void json_boot_part_log(void *bp_log, const char *devname,
struct json_object *r = json_create_object();
obj_add_uint(r, "count", hdr->lid);
obj_add_uint(r, "abpid", (le32_to_cpu(hdr->bpinfo) >> 31) & 0x1);
obj_add_uint(r, "bpsz", le32_to_cpu(hdr->bpinfo) & 0x7fff);
obj_add_uint(r, "abpid", NVME_BOOT_PARTITION_INFO_ABPID(le32_to_cpu(hdr->bpinfo)));
obj_add_uint(r, "bpsz", NVME_BOOT_PARTITION_INFO_BPSZ(le32_to_cpu(hdr->bpinfo)));
json_print(r);
}
@ -1997,7 +2057,7 @@ static void json_phy_rx_eom_descs(struct nvme_phy_rx_eom_log *log,
obj_add_uint(jdesc, "ncols", le16_to_cpu(desc->ncols));
obj_add_uint(jdesc, "edlen", le16_to_cpu(desc->edlen));
if (log->odp & NVME_EOM_PRINTABLE_EYE_PRESENT)
if (NVME_EOM_ODP_PEFP(log->odp))
allocated_eyes[i] = json_eom_printable_eye(desc, r);
/* Eye Data field is vendor specific, doesn't map to JSON */
@ -2476,6 +2536,16 @@ static void json_ctrl_registers_nssr(void *bar, struct json_object *r)
obj_add_int(r, "nssr", nssr);
}
static void json_ctrl_registers_nssd(void *bar, struct json_object *r)
{
uint32_t nssd = mmio_read32(bar + NVME_REG_NSSD);
if (human())
json_registers_nssd(nssd, obj_create_array_obj(r, "nssd"));
else
obj_add_int(r, "nssd", nssd);
}
static void json_ctrl_registers_crto(void *bar, struct json_object *r)
{
uint32_t crto = mmio_read32(bar + NVME_REG_CRTO);
@ -2519,11 +2589,16 @@ static void json_ctrl_registers_acq(void *bar, struct json_object *r)
static void json_ctrl_registers_cmbloc(void *bar, struct json_object *r)
{
uint32_t cmbloc = mmio_read32(bar + NVME_REG_CMBLOC);
uint32_t cmbsz;
bool support;
if (human())
json_registers_cmbloc(cmbloc, bar, obj_create_array_obj(r, "cmbloc"));
else
if (human()) {
cmbsz = mmio_read32(bar + NVME_REG_CMBSZ);
support = nvme_registers_cmbloc_support(cmbsz);
json_registers_cmbloc(cmbloc, support, obj_create_array_obj(r, "cmbloc"));
} else {
obj_add_int(r, "cmbloc", cmbloc);
}
}
static void json_ctrl_registers_cmbsz(void *bar, struct json_object *r)
@ -2609,11 +2684,16 @@ static void json_ctrl_registers_pmrctl(void *bar, struct json_object *r)
static void json_ctrl_registers_pmrsts(void *bar, struct json_object *r)
{
uint32_t pmrsts = mmio_read32(bar + NVME_REG_PMRSTS);
uint32_t pmrctl;
bool ready;
if (human())
json_registers_pmrsts(pmrsts, bar, obj_create_array_obj(r, "pmrsts"));
else
if (human()) {
pmrctl = mmio_read32(bar + NVME_REG_PMRCTL);
ready = nvme_registers_pmrctl_ready(pmrctl);
json_registers_pmrsts(pmrsts, ready, obj_create_array_obj(r, "pmrsts"));
} else {
obj_add_int(r, "pmrsts", pmrsts);
}
}
static void json_ctrl_registers_pmrebs(void *bar, struct json_object *r)
@ -2667,6 +2747,7 @@ static void json_ctrl_registers(void *bar, bool fabrics)
json_ctrl_registers_cc(bar, r);
json_ctrl_registers_csts(bar, r);
json_ctrl_registers_nssr(bar, r);
json_ctrl_registers_nssd(bar, r);
json_ctrl_registers_crto(bar, r);
json_ctrl_registers_aqa(bar, r);
json_ctrl_registers_asq(bar, r);
@ -2689,6 +2770,149 @@ static void json_ctrl_registers(void *bar, bool fabrics)
json_print(r);
}
static void json_registers_cmbebs(__u32 cmbebs, struct json_object *r)
{
char buffer[BUF_LEN];
obj_add_uint_nx(r, "cmbebs", cmbebs);
obj_add_uint_nx(r, "CMB Elasticity Buffer Size Base (CMBWBZ)", cmbebs >> 8);
sprintf(buffer, "%s", cmbebs & 0x10 ? "shall" : "may");
obj_add_str(r, "Read Bypass Behavior", buffer);
obj_add_str(r, "CMB Elasticity Buffer Size Units (CMBSZU)",
nvme_register_unit_to_string(cmbebs & 0xf));
}
static void json_registers_cmbswtp(__u32 cmbswtp, struct json_object *r)
{
char str[STR_LEN];
obj_add_uint_nx(r, "cmbswtp", cmbswtp);
obj_add_uint_nx(r, "CMB Sustained Write Throughput (CMBSWTV)", cmbswtp >> 8);
sprintf(str, "%s", nvme_register_unit_to_string(cmbswtp & 0xf));
obj_add_str(r, "CMB Sustained Write Throughput Units (CMBSWTU)", str);
}
static void json_ctrl_register_human(int offset, uint64_t value, struct json_object *r)
{
char buffer[BUF_LEN];
struct json_object *array_obj = NULL;
switch (offset) {
case NVME_REG_CAP:
array_obj = obj_create_array_obj(r, "cap");
break;
case NVME_REG_VS:
array_obj = obj_create_array_obj(r, "vs");
break;
case NVME_REG_INTMS:
obj_add_nprix64(r, "Interrupt Vector Mask Set (IVMS)", value);
break;
case NVME_REG_INTMC:
obj_add_nprix64(r, "Interrupt Vector Mask Clear (IVMC)", value);
break;
case NVME_REG_CC:
array_obj = obj_create_array_obj(r, "cc");
break;
case NVME_REG_CSTS:
array_obj = obj_create_array_obj(r, "csts");
break;
case NVME_REG_NSSR:
obj_add_uint64(r, "NVM Subsystem Reset Control (NSSRC)", value);
break;
case NVME_REG_AQA:
json_registers_aqa(value, obj_create_array_obj(r, "aqa"));
break;
case NVME_REG_ASQ:
obj_add_nprix64(r, "Admin Submission Queue Base (ASQB)", value);
break;
case NVME_REG_ACQ:
obj_add_nprix64(r, "Admin Completion Queue Base (ACQB)", value);
break;
case NVME_REG_CMBLOC:
json_registers_cmbloc(value, true, obj_create_array_obj(r, "cmbloc"));
break;
case NVME_REG_CMBSZ:
json_registers_cmbsz(value, obj_create_array_obj(r, "cmbsz"));
break;
case NVME_REG_BPINFO:
json_registers_bpinfo(value, obj_create_array_obj(r, "bpinfo"));
break;
case NVME_REG_BPRSEL:
json_registers_bprsel(value, obj_create_array_obj(r, "bprsel"));
break;
case NVME_REG_BPMBL:
json_registers_bpmbl(value, obj_create_array_obj(r, "bpmbl"));
break;
case NVME_REG_CMBMSC:
json_registers_cmbmsc(value, obj_create_array_obj(r, "cmbmsc"));
break;
case NVME_REG_CMBSTS:
json_registers_cmbsts(value, obj_create_array_obj(r, "cmbsts"));
break;
case NVME_REG_CMBEBS:
json_registers_cmbebs(value, obj_create_array_obj(r, "cmbebs"));
break;
case NVME_REG_CMBSWTP:
json_registers_cmbswtp(value, obj_create_array_obj(r, "cmbswtp"));
break;
case NVME_REG_NSSD:
json_registers_nssd(value, obj_create_array_obj(r, "nssd"));
break;
case NVME_REG_CRTO:
array_obj = obj_create_array_obj(r, "crto");
break;
case NVME_REG_PMRCAP:
json_registers_pmrcap(value, obj_create_array_obj(r, "pmrcap"));
break;
case NVME_REG_PMRCTL:
json_registers_pmrctl(value, obj_create_array_obj(r, "pmrctl"));
break;
case NVME_REG_PMRSTS:
json_registers_pmrsts(value, true, obj_create_array_obj(r, "pmrsts"));
break;
case NVME_REG_PMREBS:
json_registers_pmrebs(value, obj_create_array_obj(r, "pmrebs"));
break;
case NVME_REG_PMRSWTP:
json_registers_pmrswtp(value, obj_create_array_obj(r, "pmrswtp"));
break;
case NVME_REG_PMRMSCL:
json_registers_pmrmscl(value, obj_create_array_obj(r, "pmrmscl"));
break;
case NVME_REG_PMRMSCU:
json_registers_pmrmscu(value, obj_create_array_obj(r, "pmrmscu"));
break;
default:
sprintf(buffer, "%#04x (%s)", offset, nvme_register_to_string(offset));
obj_add_str(r, "register", buffer);
obj_add_nprix64(r, "value", value);
break;
}
if (array_obj)
json_single_property_human(offset, value, array_obj);
}
static void json_ctrl_register(int offset, uint64_t value)
{
bool human = json_print_ops.flags & VERBOSE;
struct json_object *r;
char json_str[STR_LEN];
sprintf(json_str, "register: %#04x", offset);
r = obj_create(json_str);
if (human) {
obj_add_uint64(r, nvme_register_to_string(offset), value);
json_ctrl_register_human(offset, value, r);
} else {
obj_add_str(r, "name", nvme_register_symbol_to_string(offset));
obj_add_uint64(r, "value", value);
}
}
static void json_nvme_cmd_set_independent_id_ns(struct nvme_id_independent_id_ns *ns,
unsigned int nsid)
{
@ -3433,7 +3657,7 @@ static void json_feature_show(enum nvme_features_id fid, int sel, unsigned int r
sprintf(json_str, "%#0*x", result ? 10 : 8, result);
obj_add_str(r, nvme_select_to_string(sel), json_str);
json_print(r);
obj_print(r);
}
static void json_feature_show_fields(enum nvme_features_id fid, unsigned int result,
@ -3525,9 +3749,7 @@ static void json_feature_show_fields(enum nvme_features_id fid, unsigned int res
json_feature_show_fields_spinup_control(r, result);
break;
case NVME_FEAT_FID_ENH_CTRL_METADATA:
fallthrough;
case NVME_FEAT_FID_CTRL_METADATA:
fallthrough;
case NVME_FEAT_FID_NS_METADATA:
json_feature_show_fields_ns_metadata(r, fid, buf);
break;
@ -3556,7 +3778,7 @@ static void json_feature_show_fields(enum nvme_features_id fid, unsigned int res
break;
}
json_print(r);
obj_print(r);
}
void json_id_ctrl_rpmbs(__le32 ctrl_rpmbs)
@ -3604,13 +3826,11 @@ void json_d(unsigned char *buf, int len, int width, int group)
{
struct json_object *r = json_r ? json_r : json_create_object();
char json_str[STR_LEN];
struct json_object *data = json_create_array();
sprintf(json_str, "data: buf=%p len=%d width=%d group=%d", buf, len, width, group);
d_json(buf, len, width, group, data);
obj_add_array(r, json_str, data);
obj_d(r, json_str, buf, len, width, group);
json_print(r);
obj_print(r);
}
static void json_nvme_list_ctrl(struct nvme_ctrl_list *ctrl_list)
@ -3876,6 +4096,7 @@ static void json_detail_list(nvme_root_t t)
struct json_object *jpaths = json_create_array();
obj_add_str(jctrl, "Controller", nvme_ctrl_get_name(c));
obj_add_str(jctrl, "Cntlid", nvme_ctrl_get_cntlid(c));
obj_add_str(jctrl, "SerialNumber", nvme_ctrl_get_serial(c));
obj_add_str(jctrl, "ModelNumber", nvme_ctrl_get_model(c));
obj_add_str(jctrl, "Firmware", nvme_ctrl_get_firmware(c));
@ -4311,7 +4532,7 @@ static void json_output_status(int status)
if (status < 0) {
obj_add_str(r, "error", nvme_strerror(errno));
json_print(r);
obj_print(r);
return;
}
@ -4332,7 +4553,7 @@ static void json_output_status(int status)
break;
}
json_print(r);
obj_print(r);
}
static void json_output_error_status(int status, const char *msg, va_list ap)
@ -4353,7 +4574,7 @@ static void json_output_error_status(int status, const char *msg, va_list ap)
if (status < 0) {
obj_add_str(r, "error", nvme_strerror(errno));
json_print(r);
obj_print(r);
return;
}
@ -4376,7 +4597,7 @@ static void json_output_error_status(int status, const char *msg, va_list ap)
obj_add_int(r, "value", val);
json_print(r);
obj_print(r);
}
static void json_output_message(bool error, const char *msg, va_list ap)
@ -4391,7 +4612,7 @@ static void json_output_message(bool error, const char *msg, va_list ap)
free(value);
json_print(r);
obj_print(r);
}
static void json_output_perror(const char *msg)
@ -4432,6 +4653,7 @@ static struct print_ops json_print_ops = {
.phy_rx_eom_log = json_phy_rx_eom_log,
.ctrl_list = json_nvme_list_ctrl,
.ctrl_registers = json_ctrl_registers,
.ctrl_register = json_ctrl_register,
.directive = json_directive_show,
.discovery_log = json_discovery_log,
.effects_log_list = json_effects_log_list,