Arria 10 SoCブート・ユーザーガイド

ID 683735
日付 10/30/2015
Public
ドキュメント目次

1.2.2.1. ブートROMフロー

コールド・リセットでは、HPSブート・プロセスはCPU0がリセット(たとえば起動時)からリリースされると開始し、リセット例外アドレス0x00000000で内部ブートROMのコードを実行します。 ブートROMコードによってSoCはリセットから脱け出し、既知の状態となります。ブートROMコード完了後、コントロールは第2ステージ・ブートローダと呼ばれるブート・ソフトウェアの次のステージへと移ります。第2ステージ・ブートローダはカスタム化が可能で、通常はHPS外部の不揮発性フラッシュ・ベースのメモリかFPGA内のオンチップRAMに保存されます。第2ステージ・ブートローダは、OS、ベアメタル・アプリケーションにロードすることが可能です。またはサード・パーティ製のブートローダにロードすることも可能です。

この項では、ブートROMコードがソフトウェア・コントロールを第2ステージ・ブートローダに渡すまでのリセットからのソフトウェア・フローについて説明します。

コードが開始するとシステムが初期化されますが、要求されるブートの種類によってはオンチップRAMにコードのロードを試みることも可能です。ロードが成功すれば、第2ステージ・ブートローダ・コードが実行されます。ブートROMがコードの検索できない場合、あるいは3度連続してロードに失敗した場合、スピンしウォッチドッグ・リセットを待ちます。

図 4. メイン・ブートROMフロー

ブートROMは常にCPU0で実行します。CPU1はメイン・ブートROMコードの実行中は常にリセットで保持され、システム・ソフトウェアによってのみリリースされます。

ブートの種類を判断する一環として、ブートROMは下位レベルのブート・フローを実行します。ブートROMコードは第2ステージ・ブートのソースが強制的にFPGAとなるかどうかを判断するためにセキュリティ・ヒューズを読み込みます。非認証のFPGAブートあるいは非CRCオンチップRAMブートが要求される場合やブートが無効の場合、ブートは下位レベルのブート・フロー内で処理されます。その他の種類のブートはすべて上位レベルのブート・フロー内で処理されます。

図 5. 下位レベルのブート・フロー

下位レベル部分のブートROMフローの間、FPGAのみのブートが必要であるかを判断するためにブートROMはセキュリティ・ヒューズを読み込みます。この場合、ブートROMはPOFの認証を示すヒューズが必要であるかも決定する必要があります。認証が必要でなければ、標準のFPGAコンフィギュレーションが実行されます。

FPGAのみのブートが必要とされない場合、ブートROMはオンチップRAMブートが可能であるかをチェックします。可能である場合、ブートROMはコードが有効であるかを確認します。コードが有効でなければ、ブートROMはFPGAブートを示しているかを決定するためにBSELピンをリードします。

ブート・イメージに対し認証が必要であることをセキュア・ヒューズが示すのであれば、(Cコードで実行される)上位レベルのブートを実行する必要があります。

図 6. 上位レベルのブート・フロー

ブート・プロセス中、ブート・イメージで認証と復号を実行することが可能です。認証は復号から独立していますが、認証と復号の両方が必要とされるのであれば、必ず認証が先に実行されます。認証ブートが必要な場合、ブートROMには認証プロセスを開始するにあたってルート・キーが必要です。このキーはユーザ・ヒューズやFPGAロジック・エレメントに実装したり、あるいは第2ステージ・ブート・イメージ・ヘッダの一部として実装したりすることが可能です。デバイス・コンフィギュレーション・ヒューズはキーのソースを決定します。

フラッシュ・メモリからのコールド・ブート中、ブートROMコードはフラッシュ・メモリからオンチップRAMへの最初の第2ステージ・ブートローダ・イメージのロードを試み、コントロールを第2ステージ・ブートローダに渡します。この初期イメージが有効でない場合、ブートROMコードはromcode_initswlastldレジスタにインデックスを付与し、次に格納されたイメージのロードを試みます。ブートROMは最初のロードの後、3回連続してロードを試みます。これらのロード後においても有効なイメージが検索されない場合、ブートROMコードはフォールバック・イメージのためにデバイスのFPGA部分をチェックします。
注: ブート・プロセス中、ブートROMはすべてのキャッシュ(L1データおよび命令キャッシュとL2キャッシュ)をイネーブルします。第2ステージ・ブートローダがブート・フラッシュ・デバイス(SD/MMC、QSPI、NAND)プロパティからロードされない場合、キャッシュはブートROMがフォールバック・イメージのためにデバイスのFPGA部分をチェックをする際、オンのままとなります。この状態は、コードをロードする際にコヒーレンシに関する問題の原因となるため、キャッシュはフォールバック・イメージ内でフラッシュされディセーブルされなければいけません。

ウォームRAMブートが成功しない、あるいはコールド・リセットが発生する場合は、ブートROMはシステム・マネージャのbootinfoレジスタ内のBSEL値を読み込みます。FPGAがブート・ソースとして選択されているのであれば、ブートROMコードはHPS-FPGA間のブリッジのアドレス0xC0000000でコードの実行を試みます。FPGAが正しく初期化されず、ウォッチドッグがタイムアウトに向けてイネーブルされない場合、エラー条件は生成されません。代わりに、ブートROMはFPGAが利用可能となるまで継続して待機します。

BSELビットが外部フラッシュからのブートを示すのであれば、ブートROMコードはフラッシュ・デバイスからオンチップRAMへのイメージのロード、検証と実行を試みます。BSELが無効であったり、ブートROMコードが有効なイメージをフラッシュ内に見つけられない場合は、ブートROMコードはFPGA内にフォールバックが存在するかどうかをチェックします。存在する場合はブートROMはそのフォールバック・イメージを実行し、存在しない場合はブートROMはオンチップRAMへ情報の事後分析ダンプを実行し、リセットを待ちます。

注: 略語のBSELとBOOTSELは、ブート選択ピンを定義する場合同じ意味で用いられます。

ブートROMコードは破損したイメージが実行されることがないよう、いくつかの方法で第2ステージ・ブートローダを検証します。最初はイメージ・ヘッダを検証しますが、これはブロックを保護するイメージのCRC、マジック・ナンバー、バージョン、ブロック長を特定します。いずれかが無効であれば、エラーが発生します。