这段文字主要讲解了 Memory、I/O 和 Configuration 请求 的格式和规则。下面是本章的重点:
1. 请求字段(Request Fields)
所有的 Memory、I/O 和 Configuration 请求都包含一些公共的字段,除了请求类型的特定字段外,还包括一些共享字段,如:
• Requester ID 和 Tag:这两个字段一起形成“事务 ID”。
• First DW BE 和 Last DW BE:这些字段用来指示请求中数据的字节使能状态(即哪些字节需要操作)。如果是 Memory Read 请求,且 TH 位(Transaction Hint) 被设置,这些字段的作用会发生变化,改为承载 Steering Tag (ST) 信息。
2. Memory 请求规则
• 地址路由:Memory 请求通过地址进行路由,支持 32 位或 64 位地址。
• 内存读取请求(Memory Read Requests):这些请求的长度不能超过系统配置的最大读取请求大小(Max_Read_Request_Size)。
• 原子操作请求(AtomicOp Requests):这类请求包含操作数,其大小和长度由规范规定。如果请求的长度与规范不匹配,则请求被视为“Malformed TLP”(格式错误的事务链路包)。
例如,FetchAdd 操作的长度是 1 DW(双字),Swap 操作也是 1 DW,而 CAS 操作的长度根据不同的操作数而变化,可能是 2 DW、4 DW 或 8 DW。
• 自然对齐规则:对于 AtomicOp 请求,地址必须与操作数的大小对齐。如果不对齐,接收端将处理为“Malformed TLP”。
• 4 KB 边界:请求不能跨越 4 KB 的边界,尤其是对于 AtomicOp 请求,系统会检查是否违反了这一规则。
3. I/O 请求规则
• I/O 地址路由:I/O 请求使用 32 位地址路由。
• 限制:
○ TC[2:0] 必须为 000b。
○ Length 必须设置为 0000000001b(即请求长度为 1 DW)。
○ Last DW BE 必须为 0000b。
○ 一些字段如 LN 和 TH 在 I/O 请求中没有意义,应该保留为保留位。
4. Configuration 请求规则
• 配置请求的路由:配置请求通过设备 ID 进行路由,使用 3 DW 的请求头。
• 限制:
○ 和 I/O 请求类似,TC[2:0] 必须为 000b。
○ 配置请求的长度固定为 1 DW,Length 字段必须设置为 0000000001b,Last DW BE 也必须为 0000b。
5. MSI/MSI-X 中断请求
• MSI/MSI-X 中断请求使用 Memory Write Requests 格式表示,并且与普通的内存写请求在流控、数据完整性等方面没有区别。
6. TPH(Transaction Processing Hint)规则
• TPH 提供了一些处理提示,可以帮助优化数据传输。TPH 需要设置在请求的头部,具体位置和格式如下:
○ TH 位:如果设置了 TH 位,就表示此请求带有 TPH 信息。
○ Processing Hint(PH):这个字段用于指示数据访问的模式。不同的值代表不同的访问频率和优先级,如:
§ 00: 双向数据结构,主机和设备频繁读写。
§ 01: 设备频繁读写。
§ 10: 主机频繁读写。
§ 11: 主机频繁读写且有较高的时序局部性(访问模式预测性高)。
• Steering Tag (ST):这是一个额外的字段,提供了 255 个可用的 Steering Tag 值,帮助指导请求的路由。它的存在依赖于 TH 位 的设置。
总结
这些规则和字段规范定义了如何通过 PCI Express 总线发送不同类型的请求(内存、I/O 和配置请求),并确保数据传输过程中的地址对齐、长度检查以及请求类型一致性。通过设置和解析请求头中的字段,系统能够正确路由并处理这些请求,同时保证数据传输的完整性和效率。