FreeBSD のグラフィックドライバの2020年1月頃の状況について記載します。 サポート対象の FreeBSD は 12.1, 12.0, 11.3 です。 この時点でのグラフィックドライバは過渡期にあり base にあるドライバ (legacy) から drm-kmod に移行しようとしています。 将来的(13.0以降)には base のドライバは削除され、drm-kmod に一本化されます。
Wikipediaにまとめられている通り、Intel Core アーキテクチャ世代から追加されたプロセッサ内蔵のグラフィックコントローラです。
これまで base にある i915kms.ko を読み込むことで利用できるようになっていました。 base にある i915kms.ko は現在 legacy と呼ばれ、Haswell 世代までのグラフィックコントローラをサポートしています。
このドライバのメンテナンスが年々難しくなり、Linux のドライバを直接利用する方向に舵を切ったことから、drm-kmod が誕生しました。こちらは GPL のソースコードのため FreeBSD の base には加えず Ports で提供されることになります。
drm-kmod は Ivy Bridge 世代以降のグラフィックコントローラで使用可能です。 Sandy Bridge または Westmere 世代のグラフィックコントローラを使用してる場合は base のドライバを使用してください。 将来的に base のドライバは削除されますが、drm-legacy-kmod としてパッケージが提供されています。
drm-kmod は現在 Kaby Lake までの動作報告があります。 また、手元で試した限りでは Coffee Lake (i7-8700) でも動作しました。
インストールは drm-kmod パッケージをインストールするだけです。
$ pkg install drm-kmod
ただし、2020年3月までは FreeBSD 12.1 に限り Ports からインストールする必要があります。 これは Errata にもあるように FreeBSD 12.1 で発生した ABI 非互換のためです。 FreeBSD 12.0 がサポートされている間は 12.0 用にコンパイルされたバイナリが pkg で配られるため、12.1 では動きません。 2020年3月に 12.0 のサポートが切れるため、その後のパッケージバイナリは 12.1 用に作成されますので、12.1 でも pkg バイナリが利用可能になります。
drm-kmod をインストールすると、FreeBSD のバージョンに応じて以下の3つのいずれかがインストールされます。
それぞれ 12.x 用、11.x用、FreeBSD-CURRENT用です。
drm-kmod はこれらのメタパッケージになります。 drm-kmod はビルド時にこれらのいずれかをインストールするように作成されますので、 pkg のリポジトリ毎に異なるバイナリが提供されています。 そのため、11.x用のリポジトリからダウンロードした drm-kmod パッケージを 12.x で使うようなことはできません。
インストールが終わったら、/etc/rc.conf に以下の行を加えて起動時にロードするようにします。
kld_list="/boot/modules/i915kms.ko"
ports/pkg で入れるため /boot/kernel ではなく /boot/modules にインストールされます。 現在のブートローダは /boot/modules にあるカーネルモジュールを優先的に読み込む機能がないため、 同名のモジュールが /boot/kernel にあると必ずこちらを読み込んでしまいます。 そのため、絶対パスで指定できる rc.conf で読み込むようにします。
次にグラフィック機能を使うユーザを "video" グループに入れます。
pw groupmod video -m <ユーザ名>
最後に X.org のグラフィックドライバを "modesetting" にして X を起動します。
drm-kmod は Radeon のグラフィックコントローラもサポートしています。 こちらを利用するには上記のインストールが終わった上で、rc.conf に以下を記載して 起動時にロードするようにします。
kld_list="/boot/modules/amdgpu.ko"
その他の設定は Intel グラフィックドライバと同じです。 ユーザを "video" グループに入れ、X.org の "modesetting" ドライバを使用します。
drm-kmod とは関係なく nvidia-driver を使います。 グラフィックコントローラの種類により以下のいずれかのドライバをインストールします。
こちらも /boot/modules にインストールされますが、同名のモジュールが /boot/kernel にないため、ブートローダで読み込ませることができます。
X.org で使用するドライバに合わせて以下のいずれかを読み込みます。
カーネルモジュール | X.org のドライバ |
---|---|
nvidia.ko | nvidia |
nvidia-modeset.ko | modesetting |
ブートローダで読み込ませるには /boot/loader.conf に以下を追加します。
nvidia_load="YES"
または
nvidia-modeset_load="YES"
その後、対応する X.org のドライバを設定し、X を起動します。
もし、上記のいずれのドライバも動作しない場合でも scfb ドライバを使用することができます。 scfb は FreeBSD の vt(4) によって管理されるフレームバッファを X から使用するためのドライバです。アクセラレーションはありませんが、FreeBSD が起動するマシンであれば必ず使用できます。
使うには xf86-video-scfb パッケージをインストールし、Xorg のドライバに scfb を設定します。
もし、コンソールが vt(4) でない場合には /boot/loader.conf に以下を設定し再起動してください。
kern.vty=vt
現在、どのコンソールドライバを使用しているかは "sysctl -n kern.vty" を実行し、 結果が "vt" であれば vt(4) を "sc" であれば sc(4) を使用しています。
最近の Xorg は起動時に自動設定されるため xorg.conf を記述する必要はありません。 しかし、自動設定でうまくドライバが認識されない場合や、意図的に指定したドライバで動かしたい場合にはドライバの指定を記述する必要があります。
このような用途の場合、xorg.conf を全て記述するのは面倒かつ、他の設定を間違える可能性があるため、自分が設定したい部分だけを設定します。
FreeBSD では /usr/local/etc/X11/xorg.conf.d に置かれたファイルを設定として読み込んでくれるため、ここにドライバの設定だけを書いたファイルを起きます。
例として driver.conf にドライバの設定を書いた場合を示します。
Section "Device" Identifier "Card0" Driver "scfb" EndSection
上記の例では scfb ドライバを使用するようにしています。 その他の設定については自動設定されます。