15AH, San Francisco

California, United States.

Send Your Mail At:

tianyingkejishe@sina.cn

Working Hours

Mon-Sat: 9.30am To 7.00pm

分类标题

Autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et dolore feugait.

分类归档 飞腾S5000c\D2000\E2000

【飞腾】S5000C处理器SE_RECOVERY双BIOS镜像机制分析

概述

飞腾S5000C处理器支持双BIOS镜像(Dual BIOS)功能,通过SE_RECOVERY硬件引脚和Reset Source状态寄存器实现主备镜像的切换。当主BIOS镜像损坏时,可以通过硬件触发方式切换到备份镜像启动,提高系统可靠性。

一、硬件机制

1.1 Reset Source状态寄存器

S5000C芯片内部集成了一个 Reset Source硬件状态寄存器 ,用于记录芯片复位的原因。该寄存器由芯片硬件自动设置,软件通过SMC(Secure Monitor Call)调用读取。

Reset Source取值定义:

含义说明
0x01PowerOn Reset上电复位
0x04SoftWare Warm Reset软件热复位
0x05RecoverSE_RECOVERY 恢复模式
0x80Watchdog Reset看门狗复位
0x100PII ResetPLL 复位
0xAAS3 ResetS3 休眠恢复
0xA9Standby Reset待机恢复

1.2 SE_RECOVERY引脚

SE_RECOVERY是S5000C芯片的一个 硬件配置引脚 ,在芯片复位时刻被采样:

  • 正常状态(高电平) :芯片按正常流程启动,Reset Source = 0x01或0x04
  • 拉低状态 :芯片进入Recover模式,Reset Source = 0x05
    重要 :SE_RECOVERY引脚的状态只在 复位时刻 被采样,因此需要先拉低该引脚,然后触发芯片复位。

二、固件打包机制

2.1 Pack工具配置

在 s5000c_pack-V1.30 打包工具中,通过Kconfig配置启用双镜像功能:

config RECOVER_ENABLE
    bool "recover enable"
    default n

if RECOVER_ENABLE
    menu "recover config"
    config RECOVER_BL33
        hex "config bl33 recover address"
        default 0x800000
    config RECOVER_BL32
        hex "config bl32 recover address"  
        default 0xc00000
    endmenu
endif

bl33_recovery的地址在0x800000

bl32_recovery的地址在0xc00000

2.2 镜像存放位置

双镜像文件存放结构:

s5000c_pack-V1.30/
├── pbf_bin/v1_30/             # ATF编译生成的默认镜像
│   ├── bl33.bin
│   └── bl33_recover.bin
└── ...

2.3 Flash地址布局

打包后的固件在SPI Flash中的布局:

镜像Flash 偏移地址大小说明
BL1 (Boot ROM)0x000000启动代码
FIP (BL2/BL31)ARM Trusted Firmware
BL33 (主镜像)0x500000 (5MB)根据实际正常启动的 UEFI
BL33_RECOVER0x800000 (8MB)根据实际备份 UEFI 镜像
BL32/BL32_RECOVER0xb00000 (11MB)根据实际TEE 镜像(可选)

三、启动流程

3.1 正常启动流程

芯片上电/复位
    ↓
硬件采样SE_RECOVERY引脚 = 高电平
    ↓
Reset Source = 0x01 (PowerOn) 或 0x04 (Soft Reset)
    ↓
BL1 (Boot ROM) 运行
    ↓
读取Reset Source = 0x01/0x04
    ↓
从Flash 0x500000加载BL33 (主镜像)
    ↓
启动正常UEFI

3.2 Recovery启动流程

外部拉低SE_RECOVERY引脚
    ↓
触发芯片复位(上电或软复位)
    ↓
硬件采样SE_RECOVERY引脚 = 低电平
    ↓
Reset Source = 0x05 (Recover)
    ↓
BL1 (Boot ROM) 运行
    ↓
读取Reset Source = 0x05
    ↓
从Flash 0x800000加载BL33_RECOVER (备份镜像)
    ↓
启动备份UEFI

四、软件实现

4.1 UEFI中获取Reset Source

在UEFI代码中,通过PSSI库获取Reset Source:

// PssiLib.c
UINT32
PssiGetResetSource (VOID)
{
  ARM_SMC_ARGS  ArmSmcArgs;

  ZeroMem (&ArmSmcArgs, sizeof (ARM_SMC_ARGS));
  ArmSmcArgs.Arg0 = PSSI_GET_RST_SOURCE;  // SMC调用号: 0xC2000F01
  ArmCallSmc (&ArmSmcArgs);

  // 返回值即为Reset Source
  // 0x01=PowerOn, 0x04=SoftReset, 0x05=Recover...
  return ArmSmcArgs.Arg0;
}

4.2 Boot Mode设置

UEFI根据Reset Source设置Boot Mode:

// PlatformPei.c
EFI_BOOT_MODE  BootMode;

// 获取硬件复位源
RstSource = GetResetSource();
DEBUG ((DEBUG_INFO, "Check reset source : 0x%x\n", RstSource));

// 设置UEFI Boot Mode
Status = PeiServicesSetBootMode (ArmPlatformGetBootMode ());
Status = PeiServicesGetBootMode (&BootMode);

// 如果是Recover模式,安装Recovery Boot Mode PPI
if (BootMode == BOOT_IN_RECOVERY_MODE) {
    Status = PeiServicesInstallPpi (&mPpiListRecoveryBootMode);
}

4.3 打包脚本处理

在 theone 打包脚本中,双镜像的处理逻辑:

# 固件定义
BL33=bl33.bin                    # 主镜像
BL33_RECOVER=bl33_recover.bin    # 备份镜像

# 地址配置
bl33_base=0x500000               # 主镜像地址
bl33_recover_addr=0x800000       # 备份镜像地址

# 如果启用recover功能
if [ "$recover_enable" = "y" ];then
    # 创建recover镜像证书
    echo "create bl33 recover info"
    bl33_size=$(wc -c $BL33_RECOVER | awk '{print $1}')
    my_scripts/cert_info.sh $bl33_recover_addr $bl33_size bl33_info.
    bin
    dd if=bl33_info.bin of=$INFO bs=16 seek=1 conv=notrunc
fi

bl33.bin bl33_recover.bin放到pbf_bin文件夹里

五、实际应用场景

5.1 主BIOS损坏恢复

场景 :主BIOS镜像(0x500000)损坏,系统无法正常启动

恢复步骤 :

  1. 硬件设计中将SE_RECOVERY引脚连接到跳线或按钮
  2. 用户短接SE_RECOVERY引脚到地(拉低)
  3. 按下复位按钮或重新上电
  4. 芯片检测到Reset Source = 0x05
  5. 自动从0x800000加载备份BIOS启动
  6. 进入系统后修复主BIOS镜像

5.2 BIOS升级失败恢复

场景 :BIOS升级过程中断电,导致主镜像损坏

恢复机制 :

  • 备份镜像保持不变
  • 通过SE_RECOVERY触发恢复模式
  • 使用备份镜像启动后重新升级

六、总结

飞腾S5000C的SE_RECOVERY双BIOS镜像机制通过 硬件引脚 + 状态寄存器 + 固件支持 实现了可靠的故障恢复能力:

  1. 硬件层 :SE_RECOVERY引脚在复位时刻被采样,Reset Source寄存器记录复位原因
  2. 固件层 :BL1根据Reset Source决定从哪个Flash地址加载BL33镜像
  3. 工具层 :Pack工具支持双镜像打包,配置备份镜像地址
  4. 应用层 :UEFI可检测Recovery模式,执行不同的初始化流程
    这种设计确保了即使主BIOS镜像损坏,系统仍可以通过硬件触发方式从备份镜像启动,大大提高了系统的可靠性和可维护性。

【Ubuntu】飞腾s5000c移植国产网卡WX1860AL2驱动

硬件平台:

国产飞腾芯片s5000c-16

国产网讯网卡WX1860AL2

软件平台:

Distributor ID: Ubuntu
Description: Ubuntu Built with Buildroot, based on Ubuntu 22.04 LTS
Release: 22.04
Codename: jammy

1、获取网卡驱动

直接从官网下载就好,本实现使用的版本:ngbe-1.2.7.zip

2、编译安装(一定要在目标机操作)

不同平台上编译,安装的命令不同:

Kylin V10/银河麒麟 操作系统:

编译:

make CHNOS=KYLIN

安装:

make CHNOS=KYLIN modules_install

或者

make CHNOS=KYLIN install

UOS 操作系统:

编译:

make CHNOS=UOS

安装

make CHNOS=UOS modules_install

或者

make CHNOS=UOS install

Euler 操作系统:

编译:

make CHNOS=EULER

安装:

make CHNOS=EULER modules_install

或者

make CHNOS=EULER install

其他平台操作系统:

编译:

make

安装:make modules_install

或者

make install

4) 加载驱动:

modprobe txgbe (仅安装完首次需要手动加载,若重启系统,系统会自动加载驱动)。

5)查看驱动是否加载成功:

[root@SW ~]# lsmod | grep txgbe

txgbe 208399 0

表明驱动已经加载上。

3、卸载驱动

1)显示已安装的驱动:

[root@localhost ~]# lsmod | grep txgbe

txgbe 385024 0

2)卸载驱动:rmmod txgbe

[root@localhost ~]# rmmod txgbe

3) 再次查看已安装的驱动,已经没有 txgbe 驱动。

[root@localhost ~]# lsmod | grep txgbe

4、参考资料

5、适配后的网卡驱动