Skip to content

Commit 71d9a9a

Browse files
committed
nvme: Add support for get-reg command to output single register
Note: Currently only stdout print supported. Signed-off-by: Tokunori Ikegami <ikegami.t@gmail.com>
1 parent b5a741b commit 71d9a9a

6 files changed

+343
-59
lines changed

nvme-builtin.h

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ COMMAND_LIST(
8989
ENTRY("subsystem-reset", "Resets the subsystem", subsystem_reset)
9090
ENTRY("ns-rescan", "Rescans the NVME namespaces", ns_rescan)
9191
ENTRY("show-regs", "Shows the controller registers or properties. Requires character device", show_registers)
92+
ENTRY("get-reg", "Get a register and show the resulting value", get_register)
9293
ENTRY("discover", "Discover NVMeoF subsystems", discover_cmd)
9394
ENTRY("connect-all", "Discover and Connect to NVMeoF subsystems", connect_all_cmd)
9495
ENTRY("connect", "Connect to NVMeoF subsystem", connect_cmd)

nvme-print-stdout.c

+102
Original file line numberDiff line numberDiff line change
@@ -1427,6 +1427,107 @@ static void stdout_registers_pmrmscu(uint32_t pmrmscu)
14271427
pmrmscu);
14281428
}
14291429

1430+
static void stdout_single_register(int offset, uint64_t value64)
1431+
{
1432+
bool human = stdout_print_ops.flags & VERBOSE;
1433+
uint32_t value32 = (uint32_t)value64;
1434+
1435+
if (human)
1436+
printf("%s: ", nvme_register_to_string(offset));
1437+
else
1438+
printf("register: 0x%02x (%s), value: ", offset, nvme_register_to_string(offset));
1439+
1440+
if (nvme_is_64bit_reg(offset))
1441+
printf("%"PRIx64"\n", value64);
1442+
else
1443+
printf("%x\n", value32);
1444+
1445+
if (!human)
1446+
return;
1447+
1448+
switch (offset) {
1449+
case NVME_REG_CAP:
1450+
stdout_registers_cap((struct nvme_bar_cap *)&value64);
1451+
break;
1452+
case NVME_REG_VS:
1453+
stdout_registers_version(value32);
1454+
break;
1455+
case NVME_REG_INTMS:
1456+
printf("\tInterrupt Vector Mask Set (IVMS): %x\n\n", value32);
1457+
break;
1458+
case NVME_REG_INTMC:
1459+
printf("\tInterrupt Vector Mask Clear (IVMC): %x\n\n", value32);
1460+
break;
1461+
case NVME_REG_CC:
1462+
stdout_registers_cc(value32);
1463+
break;
1464+
case NVME_REG_CSTS:
1465+
stdout_registers_csts(value32);
1466+
break;
1467+
case NVME_REG_NSSR:
1468+
printf("\tNVM Subsystem Reset Control (NSSRC): %u\n\n", value32);
1469+
break;
1470+
case NVME_REG_AQA:
1471+
stdout_registers_aqa(value32);
1472+
break;
1473+
case NVME_REG_ASQ:
1474+
printf("\tAdmin Submission Queue Base (ASQB): %"PRIx64"\n\n", value64);
1475+
break;
1476+
case NVME_REG_ACQ:
1477+
printf("\tAdmin Completion Queue Base (ACQB): %"PRIx64"\n\n", value64);
1478+
break;
1479+
case NVME_REG_CMBLOC:
1480+
stdout_registers_cmbloc(value32, 1);
1481+
break;
1482+
case NVME_REG_CMBSZ:
1483+
stdout_registers_cmbsz(value32);
1484+
break;
1485+
case NVME_REG_BPINFO:
1486+
stdout_registers_bpinfo(value32);
1487+
break;
1488+
case NVME_REG_BPRSEL:
1489+
stdout_registers_bprsel(value32);
1490+
break;
1491+
case NVME_REG_BPMBL:
1492+
stdout_registers_bpmbl(value64);
1493+
break;
1494+
case NVME_REG_CMBMSC:
1495+
stdout_registers_cmbmsc(value64);
1496+
break;
1497+
case NVME_REG_CMBSTS:
1498+
stdout_registers_cmbsts(value32);
1499+
break;
1500+
case NVME_REG_CRTO:
1501+
stdout_registers_crto(value32);
1502+
break;
1503+
case NVME_REG_PMRCAP:
1504+
stdout_registers_pmrcap(value32);
1505+
break;
1506+
case NVME_REG_PMRCTL:
1507+
stdout_registers_pmrctl(value32);
1508+
break;
1509+
case NVME_REG_PMRSTS:
1510+
stdout_registers_pmrsts(value32, 1);
1511+
break;
1512+
case NVME_REG_PMREBS:
1513+
stdout_registers_pmrebs(value32);
1514+
break;
1515+
case NVME_REG_PMRSWTP:
1516+
stdout_registers_pmrswtp(value32);
1517+
break;
1518+
case NVME_REG_PMRMSCL:
1519+
stdout_registers_pmrmscl(value32);
1520+
break;
1521+
case NVME_REG_PMRMSCU:
1522+
stdout_registers_pmrmscu(value32);
1523+
break;
1524+
default:
1525+
printf("unknown register: 0x%02x (%s), value: %"PRIx64"\n",
1526+
offset, nvme_register_to_string(offset), value64);
1527+
break;
1528+
}
1529+
}
1530+
14301531
void stdout_ctrl_registers(void *bar, bool fabrics)
14311532
{
14321533
uint64_t cap, asq, acq, bpmbl, cmbmsc;
@@ -5092,6 +5193,7 @@ static struct print_ops stdout_print_ops = {
50925193
.phy_rx_eom_log = stdout_phy_rx_eom_log,
50935194
.ctrl_list = stdout_list_ctrl,
50945195
.ctrl_registers = stdout_ctrl_registers,
5196+
.single_register = stdout_single_register,
50955197
.directive = stdout_directive_show,
50965198
.discovery_log = stdout_discovery_log,
50975199
.effects_log_list = stdout_effects_log_pages,

nvme-print.c

+140-55
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,31 @@ const char *nvme_register_pmr_pmrszu_to_string(__u8 pmrszu)
362362
}
363363
}
364364

365+
void nvme_show_single_register(void *bar, bool fabrics, int offset, enum nvme_print_flags flags)
366+
{
367+
uint64_t value;
368+
369+
if (nvme_is_64bit_reg(offset))
370+
value = mmio_read64(bar + offset);
371+
else
372+
value = mmio_read32(bar + offset);
373+
374+
if (!nvme_is_fabrics_reg(offset)) {
375+
if (fabrics) {
376+
printf("register: 0x%02x (%s) not fabrics\n", offset,
377+
nvme_register_to_string(offset));
378+
return;
379+
}
380+
if (value == 0xffffffff) {
381+
printf("register: 0x%02x (%s), value: %"PRIx64" not valid\n", offset,
382+
nvme_register_to_string(offset), value);
383+
return;
384+
}
385+
}
386+
387+
nvme_print(single_register, flags, offset, value);
388+
}
389+
365390
void nvme_show_ctrl_registers(void *bar, bool fabrics, enum nvme_print_flags flags)
366391
{
367392
nvme_print(ctrl_registers, flags, bar, fabrics);
@@ -893,61 +918,121 @@ void nvme_show_lba_status_info(__u32 result)
893918
const char *nvme_host_metadata_type_to_string(enum nvme_features_id fid,
894919
__u8 type)
895920
{
896-
switch (fid) {
897-
case NVME_FEAT_FID_ENH_CTRL_METADATA:
898-
case NVME_FEAT_FID_CTRL_METADATA:
899-
switch (type) {
900-
case NVME_CTRL_METADATA_OS_CTRL_NAME:
901-
return "Operating System Controller Name";
902-
case NVME_CTRL_METADATA_OS_DRIVER_NAME:
903-
return "Operating System Driver Name";
904-
case NVME_CTRL_METADATA_OS_DRIVER_VER:
905-
return "Operating System Driver Version";
906-
case NVME_CTRL_METADATA_PRE_BOOT_CTRL_NAME:
907-
return "Pre-boot Controller Name";
908-
case NVME_CTRL_METADATA_PRE_BOOT_DRIVER_NAME:
909-
return "Pre-boot Driver Name";
910-
case NVME_CTRL_METADATA_PRE_BOOT_DRIVER_VER:
911-
return "Pre-boot Driver Version";
912-
case NVME_CTRL_METADATA_SYS_PROC_MODEL:
913-
return "System Processor Model";
914-
case NVME_CTRL_METADATA_CHIPSET_DRV_NAME:
915-
return "Chipset Driver Name";
916-
case NVME_CTRL_METADATA_CHIPSET_DRV_VERSION:
917-
return "Chipset Driver Version";
918-
case NVME_CTRL_METADATA_OS_NAME_AND_BUILD:
919-
return "Operating System Name and Build";
920-
case NVME_CTRL_METADATA_SYS_PROD_NAME:
921-
return "System Product Name";
922-
case NVME_CTRL_METADATA_FIRMWARE_VERSION:
923-
return "Firmware Version";
924-
case NVME_CTRL_METADATA_OS_DRIVER_FILENAME:
925-
return "Operating System Driver Filename";
926-
case NVME_CTRL_METADATA_DISPLAY_DRV_NAME:
927-
return "Display Driver Name";
928-
case NVME_CTRL_METADATA_DISPLAY_DRV_VERSION:
929-
return "Display Driver Version";
930-
case NVME_CTRL_METADATA_HOST_DET_FAIL_REC:
931-
return "Host-Determined Failure Record";
932-
default:
933-
return "Unknown Controller Type";
934-
}
935-
case NVME_FEAT_FID_NS_METADATA:
936-
switch (type) {
937-
case NVME_NS_METADATA_OS_NS_NAME:
938-
return "Operating System Namespace Name";
939-
case NVME_NS_METADATA_PRE_BOOT_NS_NAME:
940-
return "Pre-boot Namespace Name";
941-
case NVME_NS_METADATA_OS_NS_QUAL_1:
942-
return "Operating System Namespace Name Qualifier 1";
943-
case NVME_NS_METADATA_OS_NS_QUAL_2:
944-
return "Operating System Namespace Name Qualifier 2";
945-
default:
946-
return "Unknown Namespace Type";
947-
}
948-
default:
949-
return "Unknown Feature";
950-
}
921+
switch (fid) {
922+
case NVME_FEAT_FID_ENH_CTRL_METADATA:
923+
case NVME_FEAT_FID_CTRL_METADATA:
924+
switch (type) {
925+
case NVME_CTRL_METADATA_OS_CTRL_NAME:
926+
return "Operating System Controller Name";
927+
case NVME_CTRL_METADATA_OS_DRIVER_NAME:
928+
return "Operating System Driver Name";
929+
case NVME_CTRL_METADATA_OS_DRIVER_VER:
930+
return "Operating System Driver Version";
931+
case NVME_CTRL_METADATA_PRE_BOOT_CTRL_NAME:
932+
return "Pre-boot Controller Name";
933+
case NVME_CTRL_METADATA_PRE_BOOT_DRIVER_NAME:
934+
return "Pre-boot Driver Name";
935+
case NVME_CTRL_METADATA_PRE_BOOT_DRIVER_VER:
936+
return "Pre-boot Driver Version";
937+
case NVME_CTRL_METADATA_SYS_PROC_MODEL:
938+
return "System Processor Model";
939+
case NVME_CTRL_METADATA_CHIPSET_DRV_NAME:
940+
return "Chipset Driver Name";
941+
case NVME_CTRL_METADATA_CHIPSET_DRV_VERSION:
942+
return "Chipset Driver Version";
943+
case NVME_CTRL_METADATA_OS_NAME_AND_BUILD:
944+
return "Operating System Name and Build";
945+
case NVME_CTRL_METADATA_SYS_PROD_NAME:
946+
return "System Product Name";
947+
case NVME_CTRL_METADATA_FIRMWARE_VERSION:
948+
return "Firmware Version";
949+
case NVME_CTRL_METADATA_OS_DRIVER_FILENAME:
950+
return "Operating System Driver Filename";
951+
case NVME_CTRL_METADATA_DISPLAY_DRV_NAME:
952+
return "Display Driver Name";
953+
case NVME_CTRL_METADATA_DISPLAY_DRV_VERSION:
954+
return "Display Driver Version";
955+
case NVME_CTRL_METADATA_HOST_DET_FAIL_REC:
956+
return "Host-Determined Failure Record";
957+
default:
958+
return "Unknown Controller Type";
959+
}
960+
case NVME_FEAT_FID_NS_METADATA:
961+
switch (type) {
962+
case NVME_NS_METADATA_OS_NS_NAME:
963+
return "Operating System Namespace Name";
964+
case NVME_NS_METADATA_PRE_BOOT_NS_NAME:
965+
return "Pre-boot Namespace Name";
966+
case NVME_NS_METADATA_OS_NS_QUAL_1:
967+
return "Operating System Namespace Name Qualifier 1";
968+
case NVME_NS_METADATA_OS_NS_QUAL_2:
969+
return "Operating System Namespace Name Qualifier 2";
970+
default:
971+
return "Unknown Namespace Type";
972+
}
973+
default:
974+
return "Unknown Feature";
975+
}
976+
}
977+
978+
const char *nvme_register_symbol_to_string(int offset)
979+
{
980+
switch (offset) {
981+
case NVME_REG_CAP:
982+
return "cap";
983+
case NVME_REG_VS:
984+
return "version";
985+
case NVME_REG_INTMS:
986+
return "intms";
987+
case NVME_REG_INTMC:
988+
return "intmc";
989+
case NVME_REG_CC:
990+
return "cc";
991+
case NVME_REG_CSTS:
992+
return "csts";
993+
case NVME_REG_NSSR:
994+
return "nssr";
995+
case NVME_REG_AQA:
996+
return "aqa";
997+
case NVME_REG_ASQ:
998+
return "asq";
999+
case NVME_REG_ACQ:
1000+
return "acq";
1001+
case NVME_REG_CMBLOC:
1002+
return "cmbloc";
1003+
case NVME_REG_CMBSZ:
1004+
return "cmbsz";
1005+
case NVME_REG_BPINFO:
1006+
return "bpinfo";
1007+
case NVME_REG_BPRSEL:
1008+
return "bprsel";
1009+
case NVME_REG_BPMBL:
1010+
return "bpmbl";
1011+
case NVME_REG_CMBMSC:
1012+
return "cmbmsc";
1013+
case NVME_REG_CMBSTS:
1014+
return "cmbsts";
1015+
case NVME_REG_CRTO:
1016+
return "crto";
1017+
case NVME_REG_PMRCAP:
1018+
return "pmrcap";
1019+
case NVME_REG_PMRCTL:
1020+
return "pmrctl";
1021+
case NVME_REG_PMRSTS:
1022+
return "pmrsts";
1023+
case NVME_REG_PMREBS:
1024+
return "pmrebs";
1025+
case NVME_REG_PMRSWTP:
1026+
return "pmrswtp";
1027+
case NVME_REG_PMRMSCL:
1028+
return "pmrmscl";
1029+
case NVME_REG_PMRMSCU:
1030+
return "pmrmscu";
1031+
default:
1032+
break;
1033+
}
1034+
1035+
return "unknown";
9511036
}
9521037

9531038
void nvme_feature_show(enum nvme_features_id fid, int sel, unsigned int result)

nvme-print.h

+3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ struct print_ops {
2626
void (*phy_rx_eom_log)(struct nvme_phy_rx_eom_log *log, __u16 controller);
2727
void (*ctrl_list)(struct nvme_ctrl_list *ctrl_list);
2828
void (*ctrl_registers)(void *bar, bool fabrics);
29+
void (*single_register)(int offset, uint64_t value);
2930
void (*directive)(__u8 type, __u8 oper, __u16 spec, __u32 nsid, __u32 result, void *buf, __u32 len);
3031
void (*discovery_log)(struct nvmf_discovery_log *log, int numrec);
3132
void (*effects_log_list)(struct list_head *list);
@@ -205,6 +206,7 @@ void nvme_show_media_unit_stat_log(struct nvme_media_unit_stat_log *mus,
205206
void nvme_show_supported_cap_config_log(struct nvme_supported_cap_config_list_log *caplog,
206207
enum nvme_print_flags flags);
207208
void nvme_show_ctrl_registers(void *bar, bool fabrics, enum nvme_print_flags flags);
209+
void nvme_show_single_register(void *bar, bool fabrics, int offset, enum nvme_print_flags flags);
208210
void nvme_show_single_property(int offset, uint64_t prop, enum nvme_print_flags flags);
209211
void nvme_show_id_ns_descs(void *data, unsigned nsid, enum nvme_print_flags flags);
210212
void nvme_show_lba_status(struct nvme_lba_status *list, unsigned long len,
@@ -294,6 +296,7 @@ const char *nvme_register_pmr_hsts_to_string(__u8 hsts);
294296
const char *nvme_register_pmr_pmrszu_to_string(__u8 pmrszu);
295297
const char *nvme_register_szu_to_string(__u8 szu);
296298
const char *nvme_register_to_string(int reg);
299+
const char *nvme_register_symbol_to_string(int offset);
297300
const char *nvme_resv_notif_to_string(__u8 type);
298301
const char *nvme_select_to_string(int sel);
299302
const char *nvme_sstat_status_to_string(__u16 status);

0 commit comments

Comments
 (0)