はじめに
筆者は 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
Debian Package のビルド手順
この章では、Mali Driver の Debian Package を作るための手順を説明します。
なお、ここで説明する手順で生成したリポジトリは以下の URL に用意しています。リポジトリを作るのが面倒な人は以下のリポジトリを使ってください。
ただし、上のリポジトリには、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$ 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 です。
また、以下の方法でダウンロードすることも出来ます。ただし、エンドユーザーライセンスに同意してください。
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$ tar xfz DX910-SW-99002-r8p0-01rel0.tgz
Xilinx 用のパッチをあてる
Xilinx社の PetaLinux ではオープンソースの Mali Utgard GPU Kernel Driver にパッチをあててビルドしています。パッチのファイルは以下の URL にあります。
この URL に14 のパッチファイルがあります。これらのパッチファイルを昇順にあてます。
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 します。
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 をビルドします。ビルドしたパッケージは一つ上のディレクトリに作られます。
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
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) のノードの例を示します。
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 が有効になります。