123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- # SPDX-License-Identifier: GPL-2.0+
- #
- # Copyright (C) 2017 NXP Semiconductors
- # Copyright (C) 2017 Bin Meng <bmeng.cn@gmail.com>
- What is NVMe
- ============
- NVM Express (NVMe) is a register level interface that allows host software to
- communicate with a non-volatile memory subsystem. This interface is optimized
- for enterprise and client solid state drives, typically attached to the PCI
- express interface. It is a scalable host controller interface designed to
- address the needs of enterprise and client systems that utilize PCI express
- based solid state drives (SSD). The interface provides optimized command
- submission and completion paths. It includes support for parallel operation by
- supporting up to 64K I/O queues with up to 64K commands per I/O queue.
- The device is comprised of some number of controllers, where each controller
- is comprised of some number of namespaces, where each namespace is comprised
- of some number of logical blocks. A namespace is a quantity of non-volatile
- memory that is formatted into logical blocks. An NVMe namespace is equivalent
- to a SCSI LUN. Each namespace is operated as an independent "device".
- How it works
- ------------
- There is an NVMe uclass driver (driver name "nvme"), an NVMe host controller
- driver (driver name "nvme") and an NVMe namespace block driver (driver name
- "nvme-blk"). The host controller driver is supposed to probe the hardware and
- do necessary initialization to put the controller into a ready state at which
- it is able to scan all available namespaces attached to it. Scanning namespace
- is triggered by the NVMe uclass driver and the actual work is done in the NVMe
- namespace block driver.
- Status
- ------
- It only support basic block read/write functions in the NVMe driver.
- Config options
- --------------
- CONFIG_NVME Enable NVMe device support
- CONFIG_CMD_NVME Enable basic NVMe commands
- Usage in U-Boot
- ---------------
- To use an NVMe hard disk from U-Boot shell, a 'nvme scan' command needs to
- be executed for all NVMe hard disks attached to the NVMe controller to be
- identified.
- To list all of the NVMe hard disks, try:
- => nvme info
- Device 0: Vendor: 0x8086 Rev: 8DV10131 Prod: CVFT535600LS400BGN
- Type: Hard Disk
- Capacity: 381554.0 MB = 372.6 GB (781422768 x 512)
- and print out detailed information for controller and namespaces via:
- => nvme detail
- Raw block read/write to can be done via the 'nvme read/write' commands:
- => nvme read a0000000 0 11000
- => tftp 80000000 /tftpboot/kernel.itb
- => nvme write 80000000 0 11000
- Of course, file system command can be used on the NVMe hard disk as well:
- => fatls nvme 0:1
- 32376967 kernel.itb
- 22929408 100m
- 2 file(s), 0 dir(s)
- => fatload nvme 0:1 a0000000 /kernel.itb
- => bootm a0000000
- Testing NVMe with QEMU x86
- --------------------------
- QEMU supports NVMe emulation and we can test NVMe driver with QEMU x86 running
- U-Boot. Please see README.x86 for how to build u-boot.rom image for QEMU x86.
- Example command line to call QEMU x86 below with emulated NVMe device:
- $ ./qemu-system-i386 -drive file=nvme.img,if=none,id=drv0 -device nvme,drive=drv0,serial=QEMUNVME0001 -bios u-boot.rom
|