今夜のデバッグでは、PCI Express関連でいろいろ進展がありました。
① Vostro220sで特電PCI Expressボードが起動できない問題がある件
特電PCI Expressボードは、TIのXIO1100というPHYチップを使っています。特電PCIeのリファレンスデザインでは、PHYチップのPLLが安定したことを示すフラグが来るまで、FPGA内のDLLをリセットしています。
そして、このチップへ供給するTX_CLKはFPGA起動時にLレベルに固定しています。DLLのリセットが解除されてはじめて、TX_CLKが供給されるしくみになっています。
つまり、
「XIO1100電源ON→XIO1100リセット→パソコンからREFCLKが供給される→XIO1100のPHY_STATUS下がる→FPGAのDLLリセット解除→XIO1100へTX_CLK出力」
という流れなのです。
しかし、このチップのTX_CLKはLレベルだと上記のPHY_STATUSのフラグが出ないことがあるようです。(しかも、XIO1100のロットによるようだ)
TX_CLKがLのままだと、Vostro220sでは、特電PCI Expressボードの2号機では、90%の確率でPHYチップのPLL安定フラグが出ません。(やはりXIO1100のロットによるみたいで、大丈夫なXIO1100なら大丈夫)
こういう理由でデッドロックしてしまっていました。PHYチップのTX_CLKの初期値をHレベルにしたら、あっさり解決しました。
これは、MITOUJTAGのバウンダリスキャンでいろんなピンをポチポチしてみて、TX_CLKをHにしたら、RX_DATAがぶわーっと送られてきたのが見えたので気が付きました。バウンダリスキャンを使わなければ発見できなかったでしょう。
② PCI Expresss拡張コンフィギュレーション空間にアクセスする方法
WindowsXP以前では、OSレベルではPCI Expresss拡張コンフィギュレーション空間へのサポートをサポートしていないため、とても面倒です。
いくつかの文献(PCI Express入門講座:電波新聞社、PCI Express System Architecture:Mindshare Inc)を見ても、『PCI Express拡張コンフィギュレーション空間にアクセスするには、メモリ空間にマップして読み出す。そのアドレスは[ベースアドレス(36bit)][バス番号(8bit)][デバイス番号(4bit)][ファンクション番号(4bit)][レジスタ番号(12bit)]である』というくらいの情報しか書いてありません。
どうやら、OSが起動した時には、すでにこのテーブルの場所は決まっているようです。しかし、Microsoftのドキュメント(「PCI, PCI-X, and PCI Express: Frequently Asked Questions」)によればそのマッピングの先頭アドレスやサイズはシステムによって異なると書かれていて、結局のところわかりません。
調べたところ、ACPIのMCFGテーブルに書かれているというとろこまでわかりました。ACPIというのは、電源管理とかをやっているアレのことで、BIOSと同じくらいのレベルでのプログラムだかなんだかそういうものだそうです。ACPIにアクセスするには、ACPI言語(AML)を使うとか、わけがわからないことばかりで、結局ACPIのテーブルを見る方法は、すぐにはわかりませんでした。
といっても、基本的にはCPUからみた32bitアドレス空間のどこか256MByteにマッピングされているのでしょう。
256MByteということは、4G÷256M=16だから、0x00000000、0x10000000、0x20000000、0x30000000・・、0xe0000000、0xf0000000のどこかにいるのでしょう。
順番に調べていったら、私のPCでは、0xf0000000にいました。
MmMapIoSpaceを使って0xf0000000を仮想空間にマップして、READ_REGISTER_BUFFER_ULONGで読むと、0x29B08086という値が返ってきました。これは、バス0、デバイス0、ファンクション0、つまりルートコンプレックスのデバイスIDとベンダIDです。やった!
バス番号を1番にして、コンフィグ空間の0x58c番地を読み出してみます。すると、
おおっ!拡張コンフィギュレーション空間への読み出しトランザクションが発生するではないですか!!
② PCI Expresss拡張コンフィギュレーション空間(Vistaと7の場合)
WindowsVista以降(Windows7も)では、OSがPCI Expresss拡張コンフィギュレーション空間をサポートしているので、IRP_MN_READ_CONFIGやIRP_MN_WRITE_CONFIGを使えば簡単に読み出せます。
実際にやってみたところ、Windows7ならば、サンプルアプリケーションでcrd long 100とやれば普通に読めました。
残る問題
① 最初にVostro220sでの動作不良をご連絡していただいたお客様の状況では、一度リンクアップした後にリンクが切れるとのこと。残念ながら当社のVostro220sでは、その状況はまだ再現できていません。そのお客様では特電ボードの隣のスロットにx16のビデオボードを挿しているから何か干渉してしまっているのでしょうか。
② 別のお客様によればx16のスロットに挿したら動かなかったのでx4のスロットに挿したとのこと。
確かに、Vostro220sのx16のスロットに特電PCIeボード(x1)を差し込んだ場合、動作しません。なぜだろう・・。
PCIeのx16スロットは下位互換性があるはずですが・・・
まだまだIPコアの物理層ロジックに改良の余地があるということでしょうか。
③ ACPIのテーブルってどうやって読めばいいのでしょう
最近のコメント