MPFS-DISCO-KIT 向け Ubuntu 22.04 の構築(Linux Kernel linux4microchip+fpga-2024.09 編)


## はじめに

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

 * [イントロ編](https://qiita.com/ikwzm/items/1866dc3bb5292fd1f6e1)
 * [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 編(この記事)__
 * [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


linux4microchip は Microchip Technology 社が提供する linux Kernel で、次の URL で公開されています。

 * https://github.com/linux4microchip/linux

その中でも、Microchip PolarFire SoC FPGA に対応した Linux Kernel は linux4microchip+fpga- で始まるタグがついています。この記事では、linux4microchip+fpga-2024.09 をビルドする方法を紹介します。

なお、この記事で紹介する Linux Kernel linux4microchip+fpga-2024.09 のビルド済みのファイルは以下の URL にあります。ビルドが面倒な方はどうぞ。

 * https://github.com/ikwzm/MPFS-FPGA-Linux-Kernel-6.6/tree/linux4microchip%2Bfpga-2024.09

## Linux Kernel の構築

### 必要な環境

* riscv64-unknown-linux-gnu-

### Linux Kernel 構築環境の準備

まずビルド用のディレクトリを用意します。ここでは develop-linux4microchip+fpga-2024.09 とします。以降はこのディレクトリで行います。

```console
shell$ mkdir develop-linux4microchip+fpga-2024.09
shell$ cd    develop-linux4microchip+fpga-2024.09
```

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

https://github.com/linux4microchip/linux から linux4microchip+fpga-2024.09 をダウンロードします。

```console
shell$ git clone --depth 1 --branch linux4microchip+fpga-2024.09 https://github.com/linux4microchip/linux linux4microchip+fpga-2024.09
```

### 構築の準備

環境変数を設定します。アーキテクチャ(ARCH)に riscv を指定します。ここでは、クロスコンパイルに使うツールチェーン(CROSS_COMPILE) に riscv64-unknown-linux-gnu- を指定します。この変数は構築する環境にあわせてください。その後、Microchip PolarFire SoC 用のコンフィギュレーション定義ファイルを使って構築の準備をします。

```console
shell$ cd linux4microchip+fpga-2024.09
shell$ export ARCH=riscv
shell$ export CROSS_COMPILE=riscv64-unknown-linux-gnu-
shell$ make mpfs_defconfig
```

次のようなファイルを用意して .config にマージします。

```Kconfig:mpfs_cmdline.cfg
CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="earlycon=sbi root=/dev/mmcblk0p3 rootwait uio_pdrv_genirq.of_id=generic-uio"
```

```console
shell$ ./scripts/kconfig/merge_config.sh .config ../mpfs_cmdline.cfg 
Using .config as base
Merging ../mpfs_cmdline.cfg
Value of CONFIG_CMDLINE is redefined by fragment ../mpfs_cmdline.cfg:
Previous value: CONFIG_CMDLINE="earlycon uio_pdrv_genirq.of_id=generic-uio"
New value: CONFIG_CMDLINE="earlycon=sbi root=/dev/mmcblk0p3 rootwait uio_pdrv_genirq.of_id=generic-uio"

#
# configuration written to .config
#
Value requested for CONFIG_CMDLINE_BOOL not in final .config
Requested value:  CONFIG_CMDLINE_BOOL=y
Actual value:     

```

### カーネルと Debian パッケージの構築

```console
shell$ export DTC_FLAGS=--symbols
shell$ make deb-pkg
```

### 構築したカーネルのイメージとデバイスツリーを ビルド用のディレクトリにコピー

無事にカーネルのイメージ(arch/riscv/boot/Image.gz) と Microchip 用のデバイスツリー(arch/riscv/boot/dts/microchip/*) が出来たら、それを ビルド用のディレクトリにコピーします。その際、作ったカーネルのバージョン等をわかりやすくするため名前を変更しておきます。

```console
shell$ cp arch/riscv/boot/Image.gz ../vmlinuz-linux4microchip+fpga-2024.09
shell$ install -d                  ../files
shell$ cp .config                  ../files/config-linux4microchip+fpga-2024.09
```

```console
shell$ install -d                         ../devicetrees/linux4microchip+fpga-2024.09
shell$ cp arch/riscv/boot/dts/microchip/* ../devicetrees/linux4microchip+fpga-2024.09
```

## fitImage のビルド

** 注意: fitImage は https://github.com/ikwzm/MPFS-FPGA-Linux-Kernel-6.6/tree/linux4microchip%2Bfpga-2024.09 には含まれていません。ここではあくまでも作りかただけを紹介しています。 **

### カーネルのイメージとデバイスツリーを fitImage ビルド用のディレクトリにコピー

```console
shell$ cd linux4microchip+fpga-2024.09
shell$ install -d                                          ../fitImage.files
shell$ cp arch/riscv/boot/Image.gz                         ../fitImage.files
shell$ cp arch/riscv/boot/dts/microchip/mpfs-disco-kit.dtb ../fitImage.files
shell$ cd ../fitImage.files
```

### fit.its

fitImage を作るために fit.its を用意します。

```console
shell$ cat > fit.its << EOT
/dts-v1/;

/ {
    description = "Kernel fitImage for linux4microchip+fpga-2024.09/mpfs-disco-kit";
    #address-cells = <1>;

    images {
        kernel-1 {
            description = "Linux Kernel";
            data = /incbin/("Image.gz");
            type = "kernel";
            arch = "riscv";
            os = "linux";
            compression = "gzip";
            load = <0x80200000>;
            entry = <0x80200000>;
        };

        fdt-microchip_mpfs-disco-kit.dtb {
            description = "Flattened Device Tree blob";
            data = /incbin/("mpfs-disco-kit.dtb");
            type = "flat_dt";
            arch = "riscv";
            compression = "none";
            load = <0x8a000000>;
        };
    };

    configurations {
        default = "conf-microchip_mpfs-disco-kit.dtb";

        conf-microchip_mpfs-disco-kit.dtb {
            description = "1 Linux kernel, FDT blob";
            kernel = "kernel-1";
            fdt = "fdt-microchip_mpfs-disco-kit.dtb";
        };
    };
};
EOT
```

### fitImage のビルド

u-boot-tools の mkimage を使って fitImage を作ります。

```console
shell$ mkimage -f fit.its ../fitImage
FIT description: Kernel fitImage for linux4microchip+fpga-2024.09/mpfs-disco-kit
Created:         Thu Dec 19 12:01:21 2024
 Image 0 (kernel-1)
  Description:  Linux Kernel
  Created:      Thu Dec 19 12:01:21 2024
  Type:         Kernel Image
  Compression:  gzip compressed
  Data Size:    5476497 Bytes = 5348.14 KiB = 5.22 MiB
  Architecture: RISC-V
  OS:           Linux
  Load Address: 0x80200000
  Entry Point:  0x80200000
 Image 1 (fdt-microchip_mpfs-disco-kit.dtb)
  Description:  Flattened Device Tree blob
  Created:      Thu Dec 19 12:01:21 2024
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    20028 Bytes = 19.56 KiB = 0.02 MiB
  Architecture: RISC-V
  Load Address: 0x8a000000
 Default Configuration: 'conf-microchip_mpfs-disco-kit.dtb'
 Configuration 0 (conf-microchip_mpfs-disco-kit.dtb)
  Description:  1 Linux kernel, FDT blob
  Kernel:       kernel-1
  FDT:          fdt-microchip_mpfs-disco-kit.dtb
```

## 参考

 * https://github.com/linux4microchip/linux
 * https://github.com/ikwzm/MPFS-FPGA-Linux-Kernel-6.6