主控需要按如下顺序执行指令来完成初始化:
1. 根据系统配置设置PCIe寄存器,包括电源管理设置。基于pin的单中断,单MSI或者单MSI-X应该被一直使用指导IO队列被确认;
2. 主控需要等到控制器表明此前的重置已经完成,即等待CSTS.RDY=0;
3. 需要配置Admin队列。包括Admin Queue Attributes (AQA), Admin Submission Queue Base Address(ASQ), and Admin Completion Queue Base Address (ACQ);
4. 控制器设置需要被配置,包括:①在CC.AMS中选择仲裁机制;②在CC.MPS中初始化内存页的大小;③在CC.CSS中选择IO Command的设置;
5. 需要设置控制器的使能,即配置CC.EN=1;
6. 主控需要等待控制器表明已经准备好处理命令,也就是CSTS.RDY=1;
7. 主控应用发布识别指令和指定控制器数据结构来决定控制器的配置。主控应通过发布识别指令和指定命名空间数据结构决定每个命名空间来确定每一个命名空间的配置;
8. 主控应通过设置队列功能标识符数量的功能指令和决定IO SQ和IO CQ的数量。决定之后再配置MSI和MSI-X寄存器;
9. 主控需要根据系统配置需求和控制器的数量需求来分配IO CQ的数量。用创建IO CQ指令来分配IO CQ;
10.主控需要根据系统配置需求和控制器的数量需求来分配IO SQ的数量。用创建IO SQ指令来分配IO SQ;
11.如果主控需要异步告知自选项目,主控应发行一个控制命令来说明指定使能的事项;
在执行完上述指令后,控制器可能被用作IO指令。
Software Progress Marker
时间预启动软件的数量被优先读进了系统以保证系统加载成功。如果预启动软件的加载计数变大,那么由于系统驱动软件仍未将这一区域置0可能会使它在NVM内以缓存数据的形式被发布。在这种情况下,系统驱动软件需要更加谨慎的选择NVM。
推荐主机有序地执行控制器的关机指令,其步骤如下所示:
① 停止向控制器提交任何新的IO指令,也不允许任何outstanding指令完成;
② 主机使用IO SQ删除指令来删除所有IO SQ。成功完成IO SQ删除命令导致的结果就是任何剩余的outstanding指令会被终止。
③ 主机要使用IO CQ删除指令来删除所有IO CQ;
④ 主机要讲关机标志位(CC.SHN)置为01b来声明一个关机操作。关机过程一旦完成,主控需要将关机状态置为10b(CSTS.SHST=10b);
当进入D3电源状态时,关机流程如下所示:
① 停止向控制器提交任何新的IO指令;
② 主机要讲关机标志位(CC.SHN)置为10b来声明一个强制关机操作。关机过程一旦完成,主控需要将关机状态置为10b(CSTS.SHST=10b);
建议主控为关机操作完成等待RTD3 EntryLantency在识别控制器数据结构中得到报告。如果上报值为0h,主控则需要等待一秒的最小值。通过CC.EN区域取消主控使能是不被推荐的。这将会造成主控被重置,从而影响关机操作流程的时间。
在CSTS.SHST表明关机过程已经完成后让主控掉电是安全的(无视CC.EN的值)。直到CC.EN从“0”到“1”都可以安全的关闭主控电源。
为了让主控在一次关机操作后重新开始工作,需要进行主控重置(即让CC.EN从“1”置“0”)。