ARM produce designs for a GPU called "Mali". This is incorporated in many SoCs and thus devices. It is used in a number of devices that can run Debian.

There are four major revisions of Mali GPUs: Utgard, Midgard, Bifrost, and Valhall. See the Wikipedia page for reference.

On Debian 11 and newer, you're highly recommended to use the free and open-source Panfrost/Lima drivers included in Mesa instead of the proprietary drivers documented in this article. More information can be found in the PanfrostLima article.

Proprietary drivers are available from the vendor for each Mali version. Since 2016, the binary drivers put out by ARM have been redistributable and thus can be packaged for non-free. GPLed kernel shim drivers are also released by ARM, which is eligible for Debian contrib. As of March 2017, these have been packaged in Debian for Midgard devices; see MaliMidgard. Upstream proprietary drivers are available from The ARM developer site

In practice, relevant hardware is


With Debian 10/Buster and newer, the proprietary drivers are packaged in the non-free section of the repos and can be installed through Apt for armhf/32-bit ARM systems.

You'll need to first install the proper kernel headers. With the default Debian kernel, you can install the linux-headers-armmp package.

Then you can install the driver package for your GPU flavour and windowing system, i.e. one of:

apt install mali-t76x-x11-driver
apt install mali-t76x-wayland-driver
apt install mali-t76x-fbdev-driver

Or, for t62x hardware:

apt install mali-t62x-x11-driver
apt install mali-t62x-wayland-driver
apt install mali-t62x-fbdev-driver

Note that not every combination of GPU and windowing system is available, because we can only package what ARM release.

Kernel drivers

There is a different kernel driver for each major hardware revision, and thus a different debian dkms package:

Due to significant similarities between Midgard and Bifrost (sharing significant parts of their command stream), the Midgard and Bifrost drivers are currently identical (mid 2018). Confusingly the identical midgard and bifrost kernel drivers are released separately on ARM's developer site with different package version numbers (so midgard r25p0 is the same code/driver as bifrost r13p0).

Because the packaging uses dkms, the driver should be automatically rebuilt for your kernel and copied into initrds, and updated when you install new kernels.

ARM's versioning scheme is of the form r16p0 (release 16, patch-level0). This is translated into debian versioning as '16.0' (dkms versions cannot start with a letter).

Blob userspace drivers

Each binary driver is built for a specific combination of OS (linux/Android), hardware platform, GPU generation (4x0/T6x0/T7x0), and graphics technology (fbdev/X/wayland/surfaceflinger). Platforms are sometimes dropped, so you might need to choose an older version to get a driver that will work on older hardware. A few plaftforms have DTB support, so one driver build can work on more than one bit of actual hardware. This makes for painful distro packaging.

A binary driver should work with a kernel driver released at the same time, and up to 4 earlier versions. The binary driver does an API version check on the kernel driver on start-up.

ARM dropped support for X in their releases after r16 (Jan 2017). This is a massive pain as that's what we all still use. Only wayland, fbdev and android are supported after that.

The binary drivers do not yet use the vendor-egl dispatch mechanism that lets you install more than one vendor-supplied libEGL, described at:, so if you install any mali binary driver mesa, or any other EGL driver will be removed. Ideally more than one should be installable because you may have more than one GPU available.

Packaging Status

Currently these are all r16 as that supports the widest range of binary drivers, including X. We cannot move forward from r16 without dropping X support and that's not very attractive.

Mailing list

The development mailing list for these packages is: