はじめに
U-Boot から HPS-FPGA 間のブリッジを開放する場合には「bridge enable」コマンドを使用しますが、Stratix® 10 SoC と Arria® 10 SoC で F2S インターフェースを使用するためには「brdige enable」に加えて必要な設定が存在します。
参考: インテル® SoC FPGA 向け U-Boot の HPS-FPGA 間のブリッジ開放コマンドについて
この記事では、新しいバージョンの U-Boot を使用して FPGA-to-SDRAM (F2S) インターフェースを開通させるために必要な設定について説明します。
1. デバイスファミリー別の F2S インターフェース開通方法
全デバイスファミリー共通で必要な操作として、最初に「bridge enable」コマンドを実行します。このコマンドを実行することで、FPGA-HPS 間のブリッジ、インターフェースを使用するために必要なレジスター設定が行われます。
尚、コマンドの実行は、U-Boot プロンプト( OS ブート前のカウントダウン中に Enter キー入力することで移行するコマンド実行可能な状態)で実行する以外に、U-boot スクリプトに記述しておくことで実行させることも可能です。
以下、デバイスファミリー別に「bridge enable」コマンドの実行の他に必要となる操作、注意点について記載しますので、ご使用のデバイスファミリーの情報をご確認ください。
1-1. Stratix® 10 SoC
Stratix® 10 SoC では、「bridge enable」を行った後に、追加で SDRAM コントローラーへのアクセスを許可するためにセキュリティー・ファイアーウォール の設定が必要です。
以下のドキュメントに、実行すべきコマンドと U-boot スクリプトファイルの作り方が掲載されていますので、リンク先の情報をご確認ください。
参考: Creating the U-boot script
以下にレジスター設定例を掲載しておきます。
設定例:
F2S0 ~ F2S2 に全領域アクセス許可する場合は、以下の設定で可能です。各 F2Sx インターフェース毎に、アクセス可能なアドレス領域(Region)を最大 4 つのまで定義可能です。
# F2S0,F2S1,F2S2を有効化
mw 0xF8024050 0x00000092
# F2S0 の初期設定 (先頭から4GB領域を許可)
mw 0xF8020210 0x00000000 # region0addr_base Region0 の先頭番地(下位アドレス)
mw 0xF8020214 0x00000000 # region0addr_baseext Region0 の先頭番地(上位アドレス)
mw 0xF8020218 0xFFFFFFFF # region0addr_limit Region0 の終端番地(下位アドレス)
mw 0xF802021C 0x00000000 # region0addr_limitext Region0 の終端番地(下位アドレス)
mw 0xF8020204 0x00000001 # enable_set region0enable=1 で Region0 を有効化
# F2S1 の初期設定 (先頭から4GB領域を許可)
mw 0xF8020310 0x00000000 # region0addr_base Region0 の先頭番地(下位アドレス)
mw 0xF8020314 0x00000000 # region0addr_baseext Region0 の先頭番地(上位アドレス)
mw 0xF8020318 0xFFFFFFFF # region0addr_limit Region0 の終端番地(下位アドレス)
mw 0xF802031C 0x00000000 # region0addr_limitext Region0 の終端番地(下位アドレス)
mw 0xF8020304 0x00000001 # enable_set region0enable=1 で Region0 を有効化
# F2S2 の初期設定 (先頭から4GB領域を許可)
mw 0xF8020410 0x00000000 # region0addr_base Region0 の先頭番地(下位アドレス)
mw 0xF8020414 0x00000000 # region0addr_baseext Region0 の先頭番地(上位アドレス)
mw 0xF8020418 0xFFFFFFFF # region0addr_limit Region0 の終端番地(下位アドレス)
mw 0xF802041C 0x00000000 # region0addr_limitext Region0 の終端番地(下位アドレス)
mw 0xF8020404 0x00000001 # enable_set region0enable=1 で Region0 を有効化
設定対象レジスターの詳細は、レジスターマップを参照ください。
参考: SDRAML3Interconnect Address Block Group
1-2. Arria® 10 SoC
Arria® 10 SoC では、「bridge enable」の他に SDRAM コントローラーへのアクセスを許可するためのセキュリティー・ファイアーウォール 設定が必要という点は、Stratix® 10 SoC と同様です。
ただし、Arria® 10 SoC の場合は、予め U-Boot のデバイスツリー・ファイルにセキュリティー・ファイアーウォールの設定を与えておくことで、ブートローダー実行時に自動的にレジスター設定を行わせることが可能です。
また、標準で F2S 用のアドレス空間全域(4GB)へのアクセスが許可された内容でデバイスツリーが生成されるため、F2S インターフェースを開通させるという意味では変更不要です。アクセス可能な範囲を変更したい場合にお試しください。
デバイスツリーの記述内容:
以下、bsp-create-settings ツールで生成される U-Boot 用デバイスツリー(devicetree.dts)の内容です。firewall {} で囲まれた部分の内、fpga2sdram0-0, fpga2sdram1-0, fpga2sdram2-0 が該当の設定になります。
/*
* Driver: altera_arria10_soc_noc_arria10_uboot_driver
* Version: 1.0
* Binding: device
*/
i_noc: noc@0xffd10000 {
compatible = "altr,socfpga-a10-noc";
reg = <0xffd10000 0x00008000>;
reg-names = "mpu_m0";
firewall {
/*
* Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.I_NOC.mpu_m0.noc_fw_ddr_mpu_fpga2sdram_ddr_scr.mpuregion0addr.base
* Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.I_NOC.mpu_m0.noc_fw_ddr_mpu_fpga2sdram_ddr_scr.mpuregion0addr.limit
*/
mpu0 = <0x00000000 0x0000ffff>;
/*
* Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.I_NOC.mpu_m0.noc_fw_ddr_l3_ddr_scr.hpsregion0addr.base
* Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.I_NOC.mpu_m0.noc_fw_ddr_l3_ddr_scr.hpsregion0addr.limit
*/
l3-0 = <0x00000000 0x0000ffff>;
/*
* Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.I_NOC.mpu_m0.noc_fw_ddr_mpu_fpga2sdram_ddr_scr.fpga2sdram0region0addr.base
* Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.I_NOC.mpu_m0.noc_fw_ddr_mpu_fpga2sdram_ddr_scr.fpga2sdram0region0addr.limit
*/
fpga2sdram0-0 = <0x00000000 0x0000ffff>;
/*
* Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.I_NOC.mpu_m0.noc_fw_ddr_mpu_fpga2sdram_ddr_scr.fpga2sdram1region0addr.base
* Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.I_NOC.mpu_m0.noc_fw_ddr_mpu_fpga2sdram_ddr_scr.fpga2sdram1region0addr.limit
*/
fpga2sdram1-0 = <0x00000000 0x0000ffff>;
/*
* Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.I_NOC.mpu_m0.noc_fw_ddr_mpu_fpga2sdram_ddr_scr.fpga2sdram2region0addr.base
* Driver setting: altera_arria10_soc_noc_arria10_uboot_driver.I_NOC.mpu_m0.noc_fw_ddr_mpu_fpga2sdram_ddr_scr.fpga2sdram2region0addr.limit
*/
fpga2sdram2-0 = <0x00000000 0x0000ffff>;
};
};
設定変更例:
F2S インターフェースの 3 ポート(fpga2sdram0 ~ 2)それぞれに対して、アクセス可能なアドレス領域(Region)を最大 4 つのまで定義可能です。Region は fpga2sdramX に続くハイフン付きの数字(-0 ~ 3)で区別します。
以下に設定変更の例を記載します。
fpga2sdram0-0 = <0x00004000 0x00004fff>;
fpga2sdram1-0 = <0x00005000 0x00005fff>;
fpga2sdram1-1 = <0x00006800 0x00006fff>;
fpga2sdram2-0 = <0x00007000 0x00007fff>;
-
- fpga2sdramポート 1 (fpga2sdram0) ... 0x40000000~0x4FFFFFFF のみアクセス可能
- fpga2sdramポート 2 (fpga2sdram1) ... 0x50000000~0x5FFFFFFF, 0x68000000~0x6FFFFFFF にアクセス可能(2 つの Region を定義)
- fpga2sdramポート 3 (fpga2sdram2) ... 0x70000000~0x07FFFFFF のみアクセス可能
変更後の devicetree.dts を使用して、続きの U-Boot ビルド手順を実行して頂くことで所望の設定を反映させることができます。
U-boot のビルド手順については以下の記事をご確認ください。
参考: SoC EDS v19.1 Std / v19.3 Pro 以降のブートローダー生成フロー(Arria® 10 SoC 編)
まとめ
以上、F2S インターフェースを開通させるための設定について紹介しました。
最後に F2S インターフェースのメリットについて記載しておきます。FPGA 側から HPS 側へのアクセスを行う際、F2S インターフェースを介してアクセスを行うと、HPS 側のメイン・バススイッチを通らずに SDRAM コントローラーに接続された DDR メモリーへダイレクトにアクセスできるため、
FPGA-to-HPS(F2H)経由より高スループットでのアクセスに有利になります。