はじめに
Stratix® 10 FPGA、Agilex™ 7 FPGA など、Arm® Cortex®-A53 プロセッサーを採用する SoC FPGAファミリーのブートフローには、Arm Trusted Firmware(ATF)と呼ばれるプログラムが採用されています。
この記事では、ATF を使用したブートフローに関する注意点について記載します。
新旧ブートフロー(ATF 使用/未使用)の違い
ATF は、Stratix® 10 / Agilex™ 7 のデバイスリリース当初は使用しておらず、U-Boot SPL「First Stage Boot Loader(FSBL)」と U-Boot「Second Stage Boot Loader(SSBL)」のみを使用していました。ATF が使用されるようになったのは、インテル® Quartus® Prime 開発ソフトウェアのバージョン 20.3 に対応したリファレンスデザイン環境( Rocetboards.org の 2020.11 以下の gsrd )からです。
以下に新旧それぞれのブートフローを示します。
【図 1】旧ブートフロー(ATF 未使用)
【図 2】新ブートフロー(ATF 使用・現在の標準ブートフロー)
ポイント:
新旧ブートフローの違いで大きなポイントは SSBL の実行権限です。旧ブートフローの SSBL が Exception Level 3(EL3)で動作するのに対して、新ブートフローでは EL2 となります。EL2 は EL3 よりも権限が低いためアクセス可能なレジスターにも制限があり、U-Boot コマンドを使用してレジスターアクセスを行う際に違いが生じます。
ポイント:
新ブートフローではセキュリティー・レベルの高いレジスターへのアクセスを Secure Monitor Call(SMC)を介して ATF が行います。同様に Secure Device Manager(SDM)との Mailbox 通信も SMC を介して ATF が行います。
注記:
U-Boot コマンドとして SMC Call を実行するためには、該当のコンフィグレーションを有効にする必要があります。CONFIG_CMD_SMC=y を追加してください。
参考:
セキュリティー・レベルの高いレジスターや SMC Call に関する補足情報
Appendix: Managing Secure L3 Registers on Stratix 10, Agilex and N5X | Documentation | RocketBoards.org
新旧ブートフローの使い分け
現在の標準ブートフローは ATF 採用のフローとなっていますが、デバッグ時などに必要に応じて旧ブートフローを使用したい場合が考えられます。
旧ブートフローに対応した FSBL / SSBL をビルドするためのコンフィグ設定ファイルが U-Boot ソースツリーに用意されているので、defconfig を行う際に指定するファイル名を変更するのみで新旧ブートフローの使い分けが可能となっています。
標準ブートフロー向けの defconfig ファイル
メモ:
FSBL / SSBL のビルド時に make socfpga_stratix10_defconfig もしくは make socfpga_agilex_defconfig を実行することでコンフィグオプション設定を行います。
参考:
標準ブートフロー向けのビルド方法は以下のページを参照してください。
Building Bootloader for Stratix 10 and Agilex | Documentation | RocketBoards.org
旧ブートフロー用の defconfig ファイル
- socfpga_stratix10_legacy_defconfig at socfpga_v2022.01
- socfpga_stratix10_nand_legacy_defconfig at socfpga_v2022.01
- socfpga_stratix10_qspi_legacy_defconfig at socfpga_v2022.01
- socfpga_agilex_legacy_defconfig at socfpga_v2022.01
- socfpga_agilex_nand_legacy_defconfig at socfpga_v2022.01
- socfpga_agilex_qspi_legacy_defconfig at socfpga_v2022.01
ポイント:
旧ブートフロー用はファイル名が「*_legacy_defconfig」になります。また、旧ブートフロー用は SD / NAND / QSPI などブートに使用するメモリーデバイス毎にファイルが異なります。
注記:
ブートに使用する SSBL を含むイメージファイルも新旧ブートフローで異なるものを使用する必要があります。標準ブートフローでは ATF と SSBL の両方を含む u-boot.itb ファイルを使用しますが、旧ブートフローでは u-boot.img を使用します。
新ブートフローの注意点:ATF が使用するメモリー領域
先に紹介した通り、ATF は SMC Call を処理するために Linux 起動後も動作を継続する必要があります。そのためには、ATF が使用するメモリー領域を理解した上で、該当の領域を別の用途で使用しないように注意して対応する必要があります。
以下に ATF が使用するメモリー領域を示します。
【図 3】ATF が使用するメモリー領域
注記:
SDRAM の先頭 1MB 領域は ATF が占有するため ATF 以外からの書き換えは厳禁です。ATF が使用するメモリー領域を誤って書き換えてしまった場合、ATF の動作契機となる SMC Call が実行された延長で、例外や Kernel パニック、システム・ハングアップなどのトラブルを引き起こす原因となります。
実際に注意すべきポイント:Linux デバイスツリー
以下に実際に注意したいポイントを示します。Linux のデバイスツリーには、Linux Kernel が使用する memory エリアの定義とは別に reserved-memory の定義があります。
reserved-memory は特定の用途で使用するために予約しているエリアとなりますが、条件により書き換えが発生することもありえるため、ATF が使用する領域は対象領域から除外しておいた方が安全です。
【図 4】注意すべきポイント(Linux デバイスツリー)
ポイント:
Linux ブート開始直後のログ出力の内容から reserved-memory の領域を確認することも可能です。以下の "Reserved memory: created DMA memory pool at 0x0000000000100000, size 31 MiB" が該当の情報です(先頭 1MB 領域を避ける対策を行った後のログ出力)。
Starting kernel ...
Deasserting all peripheral resets
[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[ 0.000000] Linux version 5.15.30 (user@machine) (aarch64-none-linux-gnu-gcc (GNU Toolchain for the Arm Architecture 11.2-2022.02 (arm-11.14)) 11.2.1 20220111, GNU ld (GNU Toolchain for the Arm Architecture 11.2-2022.02 (arm-11.14)) 2.37.20220122) #2 SMP PREEMPT Fri Jul 29 18:47:14 JST 2022
[ 0.000000] Machine model: SoCFPGA Agilex SoCDK
[ 0.000000] efi: UEFI not found.
[ 0.000000] Reserved memory: created DMA memory pool at 0x0000000000100000, size 31 MiB
[ 0.000000] OF: reserved mem: initialized node svcbuffer@0, compatible id shared-dma-pool
まとめ
今回は Stratix® 10 と Agilex™ 7 の新旧ブートフローと ATF 使用時の注意点について紹介しました。注意点については、実際に当方で経験したトラブルを元に情報共有させて頂いております。
誤って ATF が使用する領域を書き換えてしまった場合には、プログラム破壊となるので対象番地/データにより引き起こされる事象は様々です。早期に原因に気が付けないとデバッグに時間を要してしまう一因になりますので、くれぐれもご注意ください。