Mali Open Source Driver

From linux-sunxi.org
Jump to navigation Jump to search

The Mali series is a GPU (Graphics Processor Unit) from ARM Ltd. (ARM Holdings plc), designed for embedded systems.

Overview

Two open source drivers based on reverse engineering efforts exist for the Mali GPUs.

  • Lima covers the Utgard family (Mali-400/450) used on most Allwinner SoCs that have Mali GPUs.
  • Panfrost covers Midgard (Mali-T[678]xx) (Mali-T720 used on the H6), and Bifrost (Mali-G[357]x) (not implemented by Allwinner).

These include both kernel drivers and userspace drivers in Mesa.

As of 2019/04/12, both drivers have had their userspace components merged into upstream Mesa.

Lima's kernel driver has been merged, and will be in Linux kernel v5.2, while Panfrost's kernel driver has gone through multiple review cycles, and is likely to be merged soon.

Kernel drivers

The lima driver is enabled by the kernel config option DRM_LIMA. The panfrost driver is enabled by the kernel config option DRM_PANFROST.

Enable the desired options and follow the mainline kernel build procedures.

Userspace drivers

The userspace drivers are part of the Mesa 3D Graphics Library.

Mesa's website has a guide on howto build and install the library: [1]. Following it will build in support for mostly everything.

The following are some steps using meson to build a reduced version just for Mali support.

Dependencies

Mesa has a lot of build time dependencies. For the reduced version we are building, install the following packages (on Debian):

g++ meson python3-mako zlib1g-dev libexpat1-dev libdrm-dev flex bison libx11-dev libxext-dev libxdamage-dev \
libxcb-glx0-dev libx11-xcb-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-present-dev libxshmfence-dev \
libxxf86vm-dev libxrandr-dev x11proto-gl-dev x11proto-dri2-dev gettext pkg-config

Configuration and Build

# Check out mesa
git clone https://gitlab.freedesktop.org/mesa/mesa.git
# Or Choose the last Stable tag, ex: 'mesa-19.3.2'
git clone --branch mesa-19.3.2 https://gitlab.freedesktop.org/mesa/mesa.git
cd mesa/
# Configure the build
#
# Only the lima and panfrost drivers are enabled.
# kmsro is the "kernel mode-setting render-only" support driver.
# swrast is the fallback software renderer.
# X11, DRM, and surfaceless targets are enabled
# DRI and Vulkan drivers are not supported.
# For aarch32
meson build/ --optimization s --buildtype release --prefix=/usr/local --libdir=lib/arm-linux-gnueabihf \
-Dgallium-drivers=lima,panfrost,kmsro,swrast -Dplatforms=x11,drm,surfaceless -Dvulkan-drivers= -Ddri-drivers= \
-Dllvm=false
# For aarch64
meson build/ --optimization s --buildtype release --prefix=/usr/local --libdir=lib/aarch64-linux-gnu \
-Dgallium-drivers=lima,panfrost,kmsro,swrast -Dplatforms=x11,drm,surfaceless -Dvulkan-drivers= -Ddri-drivers= \
-Dllvm=false
# Build the library
ninja -C build/
# Install the library (under /usr/local as previously specified with the --prefix parameter)
sudo ninja -C build/ install

Cross Compiling

While the Mesa library isn't very large, compiling natively on ARM / ARM64 is quite slow.

Build dependencies for cross-compiling

Install the following packages (on Debian).

g++-arm-linux-gnueabihf meson python3-mako flex bison
zlib1g-dev:armhf libexpat1-dev:armhf libdrm-dev:armhf libx11-dev:armhf libxext-dev:armhf libxdamage-dev:armhf
libxcb-glx0-dev:armhf libx11-xcb-dev:armhf libxcb-dri2-0-dev:armhf libxcb-dri3-dev:armhf libxcb-present-dev:armhf
libxshmfence-dev:armhf libxxf86vm-dev:armhf libxrandr-dev:armhf

Meson cross compile settings for armv7hf

Put the following in some file. This will be used by meson.

[binaries]
c = 'arm-linux-gnueabihf-gcc'
cpp = 'arm-linux-gnueabihf-g++'
ar = 'arm-linux-gnueabihf-ar'
strip = 'arm-linux-gnueabihf-strip'
pkgconfig = 'arm-linux-gnueabihf-pkg-config'

[host_machine]
system = 'linux'
cpu_family = 'arm'
cpu = 'armv7hl'
endian = 'little'

Configuration

Follow the same steps as the native build, but add the following to the meson command.

--cross-file=<path to cross compile settings> --libdir=lib/arm-linux-gnueabihf

Wayland support

If you want to build wayland support as well, add wayland to the list of platforms in the configuration command.

You will need to install the following dependency packages.

libwayland-dev wayland-protocols libwayland-egl-backend-dev

For cross-compiling, you will need to install both the native and target versions of libwayland-dev.