🔥点击查看精选 UCIe 系列文章🔥
🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥
📢 声明:
- 🥭 作者主页:【MangoPapa的CSDN主页】。
- ⚠️ 本文首发于CSDN,转载或引用请注明出处【https://mangopapa.blog.csdn.net/article/details/127362477】。
- ⚠️ 本文目的为 个人学习记录 及 知识分享。因个人能力受限,存在协议解读不正确的可能。若您参考本文进行产品设计或进行其他事项并造成了不良后果,本人不承担相关法律责任。
- ⚠️ 若本文所采用图片或相关引用侵犯了您的合法权益,请联系我进行删除。
- 😄 欢迎大家指出文章错误,欢迎同行与我交流 ~
- 📧 邮箱:mangopapa@yeah.net
文章目录
- 1. PHY LSM 简介
- 2. PHY LSM 状态介绍
- 2.1 RESET
- 2.2 SBINIT
- 2.3 MBINIT
- 2.4 MBTRAIN
- 2.4.1 MBTRAIN.VALVREF
- 2.4.2 MBTRAIN.DATAVREF
- 2.4.3 MBTRAIN.SPEEDIDLE
- 2.4.4 MBTRAIN.TXSELFCAL
- 2.4.5 MBTRAIN.RXCLKCAL
- 2.4.6 MBTRAIN.VALTRAINCENTER
- 2.4.7 MBTRAIN.VALTRAINVREF
- 2.4.8 MBTRAIN.DATATRAINCENTER1
- 2.4.9 MBTRAIN.DATATRAINVREF
- 2.4.10 MBTRAIN.RXDESKEW
- 2.4.11 MBTRAIN.DATATRAINCENTER2
- 2.4.12 MBTRAIN.LINKSPEED
- 2.4.13 MBTRAIN.REPAIR
- 2.5 LINKINIT
- 2.6 ACTIVE
- 2.7 L1/L2
- 2.8 PHYRETRAIN
- 2.9 TRAINERROR
- 3. 参考
1. PHY LSM 简介
UCIe LSM,全称 Link State Machine,链路状态机。UCIe 采用分层的 LSM,包括 FDI LSM、RDI LSM 及 PHY LSM。其中 FDI/RDI LSM 主要用于 UCIe 链路管理,PHY LSM 主要用于 UCIe 链路初始化及训练。PHY LSM 状态转移图如图 1 所示,接下来讲讲 PHY LSM。
UCIe PHY LSM 包含 10 大主状态,各状态及主要功能如下所述:
- RESET,复位状态,是系统复位后或 UCIe 退出 TRAINERROR 后的状态。
- SBINIT,Sideband 初始化,在该状态对 Sideband 进行初始化,选择可用的 SB Lane。
- MBINIT,Mainband 初始化,在该状态对 Mainband 进行初始化、修复坏的 MB Lane。该状态下 Mainband 处于最低速。
- MBTRAIN,Mainband 训练,在该状态对 Mainband 的 Clock、Valid、Data 等 Lane 进行训练,使得 UCIe 链路工作在链路两端设备协商好的最高速或协商速率之下物理所能达到的最高速。跟 PCIe 不同,PCIe 是从 Gen1 最低速开始一点点往最高速进行训练的,但 UCIe 除了在初始化的时候为最低速,其在 MBTRAIN 状态对 Mainband 进行训练时一次切速到最高速进行训练,训练失败的话再进行降速或者减宽。
- LINKINIT,链路管理状态,用以 D2D Adapter 完成初始链路管理。该状态时,进行 RDI Bring Up。
- ACTIVE,UCIe 的正常工作状态,该状态时进行 Mainband 的数据传输,对应 PCIe 的 L0 状态。
- L1/L2,低功耗状态,处于这两种状态下的 UCIe Module 功耗较低,处于 L2 状态的 UCIe Module 比 L1 睡眠程度更深、功耗更低。L1 可以直接退出到 MBTRAIN 状态,免去 SBINIT 及 MBINIT 的过程,但 L2 只能退出到 RESET 状态,重新进行链路的初始化。
- PHYRETRAIN,需要重新对链路进行链路初始化及训练时,进入该状态。
- TRAINERROR,链路训练失败后进入该状态。
在 PHY 的初始化及训练过程中,Sideband、Mainband 是分开进行初始化和训练的。首先对 Sideband 进行初始化,使 Sideband 进入正常工作状态,便于后续初始化及训练过程中在 UCIe Link 上传递 Sideband Msg;然后进行 Mainband 初始化,UCIe Link 两侧的 Module 进行参数交换及协商、链路修复等工作,使 Mainband 能够工作在最低速(4 GT/s)。接下来对 Mainband 进行训练,进行电气参数调整、切速等工作,使 Mainband 工作在最高传输速率。Mainband 训练完毕后,进行 RDI Bring Up,最后 PHY LSM 进入 Active 状态,完成链路初始化及训练过程。
1.1 Timeout 机制
PHY LSM 所有状态(子状态)中,除了 RESTE 和 TRAINERROR 之外,其他所有状态都有个 8ms 超时退出的机制。这里的 8ms 超时退出是针对子状态或不含子状态的主状态而言的,且 8ms 计数器会在收到远端发来的 Stall Sideband Message 后重置。若 LSM 在某个状态持续时间超过 8ms 且计数器没有被重置,则状态跳转至 LINKTRAINERROR,并最终进入 RESET 状态。
2. PHY LSM 状态介绍
2.1 RESET
每次进入 RESET 状态,至少应停留 4ms。这 4ms 主要是用来等待 PLL 稳定的,只有在满足一定的电气及软件条件之后才能进入下一状态。满足以下 所有 条件时方能进入 SBINIT 状态:
- 供电稳定
- Sideband Clock 800 MHz 稳定可用
- Mainband 及 D2D Adapter 的 Clock 稳定可用
- Mainband 时钟置为最低 IO 速率(2 GHz,对应 4 GT/s)
- SoC 或 Firmware 未请求 PHY 留在 RESET 状态
- 链路训练被触发
2.1.1 触发链路训练的条件
符合以下 任一 情况,即可认为触发了链路训练:
- 软件将 UCIe Link Control 寄存器 Link Training 位置一。
- Adapter 触发 RDI 链路训练。
- Sideband 接口上连续接收到两笔 SBINIT Pattern (64 UI Clock + 32 UI Low)。
2.2 SBINIT
SBINIT 期间涉及到的 Sideband Msg 及 Pattern:
- SBINIT Pattern,64UI Clock Pattern + 32UI Low x2
- {SBINIT Out of Reset}
- {SBINIT done req}
- {SBINIT done resp}
SBINIT 期间,Tx 在 SB Data Lane (Normal & Redundant for Advanced)上 同时发送 Clock Pattern,Rx 在检测到连续 2 个 Clock Pattern 后即表示检测成功。此后,其 Tx 继续发送 4 个 Clock Pattern,然后停止发送 Clock Pattern。接下来应该是要继续连续发送 {SBINIT Out of Reset} 了。
举个例子:Module 1 发送 Clock Pattern 给 Module 2,Module 2 收到了,并停止了发送 Clock Pattern,转而发送 {SBINIT Out of Reset}。若此时 Module 1 并没有收到 Module 2 的 Clock Pattern,该怎么办?是否有可能收不到 Clock Pattern 但能收到 {SBINIT Out of Reset}? ——是不可能跳过 Clock Pattern 直接收到 {SBINIT Out of Reset} 的。对端在发送 {SBINIT Out of Reset} 之前肯定已经检测到了我方发给它的 Clock Pattern,其也正在发送 Clock Pattern 给我方。若我方收不到对方发来的 Clock Pattern,说明 Sideband Lane 是坏的,不能说一会儿坏一会儿好。如果是对端到我方的 TXSB 坏了,那我方一直收不到 Clock Pattern,会进 TRAINERROR 的。
两种封装形式下 SBINIT 稍有不同,先进封装的 SBINIT 比标准封装多了 Sideband 时钟数据线选择这一步,需要在初始化期间选择最终要用的 SB Lane。
2.3 MBINIT
MBINIT 分为 6 个子状态,如图 2 所示,先后依次执行。在 MBINIT 期间,进行 Mainband 初始化、修复或减宽。6 个子状态中 Lane Repair 仅适用于先进封装的 UCIe Module。Mainband Lane 的检测跟 Sideband 稍有不同,Sideband 是在 Clock、Data Lane (Normal & Redundant for Advanced) 上同时发生 Test Pattern,而 Mainband 是按照 Clock、Track、Valid、Data 依次测试,且 Normal Lane 与 Redundant Lane 也是依次进行测试的。
2.3.1 MBINIT.PARAM
MBINIT.PARAM 期间,链路两端的 UCIe Module 进行参数交换,以协商链路速度、链路宽度及其他 PHY 相关参数。交换的参数主要有:
- Voltage Swing
- Maximum Data Rate
- Clock Mode
- Clock Phase
- Module ID
协商以上参数涉及到的 Sideband Message:
- {MBINIT.PARAM Configuration Req}
- {MBINIT.PARAM Configuration Resp}
2.3.2 MBINIT.CAL
MBINIT.CAL 进行一些 Calibration 相关操作,比如 Tx 占空比校正、Rx 偏移及 Rx 参考电压 Vref 校正。涉及到的 SB Msg:
- {MBINIT.CAL Done Req}
- {MBINIT.CAL Done Resp}
2.3.3 MBINIT.REPAIRCLK
对于先进封装,该状态下检测 Clock 及 Track 功能,存在问题时进行 Clock 及 Track Lane 修复;对于标准封装,仅检测 Clock 及 Track Lane 的功能。
Advanced Package
每一根 Clock 或 Track Lane 先后独立进行检测,检测其是否存在短路或断路。这几条 Lane 的检测顺序为:TCKP_L -> TCKN_L -> TRDCK_L -> TTRK_L。这里为啥要检测 Redundant Lane?——要是常规 Lane 真出了问题,得保证 Redundant Lane 没问题啊。
检测过程如下:
- 检测之前,先通过 {MBINIT.REPAIRCLK init req}、{MBINIT.REPAIRCLK init resp} 进行握手。
- 检测的时候,在 Clock 或 Track Lane 上发送 128 次特定格式的 Clock Repair Pattern (16 cycle pattern + 8 cycle low)。Tx 发送完 Clock Repair Pattern 后,发送 {MBINIT.REPAIRCLK result req} 给对方,请求对方反馈检测结果。
- Rx 该条 Lane 上连续收到 16 次即可认为该 Lane 完好。如若该 Lane 没有检测到,表明该 Lane 发生了断路;若该 Lane 及之外的 Lane 同时检测到了,表明发生了短路。检测完后将检测结果记录在相关寄存器中。
- Rx 在收到 {MBINIT.REPAIRCLK result req} 后通过 {MBINIT.REPAIRCLK result resp} 反馈结果给对方。
经过以上检测步骤之后,有三种结果:
- Lane 功能正常,无需修复。
- 需要修复且可以修复。 如果需要 Lane Repair 且可修复,则进行 Lane Repair 相关操作。Tx 发送 {MBINIT.REPAIRCLK apply req} 给对端,收到对端发来的 {MBINIT.REPAIRCLK apply resp} 后即可在 Tx 进行 Clock Lane Repair。Tx 修复完成后,需要检测下是否修复成功。检测时不检测 Redundant Lane 了,已经被占用了。检测过程如下:
- Tx 发送 {MBINIT.REPAIRCLK check repair init req} 给 Rx,Rx 收到 {MBINIT.REPAIRCLK check repair init req} 后回复 {MBINIT.REPAIRCLK check repair init resp}。
- Tx 收到 Rx 发来的 {MBINIT.REPAIRCLK checkrepair init resp} 后,按照 Clock Lane 检测程序走一遍。
- 需要修复但无法修复。 考虑到只有一条 Redundant Lane,如果有 2 条及以上的 Clock Lane 有问题,那就不可修复了,则 Rx 进行相关握手跳至 TRAINERROR 状态。
如果无需进行 Clock Lane Repair 或已经修复完毕且检测成功,发送 {MBINIT.REPAIRCLK done req},收到对端反馈的 {MBINIT.REPAIRCLK done resp} 后,状态机进入 MBINIT.REPAIRVAL 修复 Valid Lane。
Standard Package
对于标准封装的 UCIe,MBINIT.REPAIRCLK 期间仅检测 Clock Lane 的功能,检测过程跟 Advanced 时的检测过程类似,只是没有 Redundant Lane 的检测过程。如果检测到某些 Clock Lane 有问题,则跳转到 TRAINERROR 状态,否则直接进入 MBINIT.REPAIRVAL 状态。
2.3.4 MBINIT.REPAIRVAL
该过程检测 Mainband Data Valid Lane,若存在短路或短路,则进行修复。检测及修复过程跟 Clock/Track Lane 的过程类似,只是检测的 Lane、Pattern 及 Msg 稍有区别:
- 检测的 Lane 有 TVLD_P 及 TRDVLD_P,先后依次检测。
- 测试 Pattern 为 4 UI High + 4 UI Low。
- Msg 跟 Clock Repair Msg 类似,所有的 Msg 名称由 REPAIR 换成了 REPAIRVAL。
2.3.5 MBINIT.REVERSALMB
只有在 Mainband 的 Clock 及 Valid Lane 能够正常工作的前提下,MBINIT.REVERSALMB 状态才有效,否则 Lane Reversal 是没有意义的。如有需要,该状态时进行 Lane 序重排。Lane Reversal 步骤如下:
- Tx 发送 {MBINIT.REVERSALMB init req} 到对端。
- 若对端 Mainband Data Lane 准备好接受数据,则反馈 {MBINIT.REVERSALMB init resp}。
- 本端收到 {MBINIT.REVERSALMB init resp} 后,每条 Data Lane 上发送携带有 Lane ID 的 Pattern,连续发送 128 次。
- 对端收到带有 Lane ID 的 Pattern 后,跟本地 Lane ID 进行比较,将比较结果记录在相关寄存器中。
- 本端发送 {MBINIT.REVERSALMB result req},请求对端反馈检查结果。
- 对端通过 {MBINIT.REVERSALMB result resp} 反馈结果。
- 考虑到可能有些 Data Lane 需要进行 Lane Repair,只要大部分 Lane ID 都是对的,就不用进行 Lane Reversal;若只有少部分对,则需要 Lane Reversal。
- 若需要 Lane Reversal,则在 Tx 端进行 Lane Reversal,完成之后重新检查一遍。若 Lane Reversal 之后还是检查不过,那就是链路存在问题,进入 TRAINERROR 状态。
- 若无需 Lane Reversal 或成功完成了 Lane Reversal,Tx 发送 {MBINIT.ReversalMB done req} 请求退出。
- 对端回复 {MBINIT.ReversalMB done resp} 后跳转到 MBINIT.REPAIRMB 状态。
2.3.6 MBINIT.REPAIRMB
MBINIT.REPAIRMB 状态下,对 Mainband Data Lane 的功能进行检测。若先进封装的 UCIe 出现坏 Lane,在修复能力之内时进行坏 Lane 修复,在修复能力之外时进入 TRAINERROR 状态。若标准封装的 UCIe 出现了坏 Lane,进行减宽操作。
2.4 MBTRAIN
MBTRAIN 状态下对 Mainband 进行训练,将 UCIe 链路速度提升到双方协商好的最高速率,并调整 Clock 边沿到最佳采样时刻。对于较高的速率,还需要进行 Rx Clock Calibration、Tx/Rx Deskew 等操作以提高传输性能。UCIe 链路两端的两个 UCIe Module 通过 Sideband 上的 Msg 进行握手来进入和退出各个子状态,如果进入某个子状态后不需要相关操作,可以退出去,但这个子状态还是要进来的。MBTRAIN 子状态转移图如图 3 所示。
注意:在 MBINIT 的时候还是最低速,在 MBINIT.SPEEDIDLE 的时候就一把切到了协商好的最高速。如果一次 MBTRAIN 能够到最高速,那就一次齐活。如果最高速失败了,那就降速。
在链路训练连续失败次数达到指定上限之后,LSM 回退到 RESET 状态,等待再次触发链路训练。若软件或 RDI 触发的链路训练失败,或 Link Up 转为 Link Down,物理层需要上报 RDI 的 Fatal Error。
2.4.1 MBTRAIN.VALVREF
MBTRAIN.VALVREF 时 Mainband 仍处于最低速,期间对 Valid Lane 的 接收端参考电压 进行训练,以实现对 Valid 信号的最佳采样。以 {MBTRAIN.VALVREF start req}/{MBTRAIN.VALVREF start resp} 这对握手信号启动训练,训练完毕后以 {MBTRAIN.VALVREF end req}/{MBTRAIN.VALVREF end resp} 这对握手信号退出该子状态。
训练期间,Data Lane 保持在低电平状态,Valid Lane 上发送 128 次 VALTRAIN Pattern (4 UI High + 4 UI Low)。
2.4.2 MBTRAIN.DATAVREF
MBTRAIN.DATAVREF 期间对 Data Lane 的 接收端参考电压 进行训练,以实现对 Data 信号的最佳采样。以 {MBTRAIN.DATAVREF start req}/{MBTRAIN.DATAVREF start resp} 这对握手信号启动训练,训练完毕后以 {MBTRAIN.DATAVREF end req}/{MBTRAIN.DATAVREF end resp} 这对握手信号退出该子状态。
训练时采用 Rx Initiated Point Test 或 Rx Initiated Eye Width Sweep Test。训练期间,Data Lane 上发送 4K UI LFSR Pattern,若 Rx 接收到的 LFSR Error Bit 在阈值之内,则训练成功。
2.4.3 MBTRAIN.SPEEDIDLE
MBTRAIN.SPEEDIDLE 是 UCIe 的一个电气闲状态,该状态时可以进行切速。
该子状态有 4 个入口:MBTRAIN.DATAVREF,MBTRAIN.LINKSPEED,PHYRETRAIN 及 L1。如果从 DATAVREF 进来,表明这是此次链路训练第一次进该状态,则调整传输速率到 UCIe 链路两端设备协商好的最高速率。如果从 MBTRAIN.LINKSPEED 或 PHYRETRAIN 状态进来,表明最高速没有训练成功,或最高速时链路遇到了问题,则在最高速率基础上降低一档速率再次进行训练。如果从 L1 低功耗状态进入,文档没写以何种速率进行训练,笔者认为是按照上一次的速率进行训练。
切速完成之后,通过 {MBTRAIN.SPEEDIDLE done req} 及 {MBTRAIN.SPEEDIDLE done resp} 握手退出到 MBTRAIN.TXSELFCAL 状态。
2.4.4 MBTRAIN.TXSELFCAL
MBTRAIN.TXSELFCAL 期间,Tx 保持电器闲,Tx 独立进行电气参数的调整。调整完毕后,通过 {MBTRAIN.TXSELFCAL Done req} 及 {MBTRAIN.TXSELFCAL Done resp} 握手后进入 MBTRAIN.RXCLKCAL 状态。
注意,没有 {MBTRAIN.TXSELFCAL start req/resp} 握手信号。
2.4.5 MBTRAIN.RXCLKCAL
MBTRAIN.RXCLKCAL 期间对 Rx Clock 电气参数进行调整。{MBTRAIN.RXCLKCAL start req} 及 {MBTRAIN.RXCLKCAL start resp} 握手完成后开始调整,调整期间 Clock 保持 Free Run,Data 及 Valid 保持在低电平,Tx 端不能改动任何 Clock 电气参数或 PI Phase。
完成 {MBTRAIN.RXCLKCAL done req} 及 {MBTRAIN.RXCLKCAL done resp} 握手后退出到 MBTRAIN.VALTRAINCENTER 状态。
2.4.6 MBTRAIN.VALTRAINCENTER
MBTRAIN.VALTRAINCENTER 期间 Tx Initiated Eye Width Sweep 或 Tx Initiated Point Test 相关操作,以保证 Clock 能够在 Valid 中心采样。测试 Pattern 仍然采样 VALTRAIN Pattern。
训练前采用 {MBTRAIN.VALTRAINCENTER start req} 及 {MBTRAIN.VALTRAINCENTER start resp} 进行握手。训练完成后采用 {MBTRAIN.VALTRAINCENTER start req} 及 {MBTRAIN.VALTRAINCENTER start req} 进行握手,退出到 MBTRAIN.VALTRAINVREF 状态。
文档里写,该状态的下一状态为 MBTRAIN.DATATRAINVREF,此处存疑。
2.4.7 MBTRAIN.VALTRAINVREF
MBTRAIN.VALTRAINVREF 做的事跟 MBTRAIN.VALVREF 大差不差,区别在于本状态时的速率已经是切速之后的了,且测试是 Tx 始发的,必要时可以做 Tx Deskew。
2.4.8 MBTRAIN.DATATRAINCENTER1
MBTRAIN.DATATRAINCENTER1 期间进行 D2C 训练。做的事跟 MBTRAIN.DATAVREF 大差不差,区别在于本状态时的速率已经是切速之后的了,且测试是 Tx 始发的,。
文档里写,该状态的下一状态为 MBTRAIN.DESKEW,此处存疑。
2.4.9 MBTRAIN.DATATRAINVREF
MBTRAIN.DATATRAINVREF 做的事跟 MBTRAIN.DATAVREF 大差不差,区别在于本状态时的速率已经是切速之后的了,且接收端参考电压的调整是可选的。
2.4.10 MBTRAIN.RXDESKEW
MBTRAIN.RXDESKEW 状态下进行可选的 Rx Deskew 操作。测试操作选用 Rx Initiated Full Eyed Width Sweep 或 Rx Initiated Point Test。
2.4.11 MBTRAIN.DATATRAINCENTER2
考虑到上一状态中可能存在的 Rx Deskew,MBTRAIN.DATATRAINCENTER2 状态下重新进行一次 MBTRAIN.DATATRAINCENTER 类似的操作,来决定眼图中心。该状态下,通过调整 Clock Phase 来找到眼睛睁的最大的位置作为最终的数据采样时刻。下一状态为 MBTRAIN.LINKSPEED。
注意,本状态下不做 Tx Deskew。不然眼图中心白找了。
2.4.12 MBTRAIN.LINKSPEED
MBTRAIN.LINKSPEED 是成功完成 Mainband 训练的最后一个子状态,该状态下检测链路的稳定性。如果检测通过,则退出到 LINKINIT 状态。一旦发现 Mainband 链路稳定性存在问题,根据检测结果决定进行降速还是 Lane Repair,分别对应 MBTRAIN.SPEEDIDLE 及 MBTRAIN.REPAIR 状态。
2.4.13 MBTRAIN.REPAIR
MBTRAIN.REPAIR 有两个入口,MBTRAIN.LINKSPEED 及 PHYRETRAIN,无论那个入口,进到这个状态都是要进行坏 Lane 修复或减宽。
2.5 LINKINIT
LINKINIT 是 LSM 进入 ACTIVE 之前的最后一个状态,用以 D2D Adapter 完成初始链路管理。该状态时,进行 RDI Bring Up。RDI Bring Up 成功之后,UCIe Link Control Register 中的 Start UCIe Link Training 字段清零,LFSR 复位。
2.6 ACTIVE
PHY LSM 进入 ACTIVE 状态,表示物理层已经完成了初始化,RDI 已经 Active,上层可以在 UCIe Link 上交换数据了。此时传输的数据是经过 LFSR 加扰的。
RDI 状态机到达 Active 状态后,就完成了链路初始化的 Stage2。Stage3 对应 FDI Bring Up,协议里没有明确提到 FDI Bring Up 发生在 PHY LSM 的哪个状态,但可以肯定的是 FDI Bring Up 发生于 RDI Bring Up 之后、Mainband 业务传输之前。Stage3 时,Adapter 内的 FDI 状态走到 Active。
2.7 L1/L2
L1 及 L2 是 UCIe 的低功耗状态,其比 ACTIVE 状态下的 Dynamic Clock Gating 功耗更低。本端 Adapter 及对端均可以请求退出低功耗状态。L1 退出后是 MBTRAIN.SPEEDIDLE,L2 则是直接退出到 RESET 状态。
2.8 PHYRETRAIN
Local Die 的 Adapter、PHY 及 Remote Die 都可以触发 PHY 进入 Retrain。 进入 PHYRETRAIN 状态后,变量 PHY_IN_RETRAIN 置一。
2.8.1 Local Adapter 发起 Retrain
Adapter 触发 PHY 进入 RETRAIN 状态的过程如下:
- Adapter 直接通过 RDI 的 lp_state_req=Retrain 请求 PHY 进入 RETRAIN 状态。
- PHY 收到 lp_state_req=Retrain 后,在 RDI 接口上通过 pl_stallreq/lp_stallack 完成 Stall 的Req/Ack 握手。
- PHY 发生 Sideband Message {PHYRETRAIN.retrain init req} 到对端。
- 对端完成 Stall 握手且 RDI 进入 Retrain 状态后,反馈 Sideband Message {PHYRETRAIN.retrain init resp}。
- 本端收到 {PHYRETRAIN.retrain init resp} 后,本端 RDI 进入 Retrain 状态。
- 本端发送 {PHYRETRAIN.retrain start req} 到对端,依据 Runtime Link Test Control 寄存器填充 Msg 中的 Retrain Encoding 字段(没有 Lane Error、有 Lane Error 但可修复、有 Lane Error 且不可修复),便于对端知晓此次 Retrain 的意图。
- 对端收到 {PHYRETRAIN.retrain start req} 后,跟其自身的 Retrain Encoding 比一下,不冲突的话则直接采用相同的 Retrain Encoding 反馈 {PHYRETRAIN.retrain start resp},有冲突的话,做下处理再反馈。
- 收到 {PHYRETRAIN.retrain start resp} 后,PHY 根据协商好的 Retrain Encoding 进行相应的 MBTRAIN 子状态(MBTRAIN.TXSELFCAL、MBTRAIN.REPAIR、MBTRAIN.SPEEDIDLE)。
优先级:No Lane Error < Repair < Speed Degrade。
为什么 Speed Degrade 比 Repair 的优先级还高? 没有修复的可能了才会 Speed Degrade,当然 Speed Degrade 的优先级更高。
2.8.2 Local PHY 发起 Retrain
PHY 触发 Retrain 有两种方式:
- PHY 检测到对端发来的 Mainband 数据存在 Frame Error 时,通过 RDI pl_error 告知 Adapter,并主动请求进入 Retrain。进入 Retrain 的步骤跟 Adapter 触发类似,只是没有 lp_state_req=Retrain 的操作。
- MBTRAIN.LINKSPEED 期间检测到 Runtime Link Testing Control 寄存器(Runtime Link Test Control, p209)发生变化,PHY 发送 {PHYRETRAIN.retrain start req} 给对端,触发 Retrain。
2.8.3 Remote Die 发起 Retrain
收到 Remote Die 发来的 {PHYRETRAIN.retrain init req} 后,本端开始 Retrain。进入 Retrain 的步骤已经包含在 Adapter 或 PHY 触发 Retrain 的过程中了,不再赘述。
2.9 TRAINERROR
UCIe 初始化期间发生错误或者需要 LSM 回退到的 RESET 时,LSM 先进入 TRAINERROR 状态。
若 Sideband 已经 Active 了(SBINIT 之后的状态),此时 UCIe 链路一端的 UCIe Module 需要进入 TRAINERROR,应跟链路对端进行握手,双双进入该状态。若 Sideband 还没 Active,则不必告诉对端,其自行进入 TRAINERROR 即可。对端长时间得不到相关响应也会自己进入 TRAINERROR 的。
涉及到的 Sideband Message 握手信号:
- {TRAINERROR Entry Req}
- {TRAINERROR Entry Resp}
如果 Req 发出后 8ms 未等到 Resp,则直接进入 TRAINERROR。
文档没有给出具体的 TRAINERROR 退出到 RESET 的条件,只给了几种建议:RDI 没有处于 LinkError 则直接退出到 RESET,否则等待 RDI 退出 LinkError 后才能退出到 RESET 状态。
退出到 RESET 前还用握手吗? 目前看是不需要的,文档没有提到,也没有找到相关 SB Msg。
3. 参考
- UCIe Spec r1.0, Chapter 4
- UCIe 物理层介绍(逻辑物理篇)
|
🔥 精选往期 UCIe 协议系列文章,请查看【 Chiplet 专栏】🔥
⬆️ 返回顶部 ⬆️