Enable graphics acceleration on Raspberry Pi 4B
Note: This is a test report, not an official solution yet.
Thanks to the ecosystem's effort. The pure Linux mainline kernel (not RPi OS kernel) works well on Raspberry Pi 4B 4GB, which I have on hands. System boots up, gets into GNOME desktop environment, has the VC4 DRM driver, connects to the HDMI (including HDMI audio). The ethernet & WiFi work as well.
It is "almost" good to be a normal computer for daily usage now. Why it is "almost"??? Because, it lacks the driver to support the V3D GPU on BCM2711, which will make the UI acting more smoothly.
Stefan has listed the supporting status at "Upstream Raspberry Pi 4 B support".
In Febuaraury of this year, Nicolas sent out the patch series "[RFC/PATCH,00/11] Raspberry PI 4 V3D enablement".
Following that, a few days later, there is the new patch series "[v3,00/15] Raspberry PI 4 V3D enablement".
Earlier this month, I participated in #EndlessOrangeWeek, a program where the entire Endless team engages in projects designed to grow our collective learning related to our skills, work and mission. I chose this topic to test the GPU on Raspberry Pi 4B.
Build the kernel
I applied the v3 patch series based on mainline Linux kernel at tags/v5.15. Then tested the modified kernel with Ubuntu 21.10 RPi 4B image by replacing the kernel, device tree blob and initrd.
Applied cleanly:
- [v3,01/15] dt-bindings: soc: bcm: bcm2835-pm: Convert bindings to DT schema
- [v3,02/15] dt-bindings: soc: bcm: bcm2835-pm: Introduce reg-names
- [v3,03/15] dt-bindings: soc: bcm: bcm2835-pm: Add support for bcm2711
- [v3,04/15] ARM: dts: bcm2835/bcm2711: Introduce reg-names in watchdog node
- [v3,05/15] ARM: dts: bcm2711: Use proper compatible in PM/Watchdog node
- [v3,06/15] mfd: bcm2835-pm: Use 'reg-names' to get resources
- [v3,07/15] mfd: bcm2835-pm: Add support for BCM2711
- [v3,08/15] soc: bcm: bcm2835-power: Add support for BCM2711's RPiVid ASB
- [v3,09/15] soc: bcm: bcm2835-power: Bypass power_on/off() calls
- [v3,10/15] dt-bindings: gpu: v3d: Add BCM2711's compatible
- [v3,13/15] ARM: dts: bcm2711: Enable V3D
Fixed conflict and applied:
Just the build config:
Here is my test repository: https://github.com/starnight/linux/tree/v3d-5.15
The kernel is built as aarch64 architecture with enabled CONFIG_DRM_V3D
and CONFIG_DRM_VC4
.
Then, install the kernel, initrd and device tree blob into the boot partion.
Prepare the system boot path
Edit the config.txt to use the modified kernel and initrd.
Comment all of the dtoverlay
in config.txt as well. I use the device tree blob from the patched kernel for this test.
Insert the SD card to Rasperry Pi 4B and power on!
Check the V3D
Seems the kernel initialized the V3D GPU.
The device tree has the GPU node.
Mesa shows "GL_RENDERER: V3D 4.2
"!
$ es2_info
EGL_VERSION: 1.4
EGL_VENDOR: Mesa Project
EGL_EXTENSIONS:
EGL_ANDROID_blob_cache, EGL_CHROMIUM_sync_control, EGL_EXT_buffer_age,
EGL_EXT_image_dma_buf_import, EGL_EXT_image_dma_buf_import_modifiers,
EGL_EXT_swap_buffers_with_damage, EGL_KHR_cl_event2,
EGL_KHR_config_attribs, EGL_KHR_create_context,
EGL_KHR_create_context_no_error, EGL_KHR_fence_sync,
EGL_KHR_get_all_proc_addresses, EGL_KHR_gl_colorspace,
EGL_KHR_gl_renderbuffer_image, EGL_KHR_gl_texture_2D_image,
EGL_KHR_gl_texture_3D_image, EGL_KHR_gl_texture_cubemap_image,
EGL_KHR_image, EGL_KHR_image_base, EGL_KHR_image_pixmap,
EGL_KHR_no_config_context, EGL_KHR_reusable_sync,
EGL_KHR_surfaceless_context, EGL_KHR_swap_buffers_with_damage,
EGL_EXT_pixel_format_float, EGL_KHR_wait_sync,
EGL_MESA_configless_context, EGL_MESA_drm_image,
EGL_MESA_image_dma_buf_export, EGL_MESA_query_driver,
EGL_NOK_texture_from_pixmap
EGL_CLIENT_APIS: OpenGL OpenGL_ES
GL_VERSION: OpenGL ES 3.1 Mesa 21.2.2
GL_RENDERER: V3D 4.2
GL_EXTENSIONS:
GL_EXT_blend_minmax, GL_EXT_multi_draw_arrays,
GL_EXT_texture_compression_s3tc, GL_EXT_texture_compression_dxt1,
GL_EXT_texture_format_BGRA8888, GL_OES_compressed_ETC1_RGB8_texture,
GL_OES_depth24, GL_OES_element_index_uint, GL_OES_fbo_render_mipmap,
GL_OES_mapbuffer, GL_OES_rgb8_rgba8, GL_OES_standard_derivatives,
GL_OES_stencil8, GL_OES_texture_3D, GL_OES_texture_float,
GL_OES_texture_half_float, GL_OES_texture_half_float_linear,
GL_OES_texture_npot, GL_OES_vertex_half_float, GL_EXT_draw_instanced,
GL_EXT_texture_sRGB_decode, GL_OES_EGL_image, GL_OES_depth_texture,
GL_OES_packed_depth_stencil, GL_EXT_texture_type_2_10_10_10_REV,
GL_OES_get_program_binary, GL_APPLE_texture_max_level,
GL_EXT_discard_framebuffer, GL_EXT_read_format_bgra, GL_EXT_frag_depth,
GL_NV_fbo_color_attachments, GL_OES_EGL_image_external, GL_OES_EGL_sync,
GL_OES_vertex_array_object, GL_ANGLE_pack_reverse_row_order,
GL_ANGLE_texture_compression_dxt3, GL_ANGLE_texture_compression_dxt5,
GL_EXT_occlusion_query_boolean, GL_EXT_texture_rg, GL_EXT_unpack_subimage,
GL_NV_draw_buffers, GL_NV_read_buffer, GL_NV_read_depth,
GL_NV_read_depth_stencil, GL_NV_read_stencil, GL_EXT_draw_buffers,
GL_EXT_map_buffer_range, GL_KHR_debug,
GL_KHR_texture_compression_astc_ldr, GL_NV_pixel_buffer_object,
GL_OES_depth_texture_cube_map, GL_OES_required_internalformat,
GL_OES_surfaceless_context, GL_EXT_color_buffer_float,
GL_EXT_sRGB_write_control, GL_EXT_separate_shader_objects,
GL_EXT_shader_implicit_conversions, GL_EXT_shader_integer_mix,
GL_EXT_base_instance, GL_EXT_compressed_ETC1_RGB8_sub_texture,
GL_EXT_draw_elements_base_vertex, GL_EXT_primitive_bounding_box,
GL_EXT_shader_io_blocks, GL_EXT_texture_border_clamp,
GL_KHR_context_flush_control, GL_NV_image_formats,
GL_OES_draw_elements_base_vertex, GL_OES_primitive_bounding_box,
GL_OES_shader_io_blocks, GL_OES_texture_border_clamp,
GL_OES_texture_stencil8, GL_OES_texture_storage_multisample_2d_array,
GL_EXT_buffer_storage, GL_EXT_float_blend, GL_EXT_geometry_point_size,
GL_EXT_geometry_shader, GL_KHR_no_error,
GL_KHR_texture_compression_astc_sliced_3d, GL_OES_EGL_image_external_essl3,
GL_OES_geometry_point_size, GL_OES_geometry_shader,
GL_OES_shader_image_atomic, GL_EXT_texture_compression_s3tc_srgb,
GL_MESA_shader_integer_functions, GL_KHR_parallel_shader_compile,
GL_EXT_EGL_image_storage, GL_MESA_framebuffer_flip_y,
GL_EXT_texture_query_lod, GL_MESA_bgra
Then, test it with es2gears
.
But, the UI becomes frozen some times and the kernel shows the error "flip_done timed out
":
I notice that this error happens when ever applications touch GL related things with ont only patched kernel, but also the pure mainline kernel. So, I filed this bug to upstream as "VC4 DRM waiting for flip down makes UI freeze a while with kernel 5.15".
I found this error is related to the commits:
So, I reverted these two commits as a workaround. After this, the "flip_done timed out" error does not appear again.

Okay! Let's play the 3D game OpenArena for test!!!

It works better than without GPU! However, the resolution has to be downgraded to 1024x576 for example. Otherwise, the UI response will be so lag.


Recap
- The v5.15 and latest mainline kernel with fixed conflict patches and fixed "flip_done timed out" bug can play the v3d gpu on Ubuntu 21.10. So, the device tree part & binding in the patch series are okay.
- However, the patch [v3,11/15] drm/v3d: Get rid of pm code makes me thinking: Is there any better way to do that. And, this might be why upstream did not merge the patch series.
- Have to find out why the v3d gpu of modified kernel works with Ubuntu, but does not work with other distros, like Endless OS. Problems in mesa, libdrm, Xorg/Wayland or any other packages?
- Mesa: Installed the same Mesa 21.2.2-1ubuntu1
- libdrm: Installed the same libdrm 2.4.107-8ubuntu1
- Xorg/Wayland (both run with Wayland):
- Ubuntu Impish has xwayland 2:1.20.13-1ubuntu1
- Endless OS has xwayland 2:1.20.11-1endless1bem1