#
# 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 list
  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 info

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
