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