ラベル ALC262 の投稿を表示しています。 すべての投稿を表示
ラベル ALC262 の投稿を表示しています。 すべての投稿を表示

2017-01-25

PCIデバイスのBARの値がNetBSD/i386とUbuntuとで異なる

dynabook SS SX/15AでNetBSD/i386を使うとサウンドデバイスが認識されない問題を調べています。OSに含まれているPCI管理ツールを使って、そもそもどのように認識されているのかを探ってみました。

まずNetBSDのpcictlを使ってみます。すると以下の情報が得られました。
000:27:0: Intel 82801GB/GR High Definition Audio Controller (mixed mode multimedia, revision 0x02)
オプションを指定して更に詳細な情報を取得してみます。気になる箇所だけを以下に抜粋します。
Base address register at 0x10
  type: 64-bit nonprefetchable memory
  base: 0x0000000000000000, not sized 
また比較するために、Ubuntulspciでも情報を取得してみると、次のようになりました。
00:1b.0 Audio device: Intel Corporation NM10/ICH7 Family High Definition Audio Controller (rev 02)
 Subsystem: Toshiba America Info Systems NM10/ICH7 Family High Definition Audio Controller
 Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
 Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
 Latency: 0, Cache Line Size: 32 bytes
 Interrupt: pin A routed to IRQ 27
 Region 0: Memory at d2080000 (64-bit, non-prefetchable) [size=16K]
 Capabilities: <access denied>
 Kernel driver in use: snd_hda_intel
 Kernel modules: snd_hda_intel
両者を比べてみると、BARに入っている領域の情報が、64bitである事は一致していますが、開始アドレスが異なっています。NetBSDでは0なのに対して、Ubuntuではd2080000になっています。

デバッグ情報を見るためにextent_alloc_region()extent_print(9)を入れてみたところ、次のような出力が得られました。この関数の引数には、開始アドレス0で、サイズ0x4000が与えられています。そしてコンフリクトが発生するためエラーが返っています。要求されたのは0x0 ~0x3fffですから、既存の0x0 - 0x9dfffと衝突してしまうのでしょう。
extent `iomem' (0x0 - 0xffffffff), flags = 0x3
     0x0 - 0x9dfff
     0x100000 - 0xcf75ffff
     0xcf760000 - 0xcf760fff
     0xe0000000 - 0xe001ffff
     0xe0020000 - 0xe0407fff
     0xf00d8000 - 0xf00d8fff
     0xf00e0000 - 0xf00e0fff
     0xf00e2000 - 0xf00e2fff
     0xfed00000 - 0xfed003ff
     0xffd40000 - 0xffd7ffff
     0xffd80000 - 0xffdfffff
しかしBARで入っている情報では、64bitフラグが建っているようですし、Ubuntuのように0xd2080000が指定されれば衝突が発生することもなくなると思います。なぜNetBSDでは開始アドレスが0x0なのでしょうか。

そもそも同じハードウェアなのに、どうしてPCI情報を読み取った結果が異なるのでしょうか?

2017-01-23

hdaudio(4)がエラーを出す場所を調べてみる

dynabook SS SX/15AにインストールしたNetBSD/i386 7.0.2のhdaudio(4)でRealtek ALC262が認識されない原因を調べてみようと思います。調べてみても解決できるとは限りませんが、少なくとも何が問題なのか見えてくるでしょう。

エラーメッセージ「couldn't map mmio space」を頼りにカーネルのソースコードを探してみると、hdaudio_pci.cの中にあるhdaudio_pci_attach()しかありません。この中でpci_mapreg_map()を呼び出してエラーが返っているのでしょう。

pci_mapreg_map()/usr/src/sys/dev/pci/pci_map.cで定義されています。問題個所を絞り込んでみるとbus_space_map()がエラーを返しています。これは/usr/src/sys/arch/x86/x86/bus_space.cにありますから、さらに問題個所を絞り込んでいきます。するとbus_space_reserve()が怪しいようです。さらに中に入り込んで調べていくと/usr/src/sys/kern/subr_extent.cにあるextent_alloc_region()に辿りつきました。

このextent_alloc_region()の中でif (rp->er_end >= start)という判定を行っていますが、これに引っ掛かってエラーを返すようです。この時にrp->er_end9dfffstart0なので、条件が成立してしまうようです。

とりあえずここまでは調べましたが、これは一体なにが問題なのでしょうか。
  1. NetBSDのhdaudio(4)がRealtek ALC262に対応していないか、対応が不完全なのか。
  2. Realtek ALC262を使っているdynabook SS SX/15Aに起因する何かの問題なのか。
問題個所を突き止めるのは比較的容易ですし、その時の変数の値を見る事も簡単です。しかし本来どうあるべきなのかを考えるのは、どういう知識が必要とされるのか、現時点ではサッパリ見当もつきません。

どうすれば解決に至ることができるのか、考えてみようと思います。

dynabook SS SX/15Aのサウンドデバイスが認識されない

dynabook SS SX/15AのサウンドデバイスがNetBSD/i386 7.0.2では認識されません。ドライバはhdaudio(4)が使われるようですが、エラーが出ています。
hdaudio0 at pci0 dev 27 function 0: HD Audio Controller
hdaudio0: couldn't map mmio space
ところがUbuntu 16.04ならば認識してくれます。
[   45.086615] snd_hda_intel 0000:00:1b.0: enabling device (0000 -> 0002)
[   45.211496] snd_hda_codec_realtek hdaudioC0D0: ALC262: SKU not ready 0x598301f0
[   45.211780] snd_hda_codec_realtek hdaudioC0D0: autoconfig for ALC262: line_outs=1 (0x14/0x0/0x0/0x0/0x0) type:speaker
[   45.211787] snd_hda_codec_realtek hdaudioC0D0:    speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)
[   45.211793] snd_hda_codec_realtek hdaudioC0D0:    hp_outs=1 (0x15/0x0/0x0/0x0/0x0)
[   45.211797] snd_hda_codec_realtek hdaudioC0D0:    mono: mono_out=0x0
[   45.211801] snd_hda_codec_realtek hdaudioC0D0:    inputs:
[   45.211807] snd_hda_codec_realtek hdaudioC0D0:      Internal Mic=0x19
[   45.211812] snd_hda_codec_realtek hdaudioC0D0:      Mic=0x18
どうやらハードウェアはRealtekのALC262が使われているみたいです。Webを検索しても情報がないのですが、NetBSD 4.0で認識できているらしい「dynabookSS RX1/T7EにNetBSD4.0を入れる 」という情報を見つけました。どうやらドライバはazalia(4)のようです。

もしドライバをhdaudio(4)からazalia(4)に変えれば認識できるのであれば万々歳です、GENERICカーネルではazalia(4)をコメントで潰してありました。カーネルを作り変えて実行してみたのですが、やはり認識されません。
azalia0 at pci0 dev 27 function 0: Generic High Definition Audio Controller
azalia0: can't map device i/o space
カーネルのソースを見てみると/usr/src/sys/dev/pci/azalia_codec.cには「Realtek ALC262」という文字列が入っているので、対応しているハードウェアなのでしょう。また/usr/src/sys/dev/hdaudio/hdaudiodevsの中にもALC262という文字列がありますから、対応しているようですし、認識してくれても良さそうなものだと思うのですが、エラーになってしまいます。