UFS 3.1协议命令集--SCSI命令
UFS 3.1协议命令集--SCSI命令
0.前言
记录一下UFS 3.1相关内容。
1.UFS协议栈
UFS协议和网络协议类似,也包含了应用层、传输层、数据链路层、物理层。协议栈中主要涉及到三种命令集合,第一种是用于设备管理(device manager)的query
命令,其中比较重要的就是用于配置device各个逻辑单元的容量及其相关属性(configuration LU)。第二种是实现UFS设备功能的命令,协议中称其为 UFS Command Set(UCS)。按照JEDEC的想法,UCS以简化版本的SCSI
命令为基础的情况下,使用 UFS Native Command Set扩展UFS协议支持的命令与功能。但是到目前为止 UFS协议自定的命令集合还没有被提出,所以目前可以将UCS等价为SCSI命令集。此外还有一种用于任务管理(task manager)的命令被称为TM
命令,主机使用TM命令管理已经下发的SCSI命令。
2.SCSI命令作用
2.1 查询类
INQUIRY
inquiry命令用于查询device的一些关键信息,例如设备制造商,产品名称,FW版本号等,通常host上电启动时会下发inquiry命令获取设备信息,针对不同厂商的器件可能会使用不同的配置项。
REPORT LUNS
report luns命令用于像host上报当前device中使能的normal lun的lun ID,以及device中支持的well know lun 的lun ID。
READ CAPACITY
读取指定逻辑单元的容量和部分配置信息。
REQUEST SENSE
request sense命令用于查询指定的lun是否存在sense data,如果有的话会通过data in UPIU返回给主机。同时request sense命令可以清除device复位产生的UAC
标记,并且命令不会报失败(可能这才是host发request sense的主要目的)。
TEST UNIT READY
test unit ready命令主要用于测试指定逻辑单元是否能够响应命令,但是实际使用场景不多。
SEND DIAGNOSTIC
host下发send diagnostic命令让device执行指定的自检操作。但是host并不能判断device是否真的正确的执行了自检,换句话说host无法感知自检结果,所以对于device而言此功能可有可无。
2.2 读写类
PRE-FETCH
主机下发pre-fetch命令,让device将指定LBA的数据取出放在指定的buffer中。从命令的字面意思上看,host想在让device执行预取的操作,提升后续读命令的性能。但是host同样无法感知device是否真的执行的pre-fetch命令。这是因为在不考虑性能的情况下,先下发预取再下发读命令 和 直接下发读命令对于host的结果是完全相同的。同时由于UFS设备资源有限,可能并没有专用的buffer用于预取命令(空闲时device GC等后台操作仍旧会占用buffer)。
READ
read命令包含read(6)/read(10)/read(16),不同的read命令LBA的寻址范围存在区别。主机下发读命令读取指定LBA的数据,device FW会通过FTL映射表获得指定LBA对应的物理地址,然后读取相应数据返回给主机。
WRITE
write命令包含write(6)/write(10)/write(16),不同的write命令LBA的寻址范围存在区别。主机下发写命令修改指定LBA的数据,device将数据写入到flash之后需要修改FTL映射表(flash无法在有数据的地址上覆盖写)。
UNMAP
主机下发unmap命令要求device清除某个LUN中指定LBA的数据,实际上只会修改映射表。根据LU中bProvisionType的不同,unmap命令被分为erase
和discard
两种操作。其中erase
要求host读取经过unmap的LBA时返回全0,而discard
则返回随机值。
FORMAT UNIT
格式化指定逻辑单元,如果指定了device well know lun,则将格式化全盘。实现上与UNMAP命令相似。
SYNCHRONIZE CACHE
将device中指定LBA的数据下刷到flash中,也可以将buffer中所有数据一起下刷,因为host无法预期哪些数据会缓存在device buffer中。
VERIFY
下发verify命令校验指定LBA中的数据能否被正常读出。
SECURITY PROTOCOL OUT
用与下发加密类的操作。例如读取/写入 RPMB LUN的数据,或者配置各个逻辑单元的安全写保护。
SECURITY PROTOCOL IN
用于获取SECURITY PROTOCOL OUT命令携带指令的执行结果,与SECURITY PROTOCOL OUT组成一个完整的命令序列。写入类操作需要2个SECURITY PROTOCOL OUT 加 1个SECURITY PROTOCOL IN。读取类操作需要1个SECURITY PROTOCOL OUT和1个SECURITY PROTOCOL IN。
2.3 管理类
START STOP UNIT
用于调整device的电源状态以及指定LU的启动与关闭。在调整device电源状态的场景中,start stop unit命令与硬件平台息息相关,不同的UFS设备硬件资源不同,需要执行的操作也并不相同。可以通过query配置上电启动时的电源状态。
MODE SENSE
用于查询mode pages当前值/保存值/默认值/可变值,UFS协议中支持control,caching以及read write error recovery。
MODE SELECT
与mode sense配合使用,用于修改mode pages的当前值或者保存值。可以用于配置指定LU的软件写保护。
2.4 杂项
READ BUFFER
读取指定buffer中的数据,可以用与读取device侧的err history信息。
WRITE BUFFER
向指定buffer中写入数据,可以用于FFU升级device FW。
另外read buffer与write buffer通常更多的用于实现VCMD。