✨前言
PCIe中的Message主要是为了替代PCI中采用边带信号,这些边带信号的主要功能是中断,错误报告和电源管理等。所有的Message请求采用的都是4DW的TLP Header,但是并不是所有的空间都被利用上了,例如有的Message就没有使用Byte8到Byte15的空间。
Message请求的TLP Header格式如下图所示:
上面的表格中提到了,Message主要有九个类型:
- INTx Interrupt Signaling
- Power Management
- Error Signaling
- Locked Transaction Support
- Slot Power Limit Support
- Vendor‐Defined Messages
- Ignored Messages (related to Hot‐Plug support in spec revision 1.1)
- Latency Tolerance Reporting (LTR)
- Optimized Buffer Flush and Fill (OBFF)
下面将分别进行介绍一下,
🌟INTx Interrupt Messages(中断消息)
PCI 2.3提出了MSI(Message Signaled Interrupt),但是早期的PCI并不支持这一功能,PCIe为此定义了一种Virtual Wire来模拟PCI的中断引脚(INTA-INTD)。如下图所示:
👉INTx Message的使用规则如下:
它们没有数据有效负载,因此保留长度字段。
· 它们仅由上游端口发行。检查收到的数据包的此规则是可选的,但如果检查,违规行为将作为格式错误的 TLP 进行处理。
· 他们需要使用默认流量类别TC0。接收方必须对此进行检查,违规行为将作为格式错误的 TLP 进行处理。
· 链路两端的组件必须跟踪四个虚拟中断的当前状态。如果一个中断的逻辑状态在上游端口发生变化,则必须发送适当的 INTx 消息。
· 当命令寄存器的中断禁用位设置为 = 1 时,INTx 信号被禁用(物理中断线的情况)。
· 如果在器件中设置中断禁用位时任何虚拟 INTx 信号处于活动状态,则上行端口必须发送相应的 Deassert_INTx 消息。
· 交换机必须独立跟踪每个下游端口的四个 INTx 信号的状态,并组合上游端口的状态。
· 根联合体必须独立跟踪四个 INTx 线的状态,并以特定于实现的方式将它们转换为系统中断。
· 他们使用路由类型“本地终止接收器”来允许交换机重新映射指定的中断引脚。因此,INTx消息中的请求者ID可以由最后的发送器分配。
🌟Power Management Messages(电源管理消息)
👉电源管理消息使用规则如下:
· 电源管理消息没有数据有效负载,因此保留长度字段。
· 他们需要使用默认流量类别TC0。接收方必须检查这一点并将违规行为作为格式错误的 TLP 进行处理。
· PM_Active_State_Nak 在观察到来自链路邻居的将链路电源状态更改为 L1 的请求后从下游端口发送,但它选择不这样做(本地 - 终止于接收器路由)。
· PM_PME 由请求电源管理事件的组件向上游发送(隐式路由到根联合体)。
· PM_Turn_Off 向下游发送到所有端点(从根联合体路由隐式广播)。
· PME_TO_Ack 由端点向上游发送。对于具有多个下游端口的交换机,在所有下游端口都收到该消息之前,该消息不会被转发到上游(收集并路由到根联合体路由)。
🌟Error Messages(错误消息)
👉错误信息使用规则如下:
· 他们需要使用默认流量类别TC0。接收方必须检查这一点并将违规行为作为格式错误的 TLP 进行处理。
· 它们没有数据有效负载,因此保留长度字段。
· 根联合体将错误消息转换为系统特定的事件。
🌟Locked Transaction Support
👉Unlock Message使用规则:
· 他们需要使用默认流量类别TC0。接收方必须检查这一点并将违规行为作为格式错误的 TLP 进行处理。
· 它们没有数据有效负载,并且长度字段被保留。
🌟Set Slot Power Limit Message
👉Set_Slot_Power_Limit消息使用规则:
· 他们需要使用默认流量类别 TC0。接收方必须检查这一点并将违规行为作为格式错误的 TLP 进行处理。
· 数据有效负载为1 DW,因此长度字段设置为1。仅 32 位数据有效负载的低 10 位用于时隙功率缩放;高有效负载位必须设置为零。
· 只要数据链路层转换到 DL_Up 状态,或者在数据链路层已经报告 DL_Up 状态时发生对时隙功能寄存器的配置写入,就会自动发送此消息。
· 如果插槽中的卡消耗的电量已经低于指定的电量限制,则可以忽略该消息。
🌟Vendor‐Defined Message 0 and 1
👉厂商自定义Message使用规则:
· 数据有效负载可能包含也可能不包含在任一类型中。
· 2. 消息通过Vendor ID 字段进行区分。
· 3. 属性位[2]和[1:0]不保留。
· 4. 如果接收者无法识别该消息:
• 类型 1 消息被默默丢弃
• 类型 0 消息被视为不支持的请求错误条件
🌟Ignored Messages
👉热插拔Message使用规则:
· 它们由下游端口驱动至插槽中的卡。
· 注意按钮消息由插槽设备向上游驱动。
🌟Latency Tolerance Reporting Message
👉LTR Message使用规则:
· 他们需要使用默认流量类别TC0。接收方必须检查这一点并将违规行为作为格式错误的 TLP 进行处理。
· 它们没有数据有效负载,并且长度字段被保留。
🌟Optimized Buffer Flush and Fill Messages
👉OBFF Message使用规则:
· 他们需要使用默认流量类别TC0。接收方必须检查这一点并将违规行为作为格式错误的 TLP 进行处理。
· 它们没有数据有效负载,并且长度字段被保留。
· 请求者ID必须设置为发送端口的ID。
✨小结:
消息请求TLP在PCIe架构中扮演着重要角色,它允许硬件设备以非常高效的方式与系统其他部分进行通信。这种通信方式减少了对传统IRQ(中断请求)线路的依赖,并允许实现更加复杂和灵活的硬件控制逻辑。通过这种方式,系统可以更快地响应硬件事件,优化功耗管理,并提高系统的整体稳定性和性能