]>
Commit | Line | Data |
---|---|---|
982388ea ZZ |
1 | # |
2 | # Copyright (C) 2017 NXP Semiconductors | |
3 | # Copyright (C) 2017 Bin Meng <[email protected]> | |
4 | # | |
5 | # SPDX-License-Identifier: GPL-2.0+ | |
6 | # | |
7 | ||
8 | What is NVMe | |
9 | ============ | |
10 | ||
11 | NVM Express (NVMe) is a register level interface that allows host software to | |
12 | communicate with a non-volatile memory subsystem. This interface is optimized | |
13 | for enterprise and client solid state drives, typically attached to the PCI | |
14 | express interface. It is a scalable host controller interface designed to | |
15 | address the needs of enterprise and client systems that utilize PCI express | |
16 | based solid state drives (SSD). The interface provides optimized command | |
17 | submission and completion paths. It includes support for parallel operation by | |
18 | supporting up to 64K I/O queues with up to 64K commands per I/O queue. | |
19 | ||
20 | The device is comprised of some number of controllers, where each controller | |
21 | is comprised of some number of namespaces, where each namespace is comprised | |
22 | of some number of logical blocks. A namespace is a quantity of non-volatile | |
23 | memory that is formatted into logical blocks. An NVMe namespace is equivalent | |
24 | to a SCSI LUN. Each namespace is operated as an independent "device". | |
25 | ||
26 | How it works | |
27 | ------------ | |
28 | There is an NVMe uclass driver (driver name "nvme"), an NVMe host controller | |
29 | driver (driver name "nvme") and an NVMe namespace block driver (driver name | |
30 | "nvme-blk"). The host controller driver is supposed to probe the hardware and | |
31 | do necessary initialization to put the controller into a ready state at which | |
32 | it is able to scan all available namespaces attached to it. Scanning namespace | |
33 | is triggered by the NVMe uclass driver and the actual work is done in the NVMe | |
34 | namespace block driver. | |
35 | ||
36 | Status | |
37 | ------ | |
38 | It only support basic block read/write functions in the NVMe driver. | |
39 | ||
40 | Config options | |
41 | -------------- | |
42 | CONFIG_NVME Enable NVMe device support | |
0adc38be ZZ |
43 | CONFIG_CMD_NVME Enable basic NVMe commands |
44 | ||
45 | Usage in U-Boot | |
46 | --------------- | |
47 | To use an NVMe hard disk from U-Boot shell, a 'nvme scan' command needs to | |
48 | be executed for all NVMe hard disks attached to the NVMe controller to be | |
49 | identified. | |
50 | ||
51 | To list all of the NVMe hard disks, try: | |
52 | ||
fceadc14 | 53 | => nvme info |
0adc38be ZZ |
54 | Device 0: Vendor: 0x8086 Rev: 8DV10131 Prod: CVFT535600LS400BGN |
55 | Type: Hard Disk | |
56 | Capacity: 381554.0 MB = 372.6 GB (781422768 x 512) | |
57 | ||
58 | and print out detailed information for controller and namespaces via: | |
59 | ||
fceadc14 | 60 | => nvme detail |
0adc38be ZZ |
61 | |
62 | Raw block read/write to can be done via the 'nvme read/write' commands: | |
63 | ||
64 | => nvme read a0000000 0 11000 | |
65 | ||
66 | => tftp 80000000 /tftpboot/kernel.itb | |
67 | => nvme write 80000000 0 11000 | |
68 | ||
69 | Of course, file system command can be used on the NVMe hard disk as well: | |
70 | ||
71 | => fatls nvme 0:1 | |
72 | 32376967 kernel.itb | |
73 | 22929408 100m | |
74 | ||
75 | 2 file(s), 0 dir(s) | |
76 | ||
77 | => fatload nvme 0:1 a0000000 /kernel.itb | |
78 | => bootm a0000000 | |
7088a365 BM |
79 | |
80 | Testing NVMe with QEMU x86 | |
81 | -------------------------- | |
82 | QEMU supports NVMe emulation and we can test NVMe driver with QEMU x86 running | |
83 | U-Boot. Please see README.x86 for how to build u-boot.rom image for QEMU x86. | |
84 | ||
85 | Example command line to call QEMU x86 below with emulated NVMe device: | |
86 | $ ./qemu-system-i386 -drive file=nvme.img,if=none,id=drv0 -device nvme,drive=drv0,serial=QEMUNVME0001 -bios u-boot.rom |