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 功能。