1. はじめに
Stratix® 10 FPGA と Agilex™ 7 FPGA では、Secure Device Manager(SDM)と呼ばれるハードモジュールが内蔵されており、SDM によりコンフィグレーションやブートが行われます。SDM によりコンフィグレーション/ブートが行われているため、以前のデバイスと比べ起動方法が異なっています。
この記事では、Stratix® 10 FPGA/Agilex™ 7 FPGA における起動方法の種類と、その設定について説明します。
2. ブート方式の種類
Stratix® 10 FPGA/Agilex™ 7 FPGA では、下記 2 通りのブート方式があります。
- HPS Boot First mode
- FPGA Configuration First mode
2-1. HPS Boot First mode
HPS Boot First mode は FPGA のコンフィグレーションよりも先に、HPS のブートを行うモードです。
下図は HPS Boot First mode のシーケンスとなりますが、HPS のブートが FPGA コンフィグレーションより先に行われていることが分かります。
【図 1】 HPS Boot First フロー
※ Stratix® 10 SoC FPGA Boot User Guide から抜粋
2-2. FPGA Configuration First mode
FPGA Configuration First mode は HPS のブートより先に、FPGA のコンフィグレーションを行うモードです。
下図は FPGA Configuration First mode のシーケンスですが、FPGA コンフィグレーションが HPS ブートより先に行われていることが分かります。
【図 2】 FPGA Configuration First Boot フロー
※ Stratix® 10 SoC FPGA Boot User Guide から抜粋
2-3. ブート方式の決め方
ブート方式には HPS Boot First mode と FPGA Configuration First mode があると説明しましたが、
実際にはどちらを選択したらよいのでしょうか?
ブート方式の決め方はお客様の "製品仕様" に合わせて決めていただくようになります。
HPS と FPGA のどちらが先に起動するのが製品にとって都合が良いのかを、ご検討いただくことになります。
ただ、PCI Express を使用する場合には、FPGA Configuration First mode を使用する必要があります。
これは PCI Express にはデバイスに電源を入れ、100ms 以内に PCI Express 部がコンフィグレーション完了していなければならないという仕様があるためです。
3. ブート方式の設定
この章ではブート方式の設定と、Golden Hardware Reference Design(GHRD)の設定について説明します。
3-1. Device and Pin Option での設定
ブート方式は Quartus® Prime の Device and Pin Options で行います。
※ Device and Pin Options は下記フローで起動できます。
Quartus メニューバーの[Assignments]⇒[Device...]⇒[Device and Pin Options...]を選択します。
■ "HPS/FPGA configuration order:" の項目でブート方式を設定します。
- After INIT_DONE を選択することで FPGA Configuration First mode
- HPS First を選択することで HPS Boot First mode
下図にブート方式の設定例を示します。
【図 3】 ブート方式の設定項目
3-2. GHRD 生成時での設定
GHRD は Github から入手し、スクリプトを実行することによりデザインが生成されます。
参考: GHRD の入手と生成方法については下記コンテンツを参考にしてください。
SoC FPGA ハードウェア・リファレンス・デザイン(GHRD)の入手&生成方法
デザイン生成の前に Makefile にて BOOTS_FIRST の項目を設定しておくことで、「3-1. Device and Pin Option での設定」で紹介した設定が、既に適応されたデザインが生成されます(【図 4】参照)。
【図 4】 GHRD の Makefile におけるブート方式設定例
4. Flash に格納するファイル
この章ではそれぞれのブート方式で Flash に格納するファイルを紹介します。
Flash の構成には Single Flash と Dual Flash の構成がありますが、メジャーな構成である Dual Flash をベースに説明します。
参考: Single Flash の構成については下記資料をご参照ください。
Stratix® 10 SoC FPGA Boot User Guide
尚、U-boot のバージョンや Linux 環境においては、格納ファイルの拡張子等が変わる可能性があります。
参考: 本章で紹介する格納ファイルは、下記 Rocketboards.org の記事(2022/03/11 現在)を参考にしています。
Building Bootloader for Stratix 10 and Agilex
4-1. HPS Boot First mode の Flash 内部構成
HPS Boot First mode の場合の必要なファイルを以下に示します。【図 5】と併せてご参照ください。
① Bitstream : .jic ファイル
※ 「4-3. 補足」に補足説明がありますのでご覧ください。
※ FSBL は First Stage Boot Loader の略
② HPS SSBL : u-boot.itb
※ SSBL は Second Stage Boot Loader の略
③ Kernel image & DTB : <Linux kernel/dtb>
④ FPGA Core & I/O Configuration : rbf ファイル
⑤ OS File System : <rootFs 関連>
【図 5】 HPS Boot First 時の Dual Flash 構成
※ Stratix® 10 SoC FPGA Boot User Guide から抜粋
HPS Boot First mode の場合は、FPGA のコンフィグレーションを HPS 側から行うので、HPS 側の Flash にコンフィグレーション・データが含まれています。
ポイント: FPGA のコンフィグレーションを OS(Linux)起動後に行う場合には、④ のように FAT パーティションの中ではなく、⑤ の OS File System の中に配置する構成を使用する場合があります。
4-2. FPGA Configuration First mode の Flash 内部構成
FPGA Configuration First mode の場合の必要なファイルを以下に示します。【図 6】と併せてご参照ください。
① Bitstream : .jic ファイル
※ 「4-3. 補足」に補足説明がありますのでご覧ください。
② HPS SSBL : u-boot.itb
③ Kernel image & DTB : <Linux kernel/dtb>
④ OS File System : <rootFs 関連>
【図 6】 FPGA Configuration First 時の Dual Flash 構成
※ Stratix® 10 SoC FPGA Boot User Guide から抜粋
FPGA Configuration First mode の場合は、FPGA のコンフィグレーションを FPGA 側で行うので、FPGA 側の Flash にコンフィグレーション・データが含まれています。
4-3. 補足
下記 2 点、FPGA 側の Flash 内の Bitstream について補足します。
1. 設定したブート方式により FPGA core の所在が異なります
それぞれのブート方式で FPGA core の所在は下表のようになります。
【表 1】 ブート方式別の FPGA core の所在
ブート方式 | FPGA core の所在 |
FPGA Configuration First |
● FPGA 側 Flash ※ コンパイルで生成される sof に自動で組み込まれているので、特別な処理は不要です。 |
HPS Boot First |
● HPS 側 Flash ※ HPS Boot First の場合は、HPS 側から FPGA をコンフィギュレーションします。 U-boot から FPGA をコンフィグレーションする場合は、.rfb ファイルを HPS 側の Flash に格納します。 |
2. FSBL は Bitstream に組み込む必要があります
HPS は FPGA 側に存在する SDM により起動されるので、ブートローダーの初段である FSBL は FPGA 側の Flash に含めておく必要があります。
.sof ファイルに FSBL を組み込むコマンドについては下図をご参照ください。
【図 7】 FSBL を含む .sof ファイル作成コマンド
※ Stratix® 10 SoC FPGA Boot User Guide から抜粋
5. 起動ログ
ブート方式により HPS の起動ログが異なります。ここでは起動ログの差分について説明します。
5-1. HPS Boot First mode のログ
HPS Boot First mode の場合は、FSBL 後に FPGA をコンフィグレーションするので、コンフィグレーションのログが表示されます。
下記ログは SSBL にてコンフィグレーションした場合となりますので、SSBL のフェーズでコンフィグレーションのログが出力されています。
U-Boot SPL 2021.07 (Nov 15 2021 - 16:50:42 +0000)
Reset state: Cold
MPU 1200000 kHz
L4 Main 400000 kHz
L4 sys free 100000 kHz
L4 MP 200000 kHz
L4 SP 100000 kHz
SDMMC 50000 kHz
DDR: 8192 MiB
SDRAM-ECC: Initialized success with 1727 ms
QSPI: Reference clock at 400000 kHz
WDT: Started with servicing (10s timeout)
denali-nand-dt nand@ffb90000: timeout while waiting for irq 0x2000
denali-nand-dt nand@ffb90000: reset not completed.
Trying to boot from MMC1
## Checking hash(es) for config board-0 ... OK
## Checking hash(es) for Image atf ... crc32+ OK
## Checking hash(es) for Image uboot ... crc32+ OK
## Checking hash(es) for Image fdt-0 ... crc32+ OK
NOTICE: BL31: v2.5.1(release):QPDS21.4_REL_GSRD_PR
NOTICE: BL31: Built : 06:53:56, Dec 29 2021
U-Boot 2021.07 (Dec 02 2021 - 03:12:39 +0000)socfpga_agilex
CPU: Intel FPGA SoCFPGA Platform (ARMv8 64bit Cortex-A53)
Model: SoCFPGA Agilex SoCDK
DRAM: 8 GiB
WDT: Started with servicing (10s timeout)
NAND: denali-nand-dt nand@ffb90000: timeout while waiting for irq 0x2000
denali-nand-dt nand@ffb90000: reset not completed.
Failed to initialize Denali NAND controller. (error -5)
0 MiB
MMC: dwmmc0@ff808000: 0
Loading Environment from FAT... Unable to read "uboot.env" from mmc0:1... Loading Environment from SPIFlash... SF: Detected mt25qu02g with page size 256 Bytes, erase size 4 KiB, total 256 MiB
OK
In: serial0@ffc02000
Out: serial0@ffc02000
Err: serial0@ffc02000
Net:
Warning: ethernet@ff800000 (eth0) using random MAC address - 96:c1:d7:95:49:fb
eth0: ethernet@ff800000
Hit any key to stop autoboot: 5 4 3 2 1 0
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot.scr.uimg
2195 bytes read in 3 ms (713.9 KiB/s)
## Executing script at 05ff0000
crc32+ Trying to boot Linux from device mmc0
Found kernel in mmc0
13643679 bytes read in 622 ms (20.9 MiB/s)
## Loading kernel from FIT Image at 02000000 ...
Using 'board-0' configuration
Verifying Hash Integrity ... OK
Trying 'kernel' kernel subimage
Description: Linux Kernel
Type: Kernel Image
Compression: lzma compressed
Data Start: 0x020000dc
Data Size: 8226617 Bytes = 7.8 MiB
Architecture: AArch64
OS: Linux
Load Address: 0x06000000
Entry Point: 0x06000000
Hash algo: crc32
Hash value: c6de3509
Verifying Hash Integrity ... crc32+ OK
## Loading fdt from FIT Image at 02000000 ...
Using 'board-0' configuration
Verifying Hash Integrity ... OK
Trying 'fdt-0' fdt subimage
Description: socfpga_socdk
Type: Flat Device Tree
Compression: uncompressed
Data Start: 0x027d88f4
Data Size: 19372 Bytes = 18.9 KiB
Architecture: AArch64
Hash algo: crc32
Hash value: dfa04e7e
Verifying Hash Integrity ... crc32+ OK
Booting using the fdt blob at 0x27d88f4
## Loading fpga from FIT Image at 02000000 ...
Trying 'fpga-0' fpga subimage
Description: FPGA bitstream for GHRD
Type: FPGA Image
Compression: uncompressed
Data Start: 0x027e6740
Data Size: 1839104 Bytes = 1.8 MiB
Load Address: 0x0a000000
Hash algo: crc32
Hash value: 6ec82c4a
Verifying Hash Integrity ... crc32+ OK
Loading fpga from 0x027e6740 to 0x0a000000
..FPGA reconfiguration OK! ##Comment: SSBL にて FPGA のコンフィグレーション完了
Enable FPGA bridges
Programming full bitstream... OK
Uncompressing Kernel Image
Loading Device Tree to 000000007f9ed000, end 000000007f9f4bab ... OK
SF: Detected mt25qu02g with page size 256 Bytes, erase size 4 KiB, total 256 MiB
Enabling QSPI at Linux DTB...
RSU: Firmware or flash content not supporting RSU
RSU: Firmware or flash content not supporting RSU
RSU: Firmware or flash content not supporting RSU
RSU: Firmware or flash content not supporting RSU
5-2. FPGA Configuration First mode のログ
FPGA Configuration First mode の場合は、FSBL 起動前にコンフィグレーションが済んでいるので、コンフィグレーションのログは出力されません。
U-Boot SPL 2021.07-16361-g24e26ba4a0 (Mar 29 2022 - 09:03:53 +0900)
Reset state: Cold
MPU 1200000 kHz
L3 main 400000 kHz
Main VCO 2400000 kHz
Per VCO 2000000 kHz 115200 8N1 NORinicom 2.6.2 | VT102 \u5207\u65ad EOSC1 25000 kHz
HPS MMC 50000 kHz
UART 100000 kHz
DDR: 4096 MiB
SDRAM-ECC: Initialized success with 1001 ms
QSPI: Reference clock at 400000 kHz
WDT: Started with servicing (10s timeout)
denali-nand-dt nand@ffb90000: timeout while waiting for irq 0x2000
denali-nand-dt nand@ffb90000: reset not completed.
Trying to boot from MMC1
## Checking hash(es) for config board-0 ... OK
## Checking hash(es) for Image atf ... crc32+ OK
## Checking hash(es) for Image uboot ... crc32+ OK
## Checking hash(es) for Image fdt-0 ... crc32+ OK
NOTICE: BL31: v2.5.1(release):rel_socfpga_v2.5.1_22.03.01_pr
NOTICE: BL31: Built : 08:17:23, Mar 29 2022
U-Boot 2021.07-16361-g24e26ba4a0 (Mar 29 2022 - 09:03:53 +0900)socfpga_stratix10
CPU: Intel FPGA SoCFPGA Platform (ARMv8 64bit Cortex-A53)
Model: SoCFPGA Stratix 10 SoCDK
DRAM: 4 GiB
WDT: Started with servicing (10s timeout)
NAND: denali-nand-dt nand@ffb90000: timeout while waiting for irq 0x2000
denali-nand-dt nand@ffb90000: reset not completed.
Failed to initialize Denali NAND controller. (error -5)
0 MiB
MMC: dwmmc0@ff808000: 0
Loading Environment from FAT... Unable to read "uboot.env" from mmc0:1... LoadiB
*** Warning - bad CRC, using default environment
Loading Environment from UBI... denali-nand-dt nand@ffb90000: timeout while wai0
denali-nand-dt nand@ffb90000: reset not completed.
Could not find a valid device for ffb90000.nand.0
Partition root not found!
** Cannot find mtd partition "root"
In: serial0@ffc02000
Out: serial0@ffc02000
Err: serial0@ffc02000
Net:
Warning: ethernet@ff800000 (eth0) using random MAC address - 22:22:46:53:47:0b
eth0: ethernet@ff800000
6. 参考資料
以下に参考資料を紹介します。
参考: ユーザーガイド
Stratix® 10 SoC FPGA Boot User Guide
参考: マクニカ技術コンテンツ
SoC FPGA ハードウェア・リファレンス・デザイン(GHRD)の入手&生成方法
7. おわりに
この記事では、Stratix® 10 FPGA /Agilex™ 7 FPGA におけるブート方式について説明しました。HPS Boot First と FPGA Configuration First のそれぞれについてイメージを掴んでいただければ幸いです。
設定は非常に簡単に行えますので、是非 2 つのブート方式について試していただければと思います。