控制器寄存器位于MLBAR/MUBAR寄存器(PCI BAR0和BAR1)中,该寄存器应映射到支持有序访问和可变访问宽度的内存空间。host主机通过访问虚拟内存的方式访问该部分寄存器。
注:访问过程只能一次访问一个寄存器,不能多个访问。
寄存器如下:
1 Offset 00h:CAP
注意type类型以及bit位。MPSMAX和MPSMIN只是设置一个最大最小范围,具体实际的配置还是需要使用CC.MPS设置。(下图是nvme驱动code(Linux-6.8.8)调用read接口读bar空间 cap信息)
全局搜索了下code,用到ctrl->cap的地方:
nvme disable controller时候,等待CSTS_RDY状态变化,cap有一项timeout项,需要读取timeout时间,此时间可以理解为一个上限时间,不能超过此时间。通常是以500ms为一个单位。
/**********************************************************************************************************/
在驱动nvme enable ctrl内:
1 首先读取bar空间CAP,写入到本地ctrl->cap
2 获取dev page min;
3 CSS支持情况,协议定义如下:
4 关于ctrl->ctrl_config配置,放到后面详细说明。这里配置了ctrl_config,然后写入到nvme register。
5 重新读取cc reg,然后cap reg重读一次(这里暂时没理解到为什么cc写入一次,会影响到cap)
6 超时判断,如果&NVME_CAP_CRMS_CRWMS为真,那么需要读取Controller Ready timeout
定义:NVME_REG_CRTO = 0x0068, /* Controller Ready Timeouts */
7 开启cc enable
8