return le32_to_cpu(*p) | ((uint64_t)le32_to_cpu(*(p + 1)) << 32);
}
+void json_ctrl_registers(void *bar)
+{
+ uint64_t cap, asq, acq, bpmbl;
+ uint32_t vs, intms, intmc, cc, csts, nssr, aqa, cmbsz, cmbloc,
+ bpinfo, bprsel;
+ struct json_object *root;
+
+ cap = mmio_read64(bar + NVME_REG_CAP);
+ vs = mmio_read32(bar + NVME_REG_VS);
+ intms = mmio_read32(bar + NVME_REG_INTMS);
+ intmc = mmio_read32(bar + NVME_REG_INTMC);
+ cc = mmio_read32(bar + NVME_REG_CC);
+ csts = mmio_read32(bar + NVME_REG_CSTS);
+ nssr = mmio_read32(bar + NVME_REG_NSSR);
+ aqa = mmio_read32(bar + NVME_REG_AQA);
+ asq = mmio_read64(bar + NVME_REG_ASQ);
+ acq = mmio_read64(bar + NVME_REG_ACQ);
+ cmbloc = mmio_read32(bar + NVME_REG_CMBLOC);
+ cmbsz = mmio_read32(bar + NVME_REG_CMBSZ);
+ bpinfo = mmio_read32(bar + NVME_REG_BPINFO);
+ bprsel = mmio_read32(bar + NVME_REG_BPRSEL);
+ bpmbl = mmio_read64(bar + NVME_REG_BPMBL);
+
+ root = json_create_object();
+ json_object_add_value_uint(root, "cap", cap);
+ json_object_add_value_int(root, "vs", vs);
+ json_object_add_value_int(root, "intms", intms);
+ json_object_add_value_int(root, "intmc", intmc);
+ json_object_add_value_int(root, "cc", cc);
+ json_object_add_value_int(root, "csts", csts);
+ json_object_add_value_int(root, "nssr", nssr);
+ json_object_add_value_int(root, "aqa", aqa);
+ json_object_add_value_uint(root, "asq", asq);
+ json_object_add_value_uint(root, "acq", acq);
+ json_object_add_value_int(root, "cmbloc", cmbloc);
+ json_object_add_value_int(root, "cmbsz", cmbsz);
+ json_object_add_value_int(root, "bpinfo", bpinfo);
+ json_object_add_value_int(root, "bprsel", bprsel);
+ json_object_add_value_uint(root, "bpmbl", bpmbl);
+ json_print_object(root, NULL);
+}
+
void show_ctrl_registers(void *bar, unsigned int mode, bool fabrics)
{
uint64_t cap, asq, acq, bpmbl;
{
const char *desc = "Reads and shows the defined NVMe controller registers "\
"in binary or human-readable format";
- const char *human_readable = "show info in readable format";
+ const char *human_readable = "show info in readable format in case of "\
+ "output_format == normal";
void *bar;
- int fd, err;
+ int fd, err, fmt;
bool fabrics = true;
+ const int reg_size = 0x50; /* 00h to 4Fh */
struct config {
int human_readable;
+ char *output_format;
};
struct config cfg = {
.human_readable = 0,
+ .output_format = "normal",
};
const struct argconfig_commandline_options command_line_options[] = {
{"human-readable", 'H', "", CFG_NONE, &cfg.human_readable, no_argument, human_readable},
+ {"output-format", 'o', "FMT", CFG_STRING, &cfg.output_format, required_argument, output_format},
{NULL}
};
if (fd < 0)
return fd;
+ fmt = validate_output_format(cfg.output_format);
+ if (fmt < 0) {
+ fprintf(stderr, "Invalid argument --output-format=%s\n",
+ cfg.output_format);
+ err = -fmt;
+ goto close_fd;
+ }
+
+ if (cfg.human_readable && fmt != NORMAL) {
+ fprintf(stderr, "Only --output-format=normal supports -H\n");
+ err = EINVAL;
+ goto close_fd;
+ }
+
err = nvme_get_properties(fd, &bar);
if (err) {
bar = get_registers();
err = ENODEV;
goto close_fd;
}
- show_ctrl_registers(bar, cfg.human_readable ? HUMAN : 0, fabrics);
+
+ if (fmt == BINARY)
+ d_raw((unsigned char *) bar, reg_size);
+ else if (fmt == JSON)
+ json_ctrl_registers(bar);
+ else
+ show_ctrl_registers(bar, cfg.human_readable ? HUMAN : 0, fabrics);
if (fabrics)
free(bar);