3 Controller Register Controller register位于被映射到host memory space的MLBAR/MUBAR(PCI BAR0和BAR1)寄存器空间上,可以按照顺序访问,可以任意宽度访问。许多计算机架构中,将内存设置为不可缓存会产生这种行为。Host不应该应用锁定访问。Host应该按照他们自己的宽度或者按照32位对其去访问。违反这些主机要求中的任意一个都将被认为是未定义的行为。 一次访问两个或者多个寄存器都是不被支持的。 所有reserved的寄存器和所有被reserved的寄存器的位都是只读的且在读取时返回0.Host不应当回复当0被返回时。 3.1 Register Definition 下面的表时controller的寄存器映射表 厂商自定义寄存器的地址范围从最后一个DB寄存器质疑道Bar0/1的结束。此寄存器起始地址是固定的不取决于DB寄存器的个数。
Start | End | Symbol | Description | 00h | 07h | CAP | Controller Capabilities | 08h | 0Bh | VS | Version | 0Ch | 0Fh | INTMS | Interrupt Mask Set | 10h | 13h | INTMC | Interrupt Mask Clear | 14h | 17h | CC | Controller Configuration | 18h | 1Bh | Reserved | Reserved | 1Ch | 1Fh | CSTS | Controller Status | 20h | 23h | NSSR | NVM Subsystem Reset (Optional) | 24h | 27h | AQA | Admin Queue Attributes | 28h | 2Fh | ASQ | Admin Submission Queue Base Address | 30h | 37h | ACQ | Admin Completion Queue Base Address | 38h | 3Bh | CMBLOC | Controller Memory Buffer Location (Optional) | 3Ch | 3Fh | CMBSZ | Controller Memory Buffer Size (Optional) | 40h | 43h | BPINFO | Boot Partition Information (Optional) | 44h | 47h | BPRSEL | Boot Partition Read Select (Optional) | 48h | 4Fh | BPMBL | Boot Partition Memory Buffer Location (Optional) | 50h | EFFh | Reserved | Reserved | F00h | FFFh | Reserved | Command Set Specific | 1000h | 1003h | SQ0TDBL | Submission Queue 0 Tail Doorbell (Admin) | 1000h + (1 * (4 << CAP.DSTRD)) | 1003h + (1 * (4 << CAP.DSTRD)) | CQ0HDBL | Completion Queue 0 Head Doorbell (Admin) | 1000h + (2 * (4 << CAP.DSTRD)) | 1003h + (2 * (4 << CAP.DSTRD)) | SQ1TDBL | Submission Queue 1 Tail Doorbell | 1000h + (3 * (4 << CAP.DSTRD)) | 1003h + (3 * (4 << CAP.DSTRD)) | CQ1HDBL | Completion Queue 1 Head Doorbell | 1000h + (4 * (4 << CAP.DSTRD)) | 1003h + (4 * (4 << CAP.DSTRD)) | SQ2TDBL | Submission Queue 2 Tail Doorbell | 1000h + (5 * (4 << CAP.DSTRD)) | 1003h + (5 * (4 << CAP.DSTRD)) | CQ2HDBL | Completion Queue 2 Head Doorbell | … | … | … | … | 1000h+ (2y * (4 << CAP.DSTRD)) | 1003h + (2y * (4 << CAP.DSTRD)) | SQyTDBL | Submission Queue y Tail Doorbell | 1000h + ((2y + 1) * (4 << CAP.DSTRD)) | 1003h + ((2y + 1) * (4 << CAP.DSTRD)) | CQyHDBL | Completion Queue y Head Doorbell | Vendor Specific (Optional) |
3.1.1 offset 00h:CAP-controller Capabilities 这寄存器代表了Controller到host的基本功能。
Bit | Type | Reset | Description | 63:56 | RO | 0h | Memory Page Size Maximum(MPSMAX):这一部分代表了Controller支持的最大的Host的MPS,最大的MPS是2^(12+MPSMAX)。主机不应当配置大于此值的MPS。 | 55:52 | RO | Impl Spec | Memory Page Size Minimum(MPSMIN):这一部分代表了Controller支持的最小的Host的MPS,最小的MPS是2^(12+MPSMAX)。主机不应当配置小于此值的MPS。 | 47:46 | RO | 0h | Reserved | 45 | RO | Impl Spec | Boot Partition Support(BPS):这一位代表了Controller是否支持Boot分区,如果这一位是1,controller支持,0不支持,详见8.13 | 44:37 | RO | Impl Spec | Command Sets Supported(CSS):这一部分代表了Controller支持的IO Command Set,Controller应当支持最小数量的命令,如果某一位置1,则对应的IO Command应该被支持
Bit | Definition | 37 | NVM Command set | 38 | Reserved | 39 | Reserved | 40 | Reserved | 41 | Reserved | 42 | Reserved | 43 | Reserved | 44 | Reserved |
| 36 | RO | Impl Spec | NVM Subsystem Reset Supprted(NSSRS):这一部分代表了Controller是否支持在7.3.1中定义的NVM Subsystem Reset特性,设置为1为支持,0不支持。 | 35:32 | RO | Impl Spec | Doorbell Stride(DSTRD):这一部分代表了Doorbell 寄存器(每一个SQ Doorbell和CQ Doorbell都是32bit的)之间的跨度。这个跨度是2^(2+DSTRD)字节,0代表4个字节,每个Doorbell之间没有Reserved的空间。见8.6 | 31:24 | RO | Impl Spec | Timeout(TO):代表了Host应该等待的最长时间,在下面两种情况下; a.CC.EN从0到1,CSTS.RDY也应该从0到1。 b.CC.EN从1到0,CSTS.RDY也应该从1到0。 这个时间通常被用于像是突然shutdown或者从新加载一个FW image时,期待的时间应该短于此时间,这个时间以500ms为单位。 | 23:19 | RO | 0h | Reserved | 18:17 | RO | Impl Spec | Aribitration Mechanism Supported(AMS):这几位代表着Cotroller支持的选择性支持的仲裁机制,设置为1表示Controller应该支持此仲裁机制,参见4.11
Bit | Definition | 17 | Weighted Round Robin with Urgent Priority Class | 18 | Vendor Specific |
表中没有Round Robin是因为RR是必须支持的仲裁机制。 | 16 | RO | Impl Spec | Contiguous Queues Required(CQR):这一位设为1,代表Controller请求的IO SQ和IO CQ必须是物理地址连续的,Create IO SQ或CQ命令中的CDW.PC位也必须置1。0代表可以不连续。 | 15:0 | RO | Impl Spec | Maximum Queue Entries Supported(MQES):这几位代表了Controller支持的一个Queue最大的尺寸是多少0是最基本的值,1代表2个Entries大小。 |
3.1.2 Offset 08h:VS-Version 这个寄存器代表了Controller所支持的NVME版本。 3.1.2.1 VS Value for 1.3 Compliant Controllers
Bit | Type | Reset | Description | 31:16 | RO | 0001h | Major Version Number (MJR):代表主版本是1 | 15:08 | RO | 03h | Minor Version Number (MNR): 代表次版本是3 | 07:00 | RO | 00h | Tertiary Version Number(TER) :代表第三版本是0 |
3.1.3 Offset 0Ch:INTMS-Interrupt Mask set 这一位被用来在使用Pin-Based Interrupts,signal Message MSI,或者Multiple Message MSI时对中断进行屏蔽。当使用MSI-X时,会再定义一个中断屏蔽表,Host不应读取这个寄存器。对于中断的行为要求,参见7.5。
Bit | Type | Reset | Description | 31:00 | RW1S | 0h | Interrupt Vector Mask Set(IVMS):当某一位写1时,产生的中断或将报告的来自MSI capability Structure的中断对应的中断向量将被屏蔽。当写0时,这一位没有影响。当如这一部分时,应当返回Controller的当前中断屏蔽值(不是这个寄存器的值)。如果某位是1,则相应的中断向量被屏蔽了,如果是0,则没有屏蔽 |
3.1.4 Offset 10h:INTMC-Interrupt Mask Clear 这一位被用来在使用Pin-Based Interrupts,signal Message MSI,或者Multiple Message MSI时对中断进行清除屏蔽。当使用MSI-X时,会再定义一个中断屏蔽表,Host不应读取这个寄存器。对于中断的行为要求,参见7.5。
Bit | Type | Reset | Description | 31:00 | RW1C | 0h | Interrupt Vector Mask Clear(IVMC):当某一位写1时,产生的中断或将报告的来自MSI capability Structure的中断对应的中断向量将被清除屏蔽。当写0时,这一位没有影响。当如这一部分时,应当返回Controller的当前中断屏蔽值(不是这个寄存器的值)。如果某位是1,则相应的中断向量被屏蔽了,如果是0,则没有屏蔽 |
3.1.5 Offset 14h:CC-Controller Configuration 这个寄存器修改Controller的设置。在Host设置CC.EN为1之前, Host应该设置Controller的仲裁机制(CC.AMS),内存页大小(CC.MPS)和支持的命令选择(CC.CSS)。Host如果在初始化IO CQ Entr(CC.IOCQES)大小和IO SQ Enty(CC.IOCQES)大小之前进行Create IO SQ/CQ的操作时,controller应该Abort掉Create IO SQ/CQ命令,并上报Invalid Queue Size。
Bit | Type | Reset | Description | 31:24 | RO | 0 | Reserved | 23:20 | RW | 0 | I/O Completion Queue Entry Size(IOCQES):这一部分定义了当选择使用I/O Command时I/O Completion Queue Entry的大小。最大值在Identify Controller Data Struct中被定义。这个值的单位是字节而且必须是2的n次幂。 | 19:16 | RW | 0 | I/O Submission Queue Entry Size(IOSQES):这一部分定义了当选择使用I/O Command时I/O Submission Queue Entry的大小。最大值在Identify Controller Data Struct中被定义。这个值的单位是字节而且必须是2的n次幂。 | 15:14 | RW | 0h | Shutown Notification(SHN):这一部分用在在关机事件发生时通知controller的关机通告。对于正常关机来说,Host会等待Controller进行关机的处理。对于一个突发性关机,Host在断电之前可能不会等待Controller进行完成关机处理。 关机通告值定义如下:
Value | Definition | 00b | No notification;no effect | 01b | Normal shutdown notification | 10b | Abrupt shutdown notification | 11b | Reserved |
这部分值应该优先于任何下电情况或者PCI Power Management情况,建议在热重启之前写入此字段。Host想要查看Controller什么时候关机完成,应当去读CSTS.SHST寄存器,参见7.6.2。 CC寄存器的其他bit可以在此位为01b或者10b的时候被更改。 | 13:11 | RW | 0h | Arbitration Mechanism Selected(AMS):本字段选择要使用的仲裁机制,只有在CC.EN为0时,此字段才能被改变。Host应该根据CAP.AMS中支持的仲裁类型选择此字段的设置。
Value | Definition | 000b | Round Robin | 001b | Weighted Round Robin with Urgent Priority Class | 010b-110b | Reserved | 111b | Vendor Specific |
| 10:7 | RW | 0h | Memory Page Size(MPS):这一部分代表了Host的内存页大小,大小为2^(12+MPS)。因此,最小的内存页大小为4KB,最大是128MB。这个值的大小应该在CAP.MPSMAX和CAP.MPSMIN之间。这一部分也描述了PRP Entry的大小,只有CC.EN为0时,此字段才能被修改。 | 06:04 | RW | 0h | I/O Command Set Selected(CSS):这个字段去选择I/O Command使用的I/O Submission Queues。Host应该只选择在CAP.CSS中支持的I/O Command Set。只有CC.EN为0时,次字段能够被修改。
Value | Definition | 000b | NVM Command Set | 0001b-111b | Reserved |
| 03:01 | RO | 0h | Reserved | 00 | RW | 0 | Enable(EN):当设置为1时,Controller可以通过Submission Queue Tail Doorbell的值来读取命令。当设置为0时,Controller不应当处理命令也不应当向Completion Queue中写入Completion。 当这一位从1变为0时,controller应当重启,从起应当删除所有的IO SQ/CQ,重置Admin SQ/CQ,使Hardware处于一个Idle状态。Reset不会影响PCIE Register,也不会影响Admin Queue Register。所有其他的Controller寄存器和内部状态,包括5.21.1的未保存Feature值,都应当被Reset。Controller再重启之前,应该确认所有的已完成的命令没有数据丢失。Reset详情参见7.3。 当这一位清0时,controller一旦准备好被再次使能,那么CSTS.RDY会被清0。当这一位置1时,当Controller准备好处理命令后,CSTS.RDY被设置为1,这个时候Namespace可能还没准备好被存取。 Admin Queue Register(AQA,ASQ,ACQ)只能在CC.EN清0时被修改。 |
|