NVMe高速传输之摆脱XDMA设计13:PCIe初始化状态机设计
PCIe配置初始化状态机实现PCIe设备枚举和配置空间初始化过程,在完成链路训练后,使用DFS(深度优先搜索)算法枚举PCIe总线上的设备,完成PCIe总线域的地址分配和设备的初始化。PCIe配置初始化是PCIe总线正常进行数据传输的前提,图1为PCIe配置初始化状态机状态转移图。
图1 PCIe配置初始化状态机状态转移图
各状态说明如下:
IDLE:空闲状态,复位后的初始状态。当检测到初始化控制寄存器的PCIe初始化启动信号的上升沿时,启动初始化过程,进入GET_ID状态。
GET_ID:获取设备与供应商ID状态,该状态下通过配置TLP获取PCIe链路上的设备的配置空间的设备ID和供应商ID。如果获取的供应商ID号为0xFFFF,表示为无效的供应商ID,跳转到INC_DEV状态,否则进入GET_HEADER_TYPE状态。
GET_HEADER_TYPE:获取配置空间类型状态,该状态获取配置空间的Header Type字段,其中当该字段第8位值为1时,表示设备为多功能设备,而NoP逻辑加速引擎当前并不支持多功能设备,因此状态机跳转到ERROR状态,并设置错误代码寄存器表示检测到不支持的多功能设备。如果Header Type字段的第8位值为0,则将字段低7位的值更新到状态机中的header_type寄存器,并跳转到CFG_BAR状态。当header_type值为0时,表示该设备使用Endpoint设备的配置空间,当值为1时表示该设备使用桥的配置空间。
CFG_BAR:BAR寄存器组配置状态。type0类型的配置空间存在BAR05共六个BAR寄存器,type1类型的配置空间存在BAR01两个BAR寄存器,这些寄存器保存设备在PCIe总线域中使用的地址空间的基地址。在配置过程中,首先获取BAR寄存器类型,NoP逻辑加速引擎不支持的类型为I/O地址类型或为可预取的64位地址,当检测到这两种类型的BAR时跳转到ERROR状态,并设置错误代码寄存器表示检测到不支持的BAR类型;否则获取每个BAR寄存器的长度,然后再分配合适的基地址。当所有BAR寄存器配置完成后,进入CFG_PCIE_EXTENDS状态。
想进一步了解相关视频,请搜索B站用户:专注与守望
链接:https://space.bilibili.com/585132944/dynamic?spm_id_from=333.1365.list.card_title.click