可通过多个完成包来答复单个存储器请求,将这些完成包放置在一起即可返回请求的所有数据。为了预留资源用于数据包报头开销,用户应用必须分配足够的空间,以便容纳可能返回的最大数量的完成包。
为了简化此进程,《PCI Express 基本规范》量化了所有完成包的长度,使每个完成包都必须始于和止于自然对齐的读取完成边界 (RCB),除非完成包所服务的对象为原始请求的起始地址或结束地址。如果请求跨地址边界,且边界为 RCB 字节的整数倍,那么可使用多个完成包来完成此类请求,但返回的数据不得分段,位于以下地址边界处的数据除外:
- 第一个完成包必须以请求中指定的地址开始,并且止于以下地址之一:
- 请求中指定的地址加上请求指定的长度(例如,整个请求)。
- 地址边界位于请求的起始和结束之间,并且为 RCB 字节的整数倍。
- 最后一个完成包必须止于请求中指定的地址加上请求指定的长度。
- 第一个完成包和最后一个完成包(不含这两个包本身)之间的所有完成包的长度必须为 RCB 字节的整数倍。
在 cfg_rcb_status[3:0] 上会提供 RCB 的编程值。位索引与物理功能编号相关联;例如,cfg_rcb_status[0] 和 cfg_rcb_status[1] 分别与物理功能 0 和 1 相关联(根据功能链路控制寄存器 [3])。如果用户应用不读取 RCB 值,那么它必须使用默认值,即 64 字节。
cfg_rcb_status[0]、cfg_rcb_status[1]、cfg_rcb_status[2] 或 cfg_rcb_status[3] |
读取完成边界 | |||
---|---|---|---|---|
字节数 | DW | QW | 信用值 | |
0 | 64 | 16 | 8 | 4 |
1 | 128 | 32 | 16 | 8 |
计算非转发请求所需的完成信用值时,必须确定完成响应可能需要的 RCB 绑定块的数量,这与所需的完成报头信用值相同。