PCI ExpressのIPコアがBIOSで認識された
すごく久しぶりに、IPコアの開発を続けています。
前回はPCI Expressのパケットを、JTAG Logic Analyzerを使って12番目までのパケットを解析しました。
その結果、BIOSが初期化する際に、PCIのコンフィグ空間にある拡張機能ポインタを辿っていって、PCI Express Cababilities Regsterを読み書きする手順が見えていました。
ですが、12番目以降のパケットは、なぜだか違うバス番号で送られてくるので、そこで作業は中断となっていました。
今回は、その12番目以降のパケットを解析してみます。
なぜバス番号が11番目までと12番目以降で違うのか。おそらく、BIOSはPCI初期化の一番最初の手順で、スロットに何もささっていないPCIバスも含めて数えてしまっているのでしょう。そして、何かがあるスロットだけを活かして、何もないスロットの番号をスキップして番号を再割り当てしたのではないかと思われます。
さて、12番目以降のパケットは、同様にPCI コンフィグ空間の0番や、4番、8番、34番などを読み出してきています。
特筆すべきは、33番目からのパケットです。
33 ConfigWr 0x010:F 書き込みデータはFFFFFFFF
34 ConfigRd 0x010:F 返答は00000000
35 ConfigWr 0x010:F 書き込みデータは00000000
36 ConfigWr 0x014:F 書き込みデータはFFFFFFFF
37 ConfigRd 0x014:F 返答は00000000
38 ConfigWr 0x014:F 書き込みデータは00000000
・・・
こんな感じで、BAR0~BAR5、そしてExpansion ROM領域の設定を行ってきています。
まるで解説書にあるようにBARxの設定を変更してきています。
57番目からのパケットは少々謎です。
57 ConfigWr 0x000:F 書き込みデータはFDA00001
58 ConfigRd 0x004:1 返答はxxxxxx00
コンフィグレジスタの0番(ベンダIDとデバイスID)に、変な値を書き込んできています。
書き込めるわけないのですが、何をしているのでしょう。
ちゃんとエラーを返すかどうか試しているのでしょうか。
前回の実験時はBIOSの起動中でフリーズしてしまっていたのですが、今回はコマンドレジスタやステータスレジスタやその他の必須のレジスタをちゃんと実装し、フローコントロールも無限大に設定したところ、ちゃんとBIOSまでは起動して、認識されるようになりました。
ベンダID等は適当な値を設定しています。(1234の5678)

ですが、WindowsXPが起動する段階で固まってしまいます。
どうやら100番目あたりからMultiFunctionの検出などを行ってきているようで、FunctionNumberを0から順番に増やしてVIDやHdrTypeを読み出してきています。
特電PCI Express IPコアは、MultiFunctionではないデバイスではないので、きっとエラー(UA)で応答しなければいけないのでしょう。今のIPコアでは、この処理をちゃんと行っていないのが、Windowsが起動時にフリーズする原因と思われます。
| 固定リンク


コメント