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

## はじめに

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

 * [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)(この記事)__
   - [BL31   (ARM Trusted Firmware Boot Loader state 3-1)](https://qiita.com/ikwzm/items/6d03b7e5b47721df3ae9)
   - [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 で使うための PMUFW  (Platform Manager Unit Firmware) の構築について説明をします。

## 必要な環境

 * Vivado SDK 2017.2

## Sample FPGA Design の構築

PMUFW の構築には Sample FPGA Design のハードウェア情報が必要です。[「UltraZed 向け Debian GNU/Linux (v2017.3版) の構築(Sample FPGA Design編)」](https://qiita.com/ikwzm/items/61316ecec2fc68be4c96)の通りに target/UltraZed-EG-IOCC/build/fpga/project.sdk/design_1_wrapper.hdf を作っておきます。

## PMUFW の構築

ここでは Vivado の hsi(Hardware Software Interface) を使って構築する方法を示します。GUI を使って手で入力するのは面倒なので Tcl スクリプトファイルを用意しています。Tcl スクリプトの詳しい内容は[「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト(hsi編)」](https://qiita.com/ikwzm/items/e09fab6b17986471cbda)を参照してください。

```Tcl:target/UltraZed-EG-IOCC/build/fpga/build_zynqmp_pmufw.hsi
#!/usr/bin/tclsh

set app_name          "pmufw"
set app_type          "zynqmp_pmufw"
set hwspec_file       "design_1_wrapper.hdf"
set proc_name         "psu_pmu_0"
set project_name      "project"
set project_dir       [pwd]
set sdk_workspace     [file join $project_dir $project_name.sdk]
set app_dir           [file join $sdk_workspace $app_name]
set app_release_dir   [file join [pwd] ".." ]
set app_release_elf   "zynqmp_pmufw.elf"

set hw_design         [open_hw_design [file join $sdk_workspace $hwspec_file]]

generate_app -hw $hw_design -os standalone -proc $proc_name -app $app_type -compile -dir $app_dir
file copy -force [file join $app_dir "executable.elf"] [file join $app_release_dir $app_release_elf]
```


build_zynqmp_pmufw.hsi を Vivado で実行することにより、target/UltraZed-EG-IOCC/build/zynqmp_pmufw.elf が生成されます。

```shell
vivado% cd target/UltraZed-EG-IOCC/build/fpga/
vivado% hsi -mode tcl -source build_zynqmp_pmufw.hsi
```

## Vivado SDK 2017.3 で構築する際の注意点

今回は Vivado SDK 2017.2 を使って構築しましたが、Vivado SDK 2017.3 を使いたいという場合もあるでしょう。しかし Vivado 2017.3 では上手くいかない事が報告されています。

 * [「2017.3 PMUFW compilation failure on zynqmp UltraScale+ - RAM Overflow」@Xilinx Forum](https://forums.xilinx.com/t5/Embedded-Processor-System-Design/2017-3-PMUFW-compilation-failure-on-zynqmp-UltraScale-RAM/td-p/802155)

要するに次のような次第らしいです。

 * Vivado SDK 2017.3 で PMUFW のコードが増えて通常のコンパイルオプションでは RAM に入りきらなくなった。
 * Vivado SDK 2017.3 の GUI では ```-Os -flto -ffat-lto-objects``` というコンパイルオプションが追加されている。これは最適化用のコンパイラオプション。
 * しかし CUI 用の generate_app では上記コンパイルオプションが追加されていない（忘れてた？

暫定的な対処方法として次のようにすると良いようです。

 * generate_app の時に ```-compile``` オプションを外して実行して、環境だけを構築する。
 * 構築した環境のディレクトリ(ここでは target/UltraZed-EG-IOCC/build/fpga/project.sdk/pmufw)の Makefile の CC_FLAGS に に ```-Os -flto -ffat-lto-objects``` を追加する。
 * 構築した環境のディレクトリ(ここでは target/UltraZed-EG-IOCC/build/fpga/project.sdk/pmufw)で make を実行する。
 * 出来た ```executable.elf``` を target/UltraZed-EG-IOCC/build/zynqmp_pmufw.elf にコピーする。


## 参考

 * [「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト(hsi編)」@Qiita](https://qiita.com/ikwzm/items/e09fab6b17986471cbda)
 * [「2017.3 PMUFW compilation failure on zynqmp UltraScale+ - RAM Overflow」@Xilinx Forum](https://forums.xilinx.com/t5/Embedded-Processor-System-Design/2017-3-PMUFW-compilation-failure-on-zynqmp-UltraScale-RAM/td-p/802155)