DimensionC521で動かない理由を解明
特電PCI Express互換IPコアが、DELL Dimension C521で動かない原因がわかりました。
会社からC521を持ち帰って、土曜日の夜、あの手この手で徹底的にデバッグしました。
昔作った自作のPCI Expressバスアナライザを組み込んでみたところ、C521で非常に不可解な動きをしている部分が発見されました。
TLP ROOT=>EP Time=397.912780672 SEQ=4 Type="CfgWr0 3DW"
Req.ID=(0,1,0) Cpl.ID=(1,0,0)
CfgWr Addr=0 Tag=fd800001 data=0x00000000 mask(f)
TLP EP=>ROOT Time=397.912780848 SEQ=3 Type="Cpl 3DW"
Req.ID=(1,0,0) Cpl.ID=(0,1,0)
Cpl Addr=0 Tag=0x0
パソコンの起動時に、BIOSがコンフィグ空間の0番地に0xfd800001なんていう値を書き込んできています。普通の感覚ならありえません。しかも、その後いろいろコンフィグ空間を読み書きしてきていますが、BARを設定する気配が一向にありません。
正常に動作するパソコンで見てみると、ちゃんとBAR空間に設定してくれているので、何かが間違っているのは確実なのですが、これだけではどうもよくわかりません。
それなら、ちゃんと動くPCI Expressの製品ならC521でどういう動きをするかを確かめようと、市販の製品のパケットを自作アナライザで解析しようとしたところ、スクランブルがかかっていてあえなく挫折!
PCI Expressのスクランブルは暗号ではないのですが、解除するためのロジックを今から作るのは面倒なので、ひとまずあきらめることに。
八方ふさがりになったので、藁にもすがる思いで規格書を読んでみると、意外なことが書いてありました。
・Byte Count [11:0]
◆For all other types of Completions, the Byte Count fileld must be 4.
と
・Lower Address [6:0]
◆The field is set to all 0's for all types of Completion other than Memory Read Completions.
PCI Expressでは、メモリリードやコンフィグリードなどの要求に対して、Completionというパケットで応答しますが、そのパケットに埋め込まれる2つのフィールドの作り方についてのルールが記されているものです。
上の英文にあるその他のタイプのCompletionというのは、メモリリード以外のものを指すので、おそらくコンフィグリードも含まれるのでしょう。つまり、コンフィグリードでは、どこを読んでも何バイト読んでも、常にByteCount=4、LowerAddress=0で返せということです。
このルールを発見したとこには、これだ!と思いました。私がPCI Expressコアを作るのに参考にしてきたMIND SHARE INCの分厚い解説書には書かれていなかったので、このルールは実装していませんでした。やっぱり、規格書はちゃんと読まなければいけませんね。
日曜の夜、このルールを実装してみるとちゃんとDELLのC521でもばっちり認識されました。起動時の不可解なパケットもなくなりました。
他にも、規格書にはかかれているけど解説書にはかかれていない重要なルールがあるかもしれませんので、再び、規格書を読んでみることにします。
サポートページにアップロードしているコアは、近いうちにアップデートします。
どうぞご期待ください。
動作するPCでの起動時のパケット
C521の起動時のパケット(NG)
C521の起動時のパケット(OK)
| 固定リンク


コメント