AMDGPU RAS 支持¶
AMDGPU RAS 接口通过 sysfs(用于信息查询)和 debugfs(用于错误注入)公开。
RAS debugfs/sysfs 控制和错误注入接口¶
控制接口接受具有两个成员的 struct ras_debug_if。
第一个成员:ras_debug_if::head 或 ras_debug_if::inject。
head 用于指示哪个 IP 块将在控制之下。
head 有四个成员,它们是 block、type、sub_block_index、name。 block:哪个 IP 将在控制之下。type:将启用/禁用/注入哪种错误。sub_block_index:某些 IP 具有子组件。例如,GFX、sDMA。name:IP 的名称。
inject 比 head 多三个成员,它们是 address、value 和 mask。正如它们的名称所示,inject 操作会将 value 写入 address。
第二个成员:struct ras_debug_if::op。它有三种操作。
0:禁用块上的 RAS。将 ::head 作为其数据。
1:启用块上的 RAS。将 ::head 作为其数据。
2:在块上注入错误。将 ::inject 作为其数据。
如何使用接口?
在程序中
在代码中复制 struct ras_debug_if 并初始化它。将 struct 写入控制接口。
从 shell
echo "disable <block>" > /sys/kernel/debug/dri/<N>/ras/ras_ctrl
echo "enable <block> <error>" > /sys/kernel/debug/dri/<N>/ras/ras_ctrl
echo "inject <block> <error> <sub-block> <address> <value> <mask>" > /sys/kernel/debug/dri/<N>/ras/ras_ctrl
其中 N 是您想要影响的卡。
“disable” 仅需要 block。“enable” 需要 block 和错误类型。“inject” 需要 block、错误类型、地址和值。
- block 是以下之一:umc、sdma、gfx 等。
详细信息请参见 ras_block_string[]
- 错误类型是以下之一:ue、ce 和 poison,其中,
ue 是多重不可纠正的,ce 是单重可纠正的,poison 是毒化
子块是子块索引,如果没有子块,则传递 0。地址和值是十六进制数,前导 0x 是可选的。mask 表示实例掩码,是可选的,默认值为 0x1。
例如,
echo inject umc ue 0x0 0x0 0x0 > /sys/kernel/debug/dri/0/ras/ras_ctrl
echo inject umc ce 0 0 0 3 > /sys/kernel/debug/dri/0/ras/ras_ctrl
echo disable umc > /sys/kernel/debug/dri/0/ras/ras_ctrl
如何检查操作的结果?
要检查禁用/启用,请查看 /sys/class/drm/card[0/1/2...]/device/ras/features 中的“ras”功能
要检查注入,请查看 /sys/class/drm/card[0/1/2...]/device/ras/[gfx|sdma|umc|...]_err_count 中相应的错误计数
注意
仅允许对支持的块进行操作。检查 /sys/module/amdgpu/parameters/ras_mask 中的“ras”掩码,以查看哪个块在特定 ASIC 上支持 RAS。
不可恢复错误的 RAS 重启行为¶
通常,当出现不可纠正的错误时,驱动程序会重置 GPU 以进行恢复。但是,在发生不可恢复的错误时,驱动程序会提供一个接口,以便在这种情况下自动重启系统。
debugfs 中的以下文件提供了该接口:/sys/kernel/debug/dri/[0/1/2...]/ras/auto_reboot
用法
echo true > .../ras/auto_reboot
RAS 错误计数 sysfs 接口¶
它允许用户通过 /sys/class/drm/card[0/1/2...]/device/ras/[gfx/sdma/...]_err_count 读取 gpu 上每个 IP 块的错误计数
它输出多行,报告未纠正的 (ue) 和已纠正的 (ce) 错误计数。
一行的格式如下,
[ce|ue]: 计数
示例
ue: 0
ce: 1
RAS EEPROM debugfs 接口¶
某些板载有一个 EEPROM,用于持久存储在 vram 中经历 ECC 错误的坏页列表。此接口提供了一种重置 EEPROM 的方法,例如在测试错误注入后。
用法
echo 1 > ../ras/ras_eeprom_reset
将 EEPROM 表重置为 0 个条目。
RAS VRAM 坏页 sysfs 接口¶
它允许用户通过 /sys/class/drm/card[0/1/2...]/device/ras/gpu_vram_bad_pages 读取 gpu 上 vram 的坏页
它输出多行,每行代表一个 gpu 页。
一行的格式如下,gpu pfn : gpu 页面大小 : 标志
gpu pfn 和 gpu 页面大小以十六进制格式打印。标志可以是以下字符之一,
R:已保留,此 gpu 页面已保留,无法使用。
P:待保留,此 gpu 页面被标记为坏,将在下一个 page_reserve 窗口中保留。
F:无法保留。由于某些原因,无法保留此 gpu 页面。
示例
0x00000001 : 0x00001000 : R
0x00000002 : 0x00001000 : P
示例代码¶
用于测试错误注入的示例代码可以在这里找到:https://cgit.freedesktop.org/mesa/drm/tree/tests/amdgpu/ras_tests.c
这是 libdrm amdgpu 单元测试的一部分,涵盖了 GPU 的几个区域。共有四组测试
RAS 基本测试
该测试验证 RAS 功能的启用状态,并确保存在必要的 sysfs 和 debugfs 文件。
RAS 查询测试
此测试检查每个受支持的 IP 块的 RAS 可用性和启用状态以及错误计数。
RAS 注入测试
此测试为每个 IP 注入错误。
RAS 禁用测试
此测试测试禁用每个 IP 块的 RAS 功能。