点击查看精选 PCIe 系列文章
?声明:
- 作者主页:【MangoPapa的CSDN主页】。
- ?? 本文首发于CSDN,转载或引用请注明出处【点击查看原文】。
- ?? 本文为非盈利性质,目的为 个人学习记录 及 知识分享。因个人能力受限,存在协议解读不正确的可能。若您参考本文进行产品设计或进行其他事项并造成了不良后果,本人不承担相关法律责任。
- ?? 若本文所采用图片或相关引用侵犯了您的合法权益,请联系我进行删除。
- 欢迎大家指出文章错误,欢迎同行与我交流 ~
- 邮箱:mangopapa@yeah.net
文章目录
- 1. L0p基本介绍
-
- 1.1 L0p引入
- 1.2 L0p的目的意义
- 1.3 L0p的适用范围
- 1.4 L0p能力协商
- 2. L0p的进入和退出
-
- 2.1 L0p动态链路宽度调整
-
- 2.1.1 策略概述
- 2.1.2 L0p响应ACK和NAK规则
- 2.1.3 L0p动态链路宽度调整举例
- 2.1.4 链路宽度下调
- 2.1.5 链路宽度上调
- 2.2 再次发送L0p请求
- 2.3 L0p的进入和退出耗时
- 2.4 L0p对称性
- 3. 链路管理DLLP
- 4. 进一步思考
-
- 4.1 为什么不继续采用FTS的方式了?
- 4.2 那么切换速度可以进L0p吗?
- 5. 参考
PCIe 6.0 协议标准最终版正式公布了,其中的技术细节也没必要藏着掖着了,之前写的协议分析笔记终于可以分享出来了。官方宣传媒体图,上!1. L0p基本介绍 1.1 L0p引入 ??PCIe 5.0中低功耗状态有:L0s,L1、动态链路宽度切换、速度切换。L0p是PCIe 6.0新引入的一种低功耗状态,工作在L0p状态下PCIe设备可以在不中断数据发送的情况下完成链路宽度切换,从而提升链路的带宽利用率、降低功耗。
??L0p在LTSSM中的位置如图1所示,其不是LTSSM主状态之一,某种意义上讲,L0p是L0的一部分。
文章图片
▲ 图1 L0p在LTSSM中的位置
1.2 L0p的目的意义 ??L0p的目的意义大致有以下几点:
- Flit Mode只支持L0p。PCIe 6.0工作在Flit Mode时不支持L0s,转而采用L0p。
- 采用L0p时,不中断数据传输即可实现链路宽度切换。非Flit Mode下,或没有L0p时,调整链路宽度需要LTSSM从L0 -> Recovery -> Configuration,此间几us内数据流被中断。
- L0p下被关掉的lane的功耗与L0s几无差别,这样一来,既能保证链路的带宽率利用率,也能链路降低功耗。
- 上调链路宽度从L0p回退到L0时,PHY无需重新训练。
1.3 L0p的适用范围 ??L0p适用于工作在Flit Mode的PCIe设备,是一项可选的功能,PCIe设备可以通过设备控制寄存器3的L0p Enable位(图2)来决定是否开始L0p功能。对于采用PCIe 6.0的Retimer,其伪端口必须支持L0p。
??L0p只适用于Flit Mode,但其并非只适用于PCIe 6.0。采用了PCIe 6.0 IP的设备,若其工作在Gen1~Gen5速率下且为Flit Mode,L0p对其仍然适用。反过来讲, 采用了PCIe 6.0 IP的设备,若其工作在Flit Mode下,即便其速率为Gen1~Gen5的速率,其仍然不能进入L0s的低功耗状态。
文章图片
▲ 图2 Device Control 3 Register
1.4 L0p能力协商 ??收发端通过交换TS序列协商该链路是否启用L0p能力。TS1或TS2序列(standard或modified)中的数据速率指示符号第0bit(即symbol 4 bit 0) 指示当前设备其是否支持L0p,收发端在Configuration.Complete状态形成最终决定,L0p能够动态切换最大链路宽度是在Configuration.Linkwidth.Accept状态决定的。
??Flit Mode不等于L0p,因为L0p是可选的功能。即便工作在Flit Mode下,若设备未实现或未使能L0p能力,则设备仍然不能进入L0p状态,也不能动态调整链路宽度,此时调整链路宽度仍然需要从 L0 -> Recovery -> Configuration。
2. L0p的进入和退出 2.1 L0p动态链路宽度调整 2.1.1 策略概述
??一般而言,Flit Mode的PCIe设备在初次training的时默认开启全部可用的lane。在工作过程中,根据带宽利用情况决定下调或扩展lane的数目。进入L0状态后,初次发送L0p请求一定是链路宽度下调。
- 链路宽度下调:当吞吐量较小链路较清闲时,收发端协商后进入L0p状态降低活跃态的lane数目。在保证现有数据发送带宽需求的前提下,关闭部分lane使其进入电气闲状态,同时剩余lane继续发送数据流。
- 链路宽度上调:链路宽度上调的前提是当前链路已经工作在L0p状态且lane数目未达到最大。若当前PCIe设备吞吐量逐渐加大以至于目前lane数难以满足需求,收发端协商上调lane数目,激活电气闲状态的lane,以满足系统吞吐量需求。
- 在协商好的最大链路宽度范围内,L0p支持的动态切换链路宽度为x1, x2, x4, x8, x16。L0p不支持到x1, x3, x5等的切换。
- 鉴于Configuration状态时关闭的lane存在链路可靠性差的可能,L0p不能也无法激活在Configuration状态下关闭的lane。如果需要激活其他lane,仍然需要L0 -> Recovery -> Configuration重新协商。
- 从L0p -> Recovery后,有效链路宽度回退到进L0p之前L0的链路宽度。
- 若链路控制寄存器(图3)中的自动链路关闭位置一,则 ①禁止发送链路宽度下调的L0p请求,且 ②必须发送上调链路宽度的请求,将链路宽度恢复至最近一次Configuration协商后的最大链路宽度。
文章图片
▲ 图3 Link Control Register
2.1.2 L0p响应ACK和NAK规则
??USP或DSP均可以主动发起动态切换链路宽度请求,另一方可以同意(回ACK)也可以拒绝请求(回NAK)。只有在双方就能不能进L0p、切换成哪种链路宽度达成一致之后,才能进入预期的L0p链路状态。Rx在收到L0p请求后,必须在1us内进行回应;若请求者在2us内未等到回应,其可以重新发送请求,也可以放弃请求。
??更多L0p ACK和NAK规则如下:
- 若L0p.Priority为0,不论当前端口是否已处于L0p,其均有权拒绝对端发来的链路宽度下调L0p请求。
- 若端口出于热节流或链路可靠性原因请求下调链路宽度,其应将L0p 请求中的L0p.Priority位置一,并确保在100ns内开始发送该L0p请求。此时,若对端未发送L0p请求且下个Flit也不打算发送L0p请求,那么对端必须接受该L0p请求并回复ACK。
- 任何请求动态下调链路宽度的端口,即便其得到了对端的ACK答复,当导致其链路宽度下调的因素消除后,其应主动恢复原有的链路宽度。
- 若DSP和USP同时请求L0p动态链路切换(某端口收到L0p请求后100ns内自己也会发送L0p请求即为同时),此时双方需要竞争方能成为最终的requester。竞争规则如下:
○ 若双方L0p.Priority均置一,链路宽度窄者胜;
○ 若只有一方L0p.Priority置一,L0.Priority置一者胜;
○ 若双方L0p.Priority均为0,L0p请求链路宽度不同链路宽者胜,链路宽度相同DSP胜。
2.1.3 L0p动态链路宽度调整举例
??以X16链路为例,一种L0p动态切换链路宽度的协商过程如图4所示:
- DSP与USP在Configuration状态协商开启L0p能力。
- USP发送L0p请求给DSP,请求将链路宽度切换为x8,DSP回复ACK。
- DSP即USP lane 0-7继续传输数据流,lane 8~15 发送EIOSQ并进入电气闲状态。
- 一段时间后,DSP发送L0p请求,请求上调链路宽度为x16,同时USP请求继续把链路宽度下调至x4。两者L0p.Priority均为0,DSP获胜,USP回复x16 L0p以ACK,DSP回复x4 L0p以NAK。
- lane 8~15 重新发送TS1或TS2以重新训练,并在合适位置插入EIEOS使链路退出电气闲。
- DSP及USP均工作在x16下。
文章图片
▲ 图4 L0p动态链路宽度举例
2.1.4 链路宽度下调
??双方端口就链路宽度下调达成一致意见后,两方端口需要独立完成以下事项:
- 待关闭lane上从其下一Flit开始将Flit中的SKPOS替换为EIOSQ,发送完EIOSQ后进入电气闲状态,其他无需关闭的lane不发送EIOSQ,且照常发送数据Flit。
- 若发出L0p请求的端口未收到ACK,只要其收到了EIOSQ,等同于收到ACK,该关lane的关lane。
- 所有待关闭的lane上同时收到EIOS后才能进入L0p,若存在某待关闭的lane上未收到EIOS,则不能进入L0p,而是进入Recovery。
2.1.5 链路宽度上调
??双方端口就链路宽度上调达成一致意见后,需要完成以下事项:
- 发送L0p请求的端口在待开启的lane上发送EIEOSQ,其他lane照常发送数据流,对端收到EIEOSQ后激活相关lane。
- 在开启相关lane时,需注意:待开启的lane与其他正常工作中的lane一起规划SKPOS。考虑到待开启的lane在发送EIEOSQ中的多个EIEOS时有可能会被SKPOS打断,此时可以通过合理规划EIOSQ的起始时刻来保证其中的多个EIEOS背对背发送(未被SKPOS打断),一旦被SKPOS打断,可以重新发。
- 所有待开启的lane上均连续收到8个TS1或TS2后,开始发送TS2。
- 数据速率为8GT/s及以上时,若所有待激活的lane上收到8个连续的TS2,且在收到1个TS2后发出了16个TS2,该端口所有激活及待激活状态下的lane在发送下一SKPOS前需发送SDS。
- 数据速率为8GT/s及以上时,Rx需在所有已激活、待激活的lane间完成lane间de-skew。
- 若24ms还没激活相关lane,则进入Recovery状态。
2.2 再次发送L0p请求 ??端口再次发送L0p请求的时间点是有要求的,满足以下任一条件时本端口方可以再次发送L0p请求:
- 不论上次L0p请求由谁发起,此刻距上次成功实现动态链路切换已过去1us。
- 上次L0p请求由本端口发起,但被拒绝了。
- 上次L0p请求由对端发起且本端口已回复ACK,若上次L0p请求请求上调链路宽度,无论本端口是否监测到对应lane退出电气闲,即无论上调是否成功完成,只要过去2us,本端口均可再次发送L0p请求。
2.3 L0p的进入和退出耗时 ??对于一直处于活跃状态的lane而言,上调和下调链路宽度对数据传输没有任何影响。
??当下调链路宽度时,对于要关闭的lane而言,考虑到要把SKP替换为EIOS才能进入电气闲,最差情况是2个SKP的间隔1.5ms;当上调链路宽度时,耗时跟从L1退出的耗时相同。
2.4 L0p对称性 ??大家知道,Tx和Rx可以单独进入和退出L0s状态,但是对于工作在Flit Mode且启用了L0p的PCIe 6.0设备,其Tx和Rx必须同时进入或退出L0p,且Tx和Rx的链路宽度相同,称之为L0p的对称性。为什么要这么做呢?减少设计的复杂度。考虑到USP及DSP的处理速度或许不同,DSP及USP在动态切换链路宽度的时候,或许存在短时间的链路宽度不同的情况,这是允许的,我们仍然称起是对称的。
3. 链路管理DLLP ??目前链路管理DLLP类型只有L0p链路管理DLLP这一种,其格式如图5所示。
??各字段意义如下:
Byte0
:固定值 8’b00101000,用以指示当前为链路管理DLLP。Byte1
:指示链路管理的类型,目前只有L0p DLLP这一种类型,值为8’b00000000。Byte2
:bit[3:0]表示L0p的命令类型,0100 -> L0p 请求,0110 -> L0p ACK,0111 -> L0p NAK,1010 -> L0p链路上调训练完成;bit[4]在L0p命令为L0p请求时表示L0p请求的优先级,1为高优先级;bit[7:5]预留。Byte3
:bit[3:0]及bit[7:4]均表示链路宽度,其中bit[3:0]是L0p请求或链路上调训练完成的链路宽度,bit[7:4]是L0p NAK/ACK的响应负载,0001b -> x1, 0010b -> x2,0100b -> x4,1000b -> x8,0000b -> x16。
文章图片
▲ 图5 Link Management DLLP (Flit Mode)
??以下几种情况对应的链路管理DLLP无效,Rx收到后应予以忽略:
- 链路管理类型 或 L0p命令类型为保留字段。
- 链路管理类型 或 L0p命令类型正常,但L0p命令类型对应的链路宽度或响应负载为保留字段。
4. 进一步思考 4.1 为什么不继续采用FTS的方式了? ??根据经验,为使设备工作在最坏的环境下仍能正常从L0s回退到L0,设计人员往往采用较大的N_FTS,复杂度增加是一方面,对降低功耗也不太友好。想必之下,从lane数较少的L0p回退到L0,采用EIEOS,方法更为简单直接有效。
4.2 那么切换速度可以进L0p吗? ??怕是不行。不同速率下的信号质量不同,其对应的均衡、加重/去加重参数不同,每切换一种速度都需要重新进行均衡等,即需要进Recovery重新均衡后再切速。
5. 参考
- The PCIe? 6.0 Specification Webinar Q&A: Leveling Up with L0p
- 如何成功过渡到PCIe 6.0并应对芯片设计新挑战?
- What Disruptive Changes to Expect from PCI Express Gen 6.0
- PCIe 6.0时代下的IP挑战
— END — |
精选往期 PCIe 协议系列文章?? 返回顶部 ??
- 【最新技术早知道】PCIe Gen5 还没用上,Gen6 就来了?PCIe 6.0 系列文章之:《PCIe 6.0,到底 6 在哪?》
- 【PCIe 6.0】颠覆性技术!你NRZ相守20年又怎样?看我PAM4如何上位PCIe 6.0 !
- PCIe事务排序(Transaction Ordering)
- PCIe地址转换服务(ATS)详解
- PCIe访问控制服务(ACS)
- PCIe锁定事务(Locked Transactions)介绍
- PCIe TLP Prefix & PASID TLP Prefix介绍
推荐阅读
- Protocol|【PCIe页请求服务】到底到底到底是啥(半年搜遍全网找不到一篇介绍文章,没人写那我来写吧)
- #|【PCIe 6.0】颠覆性技术!你NRZ相守20年又怎样(看我PAM4如何上位PCIe 6.0 !)
- #|PCIe地址转换服务(ATS)详解
- 论文分享|【经验分享】分享 MangoPapa 的论文学习经验
- linux-驱动|NXP LS1046A及飞腾新四核 FT2004 PCIE EP端LINUX设备驱动开发
- #|7-7 约瑟夫问题变形 (10 point(s))
- OI|离散化
- #|51单片机入门(4)蜂鸣器(无源+有源)
- #|CPU、MPU、MCU、SOC的概念与区别