Skip to content

Panfrost

What is Panfrost?

The Panfrost is open source project for Mali Midgard and Bifrost GPUs. It focused on graphics workload to support OpenGL ES 2.0 and 3.0 but OpenCL yet. The Panfrost is now involved in upstream Mesa and works with a mainline Linux kernel. It has took a huge amount of reverse-engineering effort.

                                    Panfrost Backend
                Panfrost driver     NIR
                Gallium             Compiler
                Mesa
User-space      libdrm
----------------------------------------------------------------
Kernel          Kernel drm

Panfrost in the user space

The data structure passed to the drm in the kernel space looks like as below.

struct drm_panfrost_submit {

    /** Address to GPU mapping of job descriptor */
    __u64 jc;

    /** An optional array of sync objects to wait on before starting this job. */
    __u64 in_syncs;

    /** Number of sync objects to wait on before starting this job. */
    __u32 in_sync_count;

    /** An optional sync object to place the completion fence in. */
    __u32 out_sync;

    /** Pointer to a u32 array of the BOs that are referenced by the job. */
    __u64 bo_handles;

    /** Number of BO handles passed in (size is that times 4). */
    __u32 bo_handle_count;

    /** A combination of PANFROST_JD_REQ_* */
    __u32 requirements;
};                                                                               

Note

They XMLify some data types and variable. Check out midgard.xml

commit 4b7056b8c8a384819a00908b76be8bf4d407cdb6 (HEAD)
Author: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Date:   Wed Aug 5 18:40:44 2020 -0400

    panfrost: XMLify job_type

    Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
    Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
    Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6195>

Some relevant functions to the job chain

  • panfrost_add_job(): generates, uploads, and queues a new job.
  • panfrost_launch_grid(): the compute equivalent of dar_vbo. It construct the COMPUTE job and some of its payload [COMPUTE_JOB]
  • panfrost_draw_emit_vertex: generate compute job for vertex shader
  • pandecode_jc() : Entrypoint to start taciing - decode the jc if there is fault.
  • pan_section_pack(): pack the raw data to the job chain. Checkout gen_pack.py

Call stack

panfrost_flush -> panfrost_flush_all_batches -> panfrost_batch_submit -> panfrost_batch_submit_jobs -> panfrost_batch_submit_ioctl

Compute job

<!-- Compute job also covers vertex and geometry operations -->
<aggregate name="Compute Job">
  <section name="Header" offset="0" type="Job Header"/>
  <section name="Invocation" offset="32" type="Invocation"/>
  <section name="Parameters" offset="40" type="Compute Job Parameters"/>
  <section name="Draw" offset="64" type="Draw"/>
  <section name="Draw Padding" offset="184" type="Draw Padding"/>
</aggregate>

Panfrost on Odroid C4

Feb 2021

https://ameridroid.com/blogs/ameriblogs/os-releases-lubuntu-20-04-with-panfrost-hardware-acceleration-for-the-odroid-c4-teased

Install Armbian Focal (kernel 5.9). Then switch to 3rd party apt source: ppa:oibaf/graphics-drivers

(Note: installing desktop takes long time. Instead, directly try quake3 + xwindow first)