BIOSがPCI Expressを初期化する手順が見えてきた
ようやく、PCI Expressの初期化の手順が見えてきました。
というわけで、開発中のPCI Express IPコアに、コンフィギュレーションレジスタを徐々に実装しはじめています。
下の図は、初期化時におけるFPGA内の各種信号を、JTAGロジックアナライザでキャプチャしたものです。
まず、電源を入れると、アドインカードとマザーボード上のチップセットで通信をし、PCI Expressの物理層、データリンク層を初期化します。
最初に送られてくるパケットはロック解除のパケットで、その次は0番のコンフィギュレーションレジスタの読み出しです。
0番を読むのは、VID PIDを確認して、PCI Expressスロットにカードがささっているかどうかを確かめるためでしょう。
このように、送られてきたパケットをJTAGロジアナで解析して、時系列に並べると
-----------------
1 Message
2 ConfigRd 0x0000 (BE=1111) ベンダIDの読み出し
3 ConfigRd 0x0000 (BE=1111) ベンダIDの読み出し
4 ConfigRd 0x0008 (BE=1100) クラスコードの読み出し
5 ConfigRd 0x0008 (BE=1100) クラスコードの読み出し
6 ConfigRd 0x0034 (BE=0001) Capability Register Pointerの読み出し
IPコアは上記の読み出し要求に0x60を返す。
7 ConfigRd 0x0060 (BE=0011) MSI Cap.
8 ConfigRd 0x0070 (BE=0011) Power Management Cap.
9 ConfigRd 0x0080 (BE=0011) PCI Express Cap.を読み出し
10 ConfigRd 0x0090 (BE=1000) Link Statusレジスタを読み出し
11 ConfigRd 0x0090 (BE=0001) Link Controレジスタを読み出し
12 ConfigRd 0x0090 (BE=0001) Link Controレジスタへ書き込み
13 ConfigRd 0x0000 (BE=0011) ??
・・続く・・
-----------------
こんな感じでした。
この手順を簡単に説明します。
まず最初に、マザーボード上のBIOSは、アドインカードのベンダIDを2回読み出します。
その次は、アドレス8番にある、クラスコード等を読み出しに来ます。
クラスコードというのは、アドインカードの種類を知らせる番号です。
もしPCI ExpressのスロットにささっているのがVGA互換のビデオカードならば、マザーボードに内蔵のビデオチップを無効にしてPCI Expressのビデオ出力を使うようにするため、BIOSの中でそういう処理をしているのでしょう。
次に、0x34番にある「Capability Register Pointer」というレジスタを読み出しています。
このポインタは、PCIで後から拡張された機能に関するコンフィギュレーションレジスタの位置を指し示すポインタです。
これはPCIではオプションだったようで、PCIではこのレジスタが存在するかどうかはステータスレジスタを読まなければならなかったのですが、PCI Expressでは必ず実装することになっています。したがって、BIOSはステータスレジスタを調べもせず、いきなり「Capability Register Pointer」を読みに来ます。
このレジスタには、まず、PCI Expressの割り込みの仕組みである「MSI」のためのコンフィギュレーションレジスタのポインタを指し示しておきます。今回開発しているIPコアでは、0x60番に配置しておきました。
すると、BIOSは今度は0x60番のコンフィギュレーションレジスタを読みに来ます。
0x60番には「Power Management Capability Structure」へのポインタを書いておきます。
「Power Management・・」は、今回開発しているIPコアでは、0x70番に配置しておきました。
で、0x70番には次の「PCI Express Capability Structure」へのポインタを書いておきます。
「PCI Express Capability Structure」には、アドインカードのリンク速度やらレーン数などの情報が格納されたレジスタなどが詰まっています。
BIOSは、このレジスタ群をみつけるまで、芋づる式にポインタをたどっていくようです。
そして、「PCI Express Capability Structure」を見つけると、BIOSの中のプログラムは、その中にあるリンク・ステータスレジスタを読んで、リンク・コントロールレジスタの中のCommon Clockとかビット(マザーボードとアドインカードのREFCLKが同じクロックで動いていることを示すビット)をセットします。
その後、BIOSはPCI Expressへのアクセスを停止し、しばらくしてからまた最初のようにベンダIDを読みに来ます。
ただし、アドインカードに割り当てられたPCI ExpressのBus番号が、1回目とは異なっているので、Enumerationに何か秘密があるのでしょう。
続きはまた後ほど解析して、紹介します。
今回の初期化時の波形をもっと詳しくごらんになりたい方は、「pciecap.jla」をダウンロードしてください。波形のデータファイルがダウンロードできます。
この波形は、無償の波形ビューワ「http://www.nahitech.com/support.html」か、またはMITOUJTAGの新機能Advanced JTAG Logic Analyzerで見ることができます。
| 固定リンク
コメント
PCI Expressのコンフィグレーション空間について調査をしていました。PCI Express 仕様書を読んでいたのですが、実際のレジスタダンプ情報と仕様書に書いてある内容がリンクせず、神頼みでWEBを検索していたところで出会いました。PCI Express Capability Structureの部分の説明がとてもわかりやすく、思わず「これだ!!」と叫んでしまいました。現在PCI Expressについて研究中で、このようにデバイス・ドライバ等について詳細まで記述されているサイトに初めて出会いました。本ブログにて今後勉強させていただきます。「WDMデバイスドライバを作る」はとても期待しています。それではヽ(´▽`)/
投稿: ash | 2009.03.10 22:52
ash様 こんにちは
コメントありがとうございます。
PCI Express Capability StructureはFPGAの中の結構なリソースを使いますが、ちゃんと作らないとパソコンが起動しませんでした。PCI Expressにはこういう余計な機能がいっぱいあって大変です・・・
WDMドライバも、本当はメモリやI/Oに読み書きしたいだけなのに、ドライバのロードとかそういう部分の処理のほうがはるかに大きくなってしまいますね。
投稿: なひたふ | 2009.03.13 17:36
これを5MB以下に収めるって技術者すごいんだな
投稿: | 2021.09.18 00:40