Skip to content

Commit

Permalink
nvme: Add support for get-reg command to output single register
Browse files Browse the repository at this point in the history
Note: Currently only stdout print supported.

Signed-off-by: Tokunori Ikegami <[email protected]>
  • Loading branch information
ikegami-t committed Jan 21, 2024
1 parent b5a741b commit 18fe326
Show file tree
Hide file tree
Showing 6 changed files with 342 additions and 58 deletions.
1 change: 1 addition & 0 deletions nvme-builtin.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ COMMAND_LIST(
ENTRY("subsystem-reset", "Resets the subsystem", subsystem_reset)
ENTRY("ns-rescan", "Rescans the NVME namespaces", ns_rescan)
ENTRY("show-regs", "Shows the controller registers or properties. Requires character device", show_registers)
ENTRY("get-reg", "Get a register and show the resulting value", get_register)
ENTRY("discover", "Discover NVMeoF subsystems", discover_cmd)
ENTRY("connect-all", "Discover and Connect to NVMeoF subsystems", connect_all_cmd)
ENTRY("connect", "Connect to NVMeoF subsystem", connect_cmd)
Expand Down
102 changes: 102 additions & 0 deletions nvme-print-stdout.c
Original file line number Diff line number Diff line change
Expand Up @@ -1427,6 +1427,107 @@ static void stdout_registers_pmrmscu(uint32_t pmrmscu)
pmrmscu);
}

static void stdout_single_register(int offset, uint64_t value64)
{
bool human = stdout_print_ops.flags & VERBOSE;
uint32_t value32 = (uint32_t)value64;

if (human)
printf("%s: ", nvme_register_to_string(offset));
else
printf("register: 0x%02x (%s), value: ", offset, nvme_register_to_string(offset));

if (nvme_is_64bit_reg(offset))
printf("%"PRIx64"\n", value64);
else
printf("%x\n", value32);

if (!human)
return;

switch (offset) {
case NVME_REG_CAP:
stdout_registers_cap((struct nvme_bar_cap *)&value64);
break;
case NVME_REG_VS:
stdout_registers_version(value32);
break;
case NVME_REG_INTMS:
printf("\tInterrupt Vector Mask Set (IVMS): %x\n\n", value32);
break;
case NVME_REG_INTMC:
printf("\tInterrupt Vector Mask Clear (IVMC): %x\n\n", value32);
break;
case NVME_REG_CC:
stdout_registers_cc(value32);
break;
case NVME_REG_CSTS:
stdout_registers_csts(value32);
break;
case NVME_REG_NSSR:
printf("\tNVM Subsystem Reset Control (NSSRC): %u\n\n", value32);
break;
case NVME_REG_AQA:
stdout_registers_aqa(value32);
break;
case NVME_REG_ASQ:
printf("\tAdmin Submission Queue Base (ASQB): %"PRIx64"\n\n", value64);
break;
case NVME_REG_ACQ:
printf("\tAdmin Completion Queue Base (ACQB): %"PRIx64"\n\n", value64);
break;
case NVME_REG_CMBLOC:
stdout_registers_cmbloc(value32, 1);
break;
case NVME_REG_CMBSZ:
stdout_registers_cmbsz(value32);
break;
case NVME_REG_BPINFO:
stdout_registers_bpinfo(value32);
break;
case NVME_REG_BPRSEL:
stdout_registers_bprsel(value32);
break;
case NVME_REG_BPMBL:
stdout_registers_bpmbl(value64);
break;
case NVME_REG_CMBMSC:
stdout_registers_cmbmsc(value64);
break;
case NVME_REG_CMBSTS:
stdout_registers_cmbsts(value32);
break;
case NVME_REG_CRTO:
stdout_registers_crto(value32);
break;
case NVME_REG_PMRCAP:
stdout_registers_pmrcap(value32);
break;
case NVME_REG_PMRCTL:
stdout_registers_pmrctl(value32);
break;
case NVME_REG_PMRSTS:
stdout_registers_pmrsts(value32, 1);
break;
case NVME_REG_PMREBS:
stdout_registers_pmrebs(value32);
break;
case NVME_REG_PMRSWTP:
stdout_registers_pmrswtp(value32);
break;
case NVME_REG_PMRMSCL:
stdout_registers_pmrmscl(value32);
break;
case NVME_REG_PMRMSCU:
stdout_registers_pmrmscu(value32);
break;
default:
printf("unknown register: 0x%02x (%s), value: %"PRIx64"\n",
offset, nvme_register_to_string(offset), value64);
break;
}
}

void stdout_ctrl_registers(void *bar, bool fabrics)
{
uint64_t cap, asq, acq, bpmbl, cmbmsc;
Expand Down Expand Up @@ -5092,6 +5193,7 @@ static struct print_ops stdout_print_ops = {
.phy_rx_eom_log = stdout_phy_rx_eom_log,
.ctrl_list = stdout_list_ctrl,
.ctrl_registers = stdout_ctrl_registers,
.single_register = stdout_single_register,
.directive = stdout_directive_show,
.discovery_log = stdout_discovery_log,
.effects_log_list = stdout_effects_log_pages,
Expand Down
195 changes: 140 additions & 55 deletions nvme-print.c
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,31 @@ const char *nvme_register_pmr_pmrszu_to_string(__u8 pmrszu)
}
}

void nvme_show_single_register(void *bar, bool fabrics, int offset, enum nvme_print_flags flags)
{
uint64_t value;

if (nvme_is_64bit_reg(offset))
value = mmio_read64(bar + offset);
else
value = mmio_read32(bar + offset);

if (!nvme_is_fabrics_reg(offset)) {
if (fabrics) {
printf("register: 0x%02x (%s) not fabrics\n", offset,
nvme_register_to_string(offset));
return;
}
if (value == 0xffffffff) {
printf("register: 0x%02x (%s), value: %"PRIx64" not valid\n", offset,
nvme_register_to_string(offset), value);
return;
}
}

nvme_print(single_register, flags, offset, value);
}

void nvme_show_ctrl_registers(void *bar, bool fabrics, enum nvme_print_flags flags)
{
nvme_print(ctrl_registers, flags, bar, fabrics);
Expand Down Expand Up @@ -893,61 +918,121 @@ void nvme_show_lba_status_info(__u32 result)
const char *nvme_host_metadata_type_to_string(enum nvme_features_id fid,
__u8 type)
{
switch (fid) {
case NVME_FEAT_FID_ENH_CTRL_METADATA:
case NVME_FEAT_FID_CTRL_METADATA:
switch (type) {
case NVME_CTRL_METADATA_OS_CTRL_NAME:
return "Operating System Controller Name";
case NVME_CTRL_METADATA_OS_DRIVER_NAME:
return "Operating System Driver Name";
case NVME_CTRL_METADATA_OS_DRIVER_VER:
return "Operating System Driver Version";
case NVME_CTRL_METADATA_PRE_BOOT_CTRL_NAME:
return "Pre-boot Controller Name";
case NVME_CTRL_METADATA_PRE_BOOT_DRIVER_NAME:
return "Pre-boot Driver Name";
case NVME_CTRL_METADATA_PRE_BOOT_DRIVER_VER:
return "Pre-boot Driver Version";
case NVME_CTRL_METADATA_SYS_PROC_MODEL:
return "System Processor Model";
case NVME_CTRL_METADATA_CHIPSET_DRV_NAME:
return "Chipset Driver Name";
case NVME_CTRL_METADATA_CHIPSET_DRV_VERSION:
return "Chipset Driver Version";
case NVME_CTRL_METADATA_OS_NAME_AND_BUILD:
return "Operating System Name and Build";
case NVME_CTRL_METADATA_SYS_PROD_NAME:
return "System Product Name";
case NVME_CTRL_METADATA_FIRMWARE_VERSION:
return "Firmware Version";
case NVME_CTRL_METADATA_OS_DRIVER_FILENAME:
return "Operating System Driver Filename";
case NVME_CTRL_METADATA_DISPLAY_DRV_NAME:
return "Display Driver Name";
case NVME_CTRL_METADATA_DISPLAY_DRV_VERSION:
return "Display Driver Version";
case NVME_CTRL_METADATA_HOST_DET_FAIL_REC:
return "Host-Determined Failure Record";
default:
return "Unknown Controller Type";
}
case NVME_FEAT_FID_NS_METADATA:
switch (type) {
case NVME_NS_METADATA_OS_NS_NAME:
return "Operating System Namespace Name";
case NVME_NS_METADATA_PRE_BOOT_NS_NAME:
return "Pre-boot Namespace Name";
case NVME_NS_METADATA_OS_NS_QUAL_1:
return "Operating System Namespace Name Qualifier 1";
case NVME_NS_METADATA_OS_NS_QUAL_2:
return "Operating System Namespace Name Qualifier 2";
default:
return "Unknown Namespace Type";
}
default:
return "Unknown Feature";
}
switch (fid) {
case NVME_FEAT_FID_ENH_CTRL_METADATA:
case NVME_FEAT_FID_CTRL_METADATA:
switch (type) {
case NVME_CTRL_METADATA_OS_CTRL_NAME:
return "Operating System Controller Name";
case NVME_CTRL_METADATA_OS_DRIVER_NAME:
return "Operating System Driver Name";
case NVME_CTRL_METADATA_OS_DRIVER_VER:
return "Operating System Driver Version";
case NVME_CTRL_METADATA_PRE_BOOT_CTRL_NAME:
return "Pre-boot Controller Name";
case NVME_CTRL_METADATA_PRE_BOOT_DRIVER_NAME:
return "Pre-boot Driver Name";
case NVME_CTRL_METADATA_PRE_BOOT_DRIVER_VER:
return "Pre-boot Driver Version";
case NVME_CTRL_METADATA_SYS_PROC_MODEL:
return "System Processor Model";
case NVME_CTRL_METADATA_CHIPSET_DRV_NAME:
return "Chipset Driver Name";
case NVME_CTRL_METADATA_CHIPSET_DRV_VERSION:
return "Chipset Driver Version";
case NVME_CTRL_METADATA_OS_NAME_AND_BUILD:
return "Operating System Name and Build";
case NVME_CTRL_METADATA_SYS_PROD_NAME:
return "System Product Name";
case NVME_CTRL_METADATA_FIRMWARE_VERSION:
return "Firmware Version";
case NVME_CTRL_METADATA_OS_DRIVER_FILENAME:
return "Operating System Driver Filename";
case NVME_CTRL_METADATA_DISPLAY_DRV_NAME:
return "Display Driver Name";
case NVME_CTRL_METADATA_DISPLAY_DRV_VERSION:
return "Display Driver Version";
case NVME_CTRL_METADATA_HOST_DET_FAIL_REC:
return "Host-Determined Failure Record";
default:
return "Unknown Controller Type";
}
case NVME_FEAT_FID_NS_METADATA:
switch (type) {
case NVME_NS_METADATA_OS_NS_NAME:
return "Operating System Namespace Name";
case NVME_NS_METADATA_PRE_BOOT_NS_NAME:
return "Pre-boot Namespace Name";
case NVME_NS_METADATA_OS_NS_QUAL_1:
return "Operating System Namespace Name Qualifier 1";
case NVME_NS_METADATA_OS_NS_QUAL_2:
return "Operating System Namespace Name Qualifier 2";
default:
return "Unknown Namespace Type";
}
default:
return "Unknown Feature";
}
}

const char *nvme_register_symbol_to_string(int offset)
{
switch (offset) {
case NVME_REG_CAP:
return "cap";
case NVME_REG_VS:
return "version";
case NVME_REG_INTMS:
return "intms";
case NVME_REG_INTMC:
return "intmc";
case NVME_REG_CC:
return "cc";
case NVME_REG_CSTS:
return "csts";
case NVME_REG_NSSR:
return "nssr";
case NVME_REG_AQA:
return "aqa";
case NVME_REG_ASQ:
return "asq";
case NVME_REG_ACQ:
return "acq";
case NVME_REG_CMBLOC:
return "cmbloc";
case NVME_REG_CMBSZ:
return "cmbsz";
case NVME_REG_BPINFO:
return "bpinfo";
case NVME_REG_BPRSEL:
return "bprsel";
case NVME_REG_BPMBL:
return "bpmbl";
case NVME_REG_CMBMSC:
return "cmbmsc";
case NVME_REG_CMBSTS:
return "cmbsts";
case NVME_REG_CRTO:
return "crto";
case NVME_REG_PMRCAP:
return "pmrcap";
case NVME_REG_PMRCTL:
return "pmrctl";
case NVME_REG_PMRSTS:
return "pmrsts";
case NVME_REG_PMREBS:
return "pmrebs";
case NVME_REG_PMRSWTP:
return "pmrswtp";
case NVME_REG_PMRMSCL:
return "pmrmscl";
case NVME_REG_PMRMSCU:
return "pmrmscu";
default:
break;
}

return "unknown";
}

void nvme_feature_show(enum nvme_features_id fid, int sel, unsigned int result)
Expand Down
3 changes: 3 additions & 0 deletions nvme-print.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ struct print_ops {
void (*phy_rx_eom_log)(struct nvme_phy_rx_eom_log *log, __u16 controller);
void (*ctrl_list)(struct nvme_ctrl_list *ctrl_list);
void (*ctrl_registers)(void *bar, bool fabrics);
void (*single_register)(int offset, uint64_t value);
void (*directive)(__u8 type, __u8 oper, __u16 spec, __u32 nsid, __u32 result, void *buf, __u32 len);
void (*discovery_log)(struct nvmf_discovery_log *log, int numrec);
void (*effects_log_list)(struct list_head *list);
Expand Down Expand Up @@ -205,6 +206,7 @@ void nvme_show_media_unit_stat_log(struct nvme_media_unit_stat_log *mus,
void nvme_show_supported_cap_config_log(struct nvme_supported_cap_config_list_log *caplog,
enum nvme_print_flags flags);
void nvme_show_ctrl_registers(void *bar, bool fabrics, enum nvme_print_flags flags);
void nvme_show_single_register(void *bar, bool fabrics, int offset, enum nvme_print_flags flags);
void nvme_show_single_property(int offset, uint64_t prop, enum nvme_print_flags flags);
void nvme_show_id_ns_descs(void *data, unsigned nsid, enum nvme_print_flags flags);
void nvme_show_lba_status(struct nvme_lba_status *list, unsigned long len,
Expand Down Expand Up @@ -294,6 +296,7 @@ const char *nvme_register_pmr_hsts_to_string(__u8 hsts);
const char *nvme_register_pmr_pmrszu_to_string(__u8 pmrszu);
const char *nvme_register_szu_to_string(__u8 szu);
const char *nvme_register_to_string(int reg);
const char *nvme_register_symbol_to_string(int offset);
const char *nvme_resv_notif_to_string(__u8 type);
const char *nvme_select_to_string(int sel);
const char *nvme_sstat_status_to_string(__u16 status);
Expand Down
Loading

0 comments on commit 18fe326

Please sign in to comment.