Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(Mali Driver編)








# はじめに


筆者は Ultra96/Ultra96-V2(ZynqMP) 向けに Debian GNU/Linux を提供しています[1]。提供している Debian GNU/Linux は CUI ベースですが、今回 GUI に対応するために X Window Systemを Ultra96/Ultra96-V2 で動くようにしました。

そこで Ultra96/Ultra96-V2 で X Window System を動かすための手順を幾つかのパートに分けて説明します。

  * [概要編]
  * [Video Driver 編]
  * Mali Driver 編 (この記事)
  * [LibMali 編]
  * [fbdev 編]
  * [glmark2 編]

この記事では、Mali Driver の Debian Package をビルドして ZynqMP-FPGA-Linux にインストールする手順を説明します。


# Mali Driver とは


Mali Driver とは ZynqMP に搭載されている GPU(Mali-400) を制御するための Kernel Module です。このカーネルモジュールは ZynqMP-FPGA-Linuxには標準では組み込まれていません。ただし、デバイスツリーはすでに標準で組み込まれています。ただし、デバイスツリーはすでに標準で組み込まれています。GPU を使って 3D レンダリングする場合はこのカーネルモジュールを新たにビルドして追加する必要があります。


![Fig.1 Mali Kernel Module](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24981/254eb048-9e32-5cbb-9af5-3c1cc5fc862d.jpeg "Fig.1 Mali Kernel Module")

Fig.1 Mali Kernel Module

<br />


# Debian Package のビルド手順


この章では、Mali Driver の Debian Package を作るための手順を説明します。

なお、ここで説明する手順で生成したリポジトリは以下の URL に用意しています。リポジトリを作るのが面倒な人は以下のリポジトリを使ってください。

* https://github.com/ikwzm/zynqmp-gpu-kmod-dpkg

ただし、上のリポジトリには、Mali Driver のソースコードは含まれていません。Maili Driver のソースコードは ARM 社の Web ページからダウンロードする必要があります。ダウンロードの手順は後述します。

また、ZynqMP-FPGA-Linux (v2019.1.x)用にビルド済みの Mali Driver の Debian Package を以下のリポジトリに用意しています。ビルドが面倒な人はこちらをお使いください。

* https://github.com/ikwzm/ZynqMP-FPGA-Xserver

  * zynqmp-gpu-4.19.0-xlnx-v2019.1-zynqmp-fpga_0.1.2-0_arm64.deb


## リポジトリを作る



```Shell
shell$ mkdir zynqmp-gpu-kmod-dpkg
shell$ cd zynqmp-gpu-kmod-dpkg
shell$ git init

```



## ソースを得る


Mali Driver のソースコードはARM が提供しているオープンソースの Mali Utgard GPU Kernel Driver を使います。ARM の Web ページにアクセスして、  __エンドユーザーライセンスに同意した上で__  、DX910-SW-99002-r8p0-01rel0.tgzをダウンロードしてください。Web ページは以下の URL です。

* https://developer.arm.com/tools-and-software/graphics-and-gaming/mali-drivers/utgard-kernel

また、以下の方法でダウンロードすることも出来ます。ただし、エンドユーザーライセンスに同意してください。


```Shell
shell$ wget https://developer.arm.com/-/media/Files/downloads/mali-drivers/kernel/mali-utgard-gpu/DX910-SW-99002-r8p0-01rel0.tgz
--2019-12-08 13:55:32--  https://developer.arm.com/-/media/Files/downloads/mali-drivers/kernel/mali-utgard-gpu/DX910-SW-99002-r8p0-01rel0.tgz
Resolving developer.arm.com (developer.arm.com)... 184.26.212.16
Connecting to developer.arm.com (developer.arm.com)|184.26.212.16|:443... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: https://armkeil.blob.core.windows.net/developer/Files/downloads/mali-drivers/kernel/mali-utgard-gpu/DX910-SW-99002-r8p0-01rel0.tgz [following]
--2019-12-08 13:55:33--  https://armkeil.blob.core.windows.net/developer/Files/downloads/mali-drivers/kernel/mali-utgard-gpu/DX910-SW-99002-r8p0-01rel0.tgz
Resolving armkeil.blob.core.windows.net (armkeil.blob.core.windows.net)... 52.239.137.100
Connecting to armkeil.blob.core.windows.net (armkeil.blob.core.windows.net)|52.239.137.100|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 350213 (342K) [application/octet-stream]
Saving to: ‘DX910-SW-99002-r8p0-01rel0.tgz’
DX910-SW-99002-r8p0-01rel0 100%[========================================>] 342.00K   490KB/s    in 0.7s    
2019-12-08 13:55:35 (490 KB/s) - ‘DX910-SW-99002-r8p0-01rel0.tgz’ saved [350213/350213]
```




DX910-SW-99002-r8p0-01rel0.tgz を展開します。


```Shell
shell$ tar xfz DX910-SW-99002-r8p0-01rel0.tgz 
```



## Xilinx 用のパッチをあてる


Xilinx社の PetaLinux ではオープンソースの Mali Utgard GPU Kernel Driver にパッチをあててビルドしています。パッチのファイルは以下の URL にあります。

* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-bsp/recipes-graphics/mali/kernel-module-mali/

この URL に14 のパッチファイルがあります。これらのパッチファイルを昇順にあてます。 


```Shell
shell$ it clone https://github.com/Xilinx/meta-xilinx.git
Cloning into 'meta-xilinx'...
remote: Enumerating objects: 1209, done.
remote: Counting objects: 100% (1209/1209), done.
remote: Compressing objects: 100% (605/605), done.
remote: Total 11725 (delta 678), reused 1045 (delta 551), pack-reused 10516    
Receiving objects: 100% (11725/11725), 8.88 MiB | 1.03 MiB/s, done.
Resolving deltas: 100% (6448/6448), done.
shell$ 
shell$ for file in `\\find meta-xilinx/meta-xilinx-bsp/recipes-graphics/mali/kernel-module-mali -maxdepth 1 -type f | sort`; do patch -d DX910-SW-99002-r8p0-01rel0/driver/src/devicedrv/mali/ -p1 < $file ; done
patching file Makefile
patching file platform/arm/arm.c
patching file linux/mali_linux_trace.h
patching file platform/arm/arm.c
patching file linux/mali_kernel_linux.c
patching file platform/arm/arm.c
patching file linux/mali_memory_os_alloc.c
patching file linux/mali_osk_notification.c
patching file linux/mali_internal_sync.c
patching file linux/mali_internal_sync.h
patching file linux/mali_memory_swap_alloc.c
patching file common/mali_pm.c
patching file linux/mali_kernel_linux.c
patching file linux/mali_memory_os_alloc.c
patching file linux/mali_memory_secure.c
patching file common/mali_control_timer.c
patching file common/mali_group.c
patching file common/mali_osk.h
patching file linux/mali_osk_timers.c
```





## Debian Package を作るためのファイルを追加する


debian ディレクトリを作って、以下のファイルを追加します。

* debian/

  * README.Debian
  * README.source
  * changelog
  * control.template
  * copyright
  * postinst
  * postrm
  * prerm
  * rules

ここではこれらのファイルの説明はしません。詳細 はhttps://github.com/ikwzm/zynqmp-gpu-kmod-dpkg を参照してください。ファイルを追加したら git commit します。


```console
shell$ git add debian/
shell$ git commit -m "[add] debian/"
[master 3961b1d] [add] debian/
 8 files changed, 68 insertions(+)
 create mode 100644 debian/README.Debian
 create mode 100644 debian/README.source
 create mode 100644 debian/changelog
  create mode 100644 debian/control.template
 create mode 100644 debian/copyright
 create mode 100644 debian/postinst
 create mode 100644 debian/postrm
 create mode 100644 debian/prerm
 create mode 100755 debian/rules
 
```





## Debian Package をビルドする


debian/rule binary を実行して Mali Driver の Debian Package をビルドします。ビルドしたパッケージは一つ上のディレクトリに作られます。


```console
shell$ sudo debian/rule binary
	:
	中略
	:
shell$ dpkg --info ../zynqmp-gpu-4.19.0-xlnx-v2019.1-zynqmp-fpga_0.1.2-0_arm64.deb
 new Debian package, version 2.0.
 size 1803188 bytes: control archive=584 bytes.
     412 bytes,    12 lines      control
      37 bytes,     6 lines   *  postinst             #!/bin/sh
      22 bytes,     4 lines   *  postrm               #!/bin/sh
      32 bytes,     4 lines   *  prerm                #!/bin/sh
 Package: zynqmp-gpu-4.19.0-xlnx-v2019.1-zynqmp-fpga
 Source: zynqmp-gpu
 Version: 0.1.2-0
 Architecture: arm64
 Maintainer: ikwzm <ichiro_k@ca2.so-net.ne.jp>
 Installed-Size: 12535
 Depends: linux-image-4.19.0-xlnx-v2019.1-zynqmp-fpga
 Provides: zynqmp-gpu-kernel-module
 Section: kmod
 Priority: optional
 Homepage: <https://github.com/ikwzm/zynqmp-gpu-kmod-dpkg>
 Description: Kernel Module for ZynqMP GPU(ARM Mali-400).
```



# インストール



## Debian Package のインストール


この節では Mali Driver の Debian Package を ZynqMP-FPGA-Linux にインストールする手順を説明します。

なお、ビルド済みのDebian Package を以下のリポジトリに用意しています。こちらをインストールしてもかまいません。

* https://github.com/ikwzm/ZynqMP-FPGA-Xserver

  * zynqmp-gpu-4.19.0-xlnx-v2019.1-zynqmp-fpga_0.1.2-0_arm64.deb


```console
shell$ sudo dpkg -i zynqmp-gpu-4.19.0-xlnx-v2019.1-zynqmp-fpga_0.1.2-0_arm64.deb
(Reading database ... 66644 files and directories currently installed.)
Preparing to unpack zynqmp-gpu-4.19.0-xlnx-v2019.1-zynqmp-fpga_0.1.2-0_arm64.deb ...
Unpacking zynqmp-gpu-4.19.0-xlnx-v2019.1-zynqmp-fpga (0.1.2-0) over (0.1.2-0) ...
Setting up zynqmp-gpu-4.19.0-xlnx-v2019.1-zynqmp-fpga (0.1.2-0) ...
```


この Debian Package をインストールすると、/lib/modules/4.19.0-xlnx-v2019.1-zynqmp-fpga/kernel/drivers/gpu/mali.ko が追加されます。


## Device Tree のインストール


Mali Driver を有効にするためには Device Tree に GPU(Mali) のノードがなければなりません。以下に Device Tree の GPU(Mali) のノードの例を示します。


```devicetree
	gpu: gpu@fd4b0000 {
		status = "okay";
		compatible = "arm,mali-400", "arm,mali-utgard";
		reg = <0x0 0xfd4b0000 0x0 0x10000>;
		interrupt-parent = <&gic>;
		interrupts = <0 132 4>, <0 132 4>, <0 132 4>, <0 132 4>, <0 132 4>, <0 132 4>;
		interrupt-names = "IRQGP", "IRQGPMMU", "IRQPP0", "IRQPPMMU0", "IRQPP1", "IRQPPMMU1";
		clock-names = "gpu", "gpu_pp0", "gpu_pp1";
		power-domains = <&zynqmp_firmware PD_GPU>;
	};

```


ZynqMP-FPGA-Linux で提供している Ultra96/Ultra96-V2 用の Device Tree にはすでに GPU(Mali) のノードが追加されています。したがって、Mali Driver の Debian Package をインストールするだけで Mali Driver が有効になります。



[概要編]: https://qiita.com/ikwzm/items/fdec04519268b3fb9a50 "『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(概要編)』@Qiita"
[Video Driver 編]: https://qiita.com/ikwzm/items/2a0fbfd2938a893e57d4 "『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(Video Driver 編)』@Qiita"
[Mali Driver 編]: https://qiita.com/ikwzm/items/8c96d75e03cdcb91e5b2 "『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(Mali Driver 編)』@Qiita"
[LibMali 編]: https://qiita.com/ikwzm/items/85fa889def8eb07a9e94 "『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(libMali 編)』@Qiita"
[fbdev 編]: https://qiita.com/ikwzm/items/f922f7e17aa2382d5c76 "『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(fbdev 編)』@Qiita"
[glmark2 編]: https://qiita.com/ikwzm/items/5065fb0b6c01ea706571 "『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(glmark2 編)』@Qiita"
[1]: https://qiita.com/ikwzm/items/0c6f110aa19e368af03d "『UltraZed/Ultra96/Ultra96-V2 向け Debian GNU/Linux (v2019.1版) ブートイメージの提供』@Qiita"