Mali

Overview
Mali400 is a GPU from ARM. More information can be found on the ARM website.

Mali 400 on A1x
Allwinner officially supports the Mali GPU driver on the Android platform only. In this article we cover native linux usage, for android refer to publicly available sources https://github.com/allwinnerwk https://github.com/allwinner-ics and many others.

Binary libraries download links
Mali-400 uses proprietary libraries that must be provided by SoC manufacturer. This libraries are built with Mali DDK in various variants defining supported APIs. Example: if VARIANT is mali400-vg-gles20-linux-ump, library will be built with support for OpenGL ES 2 and OpenVG.

Libraries depend on driver version, for each Mali-400 kernel module drivers update you need appropriate libraries version and appropriate X11/DRI2 drivers version. If this conditions will not be met, you will end with unsupported IOCTL's and basically unstable system.

Please keep in mind that we have Makefile installation system for libraries with detection of what kernel space drivers you have. It is located at https://github.com/linux-sunxi/mali-libs In driver installation section we use only mali-libs. Following table contains every Mali-400 library that we got from various sources. You can use it for your own risk, most stable stuff is always in mali-libs.

Lima open source Mali driver
Lima is a project to develop a completely open source graphics driver which supports ARM's Mali-200 and Mali-400 GPUs (work in progress).


 * http://limadriver.org/

The aim of this driver and others such as freedreno is to finally bring all the advantages of open source software to ARM SoC graphics drivers. Currently, the sole availability of binary drivers is increasing development and maintenance overhead, while also reducing portability, compatibility and limiting choice. Anyone who has dealt with GPU support on ARM, be it for a linux with a GNU stack, or for an android, knows the pain of dealing with these binaries.

Mali-400 X11 DRI2 drivers
Some demo of these drivers is available on the youtube http://www.youtube.com/watch?v=tyR3Wqw5yZ0

Since everything was moved to our github organization, installation became pretty simple and obvious. First, compile and install a new kernel into your rootfs from https://github.com/linux-sunxi/linux-sunxi, following instructions are made for this kernel and contain r3p0 version of Mali. Second, you need to load your modules right, order is important. Alternatively, you can add names of them to /etc/modules if your distro is capable of doing this.  modprobe lcd modprobe hdmi modprobe ump modprobe disp modprobe mali modprobe mali_drm Third, you need to install these packages to build everything:  apt-get install build-essential autoconf automake make libtool xorg-dev xutils-dev libdrm-dev libdri2-1 libdri2-dev Finally, just follow the instructions:  mkdir malibuild cd malibuild git clone https://github.com/linux-sunxi/xf86-video-mali.git git clone https://github.com/linux-sunxi/libump.git git clone https://github.com/linux-sunxi/mali-libs.git cd mali-libs make x11 make headers cd ../libump make make install cd ../xf86-video-mali autoreconf -vi ./configure --prefix=/usr make make install cp xorg.conf /usr/share/X11/xorg.conf.d/99-mali400.conf Installation is written for Linaro, if you have different distro, things may differ.
 * 1) default branch is r3p0-04rel0
 * 1) default branch is r3p0-04rel0
 * 1) you can also select framebuffer instead of x11 if you want.
 * 1) if you have 'libdri2 not found': apt-get install libdri2-dev
 * 1) xf86-video-mali needs autoreconf to build
 * 1) if you have different rootfs layout, fix paths to yours
 * 1) restart your X server
 * 2) dont forget to 'chmod 777 /dev/ump' and 'chmod 777 /dev/mali' on each boot, or create a rule for udev for this.

Tips on building

 * Some distributions have libdri2 compiled in X11 binary, so there is libdri2 separated in a github repo https://github.com/robclark/libdri2

API Info
APIs reported by es1_info: EGL_VERSION: 1.4 Linux-r3p0-04rel0 EGL_VENDOR: ARM EGL_EXTENSIONS: EGL_KHR_image, EGL_KHR_image_base, EGL_KHR_image_pixmap, EGL_KHR_gl_texture_2D_image, EGL_KHR_gl_texture_cubemap_image, EGL_KHR_gl_renderbuffer_image, EGL_KHR_reusable_sync, EGL_KHR_fence_sync, EGL_KHR_lock_surface, EGL_KHR_lock_surface2 EGL_CLIENT_APIS: OpenGL_ES GL_VERSION: OpenGL ES-CM 1.1 GL_RENDERER: Mali-400 MP GL_EXTENSIONS: GL_OES_byte_coordinates, GL_OES_fixed_point, GL_OES_single_precision, GL_OES_matrix_get, GL_OES_read_format, GL_OES_compressed_paletted_texture, GL_OES_point_size_array, GL_OES_point_sprite, GL_OES_texture_npot, GL_OES_query_matrix, GL_OES_matrix_palette, GL_OES_extended_matrix_palette, GL_OES_compressed_ETC1_RGB8_texture, GL_OES_EGL_image, GL_OES_draw_texture, GL_OES_depth_texture, GL_OES_packed_depth_stencil, GL_EXT_texture_format_BGRA8888, GL_OES_framebuffer_object, GL_OES_stencil8, GL_OES_depth24, GL_ARM_rgba8, GL_OES_EGL_image_external, GL_OES_EGL_sync, GL_EXT_multisampled_render_to_texture, GL_OES_texture_cube_map, GL_EXT_discard_framebuffer APIs reported by es2_info: EGL_VERSION: 1.4 Linux-r3p0-04rel0 EGL_VENDOR: ARM EGL_EXTENSIONS: EGL_KHR_image, EGL_KHR_image_base, EGL_KHR_image_pixmap, EGL_KHR_gl_texture_2D_image, EGL_KHR_gl_texture_cubemap_image, EGL_KHR_gl_renderbuffer_image, EGL_KHR_reusable_sync, EGL_KHR_fence_sync, EGL_KHR_lock_surface, EGL_KHR_lock_surface2 EGL_CLIENT_APIS: OpenGL_ES GL_VERSION: OpenGL ES 2.0 GL_RENDERER: Mali-400 MP GL_EXTENSIONS: GL_OES_texture_npot, GL_OES_compressed_ETC1_RGB8_texture, GL_OES_standard_derivatives, GL_OES_EGL_image, GL_OES_depth24, GL_ARM_rgba8, GL_ARM_mali_shader_binary, GL_OES_depth_texture, GL_OES_packed_depth_stencil, GL_EXT_texture_format_BGRA8888, GL_EXT_blend_minmax, GL_OES_EGL_image_external, GL_OES_EGL_sync, GL_EXT_multisampled_render_to_texture, GL_EXT_discard_framebuffer, GL_OES_get_program_binary, GL_EXT_shader_texture_lod

TODO for developers

 * Make Mali-400 kernel drivers output the version on load
 * Figure out permissions problems for popular distros (udev rule?)
 * Integrate G2D support for 2D acceleration, right now Mali drivers sometimes are slower than FBDEV in 2D tasks. Example of EXA integration with 2D acceleration from qualcomm: https://www.codeaurora.org/gitweb/quic/xwin/?p=xf86-video-msm.git;a=blob;f=src/msm-exa-c2d.c;hb=refs/heads/chromium
 * Integrate Sunxi_disp_driver support
 * Integrate EDID support for HDMI/DVI connections (dynamic resolution detection)
 * (OPTIONAL) Toss out libump and ump kernel module, Mali-400 modules can directly use OS RAM if needed (or check Snowball for this, they use /dev/hwmem device that gives 16MB of RAM to Mali)