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。顾名思义,注入操作会将 value 写入 address。
第二个成员:struct ras_debug_if::op。它有三种操作。
0:禁用该块上的 RAS。使用 ::head 作为其数据。
1:启用该块上的 RAS。使用 ::head 作为其数据。
2:在该块上注入错误。使用 ::inject 作为其数据。
如何使用该接口?
在程序中
在您的代码中复制 struct ras_debug_if 并初始化它。将该结构体写入控制接口。
从 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”(禁用)只需要块。“enable”(启用)需要块和错误类型。“inject”(注入)需要块、错误类型、地址和值。
- 块是以下之一: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 page size : flags
gpu pfn 和 gpu page size 以十六进制格式打印。flags 可以是以下字符之一:
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 功能。