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