2012年3月26日月曜日

AMDチップセットのWatchdogタイマー

日経Linux 2012年5月号の連載記事でWatchdogタイマーを取り上げました。その記事を書くにあたっていろいろ調べた際に気になったのが、AMDチップセット向けのWatchdogタイマードライバ「sp5100_tco」のこと。このドライバはカーネル2.6.38でマージされたのですが、以下の理由から、少なくともカーネル3.3までのものは使用できないことが多いんじゃないかなと思います。

使用できない最初の理由がI/Oメモリーのバッティングです。SP5100/SB700/SB800/SB900では、Watchdogタイマー用のI/Oメモリーとして「0xfec000f0-0xfec000f7」を使用するのですが、これはIOAPIC用に確保する「0xfec00000-0xfec003ff」の範囲内にあるため、ドライバ読み込み時に次のようなエラーが出て正常稼働しません。

SP5100 TCO timer: mmio address 0xfec000f0 already in use

この問題を解消するには、IOAPIC用に確保するI/Oメモリー範囲を小さくしてやる必要があります。具体的には、カーネルソースのarch/x86/include/asm/apicdef.hファイル中にある「IO_APIC_SLOT_SIZE」という定数を1024から128に減らしてカーネルを再構築します。そんなことして大丈夫かと思いますが、とりあえず問題ないみたいです(lkmlの関連スレッド)。

使用できないもう一つの理由がSB800以降に未対応なことです。SB800以降ではレジスタ構成が変化していますが、sp5100_tcoドライバでは現在のところこれが考慮されていません。つまりSP5100/SB700専用なわけです。にもかかわらず、SB800/900環境でもこいつが読み込まれてしまいます。SB800のリファレンスを見ながら改造版の「sp5100_tco.h」「sp5100_tco.c」をでっち上げたところ、一応、SB950環境で動作するようになりました(他は未確認)。しかしこちらはSB800/900専用でSP5100/SB700では動作しませんのでご注意を。どなたかちゃんとした統合ドライバを作って、mainlineカーネルにマージしてほしいものです。

(2012/11/10 追記)
Takahisa Tanakaさんがパッチを作成してmainlineへのマージ活動をされているようです(カーネルのbugzilla)。8月以降作業が中断しているっぽいですが大筋では良い感じで進んでいるようで、あとひと押しでマージされそうな印象を受けました。私の改造ドライバよりもそちらで開発されているパッチの方が(当然ながら)まともですので、そちらを使われることをお勧めします。パッチはbugzillaのページから入手できます。