PCI Express 起動後最初のパケット
PCI Expressのパケットには大きく分けて、TLP、DLP、PLPの3つの種類があります。
PLPは、Ordered-Setとも呼ばれる信号で、リンクの確立や速度あわせ、ビット・フレーム同期などに使われます。これは物理層ロジック同士の間で送受信するものです。
DLPは、リンク層(PCI Express第2層)がやりとりするためのパケットで、フロー制御、ACK/NACK、パワーマネージメントなどの目的に使われます。
TLPは、データを送受信するためのパケットで、メモリRead/Write、IO Read/Write、Configuration Read/Write、Messageなどが規定されています。
DLPの中のフロー制御はPCI Expressにおける重要なメカニズムで、これを無視するとTLPが一切やりとりできません。PCI Expressは互いのバッファの空き容量に関する情報を交換して、空きがあると判断した場合にしかTLPを送れないからです。
したがって、リセット後の初期化シーケンスにおいてPLPをやりとりしてリンクが確立できたら、まず最初にフロー制御の初期化を行います。
フロー制御の初期化パケットは、タイプ①とタイプ②の2種類あって、パソコン側からタイプ①で送られてきた情報と同じ情報をタイプ②のパケットにのせて送り返してやればいいようです。
ところが、このパケットをFPGAで作ろうとしたら、非常に難しいことがわかりました。
なぜかというと、DLPは次のような構造をしているのですが、このCRCの計算方法がわからないのです。
「(スタートシンボル 8bit) (情報部分32bit) (CRC 16bit) (エンドシンボル 8bit)」
32bitの情報部分にどのような演算を施して16bitのCRCを作るかがわからないのです。
私が参考にしている「PCI Express System Architecture」という本には、CRCの生成方法について一切記載されていません。
というわけで、とりあえず動きだけでも見てみたいということで、パソコンから送られてきたパケットを何も処理せずにそのまま送り返すことにしました。すると、見事にパソコン(の中のチップセット)は正規の初期化手順だと思ってくれました。
そしてフロー制御が初期化され、最初のTLPが送られて来ました。

これを解読してみましょう。
1FB 00 00 74 00 00 01 00 E0 00 50 00 00 00 00 00 00 00 00 00 00 00 00 EB 48 93 AB 1FD
最初と最後の「1FB」「1FD」は、それぞれK27.7、K29.7のシンボルで、これはTLPの開始と終了を示す制御ワードです。
TLPの構造は、
「STP シーケンス番号(2Byte) ヘッダ(12 or 24Byte) データ(0~4096Byte) ダイジェスト(4Byte) CRC(4Byte) SDP」
となっています。
したがって、記念すべき最初のパケットは、
シーケンス番号が 0000
ヘッダが74 00 00 01 00 E0 00 50 00 00 00 00 00 00 00 00
データが00 00 00 00
CRCがEB 48 93 AB
と解釈できます。
ヘッダの74 00 00 01は、データ長が1DW(=4Bytes)の、「Message Request With Data」というパケットを示しているようです。
最初のパケットはConfiguration Readだと思っていたのですが、Message関係でした。
Messageというのは、割り込みやエラー通知やパワーマネージメントなどの情報を乗せて送るためのパケットです。
「00 E0 00 50」がそのメッセージの詳細を示しています。調べたところ、最初の2バイトの00E0は、バス番号E0、デバイス番号0、ファンクション番号00のデバイスが送出したパケットということを示していて、最後の50はメッセージの種類を示していて、「Slot Power Message」というメッセージだそうです。
このパケットは、データリンク層がリンクアップすると自動的に送信されると書かれています。このパケットを受け取ったら内部のレジスタに保存しておけばいいようで、特に。
どうやって返事をすればよいのかわかりませんが、ACKを返せばよいのでしょうか。
うーむ、なかなかPCI Expressの通信の本体が出てきませんね。
早くConfiguration Read要求などをみてみたいのですが・・
どうやらこれより先に進めるには、16-bit CRCの生成方法を考えなければいけないようです。
ちなみに、このMessageパケットをパソコン側にそのまま送り返したところ、およそ180ns後にACKとフローコントロールを返してきました。PCI Expressでは、送信したパケットが相手側で受信され処理されて応答が帰ってくるまでには、そのくらいの遅延時間がかかるのかもしれmさえん。
| 固定リンク
« 謹賀新年 | トップページ | アナデバの高速DAC »


コメント