#
# Copyright (C) 2017 NXP Semiconductors
# Copyright (C) 2017 Bin Meng <bmeng.cn@gmail.com>
#
# SPDX-License-Identifier:	GPL-2.0+
#

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
