PCIE IDO
PCIE IDO: ID-Based Ordering
**含义:
** pcie IDO是在pcie 2.1引入,用于针对不同Requester ID(BDF)发出的TLP报文, 通过同一VC时,可以互相超车。
关键点:
1>: IDO只针对不同device(Requester ID) 之间的order, 同一device 发起的TLP请求,依然需要遵循pcie order要求
2>: IDO只针对不同device 发起的TLP通过同一VC时,可以相互超越,不同VC之间,无相互关系
3>: IDO需要pcie link 通路的所有设备都支持,才可以使用
如何开启IDO:
1: 开启条件
硬件: 支持IDO 功能,通过软件配置可开启
软件:
1>: 配置寄存器使能 Device Control 2 寄存器:
a>: IDO Request Enable:使能本设备发请求 TLP 带 IDO
b>: IDO Completion Enable:使能本设备回复的 Cpl 带 IDO
注: 必须软件写配置空间打开,通常情况下,默认是关闭的。
2>: 配置TLP 相关字段
配置TLP的Attr 字段标记 TLP Header Attr[2] = 1,代表这条 TLP 启用 IDO; 请求报文的 IDO 属性会原样透传到对应的 Completion 报文。
2: 生效前提
必须是同一 VC;如果是不同 VC 之间本来就无顺序约束,和 IDO 无关举例:
如上图所示,EP0先向RC的mem中发起一笔post write req,在switch中的V0通道中post访问发生了堵塞, 此时,如果EP1再发起non-post read req对rc的mem进行访问,如果这EP1的这笔访问也使用switch的V0的情况下:
如果不开启IDO:根据pcie 的order规则, 那这边non-post read req访问将会被EP0的post write访问阻挡,ep1的non-post read req必须等待EP0的post write req完成之后才能继续。
如果开启IDO: EP0的访问即便在swich 中发生了阻塞, EP1的访问即便在switch VC0已经发生post 访问堵塞的情况下依然使用相同的switch VC0发起 non-post read req, 此时,EP1的non-post read req会不受到post 队列阻塞的影响,能够超越ep0的post write req,而完成访问。
使用注意事项:
- 软件责任:软件必须保证不同 Requester ID 的事务之间不存在依赖关系;如果存在跨 BDF 生产者消费者依赖,打开 IDO 会出现数据乱序 bug(不是硬件死锁,是功能错误)
- IDO 对Config、I/O 事务一般不推荐使用,多用于 Memory 读写(GPU、NVMe、DPU)
- PASID 扩展场景:现代 IP 支持按 PASID 进一步切分流,粒度比 Requester ID 更细
- Switch 必须识别 IDO 比特,在转发队列做流分离;老 Switch IP 不支持 IDO,会忽略 Attr [2],IDO 失效