PCIeソリューションに向けた Arria V Avalon-MMインターフェイス: ユーザーガイド

ID 683773
日付 5/21/2017
Public
ドキュメント目次

5.8.3. CRAインターフェイスを使用するBAR0の読み出しおよび書き込み例

CRAインターフェイスを使用して、TLP要求を送信することができます。TLPヘッダーのFmtとTypフィールドは、TLPヘッダーの残りの部分のサイズを決定するために必要な情報、およびヘッダーの後にパケットにデータペイロードが含まれている場合に必要な情報を提供します。

図 26. TLPヘッダーの形式

CRAインターフェイスは、レジスターアドレス0x2000、0x2004、0x2008を使用してTLPを送信し、レジスターアドレス0x2010、0x2014、0x2018を使用してCompletionを確認します。このようなレジスターの詳細については、表Root Port TLP Data Registers, 0x2000 - 0x2FFFを参照してください。Type 0 configuration TLPを使用してBAR0から読み出し、それを書き込む方法の例を以下に示します。

  1. 以下の形式を持つType 0 configuration TLPを使用して初期化されていないBAR0を読み込むには、CRAインターフェイスを使用します。
         | fmt |   typ   |t|  tc |t|a|l|t|t|e|att| at|       length      |
         | 000b|  00100b |0|_ 0 _|0|0|0|0|0|0| 0 | 0 |_______ 001 _______|
         |________ req_id: 0000 _________|___ tag: 17 ___|lbe: 0 |fbe: f |
         |    bdf.bus  |bdf.dev|bdf.func|rsvd20|reg_no.ext|reg_no.low|rsv|
         |______ 01 ___|__ 00 _|___ 0 __|_ 0 __|___ 0 ____|___ 04 ___| 0 |
         04000001 0000170f 01000010

    CRAインターフェイスを使用してTLPを送信するには、次の手順を実行します。

    1. CRAインターフェイス・アドレス0x2000に0x0400_0001を書き込みます。
    2. CRAインターフェイス・アドレス0x2004に0x0000_170Fを書き込みます。
    3. CRAインターフェイス・アドレス0x2008 (パケットの開始)に0x0000_0001を書き込みます。
    4. CRAインターフェイス・アドレス0x2000に0x0400_0001を書き込みます。
    5. CRAインターフェイス・アドレス0x2004に0x0000_0000を書き込みます。
    6. Write to CRAインターフェイス・アドレス0x2008 (パケットの終わり)に0x0000_0002を書き込みます。

    CRAインターフェイスを使用して、対応するCompletionを確認します。コンプリーションTLPは4つのdwordを有します。最初の3つのdwordは以下のようになり、初期化されていないBAR0値である1つのdwordが続きます(次の図では0xFFEF0010となります)。

        | fmt |   typ   |t|  tc |t|a|l|t|t|e|att| at|       length      |
        | 010b|  01010b |0|_ 0 _|0|0|0|0|0|0| 0 | 0 |_______ 001 _______|
        |_____ cpl_id: 0100 ___|cpl_status: 0|bcm: 0|__ byte_cnt: 004 __|
        |_____ req_id: 0000 ___|___ tag: 17 ___|rsvd20: 0| low_addr: 00 |
        4a000001 01000004 00001700 ffef0010

    CRAインターフェイスを使用してTLPを読み込むには、次の手順を実行します。

    1. bit [0] = 0x1となる(Completionパケットが到着しており、次のステップでSOPが受け取ることが可能であることを示す)まで、CRAインターフェイス・アドレス0x2010の読み込みを継続します。
    2. CRAインターフェイス・アドレス0x2014を読み込みます。この読み込みデータの値は、0x4A00_0001です。
    3. CRAインターフェイス・アドレス0x2018を読み込みます。この読み込みデータの値は、0x0100_0004です。
    4. CRAインターフェイス・アドレス0x2010を読み込みます。この例では、bits [1:0] = 0x2 (次のステップでEOPを受け取ることを示します)となります。bits [1:0] = 0x0であれば、次の2つのステップで読み込まれる値はパケット内にあることを意味します。この場合、次の2つのステップを実行した後、0x2010、0x2014、および0x2018の読み込みを継続する必要があります。
    5. CRAインターフェイス・アドレス0x2014を読み込みます。この読み込みデータの値は、0x0000_1700です。
    6. CRAインターフェイス・アドレス0x2018を読み込みます。この読み込みデータの値は、BAR0の初期化されていない値です。
  2. 以下の形式を持つType 0 configuration TLPを使用して0xFFFF_FFFFのBAR0を初期化するには、CRAインターフェイスを使用します。
         | fmt |   typ   |t|  tc |t|a|l|t|t|e|att| at|       length      |
         | 010b|  00100b |0|_ 0 _|0|0|0|0|0|0| 0 | 0 |_______ 001 _______|
         |________ req_id: 0000 _________|___ tag: 11 ___|lbe: 0 |fbe: f |
         |    bdf.bus  |bdf.dev|bdf.func|rsvd20|reg_no.ext|reg_no.low|rsv|
         |______ 01 ___|__ 00 _|___ 0 __|_ 0 __|___ 0 ____|___ 04 ___| 0 |
         44000001 0000110f 01000010 ffffffff

    CRAインターフェイスを使用してTLPを送信するには、次の手順を実行します。

    1. CRAインターフェイス・アドレス0x2000に0x4400_0001を書き込みます。
    2. CRAインターフェイス・アドレス0x2004に0x0000_110Fを書き込みます。
    3. CRAインターフェイス・アドレス0x2008 (パケットの開始)に0x0000_0001を書き込みます。
    4. CRAインターフェイス・アドレス0x2000に0x0400_0001を書き込みます。
    5. CRAインターフェイス・アドレス0x2004に0xFFFF_FFFFを書き込みます。
    6. Write to CRAインターフェイス・アドレス0x2008 (パケットの終わり)に0x0000_0002を書き込みます。

    CRAインターフェイスを使用して、対応するCompletionを確認します。コンプリーションTLPは以下に示す3つのdwordを有します。

        | fmt |   typ   |t|  tc |t|a|l|t|t|e|att| at|       length      |
        | 000b|  01010b |0|_ 0 _|0|0|0|0|0|0| 0 | 0 |_______ 000 _______|
        |_____ cpl_id: 0100 ___|cpl_status: 0|bcm: 0|__ byte_cnt: 004 __|
        |_____ req_id: 0000 ___|___ tag: 11 ___|rsvd20: 0| low_addr: 00 |
        0a000000 01000004 00001100

    CRAインターフェイスを使用してTLPを読み込むには、次の手順を実行します。

    1. bit [0] = 0x1となる(Completionパケットが到着しており、次のステップでSOPが受け取ることが可能であることを示す)まで、CRAインターフェイス・アドレス0x2010の読み込みを継続します。
    2. CRAインターフェイス・アドレス0x2014を読み込みます。この読み込みデータの値は、0x0A00_0000です。
    3. CRAインターフェイス・アドレス0x2018を読み込みます。この読み込みデータの値は、0x0100_0004です。
    4. CRAインターフェイス・アドレス0x2010を読み込みます。この例では、bits [1:0] = 0x2 となります。
    5. CRAインターフェイス・アドレス0x2014を読み込みます。この読み込みデータの値は、0x0000_1100です。

0xFFFF_FFFFを書き込んだ後、BAR0を読み出すには手順1を繰り返し実行します。また、BAR0アドレススペースをコンフィグレーションするには手順2を繰り返します。

同じ方法で、BAR1、BAR2、BAR3、BAR4、およびBAR5をコンフィグレーションします。