AMDGPU
AMDGPU 是 Graphics Core Next 系列 AMD Radeon 圖形卡的開源圖形驅動程序。
選擇正確的驅動[編輯 | 編輯原始碼]
請根據您的顯卡,參考Xorg#AMD選擇合適的顯卡驅動。目前驅動支持從 Southern Islands (SI) 到最新的顯卡,而AMD沒有計劃支持 GCN 架構之前的顯卡。如果您使用的是 AMD 不支持的顯卡,可以選擇使用開源的 ATI 驅動。
安裝[編輯 | 編輯原始碼]
安裝這個mesa包 軟件包,它提供用於3D加速的DRI驅動程序。
- 對於32位程序,請從multilib倉庫中安裝lib32-mesa包軟件包以獲得支持。
- 對於 DDX 驅動支持(可提供對Xorg的2D加速),可以安裝xf86-video-amdgpu包 軟件包。
- 對於 Vulkan 支持:
- 首先嘗試僅安裝vulkan-radeon包驅動:儘管vulkan-driver 提供的第一個選擇不是它(因為可選按照字母順序排序),該驅動解決了一些amdvlk包經常被報告的問題。
- 當安裝amdvlk包後,會作為默認vulkan驅動。如果需要同時安裝兩個驅動(比如存在問題),參見Vulkan#通過環境變量選擇
- 對應安裝的原生驅動,可選擇性安裝 lib32-vulkan-radeon包 或 lib32-amdvlk包 軟件包來獲得32位應用程式支持。
想要開啟硬件視頻加速,可以安裝libva-mesa-driver包和lib32-libva-mesa-driver包軟件包來支持 VA-API,安裝mesa-vdpau包和lib32-mesa-vdpau包軟件包支持VDPAU。
實驗版本[編輯 | 編輯原始碼]
對於某些用戶來說使用 mesa 的上游實驗構建可能是值得的。
安裝 mesa-gitAUR 軟件包,它提供用於3D加速的DRI驅動程序。
- 對於32位程序支持,請從 AUR 或者 mesa-git 倉庫安裝 lib32-mesa-gitAUR
- 對於 DDX 驅動支持(可提供對Xorg的2D加速),安裝xf86-video-amdgpu-gitAUR軟件包。
- 如果您使用 mesa-git 倉庫並且要啟用 Vulkan 支持,請安裝 vulkan-radeon-git 軟件包。可選安裝 lib32-vulkan-radeon-git 來支持32位應用程式。如果您用的是來自 AUR 的 mesa-gitAUR 軟件包,則不需要進行該操作。
開啟 Southern Islands (SI) 和 Sea Islands (CIK) 支持[編輯 | 編輯原始碼]
linux包 軟件包 可以讓 AMDGPU 支持 the Southern Islands(HD 7000 系列,也被稱作SI,比如 GCN1)和 Sea Islands (HD 8000 系列,也被稱作CIK,比如 GCN2)顯卡。amdgpu
內核驅動程序需要在radeon之前加載。可以通過運行lspci -k
來檢查加載了哪個內核驅動程序。示例輸出如下:
$ lspci -k | grep -A 3 -E "(VGA|3D)"
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Curacao PRO [Radeon R7 370 / R9 270/370 OEM] Subsystem: Gigabyte Technology Co., Ltd Device 226c Kernel driver in use: amdgpu Kernel modules: radeon, amdgpu
如果 amdgpu
驅動沒有被加載使用,可以跟着下面的內容進行處理。
加載 amdgpu 內核驅動[編輯 | 編輯原始碼]
amdgpu
和 radeon
兩個模塊都需要設置的內核參數是 cik_support=
和 si_support=
。
它們需要在內核參數或 modprobe 配置文件中進行設置,具體參數取決於顯卡的 GCN 版本。
如果不確定您擁有的是哪個版本的顯卡,那麼也可以同時使用這兩個參數。
[..] amdgpu 0000:01:00.0: Use radeon.cik_support=0 amdgpu.cik_support=1 to override
.在內核命令行中設置內核模塊參數[編輯 | 編輯原始碼]
設置以下內核參數之一:
- Southern Islands (SI):
radeon.si_support=0 amdgpu.si_support=1
- Sea Islands (CIK):
radeon.cik_support=0 amdgpu.cik_support=1
指定正確的模塊加載順序[編輯 | 編輯原始碼]
當內核啟用 AMDGPU 對 SI/CIK 顯卡的支持時,radeon驅動可能會在amdgpu
驅動之前加載。
確保amdgpu
在Mkinitcpio#MODULES數組中被設置為第一個模塊,例如MODULES=(amdgpu radeon)
。
設置內核參數[編輯 | 編輯原始碼]
對於 Southern Islands (SI) 使用 si_support=1
內核參數,對於 Sea Islands (CIK) 使用 cik_support=1
:
/etc/modprobe.d/amdgpu.conf
options amdgpu si_support=1 options amdgpu cik_support=1
/etc/modprobe.d/radeon.conf
options radeon si_support=0 options radeon cik_support=0
確保 modconf
添加到 HOOKS
數組中在 /etc/mkinitcpio.conf
和 Mkinitcpio#創建和啟用鏡像。
編譯支持 amdgpu 驅動的內核[編輯 | 編輯原始碼]
在構建或者編譯內核的時候,需要在配置中設置 CONFIG_DRM_AMDGPU_SI=Y
和/或者 CONFIG_DRM_AMDGPU_CIK=Y
。
在系統啟動時候完全禁用 radeon 內核驅動模塊[編輯 | 編輯原始碼]
內核可能仍會根據涉及的具體圖形晶片探測並加載 radeon 模塊,但在確認 amdgpu 正常工作後,radeon 模塊就不需要加載了。 在每個步驟之間重新啟動以確認它在移動到下一步之前有效:
- 在內核命令行添加模塊參數以確保
amdgpu
按預期工作, - 使用
MODULES=(amdgpu)
mkinitcpio 方法但不要將radeon
添加到配置中, - 在登錄桌面後測試
modprobe -r radeon
命令確保能夠在卸載radeon
內核模塊後不影響系統圖形界面的運行, - 將
radeon
模塊列入黑名單,以免在第二階段啟動期間被內核探測:
/etc/modprobe.d/radeon.conf
blacklist radeon
當上面的配置生效之後,命令 lsmod
和 dmesg
的輸出現在應該只會顯示 amdgpu 驅動模塊被加載的消息,不會存在 radeon 驅動模塊的消息。系統中的 /sys/module/radeon
目錄應該也不存在。如果存在,則說明配置沒有生效,radeon 驅動模塊仍然被系統加載了。
ACO編譯器[編輯 | 編輯原始碼]
ACO編譯器是一個由 Valve Corporation開發的開源着色器(shader)編譯器,可直接與LLVM編譯器、AMDVLK 驅動程序以及Windows 10競爭。與 LLVM 和 AMDVLK 相比,它提供更短的編譯時間,並且在玩遊戲時表現更好。
一些基準性能測試可以在GitHub和 Phoronix (1) (2) (3)中看到。
加載[編輯 | 編輯原始碼]
應該會在系統啟動時自動加載。
如果沒有自動加載:
- 如果需要的話,確保 #開啟 Southern Islands (SI) and Sea Islands (CIK) 支持。
- 確保你已經安裝最新的 linux-firmware包 軟件包。
- 確保你沒有將
nomodeset
或vga=
作為內核參數,因為amdgpu
需要內核級顯示模式設置。 - 確保你沒有禁用
amdgpu
通過使用內核模塊黑名單。
儘管驅動有可能自動加載,但是加載可能會發生在 X 伺服器需要它的時間點之後。這種情況下請參考內核級顯示模式設置#KMS 早啟動。
Xorg 配置[編輯 | 編輯原始碼]
Xorg 會自動加載驅動程序,並且使用顯示器的 EDID 來設置原始解像度。只有在調整驅動程序時才需要配置。
如果你想手動配置,新建 /etc/X11/xorg.conf.d/20-amdgpu.conf
文件,並在其中添加以下內容:
/etc/X11/xorg.conf.d/20-amdgpu.conf
Section "OutputClass" Identifier "AMD" MatchDriver "amdgpu" Driver "amdgpu" EndSection
使用此部分配置,您可以啟用功能並調整驅動程序設置,請在設置驅動程序選項之前先查看 amdgpu(4)。
無撕裂渲染[編輯 | 編輯原始碼]
TearFree使用硬件翻頁機制控制撕裂預防。默認情況下,如果旋轉畫面輸出、使用RandR變換和RandR 1.4 從屬輸出時,TearFree會被啟用,其他情況下默認關閉。你可以通過指定true
或false
來控制此配置保持啟用/關閉:
Option "TearFree" "true"
DRI 級別[編輯 | 編輯原始碼]
DRI 設置要啟用的最大 DRI 級別。DRI2 的有效值為「2」,DRI3 的有效值為「3」。如果 Xorg 版本 >= 1.18.3,則 DRI3 的默認值為「3」,否則使用 DRI2:
Option "DRI" "3"
可變刷新率[編輯 | 編輯原始碼]
參考可變刷新率。
10-bit 色深[編輯 | 編輯原始碼]
較新的 AMD 卡支持 10bpc 顏色,但默認為 24 位顏色,必須明確啟用 30 位顏色。 如果應用程式也支持,啟用它可以減少漸變中的可見條帶/偽影。 要檢查您的顯示器是否支持它,請在您的 Xorg 日誌文件中搜索「EDID」(例如 /var/log/Xorg.0.log
或 ~/ .local/share/xorg/Xorg.0.log
):
[ 336.695] (II) AMDGPU(0): EDID for output DisplayPort-0 [ 336.695] (II) AMDGPU(0): EDID for output DisplayPort-1 [ 336.695] (II) AMDGPU(0): Manufacturer: DEL Model: a0ec Serial#: 123456789 [ 336.695] (II) AMDGPU(0): Year: 2018 Week: 23 [ 336.695] (II) AMDGPU(0): EDID Version: 1.4 [ 336.695] (II) AMDGPU(0): Digital Display Input [ 336.695] (II) AMDGPU(0): 10 bits per channel
要檢查它當前是否啟用可以通過搜索「Depth」:
[ 336.618] (**) AMDGPU(0): Depth 30, (--) framebuffer bpp 32 [ 336.618] (II) AMDGPU(0): Pixel depth = 30 bits stored in 4 bytes (32 bpp pixmaps)
使用默認配置,log 會顯示 depth 為 24,並且 24 位色彩存儲在 4 個字節中。
要檢查 10 bits色深是否工作,請退出 Xorg(如果它正在運行)並運行 Xorg -retro
這將顯示黑白網格,然後按 Ctrl-Alt-F1
和 { {ic|Ctrl-C}} 退出 X,然後運行 Xorg -depth 30 -retro
。 如果這些命令能正常執行,那麼就說明10位色深生效了。
要通過 startx
以 10 位色深啟動,請使用 startx -- -depth 30
。 要永久啟用它,請添加到(如果沒有指定文件則新建):
/etc/X11/xorg.conf.d/20-amdgpu.conf
Section "Screen" Identifier "asdf" DefaultDepth 30 EndSection
降低輸出延遲[編輯 | 編輯原始碼]
如果您想最大程度地減少延遲,您可以禁用翻頁(page fliping)和無撕裂(tear free):
/etc/X11/xorg.conf.d/20-amdgpu.conf
Section "OutputClass" Identifier "AMD" MatchDriver "amdgpu" Driver "amdgpu" Option "EnablePageFlip" "off" Option "TearFree" "false" EndSection
參考遊戲#降低_DRI_延遲來降低顯示延遲。
特性[編輯 | 編輯原始碼]
視頻加速[編輯 | 編輯原始碼]
參考硬件視頻加速.
性能監控[編輯 | 編輯原始碼]
GPU性能監控通常用於檢查溫度以及 GPU 的 P-states。
命令行界面[編輯 | 編輯原始碼]
- amdgpu_top — 顯示AMDGPU使用率的工具
- nvtop — AMD、Intel 和 NVIDIA 的 GPU 進程監控
- radeontop — GPU 利用率查看器,包括總活動百分比和單個塊
圖形用戶界面[編輯 | 編輯原始碼]
- amdgpu_top — 顯示AMDGPU使用率的工具
- AmdGuid — 完全用Rust編寫的一個基本的圖形用戶界面風扇控制工具
- TuxClocker — Qt5監控和超頻工具。
手動[編輯 | 編輯原始碼]
檢查GPU的P-states,執行:
$ cat /sys/class/drm/card0/device/pp_od_clk_voltage
監控GPU,執行:
# watch -n 0.5 cat /sys/kernel/debug/dri/0/amdgpu_pm_info
檢查GPU利用率,執行:
$ cat /sys/class/drm/card0/device/gpu_busy_percent
檢查GPU頻率,執行:
$ cat /sys/class/drm/card0/device/pp_dpm_sclk
檢查GPU溫度,執行:
$ cat /sys/class/drm/card0/device/hwmon/hwmon*/temp1_input
檢查顯存頻率,執行:
$ cat /sys/class/drm/card0/device/pp_dpm_mclk
檢查顯存佔用,執行:
$ cat /sys/class/drm/card0/device/mem_info_vram_used
檢查顯存大小,執行:
$ cat /sys/class/drm/card0/device/mem_info_vram_total
超頻[編輯 | 編輯原始碼]
從 Linux 4.17 開始, 只要開啟了相關功能,就可以通過 /sys/class/drm/card0/device/pp_od_clk_voltage
調整顯卡的頻率和電壓。
啟動參數[編輯 | 編輯原始碼]
需要通過附加內核參數 amdgpu.ppfeaturemask=0xffffffff
來解鎖在 sysfs 中對其的訪問限制。
並非所有比特位都有定義,隨着時間的推移可能會添加新功能。設置所有 32 位可能會(在將來的更新中)啟用不穩定的功能,這些功能可能會導致屏幕閃爍或無法從掛起中恢復等問題。結合默認的 ppfeaturemask 設置 PP_OVERDRIVE_MASK 位 0x4000 應該就足夠了。 要為系統計算一個合理的參數,可以執行:
$ printf 'amdgpu.ppfeaturemask=0x%x\n' "$(($(cat /sys/module/amdgpu/parameters/ppfeaturemask) | 0x4000))"
手動(默認)[編輯 | 編輯原始碼]
/sys/class/drm/...
之類的路徑只是符號連結,可能會在重新啟動之間發生變化。永久位置可以在 /sys/devices/
中找到,例如 /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/
。想要得到可靠的結果可能要相應地調整命令。要深入了解所有可能的選項,請參閱amdgpu功耗與發熱控制內核文檔。
可以為最大 P-state 7 設置 GPU 核心頻率, 以 Polaris GPU 為例可以執行下面的命令設置為 1209MHz 頻率和 900mV 電壓:
# echo "s 7 1209 900" > /sys/class/drm/card0/device/pp_od_clk_voltage
同樣的操作可以應用於 VRAM,例如 Polaris 5xx 系列卡上的最大 P-state 2:
# echo "m 2 1850 850" > /sys/class/drm/card0/device/pp_od_clk_voltage
執行下面的命令讓修改生效:
# echo "c" > /sys/class/drm/card0/device/pp_od_clk_voltage
要檢查超頻是否成功,可以讀取 3D 負載下的時鐘和電壓:
# watch -n 0.5 cat /sys/kernel/debug/dri/0/amdgpu_pm_info
可以使用下面的命令重置為默認設置:
# echo "r" > /sys/class/drm/card0/device/pp_od_clk_voltage
如果要避免深度節能 P-states 引起的閃爍、偽影和卡頓之類的問題,也可以禁止驅動程序切換到某些 P-states。要讓顯卡強制使用最高的 VRAM P-state,同時允許 GPU 本身以較低的頻率運行,首先找到最高的可用P-state,然後設置:
# cat /sys/class/drm/card0/device/pp_dpm_mclk
0: 96Mhz * 1: 456Mhz 2: 675Mhz 3: 1000Mhz
# echo "manual" > /sys/class/drm/card0/device/power_dpm_force_performance_level # echo "3" > /sys/class/drm/card0/device/pp_dpm_mclk
僅允許三個最高的 GPU pstates:
# echo "5 6 7" > /sys/class/drm/card0/device/pp_dpm_sclk
執行下面命令可以限制GPU的極限功耗(參數以 50 瓦為例):
# echo 50000000 > /sys/class/drm/card0/device/hwmon/hwmon0/power1_cap
輔助工具[編輯 | 編輯原始碼]
如果不想(或不敢)完全通過手動超頻 GPU,社區提供了一些超頻工具來幫助超頻和監控 AMD 顯卡。
命令行工具[編輯 | 編輯原始碼]
- amdgpu-clocks — 用於監控和設置 AMD GPU 自定義電源狀態的腳本。它還提供了一個 Systemd 服務,可以在系統啟動時自動置。
圖形界面工具[編輯 | 編輯原始碼]
- TuxClocker — Qt5 監控和超頻工具。
- CoreCtrl — 一個 GUI 超頻工具,具有類似 WattMan 的 UI,支持每個應用程式配置文件。
- LACT — 一個GTK工具,可顯示信息和控制你的AMD GPU。
開機自動修改[編輯 | 編輯原始碼]
一種辦法是使用system的單元,如果希望設置在開機時自動應用修改,可以參考這個 Reddit 帖子來實現開機時自動配置和啟用設定。
另一種辦法是使用udev規則,例如要設置為低性能等級來延長續航:
/etc/udev/rules.d/30-amdgpu-low-power.rules
SUBSYSTEM=="pci", DRIVER=="amdgpu", ATTR{power_dpm_force_performance_level}="low"
性能等級[編輯 | 編輯原始碼]
AMDGPU 提供了不同的性能等級,可以使用power_dpm_force_performance_level 調節,有下列參數可供選擇:
- auto: 驅動根據當前情況動態選擇最佳電源配置。
- low: 時鐘頻率強制設置為最低功耗狀態。
- high: 時鐘頻率強制設置為最高功耗狀態。
- manual: 用戶可以為不同的時鐘頻率區間手動調整功耗狀態(用於#電源配置)。
- profile_standard, profile_min_sclk, profile_min_mclk, profile_peak: 時鐘頻率和功耗門控被關閉,根據用戶需求時鐘頻率可設置為不同配置。該模式推薦用於特定工作負載。
要讓AMDGPU設備工作在一個低性能等級,可以執行下面的命令:
# echo "low" > /sys/class/drm/card0/device/power_dpm_force_performance_level
電源配置[編輯 | 編輯原始碼]
AMDGPU 通過電源配置提供多種優化,最常用的一種是 OpenCL 密集型應用程式的計算模式。下面的命令可以列出所有的可用電源配置:
cat /sys/class/drm/card0/device/pp_power_profile_mode
NUM MODE_NAME SCLK_UP_HYST SCLK_DOWN_HYST SCLK_ACTIVE_LEVEL MCLK_UP_HYST MCLK_DOWN_HYST MCLK_ACTIVE_LEVEL 0 BOOTUP_DEFAULT: - - - - - - 1 3D_FULL_SCREEN: 0 100 30 0 100 10 2 POWER_SAVING: 10 0 30 - - - 3 VIDEO: - - - 10 16 31 4 VR: 0 11 50 0 100 10 5 COMPUTE *: 0 5 30 10 60 25 6 CUSTOM: - - - - - -
card0
標識機器中的特定 GPU,如果有多個 GPU,要確保找到正確的路徑。要使用特定的電源配置文件,首先應該啟用對它們的手動控制:
# echo "manual" > /sys/class/drm/card0/device/power_dpm_force_performance_level
然後通過寫入與其關聯的 NUM 字段來選擇電源配置文件,例如下面的命令可以啟用計算運行(COMPUTE):
# echo "5" > /sys/class/drm/card0/device/pp_power_profile_mode
啟用 GPU 顯示縮放[編輯 | 編輯原始碼]
為了避免使用顯示器內置的縮放器,而要使用 GPU 自己的縮放器,在不使用顯示器的原始解像度時,可以用下面的命令實現:
$ xrandr --output "<output>" --set "scaling mode" "<scaling mode>"
"scaling mode"
可以設置的值有: None, Full, Center, Full aspect
- 要顯示可用的輸出和設置,執行:
$ xrandr --prop
- 要為每個有效顯示輸出都設置
scaling mode = Full aspect
,使用下面的命令:
$ for output in $(xrandr --prop | grep -E -o -i "^[A-Z\-]+-[0-9]+"); do xrandr --output "$output" --set "scaling mode" "Full aspect"; done
排除故障[編輯 | 編輯原始碼]
模塊參數[編輯 | 編輯原始碼]
amdgpu模塊含有一些使用掩碼的配置參數(modinfo amdgpu | grep mask
),這些參數文檔請參閱內核源碼
Xorg 或應用程式無法啟動[編輯 | 編輯原始碼]
- "(EE) AMDGPU(0): [DRI2] DRI2SwapBuffers: drawable has no back or front?" error after opening glxgears, can open Xorg server but OpenGL apps crash.
- "(EE) AMDGPU(0): Given depth (32) is not supported by amdgpu driver" error, Xorg won't start.
在 Xorg 下將屏幕顏色深度設置為 16 或 32 會導致異常或崩潰。為避免這種情況,可以通過往配置的Screen區塊添加設置來使用標準的 24 位屏幕顏色深度:
/etc/X11/xorg.conf.d/10-screen.conf
Section "Screen" Identifier "Screen" DefaultDepth 24 SubSection "Display" Depth 24 EndSubSection EndSection
屏幕偽影和頻率問題[編輯 | 編輯原始碼]
由於 GPU 時鐘速度的管理方式存在問題,動態電源管理可能會在顯示器運行高刷新率(120+hz)時導致屏幕偽影 .org/show_bug.cgi?id=96868[1]。
一個規避的辦法 [2] 是手動將 /sys/class/drm/card0/device/power_dpm_force_performance_level
設置為 high
或 low
要使設置持久化生效,可以創建一個 udev 規則:
/etc/udev/rules.d/30-amdgpu-pm.rules
KERNEL=="card0", SUBSYSTEM=="drm", DRIVERS=="amdgpu", ATTR{device/power_dpm_force_performance_level}="high"
執行下面的命令檢查 KERNEL 參數名稱:
$ find /sys/class/drm/ -regextype awk -regex '.+/card[0-9]+' -printf '%f\n'
另一個圖形界面的解決方案 [3]是用 radeon-profile-gitAUR 和 radeon-profile-daemon-gitAUR 來管理 power_dpm。
Chromium 偽影[編輯 | 編輯原始碼]
如果在使用 Chromium 時看到偽影,可以嘗試強制使用基於 vulkan 的後端。在 chrome://flags
中啟用 #ignore-gpu-blocklist
和 #enable-vulkan
。
R9 390 系列性能不佳或不穩定[編輯 | 編輯原始碼]
如果在使用 AMD R9 390 系列顯卡時遇到問題 [4],可以在內核參數中設置radeon.cik_support=0 radeon.si_support=0 amdgpu .cik_support=1 amdgpu.si_support=1 amdgpu.dpm=1 amdgpu.dc=1
來強制使用 amdgpu 驅動模塊而不是 radeon 驅動模塊。
如果還不起作用,請嘗試通過在內核參數中設置:radeon.cik_support=0 radeon.si_support=0 amdgpu.cik_support=1 amdgpu.si_support=1
來禁用動態電源管理(DPM)。
因內核錯誤"[drm] IP block:gmc_v8_0 is hung!"畫面凍結[編輯 | 編輯原始碼]
如果在執行 GPU 密集型任務期間遇到凍結和內核崩潰,並出現內核錯誤"[drm] IP block:gmc_v8_0 is hung!" [5]時,一個規避的方法是在內核參數中設置 amdgpu.vm_update_mode=3
來強制使用 CPU 完成 GPUVM 頁面表更新。 這裏列出了這個方法的缺點 [6]。
光標損壞[編輯 | 編輯原始碼]
如果遇到鼠標光標有時無法正確顯示的問題,可以在 /etc/X11/xorg.conf.d/20-amdgpu.conf
配置文件的 "OutputClass""
部分設置 Option "SWCursor" "True"
。Wayland下設置環境變量KWIN_FORCE_SW_CURSOR=1
。
如果在使用 xrandr
進行縮放時光標閃爍或消失,可以通過設置 TearFree
屬性來修復它:xrandr --output HDMI-A-0 --set TearFree on
。
在KDE中遇到白屏或閃爍[編輯 | 編輯原始碼]
當改變解像度或連接外接顯示器時屏幕出現閃爍或白屏,在內核參數中加入amdgpu.sg_display=0
。
在 Vega 顯卡上玩遊戲時系統凍結或崩潰[編輯 | 編輯原始碼]
由於 GPU 核心頻率的管理方式存在問題,使用顯卡驅動的動態電源管理可能會導致系統在玩遊戲時完全凍結。[8] 一個規避方法是禁用動態電源管理, 更多細節可以參考 ATI#動態電源管理。
火狐瀏覽器 WebRenderer 損壞[編輯 | 編輯原始碼]
當用戶強制啟用 WebRenderer 時,可能會出現偽影和其他異常(例如無法選擇擴展選項)。解決方法是回退到 OpenGL 合成。
兩倍速或花栗鼠(chipmunk)音頻,或連接 4K@60Hz 設備時無音頻[編輯 | 編輯原始碼]
這有時是由 AMDGPU 設備和通過 HDMI 連接的 4K 顯示器之間的通信問題引起的。一種可能的規避方法是通過顯示器的內置設置啟用 HDR 或「超高清深色」。在許多基於 Android 的電視上,這對應着將相關選項設置為「標準」(Standard)而不是「最佳」(Optimal)。
獨立顯卡的電源管理/動態重新激活問題[編輯 | 編輯原始碼]
如果遇到內核驅動已經加載,但遊戲時獨立顯卡不可用或在使用時獨立顯卡被禁用(類似於 [9]) 的問題,可以通過設置內核參數 amdgpu.runpm=0
來防止獨顯在運行時動態斷電。
kfd: amdgpu: TOPAZ not supported in kfd[編輯 | 編輯原始碼]
在系統日誌或內核消息密鑰環中打印危急級別的錯誤消息
kfd: amdgpu: TOPAZ not supported in kfd
如果沒有使用 Radeon Open Compute 的計劃,可以安全的忽略這個問題。因為舊顯卡不支持 TOPAZ。[10] [11]
MCLK鎖定在最大(1000MHz)或最小(96MHz)頻率導致的高待機功耗或低遊戲性能問題(6.4內核)[編輯 | 編輯原始碼]
在高解像度和刷新率的設置下,MCLK(vram,顯存頻率)可能會鎖定在最高值(1000MHz)[12] [13] ,造成GPU待機功耗過高。使用Linux 6.4.x內核,MCLK鎖定在最低頻率(96MHz)影響遊戲性能[14] [15]。
這可能是因為顯示器沒有為受影響的解像度和刷新率設置使用一個低V-Blank值的協調視頻時序(Coordinated Video Timings, CVT),參考這篇內容來解決。
未能掛起(suspend)到內存[編輯 | 編輯原始碼]
當系統進入S3狀態後,amdgpu
內核模塊會嘗試緩存顯存數據到內存中,以避免顯存不能充分刷新,顯存中的數據老化導致數據丟失。
如果你使用了大量顯存而空閒內存不足,這會導致掛起失敗。因為IO子系統可能會在此之前掛起,不論是否有足夠的swap空間該問題都可能發生。
你可能會看到類似的消息:
kernel: systemd-sleep: page allocation failure: order:0, mode:0x100c02(GFP_NOIO|__GFP_HIGHMEM|__GFP_HARDWALL), nodemask=(null),cpuset=/,mems_allowed=0 kernel: Call Trace: kernel: <TASK> kernel: dump_stack_lvl+0x47/0x60 kernel: warn_alloc+0x165/0x1e0 kernel: __alloc_pages_slowpath.constprop.0+0xd7d/0xde0 kernel: __alloc_pages+0x32d/0x350 kernel: ttm_pool_alloc+0x19f/0x600 [ttm 0bd92a9d9dccc3a4f19554535860aaeda76eb4f4]
通過一個用戶空間服務可解決該問題,該服務能夠在系統掛起前將足夠的內存交換到SWAP,確保能夠申請到足夠的內存用以顯存緩存。
關機和掛起(suspend)失敗[編輯 | 編輯原始碼]
hid_sensor_*_3d這類內核模塊能夠造成系統在啟動、關機和掛起時死鎖。進程列表裏將會顯示了多個udev-worker
實例,導致系統睡眠時凍結。
你會看到類似消息:
kernel: PM: suspend entry (deep) kernel: Filesystems sync: 0.002 seconds kernel: Freezing user space processes kernel: Freezing user space processes failed after 20.004 seconds (1 tasks refusing to freeze, wq_busy=0): kernel: task:(udev-worker) state:D stack:0 pid:479 tgid:479 ppid:422 flags:0x00004006 kernel: Call Trace: kernel: <TASK> kernel: __schedule+0x3db/0x1520 kernel: ? srso_alias_return_thunk+0x5/0xfbef5 kernel: ? __wake_up_common+0x78/0xa0 kernel: ? srso_alias_return_thunk+0x5/0xfbef5
要解決該問題,將有問題的模塊添加到黑名單中,創建配置文件如/etc/modprobe.d/blacklist-hid_sensors.conf
:
blacklist hid_sensor_accel_3d blacklist hid_sensor_gyro_3d blacklist hid_sensor_magn_3d