4. SerDes协议复用与配置
Layerscape处理器的SerDes是整颗芯片最“拥挤”的资源:一条物理通道(Lane)在不同产品配置下可能承载PCIe、SATA、SGMII、XFI(10G以太网)、Aurora等多种协议,而每条Lane在同一时刻只能服务一种协议。因此,SerDes协议复用的本质,是在“物理通道—协议控制器—引脚封装”三者之间建立一张确定的映射表,并通过RCW(Reset Configuration Word)在复位阶段锁定这张表,再由设备树把映射结果告知Linux内核。理解这条链路,是排查“网口不识别、PCIe枚举不到设备、SATA盘不挂载”类问题的前提。
一、SerDes物理层与协议控制器的对应关系
Layerscape的SerDes通常以“块(SerDes Block)”为单位组织,例如LS1046A有SerDes1、SerDes2、SerDes3、SerDes4共四个块,每块含4条Lane,合计16条Lane。每条Lane内部包含PLL、发送/接收均衡、时钟数据恢复(CDR)等模拟电路,协议差异主要体现在编码方式、参考时钟频率、速率和链路训练上:
- PCIe:8b/10b(Gen1/2)或128b/130b(Gen3),参考时钟100MHz,支持RC/EP模式,需要链路训练与LTSSM状态机。
- SATA:8b/10b,参考时钟100MHz,速率1.5/3/6Gbps,需要OOB握手。
- SGMII:8b/10b,125MHz参考,1.25Gbps,常用于1G以太网。
- XFI:64b/66b,参考时钟156.25MHz或161.1328125MHz,10.3125Gbps,用于10G以太网。
- Aurora:8b/10b或64b/66b,面向芯片间高速互连,参考时钟与速率由链路双方约定。
关键点在于:协议控制器(PCIe Controller、SATA Controller、DPAA以太网MAC)与SerDes Lane之间并非任意连接,而是由芯片内部固定的交叉开关(Crossbar)决定。例如LS1046A的SerDes1 Lane0可路由到PCIe1 Controller,也可路由到SATA1,但无法路由到以太网MAC。因此配置的第一步不是写寄存器,而是查芯片参考手册中的“SerDes Lane Assignment”表,确认目标协议在目标Lane上是否可达。
二、RCW中的SerDes协议编码
RCW是Layerscape上电时从NOR Flash、SD卡或CPLD加载的512位配置字,其中与SerDes直接相关的是SRDS_PRTCL_S1、SRDS_PRTCL_S2等字段。每个字段是一个16位编码,代表该SerDes块四条Lane的协议组合。以LS1046A为例,SRDS_PRTCL_S1 = 0x1133表示SerDes1的Lane A/B/C/D分别配置为PCIe、SATA、SGMII、XFI。这个编码不是随意定义的,而是芯片手册中列出的合法组合表,写入非法值会导致SerDes PLL不锁定,Lane无输出。
实际工程中,RCW通常由QCVS(QorIQ Configuration and Validation Suite)或NXP提供的RCW工具生成。以LS1046ARDB为例,若要把SerDes1 Lane C从SGMII改为XFI,需要在RCW工具中修改SRDS_PRTCL_S1字段,重新生成二进制并烧写到SD卡偏移0x100处。复位后可通过CCSR空间的SRDSxPLLnCR0寄存器读取PLL锁定状态,确认配置是否生效。
# 读取 SerDes1 PLL 锁定状态(示例地址,以实际手册为准)
devmem 0x1ea0000 32 # SRDS1PLL1CR0
# bit[31] = 1 表示 PLL 已锁定
# 若为 0,检查 RCW 编码是否合法、参考时钟是否存在
三、设备树中的协议描述
RCW只解决物理层“Lane跑什么协议”,设备树则解决“内核用哪个驱动、以什么模式工作”。两者必须严格对应。设备树中与SerDes协议相关的关键属性包括:
status:"okay"启用,"disabled"关闭。未在RCW中分配的控制器必须置为disabled,否则驱动会访问不存在的Lane。phy-mode:以太网节点使用,取值"sgmii"、"xgmii"、"2500base-x"等,决定MAC与PCS的接口类型。num-lanes:PCIe节点使用,表示该控制器占用几条Lane,必须与RCW分配一致。phys/phy-names:部分平台用PHY句柄描述SerDes Lane与控制器绑定。
以LS1046A的SGMII为例,设备树片段如下:
&fman0 {
ethernet@e0000 {
compatible = "fsl,fman-memac";
phy-mode = "sgmii";
phy-handle = &phy_sgmii1;
status = "okay";
};
};
&phy_sgmii1 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x1>;
};
如果RCW把该Lane配成PCIe,而设备树仍把以太网节点置为okay,内核启动时会报“fman-memac: probe failed”或MAC无法link up。反之,RCW配了SGMII但设备树disabled,则ip link看不到该网口。
四、典型配置组合与验证方法
下表给出LS1046A上常见的三种SerDes1配置组合,供实际项目参考(示例参数,具体以芯片手册为准):
| SRDS_PRTCL_S1 | Lane A | Lane B | Lane C | Lane D | 典型用途 |
|---|---|---|---|---|---|
| 0x1133 | PCIe1 x1 | SATA1 | SGMII | XFI | 通用网关 |
| 0x2233 | PCIe1 x2 | — | SGMII | XFI | 双口PCIe扩展 |
| 0x3333 | SGMII | SGMII | SGMII | SGMII | 四口1G交换 |
验证时按以下顺序检查:
- 读
SRDSxPLLnCR0确认PLL锁定; - 用
lspci -tv看PCIe设备是否枚举; - 用
lsblk或dmesg | grep ata看SATA盘是否识别; - 用
ip link show看以太网口是否存在,ethtool看link状态; - 若某控制器缺失,先核对RCW编码,再核对设备树status与phy-mode。
okay,认为“多启用总没错”。实际上未在RCW中分配Lane的控制器一旦被驱动probe,会访问未上电的SerDes寄存器,轻则报错,重则导致总线挂死。正确做法是设备树与RCW严格一一对应。
md 0x1ea0000读取SerDes寄存器,或使用qixis命令查看RCW影子寄存器。对比手册中的合法组合表,可快速定位是RCW错误还是设备树错误。
总结来说,SerDes协议复用是一条“RCW定物理、设备树定驱动、手册定可达”的链路。任何一环错位,都会表现为设备不可见。掌握Lane映射表、RCW编码规则和设备树属性三者的对应关系,就能在Layerscape平台上稳定地完成PCIe、SATA、SGMII、XFI、Aurora等协议的混合配置。