AMDGPU

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page AMDGPU and the translation is 100% complete.
Other languages:
Resources

AMDGPU は、Vega GPU および Raven Ridge GPU のための、Display Core (DC) フレームワークを利用した、次世代ファミリのオープンソースグラフィックスドライバです。しかしながら、GCN1.0+ ベースの比較的新しい AMD/ATI Radeon グラフィックスカード、具体的には Southern Islands、Sea Islands、Volcanic Islands、および Arctic Islands チップセットも処理することができます。

対象のカードが以下の機能サポートセクションに無い場合は、そのカードは AMDGPU によってサポートされていません。その場合は、古いオープンソース AMD/ATI Radeon グラフィックスカードドライバの使用方法を含む、radeon の記事を確認してください。

カーネル 4.15 になるまで、Display Core (DC。Display Abstraction Layer (DAL) によって開発されました) はバニラカーネルソースには含まれていなかったため、AMDGPU はグラフィックス出力を VEGA 以降のチップ上のモニタに提供することができませんでした。

インストール

AMDGPU を使用するようにシステムを設定するには、適切なカードを識別し、対応するファームウェアをインストールし、カーネルを設定し、X11 ドライバをインストールする必要があります。

前提条件

ハードウェア検出

正しいドライバを見つけるためにはまず、グラフィックスカードを検出してください。そのためには lspci を使用してください:

root #lspci | grep -i VGA

下の表に列挙されている製品名のいずれかが含まれているか、出力を確認してください。

機能サポート

AMDGPU ドライバによってサポートされているビデオコアは、OpenGL 4.6 および OpenGL ES 3.2 に対応しています。VIDEO_CARDS 変数は "amdgpu radeonsi" に設定する必要があります。media-libs/mesa (バージョン 20.0 以降) を利用することで、ドライバはさらに Vulkan (RADV ドライバ) をサポートすることができ、OpenCL 2.0 も ROCm (dev-libs/rocm-opencl-runtime) を介して利用できます。radeonsi を利用した VDPAUVAAPI へのサポートもあります。

ファミリ チップセット名 マイクロアーキテクチャ[1] ISA[2] 製品名 備考
Southern Islands CAPE VERDE, PITCAIRN, TAHITI, OLAND, HAINAN GCN1.0+ DCE 6.x HD7750-HD7970, R9 270, R9 280, R9 370X, R7 240, R7 250 カーネル 4.9-rc1 より、オプションサポート。GCN1.x のための安定したサポートは、より古い radeon ドライバで見つかります。
Sea Islands BONAIRE, KABINI, KAVERI, HAWAII, MULLINS GCN2.x DCE 8.x HD7790, R7 260, R9 290, R7 360, R9 390 サポートはカーネル内でオプションになっており、DRM_AMDGPU_CIK=y で有効化する必要があります。また、Sea Islands (GCN2.x) カードに対してはより古い radeon ドライバが安定したサポートを提供しています。
Volcanic Islands CARRIZO, FIJI, STONEY, TONGA, TOPAZ, WANI GCN3.x DCE 10/11.x R9 285、R9 380、R9 380X、R9 Fury、R9 Nano、R9 Fury X、Pro Duo カーネル 4.7-rc6 より。
Arctic Islands POLARIS10/11/12, VEGAM GCN4.x DCE 11.2 RX 460、RX 470、RX 480、RX 540、RX 550、RX 560、RX 570、RX 580、RX 590 カーネル 4.15 より。
Vega VEGA10/11/12/20 GCN5.x DCE 12.x RX Vega 56、RX Vega 64、Radeon Vega II、Radeon VII カーネル 4.15 より。
Vega RAVEN GCN5.x DCN 1.0 Raven Ridge APU シリーズ カーネル 4.16 より。[3][4]
Vega RENOIR GCN5.x DCN 2.1 Renoir、Lucienne、および Cezanne APU シリーズ
Navi NAVI10/14/21/22/23 RDNA DCN 2.0 RX 5500, RX 5500 XT, RX 5600, RX 5600 XT, RX 5700, RX 5700 XT 最低でもカーネル 5.3、Mesa 19.2、および LLVM 9.0 を必要とします。[5]
Navi NAVI10/14/21/22/23 RDNA2 DCN 3.0 RX 6600, RX 6600 XT, RX 6700, RX 6700 XT, RX 6800, RX 6800 XT, RX 6900 XT 最低でもカーネル 5.3、Mesa 19.2、および LLVM 9.0 を必要とします。[5] カーネル 5.9.12 より、RX 6*00 シリーズは CONFIG_DRM_AMD_DC_DCN3_0=Y が必要です。[6][7]

ファームウェア

カードに対応した適切なファームウェア (またはマイクロコード) をインストールする必要があります。ファームウェアファイルは sys-kernel/linux-firmware によって提供されます。savedconfig USE フラグを使用している場合は、ハードウェアのために必要なファイルがすべて、設定ファイルに含まれていることを確認してください。

USE flags for sys-kernel/linux-firmware Linux firmware files

compress-xz Compress firmware using xz (app-arch/xz-utils) before installation
compress-zstd Compress firmware using zstd (app-arch/zstd) before installation
deduplicate Create symlinks for all firmware that is duplicate using rdfind
initramfs Create and install initramfs for early microcode loading in /boot (only AMD for now)
redistributable Install also non-free (but redistributable) firmware files
savedconfig Allows individual selection of firmware files
unknown-license Install firmware files whose license is unknown

root #emerge --ask sys-kernel/linux-firmware

このようにしてインストールされたファームウェアファイルを、カーネルに組み込むことになります。

メモ
Navi10 カード (RX 5700、RX 5700XT [FE]) は少なくとも sys-kernel/linux-firmware のバージョン 20190923 を必要とします。

カーネル

メモ
最も簡単なインストール方法は、"AMD GPU" をモジュール (M) として選択し、initramfs に含めないという方法です。こうすると、ドライバが少し遅れて、udev がアクティブになってからロードされますが、この場合はファームウェアを手動で管理する必要がなくなるでしょう。そうしない場合は、下のファームウェアを組み込むのセクションを注意深くお読みください。

上述のグラフィックチップセットのための、以下のカーネルオプションを設定してください:

カーネル AMD グラフィックスのためにカーネルを設定する (Linux カーネル 4.15 以降)
Processor type and features  --->
    [*] MTRR (Memory Type Range Register) support (''CONFIG_MTRR'')
Memory Management options  --->
    [*] Allow for memory hot-add
    [*] Allow for memory hot remove
    [*] Device memory (pmem, HMM, etc...) hotplug support
    [*] Unaddressable device memory (GPU memory, ...)
Device Drivers  --->
    Graphics support  --->
        <*/M> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) ---> (''DRM_FBDEV_EMULATION'')
              [*]   Enable legacy fbdev support for your modesetting driver
        <   > ATI Radeon
        <M/*> AMD GPU
              [ /*] Enable amdgpu support for SI parts (''DRM_AMDGPU_SI'')
                    (only needed for Southern Islands GPUs with the amdgpu driver)
              [ /*] Enable amdgpu support for CIK parts (''DRM_AMDGPU_CIK'')
                    (only needed for Sea Islands GPUs with the amdgpu driver)
              ACP (Audio CoProcessor) Configuration  ---> 
                  [*] Enable AMD Audio CoProcessor IP support (''CONFIG_DRM_AMD_ACP'')
                        (only needed for APUs)
              Display Engine Configuration  --->
                  [*] AMD DC - Enable new display engine (''DRM_AMD_DC'')
                  [ /*] DC support for Polaris and older ASICs
                        (only needed for Polaris, Carrizo, Tonga, Bonaire, Hawaii)
                  [ /*] AMD FBC - Enable Frame Buffer Compression
                  [ /*] DCN 1.0 Raven family
                        (only needed for Vega RX as part of Raven Ridge APUs)
                  [ /*] DCN 3.0 family
                        (only needed for NAVI21/Sienna Cichlid GPUs with the amdgpu driver)
        <*/M> HSA kernel driver for AMD GPU devices (''HSA_AMD'')
    <*/M> Sound card support  --->
        <*/M> Advanced Linux Sound Architecture  --->
            [*]   PCI sound devices ---> (''CONFIG_SND_PCI'')
                  HD-Audio  --->
                      <*> HD Audio PCI (''CONFIG_SND_HDA_INTEL'')
                      [*] Support initialization patch loading for HD-audio (''CONFIG_SND_HDA_PATCH_LOADER'')
                      <*> whatever audio codec your soundcard needs
                      <*> Build HDMI/DisplayPort HD-audio codec support (''CONFIG_SND_HDA_CODEC_HDMI'')
                  (2048) Pre-allocated buffer size for HD-audio driver (''CONFIG_SND_HDA_PREALLOC_SIZE'')
メモ
AMDGPU を使用するときは、radeon モジュールがビルドされないように、ATI Radeon オプションの設定を解除することをおすすめします。それか、モジュールをビルドしつつ、ブラックリストに入れることもできます (再起動後に、ブラックリストが機能しているか lsmod | grep radeon で確認してください)。multiseat など、システムがそれを要求しない限り、amdgpu と radeon モジュールは同時にロードされることを意図していません。

Sound card support メニューのオプションは、カードが HDMI または DisplayPort オーディオをサポートしていて、それを使用したい場合のみ設定する必要があります。より新しいカーネルで Enable AMD Audio CoProcessor IP support が現れた場合は、これも設定するべきです。

Display Core を備えた AMDGPU は、当初 VEGA10 (GCN5.0) および RAVEN (DCN 1.0 搭載) GPU/APU 向けに実装されました。バージョン 4.17 より前のカーネルは、amdgpu.dc=1 コマンドラインオプション を通じて、古い radeon カーネルモジュールよりも良好に動作する(GCN1.1 以降の)古いカード向けの(実験的な) DC サポートを含んでいます。同様に、特別な理由で DC を無効化する必要がある場合、カーネルコマンドラインで amdgpu.dc=0 オプションを使用できます。

HDMI/DisplayPort オーディオの使用に関するさらなる詳細については、radeon の記事を参照してください。

ファームウェアを組み込む

以前の節でインストールされたファームウェアパッケージは、/lib/firmware/amdgpu (Volcanic Islands 以降のカード向け) および /lib/firmware/radeon (Southern Islands と Sea Islands カード向け) 内にファイルを提供します。amdgpu モジュールが読み込まれるときに、正しいファームウェアファイルにアクセスできる必要があります。

重要
amdgpu モジュールがローダブルカーネルモジュールとしてコンパイルされる (つまり、カーネルコンフィグで AMDGPU が M に設定されている) 場合、モジュールがロードされる時点でファームウェアファイルにアクセス可能でなくてはなりません。特にモジュールが initrd/initramfs からロードされる場合、カーネルは、モジュールがカーネルに直接組み込まれた (つまり、カーネルコンフィグで AMDGPU が * に設定されている) 場合と同じように、ブートの早期ステージ中にモジュールを初期化しようとします。このステージでファームウェアファイルにアクセスできるようにするためには、ファームウェアは initrd/initramfs (これは GRUB などのブートローダによってロードする必要があります) に含めるか、カーネルイメージ内に直接含める必要があります。
カーネル カーネルにファームウェアを含める (4.18 より前)
Device Drivers  --->
    Generic Driver Options  --->
        -*- Userspace firmware loading support
        [*] Include in-kernel firmware blobs in kernel binary 
            (amdgpu/<YOUR-MODEL>.bin or radeon/<YOUR-MODEL>.bin) (''CONFIG_EXTRA_FIRMWARE'')
            (/lib/firmware) Firmware blobs root directory
カーネル カーネルにファームウェアを含める (4.18 以降)
Device Drivers  --->
    Generic Driver Options  --->
        Firmware loader --->
          -*- Firmware loading facility
          (amdgpu/<YOUR-MODEL>.bin or radeon/<YOUR-MODEL>.bin) Build named firmware blobs into the kernel binary
          (/lib/firmware) Firmware blobs root directory
メモ
sys-kernel/genkernel > 4.0 を使用すると、指定されたファームウェアファイルを initramfs に簡単に含めることができます。genkernel の記事の Firmware loading の節を参照してください。
重要
4.15.x (2018 年 8 月) および 4.19.9[8] (2018 年 12 月) 以前のカーネルは、正しくブートするためにはここで列挙されたものと異なる (より古い) ファームウェアファイル群を必要とします。すべての現行のカーネルについては、常に sys-kernel/linux-firmware が更新されているのを確認することが推奨されます。

ファームウェアをカーネルまたは initramfs に含める必要があり、かつ sys-kernel/linux-firmware に savedconfig USE フラグを適用している場合は、savedconfig 設定ファイルの内容も変更後のファームウェアファイル群で更新されていることを確認してください (上述の 2018 年の変更と同様に)。新しく追加されたすべてのファイルをカーネル設定ファイルのファームウェア行に組み込んで、新しいカーネルイメージを再ビルドしてインストールしてください。そうしないとおそらく、画面には何も表示されず、カーネルログにはファームウェアのロードエラーが吐かれて、ブートに失敗するでしょう。

未知のファームウェアブロブ

ここでは試行錯誤による方法がうまく行くことが多いです。複数ステップからなるプロセスの中で、まずはブートできる基本的なシステムがあれば必要な情報を得るためには十分でしょう: dmesg 内の amdgpu エラーとして欠けているファームウェアが示され、これは必要なファームウェアファイルを特定するために利用できます。

メモ
AMDGPU ドライバはファームウェア無しでは適切に動作しないため、ファームウェアファイルが無い状態でこの方法を使うと、画面に何も映らなくなる可能性が非常に高いでしょう。それでも必要な情報を得るための非常に基本的な方法としては、何も見えない状態で dmesg 出力をファイルに保存するようにタイプして、AMDGPU ドライバを使用せずに再起動してこの出力を解析することができます。より良い選択は、断続的にすべてのファームウェア (amdgpu/*) を含めることです。ですが、sys-kernel/gentoo-sourcesUSE="experimental" とともにインストールされていて CONFIG_GENTOO_PRINT_FIRMWARE_INFO=y がカーネル .config で設定されていない限りdmesg は通常はどのファームウェアがロードされたかを表示しません。あるいは、他のフレームバッファドライバ (vesafb または efifb などの) の使用を強制するのもより良い選択でしょう。
root #dmesg -t | grep amdgpu | grep firmware
amdgpu 0000:07:00.0: Direct firmware load for amdgpu/green_sardine_sdma.bin failed with error -2
[drm:sdma_v4_0_early_init] *ERROR* sdma_v4_0: Failed to load firmware "amdgpu/green_sardine_sdma.bin"
amdgpu 0000:07:00.0: Direct firmware load for amdgpu/green_sardine_asd.bin failed with error -2
root #dmesg -t | grep amdgpu | grep firmware
Loading firmware: amdgpu/green_sardine_sdma.bin
Loading firmware: amdgpu/green_sardine_asd.bin
Loading firmware: amdgpu/green_sardine_ta.bin
Loading firmware: amdgpu/green_sardine_pfp.bin
Loading firmware: amdgpu/green_sardine_me.bin
Loading firmware: amdgpu/green_sardine_ce.bin
Loading firmware: amdgpu/green_sardine_rlc.bin
Loading firmware: amdgpu/green_sardine_mec.bin
Loading firmware: amdgpu/green_sardine_dmcub.bin
Loading firmware: amdgpu/green_sardine_vcn.bin
重要
以下の方法は sys-kernel/linux-firmware がインストールされ、必要な (しかし上の例で欠けている) ファームウェアが実際に利用可能な場合のみ機能します。非常に新しいグラフィックスカードのためのファームウェアは不安定版のパッケージにのみ含まれている場合がありますが、そのようなパッケージはコマンドライン ACCEPT_KEYWORDS="~amd64" emerge --ask sys-kernel/linux-firmware の中で ~amd64 とするように、または /etc/portage/package.accept_keywords に追加するなどの方法で、ACCEPT_KEYWORDS 内で ~ を使用することによってインストールすることができます。

AMDGPU ファームウェアファイルの命名法に従えば、GPU のモデルのコードネームで始まるすべてのファイルが含めるべき正しいファームウェアブロブです。上の例ではコードネームは「Green Sardine」なので、green_sardine を検索する次のコマンドによって CONFIG_EXTRA_FIRMWARE のために必要なリストが得られるでしょう:

user $ls /lib/firmware/amdgpu/green_sardine*.bin | sed 's/\/lib\/firmware\///' | echo $(cat)
amdgpu/green_sardine_asd.bin amdgpu/green_sardine_ce.bin amdgpu/green_sardine_dmcub.bin amdgpu/green_sardine_me.bin amdgpu/green_sardine_mec2.bin amdgpu/green_sardine_mec.bin amdgpu/green_sardine_pfp.bin amdgpu/green_sardine_rlc.bin amdgpu/green_sardine_sdma.bin amdgpu/green_sardine_ta.bin amdgpu/green_sardine_vcn.bin
メモ
genkernel を使用している場合は、そちらのファームウェアのロードの節を参照してください。
既知のファームウェアブロブ

amdgpu/<YOUR-MODEL>.bin または radeon/<YOUR-MODEL>.bin は、下の表中のチップセット名によって与えられるファイル名の、スペース区切りのリストで置き換えるべきです。echo を使用してファイル名を展開してください。例えば、Volcanic Islands/TONGA では次を実行してください:

user $echo amdgpu/tonga_{ce,k_smc,mc,me,mec2,mec,pfp,rlc,sdma1,sdma,smc,uvd,vce}.bin
amdgpu/tonga_ce.bin amdgpu/tonga_k_smc.bin amdgpu/tonga_mc.bin amdgpu/tonga_me.bin amdgpu/tonga_mec2.bin amdgpu/tonga_mec.bin amdgpu/tonga_pfp.bin amdgpu/tonga_rlc.bin amdgpu/tonga_sdma1.bin amdgpu/tonga_sdma.bin amdgpu/tonga_smc.bin amdgpu/tonga_uvd.bin amdgpu/tonga_vce.bin

この場合、amdgpu/tonga_ce.bin amdgpu/tonga_k_smc.bin amdgpu/tonga_mc.bin amdgpu/tonga_me.bin amdgpu/tonga_mec2.bin amdgpu/tonga_mec.bin amdgpu/tonga_pfp.bin amdgpu/tonga_rlc.bin amdgpu/tonga_sdma1.bin amdgpu/tonga_sdma.bin amdgpu/tonga_smc.bin amdgpu/tonga_uvd.bin amdgpu/tonga_vce.bin がカーネル設定に含めるべき文字列です。

以下の表からファームウェアファイル名を展開したら、それをカーネル設定の中にコピーし、設定を保存し、新しいカーネルとモジュールをコンパイルおよびインストールしてください。

チップセット名 ファームウェア
CAPE VERDE radeon/verde_{ce,mc,me,pfp,rlc,smc}.bin, radeon/TAHITI_{uvd,vce}.bin
PITCAIRN radeon/pitcairn_{ce,mc,me,pfp,rlc,smc,k_smc}.bin, radeon/TAHITI_{uvd,vce}.bin
TAHITI radeon/tahiti_{ce,mc,me,pfp,rlc,smc,uvd,vce}.bin
OLAND amdgpu/oland_{uvd,smc,rlc,pfp,me,mc,ce}.bin
HAINAN radeon/hainan_{ce,mc,me,pfp,rlc,smc}.bin, radeon/TAHITI_uvd.bin
BONAIRE radeon/bonaire_{ce,k_smc,mc,me,mec,pfp,rlc,sdma1,sdma,smc,uvd,vce}.bin
KABINI radeon/kabini_{ce,me,mec,pfp,rlc,sdma1,sdma,uvd,vce}.bin
KAVERI radeon/kaveri_{ce,me,mec2,mec,pfp,rlc,sdma1,sdma,uvd,vce}.bin
HAWAII amdgpu/hawaii_{ce,k_smc,mc,me,mec,pfp,rlc,sdma,sdma1,smc,uvd,vce}.bin
MULLINS radeon/mullins_{ce,me,mec,pfp,rlc,sdma1,sdma,uvd,vce}.bin
CARRIZO amdgpu/carrizo_{ce,me,mec2,mec,pfp,rlc,sdma1,sdma,uvd,vce}.bin
FIJI amdgpu/fiji_{ce,mc,me,mec2,mec,pfp,rlc,sdma1,sdma,smc,uvd,vce}.bin
TONGA amdgpu/tonga_{ce,k_smc,mc,me,mec2,mec,pfp,rlc,sdma1,sdma,smc,uvd,vce}.bin
TOPAZ amdgpu/topaz_{ce,mc,me,mec2,mec,pfp,rlc,sdma1,sdma,smc}.bin
STONEY amdgpu/stoney_{ce,me,mec,pfp,rlc,sdma,uvd,vce}.bin
POLARIS10 amdgpu/polaris10_{ce,ce_2,k_smc,k2_smc,k_mc,mc,me,me_2,mec2,mec2_2,mec,mec_2,pfp,pfp_2,rlc,sdma1,sdma,smc,smc_sk,uvd,vce}.bin
POLARIS11 amdgpu/polaris11_{ce,k_smc,k2_smc,k_mc,mc,me,mec2,mec,pfp,rlc,sdma1,sdma,smc,smc_sk,uvd,vce}.bin
POLARIS12 amdgpu/polaris12_{ce,ce_2,k_mc,k_smc,mc,me,me_2,mec,mec2,mec2_2,mec_2,pfp,pfp_2,rlc,sdma,sdma1,smc,uvd,vce}.bin
VEGA10 amdgpu/vega10_{acg_smc,asd,ce,gpu_info,me,mec,mec2,pfp,rlc,sdma,sdma1,smc,sos,uvd,vce}.bin
RAVEN amdgpu/raven_{asd,ce,gpu_info,me,mec,mec2,pfp,rlc,sdma,vcn}.bin
VEGA12 amdgpu/vega12_{asd,ce,gpu_info,me,mec,mec2,pfp,rlc,sdma,sdma1,smc,sos,uvd,vce}.bin
RENOIR amdgpu/renoir_{asd,ce,dmcub,gpu_info,me,mec2,mec,pfp,rlc,sdma,vcn}.bin
CEZANNE amdgpu/green_sardine_{asd,ce,dmcub,me,mec2,mec,pfp,rlc,sdma,ta,vcn}.bin
REMBRANDT amdgpu/yellow_carp_{asd,ce,dmcub,me,mec2,mec,pfp,rlc,sdma,ta,toc,vcn}.bin
NAVI10 amdgpu/navi10_{asd,ce,gpu_info,me,mec2,mec,pfp,rlc,sdma1,sdma,smc,sos,ta,vcn}.bin
NAVI14 amdgpu/navi14_{asd,ce,ce_wks,gpu_info,me,mec2,mec2_wks,mec,mec_wks,me_wks,pfp,pfp_wks,rlc,sdma1,sdma,smc,sos,ta,vcn}.bin
NAVI21 amdgpu/sienna_cichlid_{ce,dmcub,me,mec2,mec,pfp,rlc,sdma,smc,sos,ta,vcn}.bin
NAVI22 amdgpu/navy_flounder_{ce,me,mec2,rlc,smc,ta,dmcub,mec,pfp,sdma,sos,vcn}.bin
NAVI23 amdgpu/dimgrey_cavefish_{ce,me,mec2,rlc,smc,ta,dmcub,mec,pfp,sdma,sos,vcn}.bin
NAVI24 amdgpu/beige_goby_{ce,ta,rlc,sos,dmcub,smc,sdma,mec,mec2,pfp,vcn,me}.bin
NAVI31 amdgpu/gc_11_0_0_{imu,pfp,me,rlc,mec,mes,mes1}.bin, amdgpu/psp_13_0_0_{sos,ta}.bin, amdgpu/smu_13_0_0.bin, amdgpu/dcn_3_2_0_dmcub.bin, amdgpu/sdma_6_0_0.bin amdgpu/vcn_4_0_0.bin

X11 ドライバ

emerge

Portage は、さまざまなグラフィックスカードのためのサポートをパッケージで有効化させるために、VIDEO_CARDS USE_EXPAND 変数を使用しています。VIDEO_CARDSamdgpu radeonsi に設定して (上の機能サポート表の節を参考にしてください)、Portage に USE フラグの変更を適用して @world 集合を更新させれば、正しいドライバがインストールされるでしょう:

ファイル /etc/portage/make.conf
VIDEO_CARDS="amdgpu radeonsi"
メモ
AMDGPU を使用する場合でも media-libs/mesa のために radeonsi を含める必要があります。
root #emerge --ask --deep --changed-use @world

これで、次の再起動後に amdgpu を使うためにシステムの準備ができたはずです。

電源管理

メモ
この節では AMDGPU Dynamic Power Management (DPM) を使った、より新しい (Radeon HD 2000 シリーズ / r600 以降の) 方法のみを取り扱います。より古い dynpm と profile を使った方法は、radeon wiki ページで見つけることができます。

Dynamic Power Management (DPM) は、コアクロック周波数、メモリクロック周波数、および電圧レベルを、現在の GPU の要求に基づいてドライバが動的に調節できるようにする技術です。カーネル 3.13 以降、DPM は大部分の AMD ハードウェアに対してデフォルトで有効化されています。[9]

カーネル 4.5 以降[10]、AMDGPU は PowerPlay プロファイルをサポートしています。新しいハードウェアでは、これらのプロファイルは power_dpm_state を置き換えるものです。

重要
以降はユーザが調節したい GPU が card0 であると仮定します。/sys/class/drm/ に列挙されているカード番号から正しいものを特定して、コマンドを適宜修正してください。

システムが PowerPlay を使用しているか確認するために、デバイスの sysfs ディレクトリの内容を確認してください:

user $ls /sys/class/drm/card0/device/pp_*

pp_ 接頭辞を持つなんらかのファイルが返されれば、それはドライバによって PowerPlay が実装されていることを示唆します。

警告
/sys/class/drm/card0/device/ 内の「ファイル」は低レベルグラフィックス API を公開しています。これらの内容を変更するには特定のコマンド操作が必要であり、さらにそうした変更はシステムハードウェアを回復不可能なかたちで損傷するおそれがあります。[11]

DPM と PowerPlay の機能を有効化する

DPM

次のカーネルパラメータを使用することで、DPM を明示的に有効化 (1) または無効化 (0) することができます。デフォルトは -1 (auto)[12] です。

コード DPM を有効化する
amdgpu.dpm=1

PowerPlay 機能マスク

メモ
カーネルパラメータ amdgpu.powerplay はカーネル 4.5 以降文書化されていませんが、PowerPlay がサポートされていれば DPM を有効化することで PowerPlay も有効化されるようです[13]

PowerPlay 機能マスクカーネルパラメータは、GPU のディスプレイ機能を上書きします。sysfs でのクロックと電圧の調整をアンロックするために必要です。マスクは 32 ビットからなり、現時点で 20 個の機能が実装されています[14]。デフォルトは現時点で安定化されているディスプレイ機能の集合です[15]

コード kernel:root/drivers/gpu/drm/amd/include/amd_shared.h
* @PP_SCLK_DPM_MASK: Dynamic adjustment of the system (graphics) clock.
* @PP_MCLK_DPM_MASK: Dynamic adjustment of the memory clock.
* @PP_PCIE_DPM_MASK: Dynamic adjustment of PCIE clocks and lanes.
* @PP_SCLK_DEEP_SLEEP_MASK: System (graphics) clock deep sleep.
* @PP_POWER_CONTAINMENT_MASK: Power containment.
* @PP_UVD_HANDSHAKE_MASK: Unified video decoder handshake.
* @PP_SMC_VOLTAGE_CONTROL_MASK: Dynamic voltage control.
* @PP_VBI_TIME_SUPPORT_MASK: Vertical blank interval support.
* @PP_ULV_MASK: Ultra low voltage.
* @PP_ENABLE_GFX_CG_THRU_SMU: SMU control of GFX engine clockgating.
* @PP_CLOCK_STRETCH_MASK: Clock stretching.
* @PP_OD_FUZZY_FAN_CONTROL_MASK: Overdrive fuzzy fan control.
* @PP_SOCCLK_DPM_MASK: Dynamic adjustment of the SoC clock.
* @PP_DCEFCLK_DPM_MASK: Dynamic adjustment of the Display Controller Engine Fabric clock.
* @PP_OVERDRIVE_MASK: Over- and under-clocking support.
* @PP_GFXOFF_MASK: Dynamic graphics engine power control.
* @PP_ACG_MASK: Adaptive clock generator.
* @PP_STUTTER_MODE: Stutter mode.
* @PP_AVFS_MASK: Adaptive voltage and frequency scaling.
* @PP_GFX_DCS_MASK: GFX Async DCS.

現在のシステムマスクを判定するには:

user $printf 'amdgpu.ppfeaturemask=0x%x\n' "$(($(cat /sys/module/amdgpu/parameters/ppfeaturemask)))"
amdgpu.ppfeaturemask=0x0007bfff

ブート時にカーネルパラメータを設定することで機能を変更することができます。

コード PowerPlay マスクを設定する
amdgpu.ppfeaturemask=0x0007bfff
メモ
32 ビットすべてを設定する (0xffffffff) のは推奨されません。これは将来実装され、不安定な可能性のある、あらゆる機能をデフォルトで有効化するでしょう。
警告
機能の意図を理解せずに機能を有効化または無効化することは、ハードウェアの損傷やデータ損失につながるおそれがあります。

設定

警告
以下の手順には、直接ハードウェアと相互作用し、不可逆的にデバイスに損傷を与えるおそれのあるものもあります。コマンドの実行前にはよく内容を確認してください。

AMDGPU は、/sys/class/drm/card0/device/ にある sysfs ファイルを使用した公開 API を通じて、ハードウェアの設定を制御します。このディレクトリ内のファイルは特定のハードウェアごとに、そして有効化されている機能によって異なるでしょう。これらのファイルの一部は、catless 等の非 root テキスト編集プログラムを使用して、安全にユーザが読むことができます。ですが、多くのファイルは人間には読めないバイナリデータを出力します。

クロック周波数と電圧の調整 (アンダークロック/オーバークロック) は、DPM および PowerPlay API を利用して行うことができます。完全なドキュメントは kernel.org で読むことができるので、進める前に確認しておくべきです。

現在のメトリクスを確認する

amdgpu ドライバは、gpu_metrics ファイルを通じて現在の gpu メトリクスデータを取得するための sysfs API を提供し、すべてのセンサのスナップショットを同時に提供します。これには温度、クロック周波数、エンジン使用率、電力消費、スロットルの状態、ファン回転速度、および cpu コア統計 (APU でのみ利用可能) が含まれます。

amdgpu_metrics.py のようなスクリプトを使用して解析することができます。

機能マスクを更新する

パラメータを調整できるようにするためには、カーネルパラメータで正しい機能マスクを設定する必要があります。プロファイル、クロック、および電圧の値を調整するには、一般的にはシステムの現在のマスクと PP_OVERDRIVE_MASK ビット 0x4000 を組み合わせた値を設定すれば十分です。

新しいシステムマスクを決定してください。

user $printf 'amdgpu.ppfeaturemask=0x%x\n' "$(($(cat /sys/module/amdgpu/parameters/ppfeaturemask) | 0x4000))"
amdgpu.ppfeaturemask=0x0007ffff

カーネルパラメータを更新してください。

コード カーネルパラメータ: PowerPlay 機能マスク
amdgpu.ppfeaturemask=0x0007ffff

パフォーマンスプロファイル

amdgpu ドライバは、特定の電源関連パラメータを微調整するための sysfs API を提供しています。このためには power_dpm_force_performance_level ファイルが使用されます。プロファイルの完全な説明はカーネルドキュメンテーションで見つかります。デフォルトでは 'auto' に設定されています。

電源プロファイル、クロック周波数、および電圧の変更を有効化するには、パフォーマンスプロファイルを manual に設定する必要があります。

現在のプロファイルを変更するには:

root #echo 'manual' > /sys/class/drm/card0/device/power_dpm_force_performance_level
メモ
これらの変更は再起動後は保持されません。

電源状態

amdgpu ドライバは、ある電源状態内での電力レベルの切り換えに関連するヒューリスティクスを調節するための、sysfs API を提供しています。このためにはファイル pp_power_profile_mode が使用されます。プロファイルの完全な説明はカーネルドキュメンテーションで見つかります。

サポートされているプロファイルを確認するためには、pp_power_profile_mode ファイルの内容を見てください (アスタリスク * は現在のプロファイルを示しています)。

メモ
このコマンドの出力は、特定のハードウェアやカーネルドライバに応じて異なるでしょう。
user $cat /sys/class/drm/card0/device/pp_power_profile_mode
PROFILE_INDEX(NAME) CLOCK_TYPE(NAME) FPS MinFreqType MinActiveFreqType MinActiveFreq BoosterFreqType BoosterFreq PD_Data_limit_c PD_Data_error_coeff PD_Data_error_rate_coeff
 0 BOOTUP_DEFAULT :
                    0(       GFXCLK)       0       5       1       0       4     800 4587520  -65536       0
                    1(       SOCCLK)       0       5       1       0       1       0 3276800   -6553   -6553
                    2(        MEMLK)       0       5       1       0       4     800  327680  -65536       0
 1 3D_FULL_SCREEN :
                    0(       GFXCLK)       0       5       1       0       4     650 4587520   -3276  -65536
                    1(       SOCCLK)       0       5       1       0       1       0  655360   -6553   -6553
                    2(        MEMLK)       0       5       4     850       4     800  327680  -65536       0
 2   POWER_SAVING :
                    0(       GFXCLK)       0       5       1       0       3       0 5898240  -65536       0
                    1(       SOCCLK)       0       5       1       0       1       0 3407872   -6553   -6553
                    2(        MEMLK)       0       5       1       0       3       0 1966080  -65536       0
 3          VIDEO*:
                    0(       GFXCLK)       0       5       1       0       4     500 4587520  -65536       0
                    1(       SOCCLK)       0       5       1       0       1       0 3473408   -6553   -6553
                    2(        MEMLK)       0       5       1       0       4     500 1966080  -65536       0
 4             VR :
                    0(       GFXCLK)       0       5       4    1000       1       0 3932160       0       0
                    1(       SOCCLK)       0       5       1       0       1       0  655360   -6553   -6553
                    2(        MEMLK)       0       5       1       0       4     800  327680  -65536       0
 5        COMPUTE :
                    0(       GFXCLK)       0       5       4    1000       1       0 3932160       0       0
                    1(       SOCCLK)       0       5       1       0       1       0  655360   -6553   -6553
                    2(        MEMLK)       0       5       4     850       3       0  327680  -65536  -32768
 6         CUSTOM :
                    0(       GFXCLK)       0       5       1       0       4     800 4587520  -65536       0
                    1(       SOCCLK)       0       5       1       0       1       0 3276800   -6553   -6553
                    2(        MEMLK)       0       5       1       0       4     800  327680  -65536       0

電源プロファイルを更新するには、まずパフォーマンスモードを manual に変更してください。

root #echo 'manual' > /sys/class/drm/card0/device/power_dpm_force_performance_level

次に pp_power_profile_mode を定義済みプロファイルの番号で更新してください。

root #echo '3' > /sys/class/drm/card0/device/pp_power_profile_mode

電源プロファイルは、pp_power_profile_mode ファイルにコマンドを送信することで編集することができます。コマンドの構文は、プロファイルインデックス番号で始まり、次にクロックタイプの番号、そしてプロファイルの出力の各列の数値が続きます。

例えば、CUSTOM 電源プロファイルの GFXCLK Booster Frequency を 800 から 500 に変更するには:

root #echo '6 0 0 5 1 0 4 500 4587520 -65536 0' > /sys/class/drm/card0/device/pp_power_profile_mode
メモ
これらの変更は再起動後は保持されません。

電力レベル

amdgpu ドライバは、与えられた電源状態に対してどの電力レベルが有効化されるかを調節するための sysfs API を提供します。このためにファイル pp_dpm_sclkpp_dpm_mclkpp_dpm_socclkpp_dpm_fclkpp_dpm_dcefclk そして pp_dpm_pcie が使用されます。プロファイルの完全な説明はカーネルドキュメンテーションで見つかります。

pp_dpm_socclk および pp_dpm_dcefclk インターフェースは Vega10 以降の ASIC でのみ利用可能です。pp_dpm_fclk インターフェースは Vega 20 以降の ASIC でのみ利用可能です。

これらのファイルを読むことで、その電源状態の中で利用可能な電力レベルと、それらのレベルに対応するクロック情報が表示されます。

user $cat /sys/class/drm/card0/device/pp_dpm_sclk
0: 500Mhz 
1: 700Mhz *
2: 2765Mhz 
user $cat /sys/class/drm/card0/device/pp_dpm_mclk
0: 96Mhz *
1: 541Mhz 
2: 675Mhz 
3: 1094Mhz 

クロック周波数と電圧

amdgpu ドライバは、電源状態の各電力レベルごとのクロックと電圧を微調整するための sysfs API を提供しています。このためには pp_od_clk_voltage が使用されます。プロファイルの完全な説明はカーネルドキュメンテーションで見つかります。

現在の値を判定します。

user $cat /sys/class/drm/card0/device/pp_od_clk_voltage
OD_SCLK:
 0: 700Mhz
 1: 2744Mhz
OD_MCLK:
 0: 97Mhz
 1: 1094MHz
OD_VDDGFX_OFFSET:
 0mV
OD_RANGE:
 SCLK:     500Mhz       3150Mhz
 MCLK:     674Mhz       1200Mhz
メモ
ここでは DRAM の実効クロックではなく、実際のメモリコントローラクロック周波数が表示されます。

クロック周波数と電圧を更新するには、まずパフォーマンスモードを manual に変更してください。

root #echo 'manual' > /sys/class/drm/card0/device/power_dpm_force_performance_level

次に各調整項目ごとに、ファイルに文字列を書き込んでください。カーネルドキュメンテーションで示されている構文に従ってください。

root #echo 's 1 2410' > /sys/class/drm/card0/device/pp_od_clk_voltage
root #echo 'm 1 1024' > /sys/class/drm/card0/device/pp_od_clk_voltage

完了したら、変更をコミットしてください。

root #echo 'c' > /sys/class/drm/card0/device/pp_od_clk_voltage
user $cat /sys/class/drm/card0/device/pp_od_clk_voltage
OD_SCLK:
 0: 700Mhz
 1: 2410Mhz
OD_MCLK:
 0: 97Mhz
 1: 1024MHz
OD_VDDGFX_OFFSET:
 0mV
OD_RANGE:
 SCLK:     500Mhz       3150Mhz
 MCLK:     674Mhz       1200Mhz

これらの変更は取り消すことができます。

root #echo 'r' > /sys/class/drm/card0/device/pp_od_clk_voltage
メモ
これらの変更は再起動後は保持されません。

トラブルシューティング

デバッグツール

x11-apps/mesa-progs

glxgearsglxinfo ユーティリティを提供する、パッケージ x11-apps/mesa-progs をインストールしておくと役立つかもしれません。

app-misc/radeontop

GPU 使用率を、全体と、個別のブロックごとの両方で表示します:

user $radeontop
Collecting data, please wait....
            radeontop 1.4, running on RAVEN bus 06, 120 samples/sec
                                         │
                   Graphics pipe   0.00% │
─────────────────────────────────────────┼──────────────────────────────────────
                    Event Engine   0.00% │
                                         │
     Vertex Grouper + Tesselator   0.00% │
                                         │
               Texture Addresser   0.00% │
                                         │
                   Shader Export   0.00% │
     Sequencer Instruction Cache   0.00% │
             Shader Interpolator   0.00% │
                                         │
                  Scan Converter   0.00% │
              Primitive Assembly   0.00% │
                                         │
                     Depth Block   0.00% │
                     Color Block   0.00% │
                                         │
                67M / 2016M VRAM   3.35% │ 
                 23M / 3063M GTT   0.76% │
      1.20G / 1.20G Memory Clock 100.00% │████████████████████████████████████████                               
      0.20G / 1.20G Shader Clock  16.67% │██████
                                         │

使用中のグラックスカードを特定する

まず、カーネルが次の設定でコンパイルされていることを確認してください:

カーネル VGA Arbitration (CONFIG_VGA_ARB) と Laptop Hybrid Graphics (CONFIG_VGA_SWITCHEROO) を有効化する
Device Drivers --->
    Graphics support  --->
        -*- VGA Arbitration
        [*] Laptop Hybrid Graphics - GPU switching support

具体的なグラフィックスカードが認識されているか確認してください:

user $lspci -k
[...]
01:00.0 Display controller: Advanced Micro Devices, Inc. [AMD/ATI] Mars [Radeon HD 8670A/8670M/8750M]
        Subsystem: Lenovo Mars [Radeon HD 8670A/8670M/8750M]
        Kernel driver in use: radeon
[...]

その後、パス /sys/kernel/debug/ のマウントが成功していることを確認してください:

root #findmnt debugfs
TARGET            SOURCE  FSTYPE  OPTIONS
/sys/kernel/debug debugfs debugfs rw,nosuid,nodev,noexec,relatime

そして、ドライバ vga_switcheroo が正しくロードされ、値を出力できるか確認してください:

root #< /sys/kernel/debug/vgaswitcheroo/switch
0:DIS: :DynOff:0000:01:00.0
1:IGD:+:Pwr:0000:00:02.0

この出力は以下の構造を持っています[16]:

イテレータ ID アクティブ状態 電源状態 デバイス ID (xxxx:xx:xx.x)
0 DIS 非アクティブ (+ 記号が無いことによって示されています) DynOff 0000:01:00.0
1 IGD アクティブ (+ 記号によって示されています) Pwr 0000:00:02.0

DISディスクリート (discrete) グラフィックスカードを表現していて、これは非アクティブですが現在接続されていません (DynOff)。
IGD統合 (integrated) グラフィックスカードで、これはアクティブ (+) かつ現在使用中 (Pwr) です。

次のコマンドを使用してステータスを操作することができます:

root #echo "<some_parameter>" > /sys/kernel/debug/vgaswitcheroo/switch

<some_parameter> を以下のパラメータのいずれかで置き換えてください[17]:

パラメーター 詳細
ON 接続されていない GPU をオンにします。これは現在のところ何も表示せず、出力も切り替えません
IGD 統合グラフィックを画面に接続します。
DIS ディスクリートグラフィックカードを画面に接続します。
OFF 現在接続されていないグラフィックカードをオフにします。
DIGD X セッションの内部で: 統合グラフィックカードへの切替えを X サーバーが次に再起動されたときに行われるよう予約します。
DDIS X セッションの内部で: ディスクリート グラフィックカードへの切替えを X サーバーが次に再起動されたときに行われるよう予約します。

環境変数 DRI_PRIME=1 を使用することによって、ディスクリートグラフィックスカードを個別に使用することができます:

user $DRI_PRIME=1 glxgears

これは回転する歯車を表示する X ウィンドウを開きます。

これはバックグラウンドで実行しておいて、再度 vga_switcheroo を確認してください:

root #< /sys/kernel/debug/vgaswitcheroo/switch
0:DIS: :DynPwr:0000:01:00.0
1:IGD:+:Pwr:0000:00:02.0
メモ
今回はディスクリートグラフィックスカードのステータスが DynPwr に切り換わっていて、これはアクティブで動作中になっていることを意味します。

他の指標として、温度センサをチェックすることもできます。これには sys-apps/lm-sensors が必要です:

user $sensors
[...]
radeon-pci-0100
Adapter: PCI adapter
temp1:            +42.0°C  (crit = +120.0°C, hyst = +90.0°C)
[...]
メモ
vga_switcheroo がステータスDynOff を表示しているときは、sensors は温度を N/A として、または意味を持たない別の何か (-128°C など) として表示するでしょう。

ディスクリートグラフィックスカードをグローバルに使用するためには、/etc/environment ファイル内で環境変数を設定することができます:

ファイル /etc/environment
DRI_PRIME=1

または、~/.bashrc ファイルでエクスポートすることもできます:

ファイル /home/larry/.bashrc
export DRI_PRIME=1

さらには、上で glxgears を使用したときのように、コマンドの先頭で個別に指定することもできます:

user $DRI_PRIME=1 /usr/bin/chromium
user $DRI_PRIME=1 /usr/bin/vlc

Prime 同期

x11-drivers/xf86-video-amdgpu ドライバは Prime 同期をサポートしません。このことは、AMD GPU がプライマリ GPU として設定されている場合に、統合 GPU に接続されたモニタ上でテアリングが発生する原因となることがあります。 可能な回避策のひとつは、代わりに modesetting ドライバを使用することです。これを行うには、VIDEO_CARDS 変数から amdgpu を削除してください。または modesetting ドライバの使用を強制する xorg 設定ファイルを使用してください。とはいえ、modesetting では他の問題に遭遇するかもしれません[18]

ファイル /etc/X11/xorg.conf.d/force-modesetting.conf
Section "Device"
  Identifier "modesetting"
  Driver "modesetting"
EndSection

また別の可能な回避策は、統合 GPU をプライマリ GPU として設定することです。これは Prime 同期を有効化しないでしょう。しかしながら、テアリングはどのみち AMD の TearFree によって防止されるでしょう。この場合、AMD GPU でレンダされるべきアプリケーションでは、DRI_PRIME=1VDPAU_DRIVER=radeonsi (VDPAU のため) および LIBVA_DRIVER_NAME=radeonsi (VAAPI のため) 変数を使用する必要があるでしょう。

フォールバックドライバ

解決策を求めて web ページを閲覧するための他のマシンを持っていない場合は、3D および 2D アクセラレーション無しで X を開始するために、vesa または fbdev ドライバを使用することができます。

  • 伝統的な BIOS システムのためには vesa
  • UEFI ブートのシステムのためには fbdev
ファイル /etc/partage/make.conf
VIDEO_CARDS="... vesa fbdev"
root #emerge --ask --update --newuse --deep @world

カーネル

古いカーネル

amdgpu ドライバをサポートしない古いカーネルは、AMDGPU オプションを提供しないでしょう。VEGA 以降のチップに対しては DC (Display Code) なしでの映像出力ができませんが、これはバニラカーネル 4.15 で初めて導入されたものです。いずれの場合でも、充分に新しいカーネルは必要なドライバを提供できます。最新の AMD グラフィックスカードおよび APU に対しては、不安定版の (~ で示される) カーネルが必要なカーネルソースを提供しているかもしれません。

AMD Secure Memory Encryption

amdgpu のロードに失敗して画面がフリーズする場合、amdgpu モジュールが AMD Secure Memory Encryption (SME) に対応していないのが原因かもしれません。

SME はカーネルコマンドライン上で (GRUB を使用して、/etc/default/grub 内で、または GRUB_CMDLINE_LINUX の一部として) mem_encrypt=off を追加することで、一時的に無効化することができます。これで問題が解消される場合は、適切にカーネルを設定することで恒久的解決とすることができます。

カーネル
Processor type and features  --->
    [*] AMD Secure Memory Encryption (SME) support
    [ ]   Activate AMD Secure Memory Encryption (SME) by default

AMD_MEM_ENCRYPT は有効化されていても構いませんが、Memory Encryption をオフにするために、AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT の設定を切るか、カーネルコマンドラインオプション mem_encrypt=off を使用する必要があります。同様に、この問題の影響を受けないシステムではカーネルコマンドライン上で、あるいは GRUB で /etc/default/grub 内の GRUB_CMDLINE_LINUX を使用してより恒久的に、mem_encrypt=on とすることで SME を活性化させることができます。

AMDGPU/RadeonSI ドライバが機能しない

VIDEO_CARDSamdgpuradeonsi を含めただけではグラフィックスカードがサポートされない場合は、radeonmake.confVIDEO_CARDS 定義に追加してみてください。次のように:

ファイル /etc/portage/make.conf
VIDEO_CARDS="amdgpu radeonsi radeon"

値を設定したら、変更を適用するためにシステムを更新してください:

root #emerge --ask --changed-use --deep @world

フルスクリーンウィンドウの性能が悪い

インストールされている sys-devel/llvm のバージョンが古すぎるのかもしれません。unstable/testing バージョン を emerge してみてください。

ハイブリッドシステムで Xrandr が HDMI ポートを認識しない

AMD iGPU および dGPU のハイブリッドシステム上で、xrandr が eDP ポートのみを表示し、HDMI を表示しない場合があります:

user $xrandr
Screen 0: minimum 320 x 200, current 1920 x 2160, maximum 16384 x 16384
eDP connected primary 1920x1080+0+1080 (normal left inverted right x axis y axis) 382mm x 215mm
   1920x1080    144.03*+  60.01  
   1680x1050    144.03  
   1280x1024    144.03  
   1440x900     144.03  
   1280x800     144.03  
   1280x720     144.03  
   1024x768     144.03  
   800x600      144.03  
   640x480      144.03  

Xorg ログではそのポートが検出され、そのモニタの EDID が問題なくデコードされているにもかかわらずです:

user $cat /var/log/Xorg.0.log
[...]
[     8.282] (II) AMDGPU(G0): Output HDMI-A-1-0 has no monitor section
[     8.294] (II) AMDGPU(G0): EDID for output HDMI-A-1-0
[     8.295] (II) AMDGPU(G0): Manufacturer: DEL  Model: a11e  Serial#: 843731010
[...]
[     8.295] (II) AMDGPU(G0): Supported established timings:
[     8.295] (II) AMDGPU(G0): 720x400@70Hz
[...]
[     8.295] (II) AMDGPU(G0): EDID (in hex):
[     8.295] (II) AMDGPU(G0):   00ffffffffffff0010ac1ea142504a32
[     8.295] (II) AMDGPU(G0):   0c1f010380351e78ea05f5a557529c27
[...]
[     8.296] (II) AMDGPU(G0): Printing probed modes for output HDMI-A-1-0
[     8.296] (II) AMDGPU(G0): Modeline "1920x1080"x60.0  148.50  1920 2008 2052 2200  1080 1084 1089 1125 +hsync +vsync (67.5 kHz eP)
[...]

そうでない場合はこれとは別の問題です。先にそちらに対処すべきです。

2 つの GPU があるので、Xrandr は 2 つのプロバイダを持っているでしょう:

user $xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x54 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 4 outputs: 1 associated providers: 1 name:Unknown AMD Radeon GPU @ pci:0000:07:00.0
Provider 1: id: 0x84 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 5 outputs: 1 associated providers: 1 name:Radeon RX 5500M @ pci:0000:03:00.0

ソースを出力と繋げる必要があります:

user $xrandr --setprovideroutputsource provider source

上で提示された例では、こうなるでしょう:

user $xrandr --setprovideroutputsource 1 0

その後、xrandr は HDMI を表示し、レイアウトを正しく操作できるようになります:

user $xrandr
Screen 0: minimum 320 x 200, current 1920 x 2160, maximum 16384 x 16384
eDP connected primary 1920x1080+0+1080 (normal left inverted right x axis y axis) 382mm x 215mm
   1920x1080    144.03*+  60.01  
[...]
HDMI-A-1-0 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 527mm x 296mm
   1920x1080     60.00*+  50.00    59.94  
[...]

スクリーンテアリング

Xorg 上でのスクリーンテアリングを防止する方法のひとつは、次のようにして X11 の TearFree オプションを有効化することです:

ファイル /usr/share/X11/xorg.conf.d/10-amdgpu.conf
Section "OutputClass"
	Identifier "AMDgpu"
	MatchDriver "amdgpu"
	Driver "amdgpu"
    Option "TearFree" "true"
EndSection

画面がちらついたり、真っ白になる

メモ
この問題はすでに Gentoo フォーラムで報告されています: https://forums.gentoo.org/viewtopic-t-1160883.html

上流のレベルで提案されている対処は、sg_display モジュールパラメータを次のように設定する方法です: amdgpu.sg_display=0

もう一つの方法としては、以下のパッチをカーネルソースコードに適用してください: https://patchwork.freedesktop.org/patch/519023

Linux カーネル >= 6.1.4 でこの問題が関係するようです。

頻繁かつ散発的にクラッシュする

ユーザーによっては、AMDGPU ドライバーを使用しているときに、頻繁かつ見たところランダムなグラフィックカードのクラッシュを経験することがあります。カーネルログを確認すると、たくさんの異なるエラーが表示されますが、よくあるのは *ERROR* Waiting for fences timed out!*ERROR* ring gfx timeout に類するものです。通常、これに続いてグラフィックデバイス/ドライバのリセットが起こります。

これは、AMDGPU またはデバイスのファームウェアによるハードウェアの意図的でないオーバークロックによって引き起こされます。以下の手順で現在のシステム設定と状態を確認できます。不一致が見つかった場合、上の電源管理節でこれらの値を変更する方法を参照してください。

メモ
これはあるユーザーが発見した一例です。以下の例は GPU が CARD0 であると仮定しており、また出力は Radeon™ RX 6650 XT EAGLE 8G に固有のものです。
メモ
これは Dynamic Power Management (DPM) が有効なハードウェアにのみ当てはまります。DPM は、現代の AMDGPU のほとんどでデフォルトで有効になっています。

TechPowerUp GPU Database のようなデータベースやメーカーの仕様書を使ってグラフィックカードの仕様を検索することから始めましょう。

Radeon™ RX 6650 XT EAGLE 8G
Base Clock Game Clock Boost Clock Effective Memeory Clock Effective VRAM Bus Bandwidth
Specification 2055 MHz 2410 MHz 2635 MHz 2190 MHz (17.5 Gbps) 128-bit 280.3 GBps

この例では:

  • Base Clock はデフォルトのクロック周波数です。
  • Game Clock は特定のゲームアプリケーションを実行する際に期待されるクロック周波数です。
  • Boost Clock は(まれな)バーストワークロードを実行する際の最大クロック周波数です。
  • Memory Clock はメモリの実効クロック周波数です; DRAM のベース周波数にチャンネル数を掛けた値です。
  • VRAM Bus はデータバスの実効ビット幅です。
  • Bandwidth はデータ転送速度です。(data_rate * bus_width / 8)


デバイスの AMDGPU sysfs ディレクトリへ移動してください。

user $cd /sys/class/drm/card0/device/

pp_dpm_sclkpp_dpm_mclk ファイルに列挙されている定義済みのコアとメモリのクロック周波数を確認してください。システムは、これらの値を、様々な負荷の下でクロック周波数を自動的に調節するために使用します。

user $cat pp_dpm_sclk
0: 500Mhz 
1: 700Mhz *
2: 2765Mhz 
user $cat pp_dpm_mclk
0: 96Mhz *
1: 541Mhz 
2: 675Mhz 
3: 1094Mhz 

エンジンクロック SCLK がハードウェアの制限の中に収まっていることを確認します。この場合、最小の周波数は 500MHz で、負荷時には 700MHz まで増加し、さらに最大で 2765MHz になります。

DRAM メモリクロック OD_MCLK がハードウェアの制限内に収まっていることを確認します。この場合、報告された最小周波数は 96MHz、最大は 1094MHz です。

このデバイスはデュアルチャンネルの Double Data Rate (DDR) メモリである GDDR6 (G6) を使用しています[19][20][21]

  • 最大データ転送速度(トランスファー毎秒) = クロックサイクル(毎秒) * クロックサイクルあたりのトランスファー * データ周波数乗数; 1,094 MHz * 2 T (double data rate) * 8 = 17,504 MT/s。これは 17.5 Gbps に相当します。
  • バス幅はチップごと、チャンネルごとです。この場合、カードに4つの物理 IC があり[22]、それぞれがチャンネルごとに 16bit のI/O幅を持ちます; 16ビット * 2 チャンネル * 4 IC = 128ビットが VRAM の実効バス幅です。
  • 帯域幅 = トランスファー毎秒 * バス幅; 17,504 MT/s * 128 bits/T = 2,240,512 Mb/s (280,064 MB/s)。


それでは、pp_od_clk_voltage ファイル内のオーバードライブ(ブースト)クロックと電圧の設定を見てみましょう。

user $cat pp_od_clk_voltage
OD_SCLK:
 0: 700Mhz
 1: 2744Mhz
OD_MCLK:
 0: 97Mhz
 1: 1094MHz
OD_VDDGFX_OFFSET:
 0mV
OD_RANGE:
 SCLK:     500Mhz       3150Mhz
 MCLK:     674Mhz       1200Mhz

オーバードライブ(ブースト)エンジン SCLK の範囲は、エンジンクロックが 500 から 3150MHz の間の値になるように設定されます。ここでは、700 MHz と 2744 MHz の間で階段状に変化します。

オーバードライブ(ブースト)メモリ MCLK の範囲は、実際のメモリクロックが 674 MHz から 1200 MHz (実効では 1348 MHz から 2400 MHz) の間の値になるように設定されます。ここでは、97 MHz と 1094 MHz の間で階段状に変化します。

メモ
OD_SCLK、OD_MCLK、そして OD_RANGE の間にある関係性については十分に文書化されていません。上に挙げたこれらの値は、問題になっているシステムで見られたとおりのものです。

これらの情報をすべて併せ、報告あるいは指定された値と比較すると、クロック周波数に不一致があり、その一部は推奨値を大きく上回っていることが分かります。これらの制限を(デフォルト値をアンダークロックして)調整すると、クラッシュしなくなり、発熱と FPS のパフォーマンスも改善する結果となりました。

Radeon™ RX 6650 XT EAGLE 8G
Base Clock Game Clock Boost Clock Effective Memeory Clock Effective VRAM Bus Bandwidth
Specification 2055 MHz 2410 MHz 2635 MHz 2190 MHz (17.5 Gbps) 128-bit 280.3 GBps
sysfs - MHz 2765 MHz 2744/3150 MHz 2400 MHz (19.2 Gbps) 128-bit 307.2 GBps (@1200 MHz)

関連項目

  • AMDGPU-PRO — the next generation closed source graphics component that operates on top of the open source AMDGPU drivers for newer AMD/ATI Radeon graphics cards.
  • AMDVLK — an open-source Vulkan driver for AMD Radeon™ graphics adapters on Linux

外部資料

参照

  1. AMD はかつてマイクロアーキテクチャを Display Core (DC) と読んでいました。GCN は Graphics Core Next の略で、Radeon HD7000 シリーズ (GCN1.0) とともに導入されました。これは Radeon DNA 略して RDNA によって取って代わられ、これは Radeon RX 5000 シリーズ (NAVI) とともに 2019 年に導入されました。
  2. 実際の命令セットアーキテクチャ (ISA) は Display Core Engine (DCE) によって定義されていましたが、これは Raven Ridge APU (モバイル Vega graphics core) とともに導入された Display Core Next (DCN) によって取って代わられました。
  3. Phoronix - Report: Ryzen "Raven Ridge" APU Not Using HBM2 Memory
  4. Phoronix - 25 More AMDGPU DC Patches, Mostly Focused On Raven DCN
  5. 5.0 5.1 Phoronix - AMD Navi 10 Firmware Finally Lands In The Linux-Firmware Tree
  6. https://www.phoronix.com/scan.php?page=news_item&px=Radeon-RX-6900-XT
  7. https://cateee.net/lkddb/web-lkddb/DRM_AMD_DC_DCN3_0.html
  8. Linux kernel commit 39bdb32 with added firmware files to POLARIS10 and POLARIS11
  9. https://kernelnewbies.org/Linux_3.11#AMD_Radeon_experimental_dynamic_power_management_support
  10. https://www.phoronix.com/news/AMDGPU-PP-4.5-Steps
  11. https://www.kernel.org/doc/html/latest/gpu/amdgpu/thermal.html
  12. https://www.kernel.org/doc/html/latest/gpu/amdgpu/module-parameters.html
  13. https://www.phoronix.com/news/AMDGPU-PP-4.5-Steps
  14. https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/gpu/drm/amd/include/amd_shared.h
  15. https://www.kernel.org/doc/html/latest/gpu/amdgpu/module-parameters.html?highlight=ppfeaturemask
  16. https://github.com/torvalds/linux/blob/be8454afc50f43016ca8b6130d9673bdd0bd56ec/drivers/gpu/vga/vga_switcheroo.c#L653-L660
  17. https://help.ubuntu.com/community/HybridGraphics
  18. https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu/-/issues/11
  19. https://www.micron.com/-/media/client/global/documents/products/technical-note/dram/tned03_gddr6.pdf
  20. http://monitorinsider.com/GDDR5X.html
  21. http://monitorinsider.com/GDDR6.html
  22. https://csstalker.gjisland.net/blog/archives/6848