MPFS-DISCO-KIT 向け Ubuntu 22.04 の構築(HSS編)


## はじめに

MPFS-DISCO-KIT(Microchip PolarFire SoC FPGA Discovery Kit) で動作する Ubuntu 22.04 を構築する方法をいくつかの記事に分けて説明します。

 * [イントロ編](https://qiita.com/ikwzm/items/1866dc3bb5292fd1f6e1)
 * __HSS(Hart Software Services)編(この記事)__
 * [U-Boot 標準編](https://qiita.com/ikwzm/items/8b6e78e1c5599d9d375d)
 * [U-Boot bootmenu 改造編](https://qiita.com/ikwzm/items/72f75ec704dd227f9cbd)
 * [Linux Kernel linux4microchip+fpga-2024.09 編](https://qiita.com/ikwzm/items/0ca6aea057a3696bd5f0)
 * [Linux Kernel mpfs-fpga-first 編](https://qiita.com/ikwzm/items/d7405466ed7391d4dd73)
 * [Ubuntu 22.04 Root File System 編](https://qiita.com/ikwzm/items/a3d1d5a1a9640b400872)
 * [SD-Card 作成編](https://qiita.com/ikwzm/items/19af3dd7a34ea5364683)
 * [SD-Card 起動編](https://qiita.com/ikwzm/items/42a1aa7b355734a813f8)

上記の記事で構築した MPFS-DISCO-KIT 向け Ubuntu 22.04 Root File System、Linux Kernel、Boot Loader は次の URL にて公開しています。なお、これらはオフシャルなものではなく、筆者の魔改造がはいっています。ご使用の際はこの点にご留意してください。

 * https://github.com/ikwzm/MPFS-FPGA-Ubuntu22.04
 * https://github.com/ikwzm/MPFS-FPGA-Linux-Kernel-6.6
 * https://github.com/ikwzm/MPFS-DISCO-KIT-U-Boot


この記事では、HSS(Hart Software Services)の概要と MPFS-DISCO-KIT への書き込みについて説明します。

## HSS(Hart Software Services) とは

HSS は eNVM(embedded Non-Volatile Memory) に格納されたステージ1のブートプログラムで MSS(Micro Processor Sub System) が実行します。

HSS は主に次のような役割があります。

* ブートローダーとしての機能
  + MSS の RISC-V Core (Hart: Hardware Thread) を初期化。
  + 外部ストレージ(eMMC、SD-Card、QSPI フラッシュなど)や内部ストレージからアプリケーションをロード。
  + 各 Hart に対応するコードを割り当てて実行を開始。
* マルチコア管理
  + マルチコアシステムでの Hart の役割を設定。
  + 必要に応じて Hart を停止、再開、リセット。
  + 各 Hart のリソースを制御し、アプリケーションの分散実行をサポート。
  + 各 Hart 間のデータ共有や同期を提供。
  + メッセージパッシングや割り込み制御をサポート。
* セキュアブート
  + セキュアブートプロセスを管理し、不正なコードの実行を防止。
  + 暗号化されたイメージの複合や検証を実行。
* 仮想化サポート
  + 仮想化のための環境を準備し、各 Hart が異なる OS や RTOS を実行可能にする。
* 周辺機器の初期化
  + DDR Memory やクロック、その他の周辺デバイスの初期化を担当。
  + PolarFire SoC 全体のシステムの初期化を実施。
* コンソールとデバッグ支援
  + シリアルポート経由でデバッグコンソールを提供。
  + PolarFire SoC のデバッグや状態監視を支援。


## HSS のソースコード

HSS のソースコードは 下記の URL にて公開されています。

* https://github.com/polarfire-soc/hart-software-services

## HSS のイメージファイル

今回説明する Ubuntu 22.04 システムでは、時間と手間の都合上、HSS を１からビルドしません。下記の URL からビルド済みのものをダウンロードして使います。

* https://github.com/polarfire-soc/hart-software-services/releases/latest/download/hss-envm-wrapper.mpfs-disco-kit.hex

```console
shell$ wget https://github.com/polarfire-soc/hart-software-services/releases/latest/download/hss-envm-wrapper.mpfs-disco-kit.hex
```

## HSS の eNVM への書き込み

eNVM の内容を MSS から読むことは出来ますが、書き込むことは出来ません。eNVM に書き込むには JTAGを介して行われます。
ここでは、Microchip Technology 社が提供する PolarFire SoC FPGA 開発環境である Libero SoC を使って MSS を eNVM に書き込む方法を紹介します。なお、この部分については、筆者自身がまだ不馴れで知識不足が多々ある事をご了承ください。

### polarfire-soc-discovery-kit-reference-design のダウンロード

eNVM に HSS を書き込む際に、polarfire-soc-discovery-kit-reference-design を利用します。これは MPFS-DISCO-KIT 用に Fabric部(FPGA部)に SRAM、I2C、DMAなどを実装したリファレンスデザインです。これを MPFS-DISCO-KIT にプログラムするついでに(?) HSS もプログラムします。

```console
shell$ git clone --depth 1 --branch main https://github.com/polarfire-soc/polarfire-soc-discovery-kit-reference-design
```

### polarfire-soc-discovery-kit-reference-design のビルド

#### プロジェクトの作成

Libero SoC を起動したら Project > Execute Script... をクリックして、前節でダウンロードしたディレクトリにある MPFS_DISCOVERY_KIT_REFERENCE_DESIGN.tcl を選択して Run します。

![Fig.1 Libero-Project-Execute-Script](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F24981%2F12c8f22a-e6f4-0bbe-d524-90442b4d0643.png)
Fig.1 Libero-Project-Execute-Script

しばらく放っておくとプロジェクトが出来上がります。

![Fig.2 Libero-Project-Execute-Script-Success](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F24981%2F30ef304b-3447-e28c-b2b1-59a9ec3204c9.png)
Fig.2 Libero-Project-Execute-Script-Success

#### 論理合成&配置配線

プロジェクトが出来上がったら、Place and Route を走らせます。ついでに Synthesize もやってくれます。

![Fig.3 Libero-Project-Place-and-Route-Run](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F24981%2Ffac17cbc-3b0e-1a33-499e-3b42a1f086ce.png)
Fig.3 Libero-Project-Place-and-Route-Run

しばらく放っておくと出来上がります。

![Fig.4 Libero-Project-Place-and-Route-Success](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F24981%2Fd0be87a1-7ac6-85bc-a14e-93ba78a376a1.png)
Fig.4 Libero-Project-Place-and-Route-Success

#### FPGA データの生成

Generate FPGA Array Data をクリックして Run します。

![Fig.5 Libero-Project-Generate-FPGA-Array-Data](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F24981%2F683a5ad7-24be-0734-0167-9a4b60c43814.png)
Fig.5 Libero-Project-Generate-FPGA-Array-Data

次に Configure Design Initialization Data and Memories をクリックして

![Fig.6 Libero-Project-Design-Initialization-Data-and-Memories](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F24981%2Fdfd6f3fe-ccfe-09b4-2d72-edc482b473e9.png)
Fig.6 Libero-Project-Design-Initialization-Data-and-Memories

Design Initialization Data and Memories View を開きます。
eNVM タブをクリックして Add > Add Boot Mode 1 Client を選択します。

![Fig.7 Libero-Project-Design-Initialization-Data-and-Memories-eNVM-Add](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F24981%2Fb7c3bd52-a038-c8ed-0695-c8427ca206fa.png)
Fig.7 Libero-Project-Design-Initialization-Data-and-Memories-eNVM-Add

Add PlaneText Boot Mode 1 client のダイアログボックスの Content from file: に前節でダウンロードした hss-envm-wrapper.mpfs-disco-kit.hex を指定します。

![Fig.8 Libero-Project-Design-Initialization-Data-and-Memories-eNVM-Content-from-file](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F24981%2F571802ff-5367-7a10-494d-753745790957.png)
Fig.8 Libero-Project-Design-Initialization-Data-and-Memories-eNVM-Content-from-file

最後に Apply をクリックして eNVM に書き込むデータを生成します。

![Fig.9 Libero-Project-Design-Initialization-Data-and-Memories-eNVM-Apply](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F24981%2F116ba792-acf0-731f-d665-d96871ecb74a.png)
Fig.9 Libero-Project-Design-Initialization-Data-and-Memories-eNVM-Apply

### eNVM への書き込み

MPFS-DISCO-KIT を PC に接続して、Run PROGRAM Action をクリックして Run を実行します。

![Fig.10 Libero-Project-Run-PROGRAM-Action-Run](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F24981%2F9365815a-a17e-2fc3-8110-450f09ff5b64.png)
Fig.10 Libero-Project-Run-PROGRAM-Action-Run

書き込みに成功すれば次のようになるはずです。

![Fig.11 Libero-Project-Run-PROGRAM-Action-Success](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F24981%2F089d1554-aa1d-f727-c77b-44970071a5bb.png)
Fig.11 Libero-Project-Run-PROGRAM-Action-Success

これにて MPFS-DISCO-KIT の eNVM への HSS の書き込み(ついでに Fabric の書きこみも)は完了です。


## Hart Payload Generator 

HSS がブートローダーとして外部ストレージ(eMMC、SD-Card、QSPI フラッシュなど)や内部ストレージからアプリケーションをロードする際は、アプリケーションを Hart Payload としてラッピングしておく必要があります。
そこで、ラッピングするツール Hart Payload Generator をビルドしておきます。

### ソースコードのダウンロード

HSS のソースコードは 下記の URL にて公開されています。

* https://github.com/polarfire-soc/hart-software-services

v2024.09 版をダウンロードします。

```console
shell$ git clone --depth 1 --branch v2024.09 https://github.com/polarfire-soc/hart-software-services.git hart-software-services-v2024.09
```

### Hart Payload Generator のビルド

Hart Payload Generator のソースコードは tools/hss-payload-generator にあります。


```console
shell$ cd hart-software-services-v2024.09/tools/hss-payload-generator/
shell$ make
```

## 参考

 * https://github.com/polarfire-soc/hart-software-services
 * https://github.com/polarfire-soc/polarfire-soc-discovery-kit-reference-design