Logo

Linux 内核

6.16.0-rc4

快速搜索

目录

  • 开发过程
  • 提交补丁
  • 行为准则
  • 维护者手册
  • 所有开发过程文档
  • 核心 API
  • 驱动 API
  • 子系统
    • 核心子系统
    • 人机接口
    • 网络接口
      • 网络
      • NetLabel
      • InfiniBand
      • ISDN
      • MHI
    • 存储接口
    • 其他子系统
  • 锁
  • 许可规则
  • 编写文档
  • 开发工具
  • 测试指南
  • 破解指南
  • 跟踪
  • 故障注入
  • 热补丁
  • Rust
  • 管理
  • 构建系统
  • 报告问题
  • 用户空间工具
  • 用户空间 API
  • 固件
  • 固件和设备树
  • CPU 架构
  • 未分类文档
  • 翻译

本页

  • 显示源

Devlink Flash¶

devlink-flash API 允许更新设备固件。它取代了旧的 ethtool-flash 机制,并且在内核中执行闪存更新时不需要获取任何网络锁。使用示例

$ devlink dev flash pci/0000:05:00.0 file flash-boot.bin

请注意,文件名是相对于固件加载路径的相对路径(通常是 /lib/firmware/)。驱动程序可以发送状态更新,以告知用户空间更新操作的进度。

覆盖掩码¶

devlink-flash 命令允许选择性地指定一个掩码,指示设备在更新时应如何处理闪存组件的子节。此掩码指示允许被覆盖的节集。

覆盖掩码位列表¶

名称

描述

DEVLINK_FLASH_OVERWRITE_SETTINGS

表示设备应使用所提供的映像中的设置覆盖正在更新的组件中的设置。

DEVLINK_FLASH_OVERWRITE_IDENTIFIERS

表示设备应使用所提供的映像中的标识符覆盖正在更新的组件中的标识符。这包括 MAC 地址、序列 ID 和类似的设备标识符。

可以组合并同时请求多个覆盖位。如果未提供任何位,则预期设备仅更新正在更新的组件中的固件二进制文件。设置和标识符预计在更新后保留。设备可能不支持所有组合,此类设备的驱动程序必须拒绝任何无法忠实实现的组合。

固件加载¶

需要固件才能运行的设备通常将其存储在板上的非易失性存储器中,例如闪存。有些设备只在板上存储基本固件,驱动程序在探测期间从磁盘加载其余部分。devlink-info 允许用户查询固件信息(已加载的组件和版本)。

在其他情况下,设备既可以将映像存储在板上,也可以从磁盘加载,或者从磁盘自动刷写新映像。fw_load_policy devlink 参数可用于控制此行为(Documentation/networking/devlink/devlink-params.rst)。

磁盘上的固件文件通常存储在 /lib/firmware/ 中。

固件版本管理¶

驱动程序应实现 devlink-flash 和 devlink-info 功能,这两者共同允许实现独立于供应商的自动化固件更新工具。

devlink-info 暴露了 driver 名称和三个版本组(fixed、running、stored)。

driver 属性和 fixed 组标识特定的设备设计,例如用于查找适用的固件更新。这就是 serial_number 不属于 fixed 版本的原因(尽管它是固定的)——fixed 版本应该标识设计,而不是单个设备。

running 和 stored 固件版本标识设备上正在运行的固件,以及在重启或设备重置后将激活的固件。

固件更新代理应能够遵循此简单算法来更新固件内容,无论设备供应商如何

# Get unique HW design identifier
$hw_id = devlink-dev-info['fixed']

# Find out which FW flash we want to use for this NIC
$want_flash_vers = some-db-backed.lookup($hw_id, 'flash')

# Update flash if necessary
if $want_flash_vers != devlink-dev-info['stored']:
    $file = some-db-backed.download($hw_id, 'flash')
    devlink-dev-flash($file)

# Find out the expected overall firmware versions
$want_fw_vers = some-db-backed.lookup($hw_id, 'all')

# Update on-disk file if necessary
if $want_fw_vers != devlink-dev-info['running']:
    $file = some-db-backed.download($hw_id, 'disk')
    write($file, '/lib/firmware/')

# Try device reset, if available
if $want_fw_vers != devlink-dev-info['running']:
   devlink-reset()

# Reboot, if reset wasn't enough
if $want_fw_vers != devlink-dev-info['running']:
   reboot()

请注意,此伪代码中对 devlink-dev-info 的每次引用都应从内核中获取最新信息。

为了方便识别固件文件,一些供应商在固件版本中添加了 bundle_id 信息。这个元版本涵盖了多个组件版本,可用于例如固件文件名中(所有组件版本可能会相当长)。

© 内核开发社区。| 由 Sphinx 5.3.0 & Alabaster 0.7.16 提供支持 | 页面源