Skip to content

Commit

Permalink
nvme: Add support for get-reg and set-reg commands
Browse files Browse the repository at this point in the history
The get-reg command is to output single register.
The set-reg command is to write nvme register.

Signed-off-by: Tokunori Ikegami <[email protected]>
  • Loading branch information
ikegami-t committed Feb 10, 2024
1 parent 3def2b7 commit a830385
Show file tree
Hide file tree
Showing 17 changed files with 1,678 additions and 444 deletions.
168 changes: 168 additions & 0 deletions Documentation/nvme-get-reg.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
nvme-get-reg(1)
===============

NAME
----
nvme-get-reg - Read and show the defined NVMe controller register

SYNOPSIS
--------
[verse]
'nvme get-reg' <device> [--offset=<offset>, -O <offset>] [--human-readable | -H]
[--cap | -c] [--vs | -V] [--cmbloc | -m] [--cmbsz | -M]
[--bpinfo | -b] [--cmbsts | -S] [--cmbebs | -E]
[--cmbswtp | -W] [--crto | -r] [--pmrcap | -P]
[--pmrsts | -t] [--pmrebs | -e] [--pmrswtp | -w]
[--intms | -i] [--intmc | -I] [--cc | -C] [--csts | -T]
[--nssr | -n] [--aqa | -a] [--asq | -A] [--acq | -q]
[--bprsel | -B] [--bpmbl | -p] [--cmbmsc | -s]
[--nssd | -N] [--pmrctl | -R] [--pmrmscl | -l]
[--pmrmscu | -u]
[--output-format=<fmt> | -o <fmt>] [--verbose | -v]

DESCRIPTION
-----------
Read and show the defined NVMe controller register.

OPTIONS
-------
-O <offset>::
--offset=<offset>::
offset of the requested register

-H::
--human-readable::
show register in readable format

-c::
--cap::
CAP=0x0 register offset

-V::
--vs::
VS=0x8 register offset

-m::
--cmbloc::
CMBLOC=0x38 register offset

-M::
--cmbsz::
CMBSZ=0x3c register offset

-b::
--bpinfo::
BPINFO=0x40 register offset

-S::
--cmbsts::
CMBSTS=0x58 register offset

-E::
--cmbebs::
CMBEBS=0x5c register offset

-W::
--cmbswtp::
CMBSWTP=0x60 register offset

-r::
--crto::
CRTO=0x68 register offset

-P::
--pmrcap::
PMRCAP=0xe00 register offset

-t::
--pmrsts::
PMRSTS=0xe08 register offset

-e::
--pmrebs::
PMREBS=0xe0c register offset

-w::
--pmrswtp::
PMRSWTP=0xe10 register offset

-i::
--intms::
INTMS=0xc register offset

-I::
--intmc::
INTMC=0x10 register offset

-C::
--cc::
CC=0x14 register offset

-T::
--csts::
CSTS=0x1c register offset

-n::
--nssr::
NSSR=0x20 register offset

-a::
--aqa::
AQA=0x24 register offset

-A::
--asq::
ASQ=0x28 register offset

-q::
--acq::
ACQ=0x30 register offset

-B::
--bprsel::
BPRSEL=0x44 register offset

-p::
--bpmbl::
BPMBL=0x48 register offset

-s::
--cmbmsc::
CMBMSC=0x50 register offset

-N::
--nssd::
NSSD=0x64 register offset

-R::
--pmrctl::
PMRCTL=0xe04 register offset

-l::
--pmrmscl::
PMRMSCL=0xe14 register offset

-u::
--pmrmscu::
PMRMSCU=0xe18 register offset

-o <fmt>::
--output-format=<fmt>::
Set the reporting format to 'normal', 'json' or 'binary'. Only one
output format can be used at a time.

-v::
--verbose::
Increase the information detail in the output.

EXAMPLES
--------
* The following will run the get-reg command with offset 0
+
------------
# nvme get-reg /dev/nvme0 --offset=0x0 --human-readable
------------

NVME
----
Part of the nvme-user suite.
Empty file modified Documentation/nvme-id-ns-granularity.txt
100755 → 100644
Empty file.
Empty file modified Documentation/nvme-id-uuid.txt
100755 → 100644
Empty file.
Empty file modified Documentation/nvme-list-secondary.txt
100755 → 100644
Empty file.
Empty file modified Documentation/nvme-nvme-mi-recv.txt
100755 → 100644
Empty file.
Empty file modified Documentation/nvme-nvme-mi-send.txt
100755 → 100644
Empty file.
4 changes: 2 additions & 2 deletions Documentation/nvme-set-property.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ OPTIONS
--offset::
The offset of the property.

-V::
--value:
-V <val>::
--value=<val>::
The value of the property to be set.

-o <fmt>::
Expand Down
116 changes: 116 additions & 0 deletions Documentation/nvme-set-reg.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
nvme-set-reg(1)
===============

NAME
----
nvme-set-reg - Writes and shows the defined NVMe controller register

SYNOPSIS
--------
[verse]
'nvme set-reg' <device> [--offset=<offset>, -O <offset>]
[--value=<val> | -V <val>] [--mmio32 | -M]
[--intms=<val> | -i] [--intmc=<val> | -I <val>]
[--cc=<val> | -C <val>] [--csts=<val> | -T <val>]
[--nssr=<val> | -n <val>] [--aqa=<val> | -a <val>]
[--asq=<val> | -A <val>] [--acq=<val> | -q <val>]
[--bprsel=<val> | -B <val>] [--bpmbl=<val> | -p <val>]
[--cmbmsc=<val> | -s <val>] [--nssd=<val> | -N <val>]
[--pmrctl=<val> | -R <val>] [--pmrmscl=<val> | -l <val>]
[--pmrmscu=<val> | -u <val>]
[--output-format=<fmt> | -o <fmt>] [--verbose | -v]

DESCRIPTION
-----------
Writes and shows the defined NVMe controller register.

OPTIONS
-------
-O <offset>::
--offset=<offset>::
offset of the requested register

--mmio32::
-M::
Access 64-bit registers as 2 32-bit

-i <val>::
--intms=<val>::
INTMS=0xc register offset

-I <val>::
--intmc=<val>::
INTMC=0x10 register offset

-C <val>::
--cc=<val>::
CC=0x14 register offset

-T <val>::
--csts=<val>::
CSTS=0x1c register offset

-n <val>::
--nssr=<val>::
NSSR=0x20 register offset

-a <val>::
--aqa=<val>::
AQA=0x24 register offset

-A <val>::
--asq=<val>::
ASQ=0x28 register offset

-q <val>::
--acq=<val>::
ACQ=0x30 register offset

-B <val>::
--bprsel=<val>::
BPRSEL=0x44 register offset

-p <val>::
--bpmbl=<val>::
BPMBL=0x48 register offset

-s <val>::
--cmbmsc=<val>::
CMBMSC=0x50 register offset

-N <val>::
--nssd=<val>::
NSSD=0x64 register offset

-R <val>::
--pmrctl=<val>::
PMRCTL=0xe04 register offset

-l <val>::
--pmrmscl=<val>::
PMRMSCL=0xe14 register offset

-u <val>::
--pmrmscu=<val>::
PMRMSCU=0xe18 register offset

-o <fmt>::
--output-format=<fmt>::
Set the reporting format to 'normal', 'json' or 'binary'. Only one
output format can be used at a time.

-v::
--verbose::
Increase the information detail in the output.

EXAMPLES
--------
* The following will run the get-reg command with offset 0
+
------------
# nvme get-reg /dev/nvme0 --offset=0x0 --human-readable
------------

NVME
----
Part of the nvme-user suite.
Empty file modified Documentation/nvme-virt-mgmt.txt
100755 → 100644
Empty file.
21 changes: 21 additions & 0 deletions common.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#define _COMMON_H

#include <string.h>
#include <stdbool.h>

#include "ccan/endian/endian.h"

Expand Down Expand Up @@ -35,4 +36,24 @@ static inline uint64_t mmio_read64(void *addr)
return ((uint64_t)high << 32) | low;
}

static inline void mmio_write32(void *addr, uint32_t value)
{
leint32_t *p = addr;

*p = cpu_to_le32(value);
}

/* Access 64-bit registers as 2 32-bit if write32 flag set; Some devices fail 64-bit MMIO. */
static inline void mmio_write64(void *addr, uint64_t value, bool write32)
{
uint64_t *p = addr;

if (write32) {
mmio_write32(addr, value);
mmio_write32((uint32_t *)addr + 1, value >> 32);
return;
}

*p = cpu_to_le64(value);
}
#endif
2 changes: 2 additions & 0 deletions nvme-builtin.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ 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("set-reg", "Set a register and show the resulting value", set_register)
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
Loading

0 comments on commit a830385

Please sign in to comment.