NVMe Support
1. What is NVMe
NVM Express (NVMe) 是一种寄存器级接口,允许主机软件与非易失性内存子系统进行通信。 该接口针对企业和客户端固态驱动器进行了优化,通常连接到 PCI Express 接口。 它是一个可扩展的主机控制器接口,旨在满足使用基于 PCI Express 的固态硬盘 (SSD) 的企业和客户端系统的需求。 该界面提供优化的命令提交和完成路径。 它支持并行操作,支持最多 64K I/O 队列,每个 I/O 队列最多支持 64K 命令。
该设备由一定数量的控制器组成,其中每个控制器由一定数量的命名空间组成,其中每个命名空间由一定数量的逻辑块组成。 命名空间是格式化为逻辑块的一定数量的非易失性存储器。 NVMe 命名空间相当于 SCSI LUN。 每个命名空间都作为一个独立的“设备”进行操作。
2. How it works
有一个 NVMe uclass 驱动程序(驱动程序名称“nvme”)、一个 NVMe 主机控制器驱动程序(驱动程序名称“nvme”)和一个 NVMe 命名空间块驱动程序(驱动程序名称“nvme_blk”)。 主机控制器驱动程序应该探测硬件并进行必要的初始化,以使控制器进入就绪状态,在该状态下它能够扫描附加到它的所有可用命名空间。 扫描命名空间由 NVMe uclass 驱动程序触发,实际工作在 NVMe 命名空间块驱动程序中完成。
3. Status
它仅支持NVMe驱动程序中的基本块读/写功能。
4. Config options
CONFIG_NVME 启用 NVMe 设备支持 CONFIG_NVME_PCI 启用 PCIe NVMe 设备支持 CONFIG_CMD_NVME 启用基本 NVMe 命令。
5. Usage in U-Boot
要从 U-Boot shell 使用 NVMe 硬盘,需要执行“nvme scan”命令以识别连接到 NVMe 控制器的所有 NVMe 硬盘。
要列出所有 NVMe 硬盘,请尝试:
=> nvme info
Device 0: Vendor: 0x8086 Rev: 8DV10131 Prod: CVFT535600LS400BGN
Type: Hard Disk
Capacity: 381554.0 MB = 372.6 GB (781422768 x 512)
并通过以下方式打印控制器和命名空间的详细信息:
=> nvme detail
原始块读/写可以通过“nvme读/写”命令完成:
=> nvme read a0000000 0 11000
=> tftp 80000000 /tftpboot/kernel.itb
=> nvme write 80000000 0 11000
当然,NVMe硬盘也可以使用文件系统命令:
=> fatls nvme 0:1
32376967 kernel.itb
22929408 100m
2 file(s), 0 dir(s)
=> fatload nvme 0:1 a0000000 /kernel.itb
=> bootm a0000000
6. Testing NVMe with QEMU x86
QEMU 支持 NVMe 仿真,我们可以使用运行 U-Boot 的 QEMU x86 来测试 NVMe 驱动程序。 请参阅 README.x86 了解如何为 QEMU x86 构建 u-boot.rom 映像。
下面使用模拟 NVMe 设备调用 QEMU x86 的示例命令行:
$ ./qemu-system-i386 -drive file=nvme.img,if=none,id=drv0 -device nvme,drive=drv0,serial=QEMUNVME0001 -bios u-boot.rom