UltraZed 向け Debian GNU/Linux (v2017.3版) の構築(BL31編)

## はじめに

UltraZed-EG スターターキットに Debian GNU/Linux (v2017.3版) を構築する方法について、具体的な方法をいくつかに分けて説明します。

 * [Introduction](https://qiita.com/ikwzm/items/a4ebcffdd26ab3e8124d)
 * [Boot Loader](https://qiita.com/ikwzm/items/9d2a76f9665759df58e7)
   - [Sample FPGA Design](https://qiita.com/ikwzm/items/61316ecec2fc68be4c96)
   - [FSBL   (First Stage Boot Loader)](https://qiita.com/ikwzm/items/6c345b0ef7fc397d37bf)
   - [PMUFW  (Platform Manager Unit Firmware)](https://qiita.com/ikwzm/items/9835f591a78e83d6b92b)
   - __BL31   (ARM Trusted Firmware Boot Loader state 3-1)(この記事)__
   - [U-Boot](https://qiita.com/ikwzm/items/27e6ab1517d724b7f2eb)
   - [BOOT.BIN](https://qiita.com/ikwzm/items/45520c8722edbfcd3575)
 * [Linux Kernel](https://qiita.com/ikwzm/items/367f49e9b02102e907d8)
 * [Debian9 Root File System](https://qiita.com/ikwzm/items/a0e88798ed29b30fa003)

この記事では、ZynqMP の Boot Loader で使うための BL31 (ARM Trusted Firmware Boot Loader state 3-1) の構築について説明をします。

## 注意

Linux Kernel では 起動時に ATF(ARM Trusted Firmware) のバージョンをチェックしています。Debian GNU/Linux (v2017.3版) で構築する Linux Kernel 4.9.0 (xilinx-v2017.3) では ATF(ARM Trusted Firmware) のバージョンは v0.3 である必要があります。これ以外のバージョンでは Kernel が Panic を起こして起動出来ないので注意してください。

## 必要な環境

* Vivado SDK 2017.2 または gcc-aarch64-linux-gnu

## Boot Loader 構築環境の準備

次の URL から git clone でリポジトリをダウンロードして v2017.3.0 をチェックアウトします。

 * [https://github.com/ikwzm/ZynqMP-FPGA-Linux](https://github.com/ikwzm/ZynqMP-FPGA-Linux)

```console
shell$ git clone git://github.com/ikwzm/ZynqMP-FPGA-Linux
shell$ cd ZynqMP-FPGA-Linux
shell$ git checkout v2017.3.0
```

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

ATF(ARM Trusted Firmware) は以下の URL からソースコードをダウンロードします。

* [https://github.com/Xilinx/arm-trusted-firmware.git](https://github.com/Xilinx/arm-trusted-firmware.git)

```
shell% cd target/UltraZed-EG-IOCC/build
shell% git clone https://github.com/Xilinx/arm-trusted-firmware.git
```

## xilinx-v2017.3 をチェックアウト

arm-trusted-firmware の xilinx-v2017.3 というタグをチェックアウトして xilinx-v2017.3-ultrazed-eg-iocc という作業用のブランチを作ります。

```
shell$ cd arm-trusted-firmware
shell$ git checkout -b xilinx-v2017.3-ultrazed-eg-iocc refs/tags/xilinx-v2017.3
```

## BL31 の構築

```
shell% cd arm-trusted-firmware
shell% make CROSS_COMPILE=aarch64-linux-gnu- PLAT=zynqmp RESET_TO_BL31=1
```

もしかしたら binutils-aarch64-linux-gnu のバージョンによっては次のようなエラーが出て失敗するかもしれません。

```
Building zynqmp
  AS      bl31/aarch64/runtime_exceptions.S
bl31/aarch64/runtime_exceptions.S: Assembler messages:
bl31/aarch64/runtime_exceptions.S:157: Error: non-constant expression in ".if" statement
bl31/aarch64/runtime_exceptions.S:165: Error: non-constant expression in ".if" statement
bl31/aarch64/runtime_exceptions.S:170: Error: non-constant expression in ".if" statement
bl31/aarch64/runtime_exceptions.S:175: Error: non-constant expression in ".if" statement
bl31/aarch64/runtime_exceptions.S:189: Error: non-constant expression in ".if" statement
bl31/aarch64/runtime_exceptions.S:193: Error: non-constant expression in ".if" statement
bl31/aarch64/runtime_exceptions.S:197: Error: non-constant expression in ".if" statement
bl31/aarch64/runtime_exceptions.S:201: Error: non-constant expression in ".if" statement
bl31/aarch64/runtime_exceptions.S:215: Error: non-constant expression in ".if" statement
bl31/aarch64/runtime_exceptions.S:219: Error: non-constant expression in ".if" statement
bl31/aarch64/runtime_exceptions.S:223: Error: non-constant expression in ".if" statement
bl31/aarch64/runtime_exceptions.S:231: Error: non-constant expression in ".if" statement
bl31/aarch64/runtime_exceptions.S:245: Error: non-constant expression in ".if" statement
bl31/aarch64/runtime_exceptions.S:249: Error: non-constant expression in ".if" statement
bl31/aarch64/runtime_exceptions.S:253: Error: non-constant expression in ".if" statement
bl31/aarch64/runtime_exceptions.S:261: Error: non-constant expression in ".if" statement
Makefile:597: recipe for target 'build/zynqmp/release/bl31/runtime_exceptions.o' failed
make: *** [build/zynqmp/release/bl31/runtime_exceptions.o] Error 1
```

その場合は Vivado SDK のツールチェインを使って構築すると良いでしょう。

```
shell% cd arm-trusted-firmware
shell% make CROSS_COMPILE="<SDK PATH>/gnu/aarch64/<lin or nt>/aarch64-linux/bin/aarch64-linux-gnu-" PLAT=zynqmp RESET_TO_BL31=1
```

```<SDK PATH>``` には Vivado SDK をインストールしたパスを指定します。
```<lin or nt>``` には Vivado SDK を実行するプラットフォームを指定します. lin=linux, nt=windows です。

無事に arm-trusted-firmware/build/zynqmp/release/bl31/bl31.elf が出来たら bl31.elf を target/UltraZed-EG-IOCC/build にコピーします。