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。