LTR:Latency Tolerance Reporting
LTR 是 PCIe 协议中规定的一项可选特性,可用于提高系统的电源管理效率。
通过 LTR,PCIe 设备可以告知系统它们能容忍的最大响应延迟是多少,只要系统在这个时间之内对 PCIe 设备提出的请求做出响应即可。系统的电源管理策略可以根据 LTR 提供的信息做出优化。在设备需要的时候,系统快速响应设备提出的请求;在设备不需要的时候,系统可以延迟一会再对设备请求做出响应,只要不超出设备 LTR 消息中规定的时间即可。例如,如果系统在低功耗状态时收到设备的请求,那么晚一会再响应这个请求,避免频繁的从低功耗状态中唤醒。
1. LTR 寄存器
PCIe 配置空间中的 Device Capability 2 寄存器表明了该设备是否支持 LTR,如下图所示:
PCIe 配置空间中的 Device Control 2 寄存器表明了该设备是否使能 LTR,如下图所示:
PCIe 协议规定:使能 PCIe 设备的 LTR 时,应该先使能距离 Root Complex 近的设备。只有当 Endpoint 连接的 Root Port 以及中间的 Switch 同时支持并且使能了 LTR 时,才能够使能该 Endpoint 的 LTR。
在同一个 PCIe 总线系统中,允许支持 LTR 的 Endpoints 和 不支持 LTR 的 Endpoints 同时存在。
如果 Root Port 或者 Switch 在不支持 LTR 或者 未使能 LTR 的情况下收到了来自 Endpoint 的 LTR 消息,那么应该按照 Unsupported Request 来对待。
建议 Endpoint 在被使能 LTR 之后立即发送 LTR 消息。与此同时,强烈建议 Endpoint 在 500 us 之内发送的 LTR 消息不超过 2 个,除非是协议要求这样做。
LTR 信息是需要发送给 Root Complex 的。Root Complex 的下游端口(downstream)可能会接很多 Endpoint,每个 Endpoint 都会发送 LTR 信息。Root Complex 会在收到的所有 LTR 信息中选取最小值作为实际的使用标准。
2. LTR 消息(LTR Message)
LTR 消息格式如下图所示:
LTR 消息中包含两个 latency 值:No-Snoop Latency 和 Snoop Latency。两者的格式相同:
- Latency Value and Scale:这两个参数配合使用,可以将 Latency 配置为 1 纳秒 ~ 34 秒。如果将这两个值都设置为0,那就意味着任何延迟都会对设备产生影响,因此系统需要在第一时间响应该设备提出的请求。对于不同的请求类型,Latency 的意义如下:
- 对于读请求,Latency 是指从读请求 TLP 的 END 标识发出开始,直至接收到第一个 Completion TLP 的 STP 标识为止的这段时间。
- 对于写请求,Latency 是指从 Endpoint 写请求 TLP 的 END 标识发出开始,直至 Endpoint 可以发出下一个 写请求为止的这段时间。写请求的 Latency 会收到 PCIe 流控(Flow Control)的影响。例如,Endpoint 发出一个写请求之后,它的上游端口(upstream)连接的设备(Root Port 或者 Switch)的 credits 不足导致 Endpoint 无法继续发送下一个写请求。只有 Endpoint 收到对端的 DLLP 告知它已经有足够的 credits 之后,Endpoint 才能继续发送新的写请求。这种场景下,Latency 就是从第一个写请求的 END 表示发出,直至收到释放 credits 的 DLLP 的 STP 标识为止的这段时间。
- Requirement:是否需要 latency value。可以设置为 0 或 1。例如,如果 PCIe 设备不会发出 No-Snoop 请求或者对 No-Snoop 请求没有 latency 需求,那么可以把 LTR 消息中的 No-Snoop Latency 区域的 Requirement 位设置为 0。如果 PCIe 设备 A 发出了一个 LTR 消息,接受到这个消息的设备 B 没有使能 LTR 消息或者这个设备处于比 D0 更低的功耗状态,那么设备 A 需要再发送一次 LTR 消息,并且把该消息中 requirement 位设置为 0。
本文中的图片来自MindShare, Inc 经典书籍《PCI Express Technology》。