Adding upstream version 2.11.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
6f96c7c854
commit
65508f0a28
533 changed files with 9033 additions and 4835 deletions
|
@ -25,7 +25,6 @@
|
|||
#define obj_add_array json_object_add_value_array
|
||||
#define obj_add_int json_object_add_value_int
|
||||
#define obj_add_obj json_object_add_value_object
|
||||
#define obj_add_str json_object_add_value_string
|
||||
#define obj_add_uint json_object_add_value_uint
|
||||
#define obj_add_uint128 json_object_add_value_uint128
|
||||
#define obj_add_uint64 json_object_add_value_uint64
|
||||
|
@ -75,7 +74,7 @@ static void obj_add_uint_x(struct json_object *o, const char *k, __u32 v)
|
|||
obj_add_str(o, k, str);
|
||||
}
|
||||
|
||||
static void obj_add_uint_0x(struct json_object *o, const char *k, __u32 v)
|
||||
void obj_add_uint_0x(struct json_object *o, const char *k, __u32 v)
|
||||
{
|
||||
char str[STR_LEN];
|
||||
|
||||
|
@ -83,15 +82,15 @@ 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_0nx(struct json_object *o, const char *k, __u32 v, int width)
|
||||
void obj_add_uint_0nx(struct json_object *o, const char *k, __u32 v, int width)
|
||||
{
|
||||
char str[STR_LEN];
|
||||
|
||||
sprintf(str, "0x%02x", v);
|
||||
sprintf(str, "0x%0*x", width, v);
|
||||
obj_add_str(o, k, str);
|
||||
}
|
||||
|
||||
static void obj_add_uint_02x(struct json_object *o, const char *k, __u32 v)
|
||||
void obj_add_uint_02x(struct json_object *o, const char *k, __u32 v)
|
||||
{
|
||||
obj_add_uint_0nx(o, k, v, 2);
|
||||
}
|
||||
|
@ -104,7 +103,7 @@ static void obj_add_uint_nx(struct json_object *o, const char *k, __u32 v)
|
|||
obj_add_str(o, k, str);
|
||||
}
|
||||
|
||||
static void obj_add_nprix64(struct json_object *o, const char *k, uint64_t v)
|
||||
void obj_add_nprix64(struct json_object *o, const char *k, uint64_t v)
|
||||
{
|
||||
char str[STR_LEN];
|
||||
|
||||
|
@ -132,8 +131,9 @@ static void obj_add_result(struct json_object *o, const char *v, ...)
|
|||
{
|
||||
va_list ap;
|
||||
|
||||
_cleanup_free_ char *value = NULL;
|
||||
|
||||
va_start(ap, v);
|
||||
char *value;
|
||||
|
||||
if (vasprintf(&value, v, ap) < 0)
|
||||
value = NULL;
|
||||
|
@ -144,15 +144,15 @@ static void obj_add_result(struct json_object *o, const char *v, ...)
|
|||
obj_add_str(o, "Result", "Could not allocate string");
|
||||
|
||||
va_end(ap);
|
||||
free(value);
|
||||
}
|
||||
|
||||
static void obj_add_key(struct json_object *o, const char *k, const char *v, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
_cleanup_free_ char *value = NULL;
|
||||
|
||||
va_start(ap, v);
|
||||
char *value;
|
||||
|
||||
if (vasprintf(&value, v, ap) < 0)
|
||||
value = NULL;
|
||||
|
@ -163,10 +163,9 @@ static void obj_add_key(struct json_object *o, const char *k, const char *v, ...
|
|||
obj_add_str(o, k, "Could not allocate string");
|
||||
|
||||
va_end(ap);
|
||||
free(value);
|
||||
}
|
||||
|
||||
static struct json_object *obj_create_array_obj(struct json_object *o, const char *k)
|
||||
struct json_object *obj_create_array_obj(struct json_object *o, const char *k)
|
||||
{
|
||||
struct json_object *array = json_create_array();
|
||||
struct json_object *obj = json_create_object();
|
||||
|
@ -191,7 +190,7 @@ static struct json_object *obj_create(const char *k)
|
|||
return obj;
|
||||
}
|
||||
|
||||
static void json_print(struct json_object *r)
|
||||
void json_print(struct json_object *r)
|
||||
{
|
||||
json_print_object(r, NULL);
|
||||
printf("\n");
|
||||
|
@ -204,11 +203,6 @@ static void obj_print(struct json_object *o)
|
|||
json_print(o);
|
||||
}
|
||||
|
||||
static bool human(void)
|
||||
{
|
||||
return json_print_ops.flags & VERBOSE;
|
||||
}
|
||||
|
||||
static void json_id_iocs(struct nvme_id_iocs *iocs)
|
||||
{
|
||||
struct json_object *r = json_create_object();
|
||||
|
@ -400,6 +394,7 @@ void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl,
|
|||
obj_add_uint(r, "pels", le32_to_cpu(ctrl->pels));
|
||||
obj_add_int(r, "domainid", le16_to_cpu(ctrl->domainid));
|
||||
obj_add_uint128(r, "megcap", megcap);
|
||||
obj_add_int(r, "tmpthha", ctrl->tmpthha);
|
||||
obj_add_int(r, "sqes", ctrl->sqes);
|
||||
obj_add_int(r, "cqes", ctrl->cqes);
|
||||
obj_add_int(r, "maxcmd", le16_to_cpu(ctrl->maxcmd));
|
||||
|
@ -474,8 +469,8 @@ static void json_error_log(struct nvme_error_log_page *err_log, int entries,
|
|||
obj_add_uint64(error, "error_count", le64_to_cpu(err_log[i].error_count));
|
||||
obj_add_int(error, "sqid", le16_to_cpu(err_log[i].sqid));
|
||||
obj_add_int(error, "cmdid", le16_to_cpu(err_log[i].cmdid));
|
||||
obj_add_int(error, "status_field", le16_to_cpu(err_log[i].status_field >> 0x1));
|
||||
obj_add_int(error, "phase_tag", le16_to_cpu(err_log[i].status_field & 0x1));
|
||||
obj_add_int(error, "status_field", le16_to_cpu(err_log[i].status_field) >> 0x1);
|
||||
obj_add_int(error, "phase_tag", le16_to_cpu(err_log[i].status_field) & 0x1);
|
||||
obj_add_int(error, "parm_error_location",
|
||||
le16_to_cpu(err_log[i].parm_error_location));
|
||||
obj_add_uint64(error, "lba", le64_to_cpu(err_log[i].lba));
|
||||
|
@ -669,21 +664,17 @@ static void json_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
|
|||
nvme_uint128_t media_errors = le128_to_cpu(smart->media_errors);
|
||||
nvme_uint128_t num_err_log_entries = le128_to_cpu(smart->num_err_log_entries);
|
||||
|
||||
if (human()) {
|
||||
struct json_object *crt = json_create_object();
|
||||
struct json_object *crt = json_create_object();
|
||||
|
||||
obj_add_int(crt, "value", smart->critical_warning);
|
||||
obj_add_int(crt, "available_spare", smart->critical_warning & 1);
|
||||
obj_add_int(crt, "temp_threshold", (smart->critical_warning & 2) >> 1);
|
||||
obj_add_int(crt, "reliability_degraded", (smart->critical_warning & 4) >> 2);
|
||||
obj_add_int(crt, "ro", (smart->critical_warning & 8) >> 3);
|
||||
obj_add_int(crt, "vmbu_failed", (smart->critical_warning & 0x10) >> 4);
|
||||
obj_add_int(crt, "pmr_ro", (smart->critical_warning & 0x20) >> 5);
|
||||
obj_add_int(crt, "value", smart->critical_warning);
|
||||
obj_add_int(crt, "available_spare", smart->critical_warning & 1);
|
||||
obj_add_int(crt, "temp_threshold", (smart->critical_warning & 2) >> 1);
|
||||
obj_add_int(crt, "reliability_degraded", (smart->critical_warning & 4) >> 2);
|
||||
obj_add_int(crt, "ro", (smart->critical_warning & 8) >> 3);
|
||||
obj_add_int(crt, "vmbu_failed", (smart->critical_warning & 0x10) >> 4);
|
||||
obj_add_int(crt, "pmr_ro", (smart->critical_warning & 0x20) >> 5);
|
||||
|
||||
obj_add_obj(r, "critical_warning", crt);
|
||||
} else {
|
||||
obj_add_int(r, "critical_warning", smart->critical_warning);
|
||||
}
|
||||
obj_add_obj(r, "critical_warning", crt);
|
||||
|
||||
obj_add_int(r, "temperature", temperature);
|
||||
obj_add_int(r, "avail_spare", smart->avail_spare);
|
||||
|
@ -853,6 +844,8 @@ static void json_registers_cap(struct nvme_bar_cap *cap, struct json_object *r)
|
|||
sprintf(json_str, "%"PRIx64"", *(uint64_t *)cap);
|
||||
obj_add_str(r, "cap", json_str);
|
||||
|
||||
obj_add_str(r, "NVM Subsystem Shutdown Enhancements Supported (NSSES)",
|
||||
cap->nsses ? "Supported" : "Not supported");
|
||||
obj_add_str(r, "Controller Ready With Media Support (CRWMS)",
|
||||
cap->crwms ? "Supported" : "Not supported");
|
||||
obj_add_str(r, "Controller Ready Independent of Media Support (CRIMS)",
|
||||
|
@ -1182,6 +1175,30 @@ static void json_registers_cmbsts(uint32_t cmbsts, struct json_object *r)
|
|||
obj_add_uint_x(r, "Controller Base Address Invalid (CBAI)", cmbsts & 1);
|
||||
}
|
||||
|
||||
static void json_registers_cmbebs(uint32_t 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, "CMB Read Bypass Behavior (CMBRBB)", buffer);
|
||||
obj_add_str(r, "CMB Elasticity Buffer Size Units (CMBSZU)",
|
||||
nvme_register_unit_to_string(cmbebs & 0xf));
|
||||
}
|
||||
|
||||
static void json_registers_cmbswtp(uint32_t 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/second", nvme_register_unit_to_string(cmbswtp & 0xf));
|
||||
obj_add_str(r, "CMB Sustained Write Throughput Units (CMBSWTU)", str);
|
||||
}
|
||||
|
||||
static void json_registers_pmrcap(uint32_t pmrcap, struct json_object *r)
|
||||
{
|
||||
obj_add_uint_x(r, "pmrcap", pmrcap);
|
||||
|
@ -1296,24 +1313,8 @@ static void json_single_property_human(int offset, uint64_t value64, struct json
|
|||
static void json_single_property(int offset, uint64_t value64)
|
||||
{
|
||||
struct json_object *r = json_create_object();
|
||||
char json_str[STR_LEN];
|
||||
uint32_t value32 = (uint32_t)value64;
|
||||
|
||||
if (human()) {
|
||||
json_single_property_human(offset, value64, r);
|
||||
} else {
|
||||
sprintf(json_str, "0x%02x", offset);
|
||||
obj_add_str(r, "property", json_str);
|
||||
|
||||
obj_add_str(r, "name", nvme_register_to_string(offset));
|
||||
|
||||
if (nvme_is_64bit_reg(offset))
|
||||
sprintf(json_str, "%"PRIx64"", value64);
|
||||
else
|
||||
sprintf(json_str, "%x", value32);
|
||||
|
||||
obj_add_str(r, "value", json_str);
|
||||
}
|
||||
json_single_property_human(offset, value64, r);
|
||||
|
||||
json_print(r);
|
||||
}
|
||||
|
@ -1853,13 +1854,20 @@ static void json_lba_status(struct nvme_lba_status *list,
|
|||
obj_add_uint(r, "Completion Condition (CMPC)", list->cmpc);
|
||||
|
||||
switch (list->cmpc) {
|
||||
case 1:
|
||||
obj_add_str(r, "cmpc-definition",
|
||||
"Completed due to transferring the amount of data specified in the MNDW field");
|
||||
case NVME_LBA_STATUS_CMPC_NO_CMPC:
|
||||
obj_add_str(r, "cmpc-definition", "No indication of the completion condition");
|
||||
break;
|
||||
case 2:
|
||||
case NVME_LBA_STATUS_CMPC_INCOMPLETE:
|
||||
obj_add_str(r, "cmpc-definition",
|
||||
"Completed due to having performed the action specified in the Action Type field over the number of logical blocks specified in the Range Length field");
|
||||
"Completed transferring the amount of data specified in the"\
|
||||
"MNDW field. But, additional LBA Status Descriptor Entries are"\
|
||||
"available to transfer or scan did not complete (if ATYPE = 10h)");
|
||||
break;
|
||||
case NVME_LBA_STATUS_CMPC_COMPLETE:
|
||||
obj_add_str(r, "cmpc-definition",
|
||||
"Completed the specified action over the number of LBAs specified"\
|
||||
"in the Range Length field and transferred all available LBA Status"\
|
||||
"Descriptor Entries");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -2077,10 +2085,11 @@ static void json_phy_rx_eom_descs(struct nvme_phy_rx_eom_log *log,
|
|||
|
||||
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 *r = json_create_object();
|
||||
|
||||
_cleanup_free_ char **allocated_eyes = NULL;
|
||||
|
||||
obj_add_uint(r, "lid", log->lid);
|
||||
obj_add_uint(r, "eomip", log->eomip);
|
||||
obj_add_uint(r, "hsize", le16_to_cpu(log->hsize));
|
||||
|
@ -2113,7 +2122,6 @@ static void json_phy_rx_eom_log(struct nvme_phy_rx_eom_log *log, __u16 controlle
|
|||
if (allocated_eyes[i])
|
||||
free(allocated_eyes[i]);
|
||||
}
|
||||
free(allocated_eyes);
|
||||
}
|
||||
|
||||
json_print(r);
|
||||
|
@ -2457,7 +2465,11 @@ static void json_print_nvme_subsystem_list(nvme_root_t r, bool show_ana)
|
|||
subsystem_attrs = json_create_object();
|
||||
obj_add_str(subsystem_attrs, "Name", nvme_subsystem_get_name(s));
|
||||
obj_add_str(subsystem_attrs, "NQN", nvme_subsystem_get_nqn(s));
|
||||
obj_add_str(subsystem_attrs, "IOPolicy", nvme_subsystem_get_iopolicy(s));
|
||||
|
||||
obj_add_str(subsystem_attrs, "IOPolicy",
|
||||
nvme_subsystem_get_iopolicy(s));
|
||||
obj_add_str(subsystem_attrs, "Type",
|
||||
nvme_subsystem_get_type(s));
|
||||
|
||||
array_add_obj(subsystems, subsystem_attrs);
|
||||
paths = json_create_array();
|
||||
|
@ -2478,120 +2490,84 @@ static void json_ctrl_registers_cap(void *bar, struct json_object *r)
|
|||
{
|
||||
uint64_t cap = mmio_read64(bar + NVME_REG_CAP);
|
||||
|
||||
if (human())
|
||||
json_registers_cap((struct nvme_bar_cap *)&cap, obj_create_array_obj(r, "cap"));
|
||||
else
|
||||
obj_add_uint64(r, "cap", cap);
|
||||
json_registers_cap((struct nvme_bar_cap *)&cap, obj_create_array_obj(r, "cap"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_vs(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t vs = mmio_read32(bar + NVME_REG_VS);
|
||||
|
||||
if (human())
|
||||
json_registers_version(vs, obj_create_array_obj(r, "vs"));
|
||||
else
|
||||
obj_add_int(r, "vs", vs);
|
||||
json_registers_version(vs, obj_create_array_obj(r, "vs"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_intms(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t intms = mmio_read32(bar + NVME_REG_INTMS);
|
||||
|
||||
if (human())
|
||||
json_registers_intms(intms, obj_create_array_obj(r, "intms"));
|
||||
else
|
||||
obj_add_int(r, "intms", intms);
|
||||
json_registers_intms(intms, obj_create_array_obj(r, "intms"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_intmc(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t intmc = mmio_read32(bar + NVME_REG_INTMC);
|
||||
|
||||
if (human())
|
||||
json_registers_intmc(intmc, obj_create_array_obj(r, "intmc"));
|
||||
else
|
||||
obj_add_int(r, "intmc", intmc);
|
||||
json_registers_intmc(intmc, obj_create_array_obj(r, "intmc"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_cc(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t cc = mmio_read32(bar + NVME_REG_CC);
|
||||
|
||||
if (human())
|
||||
json_registers_cc(cc, obj_create_array_obj(r, "cc"));
|
||||
else
|
||||
obj_add_int(r, "cc", cc);
|
||||
json_registers_cc(cc, obj_create_array_obj(r, "cc"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_csts(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t csts = mmio_read32(bar + NVME_REG_CSTS);
|
||||
|
||||
if (human())
|
||||
json_registers_csts(csts, obj_create_array_obj(r, "csts"));
|
||||
else
|
||||
obj_add_int(r, "csts", csts);
|
||||
json_registers_csts(csts, obj_create_array_obj(r, "csts"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_nssr(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t nssr = mmio_read32(bar + NVME_REG_NSSR);
|
||||
|
||||
if (human())
|
||||
json_registers_nssr(nssr, obj_create_array_obj(r, "nssr"));
|
||||
else
|
||||
obj_add_int(r, "nssr", nssr);
|
||||
json_registers_nssr(nssr, obj_create_array_obj(r, "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);
|
||||
json_registers_nssd(nssd, obj_create_array_obj(r, "nssd"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_crto(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t crto = mmio_read32(bar + NVME_REG_CRTO);
|
||||
|
||||
if (human())
|
||||
json_registers_crto(crto, obj_create_array_obj(r, "crto"));
|
||||
else
|
||||
obj_add_int(r, "crto", crto);
|
||||
json_registers_crto(crto, obj_create_array_obj(r, "crto"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_aqa(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t aqa = mmio_read32(bar + NVME_REG_AQA);
|
||||
|
||||
if (human())
|
||||
json_registers_aqa(aqa, obj_create_array_obj(r, "aqa"));
|
||||
else
|
||||
obj_add_int(r, "aqa", aqa);
|
||||
json_registers_aqa(aqa, obj_create_array_obj(r, "aqa"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_asq(void *bar, struct json_object *r)
|
||||
{
|
||||
uint64_t asq = mmio_read64(bar + NVME_REG_ASQ);
|
||||
|
||||
if (human())
|
||||
json_registers_asq(asq, obj_create_array_obj(r, "asq"));
|
||||
else
|
||||
obj_add_uint64(r, "asq", asq);
|
||||
json_registers_asq(asq, obj_create_array_obj(r, "asq"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_acq(void *bar, struct json_object *r)
|
||||
{
|
||||
uint64_t acq = mmio_read64(bar + NVME_REG_ACQ);
|
||||
|
||||
if (human())
|
||||
json_registers_acq(acq, obj_create_array_obj(r, "acq"));
|
||||
else
|
||||
obj_add_uint64(r, "acq", acq);
|
||||
json_registers_acq(acq, obj_create_array_obj(r, "acq"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_cmbloc(void *bar, struct json_object *r)
|
||||
|
@ -2600,93 +2576,79 @@ static void json_ctrl_registers_cmbloc(void *bar, struct json_object *r)
|
|||
uint32_t cmbsz;
|
||||
bool support;
|
||||
|
||||
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);
|
||||
}
|
||||
cmbsz = mmio_read32(bar + NVME_REG_CMBSZ);
|
||||
support = nvme_registers_cmbloc_support(cmbsz);
|
||||
json_registers_cmbloc(cmbloc, support, obj_create_array_obj(r, "cmbloc"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_cmbsz(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t cmbsz = mmio_read32(bar + NVME_REG_CMBSZ);
|
||||
|
||||
if (human())
|
||||
json_registers_cmbsz(cmbsz, obj_create_array_obj(r, "cmbsz"));
|
||||
else
|
||||
obj_add_int(r, "cmbsz", cmbsz);
|
||||
json_registers_cmbsz(cmbsz, obj_create_array_obj(r, "cmbsz"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_bpinfo(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t bpinfo = mmio_read32(bar + NVME_REG_BPINFO);
|
||||
|
||||
if (human())
|
||||
json_registers_bpinfo(bpinfo, obj_create_array_obj(r, "bpinfo"));
|
||||
else
|
||||
obj_add_int(r, "bpinfo", bpinfo);
|
||||
json_registers_bpinfo(bpinfo, obj_create_array_obj(r, "bpinfo"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_bprsel(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t bprsel = mmio_read32(bar + NVME_REG_BPRSEL);
|
||||
|
||||
if (human())
|
||||
json_registers_bprsel(bprsel, obj_create_array_obj(r, "bprsel"));
|
||||
else
|
||||
obj_add_int(r, "bprsel", bprsel);
|
||||
json_registers_bprsel(bprsel, obj_create_array_obj(r, "bprsel"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_bpmbl(void *bar, struct json_object *r)
|
||||
{
|
||||
uint64_t bpmbl = mmio_read64(bar + NVME_REG_BPMBL);
|
||||
|
||||
if (human())
|
||||
json_registers_bpmbl(bpmbl, obj_create_array_obj(r, "bpmbl"));
|
||||
else
|
||||
obj_add_uint64(r, "bpmbl", bpmbl);
|
||||
json_registers_bpmbl(bpmbl, obj_create_array_obj(r, "bpmbl"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_cmbmsc(void *bar, struct json_object *r)
|
||||
{
|
||||
uint64_t cmbmsc = mmio_read64(bar + NVME_REG_CMBMSC);
|
||||
|
||||
if (human())
|
||||
json_registers_cmbmsc(cmbmsc, obj_create_array_obj(r, "cmbmsc"));
|
||||
else
|
||||
obj_add_uint64(r, "cmbmsc", cmbmsc);
|
||||
json_registers_cmbmsc(cmbmsc, obj_create_array_obj(r, "cmbmsc"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_cmbsts(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t cmbsts = mmio_read32(bar + NVME_REG_CMBSTS);
|
||||
|
||||
if (human())
|
||||
json_registers_cmbsts(cmbsts, obj_create_array_obj(r, "cmbsts"));
|
||||
else
|
||||
obj_add_int(r, "cmbsts", cmbsts);
|
||||
json_registers_cmbsts(cmbsts, obj_create_array_obj(r, "cmbsts"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_cmbebs(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t cmbebs = mmio_read32(bar + NVME_REG_CMBEBS);
|
||||
|
||||
json_registers_cmbebs(cmbebs, obj_create_array_obj(r, "cmbebs"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_cmbswtp(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t cmbswtp = mmio_read32(bar + NVME_REG_CMBSWTP);
|
||||
|
||||
json_registers_cmbswtp(cmbswtp, obj_create_array_obj(r, "cmbswtp"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_pmrcap(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t pmrcap = mmio_read32(bar + NVME_REG_PMRCAP);
|
||||
|
||||
if (human())
|
||||
json_registers_pmrcap(pmrcap, obj_create_array_obj(r, "pmrcap"));
|
||||
else
|
||||
obj_add_int(r, "pmrcap", pmrcap);
|
||||
json_registers_pmrcap(pmrcap, obj_create_array_obj(r, "pmrcap"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_pmrctl(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t pmrctl = mmio_read32(bar + NVME_REG_PMRCTL);
|
||||
|
||||
if (human())
|
||||
json_registers_pmrctl(pmrctl, obj_create_array_obj(r, "pmrctl"));
|
||||
else
|
||||
obj_add_int(r, "pmrctl", pmrctl);
|
||||
json_registers_pmrctl(pmrctl, obj_create_array_obj(r, "pmrctl"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_pmrsts(void *bar, struct json_object *r)
|
||||
|
@ -2695,53 +2657,37 @@ static void json_ctrl_registers_pmrsts(void *bar, struct json_object *r)
|
|||
uint32_t pmrctl;
|
||||
bool ready;
|
||||
|
||||
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);
|
||||
}
|
||||
pmrctl = mmio_read32(bar + NVME_REG_PMRCTL);
|
||||
ready = nvme_registers_pmrctl_ready(pmrctl);
|
||||
json_registers_pmrsts(pmrsts, ready, obj_create_array_obj(r, "pmrsts"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_pmrebs(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t pmrebs = mmio_read32(bar + NVME_REG_PMREBS);
|
||||
|
||||
if (human())
|
||||
json_registers_pmrebs(pmrebs, obj_create_array_obj(r, "pmrebs"));
|
||||
else
|
||||
obj_add_int(r, "pmrebs", pmrebs);
|
||||
json_registers_pmrebs(pmrebs, obj_create_array_obj(r, "pmrebs"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_pmrswtp(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t pmrswtp = mmio_read32(bar + NVME_REG_PMRSWTP);
|
||||
|
||||
if (human())
|
||||
json_registers_pmrswtp(pmrswtp, obj_create_array_obj(r, "pmrswtp"));
|
||||
else
|
||||
obj_add_int(r, "pmrswtp", pmrswtp);
|
||||
json_registers_pmrswtp(pmrswtp, obj_create_array_obj(r, "pmrswtp"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_pmrmscl(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t pmrmscl = mmio_read32(bar + NVME_REG_PMRMSCL);
|
||||
|
||||
if (human())
|
||||
json_registers_pmrmscl(pmrmscl, obj_create_array_obj(r, "pmrmscl"));
|
||||
else
|
||||
obj_add_uint(r, "pmrmscl", pmrmscl);
|
||||
json_registers_pmrmscl(pmrmscl, obj_create_array_obj(r, "pmrmscl"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers_pmrmscu(void *bar, struct json_object *r)
|
||||
{
|
||||
uint32_t pmrmscu = mmio_read32(bar + NVME_REG_PMRMSCU);
|
||||
|
||||
if (human())
|
||||
json_registers_pmrmscu(pmrmscu, obj_create_array_obj(r, "pmrmscu"));
|
||||
else
|
||||
obj_add_uint(r, "pmrmscu", pmrmscu);
|
||||
json_registers_pmrmscu(pmrmscu, obj_create_array_obj(r, "pmrmscu"));
|
||||
}
|
||||
|
||||
static void json_ctrl_registers(void *bar, bool fabrics)
|
||||
|
@ -2755,8 +2701,6 @@ 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);
|
||||
json_ctrl_registers_acq(bar, r);
|
||||
|
@ -2767,6 +2711,10 @@ static void json_ctrl_registers(void *bar, bool fabrics)
|
|||
json_ctrl_registers_bpmbl(bar, r);
|
||||
json_ctrl_registers_cmbmsc(bar, r);
|
||||
json_ctrl_registers_cmbsts(bar, r);
|
||||
json_ctrl_registers_cmbebs(bar, r);
|
||||
json_ctrl_registers_cmbswtp(bar, r);
|
||||
json_ctrl_registers_nssd(bar, r);
|
||||
json_ctrl_registers_crto(bar, r);
|
||||
json_ctrl_registers_pmrcap(bar, r);
|
||||
json_ctrl_registers_pmrctl(bar, r);
|
||||
json_ctrl_registers_pmrsts(bar, r);
|
||||
|
@ -2778,30 +2726,6 @@ 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];
|
||||
|
@ -2905,20 +2829,14 @@ static void json_ctrl_register_human(int offset, uint64_t value, struct json_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);
|
||||
}
|
||||
obj_add_uint64(r, nvme_register_to_string(offset), value);
|
||||
json_ctrl_register_human(offset, value, r);
|
||||
}
|
||||
|
||||
static void json_nvme_cmd_set_independent_id_ns(struct nvme_id_independent_id_ns *ns,
|
||||
|
@ -3033,6 +2951,14 @@ static void json_nvme_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm)
|
|||
obj_add_uint(r, "dmrl", ctrl_nvm->dmrl);
|
||||
obj_add_uint(r, "dmrsl", le32_to_cpu(ctrl_nvm->dmrsl));
|
||||
obj_add_uint64(r, "dmsl", le64_to_cpu(ctrl_nvm->dmsl));
|
||||
obj_add_uint(r, "aocs", le16_to_cpu(ctrl_nvm->aocs));
|
||||
|
||||
__u16 rsvd = (ctrl_nvm->aocs & 0xfffe) >> 1;
|
||||
__u8 ralbas = ctrl_nvm->aocs & 0x1;
|
||||
|
||||
if (rsvd)
|
||||
obj_add_uint(r, "[15:1]: Reserved", rsvd);
|
||||
obj_add_uint(r, "[0:0]: Reporting Allocated LBA Supported", ralbas);
|
||||
|
||||
json_print(r);
|
||||
}
|
||||
|
@ -3067,6 +2993,13 @@ static void json_nvme_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns,
|
|||
if (ns->nsfeat & 0x20)
|
||||
obj_add_int(r, "npdgl", le32_to_cpu(nvm_ns->npdgl));
|
||||
|
||||
obj_add_uint(r, "nprg", le32_to_cpu(nvm_ns->nprg));
|
||||
obj_add_uint(r, "npra", le32_to_cpu(nvm_ns->npra));
|
||||
obj_add_uint(r, "nors", le32_to_cpu(nvm_ns->nors));
|
||||
obj_add_uint(r, "npdal", le32_to_cpu(nvm_ns->npdal));
|
||||
obj_add_uint(r, "lbapss", le32_to_cpu(nvm_ns->lbapss));
|
||||
obj_add_uint(r, "tlbaag", le32_to_cpu(nvm_ns->tlbaag));
|
||||
|
||||
json_print(r);
|
||||
}
|
||||
|
||||
|
@ -3289,9 +3222,17 @@ static void json_feature_show_fields_lba_range(struct json_object *r, __u8 field
|
|||
|
||||
static void json_feature_show_fields_temp_thresh(struct json_object *r, unsigned int result)
|
||||
{
|
||||
__u8 field = (result & 0x300000) >> 20;
|
||||
char json_str[STR_LEN];
|
||||
__u8 field;
|
||||
|
||||
field = (result & 0x1c00000) >> 22;
|
||||
sprintf(json_str, "%s", nvme_degrees_string(field));
|
||||
obj_add_str(r, "Temperature Threshold Hysteresis (TMPTHH)", json_str);
|
||||
|
||||
sprintf(json_str, "%u K", field);
|
||||
obj_add_str(r, "TMPTHH kelvin", json_str);
|
||||
|
||||
field = (result & 0x300000) >> 20;
|
||||
obj_add_uint(r, "Threshold Type Select (THSEL)", field);
|
||||
obj_add_str(r, "THSEL description", nvme_feature_temp_type_to_string(field));
|
||||
|
||||
|
@ -4209,33 +4150,6 @@ static struct json_object *json_list_item_obj(nvme_ns_t n)
|
|||
return r;
|
||||
}
|
||||
|
||||
static void json_simple_list(nvme_root_t t)
|
||||
{
|
||||
struct json_object *r = json_create_object();
|
||||
struct json_object *jdevices = json_create_array();
|
||||
|
||||
nvme_host_t h;
|
||||
nvme_subsystem_t s;
|
||||
nvme_ctrl_t c;
|
||||
nvme_ns_t n;
|
||||
|
||||
nvme_for_each_host(t, h) {
|
||||
nvme_for_each_subsystem(h, s) {
|
||||
nvme_subsystem_for_each_ns(s, n)
|
||||
array_add_obj(jdevices, json_list_item_obj(n));
|
||||
|
||||
nvme_subsystem_for_each_ctrl(s, c) {
|
||||
nvme_ctrl_for_each_ns(c, n)
|
||||
array_add_obj(jdevices, json_list_item_obj(n));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
obj_add_array(r, "Devices", jdevices);
|
||||
|
||||
json_print(r);
|
||||
}
|
||||
|
||||
static void json_list_item(nvme_ns_t n)
|
||||
{
|
||||
struct json_object *r = json_list_item_obj(n);
|
||||
|
@ -4245,10 +4159,7 @@ static void json_list_item(nvme_ns_t n)
|
|||
|
||||
static void json_print_list_items(nvme_root_t t)
|
||||
{
|
||||
if (json_print_ops.flags & VERBOSE)
|
||||
json_detail_list(t);
|
||||
else
|
||||
json_simple_list(t);
|
||||
json_detail_list(t);
|
||||
}
|
||||
|
||||
static unsigned int json_subsystem_topology_multipath(nvme_subsystem_t s,
|
||||
|
@ -4341,7 +4252,11 @@ static void json_simple_topology(nvme_root_t r)
|
|||
subsystem_attrs = json_create_object();
|
||||
obj_add_str(subsystem_attrs, "Name", nvme_subsystem_get_name(s));
|
||||
obj_add_str(subsystem_attrs, "NQN", nvme_subsystem_get_nqn(s));
|
||||
obj_add_str(subsystem_attrs, "IOPolicy", nvme_subsystem_get_iopolicy(s));
|
||||
|
||||
obj_add_str(subsystem_attrs, "IOPolicy",
|
||||
nvme_subsystem_get_iopolicy(s));
|
||||
obj_add_str(subsystem_attrs, "Type",
|
||||
nvme_subsystem_get_type(s));
|
||||
|
||||
array_add_obj(subsystems, subsystem_attrs);
|
||||
namespaces = json_create_array();
|
||||
|
@ -4456,7 +4371,6 @@ static void json_directive_show(__u8 type, __u8 oper, __u16 spec, __u32 nsid, __
|
|||
void *buf, __u32 len)
|
||||
{
|
||||
struct json_object *r = json_create_object();
|
||||
struct json_object *data;
|
||||
char json_str[STR_LEN];
|
||||
|
||||
sprintf(json_str, "%#x", type);
|
||||
|
@ -4470,13 +4384,7 @@ static void json_directive_show(__u8 type, __u8 oper, __u16 spec, __u32 nsid, __
|
|||
sprintf(json_str, "%#x", result);
|
||||
obj_add_result(r, json_str);
|
||||
|
||||
if (json_print_ops.flags & VERBOSE) {
|
||||
json_directive_show_fields(type, oper, result, buf, r);
|
||||
} else if (buf) {
|
||||
data = json_create_array();
|
||||
d_json((unsigned char *)buf, len, 16, 1, data);
|
||||
obj_add_array(r, "data", data);
|
||||
}
|
||||
json_directive_show_fields(type, oper, result, buf, r);
|
||||
|
||||
json_print(r);
|
||||
}
|
||||
|
@ -4577,18 +4485,17 @@ static void json_output_error_status(int status, const char *msg, va_list ap)
|
|||
{
|
||||
struct json_object *r;
|
||||
char json_str[STR_LEN];
|
||||
char *value;
|
||||
int val;
|
||||
int type;
|
||||
|
||||
_cleanup_free_ char *value = NULL;
|
||||
|
||||
if (vasprintf(&value, msg, ap) < 0)
|
||||
value = NULL;
|
||||
|
||||
sprintf(json_str, "Error: %s", value ? value : "Could not allocate string");
|
||||
r = obj_create(json_str);
|
||||
|
||||
free(value);
|
||||
|
||||
if (status < 0) {
|
||||
obj_add_str(r, "error", nvme_strerror(errno));
|
||||
obj_print(r);
|
||||
|
@ -4620,22 +4527,22 @@ static void json_output_error_status(int status, const char *msg, va_list ap)
|
|||
static void json_output_message(bool error, const char *msg, va_list ap)
|
||||
{
|
||||
struct json_object *r = json_r ? json_r : json_create_object();
|
||||
char *value;
|
||||
|
||||
_cleanup_free_ char *value = NULL;
|
||||
|
||||
if (vasprintf(&value, msg, ap) < 0)
|
||||
value = NULL;
|
||||
|
||||
obj_add_str(r, error ? "error" : "result", value ? value : "Could not allocate string");
|
||||
|
||||
free(value);
|
||||
|
||||
obj_print(r);
|
||||
}
|
||||
|
||||
static void json_output_perror(const char *msg)
|
||||
{
|
||||
struct json_object *r = json_create_object();
|
||||
char *error;
|
||||
|
||||
_cleanup_free_ char *error = NULL;
|
||||
|
||||
if (asprintf(&error, "%s: %s", msg, strerror(errno)) < 0)
|
||||
error = NULL;
|
||||
|
@ -4646,8 +4553,6 @@ static void json_output_perror(const char *msg)
|
|||
obj_add_str(r, "error", "Could not allocate string");
|
||||
|
||||
json_output_object(r);
|
||||
|
||||
free(error);
|
||||
}
|
||||
|
||||
void json_show_init(void)
|
||||
|
@ -4751,3 +4656,36 @@ struct print_ops *nvme_get_json_print_ops(nvme_print_flags_t flags)
|
|||
json_print_ops.flags = flags;
|
||||
return &json_print_ops;
|
||||
}
|
||||
|
||||
void obj_add_byte_array(struct json_object *o, const char *k, unsigned char *buf, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
_cleanup_free_ char *value = NULL;
|
||||
|
||||
if (!buf || !len) {
|
||||
obj_add_str(o, k, "No information provided");
|
||||
return;
|
||||
}
|
||||
|
||||
value = calloc(1, (len + 1) * 2 + 1);
|
||||
|
||||
if (!value) {
|
||||
obj_add_str(o, k, "Could not allocate string");
|
||||
return;
|
||||
}
|
||||
|
||||
sprintf(value, "0x");
|
||||
for (i = 1; i <= len; i++)
|
||||
sprintf(&value[i * 2], "%02x", buf[len - i]);
|
||||
|
||||
obj_add_str(o, k, value);
|
||||
}
|
||||
|
||||
void obj_add_0nprix64(struct json_object *o, const char *k, uint64_t v, int width)
|
||||
{
|
||||
char str[STR_LEN];
|
||||
|
||||
sprintf(str, "0x%0*"PRIx64"", width, v);
|
||||
obj_add_str(o, k, str);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue