MPFS-DISCO-KIT 向け Ubuntu 22.04 の構築(イントロ編)


## はじめに

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

 * __イントロ編(この記事)__
 * [HSS(Hart Software Services)編](https://qiita.com/ikwzm/items/3d6d0a645dd60aba90d2)
 * [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



この記事では、MPFS-DISCO-KIT の簡単な紹介、ブートシーケンス、クロス開発環境について説明します。

## MPFS-DISCO-KIT とは

MPFS-DISCO-KIT(Microchip PolarFire SoC FPGA Discovery Kit) は、Microchip Technology 社の PolarFire SoC FPGA(MPFS095T_1FCSG325E) を搭載した開発用のキットです。主な構成は次のとおりです。

 * PolarFire SoC FPGA with 95k LEs
 * 1GByte main memory
 * 1x Gigabit Ethernet
 * 3x UART
 * 1x micro-SD interface
 * Form factor 4.1" x3.3"


詳細は次の URL を参照してください。

 * https://www.microchip.com/en-us/development-tool/mpfs-disco-kit

## PolarFire SoC FPGA とは

PolarFire SoC FPGA は Microchip Technology 社が提供する SoC(System on Chip) FPGA ファミリの一つです。PolarFire SoC FPGA の主な構成は次のとおりです。

 * MSS(Micro Processor Sub System)
    + CPU Core Complex
      - 1x E51 RISC-V Monitor Core(RV64IMAC + 16KB iCache + 8KB DTIM)
      - 4x U54 RISC-V Application Core(RV64GC + 32KB iCache + 32KB dCache + MMU-Sv39)
      - 2MB L2 Cache or 1.8MB LIM
      - Branch Prediction
      - TileLink (Cache Coherency Inter Connect)
      - DMA Engine(4x independent DMA channels)
      - WCB(Write Combining Buffer)
      - PLIC(Platform Level Interrupt Controller)
      - CLINT(Core Local Interrupt Controller)
    + System Controller
    + pNVM(private Non-Volatile Memory)
    + AXI Switch
    + User Crypto Processor
    + DDR Memory Controller
    + Peripherals
      - 2x GbE
      - eMMC SD/SDIO
      - 2x CAN
      - 2x SPI
      - 2x I2C
      - 5x UART
      - 3x GPIO
      - 1x USB 2.0 OTG
      - RTC(Real-time Counter)
      - Timer
      - Watchdog
      - Frequency Meter
      - MSS-Fabric Interrupt Controller
      - 128KB eNVM(embedded Non-Volatile Memory)
    + FIC(Fabric Interface Controller)
 * FPGA Fabric


詳細は次の URL を参照してください。

 * https://www.microchip.com/en-us/products/fpgas-and-plds/system-on-chip-fpgas/polarfire-soc-fpgas


## ブートシーケンス

PolarFire SoC MSS には４つのブートモードがあります。

* ブートモード0 はブランクデバイス、または組み込みソフトウェアのデバッグ時に使用されます。
* ブートモード1 は MSS が電源投入時に eNVM からセキュアでないコードを実行を開始する場合に使用されます。
* ブートモード2 はユーザー定義のセキュアブート認証を実装するためのものです。
* ブートモード3 は Microchip 社が工場出荷時に提供する eNVM のセキュアブート認証を実装するためのものです。


今回説明する Ubuntu 22.04 システムでは、ブートモード1 でブートします。ブートシーケンスは次の手順で進みます。

### ステージ0 (内部ROM)

ステージ0 のブートプログラムは内部 ROM にあり、PolarFire SoC のシステムコントローラーが実行します。

電源投入直後、PolarFire SoC のシステムコントローラーは デバイスのコンフィギュレーションが完了するまで、MSS をリセット状態に保ちます。その後、システムコントローラーは内部ROM のコードを実行します。pNVM に格納されたコンフィギュレーションデータに基づいて Core Complex(1x RISC-V CPU + 4x RISC-V CPU)をコンフィギュレーションします。


### ステージ1 (HSS - Hart Software Services)

ステージ1 のブートプログラムは eNVM にあり、MSS が実行します。

今回説明する Ubuntu 22.04 システムでは HSS(Hart Software Services) を使います。

HSS は eNVM にプログラムされたステージ1 のプログラムで、主に次のような役割があります。

* ブートローダーとしての機能
  + 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 のデバッグや状態監視を支援。

なお、eNVM の内容を MSS から読むことは出来ますが、書き込むことは出来ません。
eNVM に書き込むには JTAGを介して行われます。

### ・ステージ2 (U-Boot)

ステージ2 のブートプログラムは外部ストレージにあり、DDR Memory にロードされて、MSS が実行します。

今回説明する Ubuntu 22.04 システムでは U-Boot を使います。

U-Bootはファイルシステムを使えたり、スクリプトや環境変数などが使えるので、その設定にしたがって、Linux のカーネルイメージ、Device Tree、場合によってはルートファイルシステムを DDR Memeoryに ロードします。その後、Linuxカーネルイメージに制御を移します。

## クロス開発環境

U-Boot や Linux Kernel をビルドするためには RISC-V 用のコンパイラが必要です。また開発環境として PC を使う場合はクロス開発環境が必要です。
Ubuntu には gcc-riscv64-unknown-elf というパッケージがあるのですが、残念ながらこちらのコンパイラでは上手くいきませんでした。

そこで定番の riscv-gnu-toolchain をビルドして使います。詳細なビルド方法に関しては、以下の URL や参考をご覧ください。

 * https://github.com/riscv/riscv-gnu-toolchain

今回説明する Ubuntu 22.04 システムでは riscv64-unknown-linux-gnu- を使います。

## 参考

 * https://www.microchip.com/en-us/products/fpgas-and-plds/system-on-chip-fpgas/polarfire-soc-fpgas
 * https://www.microchip.com/en-us/development-tool/mpfs-disco-kit
 * 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
 * [『Ubuntu上でのRISC-Vの環境構築』@Qiita](https://qiita.com/Kosuke_Matsui/items/14aadce506fe3df79600)