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上是否可达。

Layerscape SerDes 协议复用映射(以 LS1046A 为例) 协议控制器 PCIe1 RC/EP Gen1/2/3 SATA1 1.5/3/6 Gbps eTSEC (SGMII) 1.25 Gbps 10G MAC (XFI) 10.3125 Gbps Aurora 芯片间互连 SerDes 块 / Lane SerDes1 (4 Lanes) Lane A PCIe1 x1 / SATA1 Lane B PCIe1 x1 / SGMII Lane C SGMII / XFI Lane D XFI / Aurora SerDes2/3/4 结构类似,映射不同 RCW 配置 RCW[SRDS_PRTCL_S1] 选择 SerDes1 协议组合 如 0x1133 = PCIe+SATA+SGMII+XFI 复位时锁存,运行中不可改 错误组合导致 Lane 无输出 设备树描述 pcie@3400000 { status="okay"; } sata@3200000 { status="okay"; } ethernet@1ae0000 { phy-mode="sgmii"; } ethernet@1af0000 { phy-mode="xgmii"; } 内核据此加载对应驱动 与 RCW 不一致则设备不可用 配置顺序: 1. 查手册确认 Lane 可达性 → 2. 确定 RCW 协议编码 → 3. 烧写 RCW 并复位 → 4. 按映射修改设备树 → 5. 启动后核对 dmesg 与 lspci/lsblk/ip link 三者必须一致:RCW 决定物理层协议,设备树决定内核驱动绑定,任一错位都会表现为“设备不存在”。

二、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_S1Lane ALane BLane CLane D典型用途
0x1133PCIe1 x1SATA1SGMIIXFI通用网关
0x2233PCIe1 x2—SGMIIXFI双口PCIe扩展
0x3333SGMIISGMIISGMIISGMII四口1G交换

验证时按以下顺序检查:

  1. 读SRDSxPLLnCR0确认PLL锁定;
  2. 用lspci -tv看PCIe设备是否枚举;
  3. 用lsblk或dmesg | grep ata看SATA盘是否识别;
  4. 用ip link show看以太网口是否存在,ethtool看link状态;
  5. 若某控制器缺失,先核对RCW编码,再核对设备树status与phy-mode。
常见误区:把设备树中所有控制器都设为okay,认为“多启用总没错”。实际上未在RCW中分配Lane的控制器一旦被驱动probe,会访问未上电的SerDes寄存器,轻则报错,重则导致总线挂死。正确做法是设备树与RCW严格一一对应。
调试技巧:若不确定当前RCW实际编码,可在U-Boot下执行md 0x1ea0000读取SerDes寄存器,或使用qixis命令查看RCW影子寄存器。对比手册中的合法组合表,可快速定位是RCW错误还是设备树错误。

总结来说,SerDes协议复用是一条“RCW定物理、设备树定驱动、手册定可达”的链路。任何一环错位,都会表现为设备不可见。掌握Lane映射表、RCW编码规则和设备树属性三者的对应关系,就能在Layerscape平台上稳定地完成PCIe、SATA、SGMII、XFI、Aurora等协议的混合配置。