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 を動かすための手順を幾つかのパートに分けて説明します。

この記事では、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 を以下のリポジトリに用意しています。ビルドが面倒な人はこちらをお使いください。

リポジトリを作る

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 <[email protected]>
 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 を以下のリポジトリに用意しています。こちらをインストールしてもかまいません。

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 が有効になります。