Admin Command
1. Device Self-Test(DST)设备自检命令
参考SQE结构:
Namespace Test Action
在NSID字段中如果设置为00000000h表示不包括NS,DST操作只包括Controller;
00000001~FFFFFFFEh表示指定NSID,当Namespace为invalid/inactive状态时Controller Abort该命令;
FFFFFFFFh表示操作可以通过Controller访问包括所有active状态在内的Namespace
DW10中定义**STC (Self-test Code)**包括如下action:
- Short device
- Extended device
- Vendor-specific device
- Abort in-process operation
对于CQE,Command Specific 状态值设置
CQE结构中DW0/1是命令指定,DST的Status Value应该放在哪儿可以由固件指定吗?
Status Field有自己的数据结构,如下,包括了状态码等内容
Status Code Type Value定义如下
DST(Device Self-test)命令的使用场景
(1) 自检类型
Short Self-test(SCT=1h):快速检查控制器和NAND的基本功能(如寄存器、接口)。
Extended Self-test(SCT=2h):全面检测(包括坏块扫描、ECC校验、数据完整性)。
Abort Self-test(SCT=Fh):中止正在运行的自检。
-
短自检(Short Device Self-test):
完成时间:2分钟以内
测试范围:快速检查控制器的基本功能(如RAM、SMART状态、元数据等)。
可中断性:可以被控制器重置、Format NVM命令、Sanitize操作或中止自检命令中断。 -
扩展自检(Extended Device Self-test):
完成时间:由Identify Controller数据结构中的Extended Device Self-test Time字段指定。
测试范围:更全面的测试,包括NVM介质完整性、数据完整性、介质检查等。
可中断性:可以被Format NVM命令、Sanitize操作或中止自检命令中断,但会跨控制器重置和电源恢复继续执行。
自检操作分为多个端,每个段包含一组测试,具体定义可以参考NVMe协议中
哪些命令可以同时处理,哪些命令需要暂停设备自检操作,具体取决于供应商。
中断条件:Format NVM、Sanitize、中止命令等。
(2) 使用场景
出厂测试:
在SSD出厂前执行扩展自检,确保硬件无缺陷。
定期维护:
数据中心定期运行自检,预防潜在故障。
故障诊断:
当SSD出现异常(如频繁CRC错误),运行自检定位问题。
安全擦除前检查:
在安全擦除(Sanitize)前执行自检,确保设备状态正常。
2. Get Log Page
Get Log Page命令返回一个Log和对应的信息范围可能是Controller或NVM Subsystem,Dowrd10中低8位返回LID,对于DST命令指定的Log Identifier为06h ,当Identify Controller DS中的DSTO字段为0表示Controller Scope,1表示NVM Subsystem。
Device Self-test Log共564Bytes,Log中一共保存20个Self-test Result Data Structure,每个28Bytes。
Get Log Page – Self-test Result Data Structure
Bytes[00]Bits[3:0]中Value 9h表示因为sanitize操作,操作被abort
Segment Number表示第一次自检错误发生的段号。如果Status field中bits[3:0]不是0x111h,则该域应当被忽略。
Device Self-test Log(与DST命令相关)
作用:记录设备自检(Device Self-test)的状态和结果。
关键字段:
Current Device Self-test Status:当前自检状态(0h=无操作,1h=短自检中,2h=扩展自检中)。
Newest Self-test Result:最近一次自检结果(成功/失败、自检类型、时间戳)。
与DST命令的关联:
执行 Device Self-test Command(启动或中止自检)后,通过Get Log Page获取自检日志。
Eg. 监控自检进度
步骤1:启动扩展自检
发送 Device Self-test Command(SCT=2h)。
步骤2:周期性获取自检日志
使用 Get Log Page(LID=??,假设为06h)获取Device Self-test Log。
Currenet Self-Test Operation: 表示有没有in progress
Currenet Device Self-Test Completion:表示进度
检查Current Device Self-test Status:
bits[7:4] ST Code Value;
bits[3:0]表示result:
- 若为2h:aborted from namespace removal
- 若为0h:自检完成,检查结果。
…
步骤3:处理结果
若自检失败,根据日志中的错误码进行修复或更换设备。
Get Log Page 命令流程
步骤1:构造命令
设置 LID 指定日志类型(如02h为SMART/Health)。
设置 NUMDL/NUMDU 定义请求的数据长度。
设置 LPOL/LPOU 定义读取偏移(通常从0开始)。
设置 Namespace ID 根据日志作用域(如SMART日志用FFFFFFFFh)。
步骤2:发送命令
将命令提交到Admin Submission Queue(Admin SQ)。
步骤3:控制器处理
控制器检查参数合法性:
- 若LID不支持,返回 Invalid Field。
- 若偏移量超过日志大小,返回 Invalid Field。
- 若Namespace ID不匹配日志作用域,返回 Invalid Field。
控制器填充日志数据到主机内存。
步骤4:解析结果
从Data Pointer指向的缓冲区读取日志数据。根据LID解析具体字段(如SMART日志的温度、剩余寿命等)。