PCI ExpressのPIOリードの謎
PCI ExpressのPIOリードで不思議なことが起こっています。
まず、最初の波形をご覧ください。これはWindowsXPで、物理メモリ拡張したマシンでの実際の波形なのですが、
PC→FPGA方向に、00000001 00001E0F FEBE0000というパケットが流れています。
これは、メモリリードで、32bitアドレスのFEBE0000番地を読み出せ、というコマンドです。
FPGAは、4A000001 02000004 00001E00 F3BC756Bという応答をしています。
これは、このパケット(タグ1E)に対する応答はF3BC756Bだよと返しています。
さて、これだけ見るとふつうの1DWのリードコマンドとそのコンプリーションなのですが、PIOリードのサイズを大きくしていくと、不思議なことが起こりました。
次の図は、PIOリードのサイズを大きくした場合です。
なんと、2ワードのリード要求が発行されているのです。
PC→FPGA方向に、00000002 00001CFF FEBE99E8というパケットが流れています。
これは、メモリリードで、32bitアドレスのFEBE99E8番地から2DWを読み出せ、というコマンドです。
FPGAは、4A000002 02000008 00001C68 34DC61D2 AA0C28・・という応答をしています。
これは、このパケット(タグ1E)に対する応答は34DC61D2 AA0C28・・だよと返しています。
普段32bitのPIOリードしか発行しないはずなのに、なぜか64bitサイズで読み出しリクエストしています。不思議ですね~
1DWになったり2DWになったりする現象は、Windows 7 64bit版でも起きています。

PC→FPGA方向に、00000002 000008FF FEBEAF90というパケットが流れています。
これは、メモリリードで、32bitアドレスのFEBEAF90番地から2DWを読み出せ、というコマンドです。
FPGAは、4A000002 02000008 00000810 326DFE5C 3AB955EEという応答をしています。これは、このパケット(タグ1E)に対する応答は326DFE5C 3AB955EEだよと返しています。
どうやらわかってきたことは、アドレスのBAR+0番地から始まる流れでは1DWの読み出しが行われて、中途半端なアドレスから流れでは2DWで行われるようです。
そして、さらに波形を3回とって調べていったところ、
1回目
RD FBEB0000 4byte
RD FBEB0040 8byte
RD FBEB0004 4byte
RD FBEB0048 8byte
RD FBEB0008 4byte
・・・
2回目
RD FBEB04D0 8byte
RD FBEB0508 8byte
RD FBEB0548 8byte
RD FBEB04B0 8byte
RD FBEB04D8 8byte
・・・
3回目
RD FBEB0000 4byte
RD FBEB000C 4byte
RD FBEB0018 4byte
RD FBEB001C 4byte
RD FBEB0008 4byte
・・・
こういう感じでした。
PIOリードの場合はアドレス0から順に読んでいくのではなくて、2つ以上の流れがあってそれぞれ勝手に読んでいるのです。
1回目の読み出しシーケンスを見てみると、
- FBEB0000→FBEB0004→FBEB0008
- FBEB0040→FBEB0048
という2つの流れが確認できます。
2回目の読み出しシーケンスを見てみると、
- FBEB04D0→FBEB04D8
- FBEB0508
- FBEB0548
- FBEB04B0
という4つの流れが確認できます。
3回目の読み出しシーケンスを見てみると、
- FBEB0000→FBEB0008
- FBEB000C
- FBEB0018→FBEB001C
という3つの流れが見えます。
この流れがなんなのかはわかりませんが、読み出すアドレスがバラバラになっているような感じがします。
このような処理をチップセットで行っているのか、それともHALが行っているのかはわかりません。もしかすると、PIOリードは時間がかかるということで複数の読み出しが行われるように勝手に複数のスレッドに分割されているのかもしれません。
引き続き調査します。
| 固定リンク




コメント