Linux HDMI で WQHD まとめ

最近 27 インチの WQHD (2560×1440) ディスプレイが安く出回るようになりました。我が家でも今年になって ASUS PB278QDELL U2713H をディスプレイアーム Ergotron 45-248-026 と共に使っています。

これらのディスプレイを Linux の PC から HDMI 接続して使おうとした際にいろいろあったので、ここで情報をまとめておこうと思います。


h2. 概要

WUXGA (1920×1200) を超える解像度のディスプレイを使う場合、 PC などの出力側のハードウェア・ソフトウェアが古いと対応していないことがあり、注意が必要といわれています。

特にややこしいのは HDMI で接続する場合です。 WUXGA を超える解像度には HDMI 1.3 以降で対応できるようになりましたが、 HDMI 1.3 以降に対応したハードウェアであれば必ず WQHD 表示できるというわけではなく、様々な要因でうまくいかない場合があり DisplayPort や Dual-Link DVI で接続する場合に比べてトラブルになることが多いようです。

ということで、手持ちの AMD / NVIDIA / Intel のデバイスで検証してみました。

AMD

テストに用いた RADEON HD 6450 は HDMI 1.4a に対応していますので HDMI でも WQHD 出力に対応していると期待できます。実際に Windows では特に問題なく HDMI で両ディスプレイを認識し 2560×1440 で使うことができました。

しかしながら Ubuntu 13.04 においては、自動的にインストールされる オープンソース版 radeon ドライバ (7.1.0) では 1920×1080 までしか使えませんでした。

代わりに restricted で入手可能な プロプラエタリ fglrx ドライバ (9.012 = Catalyst 13.1) をインストールしたところ 最初から 2560×1440 で使えるようになりました。

2013/11/17 追記: Ubuntu 13.10 の fglrx 13.101 (Catalyst 13.6 beta2) では HDMI で 2560×1440 出力できませんでした。 Ubuntu 13.10 Desktop アップグレード 参照。

NVIDIA

NVIDIAGPU はだいぶ昔から HDMI 1.3 に対応しています。この GeForce GTX670 も Windows のドライバでは特に問題なく HDMIWQHD 表示できました。

しかしながら Ubuntu 13.04 においては、自動的にインストールされる オープンソース版 nouveau ドライバ (1.0.7) はもちろん、 restricted で入手可能な プロプラエタリ nvidia ドライバ (313.30) においても 1920×1080 までしか使うことができませんでした。

/var/log/Xorg.0.log を調べると、どうやら HDMI 出力にドットクロック 165MHz のリミットがかかっているため、そのままでは WUXGA を超える解像度の出力ができないことがわかります。

[     4.254] (--) NVIDIA(0): CRT-0: 400.0 MHz maximum pixel clock
[     4.254] (--) NVIDIA(0): DFP-0: 330.0 MHz maximum pixel clock
[     4.254] (--) NVIDIA(0): DFP-0: Internal Single Link TMDS
[     4.254] (--) NVIDIA(0): DELL U2713H (DFP-1): 165.0 MHz maximum pixel clock
[     4.254] (--) NVIDIA(0): DELL U2713H (DFP-1): Internal Single Link TMDS
[     4.254] (--) NVIDIA(0): DFP-2: 165.0 MHz maximum pixel clock
[     4.254] (--) NVIDIA(0): DFP-2: Internal Single Link TMDS
[     4.254] (--) NVIDIA(0): DFP-3: 330.0 MHz maximum pixel clock
[     4.254] (--) NVIDIA(0): DFP-3: Internal Single Link TMDS
[     4.254] (--) NVIDIA(0): DFP-4: 960.0 MHz maximum pixel clock
[     4.254] (--) NVIDIA(0): DFP-4: Internal DisplayPort

このリミットは /etc/X11/xorg.conf の Device Section で次の Option を追加すれば解除することができることになっています。

Section "Device"
  Identifier "NVIDIA"
  Driver "nvidia"
  Options "ModeValidation" "NoMaxPClkCheck"
EndSection

残念なことに nvidia ドライバではつい最近までこのリミットを解除できないというバグがありました (Fix your drivers nvidia. HDMI > 165 Mhz BROKEN! )。

このバグは 319.32 で修正されたのですが、現時点でここまで新しいバージョンのドライバパッケージを用意しているディストリビューションは少なく、 NVIDIA 配布のインストーラを使う必要があるかもしれません。たとえば Ubuntu では nvidia-319 パッケージ が使えるリリースは saucy (13.10) または precise-updates (12.04.3) のみと限られています。

Intel

Sandy Bridge 世代以降の Intel 内蔵 GPU (Intel HD Graphics) は HDMI 1.4a に対応しており、 HDMI で 1920×1200 を超える解像度や 3D 映像の出力が可能にということになっています。

ただし Ivy Bridge 世代まででは HDMI で 2560×1440 60Hz に必要なドットクロック (reduced blanking で 241.50MHz) を出力する能力がないらしく、一般には HDMI 接続で可能な解像度は 1920×1200 までというのが定説でした (Haswell 世代では状況が改善している可能性がありますが、未確認です)。

しかしながら、リフレッシュレートを標準の 60Hz よりも落としてドットクロックを下げれば、ディスプレイが対応できればという条件つきですが、実は 2560×1440 の解像度を出力することができます。ここではその方法を説明します。

Xorg に付属する cvt というコマンドを使うと、解像度とリフレッシュレートからディスプレイタイミングパラメータである modeline が得られます。たとえばリフレッシュレートを半分にした 2560×1440 30Hz の modeline は次のような cvt コマンドで得られます。

% cvt 2560 1440 30
# 2560x1440 29.94 Hz (CVT) hsync: 43.95 kHz; pclk: 146.25 MHz
Modeline "2560x1440_30.00"  146.25  2560 2680 2944 3328  1440 1443 1448 1468 -hsync +vsync

このようにドットクロックが 146.25MHz まで下がりますので、うまく出力できる可能性は高くなるわけです。

Xorg の RandR 拡張という機能を利用すると、この modeline を X サーバを再起動することなく有効にできます。最初に xrandr コマンドを実行して HDMI1 のような出力名を調べてください。その後 --newmode でモードを作成し --addmode で出力に追加します。

% xrandr --newmode 2560x1440@30 146.25 2560 2680 2944 3328  1440 1443 1448 1468 -hsync +vsync
% xrandr --addmode HDMI1 2560x1440@30

その上で GNOME システム設定の「ディスプレイ」などを見ると HDMI ディスプレイの解像度として 2560×1440 が選べるようになっているはずです。あるいは --output で直接解像度を設定することもできます。

% xrandr --output HDMI1 --mode 2560x1440@30

手元の ThinkPad Edge E130 と DELL U2713H で 30Hz から始めてより高いリフレッシュレートを試していったところ、 44Hz までは正しく表示できましたが 45Hz ではディスプレイに 1278×1440 45Hz と認識されてしまいうまくいきませんでした。

% xrandr --newmode 2560x1440@44 222.75 2560 2720 2992 3424 1440 1443 1448 1479 -hsync +vsync
% xrandr --addmode HDMI1 2560x1440@44
% xrandr --newmode 2560x1440@45 227.75 2560 2720 2992 3424 1440 1443 1448 1480 -hsync +vsync
% xrandr --addmode HDMI1 2560x1440@45

またディスプレイ側でも表示できるリフレッシュレートの範囲に違いがあるようです。 ASUS PB278Q では 30Hz だとサイケデリックな模様が出てうまくいきませんでした。 44Hz は正しく表示でき 45Hz では NO SIGNAL となってしまいました。

Windows ドライバでの検証をしてるページ によると reduced blanking タイミングを使えば 55Hz まで上げられるようです。このページにはこれを PowerStrip というソフトで吸いだした Linux 向け modeline も掲載されており、次のコマンドで DELL U2713H でも ASUS P278Q でも正しく 2560×1440 55Hz 表示できることを確認しました。

% xrandr --newmode 2560x1440@55 220.812 2560 2608 2640 2720 1440 1443 1448 1478 -hsync -vsync
% xrandr --addmode HDMI1 2560x1440@55

(なお reduced blanking タイミングは cvt コマンドでは -r オプションで計算できますがリフレッシュレートが 60 の倍数でないとなぜかエラーとなり計算してくれません)

xrandr コマンドで追加した modeline 設定は X のセッション終了時に消えてしまいます。設定を永続化したい場合、セッション起動スクリプトのどこかで xrandr コマンドを実行してもよいのですが、 /etc/X11/xorg.conf には RandR の modeline 定義をする方法がありますので、それを利用するのがスマートかと思います。

Section "Device"
  Identifier "Intel"
  Driver "intel"
  Option "Monitor-HDMI1" "Monitor HDMI1"
EndSection

Section "Monitor"
  Identifier "Monitor HDMI1"
  Modeline "2560x1440@55" 220.812 2560 2608 2640 2720 1440 1443 1448 1478 -hsync -vsync
EndSection

このように Device Section "Monitor-出力名" というオプションに Monitor Section の Identifier を書くと、そこで定義されている modeline がそのデバイスのその出力に追加できます。この方法で設定しておけば、 GNOME のディスプレイ設定で保存した設定も、次回のセッションログイン時にうまく復元してくれます。

2013/08/27 01:20:00 JST