E2000S BMC上电复位和看门狗复位

📅 2026/7/16 4:20:22 👁️ 阅读次数 📝 编程学习
E2000S BMC上电复位和看门狗复位

通过redfish接口执行GracefulRestart或者ForceRestart,或者在BMC终端执行reboot reboot -f复位属于软复位,其源数值都是0x3,本文主要介绍下0x1上电复位以及0x80看门狗复位。

测试U-Boot和对应PBF版本信息如下:


U-Boot 2022.01-00004-g4bbd338989-uboot-24.12-4-dirty (Jun 06 2025 - 02:39:15 +0000)
v2.3(release):bmc-v1.08-6-g76184d4

上电复位

触发方式:外部断电再上电

关键特征:最彻底,会重新训练DDR、初始化PCIe

上电复位(POR)是由硬件电压监控电路触发的、芯片全状态重置过程。它不仅清零了所有 CPU 寄存器和缓存,还强制重新校准了 PLL 时钟、完整执行了 DDR 内存的物理层训练、硬复位了 PCIe 总线链路状态,并对关键外设(如网络 PHY)执行了上电自检。它是 BMC 唯一能够清除内存软错误(DDR ECC 无法纠正的位翻转)重置 PCIe 设备内部状态机死锁的复位手段。

阶段一:电源爬升与复位源捕获

日志的第一行由芯片内部的复位控制器(Reset Controller)在电源轨稳定后唤醒 BootROM 时产生。

[2026/7/14 11:11:26] [497] e2ps23 login: P: power on... [2026/7/14 11:11:26] [586] reset source = 1 [2026/7/14 11:11:26] [586] power on reset done!
  • 物理含义:PMIC(电源管理芯片)将 BMC 内核电压(VDD_CORE)从 0 V 拉升至目标值,内部 POR 电路检测到阈值电压后释放复位信号。

  • 寄存器记录:硬件锁存器记录下本次复位诱因为1(硬连线逻辑),并打印power on reset done!


阶段二:PLL 锁相环与时钟树重建

与软件复位(0x3)保留 PLL 状态不同,上电复位强制 PLL 失锁并重新锁定。

[2026/7/14 11:11:26] [604] Parametr :pll 0 frq = 1000 [2026/7/14 11:11:26] [604] Parametr :pll 1 frq = 1000 [2026/7/14 11:11:26] [614] Parametr :pll 3 frq = 1200 ... [2026/7/14 11:11:27] [870] N: reg_pll_c0_real = 1000 MHZ
  • 意义:CPU 核心、总线、DDR 控制器等所有外设的参考时钟源被重新配置。这是软件复位(0x3完全跳过的步骤,软件复位依赖于 PLL 已经锁定。


阶段三:DDR 内存从“零”开始训练

这是上电复位(0x1)与软件复位(0x3)最本质的区别。软件复位时,内存处于自刷新状态,直接复用参数;而 POR 时,内存颗粒处于纯断电状态,必须重新进行物理层训练。

[2026/7/14 11:11:28] [633] Mcu Start Work ... [2026/7/14 11:11:28] [633] CTL Freq = 533Mhz [2026/7/14 11:11:28] [845] *** lpddr4 *** [2026/7/14 11:11:28] [926] wrlvl... done [2026/7/14 11:11:29] [036] rdlvl... done [2026/7/14 11:11:29] [110] BIST OK, access memory!
  • wrlvl(写电平校准):调整 DQS(数据选通信号)与 CK(时钟)的相位差,确保数据能正确写入。

  • rdlvl(读电平校准):调整 DQ(数据线)与 DQS 的时序,确保数据能被正确读取。

  • BIST(内建自测试):向所有内存地址写入并读出特定数据,验证物理链路完好。

  • 关键结论:这段长达1~2 秒的训练过程,在reset source = 3的日志中完全不存在(直接打印DRAM: 1.8 GiB)。只有source=1才会强制执行。


阶段四:PCIe 控制器硬复位与链路重训练

上电复位会强制 PCIe 物理层(PHY)进入初始状态,重新进行链路协商。

[2026/7/14 11:11:28] [468] I: PEU 0 phy init [2026/7/14 11:11:28] [468] I: peu0 c0 phy init. [2026/7/14 11:11:28] [468] I: peu0 c1 phy init. [2026/7/14 11:11:28] [500] I: set bmc_ep mode start [2026/7/14 11:11:28] [338] pcie reset high
  • 软件复位通常只做链路热复位(Hot Reset),保留大部分链路状态;而 POR 会重置 PCIe 的 LTSSM(链路训练状态机),相当于重新插拔了一次 PCIe 设备。


阶段五:网络 PHY 上电自检(POST)

这是上电复位独有的外设自检流程:

[2026/7/14 11:11:30] [318] SGMII_TEST_START [2026/7/14 11:11:30] [333] SEL_SGMII_SUCCESS [2026/7/14 11:11:30] [340] RST: SEL_TEST_PASS
  • 这表明 BMC 的千兆网络 PHY 芯片在 POR 阶段执行了一次内部回环测试(Loopback Test),确保物理介质无关接口(MII)正常工作。在软件复位(0x3)时,这个测试被跳过以节省启动时间。

看门狗复位

reset_type

复位类型共享内存值SE 执行的动作硬件信号最终复位源寄存器
WDT RESET(SOC复位)0拉低hresetn触发全局硬件复位0x8(看门狗复位)
CORE RESET(核复位)1/或其它仅复位 AP 核不触发硬件全局复位0x3(CPU软件复位)
NONE2无动作不产生复位
  1. WDTRESETSOC复位,用于复位AP整个处理器,主要用于E2000 BMC发生卡死,对服务器正常使造成影响,需要掉电才能恢复的情况);
  2. CORE RESET(核复位,不影响服务正常使用,仅需要复位BMC重启可解决的错误);
  3. NONE(不进行复位动作,运行wdt的服务会死掉,用信号标识,可用于检测某关键服务)。

E2000S一共提供了2个wtd,例如:meta-phytium-openbmc/meta-tx/recipes-kernel/linux/linux-phytium/phytium-6.6.y/tx16/phytium-bmc-e2ps23.dts,配置情况如下:

&watchdog0 {
status = "okay";
};

&watchdog1 {
status = "okay";
};

指定某个wtd的复位方式,增加如下字段即可:

reset_type = "wdt reset"

core reset 和none为其它可选参数 。

内核wtd驱动初始化时,会根据内核设备树参数往0x32A11810(属于BMC的共享内存)写入对应数值。不写时,会获取到随机数值,默认为core reset

0x32A11810为起始地址,使用了4个字节来存储watchdog的复位方式

总的来说,飞腾 E2000 的分级复位方案,本质上是利用 SE作为代理,将硬件看门狗“只能拉 hresetn”的单一能力,扩展为可通过共享内存配置的、分级可控的复位策略。由 Linux 驱动根据设备树配置向 0x32A11810 写入数值进行配置,SE 在超时后执行最终裁决。但本质上这两种方式复位程度还是比0x1低,因为SE也存在卡死的可能。

默认的wtd 复位

从BMC初次上电的日志可以看出:

1.使用的是ARM SBSA(Server Base System Architecture)标准的看门狗驱动

2.由于设备树未指定timeout-sec,驱动使用了内核源码中定义的默认值30s

3.action=0:表示超时后触发系统复位(action=1通常表示中断)

4. systemd 接管并重新设置了超时:

  • systemd 在启动后,会主动打开/dev/watchdog0并设置自己的超时时间。

  • 这里的2min是 systemd 默认的看门狗超时值(可通过RuntimeWatchdogSec在 /lib/systemd/system.conf.d/40-hardware-watchdog.conf中配置)。修改配置后执行systemctl daemon-reexec后有效

  • 从这一刻起,硬件的超时时间已经被 systemd 从 30 秒改写为 2 分钟

5.sbsa-gwdt驱动没有提供pretimeout_governor这个 sysfs 接口,不支持预超时RuntimeWatchdogPreSec,systemd 完全忽略它

6. 喂狗时间间隔为 RuntimeWatchdogUSec/4 s,向上取整

root@e2ps23:~# systemctl show | grep -i watchdog
WatchdogDevice=/dev/watchdog0
WatchdogLastPingTimestamp=Sun 2025-03-09 00:59:34 UTC
WatchdogLastPingTimestampMonotonic=2495989985
RuntimeWatchdogUSec=2min
RuntimeWatchdogPreUSec=30s
RebootWatchdogUSec=1min
KExecWatchdogUSec=0
ServiceWatchdogs=yes

devmem 0x32A11810
0xDC062A99

默认情况下,wtd0和wtd1都被配置为核复位,从硬件和驱动层面,两个设备完全可以同时工作,只是需要不同的进程分别去打开和控制它们。但wdt0wdt1不能同时被 systemd 使用,因为 systemd 只支持指定一个看门狗设备(WatchdogDevice)。

默认情况下,wtd0有systemd接管和喂狗,负责超时后发复位BMC,而wtd1无程序使用。具体如下:

root@e2ps23:~# ls -l /proc/1/fd | grep watchdog
l-wx------ 1 root root 64 Mar 9 01:53 10 -> /dev/watchdog0
root@e2ps23:~# ls -l /proc/1/fd | grep watchdog0
l-wx------ 1 root root 64 Mar 9 01:53 10 -> /dev/watchdog0
root@e2ps23:~# ls -l /proc/1/fd | grep watchdog1

因此此时如果想模拟触发wtd0和wtd1超时复位可分别使用如下方法

wtd0:通过触发一个真实错误使得达到120s上限后复位,例如:

devmem 0x320f0028 32 0x1234567

wtd1: 5s超时,5s喂一次,必然触发wtd1超时

watchdog -T 5 -t 10 /dev/watchdog1

修改wtd0为wtd reset

生产环境中需要修改设备树,临时调试测试可修改0x32A11810的数值:

devmem 0x32A11810 32 0xDC060000

高4位不动,低四位写0

通过触发内核错误,超时后观察BMC串口日志可知:

这是0x80(WDT SoC 硬复位)。日志中明确显示:

text

reset source = 80 wdt reset done!

且在后续启动中出现了DDR 重新训练Mcu Start Work ...wrlvl... donerdlvl... done)和PCIe 重新初始化pcie reset highPEU 0 phy init),这些都是 SoC 硬复位的典型特征。


0x800x1(上电复位)的全部区别

对比维度上电复位(0x1WDT SoC硬复位(0x80
触发源外部 PMIC 物理断电再上电SE主动拉低hresetn(看门狗超时)
执行主体PMIC + 硬件 POR 电路(纯硬件)SE固件代理执行
AP 核(主 CPU)完全断电重启完全断电重启(拉hresetn
DDR 状态掉电 → 重新训练(恢复出厂状态)掉电 → 重新训练(恢复出厂状态)
PCIe 状态掉电 → 链路重训练掉电 → 链路重训练
SE(SCP/安全核)断电重启(彻底重置)保持运行(不受hresetn影响)
共享内存(0x32A11810丢失(变为随机值)保留(上次写入的值不变)
依赖条件无(纯硬件,只要供电正常即可触发)依赖 SE 固件正常运行(若 SE 卡死,则无法触发)
可靠性极高(物理级,不受软件影响)中等(SE 单点故障)
典型用途终极硬件恢复手段软件可控的分级复位(如看门狗超时)

核心结论

  • 0x80在 AP 域(CPU、DDR、PCIe)的复位效果与0x1完全一致:都会导致 Linux 彻底重启、DDR 重训、PCIe 重置。因此从操作系统角度看,两者都像“拔电重启”。

  • 但底层差异巨大0x80不会复位 SE,也不会清空共享内存0x32A11810中的配置。而0x1会重置一切(包括 SE 和 0x32A11810数值)。

  • 可靠性差异0x1是纯硬件自触发,绝对可靠;0x80依赖 SE ,存在失效风险。

修改systemd接管的WatchdogDevice

修改/lib/systemd/system.conf.d/40-hardware-watchdog.conf中对应的WatchdogDevice并通过systemctl daemon-reexec重启使得配置生效

这时候可通过watchdog -T 5 -t 10 /dev/watchdog0迅速触发wtd0 的wtd reset

核复位

通过devmem写 GPIO 寄存器(0x32b30000写入0x240/0x245)模拟触发的复位,与 BMC 板子上卡上物理复位按键(Reset Button)在硬件逻辑上是等价的——都是向 SE发送一个 GPIO 中断信号,SE 收到后执行核复位(仅复位 AP 核)

devmem 0x32b30000 32 0x240
devmem 0x32b30000 32 0x245

修改systemd接管的wtd